{"id":9986,"date":"2026-04-11T16:04:01","date_gmt":"2026-04-11T16:04:01","guid":{"rendered":"https:\/\/espacotalassa.com\/?page_id=9986"},"modified":"2026-04-12T14:21:24","modified_gmt":"2026-04-12T14:21:24","slug":"sightings-statistics-2","status":"publish","type":"page","link":"https:\/\/espacotalassa.com\/en\/research-education\/sightings-statistics-2\/","title":{"rendered":"Sightings &amp; Statistics"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\"><strong>Cetaceans of the Azores<\/strong><\/h2>\n\n\n\n<p>Around <strong>90 species of cetaceans<\/strong> \u2014 whales, dolphins, and porpoises \u2014 inhabit our planet\u2019s seas, oceans, and even some rivers.<br>In the <strong>Azores<\/strong>, <strong>29 species<\/strong> have been officially recorded \u2014 an impressive number for such a small region in the middle of the Atlantic Ocean.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Every Trip is Unique<\/strong><\/h3>\n\n\n\n<p>On average, our guests encounter <strong>4 different species per trip<\/strong> (2024-2025), though record days have included <strong>up to 9 species in just 3 hours<\/strong>.<br>In <strong>99% of our excursions<\/strong>, we encounter cetaceans \u2014 a testament to the richness and vitality of Azorean waters.<\/p>\n\n\n\n<p>When planning your trip, remember that weekly statistics only offer a small glimpse of the ocean\u2019s reality.<br>Out here, every day is different \u2014 and every encounter is unforgettable.<\/p>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>Learn more<\/summary>\n<h3 class=\"wp-block-heading\"><strong>Over 30 Years of Observation and Research<\/strong><\/h3>\n\n\n\n<p>Since <strong>1993<\/strong>, Espa\u00e7o Talassa has been collecting and organizing data from thousands of trips at sea.<br>Yet building precise statistics remains complex \u2014 each species has its own behaviour, preferred habitat, and migratory rhythm.<\/p>\n\n\n\n<p>For example:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Sperm whales<\/strong> (<em>Physeter macrocephalus<\/em>) are rarely seen less than three miles from the coast.<\/li>\n\n\n\n<li><strong>Toothed whales<\/strong> tend to prefer deep offshore waters.<\/li>\n\n\n\n<li><strong>Atlantic spotted dolphins<\/strong> (<em>Stenella frontalis<\/em>) return to the archipelago around <strong>June<\/strong>, when sea temperatures reach <strong>20\u00b0C<\/strong>.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Sighting Frequency by Species<\/strong><\/h3>\n\n\n\n<p><strong>Often observed<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><em>Physeter macrocephalus<\/em> \u2013 Sperm whale<\/li>\n\n\n\n<li><em>Delphinus delphis<\/em> \u2013 Common dolphin<\/li>\n\n\n\n<li><em>Tursiops truncatus<\/em> \u2013 Bottlenose dolphin<\/li>\n\n\n\n<li><em>Stenella frontalis<\/em> \u2013 Atlantic spotted dolphin<\/li>\n\n\n\n<li><em>Grampus griseus<\/em> \u2013 Risso\u2019s dolphin<\/li>\n\n\n\n<li><em>Globicephala macrorhynchus<\/em> \u2013 Short-finned pilot whale<\/li>\n<\/ul>\n\n\n\n<p><strong>Occasionally observed<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><em>Stenella coeruleoalba<\/em> \u2013 Striped dolphin<\/li>\n\n\n\n<li><em>Pseudorca crassidens<\/em> \u2013 False killer whale<\/li>\n\n\n\n<li><em>Hyperoodon ampullatus<\/em> \u2013 Northern bottlenose whale<\/li>\n\n\n\n<li><em>Ziphius cavirostris<\/em> \u2013 Cuvier\u2019s beaked whale<\/li>\n\n\n\n<li><em>Mesoplodon bidens<\/em> \u2013 Sowerby\u2019s beaked whale<\/li>\n\n\n\n<li><em>Mesoplodon europaeus<\/em> \u2013 Gervais\u2019 beaked whale<\/li>\n\n\n\n<li><em>Balaenoptera musculus<\/em> \u2013 Blue whale<\/li>\n\n\n\n<li><em>Balaenoptera physalus<\/em> \u2013 Fin whale<\/li>\n\n\n\n<li><em>Balaenoptera borealis<\/em> \u2013 Sei whale<\/li>\n<\/ul>\n\n\n\n<p><strong>Rarely observed<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><em>Steno bredanensis<\/em> \u2013 Rough-toothed dolphin<\/li>\n\n\n\n<li><em>Orcinus orca<\/em> \u2013 Killer whale<\/li>\n\n\n\n<li><em>Kogia breviceps<\/em> \u2013 Pygmy sperm whale<\/li>\n\n\n\n<li><em>Megaptera novaeangliae<\/em> \u2013 Humpback whale<\/li>\n\n\n\n<li><em>Balaenoptera acutorostrata<\/em> \u2013 Minke whale<\/li>\n\n\n\n<li><em>Balaenoptera edeni<\/em> \u2013 Bryde\u2019s whale<\/li>\n\n\n\n<li><em>Mesoplodon densirostris<\/em> \u2013 Blainville\u2019s beaked whale<\/li>\n\n\n\n<li><em>Globicephala melas<\/em> \u2013 Long-finned pilot whale<\/li>\n\n\n\n<li><em>Lagenodelphis hosei<\/em> \u2013 Fraser\u2019s dolphin<\/li>\n\n\n\n<li><em>Mesoplodon mirus<\/em> \u2013 True\u2019s beaked whale<\/li>\n\n\n\n<li><em>Kogia sima<\/em> \u2013 Dwarf sperm whale<\/li>\n\n\n\n<li><em>Eubalaena glacialis<\/em> \u2013 Northern right whale<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n<\/details>\n\n\n\n<!-- Espa\u00e7o Talassa \u2014 Sightings Dashboard v2 -->\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Lora:wght@400;600&#038;family=Montserrat:wght@400;500;600&#038;display=swap\"\n    rel=\"stylesheet\">\n\n<div id=\"talassa-root\">\n    <style>\n        #talassa-root {\n            --color-bg: #f7f6f3;\n            --color-shade: #f0ede2;\n            --color-primary: #115eb9;\n            --color-dark: #20242b;\n            --color-primary-dark: #1d3455;\n            --color-text-main: #404040;\n            --color-text-lighter: #5f5e55;\n            --color-text-light: #8c8c8c;\n            --color-border: #d9d9d9;\n            --font-body: \"Montserrat\", sans-serif;\n            --font-heading: \"Lora\", serif;\n            font-family: var(--font-body);\n            color: var(--color-text-main);\n            background: var(--color-bg);\n            padding: 32px 24px;\n            font-size: 14px;\n            line-height: 1.6;\n        }\n\n        #talassa-root * {\n            box-sizing: border-box;\n            margin: 0;\n            padding: 0;\n        }\n\n        #talassa-root .dash-header {\n            margin-bottom: 32px;\n            border-bottom: 1px solid var(--color-border);\n            padding-bottom: 20px;\n        }\n\n        #talassa-root .dash-header h1 {\n            font-family: var(--font-heading);\n            font-size: 28px;\n            font-weight: 600;\n            color: var(--color-primary-dark);\n            margin-bottom: 6px;\n        }\n\n        #talassa-root .dash-header p {\n            font-size: 13px;\n            color: var(--color-text-light);\n        }\n\n        #talassa-root .tab-bar {\n            display: flex;\n            gap: 0;\n            margin-bottom: 28px;\n            border-bottom: 2px solid var(--color-border);\n        }\n\n        #talassa-root .tab-bar button {\n            padding: 10px 22px;\n            border: none;\n            background: none;\n            font-family: var(--font-body);\n            font-size: 13px;\n            font-weight: 500;\n            color: var(--color-text-light);\n            cursor: pointer;\n            position: relative;\n            bottom: -2px;\n            border-bottom: 2px solid transparent;\n            transition: color 0.15s, border-color 0.15s;\n            letter-spacing: 0.02em;\n        }\n\n        #talassa-root .tab-bar button:hover {\n            color: var(--color-primary);\n        }\n\n        #talassa-root .tab-bar button.active {\n            color: var(--color-primary);\n            border-bottom-color: var(--color-primary);\n            font-weight: 600;\n        }\n\n        #talassa-root .tab-bar button:disabled {\n            opacity: 0.4;\n            cursor: default;\n        }\n\n        #talassa-root #global-loader {\n            display: flex;\n            align-items: center;\n            gap: 16px;\n            padding: 48px 0;\n            color: var(--color-text-lighter);\n            font-size: 14px;\n        }\n\n        #talassa-root .spinner {\n            width: 28px;\n            height: 28px;\n            border: 3px solid var(--color-border);\n            border-top-color: var(--color-primary);\n            border-radius: 50%;\n            animation: t-spin 0.8s linear infinite;\n            flex-shrink: 0;\n        }\n\n        @keyframes t-spin {\n            to {\n                transform: rotate(360deg);\n            }\n        }\n\n        #talassa-root #loader-error {\n            display: none;\n            color: #ee3940;\n            font-size: 13px;\n            background: #fff0f0;\n            border: 1px solid #ffd9e2;\n            border-radius: 6px;\n            padding: 12px 16px;\n            max-width: 560px;\n            margin-top: 12px;\n        }\n\n        #talassa-root #loader-retry {\n            display: none;\n            margin-top: 12px;\n            padding: 8px 20px;\n            background: var(--color-primary);\n            color: #fff;\n            border: none;\n            border-radius: 4px;\n            font-family: var(--font-body);\n            font-size: 13px;\n            cursor: pointer;\n        }\n\n        #talassa-root .tab-panel {\n            display: none;\n        }\n\n        #talassa-root .tab-panel.active {\n            display: block;\n        }\n\n        #talassa-root .filters-bar {\n            display: flex;\n            gap: 24px;\n            align-items: center;\n            flex-wrap: wrap;\n            background: var(--color-shade);\n            padding: 14px 18px;\n            border-radius: 6px;\n            border: 1px solid var(--color-border);\n            margin-bottom: 24px;\n        }\n\n        #talassa-root .filters-bar label {\n            font-size: 12px;\n            font-weight: 600;\n            color: var(--color-text-lighter);\n            text-transform: uppercase;\n            letter-spacing: 0.06em;\n            margin-right: 8px;\n        }\n\n        #talassa-root select {\n            padding: 7px 12px;\n            border-radius: 4px;\n            border: 1px solid var(--color-border);\n            font-size: 13px;\n            font-family: var(--font-body);\n            background: #fff;\n            color: var(--color-text-main);\n            cursor: pointer;\n            outline: none;\n        }\n\n        #talassa-root select:focus {\n            border-color: var(--color-primary);\n        }\n\n        #talassa-root #table-summary {\n            margin-left: auto;\n            font-size: 13px;\n            color: var(--color-text-lighter);\n            font-weight: 500;\n        }\n\n        #talassa-root .table-wrapper {\n            overflow-x: auto;\n            border: 1px solid var(--color-border);\n            border-radius: 6px;\n        }\n\n        #talassa-root #tab-table table {\n            border-collapse: collapse;\n            width: 100%;\n            min-width: 900px;\n            font-size: 11px;\n            table-layout: fixed;\n        }\n\n        #talassa-root #tab-table th {\n            background: var(--color-shade);\n            padding: 8px 4px;\n            font-weight: 600;\n            font-size: 11px;\n            color: var(--color-text-lighter);\n            border: 1px solid var(--color-border);\n            text-align: center;\n        }\n\n        #talassa-root #tab-table td {\n            border: 1px solid #e8e6de;\n            text-align: center;\n        }\n\n        #talassa-root #tab-table tr:last-child td {\n            border-bottom: none;\n        }\n\n        #talassa-root .species-name {\n            text-align: left !important;\n            padding-left: 12px;\n            width: 200px;\n            min-width: 200px;\n            position: sticky;\n            left: 0;\n            background: #fff;\n            z-index: 20;\n            border-right: 2px solid var(--color-border) !important;\n            font-size: 12px;\n            color: var(--color-text-main);\n        }\n\n        #talassa-root th.species-name {\n            background: var(--color-shade) !important;\n            font-family: var(--font-heading);\n            font-size: 12px;\n            color: var(--color-primary-dark);\n        }\n\n        #talassa-root .day-col {\n            width: 30px;\n        }\n\n        #talassa-root .total-col {\n            width: 42px;\n            min-width: 42px;\n            font-weight: 600;\n            background: #eef3fb !important;\n            position: sticky;\n            right: 0;\n            z-index: 10;\n            border-left: 2px solid var(--color-border) !important;\n            color: var(--color-primary-dark);\n        }\n\n        #talassa-root .cell-container {\n            height: 36px;\n            display: flex;\n            flex-direction: column;\n        }\n\n        #talassa-root .row-half {\n            flex: 1;\n            width: 100%;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            font-size: 9px;\n            color: var(--color-text-light);\n        }\n\n        #talassa-root .am-zone {\n            border-bottom: 1px solid #f0ede2;\n        }\n\n        #talassa-root .boats-row td {\n            background: #faf8f0 !important;\n            font-weight: 600;\n        }\n\n        #talassa-root .boats-row .species-name {\n            background: #faf8f0 !important;\n            font-family: var(--font-heading);\n            font-size: 12px;\n            color: var(--color-text-lighter);\n            font-style: italic;\n        }\n\n        #talassa-root .species-swatch {\n            display: inline-block;\n            width: 9px;\n            height: 9px;\n            border-radius: 2px;\n            margin-right: 7px;\n            flex-shrink: 0;\n            vertical-align: middle;\n        }\n\n        #talassa-root .legend-section {\n            margin-top: 24px;\n            padding: 20px;\n            background: #fff;\n            border: 1px solid var(--color-border);\n            border-radius: 6px;\n        }\n\n        #talassa-root .legend-title {\n            font-family: var(--font-heading);\n            font-size: 15px;\n            color: var(--color-primary-dark);\n            margin-bottom: 14px;\n        }\n\n        #talassa-root .species-legend {\n            display: grid;\n            grid-template-columns: repeat(auto-fill, minmax(210px, 1fr));\n            gap: 8px;\n        }\n\n        #talassa-root .species-legend-item {\n            display: flex;\n            align-items: center;\n            gap: 8px;\n            font-size: 12px;\n            color: var(--color-text-main);\n        }\n\n        #talassa-root .legend-swatch {\n            width: 12px;\n            height: 12px;\n            border-radius: 2px;\n            flex-shrink: 0;\n        }\n\n        #talassa-root .hm-wrapper {\n            overflow-x: auto;\n            border: 1px solid var(--color-border);\n            border-radius: 6px;\n        }\n\n        #talassa-root #tab-heatmap table {\n            border-collapse: collapse;\n            width: 100%;\n            font-size: 12px;\n        }\n\n        #talassa-root #tab-heatmap th {\n            background: var(--color-shade);\n            padding: 10px 8px;\n            font-size: 11px;\n            font-weight: 600;\n            color: var(--color-text-lighter);\n            border: 1px solid var(--color-border);\n            white-space: nowrap;\n            text-transform: uppercase;\n            letter-spacing: 0.05em;\n        }\n\n        #talassa-root #tab-heatmap td {\n            border: 1px solid #e8e6de;\n            text-align: center;\n        }\n\n        #talassa-root .hm-species-col {\n            text-align: left !important;\n            padding: 0 12px 0 14px;\n            min-width: 190px;\n            width: 190px;\n            position: sticky;\n            left: 0;\n            background: #fff;\n            z-index: 10;\n            border-right: 2px solid var(--color-border) !important;\n            font-size: 12px;\n            white-space: nowrap;\n            color: var(--color-text-main);\n        }\n\n        #talassa-root th.hm-species-col {\n            background: var(--color-shade) !important;\n            font-family: var(--font-heading);\n            color: var(--color-primary-dark);\n            text-transform: none;\n            font-size: 12px;\n            letter-spacing: 0;\n        }\n\n        #talassa-root .hm-swatch {\n            display: inline-block;\n            width: 8px;\n            height: 8px;\n            border-radius: 2px;\n            margin-right: 7px;\n            vertical-align: middle;\n            flex-shrink: 0;\n        }\n\n        #talassa-root .hm-best-col {\n            min-width: 90px;\n            width: 90px;\n            position: sticky;\n            right: 0;\n            background: #eef3fb;\n            border-left: 2px solid var(--color-border) !important;\n            font-size: 11px;\n            color: var(--color-text-lighter);\n            padding: 0 8px;\n            white-space: nowrap;\n        }\n\n        #talassa-root th.hm-best-col {\n            background: var(--color-shade) !important;\n            color: var(--color-primary-dark);\n            font-family: var(--font-heading);\n            text-transform: none;\n            font-size: 12px;\n            letter-spacing: 0;\n        }\n\n        #talassa-root .heat-cell {\n            width: 72px;\n            min-width: 72px;\n            height: 40px;\n            position: relative;\n            cursor: default;\n            transition: filter 0.12s;\n        }\n\n        #talassa-root .heat-cell:hover {\n            filter: brightness(0.88);\n        }\n\n        #talassa-root .rate-label {\n            position: absolute;\n            inset: 0;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            font-size: 11px;\n            font-weight: 600;\n            pointer-events: none;\n        }\n\n\n        #talassa-root .hm-note {\n            font-size: 12px;\n            color: var(--color-text-light);\n            padding: 10px 0 0;\n        }\n\n        #talassa-root .section-heading {\n            font-family: var(--font-heading);\n            font-size: 20px;\n            color: var(--color-primary-dark);\n            margin-bottom: 6px;\n        }\n\n        #talassa-root .section-sub {\n            font-size: 13px;\n            color: var(--color-text-light);\n            margin-bottom: 20px;\n        }\n\n        #talassa-root .stats-grid {\n            display: grid;\n            grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n            gap: 16px;\n            margin-bottom: 28px;\n        }\n\n        #talassa-root .stat-box {\n            background: #fff;\n            padding: 20px;\n            border-radius: 6px;\n            border: 1px solid var(--color-border);\n        }\n\n        #talassa-root .stat-value {\n            font-family: var(--font-heading);\n            font-size: 30px;\n            font-weight: 600;\n            color: var(--color-primary);\n        }\n\n        #talassa-root .stat-label {\n            font-size: 11px;\n            color: var(--color-text-light);\n            text-transform: uppercase;\n            letter-spacing: 0.08em;\n            margin-top: 4px;\n        }\n\n        #talassa-root .chart-card {\n            background: #fff;\n            border-radius: 6px;\n            padding: 24px;\n            border: 1px solid var(--color-border);\n            margin-bottom: 20px;\n        }\n\n        #talassa-root .chart-header {\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n            margin-bottom: 18px;\n            flex-wrap: wrap;\n            gap: 10px;\n        }\n\n        #talassa-root .chart-title {\n            font-family: var(--font-heading);\n            font-size: 17px;\n            color: var(--color-primary-dark);\n        }\n\n        #talassa-root canvas {\n            max-height: 380px;\n        }\n\n        #talassa-root #a-species-chart {\n            max-height: none;\n        }\n\n        #talassa-root .intro-note {\n            font-size: 13px;\n            color: var(--color-text-lighter);\n            background: var(--color-shade);\n            padding: 12px 16px;\n            border-radius: 6px;\n            border-left: 3px solid var(--color-primary);\n            margin-bottom: 20px;\n            line-height: 1.6;\n        }\n\n        @media (max-width: 600px) {\n            #talassa-root {\n                padding: 16px 12px;\n            }\n\n            #talassa-root .dash-header h1 {\n                font-size: 20px;\n            }\n\n            #talassa-root .species-name {\n                width: 120px;\n                min-width: 120px;\n                font-size: 10px;\n            }\n\n            #talassa-root .filters-bar {\n                flex-direction: column;\n                align-items: flex-start;\n                gap: 10px;\n            }\n\n            #talassa-root .table-wrapper,\n            #talassa-root .hm-wrapper {\n                -webkit-overflow-scrolling: touch;\n            }\n\n            #talassa-root .tab-bar button {\n                padding: 10px 14px;\n                font-size: 12px;\n            }\n        }\n    <\/style>\n\n    <div class=\"dash-header\">\n        <h1>Cetacean Sightings &mdash; Espa&ccedil;o Talassa<\/h1>\n        <p>Historical whale and dolphin sighting records from Pico Island, Azores &middot; 1994&ndash;present<\/p>\n    <\/div>\n\n    <div class=\"tab-bar\" id=\"tab-bar\">\n        <button data-tab=\"table\" class=\"active\" disabled>Sightings Table<\/button>\n        <button data-tab=\"heatmap\" disabled>Seasonal Heatmap<\/button>\n        <button data-tab=\"analytics\" disabled>Analytics<\/button>\n    <\/div>\n\n    <div id=\"global-loader\">\n        <div class=\"spinner\"><\/div>\n        <span>Loading sightings data&hellip;<\/span>\n    <\/div>\n    <div id=\"loader-error\"><\/div>\n    <button id=\"loader-retry\" onclick=\"location.reload()\">Retry<\/button>\n\n    <div id=\"tab-table\" class=\"tab-panel\">\n        <p class=\"intro-note\">Each row shows a species. Each column is a day of the selected month. Cells are split in\n            two: <strong>top = AM<\/strong> &middot; <strong>bottom = PM<\/strong>. A coloured cell means the species was\n            sighted on that departure.<\/p>\n        <div class=\"filters-bar\">\n            <div><label for=\"t-year\">Year<\/label><select id=\"t-year\"><\/select><\/div>\n            <div><label for=\"t-month\">Month<\/label>\n                <select id=\"t-month\">\n                    <option value=\"3\">March<\/option>\n                    <option value=\"4\" selected>April<\/option>\n                    <option value=\"5\">May<\/option>\n                    <option value=\"6\">June<\/option>\n                    <option value=\"7\">July<\/option>\n                    <option value=\"8\">August<\/option>\n                    <option value=\"9\">September<\/option>\n                    <option value=\"10\">October<\/option>\n                    <option value=\"11\">November<\/option>\n                <\/select>\n            <\/div>\n            <div id=\"table-summary\"><\/div>\n        <\/div>\n        <div class=\"table-wrapper\">\n            <table>\n                <thead>\n                    <tr id=\"t-header-row\">\n                        <th class=\"species-name\">Species<\/th>\n                    <\/tr>\n                <\/thead>\n                <tbody id=\"t-body\"><\/tbody>\n            <\/table>\n        <\/div>\n        <div class=\"legend-section\">\n            <div class=\"legend-title\">Species legend<\/div>\n            <div class=\"species-legend\" id=\"t-legend\"><\/div>\n        <\/div>\n    <\/div>\n\n    <div id=\"tab-heatmap\" class=\"tab-panel\">\n        <h2 class=\"section-heading\">Seasonal sighting heatmap<\/h2>\n        <p class=\"section-sub\">% of trips on which each species was sighted &mdash; normalised by number of departures\n            per month<\/p>\n        <div class=\"filters-bar\" style=\"margin-top:0;\">\n            <div><label for=\"hm-year\">Year<\/label><select id=\"hm-year\"><\/select><\/div>\n        <\/div>\n        <div class=\"hm-wrapper\">\n            <table id=\"hm-table\"><\/table>\n        <\/div>\n        <p class=\"hm-note\">Colour intensity = sighting rate (% of departures with at least one sighting). White = never\n            recorded. <strong>Best month<\/strong> = highest sighting rate for that species within the selected period.\n        <\/p>\n    <\/div>\n\n    <div id=\"tab-analytics\" class=\"tab-panel\">\n        <div class=\"filters-bar\">\n            <div><label for=\"a-year\">Year<\/label><select id=\"a-year\"><\/select><\/div>\n            <div><label for=\"a-month\">Month<\/label>\n                <select id=\"a-month\">\n                    <option value=\"all\">All months<\/option>\n                    <option value=\"3\">March<\/option>\n                    <option value=\"4\">April<\/option>\n                    <option value=\"5\">May<\/option>\n                    <option value=\"6\">June<\/option>\n                    <option value=\"7\">July<\/option>\n                    <option value=\"8\">August<\/option>\n                    <option value=\"9\">September<\/option>\n                    <option value=\"10\">October<\/option>\n                    <option value=\"11\">November<\/option>\n                <\/select>\n            <\/div>\n        <\/div>\n        <p class=\"intro-note\">A departure is counted as <strong>successful<\/strong> if at least one cetacean was\n            sighted. AM and PM are counted separately.<\/p>\n        <div class=\"stats-grid\">\n            <div class=\"stat-box\">\n                <div class=\"stat-value\" id=\"val-success\">&#8211;<\/div>\n                <div class=\"stat-label\">Success Rate<\/div>\n            <\/div>\n            <div class=\"stat-box\">\n                <div class=\"stat-value\" id=\"val-species\">&#8211;<\/div>\n                <div class=\"stat-label\">Avg Species \/ Departure<\/div>\n            <\/div>\n            <div class=\"stat-box\">\n                <div class=\"stat-value\" id=\"val-trips\">&#8211;<\/div>\n                <div class=\"stat-label\">Departures in Period<\/div>\n            <\/div>\n        <\/div>\n        <div class=\"chart-card\">\n            <div class=\"chart-header\">\n                <h3 class=\"chart-title\">Species abundance ranking<\/h3>\n                <div><label for=\"a-topn\"\n                        style=\"font-size:12px;color:var(--color-text-light);margin-right:8px;\">Show<\/label>\n                    <select id=\"a-topn\">\n                        <option value=\"5\">Top 5<\/option>\n                        <option value=\"10\" selected>Top 10<\/option>\n                        <option value=\"15\">Top 15<\/option>\n                        <option value=\"all\">All<\/option>\n                    <\/select>\n                <\/div>\n            <\/div>\n            <canvas id=\"a-species-chart\"><\/canvas>\n        <\/div>\n        <div class=\"chart-card\">\n            <div class=\"chart-header\">\n                <h3 class=\"chart-title\" id=\"a-trend-title\">Species trend<\/h3><select id=\"a-species-filter\"><\/select>\n            <\/div>\n            <canvas id=\"a-trend-chart\"><\/canvas>\n        <\/div>\n        <div class=\"chart-card\">\n            <div class=\"chart-header\">\n                <h3 class=\"chart-title\" id=\"a-success-title\">Sighting success trend<\/h3>\n            <\/div>\n            <canvas id=\"a-success-chart\"><\/canvas>\n        <\/div>\n        <div class=\"chart-card\">\n            <div class=\"chart-header\">\n                <h3 class=\"chart-title\">Species legend<\/h3>\n            <\/div>\n            <div class=\"species-legend\" id=\"a-legend\"><\/div>\n        <\/div>\n    <\/div>\n\n\n    <div id=\"t-tooltip\"\n        style=\"position:fixed;display:none;background:#20242b;color:#f7f6f3;font-size:11px;font-family:'Montserrat',sans-serif;padding:6px 11px;border-radius:4px;white-space:nowrap;z-index:9999;pointer-events:none;\">\n    <\/div>\n<\/div>\n\n<script>\n    (function () {\n        console.log('[Talassa] bootstrap executing');\n        try {\n            var _b64 = \"KGZ1bmN0aW9uKCkgewogICAgY29uc3QgQ1NWX1VSTCA9ICdodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC9lLzJQQUNYLTF2U0UzNmp5MGUwZTBSblBJX1dkVnZMU3dDYUQxMTJsbkR4ZWFjZUNrTVV6R3lWVlVrNGM2cUppa01Ld0NqYzVmQjFqV2dPSGE5bFg2MzB2L3B1Yj9naWQ9MTYxMTgxODQzOSZzaW5nbGU9dHJ1ZSZvdXRwdXQ9Y3N2JzsKCiAgICAvLyBQcm92ZSBKUyBpcyBleGVjdXRpbmcgXHUyMDE0IHVwZGF0ZSBsb2FkZXIgdGV4dCBpbW1lZGlhdGVseQogICAgY29uc3QgX2xvYWRlclNwYW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdGFsYXNzYS1zaWdodGluZ3Mtcm9vdCAjbG9hZGVyLXJvdyBzcGFuJyk7CiAgICBpZiAoX2xvYWRlclNwYW4pIF9sb2FkZXJTcGFuLnRleHRDb250ZW50ID0gJ0pTIHJ1bm5pbmcgXHUyMDE0IGxvYWRpbmcgZGVwZW5kZW5jaWVzXHUyMDI2JzsKCiAgICAvLyBMb2FkIFBhcGFQYXJzZSArIENoYXJ0LmpzIGR5bmFtaWNhbGx5IHNvIFdvcmRQcmVzcyBjYW5ub3QgZGVmZXIvc3RyaXAgdGhlbQogICAgbGV0IF9kZXBzTG9hZGVkID0gMDsKICAgIGZ1bmN0aW9uIF9vbkRlcExvYWRlZCgpIHsKICAgICAgICBfZGVwc0xvYWRlZCsrOwogICAgICAgIGlmIChfbG9hZGVyU3BhbikgX2xvYWRlclNwYW4udGV4dENvbnRlbnQgPSBgRGVwZW5kZW5jaWVzOiAke19kZXBzTG9hZGVkfS8yIGxvYWRlZFx1MjAyNmA7CiAgICAgICAgaWYgKF9kZXBzTG9hZGVkID09PSAyKSB7IGlmIChfbG9hZGVyU3BhbikgX2xvYWRlclNwYW4udGV4dENvbnRlbnQgPSAnRmV0Y2hpbmcgQ1NWIGRhdGFcdTIwMjYnOyBpbml0KCk7IH0KICAgIH0KICAgIGZ1bmN0aW9uIF9sb2FkU2NyaXB0KHNyYywgY2IpIHsKICAgICAgICBjb25zdCBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CiAgICAgICAgcy5zcmMgPSBzcmM7CiAgICAgICAgcy5vbmxvYWQgPSBjYjsKICAgICAgICBzLm9uZXJyb3IgPSAoKSA9PiBzaG93RXJyb3IoJ0NvdWxkIG5vdCBsb2FkIHNjcmlwdDogJyArIHNyYyArICcuIENoZWNrIGlmIHlvdXIgYnJvd3NlciBvciBhIHNlY3VyaXR5IHBsdWdpbiBpcyBibG9ja2luZyBleHRlcm5hbCBzY3JpcHRzLicpOwogICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQocyk7CiAgICB9CiAgICBmdW5jdGlvbiBzaG93RXJyb3IobXNnKSB7CiAgICAgICAgY2xlYXJUaW1lb3V0KF9sb2FkVGltZW91dCk7CiAgICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9hZGVyLWVycm9yJyk7CiAgICAgICAgZWwudGV4dENvbnRlbnQgPSBtc2c7CiAgICAgICAgZWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvYWRlci1yZXRyeScpLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJzsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9hZGVyLXJvdycpLnF1ZXJ5U2VsZWN0b3IoJy5zcGlubmVyJykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgIH0KCiAgICAvLyAzMC1zZWNvbmQgdGltZW91dDogc2hvdyBlcnJvciBpbnN0ZWFkIG9mIGluZmluaXRlIHNwaW5uZXIKICAgIGNvbnN0IF9sb2FkVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgIHNob3dFcnJvcignRGF0YSBmYWlsZWQgdG8gbG9hZCBhZnRlciAzMCBzZWNvbmRzLiBDaGVjayB5b3VyIGJyb3dzZXIgY29uc29sZSAoRjEyKSBmb3IgZGV0YWlscywgb3IgdHJ5IHJlZnJlc2hpbmcuJyk7CiAgICB9LCAzMDAwMCk7CgogICAgX2xvYWRTY3JpcHQoJ2h0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL1BhcGFQYXJzZS81LjMuMi9wYXBhcGFyc2UubWluLmpzJywgX29uRGVwTG9hZGVkKTsKICAgIF9sb2FkU2NyaXB0KCdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2NoYXJ0LmpzJywgX29uRGVwTG9hZGVkKTsKCiAgICBmdW5jdGlvbiBpbml0KCkgewoKICAgIGNvbnN0IFNQRUNJRVMgPSBbCiAgICAgICAgeyBuYW1lOiAiU3Blcm0gd2hhbGUiLCAgICAgICAgICAgICAgICBjb2xvcjogIiNERTA2MDEiIH0sCiAgICAgICAgeyBuYW1lOiAiQ29tbW9uIGRvbHBoaW4iLCAgICAgICAgICAgICBjb2xvcjogIiNFODY4MzUiIH0sCiAgICAgICAgeyBuYW1lOiAiQXRsYW50aWMgc3BvdHRlZCBkb2xwaGluIiwgICBjb2xvcjogIiNGRkI2MDEiIH0sCiAgICAgICAgeyBuYW1lOiAiQm90dGxlbm9zZSBkb2xwaGluIiwgICAgICAgICBjb2xvcjogIiM5Q0NGMDAiIH0sCiAgICAgICAgeyBuYW1lOiAiU3RyaXBlZCBkb2xwaGluIiwgICAgICAgICAgICBjb2xvcjogIiNGRjYxMDEiIH0sCiAgICAgICAgeyBuYW1lOiAiUmlzc28ncyBkb2xwaGluIiwgICAgICAgICAgICBjb2xvcjogIiMwMDAwOTQiIH0sCiAgICAgICAgeyBuYW1lOiAiU2hvcnQtZmlubmVkIHBpbG90IHdoYWxlIiwgICBjb2xvcjogIiNDQzg4MDAiIH0sCiAgICAgICAgeyBuYW1lOiAiTG9uZy1maW5uZWQgcGlsb3Qgd2hhbGUiLCAgICBjb2xvcjogIiM5OTY2NjYiIH0sCiAgICAgICAgeyBuYW1lOiAiUm91Z2gtdG9vdGhlZCBkb2xwaGluIiwgICAgICBjb2xvcjogIiMwMDg2ODQiIH0sCiAgICAgICAgeyBuYW1lOiAiRmFsc2Uga2lsbGVyIHdoYWxlIiwgICAgICAgICBjb2xvcjogIiMwMDAwRDYiIH0sCiAgICAgICAgeyBuYW1lOiAiS2lsbGVyIHdoYWxlIiwgICAgICAgICAgICAgICBjb2xvcjogIiMzMTYxRkYiIH0sCiAgICAgICAgeyBuYW1lOiAiUHlnbXkgc3Blcm0gd2hhbGUiLCAgICAgICAgICBjb2xvcjogIiM4NTg2ODQiIH0sCiAgICAgICAgeyBuYW1lOiAiRnJhc2VyJ3MgZG9scGhpbiIsICAgICAgICAgICBjb2xvcjogIiM5OTY2OTkiIH0sCiAgICAgICAgeyBuYW1lOiAiSHVtcGJhY2sgd2hhbGUiLCAgICAgICAgICAgICBjb2xvcjogIiMyMUFBMzkiIH0sCiAgICAgICAgeyBuYW1lOiAiRmluIHdoYWxlIiwgICAgICAgICAgICAgICAgICBjb2xvcjogIiMzMENGQ0UiIH0sCiAgICAgICAgeyBuYW1lOiAiU2VpIHdoYWxlIiwgICAgICAgICAgICAgICAgICBjb2xvcjogIiNGRjlFQ0UiIH0sCiAgICAgICAgeyBuYW1lOiAiQmx1ZSB3aGFsZSIsICAgICAgICAgICAgICAgICBjb2xvcjogIiM5QzMwMzEiIH0sCiAgICAgICAgeyBuYW1lOiAiQnJ5ZGUncyB3aGFsZSIsICAgICAgICAgICAgICBjb2xvcjogIiNDRUZGQ0UiIH0sCiAgICAgICAgeyBuYW1lOiAiTWlua2Ugd2hhbGUiLCAgICAgICAgICAgICAgICBjb2xvcjogIiM1QTk5MDAiIH0sCiAgICAgICAgeyBuYW1lOiAiTm9ydGhlcm4gcmlnaHQgd2hhbGUiLCAgICAgICBjb2xvcjogIiMxMTExMTEiIH0sCiAgICAgICAgeyBuYW1lOiAiTm9ydGhlcm4gYm90dGxlbm9zZSB3aGFsZSIsICBjb2xvcjogIiMzMTMwOUMiIH0sCiAgICAgICAgeyBuYW1lOiAiQ3V2aWVyJ3MgYmVha2VkIHdoYWxlIiwgICAgICBjb2xvcjogIiMwRDdBMjQiIH0sCiAgICAgICAgeyBuYW1lOiAiU293ZXJieSdzIGJlYWtlZCB3aGFsZSIsICAgICBjb2xvcjogIiNGRkNGOUMiIH0sCiAgICAgICAgeyBuYW1lOiAiQmxhaW52aWxsZSdzIGJlYWtlZCB3aGFsZSIsICBjb2xvcjogIiNGNzk5MDYiIH0sCiAgICAgICAgeyBuYW1lOiAiR2VydmFpcycgYmVha2VkIHdoYWxlIiwgICAgICBjb2xvcjogIiM3QjIwMjAiIH0sCiAgICAgICAgeyBuYW1lOiAiVW5pZGVudGlmaWVkIGJlYWtlZCB3aGFsZSIsICBjb2xvcjogIiM2Nzk3Q0YiIH0KICAgIF07CgogICAgY29uc3QgU1BFQ0lFU19DT0xPUlMgPSBPYmplY3QuZnJvbUVudHJpZXMoU1BFQ0lFUy5tYXAocyA9PiBbcy5uYW1lLCBzLmNvbG9yXSkpOwogICAgY29uc3QgTU9OVEhTICAgICA9IFsiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIl07CiAgICBjb25zdCBNT05USF9OVU1TID0gWzMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMV07CgogICAgbGV0IGFsbERhdGEgPSBbXTsKICAgIGxldCBhY3RpdmVUYWIgPSAndGFibGUnOwogICAgbGV0IGFTcGVjaWVzQ2hhcnQgPSBudWxsLCBhVHJlbmRDaGFydCA9IG51bGwsIGFTdWNjZXNzQ2hhcnQgPSBudWxsOwoKICAgIGZ1bmN0aW9uIGVzYyhzKSB7CiAgICAgICAgcmV0dXJuIFN0cmluZyhzKS5yZXBsYWNlKC8mL2csJyZhbXA7JykucmVwbGFjZSgvIi9nLCcmcXVvdDsnKS5yZXBsYWNlKC88L2csJyZsdDsnKS5yZXBsYWNlKC8+L2csJyZndDsnKTsKICAgIH0KCiAgICBmdW5jdGlvbiBwb3B1bGF0ZVllYXJTZWxlY3QoZWxJZCwgaW5jbHVkZUFsbCkgewogICAgICAgIGNvbnN0IHlycyA9IFsuLi5uZXcgU2V0KGFsbERhdGEubWFwKGQgPT4gZC55ZWFyKSldLnNvcnQoKGEsYikgPT4gYi1hKTsKICAgICAgICBjb25zdCBtaW5ZciA9IE1hdGgubWluKC4uLnlycyksIG1heFlyID0gTWF0aC5tYXgoLi4ueXJzKTsKICAgICAgICBjb25zdCBzZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbElkKTsKICAgICAgICBjb25zdCBhbGxPcHQgPSBpbmNsdWRlQWxsID8gYDxvcHRpb24gdmFsdWU9ImFsbCI+QWxsIFRpbWUgKCR7bWluWXJ9XHUyMDEzJHttYXhZcn0pPC9vcHRpb24+YCA6ICcnOwogICAgICAgIGNvbnN0IHllYXJPcHRzID0geXJzLm1hcCgoeSwgaSkgPT4gYDxvcHRpb24gdmFsdWU9IiR7eX0iJHsoIWluY2x1ZGVBbGwgJiYgaT09PTApID8gJyBzZWxlY3RlZCcgOiAnJ30+JHt5fTwvb3B0aW9uPmApLmpvaW4oJycpOwogICAgICAgIHNlbC5pbm5lckhUTUwgPSBhbGxPcHQgKyB5ZWFyT3B0czsKICAgIH0KCiAgICAvLyBcdTI1MDBcdTI1MDAgTG9hZCB2aWEgbmF0aXZlIGZldGNoIChtb3JlIHJlbGlhYmxlIHRoYW4gUGFwYVBhcnNlIGRvd25sb2FkIG1vZGUpIFx1MjUwMFx1MjUwMAogICAgZmV0Y2goQ1NWX1VSTCkKICAgICAgICAudGhlbihyID0+IHsKICAgICAgICAgICAgaWYgKCFyLm9rKSB0aHJvdyBuZXcgRXJyb3IoJ0hUVFAgJyArIHIuc3RhdHVzICsgJyAnICsgci5zdGF0dXNUZXh0KTsKICAgICAgICAgICAgcmV0dXJuIHIudGV4dCgpOwogICAgICAgIH0pCiAgICAgICAgLnRoZW4oY3N2VGV4dCA9PiB7CiAgICAgICAgICAgIGNsZWFyVGltZW91dChfbG9hZFRpbWVvdXQpOwogICAgICAgICAgICBjb25zdCByZXMgPSBQYXBhLnBhcnNlKGNzdlRleHQsIHsgaGVhZGVyOiB0cnVlLCBkeW5hbWljVHlwaW5nOiB0cnVlIH0pOwogICAgICAgICAgICBhbGxEYXRhID0gcmVzLmRhdGEuZmlsdGVyKGQgPT4gZC55ZWFyKS5tYXAoZCA9PiAoewogICAgICAgICAgICAgICAgLi4uZCwKICAgICAgICAgICAgICAgIF9oYXNTaWdodGluZzogU1BFQ0lFUy5zb21lKHMgPT4gZFtzLm5hbWVdID49IDEpCiAgICAgICAgICAgIH0pKTsKCiAgICAgICAgICAgIGlmIChhbGxEYXRhLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgc2hvd0Vycm9yKCdUaGUgZGF0YSBzb3VyY2UgcmV0dXJuZWQgMCByZWNvcmRzLiBUaGUgR29vZ2xlIFNoZWV0IG1heSBuZWVkIHRvIGJlIHJlcHVibGlzaGVkOiBvcGVuIHRoZSBzaGVldCBcdTIxOTIgRmlsZSBcdTIxOTIgU2hhcmUgXHUyMTkyIFB1Ymxpc2ggdG8gd2ViIFx1MjE5MiByZXB1Ymxpc2ggdGhlICJTaWdodGluZ3MiIHRhYiBhcyBDU1YuJyk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnbG9iYWwtbG9hZGVyJykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKCiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50YWItYmFyIGJ1dHRvbicpLmZvckVhY2goYiA9PiBiLmRpc2FibGVkID0gZmFsc2UpOwoKICAgICAgICAgICAgcG9wdWxhdGVZZWFyU2VsZWN0KCd0LXllYXInLCBmYWxzZSk7CiAgICAgICAgICAgIHBvcHVsYXRlWWVhclNlbGVjdCgnaG0teWVhcicsIHRydWUpOwogICAgICAgICAgICBwb3B1bGF0ZVllYXJTZWxlY3QoJ2EteWVhcicsIHRydWUpOwoKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3QteWVhcicpLm9uY2hhbmdlICAgPSByZW5kZXJUYWJsZTsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3QtbW9udGgnKS5vbmNoYW5nZSAgPSByZW5kZXJUYWJsZTsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2htLXllYXInKS5vbmNoYW5nZSAgPSByZW5kZXJIZWF0bWFwOwogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYS15ZWFyJykub25jaGFuZ2UgICA9IHJlZnJlc2hBbmFseXRpY3M7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhLW1vbnRoJykub25jaGFuZ2UgID0gcmVmcmVzaEFuYWx5dGljczsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2EtdG9wbicpLm9uY2hhbmdlICAgPSByZWZyZXNoQW5hbHl0aWNzOwogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYS1zcGVjaWVzLWZpbHRlcicpLmlubmVySFRNTCA9IFNQRUNJRVMubWFwKHMgPT4gYDxvcHRpb24gdmFsdWU9IiR7cy5uYW1lfSI+JHtzLm5hbWV9PC9vcHRpb24+YCkuam9pbignJyk7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhLXNwZWNpZXMtZmlsdGVyJykub25jaGFuZ2UgID0gcmVmcmVzaEFuYWx5dGljczsKCiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50YWItYmFyIGJ1dHRvbicpLmZvckVhY2goYnRuID0+IHsKICAgICAgICAgICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHN3aXRjaFRhYihidG4uZGF0YXNldC50YWIpKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFiLXRhYmxlJykuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7CiAgICAgICAgICAgIHJlbmRlclRhYmxlKCk7CiAgICAgICAgICAgIHJlbmRlclRhYmxlTGVnZW5kKCk7CiAgICAgICAgICAgIHJlbmRlckFuYWx5dGljc0xlZ2VuZCgpOwogICAgICAgIH0pCiAgICAgICAgLmNhdGNoKGVyciA9PiB7CiAgICAgICAgICAgIHNob3dFcnJvcignRmFpbGVkIHRvIGxvYWQgZGF0YTogJyArIChlcnIubWVzc2FnZSB8fCAnbmV0d29yayBlcnJvcicpICsgJy4gQ2hlY2sgYnJvd3NlciBjb25zb2xlIChGMTIpIE5ldHdvcmsgdGFiIGZvciBkZXRhaWxzLicpOwogICAgICAgIH0pOwoKICAgIC8vIFx1MjUwMFx1MjUwMCBUYWIgc3dpdGNoaW5nIFx1MjUwMFx1MjUwMAogICAgZnVuY3Rpb24gc3dpdGNoVGFiKHRhYikgewogICAgICAgIGlmICh0YWIgPT09IGFjdGl2ZVRhYikgcmV0dXJuOwogICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50YWItYmFyIGJ1dHRvbicpLmZvckVhY2goYiA9PiBiLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsIGIuZGF0YXNldC50YWIgPT09IHRhYikpOwogICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50YWItcGFuZWwnKS5mb3JFYWNoKHAgPT4gcC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKSk7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHRhYi0ke3RhYn1gKS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTsKICAgICAgICBhY3RpdmVUYWIgPSB0YWI7CiAgICAgICAgaWYgKHRhYiA9PT0gJ2hlYXRtYXAnKSAgIHJlbmRlckhlYXRtYXAoKTsKICAgICAgICBpZiAodGFiID09PSAnYW5hbHl0aWNzJykgcmVmcmVzaEFuYWx5dGljcygpOwogICAgfQoKICAgIC8vIFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MAogICAgLy8gVEFCTEUKICAgIC8vIFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MAogICAgZnVuY3Rpb24gcmVuZGVyVGFibGUoKSB7CiAgICAgICAgY29uc3QgeWVhciAgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndC15ZWFyJykudmFsdWUpOwogICAgICAgIGNvbnN0IG1vbnRoID0gcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3QtbW9udGgnKS52YWx1ZSk7CiAgICAgICAgY29uc3QgYm9keSAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndC1ib2R5Jyk7CiAgICAgICAgY29uc3QgaGVhZCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndC1oZWFkZXItcm93Jyk7CiAgICAgICAgY29uc3Qgc3VtbSAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFibGUtc3VtbWFyeScpOwoKICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IGFsbERhdGEuZmlsdGVyKGQgPT4gZC55ZWFyID09PSB5ZWFyICYmIGQubW9udGggPT09IG1vbnRoKTsKICAgICAgICBjb25zdCBkYXlzID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDApLmdldERhdGUoKTsKCiAgICAgICAgbGV0IGhIdG1sID0gJzx0aCBjbGFzcz0ic3BlY2llcy1uYW1lIj5TcGVjaWVzPC90aD4nOwogICAgICAgIGZvciAobGV0IGQgPSAxOyBkIDw9IGRheXM7IGQrKykgaEh0bWwgKz0gYDx0aCBjbGFzcz0iZGF5LWNvbCI+JHtkfTwvdGg+YDsKICAgICAgICBoSHRtbCArPSAnPHRoIGNsYXNzPSJ0b3RhbC1jb2wiPlRyaXBzPC90aD4nOwogICAgICAgIGhlYWQuaW5uZXJIVE1MID0gaEh0bWw7CgogICAgICAgIGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgYm9keS5pbm5lckhUTUwgPSBgPHRyPjx0ZCBjb2xzcGFuPSIke2RheXMgKyAyfSIgc3R5bGU9InBhZGRpbmc6MzBweDt0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjojOTk5Ij5ObyBkYXRhIGF2YWlsYWJsZSBmb3IgdGhpcyBwZXJpb2Q8L3RkPjwvdHI+YDsKICAgICAgICAgICAgc3VtbS50ZXh0Q29udGVudCA9ICdObyBkYXRhIGF2YWlsYWJsZSc7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGNvbnN0IGJ5RGF5RGVwID0ge307CiAgICAgICAgZmlsdGVyZWQuZm9yRWFjaChyID0+IHsgYnlEYXlEZXBbYCR7ci5kYXl9XyR7ci5kZXBhcnR1cmV9YF0gPSByOyB9KTsKCiAgICAgICAgbGV0IHRvdGFsQm9hdHMgPSAwLCB0b3RhbFRyaXBzID0gMDsKICAgICAgICBsZXQgYkh0bWwgPSBgPHRyIGNsYXNzPSJib2F0cy1yb3ciPjx0ZCBjbGFzcz0ic3BlY2llcy1uYW1lIj5OdW1iZXIgb2YgYm9hdHM8L3RkPmA7CgogICAgICAgIGZvciAobGV0IGQgPSAxOyBkIDw9IGRheXM7IGQrKykgewogICAgICAgICAgICBjb25zdCBhbSA9IGJ5RGF5RGVwW2Ake2R9X0FNYF07CiAgICAgICAgICAgIGNvbnN0IHBtID0gYnlEYXlEZXBbYCR7ZH1fUE1gXTsKICAgICAgICAgICAgY29uc3QgYW1CID0gYW0\/LmJvYXRzIHx8IDA7CiAgICAgICAgICAgIGNvbnN0IHBtQiA9IHBtPy5ib2F0cyB8fCAwOwogICAgICAgICAgICBjb25zdCBhbVNlZSA9IGFtICYmIFNQRUNJRVMuc29tZShzID0+IGFtW3MubmFtZV0gPT09IDEpOwogICAgICAgICAgICBjb25zdCBwbVNlZSA9IHBtICYmIFNQRUNJRVMuc29tZShzID0+IHBtW3MubmFtZV0gPT09IDEpOwogICAgICAgICAgICBpZiAoYW1CID49IDEgfHwgYW1TZWUpIHRvdGFsVHJpcHMrKzsKICAgICAgICAgICAgaWYgKHBtQiA+PSAxIHx8IHBtU2VlKSB0b3RhbFRyaXBzKys7CiAgICAgICAgICAgIHRvdGFsQm9hdHMgKz0gKGFtQiArIHBtQik7CiAgICAgICAgICAgIGJIdG1sICs9IGA8dGQ+PGRpdiBjbGFzcz0iY2VsbC1jb250YWluZXIiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93LWhhbGYgYW0tem9uZSI+JHthbUIgPiAwID8gYW1CIDogJyd9PC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ctaGFsZiBwbS16b25lIj4ke3BtQiA+IDAgPyBwbUIgOiAnJ308L2Rpdj4KICAgICAgICAgICAgPC9kaXY+PC90ZD5gOwogICAgICAgIH0KICAgICAgICBiSHRtbCArPSAnPHRkIGNsYXNzPSJ0b3RhbC1jb2wiPlx1MjAxNDwvdGQ+PC90cj4nOwoKICAgICAgICBTUEVDSUVTLmZvckVhY2goc3AgPT4gewogICAgICAgICAgICBiSHRtbCArPSBgPHRyPjx0ZCBjbGFzcz0ic3BlY2llcy1uYW1lIj48c3BhbiBjbGFzcz0ic3BlY2llcy1zd2F0Y2giIHN0eWxlPSJiYWNrZ3JvdW5kOiR7c3AuY29sb3J9Ij48L3NwYW4+JHtzcC5uYW1lfTwvdGQ+YDsKICAgICAgICAgICAgbGV0IHRvdGFsID0gMDsKICAgICAgICAgICAgZm9yIChsZXQgZCA9IDE7IGQgPD0gZGF5czsgZCsrKSB7CiAgICAgICAgICAgICAgICBjb25zdCBhbSA9IGJ5RGF5RGVwW2Ake2R9X0FNYF0\/LltzcC5uYW1lXSA9PT0gMTsKICAgICAgICAgICAgICAgIGNvbnN0IHBtID0gYnlEYXlEZXBbYCR7ZH1fUE1gXT8uW3NwLm5hbWVdID09PSAxOwogICAgICAgICAgICAgICAgaWYgKGFtKSB0b3RhbCsrOwogICAgICAgICAgICAgICAgaWYgKHBtKSB0b3RhbCsrOwogICAgICAgICAgICAgICAgYkh0bWwgKz0gYDx0ZD48ZGl2IGNsYXNzPSJjZWxsLWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93LWhhbGYgYW0tem9uZSIke2FtID8gYCBzdHlsZT0iYmFja2dyb3VuZDoke3NwLmNvbG9yfSJgIDogJyd9PjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdy1oYWxmIHBtLXpvbmUiJHtwbSA\/IGAgc3R5bGU9ImJhY2tncm91bmQ6JHtzcC5jb2xvcn0iYCA6ICcnfT48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PjwvdGQ+YDsKICAgICAgICAgICAgfQogICAgICAgICAgICBiSHRtbCArPSBgPHRkIGNsYXNzPSJ0b3RhbC1jb2wiPiR7dG90YWwgPiAwID8gdG90YWwgOiAnJ308L3RkPjwvdHI+YDsKICAgICAgICB9KTsKCiAgICAgICAgYm9keS5pbm5lckhUTUwgPSBiSHRtbDsKICAgICAgICBzdW1tLnRleHRDb250ZW50ID0gYCR7dG90YWxUcmlwc30gdHJpcHMgdGhpcyBtb250aCBcdTIwMTQgJHt0b3RhbEJvYXRzfSB0b3RhbCBib2F0IGRlcGxveW1lbnRzYDsKICAgIH0KCiAgICBmdW5jdGlvbiByZW5kZXJUYWJsZUxlZ2VuZCgpIHsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndC1sZWdlbmQnKS5pbm5lckhUTUwgPSBTUEVDSUVTLm1hcChzcCA9PgogICAgICAgICAgICBgPGRpdiBjbGFzcz0ic3BlY2llcy1sZWdlbmQtaXRlbSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtc3dhdGNoIiBzdHlsZT0iYmFja2dyb3VuZDoke3NwLmNvbG9yfSI+PC9kaXY+CiAgICAgICAgICAgICAgICA8c3Bhbj4ke3NwLm5hbWV9PC9zcGFuPgogICAgICAgICAgICA8L2Rpdj5gCiAgICAgICAgKS5qb2luKCcnKTsKICAgIH0KCiAgICAvLyBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTAKICAgIC8vIEhFQVRNQVAKICAgIC8vIFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MAogICAgZnVuY3Rpb24gaGVhdENvbG9yKGhleCwgcGN0KSB7CiAgICAgICAgaWYgKHBjdCA9PT0gbnVsbCB8fCBwY3QgPT09IDApIHJldHVybiAnI2Y1ZjVmNSc7CiAgICAgICAgY29uc3QgciA9IHBhcnNlSW50KGhleC5zbGljZSgxLDMpLCAxNik7CiAgICAgICAgY29uc3QgZyA9IHBhcnNlSW50KGhleC5zbGljZSgzLDUpLCAxNik7CiAgICAgICAgY29uc3QgYiA9IHBhcnNlSW50KGhleC5zbGljZSg1LDcpLCAxNik7CiAgICAgICAgY29uc3QgYmxlbmQgPSAwLjE1ICsgTWF0aC5taW4ocGN0LCAxMDApIC8gMTAwICogMC44NTsKICAgICAgICByZXR1cm4gYHJnYigke01hdGgucm91bmQoMjU1KyhyLTI1NSkqYmxlbmQpfSwke01hdGgucm91bmQoMjU1KyhnLTI1NSkqYmxlbmQpfSwke01hdGgucm91bmQoMjU1KyhiLTI1NSkqYmxlbmQpfSlgOwogICAgfQoKICAgIGZ1bmN0aW9uIGhlYXRUZXh0Q29sb3IoaGV4LCBwY3QpIHsKICAgICAgICBpZiAocGN0ID09PSBudWxsIHx8IHBjdCA8IDM1KSByZXR1cm4gJyM1NTUnOwogICAgICAgIGNvbnN0IHIwID0gcGFyc2VJbnQoaGV4LnNsaWNlKDEsMyksIDE2KTsKICAgICAgICBjb25zdCBnMCA9IHBhcnNlSW50KGhleC5zbGljZSgzLDUpLCAxNik7CiAgICAgICAgY29uc3QgYjAgPSBwYXJzZUludChoZXguc2xpY2UoNSw3KSwgMTYpOwogICAgICAgIGNvbnN0IGJsZW5kID0gMC4xNSArIE1hdGgubWluKHBjdCwgMTAwKSAvIDEwMCAqIDAuODU7CiAgICAgICAgY29uc3QgciA9IE1hdGgucm91bmQoMjU1KyhyMC0yNTUpKmJsZW5kKTsKICAgICAgICBjb25zdCBnID0gTWF0aC5yb3VuZCgyNTUrKGcwLTI1NSkqYmxlbmQpOwogICAgICAgIGNvbnN0IGIgPSBNYXRoLnJvdW5kKDI1NSsoYjAtMjU1KSpibGVuZCk7CiAgICAgICAgcmV0dXJuICgwLjI5OSpyICsgMC41ODcqZyArIDAuMTE0KmIpIC8gMjU1IDwgMC40NSA\/ICcjZmZmJyA6ICcjMzMzJzsKICAgIH0KCiAgICBmdW5jdGlvbiByZW5kZXJIZWF0bWFwKCkgewogICAgICAgIGNvbnN0IHllYXJWYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaG0teWVhcicpLnZhbHVlOwogICAgICAgIGNvbnN0IGRhdGEgPSB5ZWFyVmFsID09PSAnYWxsJyA\/IGFsbERhdGEgOiBhbGxEYXRhLmZpbHRlcihkID0+IGQueWVhciA9PT0gcGFyc2VJbnQoeWVhclZhbCkpOwoKICAgICAgICBjb25zdCBieU1vbnRoID0ge307CiAgICAgICAgTU9OVEhfTlVNUy5mb3JFYWNoKG0gPT4geyBieU1vbnRoW21dID0gZGF0YS5maWx0ZXIoZCA9PiBkLm1vbnRoID09PSBtKTsgfSk7CgogICAgICAgIGNvbnN0IG1hdHJpeCA9IFNQRUNJRVMubWFwKHNwID0+ICh7CiAgICAgICAgICAgIHNwLAogICAgICAgICAgICByYXRlczogTU9OVEhfTlVNUy5tYXAobSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBtb250aFJvd3MgPSBieU1vbnRoW21dOwogICAgICAgICAgICAgICAgY29uc3QgdmFsaWRUcmlwcyA9IG1vbnRoUm93cy5maWx0ZXIociA9PiByLmJvYXRzID49IDEgfHwgU1BFQ0lFUy5zb21lKHMgPT4gcltzLm5hbWVdID49IDEpKTsKICAgICAgICAgICAgICAgIGNvbnN0IHNlZW4gPSB2YWxpZFRyaXBzLmZpbHRlcihyID0+IHJbc3AubmFtZV0gPj0gMSkubGVuZ3RoOwogICAgICAgICAgICAgICAgY29uc3QgcmF0ZSA9IHZhbGlkVHJpcHMubGVuZ3RoID4gMCA\/IHBhcnNlRmxvYXQoKHNlZW4gLyB2YWxpZFRyaXBzLmxlbmd0aCAqIDEwMCkudG9GaXhlZCgxKSkgOiBudWxsOwogICAgICAgICAgICAgICAgcmV0dXJuIHsgbSwgcjogcmF0ZSwgdHJpcHM6IHZhbGlkVHJpcHMubGVuZ3RoLCBzZWVuIH07CiAgICAgICAgICAgIH0pCiAgICAgICAgfSkpOwoKICAgICAgICBsZXQgaHRtbCA9ICc8dGhlYWQ+PHRyPic7CiAgICAgICAgaHRtbCArPSAnPHRoIGNsYXNzPSJobS1zcGVjaWVzLWNvbCI+U3BlY2llczwvdGg+JzsKICAgICAgICBNT05USFMuZm9yRWFjaChtID0+IHsgaHRtbCArPSBgPHRoPiR7bS5zbGljZSgwLDMpfTwvdGg+YDsgfSk7CiAgICAgICAgaHRtbCArPSAnPHRoIGNsYXNzPSJobS1iZXN0LWNvbCI+QmVzdCBNb250aDwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT4nOwoKICAgICAgICBtYXRyaXguZm9yRWFjaCgoeyBzcCwgcmF0ZXMgfSkgPT4gewogICAgICAgICAgICBjb25zdCBiZXN0ID0gcmF0ZXMucmVkdWNlKChiLCBjdXIpID0+IGN1ci5yID09PSBudWxsID8gYiA6ICghYiB8fCBjdXIuciA+IGIuciA\/IGN1ciA6IGIpLCBudWxsKTsKICAgICAgICAgICAgaHRtbCArPSAnPHRyPic7CiAgICAgICAgICAgIGh0bWwgKz0gYDx0ZCBjbGFzcz0iaG0tc3BlY2llcy1jb2wiPjxzcGFuIGNsYXNzPSJobS1zd2F0Y2giIHN0eWxlPSJiYWNrZ3JvdW5kOiR7c3AuY29sb3J9Ij48L3NwYW4+JHtlc2Moc3AubmFtZSl9PC90ZD5gOwogICAgICAgICAgICByYXRlcy5mb3JFYWNoKCh7IG0sIHIsIHRyaXBzLCBzZWVuIH0pID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IGJnICA9IGhlYXRDb2xvcihzcC5jb2xvciwgcik7CiAgICAgICAgICAgICAgICBjb25zdCBmZyAgPSBoZWF0VGV4dENvbG9yKHNwLmNvbG9yLCByKTsKICAgICAgICAgICAgICAgIGNvbnN0IGxibCA9IHIgIT09IG51bGwgJiYgciA+IDAgPyBgJHtyfSVgIDogJyc7CiAgICAgICAgICAgICAgICBjb25zdCB0aXAgPSByICE9PSBudWxsCiAgICAgICAgICAgICAgICAgICAgPyBgJHtlc2Moc3AubmFtZSl9IFx1MDBiNyAke01PTlRIU1tNT05USF9OVU1TLmluZGV4T2YobSldfSBcdTAwYjcgJHtyfSUgKCR7c2Vlbn0vJHt0cmlwc30gdHJpcHMpYAogICAgICAgICAgICAgICAgICAgIDogYCR7ZXNjKHNwLm5hbWUpfSBcdTAwYjcgJHtNT05USFNbTU9OVEhfTlVNUy5pbmRleE9mKG0pXX0gXHUwMGI3IG5vIHRyaXBzIHJlY29yZGVkYDsKICAgICAgICAgICAgICAgIGh0bWwgKz0gYDx0ZCBjbGFzcz0iaGVhdC1jZWxsIiBzdHlsZT0iYmFja2dyb3VuZDoke2JnfSIgZGF0YS10aXA9IiR7dGlwfSI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InJhdGUtbGFiZWwiIHN0eWxlPSJjb2xvcjoke2ZnfSI+JHtsYmx9PC9zcGFuPjwvdGQ+YDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlmIChiZXN0KSB7CiAgICAgICAgICAgICAgICBodG1sICs9IGA8dGQgY2xhc3M9ImhtLWJlc3QtY29sIj4ke01PTlRIU1tNT05USF9OVU1TLmluZGV4T2YoYmVzdC5tKV0uc2xpY2UoMCwzKX0gPHN0cm9uZz4ke2Jlc3Qucn0lPC9zdHJvbmc+PC90ZD5gOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaHRtbCArPSBgPHRkIGNsYXNzPSJobS1iZXN0LWNvbCIgc3R5bGU9ImNvbG9yOiNjY2MiPlx1MjAxNDwvdGQ+YDsKICAgICAgICAgICAgfQogICAgICAgICAgICBodG1sICs9ICc8L3RyPic7CiAgICAgICAgfSk7CgogICAgICAgIGh0bWwgKz0gJzwvdGJvZHk+JzsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaG0tdGFibGUnKS5pbm5lckhUTUwgPSBodG1sOwogICAgfQoKICAgIC8vIFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MAogICAgLy8gQU5BTFlUSUNTCiAgICAvLyBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTAKICAgIGZ1bmN0aW9uIHNpZ2h0aW5nUmF0ZShyb3dzLCBzcGVjaWVzTmFtZSkgewogICAgICAgIGNvbnN0IHRyaXBzID0gcm93cy5maWx0ZXIociA9PiByLmJvYXRzID49IDEgfHwgci5faGFzU2lnaHRpbmcpOwogICAgICAgIGlmICh0cmlwcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsOwogICAgICAgIHJldHVybiBwYXJzZUZsb2F0KCh0cmlwcy5maWx0ZXIociA9PiByW3NwZWNpZXNOYW1lXSA+PSAxKS5sZW5ndGggLyB0cmlwcy5sZW5ndGggKiAxMDApLnRvRml4ZWQoMSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlZnJlc2hBbmFseXRpY3MoKSB7CiAgICAgICAgW2FTcGVjaWVzQ2hhcnQsIGFUcmVuZENoYXJ0LCBhU3VjY2Vzc0NoYXJ0XS5mb3JFYWNoKGMgPT4gYyAmJiBjLmRlc3Ryb3koKSk7CiAgICAgICAgYVNwZWNpZXNDaGFydCA9IGFUcmVuZENoYXJ0ID0gYVN1Y2Nlc3NDaGFydCA9IG51bGw7CgogICAgICAgIGNvbnN0IHllYXIgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhLXllYXInKS52YWx1ZTsKICAgICAgICBjb25zdCBtb250aCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYS1tb250aCcpLnZhbHVlOwogICAgICAgIGNvbnN0IHRvcE5SYXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYS10b3BuJykudmFsdWU7CiAgICAgICAgY29uc3QgdG9wTiAgID0gdG9wTlJhdyA9PT0gJ2FsbCcgPyBTUEVDSUVTLmxlbmd0aCA6IHBhcnNlSW50KHRvcE5SYXcpOwogICAgICAgIGNvbnN0IG1OdW0gICA9IG1vbnRoICE9PSAnYWxsJyA\/IHBhcnNlSW50KG1vbnRoKSA6IG51bGw7CgogICAgICAgIGxldCBmaWx0ZXJlZCA9IHllYXIgPT09ICdhbGwnID8gYWxsRGF0YSA6IGFsbERhdGEuZmlsdGVyKGQgPT4gZC55ZWFyID09PSBwYXJzZUludCh5ZWFyKSk7CiAgICAgICAgaWYgKG1OdW0gIT09IG51bGwpIGZpbHRlcmVkID0gZmlsdGVyZWQuZmlsdGVyKGQgPT4gZC5tb250aCA9PT0gbU51bSk7CgogICAgICAgIGNvbnN0IHJlbGV2YW50ICAgPSBmaWx0ZXJlZC5maWx0ZXIoZCA9PiBkLmJvYXRzID49IDEgfHwgZC5faGFzU2lnaHRpbmcpOwogICAgICAgIGNvbnN0IHRvdGFsVHJpcHMgPSByZWxldmFudC5sZW5ndGg7CiAgICAgICAgY29uc3Qgc3VjY2Vzc2VzICA9IHJlbGV2YW50LmZpbHRlcihkID0+IGQuX2hhc1NpZ2h0aW5nKS5sZW5ndGg7CiAgICAgICAgY29uc3QgcmF0ZSAgICAgICA9IHRvdGFsVHJpcHMgPiAwID8gKHN1Y2Nlc3NlcyAvIHRvdGFsVHJpcHMgKiAxMDApLnRvRml4ZWQoMSkgOiAnMC4wJzsKICAgICAgICBsZXQgdG90YWxDb3VudCA9IDA7CiAgICAgICAgcmVsZXZhbnQuZm9yRWFjaChkID0+IHsgU1BFQ0lFUy5mb3JFYWNoKHMgPT4geyBpZiAoZFtzLm5hbWVdID49IDEpIHRvdGFsQ291bnQrKzsgfSk7IH0pOwogICAgICAgIGNvbnN0IGF2Z1NwID0gdG90YWxUcmlwcyA+IDAgPyAodG90YWxDb3VudCAvIHRvdGFsVHJpcHMpLnRvRml4ZWQoMSkgOiAnMC4wJzsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmFsLXN1Y2Nlc3MnKS5pbm5lclRleHQgPSByYXRlICsgJyUnOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2YWwtc3BlY2llcycpLmlubmVyVGV4dCA9IGF2Z1NwOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2YWwtdHJpcHMnKS5pbm5lclRleHQgICA9IHRvdGFsVHJpcHMudG9Mb2NhbGVTdHJpbmcoKTsKCiAgICAgICAgY29uc3QgcmF0ZXMgPSBTUEVDSUVTLm1hcChzID0+ICh7IG5hbWU6IHMubmFtZSwgcmF0ZTogc2lnaHRpbmdSYXRlKGZpbHRlcmVkLCBzLm5hbWUpID8\/IDAgfSkpCiAgICAgICAgICAgIC5zb3J0KChhLGIpID0+IGIucmF0ZSAtIGEucmF0ZSkuc2xpY2UoMCwgdG9wTik7CgogICAgICAgIGNvbnN0IHNwZWNpZXNDYW52YXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYS1zcGVjaWVzLWNoYXJ0Jyk7CiAgICAgICAgY29uc3QgY2hhcnRIZWlnaHQgPSBNYXRoLm1heCgyNDAsIHJhdGVzLmxlbmd0aCAqIDM0KTsKICAgICAgICBsZXQgc3BlY2llc1dyYXBwZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYS1zcGVjaWVzLWNoYXJ0LXdyYXBwZXInKTsKICAgICAgICBpZiAoIXNwZWNpZXNXcmFwcGVyKSB7CiAgICAgICAgICAgIHNwZWNpZXNXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgIHNwZWNpZXNXcmFwcGVyLmlkID0gJ2Etc3BlY2llcy1jaGFydC13cmFwcGVyJzsKICAgICAgICAgICAgc3BlY2llc1dyYXBwZXIuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnOwogICAgICAgICAgICBzcGVjaWVzQ2FudmFzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNwZWNpZXNXcmFwcGVyLCBzcGVjaWVzQ2FudmFzKTsKICAgICAgICAgICAgc3BlY2llc1dyYXBwZXIuYXBwZW5kQ2hpbGQoc3BlY2llc0NhbnZhcyk7CiAgICAgICAgfQogICAgICAgIHNwZWNpZXNXcmFwcGVyLnN0eWxlLmhlaWdodCA9IGNoYXJ0SGVpZ2h0ICsgJ3B4JzsKICAgICAgICBzcGVjaWVzQ2FudmFzLnN0eWxlLmhlaWdodCA9ICcnOwogICAgICAgIGFTcGVjaWVzQ2hhcnQgPSBuZXcgQ2hhcnQoc3BlY2llc0NhbnZhcy5nZXRDb250ZXh0KCcyZCcpLCB7CiAgICAgICAgICAgIHR5cGU6ICdiYXInLAogICAgICAgICAgICBkYXRhOiB7CiAgICAgICAgICAgICAgICBsYWJlbHM6IHJhdGVzLm1hcChjID0+IGMubmFtZSksCiAgICAgICAgICAgICAgICBkYXRhc2V0czogW3sgbGFiZWw6ICclIG9mIHRyaXBzJywgZGF0YTogcmF0ZXMubWFwKGMgPT4gYy5yYXRlKSwgYmFja2dyb3VuZENvbG9yOiByYXRlcy5tYXAoYyA9PiBTUEVDSUVTX0NPTE9SU1tjLm5hbWVdIHx8ICcjMTE1RUI5JyksIGJvcmRlclJhZGl1czogNSB9XQogICAgICAgICAgICB9LAogICAgICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgICAgICBpbmRleEF4aXM6ICd5JywgcmVzcG9uc2l2ZTogdHJ1ZSwgbWFpbnRhaW5Bc3BlY3RSYXRpbzogZmFsc2UsCiAgICAgICAgICAgICAgICBwbHVnaW5zOiB7IGxlZ2VuZDogeyBkaXNwbGF5OiBmYWxzZSB9LCB0b29sdGlwOiB7IGNhbGxiYWNrczogeyBsYWJlbDogY3R4ID0+IGAgJHtjdHgucmF3fSUgb2YgdHJpcHNgIH0gfSB9LAogICAgICAgICAgICAgICAgc2NhbGVzOiB7IHg6IHsgbWluOiAwLCBtYXg6IDEwMCwgdGlja3M6IHsgY2FsbGJhY2s6IHYgPT4gdiArICclJyB9IH0gfQogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIGNvbnN0IHNwICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Etc3BlY2llcy1maWx0ZXInKS52YWx1ZTsKICAgICAgICBjb25zdCBjb2xvciA9IFNQRUNJRVNfQ09MT1JTW3NwXSB8fCAnIzExNUVCOSc7CiAgICAgICAgbGV0IHRMYWJlbHMgPSBbXSwgdFZhbHVlcyA9IFtdOwoKICAgICAgICBpZiAobW9udGggIT09ICdhbGwnKSB7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhLXRyZW5kLXRpdGxlJykuaW5uZXJUZXh0ID0gYCR7c3B9IFx1MjAxNCAke01PTlRIU1tNT05USF9OVU1TLmluZGV4T2YobU51bSldfSBzaWdodGluZyByYXRlIGJ5IHllYXJgOwogICAgICAgICAgICBjb25zdCB5ZWFycyA9IFsuLi5uZXcgU2V0KGFsbERhdGEubWFwKGQgPT4gZC55ZWFyKSldLnNvcnQoKGEsYikgPT4gYS1iKS5maWx0ZXIoeSA9PiB5ICE9PSAxOTk2KTsKICAgICAgICAgICAgdExhYmVscyA9IHllYXJzOwogICAgICAgICAgICB0VmFsdWVzID0geWVhcnMubWFwKHkgPT4gc2lnaHRpbmdSYXRlKGFsbERhdGEuZmlsdGVyKGQgPT4gZC55ZWFyID09PSB5ICYmIGQubW9udGggPT09IG1OdW0pLCBzcCkpOwogICAgICAgIH0gZWxzZSBpZiAoeWVhciA9PT0gJ2FsbCcpIHsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2EtdHJlbmQtdGl0bGUnKS5pbm5lclRleHQgPSBgJHtzcH0gXHUyMDE0IHNpZ2h0aW5nIHJhdGUgYnkgeWVhcmA7CiAgICAgICAgICAgIGNvbnN0IHllYXJzID0gWy4uLm5ldyBTZXQoYWxsRGF0YS5tYXAoZCA9PiBkLnllYXIpKV0uc29ydCgoYSxiKSA9PiBhLWIpLmZpbHRlcih5ID0+IHkgIT09IDE5OTYpOwogICAgICAgICAgICB0TGFiZWxzID0geWVhcnM7CiAgICAgICAgICAgIHRWYWx1ZXMgPSB5ZWFycy5tYXAoeSA9PiBzaWdodGluZ1JhdGUoYWxsRGF0YS5maWx0ZXIoZCA9PiBkLnllYXIgPT09IHkpLCBzcCkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhLXRyZW5kLXRpdGxlJykuaW5uZXJUZXh0ID0gYCR7c3B9IFx1MjAxNCAke3llYXJ9IHNpZ2h0aW5nIHJhdGUgYnkgbW9udGhgOwogICAgICAgICAgICBjb25zdCB5ZWFyRGF0YSA9IGFsbERhdGEuZmlsdGVyKGQgPT4gZC55ZWFyID09PSBwYXJzZUludCh5ZWFyKSk7CiAgICAgICAgICAgIHRMYWJlbHMgPSBNT05USFM7CiAgICAgICAgICAgIHRWYWx1ZXMgPSBNT05USFMubWFwKChfbW4sIGlkeCkgPT4gc2lnaHRpbmdSYXRlKHllYXJEYXRhLmZpbHRlcihkID0+IGQubW9udGggPT09IGlkeCArIDMpLCBzcCkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGFUcmVuZENoYXJ0KSBhVHJlbmRDaGFydC5kZXN0cm95KCk7CiAgICAgICAgYVRyZW5kQ2hhcnQgPSBuZXcgQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2EtdHJlbmQtY2hhcnQnKS5nZXRDb250ZXh0KCcyZCcpLCB7CiAgICAgICAgICAgIHR5cGU6ICdiYXInLAogICAgICAgICAgICBkYXRhOiB7IGxhYmVsczogdExhYmVscywgZGF0YXNldHM6IFt7IGxhYmVsOiBzcCwgZGF0YTogdFZhbHVlcywgYmFja2dyb3VuZENvbG9yOiBjb2xvcisnY2MnLCBib3JkZXJDb2xvcjogY29sb3IsIGJvcmRlcldpZHRoOiAxLCBib3JkZXJSYWRpdXM6IDQgfV0gfSwKICAgICAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAgICAgcmVzcG9uc2l2ZTogdHJ1ZSwKICAgICAgICAgICAgICAgIHBsdWdpbnM6IHsgbGVnZW5kOiB7IGRpc3BsYXk6IGZhbHNlIH0sIHRvb2x0aXA6IHsgY2FsbGJhY2tzOiB7IGxhYmVsOiBjdHggPT4gY3R4LnJhdyAhPT0gbnVsbCA\/IGAgJHtjdHgucmF3fSUgb2YgdHJpcHNgIDogJyBubyBkYXRhJyB9IH0gfSwKICAgICAgICAgICAgICAgIHNjYWxlczogeyB5OiB7IGJlZ2luQXRaZXJvOiB0cnVlLCBtYXg6IDEwMCwgdGlja3M6IHsgY2FsbGJhY2s6IHYgPT4gdiArICclJyB9IH0gfQogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIGxldCBzTGFiZWxzID0gW10sIHNSYXRlcyA9IFtdOwogICAgICAgIGlmIChtb250aCAhPT0gJ2FsbCcpIHsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Etc3VjY2Vzcy10aXRsZScpLmlubmVyVGV4dCA9IGAke01PTlRIU1tNT05USF9OVU1TLmluZGV4T2YobU51bSldfSBcdTIwMTQgSGlzdG9yaWNhbCBTdWNjZXNzIFJhdGVgOwogICAgICAgICAgICBjb25zdCB5ZWFycyA9IFsuLi5uZXcgU2V0KGFsbERhdGEubWFwKGQgPT4gZC55ZWFyKSldLnNvcnQoKGEsYikgPT4gYS1iKS5maWx0ZXIoeSA9PiB5ICE9PSAxOTk2KTsKICAgICAgICAgICAgc0xhYmVscyA9IHllYXJzOwogICAgICAgICAgICBzUmF0ZXMgID0geWVhcnMubWFwKHkgPT4gewogICAgICAgICAgICAgICAgY29uc3QgbURhdGEgPSBhbGxEYXRhLmZpbHRlcihkID0+IGQueWVhciA9PT0geSAmJiBkLm1vbnRoID09PSBtTnVtKTsKICAgICAgICAgICAgICAgIGNvbnN0IHJlbCAgID0gbURhdGEuZmlsdGVyKGQgPT4gZC5ib2F0cyA+PSAxIHx8IGQuX2hhc1NpZ2h0aW5nKTsKICAgICAgICAgICAgICAgIHJldHVybiByZWwubGVuZ3RoID4gMCA\/IHBhcnNlRmxvYXQoKHJlbC5maWx0ZXIociA9PiByLl9oYXNTaWdodGluZykubGVuZ3RoIC8gcmVsLmxlbmd0aCAqIDEwMCkudG9GaXhlZCgxKSkgOiBudWxsOwogICAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgaWYgKHllYXIgPT09ICdhbGwnKSB7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhLXN1Y2Nlc3MtdGl0bGUnKS5pbm5lclRleHQgPSAnU2lnaHRpbmcgU3VjY2VzcyBPdmVyIFllYXJzJzsKICAgICAgICAgICAgY29uc3QgeWVhcnMgPSBbLi4ubmV3IFNldChhbGxEYXRhLm1hcChkID0+IGQueWVhcikpXS5zb3J0KChhLGIpID0+IGEtYikuZmlsdGVyKHkgPT4geSAhPT0gMTk5Nik7CiAgICAgICAgICAgIHNMYWJlbHMgPSB5ZWFyczsKICAgICAgICAgICAgc1JhdGVzICA9IHllYXJzLm1hcCh5ID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlbCA9IGFsbERhdGEuZmlsdGVyKGQgPT4gZC55ZWFyID09PSB5ICYmIChkLmJvYXRzID49IDEgfHwgZC5faGFzU2lnaHRpbmcpKTsKICAgICAgICAgICAgICAgIHJldHVybiByZWwubGVuZ3RoID4gMCA\/IHBhcnNlRmxvYXQoKHJlbC5maWx0ZXIociA9PiByLl9oYXNTaWdodGluZykubGVuZ3RoIC8gcmVsLmxlbmd0aCAqIDEwMCkudG9GaXhlZCgxKSkgOiBudWxsOwogICAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYS1zdWNjZXNzLXRpdGxlJykuaW5uZXJUZXh0ID0gYE1vbnRobHkgU2lnaHRpbmcgU3VjY2VzcyAoJHt5ZWFyfSlgOwogICAgICAgICAgICBjb25zdCB5ZWFyRGF0YSA9IGFsbERhdGEuZmlsdGVyKGQgPT4gZC55ZWFyID09PSBwYXJzZUludCh5ZWFyKSk7CiAgICAgICAgICAgIHNMYWJlbHMgPSBNT05USFM7CiAgICAgICAgICAgIHNSYXRlcyAgPSBNT05USFMubWFwKChtLCBpZHgpID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlbCA9IHllYXJEYXRhLmZpbHRlcihkID0+IGQubW9udGggPT09IGlkeCArIDMgJiYgKGQuYm9hdHMgPj0gMSB8fCBkLl9oYXNTaWdodGluZykpOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlbC5sZW5ndGggPiAwID8gcGFyc2VGbG9hdCgocmVsLmZpbHRlcihyID0+IHIuX2hhc1NpZ2h0aW5nKS5sZW5ndGggLyByZWwubGVuZ3RoICogMTAwKS50b0ZpeGVkKDEpKSA6IG51bGw7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgaWYgKGFTdWNjZXNzQ2hhcnQpIGFTdWNjZXNzQ2hhcnQuZGVzdHJveSgpOwogICAgICAgIGFTdWNjZXNzQ2hhcnQgPSBuZXcgQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Etc3VjY2Vzcy1jaGFydCcpLmdldENvbnRleHQoJzJkJyksIHsKICAgICAgICAgICAgdHlwZTogJ2xpbmUnLAogICAgICAgICAgICBkYXRhOiB7IGxhYmVsczogc0xhYmVscywgZGF0YXNldHM6IFt7IGxhYmVsOiAnU3VjY2VzcyBSYXRlICglKScsIGRhdGE6IHNSYXRlcywgYm9yZGVyQ29sb3I6ICcjMTE1RUI5JywgYmFja2dyb3VuZENvbG9yOiAncmdiYSgxNyw5NCwxODUsMC4xKScsIGZpbGw6IHRydWUsIHRlbnNpb246IDAuMywgc3BhbkdhcHM6IHRydWUgfV0gfSwKICAgICAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAgICAgcmVzcG9uc2l2ZTogdHJ1ZSwKICAgICAgICAgICAgICAgIHNjYWxlczogeyB5OiB7IGJlZ2luQXRaZXJvOiBmYWxzZSwgc3VnZ2VzdGVkTWluOiBzUmF0ZXMubGVuZ3RoID4gMCA\/IE1hdGgubWF4KDAsIE1hdGgubWluKC4uLnNSYXRlcy5maWx0ZXIociA9PiByICE9PSBudWxsKSkgLSA1KSA6IDAgfSB9LAogICAgICAgICAgICAgICAgcGx1Z2luczogeyBsZWdlbmQ6IHsgZGlzcGxheTogZmFsc2UgfSB9CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiByZW5kZXJBbmFseXRpY3NMZWdlbmQoKSB7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2EtbGVnZW5kJykuaW5uZXJIVE1MID0gU1BFQ0lFUy5tYXAocyA9PgogICAgICAgICAgICBgPGRpdiBjbGFzcz0ic3BlY2llcy1sZWdlbmQtaXRlbSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtc3dhdGNoIiBzdHlsZT0iYmFja2dyb3VuZDoke3MuY29sb3J9Ij48L2Rpdj4KICAgICAgICAgICAgICAgIDxzcGFuPiR7cy5uYW1lfTwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+YAogICAgICAgICkuam9pbignJyk7CiAgICB9CiAgICB9IC8vIGVuZCBpbml0KCkKfSkoKTs=\";\n            var _s = document.createElement('script');\n            _s.textContent = atob(_b64);\n            document.body.appendChild(_s);\n        } catch (e) {\n            console.error('[Talassa] Bootstrap failed:', e);\n        }\n\n        \/\/ Tooltip for heatmap cells\n        (function () {\n            var tip = document.getElementById('t-tooltip');\n            if (!tip) return;\n            document.addEventListener('mousemove', function (e) {\n                var el = e.target.closest ? e.target.closest('[data-tip]') : null;\n                if (el && el.dataset.tip) {\n                    tip.textContent = el.dataset.tip;\n                    tip.style.display = 'block';\n                    var x = e.clientX, y = e.clientY;\n                    var tw = tip.offsetWidth;\n                    var vw = window.innerWidth;\n                    \/\/ Keep tooltip inside viewport\n                    var left = x - tw \/ 2;\n                    if (left < 8) left = 8;\n                    if (left + tw > vw - 8) left = vw - tw - 8;\n                    tip.style.left = left + 'px';\n                    tip.style.top = (y - tip.offsetHeight - 10) + 'px';\n                } else {\n                    tip.style.display = 'none';\n                }\n            });\n            document.addEventListener('mouseleave', function () { tip.style.display = 'none'; });\n            var loaderError = document.getElementById('loader-error');\n            loaderError.style.display = 'none';\n        })();\n    })();\n<\/script>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cetaceans of the Azores Around 90 species of cetaceans \u2014 whales, dolphins, and porpoises \u2014 inhabit our planet\u2019s seas, oceans, and even some rivers.In the Azores, 29 species have been officially recorded \u2014 an impressive number for such a small region in the middle of the Atlantic Ocean. Every Trip is Unique On average, our [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"parent":6214,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-9986","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/espacotalassa.com\/en\/wp-json\/wp\/v2\/pages\/9986","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/espacotalassa.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/espacotalassa.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/espacotalassa.com\/en\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/espacotalassa.com\/en\/wp-json\/wp\/v2\/comments?post=9986"}],"version-history":[{"count":39,"href":"https:\/\/espacotalassa.com\/en\/wp-json\/wp\/v2\/pages\/9986\/revisions"}],"predecessor-version":[{"id":10429,"href":"https:\/\/espacotalassa.com\/en\/wp-json\/wp\/v2\/pages\/9986\/revisions\/10429"}],"up":[{"embeddable":true,"href":"https:\/\/espacotalassa.com\/en\/wp-json\/wp\/v2\/pages\/6214"}],"wp:attachment":[{"href":"https:\/\/espacotalassa.com\/en\/wp-json\/wp\/v2\/media?parent=9986"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}