Compare commits

..

9 Commits

Author SHA1 Message Date
billisdead 9c68e7a83f fix: biometric auth, workflow error propagation, execution logs
- Biometric: persist preference to SecureStore so it survives restarts;
  actually call LocalAuthentication.authenticateAsync() at startup and
  block navigation behind a locked screen until the user authenticates
- Workflow run: remove silent error swallowing in triggerWorkflow so
  failures surface as toasts; success snackbar only shown on API success
- Execution logs: add includeData=true to fetchExecutionById so n8n
  returns node-level data and error messages instead of an empty object

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 18:34:56 +02:00
billisdead 00b2c5db85 docs: simplify HAPROXY.md for existing setup
Config ciblée sur le backend n8n existant — juste le delta à appliquer.
Token requis uniquement hors LAN/IP fixe, LAN reste en accès direct.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 18:33:06 +02:00
billisdead 46a1e82cfa chore: update app.json and tsconfig.json post eas init
- app.json : ajout projectId EAS, owner, permissions biométrie Android
- tsconfig.json : mise à jour de l'include par expo doctor

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 18:12:19 +02:00
billisdead 701fb58fba fix: add missing expo-router peer dependencies
expo-linking, expo-constants, expo-splash-screen, react-native-web
et react-dom sont des dépendances requises par expo-router mais non
installées automatiquement avec npx expo install expo-router.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 18:07:52 +02:00
billisdead 3fd5c6fbd2 fix: add babel-preset-expo as explicit devDependency
EAS build ne trouvait pas babel-preset-expo car il n'était pas
déclaré dans package.json — seule sa présence transitive via expo
ne suffit pas pour npm ci en environnement EAS isolé.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 18:04:03 +02:00
billisdead 1477c30c67 fix: add react-native-worklets required by reanimated v4
react-native-reanimated v4.x a extrait worklets dans un package
séparé react-native-worklets. Le plugin babel de reanimated le
cherche explicitement — le build EAS échouait avec ENOMODULE.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 18:01:22 +02:00
billisdead 67b41e7bdb fix: sync package-lock.json + add .npmrc for EAS build
npm ci sur EAS échouait car le lock file était généré avec
--legacy-peer-deps sans que .npmrc le propage. Ajout de
legacy-peer-deps=true dans .npmrc et régénération du lock file.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 17:55:33 +02:00
billisdead 92e67d0769 feat: application n8n Pilot complète (Expo managed workflow)
- Stack : Expo Router, Axios, Zustand, React Native Paper (thème sombre), date-fns
- Sécurité : secrets dans Android Keystore via expo-secure-store, TLS obligatoire,
  headers X-N8N-API-KEY + X-App-Token injectés par intercepteur Axios
- API : client.ts centralisé + workflows.ts + executions.ts (TypeScript strict)
- Store : Zustand appStore avec chargement depuis secure store au démarrage
- Hooks : usePolling (générique), useWorkflows, useExecutions
- Composants : StatusBadge, WorkflowCard, ExecutionCard, SkeletonLoader
- Screens : Dashboard, Workflows, Executions, Logs (détail exécution), Settings
- Navigation Expo Router : 4 tabs + stack Logs + écran Setup initial
- Docs : INSTALL.md, UPDATE.md, BACKUP.md, HAPROXY.md, SECURITY.md

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 17:31:55 +02:00
billisdead ea1705d3b0 Initial Expo managed workflow app for n8n mobile
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 16:44:24 +02:00
96 changed files with 13794 additions and 3523 deletions
+5
View File
@@ -0,0 +1,5 @@
{
"enabledPlugins": {
"expo@claude-plugins-official": true
}
}
+14
View File
@@ -0,0 +1,14 @@
# Valeurs de développement local UNIQUEMENT
# NE JAMAIS committer .env avec de vraies valeurs
# En production, tous les secrets transitent par expo-secure-store (Android Keystore)
# URL de l'instance n8n — doit utiliser HTTPS en production
N8N_BASE_URL=https://n8n.votre-domaine.com
# Clé API n8n (Settings > API Keys dans l'interface n8n)
# Scope minimal recommandé : lecture workflows + exécutions uniquement
N8N_API_KEY=votre-cle-api-n8n
# Token custom injecté par HAProxy (header X-App-Token)
# Tourner régulièrement selon la procédure dans docs/HAPROXY.md
N8N_APP_TOKEN=votre-token-haproxy
+46
View File
@@ -0,0 +1,46 @@
# Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files
# dependencies
node_modules/
# Expo
.expo/
dist/
web-build/
expo-env.d.ts
# Native
.kotlin/
*.orig.*
*.jks
*.p8
*.p12
*.key
*.mobileprovision
# Metro
.metro-health-check*
# debug
npm-debug.*
yarn-debug.*
yarn-error.*
# macOS
.DS_Store
*.pem
# local env files — NE JAMAIS committer les vraies valeurs
.env
.env.local
.env*.local
# EAS credentials — keystore critique, sauvegarder hors git
credentials.json
# typescript
*.tsbuildinfo
# generated native folders
/ios
/android
+1
View File
@@ -0,0 +1 @@
legacy-peer-deps=true
+3
View File
@@ -0,0 +1,3 @@
# Expo HAS CHANGED
Read the exact versioned docs at https://docs.expo.dev/versions/v54.0.0/ before writing any code.
+1
View File
@@ -0,0 +1 @@
@AGENTS.md
View File
+52
View File
@@ -0,0 +1,52 @@
{
"expo": {
"name": "n8n Pilot",
"slug": "n8n-pilot",
"scheme": "n8npilot",
"version": "1.0.0",
"orientation": "portrait",
"icon": "./assets/icon.png",
"userInterfaceStyle": "dark",
"newArchEnabled": true,
"splash": {
"image": "./assets/splash-icon.png",
"resizeMode": "contain",
"backgroundColor": "#121212"
},
"ios": {
"supportsTablet": false
},
"android": {
"adaptiveIcon": {
"foregroundImage": "./assets/adaptive-icon.png",
"backgroundColor": "#121212"
},
"edgeToEdgeEnabled": true,
"package": "com.n8npilot.app",
"permissions": [
"android.permission.USE_BIOMETRIC",
"android.permission.USE_FINGERPRINT"
]
},
"web": {
"favicon": "./assets/favicon.png"
},
"plugins": [
"expo-router",
"expo-secure-store",
[
"expo-local-authentication",
{
"faceIDPermission": "Autoriser n8n Pilot à utiliser Face ID"
}
]
],
"extra": {
"router": {},
"eas": {
"projectId": "4d160555-ded1-4a82-87a7-718d02a52e69"
}
},
"owner": "billisdead"
}
}
+81
View File
@@ -0,0 +1,81 @@
import React from 'react';
import { Tabs } from 'expo-router';
import { useTheme } from 'react-native-paper';
import { MaterialCommunityIcons } from '@expo/vector-icons';
/**
* Props pour les icônes de tab — typage strict MaterialCommunityIcons.
*/
interface TabIconProps {
name: React.ComponentProps<typeof MaterialCommunityIcons>['name'];
color: string;
size: number;
}
/** Composant d'icône de tab — évite la répétition du rendu inline */
const TabIcon: React.FC<TabIconProps> = ({ name, color, size }) => (
<MaterialCommunityIcons name={name} size={size} color={color} />
);
/**
* Layout de navigation par onglets (4 tabs principaux).
* Les logs d'exécution sont accessibles via le Stack navigator (pas de tab dédié)
* pour garder la nav propre et hiérarchiquement correcte.
*/
export default function TabsLayout() {
const theme = useTheme();
return (
<Tabs
screenOptions={{
tabBarStyle: {
backgroundColor: theme.colors.surface,
borderTopColor: theme.colors.surfaceVariant,
borderTopWidth: 1,
},
tabBarActiveTintColor: theme.colors.primary,
tabBarInactiveTintColor: theme.colors.onSurfaceVariant,
headerStyle: { backgroundColor: theme.colors.surface },
headerTintColor: theme.colors.onSurface,
headerTitleStyle: { color: theme.colors.onSurface },
}}
>
<Tabs.Screen
name="index"
options={{
title: 'Dashboard',
tabBarIcon: ({ color, size }) => (
<TabIcon name="view-dashboard-outline" color={color} size={size} />
),
}}
/>
<Tabs.Screen
name="workflows"
options={{
title: 'Workflows',
tabBarIcon: ({ color, size }) => (
<TabIcon name="sitemap-outline" color={color} size={size} />
),
}}
/>
<Tabs.Screen
name="executions"
options={{
title: 'Exécutions',
tabBarIcon: ({ color, size }) => (
<TabIcon name="history" color={color} size={size} />
),
}}
/>
<Tabs.Screen
name="settings"
options={{
title: 'Paramètres',
tabBarIcon: ({ color, size }) => (
<TabIcon name="cog-outline" color={color} size={size} />
),
}}
/>
</Tabs>
);
}
+3
View File
@@ -0,0 +1,3 @@
import ExecutionsScreen from '../../src/screens/ExecutionsScreen';
export default ExecutionsScreen;
+3
View File
@@ -0,0 +1,3 @@
import DashboardScreen from '../../src/screens/DashboardScreen';
export default DashboardScreen;
+3
View File
@@ -0,0 +1,3 @@
import SettingsScreen from '../../src/screens/SettingsScreen';
export default SettingsScreen;
+3
View File
@@ -0,0 +1,3 @@
import WorkflowsScreen from '../../src/screens/WorkflowsScreen';
export default WorkflowsScreen;
+165
View File
@@ -0,0 +1,165 @@
import React, { useEffect, useState } from 'react';
import { View } from 'react-native';
import { Stack, useRouter, useSegments } from 'expo-router';
import { PaperProvider, MD3DarkTheme, ActivityIndicator, Snackbar, Button, Text } from 'react-native-paper';
import { SafeAreaProvider } from 'react-native-safe-area-context';
import { GestureHandlerRootView } from 'react-native-gesture-handler';
import * as LocalAuthentication from 'expo-local-authentication';
import { useAppStore } from '../src/store/appStore';
import { registerToastCallback } from '../src/utils/errorHandler';
/**
* Thème Material Design 3 sombre personnalisé pour n8n Pilot.
* L'orange (#FF6D3E) est la couleur d'accent principale — cohérente avec l'identité n8n.
*/
const APP_THEME = {
...MD3DarkTheme,
colors: {
...MD3DarkTheme.colors,
primary: '#FF6D3E',
primaryContainer: '#5C1C00',
secondary: '#FF9E7D',
background: '#121212',
surface: '#1E1E1E',
surfaceVariant: '#2C2C2C',
},
};
/**
* Layout racine de l'application.
* Responsabilités :
* 1. Fournit les providers globaux (GestureHandler, SafeArea, Paper)
* 2. Charge la configuration au démarrage depuis le secure store
* 3. Redirige vers /setup si aucune configuration n'existe
* 4. Enregistre le callback de toast pour l'errorHandler global
* 5. Affiche le toast d'erreur global en overlay
*/
export default function RootLayout() {
const router = useRouter();
const segments = useSegments();
const { config, preferences, isAuthenticated, loadConfig, setAuthenticated } = useAppStore();
const [isReady, setIsReady] = useState(false);
const [toastMessage, setToastMessage] = useState('');
const [toastVisible, setToastVisible] = useState(false);
/**
* Enregistre le callback de toast dans l'errorHandler au premier montage.
* Permet à toute la couche API de remonter des erreurs vers l'UI sans couplage direct.
*/
useEffect(() => {
registerToastCallback((message) => {
setToastMessage(message);
setToastVisible(true);
});
}, []);
const runBiometricAuth = async (): Promise<boolean> => {
const result = await LocalAuthentication.authenticateAsync({
promptMessage: 'Authentifiez-vous pour accéder à n8n Pilot',
cancelLabel: 'Annuler',
});
return result.success;
};
useEffect(() => {
const init = async () => {
await loadConfig();
const { preferences: prefs } = useAppStore.getState();
if (prefs.biometricEnabled) {
const success = await runBiometricAuth();
setAuthenticated(success);
} else {
setAuthenticated(true);
}
setIsReady(true);
};
init();
}, []);
const handleUnlock = async (): Promise<void> => {
const success = await runBiometricAuth();
if (success) setAuthenticated(true);
};
useEffect(() => {
if (!isReady) return;
if (preferences.biometricEnabled && !isAuthenticated) return;
const inSetup = segments[0] === 'setup';
if (!config.isConfigured && !inSetup) {
router.replace('/setup');
} else if (config.isConfigured && inSetup) {
router.replace('/(tabs)');
}
}, [isReady, config.isConfigured, isAuthenticated, preferences.biometricEnabled, segments]);
if (!isReady) {
return (
<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center', backgroundColor: '#121212' }}>
<ActivityIndicator color="#FF6D3E" size="large" />
</View>
);
}
if (preferences.biometricEnabled && !isAuthenticated) {
return (
<GestureHandlerRootView style={{ flex: 1 }}>
<SafeAreaProvider>
<PaperProvider theme={APP_THEME}>
<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center', backgroundColor: '#121212', paddingHorizontal: 32 }}>
<Text variant="headlineMedium" style={{ color: '#FF6D3E', marginBottom: 12 }}>
n8n Pilot
</Text>
<Text variant="bodyMedium" style={{ color: '#FFFFFF', marginBottom: 32, textAlign: 'center' }}>
Authentification biométrique requise
</Text>
<Button mode="contained" onPress={handleUnlock} icon="fingerprint">
Déverrouiller
</Button>
</View>
</PaperProvider>
</SafeAreaProvider>
</GestureHandlerRootView>
);
}
return (
<GestureHandlerRootView style={{ flex: 1 }}>
<SafeAreaProvider>
<PaperProvider theme={APP_THEME}>
<Stack screenOptions={{ headerShown: false }}>
<Stack.Screen name="(tabs)" />
<Stack.Screen
name="setup"
options={{
headerShown: true,
headerTitle: 'Configuration',
headerStyle: { backgroundColor: '#1E1E1E' },
headerTintColor: '#FF6D3E',
}}
/>
<Stack.Screen
name="execution/[id]"
options={{
headerShown: true,
headerTitle: "Logs d'exécution",
headerStyle: { backgroundColor: '#1E1E1E' },
headerTintColor: '#FF6D3E',
presentation: 'card',
}}
/>
</Stack>
{/* Toast global pour toutes les erreurs remontées par l'errorHandler */}
<Snackbar
visible={toastVisible}
onDismiss={() => setToastVisible(false)}
duration={4000}
style={{ backgroundColor: '#4A0000' }}
>
{toastMessage}
</Snackbar>
</PaperProvider>
</SafeAreaProvider>
</GestureHandlerRootView>
);
}
+3
View File
@@ -0,0 +1,3 @@
import LogsScreen from '../../src/screens/LogsScreen';
export default LogsScreen;
+49
View File
@@ -0,0 +1,49 @@
import React from 'react';
import { View, StyleSheet } from 'react-native';
import { Text, useTheme } from 'react-native-paper';
import SettingsScreen from '../src/screens/SettingsScreen';
/**
* Écran d'installation initiale — affiché au premier lancement.
* Partage le composant SettingsScreen avec un en-tête de bienvenue.
* Après sauvegarde, le root layout redirige automatiquement vers les tabs.
*/
export default function SetupScreen() {
const theme = useTheme();
return (
<View style={[styles.container, { backgroundColor: theme.colors.background }]}>
<View style={styles.header}>
<Text
variant="headlineMedium"
style={[styles.title, { color: theme.colors.primary }]}
>
n8n Pilot
</Text>
<Text
variant="bodyMedium"
style={{ color: theme.colors.onSurfaceVariant, textAlign: 'center' }}
>
Configurez votre instance n8n pour commencer
</Text>
</View>
<SettingsScreen />
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
},
header: {
paddingHorizontal: 24,
paddingTop: 24,
paddingBottom: 8,
alignItems: 'center',
gap: 4,
},
title: {
fontWeight: '700',
},
});
Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

+7
View File
@@ -0,0 +1,7 @@
module.exports = function (api) {
api.cache(true);
return {
presets: ['babel-preset-expo'],
plugins: ['react-native-reanimated/plugin'],
};
};
-31
View File
@@ -1,31 +0,0 @@
#!/bin/bash
# Chemin vers le fichier de valeurs
RULES_FILE="firewall_rules.txt"
# Vérifier si le fichier de valeurs existe
if [[ ! -f "$RULES_FILE" ]]; then
echo "Le fichier de valeurs $RULES_FILE n'existe pas."
exit 1
fi
# Sauvegarder la configuration actuelle de firewalld
TIMESTAMP=$(date +%Y%m%d%H%M%S)
BACKUP_DIR="/etc/firewalld/backup"
BACKUP_FILE="$BACKUP_DIR/firewalld_backup_$TIMESTAMP"
mkdir -p "$BACKUP_DIR"
cp -r /etc/firewalld/* "$BACKUP_FILE"
echo "Configuration actuelle sauvegardée dans $BACKUP_FILE"
# Lire le fichier de valeurs et ajouter les règles
while IFS=: read -r IP PORT; do
# Ajouter la règle sans supprimer les règles existantes
firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='$IP' port port='$PORT' protocol='tcp' accept"
done < "$RULES_FILE"
# Recharger la configuration de firewalld pour appliquer les changements
firewall-cmd --reload
echo "Les nouvelles règles ont été ajoutées et la configuration a été rechargée."
-247
View File
@@ -1,247 +0,0 @@
--
-- Cross-origin Request Sharing (CORS) implementation for HAProxy Lua host
--
-- CORS RFC:
-- https://www.w3.org/TR/cors/
--
-- Copyright (c) 2019. Nick Ramirez <nramirez@haproxy.com>
-- Copyright (c) 2019. HAProxy Technologies, LLC.
local M={}
-- Loops through array to find the given string.
-- items: array of strings
-- test_str: string to search for
function contains(items, test_str)
for _,item in pairs(items) do
if item == test_str then
return true
end
end
return false
end
M.wildcard_origin_allowed = function(allowed_origins)
if contains(allowed_origins, "*") then
return "*"
end
return nil
end
M.specifies_scheme = function(s)
return string.find(s, "^%a+://") ~= nil
end
M.specifies_generic_scheme = function(s)
return string.find(s, "^//") ~= nil
end
M.begins_with_dot = function(s)
return string.find(s, "^%.") ~= nil
end
M.trim = function(s)
return s:gsub("%s+", "")
end
M.build_pattern = function(pattern)
-- remove spaces
pattern = M.trim(pattern)
if pattern ~= nil and pattern ~= '' then
-- if there is no scheme and the pattern does not begin with a dot,
-- add the generic scheme to the beginning of the pattern
if M.specifies_scheme(pattern) == false and M.specifies_generic_scheme(pattern) == false and M.begins_with_dot(pattern) == false then
pattern = "//" .. pattern
end
-- escape dots and dashes in pattern
pattern = pattern:gsub("([%.%-])", "%%%1")
-- an asterisk for the port means allow all ports
if string.find(pattern, "[:]+%*$") ~= nil then
pattern = pattern:gsub("[:]+%*$", "[:]+[0-9]+")
end
-- append end character
pattern = pattern .. "$"
return pattern
end
return nil
end
-- If the given origin is found within the allowed_origins string, it is returned. Otherwise, nil is returned.
-- origin: The value from the 'origin' request header
-- allowed_origins: Comma-delimited list of allowed origins. (e.g. localhost,https://localhost:8080,//test.com)
-- e.g. localhost : allow http(s)://localhost
-- e.g. //localhost : allow http(s)://localhost
-- e.g. https://mydomain.com : allow only HTTPS of mydomain.com
-- e.g. http://mydomain.com : allow only HTTP of mydomain.com
-- e.g. http://mydomain.com:8080 : allow only HTTP of mydomain.com from port 8080
-- e.g. //mydomain.com : allow only http(s)://mydomain.com
-- e.g. .mydomain.com : allow ALL subdomains of mydomain.com from ALL source ports
-- e.g. .mydomain.com:443 : allow ALL subdomains of mydomain.com from default HTTPS source port
--
-- e.g. ".mydomain.com:443, //mydomain.com:443, //localhost"
-- allows all subdomains and main domain of mydomain.com only for HTTPS from default HTTPS port and allows
-- all HTTP and HTTPS connections from ALL source port for localhost
--
M.get_allowed_origin = function(origin, allowed_origins)
if origin ~= nil then
-- if wildcard (*) is allowed, return it, which allows all origins
wildcard_origin = M.wildcard_origin_allowed(allowed_origins)
if wildcard_origin ~= nil then
return wildcard_origin
end
for index, allowed_origin in ipairs(allowed_origins) do
pattern = M.build_pattern(allowed_origin)
if pattern ~= nil then
if origin:match(pattern) then
core.Debug("Test: " .. pattern .. ", Origin: " .. origin .. ", Match: yes")
return origin
else
core.Debug("Test: " .. pattern .. ", Origin: " .. origin .. ", Match: no")
end
end
end
end
return nil
end
-- Adds headers for CORS preflight request and then attaches them to the response
-- after it comes back from the server. This works with versions of HAProxy prior to 2.2.
-- The downside is that the OPTIONS request must be sent to the backend server first and can't
-- be intercepted and returned immediately.
-- txn: The current transaction object that gives access to response properties
-- allowed_methods: Comma-delimited list of allowed HTTP methods. (e.g. GET,POST,PUT,DELETE)
-- allowed_headers: Comma-delimited list of allowed headers. (e.g. X-Header1,X-Header2)
function preflight_request_ver1(txn, allowed_methods, allowed_headers)
core.Debug("CORS: preflight request received")
txn.http:res_set_header("Access-Control-Allow-Methods", allowed_methods)
txn.http:res_set_header("Access-Control-Allow-Headers", allowed_headers)
txn.http:res_set_header("Access-Control-Max-Age", 600)
core.Debug("CORS: attaching allowed methods to response")
end
-- Add headers for CORS preflight request and then returns a 204 response.
-- The 'reply' function used here is available in HAProxy 2.2+. It allows HAProxy to return
-- a reply without contacting the server.
-- txn: The current transaction object that gives access to response properties
-- origin: The value from the 'origin' request header
-- allowed_methods: Comma-delimited list of allowed HTTP methods. (e.g. GET,POST,PUT,DELETE)
-- allowed_origins: Comma-delimited list of allowed origins. (e.g. localhost,localhost:8080,test.com)
-- allowed_headers: Comma-delimited list of allowed headers. (e.g. X-Header1,X-Header2)
function preflight_request_ver2(txn, origin, allowed_methods, allowed_origins, allowed_headers)
core.Debug("CORS: preflight request received")
local reply = txn:reply()
reply:set_status(204, "No Content")
reply:add_header("Content-Type", "text/html")
reply:add_header("Access-Control-Allow-Methods", allowed_methods)
reply:add_header("Access-Control-Allow-Headers", allowed_headers)
reply:add_header("Access-Control-Max-Age", 600)
local allowed_origin = M.get_allowed_origin(origin, allowed_origins)
if allowed_origin == nil then
core.Debug("CORS: " .. origin .. " not allowed")
else
core.Debug("CORS: " .. origin .. " allowed")
reply:add_header("Access-Control-Allow-Origin", allowed_origin)
if allowed_origin ~= "*" then
reply:add_header("Vary", "Accept-Encoding,Origin")
end
end
core.Debug("CORS: Returning reply to preflight request")
txn:done(reply)
end
-- When invoked during a request, captures the origin header if present and stores it in a private variable.
-- If the request is OPTIONS and it is a supported version of HAProxy, returns a preflight request reply.
-- Otherwise, the preflight request header is added to the response after it has returned from the server.
-- txn: The current transaction object that gives access to response properties
-- allowed_methods: Comma-delimited list of allowed HTTP methods. (e.g. GET,POST,PUT,DELETE)
-- allowed_origins: Comma-delimited list of allowed origins. (e.g. localhost,localhost:8080,test.com)
-- allowed_headers: Comma-delimited list of allowed headers. (e.g. X-Header1,X-Header2)
function cors_request(txn, allowed_methods, allowed_origins, allowed_headers)
local headers = txn.http:req_get_headers()
local transaction_data = {}
local origin = nil
local allowed_origins = core.tokenize(allowed_origins, ",")
if headers["origin"] ~= nil and headers["origin"][0] ~= nil then
core.Debug("CORS: Got 'Origin' header: " .. headers["origin"][0])
origin = headers["origin"][0]
end
-- Bail if client did not send an Origin
-- for example, it may be a regular OPTIONS request that is not a CORS preflight request
if origin == nil or origin == '' then
return
end
transaction_data["origin"] = origin
transaction_data["allowed_methods"] = allowed_methods
transaction_data["allowed_origins"] = allowed_origins
transaction_data["allowed_headers"] = allowed_headers
txn:set_priv(transaction_data)
local method = txn.sf:method()
transaction_data["method"] = method
if method == "OPTIONS" and txn.reply ~= nil then
preflight_request_ver2(txn, origin, allowed_methods, allowed_origins, allowed_headers)
end
end
-- When invoked during a response, sets CORS headers so that the browser can read the response from permitted domains.
-- txn: The current transaction object that gives access to response properties.
function cors_response(txn)
local transaction_data = txn:get_priv()
if transaction_data == nil then
return
end
local origin = transaction_data["origin"]
local allowed_origins = transaction_data["allowed_origins"]
local allowed_methods = transaction_data["allowed_methods"]
local allowed_headers = transaction_data["allowed_headers"]
local method = transaction_data["method"]
-- Bail if client did not send an Origin
if origin == nil or origin == '' then
return
end
local allowed_origin = M.get_allowed_origin(origin, allowed_origins)
if allowed_origin == nil then
core.Debug("CORS: " .. origin .. " not allowed")
else
if method == "OPTIONS" and txn.reply == nil then
preflight_request_ver1(txn, allowed_methods, allowed_headers)
end
core.Debug("CORS: " .. origin .. " allowed")
txn.http:res_set_header("Access-Control-Allow-Origin", allowed_origin)
if allowed_origin ~= "*" then
txn.http:res_add_header("Vary", "Accept-Encoding,Origin")
end
end
end
-- Register the actions with HAProxy
core.register_action("cors", {"http-req"}, cors_request, 3)
core.register_action("cors", {"http-res"}, cors_response, 0)
return M
+89
View File
@@ -0,0 +1,89 @@
# Sauvegarde de n8n Pilot
## Ce qu'il faut sauvegarder
### 1. Credentials de signature EAS (`credentials.json`)
**Où** : généré par EAS lors du premier build dans `~/.eas/` ou téléchargeable depuis le dashboard Expo.
**Pourquoi** : sans le keystore de signature, il est **impossible** de mettre à jour l'APK sur un appareil
qui a déjà la version signée avec ce keystore. Android refuse les mises à jour avec un keystore différent.
**Comment sauvegarder** :
```bash
# Télécharger les credentials depuis EAS
eas credentials
# Choisir : Android > Keystore > Download
# Sauvegarder le fichier .jks et les mots de passe associés
```
> **Criticalité : MAXIMALE** — perte du keystore = obligation de désinstaller l'app sur tous les appareils
> avant de pouvoir installer une nouvelle version.
---
### 2. Fichier `.env` de développement
**Où** : racine du projet (jamais dans git)
**Pourquoi** : contient l'URL de l'instance, la clé API et le token HAProxy pour l'environnement de dev.
Sans ce fichier, les développeurs doivent reconfigurer manuellement l'environnement.
**Comment sauvegarder** : gestionnaire de mots de passe (Bitwarden, 1Password, Vault) avec les champs :
- `N8N_BASE_URL`
- `N8N_API_KEY`
- `N8N_APP_TOKEN`
---
### 3. Configuration EAS (`eas.json`)
**Où** : racine du projet, **committé dans git**
**Pourquoi** : définit les profils de build (development, preview, production).
**Statut** : déjà sauvegardé via git — aucune action supplémentaire requise.
---
### 4. Données utilisateur sur l'appareil
Les credentials (URL, clé API, token) sont chiffrés dans l'**Android Keystore** de l'appareil.
Ils ne sont **pas** sauvegardés dans les sauvegardes Android standard (par conception de sécurité).
**Conséquence** : après réinitialisation usine ou changement d'appareil, l'utilisateur doit
reconfigurer l'app depuis l'écran Paramètres.
---
## Fréquence recommandée
| Élément | Fréquence | Stockage |
|---------|-----------|----------|
| Keystore EAS | À chaque rotation + après génération | Coffre chiffré hors-ligne |
| `.env` dev | À chaque rotation des tokens | Gestionnaire de mots de passe |
| Code source | En continu via git push | Gitea self-hosted |
---
## Procédure de restauration
### Restaurer le keystore
```bash
# Uploader le keystore sauvegardé vers EAS
eas credentials
# Choisir : Android > Keystore > Upload existing keystore
```
### Restaurer l'environnement de développement
```bash
git clone https://homegit.gyozamancave.fr/billisdead/n8n-mobile.git
cd n8n-mobile
cp .env.example .env
# Remplir .env depuis le gestionnaire de mots de passe
npm install --legacy-peer-deps
```
+96
View File
@@ -0,0 +1,96 @@
# Configuration HAProxy pour n8n Pilot
## Contexte
n8n est déjà exposé via HAProxy à `https://n8n.gyozamancave.fr`.
Il suffit d'ajouter la validation du `X-App-Token` dans le backend existant **sans toucher au frontend**.
---
## Modification à apporter — backend n8n uniquement
Remplacer le backend `n8n-backend` actuel par :
```haproxy
backend n8n-backend
mode http
balance source
# IPs qui ne nécessitent pas le X-App-Token (LAN + IP fixe perso)
acl is_local src 192.168.1.0/24 192.168.2.0/24 82.67.3.126/32
# Validation du token pour les accès extérieurs (mobile app)
acl valid_app_token req.hdr(X-App-Token) -m str "VOTRE_TOKEN_ICI"
http-request deny deny_status 403 if !is_local !valid_app_token
# Supprimer le token avant de forwarder à n8n (n8n ne doit pas le voir)
http-request del-header X-App-Token
http-request set-header X-Forwarded-Proto https if { ssl_fc }
http-request set-header X-Real-IP %[src]
http-request set-header X-Forwarded-For %[src]
http-request set-header Host %[req.hdr(host)]
option forwardfor
server n8n 192.168.1.56:5678
```
**Logique** :
- Depuis le LAN (`192.168.1/2.x`) ou ton IP fixe → accès direct, pas de token requis (navigation normale dans n8n)
- Depuis l'extérieur (mobile app 4G/5G) → `X-App-Token` obligatoire, sinon 403
---
## Appliquer la modification
```bash
# Valider la syntaxe avant rechargement
haproxy -f /etc/haproxy/haproxy.cfg -c
# Rechargement gracieux (sans coupure)
systemctl reload haproxy
```
---
## Générer un token solide
```bash
openssl rand -hex 32
```
Copier la valeur générée dans :
1. La config HAProxy (`VOTRE_TOKEN_ICI` ci-dessus)
2. L'app Android : Paramètres > Token HAProxy > Sauvegarder
---
## Rotation du token
1. Générer un nouveau token (`openssl rand -hex 32`)
2. Ajouter temporairement les **deux** ACLs dans HAProxy pour éviter les coupures :
```haproxy
acl valid_app_token req.hdr(X-App-Token) -m str "ANCIEN_TOKEN"
acl valid_app_token_new req.hdr(X-App-Token) -m str "NOUVEAU_TOKEN"
http-request deny deny_status 403 if !is_local !valid_app_token !valid_app_token_new
```
3. Mettre à jour le token dans l'app (Paramètres > Token HAProxy)
4. Retirer l'ancien token de la config HAProxy
5. `systemctl reload haproxy`
---
## Troubleshooting
**403 depuis l'app** → token absent ou incorrect. Tester :
```bash
curl -v -H "X-App-Token: VOTRE_TOKEN" https://n8n.gyozamancave.fr/api/v1/workflows
```
**403 depuis le navigateur** → vérifier que l'IP source est bien dans `is_local`. Depuis un VPN ou tethering, l'IP peut ne pas matcher.
**Logs HAProxy en direct** :
```bash
journalctl -u haproxy -f
```
+136
View File
@@ -0,0 +1,136 @@
# Installation de n8n Pilot
## Prérequis
| Outil | Version minimale | Rôle |
|-------|-----------------|------|
| Node.js | 20 LTS | Runtime JS |
| npm | 10+ | Gestionnaire de paquets |
| EAS CLI | 3.0+ | Build cloud Expo |
| Android | 8.0 (API 26) | Cible minimum |
| Compte Expo | gratuit | Build EAS |
```bash
# Vérifier les prérequis
node --version # >= 20
npm --version # >= 10
eas --version # >= 3.0 (après install)
```
---
## 1. Cloner le dépôt
```bash
git clone https://homegit.gyozamancave.fr/billisdead/n8n-mobile.git
cd n8n-mobile
```
---
## 2. Installer les dépendances
```bash
npm install --legacy-peer-deps
```
---
## 3. Configurer l'environnement de développement
Copiez le fichier exemple et remplissez vos valeurs **localement uniquement** :
```bash
cp .env.example .env
# Éditez .env avec votre URL, clé API et token HAProxy
```
> ⚠️ Le fichier `.env` est dans `.gitignore` — ne jamais le committer.
> En production, les secrets transitent **uniquement** par `expo-secure-store`.
---
## 4. Lancer en développement
```bash
# Démarrer le serveur Metro
npm start
# Sur appareil Android (USB ou WiFi) ou émulateur
npm run android
```
Pour le développement, l'app vous demandera de saisir l'URL et la clé API
directement dans l'écran Paramètres — elles seront stockées dans le Keystore Android.
---
## 5. Installer EAS CLI
```bash
npm install -g eas-cli
eas login # Connectez-vous avec votre compte Expo
```
---
## 6. Configurer le projet EAS
```bash
# Initialise l'ID de projet Expo (première fois uniquement)
eas init
# Vérifie la configuration
eas build:configure
```
---
## 7. Builder l'APK (profil preview)
```bash
# Build Android APK — exécuté dans le cloud Expo
eas build --platform android --profile preview
```
Le build prend environ 1015 minutes. EAS envoie un email avec le lien de téléchargement.
Pour un build local (nécessite Android Studio + JDK 17) :
```bash
eas build --platform android --profile preview --local
```
---
## 8. Sideloader l'APK sur Android
### Via ADB
```bash
# Connecter l'appareil en USB avec le débogage USB activé
adb devices
# Installer l'APK
adb install chemin/vers/n8n-pilot.apk
```
### Manuellement
1. Transférez l'APK sur l'appareil (câble, Google Drive, etc.)
2. Ouvrez l'APK depuis le gestionnaire de fichiers
3. Autorisez l'installation depuis des sources inconnues si demandé
4. Suivez l'assistant d'installation
---
## 9. Premier lancement
Au premier démarrage, l'écran de configuration apparaît automatiquement :
1. Saisissez l'URL HTTPS de votre instance n8n
2. Collez votre clé API n8n (Settings > API Keys dans n8n)
3. Saisissez le token HAProxy si applicable
4. Appuyez sur **Sauvegarder**
Les credentials sont chiffrés dans l'Android Keystore — ils ne quittent jamais l'appareil.
+147
View File
@@ -0,0 +1,147 @@
# Sécurité — n8n Pilot
## Modèle de menaces
### Acteurs et vecteurs
| Menace | Impact | Probabilité | Mitigation |
|--------|--------|-------------|-----------|
| Vol de l'appareil Android | Accès aux credentials n8n | Moyen | Android Keystore chiffré, biométrie optionnelle |
| Interception réseau (MITM) | Exposition de la clé API | Faible (TLS) | TLS obligatoire, refus HTTP |
| Fuite du token HAProxy | Accès non autorisé à n8n | Moyen | Rotation régulière, token hors bundle |
| Compromission du build APK | Backdoor dans l'app | Faible | Keystore signé, builds EAS reproductibles |
| Brute force API | Épuisement quotas n8n | Faible | Rate limiting HAProxy (429) |
| Logs applicatifs exposés | Fuite de secrets | Faible | Jamais de log de secrets, même en dev |
---
## Principes appliqués
### Least Privilege (moindre privilège)
La clé API n8n doit être créée avec le **scope minimal** nécessaire :
```
Recommandé :
✓ workflows:list — lister les workflows
✓ workflows:read — lire les détails
✓ workflows:update — activer/désactiver (toggle)
✓ executions:list — voir l'historique
✓ executions:read — lire les logs
✓ executions:delete — supprimer des exécutions
✓ workflows:run — déclencher manuellement
Non recommandé :
✗ credentials:* — inutile pour cette app
✗ users:* — inutile pour cette app
✗ admin:* — jamais
```
**Comment créer la clé** dans n8n :
1. Settings > n8n API
2. Create API Key
3. Nommer la clé "n8n-pilot-mobile"
4. Définir les scopes minimaux ci-dessus
5. Copier la clé — elle n'est affichée qu'une seule fois
---
### Defense in Depth (défense en profondeur)
L'accès à l'API n8n passe par **deux barrières indépendantes** :
```
Requête → [TLS] → [X-App-Token HAProxy] → [X-N8N-API-KEY n8n] → Données
```
Si un token est compromis :
- Compromission du `X-App-Token` seul → HAProxy bloque, n8n jamais atteint
- Compromission de la clé API seul → sans le `X-App-Token`, HAProxy bloque à 403
- Les deux compromis → rotation immédiate des deux (procédures dans HAPROXY.md et BACKUP.md)
---
### Zero Trust (réseau local inclus)
n8n ne doit **pas** être accessible directement sur le réseau, même en local.
Toutes les requêtes passent par HAProxy qui valide le token.
```
# Bloquer l'accès direct au port n8n (iptables)
iptables -A INPUT -p tcp --dport 5678 -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -p tcp --dport 5678 -j DROP
```
---
## Gestion des secrets — cycle de vie
### Stockage
```
┌─────────────────────────────────────────────────────┐
│ Appareil Android │
│ ┌─────────────────────────────────────────────┐ │
│ │ Android Keystore (expo-secure-store) │ │
│ │ n8n_base_url → https://n8n.example.com │ │
│ │ n8n_api_key → clé API (chiffrée) │ │
│ │ n8n_app_token → token HAProxy (chiffré) │ │
│ └─────────────────────────────────────────────┘ │
│ │
│ État React (Zustand) — en mémoire uniquement : │
│ config.baseUrl → copie non sensible │
│ config.isConfigured → booléen │
│ JAMAIS : apiKey, appToken en mémoire JS │
└─────────────────────────────────────────────────────┘
```
### Transit
- Les secrets sont lus depuis le Keystore **à chaque requête** HTTP dans `client.ts`
- Ils sont injectés dans les headers HTTP et **ne sont pas loggués**
- Ils ne sont **jamais** :
- Sérialisés dans AsyncStorage
- Inclus dans des logs (même en dev)
- Embarqués dans le bundle JS (`app.json`, `package.json`, code source)
- Envoyés à des services tiers (analytics, crash reporters)
### Rotation
| Secret | Fréquence recommandée | Procédure |
|--------|-----------------------|-----------|
| Clé API n8n | Tous les 180 jours, ou en cas de compromission | Créer nouvelle clé dans n8n, mettre à jour dans l'app |
| X-App-Token | Tous les 90 jours | Voir docs/HAPROXY.md |
| Keystore EAS | Jamais (sauf compromission) | Voir docs/BACKUP.md |
---
## Checklist avant mise en production
### Application
- [ ] `app.json` : `userInterfaceStyle` = `"dark"` (pas d'info sensible en clair)
- [ ] `.env` non commité dans git (`git status` ne montre pas `.env`)
- [ ] Aucun `console.log` de valeurs sensibles dans le code
- [ ] `__DEV__` gate sur tous les logs dans `errorHandler.ts`
- [ ] Expo SDK à jour — vérifier les CVE : `npx expo-doctor`
- [ ] Dépendances à jour : `npm audit`
### Infrastructure
- [ ] HAProxy : TLS 1.2 minimum, TLS 1.0/1.1 désactivés
- [ ] Certificat TLS valide et non expiré
- [ ] n8n inaccessible directement sur le port 5678 depuis l'extérieur
- [ ] Rate limiting HAProxy activé (429 configuré)
- [ ] Logs HAProxy ne contiennent pas les valeurs des headers secrets
### n8n
- [ ] Clé API avec scope minimal (voir § Least Privilege ci-dessus)
- [ ] n8n mis à jour vers la dernière version stable
- [ ] Sauvegardes n8n actives (workflows, credentials n8n)
### Appareil
- [ ] Verrouillage d'écran activé (PIN, pattern ou biométrie)
- [ ] Biométrie configurée dans l'app si disponible
- [ ] Appareil Android 8+ (API 26+) pour garantir la robustesse du Keystore
+78
View File
@@ -0,0 +1,78 @@
# Mise à jour de n8n Pilot
## Processus de mise à jour
### 1. Récupérer les changements
```bash
git pull origin main
npm install --legacy-peer-deps
```
### 2. Bumper la version
Éditez `app.json` et incrémentez `version` :
```json
{
"expo": {
"version": "1.1.0",
"android": {
"versionCode": 2
}
}
}
```
> **Règle** : `versionCode` doit être strictement supérieur à la version précédente.
> `version` suit [semver](https://semver.org/) : MAJEUR.MINEUR.CORRECTIF
### 3. Rebuilder l'APK
```bash
eas build --platform android --profile preview
```
### 4. Distribuer la mise à jour
#### Option A — Sideload manuel
Répétez la procédure de sideload (voir INSTALL.md § 8) avec le nouvel APK.
L'Android Package Manager gère la mise à jour en place si le `versionCode` est supérieur.
#### Option B — OTA (Over The Air) via Expo Updates
Pour les mises à jour mineures (JS uniquement, pas de changements natifs) :
```bash
eas update --branch production --message "Fix: correction du polling"
```
L'app télécharge la mise à jour au prochain démarrage si elle est connectée.
> **Important** : les changements dans `app.json`, l'ajout de plugins natifs
> ou la modification des permissions nécessitent un rebuild APK complet.
---
## Vérifications avant release
- [ ] Tests sur appareil physique (pas seulement émulateur)
- [ ] Vérifier que la connexion à l8n fonctionne avec les nouvelles données
- [ ] Valider le polling sur WiFi et données mobiles
- [ ] Vérifier que les secrets restent dans le Keystore après mise à jour
- [ ] Contrôler les logs Android (`adb logcat`) pour des erreurs inattendues
---
## Rollback
En cas de régression critique :
```bash
# Revenir au commit précédent
git revert HEAD
# Rebuilder et redéployer la version précédente
eas build --platform android --profile preview
```
+29
View File
@@ -0,0 +1,29 @@
{
"cli": {
"version": ">= 3.0.0"
},
"build": {
"development": {
"developmentClient": true,
"distribution": "internal",
"android": {
"buildType": "apk"
}
},
"preview": {
"distribution": "internal",
"android": {
"buildType": "apk",
"gradleCommand": ":app:assembleRelease"
}
},
"production": {
"android": {
"buildType": "apk"
}
}
},
"submit": {
"production": {}
}
}
-12
View File
@@ -1,12 +0,0 @@
192.168.1.130:8123
192.168.1.250:2369
192.168.1.112:8065
127.0.0.1:9080
127.0.0.1:22
192.168.1.18:32149
192.168.1.18:32133
192.168.1.13:5080
192.168.1.18:32120
192.168.1.108:5002
-374
View File
@@ -1,374 +0,0 @@
global
lua-load /etc/haproxy/cors/cors.lua
log /dev/log local0
log /dev/log local1 notice
log 127.0.0.1 local2
log-send-hostname
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
stats socket /var/run/haproxy.sock mode 660 level admin expose-fd listeners
stats timeout 30s
maxconn 30000
user haproxy
group haproxy
daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# Default ciphers to use on SSL-enabled listening sockets.
# For more information, see ciphers(1SSL). This list is from:
# https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
# An alternative list with additional directives can be obtained from
# https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=haproxy
#ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
#ssl-default-bind-options no-sslv3
tune.ssl.default-dh-param 2048
# intermediate configuration
ssl-default-bind-curves X25519:prime256v1:secp384r1
ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-bind-options prefer-client-ciphers ssl-min-ver TLSv1.2 no-tls-tickets
ssl-default-server-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305
ssl-default-server-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-server-options ssl-min-ver TLSv1.2 no-tls-tickets
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 600s
timeout server 600s
timeout http-request 5s
option http-buffer-request
http-errors kitties
errorfile 400 /etc/haproxy/http-cat-errors/400.http
errorfile 403 /etc/haproxy/http-cat-errors/403.http
errorfile 408 /etc/haproxy/http-cat-errors/408.http
errorfile 500 /etc/haproxy/http-cat-errors/500.http
errorfile 502 /etc/haproxy/http-cat-errors/502.http
errorfile 503 /etc/haproxy/http-cat-errors/503.http
errorfile 504 /etc/haproxy/http-cat-errors/504.http
userlist admin-ghost
group is-admin
user admin password $5$ITvxQNSy4YoUQdNm$p/2D8ey05ZI3KC2gpRun4OKNsomFS8xJnNd0M4P0zeB # $5$... (générez avec: printf "votrepassword" | mkpasswd --method=sha-256 --stdout)
#frontend http_in
# bind *:80
# maxconn 500
# http-request track-sc0 src table per_ip_rates
# http-request deny deny_status 429 if { sc_http_req_rate(0) gt 100 }
# http-request silent-drop if { sc_http_req_rate(0) gt 100 }
# acl acl_letsencrypt path_beg /.well-known/acme-challenge/
#
# redirect scheme https if !acl_letsencrypt !{ ssl_fc }
# use_backend be_letsencrypt if acl_letsencrypt
#frontend smtp_front
# bind *:587
# mode tcp
# option tcplog
# default_backend smtp_back
#backend smtp_back
# mode tcp
# server postfix_server 192.168.1.17:587 check
frontend https
bind *:443,[::]:443 ssl crt /etc/haproxy/ssl/ strict-sni alpn http/1.1
#bind *:443,[::]:443 ssl crt /etc/haproxy/ssl/ strict-sni alpn h2,http/1.1
# headers
#http-request set-header Host homegit.gyozamancave.fr
#http-request set-header Host %[req.hdr(Host)]
#http-request set-header X-Real-IP %[src]
http-request set-header X-Forwarded-Proto https if { ssl_fc }
http-request set-header X-Forwarded-Proto http if !{ ssl_fc }
http-request set-header X-Forwarded-For %[src]
http-request track-sc0 src table per_ip_rates
http-request silent-drop if { sc_http_req_rate(0) gt 100 }
# config httpcats
errorfiles kitties
http-response return status 400 default-errorfiles if { status 400 }
http-response return status 401 default-errorfiles if { status 401 }
http-response return status 403 default-errorfiles if { status 403 }
http-response return status 404 default-errorfiles if { status 404 }
http-response return status 408 default-errorfiles if { status 408 }
http-response return status 500 default-errorfiles if { status 500 }
http-response return status 502 default-errorfiles if { status 502 }
http-response return status 503 default-errorfiles if { status 503 }
http-response return status 504 default-errorfiles if { status 504 }
# Redirection 301 pour links.billisdead.com
acl is_billisdead hdr(host) -i links.billisdead.com
http-request redirect code 301 location https://links.mrteddybear.fr/@billisdead.com if is_billisdead
## config antiDDOS
acl homegit-host hdr(host) -i homegit.gyozamancave.fr
# Suivi du taux de requêtes par IP
stick-table type ip size 1m expire 10m store http_req_rate(10s)
http-request track-sc0 src unless homegit-host
# ACL pour whitelister ton domaine n8n
acl n8n_domain hdr_end(host) -i gyozamancave.fr
# Whitelist IP perso (optionnel)
acl my_ip src 82.67.3.126
acl my_lan1 src 192.168.1.0/24
acl my_lan2 src 192.168.2.0/24
# Autoriser ton domaine (ou ton IP) à passer sans rate-limit
http-request allow if n8n_domain
http-request allow if my_ip
http-request allow if my_lan1
http-request allow if my_lan2
# Appliquer la rate-limit globale pour le reste
http-request deny deny_status 429 if { sc0_http_req_rate gt 100 }
# BEGIN CORS
#capture request header origin len 128
#http-response set-header Access-Control-Allow-Origin "*"
#http-response set-header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept, Authorization, JSNLog-RequestId, activityId, applicationId, applicationUserId, channelId, senderId, sessionId"
#http-response set-header Access-Control-Max-Age 3628800
#http-response set-header Access-Control-Allow-Methods "GET, DELETE, OPTIONS, POST, PUT"
# END CORS
acl cms-host hdr(host) -i mrteddybear.fr
acl links-host hdr(host) -i links.mrteddybear.fr
acl cms2-host hdr(host) -i billisdead.com
acl mattermost-host hdr(host) -i mattermost.gyozamancave.fr
acl nextcloud-host hdr(host) -i nextcloud.gyozamancave.fr
acl funkwhale-host hdr(host) -i funkwhale.gyozamancave.fr
acl wiki-host hdr(host) -i wiki.gyozamancave.fr
acl hass-host hdr(host) -i hass.gyozamancave.fr
acl postiz-host hdr(host) -i postiz.gyozamancave.fr
acl stats-host hdr(host) -i stats.gyozamancave.fr
acl stats-api hdr(host) -i api.stats.gyozamancave.fr
acl n8n-host hdr(host) -i n8n.gyozamancave.fr
#acl homegit-host hdr(host) -i homegit.gyozamancave.fr
#acl boudoir-assets path_beg /assets/
#acl path_og path_beg /og/
acl boudoir-host hdr(host) -i ledigitalboudoir.com
#acl is_api path -m beg -i /api
use_backend cms if cms-host
use_backend links-mtb if links-host
use_backend cms2 if cms2-host
use_backend mattermost if mattermost-host
use_backend nextcloud if nextcloud-host
use_backend funkwhale if funkwhale-host
use_backend wiki if wiki-host
use_backend hass-backend if hass-host
use_backend postiz-backend if postiz-host
use_backend stats-backend-api if stats-api
use_backend stats-backend if stats-host
use_backend n8n-backend if n8n-host
use_backend homegit-backend if homegit-host
#use_backend boudoir-assets-backend if path_og
#use_backend boudoir-assets-backend if boudoir-assets
use_backend boudoir-backend if boudoir-host
#backend boudoir-assets-backend
# mode http
# En-têtes HTTPS corrects pour Directus
# http-request set-header X-Forwarded-Proto https
# http-request set-header X-Forwarded-Host ledigitalboudoir.com
# http-request set-header X-Forwarded-For %[src]
# Route principale OG :
# https://ledigitalboudoir.com/og/<id>.jpg
# → /assets/<id>?format=jpg&width=1200&height=630&fit=contain&bg=black
# http-request replace-path ^/og/(.*)\.jpg$ /assets/\1?format=jpg&width=1200&height=630&fit=contain&bg=black
# Variante cache-busting (ex: .../og/<id>-v2.jpg)
# http-request replace-path ^/og/(.*)-v[0-9]+\.jpg$ /assets/\1?format=jpg&width=1200&height=630&fit=contain&bg=black
# Cache long (1 semaine)
# http-response set-header Cache-Control public,max-age=604800,immutable
# Autoriser uniquement assets/uploads
# acl allowed_assets path_beg /assets/ /uploads/
# http-request deny unless allowed_assets
# Serveur Directus interne
# server directus 192.168.1.107:8055 check
#backend boudoir-backend
# server boudoir 192.168.1.57:2368
backend boudoir-backend
acl ghost_path path_beg /ghost/
acl is_whitelisted src 82.67.3.126/32
acl is_lan src 192.168.1.0/24 # Plage LAN (adaptez 192.168.1.0/24 si précis)
acl is_lan2 src 192.168.2.0/24 # Plage LAN (adaptez 192.168.1.0/24 si précis)
acl is_whitelisted_full src 82.67.3.126/32 192.168.1.0/24 192.168.2.0/24 # Combine
acl admin_auth http_auth_group(admin-ghost) is-admin
# Deny /ghost/ hors IP white
http-request deny if ghost_path !is_whitelisted_full
server boudoir 192.168.1.57:2368 check
#backend boudoir-backend
# server boudoir 192.168.1.107:31723 check
backend homegit-backend
mode http
# S'assurer que le header n'est pas supprimé
http-response add-header WWW-Authenticate Basic\ realm="Gitea"
server homegit 192.168.1.70:3000 check
backend stats-backend-api
server api_stats 192.168.1.58:8080
backend stats-backend
#option forwardfor
server stats 192.168.1.58:8081
backend n8n-backend
mode http
option forwardfor
server n8n 192.168.1.56:5678
backend links-mtb
#http-request set-header X-Forwarded-Proto https if { ssl_fc }
#http-request set-header X-Forwarded-Proto http if !{ ssl_fc }
#http-request set-header X-Forwarded-For %[src]
mode http
#option forwardfor
server links 192.168.1.18:32508 check ssl verify none
backend hass-backend
server hass 192.168.1.18:30250
mode http
# option forwardfor
# http-request add-header X-Forwarded-Proto https
# http-request add-header X-Forwarded-Port 443
backend cms
#server cms 192.168.1.101:80
acl ghost_path path_beg /ghost/
acl is_whitelisted src 82.67.3.126/32
acl is_lan src 192.168.1.0/24 # Plage LAN (adaptez 192.168.1.0/24 si précis)
acl is_lan2 src 192.168.2.0/24 # Plage LAN (adaptez 192.168.1.0/24 si précis)
acl is_whitelisted_full src 82.67.3.126/32 192.168.1.0/24 192.168.2.0/24 # Combine
acl admin_auth http_auth_group(admin-ghost) is-admin
# Deny /ghost/ hors IP white
http-request deny if ghost_path !is_whitelisted_full
server cms 192.168.1.250:2369
backend cms2
#mode http
acl ghost_path path_beg /ghost/
acl is_whitelisted src 82.67.3.126/32
acl is_lan src 192.168.1.0/24 # Plage LAN (adaptez 192.168.1.0/24 si précis)
acl is_lan2 src 192.168.2.0/24 # Plage LAN (adaptez 192.168.1.0/24 si précis)
acl is_whitelisted_full src 82.67.3.126/32 192.168.1.0/24 192.168.2.0/24 # Combine
acl admin_auth http_auth_group(admin-ghost) is-admin
# Deny /ghost/ hors IP white
http-request deny if ghost_path !is_whitelisted_full
server ghost_server 192.168.1.55:2368
backend mattermost
server mattermost 192.168.1.112:8065
backend be_letsencrypt
server letsencrypt 127.0.0.1:9080
#server letsencrypt 127.0.0.1:10001
backend wiki
server wiki 192.168.1.18:32149
backend postiz-backend
mode http
balance source
http-request add-header X-Forwarded-Proto https if { ssl_fc }
# stickiness
stick-table type ip size 50k expire 30m
stick on src
http-reuse safe
cookie SERVERID insert indirect nocache
default-server inter 10s fastinter 500 fall 2 rise 2
# force https
acl http ssl_fc,not
http-request redirect scheme https if http
http-response set-header Strict-Transport-Security max-age=15552000
option ssl-hello-chk
server postiz 192.168.1.18:32133
backend nextcloud
# health checking is DISABLED
mode http
balance source
http-request set-header X-Forwarded-Proto https if { ssl_fc }
http-request set-header X-Real-IP %[src]
http-request set-header X-Forwarded-For %[src]
http-request set-header Host %[req.hdr(host)]
# stickiness
stick-table type ip size 50k expire 30m
stick on src
http-reuse safe
cookie SERVERID insert indirect nocache
default-server inter 10s fastinter 500 fall 2 rise 2
# force https
acl http ssl_fc,not
http-request redirect scheme https if http
http-response set-header Strict-Transport-Security max-age=15552000
option ssl-hello-chk
server nextcloud 192.168.1.13:5080 #ssl verify none
option http-server-close
option httpclose
option forwardfor
http-request set-header Connection "upgrade" if { hdr(Upgrade) -i WebSocket }
backend funkwhale
http-request set-header X-Forwarded-Proto https if { ssl_fc }
http-request set-header X-Forwarded-Proto http if !{ ssl_fc }
http-request set-header X-Forwarded-For %[src]
option forwardfor
#http-request set-header X-Forwarded-Port %[dst_port]
#http-request add-header X-Forwarded-Proto https if { ssl_fc }
#http-response add-header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline': img-src 'self' data:; font-src 'self' data:; object-src 'none'; media-src 'self' data:; worker-src 'self';"
#http-response add-header Referrer-Policy strict-origin-when-cross-origin
#http-response add-header X-Frame-Options SAMEORIGIN
#server funkwhale 192.168.1.12:5002
server funkwhale 192.168.1.108:5002
backend per_ip_rates
#stick-table type ip size 1m expire 10m store http_req_rate(10s)
# Define a stick-table to track request rates per IP
stick-table type ip size 1m expire 10m store http_req_rate(10s)
# Track all requests by source IP
http-request track-sc0 src
# Whitelist IP: 82.67.3.126 (bypass rate limiting)
acl is_whitelisted_ip src 82.67.3.126
acl is_whitelisted_lan1 src 192.168.1.0/24
acl is_whitelisted_lan2 src 192.168.2.0/24
# Whitelist domain: *.gyozamancave.fr (bypass rate limiting)
acl is_whitelisted_domain hdr_end(host) -i gyozamancave.fr
# Apply rate limiting (10 req/10s) unless whitelisted
#http-request deny deny_status 429 if !is_whitelisted_ip !is_whitelisted_domain { sc0_http_req_rate(per_ip_rates) gt 10 }
http-request deny deny_status 429 if !is_whitelisted_ip !is_whitelisted_lan1 !is_whitelisted_lan2 !is_whitelisted_domain { sc0_http_req_rate gt 10 }
-214
View File
@@ -1,214 +0,0 @@
global
lua-load /etc/haproxy/cors/lua/lib/cors.lua
#log /dev/log local0
#log /dev/log local1 notice
log 127.0.0.1 local2
log-send-hostname
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
maxconn 30000
user haproxy
group haproxy
daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# Default ciphers to use on SSL-enabled listening sockets.
# For more information, see ciphers(1SSL). This list is from:
# https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
# An alternative list with additional directives can be obtained from
# https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=haproxy
#ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
#ssl-default-bind-options no-sslv3
tune.ssl.default-dh-param 2048
# intermediate configuration
ssl-default-bind-curves X25519:prime256v1:secp384r1
ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-bind-options prefer-client-ciphers ssl-min-ver TLSv1.2 no-tls-tickets
ssl-default-server-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305
ssl-default-server-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-server-options ssl-min-ver TLSv1.2 no-tls-tickets
#ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
#ssl-default-bind-options prefer-client-ciphers no-sslv3 no-tlsv10 no-tlsv11 no-tls-tickets
#ssl-default-server-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
#ssl-default-server-options no-sslv3 no-tlsv10 no-tlsv11 no-tls-tickets
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 600s
timeout server 600s
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
frontend http_in
bind *:80
maxconn 500
acl acl_letsencrypt path_beg /.well-known/acme-challenge/
redirect scheme https if !acl_letsencrypt !{ ssl_fc }
use_backend be_letsencrypt if acl_letsencrypt
frontend https
bind *:443,[::]:443 ssl crt /etc/haproxy/ssl/ strict-sni alpn h2,http/1.1
http-request set-header X-Forwarded-Proto https if { ssl_fc }
http-request set-header X-Forwarded-Proto http if !{ ssl_fc }
http-request set-header X-Forwarded-For %[src]
http-request set-header X-Forwarded-For %[src]
# BEGIN CORS
#capture request header origin len 128
#chttp-response set-header Access-Control-Allow-Origin "*"
#chttp-response set-header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept, Authorization, JSNLog-RequestId, activityId, applicationId, applicationUserId, channelId, senderId, sessionId"
#chttp-response set-header Access-Control-Max-Age 3628800
#chttp-response set-header Access-Control-Allow-Methods "GET, DELETE, OPTIONS, POST, PUT"
# END CORS
acl cms-host hdr(host) -i mrteddybear.fr
acl bunkerweb-host hdr(host) -i bunkerweb.gyozamancave.fr
acl rss-host hdr(host) -i rss.gyozamancave.fr
acl mattermost-host hdr(host) -i mattermost.gyozamancave.fr
acl jellyfin-host hdr(host) -i jellyfin.gyozamancave.fr
acl nextcloud-host hdr(host) -i nextcloud.gyozamancave.fr
acl funkwhale-host hdr(host) -i funkwhale.gyozamancave.fr
acl wiki-host hdr(host) -i wiki.gyozamancave.fr
acl hass-host hdr(host) -i hass.gyozamancave.fr
acl postiz-host hdr(host) -i postiz.gyozamancave.fr
acl n8n-host hdr(host) -i n8n.gyozamancave.fr
use_backend cms if cms-host
use_backend bunkerweb if bunkerweb-host
use_backend rss if rss-host
use_backend mattermost if mattermost-host
use_backend jellyfin if jellyfin-host
use_backend nextcloud if nextcloud-host
use_backend funkwhale if funkwhale-host
use_backend wiki if wiki-host
use_backend hass-backend if hass-host
use_backend postiz-backend if postiz-host
use_backend n8n-backend if n8n-host
backend hass-backend
server hass 192.168.1.130:8123
mode http
#option forwardfor
#http-request add-header X-Forwarded-Proto https
#http-request add-header X-Forwarded-Port 443
backend cms
#server cms 192.168.1.101:80
server cms 192.168.1.250:2369
backend bunkerweb
http-request set-header X-Forwarded-Proto https if { ssl_fc }
http-request set-header X-Forwarded-Proto http if !{ ssl_fc }
http-request set-header X-Forwarded-For %[src]
option forwardfor
server waf 192.168.1.18:32287
#server waf 192.168.1.18:30761
backend mattermost
server mattermost 192.168.1.112:8065
backend be_letsencrypt
server letsencrypt 127.0.0.1:9080
#server letsencrypt 127.0.0.1:10001
backend jellyfin
server jellyfin 192.168.1.103:8096
backend wiki
server wiki 192.168.1.18:32149
backend postiz-backend
#mode http
#balance source
#http-request add-header X-Forwarded-Proto https if { ssl_fc }
#option forwardfor except 192.168.1.18/24
# # stickiness
#stick-table type ip size 50k expire 30m
#stick on src
#http-reuse safe
#cookie SERVERID insert indirect nocache
#default-server inter 10s fastinter 500 fall 2 rise 2
# # force https
#acl http ssl_fc,not
#http-request redirect scheme https if http
mode http
balance source
http-request add-header X-Forwarded-Proto https if { ssl_fc }
# stickiness
stick-table type ip size 50k expire 30m
stick on src
http-reuse safe
cookie SERVERID insert indirect nocache
default-server inter 10s fastinter 500 fall 2 rise 2
# force https
acl http ssl_fc,not
http-request redirect scheme https if http
http-response set-header Strict-Transport-Security max-age=15552000
option ssl-hello-chk
server postiz 192.168.1.18:32133
backend nextcloud
# health checking is DISABLED
mode http
balance source
http-request add-header X-Forwarded-Proto https if { ssl_fc }
# stickiness
stick-table type ip size 50k expire 30m
stick on src
http-reuse safe
cookie SERVERID insert indirect nocache
default-server inter 10s fastinter 500 fall 2 rise 2
# force https
acl http ssl_fc,not
http-request redirect scheme https if http
http-response set-header Strict-Transport-Security max-age=15552000
option ssl-hello-chk
server nextcloud 192.168.1.13:5080 #check ssl #verify none
backend rss
mode http
enabled
server rss 192.168.1.8:8080
backend n8n-backend
server n8n 192.168.1.18:32120
backend funkwhale
http-request set-header X-Forwarded-Proto https if { ssl_fc }
http-request set-header X-Forwarded-Proto http if !{ ssl_fc }
http-request set-header X-Forwarded-For %[src]
option forwardfor
#http-request set-header X-Forwarded-Port %[dst_port]
#http-request add-header X-Forwarded-Proto https if { ssl_fc }
#http-response add-header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline': img-src 'self' data:; font-src 'self' data:; object-src 'none'; media-src 'self' data:; worker-src 'self';"
#http-response add-header Referrer-Policy strict-origin-when-cross-origin
#http-response add-header X-Frame-Options SAMEORIGIN
#server funkwhale 192.168.1.12:5002
server funkwhale 192.168.1.108:5002
-90
View File
@@ -1,90 +0,0 @@
#---------------------------------------------------------------------
# Example configuration for a possible web application. See the
# full configuration options online.
#
# https://www.haproxy.org/download/1.8/doc/configuration.txt
#
#---------------------------------------------------------------------
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
# to have these messages end up in /var/log/haproxy.log you will
# need to:
#
# 1) configure syslog to accept network log events. This is done
# by adding the '-r' option to the SYSLOGD_OPTIONS in
# /etc/sysconfig/syslog
#
# 2) configure local2 events to go to the /var/log/haproxy.log
# file. A line like the following can be added to
# /etc/sysconfig/syslog
#
# local2.* /var/log/haproxy.log
#
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
# utilize system-wide crypto-policies
ssl-default-bind-ciphers PROFILE=SYSTEM
ssl-default-server-ciphers PROFILE=SYSTEM
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend main
bind *:5000
acl url_static path_beg -i /static /images /javascript /stylesheets
acl url_static path_end -i .jpg .gif .png .css .js
use_backend static if url_static
default_backend app
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
backend static
balance roundrobin
server static 127.0.0.1:4331 check
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend app
balance roundrobin
server app1 127.0.0.1:5001 check
server app2 127.0.0.1:5002 check
server app3 127.0.0.1:5003 check
server app4 127.0.0.1:5004 check
-20
View File
@@ -1,20 +0,0 @@
HTTP/1.0 400 Bad request
Cache-Control: no-cache
Connection: close
Content-Type: text/html
<html>
<body>
<style>
html {
background-color: black;
}
img {
display: block;
margin: 0px auto;
}
</style>
<img src="https://http.cat/400.jpg">
</body>
</html>
-20
View File
@@ -1,20 +0,0 @@
HTTP/1.0 401 Unauthorized
Cache-Control: no-cache
Connection: close
Content-Type: text/html
<html>
<body>
<style>
html {
background-color: black;
}
img {
display: block;
margin: 0px auto;
}
</style>
<img src="https://http.cat/401.jpg">
</body>
</html>
-20
View File
@@ -1,20 +0,0 @@
HTTP/1.0 403 Forbidden
Cache-Control: no-cache
Connection: close
Content-Type: text/html
<html>
<body>
<style>
html {
background-color: black;
}
img {
display: block;
margin: 0px auto;
}
</style>
<img src="https://http.cat/403.jpg">
</body>
</html>
-20
View File
@@ -1,20 +0,0 @@
HTTP/1.1 404 Not Found
Cache-Control: no-cache
Connection: close
Content-Type: text/html
<html>
<body>
<style>
html {
background-color: black;
}
img {
display: block;
margin: 0px auto;
}
</style>
<img src="https://http.cat/404.jpg">
</body>
</html>
-20
View File
@@ -1,20 +0,0 @@
HTTP/1.0 408 Request Time-out
Cache-Control: no-cache
Connection: close
Content-Type: text/html
<html>
<body>
<style>
html {
background-color: black;
}
img {
display: block;
margin: 0px auto;
}
</style>
<img src="https://http.cat/408.jpg">
</body>
</html>
-20
View File
@@ -1,20 +0,0 @@
HTTP/1.0 500 Server Error
Cache-Control: no-cache
Connection: close
Content-Type: text/html
<html>
<body>
<style>
html {
background-color: black;
}
img {
display: block;
margin: 0px auto;
}
</style>
<img src="https://http.cat/500.jpg">
</body>
</html>
-20
View File
@@ -1,20 +0,0 @@
HTTP/1.0 502 Bad Gateway
Cache-Control: no-cache
Connection: close
Content-Type: text/html
<html>
<body>
<style>
html {
background-color: black;
}
img {
display: block;
margin: 0px auto;
}
</style>
<img src="https://http.cat/502.jpg">
</body>
</html>
-20
View File
@@ -1,20 +0,0 @@
HTTP/1.0 503 Service Unavailable
Cache-Control: no-cache
Connection: close
Content-Type: text/html
<html>
<body>
<style>
html {
background-color: black;
}
img {
display: block;
margin: 0px auto;
}
</style>
<img src="https://http.cat/503.jpg">
</body>
</html>
-20
View File
@@ -1,20 +0,0 @@
HTTP/1.0 504 Gateway Time-out
Cache-Control: no-cache
Connection: close
Content-Type: text/html
<html>
<body>
<style>
html {
background-color: black;
}
img {
display: block;
margin: 0px auto;
}
</style>
<img src="https://http.cat/504.jpg">
</body>
</html>
+10468
View File
File diff suppressed because it is too large Load Diff
+41
View File
@@ -0,0 +1,41 @@
{
"name": "n8n-pilot",
"version": "1.0.0",
"main": "expo-router/entry",
"scripts": {
"start": "expo start",
"android": "expo start --android",
"ios": "expo start --ios",
"web": "expo start --web"
},
"dependencies": {
"axios": "^1.16.1",
"date-fns": "^4.2.1",
"expo": "~54.0.33",
"expo-constants": "~18.0.13",
"expo-linking": "~8.0.12",
"expo-local-authentication": "~17.0.8",
"expo-router": "~6.0.23",
"expo-secure-store": "~15.0.8",
"expo-splash-screen": "~31.0.13",
"expo-status-bar": "~3.0.9",
"react": "19.1.0",
"react-dom": "19.1.0",
"react-native": "0.81.5",
"react-native-gesture-handler": "~2.28.0",
"react-native-paper": "^5.15.2",
"react-native-reanimated": "~4.1.1",
"react-native-safe-area-context": "~5.6.0",
"react-native-screens": "~4.16.0",
"react-native-web": "^0.21.0",
"react-native-worklets": "0.5.1",
"zustand": "^5.0.13"
},
"private": true,
"devDependencies": {
"@types/react": "~19.1.10",
"@types/react-native": "^0.72.8",
"babel-preset-expo": "~54.0.10",
"typescript": "~5.9.2"
}
}
-7
View File
@@ -1,7 +0,0 @@
#!/bin/bash
# Loop through all Let's Encrypt certificates
for CERTIFICATE in `find /etc/letsencrypt/live/* -type d`; do
CERTIFICATE=`basename $CERTIFICATE`
# Combine certificate and private key to single file
cat /etc/letsencrypt/live/$CERTIFICATE/fullchain.pem /etc/letsencrypt/live/$CERTIFICATE/privkey.pem > /etc/haproxy/ssl/$CERTIFICATE.pem
done
-6
View File
@@ -1,6 +0,0 @@
#!/bin/bash
#certbot renew --standalone --preferred-challenges http --http-01-address 127.0.0.1 --http-01-port 9080 --post-hook "/etc/haproxy/prepareLetsEncryptCertificates.sh && systemctl reload haproxy.service" --quiet
certbot renew --dns-ovh --dns-ovh-credentials "/etc/letsencrypt/ovh/ovh.ini" --quiet --post-hook "/etc/haproxy/prepareLetsEncryptCertificates.sh && systemctl reload haproxy.service" -vvv
#certbot renew --dns-ovh --dns-ovh-credentials "/etc/letsencrypt/ovh/ovh.ini" --post-hook "/etc/haproxy/prepareLetsEncryptCertificates.sh && systemctl reload haproxy.service" --force-renewal
+78
View File
@@ -0,0 +1,78 @@
import axios, {
AxiosInstance,
InternalAxiosRequestConfig,
AxiosResponse,
AxiosError,
} from 'axios';
import * as SecureStore from 'expo-secure-store';
import { handleError } from '../utils/errorHandler';
/**
* Clés de stockage sécurisé Android Keystore via expo-secure-store.
* Ces constantes sont les seuls points de référence aux secrets dans toute l'app.
*/
export const SECURE_STORE_KEYS = {
BASE_URL: 'n8n_base_url',
API_KEY: 'n8n_api_key',
APP_TOKEN: 'n8n_app_token',
BIOMETRIC_ENABLED: 'n8n_biometric_enabled',
} as const;
/**
* Crée et configure l'instance Axios centrale de l'application.
*
* Architecture de sécurité :
* - Les credentials (API key, app token) ne sont JAMAIS embarqués dans le bundle.
* - Ils sont récupérés dynamiquement depuis le secure store à chaque requête.
* - La base URL est également stockée dans le secure store, pas en dur.
*/
const createApiClient = (): AxiosInstance => {
const client = axios.create({
timeout: 15_000,
headers: {
'Content-Type': 'application/json',
},
});
/**
* Intercepteur de requête sortante.
* Lit baseURL, X-N8N-API-KEY et X-App-Token depuis le secure store
* et les injecte dans chaque requête avant envoi.
* Aucune valeur sensible ne transite par les variables d'environnement du bundle.
*/
client.interceptors.request.use(
async (config: InternalAxiosRequestConfig): Promise<InternalAxiosRequestConfig> => {
const [baseUrl, apiKey, appToken] = await Promise.all([
SecureStore.getItemAsync(SECURE_STORE_KEYS.BASE_URL),
SecureStore.getItemAsync(SECURE_STORE_KEYS.API_KEY),
SecureStore.getItemAsync(SECURE_STORE_KEYS.APP_TOKEN),
]);
if (baseUrl) config.baseURL = baseUrl;
if (apiKey) config.headers.set('X-N8N-API-KEY', apiKey);
if (appToken) config.headers.set('X-App-Token', appToken);
return config;
},
(error: AxiosError) => Promise.reject(error)
);
/**
* Intercepteur de réponse.
* Les erreurs HTTP sont transmises à errorHandler qui affiche un toast.
* L'erreur est re-rejetée pour que les appelants puissent aussi réagir si besoin.
* Aucun secret n'est loggué ici.
*/
client.interceptors.response.use(
(response: AxiosResponse) => response,
(error: AxiosError) => {
handleError(error);
return Promise.reject(error);
}
);
return client;
};
/** Instance Axios unique partagée dans toute l'application */
export const apiClient = createApiClient();
+109
View File
@@ -0,0 +1,109 @@
import { apiClient } from './client';
import { ApiListResponse } from './workflows';
/** Ensemble des statuts possibles pour une exécution n8n */
export type ExecutionStatus = 'success' | 'error' | 'waiting' | 'running' | 'canceled';
/** Modes de déclenchement d'une exécution */
export type ExecutionMode = 'manual' | 'trigger' | 'webhook' | 'internal' | 'retry';
/**
* Données d'exécution d'un nœud individuel.
* Disponibles uniquement dans la réponse détaillée (GET /executions/:id).
*/
export interface NodeExecutionData {
startTime: number;
executionTime: number;
source: unknown[];
data?: Record<string, unknown>;
error?: {
message: string;
name?: string;
stack?: string;
};
}
/** Données complètes d'un résultat d'exécution */
export interface ExecutionResultData {
resultData: {
/** Map nœud → tableau des runs de ce nœud */
runData: Record<string, NodeExecutionData[]>;
lastNodeExecuted?: string;
/** Erreur globale de l'exécution (distinct des erreurs par nœud) */
error?: {
message: string;
name: string;
stack?: string;
};
};
}
/**
* Représente une exécution telle que retournée par l'API n8n v1.
* Le champ `data` n'est disponible que dans la réponse de GET /executions/:id.
*/
export interface Execution {
id: string;
finished: boolean;
mode: ExecutionMode;
/** ID de l'exécution originale si c'est un retry */
retryOf?: string;
retrySuccessId?: string;
startedAt: string;
stoppedAt?: string;
workflowId: string;
workflowName?: string;
status: ExecutionStatus;
/** Présent uniquement via GET /executions/:id */
data?: ExecutionResultData;
}
/** Paramètres de filtrage acceptés par l'endpoint GET /executions */
export interface FetchExecutionsParams {
/** Nombre max de résultats à retourner */
limit?: number;
/** Filtre par statut d'exécution */
status?: ExecutionStatus;
/** Filtre par identifiant de workflow */
workflowId?: string;
/** Curseur opaque de pagination (valeur nextCursor de la réponse précédente) */
cursor?: string;
}
/**
* Récupère l'historique des exécutions avec filtres optionnels.
*
* @param params - Filtres : limit, status, workflowId, cursor
* @returns Réponse paginée avec les exécutions et le curseur suivant
*/
export const fetchExecutions = async (
params: FetchExecutionsParams = {}
): Promise<ApiListResponse<Execution>> => {
const response = await apiClient.get<ApiListResponse<Execution>>('/api/v1/executions', {
params,
});
return response.data;
};
/**
* Récupère les logs complets d'une exécution spécifique.
* Inclut les données de chaque nœud (champ `data`), absent dans la liste.
*
* @param id - Identifiant de l'exécution
* @returns Exécution complète avec données de nœuds
*/
export const fetchExecutionById = async (id: string): Promise<Execution> => {
const response = await apiClient.get<Execution>(`/api/v1/executions/${id}`, {
params: { includeData: true },
});
return response.data;
};
/**
* Supprime une exécution de l'historique n8n.
*
* @param id - Identifiant de l'exécution à supprimer
*/
export const deleteExecution = async (id: string): Promise<void> => {
await apiClient.delete(`/api/v1/executions/${id}`);
};
+112
View File
@@ -0,0 +1,112 @@
import { apiClient } from './client';
/** Représente un nœud dans un workflow n8n */
export interface WorkflowNode {
id: string;
name: string;
type: string;
position: [number, number];
parameters: Record<string, unknown>;
typeVersion?: number;
}
/** Tag associé à un workflow */
export interface WorkflowTag {
id: string;
name: string;
createdAt: string;
updatedAt: string;
}
/**
* Représente un workflow complet tel que retourné par l'API n8n v1.
* Les champs `nodes` et `connections` sont présents dans les réponses détaillées.
*/
export interface Workflow {
id: string;
name: string;
active: boolean;
createdAt: string;
updatedAt: string;
nodes: WorkflowNode[];
connections: Record<string, unknown>;
settings?: Record<string, unknown>;
tags?: WorkflowTag[];
}
/**
* Réponse paginée standard de l'API n8n.
* nextCursor est null si on est sur la dernière page.
*/
export interface ApiListResponse<T> {
data: T[];
nextCursor: string | null;
}
/**
* Récupère la liste complète des workflows de l'instance n8n.
*
* @returns Tableau de tous les workflows (actifs et inactifs)
* @throws AxiosError — géré par l'intercepteur, remonte via errorHandler
*/
export const fetchWorkflows = async (): Promise<Workflow[]> => {
const response = await apiClient.get<ApiListResponse<Workflow>>('/api/v1/workflows');
return response.data.data;
};
/**
* Récupère le détail complet d'un workflow, incluant ses nœuds et connexions.
*
* @param id - Identifiant du workflow
* @returns Workflow avec tous ses détails
*/
export const fetchWorkflowById = async (id: string): Promise<Workflow> => {
const response = await apiClient.get<Workflow>(`/api/v1/workflows/${id}`);
return response.data;
};
/**
* Active un workflow : il répondra désormais à ses déclencheurs.
*
* @param id - Identifiant du workflow à activer
* @returns Workflow mis à jour avec active = true
*/
export const activateWorkflow = async (id: string): Promise<Workflow> => {
const response = await apiClient.post<Workflow>(`/api/v1/workflows/${id}/activate`);
return response.data;
};
/**
* Désactive un workflow : ses déclencheurs sont mis en veille.
*
* @param id - Identifiant du workflow à désactiver
* @returns Workflow mis à jour avec active = false
*/
export const deactivateWorkflow = async (id: string): Promise<Workflow> => {
const response = await apiClient.post<Workflow>(`/api/v1/workflows/${id}/deactivate`);
return response.data;
};
/** Paramètres optionnels pour le déclenchement manuel d'un workflow */
export interface RunWorkflowParams {
/** Données injectées dans le nœud de démarrage manuel */
workflowData?: Record<string, unknown>;
}
/**
* Déclenche manuellement l'exécution d'un workflow.
*
* @param id - Identifiant du workflow à déclencher
* @param params - Données optionnelles d'entrée
* @returns Identifiant de l'exécution créée
*/
export const runWorkflow = async (
id: string,
params?: RunWorkflowParams
): Promise<{ executionId: string }> => {
const response = await apiClient.post<{ executionId: string }>(
`/api/v1/workflows/${id}/run`,
params ?? {}
);
return response.data;
};
+107
View File
@@ -0,0 +1,107 @@
import React from 'react';
import { View, StyleSheet } from 'react-native';
import { Card, Text, IconButton, useTheme } from 'react-native-paper';
import { Execution } from '../api/executions';
import StatusBadge from './StatusBadge';
import { formatShortDate, formatDuration, formatMode } from '../utils/formatters';
interface ExecutionCardProps {
execution: Execution;
/**
* Navigue vers les logs complets de cette exécution.
* Déclenche router.push('/execution/:id') dans ExecutionsScreen.
*/
onViewLogs: (id: string) => void;
/**
* Supprime l'exécution via le hook useExecutions.
*/
onDelete: (id: string) => void;
}
/**
* Carte représentant une exécution dans la liste historique.
* Affiche : nom du workflow, badge de statut, mode de déclenchement, durée et date.
* Les actions (logs, suppression) sont déléguées aux callbacks.
*/
const ExecutionCard: React.FC<ExecutionCardProps> = ({ execution, onViewLogs, onDelete }) => {
const theme = useTheme();
return (
<Card style={[styles.card, { backgroundColor: theme.colors.surface }]}>
<Card.Content>
{/* En-tête : nom du workflow et badge de statut */}
<View style={styles.header}>
<Text
variant="titleSmall"
numberOfLines={1}
style={[styles.workflowName, { color: theme.colors.onSurface }]}
>
{execution.workflowName ?? `Workflow ${execution.workflowId}`}
</Text>
<StatusBadge status={execution.status} size="small" />
</View>
{/* Métadonnées : mode de déclenchement, durée, date */}
<View style={styles.meta}>
<Text variant="bodySmall" style={{ color: theme.colors.onSurfaceVariant }}>
{formatMode(execution.mode)}
</Text>
<Text variant="bodySmall" style={{ color: theme.colors.onSurfaceVariant }}>
{formatDuration(execution.startedAt, execution.stoppedAt)}
</Text>
<Text variant="bodySmall" style={{ color: theme.colors.onSurfaceVariant }}>
{formatShortDate(execution.startedAt)}
</Text>
</View>
</Card.Content>
{/* Actions : consulter les logs et supprimer */}
<Card.Actions style={styles.actions}>
<IconButton
icon="text-box-outline"
size={20}
iconColor={theme.colors.primary}
onPress={() => onViewLogs(execution.id)}
accessibilityLabel="Voir les logs de cette exécution"
/>
<IconButton
icon="delete-outline"
size={20}
iconColor={theme.colors.error}
onPress={() => onDelete(execution.id)}
accessibilityLabel="Supprimer cette exécution"
/>
</Card.Actions>
</Card>
);
};
const styles = StyleSheet.create({
card: {
marginHorizontal: 16,
marginVertical: 5,
elevation: 1,
},
header: {
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
marginBottom: 6,
},
workflowName: {
flex: 1,
marginRight: 8,
fontWeight: '500',
},
meta: {
flexDirection: 'row',
justifyContent: 'space-between',
},
actions: {
justifyContent: 'flex-end',
paddingRight: 4,
paddingBottom: 2,
},
});
export default ExecutionCard;
+91
View File
@@ -0,0 +1,91 @@
import React, { useEffect, useRef } from 'react';
import { View, Animated, StyleSheet, ViewStyle } from 'react-native';
interface SkeletonItemProps {
width?: number | `${number}%`;
height?: number;
borderRadius?: number;
style?: ViewStyle;
}
/**
* Bloc de squelette animé avec effet de pulsation (shimmer).
* Composant interne utilisé par SkeletonLoader pour construire les cartes placeholder.
*/
const SkeletonItem: React.FC<SkeletonItemProps> = ({
width = '100%',
height = 16,
borderRadius = 4,
style,
}) => {
const opacity = useRef(new Animated.Value(0.3)).current;
useEffect(() => {
/** Boucle d'animation : alterne entre 30% et 70% d'opacité */
const animation = Animated.loop(
Animated.sequence([
Animated.timing(opacity, {
toValue: 0.7,
duration: 800,
useNativeDriver: true,
}),
Animated.timing(opacity, {
toValue: 0.3,
duration: 800,
useNativeDriver: true,
}),
])
);
animation.start();
return () => animation.stop();
}, [opacity]);
return (
<Animated.View
style={[
styles.skeleton,
{ width: width as number, height, borderRadius, opacity },
style,
]}
/>
);
};
interface SkeletonLoaderProps {
/** Nombre de cartes placeholder à afficher pendant le chargement initial */
count?: number;
}
/**
* Affiche des cartes placeholder animées pendant le chargement des données.
* Simule la structure d'une WorkflowCard/ExecutionCard pour éviter le layout shift
* et indiquer à l'utilisateur que du contenu arrive.
*/
const SkeletonLoader: React.FC<SkeletonLoaderProps> = ({ count = 5 }) => {
return (
<>
{Array.from({ length: count }).map((_, index) => (
<View key={index} style={styles.card}>
<SkeletonItem width="60%" height={18} style={{ marginBottom: 8 }} />
<SkeletonItem width="85%" height={12} style={{ marginBottom: 6 }} />
<SkeletonItem width="40%" height={12} />
</View>
))}
</>
);
};
const styles = StyleSheet.create({
card: {
backgroundColor: '#1E1E1E',
marginHorizontal: 16,
marginVertical: 6,
padding: 16,
borderRadius: 12,
},
skeleton: {
backgroundColor: '#2C2C2C',
},
});
export default SkeletonLoader;
+69
View File
@@ -0,0 +1,69 @@
import React from 'react';
import { View, StyleSheet } from 'react-native';
import { Text } from 'react-native-paper';
import { ExecutionStatus } from '../api/executions';
import { formatStatus } from '../utils/formatters';
/**
* Couleurs de fond des badges — optimisées pour le thème sombre MD3.
* Les teintes foncées gardent le contraste sans agresser l'œil.
*/
const STATUS_BG_COLORS: Record<ExecutionStatus, string> = {
success: '#1B5E20',
error: '#7F0000',
waiting: '#E65100',
running: '#0D47A1',
canceled: '#424242',
};
/** Couleurs de texte assorties à chaque fond */
const STATUS_TEXT_COLORS: Record<ExecutionStatus, string> = {
success: '#A5D6A7',
error: '#EF9A9A',
waiting: '#FFCC80',
running: '#90CAF9',
canceled: '#BDBDBD',
};
interface StatusBadgeProps {
status: ExecutionStatus;
/**
* Taille du badge :
* - small : listes denses (ExecutionCard)
* - default : vue détail (LogsScreen)
*/
size?: 'small' | 'default';
}
/**
* Badge coloré représentant le statut d'une exécution n8n.
* Utilise les couleurs MD3 dark pour rester lisible sur les surfaces sombres.
*/
const StatusBadge: React.FC<StatusBadgeProps> = ({ status, size = 'default' }) => {
const backgroundColor = STATUS_BG_COLORS[status] ?? '#424242';
const textColor = STATUS_TEXT_COLORS[status] ?? '#BDBDBD';
const fontSize = size === 'small' ? 10 : 12;
return (
<View style={[styles.badge, { backgroundColor }]}>
<Text style={[styles.text, { color: textColor, fontSize }]}>
{formatStatus(status)}
</Text>
</View>
);
};
const styles = StyleSheet.create({
badge: {
paddingHorizontal: 8,
paddingVertical: 3,
borderRadius: 12,
alignSelf: 'flex-start',
},
text: {
fontWeight: '600',
letterSpacing: 0.3,
},
});
export default StatusBadge;
+124
View File
@@ -0,0 +1,124 @@
import React from 'react';
import { View, StyleSheet } from 'react-native';
import { Card, Text, Switch, IconButton, useTheme } from 'react-native-paper';
import { Workflow } from '../api/workflows';
import { formatRelativeDate } from '../utils/formatters';
interface WorkflowCardProps {
workflow: Workflow;
/**
* Appelé quand l'utilisateur bascule le switch actif/inactif.
* Le hook useWorkflows gère l'appel API et la mise à jour d'état.
*/
onToggle: (workflow: Workflow) => void;
/**
* Appelé quand l'utilisateur appuie sur le bouton lecture.
* Déclenche une exécution manuelle du workflow.
*/
onRun: (id: string) => void;
}
/**
* Carte représentant un workflow dans la liste WorkflowsScreen.
* Affiche : nom, statut actif (switch), date de modification, tags et bouton run.
* Le toggle et le run déclenchent des callbacks — la carte n'appelle jamais l'API directement.
*/
const WorkflowCard: React.FC<WorkflowCardProps> = ({ workflow, onToggle, onRun }) => {
const theme = useTheme();
return (
<Card style={[styles.card, { backgroundColor: theme.colors.surface }]}>
<Card.Content style={styles.content}>
{/* En-tête : nom du workflow et switch actif/inactif */}
<View style={styles.header}>
<Text
variant="titleMedium"
numberOfLines={2}
style={[styles.name, { color: theme.colors.onSurface }]}
>
{workflow.name}
</Text>
<Switch
value={workflow.active}
onValueChange={() => onToggle(workflow)}
color={theme.colors.primary}
/>
</View>
{/* Date de dernière modification */}
<Text
variant="bodySmall"
style={{ color: theme.colors.onSurfaceVariant, marginTop: 4 }}
>
Modifié {formatRelativeDate(workflow.updatedAt)}
</Text>
{/* Tags optionnels */}
{workflow.tags && workflow.tags.length > 0 && (
<View style={styles.tags}>
{workflow.tags.map((tag) => (
<View
key={tag.id}
style={[styles.tag, { backgroundColor: theme.colors.surfaceVariant }]}
>
<Text variant="labelSmall" style={{ color: theme.colors.onSurfaceVariant }}>
{tag.name}
</Text>
</View>
))}
</View>
)}
</Card.Content>
{/* Bouton de déclenchement manuel */}
<Card.Actions style={styles.actions}>
<IconButton
icon="play-circle-outline"
size={22}
iconColor={theme.colors.primary}
onPress={() => onRun(workflow.id)}
accessibilityLabel="Déclencher manuellement ce workflow"
/>
</Card.Actions>
</Card>
);
};
const styles = StyleSheet.create({
card: {
marginHorizontal: 16,
marginVertical: 6,
elevation: 2,
},
content: {
paddingBottom: 4,
},
header: {
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
},
name: {
flex: 1,
marginRight: 8,
fontWeight: '600',
},
tags: {
flexDirection: 'row',
flexWrap: 'wrap',
marginTop: 8,
gap: 6,
},
tag: {
paddingHorizontal: 8,
paddingVertical: 2,
borderRadius: 8,
},
actions: {
justifyContent: 'flex-end',
paddingRight: 8,
paddingBottom: 4,
},
});
export default WorkflowCard;
+137
View File
@@ -0,0 +1,137 @@
import { useState, useCallback } from 'react';
import { useAppStore } from '../store/appStore';
import {
fetchExecutions,
fetchExecutionById,
deleteExecution,
Execution,
ExecutionStatus,
FetchExecutionsParams,
} from '../api/executions';
import { usePolling } from './usePolling';
/** Options de filtrage passées au hook à l'initialisation */
interface UseExecutionsOptions {
/** Nombre max d'exécutions à charger */
limit?: number;
/** Filtre de statut initial */
statusFilter?: ExecutionStatus;
/** Restreindre aux exécutions d'un workflow spécifique */
workflowId?: string;
}
/** Interface des valeurs et actions exposées par le hook */
interface UseExecutionsResult {
executions: Execution[];
isLoading: boolean;
isRefreshing: boolean;
/** Exécution chargée en détail (avec logs de nœuds) */
selectedExecution: Execution | null;
/** Recharge la liste (pull-to-refresh) */
refresh: () => Promise<void>;
/**
* Charge les logs complets d'une exécution pour l'écran de détail.
* Peuple selectedExecution.
*
* @param id - Identifiant de l'exécution
*/
loadExecutionDetail: (id: string) => Promise<void>;
/**
* Supprime une exécution de l'historique et la retire de l'état local.
*
* @param id - Identifiant de l'exécution à supprimer
*/
removeExecution: (id: string) => Promise<void>;
/**
* Change le filtre de statut actif et relance le chargement.
*
* @param status - Statut cible ou undefined pour tout afficher
*/
setStatusFilter: (status: ExecutionStatus | undefined) => void;
}
/**
* Hook de gestion des exécutions : listing avec filtres, polling, détail et suppression.
* Sépare clairement la liste (vue Executions) du détail (vue Logs).
*/
export const useExecutions = (options: UseExecutionsOptions = {}): UseExecutionsResult => {
const { preferences, config } = useAppStore();
const [executions, setExecutions] = useState<Execution[]>([]);
const [isLoading, setIsLoading] = useState(true);
const [isRefreshing, setIsRefreshing] = useState(false);
const [selectedExecution, setSelectedExecution] = useState<Execution | null>(null);
const [statusFilter, setStatusFilter] = useState<ExecutionStatus | undefined>(
options.statusFilter
);
/** Charge la liste avec les filtres courants */
const loadExecutions = useCallback(async (): Promise<void> => {
const params: FetchExecutionsParams = {
limit: options.limit ?? 50,
...(statusFilter !== undefined && { status: statusFilter }),
...(options.workflowId && { workflowId: options.workflowId }),
};
try {
const result = await fetchExecutions(params);
setExecutions(result.data);
} catch {
// Géré par l'intercepteur Axios
} finally {
setIsLoading(false);
}
}, [options.limit, options.workflowId, statusFilter]);
/** Polling automatique — désactivé si l'app n'est pas encore configurée */
usePolling({
callback: loadExecutions,
interval: preferences.pollingInterval,
enabled: config.isConfigured,
immediate: true,
});
const refresh = useCallback(async (): Promise<void> => {
setIsRefreshing(true);
try {
await loadExecutions();
} finally {
setIsRefreshing(false);
}
}, [loadExecutions]);
/**
* Charge les logs détaillés d'une exécution.
* Appelle GET /executions/:id qui inclut le champ `data` avec les nœuds.
*/
const loadExecutionDetail = useCallback(async (id: string): Promise<void> => {
try {
const detail = await fetchExecutionById(id);
setSelectedExecution(detail);
} catch {
// Géré par l'intercepteur Axios
}
}, []);
/**
* Supprime une exécution côté serveur et la retire optimistiquement de l'état local.
*/
const removeExecution = useCallback(async (id: string): Promise<void> => {
try {
await deleteExecution(id);
setExecutions((prev) => prev.filter((e) => e.id !== id));
} catch {
// Géré par l'intercepteur Axios
}
}, []);
return {
executions,
isLoading,
isRefreshing,
selectedExecution,
refresh,
loadExecutionDetail,
removeExecution,
setStatusFilter,
};
};
+66
View File
@@ -0,0 +1,66 @@
import { useEffect, useRef, useCallback } from 'react';
/** Options de configuration du hook de polling générique */
interface UsePollingOptions {
/** Callback exécuté à chaque intervalle (peut être async) */
callback: () => void | Promise<void>;
/** Intervalle entre chaque appel en millisecondes */
interval: number;
/** Si false, le polling est suspendu sans démonter le hook */
enabled?: boolean;
/** Si true, déclenche le callback immédiatement au montage sans attendre le premier intervalle */
immediate?: boolean;
}
/**
* Hook générique de polling configurable.
* Gère automatiquement le nettoyage de l'intervalle au démontage du composant.
* Le callback est mémorisé par ref pour éviter de redémarrer le polling à chaque render.
*
* @returns stopPolling - Fonction pour arrêter manuellement le polling
*/
export const usePolling = ({
callback,
interval,
enabled = true,
immediate = true,
}: UsePollingOptions): { stopPolling: () => void } => {
/** Ref sur le callback pour éviter de re-créer l'intervalle si la fonction change */
const callbackRef = useRef(callback);
const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);
/** Synchronise la ref à chaque render sans déclencher d'effet */
useEffect(() => {
callbackRef.current = callback;
}, [callback]);
/** Arrête proprement l'intervalle actif */
const stopPolling = useCallback(() => {
if (intervalRef.current) {
clearInterval(intervalRef.current);
intervalRef.current = null;
}
}, []);
useEffect(() => {
if (!enabled) {
stopPolling();
return;
}
// Appel immédiat au montage si demandé (évite l'attente du premier intervalle)
if (immediate) {
void callbackRef.current();
}
// Mise en place du polling régulier
intervalRef.current = setInterval(() => {
void callbackRef.current();
}, interval);
// Nettoyage automatique au démontage
return stopPolling;
}, [enabled, interval, immediate, stopPolling]);
return { stopPolling };
};
+110
View File
@@ -0,0 +1,110 @@
import { useState, useCallback } from 'react';
import { useAppStore } from '../store/appStore';
import {
fetchWorkflows,
activateWorkflow,
deactivateWorkflow,
runWorkflow,
Workflow,
} from '../api/workflows';
import { usePolling } from './usePolling';
/** Interface des valeurs et actions exposées par le hook */
interface UseWorkflowsResult {
workflows: Workflow[];
isLoading: boolean;
isRefreshing: boolean;
/**
* Recharge manuellement la liste des workflows.
* Utilisé pour le pull-to-refresh.
*/
refresh: () => Promise<void>;
/**
* Bascule le statut actif/inactif d'un workflow.
* Met à jour l'état local après confirmation serveur.
*
* @param workflow - Workflow à basculer
*/
toggleWorkflow: (workflow: Workflow) => Promise<void>;
/**
* Déclenche manuellement l'exécution d'un workflow.
*
* @param id - Identifiant du workflow à déclencher
*/
triggerWorkflow: (id: string) => Promise<void>;
}
/**
* Hook de gestion des workflows : chargement, polling automatique et actions.
* Délègue la gestion des erreurs à l'intercepteur Axios (errorHandler).
* Les screens ne font pas d'appels API directs — tout passe par ce hook.
*/
export const useWorkflows = (): UseWorkflowsResult => {
const { preferences, config } = useAppStore();
const [workflows, setWorkflows] = useState<Workflow[]>([]);
const [isLoading, setIsLoading] = useState(true);
const [isRefreshing, setIsRefreshing] = useState(false);
/** Charge la liste des workflows depuis la couche API */
const loadWorkflows = useCallback(async (): Promise<void> => {
try {
const data = await fetchWorkflows();
setWorkflows(data);
} catch {
// Erreur déjà remontée via l'intercepteur Axios → toast affiché
} finally {
setIsLoading(false);
}
}, []);
/**
* Polling automatique déclenché uniquement si l'app est configurée.
* L'intervalle est lu depuis les préférences utilisateur (configurable dans Settings).
*/
usePolling({
callback: loadWorkflows,
interval: preferences.pollingInterval,
enabled: config.isConfigured,
immediate: true,
});
/** Pull-to-refresh : indicateur distinct du chargement initial */
const refresh = useCallback(async (): Promise<void> => {
setIsRefreshing(true);
try {
await loadWorkflows();
} finally {
setIsRefreshing(false);
}
}, [loadWorkflows]);
/**
* Bascule actif/inactif d'un workflow.
* Met à jour l'entrée correspondante dans l'état local après retour serveur.
*/
const toggleWorkflow = useCallback(async (workflow: Workflow): Promise<void> => {
try {
const updated = workflow.active
? await deactivateWorkflow(workflow.id)
: await activateWorkflow(workflow.id);
// Mise à jour ciblée sans recharger toute la liste
setWorkflows((prev) => prev.map((w) => (w.id === updated.id ? updated : w)));
} catch {
// Géré par l'intercepteur Axios
}
}, []);
const triggerWorkflow = useCallback(async (id: string): Promise<void> => {
await runWorkflow(id);
}, []);
return {
workflows,
isLoading,
isRefreshing,
refresh,
toggleWorkflow,
triggerWorkflow,
};
};
+204
View File
@@ -0,0 +1,204 @@
import React, { useMemo } from 'react';
import { ScrollView, View, StyleSheet, RefreshControl } from 'react-native';
import { Text, Card, ActivityIndicator, useTheme } from 'react-native-paper';
import { useWorkflows } from '../hooks/useWorkflows';
import { useExecutions } from '../hooks/useExecutions';
import StatusBadge from '../components/StatusBadge';
import { formatShortDate } from '../utils/formatters';
/**
* Carte de métrique simple pour le tableau de bord.
* Affiche un chiffre clé avec un label et un sous-titre coloré.
*/
interface MetricCardProps {
label: string;
value: string | number;
subtitle: string;
valueColor: string;
}
const MetricCard: React.FC<MetricCardProps> = ({ label, value, subtitle, valueColor }) => {
const theme = useTheme();
return (
<Card style={[styles.metricCard, { backgroundColor: theme.colors.surface }]}>
<Card.Content>
<Text variant="bodySmall" style={{ color: theme.colors.onSurfaceVariant }}>
{label}
</Text>
<Text variant="headlineMedium" style={{ color: valueColor, fontWeight: '700' }}>
{value}
</Text>
<Text variant="bodySmall" style={{ color: theme.colors.onSurfaceVariant }}>
{subtitle}
</Text>
</Card.Content>
</Card>
);
};
/**
* Écran principal — tableau de bord.
* Affiche les métriques clés (total workflows, taux de succès)
* et les 5 dernières exécutions avec leur statut.
* Supporte le pull-to-refresh via useWorkflows.
*/
const DashboardScreen: React.FC = () => {
const theme = useTheme();
const { workflows, isLoading: wLoading, isRefreshing, refresh } = useWorkflows();
const { executions, isLoading: eLoading } = useExecutions({ limit: 5 });
/** Métriques calculées localement depuis l'état des hooks */
const metrics = useMemo(() => {
const successCount = executions.filter((e) => e.status === 'success').length;
return {
total: workflows.length,
active: workflows.filter((w) => w.active).length,
successRate:
executions.length > 0
? Math.round((successCount / executions.length) * 100)
: 0,
};
}, [workflows, executions]);
/**
* Couleur du taux de succès : vert > 80%, orange > 50%, rouge sinon.
* Donne un indicateur visuel immédiat de la santé des workflows.
*/
const successRateColor =
metrics.successRate >= 80
? '#A5D6A7'
: metrics.successRate >= 50
? '#FFCC80'
: '#EF9A9A';
const isLoading = wLoading || eLoading;
return (
<ScrollView
style={[styles.container, { backgroundColor: theme.colors.background }]}
refreshControl={
<RefreshControl
refreshing={isRefreshing}
onRefresh={refresh}
tintColor={theme.colors.primary}
/>
}
>
<Text
variant="headlineSmall"
style={[styles.title, { color: theme.colors.onBackground }]}
>
Tableau de bord
</Text>
{isLoading ? (
<ActivityIndicator style={styles.loader} color={theme.colors.primary} />
) : (
<>
{/* Métriques rapides */}
<View style={styles.metricsRow}>
<MetricCard
label="Workflows"
value={metrics.total}
subtitle={`${metrics.active} actifs`}
valueColor={theme.colors.primary}
/>
<MetricCard
label="Taux de succès"
value={`${metrics.successRate}%`}
subtitle="5 dernières exec."
valueColor={successRateColor}
/>
</View>
{/* Section dernières exécutions */}
<Text
variant="titleMedium"
style={[styles.sectionTitle, { color: theme.colors.onBackground }]}
>
Exécutions récentes
</Text>
{executions.length === 0 ? (
<Text style={[styles.empty, { color: theme.colors.onSurfaceVariant }]}>
Aucune exécution récente.
</Text>
) : (
executions.slice(0, 5).map((exec) => (
<Card
key={exec.id}
style={[styles.execCard, { backgroundColor: theme.colors.surface }]}
>
<Card.Content style={styles.execHeader}>
<Text
variant="bodyMedium"
numberOfLines={1}
style={{ color: theme.colors.onSurface, flex: 1, marginRight: 8 }}
>
{exec.workflowName ?? `Workflow ${exec.workflowId}`}
</Text>
<StatusBadge status={exec.status} size="small" />
</Card.Content>
<Card.Content style={styles.execMeta}>
<Text variant="bodySmall" style={{ color: theme.colors.onSurfaceVariant }}>
{formatShortDate(exec.startedAt)}
</Text>
</Card.Content>
</Card>
))
)}
</>
)}
</ScrollView>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
},
title: {
margin: 16,
fontWeight: '700',
},
loader: {
marginTop: 48,
},
metricsRow: {
flexDirection: 'row',
marginHorizontal: 16,
gap: 12,
marginBottom: 8,
},
metricCard: {
flex: 1,
elevation: 2,
},
sectionTitle: {
marginHorizontal: 16,
marginTop: 20,
marginBottom: 8,
fontWeight: '600',
},
execCard: {
marginHorizontal: 16,
marginVertical: 4,
elevation: 1,
},
execHeader: {
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingBottom: 4,
},
execMeta: {
paddingTop: 0,
},
empty: {
textAlign: 'center',
marginTop: 24,
fontStyle: 'italic',
},
});
export default DashboardScreen;
+134
View File
@@ -0,0 +1,134 @@
import React, { useState } from 'react';
import { FlatList, StyleSheet, View } from 'react-native';
import { Text, Chip, Snackbar, useTheme } from 'react-native-paper';
import { useRouter } from 'expo-router';
import { useExecutions } from '../hooks/useExecutions';
import ExecutionCard from '../components/ExecutionCard';
import SkeletonLoader from '../components/SkeletonLoader';
import { ExecutionStatus } from '../api/executions';
/** Filtres de statut disponibles dans l'interface */
const STATUS_FILTERS: Array<{ label: string; value: ExecutionStatus | undefined }> = [
{ label: 'Tous', value: undefined },
{ label: 'Succès', value: 'success' },
{ label: 'Erreur', value: 'error' },
{ label: 'En cours', value: 'running' },
];
/**
* Écran d'historique des exécutions.
* Permet de filtrer par statut via des chips et de naviguer vers
* les logs détaillés d'une exécution via Expo Router.
*/
const ExecutionsScreen: React.FC = () => {
const theme = useTheme();
const router = useRouter();
const [activeFilter, setActiveFilter] = useState<ExecutionStatus | undefined>(undefined);
const [snackMessage, setSnackMessage] = useState('');
const {
executions,
isLoading,
isRefreshing,
refresh,
removeExecution,
setStatusFilter,
} = useExecutions({ limit: 50 });
/**
* Change le filtre actif et notifie le hook pour relancer le fetch.
*
* @param value - Nouveau statut filtré, ou undefined pour tout afficher
*/
const handleFilterChange = (value: ExecutionStatus | undefined): void => {
setActiveFilter(value);
setStatusFilter(value);
};
/**
* Supprime une exécution et affiche une confirmation.
*
* @param id - Identifiant de l'exécution à supprimer
*/
const handleDelete = async (id: string): Promise<void> => {
await removeExecution(id);
setSnackMessage('Exécution supprimée');
};
return (
<View style={[styles.container, { backgroundColor: theme.colors.background }]}>
{/* Barre de filtres de statut horizontale */}
<View style={styles.filterBar}>
{STATUS_FILTERS.map((filter) => (
<Chip
key={filter.label}
selected={activeFilter === filter.value}
onPress={() => handleFilterChange(filter.value)}
style={styles.chip}
compact
>
{filter.label}
</Chip>
))}
</View>
{isLoading ? (
<SkeletonLoader count={8} />
) : (
<FlatList
data={executions}
keyExtractor={(item) => item.id}
renderItem={({ item }) => (
<ExecutionCard
execution={item}
onViewLogs={(id) => router.push(`/execution/${id}` as `/${string}`)}
onDelete={handleDelete}
/>
)}
refreshing={isRefreshing}
onRefresh={refresh}
contentContainerStyle={styles.list}
ListEmptyComponent={
<Text style={[styles.empty, { color: theme.colors.onSurfaceVariant }]}>
Aucune exécution trouvée.
</Text>
}
/>
)}
<Snackbar
visible={!!snackMessage}
onDismiss={() => setSnackMessage('')}
duration={2500}
>
{snackMessage}
</Snackbar>
</View>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
},
filterBar: {
flexDirection: 'row',
paddingHorizontal: 16,
paddingVertical: 8,
gap: 8,
},
chip: {
height: 32,
},
list: {
paddingVertical: 4,
paddingBottom: 24,
},
empty: {
textAlign: 'center',
marginTop: 48,
fontStyle: 'italic',
},
});
export default ExecutionsScreen;
+207
View File
@@ -0,0 +1,207 @@
import React, { useEffect, useState } from 'react';
import { ScrollView, StyleSheet, View, ActivityIndicator } from 'react-native';
import { Text, Card, Divider, useTheme } from 'react-native-paper';
import { useLocalSearchParams } from 'expo-router';
import { useExecutions } from '../hooks/useExecutions';
import StatusBadge from '../components/StatusBadge';
import { formatShortDate, formatDuration, formatMode } from '../utils/formatters';
import { NodeExecutionData } from '../api/executions';
/**
* Écran de logs détaillés d'une exécution n8n.
* Reçoit l'identifiant de l'exécution via les paramètres de route Expo Router (/execution/:id).
* Charge puis affiche les données de chaque nœud exécuté, avec les erreurs éventuelles.
*/
const LogsScreen: React.FC = () => {
const theme = useTheme();
const { id } = useLocalSearchParams<{ id: string }>();
const { selectedExecution, loadExecutionDetail } = useExecutions();
const [isLoading, setIsLoading] = useState(true);
/** Charge les logs détaillés dès que l'ID de route est disponible */
useEffect(() => {
if (id) {
loadExecutionDetail(id).finally(() => setIsLoading(false));
}
}, [id]);
if (isLoading) {
return (
<View style={[styles.centered, { backgroundColor: theme.colors.background }]}>
<ActivityIndicator color={theme.colors.primary} />
</View>
);
}
if (!selectedExecution) {
return (
<View style={[styles.centered, { backgroundColor: theme.colors.background }]}>
<Text style={{ color: theme.colors.onSurfaceVariant }}>
Exécution introuvable ou données indisponibles.
</Text>
</View>
);
}
const runData = selectedExecution.data?.resultData?.runData ?? {};
const globalError = selectedExecution.data?.resultData?.error;
const nodeNames = Object.keys(runData);
return (
<ScrollView
style={[styles.container, { backgroundColor: theme.colors.background }]}
contentContainerStyle={styles.content}
>
{/* En-tête : résumé de l'exécution */}
<Card style={[styles.headerCard, { backgroundColor: theme.colors.surface }]}>
<Card.Content>
<View style={styles.headerRow}>
<Text
variant="titleMedium"
style={{ color: theme.colors.onSurface, flex: 1, marginRight: 8 }}
numberOfLines={2}
>
{selectedExecution.workflowName ?? `Workflow ${selectedExecution.workflowId}`}
</Text>
<StatusBadge status={selectedExecution.status} />
</View>
<Text
variant="bodySmall"
style={{ color: theme.colors.onSurfaceVariant, marginTop: 6 }}
>
{formatMode(selectedExecution.mode)} ·{' '}
{formatShortDate(selectedExecution.startedAt)} ·{' '}
{formatDuration(selectedExecution.startedAt, selectedExecution.stoppedAt)}
</Text>
</Card.Content>
</Card>
{/* Erreur globale de l'exécution (niveau workflow) */}
{globalError && (
<Card style={[styles.errorCard, { backgroundColor: '#2C0000' }]}>
<Card.Content>
<Text variant="labelMedium" style={{ color: '#EF9A9A', marginBottom: 4 }}>
Erreur workflow
</Text>
<Text
variant="bodySmall"
style={{ color: '#FFCDD2', fontFamily: 'monospace' }}
selectable
>
{globalError.message}
</Text>
</Card.Content>
</Card>
)}
{/* Liste des nœuds exécutés */}
<Text
variant="titleSmall"
style={[styles.sectionTitle, { color: theme.colors.onBackground }]}
>
Nœuds exécutés ({nodeNames.length})
</Text>
{nodeNames.map((nodeName, index) => {
const nodeRuns: NodeExecutionData[] = runData[nodeName] ?? [];
const firstRun = nodeRuns[0];
const hasError = !!firstRun?.error;
return (
<Card
key={nodeName}
style={[
styles.nodeCard,
{ backgroundColor: hasError ? '#1C0000' : theme.colors.surface },
]}
>
<Card.Content>
{/* Nom du nœud et durée d'exécution */}
<View style={styles.nodeHeader}>
<Text
variant="bodyMedium"
style={{ color: theme.colors.onSurface, fontWeight: '600', flex: 1 }}
>
{index + 1}. {nodeName}
</Text>
{firstRun && (
<Text variant="bodySmall" style={{ color: theme.colors.onSurfaceVariant }}>
{firstRun.executionTime}ms
</Text>
)}
</View>
{/* Erreur spécifique à ce nœud */}
{firstRun?.error && (
<>
<Divider style={{ marginVertical: 6 }} />
<Text
variant="bodySmall"
style={{ color: '#EF9A9A', fontFamily: 'monospace' }}
selectable
>
{firstRun.error.message}
</Text>
</>
)}
</Card.Content>
</Card>
);
})}
{nodeNames.length === 0 && (
<Text style={[styles.empty, { color: theme.colors.onSurfaceVariant }]}>
Aucune donnée de nœud disponible pour cette exécution.
</Text>
)}
</ScrollView>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
},
content: {
padding: 16,
paddingBottom: 40,
},
centered: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
},
headerCard: {
marginBottom: 12,
elevation: 2,
},
headerRow: {
flexDirection: 'row',
alignItems: 'flex-start',
justifyContent: 'space-between',
},
errorCard: {
marginBottom: 12,
elevation: 2,
},
sectionTitle: {
marginBottom: 8,
fontWeight: '600',
},
nodeCard: {
marginBottom: 8,
elevation: 1,
},
nodeHeader: {
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
},
empty: {
textAlign: 'center',
marginTop: 24,
fontStyle: 'italic',
},
});
export default LogsScreen;
+330
View File
@@ -0,0 +1,330 @@
import React, { useState, useEffect } from 'react';
import { ScrollView, StyleSheet, View, Alert } from 'react-native';
import {
Text,
TextInput,
Button,
Switch,
Divider,
useTheme,
Snackbar,
} from 'react-native-paper';
import * as SecureStore from 'expo-secure-store';
import * as LocalAuthentication from 'expo-local-authentication';
import { useAppStore } from '../store/appStore';
import { SECURE_STORE_KEYS } from '../api/client';
/**
* Intervalles de polling proposés à l'utilisateur.
* Le choix 30s est le défaut — bon compromis batterie/fraîcheur.
*/
const POLLING_INTERVALS: Array<{ label: string; value: number }> = [
{ label: '15s', value: 15_000 },
{ label: '30s', value: 30_000 },
{ label: '1 min', value: 60_000 },
{ label: '5 min', value: 300_000 },
];
/**
* Écran de configuration de l'application.
* Gère :
* - La connexion à l'instance n8n (URL + clé API + token HAProxy)
* - L'activation de l'authentification biométrique
* - L'intervalle de polling automatique
*
* SÉCURITÉ : aucune valeur sensible n'est stockée dans l'état React au-delà de la saisie.
* Après sauvegarde, apiKey et appToken sont vidés des champs et ne vivent que dans le secure store.
*/
const SettingsScreen: React.FC = () => {
const theme = useTheme();
const { config, preferences, setConfig, setPreferences } = useAppStore();
const [baseUrl, setBaseUrl] = useState('');
const [apiKey, setApiKey] = useState('');
const [appToken, setAppToken] = useState('');
const [urlError, setUrlError] = useState('');
const [isBiometricAvailable, setIsBiometricAvailable] = useState(false);
const [snackMessage, setSnackMessage] = useState('');
const [isSaving, setIsSaving] = useState(false);
/** Vérifie la disponibilité du hardware biométrique sur cet appareil */
useEffect(() => {
LocalAuthentication.hasHardwareAsync().then(setIsBiometricAvailable);
}, []);
/** Pré-remplit l'URL depuis le store (jamais la clé API ni le token) */
useEffect(() => {
setBaseUrl(config.baseUrl);
}, [config.baseUrl]);
/**
* Valide que l'URL est bien en HTTPS (TLS obligatoire).
* L'app refuse toute URL HTTP pour protéger les secrets en transit.
*
* @param url - URL saisie par l'utilisateur
* @returns true si l'URL est valide et en HTTPS
*/
const validateUrl = (url: string): boolean => {
if (!url.startsWith('https://')) {
setUrlError("L'URL doit commencer par https:// (TLS obligatoire)");
return false;
}
try {
new URL(url);
setUrlError('');
return true;
} catch {
setUrlError('URL invalide — vérifiez le format');
return false;
}
};
/**
* Sauvegarde la configuration dans le secure store Android Keystore.
* Vide les champs sensibles de l'état React immédiatement après sauvegarde.
*/
const handleSave = async (): Promise<void> => {
if (!validateUrl(baseUrl)) return;
if (!apiKey.trim()) {
setSnackMessage('La clé API n8n est obligatoire');
return;
}
setIsSaving(true);
try {
await setConfig(baseUrl.trim(), apiKey.trim(), appToken.trim());
// Nettoyage immédiat des champs sensibles de l'état React
setApiKey('');
setAppToken('');
setSnackMessage('Configuration sauvegardée avec succès');
} catch {
setSnackMessage('Erreur lors de la sauvegarde');
} finally {
setIsSaving(false);
}
};
/**
* Réinitialise complètement la configuration après confirmation explicite.
* Supprime toutes les entrées du secure store.
*/
const handleReset = (): void => {
Alert.alert(
'Réinitialiser la configuration',
'Toutes les données de connexion seront supprimées. Cette action est irréversible.',
[
{ text: 'Annuler', style: 'cancel' },
{
text: 'Réinitialiser',
style: 'destructive',
onPress: async () => {
await Promise.all([
SecureStore.deleteItemAsync(SECURE_STORE_KEYS.BASE_URL),
SecureStore.deleteItemAsync(SECURE_STORE_KEYS.API_KEY),
SecureStore.deleteItemAsync(SECURE_STORE_KEYS.APP_TOKEN),
SecureStore.deleteItemAsync(SECURE_STORE_KEYS.BIOMETRIC_ENABLED),
]);
setBaseUrl('');
setApiKey('');
setAppToken('');
setSnackMessage('Configuration réinitialisée');
},
},
]
);
};
return (
<ScrollView
style={[styles.container, { backgroundColor: theme.colors.background }]}
contentContainerStyle={styles.content}
keyboardShouldPersistTaps="handled"
>
{/* Section : connexion à l'instance n8n */}
<Text
variant="titleMedium"
style={[styles.sectionTitle, { color: theme.colors.onBackground }]}
>
Connexion n8n
</Text>
<TextInput
label="URL de l'instance (https://…)"
value={baseUrl}
onChangeText={(v) => {
setBaseUrl(v);
if (urlError) validateUrl(v);
}}
onBlur={() => baseUrl && validateUrl(baseUrl)}
error={!!urlError}
mode="outlined"
style={styles.input}
autoCapitalize="none"
autoCorrect={false}
keyboardType="url"
left={<TextInput.Icon icon="server" />}
/>
{!!urlError && (
<Text
variant="bodySmall"
style={{ color: theme.colors.error, marginBottom: 8, marginLeft: 4 }}
>
{urlError}
</Text>
)}
<TextInput
label="Clé API n8n"
value={apiKey}
onChangeText={setApiKey}
secureTextEntry
mode="outlined"
style={styles.input}
autoCapitalize="none"
autoCorrect={false}
left={<TextInput.Icon icon="key" />}
placeholder={config.isConfigured ? '••••••••••••••••' : undefined}
/>
<TextInput
label="Token HAProxy (X-App-Token)"
value={appToken}
onChangeText={setAppToken}
secureTextEntry
mode="outlined"
style={styles.input}
autoCapitalize="none"
autoCorrect={false}
left={<TextInput.Icon icon="shield-key" />}
placeholder={config.isConfigured ? '••••••••••••••••' : undefined}
/>
<Button
mode="contained"
onPress={handleSave}
loading={isSaving}
disabled={isSaving}
style={styles.saveButton}
>
Sauvegarder
</Button>
<Divider style={styles.divider} />
{/* Section : préférences utilisateur */}
<Text
variant="titleMedium"
style={[styles.sectionTitle, { color: theme.colors.onBackground }]}
>
Préférences
</Text>
{/* Biométrie — affichée uniquement si le hardware est disponible */}
{isBiometricAvailable && (
<View style={styles.row}>
<Text
variant="bodyMedium"
style={{ color: theme.colors.onBackground, flex: 1 }}
>
Déverrouillage biométrique
</Text>
<Switch
value={preferences.biometricEnabled}
onValueChange={(v) => setPreferences({ biometricEnabled: v })}
color={theme.colors.primary}
/>
</View>
)}
{/* Intervalle de rafraîchissement automatique */}
<Text
variant="bodyMedium"
style={{ color: theme.colors.onBackground, marginBottom: 10, marginTop: 8 }}
>
Intervalle de rafraîchissement
</Text>
<View style={styles.intervalRow}>
{POLLING_INTERVALS.map((item) => (
<Button
key={item.value}
mode={preferences.pollingInterval === item.value ? 'contained' : 'outlined'}
onPress={() => setPreferences({ pollingInterval: item.value })}
style={styles.intervalButton}
compact
>
{item.label}
</Button>
))}
</View>
<Divider style={styles.divider} />
{/* Zone de danger — réinitialisation */}
<Text
variant="titleMedium"
style={[styles.sectionTitle, { color: theme.colors.error }]}
>
Zone de danger
</Text>
<Button
mode="outlined"
onPress={handleReset}
textColor={theme.colors.error}
style={[styles.resetButton, { borderColor: theme.colors.error }]}
>
Réinitialiser la configuration
</Button>
<Snackbar
visible={!!snackMessage}
onDismiss={() => setSnackMessage('')}
duration={3000}
>
{snackMessage}
</Snackbar>
</ScrollView>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
},
content: {
padding: 16,
paddingBottom: 40,
},
sectionTitle: {
fontWeight: '600',
marginBottom: 12,
},
input: {
marginBottom: 12,
},
saveButton: {
marginTop: 4,
marginBottom: 8,
},
divider: {
marginVertical: 20,
},
row: {
flexDirection: 'row',
alignItems: 'center',
marginBottom: 16,
},
intervalRow: {
flexDirection: 'row',
gap: 8,
flexWrap: 'wrap',
},
intervalButton: {
flex: 1,
minWidth: 60,
},
resetButton: {
marginTop: 4,
},
});
export default SettingsScreen;
+99
View File
@@ -0,0 +1,99 @@
import React, { useState } from 'react';
import { FlatList, StyleSheet, View } from 'react-native';
import { Text, Snackbar, useTheme } from 'react-native-paper';
import { useWorkflows } from '../hooks/useWorkflows';
import WorkflowCard from '../components/WorkflowCard';
import SkeletonLoader from '../components/SkeletonLoader';
import { Workflow } from '../api/workflows';
/**
* Écran de liste de tous les workflows de l'instance n8n.
* Supporte le pull-to-refresh et affiche un squelette au premier chargement.
* Les actions (toggle, run) sont déléguées à useWorkflows — aucun appel API direct ici.
*/
const WorkflowsScreen: React.FC = () => {
const theme = useTheme();
const [snackMessage, setSnackMessage] = useState('');
const { workflows, isLoading, isRefreshing, refresh, toggleWorkflow, triggerWorkflow } =
useWorkflows();
/**
* Déclenche l'exécution d'un workflow et affiche une confirmation à l'utilisateur.
*
* @param id - Identifiant du workflow à lancer
*/
const handleRun = async (id: string): Promise<void> => {
try {
await triggerWorkflow(id);
setSnackMessage('Exécution déclenchée');
} catch {
// L'intercepteur Axios a déjà affiché le toast d'erreur
}
};
/**
* Bascule le statut actif/inactif avec retour visuel.
* L'état local est mis à jour par le hook après confirmation serveur.
*
* @param workflow - Workflow à basculer
*/
const handleToggle = async (workflow: Workflow): Promise<void> => {
await toggleWorkflow(workflow);
setSnackMessage(workflow.active ? 'Workflow désactivé' : 'Workflow activé');
};
return (
<View style={[styles.container, { backgroundColor: theme.colors.background }]}>
{isLoading ? (
<SkeletonLoader count={6} />
) : (
<FlatList
data={workflows}
keyExtractor={(item) => item.id}
renderItem={({ item }) => (
<WorkflowCard
workflow={item}
onToggle={handleToggle}
onRun={handleRun}
/>
)}
refreshing={isRefreshing}
onRefresh={refresh}
contentContainerStyle={styles.list}
ListEmptyComponent={
<Text style={[styles.empty, { color: theme.colors.onSurfaceVariant }]}>
Aucun workflow trouvé. Vérifiez la connexion à l&apos;instance n8n.
</Text>
}
/>
)}
{/* Confirmation d'action non destructive */}
<Snackbar
visible={!!snackMessage}
onDismiss={() => setSnackMessage('')}
duration={2500}
>
{snackMessage}
</Snackbar>
</View>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
},
list: {
paddingVertical: 8,
paddingBottom: 80,
},
empty: {
textAlign: 'center',
marginTop: 48,
marginHorizontal: 32,
fontStyle: 'italic',
},
});
export default WorkflowsScreen;
+118
View File
@@ -0,0 +1,118 @@
import { create } from 'zustand';
import * as SecureStore from 'expo-secure-store';
import { SECURE_STORE_KEYS } from '../api/client';
/** Configuration de connexion à l'instance n8n auto-hébergée */
interface AppConfig {
/** URL de base de l'instance (ex: https://n8n.example.com) */
baseUrl: string;
/** Vrai si une configuration complète a déjà été sauvegardée dans le secure store */
isConfigured: boolean;
}
/** Préférences utilisateur persistées localement */
interface AppPreferences {
/** Intervalle de polling automatique en millisecondes */
pollingInterval: number;
/** Active l'authentification biométrique au démarrage de l'app */
biometricEnabled: boolean;
}
/** Interface complète de l'état global Zustand */
interface AppState {
config: AppConfig;
preferences: AppPreferences;
/** Vrai si l'authentification biométrique a été validée pour la session courante */
isAuthenticated: boolean;
isLoading: boolean;
/**
* Sauvegarde baseUrl, apiKey et appToken dans le secure store Android Keystore.
* N'appeler qu'avec des valeurs non vides et validées (HTTPS obligatoire pour baseUrl).
*
* @param baseUrl - URL de l'instance n8n en HTTPS
* @param apiKey - Clé API n8n (scope minimal recommandé)
* @param appToken - Token personnalisé HAProxy (X-App-Token)
*/
setConfig: (baseUrl: string, apiKey: string, appToken: string) => Promise<void>;
/**
* Charge la configuration au démarrage depuis le secure store.
* Appelé une seule fois par le root layout (_layout.tsx).
*/
loadConfig: () => Promise<void>;
/**
* Met à jour les préférences utilisateur de manière partielle.
*
* @param prefs - Sous-ensemble des préférences à modifier
*/
setPreferences: (prefs: Partial<AppPreferences>) => void;
/**
* Marque la session comme authentifiée (biométrie validée).
*
* @param auth - true si la biométrie a été acceptée
*/
setAuthenticated: (auth: boolean) => void;
}
export const useAppStore = create<AppState>((set) => ({
config: {
baseUrl: '',
isConfigured: false,
},
preferences: {
pollingInterval: 30_000, // 30 secondes — bon compromis entre fraîcheur et batterie
biometricEnabled: false,
},
isAuthenticated: false,
isLoading: false,
setConfig: async (baseUrl, apiKey, appToken) => {
// Écriture parallèle dans le secure store pour minimiser la latence
await Promise.all([
SecureStore.setItemAsync(SECURE_STORE_KEYS.BASE_URL, baseUrl),
SecureStore.setItemAsync(SECURE_STORE_KEYS.API_KEY, apiKey),
SecureStore.setItemAsync(SECURE_STORE_KEYS.APP_TOKEN, appToken),
]);
// On ne stocke que l'URL dans l'état React ; jamais la clé API ni le token
set({ config: { baseUrl, isConfigured: true } });
},
loadConfig: async () => {
set({ isLoading: true });
try {
const [baseUrl, biometricRaw] = await Promise.all([
SecureStore.getItemAsync(SECURE_STORE_KEYS.BASE_URL),
SecureStore.getItemAsync(SECURE_STORE_KEYS.BIOMETRIC_ENABLED),
]);
set({
config: {
baseUrl: baseUrl ?? '',
isConfigured: !!baseUrl,
},
preferences: {
pollingInterval: 30_000,
biometricEnabled: biometricRaw === 'true',
},
});
} finally {
set({ isLoading: false });
}
},
setPreferences: (prefs) => {
if ('biometricEnabled' in prefs) {
SecureStore.setItemAsync(
SECURE_STORE_KEYS.BIOMETRIC_ENABLED,
prefs.biometricEnabled ? 'true' : 'false'
).catch(() => {});
}
set((state) => ({
preferences: { ...state.preferences, ...prefs },
}));
},
setAuthenticated: (auth) => set({ isAuthenticated: auth }),
}));
+73
View File
@@ -0,0 +1,73 @@
import { AxiosError } from 'axios';
/** Signature du callback de toast enregistré depuis le root layout */
type ToastCallback = (message: string, type: 'error' | 'warning' | 'info') => void;
/** Référence au callback toast, initialisée au montage du root layout */
let toastCallback: ToastCallback | null = null;
/**
* Enregistre le callback de toast depuis le root layout (_layout.tsx).
* Doit être appelé une seule fois au démarrage de l'application.
*
* @param callback - Fonction qui affiche un toast dans l'UI
*/
export const registerToastCallback = (callback: ToastCallback): void => {
toastCallback = callback;
};
/**
* Affiche un toast via le callback enregistré.
* Ne fait rien si le callback n'a pas encore été enregistré.
*/
const showToast = (message: string, type: 'error' | 'warning' | 'info' = 'error'): void => {
if (toastCallback) {
toastCallback(message, type);
}
};
/**
* Extrait un message d'erreur lisible depuis une erreur Axios ou générique.
* Ne logue jamais les détails de la requête (qui pourraient contenir des headers secrets).
*
* @param error - Erreur Axios ou Error générique
* @returns Message d'erreur lisible en français
*/
const extractMessage = (error: unknown): string => {
if (error instanceof AxiosError) {
if (error.response) {
// Erreur HTTP avec réponse du serveur (4xx, 5xx)
const data = error.response.data as { message?: string; error?: string } | null;
return data?.message ?? data?.error ?? `Erreur ${error.response.status}`;
}
if (error.request) {
// Requête émise mais pas de réponse : timeout ou serveur inaccessible
return 'Serveur inaccessible. Vérifiez votre connexion ou l\'URL n8n.';
}
return error.message;
}
if (error instanceof Error) {
return error.message;
}
return 'Une erreur inattendue est survenue.';
};
/**
* Point d'entrée unifié pour la gestion des erreurs applicatives.
* Affiche un toast et émet un warning console en développement UNIQUEMENT.
* Jamais de log en production, jamais de log des valeurs de headers ou tokens.
*
* @param error - Erreur à traiter
* @param context - Contexte optionnel (nom de la fonction appelante)
*/
export const handleError = (error: unknown, context?: string): void => {
const message = extractMessage(error);
const fullMessage = context ? `[${context}] ${message}` : message;
if (__DEV__) {
// En développement : log du message uniquement, jamais des headers/tokens
console.warn(`[ErrorHandler] ${fullMessage}`);
}
showToast(fullMessage, 'error');
};
+87
View File
@@ -0,0 +1,87 @@
import { formatDistanceToNow, format, differenceInSeconds } from 'date-fns';
import { fr } from 'date-fns/locale';
/**
* Formate une date ISO en temps relatif lisible en français.
* Ex : "il y a 3 minutes", "dans 2 heures"
*
* @param dateString - Date au format ISO 8601
* @returns Chaîne relative en français, ou "date inconnue" si parsing impossible
*/
export const formatRelativeDate = (dateString: string): string => {
try {
return formatDistanceToNow(new Date(dateString), { addSuffix: true, locale: fr });
} catch {
return 'date inconnue';
}
};
/**
* Formate une date ISO en format court DD/MM/YYYY HH:mm.
*
* @param dateString - Date au format ISO 8601
* @returns Chaîne formatée, ou "date inconnue" si parsing impossible
*/
export const formatShortDate = (dateString: string): string => {
try {
return format(new Date(dateString), 'dd/MM/yyyy HH:mm', { locale: fr });
} catch {
return 'date inconnue';
}
};
/**
* Calcule et formate la durée entre deux dates.
* Si stoppedAt est absent, calcule jusqu'à maintenant (exécution en cours).
*
* @param startedAt - Date de début ISO 8601
* @param stoppedAt - Date de fin ISO 8601 (optionnelle)
* @returns Durée formatée ex : "2m 34s", "45s"
*/
export const formatDuration = (startedAt: string, stoppedAt?: string): string => {
try {
const start = new Date(startedAt);
const end = stoppedAt ? new Date(stoppedAt) : new Date();
const seconds = differenceInSeconds(end, start);
if (seconds < 60) return `${seconds}s`;
const minutes = Math.floor(seconds / 60);
const remainingSeconds = seconds % 60;
return remainingSeconds > 0 ? `${minutes}m ${remainingSeconds}s` : `${minutes}m`;
} catch {
return 'durée inconnue';
}
};
/**
* Traduit le statut d'une exécution n8n en libellé français.
*
* @param status - Statut brut de l'API n8n
* @returns Libellé français correspondant
*/
export const formatStatus = (status: string): string => {
const statusMap: Record<string, string> = {
success: 'Succès',
error: 'Erreur',
waiting: 'En attente',
running: 'En cours',
canceled: 'Annulé',
};
return statusMap[status] ?? status;
};
/**
* Traduit le mode de déclenchement d'une exécution n8n.
*
* @param mode - Mode brut retourné par l'API
* @returns Libellé français correspondant
*/
export const formatMode = (mode: string): string => {
const modeMap: Record<string, string> = {
manual: 'Manuel',
trigger: 'Déclencheur',
webhook: 'Webhook',
internal: 'Interne',
retry: 'Réessai',
};
return modeMap[mode] ?? mode;
};
-53
View File
@@ -1,53 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIDkjCCAxmgAwIBAgISBT2qlP2wn24Guv5h7k0ByET9MAoGCCqGSM49BAMDMDIx
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF
ODAeFw0yNTEwMTIwNTU0NTBaFw0yNjAxMTAwNTU0NDlaMB0xGzAZBgNVBAMTEmFw
Lmd5b3phbWFuY2F2ZS5mcjBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABP0WBe5j
0Ja8iQL1Xc7b80y6XHigavSCo1Jf+iikBfqaj1YidtH9+4V88WCRZJgTETSLAm8f
J5KWy8rrdS4UJnajggIiMIICHjAOBgNVHQ8BAf8EBAMCB4AwHQYDVR0lBBYwFAYI
KwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFOEVwQXt
gObUsls8MpDoLtpYxokFMB8GA1UdIwQYMBaAFI8NE6L2Ln7RUGwzGDhdWY4jcpHK
MDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcwAoYWaHR0cDovL2U4LmkubGVuY3Iu
b3JnLzAdBgNVHREEFjAUghJhcC5neW96YW1hbmNhdmUuZnIwEwYDVR0gBAwwCjAI
BgZngQwBAgEwLgYDVR0fBCcwJTAjoCGgH4YdaHR0cDovL2U4LmMubGVuY3Iub3Jn
LzEyNi5jcmwwggEFBgorBgEEAdZ5AgQCBIH2BIHzAPEAdwBkEcRspBLsp4kcogIu
ALyrTygH1B41J6vq/tUDyX3N8AAAAZnXMftkAAAEAwBIMEYCIQDmqN+cv9fksyTo
HCEc9ugPveDSNC3XCd3i2nFc/JZ4nAIhAJ5FiFRej8HnayMmzH4IU6hjxd4D1d/Q
ssaTcikUQRnsAHYAGYbUxyiqb/66A294Kk0BkarOLXIxD67OXXBBLSVMx9QAAAGZ
1zH7cAAABAMARzBFAiAFfXId1W2bAS1rdkGkwdQ0iQErKLGUZRWAUbnq242OPgIh
ANBX0RmYwnMIyjuhpuwtELLL9HijywXBVZqO1MLOLVhMMAoGCCqGSM49BAMDA2cA
MGQCMGXIxwyc3QsDmbr9BODRL039ig55ge/DB8QkpXu1+qJXmsqKOE8lHz+VwQqp
RFezugIwJ/GgAmVLODa4txKcvADgb71fUAsfrwXjbZ7PKOLOVScD2UbHGZ9HEeQX
ZmxCj5LR
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEVjCCAj6gAwIBAgIQY5WTY8JOcIJxWRi/w9ftVjANBgkqhkiG9w0BAQsFADBP
MQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy
Y2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yNDAzMTMwMDAwMDBa
Fw0yNzAzMTIyMzU5NTlaMDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBF
bmNyeXB0MQswCQYDVQQDEwJFODB2MBAGByqGSM49AgEGBSuBBAAiA2IABNFl8l7c
S7QMApzSsvru6WyrOq44ofTUOTIzxULUzDMMNMchIJBwXOhiLxxxs0LXeb5GDcHb
R6EToMffgSZjO9SNHfY9gjMy9vQr5/WWOrQTZxh7az6NSNnq3u2ubT6HTKOB+DCB
9TAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMB
MBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFI8NE6L2Ln7RUGwzGDhdWY4j
cpHKMB8GA1UdIwQYMBaAFHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEB
BCYwJDAiBggrBgEFBQcwAoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzATBgNVHSAE
DDAKMAgGBmeBDAECATAnBgNVHR8EIDAeMBygGqAYhhZodHRwOi8veDEuYy5sZW5j
ci5vcmcvMA0GCSqGSIb3DQEBCwUAA4ICAQBnE0hGINKsCYWi0Xx1ygxD5qihEjZ0
RI3tTZz1wuATH3ZwYPIp97kWEayanD1j0cDhIYzy4CkDo2jB8D5t0a6zZWzlr98d
AQFNh8uKJkIHdLShy+nUyeZxc5bNeMp1Lu0gSzE4McqfmNMvIpeiwWSYO9w82Ob8
otvXcO2JUYi3svHIWRm3+707DUbL51XMcY2iZdlCq4Wa9nbuk3WTU4gr6LY8MzVA
aDQG2+4U3eJ6qUF10bBnR1uuVyDYs9RhrwucRVnfuDj29CMLTsplM5f5wSV5hUpm
Uwp/vV7M4w4aGunt74koX71n4EdagCsL/Yk5+mAQU0+tue0JOfAV/R6t1k+Xk9s2
HMQFeoxppfzAVC04FdG9M+AC2JWxmFSt6BCuh3CEey3fE52Qrj9YM75rtvIjsm/1
Hl+u//Wqxnu1ZQ4jpa+VpuZiGOlWrqSP9eogdOhCGisnyewWJwRQOqK16wiGyZeR
xs/Bekw65vwSIaVkBruPiTfMOo0Zh4gVa8/qJgMbJbyrwwG97z/PRgmLKCDl8z3d
tA0Z7qq7fta0Gl24uyuB05dqI5J1LvAzKuWdIjT1tP8qCoxSE/xpix8hX2dt3h+/
jujUgFPFZ0EVZ0xSyBNRF3MboGZnYXFUxpNjTWPKpagDHJQmqrAcDmWJnMsFY3jS
u1igv3OefnWjSQ==
-----END CERTIFICATE-----
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIC9RwJ6hf/zTwJbX2ECrYxhrqlGBnn5lDYOQbkptuEL5oAoGCCqGSM49
AwEHoUQDQgAE/RYF7mPQlryJAvVdztvzTLpceKBq9IKjUl/6KKQF+pqPViJ20f37
hXzxYJFkmBMRNIsCbx8nkpbLyut1LhQmdg==
-----END EC PRIVATE KEY-----
-52
View File
@@ -1,52 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIDiDCCAw+gAwIBAgISBjEPeB90yypu/yMo3ERBZxu/MAoGCCqGSM49BAMDMDIx
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF
ODAeFw0yNTEyMTgwODI4NDFaFw0yNjAzMTgwODI4NDBaMBkxFzAVBgNVBAMTDmJp
bGxpc2RlYWQuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWicem9Ap+KeX
UhptU9fmrNVw9gjjJ/I/UQZ+is09ge7d50kBkd7ow8KvlNMxZtUXHF9opN02uF5x
BBE1cjdgOKOCAhwwggIYMA4GA1UdDwEB/wQEAwIHgDAdBgNVHSUEFjAUBggrBgEF
BQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUY9iEdJH8Wy6P
vI2UsPNCGO2oNTowHwYDVR0jBBgwFoAUjw0TovYuftFQbDMYOF1ZjiNykcowMgYI
KwYBBQUHAQEEJjAkMCIGCCsGAQUFBzAChhZodHRwOi8vZTguaS5sZW5jci5vcmcv
MBkGA1UdEQQSMBCCDmJpbGxpc2RlYWQuY29tMBMGA1UdIAQMMAowCAYGZ4EMAQIB
MC0GA1UdHwQmMCQwIqAgoB6GHGh0dHA6Ly9lOC5jLmxlbmNyLm9yZy82NC5jcmww
ggEEBgorBgEEAdZ5AgQCBIH1BIHyAPAAdQBJnJtp3h187Pw23s2HZKa4W68Kh4AZ
0VVS++nrKd34wwAAAZswyOllAAAEAwBGMEQCIDrTTWZoGb7rHC4psDleICdxEAaZ
lzTEcopW+93mVJtnAiBgPY32qCDjcauGf3JLjvtzFYcuOkiOEGBUHU6wa2riEQB3
AA5XlLzzrqk+MxssmQez95Dfm8I9cTIl3SGpJaxhxU4hAAABmzDI6WIAAAQDAEgw
RgIhAPILQ0gVGB+nKdbo6pVUD7gcy0qVkIxJqFVMrF/UcL+JAiEAzFw+AFQF/f+d
6d7gAbDAiLZiLVDrj8XbzQZaARzr+oIwCgYIKoZIzj0EAwMDZwAwZAIwT7lz+2+X
Rz17JLVsAXXhG6EzBhl25lVFhnfps89nC7ki+C2cctJgMaj3N/8HJ1MKAjBnaOs3
9Ax+9JrmIxpqtDhJmewSpT5n8kfhlqHNWoF843imflgJ8L8jnOC/hXVrh1w=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEVjCCAj6gAwIBAgIQY5WTY8JOcIJxWRi/w9ftVjANBgkqhkiG9w0BAQsFADBP
MQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy
Y2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yNDAzMTMwMDAwMDBa
Fw0yNzAzMTIyMzU5NTlaMDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBF
bmNyeXB0MQswCQYDVQQDEwJFODB2MBAGByqGSM49AgEGBSuBBAAiA2IABNFl8l7c
S7QMApzSsvru6WyrOq44ofTUOTIzxULUzDMMNMchIJBwXOhiLxxxs0LXeb5GDcHb
R6EToMffgSZjO9SNHfY9gjMy9vQr5/WWOrQTZxh7az6NSNnq3u2ubT6HTKOB+DCB
9TAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMB
MBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFI8NE6L2Ln7RUGwzGDhdWY4j
cpHKMB8GA1UdIwQYMBaAFHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEB
BCYwJDAiBggrBgEFBQcwAoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzATBgNVHSAE
DDAKMAgGBmeBDAECATAnBgNVHR8EIDAeMBygGqAYhhZodHRwOi8veDEuYy5sZW5j
ci5vcmcvMA0GCSqGSIb3DQEBCwUAA4ICAQBnE0hGINKsCYWi0Xx1ygxD5qihEjZ0
RI3tTZz1wuATH3ZwYPIp97kWEayanD1j0cDhIYzy4CkDo2jB8D5t0a6zZWzlr98d
AQFNh8uKJkIHdLShy+nUyeZxc5bNeMp1Lu0gSzE4McqfmNMvIpeiwWSYO9w82Ob8
otvXcO2JUYi3svHIWRm3+707DUbL51XMcY2iZdlCq4Wa9nbuk3WTU4gr6LY8MzVA
aDQG2+4U3eJ6qUF10bBnR1uuVyDYs9RhrwucRVnfuDj29CMLTsplM5f5wSV5hUpm
Uwp/vV7M4w4aGunt74koX71n4EdagCsL/Yk5+mAQU0+tue0JOfAV/R6t1k+Xk9s2
HMQFeoxppfzAVC04FdG9M+AC2JWxmFSt6BCuh3CEey3fE52Qrj9YM75rtvIjsm/1
Hl+u//Wqxnu1ZQ4jpa+VpuZiGOlWrqSP9eogdOhCGisnyewWJwRQOqK16wiGyZeR
xs/Bekw65vwSIaVkBruPiTfMOo0Zh4gVa8/qJgMbJbyrwwG97z/PRgmLKCDl8z3d
tA0Z7qq7fta0Gl24uyuB05dqI5J1LvAzKuWdIjT1tP8qCoxSE/xpix8hX2dt3h+/
jujUgFPFZ0EVZ0xSyBNRF3MboGZnYXFUxpNjTWPKpagDHJQmqrAcDmWJnMsFY3jS
u1igv3OefnWjSQ==
-----END CERTIFICATE-----
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIHXVZ8Pj4mFbk0T9X84qAECixUcAKWrLUYpoe2V9TtejoAoGCCqGSM49
AwEHoUQDQgAEWicem9Ap+KeXUhptU9fmrNVw9gjjJ/I/UQZ+is09ge7d50kBkd7o
w8KvlNMxZtUXHF9opN02uF5xBBE1cjdgOA==
-----END EC PRIVATE KEY-----
-86
View File
@@ -1,86 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFDjCCA/agAwIBAgISBTirsfL94yH52jQYywbrM4oLMA0GCSqGSIb3DQEBCwUA
MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
EwNSMTIwHhcNMjUxMDEyMDU1OTEzWhcNMjYwMTEwMDU1OTEyWjAkMSIwIAYDVQQD
Exlib29rbWFya3MuZ3lvemFtYW5jYXZlLmZyMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEAuGEQDPITA3hzriRzhNiaU1KOpu14msclOHX9wWcG/v7QE0EN
GPK7bGPqjzrutI09QoFigX4XLIzn0xrRpqKe+fNbgZWoWuOsCeayzKZmc3H+yoek
SysRTR9IDI2y3xkU7CZ3EkY7+aDl/9/rv/NBOyQQpDXRFO8SUSIyJ2UyegPaQJuj
tsp5p5fG/fkPkMlozPdVwSRUQOQkNqR8M8UcMnmpKc+eG8N/NS/vZ1sMmxWXx00q
VbqOUfQEcSDWGt9UdKPwLYZY6w5LmmRTYiE+wUmONbJv0ft3lzGGHzSdsWfp4+mE
U3FDOPsRGRRMM0b52R1uRTyaTYXdMtQxe4yi2QIDAQABo4ICKTCCAiUwDgYDVR0P
AQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMB
Af8EAjAAMB0GA1UdDgQWBBSkCB9fI7DXtbDuy7fU5fSJP7WPQTAfBgNVHSMEGDAW
gBQAtSnyLY5vMeibTK14Pvrc6QzR0jAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUH
MAKGF2h0dHA6Ly9yMTIuaS5sZW5jci5vcmcvMCQGA1UdEQQdMBuCGWJvb2ttYXJr
cy5neW96YW1hbmNhdmUuZnIwEwYDVR0gBAwwCjAIBgZngQwBAgEwLgYDVR0fBCcw
JTAjoCGgH4YdaHR0cDovL3IxMi5jLmxlbmNyLm9yZy8xMi5jcmwwggEEBgorBgEE
AdZ5AgQCBIH1BIHyAPAAdgCWl2S/VViXrfdDh2g3CEJ36fA61fak8zZuRqQ/D8qp
xgAAAZnXNf7BAAAEAwBHMEUCIQCFtgFu/TuVxAd7nax9T2v0zoViH65Ia2mqQeJR
iG24bgIgZaHDX1JLnjVvhbprooLvnCcZBxZw0xTrQFud27h8pfkAdgBJnJtp3h18
7Pw23s2HZKa4W68Kh4AZ0VVS++nrKd34wwAAAZnXNgZTAAAEAwBHMEUCIQCV37aO
2vvowzIZbpNJ/J9UA68bzzR09Y44uGXYCmkDXAIgY7QEtJnXsak5l/xmmbctT67z
fz+EH48PANqT8vPgR6wwDQYJKoZIhvcNAQELBQADggEBAG5DIrvRpkdr0BiKBNNi
wzJjKPKkPEDnSacBI+ztUrcY4Y4f+f5zUKsjN57/LfoCYtHdn/TPaVBP3gk4U8wJ
l32/oAOkP64wa9gx+00j1xG+YUc89/dXtVr/Z5ncIsbgxYvCDW7e0YYiHb3iNABM
2w6E8u3vzSAA7b+7WbkZi5RoQoXWve57HGB0jW+Y/eO6PpTapUJVaRZt+p974zJB
TlGU4b6HRWs1bRRNdoqoNfPtiaobu4RGVcY/RWtX9uKPCMp8EWVPwi9Ex1pSte/1
+5G3x0vkaLGrjH7l5kmm0ac2q0eojdZBQChk+iLI/jwGrW7knSEEBimS2+4iSLy6
nTA=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFBjCCAu6gAwIBAgIRAMISMktwqbSRcdxA9+KFJjwwDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjQwMzEzMDAwMDAw
WhcNMjcwMzEyMjM1OTU5WjAzMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg
RW5jcnlwdDEMMAoGA1UEAxMDUjEyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEA2pgodK2+lP474B7i5Ut1qywSf+2nAzJ+Npfs6DGPpRONC5kuHs0BUT1M
5ShuCVUxqqUiXXL0LQfCTUA83wEjuXg39RplMjTmhnGdBO+ECFu9AhqZ66YBAJpz
kG2Pogeg0JfT2kVhgTU9FPnEwF9q3AuWGrCf4yrqvSrWmMebcas7dA8827JgvlpL
Thjp2ypzXIlhZZ7+7Tymy05v5J75AEaz/xlNKmOzjmbGGIVwx1Blbzt05UiDDwhY
XS0jnV6j/ujbAKHS9OMZTfLuevYnnuXNnC2i8n+cF63vEzc50bTILEHWhsDp7CH4
WRt/uTp8n1wBnWIEwii9Cq08yhDsGwIDAQABo4H4MIH1MA4GA1UdDwEB/wQEAwIB
hjAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwEgYDVR0TAQH/BAgwBgEB
/wIBADAdBgNVHQ4EFgQUALUp8i2ObzHom0yteD763OkM0dIwHwYDVR0jBBgwFoAU
ebRZ5nu25eQBc4AIiMgaWPbpm24wMgYIKwYBBQUHAQEEJjAkMCIGCCsGAQUFBzAC
hhZodHRwOi8veDEuaS5sZW5jci5vcmcvMBMGA1UdIAQMMAowCAYGZ4EMAQIBMCcG
A1UdHwQgMB4wHKAaoBiGFmh0dHA6Ly94MS5jLmxlbmNyLm9yZy8wDQYJKoZIhvcN
AQELBQADggIBAI910AnPanZIZTKS3rVEyIV29BWEjAK/duuz8eL5boSoVpHhkkv3
4eoAeEiPdZLj5EZ7G2ArIK+gzhTlRQ1q4FKGpPPaFBSpqV/xbUb5UlAXQOnkHn3m
FVj+qYv87/WeY+Bm4sN3Ox8BhyaU7UAQ3LeZ7N1X01xxQe4wIAAE3JVLUCiHmZL+
qoCUtgYIFPgcg350QMUIWgxPXNGEncT921ne7nluI02V8pLUmClqXOsCwULw+PVO
ZCB7qOMxxMBoCUeL2Ll4oMpOSr5pJCpLN3tRA2s6P1KLs9TSrVhOk+7LX28NMUlI
usQ/nxLJID0RhAeFtPjyOCOscQBA53+NRjSCak7P4A5jX7ppmkcJECL+S0i3kXVU
y5Me5BbrU8973jZNv/ax6+ZK6TM8jWmimL6of6OrX7ZU6E2WqazzsFrLG3o2kySb
zlhSgJ81Cl4tv3SbYiYXnJExKQvzf83DYotox3f0fwv7xln1A2ZLplCb0O+l/AK0
YE0DS2FPxSAHi0iwMfW2nNHJrXcY3LLHD77gRgje4Eveubi2xxa+Nmk/hmhLdIET
iVDFanoCrMVIpQ59XWHkzdFmoHXHBV7oibVjGSO7ULSQ7MJ1Nz51phuDJSgAIU7A
0zrLnOrAj/dfrlEWRhCvAgbuwLZX1A2sjNjXoPOHbsPiy+lO1KF8/XY7
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAuGEQDPITA3hzriRzhNiaU1KOpu14msclOHX9wWcG/v7QE0EN
GPK7bGPqjzrutI09QoFigX4XLIzn0xrRpqKe+fNbgZWoWuOsCeayzKZmc3H+yoek
SysRTR9IDI2y3xkU7CZ3EkY7+aDl/9/rv/NBOyQQpDXRFO8SUSIyJ2UyegPaQJuj
tsp5p5fG/fkPkMlozPdVwSRUQOQkNqR8M8UcMnmpKc+eG8N/NS/vZ1sMmxWXx00q
VbqOUfQEcSDWGt9UdKPwLYZY6w5LmmRTYiE+wUmONbJv0ft3lzGGHzSdsWfp4+mE
U3FDOPsRGRRMM0b52R1uRTyaTYXdMtQxe4yi2QIDAQABAoIBABW8D2XPRXGDyfMt
xdZTqEGJOlqwJKbuMdOJiSu6xubZR9L1OKOHvZNF5fkTY98xxRZpZSDJqdatF4jZ
oPwpMF9bkh5g83MfYoDaSpp4RRx3xCbAvZvEzGnQdbBRJdRJwx8hW6jyUZCYKHS0
wzgh5z8e/b01wNtcYUbiJpJhSgV66jjWbnGWuhFcRVMyGsTnbVAozRL8qniWPkJU
/2j8WzVZRB7a69632e2UZ97LemK5r/H1TbvtLPjKZQby521lgRqLKphdf/MA2MHA
q75IbM/jZ8M9Uojqvzv3xjflm8BUNrqFOHmDyhRd1d8HcFx1o95ao8xrfNaiaVD2
xRDtU3kCgYEA86uqWyZ5Ljy5xN4uR/wE3b1/gk7OgSgMy+wuzmaw25tAbZaHFc9b
dUeoQhgnA5RezRIAEvefOm+y5PwrK++Li/EKyI/661gFRH4YC7tHZUAJXyd59PIb
wsfie9R01CNO0ixuVMGEVhKPXfRxcKT0DMmOPAfjlBYuXKNgUxR0EM0CgYEAwbVg
6aieLxDbGkg8+I6uPBvOzYnnfw2eAaKUPWJiuxuoD3uFz9Yuyiytll82pah8jEG2
A2UaBao9ncwDScOC4zRPGwF3Vim3TaOuf4W1WJdtwj7QME7sV9H52vd3C/J4n+9r
DFqpKHXNoNsgw+7Aqjk+1Xy2eooklruwC2mvKj0CgYAvMX9UGhZ8SwybwYBrNrdm
ju4kOckrIKuhz0OdfCwizGXlE7NkGP4Yr+E5s93Shqj5xNO42LbBJaMbUG+4GbQI
TY4OHDy32htjEZzsoMAKLyXhhQ7MzxtrVTVbUGG0OIZqlGpmBfjwhrW3t8FE1N3j
oCHpJIoCQ22FSas9TAfSvQKBgHUmT6UgYAJQ7GF5vL4J9F/P5YMy2rlhL+UHQSXa
oaFNOZebebLXcta8rILbtH39Zs2gVAa7l0BD1B3hqz9qKXdlRE4t1dFbS0t+KWNg
JuucMTofqOL+aDs4dyYxMWMdUkxPjGsdTV512FVnEOrOMuD/2/tbADUd5MDwY6iT
Uud1AoGBAMdL6+rK9mbmvLhhN/xDHmWQoe3317NInQCkHJqs41OSUq8/qggxUnMA
69yqe5tH5YAqS70bpQ2VgRot+TbP904moftHduHbnNjUTMbYIXCH4eEVX1TKo6Ed
FPbxOVDaIuMHCGAiwF7IpSdWrfngG8fatoqBy/KgipUaWLvefUoN
-----END RSA PRIVATE KEY-----
-86
View File
@@ -1,86 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFFTCCA/2gAwIBAgISBj56ngBbd9ilYIH2IjAHGKbsMA0GCSqGSIb3DQEBCwUA
MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
EwNSMTIwHhcNMjUxMjE4MDc1NzUwWhcNMjYwMzE4MDc1NzQ5WjAkMSIwIAYDVQQD
ExlidW5rZXJ3ZWIuZ3lvemFtYW5jYXZlLmZyMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEAsOA/5iRK/NIeyZl4IfzKvV9pRCQWpEpbS+vpp/S0dERTfD01
VeYIcvGMDQucrkACCFEEtKmDcwgbfS6B1RWX5yxs8mVcfgOuf1e+GO17OOn03XDw
BrnRG9JoAmihCbEF2cOhfah3pSD5krPTxhk38uyk8EQIbVdjV41u7NZnSMCI9rdh
ewCFbP+cZ4rREkxQzDiKe6ktPjmyChGvNggjnwaVEDRC1DgbUb9l/EC0gYj5Z+9V
npbgqNantzwQvQ+XNuqMQeZFzJAHG2PLLc1qyZFaPgwLvVFLp3yrbRnlGKRXp3kf
UgsiZHJ77vRxkGCUiZiJe1lwsY0Iqqu3a8BBGwIDAQABo4ICMDCCAiwwDgYDVR0P
AQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMB
Af8EAjAAMB0GA1UdDgQWBBSUjnSf91RZGSbgA3U8bhIHE4HlZjAfBgNVHSMEGDAW
gBQAtSnyLY5vMeibTK14Pvrc6QzR0jAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUH
MAKGF2h0dHA6Ly9yMTIuaS5sZW5jci5vcmcvMCQGA1UdEQQdMBuCGWJ1bmtlcndl
Yi5neW96YW1hbmNhdmUuZnIwEwYDVR0gBAwwCjAIBgZngQwBAgEwLwYDVR0fBCgw
JjAkoCKgIIYeaHR0cDovL3IxMi5jLmxlbmNyLm9yZy8xMDkuY3JsMIIBCgYKKwYB
BAHWeQIEAgSB+wSB+AD2AH0Apcl4kl1XRheChw3YiWYLXFVki30AQPLsB2hR0Yhp
GfcAAAGbMKyqXgAIAAAFACwEIpIEAwBGMEQCIHbBpTdHt5vi9S2Ua8UMzTsWhKLY
/suTkTG3mFqGx3BtAiAb+Yf8LhtP/ba/1yQmQka1rIL9N1R69Wx5RgjPJCOfdwB1
ANFuqaVoB35mNaA/N6XdvAOlPEESFNSIGPXpMbMjy5UEAAABmzCsstkAAAQDAEYw
RAIgQgWc7vLkyVRGBi5b6aBupeUwMKUu6pKWIf/kbVYzZ70CIHxsHmTa4pMb9XTi
8ZNzhSSIttpHY+RR3XcAZfyUNLbOMA0GCSqGSIb3DQEBCwUAA4IBAQBxj+EwrRkM
pQjVEZdUmzA5bl0/Arb2Dr1/zse1MzosBYdS452fhJhdA0VAwG7HBu7lQP62sAxD
anwcyb0n86epgbYv1WKWoFa7ndtqRn/otU+RlgTjz+gR0tQg0WcZEE71QoH6OcDb
jmGpHc9JipuBJHgp80++TGC1s60TDgF41int3DeEHw28ULB7NlZDjMGN2NQ98CCc
ACrkLSUM9PkX/6isqhaAdO9q95Yaq0pOUV4w7+4PgRcVYDZKDEoYOorgtj8Guamb
minnelS4+ZX5jf8YTvVOuhi1pQxUwwaP4hmCgkNm94C2Xl/2ZymcrN0TTSHE7WSz
5SloiFYkYjDE
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFBjCCAu6gAwIBAgIRAMISMktwqbSRcdxA9+KFJjwwDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjQwMzEzMDAwMDAw
WhcNMjcwMzEyMjM1OTU5WjAzMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg
RW5jcnlwdDEMMAoGA1UEAxMDUjEyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEA2pgodK2+lP474B7i5Ut1qywSf+2nAzJ+Npfs6DGPpRONC5kuHs0BUT1M
5ShuCVUxqqUiXXL0LQfCTUA83wEjuXg39RplMjTmhnGdBO+ECFu9AhqZ66YBAJpz
kG2Pogeg0JfT2kVhgTU9FPnEwF9q3AuWGrCf4yrqvSrWmMebcas7dA8827JgvlpL
Thjp2ypzXIlhZZ7+7Tymy05v5J75AEaz/xlNKmOzjmbGGIVwx1Blbzt05UiDDwhY
XS0jnV6j/ujbAKHS9OMZTfLuevYnnuXNnC2i8n+cF63vEzc50bTILEHWhsDp7CH4
WRt/uTp8n1wBnWIEwii9Cq08yhDsGwIDAQABo4H4MIH1MA4GA1UdDwEB/wQEAwIB
hjAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwEgYDVR0TAQH/BAgwBgEB
/wIBADAdBgNVHQ4EFgQUALUp8i2ObzHom0yteD763OkM0dIwHwYDVR0jBBgwFoAU
ebRZ5nu25eQBc4AIiMgaWPbpm24wMgYIKwYBBQUHAQEEJjAkMCIGCCsGAQUFBzAC
hhZodHRwOi8veDEuaS5sZW5jci5vcmcvMBMGA1UdIAQMMAowCAYGZ4EMAQIBMCcG
A1UdHwQgMB4wHKAaoBiGFmh0dHA6Ly94MS5jLmxlbmNyLm9yZy8wDQYJKoZIhvcN
AQELBQADggIBAI910AnPanZIZTKS3rVEyIV29BWEjAK/duuz8eL5boSoVpHhkkv3
4eoAeEiPdZLj5EZ7G2ArIK+gzhTlRQ1q4FKGpPPaFBSpqV/xbUb5UlAXQOnkHn3m
FVj+qYv87/WeY+Bm4sN3Ox8BhyaU7UAQ3LeZ7N1X01xxQe4wIAAE3JVLUCiHmZL+
qoCUtgYIFPgcg350QMUIWgxPXNGEncT921ne7nluI02V8pLUmClqXOsCwULw+PVO
ZCB7qOMxxMBoCUeL2Ll4oMpOSr5pJCpLN3tRA2s6P1KLs9TSrVhOk+7LX28NMUlI
usQ/nxLJID0RhAeFtPjyOCOscQBA53+NRjSCak7P4A5jX7ppmkcJECL+S0i3kXVU
y5Me5BbrU8973jZNv/ax6+ZK6TM8jWmimL6of6OrX7ZU6E2WqazzsFrLG3o2kySb
zlhSgJ81Cl4tv3SbYiYXnJExKQvzf83DYotox3f0fwv7xln1A2ZLplCb0O+l/AK0
YE0DS2FPxSAHi0iwMfW2nNHJrXcY3LLHD77gRgje4Eveubi2xxa+Nmk/hmhLdIET
iVDFanoCrMVIpQ59XWHkzdFmoHXHBV7oibVjGSO7ULSQ7MJ1Nz51phuDJSgAIU7A
0zrLnOrAj/dfrlEWRhCvAgbuwLZX1A2sjNjXoPOHbsPiy+lO1KF8/XY7
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAsOA/5iRK/NIeyZl4IfzKvV9pRCQWpEpbS+vpp/S0dERTfD01
VeYIcvGMDQucrkACCFEEtKmDcwgbfS6B1RWX5yxs8mVcfgOuf1e+GO17OOn03XDw
BrnRG9JoAmihCbEF2cOhfah3pSD5krPTxhk38uyk8EQIbVdjV41u7NZnSMCI9rdh
ewCFbP+cZ4rREkxQzDiKe6ktPjmyChGvNggjnwaVEDRC1DgbUb9l/EC0gYj5Z+9V
npbgqNantzwQvQ+XNuqMQeZFzJAHG2PLLc1qyZFaPgwLvVFLp3yrbRnlGKRXp3kf
UgsiZHJ77vRxkGCUiZiJe1lwsY0Iqqu3a8BBGwIDAQABAoIBAAM41TZ83cLU6bZU
GIdMor19YfOu+/Hv4CbgvB0Q95fl8LwNeg2/sX1f32Roxui5BhsfArNvImkI3PCp
qrgg0Gdn0e+Tyhy04Mu1Y6NHnDGGuC0FKXzYi1xy4kMnoxtZQVkyAkdBjOBnWonX
bcRTjEcyvrRua4A2ZyWz+rEkx1/gs41GiLseRJ3twdKZv7cjZh0HuiGB0C4aCKHe
WrmZt/mqYRCkrcr/6r18i841U0afhJ7NCNJy0irhblOUVHVOHVEMTybzq73kZbtN
Sz3/RbABjTdAUVBBx6ENVSUCtVwZq2juDFWcxd8+CcPJsmeuck1/qEpjmenNWm94
JysSXd0CgYEA5RZB5BWst82Yr+Y4ORRIDLbCt65sYaXyakkwMf0kNm+Y1NLKb768
c+6cwxmTxc1tTUH2SlUGArhWVNrSxUnr06k+5H+WLkqbpvHR6+VvPa2iPtMIQTuV
tLknLOw1MV3syaGtDRpgDri1sR8Yw5ca3QeRAIWw/qUFKGRPH0r3XUUCgYEAxafC
E9xpH/WYp5hAekgLN4TSde/PLcDCx9P36c7Bx4FWplL7uccrS+E7u+t5nUPS7TuG
sB7KhnE/oIUjap8DCVE1YxVxycLmDatVWzMZlrr1Pg5M0/9WCwxKqKNOVtkyPs2f
xPNY/LkWY5AbijmQM2RNjr1I4q8WSBl9cd/pGt8CgYAYJ3afE+H4J0dYFJANBKRs
IsD5GPz4dsTOjBT20FgHHVEh72/ExHmeR6Rjtcis7HH/2Vqcj8ZodwMzQzdB8f9Z
e9jTwtgU3Wz39ztJAhHukOYwdZPDPQMV4QfOZsFdCSg0QkW6wfMq2jLeEAdOaBo+
/9M8GNyGnOOkVJ87D25xeQKBgG2k8PlZhItxDxyxTdtHicljiehYfmJQEv0M7fKq
ej501h9v2yokfTUbnapSJuWBkUl+gunCOvC3c+dU09+6k9GgVfBAHh4hWsLsb24m
+6Ps1Ex3XFEhzJZWXDgOV0/ALqo+IMn9gDi5Z90VPOHBqueHVaq//+WX4NFgKoF4
B3SbAoGAUJ7kvZb2d8Yhppdx+OjFa227UGVwOgc8P4hWpClLwQqmHttKhpqCB+yX
8D7OK333aBvN3NthSNUJoPHEM4rdbFsKcbLQvrBlIBRy5aa84VD94CWvuoNjfPxw
alUOB38x8qUVH6gzi3NUs/9PMgjMMwID3NLQ8z5seGHfnd/DUVc=
-----END RSA PRIVATE KEY-----
-85
View File
@@ -1,85 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFBDCCA+ygAwIBAgISBn9gA26D86mezvSQtA1Y3nwOMA0GCSqGSIb3DQEBCwUA
MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
EwNSMTEwHhcNMjUwODAxMjEwMjI3WhcNMjUxMDMwMjEwMjI2WjAfMR0wGwYDVQQD
ExRjaGF0Lmd5b3phbWFuY2F2ZS5mcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
AQoCggEBALBB1huo7OZHlWlSy4VLUjf8AkFva/uIV5KMQeXc7s74NSEGh5iOrEKu
3An4uihUw2ZDDXp1mqdqr+eP/n6NTmBJC/1x9/G9S9i2Yqdc2+j5/+dcPCxg5c2u
qrFVSG0xnPpKpt5pAGDG2p7GK23y3G7Udx3ijbMj/NfcIiVA2FJSAe6d68X/HAtL
IndEThevNmVcKF/L4jkL1vqbY8LS6I/mBpzQ6tlENuLjkwpfCp8nicbcamahXd5L
15DS2kwuGyr1eHDIwDuDzGmmP4IeL/dZYU+yn+h+E502Sc4b9fH//jPHxwEIEUZL
GVxRBmfyjAWl+D7lEVuoTeaYnXJfpQMCAwEAAaOCAiQwggIgMA4GA1UdDwEB/wQE
AwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIw
ADAdBgNVHQ4EFgQUrNmO5KamFrHN2+qyvPMhnxiP6XMwHwYDVR0jBBgwFoAUxc9G
pOr0w8B6bJXELbBeki8m47kwMwYIKwYBBQUHAQEEJzAlMCMGCCsGAQUFBzAChhdo
dHRwOi8vcjExLmkubGVuY3Iub3JnLzAfBgNVHREEGDAWghRjaGF0Lmd5b3phbWFu
Y2F2ZS5mcjATBgNVHSAEDDAKMAgGBmeBDAECATAuBgNVHR8EJzAlMCOgIaAfhh1o
dHRwOi8vcjExLmMubGVuY3Iub3JnLzE1LmNybDCCAQQGCisGAQQB1nkCBAIEgfUE
gfIA8AB1AKRCxQZJYGFUjw/U6pz7ei0mRU2HqX8v30VZ9idPOoRUAAABmGenChMA
AAQDAEYwRAIgbTVAM8ZZRtCtlpwpVWRV/xJvcd2QroAAnRx3hf2EVU0CIBCTidig
GGL9QM5JbLNoNrFPYFszn+LwxPcuhpSKRzIXAHcADeHyMCvTDcFAYhIJ6lUu/Ed0
fLHX6TDvDkIetH5OqjQAAAGYZ6cR4gAABAMASDBGAiEAvlfdVVOX5K/4hvgK9Hit
hGmRlXdnKzJuc3qoRqSHWcECIQDrS/pP+Mln4Aq2H3hYcQh8BlSUMLCp4VzWwdrY
Dv991jANBgkqhkiG9w0BAQsFAAOCAQEAnwk6hmlht3PkJwoyp2HMgRVb8zUXitxi
0D+nsaDKEDZEhfmbDkV+BCKQuRrnVCiNxbRX9lxlgOm/GvnwQkoiH0zv3Ec7y8ei
QjZy8snvkJX9L0fV+2aOkgp+xQTk6yQQTlO2SXg7CQuUqg9di33/76d+olPc4uVJ
0tRgg5FqrvZmJYtqkGAF5dZEBXk+usZkXCKlZGKUky4qeKtw3+p1iA7cF8tAiikB
x8H0cnWSzZUzFxkZl+0q6ReUlIcpucdsNu2o03ksNH6Go4V+bsF+zHRjLOMUgKjD
YV3sisgMn+naBG/Lpt0McAT7F34CGUJQWMI+tJg+tOvPcjQL3UNtvg==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFBjCCAu6gAwIBAgIRAIp9PhPWLzDvI4a9KQdrNPgwDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjQwMzEzMDAwMDAw
WhcNMjcwMzEyMjM1OTU5WjAzMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg
RW5jcnlwdDEMMAoGA1UEAxMDUjExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEAuoe8XBsAOcvKCs3UZxD5ATylTqVhyybKUvsVAbe5KPUoHu0nsyQYOWcJ
DAjs4DqwO3cOvfPlOVRBDE6uQdaZdN5R2+97/1i9qLcT9t4x1fJyyXJqC4N0lZxG
AGQUmfOx2SLZzaiSqhwmej/+71gFewiVgdtxD4774zEJuwm+UE1fj5F2PVqdnoPy
6cRms+EGZkNIGIBloDcYmpuEMpexsr3E+BUAnSeI++JjF5ZsmydnS8TbKF5pwnnw
SVzgJFDhxLyhBax7QG0AtMJBP6dYuC/FXJuluwme8f7rsIU5/agK70XEeOtlKsLP
Xzze41xNG/cLJyuqC0J3U095ah2H2QIDAQABo4H4MIH1MA4GA1UdDwEB/wQEAwIB
hjAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwEgYDVR0TAQH/BAgwBgEB
/wIBADAdBgNVHQ4EFgQUxc9GpOr0w8B6bJXELbBeki8m47kwHwYDVR0jBBgwFoAU
ebRZ5nu25eQBc4AIiMgaWPbpm24wMgYIKwYBBQUHAQEEJjAkMCIGCCsGAQUFBzAC
hhZodHRwOi8veDEuaS5sZW5jci5vcmcvMBMGA1UdIAQMMAowCAYGZ4EMAQIBMCcG
A1UdHwQgMB4wHKAaoBiGFmh0dHA6Ly94MS5jLmxlbmNyLm9yZy8wDQYJKoZIhvcN
AQELBQADggIBAE7iiV0KAxyQOND1H/lxXPjDj7I3iHpvsCUf7b632IYGjukJhM1y
v4Hz/MrPU0jtvfZpQtSlET41yBOykh0FX+ou1Nj4ScOt9ZmWnO8m2OG0JAtIIE38
01S0qcYhyOE2G/93ZCkXufBL713qzXnQv5C/viOykNpKqUgxdKlEC+Hi9i2DcaR1
e9KUwQUZRhy5j/PEdEglKg3l9dtD4tuTm7kZtB8v32oOjzHTYw+7KdzdZiw/sBtn
UfhBPORNuay4pJxmY/WrhSMdzFO2q3Gu3MUBcdo27goYKjL9CTF8j/Zz55yctUoV
aneCWs/ajUX+HypkBTA+c8LGDLnWO2NKq0YD/pnARkAnYGPfUDoHR9gVSp/qRx+Z
WghiDLZsMwhN1zjtSC0uBWiugF3vTNzYIEFfaPG7Ws3jDrAMMYebQ95JQ+HIBD/R
PBuHRTBpqKlyDnkSHDHYPiNX3adPoPAcgdF3H2/W0rmoswMWgTlLn1Wu0mrks7/q
pdWfS6PJ1jty80r2VKsM/Dj3YIDfbjXKdaFU5C+8bhfJGqU3taKauuz0wHVGT3eo
6FlWkWYtbt4pgdamlwVeZEW+LM7qZEJEsMNPrfC03APKmZsJgpWCDWOKZvkZcvjV
uYkQ4omYCTX5ohy+knMjdOmdH9c7SpqEWBDC86fiNex+O0XOMEZSa8DA
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAsEHWG6js5keVaVLLhUtSN/wCQW9r+4hXkoxB5dzuzvg1IQaH
mI6sQq7cCfi6KFTDZkMNenWap2qv54/+fo1OYEkL/XH38b1L2LZip1zb6Pn/51w8
LGDlza6qsVVIbTGc+kqm3mkAYMbansYrbfLcbtR3HeKNsyP819wiJUDYUlIB7p3r
xf8cC0sid0ROF682ZVwoX8viOQvW+ptjwtLoj+YGnNDq2UQ24uOTCl8KnyeJxtxq
ZqFd3kvXkNLaTC4bKvV4cMjAO4PMaaY/gh4v91lhT7Kf6H4TnTZJzhv18f/+M8fH
AQgRRksZXFEGZ/KMBaX4PuURW6hN5pidcl+lAwIDAQABAoIBAAIAlXaV+i75hDSA
mMhIXUQ+jCYDJoZie6AyELOUSXA3eJ8J7HNqt4FAbEZ+uVqo79lTDK2l9V5Og3YN
eDYm08ubONQlvcvUuy5YkBFXqDXi1SnjLdnRNfsar1y5W8vFwwNC4tdm+Page65P
EQI8Po3RwxKnVrXAxGgNW6PxsyNoPzZ8mQUn5jIynhDQNeg5cU0lyvIIzmWEBzsc
tNheBekfwOpwHXsnq320yMDbFKliKSq1915KBC6vbpfEsxsvD18U5uZ9o+N1nMGs
nMnKfwE8fqn+urjgPtCPWGTMUwum9XUdHhn04MrJzBsITRzx839nDO+VGQL5GRkU
UoQZl/UCgYEA9K34SOOfaJVCCLaRqhj4Si6+Mdg3ByUBJsqySJoCW9BkcRPak8uQ
jmWEBUqe3RxzfbKfujurMiQ2IX9l/lkiAR58p2OLV4VUTr48j33u0NSdVEkY4b2l
a+48EvvIcbcn0ttUJQeYwDW8Xmt3DIvsP3292DAYcJeTsN6xOToVDy8CgYEAuGl1
foU3hVnnT+8F8xqeVAbJ8cZrne7uaEXwV3sKkNLgpXVaFfjYvooAUd7BNA5elPo6
8RGOVh+nlP01iqrz10rJoPLryPTwUbrCaj869gIRiHkkEdwdXEY387h2TLSRTCih
SpwV1DApVFvSiHl88tXF95vws09N10DW2ohfMm0CgYBhJAyVy6EHIXL1CJ6uPHme
4g3qth+qu3tIjmLXxiU3lHW8GxjFYqVCk3UlsKl/uYL0nY0in/vozU2cYPr6TyLb
9OGihzfUCIAfPxHGGkZNLIxF4Tt6rBNX1V6OXt4Gn6O06BTxGqH/dZYSmnHKTmb+
EgrkILwjP1qIdvE/ehrQSwKBgQCR5sYR2r5JoA61nEvdwiKgIlrmEfGVG7O+Bg+Y
dv2uBVm9LrKejaqWXcLRA2dikzfbsHqvvg8aLqM86nTRCF4x6LbLw0YvUTNNxnAI
9YvllU9f5VBXXQpRtjCQgFIAcCBA3Ch4SjOvFIeueZOBbHUh/2ZIeDUg+M6CTodu
kNSYpQKBgG+ye9k/stD7Ce2ptZbk50n/iRRdlzbyljHENyBk2DjSviDrxkYbC5Rw
EQrmMa4fKRFAAojmtdAqU/QkJZFWwuTpg4j8Fo6FhQvB0MKb2eYMSJkAdOCqSdPY
ijbLRw+lIspKjlKY8WsLKLAnQhco9NC//EhQDx7A1KhXcDrZudf5
-----END RSA PRIVATE KEY-----
-86
View File
@@ -1,86 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFFjCCA/6gAwIBAgISBmF16UkC3PMpXIfv3RnBTerJMA0GCSqGSIb3DQEBCwUA
MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
EwNSMTIwHhcNMjUxMjE4MDc1NzU3WhcNMjYwMzE4MDc1NzU2WjAkMSIwIAYDVQQD
ExlmdW5rd2hhbGUuZ3lvemFtYW5jYXZlLmZyMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEAyyICyuDbPPAAyDzIHp/sAXHfcBmbQ2zNYJxYtSywwckcq/a7
d1EKPf4Ay15BHTv49HVjP6vVmA3zGKKYIBkvvrfxrMwvxUtZxyCQzAER++npG5za
pRCOgnXiM41jDezxMJxsrT1vXkx1LLaMMkTvQ6W1mzIYqVojB7JOqLeXH88F35y0
Yj6rdUwchZhenjKW0tVWFXI4i5y4+pKo0xPG3seUvNAAT85cdx/IjBTSPKTnkUYA
zzBtY5gDoNOq10I2FUg1fgiVLNGs7TxK22uRUQj25e8f/68GfiBp9DGXN6avHhra
vDfn95PCvlBwHjYPq31abTUA6OpR/2WJKEGiawIDAQABo4ICMTCCAi0wDgYDVR0P
AQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMB
Af8EAjAAMB0GA1UdDgQWBBTaJt+qYqv4kOu9G+ywhZaOk4epaDAfBgNVHSMEGDAW
gBQAtSnyLY5vMeibTK14Pvrc6QzR0jAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUH
MAKGF2h0dHA6Ly9yMTIuaS5sZW5jci5vcmcvMCQGA1UdEQQdMBuCGWZ1bmt3aGFs
ZS5neW96YW1hbmNhdmUuZnIwEwYDVR0gBAwwCjAIBgZngQwBAgEwLgYDVR0fBCcw
JTAjoCGgH4YdaHR0cDovL3IxMi5jLmxlbmNyLm9yZy83NC5jcmwwggEMBgorBgEE
AdZ5AgQCBIH9BIH6APgAfgClyXiSXVdGF4KHDdiJZgtcVWSLfQBA8uwHaFHRiGkZ
9wAAAZswrMW2AAgAAAUALAQi+AQDAEcwRQIgb4npA09q1nqCAG/EaCgHTseZPjxk
rIBjQ8BZajxiuGQCIQCD/Zg395UkUuULwLE1rzmudM7a+PHIwBO4C0IPN7VuUwB2
AMs49xWJfIShRF9bwd37yW7ymlnNRwppBYWwyxTDFFjnAAABmzCsy8cAAAQDAEcw
RQIhAMOPYw1L2nEpYI1F9KB9f4Mg8M25fTJu1hDwK36rUac5AiBbiCTGXJfjo2KF
8Z84L6xEG3f5jvHFlFGifpVrHfuWDzANBgkqhkiG9w0BAQsFAAOCAQEAlOhA4PZZ
KEhPezLduNp/02+v7K4+sKjD+p5t+hfkK9BRLISII0s9wBvtM5tbjiU/29X/i5xa
WhftBHV0aVd3UCmx8oSqnG20H2UrtsGpqpNtEfhQ0LaDFbSQNClIyuX0MrP7OcsS
bBUNWavZodEpBycrZCrIVIURMRsbAqFSFVRd6ZYep0E0U3/bj4rwQ7r1zdXampVa
HiTogc6gWVEIIU6M6JwGHK496UrkDBJoArHgJU1oAvkJ0mQfnvF+/BQLzP6QkWlR
K7MqyUQ44XoeUE4/vq4SztBfekxLeizzcTtDBS0w6Gw8J4TxSbZtW7uvsgbcNtJW
MlxZonNBkyDHkQ==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFBjCCAu6gAwIBAgIRAMISMktwqbSRcdxA9+KFJjwwDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjQwMzEzMDAwMDAw
WhcNMjcwMzEyMjM1OTU5WjAzMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg
RW5jcnlwdDEMMAoGA1UEAxMDUjEyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEA2pgodK2+lP474B7i5Ut1qywSf+2nAzJ+Npfs6DGPpRONC5kuHs0BUT1M
5ShuCVUxqqUiXXL0LQfCTUA83wEjuXg39RplMjTmhnGdBO+ECFu9AhqZ66YBAJpz
kG2Pogeg0JfT2kVhgTU9FPnEwF9q3AuWGrCf4yrqvSrWmMebcas7dA8827JgvlpL
Thjp2ypzXIlhZZ7+7Tymy05v5J75AEaz/xlNKmOzjmbGGIVwx1Blbzt05UiDDwhY
XS0jnV6j/ujbAKHS9OMZTfLuevYnnuXNnC2i8n+cF63vEzc50bTILEHWhsDp7CH4
WRt/uTp8n1wBnWIEwii9Cq08yhDsGwIDAQABo4H4MIH1MA4GA1UdDwEB/wQEAwIB
hjAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwEgYDVR0TAQH/BAgwBgEB
/wIBADAdBgNVHQ4EFgQUALUp8i2ObzHom0yteD763OkM0dIwHwYDVR0jBBgwFoAU
ebRZ5nu25eQBc4AIiMgaWPbpm24wMgYIKwYBBQUHAQEEJjAkMCIGCCsGAQUFBzAC
hhZodHRwOi8veDEuaS5sZW5jci5vcmcvMBMGA1UdIAQMMAowCAYGZ4EMAQIBMCcG
A1UdHwQgMB4wHKAaoBiGFmh0dHA6Ly94MS5jLmxlbmNyLm9yZy8wDQYJKoZIhvcN
AQELBQADggIBAI910AnPanZIZTKS3rVEyIV29BWEjAK/duuz8eL5boSoVpHhkkv3
4eoAeEiPdZLj5EZ7G2ArIK+gzhTlRQ1q4FKGpPPaFBSpqV/xbUb5UlAXQOnkHn3m
FVj+qYv87/WeY+Bm4sN3Ox8BhyaU7UAQ3LeZ7N1X01xxQe4wIAAE3JVLUCiHmZL+
qoCUtgYIFPgcg350QMUIWgxPXNGEncT921ne7nluI02V8pLUmClqXOsCwULw+PVO
ZCB7qOMxxMBoCUeL2Ll4oMpOSr5pJCpLN3tRA2s6P1KLs9TSrVhOk+7LX28NMUlI
usQ/nxLJID0RhAeFtPjyOCOscQBA53+NRjSCak7P4A5jX7ppmkcJECL+S0i3kXVU
y5Me5BbrU8973jZNv/ax6+ZK6TM8jWmimL6of6OrX7ZU6E2WqazzsFrLG3o2kySb
zlhSgJ81Cl4tv3SbYiYXnJExKQvzf83DYotox3f0fwv7xln1A2ZLplCb0O+l/AK0
YE0DS2FPxSAHi0iwMfW2nNHJrXcY3LLHD77gRgje4Eveubi2xxa+Nmk/hmhLdIET
iVDFanoCrMVIpQ59XWHkzdFmoHXHBV7oibVjGSO7ULSQ7MJ1Nz51phuDJSgAIU7A
0zrLnOrAj/dfrlEWRhCvAgbuwLZX1A2sjNjXoPOHbsPiy+lO1KF8/XY7
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAyyICyuDbPPAAyDzIHp/sAXHfcBmbQ2zNYJxYtSywwckcq/a7
d1EKPf4Ay15BHTv49HVjP6vVmA3zGKKYIBkvvrfxrMwvxUtZxyCQzAER++npG5za
pRCOgnXiM41jDezxMJxsrT1vXkx1LLaMMkTvQ6W1mzIYqVojB7JOqLeXH88F35y0
Yj6rdUwchZhenjKW0tVWFXI4i5y4+pKo0xPG3seUvNAAT85cdx/IjBTSPKTnkUYA
zzBtY5gDoNOq10I2FUg1fgiVLNGs7TxK22uRUQj25e8f/68GfiBp9DGXN6avHhra
vDfn95PCvlBwHjYPq31abTUA6OpR/2WJKEGiawIDAQABAoIBAC/jmEnxIe6nXF/Y
qItDw5WBnZ4lg0utimu04FryKse83JQUCpUyF1qPF+vaEDrOqT4ksJ3Rqnz7CO0t
Y/TpSy7I2eKVjsuSHJvL6ycVN4Ku3iSC4a8ZjKdoGEh0FD6zthbyQdLD0Y4nM1az
wLCXPNszZXGtqU+/rtOBL3cqNSgrr7fgy7j/0ppvyNZbIodSIY79D00zpX74l0ov
L6JQ9YJBoM8RHljc7bRTVpf6RVlqlGJSpSqEPy3PsKfMihWCIAyqgspgP6Yao580
j0RS1nGydiP2TAb7wx7K0sXM+bJN+KeUTPhCO3tFvYPRgk8RcjaRbl4aOijN5ndu
A22+ox0CgYEA/ojX+b+pMbUsLMNraTdLJHqtlMMqaA/ctEf0N+OACaduWU7EVs7l
oEva9U9u9exTHJ2QSlfSZKzd7XdkWvUr2E1QvyekMtvj9/tfnR5TE9R/E2pJ22GW
IMeAq+GfkgeYeGm30M7v4e9R5WrJh2Jll0qn+duw1Y9gxUNXS1YsKr8CgYEAzE1o
H3xods4goL8m+Ial0ZTLyKx5l8Hgif/Y/ao77zORjJtOGvw4O3CeLM/skEZ6ihPY
UUBoxH1iNHViUuf9otYIY2SEPvOys2Gu+TIt1966dIV42LtclqL/t7MezJdtT/i6
BGRPXBNBZVcwN8AJBAWcOS7pjytf/XcDRE+5z1UCgYEA41QMsL4Auqh4v7H5KIt9
zSLUDN0R7sbb8xeggpnpLLYg1BqJOI6ofzXAZP+AtptOz2vaBsvQ2KGbxA6xzprR
genriA47lEDXpg8YIheHU1qh9BElzY2mq7gCr4BfJ+kov8KLrS5lCIDZv/BT9Vpo
KWtAAuO3V8UqRIQUXvCjmbkCgYA6uyXrp0AAp1EJ5Om3GD4i+bt7fNmXnsyF317p
zT5djV2SJjNV3pvrunw+Naez8g7YEsxkzzdPBRxuKDCT1M09Ono+2G6MClKc7r/2
M06qeATx6kzLQVFknIcWsA9ykTWDf+U5zfxiY8aw81eRL0toNJSse6f42GdH3ia6
RJEN4QKBgAvpe6N6+2ieCxK5L2U+et0CUhZ9IsNFqmR0mR1YbfqTaZlV2l83YFuH
zRvq1jFmJQIpJwhPaO8S80t6H9sVa1+9YKqDDd3i0cULNW21TdFOYI4bPHYVvmTB
GQzwksjL1AEfskk9fG2Bu2sMhgKvsY9waTIWU2W8p76UFgiFav4p
-----END RSA PRIVATE KEY-----
-121
View File
@@ -1,121 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFPTCCBCWgAwIBAgISA3n4pfdSt98YUI67b5HEF9l/MA0GCSqGSIb3DQEBCwUA
MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD
EwJSMzAeFw0yMjA3MjgwNjM3MjZaFw0yMjEwMjYwNjM3MjVaMCYxJDAiBgNVBAMT
G2d1ZXN0LmppdHNpLmd5b3phbWFuY2F2ZS5mcjCCASIwDQYJKoZIhvcNAQEBBQAD
ggEPADCCAQoCggEBANHZi83LzLFhuHSQIqNzmkhceUfmsa5w36+rVRmUl3HSQQNx
zeQOh3iyUL7joUgl+OKdR97tsYtQCpSdROeB3iwKAkpuI0GVR9MQJsg9sK+p/9oE
uZCXPpsvy6yjwDD+oC9KnWOBT9ihEmJuFMhjPwMZXVhZmuR5UNisVLuwHI+e+2Sm
JDGDmJBrhRZyAOUJR5mh/PTJi9tg80bvDT/zqGUY8rZ7qV0gemHBxRZNnsjxDtyC
K9hVPza88ecD5Pt8FGRe/7/OA/imBa34FHFX0Jv/s3Slq2+S1iNsR24dhZGL2GcW
lKUpfvwDK8SsZn/rOB8uzmhppyvEZCHY2MJQDPsCAwEAAaOCAlcwggJTMA4GA1Ud
DwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0T
AQH/BAIwADAdBgNVHQ4EFgQUOf81ELdC9vLolr59L4FZOWWnsJgwHwYDVR0jBBgw
FoAUFC6zF7dYVsuuUAlA5h+vnYsUwsYwVQYIKwYBBQUHAQEESTBHMCEGCCsGAQUF
BzABhhVodHRwOi8vcjMuby5sZW5jci5vcmcwIgYIKwYBBQUHMAKGFmh0dHA6Ly9y
My5pLmxlbmNyLm9yZy8wJgYDVR0RBB8wHYIbZ3Vlc3Quaml0c2kuZ3lvemFtYW5j
YXZlLmZyMEwGA1UdIARFMEMwCAYGZ4EMAQIBMDcGCysGAQQBgt8TAQEBMCgwJgYI
KwYBBQUHAgEWGmh0dHA6Ly9jcHMubGV0c2VuY3J5cHQub3JnMIIBBQYKKwYBBAHW
eQIEAgSB9gSB8wDxAHcAQcjKsd8iRkoQxqE6CUKHXk4xixsD6+tLx2jwkGKWBvYA
AAGCQ70onwAABAMASDBGAiEAyn2jlcHx+pKxf8v8KHM9iRPTgiBRuk+MP3/8bmZA
KqACIQC48cjCluldCVjCGTKu6vQFtG5ajyiJpQ862+S+qCBDsAB2AEalVet1+pEg
MLWiiWn0830RLEF0vv1JuIWr8vxw/m1HAAABgkO9KJwAAAQDAEcwRQIgKBLPJPq6
dIFMUBIibNCdBGDohGx1QI4OpNxH8ACEeCwCIQDKgsZOlNr1SDTI53Vy4vpKdq+Z
1ettm4FPGzLQ/Lxn7TANBgkqhkiG9w0BAQsFAAOCAQEAnSiOVN2Ei4EkG2P4aO36
gsiqicKUK9InGgLogCxbHF8Obt+acjz2JKOsqJK90eZ8Vex4fwQ+5B6HiGGACVTi
W/S4CeNvi6Stf35iUVB+X1ZicejfE5AgZsPWyh79optrrcQeRedYGdgtGDMOCvhV
C8Y59itDYqCn0ibFysCAtCti6QEAtFPFaNKq76bW6g4jx00RLixHLmRon7Xzk6sn
Sf4HrWj1XgGf1DUuWnPIAUj/y2p5WpROBtWs1lTlxsKda9GcjzeCyjGvnN2/9FV3
2U2Da6PjafPywLH66MpF4d3UbU9WncWflPmu5s0dMM0dxCeyvK9hLizx6WseGg7E
jg==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFFjCCAv6gAwIBAgIRAJErCErPDBinU/bWLiWnX1owDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjAwOTA0MDAwMDAw
WhcNMjUwOTE1MTYwMDAwWjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg
RW5jcnlwdDELMAkGA1UEAxMCUjMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQC7AhUozPaglNMPEuyNVZLD+ILxmaZ6QoinXSaqtSu5xUyxr45r+XXIo9cP
R5QUVTVXjJ6oojkZ9YI8QqlObvU7wy7bjcCwXPNZOOftz2nwWgsbvsCUJCWH+jdx
sxPnHKzhm+/b5DtFUkWWqcFTzjTIUu61ru2P3mBw4qVUq7ZtDpelQDRrK9O8Zutm
NHz6a4uPVymZ+DAXXbpyb/uBxa3Shlg9F8fnCbvxK/eG3MHacV3URuPMrSXBiLxg
Z3Vms/EY96Jc5lP/Ooi2R6X/ExjqmAl3P51T+c8B5fWmcBcUr2Ok/5mzk53cU6cG
/kiFHaFpriV1uxPMUgP17VGhi9sVAgMBAAGjggEIMIIBBDAOBgNVHQ8BAf8EBAMC
AYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIGA1UdEwEB/wQIMAYB
Af8CAQAwHQYDVR0OBBYEFBQusxe3WFbLrlAJQOYfr52LFMLGMB8GA1UdIwQYMBaA
FHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcw
AoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzAnBgNVHR8EIDAeMBygGqAYhhZodHRw
Oi8veDEuYy5sZW5jci5vcmcvMCIGA1UdIAQbMBkwCAYGZ4EMAQIBMA0GCysGAQQB
gt8TAQEBMA0GCSqGSIb3DQEBCwUAA4ICAQCFyk5HPqP3hUSFvNVneLKYY611TR6W
PTNlclQtgaDqw+34IL9fzLdwALduO/ZelN7kIJ+m74uyA+eitRY8kc607TkC53wl
ikfmZW4/RvTZ8M6UK+5UzhK8jCdLuMGYL6KvzXGRSgi3yLgjewQtCPkIVz6D2QQz
CkcheAmCJ8MqyJu5zlzyZMjAvnnAT45tRAxekrsu94sQ4egdRCnbWSDtY7kh+BIm
lJNXoB1lBMEKIq4QDUOXoRgffuDghje1WrG9ML+Hbisq/yFOGwXD9RiX8F6sw6W4
avAuvDszue5L3sz85K+EC4Y/wFVDNvZo4TYXao6Z0f+lQKc0t8DQYzk1OXVu8rp2
yJMC6alLbBfODALZvYH7n7do1AZls4I9d1P4jnkDrQoxB3UqQ9hVl3LEKQ73xF1O
yK5GhDDX8oVfGKF5u+decIsH4YaTw7mP3GFxJSqv3+0lUFJoi5Lc5da149p90Ids
hCExroL1+7mryIkXPeFM5TgO9r0rvZaBFOvV2z0gp35Z0+L4WPlbuEjN/lxPFin+
HlUjr8gRsI3qfJOQFy/9rKIJR0Y/8Omwt/8oTWgy1mdeHmmjk7j1nYsvC9JSQ6Zv
MldlTTKB3zhThV1+XWYp6rjd5JW1zbVWEkLNxE7GJThEUG3szgBVGP7pSWTUTsqX
nLRbwHOoq7hHwg==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFYDCCBEigAwIBAgIQQAF3ITfU6UK47naqPGQKtzANBgkqhkiG9w0BAQsFADA/
MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
DkRTVCBSb290IENBIFgzMB4XDTIxMDEyMDE5MTQwM1oXDTI0MDkzMDE4MTQwM1ow
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwggIiMA0GCSqGSIb3DQEB
AQUAA4ICDwAwggIKAoICAQCt6CRz9BQ385ueK1coHIe+3LffOJCMbjzmV6B493XC
ov71am72AE8o295ohmxEk7axY/0UEmu/H9LqMZshftEzPLpI9d1537O4/xLxIZpL
wYqGcWlKZmZsj348cL+tKSIG8+TA5oCu4kuPt5l+lAOf00eXfJlII1PoOK5PCm+D
LtFJV4yAdLbaL9A4jXsDcCEbdfIwPPqPrt3aY6vrFk/CjhFLfs8L6P+1dy70sntK
4EwSJQxwjQMpoOFTJOwT2e4ZvxCzSow/iaNhUd6shweU9GNx7C7ib1uYgeGJXDR5
bHbvO5BieebbpJovJsXQEOEO3tkQjhb7t/eo98flAgeYjzYIlefiN5YNNnWe+w5y
sR2bvAP5SQXYgd0FtCrWQemsAXaVCg/Y39W9Eh81LygXbNKYwagJZHduRze6zqxZ
Xmidf3LWicUGQSk+WT7dJvUkyRGnWqNMQB9GoZm1pzpRboY7nn1ypxIFeFntPlF4
FQsDj43QLwWyPntKHEtzBRL8xurgUBN8Q5N0s8p0544fAQjQMNRbcTa0B7rBMDBc
SLeCO5imfWCKoqMpgsy6vYMEG6KDA0Gh1gXxG8K28Kh8hjtGqEgqiNx2mna/H2ql
PRmP6zjzZN7IKw0KKP/32+IVQtQi0Cdd4Xn+GOdwiK1O5tmLOsbdJ1Fu/7xk9TND
TwIDAQABo4IBRjCCAUIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw
SwYIKwYBBQUHAQEEPzA9MDsGCCsGAQUFBzAChi9odHRwOi8vYXBwcy5pZGVudHJ1
c3QuY29tL3Jvb3RzL2RzdHJvb3RjYXgzLnA3YzAfBgNVHSMEGDAWgBTEp7Gkeyxx
+tvhS5B1/8QVYIWJEDBUBgNVHSAETTBLMAgGBmeBDAECATA/BgsrBgEEAYLfEwEB
ATAwMC4GCCsGAQUFBwIBFiJodHRwOi8vY3BzLnJvb3QteDEubGV0c2VuY3J5cHQu
b3JnMDwGA1UdHwQ1MDMwMaAvoC2GK2h0dHA6Ly9jcmwuaWRlbnRydXN0LmNvbS9E
U1RST09UQ0FYM0NSTC5jcmwwHQYDVR0OBBYEFHm0WeZ7tuXkAXOACIjIGlj26Ztu
MA0GCSqGSIb3DQEBCwUAA4IBAQAKcwBslm7/DlLQrt2M51oGrS+o44+/yQoDFVDC
5WxCu2+b9LRPwkSICHXM6webFGJueN7sJ7o5XPWioW5WlHAQU7G75K/QosMrAdSW
9MUgNTP52GE24HGNtLi1qoJFlcDyqSMo59ahy2cI2qBDLKobkx/J3vWraV0T9VuG
WCLKTVXkcGdtwlfFRjlBz4pYg1htmf5X6DYO8A4jqv2Il9DjXA6USbW1FzXSLr9O
he8Y4IWS6wY7bCkjCWDcRQJMEhg76fsO3txE+FiYruq9RUWhiF1myv4Q6W+CyBFC
Dfvp7OOGAN6dEOM4+qR9sdjoSYKEBpsr6GtPAQw4dy753ec5
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDR2YvNy8yxYbh0
kCKjc5pIXHlH5rGucN+vq1UZlJdx0kEDcc3kDod4slC+46FIJfjinUfe7bGLUAqU
nUTngd4sCgJKbiNBlUfTECbIPbCvqf/aBLmQlz6bL8uso8Aw/qAvSp1jgU/YoRJi
bhTIYz8DGV1YWZrkeVDYrFS7sByPnvtkpiQxg5iQa4UWcgDlCUeZofz0yYvbYPNG
7w0/86hlGPK2e6ldIHphwcUWTZ7I8Q7cgivYVT82vPHnA+T7fBRkXv+/zgP4pgWt
+BRxV9Cb/7N0patvktYjbEduHYWRi9hnFpSlKX78AyvErGZ/6zgfLs5oaacrxGQh
2NjCUAz7AgMBAAECggEBAJqWHYzuss2A5TbI7xtlj6P6q0UyRnXwpHduSXRcp+ur
LUVyUm/L3DQnd6AHY8oYXu3hWw54HzA3OHQeHqJEYvwiK2nVFJe9dnmfDlK4Ty44
l0dt75z6LZ54aRu2TWBKUopD9wlUOxOkJDzqRtkPc12/E6p/58CjNdFHsevJYmDR
MW6TwVdAaJVSsDdaVBVU0AJ3LE9lmI6qJ8mUlDWe3un4kV+5HpSu8G5eLKkbfOIF
5ylvWMhsq2rhpExy34CdI2C4zDMMKRxlnukwzWnrCk0u5mcr492Xo8QIOskGa6tJ
YRNycp1Cfcqg6INxLXVRjaM5qHs0CfAD4CZV9SaPtnECgYEA6xu/X3Dge4DHRSRJ
UTjXqP0QkaD25zZ8PQLQ48TapGm43EHFhYyf47blZiVRJzxAwAlBh9K6wUlBLeZC
N0qBjJYXvIUiJYzyvQCvRGHdDvvc5i6qiO/2ETiEPMUmR2gch/yXmeQLoUqGTgwA
S/Bj0U37LcSEkPG760QFbTuvulcCgYEA5H83F9bYiyqKVUBsOTFRFAath5ZfCR3n
9GzBUyiNJpfOMeEoeTLF5gUAj6T6RZHT/P+najwxC3e3mtKC8Cg4ecwHdOI+METe
4r7ek6jnNwutZ2uTNV4yqBK1OkKj1ukmn7UAGRj28yRL4pDs6xFXpCHxcRTsPUOp
5MjLiwVNI/0CgYBvP9L/c2cVqashQXlb8JzDvvOvJU6Pu81wBTwY+xZGhCxQNOMl
PZSO6QWFnxTWjwFInVifz4xFV8d606DzjtLcVk1nDExLHnXiD0fgALrckztExEI3
x+xU27xfER763P3bLyABVtJWAPCqT614QYjKCq9XSc081NYKDkbPGFYfwwKBgC1n
tivvjoJBBtIgBiFrUmA3X35E/EeUgMZKYjRDJ6FWoyu4QVGsLDUkI1NoBi+S5dwt
dTggE+LifEKwuEI+y9IwH/8zAgaXeO733MTc2G1QzblyYANH36sUZJzaJzKKjBlK
X2WdV11DhizUfa/Md2zvLco5zSPzcSw8Vm4etJCFAoGBAM1NS02sZ9FxREjvT3gi
AaLZfpVb5QPcMp6ac/WByKeTWFgKcchbxENQ6Ciiehog8qOkXubKsKFWnl2fjDPI
tXmo71hUhyVnumU3pm4aaFFraeEGUWeVD8vE0nBRZ9sh8Xrm+2IG41ihbEWGobn/
eC0cwEOiWNLj4ZO3Sn8Ri8Ma
-----END PRIVATE KEY-----
-85
View File
@@ -1,85 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIE+zCCA+OgAwIBAgISBetu8WjxDfsMlJLuX/tLrgyUMA0GCSqGSIb3DQEBCwUA
MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
EwNSMTAwHhcNMjUwNzMxMjEwMzA2WhcNMjUxMDI5MjEwMzA1WjAaMRgwFgYDVQQD
Ew9neW96YW1hbmNhdmUuZnIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
AQCd8nzBsYDVj3cFPThpqdz83kXWcvg7HNm4O79Q4iFiJr0GgV77aXt0gaca3+J7
BmMWtsSM0qg3f/H5aObJ/5Col2K5XxIoRdxrWYFyVcnlyzd+3oeUMVdLv4elN2SM
2VI4+lLBaXGWRnNhhJDPLdFXRbOpGZfmlwQzMMQVoeCaoIwr39v3CNTfwnvJgUFu
y3XAU801oifkL+oLLONdJc1kGMZCQhCuc5DOE9i7jFQoqLf+LyrfkMezG7K3hzhr
26d5t248DR7QgSTm/XCtvan35lARHCsD73WjQzMLmUpimgW4t0MxlCdcd7zMULVO
N2jhd7UcbmR3ihUIstY1sBjnAgMBAAGjggIgMIICHDAOBgNVHQ8BAf8EBAMCBaAw
HQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYD
VR0OBBYEFHdI3NtpZUPrNnYJ0KIPsS0JgFxFMB8GA1UdIwQYMBaAFLu8w0el5Lyp
xsOkcgwQjaI14cjoMDMGCCsGAQUFBwEBBCcwJTAjBggrBgEFBQcwAoYXaHR0cDov
L3IxMC5pLmxlbmNyLm9yZy8wGgYDVR0RBBMwEYIPZ3lvemFtYW5jYXZlLmZyMBMG
A1UdIAQMMAowCAYGZ4EMAQIBMC4GA1UdHwQnMCUwI6AhoB+GHWh0dHA6Ly9yMTAu
Yy5sZW5jci5vcmcvMjEuY3JsMIIBBQYKKwYBBAHWeQIEAgSB9gSB8wDxAHYAzPsP
aoVxCWX+lZtTzumyfCLphVwNl422qX5UwP5MDbAAAAGYYoFJ4gAABAMARzBFAiBF
HpgQAZ6i3KYxOAcE0B60ZIPInztjLdyfOdJn86NRdwIhALUZvFe8GOmgIqv7rc5T
JL9Lyqzg6AeaJ6W9/Jh0RQYCAHcA3dzKNJXX4RYF55Uy+sef+D0cUN/bADoUEnYK
LKy7yCoAAAGYYoFKGwAABAMASDBGAiEArQ7w8GC+TmLOzcCWjvNp1SLMQiNGh11Y
oN/13ivn364CIQCrQwZiZAHcIE8vFpoUH8GOAm0B8fb2TWCwXXKmhuid6zANBgkq
hkiG9w0BAQsFAAOCAQEAcVNScUP0wRgO1DCxSSq+QqIkr8fZmmIjR5DX+VU9bbeg
KXYBc7MZ+M16fyyxTDkxJCHXo2j2+z4c5JeOXUMltYAq19nS9VOE8toZqbr9CdoW
TGWJuVvlJ72JzUrdguwQz6SMaExAzbcolSe+o1CuooM92mbrHV37uYS3IE8ZR7/7
dy3UAoIMFrV3mQHTExJXpU/t+nb/xrocaMwNPTsUVjGguw6ObZlhamE4uMFu71Er
rcWYg32btwcHF5XJ+iNTfd4rTDxnGm70YHC6bMRuR6Pflg+BmDqQ1F7X43LGWdD/
R14Q3N+P2OFifA+nbAH2sZEWJID6oZzhHHa6SZGZhg==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFBTCCAu2gAwIBAgIQS6hSk/eaL6JzBkuoBI110DANBgkqhkiG9w0BAQsFADBP
MQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy
Y2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yNDAzMTMwMDAwMDBa
Fw0yNzAzMTIyMzU5NTlaMDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBF
bmNyeXB0MQwwCgYDVQQDEwNSMTAwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQDPV+XmxFQS7bRH/sknWHZGUCiMHT6I3wWd1bUYKb3dtVq/+vbOo76vACFL
YlpaPAEvxVgD9on/jhFD68G14BQHlo9vH9fnuoE5CXVlt8KvGFs3Jijno/QHK20a
/6tYvJWuQP/py1fEtVt/eA0YYbwX51TGu0mRzW4Y0YCF7qZlNrx06rxQTOr8IfM4
FpOUurDTazgGzRYSespSdcitdrLCnF2YRVxvYXvGLe48E1KGAdlX5jgc3421H5KR
mudKHMxFqHJV8LDmowfs/acbZp4/SItxhHFYyTr6717yW0QrPHTnj7JHwQdqzZq3
DZb3EoEmUVQK7GH29/Xi8orIlQ2NAgMBAAGjgfgwgfUwDgYDVR0PAQH/BAQDAgGG
MB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATASBgNVHRMBAf8ECDAGAQH/
AgEAMB0GA1UdDgQWBBS7vMNHpeS8qcbDpHIMEI2iNeHI6DAfBgNVHSMEGDAWgBR5
tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAKG
Fmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0gBAwwCjAIBgZngQwBAgEwJwYD
VR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVuY3Iub3JnLzANBgkqhkiG9w0B
AQsFAAOCAgEAkrHnQTfreZ2B5s3iJeE6IOmQRJWjgVzPw139vaBw1bGWKCIL0vIo
zwzn1OZDjCQiHcFCktEJr59L9MhwTyAWsVrdAfYf+B9haxQnsHKNY67u4s5Lzzfd
u6PUzeetUK29v+PsPmI2cJkxp+iN3epi4hKu9ZzUPSwMqtCceb7qPVxEbpYxY1p9
1n5PJKBLBX9eb9LU6l8zSxPWV7bK3lG4XaMJgnT9x3ies7msFtpKK5bDtotij/l0
GaKeA97pb5uwD9KgWvaFXMIEt8jVTjLEvwRdvCn294GPDF08U8lAkIv7tghluaQh
1QnlE4SEN4LOECj8dsIGJXpGUk3aU3KkJz9icKy+aUgA+2cP21uh6NcDIS3XyfaZ
QjmDQ993ChII8SXWupQZVBiIpcWO4RqZk3lr7Bz5MUCwzDIA359e57SSq5CCkY0N
4B6Vulk7LktfwrdGNVI5BsC9qqxSwSKgRJeZ9wygIaehbHFHFhcBaMDKpiZlBHyz
rsnnlFXCb5s8HKn5LsUgGvB24L7sGNZP2CX7dhHov+YhD+jozLW2p9W4959Bz2Ei
RmqDtmiXLnzqTpXbI+suyCsohKRg6Un0RC47+cpiVwHiXZAW+cn8eiNIjqbVgXLx
KPpdzvvtTnOPlC7SQZSYmdunr3Bf9b77AiC/ZidstK36dRILKz7OA54=
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAnfJ8wbGA1Y93BT04aanc/N5F1nL4OxzZuDu/UOIhYia9BoFe
+2l7dIGnGt/iewZjFrbEjNKoN3/x+Wjmyf+QqJdiuV8SKEXca1mBclXJ5cs3ft6H
lDFXS7+HpTdkjNlSOPpSwWlxlkZzYYSQzy3RV0WzqRmX5pcEMzDEFaHgmqCMK9/b
9wjU38J7yYFBbst1wFPNNaIn5C/qCyzjXSXNZBjGQkIQrnOQzhPYu4xUKKi3/i8q
35DHsxuyt4c4a9unebduPA0e0IEk5v1wrb2p9+ZQERwrA+91o0MzC5lKYpoFuLdD
MZQnXHe8zFC1Tjdo4Xe1HG5kd4oVCLLWNbAY5wIDAQABAoIBAAvC0qdZoE5GsIYj
WOAFVf8+TdT6GqHMNCoTyNss+29jkw+48mmmIRs7zEWkBilDAH3gfiI+TWhUjqAT
v5uq/AqRuzgybBeznAYiVBE/chk6WJeJ2m6effGWAXO7/DDAve6gNSlRwLN/63eH
d4D12HC3L/mXfkgdVqK5LuCtfRwGWnRewNi6sLvrcgx+alJ28W4kAyuP61Yg1/A7
xxuZUkS6gP39yLxz16UbuaBt9BxHhNSQI3Bk408nm+BaPGaYpPwa1rXN/jEa+Arm
7BY+3qb/ImWTAqlKz7CVdUD1sirFLNOg1t+EpDsZmoZRuisqDRlErPheH9QZE9zT
FljxZgECgYEAzsgT7j25uia6Aehi+kJZTtr1iShB94hdrR+jBWTLKA+M3hHms6+B
alMKdo+wOatdZi3ZoxwtmrFS9iKQ9LCrz/3MFzuo63DyXy5tONuv3VIt5mhOD9aX
sTtPIamVN59lVyumuXzWVHF5rl2vUPNyuvG9Rb5Sp7umZNz8nmlr9PcCgYEAw4rD
QvHHeTjQWLp77VFPiNUimobrKHzBjXDMoSZ+2XjOwSIm+JOwd21uK9DQHU9cDFqQ
tDh1cnXhVpqESLk+V6eTD5+evsBw6lgX0z9u6Am364LAPp+gUahQFuvu7PezBjhp
y/7WzrwaTIw0QG0DMmDyWAVlK2kqnWVDD7e3L5ECgYBo9eI4AhjuRo4QPddP1LHk
dvw/PLIPZaa3I+Hp8Pm2Qf5tEoUaHDICuFgNSm5XN4bXQNrCEqGLbgsAaRdPPQZZ
MyiPencJ23ELo1NJkym3m+k0lSlanMCu8739Bkl5zGzyTHP6n0Vj452yRlehLZHF
FsPOTQdDoNqbRBjuh/CGjQKBgG/9YwNOMa4NidWnSB6MuP5nAuB5cOjJOpjlB20r
/O5UMCWQh71J6IEdnUFe4DJJJzC0FbgBtdIODTZqXGTCIyBUivchtesNkB3Gwi5s
X/poxnsNcUjsZwcdXHEkQrxYyKFBYeZBV4kjVfSNP8e+J1yNBX6/6EdKfeuS+Sth
TnrhAoGBAI8zVMbobWeIPVb5RYuXB2y0JxZbDrp4pIKRCotA5aLOB7J7n9qkELyG
AjXxirj3RSzFvwhKBRLQecJVKM+thormbDN2NZrFRliwsEXKn0sD/8GYF1lZlpQs
BeGatEURKl784kZvkU++a0LHGUljCdb1WoZ4iQs4Z3wLXwINw+jZ
-----END RSA PRIVATE KEY-----
-87
View File
@@ -1,87 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFZTCCBE2gAwIBAgISBUK1p5GM8Hsq7Ixqy8fCQ5DTMA0GCSqGSIb3DQEBCwUA
MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
EwNSMTMwHhcNMjUxMjE4MDc1ODA0WhcNMjYwMzE4MDc1ODAzWjAfMR0wGwYDVQQD
ExRjaGF0Lmd5b3phbWFuY2F2ZS5mcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
AQoCggEBAKMePawbIfTEqfddGXvm+b1vSTW4pFnSCSsDfKgZIRmocFN5bg4tG9qY
fnPj4tjFpxITBOsHjTFlJ64GthvPV3r+wF1zXv3bx+IBiFLT7CUVwXeZXTj1Oi1k
M5itB1moZNK377yTuKFwpCi4kCXln8XrLA26kuDJaEXWqwUBA228IT2n7h0Z02uD
haLe8I3QbihUyKsLOYBUyTrseapH08nmHJNAAr6mchk697mObJEllbXT3MFdVFDc
TxPE96ZHdgFs4G3fecmk5YDaMuzIFnHQOCSaIbGzmqknzfZSjQ/8E9bDF64hk19F
ZIDtJVvJB+qCh01ech+kNj3zHJRdUhMCAwEAAaOCAoUwggKBMA4GA1UdDwEB/wQE
AwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIw
ADAdBgNVHQ4EFgQU6TNu2UvVaeGvoN5f9cu9/H2PPOowHwYDVR0jBBgwFoAU56uf
DywzoFPTXk94yLKEDjvWkjMwMwYIKwYBBQUHAQEEJzAlMCMGCCsGAQUFBzAChhdo
dHRwOi8vcjEzLmkubGVuY3Iub3JnLzB5BgNVHREEcjBwghRjaGF0Lmd5b3phbWFu
Y2F2ZS5mcoIPZ3lvemFtYW5jYXZlLmZyghhqZWxseWZpbi5neW96YW1hbmNhdmUu
ZnKCFWppdHNpLmd5b3phbWFuY2F2ZS5mcoIWbWF0cml4Lmd5b3phbWFuY2F2ZS5m
cjATBgNVHSAEDDAKMAgGBmeBDAECATAuBgNVHR8EJzAlMCOgIaAfhh1odHRwOi8v
cjEzLmMubGVuY3Iub3JnLzg0LmNybDCCAQsGCisGAQQB1nkCBAIEgfwEgfkA9wB2
AMs49xWJfIShRF9bwd37yW7ymlnNRwppBYWwyxTDFFjnAAABmzCs3qIAAAQDAEcw
RQIgU5kNBmET09bpgcmZ6HgXK6tyk5S2ihuszUYxq2GrOPsCIQCLLeHQ4hJY8dTs
lNlAfJCRJ1YX0kWBqW475QDSGqQ6/gB9AHF+lfPCOIptseOEST0x4VqpYgh2LUIA
4AUM0Ge1pmHiAAABmzCs3wQACAAABQAEexqBBAMARjBEAiBVH3AQ66BZqnBv4P8F
b+9Jrnzu46KdxBnplmZ+tK0+iwIgODj+R9yIup8SeD/LM/W92y9iaodD9iIHVDDI
dt34fW8wDQYJKoZIhvcNAQELBQADggEBAJeaeC+7/bcD30GsO//3gJAZxFYH/5xQ
O1jsXfb+saBAXiNzg7ps8I+sMYJbC7E/arDgyKeu30bEkgD8JZF+9I/SFXWlyLUC
8nCKE/XBNTQNCn/5o464AwLV2L9eZWpszyIrmFFuCFEfOuc0dLznzr7dIz9vBDpd
Mi84S0wDasV/zWrtEcQ51PzZnqcF6cEWJM/N6G53sc2fbn0/xecTJ9kaOMxttyGV
2TRwZO1ab72G0GWp+LoIasApu7CdbgyUDzoVxAvTFSFQoNujwZwYYjuzNsMJbe7i
FU1lSrfeSCIi3DtvwRdBq0JxHE2A8WTGgzh6VaiXbNx+ii9gT533jh0=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFBTCCAu2gAwIBAgIQWgDyEtjUtIDzkkFX6imDBTANBgkqhkiG9w0BAQsFADBP
MQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy
Y2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yNDAzMTMwMDAwMDBa
Fw0yNzAzMTIyMzU5NTlaMDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBF
bmNyeXB0MQwwCgYDVQQDEwNSMTMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQClZ3CN0FaBZBUXYc25BtStGZCMJlA3mBZjklTb2cyEBZPs0+wIG6BgUUNI
fSvHSJaetC3ancgnO1ehn6vw1g7UDjDKb5ux0daknTI+WE41b0VYaHEX/D7YXYKg
L7JRbLAaXbhZzjVlyIuhrxA3/+OcXcJJFzT/jCuLjfC8cSyTDB0FxLrHzarJXnzR
yQH3nAP2/Apd9Np75tt2QnDr9E0i2gB3b9bJXxf92nUupVcM9upctuBzpWjPoXTi
dYJ+EJ/B9aLrAek4sQpEzNPCifVJNYIKNLMc6YjCR06CDgo28EdPivEpBHXazeGa
XP9enZiVuppD0EqiFwUBBDDTMrOPAgMBAAGjgfgwgfUwDgYDVR0PAQH/BAQDAgGG
MB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATASBgNVHRMBAf8ECDAGAQH/
AgEAMB0GA1UdDgQWBBTnq58PLDOgU9NeT3jIsoQOO9aSMzAfBgNVHSMEGDAWgBR5
tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAKG
Fmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0gBAwwCjAIBgZngQwBAgEwJwYD
VR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVuY3Iub3JnLzANBgkqhkiG9w0B
AQsFAAOCAgEAUTdYUqEimzW7TbrOypLqCfL7VOwYf/Q79OH5cHLCZeggfQhDconl
k7Kgh8b0vi+/XuWu7CN8n/UPeg1vo3G+taXirrytthQinAHGwc/UdbOygJa9zuBc
VyqoH3CXTXDInT+8a+c3aEVMJ2St+pSn4ed+WkDp8ijsijvEyFwE47hulW0Ltzjg
9fOV5Pmrg/zxWbRuL+k0DBDHEJennCsAen7c35Pmx7jpmJ/HtgRhcnz0yjSBvyIw
6L1QIupkCv2SBODT/xDD3gfQQyKv6roV4G2EhfEyAsWpmojxjCUCGiyg97FvDtm/
NK2LSc9lybKxB73I2+P2G3CaWpvvpAiHCVu30jW8GCxKdfhsXtnIy2imskQqVZ2m
0Pmxobb28Tucr7xBK7CtwvPrb79os7u2XP3O5f9b/H66GNyRrglRXlrYjI1oGYL/
f4I1n/Sgusda6WvA6C190kxjU15Y12mHU4+BxyR9cx2hhGS9fAjMZKJss28qxvz6
Axu4CaDmRNZpK/pQrXF17yXCXkmEWgvSOEZy6Z9pcbLIVEGckV/iVeq0AOo2pkg9
p4QRIy0tK2diRENLSF2KysFwbY6B26BFeFs3v1sYVRhFW9nLkOrQVporCS0KyZmf
wVD89qSTlnctLcZnIavjKsKUu1nA1iU0yYMdYepKR7lWbnwhdx3ewok=
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEoQIBAAKCAQEAox49rBsh9MSp910Ze+b5vW9JNbikWdIJKwN8qBkhGahwU3lu
Di0b2ph+c+Pi2MWnEhME6weNMWUnrga2G89Xev7AXXNe/dvH4gGIUtPsJRXBd5ld
OPU6LWQzmK0HWahk0rfvvJO4oXCkKLiQJeWfxessDbqS4MloRdarBQEDbbwhPafu
HRnTa4OFot7wjdBuKFTIqws5gFTJOux5qkfTyeYck0ACvqZyGTr3uY5skSWVtdPc
wV1UUNxPE8T3pkd2AWzgbd95yaTlgNoy7MgWcdA4JJohsbOaqSfN9lKND/wT1sMX
riGTX0VkgO0lW8kH6oKHTV5yH6Q2PfMclF1SEwIDAQABAoH/IUKi6kHRRErVkJrR
l3IbE+vQaCPXxawOMoPp5yme/Jxb5Kl3lDk4DlqjbjE8qcOjs9iTW1ku130vM7Nd
1RqlVW8C/aS77Qd9IMuVmhrPcln9TDKTAtb+Bd0CQew5YEH15ps0ej8+ZnmRZe9v
dReQfJeqlyINnchAesnke7pSxXN2xTegoNvNZWceb3eYruMp05m+ZdAwg78sPvBI
9GRSuwRWFt0o4qmzrPJOH11rveFa2xJvjMMXv52hTqOMtDzubrpvM0qhU0/EFyuY
woyQZvrudKjjGXMLp3Ahpn/5yHT//W92SPuthqAlr+e1k89V9vyjYq9CUq/jHryH
tUHZAoGBAND3Hp11FmdvKU1YToTzNdVVjWxbtJHvaGuDgR+Pm5ojrpeyDBXQwb8g
0p1b3v5omI3D5JnA7f6n3v6iVVGphlauDqi2G7xVJHvNbgPDKrEIPhL6+ctyGiv6
lNmeXLjAZBa+AoqblEtnchT3lCmLbCGcb0dr2p91sENoR/ROxJ+3AoGBAMfVV019
akKFpS5LnQPg0FCpwpoci67JJNN0LOrPwHD0+mEMW+ZP3eVLisbmqNeRAUcIXKrd
Ip6uV6gduenyBpakfEuvTOiHbFkEKgo7iSvIAU4ukuK1nKUaDpydckSzeqWSNAkM
cf/U/SDiWQBQRM3ocmBiYkF2O4AKhKiLTGiFAoGAGqwAJ17jji49Glc0JnoYm/NA
it0lrh7duCNf3tRoqwL07P3X1wz/PdMFrvoj+1sEZcvkKM/cUM3Cg8PamgLGV9f9
nQEphx9i+b5d1XMaxt/jdG6+ZX5Z4tUoHKK++QHthI2aK3DyO7GneQ+kxKy8D4o1
FeupSwMtjV0JGiDXrf8CgYEAtXP2Kynnc/IQ1GHaeGwKHESZrQCgoZyJsOw74Re2
QZthQwBK7m21KoEWyZcm118XDt377zaPOhFLDR+48kJPUziWmM7cAgT+EDJkzhfT
bYrWDJzjybJpQ83OWM3qtZFXm8KPN2wyk8Bd/R8q+8rnPyWDvht35sMqMhDa9oRO
ZFUCgYAswzGZTIBvw30K6Gv32lMMiBL/75J4Ob9pfAT00yPvGvtezv4Hwa2KSoW3
CMLvmAEeA5J0Ec3M9VtZuHHDkKDXp3KbvKiItNAZHX7PiW3xnoUA1sLB78iICyem
SVG0Sw93EIPsMVBCrBMeOQhdvC2FGeQN6CHcGgdM3BwK6koKJg==
-----END RSA PRIVATE KEY-----
-85
View File
@@ -1,85 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFBTCCA+2gAwIBAgISBjCoPymR7fahLUz38HfH7cO1MA0GCSqGSIb3DQEBCwUA
MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
EwNSMTMwHhcNMjUxMjE4MDc1ODA4WhcNMjYwMzE4MDc1ODA3WjAfMR0wGwYDVQQD
ExRoYXNzLmd5b3phbWFuY2F2ZS5mcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
AQoCggEBAKkd2rf0WMzNIIEDin8w4Wd1kCKWx+6K9XFBRugnATbL6SscN10O89ts
kFSU1NrWLZbv7rDuiG0hlExCImROLchpHgWSoptXCDmHRnccGxv62jm/Tzw1Tw0X
c0pdmNFPlcQCM+jyA/R2dygsEmTz+CcQw+ldcDmK2rImvZlH8RvkpU9mUdFWldUq
AcE3WOkljroP/dAhDbzrHbSNx0259B+CUqX+58g5JJjlwLTq3yPJlT6hVmJR4ouy
zjaiN1H9jMH2PQ6eabRRxI2vQ7a9f7FEWb61hTAYptmlNsWBkHyrFyyWLZ9CeAE/
yNz6/TPOIIhP2zbbSUJYTThP6d8EuSECAwEAAaOCAiUwggIhMA4GA1UdDwEB/wQE
AwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIw
ADAdBgNVHQ4EFgQULYZdSx6h1ci2h15MvNA18PjDj64wHwYDVR0jBBgwFoAU56uf
DywzoFPTXk94yLKEDjvWkjMwMwYIKwYBBQUHAQEEJzAlMCMGCCsGAQUFBzAChhdo
dHRwOi8vcjEzLmkubGVuY3Iub3JnLzAfBgNVHREEGDAWghRoYXNzLmd5b3phbWFu
Y2F2ZS5mcjATBgNVHSAEDDAKMAgGBmeBDAECATAuBgNVHR8EJzAlMCOgIaAfhh1o
dHRwOi8vcjEzLmMubGVuY3Iub3JnLzU0LmNybDCCAQUGCisGAQQB1nkCBAIEgfYE
gfMA8QB2AGQRxGykEuyniRyiAi4AvKtPKAfUHjUnq+r+1QPJfc3wAAABmzCs8bcA
AAQDAEcwRQIhAM/jZOPRYtYy6cNr5kcT9N1PsAY0WQgb/u5dlLJZnDY7AiBrAIAZ
k0d427f8cNH2g9cPITbJL8WiW1u02kEzxfXMxQB3AA5XlLzzrqk+MxssmQez95Df
m8I9cTIl3SGpJaxhxU4hAAABmzCs8cIAAAQDAEgwRgIhAKuj8yo00ERo7lX2cs4x
vQTVs9lOyNSXysxXEBNrZQ4lAiEA2Lp5qqEKT6GKd4DR7R6+CKOn/E7Hwtg+m+ei
QlDztVkwDQYJKoZIhvcNAQELBQADggEBAGSUIrjuLkeQ5PS2UACA3RBQFPXtcCZc
9LTkc23L9NSxdcVV616DdlFCUEz/oDjWndhuAHWcn60vNkeRog42mj0wZXGdGAbI
5xVlY5NyRrHfMtjXQn5yOlMbGAouSdWuwmUXwcz1nrilnZ3IMHvoJy5GjVUhrFlD
9vpdsxHfu0yvZwc6ISdv/p2sujoUBel2j9JSl3isJRgVJPyiVuIECIs4sbRP12/q
iTVfZegUqadr1Z+FErvSBDtM9z3V8vZaMH+fTBuz37Gzm9csaHTg+uG8PauuZC9t
WNAcwhGnUi0znLbBdPULJs8M+ETi8dxIONKV56ysPjFNndsvNC3NlT8=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFBTCCAu2gAwIBAgIQWgDyEtjUtIDzkkFX6imDBTANBgkqhkiG9w0BAQsFADBP
MQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy
Y2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yNDAzMTMwMDAwMDBa
Fw0yNzAzMTIyMzU5NTlaMDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBF
bmNyeXB0MQwwCgYDVQQDEwNSMTMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQClZ3CN0FaBZBUXYc25BtStGZCMJlA3mBZjklTb2cyEBZPs0+wIG6BgUUNI
fSvHSJaetC3ancgnO1ehn6vw1g7UDjDKb5ux0daknTI+WE41b0VYaHEX/D7YXYKg
L7JRbLAaXbhZzjVlyIuhrxA3/+OcXcJJFzT/jCuLjfC8cSyTDB0FxLrHzarJXnzR
yQH3nAP2/Apd9Np75tt2QnDr9E0i2gB3b9bJXxf92nUupVcM9upctuBzpWjPoXTi
dYJ+EJ/B9aLrAek4sQpEzNPCifVJNYIKNLMc6YjCR06CDgo28EdPivEpBHXazeGa
XP9enZiVuppD0EqiFwUBBDDTMrOPAgMBAAGjgfgwgfUwDgYDVR0PAQH/BAQDAgGG
MB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATASBgNVHRMBAf8ECDAGAQH/
AgEAMB0GA1UdDgQWBBTnq58PLDOgU9NeT3jIsoQOO9aSMzAfBgNVHSMEGDAWgBR5
tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAKG
Fmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0gBAwwCjAIBgZngQwBAgEwJwYD
VR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVuY3Iub3JnLzANBgkqhkiG9w0B
AQsFAAOCAgEAUTdYUqEimzW7TbrOypLqCfL7VOwYf/Q79OH5cHLCZeggfQhDconl
k7Kgh8b0vi+/XuWu7CN8n/UPeg1vo3G+taXirrytthQinAHGwc/UdbOygJa9zuBc
VyqoH3CXTXDInT+8a+c3aEVMJ2St+pSn4ed+WkDp8ijsijvEyFwE47hulW0Ltzjg
9fOV5Pmrg/zxWbRuL+k0DBDHEJennCsAen7c35Pmx7jpmJ/HtgRhcnz0yjSBvyIw
6L1QIupkCv2SBODT/xDD3gfQQyKv6roV4G2EhfEyAsWpmojxjCUCGiyg97FvDtm/
NK2LSc9lybKxB73I2+P2G3CaWpvvpAiHCVu30jW8GCxKdfhsXtnIy2imskQqVZ2m
0Pmxobb28Tucr7xBK7CtwvPrb79os7u2XP3O5f9b/H66GNyRrglRXlrYjI1oGYL/
f4I1n/Sgusda6WvA6C190kxjU15Y12mHU4+BxyR9cx2hhGS9fAjMZKJss28qxvz6
Axu4CaDmRNZpK/pQrXF17yXCXkmEWgvSOEZy6Z9pcbLIVEGckV/iVeq0AOo2pkg9
p4QRIy0tK2diRENLSF2KysFwbY6B26BFeFs3v1sYVRhFW9nLkOrQVporCS0KyZmf
wVD89qSTlnctLcZnIavjKsKUu1nA1iU0yYMdYepKR7lWbnwhdx3ewok=
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAqR3at/RYzM0ggQOKfzDhZ3WQIpbH7or1cUFG6CcBNsvpKxw3
XQ7z22yQVJTU2tYtlu/usO6IbSGUTEIiZE4tyGkeBZKim1cIOYdGdxwbG/raOb9P
PDVPDRdzSl2Y0U+VxAIz6PID9HZ3KCwSZPP4JxDD6V1wOYrasia9mUfxG+SlT2ZR
0VaV1SoBwTdY6SWOug/90CENvOsdtI3HTbn0H4JSpf7nyDkkmOXAtOrfI8mVPqFW
YlHii7LONqI3Uf2MwfY9Dp5ptFHEja9Dtr1/sURZvrWFMBim2aU2xYGQfKsXLJYt
n0J4AT/I3Pr9M84giE/bNttJQlhNOE/p3wS5IQIDAQABAoIBADiXU2nsO8zotYBG
mZFfX4YZ6o4Qi73QxTpNYDduWfMmwBNbgVFEICkkhpWvKh1Cv4W7K1IMuB1gt7nf
BZgwKxTdzByMSZqWwJtTn6pa/t1Zj630TUT2B8p3Nu7DLFCag6DQJePFHLqw68XH
Ha6njzovW4eba2LuCqnD2f1RfCbbTFCtZkF0xrsYOf+ld+bsBX8VyVd4jy2Pqn3k
zAgNKa/PRY5P/H4s/QPitIctSjq3CUJt3nqXRgtIRufxupUY+GGrzUYiJMsIC50Z
4/Eh5y/Za0kfpIusKXAjs2vsLbrMASw7lBxiCSvQah9hczP48rc/TQ+IyUkMErLM
QiNczcsCgYEA3Llkc4wMN7eyMjVJU42SxBfAR3/ynxEXHXCDkpf2fI1ZryYRs6u3
jhjjUEu2ZsxiWC9W/zE4YOCRtimbOeOBkARSyrtyQWbc94t0sQaeU2eXE6nC9pEl
ADlJ49u4lgU5FC2CJ0A/19h8w9uc4wM+4Jwlpd85Hr46hKzJQQKrOg8CgYEAxCUD
f1h2ot87jWhSKMUPPawthCl2X2yu/YuTcXcU8YoC5RK6j70SZGfiWzC833xx+Oxl
x5UMfr/f7QbNy+7oKFgyJBL2/JcO09j2vsESuEI45VPidS5lXU2h+DjtsF74PJ/Z
z/Bzh1CCF/6Ht2fiFLA6ei5sQVzQbwHGxRFVyc8CgYEAwoWMdpx9A/mbTM5TUhRZ
vQFljl2/V9o68dH/0oikTP5RhJ9bSGnUOaHLay9ej9gd77PAyuP42L/xCoY+a9UJ
kP+Oa2ao+eSKZor7iyvXCpAnv8eDr8MYxcq3SN2SHnx54kN9CdSAr1v2ELIR4Ksy
lcZnE3jXoTVq4xRXxThx6JcCgYA0ydllHoPfVcELT7Y87rwpVvtxBE+tYuy9pCDs
eqYSU5hv2liHctVOXH8ZF8bdRvrNiaHi0wRn4G/9tMUSS5wDr6je+JOsa2M8NLpD
oGbPXFM/tRHPg8sYD1q2GWwu+YBJoKPYSNhu5IX+uyv/el/oPX2fgHr2JGqcVZgP
VZkHFQKBgQCA/UrDvMd3qgUD8DeaZukLe+PbiWg1VfxN8qklMepx1jMA7POxTmyO
3luJiFQWdGkmkLOD4B051OZGLRhasNA5wtshF+3SicqX3TZuG4FQ4K2IvdYG/GvY
gzEq3XdRzbDCHSI61Z7GsjP5You+PGI7IXPPTAOmlzH8kR2ulVYQ9Q==
-----END RSA PRIVATE KEY-----
-53
View File
@@ -1,53 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIDpTCCAyqgAwIBAgISBscRFyoH6PXCsyzkawYjMT+SMAoGCCqGSM49BAMDMDIx
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF
ODAeFw0yNTEyMTgwNzU4MTJaFw0yNjAzMTgwNzU4MTFaMCIxIDAeBgNVBAMTF2hv
bWVnaXQuZ3lvemFtYW5jYXZlLmZyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE
V1Zjgua+dFubwUo5Woi8MjvwDN240fVWIW5oj/uiwSUyRIesDVOmu1FO7ujNicXZ
bORnxVWyshG08TgD6emjHqOCAi4wggIqMA4GA1UdDwEB/wQEAwIHgDAdBgNVHSUE
FjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQU
87cxJX8uKWah46zpIn+xdVLQ46AwHwYDVR0jBBgwFoAUjw0TovYuftFQbDMYOF1Z
jiNykcowMgYIKwYBBQUHAQEEJjAkMCIGCCsGAQUFBzAChhZodHRwOi8vZTguaS5s
ZW5jci5vcmcvMCIGA1UdEQQbMBmCF2hvbWVnaXQuZ3lvemFtYW5jYXZlLmZyMBMG
A1UdIAQMMAowCAYGZ4EMAQIBMC0GA1UdHwQmMCQwIqAgoB6GHGh0dHA6Ly9lOC5j
LmxlbmNyLm9yZy8xOS5jcmwwggENBgorBgEEAdZ5AgQCBIH+BIH7APkAdgBkEcRs
pBLsp4kcogIuALyrTygH1B41J6vq/tUDyX3N8AAAAZswrQEUAAAEAwBHMEUCIQCY
O86tkfJQof1N3jFoT6MS56WYkuy900f8jAxO+eT/GAIgKHm9E/gu+s+GdVRFySSX
pn66/Ixvj3F5kyOBxCG2TxEAfwBxfpXzwjiKbbHjhEk9MeFaqWIIdi1CAOAFDNBn
taZh4gAAAZswrQFkAAgAAAUABHsbGwQDAEgwRgIhAJLsVtu3H+yizmZlmmc5aq2K
2XMB7DFGsjDfZhbyRfflAiEAq5kDKwd95liW7GmJrkzQQFlx7dOsJwVobxALUw39
I/owCgYIKoZIzj0EAwMDaQAwZgIxAKiZ/geOalEht6Si0gI9V1jL0f+o27Wlkd0U
GW4zubvQlEp7fi6bIGYXP8K0+47eJwIxAO6Ox6Kj202b/Sek2EJrBKrhxlOlQQdE
jQ9DD74s6wswdyxPcitvQRy9/Yt83IL6Nw==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEVjCCAj6gAwIBAgIQY5WTY8JOcIJxWRi/w9ftVjANBgkqhkiG9w0BAQsFADBP
MQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy
Y2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yNDAzMTMwMDAwMDBa
Fw0yNzAzMTIyMzU5NTlaMDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBF
bmNyeXB0MQswCQYDVQQDEwJFODB2MBAGByqGSM49AgEGBSuBBAAiA2IABNFl8l7c
S7QMApzSsvru6WyrOq44ofTUOTIzxULUzDMMNMchIJBwXOhiLxxxs0LXeb5GDcHb
R6EToMffgSZjO9SNHfY9gjMy9vQr5/WWOrQTZxh7az6NSNnq3u2ubT6HTKOB+DCB
9TAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMB
MBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFI8NE6L2Ln7RUGwzGDhdWY4j
cpHKMB8GA1UdIwQYMBaAFHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEB
BCYwJDAiBggrBgEFBQcwAoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzATBgNVHSAE
DDAKMAgGBmeBDAECATAnBgNVHR8EIDAeMBygGqAYhhZodHRwOi8veDEuYy5sZW5j
ci5vcmcvMA0GCSqGSIb3DQEBCwUAA4ICAQBnE0hGINKsCYWi0Xx1ygxD5qihEjZ0
RI3tTZz1wuATH3ZwYPIp97kWEayanD1j0cDhIYzy4CkDo2jB8D5t0a6zZWzlr98d
AQFNh8uKJkIHdLShy+nUyeZxc5bNeMp1Lu0gSzE4McqfmNMvIpeiwWSYO9w82Ob8
otvXcO2JUYi3svHIWRm3+707DUbL51XMcY2iZdlCq4Wa9nbuk3WTU4gr6LY8MzVA
aDQG2+4U3eJ6qUF10bBnR1uuVyDYs9RhrwucRVnfuDj29CMLTsplM5f5wSV5hUpm
Uwp/vV7M4w4aGunt74koX71n4EdagCsL/Yk5+mAQU0+tue0JOfAV/R6t1k+Xk9s2
HMQFeoxppfzAVC04FdG9M+AC2JWxmFSt6BCuh3CEey3fE52Qrj9YM75rtvIjsm/1
Hl+u//Wqxnu1ZQ4jpa+VpuZiGOlWrqSP9eogdOhCGisnyewWJwRQOqK16wiGyZeR
xs/Bekw65vwSIaVkBruPiTfMOo0Zh4gVa8/qJgMbJbyrwwG97z/PRgmLKCDl8z3d
tA0Z7qq7fta0Gl24uyuB05dqI5J1LvAzKuWdIjT1tP8qCoxSE/xpix8hX2dt3h+/
jujUgFPFZ0EVZ0xSyBNRF3MboGZnYXFUxpNjTWPKpagDHJQmqrAcDmWJnMsFY3jS
u1igv3OefnWjSQ==
-----END CERTIFICATE-----
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIEG//C40B5uQNl7megYj6Sh/ugIcxql01dz1aSmytnICoAoGCCqGSM49
AwEHoUQDQgAEV1Zjgua+dFubwUo5Woi8MjvwDN240fVWIW5oj/uiwSUyRIesDVOm
u1FO7ujNicXZbORnxVWyshG08TgD6emjHg==
-----END EC PRIVATE KEY-----
-85
View File
@@ -1,85 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFBTCCA+2gAwIBAgISBaTjb8NGpzSq3h1l7ejarlE2MA0GCSqGSIb3DQEBCwUA
MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
EwNSMTAwHhcNMjUwNzMxMjEwMzExWhcNMjUxMDI5MjEwMzEwWjAgMR4wHAYDVQQD
ExVqaXRzaS5neW96YW1hbmNhdmUuZnIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
ggEKAoIBAQDXwpPVFxtiAwuiJtKUS97LztMN8DxV2FVuoTsmAVhnAUbAMyaTucue
zDOhn6GM4YOXS7zOW4XRGjl5ZOoKmh3WFrB1+1wtAfsX3YOKzFAKU25W5QORSSu/
CfT3u9lLMN3nGSZ7sPC+G3HRfvjyuY/qyO1kpcx58IaZBaBpn55ZI1XJrXCEzeP9
OPkKYo9wjZbp3YloMCQFOGohJw9kCY/am/q7LcfJx+Sl0fOdkNTHAbWo/sgsmWDj
uWA/M0pW0jhgD6ayEW2daLJ8zSj7J/SNBecyj7Mgeap0m3iD1LjUoFXVngGCPSPV
MJvuyGIqr8zUdU7WylNixz3jsj1Lz3ZDAgMBAAGjggIkMIICIDAOBgNVHQ8BAf8E
BAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQC
MAAwHQYDVR0OBBYEFHWPASx4C8OD5/Qnq6hl+0qXTF20MB8GA1UdIwQYMBaAFLu8
w0el5LypxsOkcgwQjaI14cjoMDMGCCsGAQUFBwEBBCcwJTAjBggrBgEFBQcwAoYX
aHR0cDovL3IxMC5pLmxlbmNyLm9yZy8wIAYDVR0RBBkwF4IVaml0c2kuZ3lvemFt
YW5jYXZlLmZyMBMGA1UdIAQMMAowCAYGZ4EMAQIBMC4GA1UdHwQnMCUwI6AhoB+G
HWh0dHA6Ly9yMTAuYy5sZW5jci5vcmcvNTUuY3JsMIIBAwYKKwYBBAHWeQIEAgSB
9ASB8QDvAHUApELFBklgYVSPD9TqnPt6LSZFTYepfy/fRVn2J086hFQAAAGYYoFc
CgAABAMARjBEAiANBPT9v7V1M+JJjorsYcZSP8Me5YgbMYlNrHEbzL4MIwIgXKGl
pe/fsLk0/NlJtcNPajxliYpek3L5po/xhWImhkwAdgAS8U40vVNyTIQGGcOPP3oT
+Oe1YoeInG0wBYTr5YYmOgAAAZhigWPcAAAEAwBHMEUCIC7wfsE9idaj2AadMB7p
acy5XpUgJ9mYIXTPQVBLBZsyAiEAueg7eMvDlWP9IfRQR0bfn+1ZDibTHfEbe4Kl
dLnU1WswDQYJKoZIhvcNAQELBQADggEBAIBR3NYiWAUFpYDueQCFCpttWVbFDev+
Sgmg3fyBDMhxDRCL+4eePYJ734wcP/cqVFIvCFZfSaV05LXX9S/SEc0n9L+Z+xnt
ftCgnGxRheqBs1tOb9nxrK2JQqifoy5W4pGzAK23GwNDaDEUcA4n0boViyXbyo0K
xquIuNE4nHGrTTWunsf/La7HUohTr3YpZmlV5sELnzC9Mj89X8l5KOSRSi81S0nY
YSFCX78WUODrxG6fX07YW5fjyx+IMHC7i5OzUbjF4Aiuf1P2nWkJI9zT5Gl3q+0e
EGX8ED71E+FytwCuyeGCOQcWzbBC5Sc4U93WTlR1LXqmdM/SBWYyC8c=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFBTCCAu2gAwIBAgIQS6hSk/eaL6JzBkuoBI110DANBgkqhkiG9w0BAQsFADBP
MQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy
Y2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yNDAzMTMwMDAwMDBa
Fw0yNzAzMTIyMzU5NTlaMDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBF
bmNyeXB0MQwwCgYDVQQDEwNSMTAwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQDPV+XmxFQS7bRH/sknWHZGUCiMHT6I3wWd1bUYKb3dtVq/+vbOo76vACFL
YlpaPAEvxVgD9on/jhFD68G14BQHlo9vH9fnuoE5CXVlt8KvGFs3Jijno/QHK20a
/6tYvJWuQP/py1fEtVt/eA0YYbwX51TGu0mRzW4Y0YCF7qZlNrx06rxQTOr8IfM4
FpOUurDTazgGzRYSespSdcitdrLCnF2YRVxvYXvGLe48E1KGAdlX5jgc3421H5KR
mudKHMxFqHJV8LDmowfs/acbZp4/SItxhHFYyTr6717yW0QrPHTnj7JHwQdqzZq3
DZb3EoEmUVQK7GH29/Xi8orIlQ2NAgMBAAGjgfgwgfUwDgYDVR0PAQH/BAQDAgGG
MB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATASBgNVHRMBAf8ECDAGAQH/
AgEAMB0GA1UdDgQWBBS7vMNHpeS8qcbDpHIMEI2iNeHI6DAfBgNVHSMEGDAWgBR5
tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAKG
Fmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0gBAwwCjAIBgZngQwBAgEwJwYD
VR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVuY3Iub3JnLzANBgkqhkiG9w0B
AQsFAAOCAgEAkrHnQTfreZ2B5s3iJeE6IOmQRJWjgVzPw139vaBw1bGWKCIL0vIo
zwzn1OZDjCQiHcFCktEJr59L9MhwTyAWsVrdAfYf+B9haxQnsHKNY67u4s5Lzzfd
u6PUzeetUK29v+PsPmI2cJkxp+iN3epi4hKu9ZzUPSwMqtCceb7qPVxEbpYxY1p9
1n5PJKBLBX9eb9LU6l8zSxPWV7bK3lG4XaMJgnT9x3ies7msFtpKK5bDtotij/l0
GaKeA97pb5uwD9KgWvaFXMIEt8jVTjLEvwRdvCn294GPDF08U8lAkIv7tghluaQh
1QnlE4SEN4LOECj8dsIGJXpGUk3aU3KkJz9icKy+aUgA+2cP21uh6NcDIS3XyfaZ
QjmDQ993ChII8SXWupQZVBiIpcWO4RqZk3lr7Bz5MUCwzDIA359e57SSq5CCkY0N
4B6Vulk7LktfwrdGNVI5BsC9qqxSwSKgRJeZ9wygIaehbHFHFhcBaMDKpiZlBHyz
rsnnlFXCb5s8HKn5LsUgGvB24L7sGNZP2CX7dhHov+YhD+jozLW2p9W4959Bz2Ei
RmqDtmiXLnzqTpXbI+suyCsohKRg6Un0RC47+cpiVwHiXZAW+cn8eiNIjqbVgXLx
KPpdzvvtTnOPlC7SQZSYmdunr3Bf9b77AiC/ZidstK36dRILKz7OA54=
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA18KT1RcbYgMLoibSlEvey87TDfA8VdhVbqE7JgFYZwFGwDMm
k7nLnswzoZ+hjOGDl0u8zluF0Ro5eWTqCpod1hawdftcLQH7F92DisxQClNuVuUD
kUkrvwn097vZSzDd5xkme7Dwvhtx0X748rmP6sjtZKXMefCGmQWgaZ+eWSNVya1w
hM3j/Tj5CmKPcI2W6d2JaDAkBThqIScPZAmP2pv6uy3HycfkpdHznZDUxwG1qP7I
LJlg47lgPzNKVtI4YA+mshFtnWiyfM0o+yf0jQXnMo+zIHmqdJt4g9S41KBV1Z4B
gj0j1TCb7shiKq/M1HVO1spTYsc947I9S892QwIDAQABAoIBAF10I7k4PX2aCRdu
jmZ6aGHJz2PpqxCZ2ANHpcmD6qkPBfipDywMXVSGaVS3wm81nNxTC1Asl00neT6K
Bc+aypKZGEy6F8ZM5dgD8/6SGZcnZRMRNhbfZSnlo6wMOwXVAEChhagsz1HgrE+M
GkN0OZB+AElIgUVN99be94jYgOtlVWYWOiAsfzsaAQRTTzNIbdfza//4dwPINGSi
ymr4EjiN6Lp9gNTw9FbDL/YOwr8+Eh1THfj8vVBKoyUM0bJqXcruQck6zHnPeGUf
K7qJWyQLZNgrVE9bKvG99cqNSmkl1OL1O7swK4CLQ7b7/GC02W/PVKyCFB2pmUjI
cKPaJCkCgYEA9plM5yELaHux4rRLptwz6CPCpV+bXO6eX+Fv3gq2r69lxnkOLqos
auGlIaE58WLIkT7aglt/9qUVAf+5ZU5ze4cEZ5B704/IyLS5DrTc1r/xh1ZNmZae
iGmSyLJOPxvQHBVlnIRVZMeikSD82+frx9xnn3itWFiCenMuTrujKMsCgYEA3/xN
y2oA+eJPi+ozI+o/x+L3SDus0Phewr04/TviI8mT4mm4lBCNlt8DdcHSWyRUZsy/
GPHn/LPojDC7P6I2weLsUO7+vHB1HVtWw2YT8eaK6t1OqZwdJ11ghVr4E2LygQ1Q
EOaVqxtdNJRJnbYapzHKifTUmRpZ1wBdiXAC0WkCgYEAvKYaRtbou02lkCENnuDm
dLimt4ykdju1vPPheKQJje1IlsUVLG3S/RESGuAUS62ecj77Oq50/mLb52OSmQWj
IuTvYasOj5J3r9NRnwaNy1ubkkVbqBupvAHH4PFHGtBULKfRzCMQkMCIhS4PQsvx
fDwIqd7P/b34U2S6EFFLSHECgYANoFjPPjSu/xCdz3KrBa45p9opX9AEqoeBS2ez
KDh6uuGvTYU4JMWoXwrj2BXHC6/CzUP27YiSfBNyq+hIV8MDCp4b0l5W8nR9g7gE
jSo7di4PWcVWVjQD2A9uLXmYHFXqeffb/1stnK2P7FGKMbDvaP0MZYOliM/cX55R
JSpWuQKBgDuTDABQA8tmBkwo2X2NQZdEG6Q1xhxuZrug6zRDzCC4nqJq4k7JaNSX
uvBq8Uyau9luLu7T2soUaWmQObFrpBZuIcKf/UByhbHA8eBdHAHNdUaUa9pVGk8W
nkboRwh2nwdFLjDcvKqhIdJAAm4vMSc/HnKWpxjIqj02KyHL5mB0
-----END RSA PRIVATE KEY-----
-53
View File
@@ -1,53 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIDljCCAxygAwIBAgISBg5gkRbRh2upyVvpO2kjDk7+MAoGCCqGSM49BAMDMDIx
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF
ODAeFw0yNTEyMTgwODAwMjNaFw0yNjAzMTgwODAwMjJaMB8xHTAbBgNVBAMTFGxl
ZGlnaXRhbGJvdWRvaXIuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEfaMs
qRR076hLhhWOSI6z3cT7qXGT7CwbPCuz2y0uVNBHDE7PAinkKU+xvu8RnXBNbhl2
mvLwIantblFil2UTZqOCAiMwggIfMA4GA1UdDwEB/wQEAwIHgDAdBgNVHSUEFjAU
BggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQU7vv9
pRBO1Mx0E0ypZQMqHPwNI8swHwYDVR0jBBgwFoAUjw0TovYuftFQbDMYOF1ZjiNy
kcowMgYIKwYBBQUHAQEEJjAkMCIGCCsGAQUFBzAChhZodHRwOi8vZTguaS5sZW5j
ci5vcmcvMB8GA1UdEQQYMBaCFGxlZGlnaXRhbGJvdWRvaXIuY29tMBMGA1UdIAQM
MAowCAYGZ4EMAQIBMC4GA1UdHwQnMCUwI6AhoB+GHWh0dHA6Ly9lOC5jLmxlbmNy
Lm9yZy8xMjcuY3JsMIIBBAYKKwYBBAHWeQIEAgSB9QSB8gDwAHcAyzj3FYl8hKFE
X1vB3fvJbvKaWc1HCmkFhbDLFMMUWOcAAAGbMK796wAABAMASDBGAiEAsaQMMstO
I9ca8zyRHt8Da+iR8bYIDGqRJYNcSALyDkcCIQC+lF2tB/ucgyQTO2SfTU1jl8et
vkQ+ifLXcOIVKZdGmwB1AEmcm2neHXzs/DbezYdkprhbrwqHgBnRVVL76esp3fjD
AAABmzCu/eIAAAQDAEYwRAIgNOKTbC8GpISH94uHQGwA6yDdfF4qfqlRE+9CtGhq
AysCIAcX6hh/foBly+p4NEBDK80QeR/r4f6QBGnV36w5fNTfMAoGCCqGSM49BAMD
A2gAMGUCMCsycSTcC9UMaE7GDLhHQt1npTQuci4/qBArML3mrkf3OU76BIi/WWcM
jso3jo3G7QIxANfTAhh4TPgp3rIwzBPdWectXEvh2fcvZXlMLOEBKp47ZoWF2lCC
aRwrk2UQJfP4mQ==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEVjCCAj6gAwIBAgIQY5WTY8JOcIJxWRi/w9ftVjANBgkqhkiG9w0BAQsFADBP
MQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy
Y2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yNDAzMTMwMDAwMDBa
Fw0yNzAzMTIyMzU5NTlaMDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBF
bmNyeXB0MQswCQYDVQQDEwJFODB2MBAGByqGSM49AgEGBSuBBAAiA2IABNFl8l7c
S7QMApzSsvru6WyrOq44ofTUOTIzxULUzDMMNMchIJBwXOhiLxxxs0LXeb5GDcHb
R6EToMffgSZjO9SNHfY9gjMy9vQr5/WWOrQTZxh7az6NSNnq3u2ubT6HTKOB+DCB
9TAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMB
MBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFI8NE6L2Ln7RUGwzGDhdWY4j
cpHKMB8GA1UdIwQYMBaAFHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEB
BCYwJDAiBggrBgEFBQcwAoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzATBgNVHSAE
DDAKMAgGBmeBDAECATAnBgNVHR8EIDAeMBygGqAYhhZodHRwOi8veDEuYy5sZW5j
ci5vcmcvMA0GCSqGSIb3DQEBCwUAA4ICAQBnE0hGINKsCYWi0Xx1ygxD5qihEjZ0
RI3tTZz1wuATH3ZwYPIp97kWEayanD1j0cDhIYzy4CkDo2jB8D5t0a6zZWzlr98d
AQFNh8uKJkIHdLShy+nUyeZxc5bNeMp1Lu0gSzE4McqfmNMvIpeiwWSYO9w82Ob8
otvXcO2JUYi3svHIWRm3+707DUbL51XMcY2iZdlCq4Wa9nbuk3WTU4gr6LY8MzVA
aDQG2+4U3eJ6qUF10bBnR1uuVyDYs9RhrwucRVnfuDj29CMLTsplM5f5wSV5hUpm
Uwp/vV7M4w4aGunt74koX71n4EdagCsL/Yk5+mAQU0+tue0JOfAV/R6t1k+Xk9s2
HMQFeoxppfzAVC04FdG9M+AC2JWxmFSt6BCuh3CEey3fE52Qrj9YM75rtvIjsm/1
Hl+u//Wqxnu1ZQ4jpa+VpuZiGOlWrqSP9eogdOhCGisnyewWJwRQOqK16wiGyZeR
xs/Bekw65vwSIaVkBruPiTfMOo0Zh4gVa8/qJgMbJbyrwwG97z/PRgmLKCDl8z3d
tA0Z7qq7fta0Gl24uyuB05dqI5J1LvAzKuWdIjT1tP8qCoxSE/xpix8hX2dt3h+/
jujUgFPFZ0EVZ0xSyBNRF3MboGZnYXFUxpNjTWPKpagDHJQmqrAcDmWJnMsFY3jS
u1igv3OefnWjSQ==
-----END CERTIFICATE-----
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIDO0mpnl161QMCcwpZM00Ycx3+xngaAC7fadPBTAJ/e3oAoGCCqGSM49
AwEHoUQDQgAEfaMsqRR076hLhhWOSI6z3cT7qXGT7CwbPCuz2y0uVNBHDE7PAink
KU+xvu8RnXBNbhl2mvLwIantblFil2UTZg==
-----END EC PRIVATE KEY-----
-53
View File
@@ -1,53 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIDnTCCAyOgAwIBAgISBuso8tMXwQVN/kIpLBeNPH3IMAoGCCqGSM49BAMDMDIx
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF
ODAeFw0yNTEyMTgwODMwNDlaFw0yNjAzMTgwODMwNDhaMB8xHTAbBgNVBAMTFGxp
bmtzLmJpbGxpc2RlYWQuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEyetv
quQNLip3jUa5J/9q+xhQsuAni6FD0D5ohBo1qjRgs8DWnR4hYs+LzOkI+JuS78WL
RYVXAqevCdxuWGXBN6OCAiowggImMA4GA1UdDwEB/wQEAwIHgDAdBgNVHSUEFjAU
BggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUd/AM
c6qZd8IHyNLrRk/EQJMXifMwHwYDVR0jBBgwFoAUjw0TovYuftFQbDMYOF1ZjiNy
kcowMgYIKwYBBQUHAQEEJjAkMCIGCCsGAQUFBzAChhZodHRwOi8vZTguaS5sZW5j
ci5vcmcvMB8GA1UdEQQYMBaCFGxpbmtzLmJpbGxpc2RlYWQuY29tMBMGA1UdIAQM
MAowCAYGZ4EMAQIBMC0GA1UdHwQmMCQwIqAgoB6GHGh0dHA6Ly9lOC5jLmxlbmNy
Lm9yZy83My5jcmwwggEMBgorBgEEAdZ5AgQCBIH9BIH6APgAdQBkEcRspBLsp4kc
ogIuALyrTygH1B41J6vq/tUDyX3N8AAAAZswytzAAAAEAwBGMEQCIA0MquqeJRBQ
tV0Yn1GAGl74ly8MTUaeAjq5x+n//5TKAiB4LOIalyRFRAPnp4ST5ULKdP5N/zf3
9YMjRho7wVrR9wB/ABqLnWlKV5jImaDKiL30j8C0VmDMw2ANH3H0af/H0ayjAAAB
mzDK3WIACAAABQAmYvgsBAMASDBGAiEApSyJp0N19h8H5Rnu71Xp7Hx0+A3VXlD5
mb3p0xv0PtUCIQC+pjkgv8F15nfIr42+j2w2Io3/hSHC7fCsZMFZP/NfiDAKBggq
hkjOPQQDAwNoADBlAjEAz0Lpa7RmJr5fBTxYNBp0xsw6zudsie+6mqqJjG8v6VKp
1Eof9hRo+euLdIGkfYqkAjB4+qlKiZ2NY4wV8Bt85T/1m119QgGHJuWmpFkiMETw
EQUkRySH1qoDqwg6LD4UOuE=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEVjCCAj6gAwIBAgIQY5WTY8JOcIJxWRi/w9ftVjANBgkqhkiG9w0BAQsFADBP
MQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy
Y2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yNDAzMTMwMDAwMDBa
Fw0yNzAzMTIyMzU5NTlaMDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBF
bmNyeXB0MQswCQYDVQQDEwJFODB2MBAGByqGSM49AgEGBSuBBAAiA2IABNFl8l7c
S7QMApzSsvru6WyrOq44ofTUOTIzxULUzDMMNMchIJBwXOhiLxxxs0LXeb5GDcHb
R6EToMffgSZjO9SNHfY9gjMy9vQr5/WWOrQTZxh7az6NSNnq3u2ubT6HTKOB+DCB
9TAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMB
MBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFI8NE6L2Ln7RUGwzGDhdWY4j
cpHKMB8GA1UdIwQYMBaAFHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEB
BCYwJDAiBggrBgEFBQcwAoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzATBgNVHSAE
DDAKMAgGBmeBDAECATAnBgNVHR8EIDAeMBygGqAYhhZodHRwOi8veDEuYy5sZW5j
ci5vcmcvMA0GCSqGSIb3DQEBCwUAA4ICAQBnE0hGINKsCYWi0Xx1ygxD5qihEjZ0
RI3tTZz1wuATH3ZwYPIp97kWEayanD1j0cDhIYzy4CkDo2jB8D5t0a6zZWzlr98d
AQFNh8uKJkIHdLShy+nUyeZxc5bNeMp1Lu0gSzE4McqfmNMvIpeiwWSYO9w82Ob8
otvXcO2JUYi3svHIWRm3+707DUbL51XMcY2iZdlCq4Wa9nbuk3WTU4gr6LY8MzVA
aDQG2+4U3eJ6qUF10bBnR1uuVyDYs9RhrwucRVnfuDj29CMLTsplM5f5wSV5hUpm
Uwp/vV7M4w4aGunt74koX71n4EdagCsL/Yk5+mAQU0+tue0JOfAV/R6t1k+Xk9s2
HMQFeoxppfzAVC04FdG9M+AC2JWxmFSt6BCuh3CEey3fE52Qrj9YM75rtvIjsm/1
Hl+u//Wqxnu1ZQ4jpa+VpuZiGOlWrqSP9eogdOhCGisnyewWJwRQOqK16wiGyZeR
xs/Bekw65vwSIaVkBruPiTfMOo0Zh4gVa8/qJgMbJbyrwwG97z/PRgmLKCDl8z3d
tA0Z7qq7fta0Gl24uyuB05dqI5J1LvAzKuWdIjT1tP8qCoxSE/xpix8hX2dt3h+/
jujUgFPFZ0EVZ0xSyBNRF3MboGZnYXFUxpNjTWPKpagDHJQmqrAcDmWJnMsFY3jS
u1igv3OefnWjSQ==
-----END CERTIFICATE-----
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIEUtUhuJNYtkeV71bGha45PIQhSYgNHtXWEs6Nty2QIMoAoGCCqGSM49
AwEHoUQDQgAEyetvquQNLip3jUa5J/9q+xhQsuAni6FD0D5ohBo1qjRgs8DWnR4h
Ys+LzOkI+JuS78WLRYVXAqevCdxuWGXBNw==
-----END EC PRIVATE KEY-----
-53
View File
@@ -1,53 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIDlTCCAxugAwIBAgISBXqsA+V5LsdvKafDbLpl7zFRMAoGCCqGSM49BAMDMDIx
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF
ODAeFw0yNTEyMTgwODMzMDBaFw0yNjAzMTgwODMyNTlaMB8xHTAbBgNVBAMTFGxp
bmtzLm1ydGVkZHliZWFyLmZyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEnHtU
VN+K3pQ3PYlriUGRC6i5IFcasUeq6NE42VWJBbdcaHBVlSBuYwGti4c4/1latfxn
XY21XaSUnMsk6pb9u6OCAiIwggIeMA4GA1UdDwEB/wQEAwIHgDAdBgNVHSUEFjAU
BggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQU8K21
fluE+3YLlS//C9pJknvzRNMwHwYDVR0jBBgwFoAUjw0TovYuftFQbDMYOF1ZjiNy
kcowMgYIKwYBBQUHAQEEJjAkMCIGCCsGAQUFBzAChhZodHRwOi8vZTguaS5sZW5j
ci5vcmcvMB8GA1UdEQQYMBaCFGxpbmtzLm1ydGVkZHliZWFyLmZyMBMGA1UdIAQM
MAowCAYGZ4EMAQIBMC0GA1UdHwQmMCQwIqAgoB6GHGh0dHA6Ly9lOC5jLmxlbmNy
Lm9yZy84Mi5jcmwwggEEBgorBgEEAdZ5AgQCBIH1BIHyAPAAdgBkEcRspBLsp4kc
ogIuALyrTygH1B41J6vq/tUDyX3N8AAAAZswzNuqAAAEAwBHMEUCIHDtj08Loupj
JDnH0R3wwHaDeJFEaRKighAbCLXdfH21AiEAyf9CNHFm9GcGwbD2KsLgpTiGCbxx
wSzlndCUeYjJlzAAdgDLOPcViXyEoURfW8Hd+8lu8ppZzUcKaQWFsMsUwxRY5wAA
AZswzNvDAAAEAwBHMEUCIQCm/WC5xAbF3o/8jikh15IDV84FZGSxSzQWU/HEqgkK
lQIgdfpT5ILZJSdnjUd5UFcXouE7+07+63cMzUtehgda3DcwCgYIKoZIzj0EAwMD
aAAwZQIxAN6r+dF7vO/7myCFoB4849oswjPjl/cSi2+7B3M3HolxZLBQ7or+NYhC
ZM6g00wGgAIwG5uZJ2FX3jarYQMwBwdymaGCXCu6ukANWUXdUMQik9LB7i0T2eDC
JDCzCpv5l980
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEVjCCAj6gAwIBAgIQY5WTY8JOcIJxWRi/w9ftVjANBgkqhkiG9w0BAQsFADBP
MQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy
Y2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yNDAzMTMwMDAwMDBa
Fw0yNzAzMTIyMzU5NTlaMDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBF
bmNyeXB0MQswCQYDVQQDEwJFODB2MBAGByqGSM49AgEGBSuBBAAiA2IABNFl8l7c
S7QMApzSsvru6WyrOq44ofTUOTIzxULUzDMMNMchIJBwXOhiLxxxs0LXeb5GDcHb
R6EToMffgSZjO9SNHfY9gjMy9vQr5/WWOrQTZxh7az6NSNnq3u2ubT6HTKOB+DCB
9TAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMB
MBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFI8NE6L2Ln7RUGwzGDhdWY4j
cpHKMB8GA1UdIwQYMBaAFHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEB
BCYwJDAiBggrBgEFBQcwAoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzATBgNVHSAE
DDAKMAgGBmeBDAECATAnBgNVHR8EIDAeMBygGqAYhhZodHRwOi8veDEuYy5sZW5j
ci5vcmcvMA0GCSqGSIb3DQEBCwUAA4ICAQBnE0hGINKsCYWi0Xx1ygxD5qihEjZ0
RI3tTZz1wuATH3ZwYPIp97kWEayanD1j0cDhIYzy4CkDo2jB8D5t0a6zZWzlr98d
AQFNh8uKJkIHdLShy+nUyeZxc5bNeMp1Lu0gSzE4McqfmNMvIpeiwWSYO9w82Ob8
otvXcO2JUYi3svHIWRm3+707DUbL51XMcY2iZdlCq4Wa9nbuk3WTU4gr6LY8MzVA
aDQG2+4U3eJ6qUF10bBnR1uuVyDYs9RhrwucRVnfuDj29CMLTsplM5f5wSV5hUpm
Uwp/vV7M4w4aGunt74koX71n4EdagCsL/Yk5+mAQU0+tue0JOfAV/R6t1k+Xk9s2
HMQFeoxppfzAVC04FdG9M+AC2JWxmFSt6BCuh3CEey3fE52Qrj9YM75rtvIjsm/1
Hl+u//Wqxnu1ZQ4jpa+VpuZiGOlWrqSP9eogdOhCGisnyewWJwRQOqK16wiGyZeR
xs/Bekw65vwSIaVkBruPiTfMOo0Zh4gVa8/qJgMbJbyrwwG97z/PRgmLKCDl8z3d
tA0Z7qq7fta0Gl24uyuB05dqI5J1LvAzKuWdIjT1tP8qCoxSE/xpix8hX2dt3h+/
jujUgFPFZ0EVZ0xSyBNRF3MboGZnYXFUxpNjTWPKpagDHJQmqrAcDmWJnMsFY3jS
u1igv3OefnWjSQ==
-----END CERTIFICATE-----
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIOigTECO5sqpAqSQU9Uk/OHqi6nSPcyQm/f2VAfd3lW4oAoGCCqGSM49
AwEHoUQDQgAEnHtUVN+K3pQ3PYlriUGRC6i5IFcasUeq6NE42VWJBbdcaHBVlSBu
YwGti4c4/1latfxnXY21XaSUnMsk6pb9uw==
-----END EC PRIVATE KEY-----
-53
View File
@@ -1,53 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIDnDCCAyOgAwIBAgISBZDuBGg2iwqW52uQK7NVaH9RMAoGCCqGSM49BAMDMDIx
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF
ODAeFw0yNTEyMTgwODAwMjZaFw0yNjAzMTgwODAwMjVaMB8xHTAbBgNVBAMTFG1h
aWwuZ3lvemFtYW5jYXZlLmZyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEipnX
219JWWn7xs31vJiqd5wYtMpEFapf8VIlaJf5s62uxpXas5+jj0wAZIqOffnVaWj9
ib9SGXpLnBHdWQ7fuKOCAiowggImMA4GA1UdDwEB/wQEAwIHgDAdBgNVHSUEFjAU
BggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUr+uq
8L9kTGKzB2gQRc1hssPKQt8wHwYDVR0jBBgwFoAUjw0TovYuftFQbDMYOF1ZjiNy
kcowMgYIKwYBBQUHAQEEJjAkMCIGCCsGAQUFBzAChhZodHRwOi8vZTguaS5sZW5j
ci5vcmcvMB8GA1UdEQQYMBaCFG1haWwuZ3lvemFtYW5jYXZlLmZyMBMGA1UdIAQM
MAowCAYGZ4EMAQIBMC0GA1UdHwQmMCQwIqAgoB6GHGh0dHA6Ly9lOC5jLmxlbmNy
Lm9yZy84Mi5jcmwwggEMBgorBgEEAdZ5AgQCBIH9BIH6APgAdgCWl2S/VViXrfdD
h2g3CEJ36fA61fak8zZuRqQ/D8qpxgAAAZswrwyeAAAEAwBHMEUCIQCJm8eUpnno
MZh02vKnC/FUUprLVeiU2mnw7Djt06jxsQIgET+1lPkeGENnoPjwGQT8o4pZ7p3g
UG3fhyCPUvanOL8AfgClyXiSXVdGF4KHDdiJZgtcVWSLfQBA8uwHaFHRiGkZ9wAA
AZswrw+mAAgAAAUALAQufgQDAEcwRQIgBS4iUbQzeLr26DFZPXA8vtVvSyFCiE5M
+zdwVwyFz+sCIQCf0azsNViCP5LpMANNfMQRmrawLqiyB0kFkhTo/jMYmjAKBggq
hkjOPQQDAwNnADBkAjAlQHEhwD2tMGUjZIzx+W1DQbDB4ZL76z/w9N803A4llM3B
cWtbS9DUQ8muAWWsb6YCMBdfm0LMgZqR5jnVed5VhStJLtUbhuFlAEa53PR6Kvrt
IUfYeaewwC122fdpArS3cQ==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEVjCCAj6gAwIBAgIQY5WTY8JOcIJxWRi/w9ftVjANBgkqhkiG9w0BAQsFADBP
MQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy
Y2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yNDAzMTMwMDAwMDBa
Fw0yNzAzMTIyMzU5NTlaMDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBF
bmNyeXB0MQswCQYDVQQDEwJFODB2MBAGByqGSM49AgEGBSuBBAAiA2IABNFl8l7c
S7QMApzSsvru6WyrOq44ofTUOTIzxULUzDMMNMchIJBwXOhiLxxxs0LXeb5GDcHb
R6EToMffgSZjO9SNHfY9gjMy9vQr5/WWOrQTZxh7az6NSNnq3u2ubT6HTKOB+DCB
9TAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMB
MBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFI8NE6L2Ln7RUGwzGDhdWY4j
cpHKMB8GA1UdIwQYMBaAFHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEB
BCYwJDAiBggrBgEFBQcwAoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzATBgNVHSAE
DDAKMAgGBmeBDAECATAnBgNVHR8EIDAeMBygGqAYhhZodHRwOi8veDEuYy5sZW5j
ci5vcmcvMA0GCSqGSIb3DQEBCwUAA4ICAQBnE0hGINKsCYWi0Xx1ygxD5qihEjZ0
RI3tTZz1wuATH3ZwYPIp97kWEayanD1j0cDhIYzy4CkDo2jB8D5t0a6zZWzlr98d
AQFNh8uKJkIHdLShy+nUyeZxc5bNeMp1Lu0gSzE4McqfmNMvIpeiwWSYO9w82Ob8
otvXcO2JUYi3svHIWRm3+707DUbL51XMcY2iZdlCq4Wa9nbuk3WTU4gr6LY8MzVA
aDQG2+4U3eJ6qUF10bBnR1uuVyDYs9RhrwucRVnfuDj29CMLTsplM5f5wSV5hUpm
Uwp/vV7M4w4aGunt74koX71n4EdagCsL/Yk5+mAQU0+tue0JOfAV/R6t1k+Xk9s2
HMQFeoxppfzAVC04FdG9M+AC2JWxmFSt6BCuh3CEey3fE52Qrj9YM75rtvIjsm/1
Hl+u//Wqxnu1ZQ4jpa+VpuZiGOlWrqSP9eogdOhCGisnyewWJwRQOqK16wiGyZeR
xs/Bekw65vwSIaVkBruPiTfMOo0Zh4gVa8/qJgMbJbyrwwG97z/PRgmLKCDl8z3d
tA0Z7qq7fta0Gl24uyuB05dqI5J1LvAzKuWdIjT1tP8qCoxSE/xpix8hX2dt3h+/
jujUgFPFZ0EVZ0xSyBNRF3MboGZnYXFUxpNjTWPKpagDHJQmqrAcDmWJnMsFY3jS
u1igv3OefnWjSQ==
-----END CERTIFICATE-----
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIOQBYJeXUJ3rvIYx0VqyELxGMdCVGP7iIjaNbgFwHc0GoAoGCCqGSM49
AwEHoUQDQgAEipnX219JWWn7xs31vJiqd5wYtMpEFapf8VIlaJf5s62uxpXas5+j
j0wAZIqOffnVaWj9ib9SGXpLnBHdWQ7fuA==
-----END EC PRIVATE KEY-----
-86
View File
@@ -1,86 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFEjCCA/qgAwIBAgISBm1LSIccMU8FlOV3W9x8P9JHMA0GCSqGSIb3DQEBCwUA
MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
EwNSMTMwHhcNMjUxMjE4MDgwMDMxWhcNMjYwMzE4MDgwMDMwWjAhMR8wHQYDVQQD
ExZtYXNobnUuZ3lvemFtYW5jYXZlLmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
MIIBCgKCAQEApw1Iur3HOU5pU65JI40FzMrDrcI3qVHCVLJzKF880Elubau66UsC
fLl4H5CNdATihGVWmtAvhrp/nq/FM01iWNcIWqDSLG2s7PpdhPLTm5HiM5QfOToS
OIMWJ5mz++MiALZiTNGuMIC+3Op8ofbmZL1xpuN+dfXSVWRA18pa+bWU30BVQvbY
ZHg2V3N97mDUqB3hrYvXkPeeZq5vmZIYlMsgaKIjJ52mU4PLWHil4V7cJ4fejeen
O3HBj54n+kdjRsrmBCz5Zd5f7j2uj+5n9DWJeURIK/mj5hGvLUfOuqhVnnbIxx2f
/AHVB1OHvsPaoAlL+fGwmc+ZOtaMh6TgKwIDAQABo4ICMDCCAiwwDgYDVR0PAQH/
BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMBAf8E
AjAAMB0GA1UdDgQWBBT2dVNUZPbFx/YVM5xjCBQfEy7VmTAfBgNVHSMEGDAWgBTn
q58PLDOgU9NeT3jIsoQOO9aSMzAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAKG
F2h0dHA6Ly9yMTMuaS5sZW5jci5vcmcvMCEGA1UdEQQaMBiCFm1hc2hudS5neW96
YW1hbmNhdmUuZnIwEwYDVR0gBAwwCjAIBgZngQwBAgEwLgYDVR0fBCcwJTAjoCGg
H4YdaHR0cDovL3IxMy5jLmxlbmNyLm9yZy83Mi5jcmwwggEOBgorBgEEAdZ5AgQC
BIH/BIH8APoAdwCWl2S/VViXrfdDh2g3CEJ36fA61fak8zZuRqQ/D8qpxgAAAZsw
rx/KAAAEAwBIMEYCIQDnKUYXIv624M+3hsIQYLGm8Fj8VRHLP7SON81TNYp35wIh
ALwvSqxwFQMKCu0l7AqDmY+ZEYDdIbNJDXYfN1DCd49xAH8Apcl4kl1XRheChw3Y
iWYLXFVki30AQPLsB2hR0YhpGfcAAAGbMK8jLgAIAAAFACwELtkEAwBIMEYCIQCz
b225POXHHxLgCqk99RRf+vZ0l1q2feIZQcDoPmYUqQIhALmx/NjHERdt3FcacztE
XXP8l+xJr46lTdEXOfwb/dvvMA0GCSqGSIb3DQEBCwUAA4IBAQAokKKi66QuWf9V
AMsWGGr6FHGmp1Z5bIx0ybByoLED+Y3FtIFDCJcxJHcJZIGGA4X4EAsxUgLpOTH4
LQvqPpL2KQqLGPkJ1CRZyRQ4z/R2IPJHdAodRg4QfsNW0LAnV/QPKQMPcqqIuZY1
SkwzwA3uC5VxhXfvkFJo3QE00vZZxOQWT8GAh3I4bAtkkO3+hJ6ms079YvFrAPe3
8RJ0vFgfZhJol1peo6qOg0EPyeFc+L0cxnAPs1JB4idY66NYpFaxONMZBXwjOjDz
oTdEX6DDy7lDCJazUwEja8Nsnyrubhe8XWPYYUrR7oNrXEBCh82RnlCFbOQWT5Xq
ydEUVWRA
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFBTCCAu2gAwIBAgIQWgDyEtjUtIDzkkFX6imDBTANBgkqhkiG9w0BAQsFADBP
MQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy
Y2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yNDAzMTMwMDAwMDBa
Fw0yNzAzMTIyMzU5NTlaMDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBF
bmNyeXB0MQwwCgYDVQQDEwNSMTMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQClZ3CN0FaBZBUXYc25BtStGZCMJlA3mBZjklTb2cyEBZPs0+wIG6BgUUNI
fSvHSJaetC3ancgnO1ehn6vw1g7UDjDKb5ux0daknTI+WE41b0VYaHEX/D7YXYKg
L7JRbLAaXbhZzjVlyIuhrxA3/+OcXcJJFzT/jCuLjfC8cSyTDB0FxLrHzarJXnzR
yQH3nAP2/Apd9Np75tt2QnDr9E0i2gB3b9bJXxf92nUupVcM9upctuBzpWjPoXTi
dYJ+EJ/B9aLrAek4sQpEzNPCifVJNYIKNLMc6YjCR06CDgo28EdPivEpBHXazeGa
XP9enZiVuppD0EqiFwUBBDDTMrOPAgMBAAGjgfgwgfUwDgYDVR0PAQH/BAQDAgGG
MB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATASBgNVHRMBAf8ECDAGAQH/
AgEAMB0GA1UdDgQWBBTnq58PLDOgU9NeT3jIsoQOO9aSMzAfBgNVHSMEGDAWgBR5
tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAKG
Fmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0gBAwwCjAIBgZngQwBAgEwJwYD
VR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVuY3Iub3JnLzANBgkqhkiG9w0B
AQsFAAOCAgEAUTdYUqEimzW7TbrOypLqCfL7VOwYf/Q79OH5cHLCZeggfQhDconl
k7Kgh8b0vi+/XuWu7CN8n/UPeg1vo3G+taXirrytthQinAHGwc/UdbOygJa9zuBc
VyqoH3CXTXDInT+8a+c3aEVMJ2St+pSn4ed+WkDp8ijsijvEyFwE47hulW0Ltzjg
9fOV5Pmrg/zxWbRuL+k0DBDHEJennCsAen7c35Pmx7jpmJ/HtgRhcnz0yjSBvyIw
6L1QIupkCv2SBODT/xDD3gfQQyKv6roV4G2EhfEyAsWpmojxjCUCGiyg97FvDtm/
NK2LSc9lybKxB73I2+P2G3CaWpvvpAiHCVu30jW8GCxKdfhsXtnIy2imskQqVZ2m
0Pmxobb28Tucr7xBK7CtwvPrb79os7u2XP3O5f9b/H66GNyRrglRXlrYjI1oGYL/
f4I1n/Sgusda6WvA6C190kxjU15Y12mHU4+BxyR9cx2hhGS9fAjMZKJss28qxvz6
Axu4CaDmRNZpK/pQrXF17yXCXkmEWgvSOEZy6Z9pcbLIVEGckV/iVeq0AOo2pkg9
p4QRIy0tK2diRENLSF2KysFwbY6B26BFeFs3v1sYVRhFW9nLkOrQVporCS0KyZmf
wVD89qSTlnctLcZnIavjKsKUu1nA1iU0yYMdYepKR7lWbnwhdx3ewok=
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEApw1Iur3HOU5pU65JI40FzMrDrcI3qVHCVLJzKF880Elubau6
6UsCfLl4H5CNdATihGVWmtAvhrp/nq/FM01iWNcIWqDSLG2s7PpdhPLTm5HiM5Qf
OToSOIMWJ5mz++MiALZiTNGuMIC+3Op8ofbmZL1xpuN+dfXSVWRA18pa+bWU30BV
QvbYZHg2V3N97mDUqB3hrYvXkPeeZq5vmZIYlMsgaKIjJ52mU4PLWHil4V7cJ4fe
jeenO3HBj54n+kdjRsrmBCz5Zd5f7j2uj+5n9DWJeURIK/mj5hGvLUfOuqhVnnbI
xx2f/AHVB1OHvsPaoAlL+fGwmc+ZOtaMh6TgKwIDAQABAoIBABP+K4Op/eN2ZnWs
6LT4Bkctx0CO+4FotxTS7KRazZjyCOTYRjzwjMInomBIuR03DnMg+734h4+c13RC
/ht3Oft+9NF/6NeHYshT6IhmVXwLeCKLKjd7oz2fNrITm65cTy/9pAMkny/P4Mfo
ynTJ62YIJEeAd5yfiIZOwtHwtnWnG7XELX56Mav+xh2KVPZPr3ZxEhX7XPmc4XMT
IBJXQUxy4XGgKVayELtI/2yU4dzFgyfkckPw1V53O4IzfIRGp4pl+cFY6mefNMVU
DZqJ3Mbqwou3J+/n2IuI8XB8SdQzH2P62fnNwuUmePr5V0I6fV89Rbw8qoUeB0sh
KMwWuQUCgYEA2LJf/77jT9YQfpfD3E5N9bzOoRFikFfUh4QIpjQ/WL4jswapyswn
z+LwFdvfpqGcu+7OO3SP6/d+95XO3cjAHNj31dTaUWyGCiJ4V2DkFok9KBhujUai
Lh1vwCFBnOfcbZ7AWe9v9vXnXF7NK67SqaAQfwQ6xJo5UBx9Gwki2m8CgYEAxVnO
jcvCtzTx33WlublhSskFkfGDNwkIWz+Emtq6w4DwgiP8dXFdJiXX+1jIgRR3qdx4
GAeyyGSErxFLFJvb6acBrqq1BTRibIcOZ29KT9NlWF7vbYpmzUI+c9bIi+wgJKuk
8LCNqwSGVlc2PahCBHDdG5G+/dN5fC0i25wxJAUCgYAu32aki0XgHw2yVGGpZca3
QP/xFzGax2TRa13zlZmeOILAVtCjbUWvUgdcsxLNmGeuvxkdAzmecQqlw2Hb13C2
zLfPKRuQQUk9J/ef7vVnaogwBBjltkGed/+UL51hs0Wa8Jvq2D//y3EgKeF3cXlf
95+Z2fBcVn/PNFpbXr6LQQKBgGr2xxZhpzLndmVYfa+RQ6NmGyfEEAuHUMksPzIz
dWC7hR/0Y0RAYm1nu42WzG3x6v3c6haULZmhqay9ocUUyPf2Ndo22hBtGR+bf/od
/tgPSvG/2uOzTQ7ZZcIhWudD3xQhGDAAcXiM5kbr1BFNHiMMDTuBHlSzBzh/ulHv
cU8FAoGAfS9knvPcFdFaD5X3uMjhbxrfynM5KJCaTKxLPUXm9pZPnah3wpIFpseA
YSvuFyK7zpVxhI2853QphYJqB/u0pXjm1VupUVUpSYZNJC5IE6aSnCXeKodBgyjx
YIzoaYCtBfCTZhRKtzvDQSmtjZk3Nf3lL7RKFg3YXTFcHeiDTw0=
-----END RSA PRIVATE KEY-----
-85
View File
@@ -1,85 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFCjCCA/KgAwIBAgISBttfSBIlARew5psc11NPxSHlMA0GCSqGSIb3DQEBCwUA
MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
EwNSMTEwHhcNMjUwNzMxMjEwMzE4WhcNMjUxMDI5MjEwMzE3WjAhMR8wHQYDVQQD
ExZtYXRyaXguZ3lvemFtYW5jYXZlLmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
MIIBCgKCAQEAuE+xCGBSEJ9SMZCGTawqCKupoAOukBR3I/i3hjwy5fc/9jm70jzC
KW5Y0WJzAesSI3SVoTEg19wzskn25G46Fr/fe1b2V9qfCuckHWIavCF8Y48qYKXo
iMunTFyGtrr2waY1B6gU3eAqp1lLr0bmPtwQwL5iE/ZG4fhAKkxznPaoJJ/XGE2O
YuYuWequlijC0474shT4e8CTmYjrrdj+AkHpMWnAe9FUzfPxGKsPA8qs0i5Cyq5H
CNp7snc7KK32DBvLV20fgMTiuOfurCXYDY7LqOqw5KlWXPmSjw/kfzRsMonEouDU
KlWylXOoe2lrXF2OTB2YIYNy3rNDHXAC5QIDAQABo4ICKDCCAiQwDgYDVR0PAQH/
BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMBAf8E
AjAAMB0GA1UdDgQWBBSYZYIH+oXatqWd3NxLTGPa8SCaazAfBgNVHSMEGDAWgBTF
z0ak6vTDwHpslcQtsF6SLybjuTAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAKG
F2h0dHA6Ly9yMTEuaS5sZW5jci5vcmcvMCEGA1UdEQQaMBiCFm1hdHJpeC5neW96
YW1hbmNhdmUuZnIwEwYDVR0gBAwwCjAIBgZngQwBAgEwLwYDVR0fBCgwJjAkoCKg
IIYeaHR0cDovL3IxMS5jLmxlbmNyLm9yZy8xMDIuY3JsMIIBBQYKKwYBBAHWeQIE
AgSB9gSB8wDxAHcA3dzKNJXX4RYF55Uy+sef+D0cUN/bADoUEnYKLKy7yCoAAAGY
YoF1swAABAMASDBGAiEA29Fnvoh91i6fWfrRarMui7AtBcH79hfM6ZspdjDpGrQC
IQC4oJiwrk20SiLPzQYdzxV46nmpaL2nSTFzlrzZewunYAB2AA3h8jAr0w3BQGIS
CepVLvxHdHyx1+kw7w5CHrR+Tqo0AAABmGKBfTgAAAQDAEcwRQIhALT3PTyPJIqP
IgaIacp8HCNVv8x0VhwauNw5vTuqtYI2AiARtqNIxyt0ZEYl1SU2RsywIv6vDBXb
govlnMmJCX0fDzANBgkqhkiG9w0BAQsFAAOCAQEAt5cl04pXlC7GfnqWmbIE4sNy
aWzdMzgRfSBUwXSupVN+FPNBKFU18VFEQNOQ+oqi0wT5xW9tyKUi9e/OZE2P07mt
dFNrI6b7XFjoRm5V9r3jMULG/jaWDl7izgfHq40qzmoM8kScA5kFTk86foamITl/
BLTH0O2F6EQ03wwWq5uFBTMdEz8KDV7RXi4sVZ8QOld/TQaY9hrpRqte242gLTB/
F793P04mPqcFTzOHpCc8OK1jA6jjFOceG9J6MZAOSLsta3yz6XlaF8M2SjP7y061
UANRgaz9hs/ryEu8S9bEQUjnNdUm5V+B7xm06RS4ED3pYTaFx7TycMuv4g20EQ==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFBjCCAu6gAwIBAgIRAIp9PhPWLzDvI4a9KQdrNPgwDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjQwMzEzMDAwMDAw
WhcNMjcwMzEyMjM1OTU5WjAzMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg
RW5jcnlwdDEMMAoGA1UEAxMDUjExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEAuoe8XBsAOcvKCs3UZxD5ATylTqVhyybKUvsVAbe5KPUoHu0nsyQYOWcJ
DAjs4DqwO3cOvfPlOVRBDE6uQdaZdN5R2+97/1i9qLcT9t4x1fJyyXJqC4N0lZxG
AGQUmfOx2SLZzaiSqhwmej/+71gFewiVgdtxD4774zEJuwm+UE1fj5F2PVqdnoPy
6cRms+EGZkNIGIBloDcYmpuEMpexsr3E+BUAnSeI++JjF5ZsmydnS8TbKF5pwnnw
SVzgJFDhxLyhBax7QG0AtMJBP6dYuC/FXJuluwme8f7rsIU5/agK70XEeOtlKsLP
Xzze41xNG/cLJyuqC0J3U095ah2H2QIDAQABo4H4MIH1MA4GA1UdDwEB/wQEAwIB
hjAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwEgYDVR0TAQH/BAgwBgEB
/wIBADAdBgNVHQ4EFgQUxc9GpOr0w8B6bJXELbBeki8m47kwHwYDVR0jBBgwFoAU
ebRZ5nu25eQBc4AIiMgaWPbpm24wMgYIKwYBBQUHAQEEJjAkMCIGCCsGAQUFBzAC
hhZodHRwOi8veDEuaS5sZW5jci5vcmcvMBMGA1UdIAQMMAowCAYGZ4EMAQIBMCcG
A1UdHwQgMB4wHKAaoBiGFmh0dHA6Ly94MS5jLmxlbmNyLm9yZy8wDQYJKoZIhvcN
AQELBQADggIBAE7iiV0KAxyQOND1H/lxXPjDj7I3iHpvsCUf7b632IYGjukJhM1y
v4Hz/MrPU0jtvfZpQtSlET41yBOykh0FX+ou1Nj4ScOt9ZmWnO8m2OG0JAtIIE38
01S0qcYhyOE2G/93ZCkXufBL713qzXnQv5C/viOykNpKqUgxdKlEC+Hi9i2DcaR1
e9KUwQUZRhy5j/PEdEglKg3l9dtD4tuTm7kZtB8v32oOjzHTYw+7KdzdZiw/sBtn
UfhBPORNuay4pJxmY/WrhSMdzFO2q3Gu3MUBcdo27goYKjL9CTF8j/Zz55yctUoV
aneCWs/ajUX+HypkBTA+c8LGDLnWO2NKq0YD/pnARkAnYGPfUDoHR9gVSp/qRx+Z
WghiDLZsMwhN1zjtSC0uBWiugF3vTNzYIEFfaPG7Ws3jDrAMMYebQ95JQ+HIBD/R
PBuHRTBpqKlyDnkSHDHYPiNX3adPoPAcgdF3H2/W0rmoswMWgTlLn1Wu0mrks7/q
pdWfS6PJ1jty80r2VKsM/Dj3YIDfbjXKdaFU5C+8bhfJGqU3taKauuz0wHVGT3eo
6FlWkWYtbt4pgdamlwVeZEW+LM7qZEJEsMNPrfC03APKmZsJgpWCDWOKZvkZcvjV
uYkQ4omYCTX5ohy+knMjdOmdH9c7SpqEWBDC86fiNex+O0XOMEZSa8DA
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAuE+xCGBSEJ9SMZCGTawqCKupoAOukBR3I/i3hjwy5fc/9jm7
0jzCKW5Y0WJzAesSI3SVoTEg19wzskn25G46Fr/fe1b2V9qfCuckHWIavCF8Y48q
YKXoiMunTFyGtrr2waY1B6gU3eAqp1lLr0bmPtwQwL5iE/ZG4fhAKkxznPaoJJ/X
GE2OYuYuWequlijC0474shT4e8CTmYjrrdj+AkHpMWnAe9FUzfPxGKsPA8qs0i5C
yq5HCNp7snc7KK32DBvLV20fgMTiuOfurCXYDY7LqOqw5KlWXPmSjw/kfzRsMonE
ouDUKlWylXOoe2lrXF2OTB2YIYNy3rNDHXAC5QIDAQABAoIBAAQNIZW1TLOxIm5u
YC4rZPlWHdWjikeZx4+kTmADPG9gURXbHLhV93YCxxPp9dManp/l/P1maTPArM5t
s64l1R2KzKfQ2GJDrv/5AJerwFPKNnCxMcWFLnh5TFCQbrHSdMBhCqSqZDQ6hfCy
Dm8uuaEAMQpHjqJxMdgsOIU/Gah4z7OCSuzeJ731DOBnG0Qk38hE5MrdJLbywUOQ
c/NfENf16t6DfTkzvJu8CEEg6SLEazFOUssDQVoDgyOqmJRf1d0VXulfVvm50N8o
Fwgc79dfsdNMHI9IbcTfJD9xPzpwfhwcYAnKgdMXDzjU7a8ibYGdiUaQPlBmLdUh
jyEAo0ECgYEA8Rj5uAw9aJxgDrdUFqNfDWFtnj6KHA0eBQFYQmmZHW4OWcke3Xcj
V5GBw6Oy/nJWFIpQa4v1NMvufW6JsLVokhglEEkDAXABpSNSVZ92MZdBhZGh4DUx
T2aWalhgr53A8+6h8/VyozCmY34D5K6u4izemZ68NXu4tcIvE1rE0sECgYEAw7Qn
jyB8Q7empbm/Mmekjcg8KKfaleaM1rSsikUJk0nGR/QfQJ6gv3pn/yuiY2KKCu0G
/V3CoSYeg/7vQ+wn0lfQGPEQw+kU4YSH8WN8OGC4sxc7wtoITPZZkzcxGZY7S7sE
rObODdw//4qQ3EktQhXDzVvn6m2ee7rpIgV5zSUCgYEAm43tsJ3VESWzpEsMaf7G
WS+/NhZLrYWZFMmlVFQlgiN8BtoInAM+PkWXX87CsgC7IU2MTZdjgckB+tPS6rxg
18HUSAmTct39cbq0aKIV9DEPCUrJEou/YOdjrQGQgD5cPAZ/X5PBfyDoedDYWjeK
hktE5ADSlf9ZUYwUK3yo+QECgYAee5Et2gGBCroKVkRRtZMMAoRcUMjbUG3fg4Tc
hKRZLMSVsJCtoAepy4cnV8STdmXKDeFo1ZHbR/S42pyqF76cJNFlESdrXILEHcCO
+NAAeBBM1PGaCBwC4NxS8eXT9nKF+TthMxIlVokhZJPru/owsPMuqYIWIbztyM9H
XVL7gQKBgG9ff1FvX+vRLGN1ro3kHqD9BRmo0Tnt/tjz8l9cKJn/ELrabp1cblqI
yrMy2hQAIepvZbrurw4e9ZXKBqUUT+pL0Kf2/+alwn9elqZbDYSttw01xWwoKpRW
w+tYPoiydYbTinN6hXv5r99H3s1yk6bmkUyL+Y4UptBpRFf9nwd4
-----END RSA PRIVATE KEY-----
-86
View File
@@ -1,86 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFETCCA/mgAwIBAgISBeV2VmIadbH7M1xjYxFehqgpMA0GCSqGSIb3DQEBCwUA
MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
EwNSMTMwHhcNMjUxMjE4MDgwMDM3WhcNMjYwMzE4MDgwMDM2WjAlMSMwIQYDVQQD
ExptYXR0ZXJtb3N0Lmd5b3phbWFuY2F2ZS5mcjCCASIwDQYJKoZIhvcNAQEBBQAD
ggEPADCCAQoCggEBALsinN0ZSLZINdRF4onC5c3JzBd0f+4wL/J1G3UnxMI385qO
ltibSOS2R9zzoz4zvTnZCNKHDWjU6w1syUDWvAjkJYgGx9/1AMEXeFH4lu07Xgpk
Z0Opsj6v5uwVa0gWd3ZNW7v4PfyzV5H6K4p5pB3K4HVJyNX/CwHzSIKsmV/AtBSu
knk4CgR2EdzVUufX8w6jaSlJWALsU3A71IKyvkpfxhI7+DSRLljC9h7RvC/BCdZR
IqTK+6gQ9eBTn+J3Jyod/l+ogCVqaaw3gBUqaFUlQRq+EX4tKtKcCUmTTqaGh62o
cbwHqJsnJLbHVQ3shSj/DDja+nw9VTFRKyUuIe8CAwEAAaOCAiswggInMA4GA1Ud
DwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0T
AQH/BAIwADAdBgNVHQ4EFgQUBU6fkb0yHSv6+kgIMxrMQaNvCmowHwYDVR0jBBgw
FoAU56ufDywzoFPTXk94yLKEDjvWkjMwMwYIKwYBBQUHAQEEJzAlMCMGCCsGAQUF
BzAChhdodHRwOi8vcjEzLmkubGVuY3Iub3JnLzAlBgNVHREEHjAcghptYXR0ZXJt
b3N0Lmd5b3phbWFuY2F2ZS5mcjATBgNVHSAEDDAKMAgGBmeBDAECATAuBgNVHR8E
JzAlMCOgIaAfhh1odHRwOi8vcjEzLmMubGVuY3Iub3JnLzQyLmNybDCCAQUGCisG
AQQB1nkCBAIEgfYEgfMA8QB2AMs49xWJfIShRF9bwd37yW7ymlnNRwppBYWwyxTD
FFjnAAABmzCvNUcAAAQDAEcwRQIgGD5PSJfTld3h/t+L7wMhjrE8levLLzEEeHy8
8IyoTpsCIQC/fFdsAhJEfqFumLTfGlvrICXRoIIlkRdFQzBZYPPRbgB3AJaXZL9V
WJet90OHaDcIQnfp8DrV9qTzNm5GpD8PyqnGAAABmzCvNYkAAAQDAEgwRgIhALf2
GrLdKeb7kU0RYuA4mBFlHFyGXNsAuQbJLkH74e4UAiEAloOCGFdFEn9Fp+uYRw+6
APFH8LIH9hbYYkP0Ayo2W7IwDQYJKoZIhvcNAQELBQADggEBAAI5i39fx/wlYBTz
M2Iahjil/3MNWDDRip3PS2w4ldNQ74QgsDDdZdKVG5yCxiQrhFoMCfml5S4fXWb4
cyxNmTo6f4Ecf0oS7dDxTQt1ejWnRp4zdncvwvAWVuqjF1L1VgMhd7ZGXvTNHrG6
zPce2XJrIAjzu50uGzxp+qBkJRa5r5GxLp9Mzd2c6rx4t9KGVysE6Pj/LXFARr0+
dCr+HZlHfMF9UJlH5hRE3ALMQN4bVRJR1Gpprbh1cDZ1cA8wVd7IqnV2+8YVedI6
hUdGu6ml1On8JzcFUr2IFJahDZ9bYmI7EYarwTz5KlQYGbljCcMfCOFITZyZJvQa
AzSHouY=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFBTCCAu2gAwIBAgIQWgDyEtjUtIDzkkFX6imDBTANBgkqhkiG9w0BAQsFADBP
MQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy
Y2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yNDAzMTMwMDAwMDBa
Fw0yNzAzMTIyMzU5NTlaMDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBF
bmNyeXB0MQwwCgYDVQQDEwNSMTMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQClZ3CN0FaBZBUXYc25BtStGZCMJlA3mBZjklTb2cyEBZPs0+wIG6BgUUNI
fSvHSJaetC3ancgnO1ehn6vw1g7UDjDKb5ux0daknTI+WE41b0VYaHEX/D7YXYKg
L7JRbLAaXbhZzjVlyIuhrxA3/+OcXcJJFzT/jCuLjfC8cSyTDB0FxLrHzarJXnzR
yQH3nAP2/Apd9Np75tt2QnDr9E0i2gB3b9bJXxf92nUupVcM9upctuBzpWjPoXTi
dYJ+EJ/B9aLrAek4sQpEzNPCifVJNYIKNLMc6YjCR06CDgo28EdPivEpBHXazeGa
XP9enZiVuppD0EqiFwUBBDDTMrOPAgMBAAGjgfgwgfUwDgYDVR0PAQH/BAQDAgGG
MB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATASBgNVHRMBAf8ECDAGAQH/
AgEAMB0GA1UdDgQWBBTnq58PLDOgU9NeT3jIsoQOO9aSMzAfBgNVHSMEGDAWgBR5
tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAKG
Fmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0gBAwwCjAIBgZngQwBAgEwJwYD
VR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVuY3Iub3JnLzANBgkqhkiG9w0B
AQsFAAOCAgEAUTdYUqEimzW7TbrOypLqCfL7VOwYf/Q79OH5cHLCZeggfQhDconl
k7Kgh8b0vi+/XuWu7CN8n/UPeg1vo3G+taXirrytthQinAHGwc/UdbOygJa9zuBc
VyqoH3CXTXDInT+8a+c3aEVMJ2St+pSn4ed+WkDp8ijsijvEyFwE47hulW0Ltzjg
9fOV5Pmrg/zxWbRuL+k0DBDHEJennCsAen7c35Pmx7jpmJ/HtgRhcnz0yjSBvyIw
6L1QIupkCv2SBODT/xDD3gfQQyKv6roV4G2EhfEyAsWpmojxjCUCGiyg97FvDtm/
NK2LSc9lybKxB73I2+P2G3CaWpvvpAiHCVu30jW8GCxKdfhsXtnIy2imskQqVZ2m
0Pmxobb28Tucr7xBK7CtwvPrb79os7u2XP3O5f9b/H66GNyRrglRXlrYjI1oGYL/
f4I1n/Sgusda6WvA6C190kxjU15Y12mHU4+BxyR9cx2hhGS9fAjMZKJss28qxvz6
Axu4CaDmRNZpK/pQrXF17yXCXkmEWgvSOEZy6Z9pcbLIVEGckV/iVeq0AOo2pkg9
p4QRIy0tK2diRENLSF2KysFwbY6B26BFeFs3v1sYVRhFW9nLkOrQVporCS0KyZmf
wVD89qSTlnctLcZnIavjKsKUu1nA1iU0yYMdYepKR7lWbnwhdx3ewok=
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAuyKc3RlItkg11EXiicLlzcnMF3R/7jAv8nUbdSfEwjfzmo6W
2JtI5LZH3POjPjO9OdkI0ocNaNTrDWzJQNa8COQliAbH3/UAwRd4UfiW7TteCmRn
Q6myPq/m7BVrSBZ3dk1bu/g9/LNXkforinmkHcrgdUnI1f8LAfNIgqyZX8C0FK6S
eTgKBHYR3NVS59fzDqNpKUlYAuxTcDvUgrK+Sl/GEjv4NJEuWML2HtG8L8EJ1lEi
pMr7qBD14FOf4ncnKh3+X6iAJWpprDeAFSpoVSVBGr4Rfi0q0pwJSZNOpoaHrahx
vAeomycktsdVDeyFKP8MONr6fD1VMVErJS4h7wIDAQABAoIBADgSXfgt3EiqCF8L
dZ6bpGnt/lZE1RRUofk/N7P5743WYAq+kNpkZQoKyCufYRmBPUC5FFiomM8BhVCn
eQIRlZQAcHJ6vacQbWJuGuJM30REFqB8hyiSD1OTN1kj7dpSyQbMlSEUd9ZhEmsu
D5/VZOR8ZpcePaxJWE4ETITDHM3Al7XhlsMYjXUEINySCpEX7v4P3hIsYbSWq3xV
TIWGv1R7rCAL+DKbI2NnJKOfIC+snRwfh4E0GYCwvgSq8FZ9e7hDGsXQeC3kwHVj
8Aay6/3zT4eFBXOV8bn6GGYmxPpIUS/XH75B+aO810upAkdQWEILRvwfWXPoL4TV
XC13y+ECgYEA4qHsU1nA53ecVWw0uw+/KZoQomjTDXpyEHleJ8dKJoLhpvrUGIpx
Aes4zrvsMDCxPEtSZgYeyFdg/vZ7d4vBHMiyhdPfgPORSga1kF78VMml09QHeqgH
JA8irJA8CPJsesvQftnGhGtjL1N8Pkg+663nlI79MN0bIkWpSYnjp78CgYEA02Jy
MYD2TMgKy2JDIcG4Lzt2Nh+BkcP8HkrTE+6jkokZcd1Tjziciv0KL5bjxsFFUi5P
N3eiFn50qiyyWe/8Irx7nBkSpAm46yjEoFLKHZkJ8pqYv69zYbHqg96mRcFHJqCh
XrEO1ZsJmYZ8+xqx3jsZ2k5vrD8tAC6JAqtxkdECgYAzEoyAaByZzRG1CnKDqVPK
G0ceYoMVaX+lCMTYMAgcz6fsimAbu68l4I1nwV/DqGV4kfzaswxi15YrPv6p/Rui
0fOxRwL6O2mFhieKhm1U6jBtoT2iPZWGYcbNnp944LDjp2SwAYHEO7MZajX4jy1m
zUT/7I1QYrOHsK0qvmFIXwKBgFJSjaxvz/wZD/MjQoe7/PIQEzqCzKArFl3pwAiM
MJHZ6NnqWyd04apTX4snFXALRub5eApfAfYGq4K2w4K5LpWMmAszzImr66NRjjnt
5B7gwfoEcSZ9us66Tl2q8VBLNF17wzywcdmIdpWexb+5JroohCn70Avh0rG2bc9n
W2RxAoGAEZCqPSiJfrUEJBit9XVW/kaeKn4rC0s4/UhNyugfdxDfNGyeDvge9a+q
KzwrAyG4rwRMBTvcjnAQ1BW1Pb0ZCp6jqUIH6lDB/sr4n45sMeXAvue6pDK0+tB6
IMg5xLYCaO/dRG9JhOdN/ICr0ickaIQM7km2I28i/ZKWwtqOoZw=
-----END RSA PRIVATE KEY-----
-53
View File
@@ -1,53 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIDmzCCAyKgAwIBAgISBmRPC6KGb7rrw0FG5XAxnbieMAoGCCqGSM49BAMDMDIx
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF
NzAeFw0yNTA5MjExMjU0MDFaFw0yNTEyMjAxMjU0MDBaMCIxIDAeBgNVBAMTF21p
eHBvc3QuZ3lvemFtYW5jYXZlLmZyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE
SsfEQjkc4mQcl8T57zJSFoB9qUbda1vJqLYIAiRSxeoz4LlIhbEtz8XkHwH7szW6
H0HFJe6pC1k2TCufP4tjf6OCAiYwggIiMA4GA1UdDwEB/wQEAwIHgDAdBgNVHSUE
FjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQU
fyCFQih3NwcSgBk68SoZCnjFZ5swHwYDVR0jBBgwFoAUrkie3IcdRKBv2qLlYHQE
eMKcAIAwMgYIKwYBBQUHAQEEJjAkMCIGCCsGAQUFBzAChhZodHRwOi8vZTcuaS5s
ZW5jci5vcmcvMCIGA1UdEQQbMBmCF21peHBvc3QuZ3lvemFtYW5jYXZlLmZyMBMG
A1UdIAQMMAowCAYGZ4EMAQIBMC0GA1UdHwQmMCQwIqAgoB6GHGh0dHA6Ly9lNy5j
LmxlbmNyLm9yZy8zMS5jcmwwggEFBgorBgEEAdZ5AgQCBIH2BIHzAPEAdwCkQsUG
SWBhVI8P1Oqc+3otJkVNh6l/L99FWfYnTzqEVAAAAZlsjDJCAAAEAwBIMEYCIQDv
j7pnXllaqandpPIwijJ0wFjI0K4t/67Wr8ryovNzdAIhAOXvoGQKlB4TxfG9ERjr
e+7rKSdpCe2YK9Xhrq2r5JaEAHYA3dzKNJXX4RYF55Uy+sef+D0cUN/bADoUEnYK
LKy7yCoAAAGZbIw6RgAABAMARzBFAiEApmZDFJt4b3VyU7NoYxfwExWfoQVSOOHz
tVknfroOLD4CIFYEUxvAiW+evBoo7Dk34tKV8jABkSxFzVwFAZuXirIDMAoGCCqG
SM49BAMDA2cAMGQCMF2o0w47tze7uqEAWOtIkoDRZSszwmNbBU3gGl0YshbOV1yU
7lEd9IzK9coGl7xdoQIwCs3KThdJjkUftWp1Xrmeo0IM00yIZIsK/7TPveUQOoNu
CXmX+8UkgYUSVFlQ2mY4
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEVzCCAj+gAwIBAgIRAKp18eYrjwoiCWbTi7/UuqEwDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjQwMzEzMDAwMDAw
WhcNMjcwMzEyMjM1OTU5WjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg
RW5jcnlwdDELMAkGA1UEAxMCRTcwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARB6AST
CFh/vjcwDMCgQer+VtqEkz7JANurZxLP+U9TCeioL6sp5Z8VRvRbYk4P1INBmbef
QHJFHCxcSjKmwtvGBWpl/9ra8HW0QDsUaJW2qOJqceJ0ZVFT3hbUHifBM/2jgfgw
gfUwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcD
ATASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBSuSJ7chx1EoG/aouVgdAR4
wpwAgDAfBgNVHSMEGDAWgBR5tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcB
AQQmMCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0g
BAwwCjAIBgZngQwBAgEwJwYDVR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVu
Y3Iub3JnLzANBgkqhkiG9w0BAQsFAAOCAgEAjx66fDdLk5ywFn3CzA1w1qfylHUD
aEf0QZpXcJseddJGSfbUUOvbNR9N/QQ16K1lXl4VFyhmGXDT5Kdfcr0RvIIVrNxF
h4lqHtRRCP6RBRstqbZ2zURgqakn/Xip0iaQL0IdfHBZr396FgknniRYFckKORPG
yM3QKnd66gtMst8I5nkRQlAg/Jb+Gc3egIvuGKWboE1G89NTsN9LTDD3PLj0dUMr
OIuqVjLB8pEC6yk9enrlrqjXQgkLEYhXzq7dLafv5Vkig6Gl0nuuqjqfp0Q1bi1o
yVNAlXe6aUXw92CcghC9bNsKEO1+M52YY5+ofIXlS/SEQbvVYYBLZ5yeiglV6t3S
M6H+vTG0aP9YHzLn/KVOHzGQfXDP7qM5tkf+7diZe7o2fw6O7IvN6fsQXEQQj8TJ
UXJxv2/uJhcuy/tSDgXwHM8Uk34WNbRT7zGTGkQRX0gsbjAea/jYAoWv0ZvQRwpq
Pe79D/i7Cep8qWnA+7AE/3B3S/3dEEYmc0lpe1366A/6GEgk3ktr9PEoQrLChs6I
tu3wnNLB2euC8IKGLQFpGtOO/2/hiAKjyajaBP25w1jF0Wl8Bbqne3uZ2q1GyPFJ
YRmT7/OXpmOH/FVLtwS+8ng1cAmpCujPwteJZNcDG0sF2n/sc0+SQf49fdyUK0ty
+VUwFj9tmWxyR/M=
-----END CERTIFICATE-----
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIDZziRuoBQkofhTQAe5nBz34C5Tlwitw+buoh+ckpGhyoAoGCCqGSM49
AwEHoUQDQgAESsfEQjkc4mQcl8T57zJSFoB9qUbda1vJqLYIAiRSxeoz4LlIhbEt
z8XkHwH7szW6H0HFJe6pC1k2TCufP4tjfw==
-----END EC PRIVATE KEY-----
-85
View File
@@ -1,85 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFATCCA+mgAwIBAgISBglnyhlxLScBktHwUrhNzi5iMA0GCSqGSIb3DQEBCwUA
MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
EwNSMTMwHhcNMjUxMjE4MDgwMDQxWhcNMjYwMzE4MDgwMDQwWjAZMRcwFQYDVQQD
Ew5tcnRlZGR5YmVhci5mcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
AMNc+PjtWutOUhO92Nfq3o4yRIthcNKqzvnf4uZ9CLwD/xi939fY9o48JoaD5K9F
8/shIGEiLfaCcGBe5ezm2IPTEQFHX3I/UkO1qzXTkaxaPKuoV6Uo7ZNo7jOZP0ph
/EitFcWo3kc5bPs9d6PaiZ8XplcRwvfVUrKNctKpGdypFBeUccodIKHfQHrKEim0
1yHBRaR+XRiTN0t1rUee6r212yFvu+LNdYlun7tYRHVxi4mwE1sOt7rUd/tHwMf/
5PW3gYR7F6LxtSCTd6uB2E54BufpA41yJePaNXxBPaCv871zTgk7C/bOWO/hMBWB
eiM2tWgkDTmDIrkvYuilLFcCAwEAAaOCAicwggIjMA4GA1UdDwEB/wQEAwIFoDAd
BgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIwADAdBgNV
HQ4EFgQUcl7mIPwmShOgbJbCze50urqk/sIwHwYDVR0jBBgwFoAU56ufDywzoFPT
Xk94yLKEDjvWkjMwMwYIKwYBBQUHAQEEJzAlMCMGCCsGAQUFBzAChhdodHRwOi8v
cjEzLmkubGVuY3Iub3JnLzAZBgNVHREEEjAQgg5tcnRlZGR5YmVhci5mcjATBgNV
HSAEDDAKMAgGBmeBDAECATAuBgNVHR8EJzAlMCOgIaAfhh1odHRwOi8vcjEzLmMu
bGVuY3Iub3JnLzk5LmNybDCCAQ0GCisGAQQB1nkCBAIEgf4EgfsA+QB2AA5XlLzz
rqk+MxssmQez95Dfm8I9cTIl3SGpJaxhxU4hAAABmzCvRb4AAAQDAEcwRQIgSMg0
Ze+Ewc+3xEyi+r1R5S1sMhcFeWcTWPeulE4eMesCIQC1DgJ47fFKuV1zGnlk40m+
pAXGAw0/8rBUG7YvF69XOQB/AHF+lfPCOIptseOEST0x4VqpYgh2LUIA4AUM0Ge1
pmHiAAABmzCvRqQACAAABQAEeyciBAMASDBGAiEApYkxw2VjijbBmQMqudrfMVrP
2nGVrf8fQz9PtlnSz6wCIQDkEz/oDwR0sWcQavNIm6jRLm8cURR4UY1nCvAdFHGF
vjANBgkqhkiG9w0BAQsFAAOCAQEAVXuuKBtmWiTjh28Xhqt6iHBW2/ehgfLQVcsm
k5aS4K1PVp+V+qJyBcrC2GA8u4uTXmW6DFSD19wbgxacM087MONjbKX0H0e3fHDZ
qJTaI39yov9h4YiUsBamrcmDM0RrL9uTs/9hDbpkraoBBsXxMAiHNJSuYcIcCHDm
zdMPyLTrc1ilXQ+xL43DZsLzXlz6zP44XiPxm/1RHfmckehyvNmAUp5uEGFb3Hw/
F8PlyyXm5AZLEJCIHD21tlsMIm4Mc9yEsKAatFvXBBLaJx+rzbvIVM7r8Py2bJAT
71pX41FjGS6UmqmIxjih8eOsnC5busMcpTlBcxMbgy2KCBez1w==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFBTCCAu2gAwIBAgIQWgDyEtjUtIDzkkFX6imDBTANBgkqhkiG9w0BAQsFADBP
MQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy
Y2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yNDAzMTMwMDAwMDBa
Fw0yNzAzMTIyMzU5NTlaMDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBF
bmNyeXB0MQwwCgYDVQQDEwNSMTMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQClZ3CN0FaBZBUXYc25BtStGZCMJlA3mBZjklTb2cyEBZPs0+wIG6BgUUNI
fSvHSJaetC3ancgnO1ehn6vw1g7UDjDKb5ux0daknTI+WE41b0VYaHEX/D7YXYKg
L7JRbLAaXbhZzjVlyIuhrxA3/+OcXcJJFzT/jCuLjfC8cSyTDB0FxLrHzarJXnzR
yQH3nAP2/Apd9Np75tt2QnDr9E0i2gB3b9bJXxf92nUupVcM9upctuBzpWjPoXTi
dYJ+EJ/B9aLrAek4sQpEzNPCifVJNYIKNLMc6YjCR06CDgo28EdPivEpBHXazeGa
XP9enZiVuppD0EqiFwUBBDDTMrOPAgMBAAGjgfgwgfUwDgYDVR0PAQH/BAQDAgGG
MB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATASBgNVHRMBAf8ECDAGAQH/
AgEAMB0GA1UdDgQWBBTnq58PLDOgU9NeT3jIsoQOO9aSMzAfBgNVHSMEGDAWgBR5
tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAKG
Fmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0gBAwwCjAIBgZngQwBAgEwJwYD
VR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVuY3Iub3JnLzANBgkqhkiG9w0B
AQsFAAOCAgEAUTdYUqEimzW7TbrOypLqCfL7VOwYf/Q79OH5cHLCZeggfQhDconl
k7Kgh8b0vi+/XuWu7CN8n/UPeg1vo3G+taXirrytthQinAHGwc/UdbOygJa9zuBc
VyqoH3CXTXDInT+8a+c3aEVMJ2St+pSn4ed+WkDp8ijsijvEyFwE47hulW0Ltzjg
9fOV5Pmrg/zxWbRuL+k0DBDHEJennCsAen7c35Pmx7jpmJ/HtgRhcnz0yjSBvyIw
6L1QIupkCv2SBODT/xDD3gfQQyKv6roV4G2EhfEyAsWpmojxjCUCGiyg97FvDtm/
NK2LSc9lybKxB73I2+P2G3CaWpvvpAiHCVu30jW8GCxKdfhsXtnIy2imskQqVZ2m
0Pmxobb28Tucr7xBK7CtwvPrb79os7u2XP3O5f9b/H66GNyRrglRXlrYjI1oGYL/
f4I1n/Sgusda6WvA6C190kxjU15Y12mHU4+BxyR9cx2hhGS9fAjMZKJss28qxvz6
Axu4CaDmRNZpK/pQrXF17yXCXkmEWgvSOEZy6Z9pcbLIVEGckV/iVeq0AOo2pkg9
p4QRIy0tK2diRENLSF2KysFwbY6B26BFeFs3v1sYVRhFW9nLkOrQVporCS0KyZmf
wVD89qSTlnctLcZnIavjKsKUu1nA1iU0yYMdYepKR7lWbnwhdx3ewok=
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAw1z4+O1a605SE73Y1+rejjJEi2Fw0qrO+d/i5n0IvAP/GL3f
19j2jjwmhoPkr0Xz+yEgYSIt9oJwYF7l7ObYg9MRAUdfcj9SQ7WrNdORrFo8q6hX
pSjtk2juM5k/SmH8SK0VxajeRzls+z13o9qJnxemVxHC99VSso1y0qkZ3KkUF5Rx
yh0god9AesoSKbTXIcFFpH5dGJM3S3WtR57qvbXbIW+74s11iW6fu1hEdXGLibAT
Ww63utR3+0fAx//k9beBhHsXovG1IJN3q4HYTngG5+kDjXIl49o1fEE9oK/zvXNO
CTsL9s5Y7+EwFYF6Iza1aCQNOYMiuS9i6KUsVwIDAQABAoIBABQ+YxIwTjaJ1Bl1
l62wCcXEUbP7sdwylOXxnCp0FF6fL2TZ8AMG2W2dsARKUH0VC5YfNaK7DvY3R/vE
eaDVvuPSEDYItkw5YYXgolAejz7Dzvueow5bMlsPCXfRTmyfwKurO9FSkU3iFnfm
Q6p378DLi5IEJibWNQ6Jd7d6jFKACEMvYoqmTmtJonBkPpXOFhl4aHHsdgouE3yM
sGk+i+zC4+E9pvT8OFG+flXukXGB5Vs9/4fbUATUGuWT1xM76GuNfd4BPpxm5wxb
dy6mbkXkrvBniPMA4SNvXxRYK5fxXhqNewX6qL7eaMezqO90+nQeRPAEMNN9bOu7
0mIB3qECgYEA7kVL0jvoW26FMgc5eR98ZPd+kO4oL9TswEVHB/FWyVCMNWzDDwvm
iKIK847qQG5H7KUczMLFyj/PsGfy2n2X6TqCFZjGBaNGqNA7yobpe9Ze4bAQOJlU
hQcHSKnz18CCrpaEXrYUmz6IrSo70Rd/a/Q4YIayMW8VtQomjPph5ucCgYEA0eZa
DK/WaYlzGPfHrIcCgVYB8huraTdIAkpx3Gov9d/09eHaZOPAArtUI25Ak6aIUg+v
7xsPvv6wf+NL+n5QxmkSAh/WhaDqlpOTEP9wyEUr2XGn9j9AkW7EbhhVd6oVSwkr
HXx6XTXpBm3VTC1SKjBSxUg9UKAo4UGvc6lEkRECgYAoK6Sp0BHPgGWSVqd45TcK
qrM66fv6fHJhxAxCqYyRKjRJOYn1OnNma7Ne9qRFspILspaVauz/uRxhyFSoQ25e
EtAlpfkUsD9UbK736SDqEO00LYO+lxMpzlKLDKQgpsMhfhzY/uegeL2APFOTX9vK
roTmuS7HqMvHFuwC7p+c1wKBgQCE69kOu7OONcq7fv3llcHSYcLtrPQJt0ZUnQwp
xt0EWYToyNPinA+WK0cHAOTIG+er/98sDfkUvHjNJAWTZbaFTzhmO/8/tD2aiW3S
j9C+In+4Pa9d04RyFLEz/xjwpLbDQ9UX4SIkMOWWeqteiDzGFr/zyuF5U1NQAqa3
GfQf4QKBgDu55IGR5VFvO0irfBwE0RKQn2kt5G4CPBdUBgxws5hC9L4BoSHYq3OW
lfck/7iTvVt4lb2h8w2MRZCw5zieAN9zdMA3qr3CwW5bOPt/XXmNYP5LeWFDVqyu
g4POJV6ajI4TcRyXdfL9gIu6qAFaibsDEXkURndXtjYsrU0KtWI8
-----END RSA PRIVATE KEY-----
-85
View File
@@ -1,85 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFBzCCA++gAwIBAgISBr5Nye5GuxS4aGkFjfci6Z67MA0GCSqGSIb3DQEBCwUA
MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
EwNSMTMwHhcNMjUxMjE4MDgwMDQ2WhcNMjYwMzE4MDgwMDQ1WjAgMR4wHAYDVQQD
ExVtdXNpYy5neW96YW1hbmNhdmUuZnIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
ggEKAoIBAQDRH3pl4MkYEfx3DVLTHWKnu1osXCJthiEwRIYt+7X7aL1qv4UouS3F
wBZhhlxTL++z7h5EAb2czgsWHDcf16DljKID/7yI8PsxqCoNgAWH7+vhUCpj/jxf
E+jL3NkUnmAenSBU72c7OCEOTkD1VTO9iouV3tVZzqEn29T2eg+X3/bXt2ExE9KT
oR7pwacgPNocO+KkoLgJy1a1L8xbJh/hVOyZGpT/c6ByAaCPqkJ/on1sBMmSf338
LFdXUcq0EPKgP8eFCuZs1fthnHqRp3bZ7y9maAsc/6DLa6DcX9Iy4oQNo+vZve7O
EeH8YNfqAMtyfOmHZxXQvagvyeK86YK/AgMBAAGjggImMIICIjAOBgNVHQ8BAf8E
BAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQC
MAAwHQYDVR0OBBYEFCQsPGoB/5hKIgw1pd+eYiUS8aX7MB8GA1UdIwQYMBaAFOer
nw8sM6BT015PeMiyhA471pIzMDMGCCsGAQUFBwEBBCcwJTAjBggrBgEFBQcwAoYX
aHR0cDovL3IxMy5pLmxlbmNyLm9yZy8wIAYDVR0RBBkwF4IVbXVzaWMuZ3lvemFt
YW5jYXZlLmZyMBMGA1UdIAQMMAowCAYGZ4EMAQIBMC4GA1UdHwQnMCUwI6AhoB+G
HWh0dHA6Ly9yMTMuYy5sZW5jci5vcmcvNjAuY3JsMIIBBQYKKwYBBAHWeQIEAgSB
9gSB8wDxAHcAZBHEbKQS7KeJHKICLgC8q08oB9QeNSer6v7VA8l9zfAAAAGbMK9X
cgAABAMASDBGAiEArRkvrqWJvhcrGC5Oy46j/tNusfx9NghLC++jr5FhFrMCIQC0
PD/ulZHTFIs0udM1DHrM6sMhiyuSlekH4coTH7ewugB2AMs49xWJfIShRF9bwd37
yW7ymlnNRwppBYWwyxTDFFjnAAABmzCvV5MAAAQDAEcwRQIgXs5VZ4tBBvX+Sj2c
jH6t6rrJPpVR5JEDPtYLSFsziZICIQD1+9DuKucLSQNAClMq3kn5y2e7i2WB7AnK
bQ508JAMOTANBgkqhkiG9w0BAQsFAAOCAQEAkUnWNAhLYDIXGUJweCSwsHcSgsS1
LkutOrTK18jpO3Je+MMO/FxfhvK8BS2++QTOtmY6GfeJ+d3bBJtoCa34XWbeLddo
QsDpjUqQJprj3Nz8xpLtXXXolnfyBns0JnCZJAQOZapS0Z6G0N97gKCiu0qw/Lem
2KVIRSvv7GBxewkUXgfuDyjK+IzlxamQP3If6ah5gsBG2Ey7kW+k4VV5wDfwOt4H
0kCJOdnCle6yd8P9KLAowOc0JmLJo5qiluITVR02KpjUGZjNwjNAFUYkxCXKP9N6
fQtCMOhCNuOXu/6cV2/sCBT8MtUprieIoo8LBgOC+BhTp0Lpi/e7HbBi8Q==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFBTCCAu2gAwIBAgIQWgDyEtjUtIDzkkFX6imDBTANBgkqhkiG9w0BAQsFADBP
MQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy
Y2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yNDAzMTMwMDAwMDBa
Fw0yNzAzMTIyMzU5NTlaMDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBF
bmNyeXB0MQwwCgYDVQQDEwNSMTMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQClZ3CN0FaBZBUXYc25BtStGZCMJlA3mBZjklTb2cyEBZPs0+wIG6BgUUNI
fSvHSJaetC3ancgnO1ehn6vw1g7UDjDKb5ux0daknTI+WE41b0VYaHEX/D7YXYKg
L7JRbLAaXbhZzjVlyIuhrxA3/+OcXcJJFzT/jCuLjfC8cSyTDB0FxLrHzarJXnzR
yQH3nAP2/Apd9Np75tt2QnDr9E0i2gB3b9bJXxf92nUupVcM9upctuBzpWjPoXTi
dYJ+EJ/B9aLrAek4sQpEzNPCifVJNYIKNLMc6YjCR06CDgo28EdPivEpBHXazeGa
XP9enZiVuppD0EqiFwUBBDDTMrOPAgMBAAGjgfgwgfUwDgYDVR0PAQH/BAQDAgGG
MB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATASBgNVHRMBAf8ECDAGAQH/
AgEAMB0GA1UdDgQWBBTnq58PLDOgU9NeT3jIsoQOO9aSMzAfBgNVHSMEGDAWgBR5
tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAKG
Fmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0gBAwwCjAIBgZngQwBAgEwJwYD
VR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVuY3Iub3JnLzANBgkqhkiG9w0B
AQsFAAOCAgEAUTdYUqEimzW7TbrOypLqCfL7VOwYf/Q79OH5cHLCZeggfQhDconl
k7Kgh8b0vi+/XuWu7CN8n/UPeg1vo3G+taXirrytthQinAHGwc/UdbOygJa9zuBc
VyqoH3CXTXDInT+8a+c3aEVMJ2St+pSn4ed+WkDp8ijsijvEyFwE47hulW0Ltzjg
9fOV5Pmrg/zxWbRuL+k0DBDHEJennCsAen7c35Pmx7jpmJ/HtgRhcnz0yjSBvyIw
6L1QIupkCv2SBODT/xDD3gfQQyKv6roV4G2EhfEyAsWpmojxjCUCGiyg97FvDtm/
NK2LSc9lybKxB73I2+P2G3CaWpvvpAiHCVu30jW8GCxKdfhsXtnIy2imskQqVZ2m
0Pmxobb28Tucr7xBK7CtwvPrb79os7u2XP3O5f9b/H66GNyRrglRXlrYjI1oGYL/
f4I1n/Sgusda6WvA6C190kxjU15Y12mHU4+BxyR9cx2hhGS9fAjMZKJss28qxvz6
Axu4CaDmRNZpK/pQrXF17yXCXkmEWgvSOEZy6Z9pcbLIVEGckV/iVeq0AOo2pkg9
p4QRIy0tK2diRENLSF2KysFwbY6B26BFeFs3v1sYVRhFW9nLkOrQVporCS0KyZmf
wVD89qSTlnctLcZnIavjKsKUu1nA1iU0yYMdYepKR7lWbnwhdx3ewok=
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA0R96ZeDJGBH8dw1S0x1ip7taLFwibYYhMESGLfu1+2i9ar+F
KLktxcAWYYZcUy/vs+4eRAG9nM4LFhw3H9eg5YyiA/+8iPD7MagqDYAFh+/r4VAq
Y/48XxPoy9zZFJ5gHp0gVO9nOzghDk5A9VUzvYqLld7VWc6hJ9vU9noPl9/217dh
MRPSk6Ee6cGnIDzaHDvipKC4CctWtS/MWyYf4VTsmRqU/3OgcgGgj6pCf6J9bATJ
kn99/CxXV1HKtBDyoD/HhQrmbNX7YZx6kad22e8vZmgLHP+gy2ug3F/SMuKEDaPr
2b3uzhHh/GDX6gDLcnzph2cV0L2oL8nivOmCvwIDAQABAoIBAD1n7Nz1gJcc0PF0
bBmpy0pNbVERTNq0RBKUTII8I1fLjbNGwacPmS00Fl5Uwc97h/thtGlryW294ut/
JYCoJIrDHN/nvEjJ2jjelFqaeQVNognrLEdoY/nXMsiJ9QRk7PyQTuoh0kJFXQ+C
Uvi3KBZEFHDRmfxg/Flj58joVqPVjBBjpeimNKAN0A86SvLwyMZLdWiMu7NTiXvL
0digWgR55lPQJtZ1bMZLsk+mYl/WDNPfapFtlnjdbSj5RCqkznVC8h5ao0Acf0TN
Az24j6Xl2eGumc12FUTfDfGcem9N0/dhtN5ON8GfhV/NvoE+F7zErw99L3YLHh3Y
smeUv6ECgYEA7D+Pc+ol+vnAH8Dt4AqOf9LQrHO89v2p5lonb0vATqiU5HzjBXj5
daXcbgecRUkEOi/R5Hon1lDxOh6NWjl1NcaIMrWQVaDHEh59acEyDvdnnVFp28mb
zr990VFSRoXIMeEChngxODMDLCH+vL0++ke6oOFbgwINnxUbT++j9o0CgYEA4pta
O/kGrMoAtY3lyZG4adY2iU6bOUBJtYoN4CrFuOSfv49wnwc+yyCIRNhJxZPyAi9s
waUjPjl3YC7Wdn42ulJvYbXSIVX8S6H+VxH253P9VJNqsJNMXwR5nOCICaFkj4LP
hudxEbSpaMI8qvcqT6poTjvHXtSBr7I+Zoa5gXsCgYEA5S3jo7cJkSam0ib+m9Ch
3C5OcHz2W0RIhUX/61+49pVjmyPrt2tb1F1KMRMA7dWfXDL3koVOEAIFgTQSO+xx
X/FwPoETu310oIcjcmwQe6RVx68q2iQCGdZ534zcG728L2bwZDJEzRfvg+iWjdGo
PnNHALqdY8GiJSj8jdcTYCECgYEAnwpBbk38rVCo5sNMPwgS0dUSOZP9xVSlZtAZ
pPbgBkAPDjbx5+sB2zZd7VOPkyeedoIqZk4sSgOzEMJOqqMybdplacJeVB8xDzQG
eb2V+COj7LP58SuwMg/F+qBrWbb4CPDaDehppu+Q5oFMawFFpNwIkL/L0XZ7/n+u
4+4yS/kCgYANx3HYHS27Kwy9TpUXM+isVHv/VoH1LMA+qd8VjdxL1RTpQlurUGVt
bxIWxn9qyRuT5Ys0bsedUJFZepZ6UIcNvTCpg/09Nq1hagPTjo6fQ8re1sRbNLId
0Xdk8Vrkf0g4TQ4+UDVgm2A+GTklHkjxAoDwCWAinIXUVXKZkvwdxw==
-----END RSA PRIVATE KEY-----
-85
View File
@@ -1,85 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFAzCCA+ugAwIBAgISBZFlqLLV8kL89bfKTaNkdVWvMA0GCSqGSIb3DQEBCwUA
MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
EwNSMTIwHhcNMjUxMjE4MDgwMDUwWhcNMjYwMzE4MDgwMDQ5WjAeMRwwGgYDVQQD
ExNuOG4uZ3lvemFtYW5jYXZlLmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEAsJWM9MDKLrx0Qih1XprBNQmobqaPoP/LJ90lsQRcx8t1NjGcPE9/pr7o
u/2US5SdF0cyKuWO4DPokUltS2Vlo0iai6KhCtMSflAiacCd1uDsTN2oFzSSiikd
reL6tcLuCIFg0a5tV5PUi4by/jpPqtFcBT/tcKiZVPhrVr+C+RUMULNkBcEQTXyP
+ixABxLyq8xG6z5edn/igzzLGRd8c5Y7eq6yJowxq+P8QBAOugRmI1D2uwO0pYVT
tLRY15HXXqJGB9lABSSnrWFIgPEuygS46uWxjHMOXslQJUI66bJDpTjAFYwDdHSV
8IdApz2P0FBO+nyh5KCTpDWmt7dTkwIDAQABo4ICJDCCAiAwDgYDVR0PAQH/BAQD
AgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMBAf8EAjAA
MB0GA1UdDgQWBBRX8hFz6PFmRbY6mO+FWTH0AbnOHjAfBgNVHSMEGDAWgBQAtSny
LY5vMeibTK14Pvrc6QzR0jAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAKGF2h0
dHA6Ly9yMTIuaS5sZW5jci5vcmcvMB4GA1UdEQQXMBWCE244bi5neW96YW1hbmNh
dmUuZnIwEwYDVR0gBAwwCjAIBgZngQwBAgEwLgYDVR0fBCcwJTAjoCGgH4YdaHR0
cDovL3IxMi5jLmxlbmNyLm9yZy80OC5jcmwwggEFBgorBgEEAdZ5AgQCBIH2BIHz
APEAdwBJnJtp3h187Pw23s2HZKa4W68Kh4AZ0VVS++nrKd34wwAAAZswr2hQAAAE
AwBIMEYCIQCLTWZf7e64uLNNRk2m15TzK6aXlSdvf3HksU5IJ94rQwIhAOKo5Ir2
uuZFfnb2DxnUk2dMDYVCBbCYiovRXa5YEx8VAHYAyzj3FYl8hKFEX1vB3fvJbvKa
Wc1HCmkFhbDLFMMUWOcAAAGbMK9oaQAABAMARzBFAiEAgzlEh3CUKmHLkvCZ02aC
We+WP5PFD5M90Q8CMeZevHkCIAXKwZyoL35XJvokK2zAHO0QY2q19Sq8Zuy0UJW2
EDfWMA0GCSqGSIb3DQEBCwUAA4IBAQChYiKo7Op69ArbjmQ5fk1+J0MIKNNIPtcn
PO2eEGzPus6VSS3nYy5su5yEOcqHVFhz8YqdWRyTF2ahMxs27czKfQZcKdt5DQll
ji8HW3XCaxGTfddoXaN9Kh03y9lP39q6xaHxjCW7XwHiDO1NbztVxT9rI7PXQDCd
wRHFeN0lmDXyvYiKs8UpZuzyA3jN3jcJJENAodgCh58xpT60yzbQmUZU7o9/bmi1
QZ6kJJ6zu+Z1gPL/jZ2TtNNfyjJSREpSENAyHNemXvwyuthStu9taTRNOI522wZV
PBBpyNad0j7MsmcFVBvzrNf43mKSlsnlxGZxQDsqTk/JOW3NTMYM
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFBjCCAu6gAwIBAgIRAMISMktwqbSRcdxA9+KFJjwwDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjQwMzEzMDAwMDAw
WhcNMjcwMzEyMjM1OTU5WjAzMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg
RW5jcnlwdDEMMAoGA1UEAxMDUjEyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEA2pgodK2+lP474B7i5Ut1qywSf+2nAzJ+Npfs6DGPpRONC5kuHs0BUT1M
5ShuCVUxqqUiXXL0LQfCTUA83wEjuXg39RplMjTmhnGdBO+ECFu9AhqZ66YBAJpz
kG2Pogeg0JfT2kVhgTU9FPnEwF9q3AuWGrCf4yrqvSrWmMebcas7dA8827JgvlpL
Thjp2ypzXIlhZZ7+7Tymy05v5J75AEaz/xlNKmOzjmbGGIVwx1Blbzt05UiDDwhY
XS0jnV6j/ujbAKHS9OMZTfLuevYnnuXNnC2i8n+cF63vEzc50bTILEHWhsDp7CH4
WRt/uTp8n1wBnWIEwii9Cq08yhDsGwIDAQABo4H4MIH1MA4GA1UdDwEB/wQEAwIB
hjAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwEgYDVR0TAQH/BAgwBgEB
/wIBADAdBgNVHQ4EFgQUALUp8i2ObzHom0yteD763OkM0dIwHwYDVR0jBBgwFoAU
ebRZ5nu25eQBc4AIiMgaWPbpm24wMgYIKwYBBQUHAQEEJjAkMCIGCCsGAQUFBzAC
hhZodHRwOi8veDEuaS5sZW5jci5vcmcvMBMGA1UdIAQMMAowCAYGZ4EMAQIBMCcG
A1UdHwQgMB4wHKAaoBiGFmh0dHA6Ly94MS5jLmxlbmNyLm9yZy8wDQYJKoZIhvcN
AQELBQADggIBAI910AnPanZIZTKS3rVEyIV29BWEjAK/duuz8eL5boSoVpHhkkv3
4eoAeEiPdZLj5EZ7G2ArIK+gzhTlRQ1q4FKGpPPaFBSpqV/xbUb5UlAXQOnkHn3m
FVj+qYv87/WeY+Bm4sN3Ox8BhyaU7UAQ3LeZ7N1X01xxQe4wIAAE3JVLUCiHmZL+
qoCUtgYIFPgcg350QMUIWgxPXNGEncT921ne7nluI02V8pLUmClqXOsCwULw+PVO
ZCB7qOMxxMBoCUeL2Ll4oMpOSr5pJCpLN3tRA2s6P1KLs9TSrVhOk+7LX28NMUlI
usQ/nxLJID0RhAeFtPjyOCOscQBA53+NRjSCak7P4A5jX7ppmkcJECL+S0i3kXVU
y5Me5BbrU8973jZNv/ax6+ZK6TM8jWmimL6of6OrX7ZU6E2WqazzsFrLG3o2kySb
zlhSgJ81Cl4tv3SbYiYXnJExKQvzf83DYotox3f0fwv7xln1A2ZLplCb0O+l/AK0
YE0DS2FPxSAHi0iwMfW2nNHJrXcY3LLHD77gRgje4Eveubi2xxa+Nmk/hmhLdIET
iVDFanoCrMVIpQ59XWHkzdFmoHXHBV7oibVjGSO7ULSQ7MJ1Nz51phuDJSgAIU7A
0zrLnOrAj/dfrlEWRhCvAgbuwLZX1A2sjNjXoPOHbsPiy+lO1KF8/XY7
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAsJWM9MDKLrx0Qih1XprBNQmobqaPoP/LJ90lsQRcx8t1NjGc
PE9/pr7ou/2US5SdF0cyKuWO4DPokUltS2Vlo0iai6KhCtMSflAiacCd1uDsTN2o
FzSSiikdreL6tcLuCIFg0a5tV5PUi4by/jpPqtFcBT/tcKiZVPhrVr+C+RUMULNk
BcEQTXyP+ixABxLyq8xG6z5edn/igzzLGRd8c5Y7eq6yJowxq+P8QBAOugRmI1D2
uwO0pYVTtLRY15HXXqJGB9lABSSnrWFIgPEuygS46uWxjHMOXslQJUI66bJDpTjA
FYwDdHSV8IdApz2P0FBO+nyh5KCTpDWmt7dTkwIDAQABAoIBAB8e3C6uY3OFJwAZ
3UWFBJPyVcrac+mt6wHliaT+3dMgWlHowF4orJiYgK/Q6ve/A0h89ax1tI5y14Pz
at2kyxrRytrdGICt3k6AlPAKUEb0cPDDB8K/MyxCPsbMf97Usdqx4nxRv1d16DmG
2QBRCoVSTGNodtIqBIvjFBe/vLdk4Uo/IycszW0lfYPQRO6zFYv628CU7JI0FWoa
Bo/LPWBLw6+EidFBSW16dx8QjLJT4ThA2tDhljju+ifv/T0eJ4wHKVISVYGsrZov
8RrRiQc2FCp3ZJpdkMx2Ubj8d31NyUC60wXJNiCv/6/eHbQqTejGOz1ovjMT9OxZ
Kvii4IECgYEA1wpMlqGdUpqR0zddUpXJIrbg7Kkn4vmokzyR0uBVnhxGJ4cVKaqI
VPeJZ7bTFfOm01fmdbEfkFezgwynodozuv2bJpUMqoLA4SAovDYNP1R6SVauAN0G
wZUrJ9Qw3bytv7gG6hl+XR1zwL592Ny+HhQe99nB/4tX+33GumvP+vMCgYEA0jgS
5puB7UPaO3f8WSP6aeNEdbXQ3DueWvmMPCNDGyBdJ8hUZQabfxvopDHUI5PF+m7P
o58BSSyXMB7v1J8Mh99wPclWR313EyILIGD/EXFkxR8y4QJb31axNwFFe/1V73UP
tUGZr99x8724x80oSrOiVaxG8bOfY/fXa+yOLOECgYBEdzD/XKF8ZV48g4og+zO4
68UdVJYwfBCiIEzFeUuJNbNYbnfcdkFF3DJRZTI78QGSlI/5tNU53dJ3zRWqQJDr
3kcBt776ovrKMrUFh6gcG8d7hi+MctLt25KL8dFFKAeh3PPGoStMdk4edggXfeDC
LuHVQ+2ycSkoF1mojR8A5QKBgQCTK3CIA4x1R9BrW7fNzDNOmC3gXnYnCJH3TMdR
frpHLmQpKsVyqKqJ1UcMVFoYwiaTCarR+MpUqSP7K11ptCN4qAOTLfX6PKr1ORsj
AuTvGDydCBd9kUIyXCXaxUgY4qWb648grRlkGAFVy5emQUmY6qOWaPKN2duXh/ZH
dyed4QKBgBa7WHA1b9PS/1Yee6tFtNXo9eND3pqr/EUbBbpGtHvoTjVTpNLaRTg3
WErBo3RAFY0ewnFf64yUfEXn8Be9Nee/kd9zueGasBy8q9lTeLWHpmfF3QBRjw4d
CIRTmpfD8jVrkGkC/2nHl4/XsEWnR3xU4zxSzo/xOBcn+fy30LjL
-----END RSA PRIVATE KEY-----
-86
View File
@@ -1,86 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFFTCCA/2gAwIBAgISBl4Zv5KpCW3fXoiaYEmV+l25MA0GCSqGSIb3DQEBCwUA
MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
EwNSMTMwHhcNMjUxMjE4MDgwMDU0WhcNMjYwMzE4MDgwMDUzWjAkMSIwIAYDVQQD
ExluZXh0Y2xvdWQuZ3lvemFtYW5jYXZlLmZyMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEAvhIVrARcKIV2NlLJ7sb8bniyuQz3P3yy9vctQ+efBM2Mwi4Q
DVRi7UwhsbXp8WuudHwjTaINhrnkOSumq+jV7MmT6Hdg62Twl1K0Ujj/oqsuda5I
RwPW5Uzvxk14Muy8qp57dm8Z+7Ak9VOihKraGxXnfSy6+W2UHZd+RdLDpdnvK9vo
onW5o/vcqb/XvAqzpL07bnjB8ZzkfekwD5YIfeqh135ckoDwslzJz4eypJind0WR
CpESnpi23QcfiFLjYWfq3TlNit3R9f80cjtWUr6hmS3pQ3m1FrxxQfQMod1X5nbR
0V2SotOC37/RIHIWqodL9ZY5Ose970tvc/Vq2wIDAQABo4ICMDCCAiwwDgYDVR0P
AQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMB
Af8EAjAAMB0GA1UdDgQWBBSShwO3Esa0LiavwOdo4QfpbneHaTAfBgNVHSMEGDAW
gBTnq58PLDOgU9NeT3jIsoQOO9aSMzAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUH
MAKGF2h0dHA6Ly9yMTMuaS5sZW5jci5vcmcvMCQGA1UdEQQdMBuCGW5leHRjbG91
ZC5neW96YW1hbmNhdmUuZnIwEwYDVR0gBAwwCjAIBgZngQwBAgEwLgYDVR0fBCcw
JTAjoCGgH4YdaHR0cDovL3IxMy5jLmxlbmNyLm9yZy81OC5jcmwwggELBgorBgEE
AdZ5AgQCBIH8BIH5APcAfgAai51pSleYyJmgyoi99I/AtFZgzMNgDR9x9Gn/x9Gs
owAAAZswr3mqAAgAAAUAJl9HdAQDAEcwRQIgdNs/tZWBjTuKprUvzmwh2zOAqJzY
DqF/rpX+Ww4ne08CIQDMkSjdUQfBRXYqT/JiJL5fSmhhff/tonIlg+RwbTancQB1
AGQRxGykEuyniRyiAi4AvKtPKAfUHjUnq+r+1QPJfc3wAAABmzCvgK0AAAQDAEYw
RAIgMhF3ECu6NOMw6WH1YZJutj64MVfH9m5tTDBeR6W9/hACIFfHcZdUDw1y3328
rx291s56EUCzmoB9R4rt/jVddkudMA0GCSqGSIb3DQEBCwUAA4IBAQAeCaYSTDEG
nOfYg2ZVajMTaTX1g0lUrOrBWL2JOCpv7bdZJtaTSP4z54OiW00F9MuTwHw8tnEc
dpnwC1E5e14Y3diBMV6D8vgayH/KOV3A/Yt8Zg/hr4wkg7qMVA86eUKXfz+63f8y
bsu1neYYPY5tF+3BxM4IbV+F3YdjCXff+tIkKXRZYI2Vb8MZSBQWNNgZUebmn4ri
TWff58Zi6r3VqqmPLCPwZluLphmguKKwEtKbd4HZd6BRQudCgc3rkGDmj8Ex9Wr6
7qLu/H2dZgp7btmRsuMghEGlA/f+nAEQNinJSPJzg3hkQKmZmcUHXRhWdhCsjSZ0
O1w9RT6GYQCz
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFBTCCAu2gAwIBAgIQWgDyEtjUtIDzkkFX6imDBTANBgkqhkiG9w0BAQsFADBP
MQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy
Y2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yNDAzMTMwMDAwMDBa
Fw0yNzAzMTIyMzU5NTlaMDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBF
bmNyeXB0MQwwCgYDVQQDEwNSMTMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQClZ3CN0FaBZBUXYc25BtStGZCMJlA3mBZjklTb2cyEBZPs0+wIG6BgUUNI
fSvHSJaetC3ancgnO1ehn6vw1g7UDjDKb5ux0daknTI+WE41b0VYaHEX/D7YXYKg
L7JRbLAaXbhZzjVlyIuhrxA3/+OcXcJJFzT/jCuLjfC8cSyTDB0FxLrHzarJXnzR
yQH3nAP2/Apd9Np75tt2QnDr9E0i2gB3b9bJXxf92nUupVcM9upctuBzpWjPoXTi
dYJ+EJ/B9aLrAek4sQpEzNPCifVJNYIKNLMc6YjCR06CDgo28EdPivEpBHXazeGa
XP9enZiVuppD0EqiFwUBBDDTMrOPAgMBAAGjgfgwgfUwDgYDVR0PAQH/BAQDAgGG
MB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATASBgNVHRMBAf8ECDAGAQH/
AgEAMB0GA1UdDgQWBBTnq58PLDOgU9NeT3jIsoQOO9aSMzAfBgNVHSMEGDAWgBR5
tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAKG
Fmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0gBAwwCjAIBgZngQwBAgEwJwYD
VR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVuY3Iub3JnLzANBgkqhkiG9w0B
AQsFAAOCAgEAUTdYUqEimzW7TbrOypLqCfL7VOwYf/Q79OH5cHLCZeggfQhDconl
k7Kgh8b0vi+/XuWu7CN8n/UPeg1vo3G+taXirrytthQinAHGwc/UdbOygJa9zuBc
VyqoH3CXTXDInT+8a+c3aEVMJ2St+pSn4ed+WkDp8ijsijvEyFwE47hulW0Ltzjg
9fOV5Pmrg/zxWbRuL+k0DBDHEJennCsAen7c35Pmx7jpmJ/HtgRhcnz0yjSBvyIw
6L1QIupkCv2SBODT/xDD3gfQQyKv6roV4G2EhfEyAsWpmojxjCUCGiyg97FvDtm/
NK2LSc9lybKxB73I2+P2G3CaWpvvpAiHCVu30jW8GCxKdfhsXtnIy2imskQqVZ2m
0Pmxobb28Tucr7xBK7CtwvPrb79os7u2XP3O5f9b/H66GNyRrglRXlrYjI1oGYL/
f4I1n/Sgusda6WvA6C190kxjU15Y12mHU4+BxyR9cx2hhGS9fAjMZKJss28qxvz6
Axu4CaDmRNZpK/pQrXF17yXCXkmEWgvSOEZy6Z9pcbLIVEGckV/iVeq0AOo2pkg9
p4QRIy0tK2diRENLSF2KysFwbY6B26BFeFs3v1sYVRhFW9nLkOrQVporCS0KyZmf
wVD89qSTlnctLcZnIavjKsKUu1nA1iU0yYMdYepKR7lWbnwhdx3ewok=
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAvhIVrARcKIV2NlLJ7sb8bniyuQz3P3yy9vctQ+efBM2Mwi4Q
DVRi7UwhsbXp8WuudHwjTaINhrnkOSumq+jV7MmT6Hdg62Twl1K0Ujj/oqsuda5I
RwPW5Uzvxk14Muy8qp57dm8Z+7Ak9VOihKraGxXnfSy6+W2UHZd+RdLDpdnvK9vo
onW5o/vcqb/XvAqzpL07bnjB8ZzkfekwD5YIfeqh135ckoDwslzJz4eypJind0WR
CpESnpi23QcfiFLjYWfq3TlNit3R9f80cjtWUr6hmS3pQ3m1FrxxQfQMod1X5nbR
0V2SotOC37/RIHIWqodL9ZY5Ose970tvc/Vq2wIDAQABAoIBAA1mIPj7ZbPFlMvH
kkyu4mS3RYIeE9/53nPigOJklaU1CFM4BBGsfTzVPRrWBCPsv2OezK5QWjvBJwGQ
vjMoOsxyeWbN45s0hnFkdynEsuC4yJGrM5UuBBwuDEkidPLCFZrBiVqUAnTnufNB
bheEI9P8+1CrspKa0vIzF8e8T+aFE2ZHhTKQP612apuQ5fzvPK1hCy5xO0JPHsKr
e8UWCiV7ykPkH+k4M06L1GQFpI9wY0wFc49SFwjbFcBQA+G3bGp6dRS2HfHwGQsS
UoV+FtUyXIbxz2yFyuXUpZJ6l4D+lXLQEoNS0+mSPS3jB6Bbm3avcLcZIzzv3vJu
MlUMsqECgYEA4uahtD0YEG2bFPTbTEqdGIkhkiIFvCr/KzxlUJK1cGAU6qqQ0Yjq
cPmhUjqSnD39i2MuSZwfM+wnZ1nPR759qltlmKKDD4ubuzEl/M0pWFAh0VSclW4d
RrvT2xaCt/Zz6RPiIeHHwM5wHqJ5UQKfuGtpfNHPhr5le84a3NKiaGUCgYEA1nJH
+cQmWOHQtPqEQ8ALU+z3nOo82M6vZV/6UWG8gjM6IngnoATtWsa+aEvsaTxw2HQ+
T8+n0h8nIv7MVZY6ZXf/PhsPo7qoGiO/axOjJtUb8Th4Jn0UNPhNPxyVWVjYHrs5
S8kqlfafv4zVmWr/JnySpjdmX7KDu69sJyySMj8CgYBjf+WbR0s9MQNXvkRIgVPA
haoODhNbv7Mj/5kiKyObgtbJTUCyUgsUvbMrfvn5wAlmTXjn2KmqOD3TSYPnHza2
NNwpgeJdN8hz3wqcgE9IJeOeiy8bLC10bjtqEMYD6/RKWmjImNzixORP2sm+Z5so
4RliHhOWL/oKv4fyHAASLQKBgEtIPUpKeOfVBm6yT4J1RcTFuLuGY6v9Cwf8pKSz
Ofk/QJZfNhHwCN9ITAnTNYBQLpFeZY2hKZoTQ6r+Zf9ZyNBcSuejml7xJRhgGk/d
yfXU9IU/PLbOTCy4Sm3we+Gs1docAeZADcotlTEqoMXGESKSsuzVIARSZ/qYf9BU
zlIDAoGBAIVUU5DufsC0esdxhhDY5mAY2GBdyuqG70JFIRm2vRQpFoUfDR7y8l79
22/Qd0DgTVjQ1kWmgOUz/5T5oT4ju6zt1ODzPpvrPHcwruAmNaqYWMv2jw3c1njI
azSxkkueORLGCVpxIixcVctjPigfZBfvuNrCxJLKmF9Dwd9DqO5x
-----END RSA PRIVATE KEY-----
-53
View File
@@ -1,53 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIDnzCCAyagAwIBAgISBt22Sh8i6Gam9yW1bpg0FqSLMAoGCCqGSM49BAMDMDIx
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF
NjAeFw0yNTA4MTgyMjUzMTdaFw0yNTExMTYyMjUzMTZaMCQxIjAgBgNVBAMTGXBs
YXVzaWJsZS5neW96YW1hbmNhdmUuZnIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNC
AARfPnh9MtauhJr78C7Srfyz3hhh6tMJaTEbaXPw8fmPPcD1NWFQsiVljV7AO9tD
Xkl6tZgWxkzlZ4YTG3hdB28Jo4ICKDCCAiQwDgYDVR0PAQH/BAQDAgeAMB0GA1Ud
JQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQW
BBRjuoW/PybowuNTIysjd9HwTPwKXjAfBgNVHSMEGDAWgBSTJ0aYA6lRaI6Y1sRC
SNsjv1iU0jAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly9lNi5p
LmxlbmNyLm9yZy8wJAYDVR0RBB0wG4IZcGxhdXNpYmxlLmd5b3phbWFuY2F2ZS5m
cjATBgNVHSAEDDAKMAgGBmeBDAECATAtBgNVHR8EJjAkMCKgIKAehhxodHRwOi8v
ZTYuYy5sZW5jci5vcmcvMTIuY3JsMIIBBQYKKwYBBAHWeQIEAgSB9gSB8wDxAHcA
DeHyMCvTDcFAYhIJ6lUu/Ed0fLHX6TDvDkIetH5OqjQAAAGYv5ih/gAABAMASDBG
AiEA8II4kvBrbJTNJJS3jB6zVfXzCsJmdvV02LVFwPzsDwQCIQCAFlmdkkdS/zaS
8ckrSA99y+fXkIPR9TwjY2FxrZxsqQB2AMz7D2qFcQll/pWbU87psnwi6YVcDZeN
tql+VMD+TA2wAAABmL+YoiIAAAQDAEcwRQIhAO9AitWJLl5mKEFzK/7PuA7sUN3H
1UfytoQ9cUQ77zj9AiBs4nkVvllaut3/oFMLBg69RI/HYs37hTnppOCpPOQ/JTAK
BggqhkjOPQQDAwNnADBkAjAgkQkgEuh8NOv1Zvmitg8d4Ccex6X2GARTEnQEy4AQ
H9lCmJrZrf8ad8iY4C0ULtwCMHJn3ND5cUs+ZCN1qw6dxbl2WFdkyRuCQeJ+vKIK
EUu9Yru4R8VQjUqwiWf4qBhbYg==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEVzCCAj+gAwIBAgIRALBXPpFzlydw27SHyzpFKzgwDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjQwMzEzMDAwMDAw
WhcNMjcwMzEyMjM1OTU5WjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg
RW5jcnlwdDELMAkGA1UEAxMCRTYwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATZ8Z5G
h/ghcWCoJuuj+rnq2h25EqfUJtlRFLFhfHWWvyILOR/VvtEKRqotPEoJhC6+QJVV
6RlAN2Z17TJOdwRJ+HB7wxjnzvdxEP6sdNgA1O1tHHMWMxCcOrLqbGL0vbijgfgw
gfUwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcD
ATASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBSTJ0aYA6lRaI6Y1sRCSNsj
v1iU0jAfBgNVHSMEGDAWgBR5tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcB
AQQmMCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0g
BAwwCjAIBgZngQwBAgEwJwYDVR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVu
Y3Iub3JnLzANBgkqhkiG9w0BAQsFAAOCAgEAfYt7SiA1sgWGCIpunk46r4AExIRc
MxkKgUhNlrrv1B21hOaXN/5miE+LOTbrcmU/M9yvC6MVY730GNFoL8IhJ8j8vrOL
pMY22OP6baS1k9YMrtDTlwJHoGby04ThTUeBDksS9RiuHvicZqBedQdIF65pZuhp
eDcGBcLiYasQr/EO5gxxtLyTmgsHSOVSBcFOn9lgv7LECPq9i7mfH3mpxgrRKSxH
pOoZ0KXMcB+hHuvlklHntvcI0mMMQ0mhYj6qtMFStkF1RpCG3IPdIwpVCQqu8GV7
s8ubknRzs+3C/Bm19RFOoiPpDkwvyNfvmQ14XkyqqKK5oZ8zhD32kFRQkxa8uZSu
h4aTImFxknu39waBxIRXE4jKxlAmQc4QjFZoq1KmQqQg0J/1JF8RlFvJas1VcjLv
YlvUB2t6npO6oQjB3l+PNf0DpQH7iUx3Wz5AjQCi6L25FjyE06q6BZ/QlmtYdl/8
ZYao4SRqPEs/6cAiF+Qf5zg2UkaWtDphl1LKMuTNLotvsX99HP69V2faNyegodQ0
LyTApr/vT01YPE46vNsDLgK+4cL6TrzC/a4WcmF5SRJ938zrv/duJHLXQIku5v0+
EwOy59Hdm0PT/Er/84dDV0CSjdR/2XuZM3kpysSKLgD1cKiDA+IRguODCxfO9cyY
Ig46v9mFmBvyH04=
-----END CERTIFICATE-----
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIEkSxLTZjOYdt4jCC2x1ZU62bHdODKe3joNRQJoHMjI8oAoGCCqGSM49
AwEHoUQDQgAEXz54fTLWroSa+/Au0q38s94YYerTCWkxG2lz8PH5jz3A9TVhULIl
ZY1ewDvbQ15JerWYFsZM5WeGExt4XQdvCQ==
-----END EC PRIVATE KEY-----
-86
View File
@@ -1,86 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFDzCCA/egAwIBAgISBtZ5wu4XNsa042op5FYwBbDfMA0GCSqGSIb3DQEBCwUA
MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
EwNSMTMwHhcNMjUxMjE4MDgwMTAxWhcNMjYwMzE4MDgwMTAwWjAhMR8wHQYDVQQD
ExZwb3N0aXouZ3lvemFtYW5jYXZlLmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
MIIBCgKCAQEArJ4ANv6XVESnXFW3xfqKtPNN8D6tsZ/2rxx30gVkmsUx25qB3wc1
U1pOn3JHoZGM1T5n0czapBUWTnCZXW69PCLIQFNUMaJcOXknLjAqyHPJTuAEM+cX
DI4xdm/xGxh2M/6tYSL/SHKaz+/kLNVm4XUcCAIPW1S7a9Ie8wPcAmf+1m67jIjv
1lEXkTkXBGeA+o4J+YfWDoTG+wwiraRixGXizdbfewW3C0vC/BQG+Cz/OUwbWGfk
TshKpKdpmu9dOl19uGn84QJKXVN1Byl+i6kNvtOwdTRxlRPaIpXgKHc4nEKW+Iba
4WTtgof99n58U5ef32n9pqbVflvNJy7rbQIDAQABo4ICLTCCAikwDgYDVR0PAQH/
BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMBAf8E
AjAAMB0GA1UdDgQWBBQ7PdOF8+uGN7IB3y1WNXcVRhwbiDAfBgNVHSMEGDAWgBTn
q58PLDOgU9NeT3jIsoQOO9aSMzAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAKG
F2h0dHA6Ly9yMTMuaS5sZW5jci5vcmcvMCEGA1UdEQQaMBiCFnBvc3Rpei5neW96
YW1hbmNhdmUuZnIwEwYDVR0gBAwwCjAIBgZngQwBAgEwLgYDVR0fBCcwJTAjoCGg
H4YdaHR0cDovL3IxMy5jLmxlbmNyLm9yZy85Ni5jcmwwggELBgorBgEEAdZ5AgQC
BIH8BIH5APcAdgCWl2S/VViXrfdDh2g3CEJ36fA61fak8zZuRqQ/D8qpxgAAAZsw
r5LOAAAEAwBHMEUCIE9mG9J2uEWAcCkhdTFpk0+DPwy2gwNE24YfPZvfW/52AiEA
lfXtQkQA9c/TBiPoZLzpPj0SU5ZjocG58EKwJSIR9J0AfQDjI43yjaKI4KrgrPD6
kMmF8La/9dKlJ7AB/BxEWMS26AAAAZswr5NEAAgAAAUALHlCWgQDAEYwRAIgA9bW
f0EDovPgt9k/btsnfqHifQUGgNRW+JFHpZEdb/kCIGpFm/vs4056XLQv+vHdF6Oh
Sjdz8BmCLqHTg1bme9teMA0GCSqGSIb3DQEBCwUAA4IBAQAedjykzPLujZSZWL2g
uSYF2zHsETr5ZLMiuo6W+HBvREWzjPgDIDcWmTVKEENsEtCyC0a7MBvq8xtfiDqv
P+l7r0yVoq7r9yJYS3OUH+ttPxP2P2ZpYOMT4nYYSa03Xzaoegwj3G5cWqsd9Ven
oTpw4T7d3yJG3ZfRQdd5yV3zALvzES39bc5GdCaK1J2EMFQfrg1luSjosimDL7UA
wO7rny9Cfw0Nmq4yEdjKNWAL2kIi/TWBBZN8Nf9KWVOdGlWmzQhYAPhJ3rU1i818
4OIAwH2PYnld54JiJmij5U7hvP8Nkk/D1BGijaJQjpTEhJueHb5nCwPBV9Yj3JLa
X58Z
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFBTCCAu2gAwIBAgIQWgDyEtjUtIDzkkFX6imDBTANBgkqhkiG9w0BAQsFADBP
MQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy
Y2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yNDAzMTMwMDAwMDBa
Fw0yNzAzMTIyMzU5NTlaMDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBF
bmNyeXB0MQwwCgYDVQQDEwNSMTMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQClZ3CN0FaBZBUXYc25BtStGZCMJlA3mBZjklTb2cyEBZPs0+wIG6BgUUNI
fSvHSJaetC3ancgnO1ehn6vw1g7UDjDKb5ux0daknTI+WE41b0VYaHEX/D7YXYKg
L7JRbLAaXbhZzjVlyIuhrxA3/+OcXcJJFzT/jCuLjfC8cSyTDB0FxLrHzarJXnzR
yQH3nAP2/Apd9Np75tt2QnDr9E0i2gB3b9bJXxf92nUupVcM9upctuBzpWjPoXTi
dYJ+EJ/B9aLrAek4sQpEzNPCifVJNYIKNLMc6YjCR06CDgo28EdPivEpBHXazeGa
XP9enZiVuppD0EqiFwUBBDDTMrOPAgMBAAGjgfgwgfUwDgYDVR0PAQH/BAQDAgGG
MB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATASBgNVHRMBAf8ECDAGAQH/
AgEAMB0GA1UdDgQWBBTnq58PLDOgU9NeT3jIsoQOO9aSMzAfBgNVHSMEGDAWgBR5
tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAKG
Fmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0gBAwwCjAIBgZngQwBAgEwJwYD
VR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVuY3Iub3JnLzANBgkqhkiG9w0B
AQsFAAOCAgEAUTdYUqEimzW7TbrOypLqCfL7VOwYf/Q79OH5cHLCZeggfQhDconl
k7Kgh8b0vi+/XuWu7CN8n/UPeg1vo3G+taXirrytthQinAHGwc/UdbOygJa9zuBc
VyqoH3CXTXDInT+8a+c3aEVMJ2St+pSn4ed+WkDp8ijsijvEyFwE47hulW0Ltzjg
9fOV5Pmrg/zxWbRuL+k0DBDHEJennCsAen7c35Pmx7jpmJ/HtgRhcnz0yjSBvyIw
6L1QIupkCv2SBODT/xDD3gfQQyKv6roV4G2EhfEyAsWpmojxjCUCGiyg97FvDtm/
NK2LSc9lybKxB73I2+P2G3CaWpvvpAiHCVu30jW8GCxKdfhsXtnIy2imskQqVZ2m
0Pmxobb28Tucr7xBK7CtwvPrb79os7u2XP3O5f9b/H66GNyRrglRXlrYjI1oGYL/
f4I1n/Sgusda6WvA6C190kxjU15Y12mHU4+BxyR9cx2hhGS9fAjMZKJss28qxvz6
Axu4CaDmRNZpK/pQrXF17yXCXkmEWgvSOEZy6Z9pcbLIVEGckV/iVeq0AOo2pkg9
p4QRIy0tK2diRENLSF2KysFwbY6B26BFeFs3v1sYVRhFW9nLkOrQVporCS0KyZmf
wVD89qSTlnctLcZnIavjKsKUu1nA1iU0yYMdYepKR7lWbnwhdx3ewok=
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEArJ4ANv6XVESnXFW3xfqKtPNN8D6tsZ/2rxx30gVkmsUx25qB
3wc1U1pOn3JHoZGM1T5n0czapBUWTnCZXW69PCLIQFNUMaJcOXknLjAqyHPJTuAE
M+cXDI4xdm/xGxh2M/6tYSL/SHKaz+/kLNVm4XUcCAIPW1S7a9Ie8wPcAmf+1m67
jIjv1lEXkTkXBGeA+o4J+YfWDoTG+wwiraRixGXizdbfewW3C0vC/BQG+Cz/OUwb
WGfkTshKpKdpmu9dOl19uGn84QJKXVN1Byl+i6kNvtOwdTRxlRPaIpXgKHc4nEKW
+Iba4WTtgof99n58U5ef32n9pqbVflvNJy7rbQIDAQABAoIBAE8qXW3bYDrpC5p4
w4I8T+4CIe37SPzMIL4Zv8gl6ghjROTy3PoU27uBEMrmhfyO/Lh12PZqzaFv/F14
HZYwqgAQ8acysEvdKw++xR3VQGHTXHFcowDMzJDZC81GNJ0ZIGjjNc/1VX/7841G
924qZvcilvsDOtjHqPcflEseq4G8P1+b/eRPoNrInfaCadGg7yZahyoq7j+rdPzW
1AM5txFdZ/mWeuz+2AXoO8npGQv0vNLppQH97eB6EtA9kl7Ia229+NkYhiX16DHn
A1MpEvlSoyk6sa0r9PqC+O3txaetosXMCEk+70s1GgnBByuAvrx4VWR4wpMrdWJc
ZpecKB8CgYEA6KVJsk0NxDfQDOYpjrn7T5bDcmkL/td+YQCR0WLDdRJrmbXqyUwT
Ud7CgcutEACU144Kus7E2lyHNF7Y0IAUcgRz+5xIkLB2dzpQ4u/ksdDBxXhEK1Wl
mzign0qEsSFnxxscWbLBNEQAA98jfbXGQCApSNsDC0aGKXuGYgCvAusCgYEAvfIN
0WbaJkm/rP1cLTx6SEyDGQV0hmkYrevl1A3D3oeNotPSlN2UMIWuIgKisDarxsMf
AIId2/zgMAN2adBaF8sBAbYMMgigCyGNQ6qcOW28X1H/DxvbJqh+MBd+YhkCDxIa
QlIomaM0MQ+tNrkG8y9AsDqeHxRARC/S5u+1xQcCgYEAuToYcgidZFOXpx19ivCS
oayEkkwGy/Eg4vSEJLTAsC5pUyme9IRIgY+dR6A1ex8rYm/qJQ/JdZ3j3BOEBoVj
QeA/w92LfP+yYn0gt36Ok/CExsdZZzM6tlogsJKxESJqsQDp0pTa9NULOgnoBQe7
/4RbunD9fHW7Db4WoWKv9N8CgYEAqGNUkqX+kODiVsaJF+U8dqm1stHeOmYjJdQx
/Cpz0OwUyRvF3IkOnXF1LNtvRI5C/ELwUfAH7oUgbhAzwpydsegarVypNRXmY9fL
twgh1NuOmmZDmi5UutG2hIXfWbHX3Gps8wyIx6MiWrgOE6w2GBJ044YjtWOrkYdg
DbDGULMCgYAE+URU+e2i06NaKo2HiVR0QYEDb6m88bjJS+Q+5pYHhmWUTBG4ChaX
WedsQj7TRrNTLP8wTWxqHULfHjO4FuseCF0nsPjSm4m812S3262LFbeAoyXrP/rd
u93mblgvsdrfaoO2ZU6+KmwOQBpkj0EHWlEcX0DyceBcGxItJ981Vw==
-----END RSA PRIVATE KEY-----
-85
View File
@@ -1,85 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFBDCCA+ygAwIBAgISBlWRK7Pj2H5i4ZcTfiZicmSTMA0GCSqGSIb3DQEBCwUA
MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
EwNSMTMwHhcNMjUxMjE4MDgwMTA2WhcNMjYwMzE4MDgwMTA1WjAeMRwwGgYDVQQD
ExNyc3MuZ3lvemFtYW5jYXZlLmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEAqgEHsYHNPzD/gS4BlX6Rmskm5eH61UtOiA5vet5HKJR/g/uPcrpi3KeV
2ikMyN+RJ/pDFeKKqYynP/viP4qpSU/gzlmhPJBLi8dMiwyqhpuQtfooEAnXz6Tf
I58YPkHqMxG5xMgpXjDKj/c+9cfhfe6TFwIBJthOHK5JGiUnmEWI66OFET95adl/
W6xWbCVzXwVamYrf2g4M+Do89Hd8amUzBdosVic/usHim75VKcjdHBPRaSPil+tH
5LWfY7KQg0Ln72A79upfgZlKWOPdYIHWxa0TAsBcA01q8wMB4ydosz6HwtG3L97N
k5mYioxYtj6hyEHcHtyPIogY89HEUwIDAQABo4ICJTCCAiEwDgYDVR0PAQH/BAQD
AgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMBAf8EAjAA
MB0GA1UdDgQWBBRBUDDkWxeGCHRWPX1uCj5z1GyPZTAfBgNVHSMEGDAWgBTnq58P
LDOgU9NeT3jIsoQOO9aSMzAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAKGF2h0
dHA6Ly9yMTMuaS5sZW5jci5vcmcvMB4GA1UdEQQXMBWCE3Jzcy5neW96YW1hbmNh
dmUuZnIwEwYDVR0gBAwwCjAIBgZngQwBAgEwLgYDVR0fBCcwJTAjoCGgH4YdaHR0
cDovL3IxMy5jLmxlbmNyLm9yZy8yMC5jcmwwggEGBgorBgEEAdZ5AgQCBIH3BIH0
APIAdwAWgy2r8KklDw/wOqVF/8i/yCPQh0v2BCkn+OcfMxP1+gAAAZswr6XfAAAE
AwBIMEYCIQCQhE2bfbwdBGaA3PW9A4PZn8nx9uuUs7WZczz/Gp0oygIhAOb9PfB9
S/hp/DEOyMtaKHaf09SrQhSMgCmKXGHqaBcNAHcAlpdkv1VYl633Q4doNwhCd+nw
OtX2pPM2bkakPw/KqcYAAAGbMK+mCQAABAMASDBGAiEA9dmF0lOWq5WEx62Xcc7Y
xJKB/RQArlhxAyaHwBOe5Z0CIQDnxD9IT9qIpruvXdlDCxGJzCLYMSOQbtCQLk8K
3kpmnTANBgkqhkiG9w0BAQsFAAOCAQEAjgcsHNBZUTj6zYkLT/EzSUqizyos6xQI
INm+935O3ODZ9cF3SHcqsrizkSY7feH6t8hRhRFCsmGkWmefaiprqQ8+3L6gxvwj
qPFqte4i8w0y/Zjv6pSdmunyi6RUZeeglkxqdHnFTJ088fKmRcmOuDkWmuk3hTKP
emVDrwA4fXN+VwT8ekvrU9GrReZTgUp1tZl5pdlcr261QDkjT2PCLpy8SNKkdy1s
HjRUsfcB8XlqDUnwoM9uMWjY2iYptVMpRCZKd8MP9tiv796Xnu8m00dPVcTt21js
yn1iEW6TCF/tUp1o1tGoOgoGs4r4RSBwBIfF/tw3XLRpeL09BnsSlQ==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFBTCCAu2gAwIBAgIQWgDyEtjUtIDzkkFX6imDBTANBgkqhkiG9w0BAQsFADBP
MQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy
Y2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yNDAzMTMwMDAwMDBa
Fw0yNzAzMTIyMzU5NTlaMDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBF
bmNyeXB0MQwwCgYDVQQDEwNSMTMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQClZ3CN0FaBZBUXYc25BtStGZCMJlA3mBZjklTb2cyEBZPs0+wIG6BgUUNI
fSvHSJaetC3ancgnO1ehn6vw1g7UDjDKb5ux0daknTI+WE41b0VYaHEX/D7YXYKg
L7JRbLAaXbhZzjVlyIuhrxA3/+OcXcJJFzT/jCuLjfC8cSyTDB0FxLrHzarJXnzR
yQH3nAP2/Apd9Np75tt2QnDr9E0i2gB3b9bJXxf92nUupVcM9upctuBzpWjPoXTi
dYJ+EJ/B9aLrAek4sQpEzNPCifVJNYIKNLMc6YjCR06CDgo28EdPivEpBHXazeGa
XP9enZiVuppD0EqiFwUBBDDTMrOPAgMBAAGjgfgwgfUwDgYDVR0PAQH/BAQDAgGG
MB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATASBgNVHRMBAf8ECDAGAQH/
AgEAMB0GA1UdDgQWBBTnq58PLDOgU9NeT3jIsoQOO9aSMzAfBgNVHSMEGDAWgBR5
tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAKG
Fmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0gBAwwCjAIBgZngQwBAgEwJwYD
VR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVuY3Iub3JnLzANBgkqhkiG9w0B
AQsFAAOCAgEAUTdYUqEimzW7TbrOypLqCfL7VOwYf/Q79OH5cHLCZeggfQhDconl
k7Kgh8b0vi+/XuWu7CN8n/UPeg1vo3G+taXirrytthQinAHGwc/UdbOygJa9zuBc
VyqoH3CXTXDInT+8a+c3aEVMJ2St+pSn4ed+WkDp8ijsijvEyFwE47hulW0Ltzjg
9fOV5Pmrg/zxWbRuL+k0DBDHEJennCsAen7c35Pmx7jpmJ/HtgRhcnz0yjSBvyIw
6L1QIupkCv2SBODT/xDD3gfQQyKv6roV4G2EhfEyAsWpmojxjCUCGiyg97FvDtm/
NK2LSc9lybKxB73I2+P2G3CaWpvvpAiHCVu30jW8GCxKdfhsXtnIy2imskQqVZ2m
0Pmxobb28Tucr7xBK7CtwvPrb79os7u2XP3O5f9b/H66GNyRrglRXlrYjI1oGYL/
f4I1n/Sgusda6WvA6C190kxjU15Y12mHU4+BxyR9cx2hhGS9fAjMZKJss28qxvz6
Axu4CaDmRNZpK/pQrXF17yXCXkmEWgvSOEZy6Z9pcbLIVEGckV/iVeq0AOo2pkg9
p4QRIy0tK2diRENLSF2KysFwbY6B26BFeFs3v1sYVRhFW9nLkOrQVporCS0KyZmf
wVD89qSTlnctLcZnIavjKsKUu1nA1iU0yYMdYepKR7lWbnwhdx3ewok=
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAqgEHsYHNPzD/gS4BlX6Rmskm5eH61UtOiA5vet5HKJR/g/uP
crpi3KeV2ikMyN+RJ/pDFeKKqYynP/viP4qpSU/gzlmhPJBLi8dMiwyqhpuQtfoo
EAnXz6TfI58YPkHqMxG5xMgpXjDKj/c+9cfhfe6TFwIBJthOHK5JGiUnmEWI66OF
ET95adl/W6xWbCVzXwVamYrf2g4M+Do89Hd8amUzBdosVic/usHim75VKcjdHBPR
aSPil+tH5LWfY7KQg0Ln72A79upfgZlKWOPdYIHWxa0TAsBcA01q8wMB4ydosz6H
wtG3L97Nk5mYioxYtj6hyEHcHtyPIogY89HEUwIDAQABAoIBAEvd/8/wrGb599xv
apeLj3EzOZ+3lJghbl97ibacgccTVkDRP/gkQ8BTLaXZUfJHC2F65vtaSSVXNsBw
KUzQFbI46otMJo9/mac8fuVC9srxm8gKZlyZ9+ybmFUuR8Ro6Bp4W5388bEuNwe+
gCNxWyk3Ef9fjqIGP/2+rbL0R9JE41BX/8CFhNSYHTLAHVCnbvxj7ejpqAT8J8tR
rTaO0eLuQ4axXsCMs4lSESVTUjC5LPsWIYd6QG7juMTcS+Lu70tqQiV7cwH38gb3
/hXD8Un9wF36N9GRrzbqZQUXIkEsSZQiKfwi8wGbh3dZpJAriBfCEw3CEGwZgEi8
9sk+rgECgYEA3NIgsBLGB9m1Q6KzqujDH09JD156wKhy2t+wVzXDV97HiOzlJ0Vl
/53fN7wDo0dsgqk6r49LGQuJyzWWy/yKbIutSVzmGtkbN6oQi45g643Illnz9oce
usQl709o25QPGfFRnOqKZD2C5AVA8v4oYuptqq3a9UR+KdTBDYcdwQECgYEAxRZo
5VuPf4grAoyFTe2ET5Be8KxW/KzJQY7tlwAmW3JTuTtbgVMArJbInUbsaFdBG5LC
wQu7dyVkKOLb6TsjrKkDKuB4W2G5crmShZ5MuBa1Rk4h+XJHWlv/t+86HfkwG/x6
DN2BNx/sMlsoVuUwbcEDeM6bwEJqrn6eBfg7MVMCgYAo0SZ9pVq5hMJ+uAph4xh+
JxeoIZyrE/f3ATYFSMjM6z8SzkclVSyfbT0ffj9l5QPnuwRAA0qsXHeh+kvfdNTZ
b5AeaW+XMt5XEbZxNWYw5EpZkFMKFLvXZf5lF9aYD+wirXqaeLgQA1a4c0goIlaw
wgh3bh91Cq4PaWYt6/XSAQKBgANDTLdHXcfRvEyNgQN6RC+BB2FaqRID1k0kjaBr
Wzc2XFZ7uhcZBbDVyjp4Wx+bGjPXqSvDAvaFAvR+VP+2f++y2J+UGcoBgy14Dwnx
RfniPlwMnRlhH/dKAKDN8Btg7b/43RhrbmE4QRPQWImfv76BbIpKeV+kedmrtPgK
VQiLAoGAECq3GR7e0wRebgf4uyWNvHmICkt8CucRQvwzDJczEJjP6UuR7Y3zwupL
T9px3WZUtkRG3OFQDX5vG3wjhX17UJ/xeiXJbfXLLUbmMjWKr5C1ffs8ekSTVT/H
BG1Zz8ArJKBLj2hoE+2MwcsCgwaJS+a3dEbBPTxJ+6cFpj10qCk=
-----END RSA PRIVATE KEY-----
-53
View File
@@ -1,53 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIDnzCCAySgAwIBAgISBfaUuUkyN5RMJCH7spqDn/TGMAoGCCqGSM49BAMDMDIx
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF
NzAeFw0yNTEyMTgwODM1MTFaFw0yNjAzMTgwODM1MTBaMCAxHjAcBgNVBAMTFXN0
YXRzLmd5b3phbWFuY2F2ZS5mcjBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABFLU
rEZ4GFJPhxQqFxmC1zP6zwIVGQShQHBqNOLvwDeVyC1a8WvmavGzP0yaosfDD8I0
DHAQFCw/CdeO7XQbPNqjggIqMIICJjAOBgNVHQ8BAf8EBAMCB4AwHQYDVR0lBBYw
FAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFF3u
+mnY7uQKid7XhZVZmFJCLANoMB8GA1UdIwQYMBaAFK5IntyHHUSgb9qi5WB0BHjC
nACAMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcwAoYWaHR0cDovL2U3LmkubGVu
Y3Iub3JnLzAgBgNVHREEGTAXghVzdGF0cy5neW96YW1hbmNhdmUuZnIwEwYDVR0g
BAwwCjAIBgZngQwBAgEwLQYDVR0fBCYwJDAioCCgHoYcaHR0cDovL2U3LmMubGVu
Y3Iub3JnLzcxLmNybDCCAQsGCisGAQQB1nkCBAIEgfwEgfkA9wB1AGQRxGykEuyn
iRyiAi4AvKtPKAfUHjUnq+r+1QPJfc3wAAABmzDO2ZoAAAQDAEYwRAIgQU5ghWBS
0VVQpRkoGibtX/CoiuarA3XNoL3/Cj6WiRsCIDu/ZLDYk2j44lFGenzQkz/A8lVj
7LhKdaK/ieMwRDZ9AH4Apcl4kl1XRheChw3YiWYLXFVki30AQPLsB2hR0YhpGfcA
AAGbMM7kFgAIAAAFACwEsFoEAwBHMEUCIGL1HKKw6XLGXtmjKSPwN6v5FCqv3afY
p7X+fLY+QtlvAiEAx/QDgRdBp+cZaINi+M3yjef+5/qUh1jEgTw3TDhEcUcwCgYI
KoZIzj0EAwMDaQAwZgIxAJban5a9yE53vPKyOkYL8SmrKTzYCb23y2JTkC64ojKI
JhkW/yfZcFqhXMCcWb1vhAIxANAOvjkt2Mb1TpZRpI+oaZ6YS1NDeFBf1ea7TVEB
CS2LVEe+Qp25DhXbewzFklD44w==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEVzCCAj+gAwIBAgIRAKp18eYrjwoiCWbTi7/UuqEwDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjQwMzEzMDAwMDAw
WhcNMjcwMzEyMjM1OTU5WjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg
RW5jcnlwdDELMAkGA1UEAxMCRTcwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARB6AST
CFh/vjcwDMCgQer+VtqEkz7JANurZxLP+U9TCeioL6sp5Z8VRvRbYk4P1INBmbef
QHJFHCxcSjKmwtvGBWpl/9ra8HW0QDsUaJW2qOJqceJ0ZVFT3hbUHifBM/2jgfgw
gfUwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcD
ATASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBSuSJ7chx1EoG/aouVgdAR4
wpwAgDAfBgNVHSMEGDAWgBR5tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcB
AQQmMCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0g
BAwwCjAIBgZngQwBAgEwJwYDVR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVu
Y3Iub3JnLzANBgkqhkiG9w0BAQsFAAOCAgEAjx66fDdLk5ywFn3CzA1w1qfylHUD
aEf0QZpXcJseddJGSfbUUOvbNR9N/QQ16K1lXl4VFyhmGXDT5Kdfcr0RvIIVrNxF
h4lqHtRRCP6RBRstqbZ2zURgqakn/Xip0iaQL0IdfHBZr396FgknniRYFckKORPG
yM3QKnd66gtMst8I5nkRQlAg/Jb+Gc3egIvuGKWboE1G89NTsN9LTDD3PLj0dUMr
OIuqVjLB8pEC6yk9enrlrqjXQgkLEYhXzq7dLafv5Vkig6Gl0nuuqjqfp0Q1bi1o
yVNAlXe6aUXw92CcghC9bNsKEO1+M52YY5+ofIXlS/SEQbvVYYBLZ5yeiglV6t3S
M6H+vTG0aP9YHzLn/KVOHzGQfXDP7qM5tkf+7diZe7o2fw6O7IvN6fsQXEQQj8TJ
UXJxv2/uJhcuy/tSDgXwHM8Uk34WNbRT7zGTGkQRX0gsbjAea/jYAoWv0ZvQRwpq
Pe79D/i7Cep8qWnA+7AE/3B3S/3dEEYmc0lpe1366A/6GEgk3ktr9PEoQrLChs6I
tu3wnNLB2euC8IKGLQFpGtOO/2/hiAKjyajaBP25w1jF0Wl8Bbqne3uZ2q1GyPFJ
YRmT7/OXpmOH/FVLtwS+8ng1cAmpCujPwteJZNcDG0sF2n/sc0+SQf49fdyUK0ty
+VUwFj9tmWxyR/M=
-----END CERTIFICATE-----
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIGTcWqNYGCSV6aqK3NyPk3r9cd8AX+o8IfPlpQ01irqroAoGCCqGSM49
AwEHoUQDQgAEUtSsRngYUk+HFCoXGYLXM/rPAhUZBKFAcGo04u/AN5XILVrxa+Zq
8bM/TJqix8MPwjQMcBAULD8J147tdBs82g==
-----END EC PRIVATE KEY-----
-86
View File
@@ -1,86 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFATCCA+mgAwIBAgISBRGEB/9zYGIh1R4ULnX4aPgIMA0GCSqGSIb3DQEBCwUA
MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
EwNSMTAwHhcNMjUwNzEzMjEwMTM5WhcNMjUxMDExMjEwMTM4WjAfMR0wGwYDVQQD
ExR0dXJuLmd5b3phbWFuY2F2ZS5mcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
AQoCggEBAMpCTP/vpe+MS6u9w4Ph9IxJst/reJcIFtxNi9saqmRDEGzQxKM7E9pb
956SdgDH5VKyTxNmGRvRSbBfik0AF2pUCIysJSVX3a1kR5gZX0epgpSGJdwiQdjh
t0W06EHzzK2nYFV38+uQ9n5K1jN7GlAeR9KEgMnWD8dKk3qDU237s7/H8gveCgpd
FL5y7M2VMS1UHeARUP9JYx+BoT28a5+sLKW6ybIvAJgo6emwCn7rMpgk0jXf+P6Y
uolOX3i12IQqzFqqrfhYQN7n/abhAWr6UbBPnL4AHmwbWEAdhz706RTFEl17+2MK
e4Mlec5vmgmWsrXAT9czpd6/FEFwoPsCAwEAAaOCAiEwggIdMA4GA1UdDwEB/wQE
AwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIw
ADAdBgNVHQ4EFgQUhlQEwJlTsPCMjh8CYmGydmguSUMwHwYDVR0jBBgwFoAUu7zD
R6XkvKnGw6RyDBCNojXhyOgwMwYIKwYBBQUHAQEEJzAlMCMGCCsGAQUFBzAChhdo
dHRwOi8vcjEwLmkubGVuY3Iub3JnLzAfBgNVHREEGDAWghR0dXJuLmd5b3phbWFu
Y2F2ZS5mcjATBgNVHSAEDDAKMAgGBmeBDAECATAtBgNVHR8EJjAkMCKgIKAehhxo
dHRwOi8vcjEwLmMubGVuY3Iub3JnLzkuY3JsMIIBAgYKKwYBBAHWeQIEAgSB8wSB
8ADuAHUApELFBklgYVSPD9TqnPt6LSZFTYepfy/fRVn2J086hFQAAAGYBc1+oAAA
BAMARjBEAiA+gzq10/Z5j8bDFXNpWgALYpiy77/spjnFqdApjFGYQgIgfUen7a9F
/bFzYTRW5a83AUM1M51KD1Wg1BNBUYHwYrcAdQAS8U40vVNyTIQGGcOPP3oT+Oe1
YoeInG0wBYTr5YYmOgAAAZgFzY5AAAAEAwBGMEQCIDGnRlsv3YUYK/wN4RZMSbc0
ts5sLTljCZ60OX+iX7fTAiA4KIV29bT6tXVO4Jtzkt4G3Uqm8FNrGQqUQnfbFYNw
GzANBgkqhkiG9w0BAQsFAAOCAQEAe6GuvziT6Yv03LjAx0ylb4BoufelXnzqmCdP
mBDvcp1Kxb+ICJbpRj9GMvb2l4GpDWANOt2Q6rThxtahoCjkVBp28NjPa5yQPXSF
3QFgNd/QXalgW59lmYQzYF10ijckM/+2s774swGwuvOa6MJJkDESvIMP48WTRUP7
VyDlqqh9SMC3HQPHD9xQQKNMzwHczPtZg87T7p9LvkBOx0k7o6JEkoSFO7fq3sPB
xD3C4RMJRzWS/LDurFVUDPtTh2xNu2XbVsNF5+g4jT4fi66/He1MsSTCio2/swm6
mJ0zXOqoXX5a4MQycyecNJHZ+BA0+oF7EKeIiycVoU+HpkkNhw==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFBTCCAu2gAwIBAgIQS6hSk/eaL6JzBkuoBI110DANBgkqhkiG9w0BAQsFADBP
MQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy
Y2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yNDAzMTMwMDAwMDBa
Fw0yNzAzMTIyMzU5NTlaMDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBF
bmNyeXB0MQwwCgYDVQQDEwNSMTAwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQDPV+XmxFQS7bRH/sknWHZGUCiMHT6I3wWd1bUYKb3dtVq/+vbOo76vACFL
YlpaPAEvxVgD9on/jhFD68G14BQHlo9vH9fnuoE5CXVlt8KvGFs3Jijno/QHK20a
/6tYvJWuQP/py1fEtVt/eA0YYbwX51TGu0mRzW4Y0YCF7qZlNrx06rxQTOr8IfM4
FpOUurDTazgGzRYSespSdcitdrLCnF2YRVxvYXvGLe48E1KGAdlX5jgc3421H5KR
mudKHMxFqHJV8LDmowfs/acbZp4/SItxhHFYyTr6717yW0QrPHTnj7JHwQdqzZq3
DZb3EoEmUVQK7GH29/Xi8orIlQ2NAgMBAAGjgfgwgfUwDgYDVR0PAQH/BAQDAgGG
MB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATASBgNVHRMBAf8ECDAGAQH/
AgEAMB0GA1UdDgQWBBS7vMNHpeS8qcbDpHIMEI2iNeHI6DAfBgNVHSMEGDAWgBR5
tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAKG
Fmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0gBAwwCjAIBgZngQwBAgEwJwYD
VR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVuY3Iub3JnLzANBgkqhkiG9w0B
AQsFAAOCAgEAkrHnQTfreZ2B5s3iJeE6IOmQRJWjgVzPw139vaBw1bGWKCIL0vIo
zwzn1OZDjCQiHcFCktEJr59L9MhwTyAWsVrdAfYf+B9haxQnsHKNY67u4s5Lzzfd
u6PUzeetUK29v+PsPmI2cJkxp+iN3epi4hKu9ZzUPSwMqtCceb7qPVxEbpYxY1p9
1n5PJKBLBX9eb9LU6l8zSxPWV7bK3lG4XaMJgnT9x3ies7msFtpKK5bDtotij/l0
GaKeA97pb5uwD9KgWvaFXMIEt8jVTjLEvwRdvCn294GPDF08U8lAkIv7tghluaQh
1QnlE4SEN4LOECj8dsIGJXpGUk3aU3KkJz9icKy+aUgA+2cP21uh6NcDIS3XyfaZ
QjmDQ993ChII8SXWupQZVBiIpcWO4RqZk3lr7Bz5MUCwzDIA359e57SSq5CCkY0N
4B6Vulk7LktfwrdGNVI5BsC9qqxSwSKgRJeZ9wygIaehbHFHFhcBaMDKpiZlBHyz
rsnnlFXCb5s8HKn5LsUgGvB24L7sGNZP2CX7dhHov+YhD+jozLW2p9W4959Bz2Ei
RmqDtmiXLnzqTpXbI+suyCsohKRg6Un0RC47+cpiVwHiXZAW+cn8eiNIjqbVgXLx
KPpdzvvtTnOPlC7SQZSYmdunr3Bf9b77AiC/ZidstK36dRILKz7OA54=
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDKQkz/76XvjEur
vcOD4fSMSbLf63iXCBbcTYvbGqpkQxBs0MSjOxPaW/eeknYAx+VSsk8TZhkb0Umw
X4pNABdqVAiMrCUlV92tZEeYGV9HqYKUhiXcIkHY4bdFtOhB88ytp2BVd/PrkPZ+
StYzexpQHkfShIDJ1g/HSpN6g1Nt+7O/x/IL3goKXRS+cuzNlTEtVB3gEVD/SWMf
gaE9vGufrCylusmyLwCYKOnpsAp+6zKYJNI13/j+mLqJTl94tdiEKsxaqq34WEDe
5/2m4QFq+lGwT5y+AB5sG1hAHYc+9OkUxRJde/tjCnuDJXnOb5oJlrK1wE/XM6Xe
vxRBcKD7AgMBAAECggEBAKyOvjTI19A06MZgQvM8jrA1nFdwBNUOALr5qe1HpcGe
ed/siSceGwT725m9KNHnuV3BZLePLrLN7sl76XliL5f2k8i4gYSHn0f0OySn2ONB
2ncusBRMYdNQV1UwT8sc3i31k7m3ejIq3jHHVVJcn4llHC+d/ma0q4eCt6oZas90
HxGi3lU5KMhlSwQaH5YtT8Syx7N2uD6GfmMUtInr1tGxQysvu2Dwu4lVAKc3/qdB
FA+MylCgKUs/FcEep9+sNnzpc5I2YvTZCMS3dkRHZIv4bBJ+lh9roVZPWvB1gQoC
I9XGSSvz+1RwyCyJ62Qr/5u1frhV1m1hSPE6T2YH/YECgYEA74LJM0zfCFA143Rb
TLinoPsncdK+6lz0W3NaPH34yVJSdo6S/Pqn+sLC1hWRHabemdPn50E6/ma4aY1p
sACVJVAvafX1qmH0NPbBalA7xNzhuCoFPHJTZKKSrj+zJZ2nvQDcHh/Rs7JAX6OX
UVQMxrWXDgRduiQ3imXRwoumR8ECgYEA2C750/CSADRc+Ys7BgDXpo67Vm14JdLg
AxKvcSwgnJOYE4SjVKoaRpG9ObljaDF7q7SBu+COY4NlCgLT8kFDPo8/DrxeN8Nx
lkatnqThbBn/hwS7rIYSEE7nUde4LXuT+bgCSZHv5T2oLwPB5V2KGL6mkzL25NtI
J8lLAvd/97sCgYEA3atO6dLYjQonhdcX9N7mDgDE1fy1w5S6d7VAK8JvMmylc6Kq
+cZHF7ePubIGN8pMNVTBSe++WNvbC53c1g8D+p/G8iu47bNw4GAMTIfreVzw75C8
feBVvEsWtHyyIjtSloOoNZ0/aS+tkpaGorfGh1Zjco6p7HA+kzF/PK4g/EECgYAo
6OraEqJua3pUtuZagnpMyKHm/xxHfBpsOnL85a7eMogK2YTXFsGWLSoz7ENFimeu
3J/YX+xSJKFQPazCIVuKUS1LqpXh05iBKardZLJL9LeIY3rocQ6mC2h28m2mHcao
8QttxLIzHXHgQ8PDlen2OM3o+TIDqQOEk/EgBJow1QKBgC52SDq16yvNvXFx2vV+
aGYqvs0WDrmehBac5KLtqm4MnKlgI07lDNmCgX5nRIQU/n1o9EFdh70fjbCMrP6l
TegzxB1Gcs+8UC5fXf8GQIn1LwxU9Vj+QAgAu2gfo6napXguKmIcHQgERihEZ4mO
5l7+s6Ojdjfi3BK6rDg55J9Z
-----END PRIVATE KEY-----
-87
View File
@@ -1,87 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFDjCCA/agAwIBAgISBvXqmV6Yo20cqoicnC24QiS9MA0GCSqGSIb3DQEBCwUA
MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
EwNSMTAwHhcNMjUwNzEzMjEwMTUyWhcNMjUxMDExMjEwMTUxWjAkMSIwIAYDVQQD
Exl2b2ljZWNoYXQuZ3lvemFtYW5jYXZlLmZyMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEAz7nF1NdS9EcSNmzwXHpLCN/qGC9qvRUkrKkzOj5q1EXpSO/p
5poIoJXud5cD1b979uCndW3sksk3iHHh5+NsgdX4Zj493ex0ANJLRqsxaTdp6+bv
u0fwX+JzgWjHv34Xj024Y2BAFLEHdAyKGm+Y2qoT1Q50zCt0vZMhzdgGOBq3RxBE
OZA+V9E0ni3KangUm9BIS41gtz8oZ9VIeJnix/nZ/rQla+ybmTNVAeiTYSlc8EmF
ErsOSQ48vfzfs6+Wy3vfyVUX3kOEVFoUpxB4emQvou3RrQDY00oC2E4Y5Or+TcYF
N/WGVrNSGz6/pVnnnV+Q1FNnI0SBtL4MqhwsqQIDAQABo4ICKTCCAiUwDgYDVR0P
AQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMB
Af8EAjAAMB0GA1UdDgQWBBSAVoRznHEv4Oa09LYaNFZ+5MsoVTAfBgNVHSMEGDAW
gBS7vMNHpeS8qcbDpHIMEI2iNeHI6DAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUH
MAKGF2h0dHA6Ly9yMTAuaS5sZW5jci5vcmcvMCQGA1UdEQQdMBuCGXZvaWNlY2hh
dC5neW96YW1hbmNhdmUuZnIwEwYDVR0gBAwwCjAIBgZngQwBAgEwLgYDVR0fBCcw
JTAjoCGgH4YdaHR0cDovL3IxMC5jLmxlbmNyLm9yZy82Mi5jcmwwggEEBgorBgEE
AdZ5AgQCBIH1BIHyAPAAdgAN4fIwK9MNwUBiEgnqVS78R3R8sdfpMO8OQh60fk6q
NAAAAZgFza5qAAAEAwBHMEUCIFESO+P2EFHDKu58Ar43tlAvfE0budnfR1nvEFwo
Mm7pAiEAsoiU9VcglbJlLVr8Sa5xcULfgjD/VYM3An07w11+JWIAdgAS8U40vVNy
TIQGGcOPP3oT+Oe1YoeInG0wBYTr5YYmOgAAAZgFza58AAAEAwBHMEUCIQDjZ6+M
/iItF+ZJO6kudVhSzOcG2D3qdOiYh9Rl1inDxwIgLc2Fz7q8sP3A0Giv6vUQnUME
ADI3eTywT606bhRFKWswDQYJKoZIhvcNAQELBQADggEBABSpS/Npc/26FjrQADNO
7fv/xO3CVbHrnkLJQlT4+dq+GCQ8PEFFG7Kjsdok0V2NGSDZCAHOEW7RFE5FAJQA
3yb+3Zi32fUpfgDLdIXIAOIg9xa2rD2fgB5JTS7teKXqkdkVrgpO3I7QDnIFhhsa
HaINxS7zLR7NH1Zf/LLPU6u7pjtslHLWbvxcHi+PcZrfnLVmPPau06PU65M+hel0
AvHsNMKrb76M8yA0D4UVvLWN7EOxNGCluVaA0qEdmmhGPFlEt+KkF66ZfQnPqT8v
L7X/dwxCCSGFx/j9tk0oPsLzixSOgM/PDV1Mw3O6gDRA8VgHrBH89LMb+gZ9A3fj
2so=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFBTCCAu2gAwIBAgIQS6hSk/eaL6JzBkuoBI110DANBgkqhkiG9w0BAQsFADBP
MQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy
Y2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yNDAzMTMwMDAwMDBa
Fw0yNzAzMTIyMzU5NTlaMDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBF
bmNyeXB0MQwwCgYDVQQDEwNSMTAwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQDPV+XmxFQS7bRH/sknWHZGUCiMHT6I3wWd1bUYKb3dtVq/+vbOo76vACFL
YlpaPAEvxVgD9on/jhFD68G14BQHlo9vH9fnuoE5CXVlt8KvGFs3Jijno/QHK20a
/6tYvJWuQP/py1fEtVt/eA0YYbwX51TGu0mRzW4Y0YCF7qZlNrx06rxQTOr8IfM4
FpOUurDTazgGzRYSespSdcitdrLCnF2YRVxvYXvGLe48E1KGAdlX5jgc3421H5KR
mudKHMxFqHJV8LDmowfs/acbZp4/SItxhHFYyTr6717yW0QrPHTnj7JHwQdqzZq3
DZb3EoEmUVQK7GH29/Xi8orIlQ2NAgMBAAGjgfgwgfUwDgYDVR0PAQH/BAQDAgGG
MB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATASBgNVHRMBAf8ECDAGAQH/
AgEAMB0GA1UdDgQWBBS7vMNHpeS8qcbDpHIMEI2iNeHI6DAfBgNVHSMEGDAWgBR5
tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAKG
Fmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0gBAwwCjAIBgZngQwBAgEwJwYD
VR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVuY3Iub3JnLzANBgkqhkiG9w0B
AQsFAAOCAgEAkrHnQTfreZ2B5s3iJeE6IOmQRJWjgVzPw139vaBw1bGWKCIL0vIo
zwzn1OZDjCQiHcFCktEJr59L9MhwTyAWsVrdAfYf+B9haxQnsHKNY67u4s5Lzzfd
u6PUzeetUK29v+PsPmI2cJkxp+iN3epi4hKu9ZzUPSwMqtCceb7qPVxEbpYxY1p9
1n5PJKBLBX9eb9LU6l8zSxPWV7bK3lG4XaMJgnT9x3ies7msFtpKK5bDtotij/l0
GaKeA97pb5uwD9KgWvaFXMIEt8jVTjLEvwRdvCn294GPDF08U8lAkIv7tghluaQh
1QnlE4SEN4LOECj8dsIGJXpGUk3aU3KkJz9icKy+aUgA+2cP21uh6NcDIS3XyfaZ
QjmDQ993ChII8SXWupQZVBiIpcWO4RqZk3lr7Bz5MUCwzDIA359e57SSq5CCkY0N
4B6Vulk7LktfwrdGNVI5BsC9qqxSwSKgRJeZ9wygIaehbHFHFhcBaMDKpiZlBHyz
rsnnlFXCb5s8HKn5LsUgGvB24L7sGNZP2CX7dhHov+YhD+jozLW2p9W4959Bz2Ei
RmqDtmiXLnzqTpXbI+suyCsohKRg6Un0RC47+cpiVwHiXZAW+cn8eiNIjqbVgXLx
KPpdzvvtTnOPlC7SQZSYmdunr3Bf9b77AiC/ZidstK36dRILKz7OA54=
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDPucXU11L0RxI2
bPBceksI3+oYL2q9FSSsqTM6PmrURelI7+nmmgigle53lwPVv3v24Kd1beySyTeI
ceHn42yB1fhmPj3d7HQA0ktGqzFpN2nr5u+7R/Bf4nOBaMe/fhePTbhjYEAUsQd0
DIoab5jaqhPVDnTMK3S9kyHN2AY4GrdHEEQ5kD5X0TSeLcpqeBSb0EhLjWC3Pyhn
1Uh4meLH+dn+tCVr7JuZM1UB6JNhKVzwSYUSuw5JDjy9/N+zr5bLe9/JVRfeQ4RU
WhSnEHh6ZC+i7dGtANjTSgLYThjk6v5NxgU39YZWs1IbPr+lWeedX5DUU2cjRIG0
vgyqHCypAgMBAAECggEBAKxDpnEc5FlZ+xuRej9m14UTlCHcaMtHlnNtmeMKUjOZ
ip4G/9VSFid+TxVz8iU3uAkDQzxaHZ+ZKOmJb8uLSbfehzHbGhlJduYbf3uqir5z
yu5sRJDuVsRdmmZOS6BdZBJeZLRc5KeEK+csYvcLZxqnguzkIS4UN6rjMlxvcrDg
zqeJfRgk/ubYNoYIuUPOxMlnHZjSEPRdGnKaWDV/K78E6mPjeuPP0s5ELkWtBDtj
ChQipYujUbW4w9pITYzieQEkelJM+esUGtwabraf+VOF5GQ0InTN1NFURUCKcmzr
anErwgHmPLfaE2MgKSufAh+KpEU6ZkjJ8mckckcTtkUCgYEA/hkXW7IT5mYpiPkM
pg5UtK678KRyPr6s73M9PF8iEshXS9KinWcO5RW3M9G2xaFS0iUYgMwBjY2YrhSl
+m9ST3p87iU0m1rN61CawgX1SoDMd9u2K9W11rJT+onZ4jAOC9U0Bg1VhZjv2n2T
dreCDziWbpkIWEyCHiflf/DK0lcCgYEA0UfSXZ1m/dT+BJfYYqau5n5pVcOkfteH
NfAB0C0CXpZ731mwNoBPaXPk096QT8LYvpBUAtHHKTz/5WHvb0XwAAvzNoyS8hKo
M2OTtgL6bKXaGIb7Be5tus3+UxVVZiptm65T90rhRnoQOte5w1Albz0IKIx6C6T5
oClwwtG3mP8CgYAQVaKXxXHcDNM8t+3lOuSdHOJ+DMQ/XliVqA3WtLLnDDP4btj/
T2G4vlWhoiiiucUuNy5FEVhENkcLYc5ts/xRmakwUfn4xrSYHP1l3aYwHOmIBvrG
BJ4E6D/XykbUcIxmnFUU0oSd6v/4RrxVFGTq/5NEFthffMOclqn9OIiBTwKBgQCS
f/l2CPqQ0+nh4z3ZiR9EQNeR7vuWw19mVZWfWfKfri4Wot0kudtdUYCtA8731skN
VVFKC/mkF4x20YDf3xBrp/HgjLVM+dx+5MUBE8KkDdHHe637b/WmYA8ZsARxGWBT
K8yhfuyF/mqgFmV2oQMjhJDSecvxnNIV2QyThGVGlwKBgQCX3cnkVryXs8bcAnhs
Ez3wZRfNszVHmuyft+q2Pw4yhoYNhh7fT7mBXYOrerFhhKKy2sCFvTA6HvE7d6iy
hPY7mxGTJ1i1hAFGuJAETtJTWyPlsDPVkh5OPYUMxFgWxNxb6hekwObVg1/lm/AR
vULSW3E1BDCdBDNjBnLpXdeFUw==
-----END PRIVATE KEY-----
-85
View File
@@ -1,85 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFDDCCA/SgAwIBAgISBfhx6S4ttzFvAvm/oByFPOmNMA0GCSqGSIb3DQEBCwUA
MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
EwNSMTMwHhcNMjUxMjE4MDgwMTEwWhcNMjYwMzE4MDgwMTA5WjAfMR0wGwYDVQQD
ExR3aWtpLmd5b3phbWFuY2F2ZS5mcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
AQoCggEBAM48MuYB/2F0xQ2zk1K8/XNpLEOVPYXJTJ0qtoAwOxLTp3vkgc2OOPJr
zlm86L+vnVJknwLpHCVKDStWMsJ29O9w72gYPeUeAe/6Ne3xEsTtoXMMtqe3duCs
+TW3VtVPw2a6pLDl1WzIN2kR1Nmm+OXv9CY3dZYHB8JNTKNpS+DSe0EqIBcay+Bh
pnfjgiPtlyZyjxT9vGZ0YSAv0xWEm7pdckSduPdWcqKZIJpac9J1UN2namYuhbbp
+XEntjqMbSDiW6+kO/1Ouwn0aMUPu+6k6QnFBqaDVm/RodD1ukOQZJ7HcIa9XCuy
ts7ERjCRfbPRtHYkuJH13ayUup2/fS8CAwEAAaOCAiwwggIoMA4GA1UdDwEB/wQE
AwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIw
ADAdBgNVHQ4EFgQU3iGZPIfS2eqOmtYOroH44z7RCxIwHwYDVR0jBBgwFoAU56uf
DywzoFPTXk94yLKEDjvWkjMwMwYIKwYBBQUHAQEEJzAlMCMGCCsGAQUFBzAChhdo
dHRwOi8vcjEzLmkubGVuY3Iub3JnLzAfBgNVHREEGDAWghR3aWtpLmd5b3phbWFu
Y2F2ZS5mcjATBgNVHSAEDDAKMAgGBmeBDAECATAuBgNVHR8EJzAlMCOgIaAfhh1o
dHRwOi8vcjEzLmMubGVuY3Iub3JnLzE0LmNybDCCAQwGCisGAQQB1nkCBAIEgf0E
gfoA+AB2AA5XlLzzrqk+MxssmQez95Dfm8I9cTIl3SGpJaxhxU4hAAABmzCvt28A
AAQDAEcwRQIgBpmygYk4Z1fCtUVqjBz7ldtvif+EdJvvrSpwgYN23H4CIQCLN0sR
Eu3HJ9PFRc+FUm/X/uq5toOcMNvt1IihEC5rVAB+AOMjjfKNoojgquCs8PqQyYXw
tr/10qUnsAH8HERYxLboAAABmzCvulMACAAABQAseUL2BAMARzBFAiEAmJSN3NLq
xZnob4WyX4rRUcU/kQQXe3a0VGap3xFp2coCIAfjLE/gcsPZwkqnNcqfuNDYwGt3
cbkkhuXT8uHNvF9XMA0GCSqGSIb3DQEBCwUAA4IBAQA0CWA2b2RntCB2q1v6gOHz
c0uDLf5r/wc9WycoQJ29NWrcM1tzg4oOhri6YOWK8EXbimAS65IXoKn+gl5Ek9UP
0DfXh6gbkB2gJ8CaQ3YpcW93++gnlhHfYE39JuehacdmRLhmFao4FjhFTsrvelXu
oJuk5CFkA4Y8q5y2AWm4K1jgDdk3zxvH2vHxggK02AosZdDH8O8f2t+tsCBnmvSu
JvZsggV/V2HFqAU7JQspL83PmbNLwFh85S+yyhE1FTaQQJ1deSA4LQ7hUSLeN0Vs
jV3uRcAdqMo0F5SlvFdBZHQqY49ZJo5kStaOsKYhRnehq0rovo4z6QKLTgKzU8fx
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFBTCCAu2gAwIBAgIQWgDyEtjUtIDzkkFX6imDBTANBgkqhkiG9w0BAQsFADBP
MQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy
Y2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yNDAzMTMwMDAwMDBa
Fw0yNzAzMTIyMzU5NTlaMDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBF
bmNyeXB0MQwwCgYDVQQDEwNSMTMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQClZ3CN0FaBZBUXYc25BtStGZCMJlA3mBZjklTb2cyEBZPs0+wIG6BgUUNI
fSvHSJaetC3ancgnO1ehn6vw1g7UDjDKb5ux0daknTI+WE41b0VYaHEX/D7YXYKg
L7JRbLAaXbhZzjVlyIuhrxA3/+OcXcJJFzT/jCuLjfC8cSyTDB0FxLrHzarJXnzR
yQH3nAP2/Apd9Np75tt2QnDr9E0i2gB3b9bJXxf92nUupVcM9upctuBzpWjPoXTi
dYJ+EJ/B9aLrAek4sQpEzNPCifVJNYIKNLMc6YjCR06CDgo28EdPivEpBHXazeGa
XP9enZiVuppD0EqiFwUBBDDTMrOPAgMBAAGjgfgwgfUwDgYDVR0PAQH/BAQDAgGG
MB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATASBgNVHRMBAf8ECDAGAQH/
AgEAMB0GA1UdDgQWBBTnq58PLDOgU9NeT3jIsoQOO9aSMzAfBgNVHSMEGDAWgBR5
tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAKG
Fmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0gBAwwCjAIBgZngQwBAgEwJwYD
VR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVuY3Iub3JnLzANBgkqhkiG9w0B
AQsFAAOCAgEAUTdYUqEimzW7TbrOypLqCfL7VOwYf/Q79OH5cHLCZeggfQhDconl
k7Kgh8b0vi+/XuWu7CN8n/UPeg1vo3G+taXirrytthQinAHGwc/UdbOygJa9zuBc
VyqoH3CXTXDInT+8a+c3aEVMJ2St+pSn4ed+WkDp8ijsijvEyFwE47hulW0Ltzjg
9fOV5Pmrg/zxWbRuL+k0DBDHEJennCsAen7c35Pmx7jpmJ/HtgRhcnz0yjSBvyIw
6L1QIupkCv2SBODT/xDD3gfQQyKv6roV4G2EhfEyAsWpmojxjCUCGiyg97FvDtm/
NK2LSc9lybKxB73I2+P2G3CaWpvvpAiHCVu30jW8GCxKdfhsXtnIy2imskQqVZ2m
0Pmxobb28Tucr7xBK7CtwvPrb79os7u2XP3O5f9b/H66GNyRrglRXlrYjI1oGYL/
f4I1n/Sgusda6WvA6C190kxjU15Y12mHU4+BxyR9cx2hhGS9fAjMZKJss28qxvz6
Axu4CaDmRNZpK/pQrXF17yXCXkmEWgvSOEZy6Z9pcbLIVEGckV/iVeq0AOo2pkg9
p4QRIy0tK2diRENLSF2KysFwbY6B26BFeFs3v1sYVRhFW9nLkOrQVporCS0KyZmf
wVD89qSTlnctLcZnIavjKsKUu1nA1iU0yYMdYepKR7lWbnwhdx3ewok=
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAzjwy5gH/YXTFDbOTUrz9c2ksQ5U9hclMnSq2gDA7EtOne+SB
zY448mvOWbzov6+dUmSfAukcJUoNK1Yywnb073DvaBg95R4B7/o17fESxO2hcwy2
p7d24Kz5NbdW1U/DZrqksOXVbMg3aRHU2ab45e/0Jjd1lgcHwk1Mo2lL4NJ7QSog
FxrL4GGmd+OCI+2XJnKPFP28ZnRhIC/TFYSbul1yRJ2491Zyopkgmlpz0nVQ3adq
Zi6Ftun5cSe2OoxtIOJbr6Q7/U67CfRoxQ+77qTpCcUGpoNWb9Gh0PW6Q5Bknsdw
hr1cK7K2zsRGMJF9s9G0diS4kfXdrJS6nb99LwIDAQABAoIBAC/aqhjS59ZOSRcn
zwyIy+rGwb2g2Ji9n+hsK9LM3jg9IoTN/gybbr1ZpJUQD5XDAydGL9t2CdDhQPMI
WljjT2xr8TFfRqVudBaiIXdn0+ocFbVjgtKh8JSrrlv3gc+XZYjl0Cc3/XDzeGAK
AjDK3MBGEIn5nnBEi1lbpGfam/+7jIb4TiApckJZO2Kep1Z5UZSQZHhlAqWE+oau
F28Nyj3/lyu7rNXT2vrwiZmxA5ehuYn06B61NJtk8rPevTOPx+cRQs1mLee8ACnu
rtkrQZ8Q/0+tCMgN9esEp7ucmn/QxGH9081PJ506Irt5BVViB3yCetfQBo+2WyhZ
FG0uqUECgYEA9DsuEcXSYtEfeCFN27c11+4FmHaDW+1waLACPVEn4KclFALtsyj0
Ae9RyQvMms5j5iK9TDgCE9lNBTO6jekl6lDNb+qNo1Bk5YMi/Hli7SxFe2PH+TTN
OTtMAdgldzQeF9MGvU3pyb00sI6/6it38430gVN8LyyP/hT3l8xE/qECgYEA2CxN
aiy50PtEk3Klk3vf3L/1n8HjsR3/nA6Yg9G1RkPbgc4n8OgC+dHOtvyoQYvdjCKF
wAyVZtQ+bXNJ9KX1relL/QOT46yHHoEyrcRTOACQtoNSG9pXWp4DYbbIlWgtBfYF
L4qXdTNkHfWdBEFx3yb+FpAEOiT1Gi5G+0lr+c8CgYEAn5Hm+L+6RMwDdpaz6wEa
Edm3GDUegDpzPkL5Q5y5pEMwq5F6QptYScdWNTgbV23PwXYjHiBd4yAP/X0dv0h8
eEqQ3zVtky2croPuoOyiYPmS8BpydnU0PNdsQqw5Vlfb7Y74EUlNnXycZ1rtMw9x
kNTH0pN8SMohzk1es3RIA+ECgYBUJdKwvN5MKjNEjkFDytmWjaaoXIosfPfuIIRf
87bztiBxQ/WqQjY+Vtx3wJwif7ZrAVk9K+jQUVhHtLQaJqwe2Yy53bWoz5T9W9+F
YsHeL+IlGbNRokmUvaOlWshz2EyGYIEeQ323opybSOupJ2yTKBOKZt8uXwqF+XOq
B6efYwKBgGzTwn55LqQbH8KdURONlzz5f9u9T3R9MI9Gw1/IjdHWIRYcAIZUXERm
3WdSSeMZhXKtp4ZGa2TZ14aYXLl1CeKa+10JK9ouwnyeiNq1KWEejTQM+j03ebkx
SAg+H+rc65KKW6zoZQMX4idb+a4IohOkTo9uGnXKQlteCzr37FW3
-----END RSA PRIVATE KEY-----
+16
View File
@@ -0,0 +1,16 @@
{
"extends": "expo/tsconfig.base",
"compilerOptions": {
"strict": true,
"paths": {
"@/*": [
"./src/*"
]
}
},
"include": [
"**/*.ts",
"**/*.tsx",
".expo/types/**/*.d.ts"
]
}