From 32d050eee9dfbe77e0dfbd2b5a2e9ac19dd75fdb Mon Sep 17 00:00:00 2001 From: Oliver Drobnik Date: Sun, 24 Aug 2025 11:30:18 +0200 Subject: [PATCH] Added unit test for problematic email #43 --- .../ProblematicMessageTests.swift | 120 ++++++++++++++++++ .../Resources/problematic_message_6068.json | 67 ++++++++++ 2 files changed, 187 insertions(+) create mode 100644 Tests/SwiftIMAPTests/ProblematicMessageTests.swift create mode 100644 Tests/SwiftIMAPTests/Resources/problematic_message_6068.json diff --git a/Tests/SwiftIMAPTests/ProblematicMessageTests.swift b/Tests/SwiftIMAPTests/ProblematicMessageTests.swift new file mode 100644 index 0000000..b319257 --- /dev/null +++ b/Tests/SwiftIMAPTests/ProblematicMessageTests.swift @@ -0,0 +1,120 @@ +import Foundation +import Testing +@testable import SwiftMail + +// Add new tag for problematic message tests +extension Tag { + @Tag static var problematic: Self +} + +@Suite("Problematic Message Tests", .tags(.imap, .decoding, .problematic)) +struct ProblematicMessageTests { + + // MARK: - Test Resources + + func getResourceURL(for name: String, withExtension ext: String) -> URL? { + return Bundle.module.url(forResource: name, withExtension: ext, subdirectory: "Resources") + } + + func loadMessageFromJSON(name: String) throws -> Message { + guard let url = getResourceURL(for: name, withExtension: "json") else { + throw TestFailure("Failed to locate resource: \(name).json") + } + + do { + let data = try Data(contentsOf: url) + let decoder = JSONDecoder() + return try decoder.decode(Message.self, from: data) + } catch { + throw TestFailure("Failed to decode message from JSON: \(error)") + } + } + + // MARK: - Problematic Message 6068 Tests + + @Test("Message 6068 text body should be decodable", .tags(.decoding, .problematic)) + func message6068TextBodyShouldBeDecodable() throws { + // Load the problematic message from JSON + let message = try loadMessageFromJSON(name: "problematic_message_6068") + + // Verify the message has the expected UID + #expect(message.uid?.value == 6068) + #expect(message.subject?.contains("Apple") == true) + + // Check that the message has text parts with data + let textParts = message.parts.filter { $0.contentType.lowercased() == "text/plain" } + #expect(textParts.count > 0, "Message should have text/plain parts") + + let textPart = textParts.first! + #expect(textPart.data != nil, "Text part should have data") + #expect(textPart.data!.count > 0, "Text part data should not be empty") + #expect(textPart.encoding == "QUOTED-PRINTABLE", "Text part should be quoted-printable encoded") + + // Test the textBody computed property - this should fail currently + let textBody = message.textBody + #expect(textBody != nil, "textBody should not be nil") + if let textBody = textBody { + #expect(textBody.count > 0, "textBody should not be empty") + #expect(textBody.contains("Hallo Oliver Drobnik"), "textBody should contain expected content") + } + } + + @Test("Message 6068 HTML body should be decodable", .tags(.decoding, .problematic)) + func message6068HtmlBodyShouldBeDecodable() throws { + // Load the problematic message from JSON + let message = try loadMessageFromJSON(name: "problematic_message_6068") + + // Verify the message has the expected UID + #expect(message.uid?.value == 6068) + + // Check that the message has HTML parts with data + let htmlParts = message.parts.filter { $0.contentType.lowercased() == "text/html" } + #expect(htmlParts.count > 0, "Message should have text/html parts") + + let htmlPart = htmlParts.first! + #expect(htmlPart.data != nil, "HTML part should have data") + #expect(htmlPart.data!.count > 0, "HTML part data should not be empty") + #expect(htmlPart.encoding == "QUOTED-PRINTABLE", "HTML part should be quoted-printable encoded") + + // Test the htmlBody computed property - this should fail currently + let htmlBody = message.htmlBody + #expect(htmlBody != nil, "htmlBody should not be nil") + if let htmlBody = htmlBody { + #expect(htmlBody.count > 0, "htmlBody should not be empty") + #expect(htmlBody.contains(""), "htmlBody should contain HTML content") + #expect(htmlBody.contains("Hallo Oliver Drobnik"), "htmlBody should contain expected content") + } + } + + @Test("Message 6068 raw part data should be accessible", .tags(.decoding, .problematic)) + func message6068RawPartDataShouldBeAccessible() throws { + // Load the problematic message from JSON + let message = try loadMessageFromJSON(name: "problematic_message_6068") + + // Test text part raw data + let textParts = message.parts.filter { $0.contentType.lowercased() == "text/plain" } + let textPart = textParts.first! + + // The data should already be decoded from base64 by the JSON decoder + #expect(textPart.data != nil, "Text part should have data") + #expect(textPart.data!.count > 0, "Text part data should not be empty") + + // Test HTML part raw data + let htmlParts = message.parts.filter { $0.contentType.lowercased() == "text/html" } + let htmlPart = htmlParts.first! + + #expect(htmlPart.data != nil, "HTML part should have data") + #expect(htmlPart.data!.count > 0, "HTML part data should not be empty") + + // Try to decode as UTF-8 strings + let rawText = String(data: textPart.data!, encoding: .utf8) + let rawHtml = String(data: htmlPart.data!, encoding: .utf8) + + #expect(rawText != nil, "Raw text should be valid UTF-8") + #expect(rawHtml != nil, "Raw HTML should be valid UTF-8") + + // The raw content should be quoted-printable encoded + #expect(rawText!.contains("=20"), "Raw text should contain quoted-printable encoding") + #expect(rawHtml!.contains("=20"), "Raw HTML should contain quoted-printable encoding") + } +} diff --git a/Tests/SwiftIMAPTests/Resources/problematic_message_6068.json b/Tests/SwiftIMAPTests/Resources/problematic_message_6068.json new file mode 100644 index 0000000..9b4e0ce --- /dev/null +++ b/Tests/SwiftIMAPTests/Resources/problematic_message_6068.json @@ -0,0 +1,67 @@ +{ + "header" : { + "cc" : [ + + ], + "date" : 770012962, + "flags" : [ + "seen", + "$NotJunk", + "NotJunk" + ], + "from" : "\"Apple\" ", + "messageId" : "<1601458699.153043172.1748320162240@email.apple.com>", + "parts" : [ + { + "contentType" : "text\/plain", + "disposition" : "inline", + "encoding" : "QUOTED-PRINTABLE", + "section" : { + "numbers" : [ + 1 + ] + } + }, + { + "contentType" : "text\/html", + "disposition" : "inline", + "encoding" : "QUOTED-PRINTABLE", + "section" : { + "numbers" : [ + 2 + ] + } + } + ], + "sequenceNumber" : 272, + "subject" : "Dein_Apple Account_wurde_verwendet,_um_sich_ über_einen_Webbrowser_bei_iCloud_anzumelden.", + "to" : [ + "oliver@drobnik.com" + ], + "uid" : 6068 + }, + "parts" : [ + { + "contentType" : "text\/plain", + "data" : "SGFsbG8gT2xpdmVyIERyb2JuaWssDQoNCg0KDQogICA9MjANCiAgICAgICA9MjANCiAgICAgICAgICAgPTIwDQogICAgICAgICAgICAgICAgZGVpbiBBcHBsZT1BMEFjY291bnQgKG9saXZlckBkcm9ibmlrLmNvbSkgd3VyZGUgdmVyd2VuZGV0LCA9DQp1bSBzaWNoIGF1ZiBlaW5lbiBXZWJicm93c2VyIGJlaSBpQ2xvdWQgYW56dW1lbGRlbi4NCiAgICAgICAgICAgPTIwDQogICAgICAgPTIwDQogICA9MjANCg0KDQoNCiAgICBEYXR1bSB1bmQgWmVpdDogMjYuPUEwTWFpPUEwMjAyNSwgMjE6Mjg9QTBVaHI9QTBQRFQNCg0KDQoNCg0KICAgPTIwDQoNCg0KDQogICAgV2VubiBkaXIgZGllIG9iZW4gYXVmZ2VmPUZDaHJ0ZW4gSW5mb3JtYXRpb25lbiBiZWthbm50IHZvcmtvbW1lbiwga2FubnM9DQp0IGR1IGRpZXNlIE5hY2hyaWNodCBpZ25vcmllcmVuLg0KDQoNCg0KICAgPTIwDQogICAgICAgIEZhbGxzIGR1IGRpY2ggbmljaHQgdm9yIEt1cnplbSBiZWkgaUNsb3VkIGFuZ2VtZWxkZXQgaGFzdCB1bmQgZGVyIE09DQplaW51bmcgYmlzdCwgZGFzcyBqZW1hbmQgYW5kZXJlcyB2ZXJzdWNodCBoYXQsIGF1ZiBkZWluZW4gQWNjb3VudCB6dXp1Z3JlaWY9DQplbiwgc29sbHRlc3QgZHUgZGVpbiBQYXNzd29ydCBzbyBzY2huZWxsIHdpZSBtPUY2Z2xpY2ggdW50ZXIgaHR0cHM6Ly9hY2NvdW49DQp0LmFwcGxlLmNvbSA9RTRuZGVybi4NCiAgID0yMA0KDQoNCg0KTWl0IGZyZXVuZGxpY2hlbiBHcj1GQz1ERmVuDQpBcHBsZT1BMFN1cHBvcnQNCg0KDQpBcHBsZT1BMEFjY291bnQ6IGh0dHBzOi8vYWNjb3VudC5hcHBsZS5jb20vIyEmcGFnZT0zRHNpZ25pbg0KU3VwcG9ydDogaHR0cHM6Ly9zdXBwb3J0LmFwcGxlLmNvbS9kZS1kZQ0KRGF0ZW5zY2h1dHo6IGh0dHBzOi8vd3d3LmFwcGxlLmNvbS9sZWdhbC9wcml2YWN5L2RlLw0KQ29weXJpZ2h0IDIwMjUgQXBwbGUgRGlzdHJpYnV0aW9uIEludGVybmF0aW9uYWwgTHRkLiBIb2xseWhpbGwgSW5kdXN0cmlhbCBFPQ0Kc3RhdGUsIEhvbGx5aGlsbCwgQ29yaywgSXJlbGFuZC4NCkFsbGUgUmVjaHRlIHZvcmJlaGFsdGVuLg==", + "disposition" : "inline", + "encoding" : "QUOTED-PRINTABLE", + "section" : { + "numbers" : [ + 1 + ] + } + }, + { + "contentType" : "text\/html", + "data" : "PGh0bWw+DQogPGhlYWQ+PTIwDQogIDxtZXRhIGh0dHAtZXF1aXY9M0QiY29udGVudC10eXBlIiBjb250ZW50PTNEInRleHQvaHRtbDsgY2hhcnNldD0zRFVURi04Ij49DQo9MjANCiAgPG1ldGEgbmFtZT0zRCJ2aWV3cG9ydCIgY29udGVudD0zRCJ3aWR0aD0zRGRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0zRD0NCjEiPj0yMA0KICA8c3R5bGUgdHlwZT0zRCJ0ZXh0L2NzcyI+DQogICAgdGFibGUuZm9vdGVyLXRhYmxlIHsNCiAgICAgICAgd2lkdGg6IDEwMCU7DQogICAgICAgIGZvbnQtc2l6ZTogaW5oZXJpdDsNCiAgICAgICAgbGluZS1oZWlnaHQ6IDE4cHg7DQogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgICB9DQoNCiAgICB0YWJsZS5mb290ZXItdGFibGUgLmZvb3Rlci1iYWNrZ3JvdW5kIHsNCiAgICAgICAgd2lkdGg6IDY4NXB4Ow0KICAgICAgICBmb250LXNpemU6IDExcHg7DQogICAgICAgIGxpbmUtaGVpZ2h0OiAyMnB4Ow0KICAgICAgICBjb2xvcjogIzg4ODsNCiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOw0KICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0Ow0KICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgdG9wOw0KICAgICAgICBwYWRkaW5nOiAxNXB4IDAgN3B4Ow0KICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaHR0cHM6Ly9zdGF0aWNpLmljbG91ZC5jb20vZW1haWxpbWFnZXMvdjQvY29tPQ0KbW9uL2Zvb3Rlcl9ncmFkaWVudF93ZWIucG5nKTsNCiAgICB9DQogICA9MjANCiAgIC5ncmV5LWZvb3Rlci1iYWNrZ3JvdW5kIHsNCiAgICAgICAgd2lkdGg6IDY4NXB4Ow0KICAgICAgICBmb250LXNpemU6IDExcHg7DQogICAgICAgIGxpbmUtaGVpZ2h0OiAyMnB4Ow0KICAgICAgICBjb2xvcjogIzg4ODsNCiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOw0KICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0Ow0KICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgdG9wOw0KICAgICAgICBwYWRkaW5nOiAyOXB4IDAgN3B4Ow0KICAgICAgICBvdmVyZmxvdzogaGlkZGVuOw0KICAgICAgICBiYWNrZ3JvdW5kOiAjZjVmNWY1IG5vLXJlcGVhdDsNCiAgICB9DQoNCiAgICB0YWJsZS5mb290ZXItdGFibGUgLmljbG91ZC1sb2dvIHsNCiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOw0KICAgIH0NCg0KICAgIHRhYmxlLmZvb3Rlci10YWJsZSAuZm9vdGVyLWNlbGwgew0KICAgICAgICBmb250LWZhbWlseTogc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFNlZ29lIFVJPQ0KLCBIZWx2ZXRpY2EgTmV1ZSwgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsNCiAgICAgICAgZm9udC1zaXplOiAxMnB4Ow0KICAgICAgICBsaW5lLWhlaWdodDogMTVweDsNCiAgICAgICAgY29sb3I6ICM2NjY7DQogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgICAgICAgcGFkZGluZzogMCAxOHB4IDE4cHggMThweDsNCiAgICB9DQoNCiAgICB0YWJsZS5mb290ZXItdGFibGUgLm5vYnIgew0KICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOw0KICAgIH0NCg0KICAgIHRhYmxlLmZvb3Rlci10YWJsZSAuZm9vdGVyLWNlbGwgYSB7DQogICAgICAgIGNvbG9yOiAjMDA3MGM5Ow0KICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQogICAgfQ0KDQogICAgZm9vdGVyLWNvbG9yIHsNCiAgICAgICAgY29sb3I6ICM2NjYgIWltcG9ydGFudDsNCiAgICB9DQoNCiAgICB0YWJsZS5mb290ZXItdGFibGUgLmZvb3Rlci1jZWxsIGEuYXBwbGUtYWRkcmVzcyB7DQogICAgICAgIGNvbG9yOiAjNjY2Ow0KICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOw0KICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQogICAgfQ0KDQogICAgdGFibGUuZm9vdGVyLXRhYmxlMSB7DQogICAgICAgIHdpZHRoOiAxMDAlOw0KICAgICAgICBmb250LXNpemU6IGluaGVyaXQ7DQogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMmYyZjI7DQogICAgICAgIG1hcmdpbi10b3A6IGF1dG87DQogICAgfQ0KDQogICAgdGFibGUuZm9vdGVyLXRhYmxlMSAubm9iciB7DQogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7DQogICAgfQ0KDQogICAgdGFibGUuZm9vdGVyLXRhYmxlMSAuZm9vdGVyLWJhY2tncm91bmQxIHsNCiAgICAgICAgZm9udC1zaXplOiAxMXB4Ow0KICAgICAgICBsaW5lLWhlaWdodDogMjJweDsNCiAgICAgICAgY29sb3I6ICM4ODg7DQogICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChodHRwczovL3N0YXRpY2kuaWNsb3VkLmNvbS9lbWFpbGltYWdlcy92NC9jb209DQptb24vZm9vdGVyX2dyYWRpZW50X3dlYi5wbmcpOw0KICAgIH0NCg0KICAgIHRhYmxlLmZvb3Rlci10YWJsZTEgLmZvb3Rlci1jZWxsMSB7DQogICAgICAgIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgU2Vnb2UgVUk9DQosIEhlbHZldGljYSBOZXVlLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOw0KICAgICAgICBmb250LXNpemU6IDEycHg7DQogICAgICAgIGxpbmUtaGVpZ2h0OiAxOHB4Ow0KICAgICAgID0yMA0KICAgICAgICAgICAgcGFkZGluZzogMjBweCAzNnB4IDFweCA0MHB4Ow0KICAgICAgICAgICAgbWFyZ2luLWxlZnQ6MTBweDsNCiAgICAgICA9MjANCiAgICB9DQoNCiAgICAgICAgdGFibGUuZm9vdGVyLXRhYmxlMSAuZm9vdGVyLWNlbGwxLXNtYWxsc2l6ZSB7DQogICAgICAgIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgU2Vnb2UgVUk9DQosIEhlbHZldGljYSBOZXVlLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOw0KICAgICAgICBmb250LXNpemU6IDExcHg7DQogICAgICAgIGxpbmUtaGVpZ2h0OiAxOHB4Ow0KICAgICAgICBjb2xvcjogIzY2NiAhaW1wb3J0YW50Ow0KICAgICAgID0yMA0KICAgICAgICAgICAgcGFkZGluZzogMjBweCAzNnB4IDFweCA0MHB4Ow0KICAgICAgICAgICAgbWFyZ2luLWxlZnQ6MTBweDsNCiAgICAgICA9MjANCiAgICB9DQoNCiAgICB0YWJsZS5mb290ZXItdGFibGUxIC5mb290ZXItY2VsbDIgew0KICAgICAgICBmb250LWZhbWlseTogc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFNlZ29lIFVJPQ0KLCBIZWx2ZXRpY2EgTmV1ZSwgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjsNCiAgICAgICAgZm9udC1zaXplOiAxMnB4Ow0KICAgICAgICBsaW5lLWhlaWdodDogMThweDsNCiAgICAgICAgY29sb3I6ICM2NjY7DQogICAgICAgPTIwDQogICAgICAgICAgICBwYWRkaW5nOiAxcHggMzZweCAyMHB4IDQwcHg7DQogICAgICAgICAgICBtYXJnaW4tbGVmdDoxMHB4Ow0KICAgICAgID0yMA0KICAgIH0NCg0KICAgIHRhYmxlLmZvb3Rlci10YWJsZTEgLmZvb3Rlci1jZWxsMSBhIHsNCiAgICAgICAgY29sb3I6ICM1NTU7DQogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCiAgICB9DQoNCiAgICB0YWJsZS5mb290ZXItdGFibGUxIC5mb290ZXItY2VsbDIgYS5hcHBsZS1hZGRyZXNzIHsNCiAgICAgICAgY29sb3I6ICM2NjY7DQogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7DQogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCiAgICB9DQoNCiAgICB0YWJsZS5mb290ZXItdGFibGUgLmZvb3Rlci1saW5rIHsNCiAgICAgICAgY29sb3I6ICM1NTU7DQogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCiAgICB9DQogICAgdGFibGUuZm9vdGVyLXRhYmxlIC5mb290ZXItdGV4dHsNCiAgICAgICAgY29sb3I6ICM4ODg7DQogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCiAgICB9DQogICAgdGFibGUuZm9vdGVyLXRhYmxlIC5mb290ZXItdGV4dCBhew0KICAgICAgICBjb2xvcjogIzg4ODsNCiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KICAgIH0NCg0KPC9zdHlsZT49MjANCiAgPHN0eWxlIHR5cGU9M0QidGV4dC9jc3MiPg0KDQogICAgYm9keSB7DQogICAgICAgIHBhZGRpbmc6IDA7DQogICAgICAgIG1hcmdpbjogMDsNCiAgICB9DQoNCiAgICBib2R5ICogew0KICAgICAgICBtYXJnaW46IDA7DQogICAgfQ0KDQogICAgaW1nIHsNCiAgICAgICAgYm9yZGVyOiAwOw0KICAgIH0NCg0KICAgIGhyLmhvcml6b250YWwtZGl2aWRlciB7DQogICAgICAgIGhlaWdodDogMXB4Ow0KICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjZmNmY2Ow0KICAgICAgICBib3JkZXI6IDA7DQogICAgfQ0KDQogICAgYSB7DQogICAgICAgIGNvbG9yOiAjMDA3MGM5Ow0KICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQogICAgfQ0KDQogICAgYS5iaWctYnV0dG9uIHsNCiAgICAgICAgY29sb3I6ICMwMDcwYzk7DQogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOw0KICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgICAgIGhlaWdodDogNDNweDsNCiAgICAgICAgbGluZS1oZWlnaHQ6IDQzcHg7DQogICAgICAgIGZvbnQtc2l6ZTogMTdweDsNCiAgICAgICAgcGFkZGluZzogMDsNCiAgICB9DQoNCiAgICBhLmJpZy1idXR0b24gPiB0YWJsZSB7DQogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDcwLDE2MiwyNTUpOw0KICAgICAgICBmb250LXNpemU6IGluaGVyaXQ7DQogICAgICAgIGxpbmUtaGVpZ2h0OiBpbmhlcml0Ow0KICAgICAgICBwYWRkaW5nOiAwOw0KICAgICAgICBib3JkZXI6IDA7DQogICAgfQ0KDQogICAgYS5iaWctYnV0dG9uID4gdGFibGUgdGQuYnRuLXBhZGRpbmcgew0KICAgICAgICB3aWR0aDogMThweDsNCiAgICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7DQogICAgICAgIGZvbnQtc2l6ZTogaW5oZXJpdDsNCiAgICAgICAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7DQogICAgICAgIGJhY2tncm91bmQtc2l6ZTogMThweCA0M3B4ICFpbXBvcnRhbnQ7DQogICAgICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7DQogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYig3MCwxNjIsMjU1KTsNCiAgICB9DQoNCiAgICBhLmJpZy1idXR0b24gPiB0YWJsZSB0ZC5idG4tbGVmdCB7DQogICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChodHRwczovL3N0YXRpY2kuaWNsb3VkLmNvbS9lbWFpbGltYWdlcy92NC9mYW09DQppbHlzaGFyaW5nL2J1dHRvbl9sZWZ0LnBuZyk7DQogICAgfQ0KDQogICAgYS5iaWctYnV0dG9uID4gdGFibGUgdGQuYnRuLXJpZ2h0IHsNCiAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGh0dHBzOi8vc3RhdGljaS5pY2xvdWQuY29tL2VtYWlsaW1hZ2VzL3Y0L2ZhbT0NCmlseXNoYXJpbmcvYnV0dG9uX3JpZ2h0LnBuZyk7DQogICAgfQ0KDQogICAgYS5iaWctYnV0dG9uID4gdGFibGUgdGQuYnRuLW1pZGRsZSB7DQogICAgICAgIG1pbi13aWR0aDogNjBweDsNCiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOw0KICAgICAgICBiYWNrZ3JvdW5kOiB1cmwoJ2h0dHBzOi8vc3RhdGljaS5pY2xvdWQuY29tL2VtYWlsaW1hZ2VzL3Y0L2ZhbWlseXNoPQ0KYXJpbmcvYnV0dG9uX21pZGRsZS5wbmcnKSByZXBlYXQteDsNCiAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjpsZWZ0IGJvdHRvbSAhaW1wb3J0YW50Ow0KICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoNzAsMTYyLDI1NSk7DQogICAgICAgIHpvb206IDE7DQogICAgICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0Ow0KICAgICAgICBsaW5lLWhlaWdodDogaW5oZXJpdDsNCiAgICAgICAgZm9udC1zaXplOiBpbmhlcml0Ow0KICAgIH0NCg0KICAgIGEuYmlnLWJ1dHRvbiA+IHRhYmxlIHRkLmJ0bi1taWRkbGUgPiBhIHsNCiAgICAgICAgY29sb3I6ICNmZmZmZmY7DQogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCiAgICB9DQoNCiAgICBib2R5LCB0ZCwgcCwgdWwsIG9sIHsNCiAgICAgICAgZm9udC1mYW1pbHk6IHN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBTZWdvZSBVST0NCiwgSGVsdmV0aWNhIE5ldWUsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7DQogICAgICAgIGZvbnQtc2l6ZTogMTNweDsNCiAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7DQogICAgICAgIGxpbmUtaGVpZ2h0OiAxOHB4Ow0KICAgICAgICBjb2xvcjogIzMzMzMzMzsNCiAgICB9DQoNCiAgICB0YWJsZSB7DQogICAgICAgIGJvcmRlci1zcGFjaW5nOiAwOw0KICAgICAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOw0KICAgICAgICBib3JkZXI6IDA7DQogICAgfQ0KDQogICAgdGFibGUgdGQgew0KICAgICAgICBwYWRkaW5nOiAwOw0KICAgIH0NCg0KICAgIHRhYmxlIHRkLmFsaWduLWxlZnQgew0KICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KICAgIH0NCg0KICAgIHRhYmxlIHRkLmFsaWduLWNlbnRlciB7DQogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgICB9DQoNCiAgICB0YWJsZSB0ZC5hbGlnbi1yaWdodCB7DQogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0Ow0KICAgIH0NCg0KICAgIGgxIHsNCiAgICAgICAgZm9udC1zaXplOiAxOXB4Ow0KICAgICAgICBsaW5lLWhlaWdodDogMjJweDsNCiAgICAgICAgY29sb3I6ICMzMzMzMzM7DQogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIH0NCg0KICAgIGgyIHsNCiAgICAgICAgZm9udC1zaXplOiAxNnB4Ow0KICAgICAgICBsaW5lLWhlaWdodDogMThweDsNCiAgICAgICAgY29sb3I6ICMzMzMzMzM7DQogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIH0NCg0KICAgIC5ociB7DQogICAgICAgIGhlaWdodDoxcHg7DQogICAgICAgIGJhY2tncm91bmQtY29sb3I6I2NjYzsNCiAgICB9DQoNCiAgICAubWFpbC13cmFwcGVyIHsNCiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsNCiAgICB9DQoNCiAgICB0YWJsZS5saXN0LWl0ZW1zIHsNCiAgICAgICA9MjANCiAgICAgICAgdGFibGUtbGF5b3V0OiBmaXhlZDsNCiAgICAgICAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7DQogICAgICAgIGZvbnQtc2l6ZTogaW5oZXJpdDsNCiAgICB9DQoNCiAgICB0YWJsZS5saXN0LWl0ZW1zIC5saXN0LWl0ZW0tcHJlZml4IHsNCiAgICAgICAgcGFkZGluZy1yaWdodDogNHB4Ow0KICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOw0KICAgIH0NCg0KICAgIHRhYmxlLmxpc3QtaXRlbXMgLmxpc3QtaXRlbSB7DQogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7DQogICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7DQogICAgfQ0KDQogICAgLnNob3ctb24tbW9iaWxlIHsNCiAgICAgICAgZGlzcGxheTogbm9uZTsNCiAgICAgICAgbXNvLWhpZGU6IGFsbDsgLyogT3V0bG9vayAqLw0KICAgICAgICBtYXgtaGVpZ2h0OiAwOyAvKiBHbWFpbCAqLw0KICAgICAgICBvdmVyZmxvdzogaGlkZGVuOyAvKiBHbWFpbCAqLw0KICAgIH0NCg0KICAgIEBtZWRpYSAobWF4LXdpZHRoOiA0MTRweCkgew0KICAgICAgICAuc2hvdy1vbi1tb2JpbGUgew0KICAgICAgICAgICAgZGlzcGxheTogdGFibGUgIWltcG9ydGFudDsNCiAgICAgICAgICAgIG1zby1oaWRlOiBub25lICFpbXBvcnRhbnQ7IC8qIE91dGxvb2sgKi8NCiAgICAgICAgICAgIG1heC1oZWlnaHQ6IG5vbmUgIWltcG9ydGFudDsgLyogR21haWwgKi8NCiAgICAgICAgfQ0KICAgICAgICAuaGlkZS1vbi1tb2JpbGUgew0KICAgICAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Ow0KICAgICAgICAgICAgbXNvLWhpZGU6IGFsbCAhaW1wb3J0YW50Ow0KICAgICAgICAgICAgbWF4LWhlaWdodDogMCAhaW1wb3J0YW50Ow0KICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsNCiAgICAgICAgfQ0KICAgIH0NCg0KPC9zdHlsZT49MjANCiAgPHN0eWxlIHR5cGU9M0QidGV4dC9jc3MiPg0KICAgIC5tYWluLXRhYmxlLTEgew0KICAgICAgICB3aWR0aDogNjg1cHg7DQogICAgICAgIHBhZGRpbmc6IDBweCAyMHB4Ow0KICAgIH0NCg0KICAgIC5tYWluLXRhYmxlLTIgew0KICAgICAgICB3aWR0aDogNjg1cHg7DQogICAgICAgPTIwDQogICAgICAgICAgICBwYWRkaW5nOiAwcHggMzZweCAwcHggNDBweDsNCiAgICAgICA9MjANCiAgICB9DQoNCiAgICAuY29udGVudC10YWJsZS0xIHsNCiAgICAgICAgbWFyZ2luOiAwIGF1dG87DQogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgICB9DQoNCiAgICAuY29udGVudC10YWJsZS0yIHsNCiAgICAgICAgbWFyZ2luOiAwIGF1dG87DQogICAgICAgPTIwDQogICAgICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KICAgICAgID0yMA0KICAgIH0NCg0KICAgIC5oZWFkZXItMSB7DQogICAgICAgIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgU2Vnb2UgVUk9DQosIEhlbHZldGljYSBOZXVlLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOw0KICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsNCiAgICAgICAgY29sb3I6ICMzMzM7DQogICAgICAgIGZvbnQtc21vb3RoOiBhbHdheXM7DQogICAgICAgIGZvbnQtc2l6ZTogMzRweDsNCiAgICAgICAgbGluZS1oZWlnaHQ6IDM3cHg7DQogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgICAgICA9MjANCiAgICB9DQoNCiAgICAudGV4dC0xIHsNCiAgICAgICAgZm9udC1mYW1pbHk6IHN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBTZWdvZSBVST0NCiwgSGVsdmV0aWNhIE5ldWUsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7DQogICAgICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOw0KICAgICAgICBjb2xvcjogIzMzMzsNCiAgICAgICAgZm9udC1zbW9vdGg6IGFsd2F5czsNCiAgICAgICAgZm9udC1zaXplOiAxN3B4Ow0KICAgICAgICBsaW5lLWhlaWdodDogMjZweDsNCiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOw0KICAgICAgID0yMA0KICAgIH0NCg0KICAgIC5idXR0b24tdGV4dCB7DQogICAgICAgIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgU2Vnb2UgVUk9DQosIEhlbHZldGljYSBOZXVlLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOw0KICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsNCiAgICAgICAgY29sb3I6ICMzMzM7DQogICAgICAgIGZvbnQtc21vb3RoOiBhbHdheXM7DQogICAgICAgIGZvbnQtc2l6ZTogMTdweDsNCiAgICAgICAgbGluZS1oZWlnaHQ6IDI2cHg7DQogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgICAgICA9MjANCiAgICB9DQoNCiAgICAucGFkZGluZy0xew0KICAgICAgICBwYWRkaW5nLXRvcDogMTZweDsNCiAgICB9DQoNCiAgICAucGFkZGluZy0yew0KICAgICAgICBwYWRkaW5nLWJvdHRvbTogMTRweDsNCiAgICB9DQoNCiAgICAucGFkZGluZy0zew0KICAgICAgICBwYWRkaW5nLWJvdHRvbTogMTZweDsNCiAgICB9DQoNCiAgICAucGFkZGluZy00ew0KICAgICAgICBwYWRkaW5nLXRvcDogMjRweDsNCiAgICB9DQoNCiAgICAucGFkZGluZy01ew0KICAgICAgICBwYWRkaW5nLWJvdHRvbTogMjZweDsNCiAgICB9DQoNCiAgICAucGFkZGluZy02ew0KICAgICAgICBwYWRkaW5nLWJvdHRvbTogMzBweDsNCiAgICB9DQoNCiAgICAucGFkZGluZy03ew0KICAgICAgICBwYWRkaW5nLWJvdHRvbTogMTJweDsNCiAgICB9DQoNCiAgICAucGFkZGluZy04ew0KICAgICAgICBwYWRkaW5nLXRvcDogMzhweDsNCiAgICB9DQogICA9MjANCiAgICAucGFkZGluZy05ew0KICAgICAgICBwYWRkaW5nLXRvcDogMzJweDsNCiAgICB9DQoNCg0KICAgIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc1MHB4KSB7DQogICAgICAgIC5jb250ZW50LXRhYmxlLTEgew0KICAgICAgICAgICAgcGFkZGluZzogMHB4IDIwcHg7DQogICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgICAgIH0NCg0KICAgICAgICAuY29udGVudC10YWJsZS0yIHsNCiAgICAgICAgICAgIHBhZGRpbmc6IDBweCAyMHB4Ow0KICAgICAgICAgID0yMA0KICAgICAgICB9DQogICAgfQ0KDQo8L3N0eWxlPj0yMA0KICA8c3R5bGUgdHlwZT0zRCJ0ZXh0L2NzcyI+DQogICAgLm1haWwtd3JhcHBlciB7DQogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgICB9DQogICAgLmFjY291bnQtY29udGVudC1zZiB7DQogICAgICAgIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgU2Vnb2UgVUk9DQosIEhlbHZldGljYSBOZXVlLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOw0KICAgICAgICBjb2xvcjogIzMzMzsNCiAgICAgICAgZm9udC1zbW9vdGg6IGFsd2F5czsNCiAgICAgICAgZm9udC1zaXplOiAxN3B4Ow0KICAgICAgICBsaW5lLWhlaWdodDogMS4zOw0KICAgICAgID0yMA0KICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGxlZnQ7DQogICAgICAgPTIwDQogICAgfQ0KDQogICAgLmFjY291bnQtbG9nby1ib3ggew0KICAgICAgID0yMA0KICAgICAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7DQogICAgICAgICAgICBmbG9hdDpyaWdodDsNCiAgICAgICAgICAgIG1hcmdpbi1yaWdodDoxMHB4Ow0KICAgICAgID0yMA0KICAgIH0NCiAgID0yMA0KICAgIC5hY2NvdW50LWxpbmstMSB7DQogICAgICAgIGNvbG9yOiAjMmIyYjJiOz0yMA0KICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7DQogICAgfQ0KICAgIGE6dmlzaXRlZC5hY2NvdW50LWxpbmstMSB7IGNvbG9yOiAjMDhjICFpbXBvcnRhbnQ7IHRleHQtZGVjb3JhdGlvbjogbm9uPQ0KZSAhaW1wb3J0YW50OyB9DQogICAgYTpob3Zlci5hY2NvdW50LWxpbmstMSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lICFpbXBvcnRhbnQ7IH0NCiAgICBhOmFjdGl2ZS5hY2NvdW50LWxpbmstMSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lICFpbXBvcnRhbnQ7IH0NCg0KICAgIC5hY2NvdW50LWxpbmstMiB7DQogICAgICAgIGNvbG9yOiAjMzMzOw0KICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQogICAgfQ0KICAgIGE6dmlzaXRlZC5hY2NvdW50LWxpbmstMiB7IGNvbG9yOiAjMDhjICFpbXBvcnRhbnQ7IHRleHQtZGVjb3JhdGlvbjogbm9uPQ0KZSAhaW1wb3J0YW50OyB9DQogICAgYTpob3Zlci5hY2NvdW50LWxpbmstMiB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lICFpbXBvcnRhbnQ7IH0NCiAgICBhOmFjdGl2ZS5hY2NvdW50LWxpbmstMiB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lICFpbXBvcnRhbnQ7IH0NCiAgICAuYWNjb3VudC1saW5rLTMgew0KICAgICAgICBjb2xvcjogIzMzMzsNCiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KICAgIH0NCg0KICAgIHRkLnNwYWNlIHsNCiAgICAgICAgd2lkdGg6IDE1cHg7DQogICAgfQ0KDQogICAgdGQuaWNvbiB7DQogICAgICAgIHBhZGRpbmctdG9wOiAxNXB4Ow0KICAgICAgICB3aWR0aDogNTZweDsNCiAgICB9DQoNCiAgICB0YWJsZS5jZW50ZXItdGFibGUgew0KICAgICAgICBtYXJnaW46IGF1dG87DQogICAgfQ0KDQogICAgcC5pY29uLWhlYWRpbmcgew0KICAgICAgICBjb2xvcjogIzMzMzsNCiAgICAgICAgZm9udC1zaXplOiAxNXB4Oz0yMA0KICAgICAgICBmb250LXdlaWdodDogNzAwOw0KICAgICAgICBsaW5lLWhlaWdodDogMjBweDsNCiAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4Ow0KICAgICAgICBtYXJnaW4tdG9wOiAwcHg7DQogICAgICAgIHBhZGRpbmctdG9wOiAxNXB4Ow0KICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KICAgIH0NCg0KICAgIHAuaWNvbi1zdWJoZWFkaW5nIHsNCiAgICAgICAgY29sb3I6ICM4MzgzODM7DQogICAgICAgIGZvbnQtc2l6ZTogMTVweDs9MjANCiAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7DQogICAgICAgIG1hcmdpbi10b3A6IDVweDsNCiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsNCiAgICB9DQoNCiAgICB0ZC5hbGlnbi1jZW50ZXIgew0KICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgfQ0KDQogICAgdGQuaGVhZGVyLTEgew0KICAgICAgICBjb2xvcjogIzMzMzsNCiAgICAgICAgZm9udC1zaXplOiAzNHB4Ow0KICAgICAgICBmb250LXdlaWdodDogNzAwOw0KICAgICAgICBsaW5lLWhlaWdodDogMS4xOw0KICAgICAgICBwYWRkaW5nOiAyMHB4IDIwcHggMTVweCAyMHB4Ow0KICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgfQ0KDQogICAgdGFibGUuaGVhZGVyLWNvbnRlbnQgew0KICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgICAgIGZvbnQtc2l6ZTogNDVweDsNCiAgICAgICAgbGluZS1oZWlnaHQ6IDQ4cHg7DQogICAgICAgIHBhZGRpbmctdG9wOiAzMHB4Ow0KICAgICAgICBmb250LWZhbWlseTogaW5oZXJpdDsNCiAgICB9DQoNCiAgICBhLmJsdWUtYnV0dG9uIHsNCiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjojMjY1YmIwOw0KICAgICAgICBib3JkZXItcmFkaXVzOjhweDsNCiAgICAgICAgY29sb3I6I2ZmZmZmZjsNCiAgICAgICAgZGlzcGxheTppbmxpbmUtYmxvY2s7DQogICAgICAgIGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EgTmV1ZSwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmICFpbXBvcnRhbnQ7DQogICAgICAgIGZvbnQtc2l6ZToxN3B4Ow0KICAgICAgICBsaW5lLWhlaWdodDo0MHB4Ow0KICAgICAgICB0ZXh0LWFsaWduOmNlbnRlcjsNCiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOm5vbmU7DQogICAgICAgIHdpZHRoOjE1MHB4Ow0KICAgICAgICAtd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6bm9uZTsNCiAgICB9DQoNCjwvc3R5bGU+PTIwDQogPC9oZWFkPj0yMA0KIDxib2R5IHN0eWxlPTNEInBhZGRpbmc6MDttYXJnaW46MDtjb2xvcjpyZ2IoNTEsIDUxLCA1MSk7Zm9udC1zaXplOjEzcHg7Zm9uPQ0KdC1mYW1pbHk6c3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFNlZ29lIFVJLCBIZWx2ZXRpY2EgPQ0KTmV1ZSwgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjtsaW5lLWhlaWdodDoxOHB4Oy13ZWJraXQtZm9udC1zbW9vdGhpbmc6PQ0KYW50aWFsaWFzZWQ7Ij49MjANCiAgPGRpdiBjbGFzcz0zRCJtYWlsLXdyYXBwZXIiIHN0eWxlPTNEImJhY2tncm91bmQtY29sb3I6cmdiKDI1NSwgMjU1LCAyNTUpOz0NCm1hcmdpbjowO3RleHQtYWxpZ246Y2VudGVyOyI+PTIwDQogICA8dGFibGUgc3R5bGU9M0QiYm9yZGVyOjA7bWFyZ2luOjA7Ym9yZGVyLXNwYWNpbmc6MDt0YWJsZS1sYXlvdXQ6YXV0bzt3aWQ9DQp0aDoxMDAlO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTsiPj0yMA0KICAgPC90YWJsZT4NCiAgIDx0YWJsZSBzdHlsZT0zRCJib3JkZXI6MDttYXJnaW46MCBhdXRvO2JvcmRlci1zcGFjaW5nOjA7Ym9yZGVyLWNvbGxhcHNlOj0NCmNvbGxhcHNlOyIgYWxpZ249M0QiY2VudGVyIj49MjANCiAgICA8dGJvZHkgc3R5bGU9M0QibWFyZ2luOjA7Ij4NCiAgICAgPHRyIHN0eWxlPTNEIm1hcmdpbjowOyI+DQogICAgICA8dGQgY2xhc3M9M0QibWFpbi10YWJsZS0yIiBhbGlnbj0zRCJjZW50ZXIiIHN0eWxlPTNEInBhZGRpbmc6MHB4IDM2cHg9DQogMHB4IDQwcHg7bWFyZ2luOjA7Y29sb3I6cmdiKDUxLCA1MSwgNTEpO3dpZHRoOjY4NXB4O2ZvbnQtc2l6ZToxM3B4O2ZvbnQtZmE9DQptaWx5OnN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBTZWdvZSBVSSwgSGVsdmV0aWNhIE5ldWU9DQosIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7bGluZS1oZWlnaHQ6MThweDstd2Via2l0LWZvbnQtc21vb3RoaW5nOmFudGk9DQphbGlhc2VkOyI+PTIwDQogICAgICAgPHRhYmxlIGNsYXNzPTNEImNvbnRlbnQtdGFibGUtMiIgc3R5bGU9M0QiYm9yZGVyOjA7bWFyZ2luOjAgYXV0bztib3I9DQpkZXItc3BhY2luZzowO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTt0ZXh0LWFsaWduOmxlZnQ7Ij49MjANCiAgICAgICAgPHRib2R5IHN0eWxlPTNEIm1hcmdpbjowOyI+DQogICAgICAgICA8dHIgc3R5bGU9M0QibWFyZ2luOjA7Ij4NCiAgICAgICAgICA8dGQgY2xhc3M9M0QiYWNjb3VudC1sb2dvLWJveCBwYWRkaW5nLTkgcGFkZGluZy02IiBzdHlsZT0zRCJwYWRkaT0NCm5nOjA7cGFkZGluZy10b3A6MzJweDttYXJnaW46MDtjb2xvcjpyZ2IoNTEsIDUxLCA1MSk7Zm9udC1zaXplOjEzcHg7cGFkZGluZz0NCi1ib3R0b206MzBweDtmb250LWZhbWlseTpzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgU2Vnbz0NCmUgVUksIEhlbHZldGljYSBOZXVlLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmO2xpbmUtaGVpZ2h0OjE4cHg7ZmxvYXQ6cj0NCmlnaHQ7LXdlYmtpdC1mb250LXNtb290aGluZzphbnRpYWxpYXNlZDt0ZXh0LWFsaWduOnJpZ2h0O21hcmdpbi1yaWdodDoxMHB4Oz0NCiI+IDxpbWcgc3JjPTNEImh0dHBzOi8vc3RhdGljaS5pY2xvdWQuY29tL2VtYWlsaW1hZ2VzL3Y0L2NvbW1vbi9hcHBsZV9sb2dvXz0NCndlYkAyeC5wbmciIHdpZHRoPTNEIjIycHgiIGhlaWdodD0zRCIyNnB4IiBzdHlsZT0zRCJib3JkZXI6MDttYXJnaW46MDsiPiA8Lz0NCnRkPg0KICAgICAgICAgPC90cj49MjANCiAgICAgICAgIDx0ciBzdHlsZT0zRCJtYXJnaW46MDsiPg0KICAgICAgICAgIDx0ZCBjbGFzcz0zRCJhY2NvdW50LWNvbnRlbnQtc2YgcGFkZGluZy03IiBzdHlsZT0zRCJwYWRkaW5nOjA7bWFyPQ0KZ2luOjA7Y29sb3I6cmdiKDUxLCA1MSwgNTEpO2ZvbnQtc2l6ZToxN3B4O3BhZGRpbmctYm90dG9tOjEycHg7Zm9udC1mYW1pbHk6PQ0Kc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFNlZ29lIFVJLCBIZWx2ZXRpY2EgTmV1ZSwgSGVsPQ0KdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjtsaW5lLWhlaWdodDoxLjM7Zm9udC1zbW9vdGg6YWx3YXlzOy13ZWJraXQtZm9udC1zPQ0KbW9vdGhpbmc6YW50aWFsaWFzZWQ7dGV4dC1hbGlnbjpsZWZ0OyI+IEhhbGxvIE9saXZlciBEcm9ibmlrLCA8L3RkPg0KICAgICAgICAgPC90cj49MjANCiAgICAgICAgIDx0ciBzdHlsZT0zRCJtYXJnaW46MDsiPg0KICAgICAgICAgIDx0ZCBjbGFzcz0zRCJhY2NvdW50LWNvbnRlbnQtc2YgcGFkZGluZy03IiBzdHlsZT0zRCJwYWRkaW5nOjA7bWFyPQ0KZ2luOjA7Y29sb3I6cmdiKDUxLCA1MSwgNTEpO2ZvbnQtc2l6ZToxN3B4O3BhZGRpbmctYm90dG9tOjEycHg7Zm9udC1mYW1pbHk6PQ0Kc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFNlZ29lIFVJLCBIZWx2ZXRpY2EgTmV1ZSwgSGVsPQ0KdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjtsaW5lLWhlaWdodDoxLjM7Zm9udC1zbW9vdGg6YWx3YXlzOy13ZWJraXQtZm9udC1zPQ0KbW9vdGhpbmc6YW50aWFsaWFzZWQ7dGV4dC1hbGlnbjpsZWZ0OyI+IGRlaW4gQXBwbGU9QTBBY2NvdW50ICg8YSBocmVmPTNEIm1hPQ0KaWx0bzpvbGl2ZXJAZHJvYm5pay5jb20iIGNsYXNzPTNEImFjY291bnQtbGluay0xIiBzdHlsZT0zRCJtYXJnaW46MDtjb2xvcjpyPQ0KZ2IoNDMsIDQzLCA0Myk7Zm9udC13ZWlnaHQ6NjAwO3RleHQtZGVjb3JhdGlvbjpub25lOyI+b2xpdmVyQGRyb2JuaWsuY29tPC9hPQ0KPikgd3VyZGUgdmVyd2VuZGV0LCB1bSBzaWNoIGF1ZiBlaW5lbiBXZWJicm93c2VyIGJlaSBpQ2xvdWQgYW56dW1lbGRlbi4gPC90PQ0KZD4NCiAgICAgICAgIDwvdHI+PTIwDQogICAgICAgICA8dHIgc3R5bGU9M0QibWFyZ2luOjA7Ij4NCiAgICAgICAgICA8dGQgY2xhc3M9M0QiYWNjb3VudC1jb250ZW50LXNmIHBhZGRpbmctNyIgc3R5bGU9M0QicGFkZGluZzowO21hcj0NCmdpbjowO2NvbG9yOnJnYig1MSwgNTEsIDUxKTtmb250LXNpemU6MTdweDtwYWRkaW5nLWJvdHRvbToxMnB4O2ZvbnQtZmFtaWx5Oj0NCnN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBTZWdvZSBVSSwgSGVsdmV0aWNhIE5ldWUsIEhlbD0NCnZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7bGluZS1oZWlnaHQ6MS4zO2ZvbnQtc21vb3RoOmFsd2F5czstd2Via2l0LWZvbnQtcz0NCm1vb3RoaW5nOmFudGlhbGlhc2VkO3RleHQtYWxpZ246bGVmdDsiPiBEYXR1bSB1bmQgWmVpdDogMjYuPUEwTWFpPUEwMjAyNSwgMj0NCjE6Mjg9QTBVaHI9QTBQRFQ8YnIgc3R5bGU9M0QibWFyZ2luOjA7Ij4gPC90ZD4NCiAgICAgICAgIDwvdHI+PTIwDQogICAgICAgICA8dHIgc3R5bGU9M0QibWFyZ2luOjA7Ij4NCiAgICAgICAgICA8dGQgY2xhc3M9M0QiYWNjb3VudC1jb250ZW50LXNmIHBhZGRpbmctNyIgc3R5bGU9M0QicGFkZGluZzowO21hcj0NCmdpbjowO2NvbG9yOnJnYig1MSwgNTEsIDUxKTtmb250LXNpemU6MTdweDtwYWRkaW5nLWJvdHRvbToxMnB4O2ZvbnQtZmFtaWx5Oj0NCnN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBTZWdvZSBVSSwgSGVsdmV0aWNhIE5ldWUsIEhlbD0NCnZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7bGluZS1oZWlnaHQ6MS4zO2ZvbnQtc21vb3RoOmFsd2F5czstd2Via2l0LWZvbnQtcz0NCm1vb3RoaW5nOmFudGlhbGlhc2VkO3RleHQtYWxpZ246bGVmdDsiPiBXZW5uIGRpciBkaWUgb2JlbiBhdWZnZWY9RkNocnRlbiBJbj0NCmZvcm1hdGlvbmVuIGJla2FubnQgdm9ya29tbWVuLCBrYW5uc3QgZHUgZGllc2UgTmFjaHJpY2h0IGlnbm9yaWVyZW4uIDwvdGQ+DQogICAgICAgICA8L3RyPj0yMA0KICAgICAgICAgPHRyIHN0eWxlPTNEIm1hcmdpbjowOyI+DQogICAgICAgICAgPHRkIGNsYXNzPTNEImFjY291bnQtY29udGVudC1zZiBwYWRkaW5nLTciIHN0eWxlPTNEInBhZGRpbmc6MDttYXI9DQpnaW46MDtjb2xvcjpyZ2IoNTEsIDUxLCA1MSk7Zm9udC1zaXplOjE3cHg7cGFkZGluZy1ib3R0b206MTJweDtmb250LWZhbWlseTo9DQpzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgU2Vnb2UgVUksIEhlbHZldGljYSBOZXVlLCBIZWw9DQp2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmO2xpbmUtaGVpZ2h0OjEuMztmb250LXNtb290aDphbHdheXM7LXdlYmtpdC1mb250LXM9DQptb290aGluZzphbnRpYWxpYXNlZDt0ZXh0LWFsaWduOmxlZnQ7Ij4gRmFsbHMgZHUgZGljaCBuaWNodCB2b3IgS3VyemVtIGJlaSA9DQppQ2xvdWQgYW5nZW1lbGRldCBoYXN0IHVuZCBkZXIgTWVpbnVuZyBiaXN0LCBkYXNzIGplbWFuZCBhbmRlcmVzIHZlcnN1Y2h0IGg9DQphdCwgYXVmIGRlaW5lbiBBY2NvdW50IHp1enVncmVpZmVuLCBzb2xsdGVzdCBkdSBkZWluIFBhc3N3b3J0IHNvIHNjaG5lbGwgd2k9DQplIG09RjZnbGljaCB1bnRlciA8YSBjbGFzcz0zRCJhY2NvdW50LWxpbmstMiIgaHJlZj0zRCJodHRwczovL2FjY291bnQuYXBwbGU9DQouY29tIiBzdHlsZT0zRCJtYXJnaW46MDtjb2xvcjpyZ2IoNTEsIDUxLCA1MSk7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Ij5odHRwczo9DQovL2FjY291bnQuYXBwbGUuY29tPC9hPiA9RTRuZGVybi4gPC90ZD4NCiAgICAgICAgIDwvdHI+PTIwDQogICAgICAgICA8dHIgc3R5bGU9M0QibWFyZ2luOjA7Ij4NCiAgICAgICAgICA8dGQgY2xhc3M9M0QiYWNjb3VudC1jb250ZW50LXNmIHBhZGRpbmctNyIgc3R5bGU9M0QicGFkZGluZzowO21hcj0NCmdpbjowO2NvbG9yOnJnYig1MSwgNTEsIDUxKTtmb250LXNpemU6MTdweDtwYWRkaW5nLWJvdHRvbToxMnB4O2ZvbnQtZmFtaWx5Oj0NCnN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBTZWdvZSBVSSwgSGVsdmV0aWNhIE5ldWUsIEhlbD0NCnZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7bGluZS1oZWlnaHQ6MS4zO2ZvbnQtc21vb3RoOmFsd2F5czstd2Via2l0LWZvbnQtcz0NCm1vb3RoaW5nOmFudGlhbGlhc2VkO3RleHQtYWxpZ246bGVmdDsiPiBNaXQgZnJldW5kbGljaGVuIEdyPUZDPURGZW4gPC90ZD4NCiAgICAgICAgIDwvdHI+PTIwDQogICAgICAgICA8dHIgc3R5bGU9M0QibWFyZ2luOjA7Ij4NCiAgICAgICAgICA8dGQgY2xhc3M9M0QiYWNjb3VudC1jb250ZW50LXNmIHBhZGRpbmctNSIgc3R5bGU9M0QicGFkZGluZzowO21hcj0NCmdpbjowO2NvbG9yOnJnYig1MSwgNTEsIDUxKTtmb250LXNpemU6MTdweDtwYWRkaW5nLWJvdHRvbToyNnB4O2ZvbnQtZmFtaWx5Oj0NCnN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBTZWdvZSBVSSwgSGVsdmV0aWNhIE5ldWUsIEhlbD0NCnZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7bGluZS1oZWlnaHQ6MS4zO2ZvbnQtc21vb3RoOmFsd2F5czstd2Via2l0LWZvbnQtcz0NCm1vb3RoaW5nOmFudGlhbGlhc2VkO3RleHQtYWxpZ246bGVmdDsiPiBBcHBsZT1BMFN1cHBvcnQgPC90ZD4NCiAgICAgICAgIDwvdHI+PTIwDQogICAgICAgIDwvdGJvZHk+DQogICAgICAgPC90YWJsZT4gPC90ZD4NCiAgICAgPC90cj49MjANCiAgICAgPHRyIHN0eWxlPTNEIm1hcmdpbjowOyI+DQogICAgICA8dGQgc3R5bGU9M0QicGFkZGluZzowO21hcmdpbjowO2NvbG9yOnJnYig1MSwgNTEsIDUxKTt3aWR0aDoxMDAlO2ZvbnQ9DQotc2l6ZToxM3B4O2ZvbnQtZmFtaWx5OnN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBTZWdvZSA9DQpVSSwgSGVsdmV0aWNhIE5ldWUsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7bGluZS1oZWlnaHQ6MThweDstd2Via2l0LWY9DQpvbnQtc21vb3RoaW5nOmFudGlhbGlhc2VkOyIgYWxpZ249M0QiY2VudGVyIj49MjANCiAgICAgICA8dGFibGUgY2xhc3M9M0QiZm9vdGVyLXRhYmxlIiBzdHlsZT0zRCJib3JkZXI6MDttYXJnaW46MDtib3JkZXItc3BhYz0NCmluZzowO3dpZHRoOjEwMCU7Zm9udC1zaXplOmluaGVyaXQ7bGluZS1oZWlnaHQ6MThweDtib3JkZXItY29sbGFwc2U6Y29sbGFwcz0NCmU7dGV4dC1hbGlnbjpjZW50ZXI7Ij49MjANCiAgICAgICAgPHRib2R5IHN0eWxlPTNEIm1hcmdpbjowOyI+DQogICAgICAgICA8dHIgc3R5bGU9M0QibWFyZ2luOjA7Ij4NCiAgICAgICAgICA8dGQgY2xhc3M9M0QiZm9vdGVyLWNlbGwiIHN0eWxlPTNEInBhZGRpbmc6MCAxOHB4IDE4cHggMThweDttYXJnaT0NCm46MDtjb2xvcjpyZ2IoMTAyLCAxMDIsIDEwMik7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6c3lzdGVtLXVpLCAtYXBwbGUtcz0NCnlzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFNlZ29lIFVJLCBIZWx2ZXRpY2EgTmV1ZSwgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucz0NCi1zZXJpZjtsaW5lLWhlaWdodDoxNXB4Oy13ZWJraXQtZm9udC1zbW9vdGhpbmc6YW50aWFsaWFzZWQ7dGV4dC1hbGlnbjpjZW50ZT0NCnI7Ij49MjANCiAgICAgICAgICAgPHRhYmxlIGNsYXNzPTNEImZvb3Rlci10YWJsZSIgc3R5bGU9M0QiYm9yZGVyOjA7bWFyZ2luOjA7Ym9yZGVyLT0NCnNwYWNpbmc6MDt3aWR0aDoxMDAlO2ZvbnQtc2l6ZTppbmhlcml0O2xpbmUtaGVpZ2h0OjE4cHg7Ym9yZGVyLWNvbGxhcHNlOmNvbD0NCmxhcHNlO3RleHQtYWxpZ246Y2VudGVyOyI+PTIwDQogICAgICAgICAgICA8dGJvZHkgc3R5bGU9M0QibWFyZ2luOjA7Ij4NCiAgICAgICAgICAgICA8dHIgc3R5bGU9M0QibWFyZ2luOjA7Ij4NCiAgICAgICAgICAgICAgPHRkIGNsYXNzPTNEImZvb3Rlci1iYWNrZ3JvdW5kIiBzdHlsZT0zRCJwYWRkaW5nOjE1cHggMCA3cHg7Yj0NCmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O21hcmdpbjowO2NvbG9yOnJnYigxMzYsIDEzNiwgMTM2KTt3aWR0aDo2ODVweDtmbz0NCm50LXNpemU6MTFweDtsaW5lLWhlaWdodDoyMnB4O2ZvbnQtZmFtaWx5OnN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYT0NCmNTeXN0ZW1Gb250LCBTZWdvZSBVSSwgSGVsdmV0aWNhIE5ldWUsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7YmFja2dybz0NCnVuZC1wb3NpdGlvbjpjZW50ZXIgdG9wO2JhY2tncm91bmQtaW1hZ2U6dXJsKGh0dHBzOi8vc3RhdGljaS5pY2xvdWQuY29tL2VtYT0NCmlsaW1hZ2VzL3Y0L2NvbW1vbi9mb290ZXJfZ3JhZGllbnRfd2ViLnBuZyk7LXdlYmtpdC1mb250LXNtb290aGluZzphbnRpYWxpYT0NCnNlZDt0ZXh0LWFsaWduOmNlbnRlcjsiPjwvdGQ+DQogICAgICAgICAgICAgPC90cj49MjANCiAgICAgICAgICAgICA8dHIgc3R5bGU9M0QibWFyZ2luOjA7Ij4NCiAgICAgICAgICAgICAgPHRkIGNsYXNzPTNEImZvb3Rlci1jZWxsIHRleHQtcGFkZGluZyIgc3R5bGU9M0QicGFkZGluZzowIDE4cD0NCnggMThweCAxOHB4O21hcmdpbjowO2NvbG9yOnJnYigxMDIsIDEwMiwgMTAyKTtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpzeT0NCnN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgU2Vnb2UgVUksIEhlbHZldGljYSBOZXVlLCBIZWx2ZT0NCnRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmO2xpbmUtaGVpZ2h0OjE1cHg7LXdlYmtpdC1mb250LXNtb290aGluZzphbnRpYWxpYXNlZD0NCjt0ZXh0LWFsaWduOmNlbnRlcjsiPiA8YSBjbGFzcz0zRCJub2JyIiBocmVmPTNEImh0dHBzOi8vYWNjb3VudC5hcHBsZS5jb20vIz0NCiEmcGFnZT0zRHNpZ25pbiIgc3R5bGU9M0QibWFyZ2luOjA7Y29sb3I6cmdiKDAsIDExMiwgMjAxKTt3aGl0ZS1zcGFjZTpub3dyYT0NCnA7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Ij4gQXBwbGU9QTBBY2NvdW50IDwvYT4gfCA8YSBjbGFzcz0zRCJub2JyIiBocmVmPTNEIj0NCmh0dHBzOi8vc3VwcG9ydC5hcHBsZS5jb20vZGUtZGUiIHN0eWxlPTNEIm1hcmdpbjowO2NvbG9yOnJnYigwLCAxMTIsIDIwMSk7dz0NCmhpdGUtc3BhY2U6bm93cmFwO3RleHQtZGVjb3JhdGlvbjpub25lOyI+IFN1cHBvcnQgPC9hPiB8IDxhIGNsYXNzPTNEIm5vYnIiID0NCmhyZWY9M0QiaHR0cHM6Ly93d3cuYXBwbGUuY29tL2xlZ2FsL3ByaXZhY3kvZGUvIiBzdHlsZT0zRCJtYXJnaW46MDtjb2xvcjpyZz0NCmIoMCwgMTEyLCAyMDEpO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LWRlY29yYXRpb246bm9uZTsiPiBEYXRlbnNjaHV0eiA8L2E+ID0NCjxiciBzdHlsZT0zRCJtYXJnaW46MDsiPiA8c3BhbiBjbGFzcz0zRCJub2JyIiBzdHlsZT0zRCJtYXJnaW46MDt3aGl0ZS1zcGFjZT0NCjpub3dyYXA7Ij5Db3B5cmlnaHQgPUE5IDIwMjU8L3NwYW4+IEFwcGxlIERpc3RyaWJ1dGlvbiBJbnRlcm5hdGlvbmFsIEx0ZC4gPD0NCmEgY2xhc3M9M0QiYXBwbGUtYWRkcmVzcyIgaHJlZj0zRCIjYWRkcmVzcyIgc3R5bGU9M0QibWFyZ2luOjA7Y29sb3I6cmdiKDEwMj0NCiwgMTAyLCAxMDIpO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LWRlY29yYXRpb246bm9uZTsiPkhvbGx5aGlsbCBJbmR1c3RyaWFsID0NCkVzdGF0ZSwgSG9sbHloaWxsLCBDb3JrLCBJcmVsYW5kLjwvYT4gPHNwYW4gY2xhc3M9M0Qibm9iciIgc3R5bGU9M0QibWFyZ2luOj0NCjA7d2hpdGUtc3BhY2U6bm93cmFwOyI+QWxsZSBSZWNodGUgdm9yYmVoYWx0ZW4uPC9zcGFuPiA8L3RkPg0KICAgICAgICAgICAgIDwvdHI+PTIwDQogICAgICAgICAgICA8L3Rib2R5Pg0KICAgICAgICAgICA8L3RhYmxlPiA8L3RkPg0KICAgICAgICAgPC90cj49MjANCiAgICAgICAgPC90Ym9keT4NCiAgICAgICA8L3RhYmxlPiA8L3RkPg0KICAgICA8L3RyPj0yMA0KICAgIDwvdGJvZHk+DQogICA8L3RhYmxlPiA9MjANCiAgPC9kaXY+ID0yMA0KIDwvYm9keT4NCjwvaHRtbD4=", + "disposition" : "inline", + "encoding" : "QUOTED-PRINTABLE", + "section" : { + "numbers" : [ + 2 + ] + } + } + ] +} \ No newline at end of file