Добавление Hangfire в Episerver/Optimizely CMS 12

31 июля 2024 г.

Станислав Шолковский

Теги:


фоновые задания
(1)


эписервер
(4)


затяжной огонь
(1)


рабочие места
(1)


оптимизированный
(4)

Episerver/Optimizely содержит встроенную поддержку ScheduledJobs, которая выполняет свою работу для внутренних заданий EPI и простых пользовательских случаев. Однако, когда приложение растет и нам требуется все больше и больше заданий, она перестает работать из-за специализированных решений.

Что такое Hangfire и зачем его использовать

Hangfire — это фреймворк с открытым исходным кодом, который помогает вам создавать, обрабатывать и управлять фоновыми заданиями, т. е. операциями, которые вы не хотите помещать в конвейер обработки запросов:

  • массовые уведомления/рассылки;
  • пакетный импорт из xml, csv, json;
  • создание архивов;
  • запуск веб-хуков;
  • удаление пользователей;
  • построение различных графиков;
  • обработка изображений/видео;
  • очистить временные файлы;
  • повторяющиеся автоматизированные отчеты;
  • ведение базы данных.

Он также бесплатен для коммерческого использования (имеет платные дополнительные функции), а также имеет поддержку политик повторных попыток, различных типов заданий и масштабирования. Что также очень приятно, так это то, что мы можем использовать любой сериализуемый метод, называемый заданием, что тоже очень приятно.

от Затяжной огонь

Добавление Hangfire в Episerver/Optimizely 12 на примере проекта Foundation за несколько шагов

Сначала давайте установим пакеты Nuget Hangfire и Hangfire.Console в проект с помощью следующих команд:

dotnet add package Hangfire --version 1.8.14
dotnet add package Hangfire.Console --version 1.4.3

Безопасность превыше всего, поэтому давайте начнем с добавления фильтра авторизации, чтобы гарантировать, что доступ к нему смогут получить только администраторы.

using Hangfire.Annotations;
using Hangfire.Dashboard;

namespace Foundation.Features.Hangfire;

public class HangfireAuthorizationFilter : IDashboardAuthorizationFilter
{
    public bool Authorize([NotNull] DashboardContext context)
    {
        return EPiServer.Security.PrincipalInfo.CurrentPrincipal.IsInRole("CmsAdmins");
    }
}

Чтобы создать удобный пользовательский интерфейс Hangfire, вложенный в пользовательский интерфейс CMS, нам нужно создать для него контроллер.

namespace Foundation.Features.Hangfire;

[Authorize(Roles = "CmsAdmin,WebAdmins,Administrators")]
[Route("[controller]")]
public class HangfireCmsController : Controller
{
    [Route("[action]")]
    public ActionResult Index()
    {
        return View();
    }
}

Теперь давайте добавим представление для нашего контроллера. Мы будем использовать iframe для Hangfire UI, поэтому сохраним навигацию EPI.

@using EPiServer.Framework.Web.Resources
@using EPiServer.Shell.Navigation

@{
    Layout = string.Empty;
}


 lang="en">


    </span>Hangfire Dashboard<span class="nt"/>
    @ClientResources.RenderResources("ShellCore")
    @ClientResources.RenderResources("ShellCoreLightTheme")

    <span class="nt"/>
        <span class="nt">html</span><span class="o">,</span>
        <span class="nt">body</span><span class="o">,</span>
        <span class="nc">.iframe-container</span> <span class="p">{</span>
            <span class="nl">height</span><span class="p">:</span> <span class="m">100%</span><span class="p">;</span>
        <span class="p">}</span>

        <span class="nt">iframe</span> <span class="p">{</span>
            <span class="nl">width</span><span class="p">:</span> <span class="m">100%</span><span class="p">;</span>
            <span class="nl">height</span><span class="p">:</span> <span class="m">100%</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="nt"/>
<span class="nt"/>

<span class="nt"/>
    @Html.CreatePlatformNavigationMenu()
    <span class="nt"><div> <span class="err">@</span><span class="na">Html.ApplyPlatformNavigation</span><span class="err">(</span><span class="na">additionalClass:</span> <span class="err">"</span><span class="na">iframe-container</span><span class="err">")</span><span class="nt">></span>
        <span class="nt"><iframe> <span class="na">src=</span><span class="s">"/episerver/backoffice/Plugins/hangfire"</span> <span class="na">title=</span><span class="s">"Hangfire Dashboard"</span> <span class="na">frameborder=</span><span class="s">"0"</span><span class="nt">></span>
            <span class="nt"/>Your browser does not support iframes.<span class="nt"/>
        <span class="nt"/></iframe></span>
    <span class="nt"/></div></span>
<span class="nt"/>

<span class="nt"/>
</span></span></code></pre>
</div>
</div>
<p>После всех проблем с сохранением навигации Epi нам необходимо интегрироваться с ней, поэтому давайте реализуем поставщик меню.</p>
<div class="language-c# highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="k">using</span> <span class="nn">EPiServer.Authorization</span><span class="p">;</span>

<span class="k">namespace</span> <span class="nn">Foundation.Features.Hangfire</span><span class="p">;</span>

<span class="p">[</span><span class="n">MenuProvider</span><span class="p">]</span>
<span class="k">public</span> <span class="k">class</span> <span class="nc">HangfireMenuProvider</span><span class="p">:</span> <span class="n">IMenuProvider</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="n">IEnumerable</span><span class="p"><span class="n">MenuItem</span><span class="p">></span>  <span class="nf">GetMenuItems</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="kt">var</span> <span class="n">hangFireMenuItem</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">UrlMenuItem</span><span class="p">(</span><span class="s">"Hangfire"</span><span class="p">,</span> <span class="n">MenuPaths</span><span class="p">.</span><span class="n">Global</span> <span class="p">+</span> <span class="s">"/cms"</span> <span class="p">+</span> <span class="s">"/cmsMenuItem"</span><span class="p">,</span>
            <span class="s">"/HangfireCms/index"</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="n">IsAvailable</span> <span class="p">=</span> <span class="n">request</span> <span class="p">=></span> <span class="n">EPiServer</span><span class="p">.</span><span class="n">Security</span><span class="p">.</span><span class="n">PrincipalInfo</span><span class="p">.</span><span class="n">CurrentPrincipal</span><span class="p">.</span><span class="nf">IsInRole</span><span class="p">(</span><span class="s">"CmsAdmins"</span><span class="p">),</span>
            <span class="n">AuthorizationPolicy</span> <span class="p">=</span> <span class="n">CmsPolicyNames</span><span class="p">.</span><span class="n">CmsAdmin</span><span class="p">,</span>
            <span class="n">SortIndex</span> <span class="p">=</span> <span class="n">SortIndex</span><span class="p">.</span><span class="n">First</span> <span class="p">+</span> <span class="m">25</span>
        <span class="p">};</span>

        <span class="k">return</span> <span class="k">new</span> <span class="n">MenuItem</span><span class="p">[]</span>
        <span class="p">{</span>
            <span class="n">hangFireMenuItem</span>
        <span class="p">};</span>
    <span class="p">}</span>
