Skip to content

Commit 838c13e

Browse files
committed
See #134. Fix some tests
1 parent e5e25f0 commit 838c13e

File tree

6 files changed

+73
-15
lines changed

6 files changed

+73
-15
lines changed

core/src/test/java/com/onelogin/saml2/test/authn/AuthnResponseTest.java

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,23 @@ public void testConstructor() throws IOException, Error, XPathExpressionExceptio
7878
assertTrue(samlResponse instanceof SamlResponse);
7979
}
8080

81+
/**
82+
* Tests that a invalid SAMLResponse with not expected elements fails
83+
*
84+
* @throws Exception
85+
*
86+
* @see com.onelogin.saml2.authn.SamlResponse
87+
*/
88+
@Test
89+
public void testOInvalidResponseWithNonExpectedElementsFail() throws Exception {
90+
expectedEx.expect(ValidationError.class);
91+
expectedEx.expectMessage("SAML Response could not be processed");
92+
93+
Saml2Settings settings = new SettingsBuilder().fromFile("config/config.my.properties").build();
94+
String samlResponseEncoded = Util.getFileAsString("data/responses/invalids/wrapped_response_2.xml.base64");
95+
96+
SamlResponse samlResponse = new SamlResponse(settings, newHttpRequest(samlResponseEncoded));
97+
}
8198
/**
8299
* Tests the constructor of SamlResponse
83100
* Case: Encrypted assertion but no key
@@ -906,28 +923,28 @@ public void testGetAttributesDuplicatedNames() throws IOException, Error, XPathE
906923

907924
HashMap<String, List<String>> attributes = samlResponse.getAttributes();
908925
}
909-
926+
910927
/**
911-
* Tests the isValid method of SamlResponse
928+
* Tests that queryAssertion method of SamlResponse
929+
* Case: Elements retrieved are covered by a Signature
912930
*
913931
* @throws Exception
914932
*
915-
* @see com.onelogin.saml2.authn.SamlResponse#isValid
933+
* @see com.onelogin.saml2.authn.SamlResponse#queryAssertion
916934
*/
917935
@Test
918-
public void testOnlyRetrieveAssertionWithIDThatMatchesSignatureReference() throws Exception {
919-
expectedEx.expect(ValidationError.class);
920-
expectedEx.expectMessage("SAML Response could not be processed");
921-
936+
public void testOnlyRetrieveAssertionWithIDThatMatchesSignatureReference() throws Exception {
922937
Saml2Settings settings = new SettingsBuilder().fromFile("config/config.my.properties").build();
923-
String samlResponseEncoded = Util.getFileAsString("data/responses/invalids/wrapped_response_2.xml.base64");
938+
String samlResponseEncoded = Util.getFileAsString("data/responses/signed_assertion_response_with_2_assertions.xml.base64");
924939
SamlResponse samlResponse = new SamlResponse(settings, newHttpRequest(samlResponseEncoded));
925-
926-
String nameID = samlResponse.getNameId();
927-
assertFalse(samlResponse.isValid());
928-
assertFalse("root@example.com".equals(nameID));
940+
assertEquals("492882615acf31c8096b627245d76ae53036c090", samlResponse.getNameId());
941+
942+
samlResponseEncoded = Util.getFileAsString("data/responses/signed_assertion_response_with_2_assertions_differrent_order.xml.base64");
943+
samlResponse = new SamlResponse(settings, newHttpRequest(samlResponseEncoded));
944+
assertEquals("492882615acf31c8096b627245d76ae53036c090", samlResponse.getNameId());
929945
}
930-
946+
947+
931948
/**
932949
* Tests the isValid method of SamlResponse
933950
*

core/src/test/java/com/onelogin/saml2/test/logout/LogoutRequestTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -327,10 +327,10 @@ public void testGetNameIdDataNoKey() throws Exception {
327327
@Test
328328
public void testGetNameIdDataWrongKey() throws Exception {
329329
expectedEx.expect(Exception.class);
330-
expectedEx.expectMessage("algid parse error, not a sequence");
330+
expectedEx.expectMessage("Not able to decrypt the EncryptedID and get a NameID");
331331

332332
String logoutRequestStr = Util.getFileAsString("data/logout_requests/logout_request_encrypted_nameid.xml");
333-
String keyString = Util.getFileAsString("data/misc/sp3.key");
333+
String keyString = Util.getFileAsString("data/misc/sp4.key");
334334
PrivateKey key = Util.loadPrivateKey(keyString);
335335
String nameIdDataStr = LogoutRequest.getNameIdData(logoutRequestStr, key).toString();
336336
}

core/src/test/java/com/onelogin/saml2/test/util/UtilsTest.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,13 @@
3737
import javax.xml.parsers.ParserConfigurationException;
3838
import javax.xml.xpath.XPathExpressionException;
3939

40+
import org.junit.rules.ExpectedException;
41+
4042
import org.apache.commons.codec.binary.Base64;
4143
import org.apache.xml.security.exceptions.XMLSecurityException;
4244
import org.apache.xml.security.signature.XMLSignatureException;
4345
import org.joda.time.DateTime;
46+
import org.junit.Rule;
4447
import org.junit.Test;
4548
import org.w3c.dom.Document;
4649
import org.w3c.dom.Element;
@@ -49,6 +52,7 @@
4952
import org.w3c.dom.NodeList;
5053
import org.xml.sax.SAXException;
5154

55+
import com.onelogin.saml2.logout.LogoutRequest;
5256
import com.onelogin.saml2.util.Constants;
5357
import com.onelogin.saml2.util.SchemaFactory;
5458
import com.onelogin.saml2.util.Util;
@@ -58,6 +62,9 @@
5862
*/
5963
public class UtilsTest {
6064

65+
@Rule
66+
public ExpectedException expectedEx = ExpectedException.none();
67+
6168
/**
6269
* Tests the loadXML method for XXE/XEE attacks
6370
* Case: Use of ENTITY
@@ -614,6 +621,22 @@ public void testLoadPrivateKeyPKCS1() throws URISyntaxException, GeneralSecurity
614621
PrivateKey keyObject1 = Util.loadPrivateKey(key);
615622
assertNull(keyObject1);
616623
}
624+
625+
/**
626+
* Tests the loadPrivateKey method
627+
*
628+
* @throws Exception
629+
*
630+
* @see com.onelogin.saml2.logout.LogoutRequest#getNameIdData
631+
*/
632+
@Test
633+
public void testGetNameIdDataWrongKey() throws Exception {
634+
expectedEx.expect(Exception.class);
635+
expectedEx.expectMessage("algid parse error, not a sequence");
636+
637+
String keyString = Util.getFileAsString("data/misc/sp3.key");
638+
PrivateKey key = Util.loadPrivateKey(keyString);
639+
}
617640

618641
/**
619642
* Tests load Private Key String with heads.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIICeQIBADANBgkqhkiG9w0BAQEFAASCAmMwggJfAgEAAoGBAOOkQGlAE+6AXoNQ
3+
rjpYpwHHeZ+J/3KybDqJkya3D9+v8N4I5hZmoaNioVCzfmOmauPX07U7JmZY3PsP
4+
VCs9Er1hCUBYV0Le2976/8EK2nW/xcQ2aE/2UseiNRppmo7VdqhtoHjoJS0R+Ve8
5+
3quC80Bdq9uDQgvZpPCDAl36bmGtAgMBAAECgYEApxMSQy1Ic6+7rl00wpX2XRPu
6+
a+14ktHpJT17xtpsyBv1iMC3PpGs6KGnC/fxN2oY4YiyVT1Ifa2S4qDpgaKdcQZ3
7+
O81bMWKkpVTALLOJ6IYGj6M5YdiZUKcHmor+fXM+APylLbt9UPHd6PSflHgNyHLU
8+
6IbAFnK5NZS+xp6pk/ECQQD7QQoFEoS7ks/ZZ+DaVuHRFNPyRQkKTEWkS27gPfCC
9+
HYvRsU8LCf5jUB7FXJIwYYzK8jk27ykSPrsx6kjwvSZfAkEA5/EIS5wekTCIylJc
10+
B28DKuwtSsu7JjZxo9votRAEsfAc/9/digU1tkRs63SuWOwtTN5nSXJNULcKeRKo
11+
KIn7cwJBANvNQSvA0JebzvN9mcrI2RJlKym11TvKD960ExJffWkG2gufFuwsWPye
12+
2dyEqGtk25urnfv966tHb9IyCI96mfcCQQCUnfwrvoBTld7AjR9M4BQOh8DJwVtM
13+
s+wDC6DDi90GSw254q7ohkgRXyzPfjdM4SBxtbxG8oeZ5X8/bvXy698DAkEAuyMk
14+
I1wrQYNPMqhrX5xt/Soxw+nTGDBQClCG7YbJlmgGGbw/pm/XpLbq/inovjSwi0Nd
15+
g3DBgBh/yox3J/PB5g==
16+
-----END PRIVATE KEY-----
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
PHNhbWxwOlJlc3BvbnNlIHhtbG5zOnNhbWxwPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6cHJvdG9jb2wiIHhtbG5zOnNhbWw9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iIElEPSJwZngxZmYxZGE0YS0wMTBlLTQyOGMtMTZlYi03NWYzMWYxNjU2N2EiIFZlcnNpb249IjIuMCIgSXNzdWVJbnN0YW50PSIyMDE0LTAyLTE5VDAxOjM3OjAxWiIgRGVzdGluYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qYXZhLXNhbWwtanNwc2FtcGxlL2Fjcy5qc3AiIEluUmVzcG9uc2VUbz0iT05FTE9HSU5fNWZlOWQ2ZTQ5OWIyZjA5MTMyMDZhYWIzZjcxOTE3MjkwNDliYjgwNyI+PHNhbWw6SXNzdWVyPmh0dHBzOi8vcGl0YnVsay5uby1pcC5vcmcvc2ltcGxlc2FtbC9zYW1sMi9pZHAvbWV0YWRhdGEucGhwPC9zYW1sOklzc3Vlcj48c2FtbHA6U3RhdHVzPjxzYW1scDpTdGF0dXNDb2RlIFZhbHVlPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6c3RhdHVzOlN1Y2Nlc3MiLz48L3NhbWxwOlN0YXR1cz48c2FtbDpBc3NlcnRpb24geG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBJRD0icGZ4Zjk0Y2Q4MDUtYzIyYi04MTk4LTZlZmYtMTk0MDk2OTI4ZWM1IiBWZXJzaW9uPSIyLjAiIElzc3VlSW5zdGFudD0iMjAxNC0wMi0xOVQwMTozNzowMVoiPjxzYW1sOklzc3Vlcj5odHRwczovL3BpdGJ1bGsubm8taXAub3JnL3NpbXBsZXNhbWwvc2FtbDIvaWRwL21ldGFkYXRhLnBocDwvc2FtbDpJc3N1ZXI+PGRzOlNpZ25hdHVyZSB4bWxuczpkcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+DQogIDxkczpTaWduZWRJbmZvPjxkczpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8+DQogICAgPGRzOlNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNyc2Etc2hhMSIvPg0KICA8ZHM6UmVmZXJlbmNlIFVSST0iI3BmeGY5NGNkODA1LWMyMmItODE5OC02ZWZmLTE5NDA5NjkyOGVjNSI+PGRzOlRyYW5zZm9ybXM+PGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNlbnZlbG9wZWQtc2lnbmF0dXJlIi8+PGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPjwvZHM6VHJhbnNmb3Jtcz48ZHM6RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiLz48ZHM6RGlnZXN0VmFsdWU+eGFyc1p0bVlOVFhTckxoTy9renUxc0FzMjY4PTwvZHM6RGlnZXN0VmFsdWU+PC9kczpSZWZlcmVuY2U+PC9kczpTaWduZWRJbmZvPjxkczpTaWduYXR1cmVWYWx1ZT5WMGVMdjRFd3FZdENHdEozTE41SVM1c3RsR1lqMEU0K2N0RzhHOFNxS0Q0VWxEa2ZRK09aOVkxcmtLNDYzVzVNaDM1THFZdXJuM1lqTTA5dHlDaldtM3RyQzNHYzdDOWdzbXdFWWJ1T0o4Um9yaWF0Tkd0Q1ZIUlpFOVhRN2s5bGd6Z0hNSXFRT3dKRnBvMHYwUDJ0K0EvY3dXMDVjMHAxN2QxdEdldC9IUDQ9PC9kczpTaWduYXR1cmVWYWx1ZT4NCjxkczpLZXlJbmZvPjxkczpYNTA5RGF0YT48ZHM6WDUwOUNlcnRpZmljYXRlPk1JSUNnVENDQWVvQ0NRQ2JPbHJXRGRYN0ZUQU5CZ2txaGtpRzl3MEJBUVVGQURDQmhERUxNQWtHQTFVRUJoTUNUazh4R0RBV0JnTlZCQWdURDBGdVpISmxZWE1nVTI5c1ltVnlaekVNTUFvR0ExVUVCeE1EUm05dk1SQXdEZ1lEVlFRS0V3ZFZUa2xPUlZSVU1SZ3dGZ1lEVlFRREV3OW1aV2xrWlM1bGNteGhibWN1Ym04eElUQWZCZ2txaGtpRzl3MEJDUUVXRW1GdVpISmxZWE5BZFc1cGJtVjBkQzV1YnpBZUZ3MHdOekEyTVRVeE1qQXhNelZhRncwd056QTRNVFF4TWpBeE16VmFNSUdFTVFzd0NRWURWUVFHRXdKT1R6RVlNQllHQTFVRUNCTVBRVzVrY21WaGN5QlRiMnhpWlhKbk1Rd3dDZ1lEVlFRSEV3TkdiMjh4RURBT0JnTlZCQW9UQjFWT1NVNUZWRlF4R0RBV0JnTlZCQU1URDJabGFXUmxMbVZ5YkdGdVp5NXViekVoTUI4R0NTcUdTSWIzRFFFSkFSWVNZVzVrY21WaGMwQjFibWx1WlhSMExtNXZNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOQURDQmlRS0JnUURpdmJoUjdQNTE2eC9TM0JxS3h1cFFlMExPTm9saXVwaUJPZXNDTzNTSGJEcmwzK3E5SWJmbmZtRTA0ck51TWNQc0l4QjE2MVRkRHBJZXNMQ243YzhhUEhJU0tPdFBsQWVUWlNuYjhRQXU3YVJqWnEzK1BiclA1dVczVGNmQ0dQdEtUeXRIT2dlL09sSmJvMDc4ZFZoWFExNGQxRUR3WEpXMXJSWHVVdDRDOFFJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0R0JBQ0RWZnA4NkhPYnFZK2U4QlVvV1E5K1ZNUXgxQVNEb2hCandPc2cyV3lrVXFSWEYrZExmY1VIOWRXUjYzQ3RaSUtGRGJTdE5vbVBuUXo3bmJLK29ueWd3QnNwVkVibkh1VWloWnEzWlVkbXVtUXFDdzRVdnMvMVV2cTNvck9vL1dKVmhUeXZMZ0ZWSzJRYXJRNC82N09aZkhkN1IrUE9CWGhvcGhTTXYxWk9vPC9kczpYNTA5Q2VydGlmaWNhdGU+PC9kczpYNTA5RGF0YT48L2RzOktleUluZm8+PC9kczpTaWduYXR1cmU+PHNhbWw6U3ViamVjdD48c2FtbDpOYW1lSUQgU1BOYW1lUXVhbGlmaWVyPSJodHRwOi8vbG9jYWxob3N0OjgwODAvamF2YS1zYW1sLWpzcHNhbXBsZS9tZXRhZGF0YS5qc3AiIEZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6MS4xOm5hbWVpZC1mb3JtYXQ6ZW1haWxBZGRyZXNzIj40OTI4ODI2MTVhY2YzMWM4MDk2YjYyNzI0NWQ3NmFlNTMwMzZjMDkwPC9zYW1sOk5hbWVJRD48c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmJlYXJlciI+PHNhbWw6U3ViamVjdENvbmZpcm1hdGlvbkRhdGEgTm90T25PckFmdGVyPSIyMDIzLTA4LTIzVDA2OjU3OjAxWiIgUmVjaXBpZW50PSJodHRwOi8vbG9jYWxob3N0OjgwODAvamF2YS1zYW1sLWpzcHNhbXBsZS9hY3MuanNwIiBJblJlc3BvbnNlVG89Ik9ORUxPR0lOXzVmZTlkNmU0OTliMmYwOTEzMjA2YWFiM2Y3MTkxNzI5MDQ5YmI4MDciLz48L3NhbWw6U3ViamVjdENvbmZpcm1hdGlvbj48L3NhbWw6U3ViamVjdD48c2FtbDpDb25kaXRpb25zIE5vdEJlZm9yZT0iMjAxNC0wMi0xOVQwMTozNjozMVoiIE5vdE9uT3JBZnRlcj0iMjAyMy0wOC0yM1QwNjo1NzowMVoiPjxzYW1sOkF1ZGllbmNlUmVzdHJpY3Rpb24+PHNhbWw6QXVkaWVuY2U+aHR0cDovL2xvY2FsaG9zdDo4MDgwL2phdmEtc2FtbC1qc3BzYW1wbGUvbWV0YWRhdGEuanNwPC9zYW1sOkF1ZGllbmNlPjwvc2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPjwvc2FtbDpDb25kaXRpb25zPjxzYW1sOkF1dGhuU3RhdGVtZW50IEF1dGhuSW5zdGFudD0iMjAxNC0wMi0xOVQwMTozNzowMVoiIFNlc3Npb25Ob3RPbk9yQWZ0ZXI9IjIwMjMtMDgtMjNUMDY6NTc6MDFaIiBTZXNzaW9uSW5kZXg9Il82MjczZDc3YjhjZGUwYzMzM2VjNzlkMjJhOWZhMDAwM2I5ZmUyZDc1Y2IiPjxzYW1sOkF1dGhuQ29udGV4dD48c2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj51cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YWM6Y2xhc3NlczpQYXNzd29yZDwvc2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj48L3NhbWw6QXV0aG5Db250ZXh0Pjwvc2FtbDpBdXRoblN0YXRlbWVudD48c2FtbDpBdHRyaWJ1dGVTdGF0ZW1lbnQ+PHNhbWw6QXR0cmlidXRlIE5hbWU9InVpZCIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDpiYXNpYyI+PHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+c21hcnRpbjwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT48L3NhbWw6QXR0cmlidXRlPjxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJtYWlsIiBOYW1lRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXR0cm5hbWUtZm9ybWF0OmJhc2ljIj48c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4c2k6dHlwZT0ieHM6c3RyaW5nIj5zbWFydGluQHlhY28uZXM8L3NhbWw6QXR0cmlidXRlVmFsdWU+PC9zYW1sOkF0dHJpYnV0ZT48c2FtbDpBdHRyaWJ1dGUgTmFtZT0iY24iIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6YmFzaWMiPjxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhzaTp0eXBlPSJ4czpzdHJpbmciPlNpeHRvMzwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT48L3NhbWw6QXR0cmlidXRlPjxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJzbiIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDpiYXNpYyI+PHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+TWFydGluMjwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT48L3NhbWw6QXR0cmlidXRlPjxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJlZHVQZXJzb25BZmZpbGlhdGlvbiIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDpiYXNpYyI+PHNhbWw6QXR0cmlidXRlVmFsdWUgeHNpOnR5cGU9InhzOnN0cmluZyI+dXNlcjwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT48c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4c2k6dHlwZT0ieHM6c3RyaW5nIj5hZG1pbjwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT48L3NhbWw6QXR0cmlidXRlPjwvc2FtbDpBdHRyaWJ1dGVTdGF0ZW1lbnQ+PC9zYW1sOkFzc2VydGlvbj48c2FtbDpBc3NlcnRpb24geG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBJRD0icGZ4ZjIyY2Q4MDUtYzIyYi04MTk4LTZlZmYtMTk0MDk2OTI4YTIxIiBWZXJzaW9uPSIyLjAiIElzc3VlSW5zdGFudD0iMjAxNC0wMi0xOVQwMTozNzowMVoiPjxzYW1sOklzc3Vlcj5odHRwczovL3BpdGJ1bGsubm8taXAub3JnL3NpbXBsZXNhbWwvc2FtbDIvaWRwL21ldGFkYXRhLnBocDwvc2FtbDpJc3N1ZXI+PHNhbWw6U3ViamVjdD48c2FtbDpOYW1lSUQgU1BOYW1lUXVhbGlmaWVyPSJodHRwOi8vbG9jYWxob3N0OjgwODAvamF2YS1zYW1sLWpzcHNhbXBsZS9tZXRhZGF0YS5qc3AiIEZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6MS4xOm5hbWVpZC1mb3JtYXQ6ZW1haWxBZGRyZXNzIj53cm9uZ192YWx1ZTwvc2FtbDpOYW1lSUQ+PHNhbWw6U3ViamVjdENvbmZpcm1hdGlvbiBNZXRob2Q9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpjbTpiZWFyZXIiPjxzYW1sOlN1YmplY3RDb25maXJtYXRpb25EYXRhIE5vdE9uT3JBZnRlcj0iMjAyMy0wOC0yM1QwNjo1NzowMVoiIFJlY2lwaWVudD0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2phdmEtc2FtbC1qc3BzYW1wbGUvYWNzLmpzcCIgSW5SZXNwb25zZVRvPSJPTkVMT0dJTl81ZmU5ZDZlNDk5YjJmMDkxMzIwNmFhYjNmNzE5MTcyOTA0OWJiODA3Ii8+PC9zYW1sOlN1YmplY3RDb25maXJtYXRpb24+PC9zYW1sOlN1YmplY3Q+PHNhbWw6Q29uZGl0aW9ucyBOb3RCZWZvcmU9IjIwMTQtMDItMTlUMDE6MzY6MzFaIiBOb3RPbk9yQWZ0ZXI9IjIwMjMtMDgtMjNUMDY6NTc6MDFaIj48c2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPjxzYW1sOkF1ZGllbmNlPmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qYXZhLXNhbWwtanNwc2FtcGxlL21ldGFkYXRhLmpzcDwvc2FtbDpBdWRpZW5jZT48L3NhbWw6QXVkaWVuY2VSZXN0cmljdGlvbj48L3NhbWw6Q29uZGl0aW9ucz48c2FtbDpBdXRoblN0YXRlbWVudCBBdXRobkluc3RhbnQ9IjIwMTQtMDItMTlUMDE6Mzc6MDFaIiBTZXNzaW9uTm90T25PckFmdGVyPSIyMDIzLTA4LTIzVDA2OjU3OjAxWiIgU2Vzc2lvbkluZGV4PSJfNjI3M2Q3N2I4Y2RlMGMzMzNlYzc5ZDIyYTlmYTAwMDNiOWZlMmQ3NWNiIj48c2FtbDpBdXRobkNvbnRleHQ+PHNhbWw6QXV0aG5Db250ZXh0Q2xhc3NSZWY+dXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFjOmNsYXNzZXM6UGFzc3dvcmQ8L3NhbWw6QXV0aG5Db250ZXh0Q2xhc3NSZWY+PC9zYW1sOkF1dGhuQ29udGV4dD48L3NhbWw6QXV0aG5TdGF0ZW1lbnQ+PC9zYW1sOkFzc2VydGlvbj48L3NhbWxwOlJlc3BvbnNlPg==

0 commit comments

Comments
 (0)