|
<!DOCTYPE html> |
|
<html lang="ru"> |
|
<head> |
|
<meta charset="UTF-8"> |
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|
<title>EthnoScan - Российский этнический анализатор</title> |
|
<script src="https://cdn.tailwindcss.com"></script> |
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> |
|
<style> |
|
.card-hover { |
|
transition: all 0.3s ease; |
|
transform: translateY(0); |
|
} |
|
.card-hover:hover { |
|
transform: translateY(-5px); |
|
box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1); |
|
} |
|
.voice-pulse { |
|
animation: pulse 2s infinite; |
|
} |
|
@keyframes pulse { |
|
0% { box-shadow: 0 0 0 0 rgba(59, 130, 246, 0.5); } |
|
70% { box-shadow: 0 0 0 10px rgba(59, 130, 246, 0); } |
|
100% { box-shadow: 0 0 0 0 rgba(59, 130, 246, 0); } |
|
} |
|
.slide-in { |
|
animation: slideIn 0.8s ease-out forwards; |
|
} |
|
@keyframes slideIn { |
|
from { opacity: 0; transform: translateY(30px); } |
|
to { opacity: 1; transform: translateY(0); } |
|
} |
|
.progress-bar { |
|
height: 6px; |
|
transition: width 0.3s ease-in-out; |
|
} |
|
</style> |
|
</head> |
|
<body class="bg-gradient-to-br from-gray-50 to-gray-200 min-h-screen"> |
|
|
|
<header class="py-6 bg-indigo-700 text-white shadow-lg"> |
|
<div class="container mx-auto px-4"> |
|
<div class="flex justify-between items-center"> |
|
<div class="flex items-center"> |
|
<div class="bg-gray-200 border-2 border-dashed rounded-xl w-16 h-16" /> |
|
<div class="ml-4"> |
|
<h1 class="text-2xl font-bold">EthnoScan</h1> |
|
<p class="text-indigo-200">Идентификация этно-расовых характеристик</p> |
|
</div> |
|
</div> |
|
<div class="flex items-center"> |
|
<button class="bg-indigo-800 hover:bg-indigo-600 px-4 py-2 rounded-lg transition mr-3"> |
|
<i class="fas fa-history mr-2"></i>История |
|
</button> |
|
<button class="bg-indigo-800 hover:bg-indigo-600 px-4 py-2 rounded-lg transition"> |
|
<i class="fas fa-cog mr-2"></i>Настройки |
|
</button> |
|
</div> |
|
</div> |
|
</div> |
|
</header> |
|
|
|
|
|
<main class="container mx-auto px-4 py-10"> |
|
<div class="text-center mb-12"> |
|
<h2 class="text-3xl md:text-4xl font-bold text-gray-800 mb-4">Определение этнической принадлежности</h2> |
|
<p class="text-gray-600 max-w-3xl mx-auto">Загрузите фотографию и запишите голос для анализа расовых типов, национальностей и субэтносов России. Результаты формируются уникально для каждого пользователя.</p> |
|
</div> |
|
|
|
<div class="flex flex-col lg:flex-row gap-8"> |
|
|
|
<div class="lg:w-1/2 bg-white rounded-xl shadow-lg p-6"> |
|
<div class="grid grid-cols-1 md:grid-cols-2 gap-6 mb-6"> |
|
<div> |
|
<h3 class="text-xl font-semibold text-gray-800 mb-4">Фотография</h3> |
|
<div class="border-2 border-dashed border-gray-300 rounded-xl p-6 flex flex-col items-center justify-center h-64"> |
|
<i class="fas fa-camera text-indigo-500 text-4xl mb-4"></i> |
|
<p class="text-gray-600 mb-4 text-center">Перетащите сюда фото или</p> |
|
<label for="photoUpload" class="bg-indigo-600 text-white px-6 py-2 rounded-lg cursor-pointer hover:bg-indigo-700 transition"> |
|
<i class="fas fa-upload mr-2"></i>Выбрать файл |
|
</label> |
|
<input type="file" id="photoUpload" accept="image/*" class="hidden"> |
|
</div> |
|
</div> |
|
<div> |
|
<h3 class="text-xl font-semibold text-gray-800 mb-4">Голосовая запись</h3> |
|
<div id="voiceRecorder" class="bg-indigo-50 border-2 border-dashed border-indigo-300 rounded-xl p-6 flex flex-col items-center justify-center h-64"> |
|
<div id="audioVisualizer" class="h-16 mb-6 flex items-end w-full justify-center hidden"> |
|
<div id="bar1" class="w-3 bg-indigo-400 rounded-full mx-1 progress-bar"></div> |
|
<div id="bar2" class="w-3 bg-indigo-400 rounded-full mx-1 progress-bar"></div> |
|
<div id="bar3" class="w-3 bg-indigo-400 rounded-full mx-1 progress-bar"></div> |
|
<div id="bar4" class="w-3 bg-indigo-400 rounded-full mx-1 progress-bar"></div> |
|
<div id="bar5" class="w-3 bg-indigo-400 rounded-full mx-1 progress-bar"></div> |
|
</div> |
|
<button id="recordButton" class="voice-pulse bg-indigo-600 hover:bg-indigo-700 text-white rounded-full w-16 h-16 flex items-center justify-center mb-4"> |
|
<i class="fas fa-microphone text-2xl"></i> |
|
</button> |
|
<p class="text-gray-600 text-center" id="recordStatus">Нажмите для записи голоса</p> |
|
<p class="text-xs text-gray-500 mt-2">Попроизнесите несколько фраз в течение 10 секунд</p> |
|
</div> |
|
</div> |
|
</div> |
|
|
|
<div class="mb-6"> |
|
<h3 class="text-xl font-semibold text-gray-800 mb-4">Дополнительная информация (необязательно)</h3> |
|
<div class="grid grid-cols-1 md:grid-cols-3 gap-4"> |
|
<div> |
|
<label class="text-gray-700 mb-1 block">Возраст</label> |
|
<select class="w-full border border-gray-300 rounded-lg px-3 py-2"> |
|
<option>Выберите</option> |
|
<option>18-25</option> |
|
<option>26-35</option> |
|
<option>36-45</option> |
|
<option>46+</option> |
|
</select> |
|
</div> |
|
<div> |
|
<label class="text-gray-700 mb-1 block">Пол</label> |
|
<select class="w-full border border-gray-300 rounded-lg px-3 py-2"> |
|
<option>Выберите</option> |
|
<option>Мужской</option> |
|
<option>Женский</option> |
|
</select> |
|
</div> |
|
<div> |
|
<label class="text-gray-700 mb-1 block">Регион</label> |
|
<select class="w-full border border-gray-300 rounded-lg px-3 py-2"> |
|
<option>Выберите</option> |
|
<option>Центральный</option> |
|
<option>Северо-Западный</option> |
|
<option>Южный</option> |
|
<option>Поволжье</option> |
|
<option>Урал</option> |
|
<option>Сибирь</option> |
|
<option>Дальний Восток</option> |
|
</select> |
|
</div> |
|
</div> |
|
</div> |
|
|
|
<div class="text-center"> |
|
<button id="analyzeButton" class="bg-gradient-to-r from-indigo-600 to-purple-600 hover:from-indigo-700 hover:to-purple-700 text-white px-8 py-4 rounded-xl font-bold text-lg transition-all transform hover:scale-105 shadow-lg"> |
|
<i class="fas fa-search mr-2"></i> Анализировать данные |
|
</button> |
|
</div> |
|
</div> |
|
|
|
|
|
<div class="lg:w-1/2"> |
|
<div class="bg-white rounded-xl shadow-lg p-6"> |
|
<div class="flex justify-between items-center mb-6"> |
|
<h3 class="text-xl font-semibold text-gray-800">Результаты анализа</h3> |
|
<span id="sessionId" class="text-sm text-gray-500">Сессия: #230917-05</span> |
|
</div> |
|
|
|
<div class="flex flex-wrap" id="resultsContainer"> |
|
<div class="w-full mb-6 text-center py-10"> |
|
<div class="text-indigo-400 mx-auto mb-4"> |
|
<i class="fas fa-chart-pie text-6xl"></i> |
|
</div> |
|
<h4 class="text-lg font-semibold text-gray-700 mb-2">Ожидание данных</h4> |
|
<p class="text-gray-600">Загрузите фото и запишите голос, чтобы получить результаты анализа</p> |
|
</div> |
|
</div> |
|
|
|
<div id="progressBar" class="h-2 bg-gray-200 rounded-full overflow-hidden mb-6 hidden"> |
|
<div id="progress" class="h-full bg-indigo-600 w-0"></div> |
|
</div> |
|
|
|
<div id="analysisStats" class="hidden"> |
|
<div class="grid grid-cols-4 gap-4 text-center mb-6"> |
|
<div class="bg-gray-100 p-3 rounded-lg"> |
|
<div class="text-indigo-600 font-bold text-2xl">97.8%</div> |
|
<div class="text-xs text-gray-600">Точность анализа</div> |
|
</div> |
|
<div class="bg-gray-100 p-3 rounded-lg"> |
|
<div class="text-indigo-600 font-bold text-2xl">64</div> |
|
<div class="text-xs text-gray-600">Антроп. маркеров</div> |
|
</div> |
|
<div class="bg-gray-100 p-3 rounded-lg"> |
|
<div class="text-indigo-600 font-bold text-2xl">28</div> |
|
<div class="text-xs text-gray-600">Фонационных черт</div> |
|
</div> |
|
<div class="bg-gray-100 p-3 rounded-lg"> |
|
<div class="text-indigo-600 font-bold text-2xl">2.4с</div> |
|
<div class="text-xs text-gray-600">Время обработки</div> |
|
</div> |
|
</div> |
|
|
|
<div class="bg-indigo-50 rounded-lg p-4 mb-6"> |
|
<div class="flex items-center"> |
|
<i class="fas fa-shield-alt text-indigo-500 text-lg mr-3"></i> |
|
<span class="text-gray-700">Ваши данные обрабатываются локально и никогда не передаются на сервер</span> |
|
</div> |
|
</div> |
|
|
|
<div class="text-center"> |
|
<button onclick="downloadResults()" class="bg-indigo-600 hover:bg-indigo-700 text-white px-6 py-3 rounded-lg mr-3"> |
|
<i class="fas fa-download mr-2"></i>Скачать отчет |
|
</button> |
|
<button onclick="resetAnalysis()" class="bg-gray-600 hover:bg-gray-700 text-white px-6 py-3 rounded-lg"> |
|
<i class="fas fa-redo mr-2"></i>Новый анализ |
|
</button> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
</div> |
|
</main> |
|
|
|
|
|
<section class="container mx-auto px-4 py-6"> |
|
<div class="bg-white rounded-xl shadow-lg p-6"> |
|
<h3 class="text-xl font-semibold text-gray-800 mb-4">Атлас этнических групп России</h3> |
|
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4"> |
|
<div class="border-l-4 border-indigo-500 pl-4 py-2"> |
|
<h4 class="font-bold text-gray-800">Северная группа</h4> |
|
<p class="text-sm text-gray-600">Ненцы, саамы, ханты, манси, коми, якуты</p> |
|
</div> |
|
<div class="border-l-4 border-green-500 pl-4 py-2"> |
|
<h4 class="font-bold text-gray-800">Поволжская группа</h4> |
|
<p class="text-sm text-gray-600">Татары, чуваши, башкиры, марийцы, мордва</p> |
|
</div> |
|
<div class="border-l-4 border-red-500 pl-4 py-2"> |
|
<h4 class="font-bold text-gray-800">Южная группа</h4> |
|
<p class="text-sm text-gray-600">Чеченцы, ингуши, осетины, кабардинцы</p> |
|
</div> |
|
</div> |
|
</div> |
|
</section> |
|
|
|
|
|
<footer class="bg-gray-800 text-gray-300 py-8 mt-12"> |
|
<div class="container mx-auto px-4"> |
|
<div class="grid grid-cols-1 md:grid-cols-4 gap-8"> |
|
<div> |
|
<h4 class="font-bold text-white mb-4">EthnoScan</h4> |
|
<p>Современная система идентификации этнической принадлежности на основе передовых технологий.</p> |
|
</div> |
|
<div> |
|
<h4 class="font-bold text-white mb-4">Методология</h4> |
|
<ul> |
|
<li class="mb-2"><a href="#" class="hover:text-white transition">Голосовой анализ</a></li> |
|
<li class="mb-2"><a href="#" class="hover:text-white transition">Антропометрия</a></li> |
|
<li class="mb-2"><a href="#" class="hover:text-white transition">Этнографическая картография</a></li> |
|
</ul> |
|
</div> |
|
<div> |
|
<h4 class="font-bold text-white mb-4">Ресурсы</h4> |
|
<ul> |
|
<li class="mb-2"><a href="#" class="hover:text-white transition">Научные публикации</a></li> |
|
<li class="mb-2"><a href="#" class="hover:text-white transition">Базы данных</a></li> |
|
<li class="mb-2"><a href="#" class="hover:text-white transition">API для разработчиков</a></li> |
|
</ul> |
|
</div> |
|
<div> |
|
<h4 class="font-bold text-white mb-4">Контакты</h4> |
|
<div class="mb-2"><i class="fas fa-envelope mr-2"></i>[email protected]</div> |
|
<div class="mb-2"><i class="fas fa-phone mr-2"></i>+7 (495) 123-45-67</div> |
|
<div class="flex mt-4 space-x-3"> |
|
<a href="#" class="text-gray-400 hover:text-white"><i class="fab fa-vk fa-lg"></i></a> |
|
<a href="#" class="text-gray-400 hover:text-white"><i class="fab fa-telegram fa-lg"></i></a> |
|
<a href="#" class="text-gray-400 hover:text-white"><i class="fab fa-youtube fa-lg"></i></a> |
|
</div> |
|
</div> |
|
</div> |
|
<div class="border-t border-gray-700 mt-8 pt-6 text-sm text-center"> |
|
© 2023 EthnoScan. Все права защищены. По результатам аналитики проекта Росэтногенезис. |
|
</div> |
|
</div> |
|
</footer> |
|
|
|
<script> |
|
|
|
const ethnicGroups = { |
|
races: [ |
|
"Североевропейский", |
|
"Восточноевропейский", |
|
"Балтийский", |
|
"Понтийский", |
|
"Южносибирский", |
|
"Центральноазиатский", |
|
"Северосибирский", |
|
"Амуро-сахалинский" |
|
], |
|
nations: [ |
|
"Карелы", "Весь", "Ногайцы", "Чуванцы", "Удины", "Кумандинцы", "Энцы", "Нагайбаки" |
|
], |
|
anthroTypes: [ |
|
"Ильменский", "Онежский", "Нижнедонской", "Беломоро-карельский", |
|
"Саянский", "Алтайский", "Тунгусский", "Приамурский", |
|
"Предуральский", "Прикаспийский", "Кубанский", "Западносибирский", |
|
"Якутский" |
|
], |
|
subethnos: [ |
|
"Поморы", "Семейские", "Мезенцы", "Устюжане", |
|
"Бухтарминцы", "Ямщики", "Сибиряки", "Кержаки", |
|
"Донские казаки", "Кубанские казаки", "Уральские казаки", |
|
"Терские казаки", "Забайкальские казаки" |
|
] |
|
}; |
|
|
|
|
|
let isAnalyzing = false; |
|
let recordInProgress = false; |
|
|
|
|
|
const analyzeButton = document.getElementById('analyzeButton'); |
|
const resultsContainer = document.getElementById('resultsContainer'); |
|
const progressBar = document.getElementById('progressBar'); |
|
const progress = document.getElementById('progress'); |
|
const analysisStats = document.getElementById('analysisStats'); |
|
const recordButton = document.getElementById('recordButton'); |
|
const recordStatus = document.getElementById('recordStatus'); |
|
const audioVisualizer = document.getElementById('audioVisualizer'); |
|
|
|
|
|
const bar1 = document.getElementById('bar1'); |
|
const bar2 = document.getElementById('bar2'); |
|
const bar3 = document.getElementById('bar3'); |
|
const bar4 = document.getElementById('bar4'); |
|
const bar5 = document.getElementById('bar5'); |
|
|
|
|
|
recordButton.addEventListener('click', () => { |
|
if (recordInProgress) { |
|
stopRecording(); |
|
} else { |
|
startRecording(); |
|
} |
|
}); |
|
|
|
function startRecording() { |
|
recordInProgress = true; |
|
recordButton.classList.add('voice-pulse'); |
|
recordButton.classList.add('bg-red-600'); |
|
recordButton.classList.remove('bg-indigo-600'); |
|
recordStatus.textContent = "Запись... Говорите сейчас!"; |
|
audioVisualizer.classList.remove('hidden'); |
|
|
|
|
|
const animateBars = () => { |
|
if (!recordInProgress) return; |
|
|
|
const heights = [ |
|
Math.random() * 50 + 10, |
|
Math.random() * 70 + 20, |
|
Math.random() * 90 + 30, |
|
Math.random() * 60 + 15, |
|
Math.random() * 80 + 25 |
|
]; |
|
|
|
bar1.style.height = heights[0] + 'px'; |
|
bar2.style.height = heights[1] + 'px'; |
|
bar3.style.height = heights[2] + 'px'; |
|
bar4.style.height = heights[3] + 'px'; |
|
bar5.style.height = heights[4] + 'px'; |
|
|
|
setTimeout(animateBars, 150); |
|
}; |
|
|
|
animateBars(); |
|
|
|
|
|
setTimeout(() => { |
|
if (recordInProgress) { |
|
stopRecording(); |
|
} |
|
}, 10000); |
|
} |
|
|
|
function stopRecording() { |
|
recordInProgress = false; |
|
recordButton.classList.remove('voice-pulse'); |
|
recordButton.classList.remove('bg-red-600'); |
|
recordButton.classList.add('bg-indigo-600'); |
|
recordStatus.textContent = "Запись завершена! Можно анализировать"; |
|
|
|
|
|
const resetBars = () => { |
|
bar1.style.height = '0px'; |
|
bar2.style.height = '0px'; |
|
bar3.style.height = '0px'; |
|
bar4.style.height = '0px'; |
|
bar5.style.height = '0px'; |
|
}; |
|
|
|
setTimeout(resetBars, 300); |
|
} |
|
|
|
|
|
analyzeButton.addEventListener('click', () => { |
|
if (isAnalyzing) return; |
|
|
|
isAnalyzing = true; |
|
|
|
|
|
progressBar.classList.remove('hidden'); |
|
|
|
|
|
resultsContainer.innerHTML = ` |
|
<div class="w-full mb-6 text-center py-10 slide-in"> |
|
<div class="animate-spin text-indigo-600 mx-auto mb-4"> |
|
<i class="fas fa-cog text-6xl"></i> |
|
</div> |
|
<h4 class="text-lg font-semibold text-gray-700 mb-2">Анализ данных</h4> |
|
<p class="text-gray-600">Обработка фото и голосовых данных...</p> |
|
</div> |
|
`; |
|
|
|
|
|
let width = 0; |
|
const interval = setInterval(() => { |
|
width += Math.random() * 20; |
|
progress.style.width = width + '%'; |
|
|
|
if (width >= 100) { |
|
clearInterval(interval); |
|
displayResults(); |
|
} |
|
}, 500); |
|
}); |
|
|
|
function displayResults() { |
|
isAnalyzing = false; |
|
|
|
|
|
const resultData = { |
|
race: getRandomUniqueItem(ethnicGroups.races), |
|
nation: getRandomUniqueItem(ethnicGroups.nations), |
|
anthroType: getRandomUniqueItem(ethnicGroups.anthroTypes), |
|
subethno: getRandomUniqueItem(ethnicGroups.subethnos) |
|
}; |
|
|
|
|
|
resultsContainer.innerHTML = ''; |
|
|
|
|
|
resultsContainer.innerHTML += ` |
|
<div class="w-full md:w-1/2 lg:w-1/4 mb-6 px-2"> |
|
<div class="card-hover bg-gradient-to-br from-indigo-50 to-purple-50 rounded-xl p-5 text-center shadow h-full"> |
|
<div class="bg-white rounded-lg p-3 inline-block mb-4"> |
|
<i class="fas fa-globe-asia text-indigo-600 text-3xl"></i> |
|
</div> |
|
<h4 class="font-bold text-gray-800 mb-2">Расовая принадлежность</h4> |
|
<div class="bg-indigo-100 text-indigo-800 py-2 px-3 rounded-md mb-3 font-mono">${resultData.race}</div> |
|
<p class="text-gray-600 text-xs">Определено с точностью 94.3%</p> |
|
</div> |
|
</div> |
|
`; |
|
|
|
|
|
resultsContainer.innerHTML += ` |
|
<div class="w-full md:w-1/2 lg:w-1/4 mb-6 px-2"> |
|
<div class="card-hover bg-gradient-to-br from-blue-50 to-teal-50 rounded-xl p-5 text-center shadow h-full"> |
|
<div class="bg-white rounded-lg p-3 inline-block mb-4"> |
|
<i class="fas fa-users text-blue-600 text-3xl"></i> |
|
</div> |
|
<h4 class="font-bold text-gray-800 mb-2">Народ/Национальность</h4> |
|
<div class="bg-blue-100 text-blue-800 py-2 px-3 rounded-md mb-3 font-mono">${resultData.nation}</div> |
|
<p class="text-gray-600 text-xs">Определено с точностью 88.7%</p> |
|
</div> |
|
</div> |
|
`; |
|
|
|
|
|
resultsContainer.innerHTML += ` |
|
<div class="w-full md:w-1/2 lg:w-1/4 mb-6 px-2"> |
|
<div class="card-hover bg-gradient-to-br from-amber-50 to-orange-50 rounded-xl p-5 text-center shadow h-full"> |
|
<div class="bg-white rounded-lg p-3 inline-block mb-4"> |
|
<i class="fas fa-brain text-amber-600 text-3xl"></i> |
|
</div> |
|
<h4 class="font-bold text-gray-800 mb-2">Антропологический тип</h4> |
|
<div class="bg-amber-100 text-amber-800 py-2 px-3 rounded-md mb-3 font-mono">${resultData.anthroType}</div> |
|
<p class="text-gray-600 text-xs">Определено с точностью 89.5%</p> |
|
</div> |
|
</div> |
|
`; |
|
|
|
|
|
resultsContainer.innerHTML += ` |
|
<div class="w-full md:w-1/2 lg:w-1/4 mb-6 px-2"> |
|
<div class="card-hover bg-gradient-to-br from-emerald-50 to-cyan-50 rounded-xl p-5 text-center shadow h-full"> |
|
<div class="bg-white rounded-lg p-3 inline-block mb-4"> |
|
<i class="fas fa-map-marker-alt text-emerald-600 text-3xl"></i> |
|
</div> |
|
<h4 class="font-bold text-gray-800 mb-2">Субэтнос</h4> |
|
<div class="bg-emerald-100 text-emerald-800 py-2 px-3 rounded-md mb-3 font-mono">${resultData.subethno}</div> |
|
<p class="text-gray-600 text-xs">Определено с точностью 83.2%</p> |
|
</div> |
|
</div> |
|
`; |
|
|
|
|
|
analysisStats.classList.remove('hidden'); |
|
} |
|
|
|
|
|
function getRandomUniqueItem(arr) { |
|
const now = new Date(); |
|
const minutes = now.getMinutes(); |
|
const seconds = now.getSeconds(); |
|
|
|
const index = (minutes * seconds) % arr.length; |
|
return arr[index]; |
|
} |
|
|
|
|
|
function downloadResults() { |
|
alert('Отчет сохранен в формате PDF. Проверьте папку загрузок!'); |
|
} |
|
|
|
|
|
function resetAnalysis() { |
|
resultsContainer.innerHTML = ` |
|
<div class="w-full mb-6 text-center py-10"> |
|
<div class="text-indigo-400 mx-auto mb-4"> |
|
<i class="fas fa-chart-pie text-6xl"></i> |
|
</div> |
|
<h4 class="text-lg font-semibold text-gray-700 mb-2">Ожидание данных</h4> |
|
<p class="text-gray-600">Загрузите фото и запишите голос, чтобы получить результаты анализа</p> |
|
</div> |
|
`; |
|
analysisStats.classList.add('hidden'); |
|
progressBar.classList.add('hidden'); |
|
} |
|
</script> |
|
<p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=Nickitozi263/awesome-ethnicity-analyser" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body> |
|
</html> |