{"id":578,"date":"2026-04-24T13:36:18","date_gmt":"2026-04-24T11:36:18","guid":{"rendered":"http:\/\/192.168.2.11\/?page_id=578"},"modified":"2026-05-08T12:22:04","modified_gmt":"2026-05-08T10:22:04","slug":"bezpieczenstwo-mieszkancow","status":"publish","type":"page","link":"https:\/\/raport2025.powiat-zyrardowski.pl\/index.php\/bezpieczenstwo-mieszkancow\/","title":{"rendered":"Bezpiecze\u0144stwo mieszka\u0144c\u00f3w"},"content":{"rendered":"    <section class=\"animated-stats-section statistics-block-custom\" \n             style=\"background-color: #ffffff; \n                    \">\n        <div class=\"stats-container\">\n                        <div class=\"section-header\">\n                                    <h2 style=\"color: #1e3c72;\">Dzia\u0142alno\u015b\u0107 Jednostek Stra\u017cy Po\u017carnej w Powiecie \u017byrardowskim<\/h2>\n                                            <\/div>\n                        \n            <div class=\"stats-grid stats-grid-3\">\n                                    <div class=\"stat-box\" style=\"background-color: #f5f7fa;\">\n                        <h3 class=\"stat-title\" style=\"color: #1e3c72;\">Liczba akcji Ratowniczych<\/h3>\n                        <div class=\"stat-number-wrapper\">\n                            <span class=\"stat-number\" \n                                  data-target=\"1228\"\n                                  data-suffix=\"\"\n                                  data-separator=\"space\"\n                                  data-decimal-separator=\"comma\"\n                                  style=\"color: #1e3c72;\">0<\/span>\n                        <\/div>\n                        <p class=\"stat-description\" style=\"color: #666666;\"><\/p>\n                    <\/div>\n                                    <div class=\"stat-box\" style=\"background-color: #f5f7fa;\">\n                        <h3 class=\"stat-title\" style=\"color: #1e3c72;\">Liczba akcji Po\u017carnych<\/h3>\n                        <div class=\"stat-number-wrapper\">\n                            <span class=\"stat-number\" \n                                  data-target=\"449\"\n                                  data-suffix=\"\"\n                                  data-separator=\"space\"\n                                  data-decimal-separator=\"comma\"\n                                  style=\"color: #1e3c72;\">0<\/span>\n                        <\/div>\n                        <p class=\"stat-description\" style=\"color: #666666;\"><\/p>\n                    <\/div>\n                                    <div class=\"stat-box\" style=\"background-color: #f5f7fa;\">\n                        <h3 class=\"stat-title\" style=\"color: #1e3c72;\">Liczba akcji spowodowanych miejscowymi zagro\u017ceniami<\/h3>\n                        <div class=\"stat-number-wrapper\">\n                            <span class=\"stat-number\" \n                                  data-target=\"644\"\n                                  data-suffix=\"\"\n                                  data-separator=\"space\"\n                                  data-decimal-separator=\"comma\"\n                                  style=\"color: #1e3c72;\">0<\/span>\n                        <\/div>\n                        <p class=\"stat-description\" style=\"color: #666666;\"><\/p>\n                    <\/div>\n                            <\/div>\n        <\/div>\n    <\/section>\n    \n    <style>\n    \/* Statistics Block Styles - matches homepage layout *\/\n    .statistics-block-custom {\n        padding: 80px 20px;\n        position: relative;\n        overflow: hidden;\n    }\n    \n    .statistics-block-custom .stats-container {\n        max-width: 1400px;\n        margin: 0 auto;\n    }\n    \n    .statistics-block-custom .section-header {\n        text-align: center;\n        margin-bottom: 60px;\n    }\n    \n    .statistics-block-custom .section-header h2 {\n        font-size: 2.5rem;\n        color: #1e3c72;\n        margin-bottom: 15px;\n    }\n    \n    .statistics-block-custom .section-header p {\n        font-size: 1.2rem;\n        color: #666;\n    }\n    \n    .statistics-block-custom .stats-grid {\n        display: grid;\n        gap: 40px;\n        margin: 0 auto;\n    }\n    \n    \/* 2 blocks *\/\n    .statistics-block-custom .stats-grid-2 {\n        grid-template-columns: repeat(2, minmax(0, 1fr));\n        max-width: 900px;\n    }\n    \n    \/* 3 blocks *\/\n    .statistics-block-custom .stats-grid-3 {\n        grid-template-columns: repeat(3, minmax(0, 1fr));\n        max-width: 1200px;\n    }\n    \n    \/* 4 blocks *\/\n    .statistics-block-custom .stats-grid-4 {\n        grid-template-columns: repeat(4, minmax(0, 1fr));\n        max-width: 1400px;\n    }\n    \n    \/* 5 blocks *\/\n    .statistics-block-custom .stats-grid-5 {\n        grid-template-columns: repeat(5, minmax(0, 1fr));\n        max-width: 1400px;\n    }\n    \n    .statistics-block-custom .stat-box {\n        text-align: center;\n        padding: 40px 20px;\n        background: rgba(255, 255, 255, 0.95);\n        border-radius: 12px;\n        box-shadow: 0 4px 20px rgba(0,0,0,0.1);\n        transition: transform 0.3s ease, box-shadow 0.3s ease;\n        min-width: 0;\n        max-width: 100%;\n        overflow: hidden;\n    }\n    \n    .statistics-block-custom .stat-box:hover {\n        transform: translateY(-10px);\n        box-shadow: 0 8px 30px rgba(0,0,0,0.15);\n    }\n    \n    .statistics-block-custom .stat-title {\n        font-size: 1.3rem;\n        color: #1e3c72;\n        font-weight: 600;\n        margin-bottom: 20px;\n        text-transform: uppercase;\n        letter-spacing: 1px;\n        overflow: hidden;\n        max-width: 100%;\n        word-wrap: break-word;\n        overflow-wrap: break-word;\n    }\n    \n    .statistics-block-custom .stat-number-wrapper {\n        margin: 20px 0;\n        overflow: hidden;\n        max-width: 100%;\n    }\n    \n    .statistics-block-custom .stat-number {\n        font-size: 4rem;\n        font-weight: 700;\n        color: #2a5298;\n        display: inline-block;\n        line-height: 1;\n    }\n    \n    .statistics-block-custom .stat-description {\n        font-size: 1rem;\n        color: #666;\n        line-height: 1.6;\n        margin-top: 20px;\n    }\n    \n    \/* Responsive for statistics block *\/\n    @media (max-width: 1200px) {\n        .statistics-block-custom .stats-grid-4,\n        .statistics-block-custom .stats-grid-5 {\n            grid-template-columns: repeat(3, minmax(0, 1fr));\n        }\n    }\n    \n    @media (max-width: 968px) {\n        .statistics-block-custom .stats-grid-2,\n        .statistics-block-custom .stats-grid-3,\n        .statistics-block-custom .stats-grid-4,\n        .statistics-block-custom .stats-grid-5 {\n            grid-template-columns: repeat(2, minmax(0, 1fr));\n            gap: 30px;\n        }\n    }\n    \n    @media (max-width: 640px) {\n        .statistics-block-custom .stats-grid-2,\n        .statistics-block-custom .stats-grid-3,\n        .statistics-block-custom .stats-grid-4,\n        .statistics-block-custom .stats-grid-5 {\n            grid-template-columns: minmax(0, 1fr);\n        }\n        \n        .statistics-block-custom .stat-number {\n            font-size: 3rem;\n        }\n        \n        .statistics-block-custom .stat-title {\n            font-size: 1.1rem;\n        }\n        \n        .statistics-block-custom .section-header h2 {\n            font-size: 2rem;\n        }\n    }\n    <\/style>\n    \n        <script>\n    if (!window.statsAnimationLoaded) {\n        window.statsAnimationLoaded = true;\n        \n        \/\/ Calculate the best fitting font size for a number (without applying it)\n        \/\/ Returns the size that makes the number fit, or null if no scaling needed\n        function calculateBestFontSize(element) {\n            const statBox = element.closest('.stat-box');\n            if (!statBox) return null;\n            \n            \/\/ Reset to default size to measure naturally\n            element.style.fontSize = '';\n            element.style.whiteSpace = 'nowrap';\n            \n            \/\/ Force reflow\n            void element.offsetHeight;\n            \n            \/\/ Get available width from stat-box\n            const boxStyle = window.getComputedStyle(statBox);\n            const paddingLeft = parseFloat(boxStyle.paddingLeft) || 0;\n            const paddingRight = parseFloat(boxStyle.paddingRight) || 0;\n            const availableWidth = statBox.clientWidth - paddingLeft - paddingRight - 20;\n            \n            if (availableWidth <= 0) return null;\n            \n            \/\/ Current computed font size\n            const computedSize = parseFloat(window.getComputedStyle(element).fontSize);\n            \n            \/\/ Force reflow\n            void element.offsetHeight;\n            \n            \/\/ If fits at default size, return null (no scaling needed)\n            if (element.scrollWidth <= availableWidth) return null;\n            \n            \/\/ Binary search for best size\n            let minSize = 10;\n            let maxSize = computedSize;\n            let bestSize = minSize;\n            \n            while (maxSize - minSize > 0.5) {\n                const testSize = (minSize + maxSize) \/ 2;\n                element.style.fontSize = testSize + 'px';\n                void element.offsetHeight;\n                \n                if (element.scrollWidth <= availableWidth) {\n                    bestSize = testSize;\n                    minSize = testSize;\n                } else {\n                    maxSize = testSize;\n                }\n            }\n            \n            \/\/ Reset to default - we'll apply the synchronized size separately\n            element.style.fontSize = '';\n            void element.offsetHeight;\n            \n            return bestSize;\n        }\n        \n        \/\/ Fit all numbers in a module to the same (smallest needed) font size\n        function fitNumbersInModule(moduleSection) {\n            if (!moduleSection) return;\n            const numbers = moduleSection.querySelectorAll('.stat-number');\n            if (numbers.length === 0) return;\n            \n            \/\/ Calculate required size for each number\n            let smallestSize = null;\n            numbers.forEach(function(numEl) {\n                const size = calculateBestFontSize(numEl);\n                if (size !== null) {\n                    if (smallestSize === null || size < smallestSize) {\n                        smallestSize = size;\n                    }\n                }\n            });\n            \n            \/\/ Apply the smallest size to ALL numbers in this module (or reset if all fit)\n            numbers.forEach(function(numEl) {\n                if (smallestSize !== null) {\n                    numEl.style.fontSize = smallestSize + 'px';\n                } else {\n                    numEl.style.fontSize = '';\n                }\n            });\n        }\n        \n        \/\/ Backward compatible single-element fit function (operates on whole module)\n        function fitNumberToBox(element) {\n            const moduleSection = element.closest('.animated-stats-section');\n            if (moduleSection) {\n                fitNumbersInModule(moduleSection);\n            }\n        }\n        \n        function animateCounter(element, start, end, duration) {\n            const suffix = element.getAttribute('data-suffix') || '';\n            const separator = element.getAttribute('data-separator') || 'space';\n            const decimalSep = element.getAttribute('data-decimal-separator') || 'comma';\n            const decChar = (decimalSep === 'period') ? '.' : ',';\n            const hasDecimal = end.toString().includes('.');\n            const decimalPlaces = hasDecimal ? end.toString().split('.')[1].length : 0;\n            let startTime = null;\n            \n            function formatNumber(num, sep) {\n                const roundedNum = hasDecimal ? num.toFixed(decimalPlaces) : Math.floor(num);\n                const str = roundedNum.toString();\n                \n                \/\/ Rozdziel cz\u0119\u015b\u0107 ca\u0142kowit\u0105 i dziesi\u0119tn\u0105 (\u017ar\u00f3d\u0142o zawsze u\u017cywa kropki)\n                const parts = str.split('.');\n                const intPart = parts[0];\n                const decPart = parts[1] ? decChar + parts[1] : '';\n                \n                if (sep === 'none') {\n                    return intPart + decPart;\n                }\n                \n                \/\/ Wyb\u00f3r separatora tysi\u0119cy - musi by\u0107 r\u00f3\u017cny od separatora dziesi\u0119tnego\n                let thousandsChar = '';\n                if (sep === 'space') thousandsChar = ' ';\n                else if (sep === 'period') thousandsChar = (decChar === '.') ? ' ' : '.';\n                else if (sep === 'comma') thousandsChar = (decChar === ',') ? ' ' : ',';\n                \n                let formatted = '';\n                let count = 0;\n                \n                for (let i = intPart.length - 1; i >= 0; i--) {\n                    if (count === 3) {\n                        formatted = thousandsChar + formatted;\n                        count = 0;\n                    }\n                    formatted = intPart[i] + formatted;\n                    count++;\n                }\n                \n                return formatted + decPart;\n            }\n            \n            function easeOutCubic(t) {\n                return 1 - Math.pow(1 - t, 3);\n            }\n            \n            function animate(currentTime) {\n                if (!startTime) startTime = currentTime;\n                const elapsed = currentTime - startTime;\n                const progress = Math.min(elapsed \/ duration, 1);\n                const easedProgress = easeOutCubic(progress);\n                const current = start + (end - start) * easedProgress;\n                \n                const displayValue = formatNumber(current, separator);\n                element.textContent = displayValue + suffix;\n                \n                if (progress < 1) {\n                    requestAnimationFrame(animate);\n                } else {\n                    \/\/ Final value set - now fit it to the box\n                    fitNumberToBox(element);\n                }\n            }\n            \n            \/\/ Pre-set final value to measure, then start animation\n            element.textContent = formatNumber(end, separator) + suffix;\n            fitNumberToBox(element);\n            element.textContent = formatNumber(start, separator) + suffix;\n            \n            requestAnimationFrame(animate);\n        }\n        \n        function initStatsObserver() {\n            const observerOptions = {\n                threshold: 0.5,\n                rootMargin: '0px'\n            };\n            \n            const observer = new IntersectionObserver((entries) => {\n                entries.forEach(entry => {\n                    if (entry.isIntersecting) {\n                        const statBoxes = entry.target.querySelectorAll('.stat-box');\n                        statBoxes.forEach((box, index) => {\n                            setTimeout(() => {\n                                const numberElement = box.querySelector('.stat-number');\n                                if (numberElement) {\n                                    if (!numberElement.classList.contains(\"animated\")) {\n                                        const targetValue = parseFloat(numberElement.getAttribute('data-target'));\n                                        animateCounter(numberElement, 0, targetValue, 3000);\n                                        numberElement.classList.add('animated');\n                                    }\n                                }\n                            }, index * 200);\n                        });\n                        observer.unobserve(entry.target);\n                    }\n                });\n            }, observerOptions);\n            \n            const statsSections = document.querySelectorAll('.animated-stats-section .stats-grid');\n            statsSections.forEach(section => {\n                observer.observe(section);\n            });\n        }\n        \n        \/\/ Refit all stat numbers (used on resize) - per module so each scales together\n        function refitAllStatNumbers() {\n            const sections = document.querySelectorAll('.animated-stats-section');\n            sections.forEach(function(section) {\n                \/\/ Only refit if at least one number has been animated\n                if (section.querySelector('.stat-number.animated')) {\n                    fitNumbersInModule(section);\n                }\n            });\n        }\n        \n        \/\/ Handle resize events (debounced)\n        let statsResizeTimer;\n        window.addEventListener('resize', function() {\n            clearTimeout(statsResizeTimer);\n            statsResizeTimer = setTimeout(refitAllStatNumbers, 150);\n        });\n        \n        \/\/ Also refit after orientation change (mobile)\n        window.addEventListener('orientationchange', function() {\n            setTimeout(refitAllStatNumbers, 300);\n        });\n        \n        if (document.readyState === 'loading') {\n            document.addEventListener('DOMContentLoaded', initStatsObserver);\n        } else {\n            initStatsObserver();\n        }\n    }\n    <\/script>\n        \n    \n\n\n<p>W ramach swojej dzia\u0142alno\u015bci, Pa\u0144stwowa Stra\u017c Po\u017carna na terenie powiatu \u017cyrardowskiego w 2025 r. przeprowadzi\u0142a&nbsp;<strong>1 228 interwencji, w tym 449 po\u017car\u00f3w, 644 interwencji zwi\u0105zanych z miejscowymi zagro\u017ceniami oraz 135 alarm\u00f3w fa\u0142szywych.&nbsp;<\/strong><\/p>\n\n\n\n<h4 class=\"wp-block-heading has-text-color has-link-color wp-elements-4850b9e9e12a99065cad9826e994fd99\" style=\"color:#14357a\"><strong>Najwi\u0119ksze zagro\u017cenia wynikaj\u0105 z:<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>g\u0119sto\u015bci zaludnienia (czynnik ludzki jest statystycznie najcz\u0119\u015bciej przyczyn\u0105 po\u017car\u00f3w i miejscowych zagro\u017ce\u0144),<\/li>\n\n\n\n<li>nat\u0119\u017cenia ruchu pojazd\u00f3w na autostradzie A2, drodze ekspresowej S8, drodze krajowej nr 50 oraz drodze wojew\u00f3dzkiej nr 719,<\/li>\n\n\n\n<li>rodzaju zabudowy (zwarta zabudowa mo\u017ce mie\u0107 wp\u0142yw na rozmiary zdarze\u0144, ilo\u015b\u0107 poszkodowanych i ofiar oraz na pr\u0119dko\u015b\u0107 rozprzestrzeniania po\u017caru),<\/li>\n\n\n\n<li>lokalizacji zak\u0142ad\u00f3w przemys\u0142owych, wielkogabarytowych obiekt\u00f3w magazynowych oraz zak\u0142ad\u00f3w gospodarki odpadami (rodzaj prowadzonej dzia\u0142alno\u015bci niejednokrotnie z udzia\u0142em materia\u0142\u00f3w niebezpiecznych, mo\u017ce mie\u0107 wp\u0142yw na prawdopodobie\u0144stwo powstania po\u017caru lub awarii przemys\u0142owej).<\/li>\n<\/ul>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>W 2025 r. funkcjonariusze KP PSP \u017byrard\u00f3w przeprowadzili na terenie powiatu \u017cyrardowskiego&nbsp;<strong>39<\/strong> <strong>kontroli obiekt\u00f3w<\/strong>, w tym <strong>19 to odbiory nowych budynk\u00f3w. W 15 przypadkach stwierdzono w obiektach nieprawid\u0142owo\u015bci.<\/strong><\/p>\n\n\n\n<p>W 2025 r. prowadzony by\u0142 projekt zwi\u0119kszania odporno\u015bci spo\u0142ecznej poprzez monta\u017c czujek dymu i tlenku w\u0119gla w domach i mieszkaniach w ca\u0142ej Polsce przez podmioty ochrony ludno\u015bci. Projekt obejmowa\u0142 r\u00f3wnie\u017c dzia\u0142ania edukacyjne.<\/p>\n\n\n    <section class=\"animated-stats-section statistics-block-custom\" \n             style=\"background-color: #ffffff; \n                    \">\n        <div class=\"stats-container\">\n                        <div class=\"section-header\">\n                                    <h2 style=\"color: #1e3c72;\">W Powiecie \u017byrardowskim wydano<\/h2>\n                                            <\/div>\n                        \n            <div class=\"stats-grid stats-grid-2\">\n                                    <div class=\"stat-box\" style=\"background-color: #f5f7fa;\">\n                        <h3 class=\"stat-title\" style=\"color: #1e3c72;\">czujek dymu<\/h3>\n                        <div class=\"stat-number-wrapper\">\n                            <span class=\"stat-number\" \n                                  data-target=\"211\"\n                                  data-suffix=\"\"\n                                  data-separator=\"space\"\n                                  data-decimal-separator=\"comma\"\n                                  style=\"color: #1e3c72;\">0<\/span>\n                        <\/div>\n                        <p class=\"stat-description\" style=\"color: #666666;\"><\/p>\n                    <\/div>\n                                    <div class=\"stat-box\" style=\"background-color: #f5f7fa;\">\n                        <h3 class=\"stat-title\" style=\"color: #1e3c72;\">czujek tlenku w\u0119gla<\/h3>\n                        <div class=\"stat-number-wrapper\">\n                            <span class=\"stat-number\" \n                                  data-target=\"177\"\n                                  data-suffix=\"\"\n                                  data-separator=\"space\"\n                                  data-decimal-separator=\"comma\"\n                                  style=\"color: #1e3c72;\">0<\/span>\n                        <\/div>\n                        <p class=\"stat-description\" style=\"color: #666666;\"><\/p>\n                    <\/div>\n                            <\/div>\n        <\/div>\n    <\/section>\n    \n    <style>\n    \/* Statistics Block Styles - matches homepage layout *\/\n    .statistics-block-custom {\n        padding: 80px 20px;\n        position: relative;\n        overflow: hidden;\n    }\n    \n    .statistics-block-custom .stats-container {\n        max-width: 1400px;\n        margin: 0 auto;\n    }\n    \n    .statistics-block-custom .section-header {\n        text-align: center;\n        margin-bottom: 60px;\n    }\n    \n    .statistics-block-custom .section-header h2 {\n        font-size: 2.5rem;\n        color: #1e3c72;\n        margin-bottom: 15px;\n    }\n    \n    .statistics-block-custom .section-header p {\n        font-size: 1.2rem;\n        color: #666;\n    }\n    \n    .statistics-block-custom .stats-grid {\n        display: grid;\n        gap: 40px;\n        margin: 0 auto;\n    }\n    \n    \/* 2 blocks *\/\n    .statistics-block-custom .stats-grid-2 {\n        grid-template-columns: repeat(2, minmax(0, 1fr));\n        max-width: 900px;\n    }\n    \n    \/* 3 blocks *\/\n    .statistics-block-custom .stats-grid-3 {\n        grid-template-columns: repeat(3, minmax(0, 1fr));\n        max-width: 1200px;\n    }\n    \n    \/* 4 blocks *\/\n    .statistics-block-custom .stats-grid-4 {\n        grid-template-columns: repeat(4, minmax(0, 1fr));\n        max-width: 1400px;\n    }\n    \n    \/* 5 blocks *\/\n    .statistics-block-custom .stats-grid-5 {\n        grid-template-columns: repeat(5, minmax(0, 1fr));\n        max-width: 1400px;\n    }\n    \n    .statistics-block-custom .stat-box {\n        text-align: center;\n        padding: 40px 20px;\n        background: rgba(255, 255, 255, 0.95);\n        border-radius: 12px;\n        box-shadow: 0 4px 20px rgba(0,0,0,0.1);\n        transition: transform 0.3s ease, box-shadow 0.3s ease;\n        min-width: 0;\n        max-width: 100%;\n        overflow: hidden;\n    }\n    \n    .statistics-block-custom .stat-box:hover {\n        transform: translateY(-10px);\n        box-shadow: 0 8px 30px rgba(0,0,0,0.15);\n    }\n    \n    .statistics-block-custom .stat-title {\n        font-size: 1.3rem;\n        color: #1e3c72;\n        font-weight: 600;\n        margin-bottom: 20px;\n        text-transform: uppercase;\n        letter-spacing: 1px;\n        overflow: hidden;\n        max-width: 100%;\n        word-wrap: break-word;\n        overflow-wrap: break-word;\n    }\n    \n    .statistics-block-custom .stat-number-wrapper {\n        margin: 20px 0;\n        overflow: hidden;\n        max-width: 100%;\n    }\n    \n    .statistics-block-custom .stat-number {\n        font-size: 4rem;\n        font-weight: 700;\n        color: #2a5298;\n        display: inline-block;\n        line-height: 1;\n    }\n    \n    .statistics-block-custom .stat-description {\n        font-size: 1rem;\n        color: #666;\n        line-height: 1.6;\n        margin-top: 20px;\n    }\n    \n    \/* Responsive for statistics block *\/\n    @media (max-width: 1200px) {\n        .statistics-block-custom .stats-grid-4,\n        .statistics-block-custom .stats-grid-5 {\n            grid-template-columns: repeat(3, minmax(0, 1fr));\n        }\n    }\n    \n    @media (max-width: 968px) {\n        .statistics-block-custom .stats-grid-2,\n        .statistics-block-custom .stats-grid-3,\n        .statistics-block-custom .stats-grid-4,\n        .statistics-block-custom .stats-grid-5 {\n            grid-template-columns: repeat(2, minmax(0, 1fr));\n            gap: 30px;\n        }\n    }\n    \n    @media (max-width: 640px) {\n        .statistics-block-custom .stats-grid-2,\n        .statistics-block-custom .stats-grid-3,\n        .statistics-block-custom .stats-grid-4,\n        .statistics-block-custom .stats-grid-5 {\n            grid-template-columns: minmax(0, 1fr);\n        }\n        \n        .statistics-block-custom .stat-number {\n            font-size: 3rem;\n        }\n        \n        .statistics-block-custom .stat-title {\n            font-size: 1.1rem;\n        }\n        \n        .statistics-block-custom .section-header h2 {\n            font-size: 2rem;\n        }\n    }\n    <\/style>\n    \n        <script>\n    if (!window.statsAnimationLoaded) {\n        window.statsAnimationLoaded = true;\n        \n        \/\/ Calculate the best fitting font size for a number (without applying it)\n        \/\/ Returns the size that makes the number fit, or null if no scaling needed\n        function calculateBestFontSize(element) {\n            const statBox = element.closest('.stat-box');\n            if (!statBox) return null;\n            \n            \/\/ Reset to default size to measure naturally\n            element.style.fontSize = '';\n            element.style.whiteSpace = 'nowrap';\n            \n            \/\/ Force reflow\n            void element.offsetHeight;\n            \n            \/\/ Get available width from stat-box\n            const boxStyle = window.getComputedStyle(statBox);\n            const paddingLeft = parseFloat(boxStyle.paddingLeft) || 0;\n            const paddingRight = parseFloat(boxStyle.paddingRight) || 0;\n            const availableWidth = statBox.clientWidth - paddingLeft - paddingRight - 20;\n            \n            if (availableWidth <= 0) return null;\n            \n            \/\/ Current computed font size\n            const computedSize = parseFloat(window.getComputedStyle(element).fontSize);\n            \n            \/\/ Force reflow\n            void element.offsetHeight;\n            \n            \/\/ If fits at default size, return null (no scaling needed)\n            if (element.scrollWidth <= availableWidth) return null;\n            \n            \/\/ Binary search for best size\n            let minSize = 10;\n            let maxSize = computedSize;\n            let bestSize = minSize;\n            \n            while (maxSize - minSize > 0.5) {\n                const testSize = (minSize + maxSize) \/ 2;\n                element.style.fontSize = testSize + 'px';\n                void element.offsetHeight;\n                \n                if (element.scrollWidth <= availableWidth) {\n                    bestSize = testSize;\n                    minSize = testSize;\n                } else {\n                    maxSize = testSize;\n                }\n            }\n            \n            \/\/ Reset to default - we'll apply the synchronized size separately\n            element.style.fontSize = '';\n            void element.offsetHeight;\n            \n            return bestSize;\n        }\n        \n        \/\/ Fit all numbers in a module to the same (smallest needed) font size\n        function fitNumbersInModule(moduleSection) {\n            if (!moduleSection) return;\n            const numbers = moduleSection.querySelectorAll('.stat-number');\n            if (numbers.length === 0) return;\n            \n            \/\/ Calculate required size for each number\n            let smallestSize = null;\n            numbers.forEach(function(numEl) {\n                const size = calculateBestFontSize(numEl);\n                if (size !== null) {\n                    if (smallestSize === null || size < smallestSize) {\n                        smallestSize = size;\n                    }\n                }\n            });\n            \n            \/\/ Apply the smallest size to ALL numbers in this module (or reset if all fit)\n            numbers.forEach(function(numEl) {\n                if (smallestSize !== null) {\n                    numEl.style.fontSize = smallestSize + 'px';\n                } else {\n                    numEl.style.fontSize = '';\n                }\n            });\n        }\n        \n        \/\/ Backward compatible single-element fit function (operates on whole module)\n        function fitNumberToBox(element) {\n            const moduleSection = element.closest('.animated-stats-section');\n            if (moduleSection) {\n                fitNumbersInModule(moduleSection);\n            }\n        }\n        \n        function animateCounter(element, start, end, duration) {\n            const suffix = element.getAttribute('data-suffix') || '';\n            const separator = element.getAttribute('data-separator') || 'space';\n            const decimalSep = element.getAttribute('data-decimal-separator') || 'comma';\n            const decChar = (decimalSep === 'period') ? '.' : ',';\n            const hasDecimal = end.toString().includes('.');\n            const decimalPlaces = hasDecimal ? end.toString().split('.')[1].length : 0;\n            let startTime = null;\n            \n            function formatNumber(num, sep) {\n                const roundedNum = hasDecimal ? num.toFixed(decimalPlaces) : Math.floor(num);\n                const str = roundedNum.toString();\n                \n                \/\/ Rozdziel cz\u0119\u015b\u0107 ca\u0142kowit\u0105 i dziesi\u0119tn\u0105 (\u017ar\u00f3d\u0142o zawsze u\u017cywa kropki)\n                const parts = str.split('.');\n                const intPart = parts[0];\n                const decPart = parts[1] ? decChar + parts[1] : '';\n                \n                if (sep === 'none') {\n                    return intPart + decPart;\n                }\n                \n                \/\/ Wyb\u00f3r separatora tysi\u0119cy - musi by\u0107 r\u00f3\u017cny od separatora dziesi\u0119tnego\n                let thousandsChar = '';\n                if (sep === 'space') thousandsChar = ' ';\n                else if (sep === 'period') thousandsChar = (decChar === '.') ? ' ' : '.';\n                else if (sep === 'comma') thousandsChar = (decChar === ',') ? ' ' : ',';\n                \n                let formatted = '';\n                let count = 0;\n                \n                for (let i = intPart.length - 1; i >= 0; i--) {\n                    if (count === 3) {\n                        formatted = thousandsChar + formatted;\n                        count = 0;\n                    }\n                    formatted = intPart[i] + formatted;\n                    count++;\n                }\n                \n                return formatted + decPart;\n            }\n            \n            function easeOutCubic(t) {\n                return 1 - Math.pow(1 - t, 3);\n            }\n            \n            function animate(currentTime) {\n                if (!startTime) startTime = currentTime;\n                const elapsed = currentTime - startTime;\n                const progress = Math.min(elapsed \/ duration, 1);\n                const easedProgress = easeOutCubic(progress);\n                const current = start + (end - start) * easedProgress;\n                \n                const displayValue = formatNumber(current, separator);\n                element.textContent = displayValue + suffix;\n                \n                if (progress < 1) {\n                    requestAnimationFrame(animate);\n                } else {\n                    \/\/ Final value set - now fit it to the box\n                    fitNumberToBox(element);\n                }\n            }\n            \n            \/\/ Pre-set final value to measure, then start animation\n            element.textContent = formatNumber(end, separator) + suffix;\n            fitNumberToBox(element);\n            element.textContent = formatNumber(start, separator) + suffix;\n            \n            requestAnimationFrame(animate);\n        }\n        \n        function initStatsObserver() {\n            const observerOptions = {\n                threshold: 0.5,\n                rootMargin: '0px'\n            };\n            \n            const observer = new IntersectionObserver((entries) => {\n                entries.forEach(entry => {\n                    if (entry.isIntersecting) {\n                        const statBoxes = entry.target.querySelectorAll('.stat-box');\n                        statBoxes.forEach((box, index) => {\n                            setTimeout(() => {\n                                const numberElement = box.querySelector('.stat-number');\n                                if (numberElement) {\n                                    if (!numberElement.classList.contains(\"animated\")) {\n                                        const targetValue = parseFloat(numberElement.getAttribute('data-target'));\n                                        animateCounter(numberElement, 0, targetValue, 3000);\n                                        numberElement.classList.add('animated');\n                                    }\n                                }\n                            }, index * 200);\n                        });\n                        observer.unobserve(entry.target);\n                    }\n                });\n            }, observerOptions);\n            \n            const statsSections = document.querySelectorAll('.animated-stats-section .stats-grid');\n            statsSections.forEach(section => {\n                observer.observe(section);\n            });\n        }\n        \n        \/\/ Refit all stat numbers (used on resize) - per module so each scales together\n        function refitAllStatNumbers() {\n            const sections = document.querySelectorAll('.animated-stats-section');\n            sections.forEach(function(section) {\n                \/\/ Only refit if at least one number has been animated\n                if (section.querySelector('.stat-number.animated')) {\n                    fitNumbersInModule(section);\n                }\n            });\n        }\n        \n        \/\/ Handle resize events (debounced)\n        let statsResizeTimer;\n        window.addEventListener('resize', function() {\n            clearTimeout(statsResizeTimer);\n            statsResizeTimer = setTimeout(refitAllStatNumbers, 150);\n        });\n        \n        \/\/ Also refit after orientation change (mobile)\n        window.addEventListener('orientationchange', function() {\n            setTimeout(refitAllStatNumbers, 300);\n        });\n        \n        if (document.readyState === 'loading') {\n            document.addEventListener('DOMContentLoaded', initStatsObserver);\n        } else {\n            initStatsObserver();\n        }\n    }\n    <\/script>\n        \n    \n\n\n<h4 class=\"wp-block-heading has-text-color has-link-color wp-elements-e381e5ff51ce2ace15911a81d94664e3\" style=\"color:#14357a\"><strong>Dzia\u0142alno\u015b\u0107 prewencyjna i edukacyjna<\/strong><\/h4>\n\n\n\n<p>Prewencja spo\u0142eczna to jeden z filar\u00f3w dzia\u0142alno\u015bci ka\u017cdej komendy Powiatowej Pa\u0144stwowej Stra\u017cy Po\u017carnej obok dzia\u0142a\u0144 operacyjnych, takich jak gaszenie po\u017car\u00f3w i usuwanie innych zagro\u017ce\u0144 oraz sprawowania nadzoru nad zapewnieniem bezpiecze\u0144stwa po\u017carowego budynk\u00f3w i teren\u00f3w. Prewencja Spo\u0142eczna Pa\u0144stwowej Stra\u017cy Po\u017carnej to te\u017c szereg dzia\u0142a\u0144 edukacyjnych, informacyjnych i promocyjnych skierowanych do wszystkich grup spo\u0142ecznych,<\/p>\n\n\n\n<p>uczni\u00f3w szk\u00f3\u0142, pracownik\u00f3w firm a tak\u017ce senior\u00f3w i os\u00f3b z niepe\u0142nosprawno\u015bciami. Komenda Powiatowa Pa\u0144stwowej Stra\u017cy Po\u017carnej w \u017byrardowie bierze udzia\u0142 w programach edukacyjnych, kampaniach spo\u0142ecznych oraz spotkaniach z mieszka\u0144cami takich jak \u201eCzujka na stra\u017cy Twojego bezpiecze\u0144stwa\u201d dotycz\u0105ca zagro\u017ce\u0144 zwi\u0105zanych z ogrzewaniem budynk\u00f3w, b\u0105d\u017a kampania \u201eStop Po\u017carom Traw&#8221;, kt\u00f3rej celem jest zwalczanie procederu wypalania traw i nieu\u017cytk\u00f3w rolnych oraz u\u015bwiadamianie spo\u0142ecze\u0144stwa o konsekwencjach takich dzia\u0142a\u0144.&nbsp;<\/p>\n\n\n\n<h4 class=\"wp-block-heading has-text-color has-link-color wp-elements-0a5f7989a616c185a8067534807acd1e\" style=\"color:#14357a\"><strong>W 2025 roku odby\u0142o si\u0119 75 spotka\u0144 w ramach prewencji spo\u0142ecznej w tym:<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>12 spotka\u0144 w Komendzie PSP w \u017byrardowie,<\/li>\n\n\n\n<li>31 spotka\u0144 w szko\u0142ach,<\/li>\n\n\n\n<li>4 spotkania w o\u015brodkach kultury,<\/li>\n\n\n\n<li>5 spotka\u0144 podczas piknik\u00f3w,<\/li>\n\n\n\n<li>1 spotkanie na obiekcie sportowym,<\/li>\n\n\n\n<li>22 spotkania w innych miejscach (firmy, instytucje publiczne).<\/li>\n<\/ul>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h4 class=\"wp-block-heading has-text-color has-link-color wp-elements-a8de966eed57ea3b12420121715e51fa\" style=\"color:#14357a\"><strong>W poszczeg\u00f3lnych blokach tematycznych udzia\u0142 wzi\u0119\u0142o:<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Bezpieczna droga \u2013 845 uczestnik\u00f3w,<\/li>\n\n\n\n<li>Bezpieczna zima \u2013 1200 uczestnik\u00f3w,<\/li>\n\n\n\n<li>Ewakuacja \u2013 6256 uczestnik\u00f3w,<\/li>\n\n\n\n<li>Numer alarmowy 112 \u2013 880 uczestnik\u00f3w,<\/li>\n\n\n\n<li>Bezpieczne lato \u2013 70 uczestnik\u00f3w,<\/li>\n\n\n\n<li>Bezpieczny dom \u2013 80 uczestnik\u00f3w,<\/li>\n\n\n\n<li>Pierwsza pomoc \u2013 505 uczestnik\u00f3w,<\/li>\n\n\n\n<li>Zaw\u00f3d stra\u017caka \u2013 180 uczestnik\u00f3w,<\/li>\n\n\n\n<li>inne \u2013 130 uczestnik\u00f3w.<\/li>\n<\/ul>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>W ramach prewencji spo\u0142ecznej by\u0142y prowadzone r\u00f3wnie\u017c liczne \u0107wiczenia oraz szkolenia dla druh\u00f3w Ochotniczych Stra\u017cy Po\u017carnych z terenu powiatu \u017cyrardowskiego nie wymienione powy\u017cej. Kilka razy w roku nasi funkcjonariusze bior\u0105 udzia\u0142 r\u00f3wnie\u017c w audycjach radiowych, gdzie popularyzuj\u0105 zasady bezpiecze\u0144stwa przeciwpo\u017carowego.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n    <section class=\"animated-stats-section statistics-block-custom\" \n             style=\"background-color: #ffffff; \n                    \">\n        <div class=\"stats-container\">\n                        <div class=\"section-header\">\n                                    <h2 style=\"color: #1e3c72;\">Komenda Powiatowa Policji w \u017byrardowie<\/h2>\n                                            <\/div>\n                        \n            <div class=\"stats-grid stats-grid-3\">\n                                    <div class=\"stat-box\" style=\"background-color: #f5f7fa;\">\n                        <h3 class=\"stat-title\" style=\"color: #1e3c72;\">Liczba przyj\u0119tych zg\u0142osze\u0144<\/h3>\n                        <div class=\"stat-number-wrapper\">\n                            <span class=\"stat-number\" \n                                  data-target=\"825\"\n                                  data-suffix=\"\"\n                                  data-separator=\"space\"\n                                  data-decimal-separator=\"comma\"\n                                  style=\"color: #1e3c72;\">0<\/span>\n                        <\/div>\n                        <p class=\"stat-description\" style=\"color: #666666;\">przez krajow\u0105 map\u0119 Zagro\u017ce\u0144 bezpiecze\u0144stwa<\/p>\n                    <\/div>\n                                    <div class=\"stat-box\" style=\"background-color: #f5f7fa;\">\n                        <h3 class=\"stat-title\" style=\"color: #1e3c72;\">Liczba post\u0119powa\u0144 w sprawach o wykroczenia<\/h3>\n                        <div class=\"stat-number-wrapper\">\n                            <span class=\"stat-number\" \n                                  data-target=\"3346\"\n                                  data-suffix=\"\"\n                                  data-separator=\"space\"\n                                  data-decimal-separator=\"comma\"\n                                  style=\"color: #1e3c72;\">0<\/span>\n                        <\/div>\n                        <p class=\"stat-description\" style=\"color: #666666;\"><\/p>\n                    <\/div>\n                                    <div class=\"stat-box\" style=\"background-color: #f5f7fa;\">\n                        <h3 class=\"stat-title\" style=\"color: #1e3c72;\">Liczba przeprowadzonych interwencji<\/h3>\n                        <div class=\"stat-number-wrapper\">\n                            <span class=\"stat-number\" \n                                  data-target=\"8778\"\n                                  data-suffix=\"\"\n                                  data-separator=\"space\"\n                                  data-decimal-separator=\"comma\"\n                                  style=\"color: #1e3c72;\">0<\/span>\n                        <\/div>\n                        <p class=\"stat-description\" style=\"color: #666666;\"><\/p>\n                    <\/div>\n                            <\/div>\n        <\/div>\n    <\/section>\n    \n    <style>\n    \/* Statistics Block Styles - matches homepage layout *\/\n    .statistics-block-custom {\n        padding: 80px 20px;\n        position: relative;\n        overflow: hidden;\n    }\n    \n    .statistics-block-custom .stats-container {\n        max-width: 1400px;\n        margin: 0 auto;\n    }\n    \n    .statistics-block-custom .section-header {\n        text-align: center;\n        margin-bottom: 60px;\n    }\n    \n    .statistics-block-custom .section-header h2 {\n        font-size: 2.5rem;\n        color: #1e3c72;\n        margin-bottom: 15px;\n    }\n    \n    .statistics-block-custom .section-header p {\n        font-size: 1.2rem;\n        color: #666;\n    }\n    \n    .statistics-block-custom .stats-grid {\n        display: grid;\n        gap: 40px;\n        margin: 0 auto;\n    }\n    \n    \/* 2 blocks *\/\n    .statistics-block-custom .stats-grid-2 {\n        grid-template-columns: repeat(2, minmax(0, 1fr));\n        max-width: 900px;\n    }\n    \n    \/* 3 blocks *\/\n    .statistics-block-custom .stats-grid-3 {\n        grid-template-columns: repeat(3, minmax(0, 1fr));\n        max-width: 1200px;\n    }\n    \n    \/* 4 blocks *\/\n    .statistics-block-custom .stats-grid-4 {\n        grid-template-columns: repeat(4, minmax(0, 1fr));\n        max-width: 1400px;\n    }\n    \n    \/* 5 blocks *\/\n    .statistics-block-custom .stats-grid-5 {\n        grid-template-columns: repeat(5, minmax(0, 1fr));\n        max-width: 1400px;\n    }\n    \n    .statistics-block-custom .stat-box {\n        text-align: center;\n        padding: 40px 20px;\n        background: rgba(255, 255, 255, 0.95);\n        border-radius: 12px;\n        box-shadow: 0 4px 20px rgba(0,0,0,0.1);\n        transition: transform 0.3s ease, box-shadow 0.3s ease;\n        min-width: 0;\n        max-width: 100%;\n        overflow: hidden;\n    }\n    \n    .statistics-block-custom .stat-box:hover {\n        transform: translateY(-10px);\n        box-shadow: 0 8px 30px rgba(0,0,0,0.15);\n    }\n    \n    .statistics-block-custom .stat-title {\n        font-size: 1.3rem;\n        color: #1e3c72;\n        font-weight: 600;\n        margin-bottom: 20px;\n        text-transform: uppercase;\n        letter-spacing: 1px;\n        overflow: hidden;\n        max-width: 100%;\n        word-wrap: break-word;\n        overflow-wrap: break-word;\n    }\n    \n    .statistics-block-custom .stat-number-wrapper {\n        margin: 20px 0;\n        overflow: hidden;\n        max-width: 100%;\n    }\n    \n    .statistics-block-custom .stat-number {\n        font-size: 4rem;\n        font-weight: 700;\n        color: #2a5298;\n        display: inline-block;\n        line-height: 1;\n    }\n    \n    .statistics-block-custom .stat-description {\n        font-size: 1rem;\n        color: #666;\n        line-height: 1.6;\n        margin-top: 20px;\n    }\n    \n    \/* Responsive for statistics block *\/\n    @media (max-width: 1200px) {\n        .statistics-block-custom .stats-grid-4,\n        .statistics-block-custom .stats-grid-5 {\n            grid-template-columns: repeat(3, minmax(0, 1fr));\n        }\n    }\n    \n    @media (max-width: 968px) {\n        .statistics-block-custom .stats-grid-2,\n        .statistics-block-custom .stats-grid-3,\n        .statistics-block-custom .stats-grid-4,\n        .statistics-block-custom .stats-grid-5 {\n            grid-template-columns: repeat(2, minmax(0, 1fr));\n            gap: 30px;\n        }\n    }\n    \n    @media (max-width: 640px) {\n        .statistics-block-custom .stats-grid-2,\n        .statistics-block-custom .stats-grid-3,\n        .statistics-block-custom .stats-grid-4,\n        .statistics-block-custom .stats-grid-5 {\n            grid-template-columns: minmax(0, 1fr);\n        }\n        \n        .statistics-block-custom .stat-number {\n            font-size: 3rem;\n        }\n        \n        .statistics-block-custom .stat-title {\n            font-size: 1.1rem;\n        }\n        \n        .statistics-block-custom .section-header h2 {\n            font-size: 2rem;\n        }\n    }\n    <\/style>\n    \n        <script>\n    if (!window.statsAnimationLoaded) {\n        window.statsAnimationLoaded = true;\n        \n        \/\/ Calculate the best fitting font size for a number (without applying it)\n        \/\/ Returns the size that makes the number fit, or null if no scaling needed\n        function calculateBestFontSize(element) {\n            const statBox = element.closest('.stat-box');\n            if (!statBox) return null;\n            \n            \/\/ Reset to default size to measure naturally\n            element.style.fontSize = '';\n            element.style.whiteSpace = 'nowrap';\n            \n            \/\/ Force reflow\n            void element.offsetHeight;\n            \n            \/\/ Get available width from stat-box\n            const boxStyle = window.getComputedStyle(statBox);\n            const paddingLeft = parseFloat(boxStyle.paddingLeft) || 0;\n            const paddingRight = parseFloat(boxStyle.paddingRight) || 0;\n            const availableWidth = statBox.clientWidth - paddingLeft - paddingRight - 20;\n            \n            if (availableWidth <= 0) return null;\n            \n            \/\/ Current computed font size\n            const computedSize = parseFloat(window.getComputedStyle(element).fontSize);\n            \n            \/\/ Force reflow\n            void element.offsetHeight;\n            \n            \/\/ If fits at default size, return null (no scaling needed)\n            if (element.scrollWidth <= availableWidth) return null;\n            \n            \/\/ Binary search for best size\n            let minSize = 10;\n            let maxSize = computedSize;\n            let bestSize = minSize;\n            \n            while (maxSize - minSize > 0.5) {\n                const testSize = (minSize + maxSize) \/ 2;\n                element.style.fontSize = testSize + 'px';\n                void element.offsetHeight;\n                \n                if (element.scrollWidth <= availableWidth) {\n                    bestSize = testSize;\n                    minSize = testSize;\n                } else {\n                    maxSize = testSize;\n                }\n            }\n            \n            \/\/ Reset to default - we'll apply the synchronized size separately\n            element.style.fontSize = '';\n            void element.offsetHeight;\n            \n            return bestSize;\n        }\n        \n        \/\/ Fit all numbers in a module to the same (smallest needed) font size\n        function fitNumbersInModule(moduleSection) {\n            if (!moduleSection) return;\n            const numbers = moduleSection.querySelectorAll('.stat-number');\n            if (numbers.length === 0) return;\n            \n            \/\/ Calculate required size for each number\n            let smallestSize = null;\n            numbers.forEach(function(numEl) {\n                const size = calculateBestFontSize(numEl);\n                if (size !== null) {\n                    if (smallestSize === null || size < smallestSize) {\n                        smallestSize = size;\n                    }\n                }\n            });\n            \n            \/\/ Apply the smallest size to ALL numbers in this module (or reset if all fit)\n            numbers.forEach(function(numEl) {\n                if (smallestSize !== null) {\n                    numEl.style.fontSize = smallestSize + 'px';\n                } else {\n                    numEl.style.fontSize = '';\n                }\n            });\n        }\n        \n        \/\/ Backward compatible single-element fit function (operates on whole module)\n        function fitNumberToBox(element) {\n            const moduleSection = element.closest('.animated-stats-section');\n            if (moduleSection) {\n                fitNumbersInModule(moduleSection);\n            }\n        }\n        \n        function animateCounter(element, start, end, duration) {\n            const suffix = element.getAttribute('data-suffix') || '';\n            const separator = element.getAttribute('data-separator') || 'space';\n            const decimalSep = element.getAttribute('data-decimal-separator') || 'comma';\n            const decChar = (decimalSep === 'period') ? '.' : ',';\n            const hasDecimal = end.toString().includes('.');\n            const decimalPlaces = hasDecimal ? end.toString().split('.')[1].length : 0;\n            let startTime = null;\n            \n            function formatNumber(num, sep) {\n                const roundedNum = hasDecimal ? num.toFixed(decimalPlaces) : Math.floor(num);\n                const str = roundedNum.toString();\n                \n                \/\/ Rozdziel cz\u0119\u015b\u0107 ca\u0142kowit\u0105 i dziesi\u0119tn\u0105 (\u017ar\u00f3d\u0142o zawsze u\u017cywa kropki)\n                const parts = str.split('.');\n                const intPart = parts[0];\n                const decPart = parts[1] ? decChar + parts[1] : '';\n                \n                if (sep === 'none') {\n                    return intPart + decPart;\n                }\n                \n                \/\/ Wyb\u00f3r separatora tysi\u0119cy - musi by\u0107 r\u00f3\u017cny od separatora dziesi\u0119tnego\n                let thousandsChar = '';\n                if (sep === 'space') thousandsChar = ' ';\n                else if (sep === 'period') thousandsChar = (decChar === '.') ? ' ' : '.';\n                else if (sep === 'comma') thousandsChar = (decChar === ',') ? ' ' : ',';\n                \n                let formatted = '';\n                let count = 0;\n                \n                for (let i = intPart.length - 1; i >= 0; i--) {\n                    if (count === 3) {\n                        formatted = thousandsChar + formatted;\n                        count = 0;\n                    }\n                    formatted = intPart[i] + formatted;\n                    count++;\n                }\n                \n                return formatted + decPart;\n            }\n            \n            function easeOutCubic(t) {\n                return 1 - Math.pow(1 - t, 3);\n            }\n            \n            function animate(currentTime) {\n                if (!startTime) startTime = currentTime;\n                const elapsed = currentTime - startTime;\n                const progress = Math.min(elapsed \/ duration, 1);\n                const easedProgress = easeOutCubic(progress);\n                const current = start + (end - start) * easedProgress;\n                \n                const displayValue = formatNumber(current, separator);\n                element.textContent = displayValue + suffix;\n                \n                if (progress < 1) {\n                    requestAnimationFrame(animate);\n                } else {\n                    \/\/ Final value set - now fit it to the box\n                    fitNumberToBox(element);\n                }\n            }\n            \n            \/\/ Pre-set final value to measure, then start animation\n            element.textContent = formatNumber(end, separator) + suffix;\n            fitNumberToBox(element);\n            element.textContent = formatNumber(start, separator) + suffix;\n            \n            requestAnimationFrame(animate);\n        }\n        \n        function initStatsObserver() {\n            const observerOptions = {\n                threshold: 0.5,\n                rootMargin: '0px'\n            };\n            \n            const observer = new IntersectionObserver((entries) => {\n                entries.forEach(entry => {\n                    if (entry.isIntersecting) {\n                        const statBoxes = entry.target.querySelectorAll('.stat-box');\n                        statBoxes.forEach((box, index) => {\n                            setTimeout(() => {\n                                const numberElement = box.querySelector('.stat-number');\n                                if (numberElement) {\n                                    if (!numberElement.classList.contains(\"animated\")) {\n                                        const targetValue = parseFloat(numberElement.getAttribute('data-target'));\n                                        animateCounter(numberElement, 0, targetValue, 3000);\n                                        numberElement.classList.add('animated');\n                                    }\n                                }\n                            }, index * 200);\n                        });\n                        observer.unobserve(entry.target);\n                    }\n                });\n            }, observerOptions);\n            \n            const statsSections = document.querySelectorAll('.animated-stats-section .stats-grid');\n            statsSections.forEach(section => {\n                observer.observe(section);\n            });\n        }\n        \n        \/\/ Refit all stat numbers (used on resize) - per module so each scales together\n        function refitAllStatNumbers() {\n            const sections = document.querySelectorAll('.animated-stats-section');\n            sections.forEach(function(section) {\n                \/\/ Only refit if at least one number has been animated\n                if (section.querySelector('.stat-number.animated')) {\n                    fitNumbersInModule(section);\n                }\n            });\n        }\n        \n        \/\/ Handle resize events (debounced)\n        let statsResizeTimer;\n        window.addEventListener('resize', function() {\n            clearTimeout(statsResizeTimer);\n            statsResizeTimer = setTimeout(refitAllStatNumbers, 150);\n        });\n        \n        \/\/ Also refit after orientation change (mobile)\n        window.addEventListener('orientationchange', function() {\n            setTimeout(refitAllStatNumbers, 300);\n        });\n        \n        if (document.readyState === 'loading') {\n            document.addEventListener('DOMContentLoaded', initStatsObserver);\n        } else {\n            initStatsObserver();\n        }\n    }\n    <\/script>\n        \n    \n\n\n<p>S\u0142u\u017cby patrolowo-interwencyjne Komendy Powiatowej Policji w \u017byrardowie w 2025 r. przeprowadzi\u0142y&nbsp;<strong>8.778 interwencji<\/strong>, w wyniku kt\u00f3rych na\u0142o\u017cono<strong>&nbsp;925 mandat\u00f3w karnych<\/strong>&nbsp;oraz zastosowano&nbsp;<strong>466 poucze\u0144<\/strong>. W 2025 r. wylegitymowanych zosta\u0142o<strong>&nbsp;10.533 os\u00f3b<\/strong>.&nbsp;<\/p>\n\n\n\n<p>Zabezpieczono og\u00f3\u0142em&nbsp;<strong>187 wydarze\u0144<\/strong>&nbsp;na terenie powiatu \u017cyrardowskiego.&nbsp;<\/p>\n\n\n\n<p>W 2025 r. Wydzia\u0142 Ruchu Drogowego ujawni\u0142&nbsp;<strong>7.977 wykrocze\u0144 drogowych. Na\u0142o\u017cono 6.240 mandat\u00f3w karnych, pouczono 746 os\u00f3b oraz sporz\u0105dzono 1.161 wniosk\u00f3w o ukaranie.<\/strong><\/p>\n\n\n\n<h4 class=\"wp-block-heading has-text-color has-link-color wp-elements-16d9a5734894d714a0c2f20e5be576cf\" style=\"color:#14357a\">Dzia\u0142alno\u015b\u0107 profilaktyczno-edukacyjna:<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Akcja &#8222;Bezpieczne Ferie Zimowe 2025&#8221;,<\/li>\n\n\n\n<li>Praca Policjanta w szko\u0142ach \u015brednich w ramach akcji \u201eZosta\u0144 Policjantem na Mazowszu\u201d,<\/li>\n\n\n\n<li>Akcja \u201eOka\u017c szacunek \u2013 to nic nie kosztuje\u201d &#8211; O zwalczaniu mowy nienawi\u015bci i hejtu w\u015br\u00f3d m\u0142odzie\u017cy,<\/li>\n\n\n\n<li>Akcja \u201eNie jestem na sprzeda\u017c&#8221;- o zwalczaniu i zapobieganiu przest\u0119pstwa handlu lud\u017ami,<\/li>\n\n\n\n<li>Akcja&nbsp;\u201eAktywna tarcza\u201d ze Stra\u017c\u0105 Ochrony Kolei,<\/li>\n\n\n\n<li>\u201eBezpieczny Powiat\u201d &#8211; pikniki z \u017cyrardowskimi policjantami,<\/li>\n\n\n\n<li>Akcja&nbsp;\u201eKr\u0119ci mnie bezpiecze\u0144stwo nad wod\u0105&#8221;,<\/li>\n\n\n\n<li>O uzale\u017cnieniach w szko\u0142ach ponadpodstawowych \u2013 dzia\u0142ania z Powiatow\u0105 Stacj\u0105 Sanitarno-Epidemiologiczn\u0105 w \u017byrardowie,<\/li>\n\n\n\n<li>Dzia\u0142ania&nbsp;\u201eKierowco! Nie polujemy na zebrach\u201d,<\/li>\n\n\n\n<li>O bezpiecze\u0144stwie w szko\u0142ach podstawowych,<\/li>\n\n\n\n<li>Dzia\u0142ania na rzecz bezpiecze\u0144stwa senior\u00f3w.<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-center has-text-color has-link-color wp-elements-7a23e0cbbf97aca225daf8d3b1d1d823\" style=\"color:#14357a\">Pa\u0144stwowa Stacja Sanitarno-Epidemiologiczna w \u017byrardowie<\/h2>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h4 class=\"wp-block-heading has-text-color has-link-color wp-elements-c306f4f43841873121205eac3e8e393f\" style=\"color:#14357a\">Wsp\u00f3\u0142praca z&nbsp;przedstawicielami Wydzia\u0142u Prewencji i Wydzia\u0142u Kryminalnego Komendy Powiatowej Policji w \u017byrardowie<\/h4>\n\n\n\n<p>Pa\u0144stwowa Stacja Sanitarno-Epidemiologiczna w \u017byrardowie zwr\u00f3ci\u0142a si\u0119 z pro\u015bb\u0105 do KPP w \u017byrardowie o kontynuowanie&nbsp;nawi\u0105zanej w 2014 r.&nbsp;wsp\u00f3\u0142pracy&nbsp;pomi\u0119dzy PSSE w \u017byrardowie a przedstawicielami Wydzia\u0142u Prewencji i Wydzia\u0142u Kryminalnego Komendy Powiatowej Policji w \u017byrardowie,&nbsp;dotycz\u0105cej realizacji ustawowego nadzoru nad wytwarzaniem i wprowadzaniem do obrotu \u015brodk\u00f3w zast\u0119pczych tzw. \u201edopalaczy\u201d oraz zagro\u017ceniami wywo\u0142anymi spo\u017cywaniem substancji psychoaktywnych, w tym tzw. \u201edopalaczy\u201d. W&nbsp;<strong>127 zak\u0142adach<\/strong>&nbsp;pracy przeprowadzono instrukta\u017c i poradnictwo w zakresie dopalaczy oraz rozdano ulotki.<\/p>\n\n\n\n<h4 class=\"wp-block-heading has-text-color has-link-color wp-elements-2e9c530a3c56e3aefb854ab41b984703\" style=\"color:#14357a\">Kontrola jako\u015bci wody<\/h4>\n\n\n\n<p>W ramach urz\u0119dowej i wewn\u0119trznej kontroli jako\u015bci wody wykonano&nbsp;<strong>370 bada\u0144 laboratoryjnych<\/strong>, \u0142\u0105cznie oceniono 10.975 parametr\u00f3w. W obiektach u\u017cyteczno\u015bci publicznej przeprowadzono&nbsp;<strong>223 kontroli.<\/strong><\/p>\n\n\n\n<h4 class=\"wp-block-heading has-text-color has-link-color wp-elements-635a9224ef77de718ea670275a85203c\" style=\"color:#14357a\">Wsp\u00f3\u0142praca z Inspekcj\u0105 Weterynaryjn\u0105<\/h4>\n\n\n\n<p>W dniu 16 listopada 2018 r. podpisane zosta\u0142o porozumienie z IW zgodnie, z kt\u00f3rym nie jest planowane przekazywanie zak\u0142ad\u00f3w. Jeden zak\u0142ad obj\u0119ty wsp\u00f3lnym nadzorem wyrejestrowa\u0142 dzia\u0142alno\u015b\u0107 u Powiatowego Lekarza Weterynarii.<\/p>\n\n\n\n<p><strong>W 2025 r. skontrolowano 1 obiekt pozostaj\u0105cy pod wsp\u00f3lnym nadzorem<\/strong>, nie prowadzono kontroli wsp\u00f3lnie pracownikiem IW.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-center has-text-color has-link-color wp-elements-2790da1ef55048cb94d13d803781c96a\" style=\"color:#14357a\">Powiatowy Inspektorat Weterynarii w \u017byrardowie<strong><\/strong><\/h2>\n\n\n\n<p>Powiatowy Inspektorat Weterynarii w \u017byrardowie jest urz\u0119dem niezespolonej administracji rz\u0105dowej.<\/p>\n\n\n\n<p>Inspektoratem kieruje Powiatowy Lekarz Weterynarii \u2013 lek. wet. Stanis\u0142aw T\u0119siorowski przy pomocy Zast\u0119pcy Powiatowego Lekarza Weterynarii lek. wet. Moniki Radzikowskiej-Cymerskiej.<\/p>\n\n\n\n<p>W Inspektoracie\u00a0zatrudnionych jest\u00a014 pracownik\u00f3w, w tym dziesi\u0119cioro merytorycznych i\u00a0czworo administracyjnych.<\/p>\n\n\n\n<h4 class=\"wp-block-heading has-text-color has-link-color wp-elements-938e63abedcd5698853247146f85dfee\" style=\"color:#14357a\"><strong>G\u0142\u00f3wnymi kierunkami dzia\u0142ania Inspekcji Weterynaryjnej i ustawowymi obowi\u0105zkami jest:<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>ochrona zdrowia zwierz\u0105t i zwalczanie chor\u00f3b zaka\u017anych zwierz\u0105t,<\/li>\n\n\n\n<li>wykonywanie bada\u0144 kontrolnych zaka\u017ce\u0144 zwierz\u0105t (monitorowanie wyst\u0119powania),<\/li>\n\n\n\n<li>nadz\u00f3r nad produkcj\u0105 \u017cywno\u015bci pochodzenia zwierz\u0119cego,<\/li>\n\n\n\n<li>nadz\u00f3r nad produkcj\u0105 i dystrybucj\u0105 pasz i karm dla zwierz\u0105t,<\/li>\n\n\n\n<li>wykonywanie bada\u0144 \u017cywno\u015bci pochodzenia zwierz\u0119cego oraz pasz dla zwierz\u0105t i wody do pojenia zwierz\u0105t<\/li>\n\n\n\n<li>nadz\u00f3r nad post\u0119powaniem z ubocznymi produktami pochodzenia zwierz\u0119cego (m.in. odpady poubojowe i poprodukcyjne, by\u0142a \u017cywno\u015b\u0107, odchody zwierz\u0119ce, padlina),<\/li>\n\n\n\n<li>nadz\u00f3r nad przestrzeganiem przepis\u00f3w dotycz\u0105cych ochrony zwierz\u0105t oraz dobrostanu,<\/li>\n\n\n\n<li>nadz\u00f3r nad przestrzeganiem przepis\u00f3w dotycz\u0105cych identyfikacji i rejestracji zwierz\u0105t,<\/li>\n\n\n\n<li>nadz\u00f3r nad obrotem zwierz\u0119tami, transportem zwierz\u0105t<\/li>\n\n\n\n<li>certyfikacja wysy\u0142ek do kraj\u00f3w trzecich (poza unijnych) produkt\u00f3w pochodzenia zwierz\u0119cego, pasz (w tym pet food), ubocznych produkt\u00f3w pochodzenia zwierz\u0119cego.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading has-text-color has-link-color wp-elements-6073fd383722aeb6150ee6b0012bd828\" style=\"color:#14357a\"><strong>W 2025 r. na terenie Powiatu \u017byrardowskiego:<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>nie wyst\u0105pi\u0142a \u017cadna choroba zaka\u017ana zwierz\u0105t, podlegaj\u0105ca obowi\u0105zkowi zwalczania na koszt bud\u017cetu pa\u0144stwa,<\/li>\n\n\n\n<li>zosta\u0142o pobranych 2129 pr\u00f3bek i przeprowadzonych 356 bada\u0144 diagnostycznych w celu monitorowania nast\u0119puj\u0105cych chor\u00f3b zaka\u017anych zwierz\u0105t: gru\u017alica byd\u0142a, bruceloza byd\u0142a, bia\u0142aczka byd\u0142a, zaka\u017ane zapalenie nosa i tchawicy byd\u0142a\/otr\u0119t byd\u0142a, gor\u0105czka Q, choroba niebieskiego j\u0119zyka, bruceloza owiec i k\u00f3z, afryka\u0144ski pom\u00f3r \u015bwi\u0144, klasyczny pom\u00f3r \u015bwi\u0144, choroba p\u0119cherzykowa \u015bwi\u0144, choroba Aujeszkyego, pryszczyca, w\u015bcieklizna, salmonellozy w stadach drobiu, SARS-CoV-2 u norek,&nbsp;<\/li>\n\n\n\n<li>nadzorowano 215 zak\u0142ad\u00f3w produkcji \u017cywno\u015bci pochodzenia zwierz\u0119cego,<\/li>\n\n\n\n<li>nadzorowano 529 zak\u0142ad\u00f3w produkcji, dystrybucji, magazynowania i transportu pasz dla zwierz\u0105t, w tym gospodarstw wytwarzaj\u0105cych materia\u0142y paszowe,<\/li>\n\n\n\n<li>pobrano i zbadano 351 pr\u00f3bek zwi\u0105zanych z produkcj\u0105 \u017cywno\u015bci i 52 pr\u00f3bek zwi\u0105zanych z wytwarzaniem i dystrybucj\u0105 pasz,<\/li>\n\n\n\n<li>przeprowadzono 16 kontroli podmiot\u00f3w dzia\u0142aj\u0105cych w zakresie ubocznych produkt\u00f3w pochodzenia zwierz\u0119cego,<\/li>\n\n\n\n<li>rozpatrzono i za\u0142atwiono 48 spraw (g\u0142\u00f3wnie skarg i informacji) dotycz\u0105cych narusze\u0144 warunk\u00f3w utrzymywania zwierz\u0105t oraz dobrostanu,<\/li>\n\n\n\n<li>przeprowadzono 41 kontroli w zakresie przestrzegania przez utrzymuj\u0105cych zwierz\u0119ta przepis\u00f3w o identyfikacji i rejestracji zwierz\u0105t, warunkach utrzymywania zwierz\u0105t gospodarskich,&nbsp;<\/li>\n\n\n\n<li>przeprowadzono 26 kontroli podmiot\u00f3w zajmuj\u0105cych si\u0119 obrotem zwierz\u0119tami, transportem zwierz\u0105t<\/li>\n\n\n\n<li>certyfikowano 9 wysy\u0142ek zwierz\u0105t (psy, koty, konie) do innych kraj\u00f3w UE),<\/li>\n\n\n\n<li>wystawiono (certyfikowano) 3796 \u015bwiadectw zdrowia na wysy\u0142ki do kraj\u00f3w trzecich (poza unijnych) \u017cywych zwierz\u0105t, produkt\u00f3w pochodzenia zwierz\u0119cego i pasz (w tym pet food).<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-center has-text-color has-link-color wp-elements-f6702e6ea26a0ba61e3edd50bda03452\" style=\"color:#14357a\">Pa\u0144stwowa Inspekcja Nadzoru Budowlanego w \u017byrardowie<\/h2>\n\n\n\n<p>W 2025 r. Pa\u0144stwowa Inspekcja Nadzoru Budowlanego w \u017byrardowie wyda\u0142a&nbsp;<strong>132 decyzji<\/strong>. <br>Postanowie\u0144 wydano&nbsp;<strong>159&nbsp;<\/strong>oraz przeprowadzono oko\u0142o&nbsp;<strong>110 kontroli<\/strong>. <br>\u0141\u0105czna liczba odebranych obiekt\u00f3w wynios\u0142a&nbsp;<strong>63.<\/strong><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>W ramach swojej dzia\u0142alno\u015bci, Pa\u0144stwowa Stra\u017c Po\u017carna na terenie powiatu \u017cyrardowskiego w 2025 r. przeprowadzi\u0142a&nbsp;1 228 interwencji, w tym 449 po\u017car\u00f3w, 644 interwencji zwi\u0105zanych z miejscowymi zagro\u017ceniami oraz 135 alarm\u00f3w&#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-578","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/raport2025.powiat-zyrardowski.pl\/index.php\/wp-json\/wp\/v2\/pages\/578","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/raport2025.powiat-zyrardowski.pl\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/raport2025.powiat-zyrardowski.pl\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/raport2025.powiat-zyrardowski.pl\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/raport2025.powiat-zyrardowski.pl\/index.php\/wp-json\/wp\/v2\/comments?post=578"}],"version-history":[{"count":18,"href":"https:\/\/raport2025.powiat-zyrardowski.pl\/index.php\/wp-json\/wp\/v2\/pages\/578\/revisions"}],"predecessor-version":[{"id":2444,"href":"https:\/\/raport2025.powiat-zyrardowski.pl\/index.php\/wp-json\/wp\/v2\/pages\/578\/revisions\/2444"}],"wp:attachment":[{"href":"https:\/\/raport2025.powiat-zyrardowski.pl\/index.php\/wp-json\/wp\/v2\/media?parent=578"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}