/// <summary>Export aggregate.</summary>
        /// <param name="outputDirectory">Directory to write files.</param>
        /// <param name="timeSteps">      Number of time-step updates to generate.</param>
        /// <param name="timePeriodHours">Time-step period in hours (default: 24).</param>
        private static void ExportAggregate(
            string outputDirectory,
            int timeSteps,
            int timePeriodHours)
        {
            // write meta-data (canonical resources) only in t0
            string dir = _outputFlat
                ? outputDirectory
                : Path.Combine(outputDirectory, "t0");

            List <IReportingFormat> formats = FormatHelper.GetFormatList();

            foreach (IReportingFormat format in formats)
            {
                Bundle measureBundle = SanerMeasure.GetBundle(format);

                if (measureBundle != null)
                {
                    WriteBundle(
                        Path.Combine(
                            dir,
                            $"{_filenameBaseForMeasures}-{format.Name}{_extension}"),
                        measureBundle);
                }

                Bundle questionnaireBundle = SanerQuestionnaire.GetBundle(format);

                if (questionnaireBundle != null)
                {
                    WriteBundle(
                        Path.Combine(
                            dir,
                            $"{_filenameBaseForQuestionnaires}-{format.Name}{_extension}"),
                        questionnaireBundle);
                }
            }

            // iterate over the orgs generating their data
            foreach (string orgId in _orgById.Keys)
            {
                Console.WriteLine($"Processing org: {orgId}");

                dir = _outputFlat
                    ? outputDirectory
                    : Path.Combine(outputDirectory, "t0");

                WriteOrgBundle(orgId, dir);

                CreateAggregateData(
                    orgId,
                    out OrgDeviceData deviceData,
                    out OrgPatientData patientData,
                    out OrgTestData testData,
                    out OrgWorkerData workerData);

                // loop over timeSteps
                for (int step = 0; step < timeSteps; step++)
                {
                    dir = _outputFlat
                        ? outputDirectory
                        : Path.Combine(outputDirectory, $"t{step}");

                    if (step != 0)
                    {
                        UpdateAggregateDataForStep(
                            ref deviceData,
                            ref patientData,
                            ref testData,
                            ref workerData);
                    }

                    TimeSpan hoursToSubtract = new TimeSpan(timePeriodHours * (timeSteps - step), 0, 0);
                    DateTime dt = DateTime.UtcNow.Subtract(hoursToSubtract);

                    WriteOrgReportBundle(
                        orgId,
                        dir,
                        dt,
                        deviceData,
                        patientData,
                        testData,
                        workerData,
                        step);
                }
            }
        }