From 7ee8a01da1b06a6bc15acf66512041e2a388ce58 Mon Sep 17 00:00:00 2001 From: Jan Kobersky Date: Wed, 20 Nov 2024 11:22:27 +0100 Subject: [PATCH] Added more tests --- .../Common/WMTProvisioningUtils.swift | 67 ++++++++++--------- .../ProvisioningUtilsTests.swift | 34 +++++++--- 2 files changed, 60 insertions(+), 41 deletions(-) diff --git a/WultraMobileTokenSDK/Common/WMTProvisioningUtils.swift b/WultraMobileTokenSDK/Common/WMTProvisioningUtils.swift index 5650743..57b6222 100644 --- a/WultraMobileTokenSDK/Common/WMTProvisioningUtils.swift +++ b/WultraMobileTokenSDK/Common/WMTProvisioningUtils.swift @@ -18,16 +18,6 @@ import Foundation class WMTProvisioningUtils { - static func parseProvisioningProfile(_ profile: Data) -> WMTProvision? { - do { - let provision = try PropertyListDecoder().decode(WMTProvision.self, from: profile) - return provision - } catch let e { - D.error("Failed to parse provisioning profile: \(e)") - return nil - } - } - static func getMainProvisioningProfile() -> WMTProvision? { guard let filePath = Bundle.main.path(forResource: "embedded", ofType: "mobileprovision") else { D.debug("Missing embedded provisioning profile in the main bundle.") @@ -36,33 +26,46 @@ class WMTProvisioningUtils { let url = URL(fileURLWithPath: filePath) do { let data = try Data(contentsOf: url) - guard let string = String(data: data, encoding: .isoLatin1) else { - D.error("Failed to decode provisioning profile data in ISO Latin 1.") - return nil - } - let scanner = Scanner(string: string as String) - guard scanner.scanUpTo("", into: &extractedPlist) != false else { - D.error("Search for provisioning profile plist end tag failed.") - return nil - } - - guard let plist = extractedPlist?.appending("").data(using: .isoLatin1) else { - D.error("Failed to convert provisioning profile plist to data.") - return nil - } - - return parseProvisioningProfile(plist) + return getProvisioningProfileFromData(data) } catch let e { D.error("Failed to load provisioning profile: \(e)") return nil } } + + static func getProvisioningProfileFromData(_ profile: Data) -> WMTProvision? { + guard let string = String(data: profile, encoding: .isoLatin1) else { + D.error("Failed to decode provisioning profile data in ISO Latin 1.") + return nil + } + let scanner = Scanner(string: string as String) + guard scanner.scanUpTo("", into: &extractedPlist) != false else { + D.error("Search for provisioning profile plist end tag failed.") + return nil + } + + guard let plist = extractedPlist?.appending("").data(using: .isoLatin1) else { + D.error("Failed to convert provisioning profile plist to data.") + return nil + } + return parseProvisioningProfilePlist(plist) + } + + static func parseProvisioningProfilePlist(_ plist: Data) -> WMTProvision? { + do { + let provision = try PropertyListDecoder().decode(WMTProvision.self, from: plist) + return provision + } catch let e { + D.error("Failed to parse provisioning profile: \(e)") + return nil + } + } } /// Provisioning profile plist structure. Note that we need only entitlements for now. diff --git a/WultraMobileTokenSDKTests/ProvisioningUtilsTests.swift b/WultraMobileTokenSDKTests/ProvisioningUtilsTests.swift index 49fae50..9646cec 100644 --- a/WultraMobileTokenSDKTests/ProvisioningUtilsTests.swift +++ b/WultraMobileTokenSDKTests/ProvisioningUtilsTests.swift @@ -19,31 +19,44 @@ import XCTest class ProvisioningUtilsTests: XCTestCase { + // provisioning profile parsing + + func testParseProvisioningProfile() { + guard let data = Data(base64Encoded: base64ProductionProfile) else { + XCTFail("Could not decode base64 profile") + return + } + let profile = WMTProvisioningUtils.getProvisioningProfileFromData(data) + XCTAssertEqual(profile?.apnsEnvironment, .production) + } + + // plist parsing + func testParseDevelopmentAPNS() { - let plist = getProfile("development") - let profile = WMTProvisioningUtils.parseProvisioningProfile(plist) + let plist = getPlist("development") + let profile = WMTProvisioningUtils.parseProvisioningProfilePlist(plist) XCTAssertEqual(profile?.apnsEnvironment, .development) } func testParseProductionAPNS() { - let plist = getProfile("production") - let profile = WMTProvisioningUtils.parseProvisioningProfile(plist) + let plist = getPlist("production") + let profile = WMTProvisioningUtils.parseProvisioningProfilePlist(plist) XCTAssertEqual(profile?.apnsEnvironment, .production) } func testParseMissingAPNS() { - let plist = getProfile(nil) - let profile = WMTProvisioningUtils.parseProvisioningProfile(plist) + let plist = getPlist(nil) + let profile = WMTProvisioningUtils.parseProvisioningProfilePlist(plist) XCTAssertEqual(profile?.apnsEnvironment, nil) } func testParseUnknownAPNS() { - let plist = getProfile("integration") // unknown value - let profile = WMTProvisioningUtils.parseProvisioningProfile(plist) + let plist = getPlist("integration") // unknown value + let profile = WMTProvisioningUtils.parseProvisioningProfilePlist(plist) XCTAssertEqual(profile?.apnsEnvironment, nil) } - private func getProfile(_ apnsEnvironment: String?) -> Data { + private func getPlist(_ apnsEnvironment: String?) -> Data { let entry = if let apnsEnvironment { "aps-environment\(apnsEnvironment)" } else { @@ -51,4 +64,7 @@ class ProvisioningUtilsTests: XCTestCase { } return " AppIDName for testing purposes ApplicationIdentifierPrefix ASDASDASD CreationDate 2024-01-08T10:59:17Z Platform iOS xrOS visionOS IsXcodeManaged DeveloperCertificates pqi3u4hrjkanfkjanldfjkansd;fiohLmFwcC5Nb2JpbGVUb2tlbi5kZXYwggEIDBVEZXZlbG9wZXJDZXJ0aWZpY2F0ZXMwge4EILJ8BwOI38tdzUcaq6hIvRRO6D2QmN9HDEf7QPB+6axsBCBvpLxOYiaJykpTpjoFwyvfZclkQGG4S2Cw0HC8qrenSwQgkdZR2h310zeFWcJiJua9POg+E1qI0DXyAH5rGHXbnQsEIMr0/eY+Qqyujx1sNvG12cizX5KaudM3CjtzvsVqIKnkBCDccTpELoQR0s/FEqUpCem1yCEqtgKE8kD3kOAdggSYJQQgxcz/0oI5Y8l0uI7f5zgaT1wi3WomccHWmtoOq3HPyjIEIElhcDeOADtptU1rQvX21BVbyIKYOwwEGDa1bJ+QeATEMIIBiwwMRW50aXRsZW1lbnRzcIIBeQIBAbCCAXIwQwwWYXBwbGljYXRpb24taWRlbnRpZmllcgwpS1RUOUc4NTlNUi5jb20ud3VsdHJhLmFwcC5Nb2JpbGVUb2tlbi5kZXYwHgwPYXBzLWVudmlyb25tZW50DAtkZXZlbG9wbWVudDAxDCNjb20uYXBwbGUuZGV2ZWxvcGVyLnRlYW0taWRlbnRpZmllcgwKS1RUOUc4NTlNUjCBhwwlY29tLmFwcGxlLnNlY3VyaXR5LmFwcGxpY2F0aW9uLWdyb3VwczBeDBpncm91cC5jb20ud3VsdHJhLnRlc3RHcm91cAxAZ3JvdXAuQ1ktMEZDMzEwNUMtRUY2RC0xMUU5LTgyM0ItMzMxMzc0MDhCQzk2LmNvbS5jeWRpYS5FeHRlbmRlcjATDA5nZXQtdGFzay1hbGxvdwEB/zA5DBZrZXljaGFpbi1hY2Nlc3MtZ3JvdXBzMB8MDEtUVDlHODU5TVIuKgwPY29tLmFwcGxlLnRva2VuMIIGpQwSUHJvdmlzaW9uZWREZXZpY2VzMIIGjQwZMDAwMDgxMDEtMDAwNTI4RDkzQTEyMDAxRQwZMDAwMjelknfkjaerl;f DER-Encoded-Profile UftjJiXcnphFtPME8RWgD9WFgMpfUPLE0HRxN12peXl28xXO0rVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFLuw3qFYM4iapIqZ3r6966/ayySrMEYGCCsGAQUFBwEBBDowODA2BggrBgEFBQcwAYYqaHR0cDovL29jc3AuYXBwbGUuY29tL29jc3AwMy1hcHBsZXJvb3RjYWczMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly9jcmwuYXBwbGUuY29tL2FwcGxlcm9vdGNhZzMuY3JsMB0GA1UdDgQWBBR6R7o4ihUkSCJGzb6PGiR7NAMqaTAOBgNVHQ8BAf8EBAMCQcm9kdWN0cyBhbmQvb3IgQXBwbGUgcHJvY2Vzc2VzLjAdBgNVHQ4EFgQUDgWBWc9LzVC4LP5b4EGBqz8zz+8wDgYDVR0PAQH/BAQDAgeAMA8GCSqGSIb3Y2QMEwQCBQAwCgYIKoZIzj0EAwIDRwAwRAIgSl19xJZLrQqOZYa8t493EpwrI7/L2J8LhbwYpW7gO80CIGiD58K1x1h1Cp43EHeyVRIYiVBThZVwbxWxLF7W8pwuMYIB1zCCAdMCAQEwfjByMSYwJAYDVQQDDB1BcHBsZSBTeXN0ZW0gSW50ZWdyYXRpb24gQ0EgNDEmMCQGA1UECwwdQXBwbGUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxEzARBgNVBAoMCkFwcGxlIEluYy4xCzAJBgNVBAYTAlVTAggQZ+4OarG1YjANBglghkgBZQMEAgEFAKCB6TAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0yNDAxMDgxMDU5MTdaMCoGCSqGSIb3DQEJNDEdMBswDQYJYIZIAWUDBAIBBQChCgYIKoZIzj0EAwIwLwYJKoZIhvcNAQkEMSIEIMRi+YCgI1wI14ztb05ZvyGPMqw3KEKsLMcwLVtJ6yC7MFIGCSqGSIb3DQEJDzFFMEMwCgYIKoZIhvcNAwcwDgYIKoZIhvcNAwICAgCAMA0GCCqGSIb3DQMCAgFAMAcGBSsOAwIHMA0GCCqGSIb3DQMCAgEoMAoGCCqGSM49BAMCBEcwRQIhAMc5IyUcaFaKFEyjmo7hMiMGYYg6m+iJnLY6M4vc88yhAiB94O5nW+8T9zaGzCOB2Ey8VWEKTioOPyOSc8GZVntlHQ== Entitlements \(entry) com.apple.security.application-groups group.com.wultra.testGroup application-identifier ASDASDASD.com.wultra.test keychain-access-groups ASDASDASD.* com.apple.token get-task-allow com.apple.developer.team-identifier ASDASDASD ExpirationDate 2025-01-07T10:59:17Z Name iOS Team Provisioning Profile: com.wultra.test ProvisionedDevices 00008101-000528D93A12001E 00008101-001C34EC2250801E 00008030-000975CC0AEA802E 00008101-001269DE0A50001E TeamIdentifier ASDASDASD TeamName Wultra TimeToLive 365 UUID 7749747f-897e-45f3-b78e-d327a1c9f38a Version 1 ".data(using: .utf8)! } + + // real base64 encoded embedded.mobileprovisioning from the testflight app with a profuction apns + private let base64ProductionProfile = "MIIxVAYJKoZIhvcNAQcCoIIxRTCCMUECAQExCzAJBgUrDgMCGgUAMIIhYQYJKoZIhvcNAQcBoIIhUgSCIU48P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pgo8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZS8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KPHBsaXN0IHZlcnNpb249IjEuMCI+CjxkaWN0PgoJPGtleT5BcHBJRE5hbWU8L2tleT4KCTxzdHJpbmc+WEMgY29tIHd1bHRyYSBhcHAgTW9iaWxlVG9rZW48L3N0cmluZz4KCTxrZXk+QXBwbGljYXRpb25JZGVudGlmaWVyUHJlZml4PC9rZXk+Cgk8YXJyYXk+Cgk8c3RyaW5nPktUVDlHODU5TVI8L3N0cmluZz4KCTwvYXJyYXk+Cgk8a2V5PkNyZWF0aW9uRGF0ZTwva2V5PgoJPGRhdGU+MjAyNC0xMC0yNFQxNzoyNTo0Nlo8L2RhdGU+Cgk8a2V5PlBsYXRmb3JtPC9rZXk+Cgk8YXJyYXk+CgkJPHN0cmluZz5pT1M8L3N0cmluZz4KCQk8c3RyaW5nPnhyT1M8L3N0cmluZz4KCQk8c3RyaW5nPnZpc2lvbk9TPC9zdHJpbmc+Cgk8L2FycmF5PgoJPGtleT5Jc1hjb2RlTWFuYWdlZDwva2V5PgoJPGZhbHNlLz4KCTxrZXk+RGV2ZWxvcGVyQ2VydGlmaWNhdGVzPC9rZXk+Cgk8YXJyYXk+CgkJPGRhdGE+TUlJRnlUQ0NCTEdnQXdJQkFnSVFCaDh3VkxVakRyQVIrcWJHcGJpWENUQU5CZ2txaGtpRzl3MEJBUXNGQURCMU1VUXdRZ1lEVlFRREREdEJjSEJzWlNCWGIzSnNaSGRwWkdVZ1JHVjJaV3h2Y0dWeUlGSmxiR0YwYVc5dWN5QkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRFTE1Ba0dBMVVFQ3d3Q1J6TXhFekFSQmdOVkJBb01Da0Z3Y0d4bElFbHVZeTR4Q3pBSkJnTlZCQVlUQWxWVE1CNFhEVEkwTVRBeU5ERTNNVEF6TUZvWERUSTFNVEF5TkRFM01UQXlPVm93Z1k4eEdqQVlCZ29Ka2lhSmsvSXNaQUVCREFwTFZGUTVSemcxT1UxU01UY3dOUVlEVlFRRERDNUJjSEJzWlNCRWFYTjBjbWxpZFhScGIyNDZJRmQxYkhSeVlTQnpMbkl1Ynk0Z0tFdFVWRGxIT0RVNVRWSXBNUk13RVFZRFZRUUxEQXBMVkZRNVJ6ZzFPVTFTTVJZd0ZBWURWUVFLREExWGRXeDBjbUVnY3k1eUxtOHVNUXN3Q1FZRFZRUUdFd0pEV2pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTzBxY21uRGt6R0R4dExOUmREcWJmNkVnVjF5SWFXZDlxRWtETWhuSkFPMDlzUGh5eVM2dHNnaVB6ZExocUJGZmxBcXNad2Fnd0p5M1piMkFHbEpVZmM0b1VrV0MrLzQyQmlKM3QybzJ2L0ttcnBVZlkxcU9sZjdlTFZ5cVdYRVVJWGZtKzI4dkMyR2ZJeWZKSzdsWU1kMlpxY1pScnZqb1h1TzVKS3NmckNUTzZvQWZHSkJINy9pbDFXcitHZi9vbXkzOTRKdzIzb1g0dTNqOExPR254akRpemlDTHArMTlNNWhIeEVPWjJBZzFqbDR2SVFJZGRIbzAxaUhpWkJUNjNENjFJcmNNejViM0FDRjVrR2RzbS9HU2VMdzkvSXI5YlF0cUQrUkFHTFo3KzN5ODN0OERSRE1rQXhwWUc1VE9jRlpJZWhObVB5VkQxQlF0L2lUTEtzQ0F3RUFBYU9DQWpnd2dnSTBNQXdHQTFVZEV3RUIvd1FDTUFBd0h3WURWUjBqQkJnd0ZvQVVDZjdBRlpENXIyUUtraEs1SmloakRKZnNwN0l3Y0FZSUt3WUJCUVVIQVFFRVpEQmlNQzBHQ0NzR0FRVUZCekFDaGlGb2RIUndPaTh2WTJWeWRITXVZWEJ3YkdVdVkyOXRMM2QzWkhKbk15NWtaWEl3TVFZSUt3WUJCUVVITUFHR0pXaDBkSEE2THk5dlkzTndMbUZ3Y0d4bExtTnZiUzl2WTNOd01ETXRkM2RrY21jek1EVXdnZ0VlQmdOVkhTQUVnZ0VWTUlJQkVUQ0NBUTBHQ1NxR1NJYjNZMlFGQVRDQi96Q0J3d1lJS3dZQkJRVUhBZ0l3Z2JZTWdiTlNaV3hwWVc1alpTQnZiaUIwYUdseklHTmxjblJwWm1sallYUmxJR0o1SUdGdWVTQndZWEowZVNCaGMzTjFiV1Z6SUdGalkyVndkR0Z1WTJVZ2IyWWdkR2hsSUhSb1pXNGdZWEJ3YkdsallXSnNaU0J6ZEdGdVpHRnlaQ0IwWlhKdGN5QmhibVFnWTI5dVpHbDBhVzl1Y3lCdlppQjFjMlVzSUdObGNuUnBabWxqWVhSbElIQnZiR2xqZVNCaGJtUWdZMlZ5ZEdsbWFXTmhkR2x2YmlCd2NtRmpkR2xqWlNCemRHRjBaVzFsYm5SekxqQTNCZ2dyQmdFRkJRY0NBUllyYUhSMGNITTZMeTkzZDNjdVlYQndiR1V1WTI5dEwyTmxjblJwWm1sallYUmxZWFYwYUc5eWFYUjVMekFXQmdOVkhTVUJBZjhFRERBS0JnZ3JCZ0VGQlFjREF6QWRCZ05WSFE0RUZnUVV5OC9ZOVZLbVpGNjBtTm9hK2NvQ3dDM3JtQjh3RGdZRFZSMFBBUUgvQkFRREFnZUFNQk1HQ2lxR1NJYjNZMlFHQVFjQkFmOEVBZ1VBTUJNR0NpcUdTSWIzWTJRR0FRUUJBZjhFQWdVQU1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQVVaZmthZlFnOFFrMXpYd3NaUk9sWEVidG5rTXkxWUlHUlRxd3NSd3dlVUc0akNKeXRXQ2lWQTRoOG8wWHIzU3lsQjJBOHFMNFZxVHdSckg4NXlwcEJmN2xHRFEwc0E1V0YwTnZxbndVSTlvd1ZQdjg1WkVORmo1OVgyUEJjVDE0S0VIRjNOY1ZHdWl3SmIvL24zNnk0bFVxNFRoS0pBZmQvYVpyUlVuRjlNSTAvWm0vSVVqbTBaNUpxR1RHdUh6bXVtYVk5bFQ2enVlYkZycVVNbE1QQWd2eW9MZjFHaGlOZXA4RU1VK045TGxDcE1KZ3FTUm43eSs2M1VOOFk4OTdqRzVHcDdmUUw3V3BUdjAyWVg5dFp5WFFwSi9rUEpyNmZTYkYyUU10NFl0ZldWQ3NkV3lrU0hRZUxYU21lNTMrOWt0RWZVZHpJUlRmK2hBc3ZCVzFxPC9kYXRhPgoJPC9hcnJheT4KCgk8a2V5PkRFUi1FbmNvZGVkLVByb2ZpbGU8L2tleT4KCTxkYXRhPk1JSU4wd1lKS29aSWh2Y05BUWNDb0lJTnhEQ0NEY0FDQVFFeER6QU5CZ2xnaGtnQlpRTUVBZ0VGQURDQ0E0MEdDU3FHU0liM0RRRUhBYUNDQTM0RWdnTjZNWUlEZGpBTURBZFdaWEp6YVc5dUFnRUJNQkFNQ2xScGJXVlViMHhwZG1VQ0FnRnNNQk1NRGtseldHTnZaR1ZOWVc1aFoyVmtBUUVBTUJjTUJFNWhiV1VNRDFkMWJIUnlZU0JMWlhrZ1VISnZaREFaREFoVVpXRnRUbUZ0WlF3TlYzVnNkSEpoSUhNdWNpNXZMakFkREF4RGNtVmhkR2x2YmtSaGRHVVhEVEkwTVRBeU5ERTNNalUwTmxvd0hnd09WR1ZoYlVsa1pXNTBhV1pwWlhJd0RBd0tTMVJVT1VjNE5UbE5VakFmREE1RmVIQnBjbUYwYVc5dVJHRjBaUmNOTWpVeE1ESTBNVGN4TURJNVdqQWdEQmRRY205bWFXeGxSR2x6ZEhKcFluVjBhVzl1Vkhsd1pRd0ZVMVJQVWtVd0lRd0lVR3hoZEdadmNtMHdGUXdEYVU5VERBUjRjazlUREFoMmFYTnBiMjVQVXpBcURBbEJjSEJKUkU1aGJXVU1IVmhESUdOdmJTQjNkV3gwY21FZ1lYQndJRTF2WW1sc1pWUnZhMlZ1TUNzTUcwRndjR3hwWTJGMGFXOXVTV1JsYm5ScFptbGxjbEJ5WldacGVEQU1EQXBMVkZRNVJ6ZzFPVTFTTUN3TUJGVlZTVVFNSkRCbU5UQTVOakUyTFRNeE16VXRORE01TUMwNFptUTBMVE13TmpNek1URXpaR1k0TWpBN0RCVkVaWFpsYkc5d1pYSkRaWEowYVdacFkyRjBaWE13SWdRZ0R4bzdseTBUdUQ1U3FKalpXbHNLRTFjVkRzR0kwdGR2VERMT2xkWWRsQ3N3Z2dHZ0RBeEZiblJwZEd4bGJXVnVkSE53Z2dHT0FnRUJzSUlCaHpBL0RCWmhjSEJzYVdOaGRHbHZiaTFwWkdWdWRHbG1hV1Z5RENWTFZGUTVSemcxT1UxU0xtTnZiUzUzZFd4MGNtRXVZWEJ3TGsxdlltbHNaVlJ2YTJWdU1CME1EMkZ3Y3kxbGJuWnBjbTl1YldWdWRBd0tjSEp2WkhWamRHbHZiakFZREJOaVpYUmhMWEpsY0c5eWRITXRZV04wYVhabEFRSC9NREVNSTJOdmJTNWhjSEJzWlM1a1pYWmxiRzl3WlhJdWRHVmhiUzFwWkdWdWRHbG1hV1Z5REFwTFZGUTVSemcxT1UxU01JR0hEQ1ZqYjIwdVlYQndiR1V1YzJWamRYSnBkSGt1WVhCd2JHbGpZWFJwYjI0dFozSnZkWEJ6TUY0TUdtZHliM1Z3TG1OdmJTNTNkV3gwY21FdWRHVnpkRWR5YjNWd0RFQm5jbTkxY0M1RFdTMHdSa016TVRBMVF5MUZSalpFTFRFeFJUa3RPREl6UWkwek16RXpOelF3T0VKRE9UWXVZMjl0TG1ONVpHbGhMa1Y0ZEdWdVpHVnlNQk1NRG1kbGRDMTBZWE5yTFdGc2JHOTNBUUVBTURrTUZtdGxlV05vWVdsdUxXRmpZMlZ6Y3kxbmNtOTFjSE13SHd3TVMxUlVPVWM0TlRsTlVpNHFEQTlqYjIwdVlYQndiR1V1ZEc5clpXNmdnZ2c4TUlJQ1F6Q0NBY21nQXdJQkFnSUlMY1g4aU5MRlM1VXdDZ1lJS29aSXpqMEVBd013WnpFYk1Ca0dBMVVFQXd3U1FYQndiR1VnVW05dmRDQkRRU0F0SUVjek1TWXdKQVlEVlFRTERCMUJjSEJzWlNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEVUTUJFR0ExVUVDZ3dLUVhCd2JHVWdTVzVqTGpFTE1Ba0dBMVVFQmhNQ1ZWTXdIaGNOTVRRd05ETXdNVGd4T1RBMldoY05Nemt3TkRNd01UZ3hPVEEyV2pCbk1Sc3dHUVlEVlFRRERCSkJjSEJzWlNCU2IyOTBJRU5CSUMwZ1J6TXhKakFrQmdOVkJBc01IVUZ3Y0d4bElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TVJNd0VRWURWUVFLREFwQmNIQnNaU0JKYm1NdU1Rc3dDUVlEVlFRR0V3SlZVekIyTUJBR0J5cUdTTTQ5QWdFR0JTdUJCQUFpQTJJQUJKanBMejFBY3FUdGt5SnlnUk1jM1JDVjhjV2pUbkhjRkJiWkR1V21CU3AzWkh0ZlRqalR1eHhFdFgvMUg3WXlZbDNKNllSYlR6QlBFVm9BL1ZoWURLWDFEeXhOQjBjVGRkcVhsNWR2TVZ6dEs1MTdJRHZZdVZUWlhwbWtPbEVLTWFOQ01FQXdIUVlEVlIwT0JCWUVGTHV3M3FGWU00aWFwSXFaM3I2OTY2L2F5eVNyTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQW9HQ0NxR1NNNDlCQU1EQTJnQU1HVUNNUUNENmNIRUZsNGFYVFFZMmUzdjlHd09BRVpMdU4reVJoSEZELzNtZW95aHBtdk93Z1BVblBXVHhuUzRhdCtxSXhVQ01HMW1paERLMUEzVVQ4Mk5RejYwaW1PbE0yN2piZG9YdDJRZnlGTW0rWWhpZERrTEYxdkxVYWdNNkJnRDU2S3lLRENDQXVZd2dnSnRvQU1DQVFJQ0NETU43dmkvVEdndU1Bb0dDQ3FHU000OUJBTURNR2N4R3pBWkJnTlZCQU1NRWtGd2NHeGxJRkp2YjNRZ1EwRWdMU0JITXpFbU1DUUdBMVVFQ3d3ZFFYQndiR1VnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3hFekFSQmdOVkJBb01Da0Z3Y0d4bElFbHVZeTR4Q3pBSkJnTlZCQVlUQWxWVE1CNFhEVEUzTURJeU1qSXlNak15TWxvWERUTXlNREl4T0RBd01EQXdNRm93Y2pFbU1DUUdBMVVFQXd3ZFFYQndiR1VnVTNsemRHVnRJRWx1ZEdWbmNtRjBhVzl1SUVOQklEUXhKakFrQmdOVkJBc01IVUZ3Y0d4bElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TVJNd0VRWURWUVFLREFwQmNIQnNaU0JKYm1NdU1Rc3dDUVlEVlFRR0V3SlZVekJaTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEEwSUFCQVpycEZadmZaOG4wYzQyanBJYlZzMVVObVJLeVpSb21mckpJSDdpOVZnUDNPSnE2eGxITHk3dk82UUJ0QUVUUkh4YUpxMmduQ2tsaXVYbUJtOVBmRnFqZ2Zjd2dmUXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWZCZ05WSFNNRUdEQVdnQlM3c042aFdET0ltcVNLbWQ2K3ZldXYyc3NrcXpCR0JnZ3JCZ0VGQlFjQkFRUTZNRGd3TmdZSUt3WUJCUVVITUFHR0ttaDBkSEE2THk5dlkzTndMbUZ3Y0d4bExtTnZiUzl2WTNOd01ETXRZWEJ3YkdWeWIyOTBZMkZuTXpBM0JnTlZIUjhFTURBdU1DeWdLcUFvaGlab2RIUndPaTh2WTNKc0xtRndjR3hsTG1OdmJTOWhjSEJzWlhKdmIzUmpZV2N6TG1OeWJEQWRCZ05WSFE0RUZnUVVla2U2T0lvVkpFZ2lSczIranhva2V6UURLbWt3RGdZRFZSMFBBUUgvQkFRREFnRUdNQkFHQ2lxR1NJYjNZMlFHQWhFRUFnVUFNQW9HQ0NxR1NNNDlCQU1EQTJjQU1HUUNNQlVNcVk3R3I1WnBhNmVmM1Z6VUExbHNybExVWU1hTGR1QzN4YUx4Q1h6Z211TnJzZU44TWNRbmVxZU9pZjJyZHdJd1lUTWc4U24vK1ljeXJpbklaRDEyZTFHazBnSXZkcjVnSXBIeDFUcDEzTFRpeGlxVy9zWUozRXBQMVNUdy9NcXlNSUlEQnpDQ0FxMmdBd0lCQWdJSVhLMG1KQk1ZQmI4d0NnWUlLb1pJemowRUF3SXdjakVtTUNRR0ExVUVBd3dkUVhCd2JHVWdVM2x6ZEdWdElFbHVkR1ZuY21GMGFXOXVJRU5CSURReEpqQWtCZ05WQkFzTUhVRndjR3hsSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNUk13RVFZRFZRUUtEQXBCY0hCc1pTQkpibU11TVFzd0NRWURWUVFHRXdKVlV6QWVGdzB5TkRBeE1qa3hOalEzTURSYUZ3MHlPREF5TWpjeE5qUTNNRE5hTUU0eEtqQW9CZ05WQkFNTUlWZFhSRklnVUhKdmRtbHphVzl1YVc1bklGQnliMlpwYkdVZ1UybG5ibWx1WnpFVE1CRUdBMVVFQ2d3S1FYQndiR1VnU1c1akxqRUxNQWtHQTFVRUJoTUNWVk13V1RBVEJnY3Foa2pPUFFJQkJnZ3Foa2pPUFFNQkJ3TkNBQVRFRGhQRHo2N3hFQzkrOVZUYlZHdUVCeC9qNWljUXFIVldpbFQ1QWE1L0k4VVNnSEFMNzJ1TUw3T3BEbjBCV2d0S05ZQWFHQWhibG5zcVpRZno0dDVFbzRJQlR6Q0NBVXN3REFZRFZSMFRBUUgvQkFJd0FEQWZCZ05WSFNNRUdEQVdnQlI2UjdvNGloVWtTQ0pHemI2UEdpUjdOQU1xYVRCQkJnZ3JCZ0VGQlFjQkFRUTFNRE13TVFZSUt3WUJCUVVITUFHR0pXaDBkSEE2THk5dlkzTndMbUZ3Y0d4bExtTnZiUzl2WTNOd01ETXRZWE5wWTJFME1ETXdnWllHQTFVZElBU0JqakNCaXpDQmlBWUpLb1pJaHZkalpBVUJNSHN3ZVFZSUt3WUJCUVVIQWdJd2JReHJWR2hwY3lCalpYSjBhV1pwWTJGMFpTQnBjeUIwYnlCaVpTQjFjMlZrSUdWNFkyeDFjMmwyWld4NUlHWnZjaUJtZFc1amRHbHZibk1nYVc1MFpYSnVZV3dnZEc4Z1FYQndiR1VnVUhKdlpIVmpkSE1nWVc1a0wyOXlJRUZ3Y0d4bElIQnliMk5sYzNObGN5NHdIUVlEVlIwT0JCWUVGR3YvWFFPVHV2SEY0cmowQ2piTTFFQ0w4WHdlTUE0R0ExVWREd0VCL3dRRUF3SUhnREFQQmdrcWhraUc5Mk5rREJNRUFnVUFNQW9HQ0NxR1NNNDlCQU1DQTBnQU1FVUNJSGV6YjVqVmx3Uk1kV2N6TzlKQUoxSXJ0U041ZlRIN2ZIMVhXV3VlT2RMWkFpRUE3eFI4aExtQ1JTVnJIaUZoZCtkMnpEd3dJNWYyb2djRFFEck9FdkdkRFMweGdnSFhNSUlCMHdJQkFUQitNSEl4SmpBa0JnTlZCQU1NSFVGd2NHeGxJRk41YzNSbGJTQkpiblJsWjNKaGRHbHZiaUJEUVNBME1TWXdKQVlEVlFRTERCMUJjSEJzWlNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEVUTUJFR0ExVUVDZ3dLUVhCd2JHVWdTVzVqTGpFTE1Ba0dBMVVFQmhNQ1ZWTUNDRnl0SmlRVEdBVy9NQTBHQ1dDR1NBRmxBd1FDQVFVQW9JSHBNQmdHQ1NxR1NJYjNEUUVKQXpFTEJna3Foa2lHOXcwQkJ3RXdIQVlKS29aSWh2Y05BUWtGTVE4WERUSTBNVEF5TkRFM01qVTBObG93S2dZSktvWklodmNOQVFrME1SMHdHekFOQmdsZ2hrZ0JaUU1FQWdFRkFLRUtCZ2dxaGtqT1BRUURBakF2QmdrcWhraUc5dzBCQ1FReElnUWcxeC96UHA4OCt3dnpKY3dQYUc2diszR3ltcDlkMXdPUUpDSjBUL3VrWDFNd1VnWUpLb1pJaHZjTkFRa1BNVVV3UXpBS0JnZ3Foa2lHOXcwREJ6QU9CZ2dxaGtpRzl3MERBZ0lDQUlBd0RRWUlLb1pJaHZjTkF3SUNBVUF3QndZRkt3NERBZ2N3RFFZSUtvWklodmNOQXdJQ0FTZ3dDZ1lJS29aSXpqMEVBd0lFUnpCRkFpRUFwZlp5andXUENyUXB5NENQYU8rWXh0N0NPamJnNzZrMDNlVXArbEpVWTM4Q0lIbVBXd1dhVGxCbS8ramk5YjZDWXZvZTBabkdNY2EwdHNYZG9TYksyM1kvPC9kYXRhPgoJCQkJCQkJCQkJCQkKCTxrZXk+RW50aXRsZW1lbnRzPC9rZXk+Cgk8ZGljdD4KCQk8a2V5PmJldGEtcmVwb3J0cy1hY3RpdmU8L2tleT4KCQk8dHJ1ZS8+CgkJCQkKCQkJCTxrZXk+YXBzLWVudmlyb25tZW50PC9rZXk+CgkJPHN0cmluZz5wcm9kdWN0aW9uPC9zdHJpbmc+CgkJCQkKCQkJCTxrZXk+Y29tLmFwcGxlLnNlY3VyaXR5LmFwcGxpY2F0aW9uLWdyb3Vwczwva2V5PgoJCTxhcnJheT4KCQkJCTxzdHJpbmc+Z3JvdXAuY29tLnd1bHRyYS50ZXN0R3JvdXA8L3N0cmluZz4KCQkJCTxzdHJpbmc+Z3JvdXAuQ1ktMEZDMzEwNUMtRUY2RC0xMUU5LTgyM0ItMzMxMzc0MDhCQzk2LmNvbS5jeWRpYS5FeHRlbmRlcjwvc3RyaW5nPgoJCTwvYXJyYXk+CgkJCQkKCQkJCTxrZXk+YXBwbGljYXRpb24taWRlbnRpZmllcjwva2V5PgoJCTxzdHJpbmc+S1RUOUc4NTlNUi5jb20ud3VsdHJhLmFwcC5Nb2JpbGVUb2tlbjwvc3RyaW5nPgoJCQkJCgkJCQk8a2V5PmtleWNoYWluLWFjY2Vzcy1ncm91cHM8L2tleT4KCQk8YXJyYXk+CgkJCQk8c3RyaW5nPktUVDlHODU5TVIuKjwvc3RyaW5nPgoJCQkJPHN0cmluZz5jb20uYXBwbGUudG9rZW48L3N0cmluZz4KCQk8L2FycmF5PgoJCQkJCgkJCQk8a2V5PmdldC10YXNrLWFsbG93PC9rZXk+CgkJPGZhbHNlLz4KCQkJCQoJCQkJPGtleT5jb20uYXBwbGUuZGV2ZWxvcGVyLnRlYW0taWRlbnRpZmllcjwva2V5PgoJCTxzdHJpbmc+S1RUOUc4NTlNUjwvc3RyaW5nPgoKCTwvZGljdD4KCTxrZXk+RXhwaXJhdGlvbkRhdGU8L2tleT4KCTxkYXRlPjIwMjUtMTAtMjRUMTc6MTA6MjlaPC9kYXRlPgoJPGtleT5OYW1lPC9rZXk+Cgk8c3RyaW5nPld1bHRyYSBLZXkgUHJvZDwvc3RyaW5nPgoJPGtleT5UZWFtSWRlbnRpZmllcjwva2V5PgoJPGFycmF5PgoJCTxzdHJpbmc+S1RUOUc4NTlNUjwvc3RyaW5nPgoJPC9hcnJheT4KCTxrZXk+VGVhbU5hbWU8L2tleT4KCTxzdHJpbmc+V3VsdHJhIHMuci5vLjwvc3RyaW5nPgoJPGtleT5UaW1lVG9MaXZlPC9rZXk+Cgk8aW50ZWdlcj4zNjQ8L2ludGVnZXI+Cgk8a2V5PlVVSUQ8L2tleT4KCTxzdHJpbmc+MGY1MDk2MTYtMzEzNS00MzkwLThmZDQtMzA2MzMxMTNkZjgyPC9zdHJpbmc+Cgk8a2V5PlZlcnNpb248L2tleT4KCTxpbnRlZ2VyPjE8L2ludGVnZXI+CjwvZGljdD4KPC9wbGlzdD6ggg0/MIIENDCCAxygAwIBAgIIY/BW8s8iV/MwDQYJKoZIhvcNAQELBQAwczEtMCsGA1UEAwwkQXBwbGUgaVBob25lIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSAwHgYDVQQLDBdDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMwHhcNMjQwMTMwMTgzMjA1WhcNMjkwMTI4MTgzMjA0WjBZMTUwMwYDVQQDDCxBcHBsZSBpUGhvbmUgT1MgUHJvdmlzaW9uaW5nIFByb2ZpbGUgU2lnbmluZzETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC1FX/kJQ1chXPiyq7cbeqNGGn+pv/c/cwpLk2qcBWJD79H31jOWFlKCB2xoQ229iBxUncHfWR/QmmLKHvyw0A9s3CBF8nkhi2ZVzd1wNTjtjcc2Dcm7kAsi3Hw7xRjTOS/0S+HUEUdpxJxkbQX9sNJQHBt64923LXzwWH5JKwxWb5X/kqWxYoAlse5CjmYUeqATgKGEejteO1HxmV6+LAL1Ycpfmab7T296Dm6fUhkO+eIB1+efCGWkBQAV0BlJq7bo4O8jRv3o4VjOjf0rtDOFG8RVCdSsGjLtGs+0gDEORTorEdwUlY2X54rPlOZpuOA0lN4N7tz35kMtxySmq9lAgMBAAGjgeUwgeIwDAYDVR0TAQH/BAIwADAfBgNVHSMEGDAWgBRv8ZUYYlzgyPHF7WwYyeDTZFKYIDBABggrBgEFBQcBAQQ0MDIwMAYIKwYBBQUHMAGGJGh0dHA6Ly9vY3NwLmFwcGxlLmNvbS9vY3NwMDMtYWlwY2EwNzAvBgNVHR8EKDAmMCSgIqAghh5odHRwOi8vY3JsLmFwcGxlLmNvbS9haXBjYS5jcmwwHQYDVR0OBBYEFCkAQ+DGkwX04nv/NdJ5BvpUl3YjMA4GA1UdDwEB/wQEAwIHgDAPBgkqhkiG92NkBjoEAgUAMA0GCSqGSIb3DQEBCwUAA4IBAQBA51NbANKWAu+nYD7W27ilNY9YRzstmIC5/nOz1o/RTQR/Zbpss1G8bzM+53F6OgL8MFI2ummWpXfSL2k/bX6Y/FtCYkoyWdF+rVexy0WeCkjeRgc1G14DGy5ontvaqGzENwiFoECYoxI4cBANSDVkhZNWBzfZ2lY4cCWo4U9oVyxYDBoWSd4/JTZzWNzlX3koj7kLA7vhnPUW53hsEk/BsH5x10qy/tEBNOKPbh4vC3q0wbEyhk6/W5iEaE9nh0/Anrq0MfQJtIo91t4QKkvEjcNN1OrFYpmYGevd0X3H99npvad4XiYUX2Pmf0Ro8ChhvcDhFeBAq/9h6HvAOUoMMIIERDCCAyygAwIBAgIIXGPK5Eo3U8kwDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkFwcGxlIEluYy4xJjAkBgNVBAsTHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRYwFAYDVQQDEw1BcHBsZSBSb290IENBMB4XDTE3MDUxMDIxMjczMFoXDTMwMTIzMTAwMDAwMFowczEtMCsGA1UEAwwkQXBwbGUgaVBob25lIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSAwHgYDVQQLDBdDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDJRWoBDz6DBIbH/L/cXvAege4XMHNjJi7ePXokzZM+TzlHunW+88DS8Vmiqx/+CoY82S2aB/IOa7kpkRpfIgqL8XJYBa5MS0TFeaeAPLCI4IwMJ4RdGeWHGTbL48V2t7D0QXJR9AVcg0uibaZRuPEm33terWUMxrKYUYy7fRtMwU7ICMfS7WQLtN0bjU9AfRuPSJaSW/PQmH7ZvKQZDplhu0FdAcxbd3p9JNDc01P/w9zFlCy2Wk2OGCM5vdnGUj7R8vQliqEqh/3YDEYpUf/tF2yJJWuHv4ppFJ93n8MVt2iziEW9hOYGAkFkD60qKLgVyeCsp4q6cgQ0sniM+LKFAgMBAAGjgewwgekwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBQr0GlHlHYJ/vRrjS5ApvdHTX8IXjBEBggrBgEFBQcBAQQ4MDYwNAYIKwYBBQUHMAGGKGh0dHA6Ly9vY3NwLmFwcGxlLmNvbS9vY3NwMDMtYXBwbGVyb290Y2EwLgYDVR0fBCcwJTAjoCGgH4YdaHR0cDovL2NybC5hcHBsZS5jb20vcm9vdC5jcmwwHQYDVR0OBBYEFG/xlRhiXODI8cXtbBjJ4NNkUpggMA4GA1UdDwEB/wQEAwIBBjAQBgoqhkiG92NkBgISBAIFADANBgkqhkiG9w0BAQsFAAOCAQEAOs+smI2+kiAhCa2V87FcIfo2LVcgRHRzZJIIs5as922X+ls0OCfPEkbTPBHwB8mZkLHR6BEJpeOla2xjCD+eJfrVmZxM5uXOjrJNaOyLq6OiT4oRFT7cFCscxkS2b2fFW0+VKS2HXD/cgx53T+3aVKct5xOBwWPEVAsbSwpqKCII1DeSfH9nKF+vPT+3rFkdODRkWu4zShlCRCnEyhhr4cFTLS30TcIV9jMyGHjxJm+KTeuUTKPo/w+zA4tl2usu2GVQn9yfit8xqIRU3FJSQdKyEx0xRkeIXz7uw/KMIwSV66yKPoJsBp8u44tDmmJbNA30mc8s7rpyhhkjpfyOtTCCBLswggOjoAMCAQICAQIwDQYJKoZIhvcNAQEFBQAwYjELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkFwcGxlIEluYy4xJjAkBgNVBAsTHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRYwFAYDVQQDEw1BcHBsZSBSb290IENBMB4XDTA2MDQyNTIxNDAzNloXDTM1MDIwOTIxNDAzNlowYjELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkFwcGxlIEluYy4xJjAkBgNVBAsTHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRYwFAYDVQQDEw1BcHBsZSBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5JGpCR+R2x5HUOsF7V55hC3rNqJXTFXsixmJ3vlLbPUHqyIwAugYPvhQCdN/QaiY+dHKZpwkaxHQo7vkGyrDH5WeegykR4tb1BY3M8vED03OFGnRyRly9V0O1X9fm/IlA7pVj01dDfFkNSMVSxVZHbOU9/acns9QusFYUGePCLQg98usLCBvcLY/ATCMt0PPD5098ytJKBrI/s61uQ7ZXhzWyz21Oq30Dw4AkguxIRYudNU8DdtiFqujcZJHU1XBry9Bs/j743DN5qNMRX4fTGtQlkGJxHRiCxCDQYczioGxMFjsWgQyjGizjx3eZXP/Z15lvEnYdp8zFGWhd5TJLQIDAQABo4IBejCCAXYwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFCvQaUeUdgn+9GuNLkCm90dNfwheMB8GA1UdIwQYMBaAFCvQaUeUdgn+9GuNLkCm90dNfwheMIIBEQYDVR0gBIIBCDCCAQQwggEABgkqhkiG92NkBQEwgfIwKgYIKwYBBQUHAgEWHmh0dHBzOi8vd3d3LmFwcGxlLmNvbS9hcHBsZWNhLzCBwwYIKwYBBQUHAgIwgbYagbNSZWxpYW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRlIHBvbGljeSBhbmQgY2VydGlmaWNhdGlvbiBwcmFjdGljZSBzdGF0ZW1lbnRzLjANBgkqhkiG9w0BAQUFAAOCAQEAXDaZTC14t+2Mm9zzd5vydtJ3ME/BH4WDhRuZPUc38qmbQI4s1LGQEti+9HOb7tJkD8t5TzTYoj75eP9ryAfsfTmDi1Mg0zjEsb+aTwpr/yv8WacFCXwXQFYRHnTTt4sjO0ej1W8k4uvRt3DfD0XhJ8rxbXjt57UXF6jcfiI1yiXV2Q/Wa9SiJCMR96Gsj3OBYMYbWwkvkrL4REjwYDieFfU9JmcgijNq9w2Cz97roy/5U2pbZMBjM3f3OgcsVuvaDyEO2rpzGU+12TZ/wYdV2aeZuTJC+9jVcZ5+oVK3G72TQiQSKscPHbZNnF5jyEuAF1CqitXa5PzQCQc3sHV1ITGCAoUwggKBAgEBMH8wczEtMCsGA1UEAwwkQXBwbGUgaVBob25lIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSAwHgYDVQQLDBdDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMCCGPwVvLPIlfzMAkGBSsOAwIaBQCggdwwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMjQxMDI0MTcyNTQ2WjAjBgkqhkiG9w0BCQQxFgQUw5dK5zJhHXPWlaCyHtKsgdNoOrIwKQYJKoZIhvcNAQk0MRwwGjAJBgUrDgMCGgUAoQ0GCSqGSIb3DQEBAQUAMFIGCSqGSIb3DQEJDzFFMEMwCgYIKoZIhvcNAwcwDgYIKoZIhvcNAwICAgCAMA0GCCqGSIb3DQMCAgFAMAcGBSsOAwIHMA0GCCqGSIb3DQMCAgEoMA0GCSqGSIb3DQEBAQUABIIBAHYOfA2+k3RFau2zG/Vhepv7OezT/DkdoHVCJe25z6B+MNUCQjXleapz3ZhIHKM2KtMrhAfUMD5XBbkm5Zf71RhV5ZANN/yyETpErgnWZEMjLP9mdaB/peKhjLY6eK2xn3SFi/iBZqitFGemJGoKb7KWyZRbJ0WTkzUEGSBqPEYlqmaPzDLZ4KUqHWK6Z0oNeiREKtMu+C8z5iokW8ZzDIySKx1ssXVXzXGGQqtUW5Lkp5Wd2E7jQhTIP9cvZyiUHwuuhk0yPOxnQsUzHXqu8V4dtH91eI1zvOLnxF3B4izdzXlWCAPChgJzxkYIRECx5JTcAJKNJz793F6b9rejUtA=" }