This commit is contained in:
Zeeshaun
2026-03-31 10:57:41 -05:00
parent 45dc8fbe77
commit f4646dc97f
22 changed files with 39 additions and 286 deletions
@@ -1,17 +0,0 @@
FROM soap
# Install OS CA tooling + mono cert sync tool (Debian/Ubuntu-based images)
RUN apt-get update \
&& apt-get install -y --no-install-recommends ca-certificates mono-utils \
&& rm -rf /var/lib/apt/lists/*
# Add your internal CA chain as a trusted CA bundle
COPY local-config/LandmarkRootCA.crt /usr/local/share/ca-certificates/LandmarkRootCA.crt
COPY local-config/LandmarkIssuingCA1.crt /usr/local/share/ca-certificates/LandmarkIssuingCA1.crt
# Update OS trust + sync into Mono trust
RUN update-ca-certificates \
&& cert-sync /etc/ssl/certs/ca-certificates.crt
# (Optional) Point SSL_CERT_FILE at the system bundle Mono is most likely to use
ENV SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt
@@ -1,6 +1,5 @@
using Autofac;
using Autofac.Integration.WebApi;
using LCU.API.Internal.CoreSoapApiWrapper.Configuration;
using LCU.API.Internal.CoreSoapApiWrapper.CoreSoapUtilities;
using LCU.API.Internal.CoreSoapApiWrapper.DataAccess;
using LCU.API.Internal.CoreSoapApiWrapper.Models;
@@ -40,7 +39,7 @@ namespace LCU.API.Internal.CoreSoapApiWrapper.App_Start
RegisterSoapClasses(builder);
// Get apikey from secret file if available, otherwise fallback to appsettings
var seqApiKey = AppSettingsResolver.Get("serilog:write-to:Seq.apiKey");
var seqApiKey = ConfigurationManager.AppSettings["serilog:write-to:Seq.apiKey"];
try
{
seqApiKey = File.ReadAllText("/vault/secrets/core-soap-api-wrapper-api-seq-api-key.json").Trim();
@@ -53,7 +52,7 @@ namespace LCU.API.Internal.CoreSoapApiWrapper.App_Start
{
return new LoggerConfiguration().Enrich.FromLogContext()
.Enrich.With<HttpRequestIdEnricher>()
.WriteTo.Seq(AppSettingsResolver.Get("serilog:write-to:Seq.serverUrl"), LogEventLevel.Information, 1000, null, seqApiKey)
.WriteTo.Seq(ConfigurationManager.AppSettings["serilog:write-to:Seq.serverUrl"], LogEventLevel.Information, 1000, null, seqApiKey)
.CreateLogger();
}).SingleInstance();
@@ -87,4 +86,4 @@ namespace LCU.API.Internal.CoreSoapApiWrapper.App_Start
builder.RegisterType<CoreCmcConnection>().As<ICoreCmcConnection>();
}
}
}
}
@@ -1,7 +1,7 @@
using LCU.API.Internal.CoreSoapApiWrapper.Configuration;
using Serilog;
using Serilog;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Net;
@@ -22,7 +22,11 @@ namespace LCU.API.Internal.CoreSoapApiWrapper.Attributes
public ApiKeyAuthorizeAttribute()
{
_externalApiKeySet = AppSettingsResolver.GetByPrefix(KeySetPrefix);
_externalApiKeySet = ConfigurationManager.AppSettings.AllKeys
.Where(k => k.StartsWith(KeySetPrefix))
.ToDictionary(
k => k.Substring(KeySetPrefix.Length),
k => ConfigurationManager.AppSettings[k]);
try
{
@@ -33,7 +37,7 @@ namespace LCU.API.Internal.CoreSoapApiWrapper.Attributes
// do nothing, fallback to appsettings value if secret file is not found or cannot be read
}
_authenticationFailureBehavior = AppSettingsResolver.Get("ApiSecurityConfiguration:ApiKeyAuthenticationFailureBehavior") ?? "Error";
_authenticationFailureBehavior = ConfigurationManager.AppSettings["ApiSecurityConfiguration:ApiKeyAuthenticationFailureBehavior"] ?? "Error";
}
protected override bool IsAuthorized(HttpActionContext actionContext)
@@ -80,4 +84,4 @@ namespace LCU.API.Internal.CoreSoapApiWrapper.Attributes
};
}
}
}
}
@@ -1,71 +0,0 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Xml.Linq;
namespace LCU.API.Internal.CoreSoapApiWrapper.Configuration
{
public static class AppSettingsResolver
{
private const string ExternalAppSettingsPath = "/app/config/environment-appsettings/appsettings.config";
private static readonly Lazy<IReadOnlyDictionary<string, string>> ExternalSettings =
new Lazy<IReadOnlyDictionary<string, string>>(LoadExternalSettings);
public static string Get(string key)
{
if (ExternalSettings.Value.TryGetValue(key, out var value) && !string.IsNullOrWhiteSpace(value))
{
return value;
}
return ConfigurationManager.AppSettings[key];
}
public static Dictionary<string, string> GetByPrefix(string prefix)
{
var mergedSettings = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
var appSettings = ConfigurationManager.AppSettings;
foreach (var key in appSettings.AllKeys.Where(k => k != null && k.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)))
{
mergedSettings[key.Substring(prefix.Length)] = appSettings[key];
}
foreach (var kvp in ExternalSettings.Value.Where(kvp => kvp.Key.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)))
{
mergedSettings[kvp.Key.Substring(prefix.Length)] = kvp.Value;
}
return mergedSettings;
}
private static IReadOnlyDictionary<string, string> LoadExternalSettings()
{
try
{
if (!File.Exists(ExternalAppSettingsPath))
{
return new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
}
var document = XDocument.Load(ExternalAppSettingsPath);
return document.Root?
.Elements("add")
.Where(element => element.Attribute("key") != null)
.ToDictionary(
element => element.Attribute("key").Value,
element => element.Attribute("value")?.Value,
StringComparer.OrdinalIgnoreCase)
?? new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
}
catch (Exception)
{
return new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
}
}
}
}
@@ -1,7 +1,7 @@
using System;
using System.Configuration;
using System.Web.Http;
using Serilog;
using LCU.API.Internal.CoreSoapApiWrapper.Configuration;
using LCU.API.Internal.CoreSoapApiWrapper.Models;
namespace LCU.API.Internal.CoreSoapApiWrapper.Controllers
@@ -21,7 +21,7 @@ namespace LCU.API.Internal.CoreSoapApiWrapper.Controllers
var result = new EnvironmentView();
result.Application = "LCU.API.Internal.CoreSoapApiWrapper";
result.CurrentDate = DateTime.Now;
result.Environment = AppSettingsResolver.Get("KnownEnvironment");
result.Environment = ConfigurationManager.AppSettings["KnownEnvironment"];
Log.Verbose($"{result.Application}'s status endpoint was hit in {result.Environment}");
return Ok(result);
}
@@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
using System.ServiceModel;
using LCU.API.Internal.CoreSoapApiWrapper.Models;
namespace LCU.API.Internal.CoreSoapApiWrapper.CoreSoapUtilities
@@ -45,9 +44,7 @@ namespace LCU.API.Internal.CoreSoapApiWrapper.CoreSoapUtilities
private TransactionOutput SubmitTransactionInput(TransactionInput transactionInput)
{
var client = string.IsNullOrWhiteSpace(_soapConfiguration.CoreApiServiceUrl)
? new CoreApiServiceClient(_soapConfiguration.Endpoint)
: new CoreApiServiceClient(_soapConfiguration.Endpoint, new EndpointAddress(_soapConfiguration.CoreApiServiceUrl));
var client = new CoreApiServiceClient(_soapConfiguration.Endpoint);
TransactionOutput output = client.SubmitRequest(transactionInput);
if (output?.Output?.UserAuthentication == null || output?.Output?.Responses == null)
@@ -63,4 +60,4 @@ namespace LCU.API.Internal.CoreSoapApiWrapper.CoreSoapUtilities
return output;
}
}
}
}
@@ -181,7 +181,6 @@
</ItemGroup>
<ItemGroup>
<Compile Include="App_Start\AssignSecurityRequirements.cs" />
<Compile Include="Configuration\AppSettingsResolver.cs" />
<Compile Include="Attributes\ApiKeyAuthorizeAttribute.cs" />
<Compile Include="App_Start\FilterConfig.cs" />
<Compile Include="App_Start\IocBootstrapper.cs" />
@@ -337,4 +336,4 @@
</Target>
<Target Name="AfterBuild">
</Target> -->
</Project>
</Project>
@@ -1,5 +1,4 @@
using LCU.API.Internal.CoreSoapApiWrapper.Configuration;
using System;
using System;
using System.Configuration;
using System.IO;
@@ -11,26 +10,25 @@ namespace LCU.API.Internal.CoreSoapApiWrapper.Models
{
int defaultValue;
SafUrl = AppSettingsResolver.Get("soapconnection:safUrl");
DeviceId = AppSettingsResolver.Get("soapconnection:deviceId");
UserId = ReadSecret("/vault/secrets/core-soap-api-wrapper-soap-connection-user-id.json") ?? AppSettingsResolver.Get("soapconnection:userId");
Password = ReadSecret("/vault/secrets/core-soap-api-wrapper-soap-connection-password.json") ?? AppSettingsResolver.Get("soapconnection:password");
EnvironmentCode = AppSettingsResolver.Get("soapconnection:prodEnvCd");
DefCode = AppSettingsResolver.Get("soapconnection:prodDefCd");
ApplicationId = AppSettingsResolver.Get("soapconnection:applId");
Endpoint = AppSettingsResolver.Get("soapconnection:endpoint");
CoreApiServiceUrl = AppSettingsResolver.Get("soapconnection:coreApiServiceUrl");
ApprovalPersonNumber = AppSettingsResolver.Get("soapconnection:approvalpersonnumber");
OverrideCashBoxNumber = AppSettingsResolver.Get("soapconnection:overridecashboxnumber");
SocketDeviceId = AppSettingsResolver.Get("socketconnection:deviceId");
SocketApplicationId = AppSettingsResolver.Get("socketconnection:applId");
SocketUserId = ReadSecret("/vault/secrets/core-soap-api-wrapper-socket-connection-user-id.json") ?? AppSettingsResolver.Get("socketconnection:userId");
SocketPassword = ReadSecret("/vault/secrets/core-soap-api-wrapper-socket-connection-password.json") ?? AppSettingsResolver.Get("socketconnection:password");
SocketTimeout = int.TryParse(AppSettingsResolver.Get("socketconnection:timeout"), out defaultValue) ? defaultValue : 10000;
IPAddress = AppSettingsResolver.Get("socketconnection:ipAddress");
PortId = int.TryParse(AppSettingsResolver.Get("socketconnection:portId"), out defaultValue) ? defaultValue : 2503;
RequestType = AppSettingsResolver.Get("socketconnection:reqType");
AuthenticationType = AppSettingsResolver.Get("socketconnection:authType");
SafUrl = ConfigurationManager.AppSettings["soapconnection:safUrl"];
DeviceId = ConfigurationManager.AppSettings["soapconnection:deviceId"];
UserId = ReadSecret("/vault/secrets/core-soap-api-wrapper-soap-connection-user-id.json") ?? ConfigurationManager.AppSettings["soapconnection:userId"];
Password = ReadSecret("/vault/secrets/core-soap-api-wrapper-soap-connection-password.json") ?? ConfigurationManager.AppSettings["soapconnection:password"];
EnvironmentCode = ConfigurationManager.AppSettings["soapconnection:prodEnvCd"];
DefCode = ConfigurationManager.AppSettings["soapconnection:prodDefCd"];
ApplicationId = ConfigurationManager.AppSettings["soapconnection:applId"];
Endpoint = ConfigurationManager.AppSettings["soapconnection:endpoint"];
ApprovalPersonNumber = ConfigurationManager.AppSettings["soapconnection:approvalpersonnumber"];
OverrideCashBoxNumber = ConfigurationManager.AppSettings["soapconnection:overridecashboxnumber"];
SocketDeviceId = ConfigurationManager.AppSettings["socketconnection:deviceId"];
SocketApplicationId = ConfigurationManager.AppSettings["socketconnection:applId"];
SocketUserId = ReadSecret("/vault/secrets/core-soap-api-wrapper-socket-connection-user-id.json") ?? ConfigurationManager.AppSettings["socketconnection:userId"];
SocketPassword = ReadSecret("/vault/secrets/core-soap-api-wrapper-socket-connection-password.json") ?? ConfigurationManager.AppSettings["socketconnection:password"];
SocketTimeout = int.TryParse(ConfigurationManager.AppSettings["socketconnection:timeout"], out defaultValue) ? defaultValue : 10000;
IPAddress = ConfigurationManager.AppSettings["socketconnection:ipAddress"];
PortId = int.TryParse(ConfigurationManager.AppSettings["socketconnection:portId"], out defaultValue) ? defaultValue : 2503;
RequestType = ConfigurationManager.AppSettings["socketconnection:reqType"];
AuthenticationType = ConfigurationManager.AppSettings["socketconnection:authType"];
string ReadSecret(string path)
{
@@ -56,7 +54,6 @@ namespace LCU.API.Internal.CoreSoapApiWrapper.Models
public string DefCode { get; set; }
public string ApplicationId { get; set; }
public string Endpoint { get; set; }
public string CoreApiServiceUrl { get; set; }
public string ApprovalPersonNumber { get; set; }
public string OverrideCashBoxNumber { get; set; }
public string SocketDeviceId { get; set; }
@@ -69,4 +66,4 @@ namespace LCU.API.Internal.CoreSoapApiWrapper.Models
public string RequestType { get; set; }
public string AuthenticationType { get; set; }
}
}
}
@@ -20,7 +20,6 @@
<add key="soapconnection:prodDefCd" value="SAF2006" xdt:Transform="Replace" xdt:Locator="Match(key)"/>
<add key="soapconnection:applId" value="7e837e75-2e19-45d5-8c3a-4735a275a6cf" xdt:Transform="Replace" xdt:Locator="Match(key)"/>
<add key="soapconnection:endpoint" value="lcu_10002" xdt:Transform="Replace" xdt:Locator="Match(key)"/>
<add key="soapconnection:coreApiServiceUrl" value="https://UATapi.dna.lcu-internal.com:10005/Extensions/DNA.CoreApiService/CoreApiService.svc/Soap11" xdt:Transform="Replace" xdt:Locator="Match(key)"/>
<add key="soapconnection:approvalpersonnumber" value="5775" xdt:Transform="Replace" xdt:Locator="Match(key)"/>
<add key="soapconnection:overridecashboxnumber" value="800" xdt:Transform="Replace" xdt:Locator="Match(key)"/>
<!-- Socket Connection-->
@@ -23,7 +23,6 @@
<add key="soapconnection:prodDefCd" value="SAF2006" xdt:Transform="Replace" xdt:Locator="Match(key)"/>
<add key="soapconnection:applId" value="7e837e75-2e19-45d5-8c3a-4735a275a6cf" xdt:Transform="Replace" xdt:Locator="Match(key)"/>
<add key="soapconnection:endpoint" value="lcu_10002" xdt:Transform="Replace" xdt:Locator="Match(key)"/>
<add key="soapconnection:coreApiServiceUrl" value="https://prodapi.dna.lcu-internal.com:10002/Extensions/DNA.CoreApiService/CoreApiService.svc/Soap11" xdt:Transform="Replace" xdt:Locator="Match(key)"/>
<add key="soapconnection:approvalpersonnumber" value="5775" xdt:Transform="Replace" xdt:Locator="Match(key)"/>
<add key="soapconnection:overridecashboxnumber" value="800" xdt:Transform="Replace" xdt:Locator="Match(key)"/>
<!-- Socket Connection-->
@@ -23,7 +23,6 @@
<add key="soapconnection:prodDefCd" value="SAF2006" xdt:Transform="Replace" xdt:Locator="Match(key)"/>
<add key="soapconnection:applId" value="7e837e75-2e19-45d5-8c3a-4735a275a6cf" xdt:Transform="Replace" xdt:Locator="Match(key)"/>
<add key="soapconnection:endpoint" value="lcu_10002" xdt:Transform="Replace" xdt:Locator="Match(key)"/>
<add key="soapconnection:coreApiServiceUrl" value="https://UATapi.dna.lcu-internal.com:10005/Extensions/DNA.CoreApiService/CoreApiService.svc/Soap11" xdt:Transform="Replace" xdt:Locator="Match(key)"/>
<add key="soapconnection:approvalpersonnumber" value="5775" xdt:Transform="Replace" xdt:Locator="Match(key)"/>
<add key="soapconnection:overridecashboxnumber" value="800" xdt:Transform="Replace" xdt:Locator="Match(key)"/>
<!-- Socket Connection-->
@@ -35,7 +35,6 @@
<add key="soapconnection:prodDefCd" value="SAF2006" />
<add key="soapconnection:applId" value="7e837e75-2e19-45d5-8c3a-4735a275a6cf" />
<add key="soapconnection:endpoint" value="lcu_10002" />
<add key="soapconnection:coreApiServiceUrl" value="https://UATapi.dna.lcu-internal.com:10005/Extensions/DNA.CoreApiService/CoreApiService.svc/Soap11" />
<add key="soapconnection:approvalpersonnumber" value="5775" />
<add key="soapconnection:overridecashboxnumber" value="800" />
<!-- END Soap Connection -->
@@ -44,7 +44,7 @@ stages:
- template: k8s-deploy.yaml@azdo_pipeline_templates
parameters:
dependsOn: CI
condition: or(eq(variables['Build.SourceBranchName'], 'develop'), eq(variables['Build.SourceBranchName'], 'main'))
condition: or(eq(variables['Build.SourceBranchName'], 'develop'), eq(variables['Build.SourceBranchName'], 'master'))
azdo_agent_pool: $(pvar_azdo_agent_pool)
kubectl_version: $(pvar_kubectl_version)
k8s_service_connection: $(pvar_k8s_service_connection)
@@ -1,14 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
# Refresh system trust store if custom certs are mounted.
if ls /usr/local/share/ca-certificates/*.crt >/dev/null 2>&1; then
update-ca-certificates >/dev/null
fi
# Sync Mono trust store with system CAs.
if command -v cert-sync >/dev/null 2>&1; then
cert-sync /etc/ssl/certs/ca-certificates.crt >/dev/null
fi
exec xsp4 --port 8080 --nonstop --address 0.0.0.0 --applications /:.
@@ -15,7 +15,6 @@
<add key="soapconnection:prodDefCd" value="SAF2006" />
<add key="soapconnection:applId" value="7e837e75-2e19-45d5-8c3a-4735a275a6cf" />
<add key="soapconnection:endpoint" value="lcu_10002" />
<add key="soapconnection:coreApiServiceUrl" value="https://prodapi.dna.lcu-internal.com:10002/Extensions/DNA.CoreApiService/CoreApiService.svc/Soap11" />
<add key="soapconnection:approvalpersonnumber" value="5775" />
<add key="soapconnection:overridecashboxnumber" value="800" />
<!-- END Soap Connection -->
@@ -15,7 +15,6 @@
<add key="soapconnection:prodDefCd" value="SAF2006" />
<add key="soapconnection:applId" value="7e837e75-2e19-45d5-8c3a-4735a275a6cf" />
<add key="soapconnection:endpoint" value="lcu_10002" />
<add key="soapconnection:coreApiServiceUrl" value="https://UATapi.dna.lcu-internal.com:10005/Extensions/DNA.CoreApiService/CoreApiService.svc/Soap11" />
<add key="soapconnection:approvalpersonnumber" value="5775" />
<add key="soapconnection:overridecashboxnumber" value="800" />
<!-- END Soap Connection -->
@@ -15,7 +15,6 @@
<add key="soapconnection:prodDefCd" value="SAF2006" />
<add key="soapconnection:applId" value="7e837e75-2e19-45d5-8c3a-4735a275a6cf" />
<add key="soapconnection:endpoint" value="lcu_10002" />
<add key="soapconnection:coreApiServiceUrl" value="https://UATapi.dna.lcu-internal.com:10005/Extensions/DNA.CoreApiService/CoreApiService.svc/Soap11" />
<add key="soapconnection:approvalpersonnumber" value="5775" />
<add key="soapconnection:overridecashboxnumber" value="800" />
<!-- END Soap Connection -->
@@ -1,36 +0,0 @@
-----BEGIN CERTIFICATE-----
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
wka3UAS515E0ffmeE9tzuCs=
-----END CERTIFICATE-----
@@ -1,30 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFDTCCAvWgAwIBAgIQNgLcltW6hLtJdCKBLgF1JjANBgkqhkiG9w0BAQsFADAZ
MRcwFQYDVQQDEw5MYW5kbWFya1Jvb3RDQTAeFw0xNTEwMjMxNDQ3MjJaFw0zNTEw
MjMxNDU3MjFaMBkxFzAVBgNVBAMTDkxhbmRtYXJrUm9vdENBMIICIjANBgkqhkiG
9w0BAQEFAAOCAg8AMIICCgKCAgEAuHs/epexwx9VILVzUb+GHWK1WZTWip3yaPB9
9V/M78j5hku7sJ3hiJBB3mN3lMRb6uFgjN9bx0oWrInfin9dTAlafcc3CiP6x+tj
1Zn0ND5uNGYKI9TtGuI4BQYMFGLZS+7UctVBCD2TCmUo0m6gKj2ocE7j2rNrBQMT
azekjEpzPzpO2FsREGBWIVcyIauzKL+Q78M3byK/mDhAySzLvGIdYmdOyDOkL+Ci
gTq8fWWlgxC0Bcrvj6bi8oiVmHDH647D2xCKb4G5GHIvX0WL/BdQfBotBSgkXULx
0U8P2s55p0hqeRM9Ssxoi151ZV0YDDI5g7SK0t1pA3NfogTPWcg1R8L1X6objlXT
3h1t0x4m0hrFq1+ZVBs3qX+PIzz3AL3SzD2RbEAWMlpzE97NLjez1rkFbJkgQEH8
vH5zQLEvgUGGuXrwpYIWkzhFpNoxbFrvKYkhVd+mhx+PYJe9uy/F66s/3E8/CQGA
c1oDMd5s9uy2yQRtFrkiPb4tlnquupTmDeQMUJzV+41f0rJZpJA2q7tve8sCnhyM
Ylqs5hGTO6ZmemaPBlShWdFPplMn2GjKpfz+d+B4CymG3KCqX9JKa2SGXX3CELbY
FZtzx0HKV/Ke8/C4cvq8u7jmEIiUDhC0xEqVohPBsxbcUTwg+3p0WY1rOwMzWEkt
+zAH7sMCAwEAAaNRME8wCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYD
VR0OBBYEFPgzy7tkexLFvr82gkpEWO7HpwXaMBAGCSsGAQQBgjcVAQQDAgEAMA0G
CSqGSIb3DQEBCwUAA4ICAQAYAZ44XhlBdDw3KQM/3ulLEW3ikTBH1pYEcbVpzDiz
EwwBBHrG8GF+N8A7dc9iGm89/gVwq3wSjTGhP0R+6rMFDXolNKlmQJJEvWVSlBpW
Nhe9ZP05qsviWP0zSd5/EW1GbPDdxu24AZ6wkeXdRUh3SoNR1TbNfYi7ykBuh57w
9s9bLJ6W+Vr4JVSJDFsVpmmTWozW77BvIfhKENrJ8JD4OmnGL4LKZxooj4Z8VN0V
4LwEEsQf4mEvGuphVRYuf5Eyz4Uz9LmVq5ow3NOxQtv9H26vdXnhJk3o+6vG1sB+
ZYLVj+eoaUPTVAOXOO+B0MfxzpRSi5JDDTiPyWo3pVW84RptYJh5gOJ6Jx4b+rgC
maHTIQ0Ej9CFk8bTRF7V3YWMbLNovSMrJWiqDLfvSMwVzngRLdSxnSyR5PT47HFA
816Xs3AJDstxAKUPoV20zgsHlwqQ1j3IvACTZImyMRiIH60SrmJAnw0lufBPH7XQ
7GN/zSNIQxp8+9WCf3686NJyaMhdeMtK4ISmJ4U5wV6dGYFxCUMx37e4FYZJc3Ml
cL6EwmovNryczcYsH+29E+aB2DhPSqnvVO7WSVJsrFaXHACZ/9/Q4wT442WsPQlA
aoxj11Fsb8X75Hs1dW4qEdaBPQRR4YuDuV19/N/IFa0y/4p68D7dyVN6slHiwwZ0
QA==
-----END CERTIFICATE-----
@@ -1,66 +0,0 @@
-----BEGIN CERTIFICATE-----
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
wka3UAS515E0ffmeE9tzuCs=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFDTCCAvWgAwIBAgIQNgLcltW6hLtJdCKBLgF1JjANBgkqhkiG9w0BAQsFADAZ
MRcwFQYDVQQDEw5MYW5kbWFya1Jvb3RDQTAeFw0xNTEwMjMxNDQ3MjJaFw0zNTEw
MjMxNDU3MjFaMBkxFzAVBgNVBAMTDkxhbmRtYXJrUm9vdENBMIICIjANBgkqhkiG
9w0BAQEFAAOCAg8AMIICCgKCAgEAuHs/epexwx9VILVzUb+GHWK1WZTWip3yaPB9
9V/M78j5hku7sJ3hiJBB3mN3lMRb6uFgjN9bx0oWrInfin9dTAlafcc3CiP6x+tj
1Zn0ND5uNGYKI9TtGuI4BQYMFGLZS+7UctVBCD2TCmUo0m6gKj2ocE7j2rNrBQMT
azekjEpzPzpO2FsREGBWIVcyIauzKL+Q78M3byK/mDhAySzLvGIdYmdOyDOkL+Ci
gTq8fWWlgxC0Bcrvj6bi8oiVmHDH647D2xCKb4G5GHIvX0WL/BdQfBotBSgkXULx
0U8P2s55p0hqeRM9Ssxoi151ZV0YDDI5g7SK0t1pA3NfogTPWcg1R8L1X6objlXT
3h1t0x4m0hrFq1+ZVBs3qX+PIzz3AL3SzD2RbEAWMlpzE97NLjez1rkFbJkgQEH8
vH5zQLEvgUGGuXrwpYIWkzhFpNoxbFrvKYkhVd+mhx+PYJe9uy/F66s/3E8/CQGA
c1oDMd5s9uy2yQRtFrkiPb4tlnquupTmDeQMUJzV+41f0rJZpJA2q7tve8sCnhyM
Ylqs5hGTO6ZmemaPBlShWdFPplMn2GjKpfz+d+B4CymG3KCqX9JKa2SGXX3CELbY
FZtzx0HKV/Ke8/C4cvq8u7jmEIiUDhC0xEqVohPBsxbcUTwg+3p0WY1rOwMzWEkt
+zAH7sMCAwEAAaNRME8wCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYD
VR0OBBYEFPgzy7tkexLFvr82gkpEWO7HpwXaMBAGCSsGAQQBgjcVAQQDAgEAMA0G
CSqGSIb3DQEBCwUAA4ICAQAYAZ44XhlBdDw3KQM/3ulLEW3ikTBH1pYEcbVpzDiz
EwwBBHrG8GF+N8A7dc9iGm89/gVwq3wSjTGhP0R+6rMFDXolNKlmQJJEvWVSlBpW
Nhe9ZP05qsviWP0zSd5/EW1GbPDdxu24AZ6wkeXdRUh3SoNR1TbNfYi7ykBuh57w
9s9bLJ6W+Vr4JVSJDFsVpmmTWozW77BvIfhKENrJ8JD4OmnGL4LKZxooj4Z8VN0V
4LwEEsQf4mEvGuphVRYuf5Eyz4Uz9LmVq5ow3NOxQtv9H26vdXnhJk3o+6vG1sB+
ZYLVj+eoaUPTVAOXOO+B0MfxzpRSi5JDDTiPyWo3pVW84RptYJh5gOJ6Jx4b+rgC
maHTIQ0Ej9CFk8bTRF7V3YWMbLNovSMrJWiqDLfvSMwVzngRLdSxnSyR5PT47HFA
816Xs3AJDstxAKUPoV20zgsHlwqQ1j3IvACTZImyMRiIH60SrmJAnw0lufBPH7XQ
7GN/zSNIQxp8+9WCf3686NJyaMhdeMtK4ISmJ4U5wV6dGYFxCUMx37e4FYZJc3Ml
cL6EwmovNryczcYsH+29E+aB2DhPSqnvVO7WSVJsrFaXHACZ/9/Q4wT442WsPQlA
aoxj11Fsb8X75Hs1dW4qEdaBPQRR4YuDuV19/N/IFa0y/4p68D7dyVN6slHiwwZ0
QA==
-----END CERTIFICATE-----