public function mapEvents()
    {
        if ($this->mapEvents) {
            return $this->mapEvents;
        }

        $events = $this->all();

        $out = [];
        foreach ($events as $ev) {
            $firstDate = $ev->startDate();
            $lastDate = $ev->endDate();

            $current = new DateTime();
            $current->setTimestamp($firstDate->getTimestamp());

            while ($current <= $lastDate) {
                $year = $current->format('Y');
                $month = $current->format('m');
                $day = $current->format('d');

                if (!isset($out[$year])) {
                    $out[$year] = [];
                }

                if (!isset($out[$year][$month])) {
                    $out[$year][$month] = [];
                }

                if (!isset($out[$year][$month][$day])) {
                    $out[$year][$month][$day] = [];
                }

                $out[$year][$month][$day][] = $ev;

                $current->modify('+1 day');
            }
        }

        $this->mapEvents = $out;

        return $this->mapEvents;
    }