@researchdatabox/redbox-core 0.0.0-bootstrap.0 → 0.0.1-beta.10213
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/CoreController.d.ts +4 -0
- package/dist/CoreController.d.ts.map +1 -1
- package/dist/CoreController.js +68 -23
- package/dist/CoreService.d.ts +1 -1
- package/dist/CoreService.d.ts.map +1 -1
- package/dist/CoreService.js +1 -1
- package/dist/DatastreamService.d.ts +5 -2
- package/dist/DatastreamService.d.ts.map +1 -1
- package/dist/HarvestRunService.d.ts +49 -0
- package/dist/HarvestRunService.d.ts.map +1 -0
- package/dist/HarvestRunService.js +13 -0
- package/dist/IntegrationAuditParams.d.ts +11 -0
- package/dist/IntegrationAuditParams.js +14 -0
- package/dist/QueueService.d.ts +1 -1
- package/dist/QueueService.d.ts.map +1 -1
- package/dist/RecordAuditParams.d.ts +2 -0
- package/dist/RecordAuditParams.d.ts.map +1 -1
- package/dist/RecordAuditParams.js +3 -1
- package/dist/RecordsService.d.ts +52 -2
- package/dist/RecordsService.d.ts.map +1 -1
- package/dist/StorageService.d.ts +6 -2
- package/dist/StorageService.d.ts.map +1 -1
- package/dist/api-routes/apib.d.ts +7 -0
- package/dist/api-routes/apib.d.ts.map +1 -0
- package/dist/api-routes/apib.js +43 -0
- package/dist/api-routes/define.d.ts +4 -0
- package/dist/api-routes/define.d.ts.map +1 -0
- package/dist/api-routes/define.js +29 -0
- package/dist/api-routes/groups/admin.d.ts +6 -0
- package/dist/api-routes/groups/admin.d.ts.map +1 -0
- package/dist/api-routes/groups/admin.js +53 -0
- package/dist/api-routes/groups/appconfig.d.ts +4 -0
- package/dist/api-routes/groups/appconfig.d.ts.map +1 -0
- package/dist/api-routes/groups/appconfig.js +33 -0
- package/dist/api-routes/groups/branding.d.ts +8 -0
- package/dist/api-routes/groups/branding.d.ts.map +1 -0
- package/dist/api-routes/groups/branding.js +61 -0
- package/dist/api-routes/groups/dashboard-config.d.ts +11 -0
- package/dist/api-routes/groups/dashboard-config.d.ts.map +1 -0
- package/dist/api-routes/groups/dashboard-config.js +90 -0
- package/dist/api-routes/groups/export.d.ts +3 -0
- package/dist/api-routes/groups/export.d.ts.map +1 -0
- package/dist/api-routes/groups/export.js +30 -0
- package/dist/api-routes/groups/forms.d.ts +4 -0
- package/dist/api-routes/groups/forms.d.ts.map +1 -0
- package/dist/api-routes/groups/forms.js +29 -0
- package/dist/api-routes/groups/harvest-runs.d.ts +5 -0
- package/dist/api-routes/groups/harvest-runs.d.ts.map +1 -0
- package/dist/api-routes/groups/harvest-runs.js +79 -0
- package/dist/api-routes/groups/integration-audit.d.ts +3 -0
- package/dist/api-routes/groups/integration-audit.d.ts.map +1 -0
- package/dist/api-routes/groups/integration-audit.js +35 -0
- package/dist/api-routes/groups/named-query.d.ts +8 -0
- package/dist/api-routes/groups/named-query.d.ts.map +1 -0
- package/dist/api-routes/groups/named-query.js +54 -0
- package/dist/api-routes/groups/notifications.d.ts +3 -0
- package/dist/api-routes/groups/notifications.d.ts.map +1 -0
- package/dist/api-routes/groups/notifications.js +20 -0
- package/dist/api-routes/groups/records.d.ts +28 -0
- package/dist/api-routes/groups/records.d.ts.map +1 -0
- package/dist/api-routes/groups/records.js +353 -0
- package/dist/api-routes/groups/recordtypes.d.ts +4 -0
- package/dist/api-routes/groups/recordtypes.d.ts.map +1 -0
- package/dist/api-routes/groups/recordtypes.js +27 -0
- package/dist/api-routes/groups/reports.d.ts +9 -0
- package/dist/api-routes/groups/reports.d.ts.map +1 -0
- package/dist/api-routes/groups/reports.js +63 -0
- package/dist/api-routes/groups/search-query.d.ts +4 -0
- package/dist/api-routes/groups/search-query.d.ts.map +1 -0
- package/dist/api-routes/groups/search-query.js +51 -0
- package/dist/api-routes/groups/search.d.ts +6 -0
- package/dist/api-routes/groups/search.d.ts.map +1 -0
- package/dist/api-routes/groups/search.js +31 -0
- package/dist/api-routes/groups/translation.d.ts +8 -0
- package/dist/api-routes/groups/translation.d.ts.map +1 -0
- package/dist/api-routes/groups/translation.js +82 -0
- package/dist/api-routes/groups/users.d.ts +17 -0
- package/dist/api-routes/groups/users.d.ts.map +1 -0
- package/dist/api-routes/groups/users.js +149 -0
- package/dist/api-routes/groups/vocabulary.d.ts +10 -0
- package/dist/api-routes/groups/vocabulary.d.ts.map +1 -0
- package/dist/api-routes/groups/vocabulary.js +97 -0
- package/dist/api-routes/helpers.d.ts +29 -0
- package/dist/api-routes/helpers.d.ts.map +1 -0
- package/dist/api-routes/helpers.js +485 -0
- package/dist/api-routes/index.d.ts +27 -0
- package/dist/api-routes/index.d.ts.map +1 -0
- package/dist/api-routes/index.js +43 -0
- package/dist/api-routes/openapi.d.ts +26 -0
- package/dist/api-routes/openapi.d.ts.map +1 -0
- package/dist/api-routes/openapi.js +292 -0
- package/dist/api-routes/request-extraction.d.ts +14 -0
- package/dist/api-routes/request-extraction.d.ts.map +1 -0
- package/dist/api-routes/request-extraction.js +100 -0
- package/dist/api-routes/route-factory.d.ts +3 -0
- package/dist/api-routes/route-factory.d.ts.map +1 -0
- package/dist/api-routes/route-factory.js +30 -0
- package/dist/api-routes/route-registry.d.ts +24 -0
- package/dist/api-routes/route-registry.d.ts.map +1 -0
- package/dist/api-routes/route-registry.js +117 -0
- package/dist/api-routes/route-resolution.d.ts +4 -0
- package/dist/api-routes/route-resolution.d.ts.map +1 -0
- package/dist/api-routes/route-resolution.js +71 -0
- package/dist/api-routes/schemas/common.d.ts +35 -0
- package/dist/api-routes/schemas/common.d.ts.map +1 -0
- package/dist/api-routes/schemas/common.js +146 -0
- package/dist/api-routes/schemas/responses.d.ts +972 -0
- package/dist/api-routes/schemas/responses.d.ts.map +1 -0
- package/dist/api-routes/schemas/responses.js +512 -0
- package/dist/api-routes/types.d.ts +70 -0
- package/dist/api-routes/types.d.ts.map +1 -0
- package/dist/api-routes/types.js +3 -0
- package/dist/api-routes/validation.d.ts +32 -0
- package/dist/api-routes/validation.d.ts.map +1 -0
- package/dist/api-routes/validation.js +142 -0
- package/dist/api-routes/zod-openapi.d.ts +3 -0
- package/dist/api-routes/zod-openapi.d.ts.map +1 -0
- package/dist/api-routes/zod-openapi.js +8 -0
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +12 -12
- package/dist/config/agendaQueue.config.d.ts +33 -6
- package/dist/config/agendaQueue.config.d.ts.map +1 -1
- package/dist/config/agendaQueue.config.js +40 -18
- package/dist/config/auth.config.d.ts.map +1 -1
- package/dist/config/auth.config.js +29 -2
- package/dist/config/branding.config.d.ts +2 -1
- package/dist/config/branding.config.d.ts.map +1 -1
- package/dist/config/branding.config.js +5 -95
- package/dist/config/brandingConfigurationDefaults.config.d.ts +3 -0
- package/dist/config/brandingConfigurationDefaults.config.d.ts.map +1 -1
- package/dist/config/brandingConfigurationDefaults.config.js +161 -5
- package/dist/config/custom.config.d.ts +6 -0
- package/dist/config/custom.config.d.ts.map +1 -1
- package/dist/config/custom.config.js +10 -1
- package/dist/config/dashboardtype.config.d.ts +5 -0
- package/dist/config/dashboardtype.config.d.ts.map +1 -1
- package/dist/config/dashboardtype.config.js +1 -1
- package/dist/config/dashboardview.config.d.ts +24 -0
- package/dist/config/dashboardview.config.d.ts.map +1 -0
- package/dist/config/dashboardview.config.js +137 -0
- package/dist/config/dompurify.config.d.ts +1 -0
- package/dist/config/dompurify.config.d.ts.map +1 -1
- package/dist/config/dompurify.config.js +5 -4
- package/dist/config/emailnotification.config.d.ts.map +1 -1
- package/dist/config/emailnotification.config.js +2 -1
- package/dist/config/figshareDev.config.d.ts +12 -0
- package/dist/config/figshareDev.config.js +9 -0
- package/dist/config/form.config.d.ts +4 -0
- package/dist/config/form.config.d.ts.map +1 -1
- package/dist/config/form.config.js +1 -1
- package/dist/config/harvestRuns.config.d.ts +9 -0
- package/dist/config/harvestRuns.config.d.ts.map +1 -0
- package/dist/config/harvestRuns.config.js +11 -0
- package/dist/config/http.config.d.ts +13 -1
- package/dist/config/http.config.d.ts.map +1 -1
- package/dist/config/http.config.js +201 -38
- package/dist/config/index.d.ts +14 -19
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +10 -15
- package/dist/config/namedQuery.config.d.ts +26 -4
- package/dist/config/namedQuery.config.d.ts.map +1 -1
- package/dist/config/namedQuery.config.js +7 -350
- package/dist/config/policies.config.d.ts +3 -0
- package/dist/config/policies.config.d.ts.map +1 -1
- package/dist/config/policies.config.js +35 -1
- package/dist/config/record.config.d.ts.map +1 -1
- package/dist/config/record.config.js +2 -1
- package/dist/config/recordtype.config.d.ts +28 -0
- package/dist/config/recordtype.config.d.ts.map +1 -1
- package/dist/config/recordtype.config.js +105 -13
- package/dist/config/redboxSession.config.d.ts +3 -0
- package/dist/config/redboxSession.config.d.ts.map +1 -1
- package/dist/config/redboxSession.config.js +1 -1
- package/dist/config/report.config.d.ts +2 -11
- package/dist/config/report.config.d.ts.map +1 -1
- package/dist/config/report.config.js +3 -49
- package/dist/config/reusableContributorFormDefinitions.config.d.ts +1 -1
- package/dist/config/reusableContributorFormDefinitions.config.d.ts.map +1 -1
- package/dist/config/reusableContributorFormDefinitions.config.js +371 -206
- package/dist/config/reusableViewFormDefinitions.config.js +3 -3
- package/dist/config/routes.config.d.ts +5 -2
- package/dist/config/routes.config.d.ts.map +1 -1
- package/dist/config/routes.config.js +55 -117
- package/dist/config/storage.config.d.ts +20 -2
- package/dist/config/storage.config.d.ts.map +1 -1
- package/dist/config/storage.config.js +2 -1
- package/dist/config/validators.config.d.ts +6 -4
- package/dist/config/validators.config.d.ts.map +1 -1
- package/dist/config/validators.config.js +5 -3
- package/dist/config/vocab.config.d.ts +30 -0
- package/dist/config/vocab.config.d.ts.map +1 -1
- package/dist/config/vocab.config.js +21 -1
- package/dist/config/webpack.config.d.ts.map +1 -1
- package/dist/config/webpack.config.js +18 -12
- package/dist/config/workflow.config.d.ts +0 -1
- package/dist/config/workflow.config.d.ts.map +1 -1
- package/dist/config/workflow.config.js +1 -137
- package/dist/configmodels/AdminSidebarConfig.d.ts.map +1 -1
- package/dist/configmodels/AdminSidebarConfig.js +4 -3
- package/dist/configmodels/AuthorizedDomainsEmails.d.ts +48 -0
- package/dist/configmodels/AuthorizedDomainsEmails.d.ts.map +1 -1
- package/dist/configmodels/AuthorizedDomainsEmails.js +50 -2
- package/dist/configmodels/ConfigModels.d.ts +7 -1
- package/dist/configmodels/ConfigModels.d.ts.map +1 -1
- package/dist/configmodels/ConfigModels.js +41 -1
- package/dist/configmodels/DashboardTableOverrideConfig.d.ts +1011 -0
- package/dist/configmodels/DashboardTableOverrideConfig.d.ts.map +1 -0
- package/dist/configmodels/DashboardTableOverrideConfig.js +138 -0
- package/dist/configmodels/DoiPublishing.d.ts +4711 -0
- package/dist/configmodels/DoiPublishing.js +639 -0
- package/dist/configmodels/FigsharePublishing.d.ts +1376 -0
- package/dist/configmodels/FigsharePublishing.js +630 -0
- package/dist/configmodels/IntegrationNotificationConfig.d.ts +133 -0
- package/dist/configmodels/IntegrationNotificationConfig.d.ts.map +1 -0
- package/dist/configmodels/IntegrationNotificationConfig.js +64 -0
- package/dist/configmodels/SystemMessage.d.ts +32 -0
- package/dist/configmodels/SystemMessage.d.ts.map +1 -1
- package/dist/configmodels/SystemMessage.js +34 -2
- package/dist/controllers/AdminController.d.ts +1 -1
- package/dist/controllers/AdminController.d.ts.map +1 -1
- package/dist/controllers/AdminController.js +6 -32
- package/dist/controllers/AppConfigController.js +3 -3
- package/dist/controllers/BrandingAppController.d.ts.map +1 -1
- package/dist/controllers/BrandingAppController.js +11 -10
- package/dist/controllers/BrandingController.d.ts +11 -5
- package/dist/controllers/BrandingController.d.ts.map +1 -1
- package/dist/controllers/BrandingController.js +116 -48
- package/dist/controllers/DashboardConfigController.d.ts +8 -0
- package/dist/controllers/DashboardConfigController.d.ts.map +1 -0
- package/dist/controllers/DashboardConfigController.js +17 -0
- package/dist/controllers/DynamicAssetController.d.ts +1 -21
- package/dist/controllers/DynamicAssetController.d.ts.map +1 -1
- package/dist/controllers/DynamicAssetController.js +19 -41
- package/dist/controllers/EmailController.d.ts.map +1 -1
- package/dist/controllers/EmailController.js +16 -12
- package/dist/controllers/ExportController.d.ts.map +1 -1
- package/dist/controllers/ExportController.js +3 -8
- package/dist/controllers/FormVocabularyController.d.ts +3 -0
- package/dist/controllers/FormVocabularyController.d.ts.map +1 -1
- package/dist/controllers/FormVocabularyController.js +154 -4
- package/dist/controllers/NamedQueryController.d.ts +8 -0
- package/dist/controllers/NamedQueryController.d.ts.map +1 -0
- package/dist/controllers/NamedQueryController.js +17 -0
- package/dist/controllers/RecordAuditController.d.ts +31 -14
- package/dist/controllers/RecordAuditController.d.ts.map +1 -1
- package/dist/controllers/RecordAuditController.js +509 -57
- package/dist/controllers/RecordController.d.ts +18 -16
- package/dist/controllers/RecordController.d.ts.map +1 -1
- package/dist/controllers/RecordController.js +314 -167
- package/dist/controllers/RenderViewController.d.ts.map +1 -1
- package/dist/controllers/RenderViewController.js +4 -2
- package/dist/controllers/ReportController.d.ts +7 -0
- package/dist/controllers/ReportController.d.ts.map +1 -1
- package/dist/controllers/ReportController.js +75 -2
- package/dist/controllers/ReportsController.d.ts +1 -0
- package/dist/controllers/ReportsController.d.ts.map +1 -1
- package/dist/controllers/ReportsController.js +12 -2
- package/dist/controllers/TranslationController.d.ts.map +1 -1
- package/dist/controllers/TranslationController.js +14 -12
- package/dist/controllers/WorkspaceTypesController.d.ts +3 -2
- package/dist/controllers/WorkspaceTypesController.d.ts.map +1 -1
- package/dist/controllers/WorkspaceTypesController.js +120 -31
- package/dist/controllers/index.d.ts.map +1 -1
- package/dist/controllers/index.js +19 -4
- package/dist/controllers/webservice/AdminController.d.ts.map +1 -1
- package/dist/controllers/webservice/AdminController.js +16 -17
- package/dist/controllers/webservice/AppConfigController.d.ts.map +1 -1
- package/dist/controllers/webservice/AppConfigController.js +17 -18
- package/dist/controllers/webservice/BrandingController.d.ts.map +1 -1
- package/dist/controllers/webservice/BrandingController.js +102 -48
- package/dist/controllers/webservice/DashboardConfigController.d.ts +26 -0
- package/dist/controllers/webservice/DashboardConfigController.d.ts.map +1 -0
- package/dist/controllers/webservice/DashboardConfigController.js +241 -0
- package/dist/controllers/webservice/ExportController.d.ts.map +1 -1
- package/dist/controllers/webservice/ExportController.js +13 -18
- package/dist/controllers/webservice/FormManagementController.d.ts.map +1 -1
- package/dist/controllers/webservice/FormManagementController.js +11 -13
- package/dist/controllers/webservice/HarvestRunController.d.ts +13 -0
- package/dist/controllers/webservice/HarvestRunController.d.ts.map +1 -0
- package/dist/controllers/webservice/HarvestRunController.js +148 -0
- package/dist/controllers/webservice/IntegrationAuditController.d.ts +10 -0
- package/dist/controllers/webservice/IntegrationAuditController.d.ts.map +1 -1
- package/dist/controllers/webservice/IntegrationAuditController.js +98 -0
- package/dist/controllers/webservice/NamedQueryController.d.ts +17 -0
- package/dist/controllers/webservice/NamedQueryController.d.ts.map +1 -0
- package/dist/controllers/webservice/NamedQueryController.js +127 -0
- package/dist/controllers/webservice/RecordController.d.ts +4 -0
- package/dist/controllers/webservice/RecordController.d.ts.map +1 -1
- package/dist/controllers/webservice/RecordController.js +441 -314
- package/dist/controllers/webservice/RecordTypeController.d.ts.map +1 -1
- package/dist/controllers/webservice/RecordTypeController.js +9 -10
- package/dist/controllers/webservice/ReportController.d.ts +7 -0
- package/dist/controllers/webservice/ReportController.d.ts.map +1 -1
- package/dist/controllers/webservice/ReportController.js +125 -19
- package/dist/controllers/webservice/SearchController.d.ts.map +1 -1
- package/dist/controllers/webservice/SearchController.js +28 -35
- package/dist/controllers/webservice/TranslationController.d.ts.map +1 -1
- package/dist/controllers/webservice/TranslationController.js +65 -43
- package/dist/controllers/webservice/UserManagementController.d.ts +1 -1
- package/dist/controllers/webservice/UserManagementController.d.ts.map +1 -1
- package/dist/controllers/webservice/UserManagementController.js +114 -101
- package/dist/controllers/webservice/VocabularyController.d.ts.map +1 -1
- package/dist/controllers/webservice/VocabularyController.js +76 -28
- package/dist/form-config/dataRecord-1.0-draft.js +3 -3
- package/dist/form-config/default-1.0-draft.d.ts.map +1 -1
- package/dist/form-config/default-1.0-draft.js +27 -3
- package/dist/form-config/index.d.ts.map +1 -1
- package/dist/form-config/index.js +1 -1
- package/dist/hooks/defineRedboxHook.d.ts +3 -0
- package/dist/hooks/defineRedboxHook.d.ts.map +1 -1
- package/dist/hooks/defineRedboxHook.js +4 -1
- package/dist/hooks/webpack.d.ts.map +1 -1
- package/dist/hooks/webpack.js +17 -7
- package/dist/index.d.ts +12 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -2
- package/dist/loader/MigrationRunner.d.ts +19 -0
- package/dist/loader/MigrationRunner.d.ts.map +1 -0
- package/dist/loader/MigrationRunner.js +108 -0
- package/dist/loader/bootstrapShimRuntime.d.ts +2 -1
- package/dist/loader/bootstrapShimRuntime.d.ts.map +1 -1
- package/dist/loader/bootstrapShimRuntime.js +7 -2
- package/dist/loader/index.d.ts +17 -0
- package/dist/loader/index.d.ts.map +1 -1
- package/dist/loader/index.js +216 -13
- package/dist/middleware/redboxSession.d.ts +5 -0
- package/dist/middleware/redboxSession.d.ts.map +1 -1
- package/dist/middleware/redboxSession.js +19 -6
- package/dist/model/BuildResponse.d.ts +4 -0
- package/dist/model/BuildResponse.d.ts.map +1 -1
- package/dist/model/DashboardTypeResponseModel.d.ts +13 -1
- package/dist/model/DashboardTypeResponseModel.d.ts.map +1 -1
- package/dist/model/DashboardTypeResponseModel.js +12 -4
- package/dist/model/DashboardViewResponseModel.d.ts +20 -0
- package/dist/model/DashboardViewResponseModel.d.ts.map +1 -0
- package/dist/model/DashboardViewResponseModel.js +38 -0
- package/dist/model/RecordTypeResponseModel.d.ts +3 -1
- package/dist/model/RecordTypeResponseModel.d.ts.map +1 -1
- package/dist/model/RecordTypeResponseModel.js +4 -2
- package/dist/model/RequestDetails.d.ts +1 -1
- package/dist/model/RequestDetails.d.ts.map +1 -1
- package/dist/model/RequestDetails.js +1 -1
- package/dist/model/config/ReportConfig.d.ts +1 -1
- package/dist/model/config/ReportConfig.d.ts.map +1 -1
- package/dist/model/config/ReportConfig.js +2 -2
- package/dist/model/index.d.ts +1 -0
- package/dist/model/index.d.ts.map +1 -1
- package/dist/model/index.js +5 -2
- package/dist/model/storage/BrandingModel.d.ts +0 -16
- package/dist/model/storage/BrandingModel.d.ts.map +1 -1
- package/dist/model/storage/BrandingModel.js +2 -51
- package/dist/model/storage/DashboardTypeModel.d.ts +4 -0
- package/dist/model/storage/DashboardTypeModel.d.ts.map +1 -1
- package/dist/model/storage/HarvestRunModel.d.ts +140 -0
- package/dist/model/storage/HarvestRunModel.d.ts.map +1 -0
- package/dist/model/storage/HarvestRunModel.js +110 -0
- package/dist/model/storage/IntegrationAuditModel.d.ts +49 -0
- package/dist/model/storage/IntegrationAuditModel.d.ts.map +1 -1
- package/dist/model/storage/IntegrationAuditModel.js +106 -0
- package/dist/model/storage/RecordTypeModel.d.ts +16 -0
- package/dist/model/storage/RecordTypeModel.d.ts.map +1 -1
- package/dist/model/storage/RecordTypeModel.js +9 -1
- package/dist/model/storage/ReportModel.d.ts +1 -0
- package/dist/model/storage/ReportModel.d.ts.map +1 -1
- package/dist/model/storage/index.d.ts +2 -0
- package/dist/model/storage/index.d.ts.map +1 -1
- package/dist/model/storage/index.js +15 -2
- package/dist/policies/contentSecurityPolicy.d.ts.map +1 -1
- package/dist/policies/contentSecurityPolicy.js +23 -2
- package/dist/policies/i18nLanguages.d.ts.map +1 -1
- package/dist/policies/i18nLanguages.js +1 -1
- package/dist/policies/index.d.ts +3 -0
- package/dist/policies/index.d.ts.map +1 -1
- package/dist/policies/index.js +6 -2
- package/dist/policies/menuResolver.d.ts.map +1 -1
- package/dist/policies/menuResolver.js +1 -1
- package/dist/policies/setLang.d.ts.map +1 -1
- package/dist/policies/setLang.js +1 -1
- package/dist/policies/validateApiContractRequest.d.ts +3 -0
- package/dist/policies/validateApiContractRequest.d.ts.map +1 -0
- package/dist/policies/validateApiContractRequest.js +74 -0
- package/dist/responses/badRequest.d.ts.map +1 -1
- package/dist/responses/badRequest.js +7 -4
- package/dist/responses/created.d.ts.map +1 -1
- package/dist/responses/created.js +7 -4
- package/dist/responses/forbidden.d.ts.map +1 -1
- package/dist/responses/forbidden.js +7 -4
- package/dist/responses/ok.d.ts.map +1 -1
- package/dist/responses/ok.js +7 -4
- package/dist/responses/serverError.d.ts.map +1 -1
- package/dist/responses/serverError.js +7 -4
- package/dist/responses/siteTitle.d.ts +6 -0
- package/dist/responses/siteTitle.d.ts.map +1 -0
- package/dist/responses/siteTitle.js +28 -0
- package/dist/sails.d.ts +9 -0
- package/dist/sails.d.ts.map +1 -1
- package/dist/services/AgendaQueueService.d.ts +39 -17
- package/dist/services/AgendaQueueService.d.ts.map +1 -1
- package/dist/services/AgendaQueueService.js +328 -87
- package/dist/services/AppConfigService.d.ts +20 -2
- package/dist/services/AppConfigService.d.ts.map +1 -1
- package/dist/services/AppConfigService.js +129 -15
- package/dist/services/AttachmentMetadataService.d.ts +34 -0
- package/dist/services/AttachmentMetadataService.d.ts.map +1 -0
- package/dist/services/AttachmentMetadataService.js +133 -0
- package/dist/services/BrandingLogoService.d.ts +11 -8
- package/dist/services/BrandingLogoService.d.ts.map +1 -1
- package/dist/services/BrandingLogoService.js +71 -72
- package/dist/services/BrandingService.d.ts.map +1 -1
- package/dist/services/BrandingService.js +4 -32
- package/dist/services/BrandingThemeCssService.d.ts +21 -0
- package/dist/services/BrandingThemeCssService.d.ts.map +1 -0
- package/dist/services/BrandingThemeCssService.js +113 -0
- package/dist/services/BrandingThemeTokens.d.ts +16 -0
- package/dist/services/BrandingThemeTokens.d.ts.map +1 -0
- package/dist/services/BrandingThemeTokens.js +82 -0
- package/dist/services/CacheService.d.ts.map +1 -1
- package/dist/services/CacheService.js +37 -29
- package/dist/services/DashboardConfigService.d.ts +71 -0
- package/dist/services/DashboardConfigService.d.ts.map +1 -0
- package/dist/services/DashboardConfigService.js +315 -0
- package/dist/services/DashboardTypesService.d.ts +61 -63
- package/dist/services/DashboardTypesService.d.ts.map +1 -1
- package/dist/services/DashboardTypesService.js +361 -198
- package/dist/services/DoiService.d.ts +30 -25
- package/dist/services/DoiService.d.ts.map +1 -1
- package/dist/services/DoiService.js +448 -393
- package/dist/services/EmailService.d.ts +17 -3
- package/dist/services/EmailService.d.ts.map +1 -1
- package/dist/services/EmailService.js +44 -17
- package/dist/services/FigshareService.d.ts +40 -65
- package/dist/services/FigshareService.d.ts.map +1 -1
- package/dist/services/FigshareService.js +616 -2038
- package/dist/services/FormPayloadPrehydrateService.d.ts +35 -0
- package/dist/services/FormPayloadPrehydrateService.d.ts.map +1 -0
- package/dist/services/FormPayloadPrehydrateService.js +200 -0
- package/dist/services/FormRecordConsistencyService.d.ts +3 -3
- package/dist/services/FormRecordConsistencyService.d.ts.map +1 -1
- package/dist/services/FormRecordConsistencyService.js +21 -19
- package/dist/services/FormVocabularyService.d.ts +45 -0
- package/dist/services/FormVocabularyService.d.ts.map +1 -0
- package/dist/services/FormVocabularyService.js +326 -0
- package/dist/services/FormsService.d.ts.map +1 -1
- package/dist/services/FormsService.js +8 -6
- package/dist/services/HarvestRunService.d.ts +73 -0
- package/dist/services/HarvestRunService.d.ts.map +1 -0
- package/dist/services/HarvestRunService.js +1317 -0
- package/dist/services/I18nEntriesService.d.ts +9 -4
- package/dist/services/I18nEntriesService.d.ts.map +1 -1
- package/dist/services/I18nEntriesService.js +96 -18
- package/dist/services/IntegrationAuditService.d.ts +158 -0
- package/dist/services/IntegrationAuditService.d.ts.map +1 -1
- package/dist/services/IntegrationAuditService.js +838 -0
- package/dist/services/IntegrationNotificationService.d.ts +55 -0
- package/dist/services/IntegrationNotificationService.d.ts.map +1 -0
- package/dist/services/IntegrationNotificationService.js +271 -0
- package/dist/services/NamedQueryService.d.ts +51 -12
- package/dist/services/NamedQueryService.d.ts.map +1 -1
- package/dist/services/NamedQueryService.js +622 -125
- package/dist/services/OniService.d.ts.map +1 -1
- package/dist/services/OniService.js +4 -6
- package/dist/services/RDMPService.d.ts.map +1 -1
- package/dist/services/RDMPService.js +3 -2
- package/dist/services/RecordsService.d.ts +25 -3
- package/dist/services/RecordsService.d.ts.map +1 -1
- package/dist/services/RecordsService.js +119 -19
- package/dist/services/ReportsService.d.ts +57 -1
- package/dist/services/ReportsService.d.ts.map +1 -1
- package/dist/services/ReportsService.js +258 -34
- package/dist/services/SassCompilerService.d.ts +4 -10
- package/dist/services/SassCompilerService.d.ts.map +1 -1
- package/dist/services/SassCompilerService.js +9 -173
- package/dist/services/SolrSearchService.d.ts +1 -0
- package/dist/services/SolrSearchService.d.ts.map +1 -1
- package/dist/services/SolrSearchService.js +14 -3
- package/dist/services/StandardDatastreamService.d.ts +37 -5
- package/dist/services/StandardDatastreamService.d.ts.map +1 -1
- package/dist/services/StandardDatastreamService.js +535 -38
- package/dist/services/StorageManagerService.d.ts +13 -1
- package/dist/services/StorageManagerService.d.ts.map +1 -1
- package/dist/services/StorageManagerService.js +94 -11
- package/dist/services/TemplateService.d.ts +2 -18
- package/dist/services/TemplateService.d.ts.map +1 -1
- package/dist/services/TemplateService.js +9 -53
- package/dist/services/VocabularyService.d.ts +13 -0
- package/dist/services/VocabularyService.d.ts.map +1 -1
- package/dist/services/VocabularyService.js +204 -14
- package/dist/services/doi-v2/audit.d.ts +7 -0
- package/dist/services/doi-v2/audit.d.ts.map +1 -1
- package/dist/services/doi-v2/audit.js +30 -0
- package/dist/services/doi-v2/bindings.d.ts +8 -0
- package/dist/services/doi-v2/bindings.d.ts.map +1 -1
- package/dist/services/doi-v2/bindings.js +79 -0
- package/dist/services/doi-v2/config.d.ts +7 -0
- package/dist/services/doi-v2/config.js +51 -0
- package/dist/services/doi-v2/context.d.ts +18 -0
- package/dist/services/doi-v2/context.js +41 -0
- package/dist/services/doi-v2/http.d.ts +21 -0
- package/dist/services/doi-v2/http.js +88 -0
- package/dist/services/doi-v2/payload.d.ts +4 -0
- package/dist/services/doi-v2/payload.d.ts.map +1 -1
- package/dist/services/doi-v2/payload.js +305 -0
- package/dist/services/doi-v2/profiles.d.ts +5 -0
- package/dist/services/doi-v2/profiles.js +31 -0
- package/dist/services/doi-v2/runtime.d.ts +16 -0
- package/dist/services/doi-v2/runtime.js +173 -0
- package/dist/services/doi-v2/types.d.ts +49 -0
- package/dist/services/doi-v2/types.js +3 -0
- package/dist/services/figshare-v2/assets.d.ts +5 -0
- package/dist/services/figshare-v2/assets.js +297 -0
- package/dist/services/figshare-v2/audit.d.ts +7 -0
- package/dist/services/figshare-v2/audit.d.ts.map +1 -0
- package/dist/services/figshare-v2/audit.js +30 -0
- package/dist/services/figshare-v2/bindings.d.ts +6 -0
- package/dist/services/figshare-v2/bindings.d.ts.map +1 -1
- package/dist/services/figshare-v2/bindings.js +58 -0
- package/dist/services/figshare-v2/config.d.ts +13 -0
- package/dist/services/figshare-v2/config.d.ts.map +1 -1
- package/dist/services/figshare-v2/config.js +105 -0
- package/dist/services/figshare-v2/context.d.ts +4 -0
- package/dist/services/figshare-v2/context.d.ts.map +1 -1
- package/dist/services/figshare-v2/context.js +21 -0
- package/dist/services/figshare-v2/embargo.d.ts +5 -0
- package/dist/services/figshare-v2/embargo.js +36 -0
- package/dist/services/figshare-v2/http.d.ts +42 -0
- package/dist/services/figshare-v2/http.d.ts.map +1 -1
- package/dist/services/figshare-v2/http.js +324 -0
- package/dist/services/figshare-v2/metadata.d.ts +6 -0
- package/dist/services/figshare-v2/metadata.d.ts.map +1 -1
- package/dist/services/figshare-v2/metadata.js +280 -0
- package/dist/services/figshare-v2/observability.d.ts +7 -0
- package/dist/services/figshare-v2/observability.d.ts.map +1 -1
- package/dist/services/figshare-v2/observability.js +87 -0
- package/dist/services/figshare-v2/plan.d.ts +5 -0
- package/dist/services/figshare-v2/plan.js +51 -0
- package/dist/services/figshare-v2/publish.d.ts +5 -0
- package/dist/services/figshare-v2/publish.js +20 -0
- package/dist/services/figshare-v2/queue.d.ts +4 -0
- package/dist/services/figshare-v2/queue.js +11 -0
- package/dist/services/figshare-v2/runtime.d.ts +14 -0
- package/dist/services/figshare-v2/runtime.d.ts.map +1 -1
- package/dist/services/figshare-v2/runtime.js +88 -0
- package/dist/services/figshare-v2/types.d.ts +198 -0
- package/dist/services/figshare-v2/types.d.ts.map +1 -1
- package/dist/services/figshare-v2/types.js +59 -0
- package/dist/services/figshare-v2/workflow.d.ts +3 -0
- package/dist/services/figshare-v2/workflow.js +7 -0
- package/dist/services/figshare-v2/writeback.d.ts +5 -0
- package/dist/services/figshare-v2/writeback.js +45 -0
- package/dist/services/index.d.ts +24 -3
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +43 -7
- package/dist/shims/momentShim.d.ts.map +1 -1
- package/dist/shims/momentShim.js +1 -6
- package/dist/storage/GridFSDriver.d.ts +101 -0
- package/dist/storage/GridFSDriver.d.ts.map +1 -0
- package/dist/storage/GridFSDriver.js +291 -0
- package/dist/storage/TusStorageManagerDataStore.d.ts +49 -0
- package/dist/storage/TusStorageManagerDataStore.d.ts.map +1 -0
- package/dist/storage/TusStorageManagerDataStore.js +300 -0
- package/dist/transformers/ExportJSONTransformer.d.ts +1 -1
- package/dist/transformers/ExportJSONTransformer.d.ts.map +1 -1
- package/dist/transformers/ExportJSONTransformer.js +3 -3
- package/dist/utilities/RequestParamUtils.d.ts +3 -0
- package/dist/utilities/RequestParamUtils.d.ts.map +1 -0
- package/dist/utilities/RequestParamUtils.js +13 -0
- package/dist/visitor/attachment-fields.visitor.d.ts +17 -17
- package/dist/visitor/attachment-fields.visitor.d.ts.map +1 -1
- package/dist/visitor/attachment-fields.visitor.js +44 -34
- package/dist/visitor/client.visitor.d.ts +145 -97
- package/dist/visitor/client.visitor.d.ts.map +1 -1
- package/dist/visitor/client.visitor.js +366 -273
- package/dist/visitor/construct.visitor.d.ts +99 -93
- package/dist/visitor/construct.visitor.d.ts.map +1 -1
- package/dist/visitor/construct.visitor.js +304 -227
- package/dist/visitor/context-variables.visitor.d.ts +35 -35
- package/dist/visitor/context-variables.visitor.d.ts.map +1 -1
- package/dist/visitor/context-variables.visitor.js +85 -75
- package/dist/visitor/data-value.visitor.d.ts +99 -93
- package/dist/visitor/data-value.visitor.d.ts.map +1 -1
- package/dist/visitor/data-value.visitor.js +157 -148
- package/dist/visitor/json-type-def.visitor.d.ts +96 -90
- package/dist/visitor/json-type-def.visitor.d.ts.map +1 -1
- package/dist/visitor/json-type-def.visitor.js +158 -149
- package/dist/visitor/migrate-config-v4-v5.visitor.d.ts +101 -94
- package/dist/visitor/migrate-config-v4-v5.visitor.d.ts.map +1 -1
- package/dist/visitor/migrate-config-v4-v5.visitor.js +356 -295
- package/dist/visitor/template.visitor.d.ts +100 -92
- package/dist/visitor/template.visitor.d.ts.map +1 -1
- package/dist/visitor/template.visitor.js +245 -156
- package/dist/visitor/validator.visitor.d.ts +95 -91
- package/dist/visitor/validator.visitor.d.ts.map +1 -1
- package/dist/visitor/validator.visitor.js +184 -152
- package/dist/visitor/visitor-helpers.js +9 -9
- package/dist/visitor/vocab-inline.visitor.d.ts +34 -19
- package/dist/visitor/vocab-inline.visitor.d.ts.map +1 -1
- package/dist/visitor/vocab-inline.visitor.js +157 -48
- package/dist/waterline-models/AttachmentAccessAudit.d.ts +26 -0
- package/dist/waterline-models/AttachmentAccessAudit.d.ts.map +1 -0
- package/dist/waterline-models/AttachmentAccessAudit.js +63 -0
- package/dist/waterline-models/AttachmentMetadata.d.ts +40 -0
- package/dist/waterline-models/AttachmentMetadata.d.ts.map +1 -0
- package/dist/waterline-models/AttachmentMetadata.js +147 -0
- package/dist/waterline-models/BrandingConfig.d.ts +0 -2
- package/dist/waterline-models/BrandingConfig.d.ts.map +1 -1
- package/dist/waterline-models/BrandingConfig.js +5 -9
- package/dist/waterline-models/DashboardType.d.ts +7 -0
- package/dist/waterline-models/DashboardType.d.ts.map +1 -1
- package/dist/waterline-models/DashboardType.js +16 -1
- package/dist/waterline-models/HarvestRecordEvent.d.ts +43 -0
- package/dist/waterline-models/HarvestRecordEvent.d.ts.map +1 -0
- package/dist/waterline-models/HarvestRecordEvent.js +107 -0
- package/dist/waterline-models/HarvestRun.d.ts +51 -0
- package/dist/waterline-models/HarvestRun.d.ts.map +1 -0
- package/dist/waterline-models/HarvestRun.js +125 -0
- package/dist/waterline-models/HarvestRunChunk.d.ts +57 -0
- package/dist/waterline-models/HarvestRunChunk.d.ts.map +1 -0
- package/dist/waterline-models/HarvestRunChunk.js +140 -0
- package/dist/waterline-models/I18nTranslation.d.ts +2 -0
- package/dist/waterline-models/I18nTranslation.d.ts.map +1 -1
- package/dist/waterline-models/I18nTranslation.js +6 -1
- package/dist/waterline-models/Migration.d.ts +24 -0
- package/dist/waterline-models/Migration.d.ts.map +1 -0
- package/dist/waterline-models/Migration.js +52 -0
- package/dist/waterline-models/NamedQuery.d.ts +6 -0
- package/dist/waterline-models/NamedQuery.d.ts.map +1 -1
- package/dist/waterline-models/NamedQuery.js +16 -1
- package/dist/waterline-models/index.d.ts +12 -0
- package/dist/waterline-models/index.d.ts.map +1 -1
- package/dist/waterline-models/index.js +19 -1
- package/package.json +78 -52
- package/redbox-loader-templates/bootstrap-shim.js.hbs +14 -1
- package/dist/config/datacite.config.d.ts +0 -51
- package/dist/config/datacite.config.d.ts.map +0 -1
- package/dist/config/datacite.config.js +0 -44
- package/dist/config/figshareAPI.config.d.ts +0 -116
- package/dist/config/figshareAPI.config.d.ts.map +0 -1
- package/dist/config/figshareAPI.config.js +0 -857
- package/dist/config/figshareAPIEnv.config.d.ts +0 -11
- package/dist/config/figshareAPIEnv.config.d.ts.map +0 -1
- package/dist/config/figshareAPIEnv.config.js +0 -13
- package/dist/config/figshareRedboxFORMapping.config.d.ts +0 -15
- package/dist/config/figshareRedboxFORMapping.config.d.ts.map +0 -1
- package/dist/config/figshareRedboxFORMapping.config.js +0 -7458
- package/dist/config/relatedObjectsFormDefinition.config.d.ts.map +0 -1
- package/dist/controllers/VocabController.d.ts +0 -43
- package/dist/controllers/VocabController.d.ts.map +0 -1
- package/dist/controllers/VocabController.js +0 -190
- package/dist/form-config/dataPublication-1.0-draft.d.ts.map +0 -1
- package/dist/form-config/dataPublication-1.0-embargoed.d.ts.map +0 -1
- package/dist/form-config/dataPublication-1.0-published.d.ts.map +0 -1
- package/dist/form-config/dataPublication-1.0-queued.d.ts.map +0 -1
- package/dist/form-config/dataPublication-1.0-retired.d.ts.map +0 -1
- package/dist/services/VocabService.d.ts +0 -81
- package/dist/services/VocabService.d.ts.map +0 -1
- package/dist/services/VocabService.js +0 -424
|
@@ -17,22 +17,112 @@
|
|
|
17
17
|
// You should have received a copy of the GNU General Public License along
|
|
18
18
|
// with this program; if not, write to the Free Software Foundation, Inc.,
|
|
19
19
|
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
20
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
23
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
24
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
25
|
+
}
|
|
26
|
+
Object.defineProperty(o, k2, desc);
|
|
27
|
+
}) : (function(o, m, k, k2) {
|
|
28
|
+
if (k2 === undefined) k2 = k;
|
|
29
|
+
o[k2] = m[k];
|
|
30
|
+
}));
|
|
31
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
32
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
33
|
+
}) : function(o, v) {
|
|
34
|
+
o["default"] = v;
|
|
35
|
+
});
|
|
36
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
37
|
+
var ownKeys = function(o) {
|
|
38
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
39
|
+
var ar = [];
|
|
40
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
41
|
+
return ar;
|
|
42
|
+
};
|
|
43
|
+
return ownKeys(o);
|
|
44
|
+
};
|
|
45
|
+
return function (mod) {
|
|
46
|
+
if (mod && mod.__esModule) return mod;
|
|
47
|
+
var result = {};
|
|
48
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
49
|
+
__setModuleDefault(result, mod);
|
|
50
|
+
return result;
|
|
51
|
+
};
|
|
52
|
+
})();
|
|
53
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
54
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
55
|
+
};
|
|
20
56
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
-
exports.NamedQueryResponseRecord = exports.NamedQueryConfig = exports.Services = void 0;
|
|
57
|
+
exports.NamedQueryResponseRecord = exports.NamedQueryConfig = exports.RelatedRecordFilter = exports.Services = void 0;
|
|
22
58
|
const CoreService_1 = require("../CoreService");
|
|
59
|
+
const fs = __importStar(require("node:fs/promises"));
|
|
60
|
+
const path = __importStar(require("node:path"));
|
|
23
61
|
const luxon_1 = require("luxon");
|
|
62
|
+
const handlebars_1 = __importDefault(require("handlebars"));
|
|
63
|
+
const sails_ng_common_1 = require("@researchdatabox/sails-ng-common");
|
|
24
64
|
const ListAPIResponse_1 = require("../model/ListAPIResponse");
|
|
25
65
|
const rxjs_1 = require("rxjs");
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
66
|
+
const isRecordValue = (value) => typeof value === 'object' && value !== null;
|
|
67
|
+
const getStringProperty = (value, propertyName) => {
|
|
68
|
+
if (!isRecordValue(value)) {
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
const propertyValue = value[propertyName];
|
|
72
|
+
return typeof propertyValue === 'string' ? propertyValue : undefined;
|
|
73
|
+
};
|
|
74
|
+
const getIdentifierProperty = (value, propertyName) => {
|
|
75
|
+
if (!isRecordValue(value)) {
|
|
76
|
+
return undefined;
|
|
29
77
|
}
|
|
30
|
-
|
|
31
|
-
|
|
78
|
+
const propertyValue = value[propertyName];
|
|
79
|
+
if (typeof propertyValue === 'string' || typeof propertyValue === 'number') {
|
|
80
|
+
return String(propertyValue);
|
|
81
|
+
}
|
|
82
|
+
return undefined;
|
|
83
|
+
};
|
|
84
|
+
const parseSerializedValue = (input, fallback) => {
|
|
85
|
+
if (typeof input === 'string') {
|
|
86
|
+
if (input.length === 0) {
|
|
87
|
+
return fallback;
|
|
88
|
+
}
|
|
89
|
+
try {
|
|
90
|
+
return JSON.parse(input);
|
|
91
|
+
}
|
|
92
|
+
catch (_error) {
|
|
93
|
+
return fallback;
|
|
94
|
+
}
|
|
32
95
|
}
|
|
33
|
-
|
|
96
|
+
if (input === undefined || input === null) {
|
|
34
97
|
return fallback;
|
|
35
98
|
}
|
|
99
|
+
return input;
|
|
100
|
+
};
|
|
101
|
+
const parseObjectParamValue = (queryParamKey, value) => {
|
|
102
|
+
if (_.isPlainObject(value)) {
|
|
103
|
+
return value;
|
|
104
|
+
}
|
|
105
|
+
if (typeof value === 'string') {
|
|
106
|
+
try {
|
|
107
|
+
const parsed = JSON.parse(value);
|
|
108
|
+
if (_.isPlainObject(parsed)) {
|
|
109
|
+
return parsed;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch (_error) {
|
|
113
|
+
throw Error(`${queryParamKey} must be a valid JSON object`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
throw Error(`${queryParamKey} must be a valid JSON object`);
|
|
117
|
+
};
|
|
118
|
+
const DEFAULT_BOOTSTRAP_DATA_PATH = 'bootstrap-data';
|
|
119
|
+
let namedQueryHandlebarsHelpersRegistered = false;
|
|
120
|
+
const ensureNamedQueryHandlebarsHelpers = () => {
|
|
121
|
+
if (namedQueryHandlebarsHelpersRegistered) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
(0, sails_ng_common_1.registerSharedHandlebarsHelpers)(handlebars_1.default);
|
|
125
|
+
namedQueryHandlebarsHelpersRegistered = true;
|
|
36
126
|
};
|
|
37
127
|
var Services;
|
|
38
128
|
(function (Services) {
|
|
@@ -42,73 +132,378 @@ var Services;
|
|
|
42
132
|
*/
|
|
43
133
|
class NamedQueryService extends CoreService_1.Services.Core.Service {
|
|
44
134
|
_exportedMethods = [
|
|
45
|
-
"
|
|
135
|
+
"bootstrapData",
|
|
46
136
|
"getNamedQueryConfig",
|
|
137
|
+
"getSupportedCollections",
|
|
47
138
|
"performNamedQuery",
|
|
48
139
|
"performNamedQueryFromConfig",
|
|
49
140
|
"performNamedQueryFromConfigResults",
|
|
141
|
+
"create",
|
|
142
|
+
"list",
|
|
143
|
+
"update",
|
|
144
|
+
"delete",
|
|
50
145
|
];
|
|
51
|
-
async
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
146
|
+
async bootstrapData(defBrand) {
|
|
147
|
+
const bootstrapPath = this.getBootstrapDataPath();
|
|
148
|
+
let fileNames = [];
|
|
149
|
+
const fileOps = this.getBootstrapFileOps();
|
|
150
|
+
try {
|
|
151
|
+
const fileEntries = await fileOps.readdir(bootstrapPath, { withFileTypes: true });
|
|
152
|
+
fileNames = fileEntries
|
|
153
|
+
.filter((entry) => entry.isFile() && entry.name.endsWith('.json'))
|
|
154
|
+
.map((entry) => entry.name)
|
|
155
|
+
.sort((a, b) => a.localeCompare(b));
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
const ioError = error;
|
|
159
|
+
if (ioError.code === 'ENOENT') {
|
|
160
|
+
sails.log.verbose(`Named query bootstrap data path not found: ${bootstrapPath}`);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
sails.log.error(`Failed to read named query bootstrap data path: ${bootstrapPath}`, error);
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
for (const fileName of fileNames) {
|
|
167
|
+
try {
|
|
168
|
+
const filePath = path.join(bootstrapPath, fileName);
|
|
169
|
+
const definition = await this.readJsonFile(filePath);
|
|
170
|
+
if (!definition) {
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
const name = fileName.replace(/\.json$/, '');
|
|
174
|
+
if (!name || typeof definition.collectionName !== 'string' || definition.collectionName.length === 0) {
|
|
175
|
+
sails.log.error(`Skipping named query bootstrap file with missing name or collectionName: ${fileName}`);
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
const existing = await NamedQuery.findOne({ key: `${defBrand.id}_${name}` });
|
|
179
|
+
if (existing) {
|
|
180
|
+
sails.log.verbose(`Skipping existing named query bootstrap data: ${name}`);
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
await this.create(defBrand, name, definition);
|
|
184
|
+
sails.log.verbose(`Bootstrapped named query: ${name}`);
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
sails.log.error(`Failed to bootstrap named query from file: ${fileName}`, error);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
getBootstrapDataPath() {
|
|
192
|
+
const configuredPath = _.get(sails.config, 'bootstrap.bootstrapDataPath', DEFAULT_BOOTSTRAP_DATA_PATH);
|
|
193
|
+
return path.resolve(String(configuredPath), 'namedqueries');
|
|
194
|
+
}
|
|
195
|
+
getBootstrapFileOps() {
|
|
196
|
+
return fs;
|
|
197
|
+
}
|
|
198
|
+
async readJsonFile(filePath) {
|
|
199
|
+
try {
|
|
200
|
+
const content = await this.getBootstrapFileOps().readFile(filePath, 'utf8');
|
|
201
|
+
return JSON.parse(content);
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
sails.log.error(`Failed to read named query bootstrap file: ${path.basename(filePath)}`, error);
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
getModel(collectionName) {
|
|
209
|
+
return sails.models?.[collectionName];
|
|
210
|
+
}
|
|
211
|
+
resolveBrandScope(collectionName) {
|
|
212
|
+
if (_.isEmpty(collectionName)) {
|
|
213
|
+
throw new Error('collectionName is required');
|
|
214
|
+
}
|
|
215
|
+
if (collectionName === 'record') {
|
|
216
|
+
return { type: 'field', fieldPath: 'metaMetadata.brandId' };
|
|
217
|
+
}
|
|
218
|
+
if (collectionName === 'user') {
|
|
219
|
+
return { type: 'userRoles', fieldPath: '' };
|
|
220
|
+
}
|
|
221
|
+
const model = this.getModel(collectionName);
|
|
222
|
+
if (!model) {
|
|
223
|
+
throw new Error(`Invalid collectionName '${collectionName}': model not found`);
|
|
224
|
+
}
|
|
225
|
+
const attributes = model.attributes;
|
|
226
|
+
if (attributes && Object.prototype.hasOwnProperty.call(attributes, 'branding')) {
|
|
227
|
+
return { type: 'field', fieldPath: 'branding' };
|
|
228
|
+
}
|
|
229
|
+
throw new Error(`Invalid collectionName '${collectionName}': model does not expose a brand scope`);
|
|
230
|
+
}
|
|
231
|
+
hasRoleInBrand(user, brandId) {
|
|
232
|
+
return _.some(user.roles ?? [], (role) => {
|
|
233
|
+
const roleObj = role;
|
|
234
|
+
const branding = roleObj?.branding;
|
|
235
|
+
const roleBrandId = _.isObject(branding) ? String(branding.id ?? '') : String(branding ?? '');
|
|
236
|
+
return roleBrandId === brandId;
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
async getLinkedSecondaryUserIds(brandId) {
|
|
240
|
+
if (typeof UserLink === 'undefined') {
|
|
241
|
+
return new Set();
|
|
242
|
+
}
|
|
243
|
+
const activeLinks = await UserLink.find({ brandId, status: 'active' });
|
|
244
|
+
return new Set(_.map(activeLinks, (link) => String(link.secondaryUserId ?? '')).filter((id) => id !== ''));
|
|
245
|
+
}
|
|
246
|
+
sanitizeUserForNamedQuery(user) {
|
|
247
|
+
const sanitized = { ...user };
|
|
248
|
+
delete sanitized.password;
|
|
249
|
+
delete sanitized.token;
|
|
250
|
+
return sanitized;
|
|
251
|
+
}
|
|
252
|
+
getMongoQueryValue(mongoQuery, path) {
|
|
253
|
+
return Object.prototype.hasOwnProperty.call(mongoQuery, path) ? mongoQuery[path] : _.get(mongoQuery, path);
|
|
254
|
+
}
|
|
255
|
+
setMongoQueryValue(mongoQuery, path, value) {
|
|
256
|
+
if (path.includes('.')) {
|
|
257
|
+
mongoQuery[path] = value;
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
_.set(mongoQuery, path, value);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
unsetMongoQueryValue(mongoQuery, path) {
|
|
264
|
+
if (Object.prototype.hasOwnProperty.call(mongoQuery, path)) {
|
|
265
|
+
delete mongoQuery[path];
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
_.unset(mongoQuery, path);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
isQueryOperatorObject(value) {
|
|
272
|
+
return Object.keys(value).some((key) => key.startsWith('$') || [
|
|
273
|
+
'contains',
|
|
274
|
+
'startsWith',
|
|
275
|
+
'endsWith',
|
|
276
|
+
'like',
|
|
277
|
+
'>',
|
|
278
|
+
'>=',
|
|
279
|
+
'<',
|
|
280
|
+
'<=',
|
|
281
|
+
'!=',
|
|
282
|
+
'in',
|
|
283
|
+
'nin',
|
|
284
|
+
].includes(key));
|
|
285
|
+
}
|
|
286
|
+
flattenDeepTargetCriteria(criteria, prefix = '') {
|
|
287
|
+
const flattened = {};
|
|
288
|
+
for (const [key, value] of Object.entries(criteria)) {
|
|
289
|
+
const path = prefix ? `${prefix}.${key}` : key;
|
|
290
|
+
if (_.isPlainObject(value) && !this.isQueryOperatorObject(value)) {
|
|
291
|
+
Object.assign(flattened, this.flattenDeepTargetCriteria(value, path));
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
flattened[path] = value;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
return flattened;
|
|
298
|
+
}
|
|
299
|
+
toNativeMongoCriteria(criteria) {
|
|
300
|
+
const mongoCriteria = {};
|
|
301
|
+
const operatorMap = {
|
|
302
|
+
'>': '$gt',
|
|
303
|
+
'>=': '$gte',
|
|
304
|
+
'<': '$lt',
|
|
305
|
+
'<=': '$lte',
|
|
306
|
+
'!=': '$ne',
|
|
307
|
+
in: '$in',
|
|
308
|
+
nin: '$nin',
|
|
309
|
+
};
|
|
310
|
+
for (const [key, value] of Object.entries(criteria)) {
|
|
311
|
+
if (_.isPlainObject(value)) {
|
|
312
|
+
const mappedValue = {};
|
|
313
|
+
for (const [operator, operatorValue] of Object.entries(value)) {
|
|
314
|
+
if (operator === 'contains') {
|
|
315
|
+
mappedValue.$regex = _.escapeRegExp(String(operatorValue ?? ''));
|
|
316
|
+
mappedValue.$options = 'i';
|
|
317
|
+
}
|
|
318
|
+
else {
|
|
319
|
+
mappedValue[operatorMap[operator] ?? operator] = operatorValue;
|
|
320
|
+
}
|
|
59
321
|
}
|
|
322
|
+
mongoCriteria[key] = mappedValue;
|
|
60
323
|
}
|
|
61
324
|
else {
|
|
62
|
-
|
|
325
|
+
mongoCriteria[key] = value;
|
|
63
326
|
}
|
|
64
327
|
}
|
|
65
|
-
|
|
66
|
-
await this.createNamedQueriesForBrand(defBrand);
|
|
328
|
+
return mongoCriteria;
|
|
67
329
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
330
|
+
toNativeMongoSort(sort) {
|
|
331
|
+
const mongoSort = {};
|
|
332
|
+
for (const sortEntry of sort ?? []) {
|
|
333
|
+
for (const [field, direction] of Object.entries(sortEntry)) {
|
|
334
|
+
mongoSort[field] = direction === 'DESC' ? -1 : 1;
|
|
335
|
+
}
|
|
72
336
|
}
|
|
337
|
+
return mongoSort;
|
|
73
338
|
}
|
|
74
|
-
|
|
75
|
-
|
|
339
|
+
async getNativeRecordCollection(model) {
|
|
340
|
+
const native = model.native;
|
|
341
|
+
if (typeof native !== 'function') {
|
|
342
|
+
throw new Error("Model record does not expose native collection access");
|
|
343
|
+
}
|
|
344
|
+
return new Promise((resolve, reject) => {
|
|
345
|
+
const nativeFn = native;
|
|
346
|
+
nativeFn((error, collection) => {
|
|
347
|
+
if (error) {
|
|
348
|
+
reject(error);
|
|
349
|
+
}
|
|
350
|
+
else {
|
|
351
|
+
resolve(collection);
|
|
352
|
+
}
|
|
353
|
+
});
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
async create(brand, name, config) {
|
|
357
|
+
const key = `${brand.id}_${name}`;
|
|
358
|
+
const existing = await NamedQuery.findOne({ key });
|
|
359
|
+
if (existing) {
|
|
360
|
+
throw new Error(`Named query '${name}' already exists`);
|
|
361
|
+
}
|
|
362
|
+
const brandScope = this.resolveBrandScope(config.collectionName);
|
|
363
|
+
return (0, rxjs_1.firstValueFrom)(super.getObservable(NamedQuery.create({
|
|
76
364
|
name: name,
|
|
77
365
|
branding: brand.id,
|
|
78
366
|
mongoQuery: JSON.stringify(config.mongoQuery),
|
|
79
367
|
queryParams: JSON.stringify(config.queryParams),
|
|
80
368
|
collectionName: config.collectionName,
|
|
81
369
|
resultObjectMapping: JSON.stringify(config.resultObjectMapping),
|
|
82
|
-
brandIdFieldPath:
|
|
370
|
+
brandIdFieldPath: brandScope.fieldPath,
|
|
83
371
|
sort: (config.sort !== undefined && Array.isArray(config.sort) && config.sort.length > 0) ? JSON.stringify(config.sort) : "",
|
|
372
|
+
expandRelations: config.expandRelations === true,
|
|
373
|
+
relatedRecordFilters: (config.relatedRecordFilters !== undefined && Array.isArray(config.relatedRecordFilters) && config.relatedRecordFilters.length > 0)
|
|
374
|
+
? JSON.stringify(config.relatedRecordFilters)
|
|
375
|
+
: "",
|
|
376
|
+
})));
|
|
377
|
+
}
|
|
378
|
+
async list(brand) {
|
|
379
|
+
const records = (await NamedQuery.find({
|
|
380
|
+
branding: brand.id
|
|
381
|
+
}));
|
|
382
|
+
return records.map((r) => ({
|
|
383
|
+
name: r.name,
|
|
384
|
+
collectionName: r.collectionName,
|
|
385
|
+
mongoQuery: parseSerializedValue(r.mongoQuery, {}),
|
|
386
|
+
queryParams: parseSerializedValue(r.queryParams, {}),
|
|
387
|
+
resultObjectMapping: parseSerializedValue(r.resultObjectMapping, {}),
|
|
388
|
+
brandIdFieldPath: r.brandIdFieldPath || undefined,
|
|
389
|
+
sort: r.sort ? parseSerializedValue(r.sort, []) : undefined,
|
|
390
|
+
expandRelations: r.expandRelations || false,
|
|
391
|
+
relatedRecordFilters: r.relatedRecordFilters ? parseSerializedValue(r.relatedRecordFilters, []) : undefined,
|
|
84
392
|
}));
|
|
85
393
|
}
|
|
394
|
+
async update(brand, name, config) {
|
|
395
|
+
const key = `${brand.id}_${name}`;
|
|
396
|
+
const existing = await NamedQuery.findOne({ key });
|
|
397
|
+
if (!existing) {
|
|
398
|
+
throw new Error(`Named query '${name}' not found`);
|
|
399
|
+
}
|
|
400
|
+
const brandScope = this.resolveBrandScope(config.collectionName);
|
|
401
|
+
const updated = await (0, rxjs_1.firstValueFrom)(super.getObservable(NamedQuery.updateOne({ key }).set({
|
|
402
|
+
name: name,
|
|
403
|
+
branding: brand.id,
|
|
404
|
+
mongoQuery: JSON.stringify(config.mongoQuery),
|
|
405
|
+
queryParams: JSON.stringify(config.queryParams),
|
|
406
|
+
collectionName: config.collectionName,
|
|
407
|
+
resultObjectMapping: JSON.stringify(config.resultObjectMapping),
|
|
408
|
+
brandIdFieldPath: brandScope.fieldPath,
|
|
409
|
+
sort: (config.sort !== undefined && Array.isArray(config.sort) && config.sort.length > 0) ? JSON.stringify(config.sort) : "",
|
|
410
|
+
expandRelations: config.expandRelations === true,
|
|
411
|
+
relatedRecordFilters: (config.relatedRecordFilters !== undefined && Array.isArray(config.relatedRecordFilters) && config.relatedRecordFilters.length > 0)
|
|
412
|
+
? JSON.stringify(config.relatedRecordFilters)
|
|
413
|
+
: "",
|
|
414
|
+
})));
|
|
415
|
+
if (!updated) {
|
|
416
|
+
throw new Error(`Named query '${name}' not found`);
|
|
417
|
+
}
|
|
418
|
+
return updated;
|
|
419
|
+
}
|
|
420
|
+
async delete(brand, name) {
|
|
421
|
+
const key = `${brand.id}_${name}`;
|
|
422
|
+
const existing = await NamedQuery.findOne({ key });
|
|
423
|
+
if (!existing) {
|
|
424
|
+
throw new Error(`Named query '${name}' not found`);
|
|
425
|
+
}
|
|
426
|
+
return (0, rxjs_1.firstValueFrom)(super.getObservable(NamedQuery.destroyOne({ key })));
|
|
427
|
+
}
|
|
86
428
|
async getNamedQueryConfig(brand, namedQuery) {
|
|
87
429
|
const nQDBEntry = await NamedQuery.findOne({
|
|
88
430
|
key: brand.id + "_" + namedQuery
|
|
89
431
|
});
|
|
90
|
-
|
|
432
|
+
if (nQDBEntry) {
|
|
433
|
+
return new NamedQueryConfig(nQDBEntry);
|
|
434
|
+
}
|
|
435
|
+
return null;
|
|
91
436
|
}
|
|
92
|
-
|
|
437
|
+
getSupportedCollections() {
|
|
438
|
+
const collections = _.get(sails.config, ['namedQuery', 'supportedCollections'], []);
|
|
439
|
+
return Array.isArray(collections) ? collections.filter((c) => typeof c === 'string') : [];
|
|
440
|
+
}
|
|
441
|
+
async performNamedQuery(_brandIdFieldPath, resultObjectMapping, collectionName, mongoQuery, queryParams, paramMap, brand, start, rows, _user = undefined, sort = undefined, expandRelations = false, relatedRecordFilters = []) {
|
|
93
442
|
const criteriaMeta = { enableExperimentalDeepTargets: true };
|
|
94
443
|
this.setParamsInQuery(mongoQuery, queryParams, paramMap);
|
|
444
|
+
if (relatedRecordFilters && relatedRecordFilters.length > 0) {
|
|
445
|
+
for (const filter of relatedRecordFilters) {
|
|
446
|
+
const filterModel = sails.models[filter.collectionName];
|
|
447
|
+
if (!filterModel) {
|
|
448
|
+
sails.log.warn(`Skipping related record filter: model '${filter.collectionName}' not found for collectionName='${filter.collectionName}', localField='${filter.localField}', foreignField='${filter.foreignField}'`);
|
|
449
|
+
continue;
|
|
450
|
+
}
|
|
451
|
+
const filterMongoQuery = _.cloneDeep(filter.mongoQuery);
|
|
452
|
+
const filterQueryParams = _.pickBy(queryParams, (queryParam) => _.has(filterMongoQuery, queryParam.path));
|
|
453
|
+
this.setParamsInQuery(filterMongoQuery, filterQueryParams, paramMap);
|
|
454
|
+
const relatedRecords = await filterModel.find({ where: filterMongoQuery, select: [filter.foreignField] }).meta(criteriaMeta);
|
|
455
|
+
const relatedIds = _.uniq(relatedRecords.map((relatedRecord) => _.get(relatedRecord, filter.foreignField)).filter((id) => id != null && id !== ''));
|
|
456
|
+
const existingLocalFieldFilter = this.getMongoQueryValue(mongoQuery, filter.localField);
|
|
457
|
+
const existingRelatedIds = _.isPlainObject(existingLocalFieldFilter) ? _.get(existingLocalFieldFilter, '$in') : undefined;
|
|
458
|
+
if (Array.isArray(existingRelatedIds)) {
|
|
459
|
+
this.setMongoQueryValue(mongoQuery, filter.localField, {
|
|
460
|
+
$in: _.intersection(existingRelatedIds, relatedIds)
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
else {
|
|
464
|
+
this.setMongoQueryValue(mongoQuery, filter.localField, { $in: relatedIds });
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
const brandScope = this.resolveBrandScope(collectionName);
|
|
95
469
|
const that = this;
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
mongoQuery[brandIdFieldPath] = brand.id;
|
|
470
|
+
if (brandScope.type === 'userRoles') {
|
|
471
|
+
return this.performUserNamedQuery(resultObjectMapping, mongoQuery, brand, start, rows, sort);
|
|
99
472
|
}
|
|
100
|
-
|
|
473
|
+
this.setMongoQueryValue(mongoQuery, brandScope.fieldPath, brand.id);
|
|
474
|
+
const waterlineQuery = this.flattenDeepTargetCriteria(mongoQuery);
|
|
475
|
+
sails.log.debug("Mongo query to be executed", waterlineQuery);
|
|
101
476
|
// Get the total count of matching records
|
|
102
477
|
let totalItems = 0;
|
|
103
|
-
|
|
104
|
-
|
|
478
|
+
const model = this.getModel(collectionName);
|
|
479
|
+
if (!model) {
|
|
480
|
+
throw new Error(`Model ${collectionName} not found`);
|
|
481
|
+
}
|
|
482
|
+
let results = [];
|
|
483
|
+
if (collectionName === 'record') {
|
|
484
|
+
const nativeCollection = await this.getNativeRecordCollection(model);
|
|
485
|
+
const nativeCriteria = this.toNativeMongoCriteria(waterlineQuery);
|
|
486
|
+
totalItems = await nativeCollection.countDocuments(nativeCriteria);
|
|
487
|
+
if (totalItems > 0) {
|
|
488
|
+
let nativeQuery = nativeCollection.find(nativeCriteria);
|
|
489
|
+
const nativeSort = this.toNativeMongoSort(sort);
|
|
490
|
+
if (!_.isEmpty(nativeSort)) {
|
|
491
|
+
nativeQuery = nativeQuery.sort(nativeSort);
|
|
492
|
+
}
|
|
493
|
+
results = await nativeQuery.skip(start).limit(rows).toArray();
|
|
494
|
+
}
|
|
105
495
|
}
|
|
106
496
|
else {
|
|
107
|
-
|
|
497
|
+
const count = model.count;
|
|
498
|
+
if (typeof count !== 'function') {
|
|
499
|
+
throw new Error(`Model ${collectionName} does not expose count`);
|
|
500
|
+
}
|
|
501
|
+
const countFn = count;
|
|
502
|
+
totalItems = await countFn(waterlineQuery).meta(criteriaMeta);
|
|
108
503
|
}
|
|
109
504
|
// Build query criteria
|
|
110
505
|
const criteria = {
|
|
111
|
-
where:
|
|
506
|
+
where: waterlineQuery,
|
|
112
507
|
skip: start,
|
|
113
508
|
limit: rows,
|
|
114
509
|
};
|
|
@@ -119,69 +514,55 @@ var Services;
|
|
|
119
514
|
}
|
|
120
515
|
// Run query
|
|
121
516
|
sails.log.debug("Mongo query criteria", criteria);
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
if (
|
|
125
|
-
|
|
126
|
-
}
|
|
127
|
-
else {
|
|
128
|
-
results = await Record.find(criteria).meta(criteriaMeta);
|
|
517
|
+
if (collectionName !== 'record' && totalItems > 0) {
|
|
518
|
+
const find = model.find;
|
|
519
|
+
if (typeof find !== 'function') {
|
|
520
|
+
throw new Error(`Model ${collectionName} does not expose find`);
|
|
129
521
|
}
|
|
522
|
+
const findFn = find;
|
|
523
|
+
results = await findFn(criteria).meta(criteriaMeta);
|
|
130
524
|
}
|
|
131
525
|
const responseRecords = [];
|
|
526
|
+
const recordsService = sails.services.recordsservice;
|
|
527
|
+
const expandRelationsActual = expandRelations === true && collectionName === 'record';
|
|
528
|
+
if (expandRelations === true && collectionName !== 'record') {
|
|
529
|
+
sails.log.debug(`expandRelations is only supported for the 'record' collection; ignoring for '${collectionName}'`);
|
|
530
|
+
}
|
|
531
|
+
// 'user' collections are scoped and rendered separately via performUserNamedQuery,
|
|
532
|
+
// so anything reaching this loop is a record-like (record or scoped dynamic) model.
|
|
132
533
|
for (const record of results) {
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
const resultMetadata = _.cloneDeep(resultObjectMapping);
|
|
139
|
-
_.forOwn(resultObjectMapping, function (value, key) {
|
|
140
|
-
_.set(resultMetadata, key, that.runTemplate(value, variables));
|
|
141
|
-
});
|
|
142
|
-
defaultMetadata = resultMetadata;
|
|
534
|
+
const recordItem = record;
|
|
535
|
+
if (expandRelationsActual && recordsService && recordItem.redboxOid) {
|
|
536
|
+
try {
|
|
537
|
+
const relationships = await recordsService.getRelatedRecords(recordItem.redboxOid, brand);
|
|
538
|
+
recordItem.relationships = relationships;
|
|
143
539
|
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
type: that.runTemplate('record.type', variables),
|
|
147
|
-
name: that.runTemplate('record.name', variables),
|
|
148
|
-
email: that.runTemplate('record.email', variables),
|
|
149
|
-
username: that.runTemplate('record.username', variables),
|
|
150
|
-
lastLogin: that.runTemplate('record.lastLogin', variables)
|
|
151
|
-
};
|
|
540
|
+
catch (err) {
|
|
541
|
+
sails.log.warn(`Failed to fetch relationships for record ${recordItem.redboxOid}`, err);
|
|
152
542
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
543
|
+
}
|
|
544
|
+
let defaultMetadata = {};
|
|
545
|
+
const variables = { record: recordItem };
|
|
546
|
+
if (!_.isEmpty(resultObjectMapping)) {
|
|
547
|
+
const resultMetadata = _.cloneDeep(resultObjectMapping);
|
|
548
|
+
_.forOwn(resultObjectMapping, function (value, key) {
|
|
549
|
+
_.set(resultMetadata, key, that.runTemplate(value, variables));
|
|
159
550
|
});
|
|
160
|
-
|
|
551
|
+
defaultMetadata = resultMetadata;
|
|
161
552
|
}
|
|
162
553
|
else {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
if (!_.isEmpty(resultObjectMapping)) {
|
|
167
|
-
const resultMetadata = _.cloneDeep(resultObjectMapping);
|
|
168
|
-
_.forOwn(resultObjectMapping, function (value, key) {
|
|
169
|
-
_.set(resultMetadata, key, that.runTemplate(value, variables));
|
|
170
|
-
});
|
|
171
|
-
defaultMetadata = resultMetadata;
|
|
172
|
-
}
|
|
173
|
-
else {
|
|
174
|
-
defaultMetadata = that.runTemplate('record.metadata', variables);
|
|
175
|
-
}
|
|
176
|
-
const responseRecord = new NamedQueryResponseRecord({
|
|
177
|
-
oid: recordItem.redboxOid ?? '',
|
|
178
|
-
title: recordItem.metadata?.title ?? '',
|
|
179
|
-
metadata: defaultMetadata,
|
|
180
|
-
lastSaveDate: recordItem.lastSaveDate ?? null,
|
|
181
|
-
dateCreated: recordItem.dateCreated ?? null
|
|
182
|
-
});
|
|
183
|
-
responseRecords.push(responseRecord);
|
|
554
|
+
defaultMetadata = collectionName === 'record'
|
|
555
|
+
? that.runTemplate('record.metadata', variables)
|
|
556
|
+
: recordItem;
|
|
184
557
|
}
|
|
558
|
+
const responseRecord = new NamedQueryResponseRecord({
|
|
559
|
+
oid: recordItem.redboxOid ?? getIdentifierProperty(recordItem, 'id') ?? '',
|
|
560
|
+
title: getStringProperty(recordItem.metadata, 'title') ?? getStringProperty(recordItem, 'name') ?? getStringProperty(recordItem, 'title') ?? '',
|
|
561
|
+
metadata: defaultMetadata,
|
|
562
|
+
lastSaveDate: recordItem.lastSaveDate ?? null,
|
|
563
|
+
dateCreated: recordItem.dateCreated ?? null
|
|
564
|
+
});
|
|
565
|
+
responseRecords.push(responseRecord);
|
|
185
566
|
}
|
|
186
567
|
const response = new ListAPIResponse_1.ListAPIResponse();
|
|
187
568
|
const startIndex = start;
|
|
@@ -193,44 +574,135 @@ var Services;
|
|
|
193
574
|
response.summary.numFound = totalItems;
|
|
194
575
|
return response;
|
|
195
576
|
}
|
|
577
|
+
async performUserNamedQuery(resultObjectMapping, mongoQuery, brand, start, rows, sort = undefined) {
|
|
578
|
+
const criteriaMeta = { enableExperimentalDeepTargets: true };
|
|
579
|
+
const model = this.getModel('user');
|
|
580
|
+
if (!model) {
|
|
581
|
+
throw new Error(`Invalid collectionName 'user': model not found`);
|
|
582
|
+
}
|
|
583
|
+
const userModel = model;
|
|
584
|
+
const criteria = { where: mongoQuery };
|
|
585
|
+
if (sort !== undefined && Array.isArray(sort) && (sort?.length ?? 0) > 0) {
|
|
586
|
+
criteria.sort = sort;
|
|
587
|
+
}
|
|
588
|
+
let query = userModel.find(criteria);
|
|
589
|
+
if (query && typeof query.populate === 'function') {
|
|
590
|
+
query = query.populate('roles');
|
|
591
|
+
}
|
|
592
|
+
const allUsers = query && typeof query.meta === 'function'
|
|
593
|
+
? await query.meta(criteriaMeta)
|
|
594
|
+
: await query;
|
|
595
|
+
const brandId = String(brand.id);
|
|
596
|
+
const linkedSecondaryUserIds = await this.getLinkedSecondaryUserIds(brandId);
|
|
597
|
+
const scopedUsers = allUsers
|
|
598
|
+
.filter((user) => this.hasRoleInBrand(user, brandId) || linkedSecondaryUserIds.has(String(user.id ?? '')))
|
|
599
|
+
.map((user) => this.sanitizeUserForNamedQuery(user));
|
|
600
|
+
const pagedUsers = scopedUsers.slice(start, start + rows);
|
|
601
|
+
const responseRecords = [];
|
|
602
|
+
for (const userRecord of pagedUsers) {
|
|
603
|
+
let defaultMetadata = {};
|
|
604
|
+
const variables = { record: userRecord };
|
|
605
|
+
if (!_.isEmpty(resultObjectMapping)) {
|
|
606
|
+
const resultMetadata = _.cloneDeep(resultObjectMapping);
|
|
607
|
+
_.forOwn(resultObjectMapping, (value, key) => {
|
|
608
|
+
_.set(resultMetadata, key, this.runTemplate(value, variables));
|
|
609
|
+
});
|
|
610
|
+
defaultMetadata = resultMetadata;
|
|
611
|
+
}
|
|
612
|
+
else {
|
|
613
|
+
defaultMetadata = {
|
|
614
|
+
type: this.runTemplate('record.type', variables),
|
|
615
|
+
name: this.runTemplate('record.name', variables),
|
|
616
|
+
email: this.runTemplate('record.email', variables),
|
|
617
|
+
username: this.runTemplate('record.username', variables),
|
|
618
|
+
lastLogin: this.runTemplate('record.lastLogin', variables)
|
|
619
|
+
};
|
|
620
|
+
}
|
|
621
|
+
responseRecords.push(new NamedQueryResponseRecord({
|
|
622
|
+
oid: '',
|
|
623
|
+
title: '',
|
|
624
|
+
metadata: defaultMetadata,
|
|
625
|
+
lastSaveDate: userRecord.updatedAt ?? null,
|
|
626
|
+
dateCreated: userRecord.createdAt ?? null
|
|
627
|
+
}));
|
|
628
|
+
}
|
|
629
|
+
const response = new ListAPIResponse_1.ListAPIResponse();
|
|
630
|
+
response.records = responseRecords;
|
|
631
|
+
response.summary.start = start;
|
|
632
|
+
response.summary.page = Math.floor((start / rows) + 1);
|
|
633
|
+
response.summary.numFound = scopedUsers.length;
|
|
634
|
+
return response;
|
|
635
|
+
}
|
|
196
636
|
setParamsInQuery(mongoQuery, queryParams, paramMap) {
|
|
197
637
|
for (const queryParamKey in queryParams) {
|
|
198
638
|
let value = paramMap[queryParamKey];
|
|
199
639
|
const queryParam = queryParams[queryParamKey];
|
|
200
640
|
sails.log.debug(`${queryParamKey} has value ${value}`);
|
|
201
|
-
if (value
|
|
641
|
+
if (_.isUndefined(value) && queryParam.required === true) {
|
|
202
642
|
throw Error(`${queryParamKey} is a required parameter`);
|
|
203
643
|
}
|
|
644
|
+
if (_.isUndefined(value)) {
|
|
645
|
+
if (queryParam.whenUndefined == NamedQueryWhenUndefinedOptions.ignore) {
|
|
646
|
+
this.unsetMongoQueryValue(mongoQuery, queryParam.path);
|
|
647
|
+
continue;
|
|
648
|
+
}
|
|
649
|
+
if (queryParam.whenUndefined == NamedQueryWhenUndefinedOptions.defaultValue) {
|
|
650
|
+
value = queryParam.defaultValue;
|
|
651
|
+
}
|
|
652
|
+
}
|
|
204
653
|
if (!_.isEmpty(queryParam.template)) {
|
|
205
654
|
value = this.runTemplate(queryParam.template, { value: value, queryParams: queryParams, paramMap: paramMap });
|
|
206
655
|
}
|
|
207
656
|
if (queryParam.type == DataType.Number) {
|
|
208
|
-
|
|
657
|
+
if (!_.isUndefined(value) && value !== null && value !== '') {
|
|
658
|
+
value = _.toNumber(value);
|
|
659
|
+
}
|
|
209
660
|
}
|
|
210
|
-
if (queryParam.type == DataType.
|
|
211
|
-
if (!_.
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
661
|
+
if (queryParam.type == DataType.Boolean) {
|
|
662
|
+
if (!_.isUndefined(value)) {
|
|
663
|
+
if (typeof value === 'string') {
|
|
664
|
+
value = value.toLowerCase() === 'true';
|
|
665
|
+
}
|
|
666
|
+
else {
|
|
667
|
+
value = Boolean(value);
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
if (queryParam.type == DataType.Array) {
|
|
672
|
+
if (!_.isUndefined(value) && !Array.isArray(value)) {
|
|
673
|
+
if (typeof value === 'string') {
|
|
674
|
+
const trimmed = value.trim();
|
|
675
|
+
if (trimmed === '') {
|
|
676
|
+
value = [];
|
|
677
|
+
}
|
|
678
|
+
else if (trimmed.startsWith('[')) {
|
|
679
|
+
const parsed = parseSerializedValue(trimmed, [value]);
|
|
680
|
+
value = Array.isArray(parsed) ? parsed : [value];
|
|
681
|
+
}
|
|
682
|
+
else {
|
|
683
|
+
value = [value];
|
|
217
684
|
}
|
|
218
685
|
}
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
value = query;
|
|
686
|
+
else {
|
|
687
|
+
value = value !== null && value !== '' ? [value] : [];
|
|
222
688
|
}
|
|
223
689
|
}
|
|
224
690
|
}
|
|
691
|
+
if (queryParam.type == DataType.Object && !_.isUndefined(value)) {
|
|
692
|
+
value = parseObjectParamValue(queryParamKey, value);
|
|
693
|
+
}
|
|
694
|
+
if (queryParam.type != DataType.Date &&
|
|
695
|
+
!_.isEmpty(queryParam.queryType)) {
|
|
696
|
+
const query = {};
|
|
697
|
+
if (value != undefined || (value == undefined && queryParam.whenUndefined != NamedQueryWhenUndefinedOptions.ignore)) {
|
|
698
|
+
query[queryParam.queryType] = value;
|
|
699
|
+
value = query;
|
|
700
|
+
}
|
|
701
|
+
}
|
|
225
702
|
if (queryParam.type == DataType.Date) {
|
|
226
703
|
if (!_.isEmpty(queryParam.queryType)) {
|
|
227
704
|
const query = {};
|
|
228
|
-
if (_.isUndefined(value)) {
|
|
229
|
-
if (queryParam.whenUndefined == NamedQueryWhenUndefinedOptions.defaultValue) {
|
|
230
|
-
value = queryParam.defaultValue;
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
if (queryParam.format == NamedQueryFormatOptions.days) {
|
|
705
|
+
if (queryParam.format == NamedQueryFormatOptions.days && !_.isUndefined(value)) {
|
|
234
706
|
let days = _.toInteger(value);
|
|
235
707
|
let nowDateAddOrSubtract = luxon_1.DateTime.local();
|
|
236
708
|
if (days > 0) {
|
|
@@ -250,23 +722,32 @@ var Services;
|
|
|
250
722
|
}
|
|
251
723
|
}
|
|
252
724
|
if (value == undefined && queryParam.whenUndefined == NamedQueryWhenUndefinedOptions.ignore) {
|
|
253
|
-
|
|
725
|
+
this.unsetMongoQueryValue(mongoQuery, queryParam.path);
|
|
254
726
|
}
|
|
255
727
|
else {
|
|
256
|
-
const existingValue =
|
|
257
|
-
if (existingValue
|
|
728
|
+
const existingValue = this.getMongoQueryValue(mongoQuery, queryParam.path);
|
|
729
|
+
if (_.isPlainObject(existingValue) && _.isPlainObject(value)) {
|
|
258
730
|
_.merge(value, existingValue);
|
|
259
731
|
}
|
|
260
|
-
|
|
732
|
+
this.setMongoQueryValue(mongoQuery, queryParam.path, value);
|
|
261
733
|
}
|
|
262
734
|
}
|
|
263
735
|
return mongoQuery;
|
|
264
736
|
}
|
|
265
737
|
runTemplate(templateOrPath, variables) {
|
|
266
|
-
|
|
267
|
-
|
|
738
|
+
const templateVars = { ...variables };
|
|
739
|
+
if (templateOrPath && templateOrPath.indexOf('{{') != -1) {
|
|
740
|
+
try {
|
|
741
|
+
ensureNamedQueryHandlebarsHelpers();
|
|
742
|
+
const compiledTemplate = handlebars_1.default.compile(templateOrPath, { noEscape: true });
|
|
743
|
+
return compiledTemplate(templateVars);
|
|
744
|
+
}
|
|
745
|
+
catch (err) {
|
|
746
|
+
sails.log.error(`Template compilation failed for ${templateOrPath}`, err);
|
|
747
|
+
throw err;
|
|
748
|
+
}
|
|
268
749
|
}
|
|
269
|
-
return _.get(
|
|
750
|
+
return _.get(templateVars, templateOrPath);
|
|
270
751
|
}
|
|
271
752
|
async performNamedQueryFromConfig(config, paramMap, brand, start, rows, user) {
|
|
272
753
|
sails.log.debug("performNamedQueryFromConfig with parameters", {
|
|
@@ -279,11 +760,12 @@ var Services;
|
|
|
279
760
|
});
|
|
280
761
|
const collectionName = _.get(config, 'collectionName', '') ?? '';
|
|
281
762
|
const resultObjectMapping = _.get(config, 'resultObjectMapping', {}) ?? {};
|
|
282
|
-
const
|
|
283
|
-
const mongoQuery = _.clone(_.get(config, 'mongoQuery', {}) ?? {});
|
|
763
|
+
const mongoQuery = _.cloneDeep(_.get(config, 'mongoQuery', {}) ?? {});
|
|
284
764
|
const queryParams = (_.get(config, 'queryParams', {}) ?? {});
|
|
285
|
-
const sort = _.get(config, 'sort', []) ?? [];
|
|
286
|
-
|
|
765
|
+
const sort = _.cloneDeep(_.get(config, 'sort', []) ?? []);
|
|
766
|
+
const expandRelations = _.get(config, 'expandRelations', false);
|
|
767
|
+
const relatedRecordFilters = _.cloneDeep(_.get(config, 'relatedRecordFilters', []) ?? []);
|
|
768
|
+
return await this.performNamedQuery('', resultObjectMapping, collectionName, mongoQuery, queryParams, paramMap, brand, start, rows, user, sort, expandRelations, relatedRecordFilters);
|
|
287
769
|
}
|
|
288
770
|
async performNamedQueryFromConfigResults(config, paramMap, brand, queryName, start = 0, rows = 30, maxRecords = 100, user = undefined) {
|
|
289
771
|
const records = [];
|
|
@@ -311,9 +793,10 @@ var Services;
|
|
|
311
793
|
}
|
|
312
794
|
// update the start point
|
|
313
795
|
start = currentRetrievedCount;
|
|
314
|
-
// Check the number of records and
|
|
796
|
+
// Check the number of records and stop if it exceeds maxRecords.
|
|
315
797
|
if (records.length > maxRecords) {
|
|
316
798
|
sails.log.warn(`All named query results: returning early before finished with ${records.length} results for '${queryName}' from ${requestCount} requests because the number of records is more than max records ${maxRecords}`);
|
|
799
|
+
break;
|
|
317
800
|
}
|
|
318
801
|
// continue the while loop
|
|
319
802
|
}
|
|
@@ -328,6 +811,9 @@ var DataType;
|
|
|
328
811
|
DataType["Date"] = "date";
|
|
329
812
|
DataType["Number"] = "number";
|
|
330
813
|
DataType["String"] = "string";
|
|
814
|
+
DataType["Boolean"] = "boolean";
|
|
815
|
+
DataType["Array"] = "array";
|
|
816
|
+
DataType["Object"] = "object";
|
|
331
817
|
})(DataType || (DataType = {}));
|
|
332
818
|
var NamedQueryWhenUndefinedOptions;
|
|
333
819
|
(function (NamedQueryWhenUndefinedOptions) {
|
|
@@ -349,6 +835,13 @@ class QueryParameterDefinition {
|
|
|
349
835
|
path = '';
|
|
350
836
|
template = '';
|
|
351
837
|
}
|
|
838
|
+
class RelatedRecordFilter {
|
|
839
|
+
collectionName = '';
|
|
840
|
+
mongoQuery = {};
|
|
841
|
+
localField = '';
|
|
842
|
+
foreignField = '';
|
|
843
|
+
}
|
|
844
|
+
exports.RelatedRecordFilter = RelatedRecordFilter;
|
|
352
845
|
class NamedQueryConfig {
|
|
353
846
|
name;
|
|
354
847
|
branding;
|
|
@@ -362,19 +855,23 @@ class NamedQueryConfig {
|
|
|
362
855
|
resultObjectMapping;
|
|
363
856
|
brandIdFieldPath;
|
|
364
857
|
sort;
|
|
858
|
+
expandRelations;
|
|
859
|
+
relatedRecordFilters;
|
|
365
860
|
constructor(values) {
|
|
366
861
|
this.name = values?.name ?? '';
|
|
367
|
-
this.branding = values?.branding
|
|
862
|
+
this.branding = values?.branding != null ? String(values.branding) : '';
|
|
368
863
|
this.metadata = values?.metadata;
|
|
369
864
|
this.createdAt = values?.createdAt ?? '';
|
|
370
865
|
this.updatedAt = values?.updatedAt ?? '';
|
|
371
866
|
this.key = values?.key ?? '';
|
|
372
|
-
this.queryParams =
|
|
373
|
-
this.mongoQuery =
|
|
867
|
+
this.queryParams = parseSerializedValue(values?.queryParams, {});
|
|
868
|
+
this.mongoQuery = parseSerializedValue(values?.mongoQuery, {});
|
|
374
869
|
this.collectionName = values?.collectionName ?? '';
|
|
375
|
-
this.resultObjectMapping =
|
|
870
|
+
this.resultObjectMapping = parseSerializedValue(values?.resultObjectMapping, {});
|
|
376
871
|
this.brandIdFieldPath = values?.brandIdFieldPath ?? '';
|
|
377
|
-
this.sort =
|
|
872
|
+
this.sort = parseSerializedValue(values?.sort, []);
|
|
873
|
+
this.expandRelations = values?.expandRelations === true || values?.expandRelations === 'true';
|
|
874
|
+
this.relatedRecordFilters = parseSerializedValue(values?.relatedRecordFilters, []);
|
|
378
875
|
}
|
|
379
876
|
}
|
|
380
877
|
exports.NamedQueryConfig = NamedQueryConfig;
|
|
@@ -393,4 +890,4 @@ class NamedQueryResponseRecord {
|
|
|
393
890
|
}
|
|
394
891
|
}
|
|
395
892
|
exports.NamedQueryResponseRecord = NamedQueryResponseRecord;
|
|
396
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmFtZWRRdWVyeVNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvTmFtZWRRdWVyeVNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDBGQUEwRjtBQUMxRixFQUFFO0FBQ0YsNkJBQTZCO0FBQzdCLDBCQUEwQjtBQUMxQixFQUFFO0FBQ0YsdUVBQXVFO0FBQ3ZFLHVFQUF1RTtBQUN2RSxvRUFBb0U7QUFDcEUsc0NBQXNDO0FBQ3RDLEVBQUU7QUFDRixrRUFBa0U7QUFDbEUsaUVBQWlFO0FBQ2pFLGdFQUFnRTtBQUNoRSwrQ0FBK0M7QUFDL0MsRUFBRTtBQUNGLDBFQUEwRTtBQUMxRSwwRUFBMEU7QUFDMUUsOERBQThEOzs7QUFFOUQsZ0RBQXNEO0FBRXRELGlDQUFpQztBQUVqQyw4REFBMkQ7QUFDM0QsK0JBQXNDO0FBUXRDLE1BQU0sU0FBUyxHQUFHLENBQUksS0FBYyxFQUFFLFFBQVcsRUFBSyxFQUFFO0lBQ3RELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDcEQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUNELElBQUksQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQU0sQ0FBQztJQUNoQyxDQUFDO0lBQUMsT0FBTyxNQUFNLEVBQUUsQ0FBQztRQUNoQixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsSUFBaUIsUUFBUSxDQTRWeEI7QUE1VkQsV0FBaUIsUUFBUTtJQUl2Qjs7O09BR0c7SUFDSCxNQUFhLGlCQUFrQixTQUFRLHNCQUFRLENBQUMsSUFBSSxDQUFDLE9BQU87UUFJdkMsZ0JBQWdCLEdBQWE7WUFDOUMsV0FBVztZQUNYLHFCQUFxQjtZQUNyQixtQkFBbUI7WUFDbkIsNkJBQTZCO1lBQzdCLG9DQUFvQztTQUNyQyxDQUFD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
|
|
893
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmFtZWRRdWVyeVNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvTmFtZWRRdWVyeVNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDBGQUEwRjtBQUMxRixFQUFFO0FBQ0YsNkJBQTZCO0FBQzdCLDBCQUEwQjtBQUMxQixFQUFFO0FBQ0YsdUVBQXVFO0FBQ3ZFLHVFQUF1RTtBQUN2RSxvRUFBb0U7QUFDcEUsc0NBQXNDO0FBQ3RDLEVBQUU7QUFDRixrRUFBa0U7QUFDbEUsaUVBQWlFO0FBQ2pFLGdFQUFnRTtBQUNoRSwrQ0FBK0M7QUFDL0MsRUFBRTtBQUNGLDBFQUEwRTtBQUMxRSwwRUFBMEU7QUFDMUUsOERBQThEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFOUQsZ0RBQXNEO0FBRXRELHFEQUF1QztBQUN2QyxnREFBa0M7QUFDbEMsaUNBQWlDO0FBQ2pDLDREQUFvQztBQUNwQyxzRUFBbUY7QUFFbkYsOERBQTJEO0FBQzNELCtCQUFzQztBQTZCdEMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxLQUFjLEVBQXNCLEVBQUUsQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQztBQUUxRyxNQUFNLGlCQUFpQixHQUFHLENBQUMsS0FBYyxFQUFFLFlBQW9CLEVBQXNCLEVBQUU7SUFDckYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzFCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDMUMsT0FBTyxPQUFPLGFBQWEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3ZFLENBQUMsQ0FBQztBQUVGLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxLQUFjLEVBQUUsWUFBb0IsRUFBc0IsRUFBRTtJQUN6RixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDMUIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMxQyxJQUFJLE9BQU8sYUFBYSxLQUFLLFFBQVEsSUFBSSxPQUFPLGFBQWEsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMzRSxPQUFPLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxvQkFBb0IsR0FBRyxDQUFJLEtBQWMsRUFBRSxRQUFXLEVBQUssRUFBRTtJQUNqRSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN2QixPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO1FBQ0QsSUFBSSxDQUFDO1lBQ0gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBTSxDQUFDO1FBQ2hDLENBQUM7UUFBQyxPQUFPLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUMxQyxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsT0FBTyxLQUFVLENBQUM7QUFDcEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLGFBQXFCLEVBQUUsS0FBYyxFQUEyQixFQUFFO0lBQy9GLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzNCLE9BQU8sS0FBZ0MsQ0FBQztJQUMxQyxDQUFDO0lBRUQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUM7WUFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBWSxDQUFDO1lBQzVDLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUM1QixPQUFPLE1BQWlDLENBQUM7WUFDM0MsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLE1BQU0sS0FBSyxDQUFDLEdBQUcsYUFBYSw4QkFBOEIsQ0FBQyxDQUFDO1FBQzlELENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxLQUFLLENBQUMsR0FBRyxhQUFhLDhCQUE4QixDQUFDLENBQUM7QUFDOUQsQ0FBQyxDQUFDO0FBRUYsTUFBTSwyQkFBMkIsR0FBRyxnQkFBZ0IsQ0FBQztBQUVyRCxJQUFJLHFDQUFxQyxHQUFHLEtBQUssQ0FBQztBQUVsRCxNQUFNLGlDQUFpQyxHQUFHLEdBQUcsRUFBRTtJQUM3QyxJQUFJLHFDQUFxQyxFQUFFLENBQUM7UUFDMUMsT0FBTztJQUNULENBQUM7SUFFRCxJQUFBLGlEQUErQixFQUFDLG9CQUFVLENBQUMsQ0FBQztJQUM1QyxxQ0FBcUMsR0FBRyxJQUFJLENBQUM7QUFDL0MsQ0FBQyxDQUFDO0FBRUYsSUFBaUIsUUFBUSxDQW94QnhCO0FBcHhCRCxXQUFpQixRQUFRO0lBSXZCOzs7T0FHRztJQUNILE1BQWEsaUJBQWtCLFNBQVEsc0JBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTztRQUl2QyxnQkFBZ0IsR0FBYTtZQUM5QyxlQUFlO1lBQ2YscUJBQXFCO1lBQ3JCLHlCQUF5QjtZQUN6QixtQkFBbUI7WUFDbkIsNkJBQTZCO1lBQzdCLG9DQUFvQztZQUNwQyxRQUFRO1lBQ1IsTUFBTTtZQUNOLFFBQVE7WUFDUixRQUFRO1NBQ1QsQ0FBQztRQUVLLEtBQUssQ0FBQyxhQUFhLENBQUMsUUFBdUI7WUFDaEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDbEQsSUFBSSxTQUFTLEdBQWEsRUFBRSxDQUFDO1lBQzdCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBRTNDLElBQUksQ0FBQztnQkFDSCxNQUFNLFdBQVcsR0FBRyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ2xGLFNBQVMsR0FBRyxXQUFXO3FCQUNwQixNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztxQkFDakUsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO3FCQUMxQixJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEMsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsTUFBTSxPQUFPLEdBQUcsS0FBOEIsQ0FBQztnQkFDL0MsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUM5QixLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyw4Q0FBOEMsYUFBYSxFQUFFLENBQUMsQ0FBQztvQkFDakYsT0FBTztnQkFDVCxDQUFDO2dCQUNELEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLG1EQUFtRCxhQUFhLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDM0YsT0FBTztZQUNULENBQUM7WUFFRCxLQUFLLE1BQU0sUUFBUSxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNqQyxJQUFJLENBQUM7b0JBQ0gsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7b0JBQ3BELE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBdUIsUUFBUSxDQUFDLENBQUM7b0JBQzNFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQzt3QkFDaEIsU0FBUztvQkFDWCxDQUFDO29CQUVELE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUM3QyxJQUFJLENBQUMsSUFBSSxJQUFJLE9BQU8sVUFBVSxDQUFDLGNBQWMsS0FBSyxRQUFRLElBQUksVUFBVSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7d0JBQ3JHLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLDRFQUE0RSxRQUFRLEVBQUUsQ0FBQyxDQUFDO3dCQUN4RyxTQUFTO29CQUNYLENBQUM7b0JBRUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsUUFBUSxDQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQzdFLElBQUksUUFBUSxFQUFFLENBQUM7d0JBQ2IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsaURBQWlELElBQUksRUFBRSxDQUFDLENBQUM7d0JBQzNFLFNBQVM7b0JBQ1gsQ0FBQztvQkFFRCxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztvQkFDOUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsNkJBQTZCLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ3pELENBQUM7Z0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztvQkFDZixLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyw4Q0FBOEMsUUFBUSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ25GLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVPLG9CQUFvQjtZQUMxQixNQUFNLGNBQWMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsNkJBQTZCLEVBQUUsMkJBQTJCLENBQUMsQ0FBQztZQUN2RyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFFUyxtQkFBbUI7WUFDM0IsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBRU8sS0FBSyxDQUFDLFlBQVksQ0FBSSxRQUFnQjtZQUM1QyxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUM1RSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFNLENBQUM7WUFDbEMsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsOENBQThDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDaEcsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztRQUVPLFFBQVEsQ0FBQyxjQUFzQjtZQUNyQyxPQUFPLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxjQUFjLENBQTBCLENBQUM7UUFDakUsQ0FBQztRQUVPLGlCQUFpQixDQUFDLGNBQXNCO1lBQzlDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO2dCQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7WUFDaEQsQ0FBQztZQUVELElBQUksY0FBYyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNoQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQztZQUM5RCxDQUFDO1lBRUQsSUFBSSxjQUFjLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQzlCLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQztZQUM5QyxDQUFDO1lBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsY0FBYyxvQkFBb0IsQ0FBQyxDQUFDO1lBQ2pGLENBQUM7WUFFRCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBaUQsQ0FBQztZQUMzRSxJQUFJLFVBQVUsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQy9FLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsQ0FBQztZQUNsRCxDQUFDO1lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsY0FBYyx3Q0FBd0MsQ0FBQyxDQUFDO1FBQ3JHLENBQUM7UUFFTyxjQUFjLENBQUMsSUFBYyxFQUFFLE9BQWU7WUFDcEQsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFrQixJQUFJLEVBQUUsRUFBRSxDQUFDLElBQWEsRUFBRSxFQUFFO2dCQUM3RCxNQUFNLE9BQU8sR0FBRyxJQUFpQixDQUFDO2dCQUNsQyxNQUFNLFFBQVEsR0FBRyxPQUFPLEVBQUUsUUFBUSxDQUFDO2dCQUNuQyxNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUUsUUFBc0IsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQzdHLE9BQU8sV0FBVyxLQUFLLE9BQU8sQ0FBQztZQUNqQyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFTyxLQUFLLENBQUMseUJBQXlCLENBQUMsT0FBZTtZQUNyRCxJQUFJLE9BQU8sUUFBUSxLQUFLLFdBQVcsRUFBRSxDQUFDO2dCQUNwQyxPQUFPLElBQUksR0FBRyxFQUFVLENBQUM7WUFDM0IsQ0FBQztZQUNELE1BQU0sV0FBVyxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQTJCLENBQUM7WUFDakcsT0FBTyxJQUFJLEdBQUcsQ0FDWixDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQWUsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFVLEVBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FDOUcsQ0FBQztRQUNKLENBQUM7UUFFTyx5QkFBeUIsQ0FBQyxJQUFjO1lBQzlDLE1BQU0sU0FBUyxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQztZQUM5QixPQUFPLFNBQVMsQ0FBQyxRQUFRLENBQUM7WUFDMUIsT0FBTyxTQUFTLENBQUMsS0FBSyxDQUFDO1lBQ3ZCLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFTyxrQkFBa0IsQ0FBQyxVQUFtQyxFQUFFLElBQVk7WUFDMUUsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzdHLENBQUM7UUFFTyxrQkFBa0IsQ0FBQyxVQUFtQyxFQUFFLElBQVksRUFBRSxLQUFjO1lBQzFGLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN2QixVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQzNCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDakMsQ0FBQztRQUNILENBQUM7UUFFTyxvQkFBb0IsQ0FBQyxVQUFtQyxFQUFFLElBQVk7WUFDNUUsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQzNELE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM1QixDQUFDO1FBQ0gsQ0FBQztRQUVPLHFCQUFxQixDQUFDLEtBQThCO1lBQzFELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUk7Z0JBQzdELFVBQVU7Z0JBQ1YsWUFBWTtnQkFDWixVQUFVO2dCQUNWLE1BQU07Z0JBQ04sR0FBRztnQkFDSCxJQUFJO2dCQUNKLEdBQUc7Z0JBQ0gsSUFBSTtnQkFDSixJQUFJO2dCQUNKLElBQUk7Z0JBQ0osS0FBSzthQUNOLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbkIsQ0FBQztRQUVPLHlCQUF5QixDQUFDLFFBQWlDLEVBQUUsTUFBTSxHQUFHLEVBQUU7WUFDOUUsTUFBTSxTQUFTLEdBQTRCLEVBQUUsQ0FBQztZQUU5QyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUNwRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBRS9DLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFnQyxDQUFDLEVBQUUsQ0FBQztvQkFDNUYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEtBQWdDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDbkcsQ0FBQztxQkFBTSxDQUFDO29CQUNOLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQzFCLENBQUM7WUFDSCxDQUFDO1lBRUQsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVPLHFCQUFxQixDQUFDLFFBQWlDO1lBQzdELE1BQU0sYUFBYSxHQUE0QixFQUFFLENBQUM7WUFDbEQsTUFBTSxXQUFXLEdBQTJCO2dCQUMxQyxHQUFHLEVBQUUsS0FBSztnQkFDVixJQUFJLEVBQUUsTUFBTTtnQkFDWixHQUFHLEVBQUUsS0FBSztnQkFDVixJQUFJLEVBQUUsTUFBTTtnQkFDWixJQUFJLEVBQUUsS0FBSztnQkFDWCxFQUFFLEVBQUUsS0FBSztnQkFDVCxHQUFHLEVBQUUsTUFBTTthQUNaLENBQUM7WUFFRixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUNwRCxJQUFJLENBQUMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDM0IsTUFBTSxXQUFXLEdBQTRCLEVBQUUsQ0FBQztvQkFDaEQsS0FBSyxNQUFNLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBZ0MsQ0FBQyxFQUFFLENBQUM7d0JBQ3pGLElBQUksUUFBUSxLQUFLLFVBQVUsRUFBRSxDQUFDOzRCQUM1QixXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDOzRCQUNqRSxXQUFXLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQzt3QkFDN0IsQ0FBQzs2QkFBTSxDQUFDOzRCQUNOLFdBQVcsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUSxDQUFDLEdBQUcsYUFBYSxDQUFDO3dCQUNqRSxDQUFDO29CQUNILENBQUM7b0JBQ0QsYUFBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFdBQVcsQ0FBQztnQkFDbkMsQ0FBQztxQkFBTSxDQUFDO29CQUNOLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQzdCLENBQUM7WUFDSCxDQUFDO1lBRUQsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQztRQUVPLGlCQUFpQixDQUFDLElBQXNDO1lBQzlELE1BQU0sU0FBUyxHQUEyQixFQUFFLENBQUM7WUFFN0MsS0FBSyxNQUFNLFNBQVMsSUFBSSxJQUFJLElBQUksRUFBRSxFQUFFLENBQUM7Z0JBQ25DLEtBQUssTUFBTSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7b0JBQzNELFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxTQUFTLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNuRCxDQUFDO1lBQ0gsQ0FBQztZQUVELE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFTyxLQUFLLENBQUMseUJBQXlCLENBQUMsS0FBZ0I7WUFDdEQsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUM1QixJQUFJLE9BQU8sTUFBTSxLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7WUFDM0UsQ0FBQztZQUVELE9BQU8sSUFBSSxPQUFPLENBQXlCLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUM3RCxNQUFNLFFBQVEsR0FBRyxNQUErRixDQUFDO2dCQUNqSCxRQUFRLENBQUMsQ0FBQyxLQUFtQixFQUFFLFVBQWtDLEVBQUUsRUFBRTtvQkFDbkUsSUFBSSxLQUFLLEVBQUUsQ0FBQzt3QkFDVixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ2hCLENBQUM7eUJBQU0sQ0FBQzt3QkFDTixPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQ3RCLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFTSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQW9CLEVBQUUsSUFBWSxFQUFFLE1BQTRCO1lBQ2xGLE1BQU0sR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNsQyxNQUFNLFFBQVEsR0FBRyxNQUFNLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ25ELElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsSUFBSSxrQkFBa0IsQ0FBQyxDQUFDO1lBQzFELENBQUM7WUFDRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ2pFLE9BQU8sSUFBQSxxQkFBYyxFQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztnQkFDMUQsSUFBSSxFQUFFLElBQUk7Z0JBQ1YsUUFBUSxFQUFFLEtBQUssQ0FBQyxFQUFFO2dCQUNsQixVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO2dCQUM3QyxXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO2dCQUMvQyxjQUFjLEVBQUUsTUFBTSxDQUFDLGNBQWM7Z0JBQ3JDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDO2dCQUMvRCxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsU0FBUztnQkFDdEMsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUM1SCxlQUFlLEVBQUUsTUFBTSxDQUFDLGVBQWUsS0FBSyxJQUFJO2dCQUNoRCxvQkFBb0IsRUFBRSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsSUFBSSxNQUFNLENBQUMsb0JBQW9CLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztvQkFDdkosQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDO29CQUM3QyxDQUFDLENBQUMsRUFBRTthQUNQLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO1FBR00sS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFvQjtZQUNwQyxNQUFNLE9BQU8sR0FBRyxDQUFDLE1BQU0sVUFBVSxDQUFDLElBQUksQ0FBQztnQkFDckMsUUFBUSxFQUFFLEtBQUssQ0FBQyxFQUFFO2FBQ25CLENBQUMsQ0FBMkIsQ0FBQztZQUM5QixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3pCLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSTtnQkFDWixjQUFjLEVBQUUsQ0FBQyxDQUFDLGNBQWM7Z0JBQ2hDLFVBQVUsRUFBRSxvQkFBb0IsQ0FBMEIsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7Z0JBQzNFLFdBQVcsRUFBRSxvQkFBb0IsQ0FBa0MsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7Z0JBQ3JGLG1CQUFtQixFQUFFLG9CQUFvQixDQUF5QixDQUFDLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxDQUFDO2dCQUM1RixnQkFBZ0IsRUFBRSxDQUFDLENBQUMsZ0JBQWdCLElBQUksU0FBUztnQkFDakQsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUF3QyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBMEMsQ0FBQyxDQUFDLENBQUMsU0FBUztnQkFDM0ksZUFBZSxFQUFFLENBQUMsQ0FBQyxlQUFlLElBQUksS0FBSztnQkFDM0Msb0JBQW9CLEVBQUUsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBd0IsQ0FBQyxDQUFDLG9CQUFvQixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO2FBQ25JLENBQUMsQ0FBc0MsQ0FBQztRQUMzQyxDQUFDO1FBRU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFvQixFQUFFLElBQVksRUFBRSxNQUE0QjtZQUNsRixNQUFNLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUM7WUFDbEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUNuRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsSUFBSSxhQUFhLENBQUMsQ0FBQztZQUNyRCxDQUFDO1lBQ0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNqRSxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUEscUJBQWMsRUFBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQztnQkFDekYsSUFBSSxFQUFFLElBQUk7Z0JBQ1YsUUFBUSxFQUFFLEtBQUssQ0FBQyxFQUFFO2dCQUNsQixVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO2dCQUM3QyxXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO2dCQUMvQyxjQUFjLEVBQUUsTUFBTSxDQUFDLGNBQWM7Z0JBQ3JDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDO2dCQUMvRCxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsU0FBUztnQkFDdEMsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUM1SCxlQUFlLEVBQUUsTUFBTSxDQUFDLGVBQWUsS0FBSyxJQUFJO2dCQUNoRCxvQkFBb0IsRUFBRSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsSUFBSSxNQUFNLENBQUMsb0JBQW9CLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztvQkFDdkosQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDO29CQUM3QyxDQUFDLENBQUMsRUFBRTthQUNQLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDTCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsSUFBSSxhQUFhLENBQUMsQ0FBQztZQUNyRCxDQUFDO1lBQ0QsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztRQUVNLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBb0IsRUFBRSxJQUFZO1lBQ3BELE1BQU0sR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNsQyxNQUFNLFFBQVEsR0FBRyxNQUFNLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ25ELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDZCxNQUFNLElBQUksS0FBSyxDQUFDLGdCQUFnQixJQUFJLGFBQWEsQ0FBQyxDQUFDO1lBQ3JELENBQUM7WUFDRCxPQUFPLElBQUEscUJBQWMsRUFBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3RSxDQUFDO1FBR0QsS0FBSyxDQUFDLG1CQUFtQixDQUFDLEtBQW9CLEVBQUUsVUFBa0I7WUFDaEUsTUFBTSxTQUFTLEdBQUcsTUFBTSxVQUFVLENBQUMsT0FBTyxDQUFDO2dCQUN6QyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsVUFBVTthQUNqQyxDQUFDLENBQUM7WUFDSCxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNkLE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUN4QyxDQUFDO1lBRUQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsdUJBQXVCO1lBQ3JCLE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLFlBQVksRUFBRSxzQkFBc0IsQ0FBQyxFQUFFLEVBQUUsQ0FBWSxDQUFDO1lBQy9GLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBZSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN6RyxDQUFDO1FBRUQsS0FBSyxDQUFDLGlCQUFpQixDQUNyQixpQkFBeUIsRUFDekIsbUJBQTRDLEVBQzVDLGNBQXNCLEVBQ3RCLFVBQW1DLEVBQ25DLFdBQXFELEVBQ3JELFFBQWlDLEVBQ2pDLEtBQW9CLEVBQ3BCLEtBQWEsRUFDYixJQUFZLEVBQ1osUUFBaUIsU0FBUyxFQUMxQixPQUF5QyxTQUFTLEVBQ2xELGtCQUEyQixLQUFLLEVBQ2hDLHVCQUE4QyxFQUFFO1lBRWhELE1BQU0sWUFBWSxHQUFHLEVBQUUsNkJBQTZCLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDN0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFFekQsSUFBSSxvQkFBb0IsSUFBSSxvQkFBb0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzVELEtBQUssTUFBTSxNQUFNLElBQUksb0JBQW9CLEVBQUUsQ0FBQztvQkFDMUMsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7b0JBQ3hELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzt3QkFDakIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsMENBQTBDLE1BQU0sQ0FBQyxjQUFjLG1DQUFtQyxNQUFNLENBQUMsY0FBYyxrQkFBa0IsTUFBTSxDQUFDLFVBQVUsb0JBQW9CLE1BQU0sQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO3dCQUNyTixTQUFTO29CQUNYLENBQUM7b0JBQ0QsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDeEQsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztvQkFDMUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxDQUFDO29CQUNyRSxNQUFNLGNBQWMsR0FBRyxNQUFNLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUEyQixDQUFDO29CQUN2SixNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLElBQUksSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDcEosTUFBTSx3QkFBd0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDeEYsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsd0JBQXdCLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztvQkFDMUgsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQzt3QkFDdEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFOzRCQUNyRCxHQUFHLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsRUFBRSxVQUFVLENBQUM7eUJBQ3BELENBQUMsQ0FBQztvQkFDTCxDQUFDO3lCQUFNLENBQUM7d0JBQ04sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7b0JBQzlFLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7WUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDMUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ2xCLElBQUksVUFBVSxDQUFDLElBQUksS0FBSyxXQUFXLEVBQUUsQ0FBQztnQkFDcEMsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQy9GLENBQUM7WUFFRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BFLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNsRSxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsRUFBRSxjQUFjLENBQUMsQ0FBQztZQUU5RCwwQ0FBMEM7WUFDMUMsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1lBQ25CLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDNUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsU0FBUyxjQUFjLFlBQVksQ0FBQyxDQUFDO1lBQ3ZELENBQUM7WUFDRCxJQUFJLE9BQU8sR0FBaUMsRUFBRSxDQUFDO1lBQy9DLElBQUksY0FBYyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNoQyxNQUFNLGdCQUFnQixHQUFHLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyRSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQ2xFLFVBQVUsR0FBRyxNQUFNLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDbkUsSUFBSSxVQUFVLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ25CLElBQUksV0FBVyxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztvQkFDeEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNoRCxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO3dCQUMzQixXQUFXLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDN0MsQ0FBQztvQkFDRCxPQUFPLEdBQUcsTUFBTSxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQWtDLENBQUM7Z0JBQ2hHLENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztnQkFDMUIsSUFBSSxPQUFPLEtBQUssS0FBSyxVQUFVLEVBQUUsQ0FBQztvQkFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxTQUFTLGNBQWMsd0JBQXdCLENBQUMsQ0FBQztnQkFDbkUsQ0FBQztnQkFDRCxNQUFNLE9BQU8sR0FBRyxLQUFvSCxDQUFDO2dCQUNySSxVQUFVLEdBQUcsTUFBTSxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2hFLENBQUM7WUFFRCx1QkFBdUI7WUFDdkIsTUFBTSxRQUFRLEdBQWlHO2dCQUM3RyxLQUFLLEVBQUUsY0FBYztnQkFDckIsSUFBSSxFQUFFLEtBQUs7Z0JBQ1gsS0FBSyxFQUFFLElBQUk7YUFDWixDQUFDO1lBRUYsY0FBYztZQUNkLElBQUksSUFBSSxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDekUsMENBQTBDO2dCQUMxQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQzFCLENBQUM7WUFFRCxZQUFZO1lBQ1osS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsc0JBQXNCLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDbEQsSUFBSSxjQUFjLEtBQUssUUFBUSxJQUFJLFVBQVUsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDbEQsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztnQkFDeEIsSUFBSSxPQUFPLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQztvQkFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxTQUFTLGNBQWMsdUJBQXVCLENBQUMsQ0FBQztnQkFDbEUsQ0FBQztnQkFDRCxNQUFNLE1BQU0sR0FBRyxJQUFrTixDQUFDO2dCQUNsTyxPQUFPLEdBQUcsTUFBTSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3RELENBQUM7WUFFRCxNQUFNLGVBQWUsR0FBK0IsRUFBRSxDQUFBO1lBQ3RELE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsY0FBdUQsQ0FBQztZQUM5RixNQUFNLHFCQUFxQixHQUFHLGVBQWUsS0FBSyxJQUFJLElBQUksY0FBYyxLQUFLLFFBQVEsQ0FBQztZQUN0RixJQUFJLGVBQWUsS0FBSyxJQUFJLElBQUksY0FBYyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM1RCxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxnRkFBZ0YsY0FBYyxHQUFHLENBQUMsQ0FBQztZQUNySCxDQUFDO1lBRUQsbUZBQW1GO1lBQ25GLG9GQUFvRjtZQUNwRixLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUM3QixNQUFNLFVBQVUsR0FBRyxNQUFvQixDQUFDO2dCQUV4QyxJQUFJLHFCQUFxQixJQUFJLGNBQWMsSUFBSSxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQ3BFLElBQUksQ0FBQzt3QkFDSCxNQUFNLGFBQWEsR0FBRyxNQUFNLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO3dCQUMxRixVQUFVLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztvQkFDM0MsQ0FBQztvQkFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO3dCQUNiLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLDRDQUE0QyxVQUFVLENBQUMsU0FBUyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7b0JBQzFGLENBQUM7Z0JBQ0gsQ0FBQztnQkFFRCxJQUFJLGVBQWUsR0FBK0IsRUFBRSxDQUFDO2dCQUNyRCxNQUFNLFNBQVMsR0FBNEIsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUM7Z0JBQ2xFLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQztvQkFDcEMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO29CQUN4RCxDQUFDLENBQUMsTUFBTSxDQUFDLG1CQUFtQixFQUFFLFVBQVUsS0FBYyxFQUFFLEdBQVc7d0JBQ2pFLENBQUMsQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQWUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO29CQUMzRSxDQUFDLENBQUMsQ0FBQztvQkFDSCxlQUFlLEdBQUcsY0FBNEMsQ0FBQztnQkFFakUsQ0FBQztxQkFBTSxDQUFDO29CQUNOLGVBQWUsR0FBRyxjQUFjLEtBQUssUUFBUTt3QkFDM0MsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEVBQUUsU0FBUyxDQUErQjt3QkFDOUUsQ0FBQyxDQUFDLFVBQW1ELENBQUM7Z0JBQzFELENBQUM7Z0JBRUQsTUFBTSxjQUFjLEdBQTZCLElBQUksd0JBQXdCLENBQUM7b0JBQzVFLEdBQUcsRUFBRSxVQUFVLENBQUMsU0FBUyxJQUFJLHFCQUFxQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFO29CQUMxRSxLQUFLLEVBQUUsaUJBQWlCLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLElBQUksaUJBQWlCLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUU7b0JBQy9JLFFBQVEsRUFBRSxlQUFlO29CQUN6QixZQUFZLEVBQUUsVUFBVSxDQUFDLFlBQVksSUFBSSxJQUFJO29CQUM3QyxXQUFXLEVBQUUsVUFBVSxDQUFDLFdBQVcsSUFBSSxJQUFJO2lCQUM1QyxDQUFDLENBQUM7Z0JBQ0gsZUFBZSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUN2QyxDQUFDO1lBQ0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxpQ0FBZSxFQUE0QixDQUFDO1lBR2pFLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQztZQUN6QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDckIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUUxRCxRQUFRLENBQUMsT0FBTyxHQUFHLGVBQWUsQ0FBQztZQUNuQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUE7WUFDOUIsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFBO1lBQ2xDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztZQUV2QyxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO1FBRU8sS0FBSyxDQUFDLHFCQUFxQixDQUNqQyxtQkFBNEMsRUFDNUMsVUFBbUMsRUFDbkMsS0FBb0IsRUFDcEIsS0FBYSxFQUNiLElBQVksRUFDWixPQUF5QyxTQUFTO1lBRWxELE1BQU0sWUFBWSxHQUFHLEVBQUUsNkJBQTZCLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDN0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO1lBQ3BFLENBQUM7WUFDRCxNQUFNLFNBQVMsR0FBRyxLQUF5RyxDQUFDO1lBRTVILE1BQU0sUUFBUSxHQUFvRSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsQ0FBQztZQUN4RyxJQUFJLElBQUksS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3pFLFFBQVEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ3ZCLENBQUM7WUFFRCxJQUFJLEtBQUssR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBYyxDQUFDO1lBQ2xELElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxDQUFDLFFBQVEsS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDbEQsS0FBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbEMsQ0FBQztZQUNELE1BQU0sUUFBUSxHQUFHLEtBQUssSUFBSSxPQUFPLEtBQUssQ0FBQyxJQUFJLEtBQUssVUFBVTtnQkFDeEQsQ0FBQyxDQUFFLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQTJCO2dCQUMzRCxDQUFDLENBQUUsTUFBTSxLQUErQixDQUFDO1lBRTNDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDakMsTUFBTSxzQkFBc0IsR0FBRyxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM3RSxNQUFNLFdBQVcsR0FBRyxRQUFRO2lCQUN6QixNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUN6RyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQztZQUMxRCxNQUFNLGVBQWUsR0FBK0IsRUFBRSxDQUFDO1lBRXZELEtBQUssTUFBTSxVQUFVLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ3BDLElBQUksZUFBZSxHQUErQixFQUFFLENBQUM7Z0JBQ3JELE1BQU0sU0FBUyxHQUE0QixFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQztnQkFDbEUsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDO29CQUNwQyxNQUFNLGNBQWMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUM7b0JBQ3hELENBQUMsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxLQUFjLEVBQUUsR0FBVyxFQUFFLEVBQUU7d0JBQzVELENBQUMsQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQWUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO29CQUMzRSxDQUFDLENBQUMsQ0FBQztvQkFDSCxlQUFlLEdBQUcsY0FBNEMsQ0FBQztnQkFDakUsQ0FBQztxQkFBTSxDQUFDO29CQUNOLGVBQWUsR0FBRzt3QkFDaEIsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQzt3QkFDaEQsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQzt3QkFDaEQsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLFNBQVMsQ0FBQzt3QkFDbEQsUUFBUSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEVBQUUsU0FBUyxDQUFDO3dCQUN4RCxTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsRUFBRSxTQUFTLENBQUM7cUJBQzNELENBQUM7Z0JBQ0osQ0FBQztnQkFFRCxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksd0JBQXdCLENBQUM7b0JBQ2hELEdBQUcsRUFBRSxFQUFFO29CQUNQLEtBQUssRUFBRSxFQUFFO29CQUNULFFBQVEsRUFBRSxlQUFlO29CQUN6QixZQUFZLEVBQUUsVUFBVSxDQUFDLFNBQVMsSUFBSSxJQUFJO29CQUMxQyxXQUFXLEVBQUUsVUFBVSxDQUFDLFNBQVMsSUFBSSxJQUFJO2lCQUMxQyxDQUFDLENBQUMsQ0FBQztZQUNOLENBQUM7WUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLGlDQUFlLEVBQTRCLENBQUM7WUFDakUsUUFBUSxDQUFDLE9BQU8sR0FBRyxlQUFlLENBQUM7WUFDbkMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQy9CLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdkQsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQztZQUMvQyxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO1FBRUQsZ0JBQWdCLENBQUMsVUFBbUMsRUFBRSxXQUFxRCxFQUFFLFFBQWlDO1lBQzVJLEtBQUssTUFBTSxhQUFhLElBQUksV0FBVyxFQUFFLENBQUM7Z0JBRXhDLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDcEMsTUFBTSxVQUFVLEdBQTZCLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDeEUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxhQUFhLGNBQWMsS0FBSyxFQUFFLENBQUMsQ0FBQztnQkFFdkQsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLFVBQVUsQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFLENBQUM7b0JBQ3pELE1BQU0sS0FBSyxDQUFDLEdBQUcsYUFBYSwwQkFBMEIsQ0FBQyxDQUFDO2dCQUMxRCxDQUFDO2dCQUVELElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUN6QixJQUFJLFVBQVUsQ0FBQyxhQUFhLElBQUksOEJBQThCLENBQUMsTUFBTSxFQUFFLENBQUM7d0JBQ3RFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUN2RCxTQUFTO29CQUNYLENBQUM7b0JBRUQsSUFBSSxVQUFVLENBQUMsYUFBYSxJQUFJLDhCQUE4QixDQUFDLFlBQVksRUFBRSxDQUFDO3dCQUM1RSxLQUFLLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQztvQkFDbEMsQ0FBQztnQkFDSCxDQUFDO2dCQUVELElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO29CQUNwQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO2dCQUNoSCxDQUFDO2dCQUVELElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ3ZDLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUUsRUFBRSxDQUFDO3dCQUM1RCxLQUFLLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtvQkFDM0IsQ0FBQztnQkFDSCxDQUFDO2dCQUVELElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ3hDLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7d0JBQzFCLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7NEJBQzlCLEtBQUssR0FBRyxLQUFLLENBQUMsV0FBVyxFQUFFLEtBQUssTUFBTSxDQUFDO3dCQUN6QyxDQUFDOzZCQUFNLENBQUM7NEJBQ04sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDekIsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7Z0JBRUQsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDdEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7d0JBQ25ELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7NEJBQzlCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQzs0QkFDN0IsSUFBSSxPQUFPLEtBQUssRUFBRSxFQUFFLENBQUM7Z0NBQ25CLEtBQUssR0FBRyxFQUFFLENBQUM7NEJBQ2IsQ0FBQztpQ0FBTSxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQ0FDbkMsTUFBTSxNQUFNLEdBQUcsb0JBQW9CLENBQVksT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQ0FDakUsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQzs0QkFDbkQsQ0FBQztpQ0FBTSxDQUFDO2dDQUNOLEtBQUssR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDOzRCQUNsQixDQUFDO3dCQUNILENBQUM7NkJBQU0sQ0FBQzs0QkFDTixLQUFLLEdBQUcsS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7d0JBQ3hELENBQUM7b0JBQ0gsQ0FBQztnQkFDSCxDQUFDO2dCQUVELElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNoRSxLQUFLLEdBQUcscUJBQXFCLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUN0RCxDQUFDO2dCQUVELElBQ0UsVUFBVSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsSUFBSTtvQkFDaEMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFDaEMsQ0FBQztvQkFDRCxNQUFNLEtBQUssR0FBNEIsRUFBRSxDQUFBO29CQUN6QyxJQUFJLEtBQUssSUFBSSxTQUFTLElBQUksQ0FBQyxLQUFLLElBQUksU0FBUyxJQUFJLFVBQVUsQ0FBQyxhQUFhLElBQUksOEJBQThCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQzt3QkFDcEgsS0FBSyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsR0FBRyxLQUFLLENBQUM7d0JBQ3BDLEtBQUssR0FBRyxLQUFLLENBQUM7b0JBQ2hCLENBQUM7Z0JBQ0gsQ0FBQztnQkFFRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNyQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQzt3QkFDckMsTUFBTSxLQUFLLEdBQTRCLEVBQUUsQ0FBQzt3QkFDMUMsSUFBSSxVQUFVLENBQUMsTUFBTSxJQUFJLHVCQUF1QixDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQzs0QkFDL0UsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQzs0QkFDOUIsSUFBSSxvQkFBb0IsR0FBRyxnQkFBUSxDQUFDLEtBQUssRUFBRSxDQUFDOzRCQUM1QyxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQztnQ0FDYix3Q0FBd0M7Z0NBQ3hDLG9CQUFvQixHQUFHLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDOzRCQUNuRSxDQUFDO2lDQUFNLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDO2dDQUNwQix3REFBd0Q7Z0NBQ3hELElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0NBQ2pCLDBDQUEwQztnQ0FDMUMsb0JBQW9CLEdBQUcsb0JBQW9CLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7NEJBQ3BFLENBQUM7NEJBQ0QsS0FBSyxHQUFHLG9CQUFvQixDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUN2QyxDQUFDO3dCQUVELEtBQUssQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDO3dCQUNwQyxLQUFLLEdBQUcsS0FBSyxDQUFDO29CQUVoQixDQUFDO2dCQUNILENBQUM7Z0JBRUQsSUFBSSxLQUFLLElBQUksU0FBUyxJQUFJLFVBQVUsQ0FBQyxhQUFhLElBQUksOEJBQThCLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQzVGLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN6RCxDQUFDO3FCQUFNLENBQUM7b0JBRU4sTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUE7b0JBQzFFLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7d0JBQzdELENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDO29CQUNoQyxDQUFDO29CQUNELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDOUQsQ0FBQztZQUNILENBQUM7WUFDRCxPQUFPLFVBQVUsQ0FBQztRQUNwQixDQUFDO1FBRUQsV0FBVyxDQUFDLGNBQXNCLEVBQUUsU0FBa0M7WUFDcEUsTUFBTSxZQUFZLEdBQUcsRUFBRSxHQUFHLFNBQVMsRUFBRSxDQUFDO1lBRXRDLElBQUksY0FBYyxJQUFJLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDekQsSUFBSSxDQUFDO29CQUNILGlDQUFpQyxFQUFFLENBQUM7b0JBQ3BDLE1BQU0sZ0JBQWdCLEdBQUcsb0JBQVUsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQ2hGLE9BQU8sZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3hDLENBQUM7Z0JBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztvQkFDYixLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxtQ0FBbUMsY0FBYyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7b0JBQzFFLE1BQU0sR0FBRyxDQUFDO2dCQUNaLENBQUM7WUFDSCxDQUFDO1lBQ0QsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxjQUFjLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBRU0sS0FBSyxDQUFDLDJCQUEyQixDQUFDLE1BQStDLEVBQUUsUUFBaUMsRUFBRSxLQUFvQixFQUFFLEtBQWEsRUFBRSxJQUFZLEVBQUUsSUFBYztZQUM1TCxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyw2Q0FBNkMsRUFBRTtnQkFDN0QsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLEtBQUssRUFBRSxLQUFLO2dCQUNaLEtBQUssRUFBRSxLQUFLO2dCQUNaLElBQUksRUFBRSxJQUFJO2dCQUNWLElBQUksRUFBRSxJQUFJO2FBQ1gsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2pFLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUscUJBQXFCLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzNFLE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3RFLE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBNkMsQ0FBQztZQUN6RyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMxRCxNQUFNLGVBQWUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxLQUFLLENBQVksQ0FBQztZQUMzRSxNQUFNLG9CQUFvQixHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsc0JBQXNCLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUEwQixDQUFDO1lBQ25ILE9BQU8sTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBRSxFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3pMLENBQUM7UUFFTSxLQUFLLENBQUMsa0NBQWtDLENBQUMsTUFBd0IsRUFBRSxRQUFnQyxFQUFFLEtBQW9CLEVBQUUsU0FBaUIsRUFBRSxRQUFnQixDQUFDLEVBQUUsT0FBZSxFQUFFLEVBQUUsYUFBcUIsR0FBRyxFQUFFLE9BQWdCLFNBQVM7WUFDNU8sTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ25CLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztZQUNyQixLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxtREFBbUQsU0FBUyxXQUFXLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFVBQVUsS0FBSyxTQUFTLElBQUksYUFBYSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUVqTCxPQUFPLElBQUksRUFBRSxDQUFDO2dCQUNaLDJDQUEyQztnQkFFM0MsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDcEcsWUFBWSxJQUFJLENBQUMsQ0FBQztnQkFFbEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNkLCtCQUErQjtvQkFDL0IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsd0RBQXdELFNBQVMsR0FBRyxDQUFDLENBQUM7b0JBQ3JGLE1BQU07Z0JBQ1IsQ0FBQztnQkFFRCwrQ0FBK0M7Z0JBQy9DLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLDZDQUE2QyxTQUFTLFlBQVksS0FBSyxTQUFTLElBQUksZ0JBQWdCLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxZQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDM0wsS0FBSyxNQUFNLE1BQU0sSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ3RDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3ZCLENBQUM7Z0JBRUQsTUFBTSxxQkFBcUIsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDO2dCQUMzQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLHFCQUFxQixFQUFFLENBQUM7b0JBQ3ZELDBGQUEwRjtvQkFDMUYsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsd0RBQXdELFNBQVMsWUFBWSxLQUFLLFNBQVMsSUFBSSxrQkFBa0IsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7b0JBQ25KLE1BQU07Z0JBQ1IsQ0FBQztnQkFFRCx5QkFBeUI7Z0JBQ3pCLEtBQUssR0FBRyxxQkFBcUIsQ0FBQztnQkFFOUIsaUVBQWlFO2dCQUNqRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsVUFBVSxFQUFFLENBQUM7b0JBQ2hDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGlFQUFpRSxPQUFPLENBQUMsTUFBTSxpQkFBaUIsU0FBUyxVQUFVLFlBQVksb0VBQW9FLFVBQVUsRUFBRSxDQUFDLENBQUM7b0JBQ2hPLE1BQU07Z0JBQ1IsQ0FBQztnQkFFRCwwQkFBMEI7WUFDNUIsQ0FBQztZQUVELEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxPQUFPLENBQUMsTUFBTSxpQkFBaUIsU0FBUyxVQUFVLFlBQVksV0FBVyxDQUFDLENBQUM7WUFDakksT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztLQUVGO0lBM3dCWSwwQkFBaUIsb0JBMndCN0IsQ0FBQTtBQUNILENBQUMsRUFweEJnQixRQUFRLHdCQUFSLFFBQVEsUUFveEJ4QjtBQUVELElBQUssUUFPSjtBQVBELFdBQUssUUFBUTtJQUNYLHlCQUFhLENBQUE7SUFDYiw2QkFBaUIsQ0FBQTtJQUNqQiw2QkFBaUIsQ0FBQTtJQUNqQiwrQkFBbUIsQ0FBQTtJQUNuQiwyQkFBZSxDQUFBO0lBQ2YsNkJBQWlCLENBQUE7QUFDbkIsQ0FBQyxFQVBJLFFBQVEsS0FBUixRQUFRLFFBT1o7QUFFRCxJQUFLLDhCQUdKO0FBSEQsV0FBSyw4QkFBOEI7SUFDakMsK0RBQTZCLENBQUE7SUFDN0IsbURBQWlCLENBQUE7QUFDbkIsQ0FBQyxFQUhJLDhCQUE4QixLQUE5Qiw4QkFBOEIsUUFHbEM7QUFFRCxJQUFLLHVCQUdKO0FBSEQsV0FBSyx1QkFBdUI7SUFDMUIsd0NBQWEsQ0FBQTtJQUNiLDhDQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFISSx1QkFBdUIsS0FBdkIsdUJBQXVCLFFBRzNCO0FBSUQsTUFBTSx3QkFBd0I7SUFDNUIsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUMxQixJQUFJLEdBQWEsUUFBUSxDQUFDLE1BQU0sQ0FBQztJQUNqQyxZQUFZLEdBQVksSUFBSSxDQUFDO0lBQzdCLFNBQVMsR0FBVyxFQUFFLENBQUM7SUFDdkIsYUFBYSxHQUFtQyw4QkFBOEIsQ0FBQyxNQUFNLENBQUM7SUFDdEYsTUFBTSxHQUE0Qix1QkFBdUIsQ0FBQyxJQUFJLENBQUM7SUFDL0QsSUFBSSxHQUFXLEVBQUUsQ0FBQztJQUNsQixRQUFRLEdBQVcsRUFBRSxDQUFDO0NBQ3ZCO0FBRUQsTUFBYSxtQkFBbUI7SUFDOUIsY0FBYyxHQUFXLEVBQUUsQ0FBQztJQUM1QixVQUFVLEdBQTRCLEVBQUUsQ0FBQztJQUN6QyxVQUFVLEdBQVcsRUFBRSxDQUFDO0lBQ3hCLFlBQVksR0FBVyxFQUFFLENBQUM7Q0FDM0I7QUFMRCxrREFLQztBQWVELE1BQWEsZ0JBQWdCO0lBQzNCLElBQUksQ0FBUztJQUNiLFFBQVEsQ0FBUztJQUNqQixRQUFRLENBQVU7SUFDbEIsU0FBUyxDQUFTO0lBQ2xCLFNBQVMsQ0FBUztJQUNsQixHQUFHLENBQVM7SUFDWixXQUFXLENBQTJDO0lBQ3RELFVBQVUsQ0FBMEI7SUFDcEMsY0FBYyxDQUFTO0lBQ3ZCLG1CQUFtQixDQUEwQjtJQUM3QyxnQkFBZ0IsQ0FBUztJQUN6QixJQUFJLENBQW1DO0lBQ3ZDLGVBQWUsQ0FBVTtJQUN6QixvQkFBb0IsQ0FBd0I7SUFFNUMsWUFBWSxNQUFnRDtRQUMxRCxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxFQUFFLFFBQVEsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN4RSxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sRUFBRSxRQUFRLENBQUM7UUFDakMsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLEVBQUUsU0FBUyxJQUFJLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sRUFBRSxTQUFTLElBQUksRUFBRSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxvQkFBb0IsQ0FBMkMsTUFBTSxFQUFFLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMzRyxJQUFJLENBQUMsVUFBVSxHQUFHLG9CQUFvQixDQUEwQixNQUFNLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3hGLElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBTSxFQUFFLGNBQWMsSUFBSSxFQUFFLENBQUM7UUFDbkQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLG9CQUFvQixDQUEwQixNQUFNLEVBQUUsbUJBQW1CLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDMUcsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sRUFBRSxnQkFBZ0IsSUFBSSxFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLElBQUksR0FBRyxvQkFBb0IsQ0FBdUIsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sRUFBRSxlQUFlLEtBQUssSUFBSSxJQUFJLE1BQU0sRUFBRSxlQUFlLEtBQUssTUFBTSxDQUFDO1FBQzlGLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxvQkFBb0IsQ0FBd0IsTUFBTSxFQUFFLG9CQUFvQixFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzVHLENBQUM7Q0FDRjtBQWhDRCw0Q0FnQ0M7QUFFRCxNQUFhLHdCQUF3QjtJQUNuQyxHQUFHLENBQVM7SUFDWixLQUFLLENBQVM7SUFDZCxRQUFRLENBQTZCO0lBQ3JDLFlBQVksQ0FBdUI7SUFDbkMsV0FBVyxDQUF1QjtJQUVsQyxZQUFZLE1BQW1KO1FBQzdKLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQTtRQUNyQixJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUE7UUFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFBO1FBQy9CLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQTtRQUN2QyxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUE7SUFDdkMsQ0FBQztDQUNGO0FBZEQsNERBY0MifQ==
|