<span class="p">}</span>
</span></code></pre>
</div>
</div>
<p>Было бы обидно иметь только пустой Hangfire UI после завершения этого примера. Давайте добавим простую повторяющуюся работу, которая играет с <code class="language-plaintext highlighter-rouge">Hangfire.Console</code> Особенности. Подробнее о заданиях Hangfire можно прочитать в его документации. <a target="_blank" href="https://www.hangfire.io/overview.html" rel="noopener">здесь</a>.</p>
<div class="language-c# highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code><span class="k">using</span> <span class="nn">Hangfire.Console</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">Hangfire.Server</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">System.Threading</span><span class="p">;</span>

<span class="k">namespace</span> <span class="nn">Foundation.Features.Hangfire</span><span class="p">;</span>

<span class="k">public</span> <span class="k">class</span> <span class="nc">ExampleRecurringJob</span>
<span class="p">{</span>
    <span class="k">private</span> <span class="k">readonly</span> <span class="n">IContentTypeRepository</span> <span class="n">_contentTypeRepository</span><span class="p">;</span>


    <span class="k">public</span> <span class="nf">ExampleRecurringJob</span><span class="p">(</span><span class="n">IContentTypeRepository</span> <span class="n">contentTypeRepository</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">_contentTypeRepository</span> <span class="p">=</span> <span class="n">contentTypeRepository</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="k">void</span> <span class="nf">Execute</span><span class="p">(</span><span class="n">PerformContext</span> <span class="n">context</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">context</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">"Hello, world!"</span><span class="p">);</span>
        <span class="n">Thread</span><span class="p">.</span><span class="nf">Sleep</span><span class="p">(</span><span class="n">TimeSpan</span><span class="p">.</span><span class="nf">FromSeconds</span><span class="p">(</span><span class="m">1</span><span class="p">));</span>

        <span class="n">context</span><span class="p">.</span><span class="nf">SetTextColor</span><span class="p">(</span><span class="n">ConsoleTextColor</span><span class="p">.</span><span class="n">Red</span><span class="p">);</span>
        <span class="n">context</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">"Error! Just joking :)"</span><span class="p">);</span>
        <span class="n">Thread</span><span class="p">.</span><span class="nf">Sleep</span><span class="p">(</span><span class="n">TimeSpan</span><span class="p">.</span><span class="nf">FromSeconds</span><span class="p">(</span><span class="m">0.2</span><span class="p">));</span>
        <span class="n">context</span><span class="p">.</span><span class="nf">ResetTextColor</span><span class="p">();</span>

        <span class="kt">var</span> <span class="n">bar</span> <span class="p">=</span> <span class="n">context</span><span class="p">.</span><span class="nf">WriteProgressBar</span><span class="p">();</span>
        <span class="k">foreach</span> <span class="p">(</span><span class="kt">var</span> <span class="n">contentType</span> <span class="k">in</span> <span class="n">_contentTypeRepository</span><span class="p">.</span><span class="nf">List</span><span class="p">().</span><span class="nf">WithProgress</span><span class="p">(</span><span class="n">bar</span><span class="p">))</span>
        <span class="p">{</span>
            <span class="n">context</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">contentType</span><span class="p">.</span><span class="n">Name</span><span class="p">);</span>
            <span class="n">Thread</span><span class="p">.</span><span class="nf">Sleep</span><span class="p">(</span><span class="n">TimeSpan</span><span class="p">.</span><span class="nf">FromSeconds</span><span class="p">(</span><span class="m">0.3</span><span class="p">));</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>

</code></pre>
</div>
</div>
<p>Теперь, когда у нас созданы все новые классы, нам нужно добавить конфигурацию Hangfire <code class="language-plaintext highlighter-rouge">Startup.cs</code>.</p>
<div class="language-c# highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>            <span class="c1">// Add Hangfire services.</span>
            <span class="n">services</span><span class="p">.</span><span class="nf">AddHangfire</span><span class="p">(</span><span class="n">configuration</span> <span class="p">=></span> <span class="n">configuration</span>
                <span class="p">.</span><span class="nf">SetDataCompatibilityLevel</span><span class="p">(</span><span class="n">CompatibilityLevel</span><span class="p">.</span><span class="n">Version_180</span><span class="p">)</span>
                <span class="p">.</span><span class="nf">UseSimpleAssemblyNameTypeSerializer</span><span class="p">()</span>
                <span class="p">.</span><span class="nf">UseRecommendedSerializerSettings</span><span class="p">()</span>
                <span class="p">.</span><span class="nf">UseSqlServerStorage</span><span class="p">(</span><span class="n">_configuration</span><span class="p">.</span><span class="nf">GetConnectionString</span><span class="p">(</span><span class="s">"EcfSqlConnection"</span><span class="p">))</span>
                <span class="p">.</span><span class="nf">UseConsole</span><span class="p">());</span>

            <span class="c1">// Add the processing server as IHostedService</span>
            <span class="n">services</span><span class="p">.</span><span class="nf">AddHangfireServer</span><span class="p">();</span>
</code></pre>
</div>
</div>
<p>А также эта конфигурация.</p>
<div class="language-c# highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>            <span class="n">app</span><span class="p">.</span><span class="nf">UseEndpoints</span><span class="p">(</span><span class="n">endpoints</span> <span class="p">=></span>
            <span class="p">{</span>
                <span class="n">endpoints</span><span class="p">.</span><span class="nf">MapControllerRoute</span><span class="p">(</span><span class="n">name</span><span class="p">:</span> <span class="s">"Default"</span><span class="p">,</span> <span class="n">pattern</span><span class="p">:</span> <span class="s">"{controller}/{action}/{id?}"</span><span class="p">);</span>
                <span class="n">endpoints</span><span class="p">.</span><span class="nf">MapControllers</span><span class="p">();</span>
                <span class="n">endpoints</span><span class="p">.</span><span class="nf">MapRazorPages</span><span class="p">();</span>
                <span class="n">endpoints</span><span class="p">.</span><span class="nf">MapContent</span><span class="p">();</span>
                <span class="n">endpoints</span><span class="p">.</span><span class="nf">MapHangfireDashboard</span><span class="p">();</span>
            <span class="p">});</span>

            <span class="kt">var</span> <span class="n">dashboardOptions</span> <span class="p">=</span> <span class="k">new</span> <span class="n">DashboardOptions</span>
            <span class="p">{</span>
                <span class="n">Authorization</span> <span class="p">=</span> <span class="k">new</span><span class="p">[]</span>
                <span class="p">{</span>
                    <span class="k">new</span> <span class="nf">HangfireAuthorizationFilter</span><span class="p">()</span>
                <span class="p">},</span>
                <span class="n">AppPath</span> <span class="p">=</span> <span class="k">null</span>
            <span class="p">};</span>
            <span class="c1">// Order of middlewares is important! Add it after Authentication and Authorization in order to have a user in the context.</span>
            <span class="n">app</span><span class="p">.</span><span class="nf">UseHangfireDashboard</span><span class="p">(</span><span class="s">"/episerver/backoffice/Plugins/hangfire"</span><span class="p">,</span> <span class="n">dashboardOptions</span><span class="p">);</span>

            <span class="n">RecurringJob</span><span class="p">.</span><span class="n">AddOrUpdate</span><span class="p"><span class="n">ExampleRecurringJob</span><span class="p">>(</span><span class="k">nameof</span><span class="p">(</span><span class="n">ExampleRecurringJob</span><span class="p">)</span> <span class="p">+</span> <span class="s">"_Id"</span><span class="p">,</span> <span class="n">x</span> <span class="p">=></span> <span class="n">x</span><span class="p">.</span><span class="nf">Execute</span><span class="p">(</span><span class="k">null</span><span class="p">),</span> <span class="n">Cron</span><span class="p">.</span><span class="n">Daily</span><span class="p">);</span>
</span></code></pre>
</div>
</div>
<p>Теперь, когда все сделано, мы можем построить и запустить наше приложение. После входа в бэк-офис CMS мы должны сделать что-то вроде этого:</p>
<div style="clear:both; margin-top:0em; margin-bottom:1em;"><a href="https://www.nachedeu.com/%d0%b4%d0%be%d0%b1%d0%b0%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-google-gemini-%d0%b2-samsung-ballie-ai-robot-%d0%b7%d0%b2%d1%83%d1%87%d0%b8%d1%82-%d0%b2%d0%bf%d0%b5%d1%87%d0%b0%d1%82%d0%bb%d1%8f%d1%8e/" target="_blank" rel="dofollow" class="uc01131f3b980e70e09b9f4408e6bcc5e"><!-- INLINE RELATED POSTS 1/3 //--><style> .uc01131f3b980e70e09b9f4408e6bcc5e , .uc01131f3b980e70e09b9f4408e6bcc5e .postImageUrl , .uc01131f3b980e70e09b9f4408e6bcc5e .centered-text-area { min-height: 80px; position: relative; } .uc01131f3b980e70e09b9f4408e6bcc5e , .uc01131f3b980e70e09b9f4408e6bcc5e:hover , .uc01131f3b980e70e09b9f4408e6bcc5e:visited , .uc01131f3b980e70e09b9f4408e6bcc5e:active { border:0!important; } .uc01131f3b980e70e09b9f4408e6bcc5e .clearfix:after { content: ""; display: table; clear: both; } .uc01131f3b980e70e09b9f4408e6bcc5e { display: block; transition: background-color 250ms; webkit-transition: background-color 250ms; width: 100%; opacity: 1; transition: opacity 250ms; webkit-transition: opacity 250ms; background-color: #E67E22; } .uc01131f3b980e70e09b9f4408e6bcc5e:active , .uc01131f3b980e70e09b9f4408e6bcc5e:hover { opacity: 1; transition: opacity 250ms; webkit-transition: opacity 250ms; background-color: #D35400; } .uc01131f3b980e70e09b9f4408e6bcc5e .centered-text-area { width: 100%; position: relative; } .uc01131f3b980e70e09b9f4408e6bcc5e .ctaText { border-bottom: 0 solid #fff; color: #ECF0F1; font-size: 16px; font-weight: bold; margin: 0; padding: 0; text-decoration: underline; } .uc01131f3b980e70e09b9f4408e6bcc5e .postTitle { color: #2C3E50; font-size: 16px; font-weight: 600; margin: 0; padding: 0; width: 100%; } .uc01131f3b980e70e09b9f4408e6bcc5e .ctaButton { background-color: #D35400!important; color: #ECF0F1; border: none; border-radius: 3px; box-shadow: none; font-size: 14px; font-weight: bold; line-height: 26px; moz-border-radius: 3px; text-align: center; text-decoration: none; text-shadow: none; width: 80px; min-height: 80px; background: url(https://www.nachedeu.com/wp-content/plugins/intelly-related-posts/assets/images/simple-arrow.png)no-repeat; position: absolute; right: 0; top: 0; } .uc01131f3b980e70e09b9f4408e6bcc5e:hover .ctaButton { background-color: #E67E22!important; } .uc01131f3b980e70e09b9f4408e6bcc5e .centered-text { display: table; height: 80px; padding-left: 18px; top: 0; } .uc01131f3b980e70e09b9f4408e6bcc5e .uc01131f3b980e70e09b9f4408e6bcc5e-content { display: table-cell; margin: 0; padding: 0; padding-right: 108px; position: relative; vertical-align: middle; width: 100%; } .uc01131f3b980e70e09b9f4408e6bcc5e:after { content: ""; display: block; clear: both; } </style><div class="centered-text-area"><div class="centered-text" style="float: left;"><div class="uc01131f3b980e70e09b9f4408e6bcc5e-content"><span class="ctaText">Read more:</span>  <span class="postTitle">Добавление Google Gemini в Samsung Ballie Ai Robot звучит впечатляюще, но я не уверен, что это важно</span></div></div></div><div class="ctaButton"></div></a></div><p><img decoding="async" src="https://szolkowski.github.io/assets/img/2024-07-31-hangfire-cms-overview.png" alt="Обзор Hangfire CMS"/></p>
<p>Переходя к примеру созданного задания, после его ручного запуска на вкладках повторяющихся заданий в сведениях о выполнении мы видим похожее представление, демонстрирующее работу консоли в реальном времени.</p>
<p><img decoding="async" src="https://szolkowski.github.io/assets/img/2024-07-31-hangfire-example-job-overview.png" alt="Hangfire — пример работы с живой консолью"/></p>
<p>Все изменения кода из этого поста можно увидеть в <a target="_blank" href="https://github.com/szolkowski/Foundation/pull/4" rel="noopener">Запрос на пулл-оффер Github Foundation</a>.</p>
<p><noscript>Пожалуйста, включите JavaScript для просмотра <a target="_blank" href="https://disqus.com/?ref_noscript" rel="noopener">комментарии предоставлены Disqus.</a></noscript></p><div class="mjalk6a385ac4756a0" ><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-0928966750491324"
     crossorigin="anonymous"></script>
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-0928966750491324"
     data-ad-slot="4752185579"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></div><style type="text/css">
@media screen and (min-width: 1201px) {
.mjalk6a385ac4756a0 {
display: block;
}
}
@media screen and (min-width: 993px) and (max-width: 1200px) {
.mjalk6a385ac4756a0 {
display: block;
}
}
@media screen and (min-width: 769px) and (max-width: 992px) {
.mjalk6a385ac4756a0 {
display: block;
}
}
@media screen and (min-width: 768px) and (max-width: 768px) {
.mjalk6a385ac4756a0 {
display: block;
}
}
@media screen and (max-width: 767px) {
.mjalk6a385ac4756a0 {
display: block;
}
}
</style>
</div>
<div class="sharedaddy sd-sharing-enabled"><div class="robots-nocontent sd-block sd-social sd-social-icon-text sd-sharing"><h3 class="sd-title">Share this:</h3><div class="sd-content"><ul><li class="share-facebook"><a rel="nofollow noopener noreferrer"
				data-shared="sharing-facebook-5517846"
				class="share-facebook sd-button share-icon"
				href="https://www.nachedeu.com/%d0%b4%d0%be%d0%b1%d0%b0%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-hangfire-%d0%b2-episerver-optimizely-cms-12/?share=facebook"
				target="_blank"
				aria-labelledby="sharing-facebook-5517846"
				>
				<span id="sharing-facebook-5517846" hidden>Share on Facebook (Opens in new window)</span>
				<span>Facebook</span>
			</a></li><li class="share-x"><a rel="nofollow noopener noreferrer"
				data-shared="sharing-x-5517846"
				class="share-x sd-button share-icon"
				href="https://www.nachedeu.com/%d0%b4%d0%be%d0%b1%d0%b0%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-hangfire-%d0%b2-episerver-optimizely-cms-12/?share=x"
				target="_blank"
				aria-labelledby="sharing-x-5517846"
				>
				<span id="sharing-x-5517846" hidden>Share on X (Opens in new window)</span>
				<span>X</span>
			</a></li><li class="share-end"></li></ul></div></div></div><div class="thcsf6a385ac475571" ><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-0928966750491324"
     crossorigin="anonymous"></script>
<ins class="adsbygoogle"
     style="display:block"
     data-ad-format="autorelaxed"
     data-ad-client="ca-pub-0928966750491324"
     data-ad-slot="6496607853"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></div><style type="text/css">
@media screen and (min-width: 1201px) {
.thcsf6a385ac475571 {
display: block;
}
}
@media screen and (min-width: 993px) and (max-width: 1200px) {
.thcsf6a385ac475571 {
display: block;
}
}
@media screen and (min-width: 769px) and (max-width: 992px) {
.thcsf6a385ac475571 {
display: block;
}
}
@media screen and (min-width: 768px) and (max-width: 768px) {
.thcsf6a385ac475571 {
display: block;
}
}
@media screen and (max-width: 767px) {
.thcsf6a385ac475571 {
display: block;
}
}
</style>
		</div>

				<footer class="entry-meta" aria-label="Entry meta">
			<span class="cat-links"><span class="gp-icon icon-categories"><svg viewBox="0 0 512 512" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em"><path d="M0 112c0-26.51 21.49-48 48-48h110.014a48 48 0 0143.592 27.907l12.349 26.791A16 16 0 00228.486 128H464c26.51 0 48 21.49 48 48v224c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V112z" /></svg></span><span class="screen-reader-text">Categories </span><a href="https://www.nachedeu.com/category/%d0%bc%d0%b8%d1%80/" rel="category tag">Мир</a></span> <span class="tags-links"><span class="gp-icon icon-tags"><svg viewBox="0 0 512 512" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em"><path d="M20 39.5c-8.836 0-16 7.163-16 16v176c0 4.243 1.686 8.313 4.687 11.314l224 224c6.248 6.248 16.378 6.248 22.626 0l176-176c6.244-6.244 6.25-16.364.013-22.615l-223.5-224A15.999 15.999 0 00196.5 39.5H20zm56 96c0-13.255 10.745-24 24-24s24 10.745 24 24-10.745 24-24 24-24-10.745-24-24z"/><path d="M259.515 43.015c4.686-4.687 12.284-4.687 16.97 0l228 228c4.686 4.686 4.686 12.284 0 16.97l-180 180c-4.686 4.687-12.284 4.687-16.97 0-4.686-4.686-4.686-12.284 0-16.97L479.029 279.5 259.515 59.985c-4.686-4.686-4.686-12.284 0-16.97z" /></svg></span><span class="screen-reader-text">Tags </span><a href="https://www.nachedeu.com/tag/cms/" rel="tag">CMS</a>, <a href="https://www.nachedeu.com/tag/%d0%b4%d0%be%d0%b1%d0%b0%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5/" rel="tag">добавление</a></span> 		</footer>
			</div>
</article>
<div class="paging-navigation"><div class="gb-container gb-container-99fe8eb7"><div class="gb-inside-container">
<div class="gb-grid-wrapper gb-grid-wrapper-7b27c819">
<div class="gb-grid-column gb-grid-column-8e5dc8f7"><div class="gb-container gb-container-8e5dc8f7"><div class="gb-inside-container">
<div class="gb-grid-wrapper gb-grid-wrapper-e2b84192">
<div class="gb-grid-column gb-grid-column-6aed9546"><div class="gb-container gb-container-6aed9546"><div class="gb-inside-container">
<a href="https://www.nachedeu.com/%d1%83%d0%bc%d0%bd%d1%8b%d0%b9-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d0%bd%d0%b8%d0%ba-%d0%b2-%d0%b3%d0%b8%d0%b4%d1%80%d0%b0%d1%82%d0%b0%d1%86%d0%b8%d0%b8-%d0%be%d1%82-hidro-kicktraq/"><img src="https://i0.wp.com/www.nachedeu.com/wp-content/uploads/https%3A//i.kickstarter.com/assets/045/881/291/d425a080bed9d12427853acaabbd843a_original.png?resize=150%2C150&ssl=1" class="dynamic-featured-image wp-post-image" alt="" decoding="async" /></a>
</div></div></div>

<div class="gb-grid-column gb-grid-column-d54a6460"><div class="gb-container gb-container-d54a6460"><div class="gb-inside-container">

<p class="gb-headline gb-headline-0d00c744 gb-headline-text"><a href="https://www.nachedeu.com/%d1%83%d0%bc%d0%bd%d1%8b%d0%b9-%d0%bf%d0%be%d0%bc%d0%be%d1%89%d0%bd%d0%b8%d0%ba-%d0%b2-%d0%b3%d0%b8%d0%b4%d1%80%d0%b0%d1%82%d0%b0%d1%86%d0%b8%d0%b8-%d0%be%d1%82-hidro-kicktraq/">Умный помощник в гидратации от Hidro :: Kicktraq</a></p>



</div></div></div>
</div>
</div></div></div>

<div class="gb-grid-column gb-grid-column-2540358d"><div class="gb-container gb-container-2540358d"><div class="gb-inside-container">
<div class="gb-grid-wrapper gb-grid-wrapper-6e69ba24">
<div class="gb-grid-column gb-grid-column-daa456b5"><div class="gb-container gb-container-daa456b5"><div class="gb-inside-container">

<p class="gb-headline gb-headline-2883b2a4 gb-headline-text"><a href="https://www.nachedeu.com/%d1%83%d1%87%d0%b5%d0%bd%d1%8b%d0%b5-%d0%b4%d0%b5%d0%bb%d0%b0%d1%8e%d1%82-%d0%bf%d0%be%d1%80%d0%b0%d0%b7%d0%b8%d1%82%d0%b5%d0%bb%d1%8c%d0%bd%d0%be%d0%b5-%d0%bd%d0%b5%d0%b2%d0%b8%d0%b4%d0%b0%d0%bd/">Ученые делают поразительное, невиданное ранее открытие под Антарктидой | Мир | Новости</a></p>



</div></div></div>

<div class="gb-grid-column gb-grid-column-2634cdf9"><div class="gb-container gb-container-2634cdf9"><div class="gb-inside-container">

</div></div></div>
</div>
</div></div></div>
</div>
</div></div></div>
			<div class="comments-area">
				<div id="comments">

		<div id="respond" class="comment-respond">
		<h3 id="reply-title" class="comment-reply-title">Leave a Comment <small><a rel="nofollow" id="cancel-comment-reply-link" href="/%d0%b4%d0%be%d0%b1%d0%b0%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-hangfire-%d0%b2-episerver-optimizely-cms-12/#respond" style="display:none;">Cancel reply</a></small></h3><form action="https://www.nachedeu.com/wp-comments-post.php" method="post" id="commentform" class="comment-form"><p class="comment-form-comment"><label for="comment" class="screen-reader-text">Comment</label><textarea id="comment" name="comment" cols="45" rows="8" required></textarea></p><label for="author" class="screen-reader-text">Name</label><input placeholder="Name *" id="author" name="author" type="text" value="" size="30" required />
<label for="email" class="screen-reader-text">Email</label><input placeholder="Email *" id="email" name="email" type="email" value="" size="30" required />
<label for="url" class="screen-reader-text">Website</label><input placeholder="Website" id="url" name="url" type="url" value="" size="30" />
<p class="comment-form-cookies-consent"><input id="wp-comment-cookies-consent" name="wp-comment-cookies-consent" type="checkbox" value="yes" /> <label for="wp-comment-cookies-consent">Save my name, email, and website in this browser for the next time I comment.</label></p>
<p class="comment-subscription-form"><input type="checkbox" name="subscribe_comments" id="subscribe_comments" value="subscribe" style="width: auto; -moz-appearance: checkbox; -webkit-appearance: checkbox;" /> <label class="subscribe-label" id="subscribe-label" for="subscribe_comments">Notify me of follow-up comments by email.</label></p><p class="comment-subscription-form"><input type="checkbox" name="subscribe_blog" id="subscribe_blog" value="subscribe" style="width: auto; -moz-appearance: checkbox; -webkit-appearance: checkbox;" /> <label class="subscribe-label" id="subscribe-blog-label" for="subscribe_blog">Notify me of new posts by email.</label></p><p class="form-submit"><input name="submit" type="submit" id="submit" class="submit" value="Post Comment" /> <input type='hidden' name='comment_post_ID' value='5517846' id='comment_post_ID' />
<input type='hidden' name='comment_parent' id='comment_parent' value='0' />
</p><p style="display: none;"><input type="hidden" id="akismet_comment_nonce" name="akismet_comment_nonce" value="e9ec3a040c" /></p><p style="display: none !important;" class="akismet-fields-container" data-prefix="ak_"><label>Δ<textarea name="ak_hp_textarea" cols="45" rows="8" maxlength="100"></textarea></label><input type="hidden" id="ak_js_1" name="ak_js" value="105"/><script>
document.getElementById( "ak_js_1" ).setAttribute( "value", ( new Date() ).getTime() );
</script>
</p></form>	</div><!-- #respond -->
	<p class="akismet_comment_form_privacy_notice">This site uses Akismet to reduce spam. <a href="https://akismet.com/privacy/" target="_blank" rel="nofollow noopener">Learn how your comment data is processed.</a></p>
</div><!-- #comments -->
			</div>

					</main>
	</div>

	<div class="widget-area sidebar is-right-sidebar" id="right-sidebar">
	<div class="inside-right-sidebar">
		<aside id="block-14" class="widget inner-padding widget_block widget_search"><form role="search" method="get" action="https://www.nachedeu.com/" class="wp-block-search__button-outside wp-block-search__text-button wp-block-search"    ><label class="wp-block-search__label" for="wp-block-search__input-1" >Search</label><div class="wp-block-search__inside-wrapper" ><input class="wp-block-search__input" id="wp-block-search__input-1" placeholder="" value="" type="search" name="s" required /><button aria-label="Search" class="wp-block-search__button wp-element-button" type="submit" >Search</button></div></form></aside><aside id="block-16" class="widget inner-padding widget_block">
<h2 class="wp-block-heading">Последние статьи</h2>
</aside><aside id="block-17" class="widget inner-padding widget_block widget_recent_entries"><ul class="wp-block-latest-posts__list wp-block-latest-posts"><li><a class="wp-block-latest-posts__post-title" href="https://www.nachedeu.com/%d1%81%d0%b1%d0%be%d1%80%d0%bd%d0%b0%d1%8f-%d0%b3%d0%be%d0%bb%d0%bb%d0%b0%d0%bd%d0%b4%d0%b8%d0%b8-%d1%81%d0%bd%d0%be%d0%b2%d0%b0-%d0%bd%d0%b5%d0%bc%d0%bd%d0%be%d0%b3%d0%be-%d0%bc%d1%83%d0%b4%d1%80/">Сборная Голландии снова немного мудрее: Швеция или Польша будут третьими соперниками на ЧМ – De Telegraaf</a></li>
<li><div class="wp-block-latest-posts__featured-image"><img decoding="async" src="https://www.veneziatoday.it/~media/horizontal-hi/30488829408122/festa_primavera_24-1-2.jpg" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" style="" /></div><a class="wp-block-latest-posts__post-title" href="https://www.nachedeu.com/%d0%b2-%d0%b5%d0%b7%d0%be%d0%bb%d0%be-%d0%b2%d0%b5%d1%81%d0%b5%d0%bd%d0%bd%d0%b8%d0%b9-%d1%84%d0%b5%d1%81%d1%82%d0%b8%d0%b2%d0%b0%d0%bb%d1%8c-%d1%81-%d1%80%d1%8b%d0%bd%d0%ba%d0%b0%d0%bc%d0%b8-%d0%b8/">В Езоло Весенний фестиваль с рынками и представлениями</a></li>
<li><div class="wp-block-latest-posts__featured-image"><img decoding="async" src="https://jeux.ca/wp-content/uploads/2026/03/Planet-of-Lana-solde-ps-store.webp" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" style="" /></div><a class="wp-block-latest-posts__post-title" href="https://www.nachedeu.com/ps-store-%d1%8d%d1%82%d0%b0-%d0%b7%d0%bd%d0%b0%d0%bc%d0%b5%d0%bd%d0%b8%d1%82%d0%b0%d1%8f-%d0%bf%d1%80%d0%b8%d0%ba%d0%bb%d1%8e%d1%87%d0%b5%d0%bd%d1%87%d0%b5%d1%81%d0%ba%d0%b0%d1%8f-%d0%b8%d0%b3%d1%80/">PS Store: эта знаменитая приключенческая игра для PS5 предлагается со скидкой +85%.</a></li>
<li><div class="wp-block-latest-posts__featured-image"><img decoding="async" src="https://cdntest.db.lv/lvold/1200/2019/articles/2026/03/525779__69c60f716592e.jpg" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" style="" /></div><a class="wp-block-latest-posts__post-title" href="https://www.nachedeu.com/%d0%ba%d1%83%d1%80%d1%81%d1%8b-%d0%b0%d0%ba%d1%86%d0%b8%d0%b9-%d0%bd%d0%b0-%d0%bc%d0%b8%d1%80%d0%be%d0%b2%d1%8b%d1%85-%d0%b1%d0%b8%d1%80%d0%b6%d0%b0%d1%85-%d0%bf%d0%b0%d0%b4%d0%b0%d1%8e%d1%82-%d1%86/">Курсы акций на мировых биржах падают, цены на нефть растут :: Dienas Bizness</a></li>
<li><div class="wp-block-latest-posts__featured-image"><img decoding="async" src="https://akamai.vgc.no/v2/images/593cbf42-0fdc-453a-a27a-f2e74c125bf4?format=auto&w=1080&s=7f2512bd62590fa9287bc12718b8a2c0c7267eaa" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" style="" /></div><a class="wp-block-latest-posts__post-title" href="https://www.nachedeu.com/%d0%bf%d1%83%d1%82%d0%b8%d0%bd-%d0%bf%d1%80%d0%be%d1%81%d0%b8%d1%82-%d1%83-%d0%be%d0%bb%d0%b8%d0%b3%d0%b0%d1%80%d1%85%d0%be%d0%b2-%d0%b4%d0%b5%d0%bd%d0%b5%d0%b3/">Путин просит у олигархов денег</a></li>
</ul></aside><aside id="block-4" class="widget inner-padding widget_block">
<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-0928966750491324"
     crossorigin="anonymous"></script>
<!-- nachederesponsive -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-0928966750491324"
     data-ad-slot="7786131385"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>
</div></div>
</aside>	</div>
</div>

	</div>
</div>


<div class="site-footer">
				<div id="footer-widgets" class="site footer-widgets">
				<div class="footer-widgets-container grid-container">
					<div class="inside-footer-widgets">
							<div class="footer-widget-1">
		<aside id="block-19" class="widget inner-padding widget_block widget_text">
<p class="wp-block-paragraph"></p>
</aside>	</div>
		<div class="footer-widget-2">
		<aside id="block-24" class="widget inner-padding widget_block">
<h2 class="wp-block-heading">Links 2</h2>
</aside>	</div>
		<div class="footer-widget-3">
		<aside id="block-25" class="widget inner-padding widget_block">
<h2 class="wp-block-heading">Links 3</h2>
</aside>	</div>
		<div class="footer-widget-4">
			</div>
		<div class="footer-widget-5">
		<aside id="nav_menu-13" class="widget inner-padding widget_nav_menu"><div class="menu-5inter1-container"><ul id="menu-5inter1" class="menu"><li id="menu-item-4914881" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-4914881"><a href="https://www.nouvelles-du-monde.com/">Nouvelles Du Monde</a></li>
<li id="menu-item-4914882" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-4914882"><a href="https://lesactualites.news/">Les Actualites</a></li>
<li id="menu-item-4914883" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-4914883"><a href="https://www.lederniereheure.com/">Le Derniere Heure</a></li>
<li id="menu-item-4914884" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-4914884"><a href="https://france365.news/">France 365</a></li>
<li id="menu-item-4914885" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-4914885"><a href="https://www.nach-welt.com/">Nach Welt</a></li>
<li id="menu-item-4914886" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-4914886"><a href="https://zeitheute.news/">Zeit Heute</a></li>
<li id="menu-item-4914887" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-4914887"><a href="https://germanic.news/">Germanic News</a></li>
<li id="menu-item-4914888" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-4914888"><a href="https://profocus.news/">Profocus News</a></li>
<li id="menu-item-4914889" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-4914889"><a href="https://www.notiulti.com/">Noticias Ultimas</a></li>
<li id="menu-item-4914890" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-4914890"><a href="https://espanol.news/">Espanol News</a></li>
<li id="menu-item-4914891" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-4914891"><a href="https://www.20minutos.news/">20 Minutos noticias</a></li>
<li id="menu-item-4914892" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-4914892"><a href="https://www.tiempoantena.com/">Tiempo Antena</a></li>
</ul></div></aside>	</div>
						</div>
				</div>
			</div>
					<footer class="site-info" aria-label="Site"  itemtype="https://schema.org/WPFooter" itemscope>
			<div class="inside-site-info grid-container">
								<div class="copyright-bar">
					<p>Hosted by <a title="Most Recommended WebHosting" href="https://www.byohosting.com/" target="_blank" rel="noopener"><strong>Byohosting</strong></a> – Most Recommended Web Hosting – for complains, abuse, advertising contact: o f f i c e @byohosting.com</p>
				</div>
			</div>
		</footer>
		</div>

<a title="Scroll back to top" aria-label="Scroll back to top" rel="nofollow" href="#" class="generate-back-to-top" data-scroll-speed="400" data-start-scroll="300" role="button">
					<span class="gp-icon icon-arrow-up"><svg viewBox="0 0 330 512" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path d="M305.863 314.916c0 2.266-1.133 4.815-2.832 6.514l-14.157 14.163c-1.699 1.7-3.964 2.832-6.513 2.832-2.265 0-4.813-1.133-6.512-2.832L164.572 224.276 53.295 335.593c-1.699 1.7-4.247 2.832-6.512 2.832-2.265 0-4.814-1.133-6.513-2.832L26.113 321.43c-1.699-1.7-2.831-4.248-2.831-6.514s1.132-4.816 2.831-6.515L158.06 176.408c1.699-1.7 4.247-2.833 6.512-2.833 2.265 0 4.814 1.133 6.513 2.833L303.03 308.4c1.7 1.7 2.832 4.249 2.832 6.515z" fill-rule="nonzero" /></svg></span>
				</a><script type="speculationrules">
{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/generatepress/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
</script>
<!-- Default Statcounter code for Nachedeu.com
https://www.nachedeu.com/ -->
<script type="text/javascript">
var sc_project=12014534; 
var sc_invisible=1; 
var sc_security="99122783"; 
</script>
<script type="text/javascript"
src="https://www.statcounter.com/counter/counter.js"
async></script>
<noscript><div class="statcounter"><a title="Web Analytics"
href="https://statcounter.com/" target="_blank"><img
class="statcounter"
src="https://c.statcounter.com/12014534/0/99122783/1/"
alt="Web Analytics"
referrerPolicy="no-referrer-when-downgrade"></a></div></noscript>
<!-- End of Statcounter Code -->
<!-- Public Byoviral.com Tracking code -->
<script src="https://www.byoviral.com/badge/script?domain=nachedeu.com" async defer></script>
<!-- End of Byoviral Code --><script id="generate-a11y">
!function(){"use strict";if("querySelector"in document&&"addEventListener"in window){var e=document.body;e.addEventListener("pointerdown",(function(){e.classList.add("using-mouse")}),{passive:!0}),e.addEventListener("keydown",(function(){e.classList.remove("using-mouse")}),{passive:!0})}}();
</script>
	<div class="gp-modal gp-search-modal" id="gp-search" role="dialog" aria-modal="true" aria-label="Search">
		<div class="gp-modal__overlay" tabindex="-1" data-gpmodal-close>
			<div class="gp-modal__container">
					<form role="search" method="get" class="search-modal-form" action="https://www.nachedeu.com/">
		<label for="search-modal-input" class="screen-reader-text">Search for:</label>
		<div class="search-modal-fields">
			<input id="search-modal-input" type="search" class="search-field" placeholder="Search …" value="" name="s" />
			<button aria-label="Search"><span class="gp-icon icon-search"><svg viewBox="0 0 512 512" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="1em" height="1em"><path fill-rule="evenodd" clip-rule="evenodd" d="M208 48c-88.366 0-160 71.634-160 160s71.634 160 160 160 160-71.634 160-160S296.366 48 208 48zM0 208C0 93.125 93.125 0 208 0s208 93.125 208 208c0 48.741-16.765 93.566-44.843 129.024l133.826 134.018c9.366 9.379 9.355 24.575-.025 33.941-9.379 9.366-24.575 9.355-33.941-.025L337.238 370.987C301.747 399.167 256.839 416 208 416 93.125 416 0 322.875 0 208z" /></svg></span></button>
		</div>
			</form>
				</div>
		</div>
	</div>
	
	<script type="text/javascript">
		window.WPCOM_sharing_counts = {"https://www.nachedeu.com/%d0%b4%d0%be%d0%b1%d0%b0%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-hangfire-%d0%b2-episerver-optimizely-cms-12/":5517846};
	</script>
				<script id="daim-track-internal-links-js-before">
window.DAIM_PARAMETERS = {ajax_url: "https://www.nachedeu.com/wp-admin/admin-ajax.php",nonce: "c50cc42bc9"};
//# sourceURL=daim-track-internal-links-js-before
</script>
<script id="daim-track-internal-links-js" src="https://www.nachedeu.com/wp-content/plugins/interlinks-manager/public/assets/js/track-internal-links.js?ver=1.27"></script>
<script id="generate-menu-js-before">
var generatepressMenu = {"toggleOpenedSubMenus":true,"openSubMenuLabel":"Open Sub-Menu","closeSubMenuLabel":"Close Sub-Menu"};
//# sourceURL=generate-menu-js-before
</script>
<script id="generate-menu-js" src="https://www.nachedeu.com/wp-content/themes/generatepress/assets/js/menu.min.js?ver=3.6.1"></script>
<script id="generate-modal-js" src="https://www.nachedeu.com/wp-content/themes/generatepress/assets/dist/modal.js?ver=3.6.1"></script>
<script id="generate-back-to-top-js-before">
var generatepressBackToTop = {"smooth":true};
//# sourceURL=generate-back-to-top-js-before
</script>
<script id="generate-back-to-top-js" src="https://www.nachedeu.com/wp-content/themes/generatepress/assets/js/back-to-top.min.js?ver=3.6.1"></script>
<script async data-wp-strategy="async" fetchpriority="low" id="comment-reply-js" src="https://c0.wp.com/c/7.0/wp-includes/js/comment-reply.min.js"></script>
<script id="jetpack-stats-js-before">
_stq = window._stq || [];
_stq.push([ "view", {"v":"ext","blog":"200609574","post":"5517846","tz":"0","srv":"www.nachedeu.com","hp":"atomic","ac":"3","amp":"0","j":"1:16.0-a.1"} ]);
_stq.push([ "clickTrackerInit", "200609574", "5517846" ]);
//# sourceURL=jetpack-stats-js-before
</script>
<script data-wp-strategy="defer" defer fetchpriority="low" id="jetpack-stats-js" src="https://stats.wp.com/e-202625.js"></script>
<script defer id="akismet-frontend-js" src="https://www.nachedeu.com/wp-content/plugins/akismet/_inc/akismet-frontend.js?ver=1774230728"></script>
<script id="sharing-js-js-extra">
var sharing_js_options = {"lang":"en","counts":"1","is_stats_active":"1"};
//# sourceURL=sharing-js-js-extra
</script>
<script id="sharing-js-js" src="https://www.nachedeu.com/wp-content/plugins/jetpack/_inc/build/sharedaddy/sharing.min.js?ver=16.0-a.1"></script>
<script id="sharing-js-js-after">
var windowOpen;
			( function () {
				function matches( el, sel ) {
					return !! (
						el.matches && el.matches( sel ) ||
						el.msMatchesSelector && el.msMatchesSelector( sel )
					);
				}

				document.body.addEventListener( 'click', function ( event ) {
					if ( ! event.target ) {
						return;
					}

					var el;
					if ( matches( event.target, 'a.share-facebook' ) ) {
						el = event.target;
					} else if ( event.target.parentNode && matches( event.target.parentNode, 'a.share-facebook' ) ) {
						el = event.target.parentNode;
					}

					if ( el ) {
						event.preventDefault();

						// If there's another sharing window open, close it.
						if ( typeof windowOpen !== 'undefined' ) {
							windowOpen.close();
						}
						windowOpen = window.open( el.getAttribute( 'href' ), 'wpcomfacebook', 'menubar=1,resizable=1,width=600,height=400' );
						return false;
					}
				} );
			} )();
var windowOpen;
			( function () {
				function matches( el, sel ) {
					return !! (
						el.matches && el.matches( sel ) ||
						el.msMatchesSelector && el.msMatchesSelector( sel )
					);
				}

				document.body.addEventListener( 'click', function ( event ) {
					if ( ! event.target ) {
						return;
					}

					var el;
					if ( matches( event.target, 'a.share-x' ) ) {
						el = event.target;
					} else if ( event.target.parentNode && matches( event.target.parentNode, 'a.share-x' ) ) {
						el = event.target.parentNode;
					}

					if ( el ) {
						event.preventDefault();

						// If there's another sharing window open, close it.
						if ( typeof windowOpen !== 'undefined' ) {
							windowOpen.close();
						}
						windowOpen = window.open( el.getAttribute( 'href' ), 'wpcomx', 'menubar=1,resizable=1,width=600,height=350' );
						return false;
					}
				} );
			} )();
//# sourceURL=sharing-js-js-after
</script>
<script id="wp-emoji-settings" type="application/json">
{"baseUrl":"https://s.w.org/images/core/emoji/17.0.2/72x72/","ext":".png","svgUrl":"https://s.w.org/images/core/emoji/17.0.2/svg/","svgExt":".svg","source":{"concatemoji":"https://www.nachedeu.com/wp-includes/js/wp-emoji-release.min.js?ver=7.0"}}
</script>
<script type="module">
/*! This file is auto-generated */
const a=JSON.parse(document.getElementById("wp-emoji-settings").textContent),o=(window._wpemojiSettings=a,"wpEmojiSettingsSupports"),s=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(o,JSON.stringify(t))}catch(e){}}function c(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0);const a=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===a[t])}function p(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var n=e.getImageData(16,16,1,1);for(let e=0;e<n.data.length;e++)if(0!==n.data[e])return!1;return!0}function u(e,t,n,a){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\udde8\ud83c\uddf6","\ud83c\udde8\u200b\ud83c\uddf6")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!a(e,"\ud83e\u1fac8")}return!1}function f(e,t,n,a){let r;const o=(r="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):document.createElement("canvas")).getContext("2d",{willReadFrequently:!0}),s=(o.textBaseline="top",o.font="600 32px Arial",{});return e.forEach(e=>{s[e]=t(o,e,n,a)}),s}function r(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}a.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(o));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(s),u.toString(),c.toString(),p.toString()].join(",")+"));",a=new Blob([e],{type:"text/javascript"});const r=new Worker(URL.createObjectURL(a),{name:"wpTestEmojiSupports"});return void(r.onmessage=e=>{i(n=e.data),r.terminate(),t(n)})}catch(e){}i(n=f(s,u,c,p))}t(n)}).then(e=>{for(const n in e)a.supports[n]=e[n],a.supports.everything=a.supports.everything&&a.supports[n],"flag"!==n&&(a.supports.everythingExceptFlag=a.supports.everythingExceptFlag&&a.supports[n]);var t;a.supports.everythingExceptFlag=a.supports.everythingExceptFlag&&!a.supports.flag,a.supports.everything||((t=a.source||{}).concatemoji?r(t.concatemoji):t.wpemoji&&t.twemoji&&(r(t.twemoji),r(t.wpemoji)))});
//# sourceURL=https://www.nachedeu.com/wp-includes/js/wp-emoji-loader.min.js
</script>
		<script type="text/javascript">
			(function() {
			var t   = document.createElement( 'script' );
			t.type  = 'text/javascript';
			t.async = true;
			t.id    = 'gauges-tracker';
			t.setAttribute( 'data-site-id', '66b0fdc6b1c7a02873754edd' );
			t.src = '//secure.gaug.es/track.js';
			var s = document.getElementsByTagName( 'script' )[0];
			s.parentNode.insertBefore( t, s );
			})();
		</script>
		
</body>
</html>