Compare commits

..

8 Commits

Author SHA1 Message Date
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
100 changed files with 13735 additions and 4653 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;
+123
View File
@@ -0,0 +1,123 @@
import React, { useEffect, useState } from 'react';
import { View } from 'react-native';
import { Stack, useRouter, useSegments } from 'expo-router';
import { PaperProvider, MD3DarkTheme, ActivityIndicator, Snackbar } from 'react-native-paper';
import { SafeAreaProvider } from 'react-native-safe-area-context';
import { GestureHandlerRootView } from 'react-native-gesture-handler';
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, loadConfig } = 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);
});
}, []);
/** Charge la configuration depuis le secure store puis marque l'app comme prête */
useEffect(() => {
loadConfig().finally(() => setIsReady(true));
}, []);
/**
* Gère la redirection initiale selon l'état de configuration.
* - Pas configuré et hors /setup → redirige vers /setup
* - Configuré et dans /setup → redirige vers les tabs
*/
useEffect(() => {
if (!isReady) return;
const inSetup = segments[0] === 'setup';
if (!config.isConfigured && !inSetup) {
router.replace('/setup');
} else if (config.isConfigured && inSetup) {
router.replace('/(tabs)');
}
}, [isReady, config.isConfigured, segments]);
if (!isReady) {
return (
<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center', backgroundColor: '#121212' }}>
<ActivityIndicator color="#FF6D3E" size="large" />
</View>
);
}
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
-359
View File
@@ -1,359 +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 gitea-ssh
bind *:2222
mode tcp
option tcplog
default_backend gitea-ssh-backend
backend gitea-ssh-backend
mode tcp
server gitea 192.168.1.70:12222 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 %[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 }
acl homegit-host hdr(host) -i homegit.gyozamancave.fr
# 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 401 default-errorfiles if { status 401 } !{ req.hdr(host) -i homegit.gyozamancave.fr }
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 }
http-response add-header WWW-Authenticate "Basic realm=\"Gitea\"" if { status 401 } homegit-host
http-response return status 401 default-errorfiles if { status 401 } !homegit-host
# 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
# 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 boudoir-host hdr(host) -i ledigitalboudoir.com
acl host_temples hdr(host) -i temples.mrteddybear.fr
acl is_temples_api path_beg /api
acl nextcloud_wellknown path_beg /.well-known/caldav /.well-known/carddav
http-request redirect location https://nextcloud.gyozamancave.fr/remote.php/dav/ code 301 if nextcloud_wellknown
acl nc_webfinger path -i /.well-known/webfinger
acl nc_nodeinfo path -i /.well-known/nodeinfo
http-request redirect code 301 location https://nextcloud.gyozamancave.fr/index.php/.well-known/webfinger/ if nextcloud-host nc_webfinger
http-request redirect code 301 location https://nextcloud.gyozamancave.fr/index.php/.well-known/nodeinfo/ if nextcloud-host nc_nodeinfo
use_backend temples_api if host_temples is_temples_api
use_backend temples_web if host_temples
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-backend if boudoir-host
backend temples_api
mode http
option forwardfor
option http-server-close
balance roundrobin
option httpchk GET /api/healthz
http-check expect string ok
server api 192.168.1.12:3000 check inter 10s rise 2 fall 3
backend temples_web
mode http
option forwardfor
option http-server-close
balance roundrobin
option httpchk GET /
http-check expect status 200
server web 192.168.1.12:3001 check inter 10s rise 2 fall 3
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 homegit-backend
# mode http
# S'assurer que le header n'est pas supprimé
http-response add-header WWW-Authenticate "Basic\ realm=\"Gitea\"" if { status 401 }
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 n8n-backend
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)]
option forwardfor
server n8n 192.168.1.56:5678
backend links-mtb
mode http
server links 192.168.1.18:32508 check ssl verify none
backend hass-backend
server hass 192.168.1.18:30250
mode http
backend cms
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
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
backend wiki
#server wiki 192.168.1.18:32149
server wiki 192.168.1.18:30347
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:30101
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
server funkwhale 192.168.1.108:5002
backend per_ip_rates
# 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_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>
-990
View File
@@ -1,990 +0,0 @@
#!/bin/sh
is_alpine() {
[ -f /etc/alpine-release ]
}
is_openwrt() {
grep -qi "OpenWrt" /etc/os-release
}
is_freebsd() {
[ "$(uname -s)" = "FreeBSD" ]
}
# If SELinux is enabled, set the context of the binary
set_selinux_context() {
# Check if SELinux is enabled and in enforcing or permissive mode
if command -v getenforce >/dev/null 2>&1; then
SELINUX_MODE=$(getenforce)
if [ "$SELINUX_MODE" != "Disabled" ]; then
echo "SELinux is enabled (${SELINUX_MODE} mode). Setting appropriate context..."
# First try to set persistent context if semanage is available
if command -v semanage >/dev/null 2>&1; then
echo "Attempting to set persistent SELinux context..."
if semanage fcontext -a -t bin_t "$BIN_PATH" >/dev/null 2>&1; then
restorecon -v "$BIN_PATH" >/dev/null 2>&1
else
echo "Warning: Failed to set persistent context, falling back to temporary context."
fi
fi
# Fall back to chcon if semanage failed or isn't available
if command -v chcon >/dev/null 2>&1; then
# Set context for both the directory and binary
chcon -t bin_t "$BIN_PATH" || echo "Warning: Failed to set SELinux context for binary."
chcon -R -t bin_t "$AGENT_DIR" || echo "Warning: Failed to set SELinux context for directory."
else
if [ "$SELINUX_MODE" = "Enforcing" ]; then
echo "Warning: SELinux is in enforcing mode but chcon command not found. The service may fail to start."
echo "Consider installing the policycoreutils package or temporarily setting SELinux to permissive mode."
else
echo "Warning: SELinux is in permissive mode but chcon command not found."
fi
fi
fi
fi
}
# Clean up SELinux contexts if they were set
cleanup_selinux_context() {
if command -v getenforce >/dev/null 2>&1 && [ "$(getenforce)" != "Disabled" ]; then
echo "Cleaning up SELinux contexts..."
# Remove persistent context if semanage is available
if command -v semanage >/dev/null 2>&1; then
semanage fcontext -d "$BIN_PATH" 2>/dev/null || true
fi
fi
}
# Ensure the proxy URL ends with a /
ensure_trailing_slash() {
if [ -n "$1" ]; then
case "$1" in
*/) echo "$1" ;;
*) echo "$1/" ;;
esac
else
echo "$1"
fi
}
# Generate FreeBSD rc service content
generate_freebsd_rc_service() {
cat <<'EOF'
#!/bin/sh
# PROVIDE: beszel_agent
# REQUIRE: DAEMON NETWORKING
# BEFORE: LOGIN
# KEYWORD: shutdown
# Add the following lines to /etc/rc.conf to configure Beszel Agent:
#
# beszel_agent_enable (bool): Set to YES to enable Beszel Agent
# Default: YES
# beszel_agent_env_file (str): Beszel Agent env configuration file
# Default: /usr/local/etc/beszel-agent/env
# beszel_agent_user (str): Beszel Agent daemon user
# Default: beszel
# beszel_agent_bin (str): Path to the beszel-agent binary
# Default: /usr/local/sbin/beszel-agent
# beszel_agent_flags (str): Extra flags passed to beszel-agent command invocation
# Default:
. /etc/rc.subr
name="beszel_agent"
rcvar=beszel_agent_enable
load_rc_config $name
: ${beszel_agent_enable:="YES"}
: ${beszel_agent_user:="beszel"}
: ${beszel_agent_flags:=""}
: ${beszel_agent_env_file:="/usr/local/etc/beszel-agent/env"}
: ${beszel_agent_bin:="/usr/local/sbin/beszel-agent"}
logfile="/var/log/${name}.log"
pidfile="/var/run/${name}.pid"
procname="/usr/sbin/daemon"
start_precmd="${name}_prestart"
start_cmd="${name}_start"
stop_cmd="${name}_stop"
extra_commands="upgrade"
upgrade_cmd="beszel_agent_upgrade"
beszel_agent_prestart()
{
if [ ! -f "${beszel_agent_env_file}" ]; then
echo WARNING: missing "${beszel_agent_env_file}" env file. Start aborted.
exit 1
fi
}
beszel_agent_start()
{
echo "Starting ${name}"
/usr/sbin/daemon -fc \
-P "${pidfile}" \
-o "${logfile}" \
-u "${beszel_agent_user}" \
"${beszel_agent_bin}" ${beszel_agent_flags}
}
beszel_agent_stop()
{
pid="$(check_pidfile "${pidfile}" "${procname}")"
if [ -n "${pid}" ]; then
echo "Stopping ${name} (pid=${pid})"
kill -- "-${pid}"
wait_for_pids "${pid}"
else
echo "${name} isn't running"
fi
}
beszel_agent_upgrade()
{
echo "Upgrading ${name}"
if command -v sudo >/dev/null; then
sudo -u "${beszel_agent_user}" -- "${beszel_agent_bin}" update
else
su -m "${beszel_agent_user}" -c "${beszel_agent_bin} update"
fi
}
run_rc_command "$1"
EOF
}
# Detect system architecture
detect_architecture() {
local arch=$(uname -m)
if [ "$arch" = "mips" ]; then
detect_mips_endianness
return $?
fi
case "$arch" in
x86_64)
arch="amd64"
;;
armv6l|armv7l)
arch="arm"
;;
aarch64)
arch="arm64"
;;
esac
echo "$arch"
}
# Detect MIPS endianness using ELF header
detect_mips_endianness() {
local bins="/bin/sh /bin/ls /usr/bin/env"
local bin_to_check endian
for bin_to_check in $bins; do
if [ -f "$bin_to_check" ]; then
# The 6th byte in ELF header: 01 = little, 02 = big
endian=$(hexdump -n 1 -s 5 -e '1/1 "%02x"' "$bin_to_check" 2>/dev/null)
if [ "$endian" = "01" ]; then
echo "mipsle"
return
elif [ "$endian" = "02" ]; then
echo "mips"
return
fi
fi
done
# Final fallback
echo "mips"
}
# Default values
PORT=45876
UNINSTALL=false
GITHUB_URL="https://github.com"
GITHUB_PROXY_URL=""
KEY=""
TOKEN=""
HUB_URL=""
AUTO_UPDATE_FLAG="" # empty string means prompt, "true" means auto-enable, "false" means skip
VERSION="latest"
# Check for help flag
case "$1" in
-h | --help)
printf "Beszel Agent installation script\n\n"
printf "Usage: ./install-agent.sh [options]\n\n"
printf "Options: \n"
printf " -k : SSH key (required, or interactive if not provided)\n"
printf " -p : Port (default: $PORT)\n"
printf " -t : Token (optional for backwards compatibility)\n"
printf " -url : Hub URL (optional for backwards compatibility)\n"
printf " -v, --version : Version to install (default: latest)\n"
printf " -u : Uninstall Beszel Agent\n"
printf " --auto-update [VALUE] : Control automatic daily updates\n"
printf " VALUE can be true (enable) or false (disable). If not specified, will prompt.\n"
printf " --mirror [URL] : Use GitHub proxy to resolve network timeout issues in mainland China\n"
printf " URL: optional custom proxy URL (default: https://gh.beszel.dev)\n"
printf " -h, --help : Display this help message\n"
exit 0
;;
esac
# Build sudo args by properly quoting everything
build_sudo_args() {
QUOTED_ARGS=""
while [ $# -gt 0 ]; do
if [ -n "$QUOTED_ARGS" ]; then
QUOTED_ARGS="$QUOTED_ARGS "
fi
QUOTED_ARGS="$QUOTED_ARGS'$(echo "$1" | sed "s/'/'\\\\''/g")'"
shift
done
echo "$QUOTED_ARGS"
}
# Check if running as root and re-execute with sudo if needed
if [ "$(id -u)" != "0" ]; then
if command -v sudo >/dev/null 2>&1; then
SUDO_ARGS=$(build_sudo_args "$@")
eval "exec sudo $0 $SUDO_ARGS"
else
echo "This script must be run as root. Please either:"
echo "1. Run this script as root (su root)"
echo "2. Install sudo and run with sudo"
exit 1
fi
fi
# Parse arguments
while [ $# -gt 0 ]; do
case "$1" in
-k)
shift
KEY="$1"
;;
-p)
shift
PORT="$1"
;;
-t)
shift
TOKEN="$1"
;;
-url)
shift
HUB_URL="$1"
;;
-v | --version)
shift
VERSION="$1"
;;
-u)
UNINSTALL=true
;;
--mirror* | --china-mirrors*)
# Check if there's a value after the = sign
if echo "$1" | grep -q "="; then
# Extract the value after =
CUSTOM_PROXY=$(echo "$1" | cut -d'=' -f2)
if [ -n "$CUSTOM_PROXY" ]; then
GITHUB_PROXY_URL="$CUSTOM_PROXY"
GITHUB_URL="$(ensure_trailing_slash "$CUSTOM_PROXY")https://github.com"
else
GITHUB_PROXY_URL="https://gh.beszel.dev"
GITHUB_URL="$GITHUB_PROXY_URL"
fi
elif [ "$2" != "" ] && ! echo "$2" | grep -q '^-'; then
# use custom proxy URL provided as next argument
GITHUB_PROXY_URL="$2"
GITHUB_URL="$(ensure_trailing_slash "$2")https://github.com"
shift
else
# No value specified, use default
GITHUB_PROXY_URL="https://gh.beszel.dev"
GITHUB_URL="$GITHUB_PROXY_URL"
fi
;;
--auto-update*)
# Check if there's a value after the = sign
if echo "$1" | grep -q "="; then
# Extract the value after =
AUTO_UPDATE_VALUE=$(echo "$1" | cut -d'=' -f2)
if [ "$AUTO_UPDATE_VALUE" = "true" ]; then
AUTO_UPDATE_FLAG="true"
elif [ "$AUTO_UPDATE_VALUE" = "false" ]; then
AUTO_UPDATE_FLAG="false"
else
echo "Invalid value for --auto-update flag: $AUTO_UPDATE_VALUE. Using default (prompt)."
fi
elif [ "$2" = "true" ] || [ "$2" = "false" ]; then
# Value provided as next argument
AUTO_UPDATE_FLAG="$2"
shift
else
# No value specified, use true
AUTO_UPDATE_FLAG="true"
fi
;;
*)
echo "Invalid option: $1" >&2
exit 1
;;
esac
shift
done
# Set paths based on operating system
if is_freebsd; then
AGENT_DIR="/usr/local/etc/beszel-agent"
BIN_DIR="/usr/local/sbin"
BIN_PATH="/usr/local/sbin/beszel-agent"
else
AGENT_DIR="/opt/beszel-agent"
BIN_DIR="/opt/beszel-agent"
BIN_PATH="/opt/beszel-agent/beszel-agent"
fi
# Uninstall process
if [ "$UNINSTALL" = true ]; then
# Clean up SELinux contexts before removing files
cleanup_selinux_context
if is_alpine; then
echo "Stopping and disabling the agent service..."
rc-service beszel-agent stop
rc-update del beszel-agent default
echo "Removing the OpenRC service files..."
rm -f /etc/init.d/beszel-agent
# Remove the daily update cron job if it exists
echo "Removing the daily update cron job..."
if crontab -u root -l 2>/dev/null | grep -q "beszel-agent.*update"; then
crontab -u root -l 2>/dev/null | grep -v "beszel-agent.*update" | crontab -u root -
fi
# Remove log files
echo "Removing log files..."
rm -f /var/log/beszel-agent.log /var/log/beszel-agent.err
elif is_openwrt; then
echo "Stopping and disabling the agent service..."
/etc/init.d/beszel-agent stop
/etc/init.d/beszel-agent disable
echo "Removing the OpenWRT service files..."
rm -f /etc/init.d/beszel-agent
# Remove the update service if it exists
echo "Removing the daily update service..."
# Remove legacy beszel account based crontab file
rm -f /etc/crontabs/beszel
# Install root crontab job
if crontab -u root -l 2>/dev/null | grep -q "beszel-agent.*update"; then
crontab -u root -l 2>/dev/null | grep -v "beszel-agent.*update" | crontab -u root -
fi
elif is_freebsd; then
echo "Stopping and disabling the agent service..."
service beszel-agent stop
sysrc beszel_agent_enable="NO"
echo "Removing the FreeBSD service files..."
rm -f /usr/local/etc/rc.d/beszel-agent
# Remove the daily update cron job if it exists
echo "Removing the daily update cron job..."
rm -f /etc/cron.d/beszel-agent
# Remove log files
echo "Removing log files..."
rm -f /var/log/beszel-agent.log
# Remove env file and directories
echo "Removing environment configuration file..."
rm -f "$AGENT_DIR/env"
rm -f "$BIN_PATH"
rmdir "$AGENT_DIR" 2>/dev/null || true
else
echo "Stopping and disabling the agent service..."
systemctl stop beszel-agent.service
systemctl disable beszel-agent.service
echo "Removing the systemd service file..."
rm /etc/systemd/system/beszel-agent.service
# Remove the update timer and service if they exist
echo "Removing the daily update service and timer..."
systemctl stop beszel-agent-update.timer 2>/dev/null
systemctl disable beszel-agent-update.timer 2>/dev/null
rm -f /etc/systemd/system/beszel-agent-update.service
rm -f /etc/systemd/system/beszel-agent-update.timer
systemctl daemon-reload
fi
echo "Removing the Beszel Agent directory..."
rm -rf "$AGENT_DIR"
echo "Removing the dedicated user for the agent service..."
killall beszel-agent 2>/dev/null
if is_alpine || is_openwrt; then
deluser beszel 2>/dev/null
elif is_freebsd; then
pw user del beszel 2>/dev/null
else
userdel beszel 2>/dev/null
fi
echo "Beszel Agent has been uninstalled successfully!"
exit 0
fi
# Check if a package is installed
package_installed() {
command -v "$1" >/dev/null 2>&1
}
# Check for package manager and install necessary packages if not installed
if package_installed apk; then
if ! package_installed tar || ! package_installed curl || ! package_installed sha256sum; then
apk update
apk add tar curl coreutils shadow
fi
elif package_installed opkg; then
if ! package_installed tar || ! package_installed curl || ! package_installed sha256sum; then
opkg update
opkg install tar curl coreutils
fi
elif package_installed pkg && is_freebsd; then
if ! package_installed tar || ! package_installed curl || ! package_installed sha256sum; then
pkg update
pkg install -y gtar curl coreutils
fi
elif package_installed apt-get; then
if ! package_installed tar || ! package_installed curl || ! package_installed sha256sum; then
apt-get update
apt-get install -y tar curl coreutils
fi
elif package_installed yum; then
if ! package_installed tar || ! package_installed curl || ! package_installed sha256sum; then
yum install -y tar curl coreutils
fi
elif package_installed pacman; then
if ! package_installed tar || ! package_installed curl || ! package_installed sha256sum; then
pacman -Sy --noconfirm tar curl coreutils
fi
else
echo "Warning: Please ensure 'tar' and 'curl' and 'sha256sum (coreutils)' are installed."
fi
# If no SSH key is provided, ask for the SSH key interactively
if [ -z "$KEY" ]; then
printf "Enter your SSH key: "
read KEY
fi
# Remove newlines from KEY
KEY=$(echo "$KEY" | tr -d '\n')
# TOKEN and HUB_URL are optional for backwards compatibility - no interactive prompts
# They will be set as empty environment variables if not provided
# Verify checksum
if command -v sha256sum >/dev/null; then
CHECK_CMD="sha256sum"
elif command -v sha256 >/dev/null; then
# FreeBSD uses 'sha256' instead of 'sha256sum', with different output format
CHECK_CMD="sha256 -q"
else
echo "No SHA256 checksum utility found"
exit 1
fi
# Create a dedicated user for the service if it doesn't exist
echo "Creating a dedicated user for the Beszel Agent service..."
if is_alpine; then
if ! id -u beszel >/dev/null 2>&1; then
addgroup beszel
adduser -S -D -H -s /sbin/nologin -G beszel beszel
fi
# Add the user to the docker group to allow access to the Docker socket if group docker exists
if getent group docker; then
echo "Adding beszel to docker group"
usermod -aG docker beszel
fi
elif is_openwrt; then
# Create beszel group first if it doesn't exist (check /etc/group directly)
if ! grep -q "^beszel:" /etc/group >/dev/null 2>&1; then
echo "beszel:x:999:" >> /etc/group
fi
# Create beszel user if it doesn't exist (double-check to prevent duplicates)
if ! id -u beszel >/dev/null 2>&1 && ! grep -q "^beszel:" /etc/passwd >/dev/null 2>&1; then
echo "beszel:x:999:999::/nonexistent:/bin/false" >> /etc/passwd
fi
# Add the user to the docker group if docker group exists and user is not already in it
if grep -q "^docker:" /etc/group >/dev/null 2>&1; then
echo "Adding beszel to docker group"
# Check if beszel is already in docker group
if ! grep "^docker:" /etc/group | grep -q "beszel"; then
# Add beszel to docker group by modifying /etc/group
# Handle both cases: group with existing members and group without members
if grep "^docker:" /etc/group | grep -q ":.*:.*$"; then
# Group has existing members, append with comma
sed -i 's/^docker:\([^:]*:[^:]*:\)\(.*\)$/docker:\1\2,beszel/' /etc/group
else
# Group has no members, just append
sed -i 's/^docker:\([^:]*:[^:]*:\)$/docker:\1beszel/' /etc/group
fi
fi
fi
elif is_freebsd; then
if ! id -u beszel >/dev/null 2>&1; then
pw user add beszel -d /nonexistent -s /usr/sbin/nologin -c "beszel user"
fi
# Add the user to the wheel group to allow self-updates
if pw group show wheel >/dev/null 2>&1; then
echo "Adding beszel to wheel group for self-updates"
pw group mod wheel -m beszel
fi
else
if ! id -u beszel >/dev/null 2>&1; then
useradd --system --home-dir /nonexistent --shell /bin/false beszel
fi
# Add the user to the docker group to allow access to the Docker socket if group docker exists
if getent group docker; then
echo "Adding beszel to docker group"
usermod -aG docker beszel
fi
# Add the user to the disk group to allow access to disk devices if group disk exists
if getent group disk; then
echo "Adding beszel to disk group"
usermod -aG disk beszel
fi
fi
# Create the directory for the Beszel Agent
if [ ! -d "$AGENT_DIR" ]; then
echo "Creating the directory for the Beszel Agent..."
mkdir -p "$AGENT_DIR"
chown beszel:beszel "$AGENT_DIR"
chmod 755 "$AGENT_DIR"
fi
if [ ! -d "$BIN_DIR" ]; then
mkdir -p "$BIN_DIR"
fi
# Download and install the Beszel Agent
echo "Downloading and installing the agent..."
OS=$(uname -s | sed -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/')
ARCH=$(detect_architecture)
FILE_NAME="beszel-agent_${OS}_${ARCH}.tar.gz"
# Determine version to install
if [ "$VERSION" = "latest" ]; then
INSTALL_VERSION=$(curl -s "https://get.beszel.dev/latest-version")
if [ -z "$INSTALL_VERSION" ]; then
# Fallback to GitHub API
API_RELEASE_URL="https://api.github.com/repos/henrygd/beszel/releases/latest"
INSTALL_VERSION=$(curl -s "$API_RELEASE_URL" | grep -o '"tag_name": "v[^"]*"' | cut -d'"' -f4 | tr -d 'v')
fi
if [ -z "$INSTALL_VERSION" ]; then
echo "Failed to get latest version"
exit 1
fi
else
INSTALL_VERSION="$VERSION"
# Remove 'v' prefix if present
INSTALL_VERSION=$(echo "$INSTALL_VERSION" | sed 's/^v//')
fi
echo "Downloading and installing agent version ${INSTALL_VERSION} from ${GITHUB_URL} ..."
# Download checksums file
TEMP_DIR=$(mktemp -d)
cd "$TEMP_DIR" || exit 1
CHECKSUM=$(curl -sL "$GITHUB_URL/henrygd/beszel/releases/download/v${INSTALL_VERSION}/beszel_${INSTALL_VERSION}_checksums.txt" | grep "$FILE_NAME" | cut -d' ' -f1)
if [ -z "$CHECKSUM" ] || ! echo "$CHECKSUM" | grep -qE "^[a-fA-F0-9]{64}$"; then
echo "Failed to get checksum or invalid checksum format"
exit 1
fi
if ! curl -#L "$GITHUB_URL/henrygd/beszel/releases/download/v${INSTALL_VERSION}/$FILE_NAME" -o "$FILE_NAME"; then
echo "Failed to download the agent from ""$GITHUB_URL/henrygd/beszel/releases/download/v${INSTALL_VERSION}/$FILE_NAME"
rm -rf "$TEMP_DIR"
exit 1
fi
if [ "$($CHECK_CMD "$FILE_NAME" | cut -d' ' -f1)" != "$CHECKSUM" ]; then
echo "Checksum verification failed: $($CHECK_CMD "$FILE_NAME" | cut -d' ' -f1) & $CHECKSUM"
rm -rf "$TEMP_DIR"
exit 1
fi
if ! tar -xzf "$FILE_NAME" beszel-agent; then
echo "Failed to extract the agent"
rm -rf "$TEMP_DIR"
exit 1
fi
mv beszel-agent "$BIN_PATH"
chown beszel:beszel "$BIN_PATH"
chmod 755 "$BIN_PATH"
# Set SELinux context if needed
set_selinux_context
# Cleanup
rm -rf "$TEMP_DIR"
# Make sure /etc/machine-id exists for persistent fingerprint
if [ ! -f /etc/machine-id ]; then
cat /proc/sys/kernel/random/uuid | tr -d '-' > /etc/machine-id
fi
# Check for NVIDIA GPUs and grant device permissions for systemd service
detect_nvidia_devices() {
local devices=""
for i in /dev/nvidia*; do
if [ -e "$i" ]; then
devices="${devices}DeviceAllow=$i rw\n"
fi
done
echo "$devices"
}
# Modify service installation part, add Alpine check before systemd service creation
if is_alpine; then
echo "Creating OpenRC service for Alpine Linux..."
cat >/etc/init.d/beszel-agent <<EOF
#!/sbin/openrc-run
name="beszel-agent"
description="Beszel Agent Service"
command="$BIN_PATH"
command_user="beszel"
command_background="yes"
pidfile="/run/\${RC_SVCNAME}.pid"
output_log="/var/log/beszel-agent.log"
error_log="/var/log/beszel-agent.err"
start_pre() {
checkpath -f -m 0644 -o beszel:beszel "\$output_log" "\$error_log"
}
export PORT="$PORT"
export KEY="$KEY"
export TOKEN="$TOKEN"
export HUB_URL="$HUB_URL"
depend() {
need net
after firewall
}
EOF
chmod +x /etc/init.d/beszel-agent
rc-update add beszel-agent default
# Create log files with proper permissions
touch /var/log/beszel-agent.log /var/log/beszel-agent.err
chown beszel:beszel /var/log/beszel-agent.log /var/log/beszel-agent.err
# Start the service
rc-service beszel-agent restart
# Check if service started successfully
sleep 2
if ! rc-service beszel-agent status | grep -q "started"; then
echo "Error: The Beszel Agent service failed to start. Checking logs..."
tail -n 20 /var/log/beszel-agent.err
exit 1
fi
# Auto-update service for Alpine
if [ "$AUTO_UPDATE_FLAG" = "true" ]; then
AUTO_UPDATE="y"
elif [ "$AUTO_UPDATE_FLAG" = "false" ]; then
AUTO_UPDATE="n"
else
printf "\nEnable automatic daily updates for beszel-agent? (y/n): "
read AUTO_UPDATE
fi
case "$AUTO_UPDATE" in
[Yy]*)
echo "Setting up daily automatic updates for beszel-agent..."
# Create cron job to run beszel-agent update command daily at midnight
if ! crontab -u root -l 2>/dev/null | grep -q "beszel-agent.*update"; then
(crontab -u root -l 2>/dev/null; echo "12 0 * * * $BIN_PATH update >/dev/null 2>&1") | crontab -u root -
fi
printf "\nDaily updates have been enabled via cron job.\n"
;;
esac
# Check service status
if ! rc-service beszel-agent status >/dev/null 2>&1; then
echo "Error: The Beszel Agent service is not running."
rc-service beszel-agent status
exit 1
fi
elif is_openwrt; then
echo "Creating procd init script service for OpenWRT..."
cat >/etc/init.d/beszel-agent <<EOF
#!/bin/sh /etc/rc.common
USE_PROCD=1
START=99
start_service() {
procd_open_instance
procd_set_param command $BIN_PATH
procd_set_param user beszel
procd_set_param pidfile /var/run/beszel-agent.pid
procd_set_param env PORT="$PORT" KEY="$KEY" TOKEN="$TOKEN" HUB_URL="$HUB_URL"
procd_set_param respawn
procd_set_param stdout 1
procd_set_param stderr 1
procd_close_instance
}
# Extra command to trigger agent update
EXTRA_COMMANDS="update restart"
EXTRA_HELP=" update Update the Beszel agent
restart Restart the Beszel agent"
update() {
$BIN_PATH update
}
EOF
# Enable the service
chmod +x /etc/init.d/beszel-agent
/etc/init.d/beszel-agent enable
# Start the service
/etc/init.d/beszel-agent restart
# Auto-update service for OpenWRT using a crontab job
if [ "$AUTO_UPDATE_FLAG" = "true" ]; then
AUTO_UPDATE="y"
sleep 1 # give time for the service to start
elif [ "$AUTO_UPDATE_FLAG" = "false" ]; then
AUTO_UPDATE="n"
sleep 1 # give time for the service to start
else
printf "\nEnable automatic daily updates for beszel-agent? (y/n): "
read AUTO_UPDATE
fi
case "$AUTO_UPDATE" in
[Yy]*)
echo "Setting up daily automatic updates for beszel-agent..."
if ! crontab -u root -l 2>/dev/null | grep -q "beszel-agent.*update"; then
(crontab -u root -l 2>/dev/null; echo "12 0 * * * /etc/init.d/beszel-agent update") | crontab -u root -
fi
/etc/init.d/cron restart
printf "\nDaily updates have been enabled.\n"
;;
esac
# Check service status
if ! /etc/init.d/beszel-agent running >/dev/null 2>&1; then
echo "Error: The Beszel Agent service is not running."
/etc/init.d/beszel-agent status
exit 1
fi
elif is_freebsd; then
echo "Creating FreeBSD rc service..."
# Create environment configuration file with proper permissions
echo "Creating environment configuration file..."
cat >"$AGENT_DIR/env" <<EOF
LISTEN=$PORT
KEY="$KEY"
TOKEN=$TOKEN
HUB_URL=$HUB_URL
EOF
chmod 640 "$AGENT_DIR/env"
chown root:beszel "$AGENT_DIR/env"
# Create the rc service file
generate_freebsd_rc_service > /usr/local/etc/rc.d/beszel-agent
# Set proper permissions for the rc script
chmod 755 /usr/local/etc/rc.d/beszel-agent
# Enable and start the service
echo "Enabling and starting the agent service..."
sysrc beszel_agent_enable="YES"
service beszel-agent restart
# Check if service started successfully
sleep 2
if ! service beszel-agent status | grep -q "is running"; then
echo "Error: The Beszel Agent service failed to start. Checking logs..."
tail -n 20 /var/log/beszel_agent.log
exit 1
fi
# Auto-update service for FreeBSD
if [ "$AUTO_UPDATE_FLAG" = "true" ]; then
AUTO_UPDATE="y"
elif [ "$AUTO_UPDATE_FLAG" = "false" ]; then
AUTO_UPDATE="n"
else
printf "\nEnable automatic daily updates for beszel-agent? (y/n): "
read AUTO_UPDATE
fi
case "$AUTO_UPDATE" in
[Yy]*)
echo "Setting up daily automatic updates for beszel-agent..."
# Create cron job in /etc/cron.d
cat >/etc/cron.d/beszel-agent <<EOF
# Beszel Agent daily update job
12 0 * * * root $BIN_PATH update >/dev/null 2>&1
EOF
chmod 644 /etc/cron.d/beszel-agent
printf "\nDaily updates have been enabled via /etc/cron.d.\n"
;;
esac
# Check service status
if ! service beszel-agent status >/dev/null 2>&1; then
echo "Error: The Beszel Agent service is not running."
service beszel-agent status
exit 1
fi
else
# Original systemd service installation code
echo "Creating the systemd service for the agent..."
# Detect NVIDIA devices and grant device permissions
NVIDIA_DEVICES=$(detect_nvidia_devices)
cat >/etc/systemd/system/beszel-agent.service <<EOF
[Unit]
Description=Beszel Agent Service
Wants=network-online.target
After=network-online.target
[Service]
Environment="PORT=$PORT"
Environment="KEY=$KEY"
Environment="TOKEN=$TOKEN"
Environment="HUB_URL=$HUB_URL"
# Environment="EXTRA_FILESYSTEMS=sdb"
ExecStart=$BIN_PATH
User=beszel
Restart=on-failure
RestartSec=5
StateDirectory=beszel-agent
# Security/sandboxing settings
KeyringMode=private
LockPersonality=yes
ProtectClock=yes
ProtectHome=read-only
ProtectHostname=yes
ProtectKernelLogs=yes
ProtectSystem=strict
RemoveIPC=yes
RestrictSUIDSGID=true
$(if [ -n "$NVIDIA_DEVICES" ]; then printf "%b" "# NVIDIA device permissions\n${NVIDIA_DEVICES}"; fi)
[Install]
WantedBy=multi-user.target
EOF
# Load and start the service
printf "\nLoading and starting the agent service...\n"
systemctl daemon-reload
systemctl enable beszel-agent.service
systemctl start beszel-agent.service
# Prompt for auto-update setup
if [ "$AUTO_UPDATE_FLAG" = "true" ]; then
AUTO_UPDATE="y"
sleep 1 # give time for the service to start
elif [ "$AUTO_UPDATE_FLAG" = "false" ]; then
AUTO_UPDATE="n"
sleep 1 # give time for the service to start
else
printf "\nEnable automatic daily updates for beszel-agent? (y/n): "
read AUTO_UPDATE
fi
case "$AUTO_UPDATE" in
[Yy]*)
echo "Setting up daily automatic updates for beszel-agent..."
# Create systemd service for the daily update
cat >/etc/systemd/system/beszel-agent-update.service <<EOF
[Unit]
Description=Update beszel-agent if needed
Wants=beszel-agent.service
[Service]
Type=oneshot
ExecStart=$BIN_PATH update
EOF
# Create systemd timer for the daily update
cat >/etc/systemd/system/beszel-agent-update.timer <<EOF
[Unit]
Description=Run beszel-agent update daily
[Timer]
OnCalendar=daily
Persistent=true
RandomizedDelaySec=4h
[Install]
WantedBy=timers.target
EOF
systemctl daemon-reload
systemctl enable --now beszel-agent-update.timer
printf "\nDaily updates have been enabled.\n"
;;
esac
# Wait for the service to start or fail
if [ "$(systemctl is-active beszel-agent.service)" != "active" ]; then
echo "Error: The Beszel Agent service is not running."
echo "$(systemctl status beszel-agent.service)"
exit 1
fi
fi
printf "\n\033[32mBeszel Agent has been installed successfully! It is now running on $PORT.\033[0m\n"
+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
+77
View File
@@ -0,0 +1,77 @@
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',
} 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();
+107
View File
@@ -0,0 +1,107 @@
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}`);
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 };
};
+114
View File
@@ -0,0 +1,114 @@
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> => {
try {
await runWorkflow(id);
} catch {
// Géré par l'intercepteur Axios
}
}, []);
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;
+329
View File
@@ -0,0 +1,329 @@
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),
]);
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;
+95
View File
@@ -0,0 +1,95 @@
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> => {
await triggerWorkflow(id);
setSnackMessage('Workflow déclenché avec succès');
};
/**
* 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;
+105
View File
@@ -0,0 +1,105 @@
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 é 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 {
// Seule l'URL est lue dans le store visible — les secrets restent dans le secure store
const baseUrl = await SecureStore.getItemAsync(SECURE_STORE_KEYS.BASE_URL);
set({
config: {
baseUrl: baseUrl ?? '',
isConfigured: !!baseUrl,
},
});
} finally {
set({ isLoading: false });
}
},
setPreferences: (prefs) =>
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 é 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-----
-53
View File
@@ -1,53 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIDnTCCAyKgAwIBAgISBnKX1j4PmdT740bS51Wusou5MAoGCCqGSM49BAMDMDIx
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF
ODAeFw0yNjA1MTYyMTA3MjZaFw0yNjA4MTQyMTA3MjVaMCQxIjAgBgNVBAMTGWFw
aS5zdGF0cy5neW96YW1hbmNhdmUuZnIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNC
AAT8CJ5e1GXcl0/hOYtMOZFGi1HJweOJiQyGRi/V8Ls56LfU59zQVgcKnl27H3fz
5zhU1iPRC0FqYgdlquSDAMu9o4ICJDCCAiAwDgYDVR0PAQH/BAQDAgeAMBMGA1Ud
JQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFICOYDM7is9w
O9Wnk+Stv3giOzirMB8GA1UdIwQYMBaAFI8NE6L2Ln7RUGwzGDhdWY4jcpHKMDIG
CCsGAQUFBwEBBCYwJDAiBggrBgEFBQcwAoYWaHR0cDovL2U4LmkubGVuY3Iub3Jn
LzAkBgNVHREEHTAbghlhcGkuc3RhdHMuZ3lvemFtYW5jYXZlLmZyMBMGA1UdIAQM
MAowCAYGZ4EMAQIBMC0GA1UdHwQmMCQwIqAgoB6GHGh0dHA6Ly9lOC5jLmxlbmNy
Lm9yZy81OC5jcmwwggELBgorBgEEAdZ5AgQCBIH8BIH5APcAdgDIo8R/x7OtuTVr
AT9qehJt4zpOQ6XGRvmXrTl1mR3PmgAAAZ4y0xxFAAAEAwBHMEUCIQDbfwUB8uLL
1SRsrKRjC28A/VHXn5c3X3us97bMFFM9fwIgQDLOuwTU6nC8UuHKaCrRU2KrMKJJ
jvuOsKMCOBS9UFQAfQAai51rD/6/gbR5OcbSMQqG1tEC1PBG4hgsneNfXiYl7wAA
AZ4y0yBFAAgAAAUAE4gyIwQDAEYwRAIgb7un75QXf3f1R2ayARH2QbhiDcsO5FXo
5UzmCjkbQCkCIElkIQyVC2Tsf9mEVtGY7IyiKQn66TgnHk5wwMenxy3vMAoGCCqG
SM49BAMDA2kAMGYCMQCXnOWnx/ZxbjyJaPBScqn8QwjthjZzBie/Fa6v13D1oSPf
mkYuAIeXQbdZRbFWNlICMQCQaY6pejgmAQhiuIGr4Ns5qPmkH036aJrz/vcO+rgl
kP4FRAz9W9hvMfQYG6EdIUQ=
-----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-----
MHcCAQEEIEbFLRNvbUpgYsXWJf7qRZKQI6sPU3dU7NffjxCFvw79oAoGCCqGSM49
AwEHoUQDQgAE/AieXtRl3JdP4TmLTDmRRotRycHjiYkMhkYv1fC7Oei31Ofc0FYH
Cp5dux938+c4VNYj0QtBamIHZarkgwDLvQ==
-----END EC PRIVATE KEY-----
-52
View File
@@ -1,52 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIDiDCCAw2gAwIBAgISBr6RXeeIbtaW4W0NCJ84LwrhMAoGCCqGSM49BAMDMDIx
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF
ODAeFw0yNjA0MTcxNjUyMTRaFw0yNjA3MTYxNjUyMTNaMBkxFzAVBgNVBAMTDmJp
bGxpc2RlYWQuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE+9tiYc95Ejbs
2LS2aKIxOV1fHPWus+RY6TI0YMQDxNtKJ6UyIW8F64H3Ql3N6qWc8LYkK1q7wV+R
+Hq93g9yX6OCAhowggIWMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEF
BQcDATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBRmVIhu4IaP+QP9ozyODqK4vn09
5zAfBgNVHSMEGDAWgBSPDROi9i5+0VBsMxg4XVmOI3KRyjAyBggrBgEFBQcBAQQm
MCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly9lOC5pLmxlbmNyLm9yZy8wGQYDVR0RBBIw
EIIOYmlsbGlzZGVhZC5jb20wEwYDVR0gBAwwCjAIBgZngQwBAgEwLQYDVR0fBCYw
JDAioCCgHoYcaHR0cDovL2U4LmMubGVuY3Iub3JnLzk4LmNybDCCAQwGCisGAQQB
1nkCBAIEgf0EgfoA+AB2AK9niDtXsE7dj6bZfvYuqOuBCsdxYPAkXlXWDC/nhYc6
AAABnZyRDTQAAAQDAEcwRQIhAPWheC0YTAIaHWFL2yWjKjT1t0yyxDZUDrqrWr4D
QQueAiAG1gWpqDegeSsAQCqjayJkBDo8aHZp5w1jiVSYGG3raAB+ABqLnWsP/r+B
tHk5xtIxCobW0QLU8EbiGCyd419eJiXvAAABnZyRD8UACAAABQAJ7VqrBAMARzBF
AiAmCePdS6Gm4gMkHGT/fbnSvDUIxIRLDxKtEo1bzeopxQIhAL7+XPeADkGvQjL2
sSYF3bs3ywkloWmeLPt115g1BgOUMAoGCCqGSM49BAMDA2kAMGYCMQDEjGpsD0xf
XjNLTV3an/uNQRSPkOMHnlnmOouyRLASS0Ja/zwN89bYpWAscuoCXkMCMQC+Rnn1
UWtaRr+x0qXuEBbpIQF1ablfgR8Jg2tTmPEfjN8HIb3WMWIazo5UtDrmK0w=
-----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-----
MHcCAQEEIMa6KvLOOkRrUB/cnrVdNO/jgVal7RcbP+wMVflfrvJgoAoGCCqGSM49
AwEHoUQDQgAE+9tiYc95Ejbs2LS2aKIxOV1fHPWus+RY6TI0YMQDxNtKJ6UyIW8F
64H3Ql3N6qWc8LYkK1q7wV+R+Hq93g9yXw==
-----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-----
MIIFDTCCA/WgAwIBAgISBv3V1gRiC6r0jHK2deU0JEXqMA0GCSqGSIb3DQEBCwUA
MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
EwNSMTIwHhcNMjYwNDE3MTY1NDI3WhcNMjYwNzE2MTY1NDI2WjAkMSIwIAYDVQQD
ExlidW5rZXJ3ZWIuZ3lvemFtYW5jYXZlLmZyMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEAtXNZoYstloaVDmYS3ueRh7TeQYTye4AInRrHVhgpA0UPEE9g
NWIxA8zOzR6acywhu1xATGSIUaJm64PGTTOXiD2ZDQXVUbv+T7xQtpQbhQdqYQDy
AjXaxwh+IEVCmc/Ov4sc6gdojbxsqNxLgm4vBE+/9wOJKDqLer7npv5AjkZ0UTyC
PHjd2fdA1cuVWVo3JyQeNy9yRNzQpNEw08Kc5yi+rjusuWSpDee3aWNAh/8IAw3h
j03HlHTn5E47ZtLhM+vpkP1XEMquH9Wbb3DanLTqQj1okpZKdKIY/eY4OVvb/gv1
oKskM2Uh9qqvTuR3HklFzXoED6F2vVQWeh1mQQIDAQABo4ICKDCCAiQwDgYDVR0P
AQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYD
VR0OBBYEFNCslpcMswqRzRuPMbStPRIxg8wlMB8GA1UdIwQYMBaAFAC1KfItjm8x
6JtMrXg++tzpDNHSMDMGCCsGAQUFBwEBBCcwJTAjBggrBgEFBQcwAoYXaHR0cDov
L3IxMi5pLmxlbmNyLm9yZy8wJAYDVR0RBB0wG4IZYnVua2Vyd2ViLmd5b3phbWFu
Y2F2ZS5mcjATBgNVHSAEDDAKMAgGBmeBDAECATAvBgNVHR8EKDAmMCSgIqAghh5o
dHRwOi8vcjEyLmMubGVuY3Iub3JnLzEwNy5jcmwwggEMBgorBgEEAdZ5AgQCBIH9
BIH6APgAdgDYCVU7lE96/8gWGW+UT4WrsPj8XodVJg8V0S5yu0VLFAAAAZ2ckxGj
AAAEAwBHMEUCIEJjRYRIzLSBOyi5eWmRF1SQQp36opt3ear0uJq+K2ZNAiEAj3QT
O370yLSa2Vn+49LtsHjPUGBswx004trbwildAZAAfgBGr4Y9Oz7ln6V33qgkXTaw
2e0ioiP0YXdBIpRS7pVQXwAAAZ2ckxHyAAgAAAUABCTHRAQDAEcwRQIgS4Gu3+tr
oHHLiFfR41Bcmbve3jSy2y5RgZTrid2qPtkCIQCBvwqWny/X5QqeOJDPsQ8yCBWz
OSta90PP9I09/NbA+zANBgkqhkiG9w0BAQsFAAOCAQEABQIphrh/5VC+AALIdUzf
SdicA+NVK2TX2nd1IGC1SgSBL7Iv00CemorhO/LblWRls0XNtwk++FVAS9lpGE6U
MrvInheO8ukTQjNbMs0ZrYt0HnwgW2fp/JHpgPNqW8ngO8EodMiu+as6H1I1fSI0
1Cpbp0fFMrOC819eFN36DD9eGuQKsAtL+Vt340z7CRlcNGdF6tNoy9xIZ/Cojuzg
SLtAQctIaRfzzNBnZ6YARlx2E4SqAutEiS5Vb3FBPPNZ1r+3YdRL7Z2/R/S4kxVV
DQf5naJfQRvkuJ7Q/zNa1CcMsPygSwaB+mgAum9CLmAx1GoN/pY83GvdW2kFSWFf
2A==
-----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-----
MIIEowIBAAKCAQEAtXNZoYstloaVDmYS3ueRh7TeQYTye4AInRrHVhgpA0UPEE9g
NWIxA8zOzR6acywhu1xATGSIUaJm64PGTTOXiD2ZDQXVUbv+T7xQtpQbhQdqYQDy
AjXaxwh+IEVCmc/Ov4sc6gdojbxsqNxLgm4vBE+/9wOJKDqLer7npv5AjkZ0UTyC
PHjd2fdA1cuVWVo3JyQeNy9yRNzQpNEw08Kc5yi+rjusuWSpDee3aWNAh/8IAw3h
j03HlHTn5E47ZtLhM+vpkP1XEMquH9Wbb3DanLTqQj1okpZKdKIY/eY4OVvb/gv1
oKskM2Uh9qqvTuR3HklFzXoED6F2vVQWeh1mQQIDAQABAoIBABcgj9zkZu1H077P
6Xl/eCVHuzO2/3XDS2sZgIJri5VZm4JqLj/k9zdd8ZaOXy7tLJLQvsyd3GF/UBvr
of5cDuU0E1+9Yxj1sQPhDkPp28TDEwmF0SgmohnP7iIsgcEmDgWMSdAAcrtCDXLL
uqocuMxqt8ktqlvgyRSzjsYno6XJLkUGvMMf/DZdxm+2JP3AyqJJeER5+SW9tJIs
uaF/TO2chVt7eiztf4NNcAk5QVbBEK6LcXHijNFYfWZsSNKEymraeLVU+WtxezV8
t9s+zG+EYHaygibxBEozARofzZLkbKFXmIY3+LnKw8xNZlZ9g39d32xRkes5GBtf
b2DqoaMCgYEA7DhbdPe/kI/BkWRjsT78EG6xkFOIDqELlsRGQ6jbxe60TTZeuplF
6ynG1EmKLWo8P5rnwxpu3eFVKUj8QWzBaoN3OUX1xIQTuEJlJensoD5KwiNKr3gq
nosN0zWoGB+eAp/vY1TrMQb+q6VsnqXZJjQIkcvLNjDcm4HFFE5XdGMCgYEAxKTy
OH15f+2xFN/896oAe2K9Yzmgdtv46ihW9HmmxOwPRzs6UpMeK+ek6NMuNdV/f8pV
SP1c2cwNEq3sJOOEy6tOLw96C/29LVZO9Nc8vPoWSVmp5RqMWCxEtWztdM2UH1eO
cdiqRNBxq89K9+Kzc4ooYtOtO+EJVQz1X0a04gsCgYArc2ZnSpcjKT5K1zN7TAGj
qCjjSmoxfrAaCHqAQZRDgVgLB+A+5Ki2zBV1wR04o1z3ui+9dKRGDgfTM0irZCzj
wdDxaQv/HOhfsV7XrYLIKw0nTsSTKEB2r09YtXr5DP/Mrcyj8d/dQdMgkao8OHeM
DnAxGVKE4lICDMnKpWpyzwKBgQCQFNeRgoZKsMsmI3RDtyFBRrjDgk7LqCN61nHY
EWabNOeA5qm2JStfOgw/t7RNJ5CS/pp8r3+f6X3OqPa0lKwRWwQfQTTIonNBS9Lw
XOCZCpjXx8XPIyOf21fAov5drd+RE2NAkWM4po4TOACTHl0kFB/BQZ3VmO5wjd0f
oTwZvwKBgCiHIdDlpuBWyVEt3mrPWwRsJWpJYMwrG2Ckc0Wmuke2P2oA+JSrVQzz
0ts51VYh2qQsN4+TlRKj/IWWTrRGm0qeIq/1OAeXk04BiJyu5xfMQhjwEi07NeqZ
kgFmLYy/ecCGWYkSrgU8+PAvUpuyk5cYX22CSn9q8VMbVgEMpI3a
-----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-----
-85
View File
@@ -1,85 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFDDCCA/SgAwIBAgISBuiuhsUgRPm67F/eerygdI94MA0GCSqGSIb3DQEBCwUA
MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
EwNSMTIwHhcNMjYwNDE3MTY1NjM4WhcNMjYwNzE2MTY1NjM3WjAkMSIwIAYDVQQD
ExlmdW5rd2hhbGUuZ3lvemFtYW5jYXZlLmZyMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEApqVCWBtyY4nwbxQPqepsDSXUx5q26cGub6z218Rjy/ClAQ1l
ojZ/siEOzNKBsDsMlClE1fju+sEuyNRQNB72hkodBBuesXMRshrUqqI2A7ifQI6d
AsxidTn3LrP40lyhHQx5veuLsrSoTMTN+5c02UxruYXvkmjCFfHlNq62fSfCgkJJ
5p9ai8vSAFZXPt7/MawTvu4oNxId3MMjx0hpmM/AtTrKQ/J8aDY5Zbmehhmaq+F8
BSxBcMmk9KiKixlukLKs12Kk8lLwafdnGI6ZcflzInHhz5RFvkBMqGJS8TlNOMFf
hGxwMVtUN5drWhEdRpm2OZUFYWpAn2IasPAACwIDAQABo4ICJzCCAiMwDgYDVR0P
AQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYD
VR0OBBYEFFm7JuB2BBkKysP6auzuHO4UYLm7MB8GA1UdIwQYMBaAFAC1KfItjm8x
6JtMrXg++tzpDNHSMDMGCCsGAQUFBwEBBCcwJTAjBggrBgEFBQcwAoYXaHR0cDov
L3IxMi5pLmxlbmNyLm9yZy8wJAYDVR0RBB0wG4IZZnVua3doYWxlLmd5b3phbWFu
Y2F2ZS5mcjATBgNVHSAEDDAKMAgGBmeBDAECATAvBgNVHR8EKDAmMCSgIqAghh5o
dHRwOi8vcjEyLmMubGVuY3Iub3JnLzEyMS5jcmwwggELBgorBgEEAdZ5AgQCBIH8
BIH5APcAdgDYCVU7lE96/8gWGW+UT4WrsPj8XodVJg8V0S5yu0VLFAAAAZ2clRHP
AAAEAwBHMEUCIFPtKMwpfGWb37ZnYQymk8BgGBC6yq3wjMvPOJzb1fp7AiEA1x53
6ZPYWX8zvCdnc4OEDmKApbsLI98kp+LTHZ3xKRwAfQAai51rD/6/gbR5OcbSMQqG
1tEC1PBG4hgsneNfXiYl7wAAAZ2clRMdAAgAAAUACe2JLgQDAEYwRAIgDBlTiwDi
pgnfONdPxUcU7hFGtnzFduGjEz42mfOAl2kCIFL0bVHU8Le4vFgMHuTkFvzV+j3F
wF9kkCSpI83AXPfeMA0GCSqGSIb3DQEBCwUAA4IBAQAJgb8SvpCzRW/UvGaIis4s
twCFn+3AZsbC02IbX+vlZgjECmEe0B8hhHqz+CgarpGbIAUov8CHMK1PopbxJpt1
xYmZ8Clg5eAVQkweAjP/ogk5rsPBvRtfsaGRF2i+ak/92rOBbX4M5bDNmV56r0Gf
9SzudzhOYD/pH2qU8lxTgt79Eci4nvc5NauTbIFtPKfwaboze5r4Jz/cUHeLVv41
Ffsmi+hSp6tFKpLdOgSirGvXjG6g0Z9aZ0vq1EqWb3D7EWkxplPeOitc8SVGkUGe
IMsjS6Kgss2i1/C2/gv16ChZY/TvDbRXxLDS5hh7itWb9/LwttFk97dt1g2NIJ41
-----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-----
MIIEpAIBAAKCAQEApqVCWBtyY4nwbxQPqepsDSXUx5q26cGub6z218Rjy/ClAQ1l
ojZ/siEOzNKBsDsMlClE1fju+sEuyNRQNB72hkodBBuesXMRshrUqqI2A7ifQI6d
AsxidTn3LrP40lyhHQx5veuLsrSoTMTN+5c02UxruYXvkmjCFfHlNq62fSfCgkJJ
5p9ai8vSAFZXPt7/MawTvu4oNxId3MMjx0hpmM/AtTrKQ/J8aDY5Zbmehhmaq+F8
BSxBcMmk9KiKixlukLKs12Kk8lLwafdnGI6ZcflzInHhz5RFvkBMqGJS8TlNOMFf
hGxwMVtUN5drWhEdRpm2OZUFYWpAn2IasPAACwIDAQABAoIBADNIWApVJ/aJ1Hva
aJeZlHbXVYu3iOKWv9+OEsiDn1J7U8vnG4e3zcQ7eBqADXj2MwDFUnGmkaSJHqSe
8a+Yd7ULybIh7cwd5SwyJY/9KzIp9pgfSyI5U3NPy0mMCN5zswEFfdF8UxlDjydQ
yTLLbXARnHUTSo57vn6SWj9htLb+rdKu+myhdxW8XyfCBQF39dT03VsNpvHIG7t/
SeYcyGNk+L7o6hsxZA8RiUFzgd1mWp5BlKUhU97rEhLSn8JdwDTLiDEDrFL0OUMw
dBXVU0baa5hv4Sin9eXz3Tt72PClwOAG8YSNYhhbVH4Rc7LnRbv184nXIOmVPKaA
sxEuGsECgYEA3z4YptbqPfYXaVKpk3dQL7tULCTD/ly/kiu3RvUcFVVmOwADbaoF
Z29c3lSitwr8oiuLd/Mby7NHLSrtIcW/Mg8uQ2MFs8nqwcUN15g6sVABTB57dBNG
Q6ixo8y9wWRjKzlX4xzkmIgfgIyRO5Los50Cv4fUpJYHp1CHvfb8b3UCgYEAvxkl
tp028W/8pfXcIHKZ/UySxcnAh3yBSfHlgsgjAYARu65+Oofoa5X5CMaYVaXclvUp
zl5aEZyfMXFTmG9FsPKx13lKMIpkkxTlnANoM7tvpGPHZGLt3InOZARzdxdC+Mw8
EyhH4o4nQLY4bhKRz3ka4StE9qs33rf83kbIQX8CgYEAsyrtMgnOmcgGZhtXyei6
THS2S29+dYkOn0vCnopd7alKkROjrMIF8EvqZu3aYbnJpIX6O1y79DKAb3nCM5a3
qn+Qi7jPfMoTRUzXnS6p/GDPib31KuXFQMwFNgc+TBY7mRc+uCIaPWkSj2NBtGRl
qrHa4MktGqLmpZv2NboiQ3kCgYEAnLSUdpGpcodw2O8qWflgSZS3bzYoiXIR239f
w8U2344T/KH0pS656y+KjiW82c8veyMD61T36yVSbgsOkBv/PEFokNfHfNKf8vTZ
7PvmQTXdMSMZaTqu74CaHO6BeRE8PCXOxa7sc946VhiXYbwckdQvtKH05Yo2QI8D
74p/wSUCgYAqjod4CaSM/ITIaHgt88WmItbStaf9nwDUDkH4mWs4ds3RFmzyVSZt
yP+m3xsKYjJU8DN+So6CveZFXRhMGmxIwaR0r41hAzskTtUpGRBRcZFMdyWXvKAb
FiLanTcRP/F5lpRy88IfnklwbAVvzVScHPltkby5S0Bl/tR+f4Grxg==
-----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-----
MIIFXTCCBEWgAwIBAgISBj1+oZzFbeoM1+Urdk4veU0+MA0GCSqGSIb3DQEBCwUA
MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
EwNSMTIwHhcNMjYwNDE3MTY1OTAxWhcNMjYwNzE2MTY1OTAwWjAfMR0wGwYDVQQD
ExRjaGF0Lmd5b3phbWFuY2F2ZS5mcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
AQoCggEBAJwkG3KparKxpFvZtVi80w/Dc6klY+oTPhy1UG8+fFrC4zJ2Ce5MVoTM
bNkPtDY93onZbpCVayYxpK8BeP2mgJDveXBg0QQxOquD5Ajhn6cQs2gPrTMC8NxZ
rxnrLv4kwIjmIiB+Sv/wtXFWkVM6qjxDz10qe80QPk7bmAhHuO+8hK6PvApR98Is
njbea75CYUf6iNbQVb/E55olQ6PWkL76oIc2bT5f2PwGP+qgmwZi+Rk8ahSOemxu
ri4hHVJgG0GJlnTIwCaaiabrhytehUpLdh+wNRorEzSCFn37RjHNYWYtIZXQRPAJ
Y4MvgkQl7tAzg42hxZAkb50OIQ3wchcCAwEAAaOCAn0wggJ5MA4GA1UdDwEB/wQE
AwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQW
BBRc8Z0PWNcLzSy8tePBRSJaPL2A/zAfBgNVHSMEGDAWgBQAtSnyLY5vMeibTK14
Pvrc6QzR0jAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAKGF2h0dHA6Ly9yMTIu
aS5sZW5jci5vcmcvMHkGA1UdEQRyMHCCFGNoYXQuZ3lvemFtYW5jYXZlLmZygg9n
eW96YW1hbmNhdmUuZnKCGGplbGx5ZmluLmd5b3phbWFuY2F2ZS5mcoIVaml0c2ku
Z3lvemFtYW5jYXZlLmZyghZtYXRyaXguZ3lvemFtYW5jYXZlLmZyMBMGA1UdIAQM
MAowCAYGZ4EMAQIBMC4GA1UdHwQnMCUwI6AhoB+GHWh0dHA6Ly9yMTIuYy5sZW5j
ci5vcmcvNjMuY3JsMIIBDQYKKwYBBAHWeQIEAgSB/gSB+wD5AH8ARq+GPTs+5Z+l
d96oJF02sNntIqIj9GF3QSKUUu6VUF8AAAGdnJdB0gAIAAAFAAQk19EEAwBIMEYC
IQDOTZt9FqHojlJ0PPFTGupKYnXIz4BOb42YukJu5Av9ewIhAJWbSE9zDcxIYpcj
A9ronzMtHs74NjpdxwWGJw1xYVGvAHYAr2eIO1ewTt2Pptl+9i6o64EKx3Fg8CRe
VdYML+eFhzoAAAGdnJdCHwAABAMARzBFAiAcARsCtgaEEGx6H1nuCT9DJrLcEetU
AvC04vhlqGVUqwIhAMsslb3BqRFoUWm6qGpkcwhsQY6xEtZ78XKV6xI/FgJbMA0G
CSqGSIb3DQEBCwUAA4IBAQBE8tvnqbKzBtaUn4BwYCrCIAK5gdv2eU+Vth/4N+la
FbRqjokq4/DjNR7cKsLolxw5Z/r4gSa4ycxRVpApUhH898wK6XDZsH6fMwFxl/If
/iR+PH74oyz8kJVWtk6mvFY4vqm+7DGQkcPsKvtHdIMmrvABAi4xQasZX7JJERx0
cOozV3Pm97O0KI5qZg1yCq8Q0DEDOunaNL5BS9im3Wfob9MNJjudIrohDXGbiHfQ
3v7pCNHJ5kQ5JmTC8CGDUtyZSAOVpm2z3YWu2CSz4/Zy/NdGPb2x9JjLOLnkn+c/
ahXWm0PqPIIf8WBFYAOugfLcfwCgqjtRE7QR9RAXz+F4
-----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-----
MIIEowIBAAKCAQEAnCQbcqlqsrGkW9m1WLzTD8NzqSVj6hM+HLVQbz58WsLjMnYJ
7kxWhMxs2Q+0Nj3eidlukJVrJjGkrwF4/aaAkO95cGDRBDE6q4PkCOGfpxCzaA+t
MwLw3FmvGesu/iTAiOYiIH5K//C1cVaRUzqqPEPPXSp7zRA+TtuYCEe477yEro+8
ClH3wiyeNt5rvkJhR/qI1tBVv8TnmiVDo9aQvvqghzZtPl/Y/AY/6qCbBmL5GTxq
FI56bG6uLiEdUmAbQYmWdMjAJpqJpuuHK16FSkt2H7A1GisTNIIWfftGMc1hZi0h
ldBE8Aljgy+CRCXu0DODjaHFkCRvnQ4hDfByFwIDAQABAoIBADnpPnDpmxRJxK74
cUVHS3TWRiifII6psmjNatbHszGqhL+rfgVvNMuuUlSzeWCA0/AGv/ZKJOKWmQD7
p9dUEO0wlLb0gbFvXNZOZZ5RqHg7Pn9DCTcZSSJA9SvEybojAXIFAPVSQhjpOzKd
K+tVn9wYPmnMnvwwoRt4YMv5ZgMsMSr+Ke3Z0gnsWi1cnfZQvr3qv2fcIrpAxzKC
T9MAxar+nTyEjLICscURpiU9moaNAZ4u1tV+f0299AJJXsZNgSiQbRzRM2bKgilg
HB14AhZTpCfp9b4ARO7C9Auv5Pc4eTBhlAdwzr4T8RrjDUs+LCoQb8ib6CePbezN
EMee8jkCgYEAywB4sYzGQbXC+oCrG0ogelK7JFNLzKc6Xdv3rbBv43YgJ3uxyQ0b
X85qr1fe9Em9P57X9JQNVCRtZS+inhftlzNPFAFQ/qk9XV/cwgeX92RMoFgnAWyU
67tF4vFONEFerD3ccJqU72iE801iTiqQoiCeypSHgX8pNAxd/270KmUCgYEAxOe3
ogYduiic8zhrah7mhcBvb5umt05SjleiOTlmkIOGHrtvev8BQsMX/KSJefQU+MCF
E4UPs5itUQm6S/ZVlGk1NyUjb0xplIC/s5vGeYavJ+QjtYmRMcCfNCShsE6NRFyj
7nd35A80JsBr4DsfXnt7zjnd5jYUSykbPuHQRMsCgYA2YtvzBXogJKgmIM62svdc
jkmhA8fs/mh+uO30VK7FS+J1cYhCCwbodg7TB0GuRQs0vkOxPPENN+0vDMIOhO6c
cZygCXI/p+vO1l34hbxLBU4aL0PT99k2BqhEks2W5mSM1M34RRHdyizEWlkaBAFX
zlF8iKp9ISpSzXVpd7pmmQKBgAx6Rpe83XtjgXakN6JU7PTC2gzvhyQMkYy1nvET
Yx17SC+AXzMjH7hUVpvK7W9N+Vo+EPDIuNL/tNPy0txncsrh0953uwQdin8/nWZL
U8t1rnnPqjehzRKjCzOpsplSkP8pA7Zj2bQZBowCG5PtCzLYjmLmJdqlyKlupGxa
sPD7AoGBAJDvjwGColrYrAP/4H9JHssFJrk8LtT/HC9AHP0Qjk0rUedImblpSqqi
kRklhhmybgN7WNI9btJS1ou3jvUvYi3nzpVZUk6TFSIG38u+9//Na/B6adTsz31y
JbZOgxGXJ9Q8aygxE1aGIZtC2uSwqudEnRporjXHcaEsttkjDP+C
-----END RSA PRIVATE KEY-----
-85
View File
@@ -1,85 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFAjCCA+qgAwIBAgISBbuvzdky8j2xvNQL9SLFwtZSMA0GCSqGSIb3DQEBCwUA
MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
EwNSMTMwHhcNMjYwNDE3MTcwMTEzWhcNMjYwNzE2MTcwMTEyWjAfMR0wGwYDVQQD
ExRoYXNzLmd5b3phbWFuY2F2ZS5mcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
AQoCggEBALdcF7VYAe/li8Se82g7pBoiTveLBlHzpAZ4S5wpsrHXHBY1Js2DZ2+r
JA2qGJqaf4F7bkEYJzzMFTsaYlu3iZKC3ElfM3WeC8o54G3W/2qhxU69i6T57mE+
hNeqURGOBwXqwkmUknhKWga8y84adxZzt2QBVcjxOuTwWZBZozHNt0xjW1CVVMiM
d2Vz3wbO+2kCNLGJIlK/ParAeKtGnOhFpgLrHrBr2NXrWedHKJtB24eElhg+8XBV
8XBNPidvbQ8XPkE5i++GwmxBynIH/Q0ikVWbQM5B50U2zyKQbPAhplSGhUm9K4By
gcCsQdmyvvf06yNPAJK3S4Qc1m57xxcCAwEAAaOCAiIwggIeMA4GA1UdDwEB/wQE
AwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQW
BBT0Q4gJSb+DKWLUaffYmQvk4u74JzAfBgNVHSMEGDAWgBTnq58PLDOgU9NeT3jI
soQOO9aSMzAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAKGF2h0dHA6Ly9yMTMu
aS5sZW5jci5vcmcvMB8GA1UdEQQYMBaCFGhhc3MuZ3lvemFtYW5jYXZlLmZyMBMG
A1UdIAQMMAowCAYGZ4EMAQIBMC4GA1UdHwQnMCUwI6AhoB+GHWh0dHA6Ly9yMTMu
Yy5sZW5jci5vcmcvODMuY3JsMIIBDAYKKwYBBAHWeQIEAgSB/QSB+gD4AHYAr2eI
O1ewTt2Pptl+9i6o64EKx3Fg8CReVdYML+eFhzoAAAGdnJlGwwAABAMARzBFAiEA
tSlOkj4aQtuzJ5G8YW+7iUjIcxpQy6cwkk0Kq6TBbsQCIB5esIF+nU7yT1PkNtsB
PLtcWfeIdw7Y8F5/CD+eHVHaAH4AGoudaw/+v4G0eTnG0jEKhtbRAtTwRuIYLJ3j
X14mJe8AAAGdnJlHMAAIAAAFAAntvRYEAwBHMEUCID4fAjp3pPCpFcDWeYaIOc7D
Dx/30KJEg3FK536a1fdYAiEA+5m24Groxa/2OXR7yNHygtk27olsNLxRcCoQOr/d
u74wDQYJKoZIhvcNAQELBQADggEBAIHb97jzOUt+xmOdz+28cd0mJBNQwnuqOIX7
KqsOJp3Z5tIG7v6ZrovzWQalRr3kP0WL6I6UzWvD5UlOca+FzHvjjL+M4q+kbatI
iy8hUiGMjO72OnqqQLqhT1soZDFUvLSTx3yMWLU8G0EFgF00hnRTe3N+dc6j0l9S
lyYnKAYvM8p/Eu0EQEKcmSsrEUDPFHjIWcl+NfjQ3SY51/ohVTwlva1CYJHmEeoR
6HDSrVAMyWjwmNgn83b+sY5O5Us3663tZWCXaTYfZQfdHX2dkhjZxYkQTbHOD+hj
9V2dTf4q5PnYMsCfAD4ObsHc+Z8uXB9OhgH/uiOG618gQbdy8sM=
-----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-----
MIIEowIBAAKCAQEAt1wXtVgB7+WLxJ7zaDukGiJO94sGUfOkBnhLnCmysdccFjUm
zYNnb6skDaoYmpp/gXtuQRgnPMwVOxpiW7eJkoLcSV8zdZ4Lyjngbdb/aqHFTr2L
pPnuYT6E16pREY4HBerCSZSSeEpaBrzLzhp3FnO3ZAFVyPE65PBZkFmjMc23TGNb
UJVUyIx3ZXPfBs77aQI0sYkiUr89qsB4q0ac6EWmAusesGvY1etZ50com0Hbh4SW
GD7xcFXxcE0+J29tDxc+QTmL74bCbEHKcgf9DSKRVZtAzkHnRTbPIpBs8CGmVIaF
Sb0rgHKBwKxB2bK+9/TrI08AkrdLhBzWbnvHFwIDAQABAoIBABDIWpksFX1OLtVP
0Sqcrt//fOfWbz0oBj7bWtxPyr3RWQ5FTihoWxrS+MlRZNAdzQbec9B8c/byHQ1c
VF1dtrdUx/HlR1IAJcccNgkHsTgi12rmGXZ/s8xtyv3sZmArdkQZ4S+X7DIbaBMO
y76xGG5TKBl8r8vlHIVg5Gm8cp33tSIP/rX3cZHhZ/XLICfqyynkqiaaudZtpl1g
XVyO7YxX3bnhOMWihS/734Vx6CkHQxgm2mOUYZCWAi9Bv1pwWIJYk9XeLCrEfgkj
DaxBQPGjeqQ1+J9y4E+AuicJMQ7VQmvdQ+sF3tC5DUwVFODYar0KfBwKG+ZGkPCB
yH9G9EUCgYEA2sFQp8Wapytjw96fZjVfuFKjbDjAcSKvF3ucHDW4CDX4FP7Ns5GB
Cfm25uIwmRIhjzERck9tObUgGyZQ683k+4+ambOWvgkbqLLw1SGLWTx64cNr8XKB
dCD5DP0yZy9vhBEhPVR0m0Lr6zFDQsAEEUtQmrues+Dixks1/co9HcUCgYEA1pQH
ouEIDlQIS22an/57ki6N5aFaoThHbNXZ6/cMidhKG00uRP6kA5EGsu/b9dCMzNJN
OB+Btn67vztfHXF5atUHqA4doNBj2o5QpXOy5UlkenjqPms+YSiB4tjPj7+zYch/
jusSPfnNboB0+Bq3H/zHxcREkDGbiXcuCCkEGysCgYBxZDFdtdUzgA9HsXcosNP8
JIHnkAdY3aSq5H0INmQ9hVQh9e5EfVDJDfLb/TU5sydIJSQo/7jbZ+LLj/H0ORbP
uyFlOK0Ttn7q1E53+9pSmEIOEpE6Z6Nowcq3C+v7hqAkcgir1MJY1Libgj6eNBAn
ssWGX2ilTxXduZC0DAfgDQKBgQCLtHNIU7T4BzQjT+gFVR3FLjRKloQ4RTkTniQ1
InLyaHTPU6/VUekdPVYcOFiAsdiKHj4SVUkRtW+tcQ1bUR8ZNDu46f/WTPdGO7Q8
FJkb+W3G42S3YQGLJmFyfXCeCdTTzENonJoS6cobsNz3EAW8eMrkcwWkz/eRR5wb
ygCXYwKBgGXiHmyFHyEi/m2RvlandCgxDneyWrM9yH8yJAeKvtzrVQtWXAAfS55u
ozBzsQxnYDZW8BTkPuSSfcj+h0ArJom4NusRHYVf1+WlpPjQW3OYTCGR7ZuJnB2Q
3YX9p3jyAln9ZnQMbzAGj3aPMEoTdUF5QeqXNgX9wOkD4MqVsr1w
-----END RSA PRIVATE KEY-----
-53
View File
@@ -1,53 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIDmjCCAyCgAwIBAgISBfySdZ0A9mv868RaP62AnRGrMAoGCCqGSM49BAMDMDIx
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF
ODAeFw0yNjA0MTcxNzAzMjVaFw0yNjA3MTYxNzAzMjRaMCIxIDAeBgNVBAMTF2hv
bWVnaXQuZ3lvemFtYW5jYXZlLmZyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE
a2FHSg+Sxk60SVqrqOgF34Jd68deYxLXmKsb4IXQIqTg3c/wY3cHwLqqgVPjbQUD
23pB+ghro5pAUQBHS6W6NqOCAiQwggIgMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUE
DDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBTdBEW+vjkX+8xT
eSx1+8eq8JmHeTAfBgNVHSMEGDAWgBSPDROi9i5+0VBsMxg4XVmOI3KRyjAyBggr
BgEFBQcBAQQmMCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly9lOC5pLmxlbmNyLm9yZy8w
IgYDVR0RBBswGYIXaG9tZWdpdC5neW96YW1hbmNhdmUuZnIwEwYDVR0gBAwwCjAI
BgZngQwBAgEwLQYDVR0fBCYwJDAioCCgHoYcaHR0cDovL2U4LmMubGVuY3Iub3Jn
LzQ0LmNybDCCAQ0GCisGAQQB1nkCBAIEgf4EgfsA+QB2ANdtfRDRp/V3wsfpX9cA
v/mCyTNaZeHQswFzF8DIxWl3AAABnZybSkAAAAQDAEcwRQIhAKoduGqfIRaSj1/P
cKURgfI2Z4AfQh9aabwwQsxK4GCoAiBKu47TQW7qPE7jZJh2RXjBfU+c/4nXc7bO
v0pxqo+KXAB/ACbjZG5YaSEjvDQ/RyQ1mzeSzSRaiNgV05Mz/ZkYq0cjAAABnZyb
SnMACAAABQAH/ABmBAMASDBGAiEA/VWgMUTDuLN6X8748c2iOwG4Y/nKvesejOWa
5rtSO9wCIQCSEPlVV75ZVwiQuqp/BlSQB26UrT0/UXVOpi6aIgDwwjAKBggqhkjO
PQQDAwNoADBlAjAEQHquMjFHuX3ox5KqOIz4h0HI6HLL0+myDP4GfTrOfaOeSEho
VHfxKPohxtiJ9YkCMQDT9jn2ls0qupqtMpCyhj/9ngASoCxZaTsTxWn3BGsZM4vh
Z8jkBdztWCSkzx2pFZ4=
-----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-----
MHcCAQEEIIKjPCN4ROsOfaI5ax7Ad7LA+tXgBGe1uXUqwdbuBKa4oAoGCCqGSM49
AwEHoUQDQgAEa2FHSg+Sxk60SVqrqOgF34Jd68deYxLXmKsb4IXQIqTg3c/wY3cH
wLqqgVPjbQUD23pB+ghro5pAUQBHS6W6Ng==
-----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-----
MIIDkjCCAxmgAwIBAgISBnUG70RV4b9fPF7DNUOL1RwlMAoGCCqGSM49BAMDMDIx
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF
NzAeFw0yNjA0MTcxNzA1MzhaFw0yNjA3MTYxNzA1MzdaMB8xHTAbBgNVBAMTFGxl
ZGlnaXRhbGJvdWRvaXIuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEPvF+
08TgMlVBOj8cE1VdnHWiD+8IytHx/bSH1C/cSVxg60y46+MnagjbdbDH2bLZ2Nn8
syQLo2CKLNoOcHBZsKOCAiAwggIcMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAK
BggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBRboVEnHfxId40QdWEC
aw2MGHHpVDAfBgNVHSMEGDAWgBSuSJ7chx1EoG/aouVgdAR4wpwAgDAyBggrBgEF
BQcBAQQmMCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly9lNy5pLmxlbmNyLm9yZy8wHwYD
VR0RBBgwFoIUbGVkaWdpdGFsYm91ZG9pci5jb20wEwYDVR0gBAwwCjAIBgZngQwB
AgEwLQYDVR0fBCYwJDAioCCgHoYcaHR0cDovL2U3LmMubGVuY3Iub3JnLzM4LmNy
bDCCAQwGCisGAQQB1nkCBAIEgf0EgfoA+AB2AJROQ4f67MHvgfMZJCaoGGUBx9Nf
OAIBP3JnfVU3LhnYAAABnZydTiIAAAQDAEcwRQIgdBvmPEo5ubkKunBz0W5hvTq5
RDZsXQ/W2UOeb2GV5jUCIQDDF5U9UTlvXdYFaYIbNiYjDqWCdq+oKoh223RIZAJs
lwB+ACbjZG5YaSEjvDQ/RyQ1mzeSzSRaiNgV05Mz/ZkYq0cjAAABnZydTkwACAAA
BQAH/BreBAMARzBFAiAw21QEWisT3ZbJu64GaANr8BCBDC87eZ3/kaXDeLGsnAIh
AM/4d4+KCHM0DIJlX5uFwkIodq14k3DMpnsRDo5VJJWCMAoGCCqGSM49BAMDA2cA
MGQCMBcLBNRSXmUgUZb9/EIhWmCMns3gu+Q9pnyEQurOp7LZpKga83jkj+flt6W8
mk4ytgIwD7XMHUG5pH19pcm5OKmQ8P+gBS+C9nq4+J7ih0KJ3A+sX+KcJpyi7wTX
irxUSi65
-----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-----
MHcCAQEEIBcJCs+3muGFQeUUqu9MaXc8d3g+goe+Ug7J2NuvphkOoAoGCCqGSM49
AwEHoUQDQgAEPvF+08TgMlVBOj8cE1VdnHWiD+8IytHx/bSH1C/cSVxg60y46+Mn
agjbdbDH2bLZ2Nn8syQLo2CKLNoOcHBZsA==
-----END EC PRIVATE KEY-----
-53
View File
@@ -1,53 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIDkzCCAxmgAwIBAgISBRRu2SiVN4mjdKWnsPUP083aMAoGCCqGSM49BAMDMDIx
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF
ODAeFw0yNjA0MTcxNzA3NDdaFw0yNjA3MTYxNzA3NDZaMB8xHTAbBgNVBAMTFGxp
bmtzLmJpbGxpc2RlYWQuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAErlt9
cwSzz+fJF+uZI0uyGnaDO5O8pPNlS4iVOC0EIOn7JFjepvFTi622jFt4Zi9gbV1t
gm3hXLNbW/X8/lsiI6OCAiAwggIcMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAK
BggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBTj3msMAmSrI3XDCJ6M
8c8Iy/Uu1TAfBgNVHSMEGDAWgBSPDROi9i5+0VBsMxg4XVmOI3KRyjAyBggrBgEF
BQcBAQQmMCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly9lOC5pLmxlbmNyLm9yZy8wHwYD
VR0RBBgwFoIUbGlua3MuYmlsbGlzZGVhZC5jb20wEwYDVR0gBAwwCjAIBgZngQwB
AgEwLQYDVR0fBCYwJDAioCCgHoYcaHR0cDovL2U4LmMubGVuY3Iub3JnLzkxLmNy
bDCCAQwGCisGAQQB1nkCBAIEgf0EgfoA+AB2AMijxH/Hs625NWsBP2p6Em3jOk5D
pcZG+ZetOXWZHc+aAAABnZyfSGEAAAQDAEcwRQIgUK2TZ8zPwNJraIA+e1v5vW+p
28gbcrqnZMYVLST6xAwCIQCG5Jviip3x8HQR8/g210w/n8Pz9i3V3nfaltWQ1Zz7
aAB+ACbjZG5YaSEjvDQ/RyQ1mzeSzSRaiNgV05Mz/ZkYq0cjAAABnZyfSG8ACAAA
BQAH/DREBAMARzBFAiACKAYf95bToh4jieRBArPGtHFMwmZXFNnXWr/V5i2fhwIh
AO5fmfcFt64RrEiSiz+8ZUePTc+kQ5UWqfqcDNZuiarSMAoGCCqGSM49BAMDA2gA
MGUCMEWItGD23HQkTq/Z+qW0NB90KDAEhpoIvqN0kFv7OYfoK+ELZ94J+UwwJdC+
ZPHEyAIxAPCVwFCeU/P37DU4QlQImrEcGk6YBVivUFsrmbK2YfzfnrpSVDN3bt/x
y2guMZTLQQ==
-----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-----
MHcCAQEEIG2qY0oLeFCeMLS6x+8tjVlW7+WbGHsqmCKm6F/I/DFFoAoGCCqGSM49
AwEHoUQDQgAErlt9cwSzz+fJF+uZI0uyGnaDO5O8pPNlS4iVOC0EIOn7JFjepvFT
i622jFt4Zi9gbV1tgm3hXLNbW/X8/lsiIw==
-----END EC PRIVATE KEY-----
-53
View File
@@ -1,53 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIDkzCCAxigAwIBAgISBe3W4hIHs3wjsEG6aqbFA2j9MAoGCCqGSM49BAMDMDIx
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF
NzAeFw0yNjA0MTcxNzA5NTdaFw0yNjA3MTYxNzA5NTZaMB8xHTAbBgNVBAMTFGxp
bmtzLm1ydGVkZHliZWFyLmZyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAERGEK
grfmOJFBb5pzv6ZS9va1hcNRfi53xwBXh3OYWCGJ4fD8b1ZwFpJbZI6xzsnmMzTs
jQoCBPtEmCk4xCGY/KOCAh8wggIbMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAK
BggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBTgb59HmrQZRn75m9Y2
HPRZHrmRcTAfBgNVHSMEGDAWgBSuSJ7chx1EoG/aouVgdAR4wpwAgDAyBggrBgEF
BQcBAQQmMCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly9lNy5pLmxlbmNyLm9yZy8wHwYD
VR0RBBgwFoIUbGlua3MubXJ0ZWRkeWJlYXIuZnIwEwYDVR0gBAwwCjAIBgZngQwB
AgEwLgYDVR0fBCcwJTAjoCGgH4YdaHR0cDovL2U3LmMubGVuY3Iub3JnLzEyNi5j
cmwwggEKBgorBgEEAdZ5AgQCBIH7BIH4APYAdQDIo8R/x7OtuTVrAT9qehJt4zpO
Q6XGRvmXrTl1mR3PmgAAAZ2coUU+AAAEAwBGMEQCIGQCI7dGWydSuY26+MykEePI
a3whSwzjDk8rkCRN2SDkAiA9Qn37uN+knijljnIKzrz4662nzyuzeO7Xrb/vo04r
bgB9AKgmy+MKxjUSRlM/4GXxTxnZbhkIE8Qd2W15ALMSPFUnAAABnZyhR1EACAAA
BQAHRVQ0BAMARjBEAiBMhc8XM3R9WVy8g5nPyRDGq5euPOy54Kror9/G7eSbUgIg
COFcxoynlPxmEs/Wq/bHXQWR13DkvAZcfRQvvmE69IAwCgYIKoZIzj0EAwMDaQAw
ZgIxAN3CgnVOfvBR0IVTx7lj0PngaPR2l9/PUO3ZGC0JwwgLYMaC4Wj3s5nyEkEP
YOMpZwIxAIH2fwAwnQ4NpwTxP7foq7yFku/+FDNuAqNVk/1XRtoC0gWL0+5jdeOh
LhbPvogGCQ==
-----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-----
MHcCAQEEIFsb2NvEJ2uGR4/+NBFXTo2hS9sqd4V+FGx5zkj038v+oAoGCCqGSM49
AwEHoUQDQgAERGEKgrfmOJFBb5pzv6ZS9va1hcNRfi53xwBXh3OYWCGJ4fD8b1Zw
FpJbZI6xzsnmMzTsjQoCBPtEmCk4xCGY/A==
-----END EC PRIVATE KEY-----
-53
View File
@@ -1,53 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIDkjCCAxmgAwIBAgISBhaxUcnziRQeWEELquhgqfiOMAoGCCqGSM49BAMDMDIx
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF
NzAeFw0yNjA0MTcyMTA0MjFaFw0yNjA3MTYyMTA0MjBaMB8xHTAbBgNVBAMTFG1h
aWwuZ3lvemFtYW5jYXZlLmZyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEtMNs
EPgwS4uHHRgv6iekRln5BLMYn61kMeO9EivXoqCeyAg1YfFk88O7Q45H/GFYl5rv
HE+534b8g5233k0XT6OCAiAwggIcMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAK
BggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBSd+VlvcH6LOX8OHPD/
kP8nvQfrLjAfBgNVHSMEGDAWgBSuSJ7chx1EoG/aouVgdAR4wpwAgDAyBggrBgEF
BQcBAQQmMCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly9lNy5pLmxlbmNyLm9yZy8wHwYD
VR0RBBgwFoIUbWFpbC5neW96YW1hbmNhdmUuZnIwEwYDVR0gBAwwCjAIBgZngQwB
AgEwLQYDVR0fBCYwJDAioCCgHoYcaHR0cDovL2U3LmMubGVuY3Iub3JnLzE1LmNy
bDCCAQwGCisGAQQB1nkCBAIEgf0EgfoA+AB2AMijxH/Hs625NWsBP2p6Em3jOk5D
pcZG+ZetOXWZHc+aAAABnZ132zkAAAQDAEcwRQIgKRJ+dtJZctC7FoKJLnMoQpFt
qr0M2S6xZW+Xap06Yq8CIQCISyv008YBr0QfEH6O5Q0tmY7JSTcUwV4lONBl6isZ
XAB+AGz+UBlDqF6pFrxS0TPk3Mke8UEcfSWEINFzgJ4YGOs6AAABnZ13248ACAAA
BQAHo4LKBAMARzBFAiBodIVh2P5BcJkyiK2gZ3qdkbTdUZU/NhFKzJ6Ni4Rq3AIh
APeVfgb4rgyYfyyPQXxGgTCwdSGr+rupI4V2ZQVslMl+MAoGCCqGSM49BAMDA2cA
MGQCMH40XII+D2gkJcwRgdxhZOBpWHo1mPepLN3TZI/Ii4Vh9mF/HwVaDu9Y5mdU
ZFRhDwIwGOfd9XwZ2XvLbsfqbGxxMz6YDuRWQEuL7IVfjg5vcaGZnLUu7y05fciJ
N5JucskP
-----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-----
MHcCAQEEIJCeZkg84q6THGikzSJoHRB/fFJtzohr3K8R+HeJBQsaoAoGCCqGSM49
AwEHoUQDQgAEtMNsEPgwS4uHHRgv6iekRln5BLMYn61kMeO9EivXoqCeyAg1YfFk
88O7Q45H/GFYl5rvHE+534b8g5233k0XTw==
-----END EC PRIVATE KEY-----
-85
View File
@@ -1,85 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFBjCCA+6gAwIBAgISBnkBuNqlS6inTn4+EF5cDaeQMA0GCSqGSIb3DQEBCwUA
MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
EwNSMTMwHhcNMjYwNDE3MjEwNjMyWhcNMjYwNzE2MjEwNjMxWjAhMR8wHQYDVQQD
ExZtYXNobnUuZ3lvemFtYW5jYXZlLmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
MIIBCgKCAQEAtFGL1Lhh1fgQBQQN4E4ip52qsVbOkfmiYStP3j9KT0n7UxA3WlOa
NTlgcM0O07ZcZf4EixlRB4Q1jiVt8taZDjxwXrCAiscCkMRzt+IgNATRx1B/nePP
K50hjtrwbXPcXvCV0L15/0PdUkBRdpvkTDDI8aS15t8YXyyOhR0O54Z2yOJIKcfk
zdOWG0NlxfN+l3zKkiAVRnl8ILoVFvPM1bTPisKnZ6nYkL8sOx/qpbWJaJtNoWgY
Tszrn05kMgNY2dN+/Fr49uCcQjGN+urXK+Pt04pOlQ+zUdVYK9bRWHovsrY+XIIu
HCufPxGOmBaBiamwJZgnie0bPh32N2L8ZwIDAQABo4ICJDCCAiAwDgYDVR0PAQH/
BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0O
BBYEFOBSZ5AALCGH3Vb2Nj0vAH2mSRr8MB8GA1UdIwQYMBaAFOernw8sM6BT015P
eMiyhA471pIzMDMGCCsGAQUFBwEBBCcwJTAjBggrBgEFBQcwAoYXaHR0cDovL3Ix
My5pLmxlbmNyLm9yZy8wIQYDVR0RBBowGIIWbWFzaG51Lmd5b3phbWFuY2F2ZS5m
cjATBgNVHSAEDDAKMAgGBmeBDAECATAuBgNVHR8EJzAlMCOgIaAfhh1odHRwOi8v
cjEzLmMubGVuY3Iub3JnLzE3LmNybDCCAQwGCisGAQQB1nkCBAIEgf0EgfoA+AB3
ANgJVTuUT3r/yBYZb5RPhauw+Pxeh1UmDxXRLnK7RUsUAAABnZ153rIAAAQDAEgw
RgIhAJkYX7/CAEBxc0f2t/AR3CE29RBg2TpUKuRfbiUhhbQxAiEA9dcHb800qWRP
KzyD5uBwMy9hEwLNsSOAWJ1IxhROCm0AfQBGr4Y9Oz7ln6V33qgkXTaw2e0ioiP0
YXdBIpRS7pVQXwAAAZ2ded8ZAAgAAAUABChwsgQDAEYwRAIgK0sOXpQzfADJ9xNw
2tfIcHx1vt5dm/CxvaAOONuYSbwCIFzZ+H5nf1OpNh9dZAUTdfW8yf8kER5s4c0h
e9a9vYanMA0GCSqGSIb3DQEBCwUAA4IBAQAi+6K4mbH+oP0hrjIP89sQzIym/jaN
gsZU7K6eHUAFgDlTvVMjF//JnmytpYAZXU2be/a7p6hL1IE7P4pXw+klLK40IC7i
xeIeVc2sMxhppHb2VZY4l45IAaIqZr82FkNy4szZxUtr2Nr3aNOO4Frl6wuKXOu8
hZeVeOhkGe0j9eo0adwU4KTvdg7krCEmI9gwnxkFtXZ26QGstwBF3lOzxxU2UVbG
ed1+4F/cui0pOUbxSpGjiGK8/C0XS+cZCjC8QJRyT/V/zBBt7gvfB7tnnDtdQNXk
u0AVM1nvvVcv2uibFoMj44AVL0x9wUVdG51FD0oWnxCaZDhxfWAglSNk
-----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-----
MIIEowIBAAKCAQEAtFGL1Lhh1fgQBQQN4E4ip52qsVbOkfmiYStP3j9KT0n7UxA3
WlOaNTlgcM0O07ZcZf4EixlRB4Q1jiVt8taZDjxwXrCAiscCkMRzt+IgNATRx1B/
nePPK50hjtrwbXPcXvCV0L15/0PdUkBRdpvkTDDI8aS15t8YXyyOhR0O54Z2yOJI
KcfkzdOWG0NlxfN+l3zKkiAVRnl8ILoVFvPM1bTPisKnZ6nYkL8sOx/qpbWJaJtN
oWgYTszrn05kMgNY2dN+/Fr49uCcQjGN+urXK+Pt04pOlQ+zUdVYK9bRWHovsrY+
XIIuHCufPxGOmBaBiamwJZgnie0bPh32N2L8ZwIDAQABAoIBABAHH5LCQOVargcu
xmeltQGJIN8FLvSyvR2TUqoX82xQ0HzK+DXt2yCCqnExs5uwnfiYN6HVl5TqH4iJ
sy2JUwQnmHq83ZrNowtogDtcEi4NhPKz07lzwmUctnA9mG63hGMRUiptF9GkyqDB
BCdde/wkafgbV+qJnLT4/5doGdG3xSuVP0kQ++cIZEjMOI37VzdI6aR/7fxfRxHt
AktbsNiP4Rjdw1XfUaa6J/qXs13m380u8+fnA9WFPp0gCc3sKt6p9xL+wlXrZtSR
QZgf9/ext6j5H6FACYZlyB8Yp+VwQFubb503rTc4Nz2Uo9877lSVpq6JbQRBwM1K
YfyNyQECgYEA2sUBYXnz/Mf4vp14iZAj5xBWhVM4KnWNI30Oo87FtcCAvT3VDK7P
uv79ALnw1TfUzfq/6+hEtkWHsfS5bRSmeOfB3Fm+FO0i6gSRz26Nx7xIbokjOyal
dc7rT5jnDxX6I9OAOq7LQ6hWWhHqEeAH96d2oO9NX10qUf42emMzTyECgYEA0wFe
seiYGOPbZiz33CwHu0XAkWpQZkMClABc6n+F+SE99axtzPQmfDob/mmVmMlc4MBa
t/daxDehRYP3+otRHvx2SHl1GulSBmJM6ef+1gctIh/FGAO6kZrZ7SvznJvKu/R9
arfD7yFE1++Elr2SxsyjLudNQzVPqOOJS5f2AocCgYAB6oPOlMDcT+wPz1VE7yxB
U9VOKaJuTMVFsEy2hpMYumzmO2poSAetvZn9raM8WtbUTwPrTwd7CTTdDCWrnOiw
WmdKRMbza/hIUG3ugStgundv8GeMlxQP6hYJhm9PpIOiWLHg0bMaDpljBJEmQu4O
7zqMwkvNMAW03iMgA0ppwQKBgQCShO0AlQaoofCDrs4eMOTdgb4KO8zAdd+gbfAX
VZ3uNMsVgTpti0v+D0vJCgA7K/g2iNt1y2lXv1lZMB5N99fIsH5iLRTILyQqErBd
7B7k9+67N1xhJJW07dZN/qsXIIdSpJ9CL4D62Bs55rQnCFSXfxoBQ9Q+yxIZsIZx
23+UmQKBgEaTy1m9wi/A3qtshIMcw4wyADZ93uf/rVi9rYFxjdTYcX3JblfWIIMm
Qgj5R/XWc2Inigng1kx3cD3o2fbNWjFAGTXXeaCvPmex0N6t990UCq2jp2o30p8j
2NU4CkWnXsQOr2mr7d2TdS4yAVnxb+iaLG4rBFB9wquJbeGqlevr
-----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-----
MIIFDjCCA/agAwIBAgISBkihEmQzDzkDD6h2jqmzYmBGMA0GCSqGSIb3DQEBCwUA
MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
EwNSMTIwHhcNMjYwNDE3MjEwODQ0WhcNMjYwNzE2MjEwODQzWjAlMSMwIQYDVQQD
ExptYXR0ZXJtb3N0Lmd5b3phbWFuY2F2ZS5mcjCCASIwDQYJKoZIhvcNAQEBBQAD
ggEPADCCAQoCggEBAMhIqvHSPpmjNut00DD0FUswvljRLittP0UmS299xfMMgaEf
lx3rXsaszkYq+/Cyqvv34BkIiLAopVaLembcG0pD9jPDcFd5fn3UkXABybpBRmQ+
pvQDh4yGiPhXSJCMwXSalf1yv44jJbQbqvxH0m43qx9m8otPRGEWx0aXAPXZyp1k
7XV+/Q1cMqqgp62Mv829/5+UboexgUi1xIi521eAigqZYp7pGas13myTZGwy05S8
mYKfbhg0JqbVsdp7QAeKuAx4TBIvXysSc8f/8BvQA+WKcIF3eQvalnsy1L1OMZ5g
mPVIE9FZATa18XCfx0xt7nurWf/f8zxkJj7Vps8CAwEAAaOCAigwggIkMA4GA1Ud
DwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMB0G
A1UdDgQWBBQ2fIe8jiTYEmwMNVN0EgWrz7L7KDAfBgNVHSMEGDAWgBQAtSnyLY5v
MeibTK14Pvrc6QzR0jAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAKGF2h0dHA6
Ly9yMTIuaS5sZW5jci5vcmcvMCUGA1UdEQQeMByCGm1hdHRlcm1vc3QuZ3lvemFt
YW5jYXZlLmZyMBMGA1UdIAQMMAowCAYGZ4EMAQIBMC4GA1UdHwQnMCUwI6AhoB+G
HWh0dHA6Ly9yMTIuYy5sZW5jci5vcmcvNzEuY3JsMIIBDAYKKwYBBAHWeQIEAgSB
/QSB+gD4AH4ARq+GPTs+5Z+ld96oJF02sNntIqIj9GF3QSKUUu6VUF8AAAGdnXvh
KQAIAAAFAAQoeqYEAwBHMEUCIH2htZhA24YtXTDcqoxqdthSBaEQqhfcOxSFblGs
eQn3AiEA/9NIrjEUbfnoKQtHlcbhDK98KI8fpj/FEnZXKgxP8xwAdgDXbX0Q0af1
d8LH6V/XAL/5gskzWmXh0LMBcxfAyMVpdwAAAZ2de+DlAAAEAwBHMEUCIQCUFmwE
pvVNWx9Yf3W+V49NHj/GU+vfcRzw3A2ZErw5VAIgRv/A1gZPSsWTR+6z6rqbVtsn
qy3DoqiCfLrTFMQ5h1YwDQYJKoZIhvcNAQELBQADggEBAKBwxBx3xa07BfQ4AbQ6
m+NF0RhW9KXuhJ57C2PnAaKyHBmd0oZcs3zHW/PYJOaiwc100nHXWB5EoFU2upJc
mO1D9+SyfhpES3jIoZiXZUFRn42Mc5QTqbo7uDeSoNe4ToHIp7HBQBr4pYIYBumc
QI/pXGT5IrCt2jYZIYWMaw2LpN7Tkd5kh0akCKhnZYHAXjhGPGSIxLOxjrtaT1et
FiwriIEvHdmk5HYbudnUsMrjuayoTPR4qD8lJpMqSNguyzM0F+h3uK60OzOlXMOl
A0q65xuFXyg7bfdNxNAN5a0DuUUOLZKRCYuy2EK61z9OhkgKIKbKDashdgxhuw+1
uKA=
-----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-----
MIIEowIBAAKCAQEAyEiq8dI+maM263TQMPQVSzC+WNEuK20/RSZLb33F8wyBoR+X
HetexqzORir78LKq+/fgGQiIsCilVot6ZtwbSkP2M8NwV3l+fdSRcAHJukFGZD6m
9AOHjIaI+FdIkIzBdJqV/XK/jiMltBuq/EfSbjerH2byi09EYRbHRpcA9dnKnWTt
dX79DVwyqqCnrYy/zb3/n5Ruh7GBSLXEiLnbV4CKCplinukZqzXebJNkbDLTlLyZ
gp9uGDQmptWx2ntAB4q4DHhMEi9fKxJzx//wG9AD5YpwgXd5C9qWezLUvU4xnmCY
9UgT0VkBNrXxcJ/HTG3ue6tZ/9/zPGQmPtWmzwIDAQABAoIBAFLiB6QVPoS0D3k3
GST5DYrVPCBjSHj+N821AEi+QtnHFioIebAPBGSxhJdzGFnOhoXJWXriljZYS7vZ
8qh4c+6y20MmoOoCRD9sZVd11fZ3Jts7NjoK7+BOmIY1ELmJFlHb2zBMeUsn7mVv
gb3vNv0XmoBfSQYvonuPQp5KxUH3x5VI4orQjvJSZBtF3ltCjsEe5txzQbCldNhO
JPe9ayevfdBg9G1pxesJbBDLbsR8J0yv86ogJTwulJ9etlzSzvsc/tBkAvb8dn+q
eMCLpJlASLnUeFSKT4/ah7naPLCS5R+j1tzXTxjeZU41VWpsgqlev/7je/zXiuok
PAIiy5kCgYEA/TGw23/gNjNuITwvMOZhB3yEwuCXFIVTu+lJF15hcGBEtPDqrXlq
HMBVJdxhnrTKNU08HDkXfK+vaZbWesxTBkZ4acuplNLTb72C6PQa4DoDNx4dplEo
4m5mgZREc751BDZ4wZwTwV4FBEPZxlsLGFAMv+/6ISN1DpzCX+qZ9f0CgYEAyoDe
/eKZbU/2tdiiXMgC/WMFCe5+9avy//Hy8jk6Mc9/hB0Grr5EbJW0c0I9sE8k7CnZ
4AeeeI4sUtWcySszKt6M38X6IfeF3nSCGzzRJN3HryEke/J+QVcG39JrkMwbc+SD
OWfaNPEjZL7hwoT0Ugx/cyct6jOEbae14PaBA7sCgYAbka2QOPxQ6oizVbpNuMgX
6JcMIShSM7JKY7xxrvUtJ05T5WeoO/Ax8T9UQArhHQ5nf2FsMUs9aGPRO3tfI6Bm
roWt/18XtV0QbbIza2EByU9QURcpZOzuutauhVZuw+455zR+4F/GTlZ9gGXWE1PB
8fVxcM/ri9DTJn6DsyfQgQKBgQDFhor87ullfRhTLKrDAb4Y11t04pQoor729VRa
/YNMTvA9N+rqzGEF4ckQnE58CdckHXaOViA3y8ZkTkUO3PqeGFMle4GPXFfSM6ct
VldTNJmwtA1YcaLBrVfhPuj5Zn5ovz9Y4XoxJf22KZMhIHsJBXPUKSVaS0Iji/GX
LBuQPQKBgBeZRxlP+hoRiZ8AM9aj76yXndO3duWe2qZjlmbvmR+lOB3MzClpI1mU
Td0VoSBOEVqMXAsT/sr2wpxc4NTaSKMAuVTUbN2xCzX7WcDMtvpeXYiCcyVghb0X
xCZxEkIOR1oS/QGvVJN8kH64cZ1plE6zbnGAKpaEO54hWvYcBByK
-----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-----
MIIE9TCCA92gAwIBAgISBkxj1t4HcoJyjhkLx4RqBABMMA0GCSqGSIb3DQEBCwUA
MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
EwNSMTMwHhcNMjYwNDE3MTcxMjA2WhcNMjYwNzE2MTcxMjA1WjAZMRcwFQYDVQQD
Ew5tcnRlZGR5YmVhci5mcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
ALzNN/kM7bnK17O0YmJrbjYSRBoESz5KmXLpn0hL6xp4g7BzxiSrtlyuAHMqs6wB
LXaqoLkk1PQ1zB3AlQBAuNy60U2gM9Y0Sg90Jmk24vjz7ZLbnqtDGKlcYPp/mjgu
+S83JnKyUL6skwwN1fxj8c04UyBIq61v9Lb6KZIwueHpU8sLY6CMUVhGXrK4KDv/
RG1in/Mv8DAarfUGG6AArmdMlybpgMCHHWHse/hYjg3achiSdaQqz+VrBZdibnwm
1jZzi+noOkt+xbk3TJdmaExYqZcfVF7RKzZF6iT4kq4hdpG6q6Xq5Kx3q4WL1kPR
LlOlMNSqfzq/0EbwlK6kSy0CAwEAAaOCAhswggIXMA4GA1UdDwEB/wQEAwIFoDAT
BgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBR4832F
OieS6E9IfPotfx+wUBdZ4zAfBgNVHSMEGDAWgBTnq58PLDOgU9NeT3jIsoQOO9aS
MzAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAKGF2h0dHA6Ly9yMTMuaS5sZW5j
ci5vcmcvMBkGA1UdEQQSMBCCDm1ydGVkZHliZWFyLmZyMBMGA1UdIAQMMAowCAYG
Z4EMAQIBMC4GA1UdHwQnMCUwI6AhoB+GHWh0dHA6Ly9yMTMuYy5sZW5jci5vcmcv
NzcuY3JsMIIBCwYKKwYBBAHWeQIEAgSB/ASB+QD3AHUAr2eIO1ewTt2Pptl+9i6o
64EKx3Fg8CReVdYML+eFhzoAAAGdnKM7PgAABAMARjBEAiAGqYYX80HeAQL1EZ3j
e9/Fed3BlISPHz4CV3VzXDB63AIgT/bMaI85DCBQfz+aEYJrcJWo+M666663u1cv
kc9BXcIAfgAm42RuWGkhI7w0P0ckNZs3ks0kWojYFdOTM/2ZGKtHIwAAAZ2cozqI
AAgAAAUAB/xotQQDAEcwRQIgGtUtRgOHjpFgv61HneX0htbbvU6WZXPABb8IrkG3
xikCIQCzKa0d5Bo+e4viltQonoszLvYqjuhb7rqVQb3OXY3EGTANBgkqhkiG9w0B
AQsFAAOCAQEAWDp+0rRupYRWVgnNjei0u9DleoLf3uSoKm8kO7qJCQ84U/yl8pQa
Pu5/WF3fyAi2xKEq/56gt0qxbx/DbY7ORD1jksurnfmm6PrgEXYo+pzWezL/u/s8
OHCmw271j90FG+YK95EheXCORhrsbVDOuBBKwzclXDJV9WSLryt0Ml+BoZ56m10l
6tLR9s+gpkqZkHQ22iVgA5Qd+POGR3UFArsqthl/TFZ5DooZWs35trDSLQJf67vO
8CxV5q1wFt5qWgIp3zZLWcR+ugk/5mo+oJxCS+31sACSpEpk1BM24uCm/c+kVIS4
XofbqeAVG6D2anngr2QNcfZuiYhHBgDd6w==
-----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-----
MIIEpAIBAAKCAQEAvM03+QztucrXs7RiYmtuNhJEGgRLPkqZcumfSEvrGniDsHPG
JKu2XK4AcyqzrAEtdqqguSTU9DXMHcCVAEC43LrRTaAz1jRKD3QmaTbi+PPtktue
q0MYqVxg+n+aOC75LzcmcrJQvqyTDA3V/GPxzThTIEirrW/0tvopkjC54elTywtj
oIxRWEZesrgoO/9EbWKf8y/wMBqt9QYboACuZ0yXJumAwIcdYex7+FiODdpyGJJ1
pCrP5WsFl2JufCbWNnOL6eg6S37FuTdMl2ZoTFiplx9UXtErNkXqJPiSriF2kbqr
perkrHerhYvWQ9EuU6Uw1Kp/Or/QRvCUrqRLLQIDAQABAoIBABlsRYq5j8inrzxU
CwwiAjZcEaPdNdKT/K4Ja7jc/DIAI190dNca8NScW5Qmc7OIJGU+caOspCj5ljGK
wqWaPCpWKk6acWXOfGCGApFtYh/QHOAHHF+xtRWXymPrdcqgofjrzgy+Gnr/xac8
X7b7haOy321RS8jFcr2G2b0v5tUsDdmV/hL9dfgkpqjB47evhQrWszTNSs2jqBEW
V3Tcwed8Y+P/CHqkBDJwvTZdOdUAzdPiqeIigpjIHqu5NFOuXfysmWTEgtCI2VEg
DVp1HsyN9ztkPUO3NYwX+aqOWKZNnN8RyapROaeUzincnLuueJrOEeFTrIkPwAjE
COu30vMCgYEA+1EKfa+j5HIYirEvj/2FfL6B1dXjTZlN0NmRNcBNd1UpCk/e6Wpc
DL9czGF7XRr4J3SMGXPGAu3DPq66Vv31V6gYp7TyIW45xF0UrEsKTTmUnhHZFJRJ
weELbGJwM4pO1RtEDL7x1A5VwB7+j+sfSckxtQhdEsu9NTrSBRXIZysCgYEAwFHv
2cqmF7EUTRPxd8zSMCnOeomppkoqEs47fN6ikNx+GwCLvXp7m8S7H1zuDyHP0pJV
nCBA2M3mdkrZ3DOnX2E72shl0XjEjrx6ZMa5vVDaG5TMx2jj3YZTXSIrmrrXUf30
hdhU04BScJJKHHuTwi+klLNS9qUuXivgoEPf6wcCgYEAtSMgMJ7bvdgOoEg9Q8cy
40pcQke7YT7Ru2pVIyzLqOsUfX476Hjkh7uVoynPxLefjLCQGfg8C/ha9V7yp6i7
oMZjntzod/f+Yu3D7LrZXffWimfK0u5eiwMtPJ1myX8yep8AWT93BaSfYa31RL3u
+zusPBMfImD+qtMOdOPSYakCgYEAp4I2gOHrDNOltQTb2tbBdEXVnBFvfHE4eCy8
z6QywC3sgKRXEnAuXZxax5RvnSp8ExJ2EohdMvkT9JB5dTxgWckdExBc7rhbq18q
07/rY6OadU+DlWQcpIQs8/+hLyHyDW4+np2wNI+ePoKMnoZcSlSo6wPODRoOauOY
wL6dt90CgYBJcenfjB3wAgFfM0zmaNU6hTTCOmnuPN4hVRWbhAdK7Oxg4yY5Br7b
8DJBqRZk2rA4dMibJZq42rdne0ez0BYwzlriRRf5Jarf0tziZNaACHYvIVEaspbC
rBquKO09pHnP63qZb/Wbc3gjomv2+ozUVycFLBGf+30WTq4iJw3OnA==
-----END RSA PRIVATE KEY-----
-85
View File
@@ -1,85 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFBDCCA+ygAwIBAgISBruRcPy1wmW+Hc5zMDorFZkqMA0GCSqGSIb3DQEBCwUA
MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
EwNSMTIwHhcNMjYwNDE3MTcxNDE4WhcNMjYwNzE2MTcxNDE3WjAgMR4wHAYDVQQD
ExVtdXNpYy5neW96YW1hbmNhdmUuZnIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
ggEKAoIBAQClmjPNtgpAE69Hv5gSR9Ia1zpgWwu2GpGwRQ8TNdK5jdGRqT86OlEq
JBvk9gjm0Hi8J4AvFMFVwl4Jei6To63DQQZGlz6hnGP/Xdfs5ue3v9JjJqGdr2SJ
KHpQ1Szg5O4ov9DvcnxoxOixjvTkUnaEMY1Q+YSqj5OqBmlI8CN7bEice4Jyz2RF
5X7pjRJhfKSH/1qR1PqG3zBq0r6AE7aT6MgI8mw4iR9JoLdeqBJ02FwEhUn6RHv2
1pk3KyrA6nZaJX1tVf2PtGI1UVySJQnTAk6vJIK8z7A/clc3vu5JB9LzmybHGdEy
ar0fdLshWYJB4vOEgZldV9AbdeM4FFkLAgMBAAGjggIjMIICHzAOBgNVHQ8BAf8E
BAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADAdBgNVHQ4E
FgQUAMiAW4PNuTssFcaXcPviExjhWFEwHwYDVR0jBBgwFoAUALUp8i2ObzHom0yt
eD763OkM0dIwMwYIKwYBBQUHAQEEJzAlMCMGCCsGAQUFBzAChhdodHRwOi8vcjEy
LmkubGVuY3Iub3JnLzAgBgNVHREEGTAXghVtdXNpYy5neW96YW1hbmNhdmUuZnIw
EwYDVR0gBAwwCjAIBgZngQwBAgEwLgYDVR0fBCcwJTAjoCGgH4YdaHR0cDovL3Ix
Mi5jLmxlbmNyLm9yZy80My5jcmwwggEMBgorBgEEAdZ5AgQCBIH9BIH6APgAfgBs
/lAZQ6heqRa8UtEz5NzJHvFBHH0lhCDRc4CeGBjrOgAAAZ2cpT2XAAgAAAUAB55l
KgQDAEcwRQIgdNpqOTmlqI02jWbOy4uFCOzNPZoJ3Pc3Pwm7ppHDZcECIQCmKmyb
bNH8HzzAOYRV3oy9tzNEnJ3HtS9RCkpxZq2EbAB2AK9niDtXsE7dj6bZfvYuqOuB
CsdxYPAkXlXWDC/nhYc6AAABnZylPjgAAAQDAEcwRQIhAPFhzrkfHVbFyeh2nsye
qxYgyAiiZtVXfpjlCXWZzu53AiAIUbQNWn+csyXC2wbaUiKPMho2hKNA8dyIRZjY
i3soRzANBgkqhkiG9w0BAQsFAAOCAQEAy1EVyHiOg0W2kWb8XcFAlzvRNX1e53fi
7d4H345d69g0opz3yIsTR2AOK2Kq+Ag/KEBGhjXHJIWpfBfa46LWy9ldqKamUt2v
wm80nj177rTf3Gd94hvMolhV0f0546B+1ZiNo03wtJpggkqjhNZI6lFtYn8strdd
YvZ8iZLCEgkGJhJbe3wOx+QS5RJvCNV7D9u+80lBMLkxMUPbe+qIJA3Xo7pqY7y6
qJOEyyvT6r9XByqGGPTShVphUW1zx4Nr8TDWRAPRz22tCYeXIgdXxiGN2C2FBoBm
S6iCnyGC0UoUd+r6P2YRd6u/EELQyDrgPVtwCGhWw91+a9KgJNnN5g==
-----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-----
MIIEogIBAAKCAQEApZozzbYKQBOvR7+YEkfSGtc6YFsLthqRsEUPEzXSuY3Rkak/
OjpRKiQb5PYI5tB4vCeALxTBVcJeCXouk6Otw0EGRpc+oZxj/13X7Obnt7/SYyah
na9kiSh6UNUs4OTuKL/Q73J8aMTosY705FJ2hDGNUPmEqo+TqgZpSPAje2xInHuC
cs9kReV+6Y0SYXykh/9akdT6ht8watK+gBO2k+jICPJsOIkfSaC3XqgSdNhcBIVJ
+kR79taZNysqwOp2WiV9bVX9j7RiNVFckiUJ0wJOrySCvM+wP3JXN77uSQfS85sm
xxnRMmq9H3S7IVmCQeLzhIGZXVfQG3XjOBRZCwIDAQABAoIBAACRi/X71wMrTiG/
7aS6bGU9Me0cwuiIJNHnGsslFykd7IdEfnwTsS2k3BeoJJWuR4vV0uHWf2ds+Get
7LUDDdiqw3vAjy183PcGenRMwqTl2rIOcuWYsY6q/eiDItlOz+aB6hS4Xub5LhdV
909FXTTM+sA5axQu1AH0ba4bbPPChP04BEVpT3g/3Pi2rXwuGSPRZRrMD5YLhVsE
/52GufglHzXKIQn4BwCKPMG4IEhCqR+ZQV0bFawsWxgbBlEyURuZBS+S0wmnZIsQ
Fz1pZ0pbLbugoWHozNbN1zrTEOd9hRcwLHOVZP07o25Sz4rVhTavnaAMswMyVHIE
hKkenpECgYEA5ZfHFR92bId5YASLGxqcg08Cy6uQaGAwQOg+lt7v5Z+2KKmKoOzn
VRcSu9Bd5w0U0S2jeMz9R0B0xIgAQj9RtAEppAP1cKHJO5sFHn0UiXdqKJRnCDhR
l4IVRxqR0t7qflI28P56bb42ss0NB1CLDxwTd+aDtVMAtXLWNt200/MCgYEAuKZD
Osa9OjxWQF8mJhZs2aNUQU/kj8FMoYa6He4es4SXexCDS8C/Z7P9JbP4P3IRnL+y
EsHRIROlyw6bETbreH0/OXJ3v5XR5TskE2mqcLPOqStkuHsuvQeu8cZeVxVvujmN
lH7XoC4Vs+TnSUTJ2CzU0VTOCJFYpjW/5adsZIkCgYBIuV3nM/MYB4WLw4SojjJb
aXCSQQLZ/PXr6WTB91X33zIdCS8PMFtKWaemdCb6Y+tfItywDAaCRkl2YznpwhLI
OMIO4O4iwixyw/TIJoiVzoyC1BcaxHQb0KmavzDHobKXVsVuar0u+9xpoIfq9DlI
DPWhuhOoIOWNlBWEhY+cvwKBgGmizLFyg00uuZVoGdYOXEWCWDBpOXQ4fNOn1RBM
awn+n/7KqqKK6bW1Vezc8feyFXtce86ZTUAkEmSBvZrylXHADYya/QEBACypUfE9
MUH6zA8iASQ9bLa+D4rIFq6xV9LtHB9JFajQ1J+vI9ZZ4TOoKjR71Mc4B8RG2brT
toIpAoGAED2mY/GarPck1msFlS//NbUfj5i5lwYEnPS+YZnjqvJKbpyKoYPCIkxq
NAzs/F4yMO2b13q82aL6GGqRMSBiVrH5SB9XR0oflKjxP9nxJWF7I0ygaebEpR9U
XIdbsuOX6iYxUyGsUc7YtPbZHDwcf5veqynxN1JQKBa70DOY0kA=
-----END RSA PRIVATE KEY-----
-85
View File
@@ -1,85 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFATCCA+mgAwIBAgISBfxLNeCS4W7nylq7/+hmqv8PMA0GCSqGSIb3DQEBCwUA
MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
EwNSMTMwHhcNMjYwNDE3MTcxNjI5WhcNMjYwNzE2MTcxNjI4WjAeMRwwGgYDVQQD
ExNuOG4uZ3lvemFtYW5jYXZlLmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEA+F6JtJ1rkgWpMlg/f4fr9TWhJJ/eLRX0ohLOGRYo+mltPBwzHeNjOxyg
hanQtDGFFyl8xsi/OgCfGlt2USYEIj5kzAZ3btC+bBVc/tRvkkMkP5xkuG24g7rW
N0tA4htehKbDNZlkuOIET20Pd5MeiNc5/g2AJ6UhDXpHZQkTQfRrIo/Y5IAN4fNd
yhH9o1eFR2oorrjRWP3c34lZmVGP1NYeH6tCMokUMGWyZ2bYN/cp5zgeuRbM20v7
7qcxECdxXIreXtMySbQhQJ0hreO12Rdbj+3AwdBA9ove2jAvh0xi9/jIZBLjI8+P
eszrRLIyslcvYWU4uNaR++dZ59OF4QIDAQABo4ICIjCCAh4wDgYDVR0PAQH/BAQD
AgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYE
FB0tu6Ug7Fc7Yju8qmWOJcpFhlZqMB8GA1UdIwQYMBaAFOernw8sM6BT015PeMiy
hA471pIzMDMGCCsGAQUFBwEBBCcwJTAjBggrBgEFBQcwAoYXaHR0cDovL3IxMy5p
LmxlbmNyLm9yZy8wHgYDVR0RBBcwFYITbjhuLmd5b3phbWFuY2F2ZS5mcjATBgNV
HSAEDDAKMAgGBmeBDAECATAuBgNVHR8EJzAlMCOgIaAfhh1odHRwOi8vcjEzLmMu
bGVuY3Iub3JnLzE2LmNybDCCAQ0GCisGAQQB1nkCBAIEgf4EgfsA+QB3AMijxH/H
s625NWsBP2p6Em3jOk5DpcZG+ZetOXWZHc+aAAABnZynQCMAAAQDAEgwRgIhALOo
ApinzsVDPzHAg5ysav35pbT5kf4CyAAoscCDa6hPAiEA2zHhRi1U+WVtSKBYmj0v
BA9vISkhYOULjMlVb5IGPY0AfgCoJsvjCsY1EkZTP+Bl8U8Z2W4ZCBPEHdlteQCz
EjxVJwAAAZ2cp0KSAAgAAAUAB0V2TwQDAEcwRQIhAPXC7+1/SPW5dwWmhsThwioh
OtdKEmsywL660EE8+m+ZAiAsa9RhnLD5YnB7HIXvNzzMyda4hfN12uvKdZIarQ1k
kzANBgkqhkiG9w0BAQsFAAOCAQEAX0N5nZGvJ0g/b2yMHxE6aF2Qombjl1Kj1rJG
fmrYO7IcRJ6HizI8LFnwnwwmxd4oLlYlnDCnd+2Vlp39bC005usK4PHp1yO9tQPC
OVYHIy72Gq1VYKnda1q0l+KLXONBbCihYLiE9xLADtahxWg/G5pdBnJ49CVSavp0
U24gHh+mvL2aSJ7BooeHEHAsetSpDWnN4b1M0V29nkZlApALULvEONexDfQmKPgC
lVB3pWPvGuJnvi12v7rLEhxH5aEJn2xjPqHmPZxT7C3qR6TA0Eh7zfNvJsNHenAa
M331acxfJm9CYXfxahTnYFkoiyzIhfA2tPeP1zQzYMLx1uQzTg==
-----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-----
MIIEowIBAAKCAQEA+F6JtJ1rkgWpMlg/f4fr9TWhJJ/eLRX0ohLOGRYo+mltPBwz
HeNjOxyghanQtDGFFyl8xsi/OgCfGlt2USYEIj5kzAZ3btC+bBVc/tRvkkMkP5xk
uG24g7rWN0tA4htehKbDNZlkuOIET20Pd5MeiNc5/g2AJ6UhDXpHZQkTQfRrIo/Y
5IAN4fNdyhH9o1eFR2oorrjRWP3c34lZmVGP1NYeH6tCMokUMGWyZ2bYN/cp5zge
uRbM20v77qcxECdxXIreXtMySbQhQJ0hreO12Rdbj+3AwdBA9ove2jAvh0xi9/jI
ZBLjI8+PeszrRLIyslcvYWU4uNaR++dZ59OF4QIDAQABAoIBABU/6GX7tHcENTlN
l9QyVb+vaJO0ulpu5xThSUEX9mZTVBFZI832NRia/shk0qqCFJ4aUnbC+OpuYG5t
vhocB61C25ahpIEGis4+Ryw10nxn8m9fUvY9C/T4TKjjL0BRIWV1y5yXvMh9LOt7
PCApxgpk6K0p7EmoDQOFT1uverZxFv3RGv/aPKydXXIszSvemMKnFXrfVkjoWyT/
nE8zZrC+ufqrY5Hok7jsKrMJ+Bd9IUPv5W+WQwZ/HX6qpLsLuUka3jxBiFy9W5Zz
87JvQ6pUoLSAhub6k3N1LPMxzi6zPNWsirKcMN6O+WQrfB/rBGuZbcjA+DkjYAIt
QSGQ/9kCgYEA/gb+mOL/4P569XgQ2LRAy4RWs6Susk9J91FmH32w2zuXINgfXgTI
lJai807BBYYFYUpzwe/x0OKGXYmjJvf7K+9yV/AiNFmszOYBJAYEzYcmZa/G2yVJ
1Jk1l+9+/hu0pyOcFpNntG8KXgrvjghQS19oczzRbWlAfqTBTcjc4VkCgYEA+kxL
lNNZPaU7wwsGvQv/7npTAqB03qJmLogpgIehGTfcBmjmC7EmRA21ruhQHtE7TprD
H8XO6Vf5z1M+Ve6gvIc1t9gGbSkpu87gcgnfnzy/xR1TjB6LI/guEFc47z3KsiMo
rlDDIUtudE+eteBIHYBJlyLKdQV+P2tLOGMZb8kCgYAphkkuAsVjKRY+dA8E7Yo9
+ncVzJDGExH7PLId6bT0UWxl8Q5Hly6Wo30lmrUQyxSsD7iWdjuoMq9WMP6biyPi
zbR6TYW52wLVR6/eDKHSWwpayv4Nqq3D8/t/x6WRskO4oqiMRDJKm3AtaUo5hIBj
ocf4NnPhl7f0O8hhh7kbmQKBgE1J8+jP3nWvqSWQKROFOhFcync8Lvp0cVMbDp22
w+MyoYmFKMwhdqx7A0gwSlVJzKN4HJqaDUt2tBf2H4CPgCjXI5pSZaGdnVp2Bk6Q
h/H240ytwpe48sQ3pZm8JUOS9B1PyAcTvz1vunrF/z8wM3SQoai+wH+kI5jXu9F8
oGUpAoGBAI+MmNhhPs0Dqo4IfXPQc9yIN8c+IdrC/mIe0Ia0LdZYVfaIDlrwsFcj
NszTYuDhdFGznbj9uKdDNLaOxlQ5rSJIDnWs/wdsdCAPRyTssMifAI3KccxRCkJs
ExGEPM1QoGIyChLHAzUqhoc4hGYqCKLy6Ndy6KxhM9Fo0S5krgcI
-----END RSA PRIVATE KEY-----
-85
View File
@@ -1,85 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFDDCCA/SgAwIBAgISBsX9TFGc+7Yp0Tsmqm2dl3HGMA0GCSqGSIb3DQEBCwUA
MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
EwNSMTIwHhcNMjYwNDE3MTcxODQyWhcNMjYwNzE2MTcxODQxWjAkMSIwIAYDVQQD
ExluZXh0Y2xvdWQuZ3lvemFtYW5jYXZlLmZyMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEAvu8NyJmZ3r674XBTJbDR7mcVZAJGaCylAIS5Kwg9iwCN1QOx
V3TdNd7J+8XuUpu0aoP/rw3kOXhqqJtM5P9rodL+kMXVBKrYyx+k4ODkFaz3ly94
Nm+mL4CjpHklLVJ7y26uRpRPFrAJz27d1E2LHpyi/udFIqXJiE7QASoswOR0CBUM
7ki4Py+RHKoiE/cJKkqb6UaC/pTqiCnx3WJOdIvb4NfuhyWr6xt4vSb+ggA1hUty
PZIGBroRGi40j5qKC9xjSwiksuaLdqnrWw1aB3ib7aX8u+KWI8pf6VFZiPTirDhN
4TmChqlYap1d5RJzxAB+g2pKnhhlLC6tdUG1lQIDAQABo4ICJzCCAiMwDgYDVR0P
AQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYD
VR0OBBYEFMBDr4L0uw7uy2wIEICofzLw3wHGMB8GA1UdIwQYMBaAFAC1KfItjm8x
6JtMrXg++tzpDNHSMDMGCCsGAQUFBwEBBCcwJTAjBggrBgEFBQcwAoYXaHR0cDov
L3IxMi5pLmxlbmNyLm9yZy8wJAYDVR0RBB0wG4IZbmV4dGNsb3VkLmd5b3phbWFu
Y2F2ZS5mcjATBgNVHSAEDDAKMAgGBmeBDAECATAuBgNVHR8EJzAlMCOgIaAfhh1o
dHRwOi8vcjEyLmMubGVuY3Iub3JnLzcxLmNybDCCAQwGCisGAQQB1nkCBAIEgf0E
gfoA+AB2ANdtfRDRp/V3wsfpX9cAv/mCyTNaZeHQswFzF8DIxWl3AAABnZypRgEA
AAQDAEcwRQIhAMUqMy5wxRJjrFmsY5rrET6jc0XnGx64tZtCOFWG5N0KAiBQ5OTn
u/cKyDQ8QuDQobKafFgdEJHtJQLm934U80xUWQB+ACbjZG5YaSEjvDQ/RyQ1mzeS
zSRaiNgV05Mz/ZkYq0cjAAABnZypRjAACAAABQAH/L2kBAMARzBFAiEAwGQdQ8KG
oFLFGBNfW46zpq6FnD3z755YOQ1d5YwAvaMCIAhQqE3wScztf26cEYnqlLsC++mj
GEDfQWpGHxGZbyxaMA0GCSqGSIb3DQEBCwUAA4IBAQCVMXpuplYqlkrW7jYFpizp
BvQIIzambTVjvOPBXXNxqIkGypuKvhCxRCVqnXHfEut2FHEMbpe01tPxlugw7Ndv
vMWCUEa64MB/xrZgZoHMK9Jlald6ZZsh9P764nBk+5u5bsQ6Koe3SBxOX4rlhZw1
fkm8SdCS0nl/aPSbHHNwUpoUK/6zczRD5J/4l+u5PmEeyrcSIGvKXC7WGFTEhP1o
H2OAUnE0iDhodU4D+OiH5j4oIZPhdqq9mpH3mMQeSO0mWT70++peQ6Lm1rRcv0DR
/DilALJA67BaNzCjT+W/8IutyYpKYfS20CFiOzsNwxB0sToamxjPbnmaNdVY1Vvq
-----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-----
MIIEpAIBAAKCAQEAvu8NyJmZ3r674XBTJbDR7mcVZAJGaCylAIS5Kwg9iwCN1QOx
V3TdNd7J+8XuUpu0aoP/rw3kOXhqqJtM5P9rodL+kMXVBKrYyx+k4ODkFaz3ly94
Nm+mL4CjpHklLVJ7y26uRpRPFrAJz27d1E2LHpyi/udFIqXJiE7QASoswOR0CBUM
7ki4Py+RHKoiE/cJKkqb6UaC/pTqiCnx3WJOdIvb4NfuhyWr6xt4vSb+ggA1hUty
PZIGBroRGi40j5qKC9xjSwiksuaLdqnrWw1aB3ib7aX8u+KWI8pf6VFZiPTirDhN
4TmChqlYap1d5RJzxAB+g2pKnhhlLC6tdUG1lQIDAQABAoIBAAxJgwgRRnMssBeS
bG9lASWH8br1YIWMtfOiFu57gcZjuzzll3CK3z97vmDa/HrJdWNTak1gJftC0g5W
rCyieVE5LFOxv4Mk4X205B3qqxLwBiDvF5vdNIMjEqTffPJ9N+VAEqwNGEfb/U2h
k1n5wYWvS9f+lxbjN2RzufQRPD8PeCVc5/iwg5gX5HS8r1b5Yat8+JEEqXw4yH8X
fRAM2Cs0czhNi8xCnuBLhR0By2Og+mzfJ+sCyc9PGLuECQE6Buwknq+PtOC5lGMJ
gI7nNrRhm2c8pFakjNV/5Ym4fJzyHcmMxT6/ejj7beC829krTXj/SNaNnoiIe0g8
FNoIKNMCgYEA5KgCxJAUr6H4nkPFSGV8PNBqvPNasrw2wSrBTlD6kqQgaAEr4ZNF
JqnlFmTMCU3kAPvzO8pohuFktmKTQjkBlSvWdPkY09+2BnPRoXYakV4lgRq/Ktr1
wyZwaTgSNUmLjMycRtVMejs/2qIJWRfV8uRL/ZIqXq420uqhzSLhxbcCgYEA1cQ4
7Y5HMo0J/2d366OSGR0Line2jK1s5fc42+fTAbTio/431dlqwVoyUqcWjkrR4BzW
3/ksiuKhYL/+8qA5WIiFtrVWtHuDANx9UyBbTUDu16OVatLwzSjUHnlHvZvnTZPx
r9nGTtRukXhpAgnGX6cto7Pil0hJ/FCz/efoPxMCgYEA2A3c16igszfjuH+m2Ppz
wu7X/IQhjkODpVBl6T9hFNCagkuhD/tc2uSrv1Ys6Rm9OCTZNwTRcallxWQtauR8
l1wdvtdkW0bGMyCa0urKvdLssyn3umG82NHoY7OEmO9OOhNYEyIWqmRzuH1lQdbg
5SpMl2PWPzJ0QSVND41HMc8CgYA4937YR9dPcGieqLs7j66qhKQDtZ1vZfQkYLrF
V8VSqhrP6zqEAdnCR0Ar6J1JNEUz/VuB+oxVQsoQ13mgvPQrVM6Vf0Po+xVRUHER
iwjp0IkV7GEwQ6Cqe9vzdwyYSgjdErUQ0O9ZKKGCoN0TDvnPmeS+wHx9JmWZGQSu
gHPTAwKBgQDOaQGVCwFPUXU0eezz3hDeLjhqic+nCWFSZvaORCOzSHqc9w0X8TlD
X9njs+605fqQZS0hxXMHNvf9CMcJZNBKMkF9xP14oAOaU5+Pv1chJWN3CJBdCqj3
YN1zIMVIJUxA0/0HmG625UZoYe31HvitvC+0OlKhDlK/maSBuRzdBA==
-----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-----
-85
View File
@@ -1,85 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFCDCCA/CgAwIBAgISBnq83V/vJlnKwMlpA6gWP08rMA0GCSqGSIb3DQEBCwUA
MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
EwNSMTMwHhcNMjYwNDE3MTcyMDU1WhcNMjYwNzE2MTcyMDU0WjAhMR8wHQYDVQQD
ExZwb3N0aXouZ3lvemFtYW5jYXZlLmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
MIIBCgKCAQEAlpsG6EGKrt7R7QHgMhb+7gddcXG5phOg+h0pe/m2TEgsQ3VM/1Rd
Qu23se5AjoIDbsTx/ITYCbErSKwlDs7WbqoKYMjKh7t48hwOxMXUUFACzlrUjsBE
NlqvqCfvAdtTS1xt1FE0v+pDmKZEm3htE6eH3vb5W3I8DwmvW26Q9lxddDv9pZ1T
t1ykbMsHktZ1XARI1xmolPoMc6esYDOPhx6wf1HKP4LDFqlMGcjX28M8NPzPpuZf
9bWzPw3YUalf9I1US7dmREhWeBHa6lkuXkL6HDLZf8Hw2UPoCc/CslXteEFY2DrR
ABo2Rz4nKiBJsUn2ljYYDKVShJGZxbPocwIDAQABo4ICJjCCAiIwDgYDVR0PAQH/
BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0O
BBYEFG6cv39kdsPqoobce8oNU1geMbtEMB8GA1UdIwQYMBaAFOernw8sM6BT015P
eMiyhA471pIzMDMGCCsGAQUFBwEBBCcwJTAjBggrBgEFBQcwAoYXaHR0cDovL3Ix
My5pLmxlbmNyLm9yZy8wIQYDVR0RBBowGIIWcG9zdGl6Lmd5b3phbWFuY2F2ZS5m
cjATBgNVHSAEDDAKMAgGBmeBDAECATAuBgNVHR8EJzAlMCOgIaAfhh1odHRwOi8v
cjEzLmMubGVuY3Iub3JnLzQ0LmNybDCCAQ4GCisGAQQB1nkCBAIEgf8EgfwA+gB/
ABqLnWsP/r+BtHk5xtIxCobW0QLU8EbiGCyd419eJiXvAAABnZyrToQACAAABQAJ
7p4NBAMASDBGAiEAhdkEKkPg7qTkBnpGtVH3rDo4wagcc8oYeMnZwA1h/IQCIQDu
2hKKCmF8QBQ43B/5sqvsC3WkeFAh/FU5RQHfeXRzqQB3AK9niDtXsE7dj6bZfvYu
qOuBCsdxYPAkXlXWDC/nhYc6AAABnZyrTyAAAAQDAEgwRgIhANK7baIbHeLUCZFj
2EgVFDkCpXm4BfawiEiFotMTIiL0AiEAk8eGz2l4sdrlSxFAeIgDrsJxd0dPuvWR
TslMh9w5qYUwDQYJKoZIhvcNAQELBQADggEBAE4eS6z7Xvpefv+i2vGEp7PZcfDF
8/nkqPgXIT4oZlcySt0B6/pt4jZJjxk6tqInFvjo19RJSuchwDmGvQ1szEcXfgx4
AvWzwyGb0f7lc1Gijl/NRx7kKnw4eZDx/fiiHAXNWPSjrNtLG9M2AjNoZoxmPNo5
A0M0BRwd3/lKuDiraPsaHOqlCJMh0YEVnaRXb5RWbO9CY6nrx1qIiFxEwV8wXVoS
VEqFrAjL561nkr52SZy2/YMhwagM4On3B4NtVqRik0oX2BAIVLkICmqbTB1EtJVB
IOPcDPSBvTKCgQAqw/0uosIRNu9XXITNjyW7pzk7YzBd7EcRxELaHcGuSbo=
-----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-----
MIIEogIBAAKCAQEAlpsG6EGKrt7R7QHgMhb+7gddcXG5phOg+h0pe/m2TEgsQ3VM
/1RdQu23se5AjoIDbsTx/ITYCbErSKwlDs7WbqoKYMjKh7t48hwOxMXUUFACzlrU
jsBENlqvqCfvAdtTS1xt1FE0v+pDmKZEm3htE6eH3vb5W3I8DwmvW26Q9lxddDv9
pZ1Tt1ykbMsHktZ1XARI1xmolPoMc6esYDOPhx6wf1HKP4LDFqlMGcjX28M8NPzP
puZf9bWzPw3YUalf9I1US7dmREhWeBHa6lkuXkL6HDLZf8Hw2UPoCc/CslXteEFY
2DrRABo2Rz4nKiBJsUn2ljYYDKVShJGZxbPocwIDAQABAoIBAAEeNH5r4iIrMEbA
oU/t4MWWk2iArh6f/a1tov2zHFnTnVSA3en1T93r0tXEzYDhUTI0zxEPUWU9BfO7
p2jFO01GAN64DtzUFPFDKQ7n4wwXk/XBMdu/bKI0qSIn7bvHS4Z/MKeHVMtp60eK
UG8RBUpEj5slnTNDFVQNP9p/Zx8VDIbuKU4MqccZzP9qNU86TpsLnU/czIe3vpM3
Hm1l8FekZ1bYf3imgiA6dOS4B7AHhaUlfpG4FFJ6pbUwwMdLLfiXKj94Vy/BGQ6t
CfXtrVOV9POV0oUKC4uVfYUqnOeRcO7ceQscyNjD1ghpxEv6J/r3QENiz9a0Cs3t
WT/5rhECgYEA0GKrpMJG/wDqKL2OIdVxO+c9+8Os3AY1qxP+gO3XqI4C7+P3akAB
ysWKahY5DMs4DKJht0zPA/Pz2VlrXHzpCXnoUXlY35+gsQZkqXKJeqCG4Jan1glh
jGy8/C61CwCVqRaoloO+Vs213Ov7KAvkKKkdiDFSLZXsJ3jPIWHvulECgYEAuQSS
l2VTynG8XQ0OvHdZNZZWB+RFY9VlxaMtLDogDRSa112b+/DH3NRds1opwhZ8GNtp
hKNrRI9SuRgr1xp+8uI8YXfQoW4K737H9TwDqZrbIFcXuAZCnfnLiV9gI7wX4UuL
p3LVbYqy3EBEdvcOomowhTZICkqVpSRpL1bpQYMCgYBLsRuBvCPHqpBjff7roTkB
NkyYb4oRXZwO6TNPp5TnH7ZHZrnO+TLtcXWGdU4BrKtOQ4lU6Gxlli4j68wIi0Km
c4aEWZyDldrrklPsDLONPFPhrjeGkl/BfxniTCDsvyidg6J3EaGIrC378ieHc1JL
xqn4d1nPPx7Jc6NhD87hEQKBgCeEkIMBw4nkDSWa2mDq5QULHUkGOsP+GoTCO63M
pHfmxMPnXJ/NaAME4Raj1XN9NfhhNQJ9nTXBnxulzAdfw2nBZMA0xT0VsgRBghgh
P28EgnU/5PMLc0MmzZCD7Jb1X+xhJG0Zm/iPvXBJ0dXPIzMRl1d8ppp8H8ZsJoNT
/vJdAoGAR6C6LyF+AZpI/ga8TctLOoPftjuOatQDPaPB2GFeTFwGMloyRB01q47G
w56K3+KAKBroRauo8ZksbEAn4NDon3xrCSvGfblV/4R7voIUeuGB+8ssero7cyl2
VHGdkC2xEaUCIM18z50mvQEFERYCgofJ+g6cDcKRLuXEsha6kxE=
-----END RSA PRIVATE KEY-----
-85
View File
@@ -1,85 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFADCCA+igAwIBAgISBbojGBP17xvOlJdciTKYMpdSMA0GCSqGSIb3DQEBCwUA
MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
EwNSMTMwHhcNMjYwNDE3MTcyMzA4WhcNMjYwNzE2MTcyMzA3WjAeMRwwGgYDVQQD
ExNyc3MuZ3lvemFtYW5jYXZlLmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEA7DdHmNWL3B7XFwxjQke27fT44BkGTHV+4Ru/eHphsGULUpxmTYqWI++r
bWxdNwHMyR44LW3mqORK4CfrW1c7sTwTl76vAxaE0JNRc41bw+RE/J954uH/xGyF
EEhP2v6xRV1Qfgk/6ljgcdP/QFj5/YETgffjC7eM8vSVRK6B8R6zktTganalDQLg
3dRC5tSR0tY2BtvzIuRytr/S2rhnzp0fjOAL9KPJt+jSJZNP0TV3/iN+VPyWAZ20
GHFNjU7XAoUD3rWv4ZZ5MGbX0du9SVr4fSTqwHTgscdFv0OD/ZRY61Ww4kPjxLGB
PbDQ5Bwc6pB6yPQ0YJnMq2xTRI62vwIDAQABo4ICITCCAh0wDgYDVR0PAQH/BAQD
AgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYE
FAIHH2G28/5Z6S4dSYNl8AeSZ4fXMB8GA1UdIwQYMBaAFOernw8sM6BT015PeMiy
hA471pIzMDMGCCsGAQUFBwEBBCcwJTAjBggrBgEFBQcwAoYXaHR0cDovL3IxMy5p
LmxlbmNyLm9yZy8wHgYDVR0RBBcwFYITcnNzLmd5b3phbWFuY2F2ZS5mcjATBgNV
HSAEDDAKMAgGBmeBDAECATAuBgNVHR8EJzAlMCOgIaAfhh1odHRwOi8vcjEzLmMu
bGVuY3Iub3JnLzgzLmNybDCCAQwGCisGAQQB1nkCBAIEgf0EgfoA+AB3AMijxH/H
s625NWsBP2p6Em3jOk5DpcZG+ZetOXWZHc+aAAABnZytWNQAAAQDAEgwRgIhAMPV
spPLESIFD9nhOfyWT3yrm6qpukIgr1YsqEvnDwjyAiEAvvyEPX7Q6NhCsyJicTx8
thRnXqNuiu1CXPYcJub2qDQAfQBGr4Y9Oz7ln6V33qgkXTaw2e0ioiP0YXdBIpRS
7pVQXwAAAZ2crVlJAAgAAAUABCUwiAQDAEYwRAIgJbgsAhjZYm+FOC+nkfrP0Sx0
u2pmTPnil+1/k8aScBgCIFlx26SW0PJNJdMs9n/3yCVx8X0uhpSH6bhfBgbMaLlB
MA0GCSqGSIb3DQEBCwUAA4IBAQCizNlyMfAJ5JP6rLNgtOanugdpa8eEj+aAGnx6
ZvQmlx80qkq+5S3YffiF1dS2ymzSus1txyq5I/lPRFv2KXz3fCY6wxigyfaR8f2c
rhqvQozOcTEfObEg/v6FHmesbJpFOIkFtE93PPBkDYkfZ71agiPKTsQ+3rUBaIZK
K36ob1ZgxCTq476WipEm3wumgSTkzz88JU2TgS5qaHiWl8rLpA+IaxtYlOWexMFw
Gow211PF3jZk64to+GyC+9KAZ6DJKit31JAAMIR721bp1b8FVs2l343d4pL9Bx7x
H5tST0Pl5il8vJw/fBH1GBdr31zdaZfnYYNoemdKIO0msLcy
-----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-----
MIIEogIBAAKCAQEA7DdHmNWL3B7XFwxjQke27fT44BkGTHV+4Ru/eHphsGULUpxm
TYqWI++rbWxdNwHMyR44LW3mqORK4CfrW1c7sTwTl76vAxaE0JNRc41bw+RE/J95
4uH/xGyFEEhP2v6xRV1Qfgk/6ljgcdP/QFj5/YETgffjC7eM8vSVRK6B8R6zktTg
analDQLg3dRC5tSR0tY2BtvzIuRytr/S2rhnzp0fjOAL9KPJt+jSJZNP0TV3/iN+
VPyWAZ20GHFNjU7XAoUD3rWv4ZZ5MGbX0du9SVr4fSTqwHTgscdFv0OD/ZRY61Ww
4kPjxLGBPbDQ5Bwc6pB6yPQ0YJnMq2xTRI62vwIDAQABAoIBACIrPOgWu8xziZmD
6TfFN+jj7rw74nVc6aWWZfP/f/IMK78fcIz25xD7skh5zGIQmJbfEDFCHIOBwnL6
U0k7LR9OGWdx5c8EiuHA7Z9Ra1zCwFfqma8AEgdPy0+3phV/khT+ko4ouF4lzRGq
INomBMNu0GuUd/tR6cmbJ5xvwcwm5Z5LM5svUUvJBGxGGcnjR1IuZHRquaNURXUr
fYGBziMql/8oBC7aIwsFIBfjemio+sCQ2NvYnAqs+xirfGMMV96nctLC7RwKJFqW
zJAEQedipeNG2Er9EIi2jLk7wyOFDmzQ+sPim8ukKQlzbrL68dphWOFMbDWsRkA+
Q1Ag68ECgYEA9fwzApgW6bVr+YjShx8dPYzHDEfK7tdFxo0MSAI5d1F2qooRu8JG
W22TotChbeHhq8YqQBWTyI+HKQZ2vdIBPWIPvkHU5a5VlAfBewHdCvuLlN3VRyhd
V0Q4SxGZ32qUwp3uylz/61+oQnYWXMzs2vmiDLT9cMuI0r3kX6AcaS0CgYEA9dVC
i1cn38SfwWId3sclsJazmgIPIAAQgETlX7hTT2jSxD+C08q20U+DVQCYYe5fJ8Z1
bJF2amnZ5d4rP59qQPjVlUUDW9W7KN2Y2wIXtF2sdx8TROv8AWL/Ys//uOaZInUr
EgcsNxd7L0ou3VeErSqGpU+pfb8uCO2gDS2DexsCgYBniH7v2JPMSk/n926k8LOd
9GLTCGShonn71+ITbNxDHEaWAQb1wA9c7AH3xVgsp6YUZpPh5TMOd1qsKcxQmNNs
wplduteg1H+wjpMg8ufWd4mIXtYl3RdsY4pODlp1bqauQ0r+YaZVqy1my80dwiLv
B6LtNkB1+TTdfo9gsENFAQKBgDSLeMW/w04ZAOycxDWx62RrUchBWGpGmUBReZWU
GHqItUQtLxGF6r2ieTfaALgt8zjVOpQSI3VrWp+/dQ8MS/HHPh/BuI4QiQibFOj6
8YYj35E2my/IIP1K47uDKe2jnGe5E5Ou5MyBwFrDSHEXG8zHojADbv7ptjVCVUt7
xvaxAoGAAkA3xxEKdN9lK96X1THnr+pJwEkHIZDnVDaB3O0CVOTVoio+q14HY5CU
dJ6uPv/+L2h8pfWcwu9ZSYYuCnTRkeQwkgjm/a90nVly+aU2/o8Z9Ga7NFw3gQRQ
m4eHneweUPO1Njd2MZoX2WqqV1G4fq0idjgQX06a92I3Lk9jSFQ=
-----END RSA PRIVATE KEY-----
-53
View File
@@ -1,53 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIDlTCCAxugAwIBAgISBTtNlUHa3pbEoLoOa6MelfNrMAoGCCqGSM49BAMDMDIx
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF
ODAeFw0yNjA0MTcxNzI1MjBaFw0yNjA3MTYxNzI1MTlaMCAxHjAcBgNVBAMTFXN0
YXRzLmd5b3phbWFuY2F2ZS5mcjBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCf7
neY/wnyRIq3O5bLu29iHwu4CVj9S+KOUD4WH+q3X0ZlJSNY8LHTSKQf9pkEWf0o3
jRgXe7LUgIWH8w29BESjggIhMIICHTAOBgNVHQ8BAf8EBAMCB4AwEwYDVR0lBAww
CgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUoy6LovEOCyc0RjRQ
xJrEMYSFVCgwHwYDVR0jBBgwFoAUjw0TovYuftFQbDMYOF1ZjiNykcowMgYIKwYB
BQUHAQEEJjAkMCIGCCsGAQUFBzAChhZodHRwOi8vZTguaS5sZW5jci5vcmcvMCAG
A1UdEQQZMBeCFXN0YXRzLmd5b3phbWFuY2F2ZS5mcjATBgNVHSAEDDAKMAgGBmeB
DAECATAuBgNVHR8EJzAlMCOgIaAfhh1odHRwOi8vZTguYy5sZW5jci5vcmcvMTA4
LmNybDCCAQsGCisGAQQB1nkCBAIEgfwEgfkA9wB1ANdtfRDRp/V3wsfpX9cAv/mC
yTNaZeHQswFzF8DIxWl3AAABnZyvWUIAAAQDAEYwRAIgZ9DxzbvlUkR+K7eots93
yZFPOJldqN0uTJBUX7jtLrUCIGnxd4ay0WhkcK9ly5UTvRIUF1AMDlqKlLvcalhv
lmUqAH4AbP5QGUOoXqkWvFLRM+TcyR7xQRx9JYQg0XOAnhgY6zoAAAGdnK9bbwAI
AAAFAAeepHsEAwBHMEUCIAhvdAp9P5ZfGPgb1Agjua5k6XlQyOEfgPJDBqTCB/Y8
AiEAjokxkF6MhDsQg4iWa+MPOWW59DOTph54wmaEN3PlWKEwCgYIKoZIzj0EAwMD
aAAwZQIxAMQixbfYQY0E5RDytBjZSaQ9evu4Q9z8lceWNijtKitJdhfBcHd+zbuD
eZUcKN4PTQIwZxmuALvsfsoyLVtrcK18HBt4FMrTcetvoXsUJRdF87YLFxseO1sz
Y26j0bVojxtj
-----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-----
MHcCAQEEIEBUDcPu1Cd1huCZihyy4quXbar4cNOmLdGYMuxoPcdboAoGCCqGSM49
AwEHoUQDQgAEJ/ud5j/CfJEirc7lsu7b2IfC7gJWP1L4o5QPhYf6rdfRmUlI1jws
dNIpB/2mQRZ/SjeNGBd7stSAhYfzDb0ERA==
-----END EC PRIVATE KEY-----
-53
View File
@@ -1,53 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIDmTCCAyCgAwIBAgISBYWRSftnuM4F2wVlsA2DcC9iMAoGCCqGSM49BAMDMDIx
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF
ODAeFw0yNjA0MDkxODMyMTdaFw0yNjA3MDgxODMyMTZaMCIxIDAeBgNVBAMTF3Rl
bXBsZXMuZ3lvemFtYW5jYXZlLmZyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE
doecYbXgFnK1nqBw3fq62k6EmiVRKptwmGdktvimshZhKT+5Fkg35olb7fLmasbv
hQ36t6hyJYAPKLoggpvkDqOCAiQwggIgMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUE
DDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBS8abdT4AFn+oD1
cjRXR+CTeqx4QTAfBgNVHSMEGDAWgBSPDROi9i5+0VBsMxg4XVmOI3KRyjAyBggr
BgEFBQcBAQQmMCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly9lOC5pLmxlbmNyLm9yZy8w
IgYDVR0RBBswGYIXdGVtcGxlcy5neW96YW1hbmNhdmUuZnIwEwYDVR0gBAwwCjAI
BgZngQwBAgEwLQYDVR0fBCYwJDAioCCgHoYcaHR0cDovL2U4LmMubGVuY3Iub3Jn
Lzk5LmNybDCCAQ0GCisGAQQB1nkCBAIEgf4EgfsA+QB3AMs49xWJfIShRF9bwd37
yW7ymlnNRwppBYWwyxTDFFjnAAABnXO5xuMAAAQDAEgwRgIhAJjx4xMKMj9x2Up0
tuh81IeGkwZIgLedG6VDw10ena3sAiEAoR8W2h+7I/K6xbLEj4mRsfY1ob2yWbkx
fN1+gXCjRBMAfgAai51rD/6/gbR5OcbSMQqG1tEC1PBG4hgsneNfXiYl7wAAAZ1z
ucj9AAgAAAUAB+RdrwQDAEcwRQIgA7HOGwe8d2qdVcy0lPspyTIH/FZ7wJ/hndzh
Ck5MPxsCIQC4M7k41GSL1ly/nGoziakfq1QKLZP2aIHU6i+jb231lDAKBggqhkjO
PQQDAwNnADBkAjAIe/XyLr35Dq+5oDxBZEKg9QvO0Zw42SBPCRqUMXwBTH82WJaY
Kv4rkV/5kRCIGHMCMEZo5mTtvW3urzy6BwpmNHyYAD/galYHZAwjV1sbixSnH4ro
3kgbyYvWcS8lQECdxA==
-----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-----
MHcCAQEEIDIwdc0EdISca2aBEwRxNVbSmX2zWhobVUGKXGF0DWYeoAoGCCqGSM49
AwEHoUQDQgAEdoecYbXgFnK1nqBw3fq62k6EmiVRKptwmGdktvimshZhKT+5Fkg3
5olb7fLmasbvhQ36t6hyJYAPKLoggpvkDg==
-----END EC PRIVATE KEY-----
-53
View File
@@ -1,53 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIDljCCAxygAwIBAgISBiQAfqhyQLDCgYf06ydiaPg/MAoGCCqGSM49BAMDMDIx
CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF
ODAeFw0yNjA0MDkxODQzMjhaFw0yNjA3MDgxODQzMjdaMCExHzAdBgNVBAMTFnRl
bXBsZXMubXJ0ZWRkeWJlYXIuZnIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATh
dDmX3BWIVm+speoiNz7zh9Pqo6dAxmv9eeTcAcWHb67mk9IYeUdzMdPF7w+2KRjf
CgeSglkVGwmdjgOOhoz2o4ICITCCAh0wDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQM
MAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFKaK0ys1bUzr4Y3o
rq55a+ntZmidMB8GA1UdIwQYMBaAFI8NE6L2Ln7RUGwzGDhdWY4jcpHKMDIGCCsG
AQUFBwEBBCYwJDAiBggrBgEFBQcwAoYWaHR0cDovL2U4LmkubGVuY3Iub3JnLzAh
BgNVHREEGjAYghZ0ZW1wbGVzLm1ydGVkZHliZWFyLmZyMBMGA1UdIAQMMAowCAYG
Z4EMAQIBMC0GA1UdHwQmMCQwIqAgoB6GHGh0dHA6Ly9lOC5jLmxlbmNyLm9yZy82
NC5jcmwwggELBgorBgEEAdZ5AgQCBIH8BIH5APcAdgDCMX5XRRmjRe5/ON6ykEHr
x8IhWiK/f9W1rXaa2Q5SzQAAAZ1zxAHIAAAEAwBHMEUCIEtElrsWI6nBQAkzsYZu
UXL+IomaQWWgfJTK6HkBrFDNAiEAspprEqJaM4Uqeu+skpZPNvNSewPI/PFSCGVC
i1fJbMgAfQBs/lAZQ6heqRa8UtEz5NzJHvFBHH0lhCDRc4CeGBjrOgAAAZ1zxAPu
AAgAAAUABoP/yAQDAEYwRAIgKv+YPjawWKDOaICJkRJqYKHG7xEYwvvQlEIkESC1
yTsCIBqKpw/3UEeHjxwEWJYJvQVXSBt0Yr+05CD4JycQI/4ZMAoGCCqGSM49BAMD
A2gAMGUCMEzUbDcmwOmBOw4/nPZ9T5vpNlniWfPYkBpMlOUT2HXdA4x9meEdn0Fz
CWvOPkRZCwIxANbzg/76ev+jhny/KsC7v3fHQUK78G3lDyc+JUYfHblD5UOenUBH
qLjpEd3aLo+S1w==
-----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-----
MHcCAQEEIOltdYErco0s2aaG2UBKlKT/2NCQP/qvmDR7X6r5xnExoAoGCCqGSM49
AwEHoUQDQgAE4XQ5l9wViFZvrKXqIjc+84fT6qOnQMZr/Xnk3AHFh2+u5pPSGHlH
czHTxe8PtikY3woHkoJZFRsJnY4DjoaM9g==
-----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-----
MIIFAjCCA+qgAwIBAgISBUR9Hahp+qU2BctvpoxmACZTMA0GCSqGSIb3DQEBCwUA
MDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQwwCgYDVQQD
EwNSMTMwHhcNMjYwNDE3MTcyNzMzWhcNMjYwNzE2MTcyNzMyWjAfMR0wGwYDVQQD
ExR3aWtpLmd5b3phbWFuY2F2ZS5mcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
AQoCggEBANGlkFR8mDBBK5mPO6KRyaNtvXqPMIYz1yUJWHaRz68fxsWDQt3rJwot
5nweIigaiMWmSiBJ/FuzLdETgH3MuGZ2s/qXm9myvaICq4Ax1nwhjzgSV7vBUoSK
hkLh9cKiZmVbIrMwM0uMf7BQ7vjBmPxJM9P4PBVdovHaBf89vDbbdxzzDXP3Kykf
X50Z8291UiEqhdQEWlBcSKjNfFOT1AYYNGQj9Kr6rgP5TPT/jTGDICVcWC4OpR5p
HM6WQUodSE2PtiiYwhS9KvR7zdEBQUY3MSnuuBhzwu6WBw1O5hwIXmq8+3DqDhTU
K5eqIgJKazePq/07wXRSE4naNzVk75UCAwEAAaOCAiIwggIeMA4GA1UdDwEB/wQE
AwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQW
BBSHpgjoPx1RiIEMG/DaqGDX6XNezTAfBgNVHSMEGDAWgBTnq58PLDOgU9NeT3jI
soQOO9aSMzAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAKGF2h0dHA6Ly9yMTMu
aS5sZW5jci5vcmcvMB8GA1UdEQQYMBaCFHdpa2kuZ3lvemFtYW5jYXZlLmZyMBMG
A1UdIAQMMAowCAYGZ4EMAQIBMC4GA1UdHwQnMCUwI6AhoB+GHWh0dHA6Ly9yMTMu
Yy5sZW5jci5vcmcvODQuY3JsMIIBDAYKKwYBBAHWeQIEAgSB/QSB+gD4AHYA1219
ENGn9XfCx+lf1wC/+YLJM1pl4dCzAXMXwMjFaXcAAAGdnLFhZAAABAMARzBFAiEA
oYfdxxnHQPjs+qkAN4YIpbozWm7n9ZT3xKRRbRDXtHICIA6Xizuii8XsJfPdu86L
CgpHt98Sqf1IQZlQXMOATKN4AH4AqCbL4wrGNRJGUz/gZfFPGdluGQgTxB3ZbXkA
sxI8VScAAAGdnLFkUgAIAAAFAAdFq1YEAwBHMEUCIQDhira6sDeiMq6BWRRvSRn+
GmG3zYVFxadeJ3oL7oWPhgIgRwV4dVGRk1WS3cnUuyCrL65gPNZOzl73cAyIeaMc
N2MwDQYJKoZIhvcNAQELBQADggEBACphIqxBJGs+qYTa+fyYUmBNZBJWDHjatfSO
ilUCM5Hyfaaq0ayDTwHyoLPvbJ3mp9EmHNNXG39gdIGWg1oCUrkePBB08UD08AlG
YWGU8hXsRqnSaxbymWwZ2UuB18xm0KV4KGFImduw9Cf8mV/MSNLh3HVVhr3NFcYh
qS4BvhXrqIsNQLeHQLTHx/yIt9/SAC7NSrlGyFrVuLkCELlO5D8lmDvVVZUm1KEA
EvJEM/oMOJpXKq2r1eGTR9ciZ+Rq88/jYdZHCdua2nJ56vAFIchWYhpk20i9jplh
fZ7vAemE7JJuhh1HlO/LxllJ3F2LhvHvx4j8XufOI56sq9StO1I=
-----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-----
MIIEogIBAAKCAQEA0aWQVHyYMEErmY87opHJo229eo8whjPXJQlYdpHPrx/GxYNC
3esnCi3mfB4iKBqIxaZKIEn8W7Mt0ROAfcy4Znaz+peb2bK9ogKrgDHWfCGPOBJX
u8FShIqGQuH1wqJmZVsiszAzS4x/sFDu+MGY/Ekz0/g8FV2i8doF/z28Ntt3HPMN
c/crKR9fnRnzb3VSISqF1ARaUFxIqM18U5PUBhg0ZCP0qvquA/lM9P+NMYMgJVxY
Lg6lHmkczpZBSh1ITY+2KJjCFL0q9HvN0QFBRjcxKe64GHPC7pYHDU7mHAhearz7
cOoOFNQrl6oiAkprN4+r/TvBdFITido3NWTvlQIDAQABAoIBABpJEOyW5pn+QdIy
FD8Q2mBETSKFu4bIDyyUnGPZalnBuTFggMzERBPRp3leadfvY8CsVdTwkdSJhbAW
KuEa/u/R6ET+J0tHTuF2Rjx/gy3zIzrbieZ/mbIGkEjofeDWbdI9d/9RhsztI8Fe
lGfaFi1jnDzyfc4L/HcoZ+IVwnh6F7+3z2wgQVLLPQ8TlB5lKj7yoe4NwfDoL7a8
8HMge5iWcQS86QVHusgGDu7IxFLB1nZqegLGCDI/MieHJXr4kjtYpTHoM+kpOwIT
a6urzGLOBIo7jVtCFNcBYXLgghI7t0WO2Prtj42sjPHqMHr2ZxTV38gY5QGOrN7Y
wRRYkAECgYEA6ZenyPXNda4KOSkKR8R6lteH6B8I1DRAodQRMsMZXL0ZNHycAQTX
6Spc0grOSwTsXLT3I86CbUxuvUseovfS2XftkL0bhlmTsl41v8IYMIoGwSKPdzpX
eFFGjN6VAL45yGz3W9IMYlE3f93H9XavvatwsfOf+k4HpszvjCUZtAECgYEA5cHf
d5bBE6Ei7N6HZJK7Z6IWfCmy1u+lXkYGjgpztsbUZFeg8g3bu9qc+t98Bua0Eshg
9EeekbmCWhHt6dZa2GPUChxn1efNdxz5Y/sM1FaMnUIIr8j5TSqfUC17NsBLWHui
VuF9SzUrH3u5qQkhi9SOvcjo6g9m2xqEi3AzK5UCgYA74xevG+WbAA267dym3aaY
OZWsWxiGXwca9iWaoA5GimyF2lScpkM8khHN/9s3vIFkmzipQ26I2wmhGjs2iNbT
zj1n2DPQU/Lbze91xCszdo+YwGWLqbd3L08pGn+U+zARRG5+afGm2y+hZpi3Q8B2
nhd8Z/thztODXhMkGPboAQKBgHKafA844WIbNEKW1U4zastMrI6OdiiELSaTI13i
lMmM8BCFLUDP7NUNPNReeY0vso7T6JiwyMXDlOO8ocHMLFBXq0LH3Ht0Pqa1iyh1
53ZbHZSrhY25X7FAG2tw5E7xKCQgt19C5q6G/NWdb4SDi3omMnU0LAnkWNfdqFOt
SbjpAoGAXb0uKfxEgOAy8obcNR1CYWDd9Rd2+gCX4uAI2Qe8WmYRh42ErYT67vaF
az+tMIHclWB/+BA8yPcS/+l2Rgb78spLLAA1hRNoIYmPVrhSUUqyX0LAhqroRSW8
++4/so7Kg4aRvVwxhI7nz7A3j3Gwy+sjuQgM4ojcTbEuBZHxIPg=
-----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"
]
}