extend _components/base.pug

block pagetitle
    | Events 

block css 
    link(rel="stylesheet", href="../css/events.css?ver=" + config.version)

block main
    - global.pageHref = "events.html"
    include ./_components/header.pug



    section.eventhero
        .container
            .eventhero__main
                h2.h2.
                    Join The Apache Ignite <br>
                    Community At&nbsp;Conferences, <br>
                    Summits And Other Events
                .h5.pt-3.
                    The community meets online and offline regularly. <br>
                    Join our meetup groups and events to learn from <br>Ignite experts or to share your Ignite experience.
            img.eventhero__img(src="/public/img/events/b1-mainpic.svg", alt="Join the Apache Ignite Community at Conferences, Summits and Other Events")
    // /.eventhero


    section.cmtynavblock 
        .container
            ul.cmtynavblock__list.flexi 
                li
                    a.cmtynavblock__active(href="#summit")  Ignite Summit
                li
                    a(href="#meetups") Meetups Worldwide
                li
                    a(href="#upcoming") Upcoming Events
                li
                    a(href="#past") Past Events
    // /.cmtynavblock



    section.event-featured.container 
        p.capstext Featured Event
        a(href="https://ignite-summit.org/schedule/", target="_blank").event-featured__banner.pt-5
            picture
                source(srcset="/public/img/events/event-banner-vert.jpg" media="(max-width: 767px)")
                img(src="/public/img/events/event-banner.jpg", alt="")
            //- .event-featured__placeholder(style="background:#E8F2FA; height:340px;")
    // /.event-featured



    section.evsummit.container#summit
        .evsummit__date.flexi 
            .evsummit__day 16
            .evsummit__month.h5 NOVEMBER <br>2021
        .evsummit__info.flexi.pt-5
            .evsummit__logo 
                img(src="/public/img/events/b2-summit.svg", alt="")
            .evsummit__descr
                h3.h3 Apache Ignite Summit
                p.h5.pt-2.
                    This virtual conference will feature speakers from industry-leading companies <br>
                    and hundreds of participants from all over the world. 
        .evsummit__blocks.pt-5.flexi 
            a(href="https://hopin.com/events/ignite-summit-cloud-edition", target="_blank").evsummblock.evsummblock--speaker
                p.h4.evsummblock__title Become a speaker
                p.fz20.pt-1x.evsummblock__descr Submit a talk by October 15
                p.evsummblock__listtitle.pt-4
                    strong We are looking for:
                ul.evsummblock__list.dashlist.pt-1
                    li Ignite cloud-related deployment stories
                    li technical deep dives
                    li integration experiences
            .evsummblock.evsummblock--join
                p.h4.evsummblock__title Join Summit online
                p.fz20.pt-1x.evsummblock__descr.
                    Become a&nbsp;part of&nbsp;a&nbsp;true community event 
                    and learn more about up-to-date<br>
                    in-memory computing solutions.
    // /.evsummit
        

    section.event-planet#meetups
        .container
            .event-planet__wrap.flexi 
                .event-planet__main 
                    h3.h3.pb-1 Apache Ignite Meetups Worldwide
                    p.h5.pt-5 Meet the community&nbsp;&mdash; developers, experts, and practitioners&nbsp;&mdash; face-to-face, virtually, or&nbsp;onsite in&nbsp;your city.
                .event-planet__pic 
                    img(src="/public/img/events/b4-world.svg", alt="")
    // /.event-planet
        


    section.event-virtual.container#virtual
        .eventvirt.flexi 
            .eventvirt__left 
                h3.h4 Virtual Apache Ignite Meetup
                p.pt-2 Join Ignite users, developers, committers, contributors, and architects from all over the world and&nbsp;get access to&nbsp;the online-talks and presentations by&nbsp;Apache Ignite experts and practitioners.
            .eventvirt__right 
                a.button(href="https://www.meetup.com/ru-RU/Apache-Ignite-Virtual-Meetup/", target="_blank") Join Virtual Meetup

        .event-virtbot
            .event-virtbot__col
                h4.h4 Recordings Of Past Meetups
                p.pt-2 Find a collection of past Virtual Apache Ignite Meetup <br>presentations, talks, and webinars.
            .event-virtbot__col
                h4.h4 Upcoming Virtual Meetup
                p.pt-2.event-virtbot__gray November 16, 2021
            .event-virtbot__col
                .event-recording.pb-2
                    a(href="https://www.youtube.com/watch?v=f2ArcJPH4iU&list=PLMc7NR20hA-LQ0GR1QW5SDQflMOuPUqDQ&index=1", target="_blank").event-recorditem.videoscr.glightbox
                        img.event-recpic(src="https://img.youtube.com/vi/f2ArcJPH4iU/maxresdefault.jpg", alt="")
                    a(href="https://www.youtube.com/watch?v=lCiZ3x8IRvI&list=PLMc7NR20hA-LQ0GR1QW5SDQflMOuPUqDQ&index=2" target="_blank").event-recorditem.videoscr.glightbox
                        img.event-recpic(src="https://img.youtube.com/vi/lCiZ3x8IRvI/maxresdefault.jpg", alt="")
                    a(href="https://www.youtube.com/watch?v=7UjENQBFvIQ&list=PLMc7NR20hA-LQ0GR1QW5SDQflMOuPUqDQ&index=3" target="_blank").event-recorditem.videoscr.glightbox
                        img.event-recpic(src="https://img.youtube.com/vi/7UjENQBFvIQ/maxresdefault.jpg", alt="")
                a.event-recbutton.button.button--shadow(href="https://www.youtube.com/playlist?list=PLMc7NR20hA-LQ0GR1QW5SDQflMOuPUqDQ", target="_blank")
                    <i><svg width="9" height="10" viewBox="0 0 9 10" fill="none" xmlns="http://www.w3.org/2000/svg">
                        <path d="M8.71423 4.99993L0.142805 9.94865L0.142805 0.0512134L8.71423 4.99993Z"/>
                    </svg></i>
                    span Watch Virtual Meetup videos 
            .event-dynamicsect
                h3.h5.pb-1x Ignite Summit: Cloud Edition
                p Ignite Summit: Cloud Edition is the premier event for developers who use Apache Ignite® and in-memory computing to tackle speed and scale challenges in cloud environments.
                a.button.button--shadow.event-recmorebutton(href="https://www.meetup.com/ru-RU/Apache-Ignite-Virtual-Meetup/events/280383112/", target="_blank") Learn more
    // /.event-virtual



    section.eventyoucity.container 
        h2.h4 Apache Ignite Meetups In Your City
        .eventyoucity__wrap.pt-5
            article.eventyoucity__item
                .eventyoucity__icon 
                    img(src="/public/img/events/flag-uk.svg", alt="")
                .eventyoucity__town.h5
                    strong London
                    span Apache Ignite Meetup
                .eventyoucity__action 
                    a.button.button--shadow(href="https://www.meetup.com/ru-RU/Apache-Ignite-London/" target="_blank")
                        img(src="/public/img/events/icon-plus.svg", alt="")
                        span Join 
            article.eventyoucity__item
                .eventyoucity__icon 
                    img(src="/public/img/events/flag-ru.svg", alt="")
                .eventyoucity__town.h5
                    strong St.Petersburg
                    span Apache Ignite Meetup
                .eventyoucity__action 
                    a.button.button--shadow(href="https://www.meetup.com/ru-RU/St-Petersburg-Apache-Ignite-Meetup/" target="_blank")
                        img(src="/public/img/events/icon-plus.svg", alt="")
                        span Join 
            article.eventyoucity__item
                .eventyoucity__icon 
                    img(src="/public/img/events/flag-ru.svg", alt="")
                .eventyoucity__town.h5
                    strong Moscow
                    span Apache Ignite Meetup
                .eventyoucity__action 
                    a.button.button--shadow(href="https://www.meetup.com/ru-RU/Moscow-Apache-Ignite-Meetup/" target="_blank")
                        img(src="/public/img/events/icon-plus.svg", alt="")
                        span Join
            article.eventyoucity__last
                p.fz20.pb-3 Start an onsite Apache Ignite Meetup in your city.
                small Take the first step.
                small Send us a note to <br><a href="mailto:dev@ignite.apache.org">dev@ignite.apache.org</a> <br>and we'll see what can be done.
    // /.eventyoucity



    section.eventupcoming.container#upcoming 
        .capstext.pb-1 Upcoming Events Schedule
        .eventupcoming__wrap.pt-4
            h2.h4.eventupcoming__head.pb-5 Online events (2)
            article.eventcomingitem.flexi 
                .eventcomingitem__left
                    p.eventcomingitem__num 9
                    p.eventcomingitem__month November 
                    p.eventcomingitem__year.pt-3 2021
                .eventcomingitem__main
                    p.eventcomingitem__title.h5 Apache Ignite 2.11: Improvements and .NET Upgrades, Apache Ignite 3 Alpha 3: The Journey Continues
                    p.eventcomingitem__descr.pt-1 A quick overview of Apache Ignite 2.11. This release resolved a number of issues, problems with the internal architecture and technical bugs. Plus we will discuss Apache Ignite 2.11 updates related to .NET. Just now, the Apache Ignite community released the latest version of Ignite 3—Alpha 3! Val Kulichenko, the Ignite 3.0 Release manager, will demonstrate the updates and the latest API changes.
                    a.eventcomingitem__more(href="https://www.meetup.com/Apache-Ignite-Virtual-Meetup/events/281596817", target="_blank") Learn more details
                .eventcomingitem__right
                    .eventcomingitem__mic
                        .eventcomingitem__speaker.
                            Maxim Muzafarov<br>
                            Pavel Tupitsyn<br>
                            Val Kulichenko
                    .eventcomingitem__loc
                        .eventcomingitem__locblock
                            img(src="/public/img/events/content/meetup.svg", alt="")
                        .eventcomingitem__camera Online event
            // /.eventcomingitem

            article.eventcomingitem.flexi 
                .eventcomingitem__left
                    p.eventcomingitem__num 15-16
                    p.eventcomingitem__month November
                    p.eventcomingitem__year.pt-3 2021
                .eventcomingitem__main
                    p.eventcomingitem__title.h5 Ignite Summit: Cloud Edition
                    p.eventcomingitem__descr.pt-1 On November 15 and 16, 2021a free virtual event—Ignite Summit: Cloud Edition will be held. The conference is for architects and developers who use or are interested in using Apache Ignite in the cloud. On November 15, 2021, free training sessions for EMEA and the Americas will be offered. On November 16, 2021, Ignite experts will share architectural insights and practical tips for solving challenges in cloud environments.
                    a.eventcomingitem__more(href="https://ignite-summit.org/", target="_blank") Learn more details
                .eventcomingitem__right
                    .eventcomingitem__mic
                        .eventcomingitem__speaker Cloud Edition
                    .eventcomingitem__loc
                        .eventcomingitem__locblock
                            img(src="/public/img/events/content/summit.svg", alt="")
                        .eventcomingitem__camera Online event
            // /.eventcomingitem

        .eventupcoming__wrap.pt-4
            h2.h4.py-4 Offline events (2)
            article.eventcomingitem.flexi 
                .eventcomingitem__left
                    p.eventcomingitem__num 13
                    p.eventcomingitem__month November
                    p.eventcomingitem__year.pt-3 2021
                .eventcomingitem__main
                    p.eventcomingitem__title.h5 Backward compatibility on the example of Apache Ignite. Why does it hurt so much?
                    p.eventcomingitem__descr.pt-1 I am developing an Apache Ignite distributed database. Our product provides backward compatibility between versions. What do you need to think about for backward compatibility? What is Backward Compatibility for Developers? How do I test it? Why does it hurt so much? How to relieve pain? I will tell you about all this with the code examples.
                    a.eventcomingitem__more(href="https://mergeconf.ru/development/opensource/izhikov", target="_blank") Learn more details
                .eventcomingitem__right
                    .eventcomingitem__mic
                        .eventcomingitem__speaker  Nikolay Izhikov
                    .eventcomingitem__loc
                        .eventcomingitem__locblock
                            img(src="/public/img/events/content/merge.svg", alt="")
                        .eventcomingitem__address Innopolis, Russia
            // /.eventcomingitem

            article.eventcomingitem.flexi 
                .eventcomingitem__left
                    p.eventcomingitem__num 18
                    p.eventcomingitem__month November
                    p.eventcomingitem__year.pt-3 2021
                .eventcomingitem__main
                    p.eventcomingitem__title.h5 Ignite Summit: Cloud Edition
                    p.eventcomingitem__descr.pt-1 The report will present the concept of historical rebalancing, implemented in the Apache Ignite distributed database.
                    a.eventcomingitem__more(href="https://www.highload.ru/moscow/2021/abstracts/7989", target="_blank") Learn more details
                .eventcomingitem__right
                    .eventcomingitem__mic
                        .eventcomingitem__speaker Vlad Pyatkov
                    .eventcomingitem__loc
                        .eventcomingitem__locblock
                            img(src="/public/img/events/content/hl++.svg", alt="")
                        .eventcomingitem__address Moscow, Russia
            // /.eventcomingitem
    // /.eventupcoming




    section.eventspast#past.container.jsTabWrap
        h3.capstext.pb-5 Past Events
        .eventspast__tablinks.flexi 
            button.eventpast__link(data-tablink="e2021").active 2021
            button.eventpast__link(data-tablink="e2020") 2020
            button.eventpast__link(data-tablink="e2019") 2019
            button.eventpast__link(data-tablink="e2018") 2018
            button.eventpast__link(data-tablink="e2017") 2017
            button.eventpast__link(data-tablink="e2016") 2016
            button.eventpast__link(data-tablink="e2015") 2015
            button.eventpast__link(data-tablink="e2014") 2014
        .eventspast__tabs
            .eventspast__tabwrap(data-tab="e2021").active
                include ./_components/events/2021.pug
            // /.eventspast__tabwrap 2021
            
            .eventspast__tabwrap(data-tab="e2020")
                include ./_components/events/2020.pug
            // /.eventspast__tabwrap 2020

            .eventspast__tabwrap(data-tab="e2019")
                include ./_components/events/2019.pug
            // /.eventspast__tabwrap 2019

            .eventspast__tabwrap(data-tab="e2018")
                include ./_components/events/2018.pug
            // /.eventspast__tabwrap 2018

            .eventspast__tabwrap(data-tab="e2017")
                include ./_components/events/2017.pug
            // /.eventspast__tabwrap 2017

            .eventspast__tabwrap(data-tab="e2016")
                include ./_components/events/2016.pug
            // /.eventspast__tabwrap 2016

            .eventspast__tabwrap(data-tab="e2015")
                include ./_components/events/2015.pug
            // /.eventspast__tabwrap 2015

            .eventspast__tabwrap(data-tab="e2014")
                include ./_components/events/2014.pug
            // /.eventspast__tabwrap 2014
    // /.eventspast
        



    