From 3d5a294d024f61d3f2d645bf4c1e0a10c32d556f Mon Sep 17 00:00:00 2001 From: TomMonks Date: Thu, 23 Jan 2025 13:22:13 +0000 Subject: [PATCH 1/9] chore(fix): added channel to environment file --- environment.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/environment.yaml b/environment.yaml index 969e011..e7f4f2d 100644 --- a/environment.yaml +++ b/environment.yaml @@ -1,4 +1,6 @@ name: template-des +channels: + - conda-forge dependencies: - flake8=7.1.1 - ipykernel=6.29.5 @@ -16,4 +18,4 @@ dependencies: - pip: - kaleido==0.2.1 - pycodestyle_magic==0.5 - - -e .[dev] \ No newline at end of file + - -e .[dev] From 50edf1395d3c06664b9dc3507ed975f8d39613eb Mon Sep 17 00:00:00 2001 From: TomMonks Date: Thu, 23 Jan 2025 13:42:49 +0000 Subject: [PATCH 2/9] chore(md): md code now displayed in python formatting --- notebooks/analysis.ipynb | 370 +++++++++++++++++++++++++++++++-------- 1 file changed, 294 insertions(+), 76 deletions(-) diff --git a/notebooks/analysis.ipynb b/notebooks/analysis.ipynb index 755d038..7a70dd5 100644 --- a/notebooks/analysis.ipynb +++ b/notebooks/analysis.ipynb @@ -147,7 +147,7 @@ "\n", "Patient-level results are a large file, so that could be compressed and saved as `.csv.gz`:\n", "\n", - "```\n", + "```python\n", "# Save file\n", "trial.patient_results_df.to_csv(\n", " os.path.join(output_dir, 'example_patient.csv.gz'),\n", @@ -608,6 +608,35 @@ "execution_count": 13, "metadata": {}, "outputs": [ + { + "data": { + "text/html": [ + " \n", + " " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, { "data": { "application/vnd.plotly.v1+json": { @@ -1516,7 +1545,34 @@ } } } - } + }, + "text/html": [ + "
" + ] }, "metadata": {}, "output_type": "display_data" @@ -2429,7 +2485,34 @@ } } } - } + }, + "text/html": [ + "
" + ] }, "metadata": {}, "output_type": "display_data" @@ -3342,7 +3425,34 @@ } } } - } + }, + "text/html": [ + "
" + ] }, "metadata": {}, "output_type": "display_data" @@ -4255,7 +4365,34 @@ } } } - } + }, + "text/html": [ + "
" + ] }, "metadata": {}, "output_type": "display_data" @@ -4974,7 +5111,7 @@ 0.0064598288561626156, 0.0012470986654197283, 0.0003557778826356141, - 0.0000738475569342995 + 7.38475569342995e-05 ], "yaxis": "y" } @@ -5826,7 +5963,34 @@ } } } - } + }, + "text/html": [ + "
" + ] }, "metadata": {}, "output_type": "display_data" @@ -7106,7 +7270,34 @@ } } } - } + }, + "text/html": [ + "
" + ] }, "metadata": {}, "output_type": "display_data" @@ -8201,7 +8392,34 @@ } } } - } + }, + "text/html": [ + "
" + ] }, "metadata": {}, "output_type": "display_data" @@ -8404,70 +8622,70 @@ "name": "stdout", "output_type": "stream", "text": [ - "2025-01-16 16:13:13,397 - INFO - logging.py:log():128 - Initialised model: {'param': , 'run_number': 0, 'env': , 'nurse': , 'patients': [], 'nurse_time_used': 0, 'nurse_consult_count': 0, 'running_mean_nurse_wait': 0, 'audit_list': [], 'results_list': [], 'patient_inter_arrival_dist': , 'nurse_consult_time_dist': }\n", - "2025-01-16 16:13:13,398 - INFO - logging.py:log():128 - Parameters: {'_initialising': False, 'patient_inter': 4, 'mean_n_consult_time': 10, 'number_of_nurses': 5, 'warm_up_period': 50, 'data_collection_period': 100, 'number_of_runs': 1, 'audit_interval': 120, 'scenario_name': 0, 'cores': 0, 'logger': }\n", - "2025-01-16 16:13:13,398 - INFO - logging.py:log():128 - Patient X (warm-up) arrives at: 0.000\n", - "2025-01-16 16:13:13,399 - INFO - logging.py:log():128 - Patient X (warm-up) is seen by nurse after 0.000 minutes. Consultation length: 8.031 minutes.\n", - "2025-01-16 16:13:13,399 - INFO - logging.py:log():128 - Patient X (warm-up) arrives at: 13.174\n", - "2025-01-16 16:13:13,399 - INFO - logging.py:log():128 - Patient X (warm-up) is seen by nurse after 13.174 minutes. Consultation length: 3.820 minutes.\n", - "2025-01-16 16:13:13,400 - INFO - logging.py:log():128 - Patient X (warm-up) arrives at: 16.227\n", - "2025-01-16 16:13:13,400 - INFO - logging.py:log():128 - Patient X (warm-up) is seen by nurse after 16.227 minutes. Consultation length: 3.642 minutes.\n", - "2025-01-16 16:13:13,400 - INFO - logging.py:log():128 - Patient X (warm-up) arrives at: 21.236\n", - "2025-01-16 16:13:13,401 - INFO - logging.py:log():128 - Patient X (warm-up) is seen by nurse after 21.236 minutes. Consultation length: 5.295 minutes.\n", - "2025-01-16 16:13:13,401 - INFO - logging.py:log():128 - Patient X (warm-up) arrives at: 22.140\n", - "2025-01-16 16:13:13,401 - INFO - logging.py:log():128 - Patient X (warm-up) is seen by nurse after 22.140 minutes. Consultation length: 27.884 minutes.\n", - "2025-01-16 16:13:13,402 - INFO - logging.py:log():128 - Patient X (warm-up) arrives at: 23.023\n", - "2025-01-16 16:13:13,402 - INFO - logging.py:log():128 - Patient X (warm-up) is seen by nurse after 23.023 minutes. Consultation length: 19.610 minutes.\n", - "2025-01-16 16:13:13,402 - INFO - logging.py:log():128 - Patient X (warm-up) arrives at: 30.223\n", - "2025-01-16 16:13:13,402 - INFO - logging.py:log():128 - Patient X (warm-up) is seen by nurse after 30.223 minutes. Consultation length: 9.490 minutes.\n", - "2025-01-16 16:13:13,403 - INFO - logging.py:log():128 - Patient X (warm-up) arrives at: 30.487\n", - "2025-01-16 16:13:13,403 - INFO - logging.py:log():128 - Patient X (warm-up) is seen by nurse after 30.487 minutes. Consultation length: 41.665 minutes.\n", - "2025-01-16 16:13:13,405 - INFO - logging.py:log():128 - Patient X (warm-up) arrives at: 34.089\n", - "2025-01-16 16:13:13,406 - INFO - logging.py:log():128 - Patient X (warm-up) is seen by nurse after 34.089 minutes. Consultation length: 5.874 minutes.\n", - "2025-01-16 16:13:13,406 - INFO - logging.py:log():128 - Patient X (warm-up) arrives at: 35.270\n", - "2025-01-16 16:13:13,407 - INFO - logging.py:log():128 - Patient X (warm-up) is seen by nurse after 35.270 minutes. Consultation length: 27.882 minutes.\n", - "2025-01-16 16:13:13,408 - INFO - logging.py:log():128 - Patient X (warm-up) arrives at: 44.470\n", - "2025-01-16 16:13:13,409 - INFO - logging.py:log():128 - Patient X (warm-up) is seen by nurse after 44.470 minutes. Consultation length: 24.915 minutes.\n", - "2025-01-16 16:13:13,410 - INFO - logging.py:log():128 - Patient 1 arrives at: 51.904\n", - "2025-01-16 16:13:13,411 - INFO - logging.py:log():128 - Patient 1 is seen by nurse after 51.904 minutes. Consultation length: 18.079 minutes.\n", - "2025-01-16 16:13:13,412 - INFO - logging.py:log():128 - Patient 2 arrives at: 51.963\n", - "2025-01-16 16:13:13,412 - INFO - logging.py:log():128 - Patient 2 is seen by nurse after 51.963 minutes. Consultation length: 3.102 minutes.\n", - "2025-01-16 16:13:13,412 - INFO - logging.py:log():128 - Patient 3 arrives at: 74.349\n", - "2025-01-16 16:13:13,413 - INFO - logging.py:log():128 - Patient 3 is seen by nurse after 74.349 minutes. Consultation length: 26.745 minutes.\n", - "2025-01-16 16:13:13,413 - INFO - logging.py:log():128 - Patient 4 arrives at: 77.534\n", - "2025-01-16 16:13:13,413 - INFO - logging.py:log():128 - Patient 4 is seen by nurse after 77.534 minutes. Consultation length: 0.748 minutes.\n", - "2025-01-16 16:13:13,414 - INFO - logging.py:log():128 - Patient 5 arrives at: 78.932\n", - "2025-01-16 16:13:13,415 - INFO - logging.py:log():128 - Patient 5 is seen by nurse after 78.932 minutes. Consultation length: 0.528 minutes.\n", - "2025-01-16 16:13:13,416 - INFO - logging.py:log():128 - Patient 6 arrives at: 86.815\n", - "2025-01-16 16:13:13,416 - INFO - logging.py:log():128 - Patient 6 is seen by nurse after 86.815 minutes. Consultation length: 2.435 minutes.\n", - "2025-01-16 16:13:13,417 - INFO - logging.py:log():128 - Patient 7 arrives at: 89.783\n", - "2025-01-16 16:13:13,417 - INFO - logging.py:log():128 - Patient 7 is seen by nurse after 89.783 minutes. Consultation length: 9.666 minutes.\n", - "2025-01-16 16:13:13,418 - INFO - logging.py:log():128 - Patient 8 arrives at: 89.807\n", - "2025-01-16 16:13:13,418 - INFO - logging.py:log():128 - Patient 8 is seen by nurse after 89.807 minutes. Consultation length: 7.005 minutes.\n", - "2025-01-16 16:13:13,418 - INFO - logging.py:log():128 - Patient 9 arrives at: 93.118\n", - "2025-01-16 16:13:13,419 - INFO - logging.py:log():128 - Patient 9 is seen by nurse after 93.118 minutes. Consultation length: 20.185 minutes.\n", - "2025-01-16 16:13:13,419 - INFO - logging.py:log():128 - Patient 10 arrives at: 95.598\n", - "2025-01-16 16:13:13,419 - INFO - logging.py:log():128 - Patient 10 is seen by nurse after 95.598 minutes. Consultation length: 7.651 minutes.\n", - "2025-01-16 16:13:13,420 - INFO - logging.py:log():128 - Patient 11 arrives at: 98.019\n", - "2025-01-16 16:13:13,420 - INFO - logging.py:log():128 - Patient 11 is seen by nurse after 98.019 minutes. Consultation length: 27.908 minutes.\n", - "2025-01-16 16:13:13,421 - INFO - logging.py:log():128 - Patient 12 arrives at: 109.379\n", - "2025-01-16 16:13:13,421 - INFO - logging.py:log():128 - Patient 12 is seen by nurse after 109.379 minutes. Consultation length: 16.811 minutes.\n", - "2025-01-16 16:13:13,422 - INFO - logging.py:log():128 - Patient 13 arrives at: 110.322\n", - "2025-01-16 16:13:13,422 - INFO - logging.py:log():128 - Patient 13 is seen by nurse after 110.322 minutes. Consultation length: 24.157 minutes.\n", - "2025-01-16 16:13:13,422 - INFO - logging.py:log():128 - Patient 14 arrives at: 120.342\n", - "2025-01-16 16:13:13,423 - INFO - logging.py:log():128 - Patient 14 is seen by nurse after 120.342 minutes. Consultation length: 1.451 minutes.\n", - "2025-01-16 16:13:13,423 - INFO - logging.py:log():128 - Patient 15 arrives at: 121.643\n", - "2025-01-16 16:13:13,424 - INFO - logging.py:log():128 - Patient 15 is seen by nurse after 121.643 minutes. Consultation length: 1.343 minutes.\n", - "2025-01-16 16:13:13,424 - INFO - logging.py:log():128 - Patient 16 arrives at: 127.827\n", - "2025-01-16 16:13:13,425 - INFO - logging.py:log():128 - Patient 16 is seen by nurse after 127.827 minutes. Consultation length: 1.554 minutes.\n", - "2025-01-16 16:13:13,425 - INFO - logging.py:log():128 - Patient 17 arrives at: 132.055\n", - "2025-01-16 16:13:13,426 - INFO - logging.py:log():128 - Patient 17 is seen by nurse after 132.055 minutes. Consultation length: 15.623 minutes.\n", - "2025-01-16 16:13:13,426 - INFO - logging.py:log():128 - Patient 18 arrives at: 133.617\n", - "2025-01-16 16:13:13,427 - INFO - logging.py:log():128 - Patient 18 is seen by nurse after 133.617 minutes. Consultation length: 4.688 minutes.\n", - "2025-01-16 16:13:13,427 - INFO - logging.py:log():128 - Patient 19 arrives at: 136.346\n", - "2025-01-16 16:13:13,428 - INFO - logging.py:log():128 - Patient 19 is seen by nurse after 136.346 minutes. Consultation length: 2.612 minutes.\n", - "2025-01-16 16:13:13,428 - INFO - logging.py:log():128 - Patient 20 arrives at: 144.142\n", - "2025-01-16 16:13:13,428 - INFO - logging.py:log():128 - Patient 20 is seen by nurse after 144.142 minutes. Consultation length: 6.348 minutes.\n" + "2025-01-23 13:35:55,018 - INFO - logging.py:log():128 - Initialised model: {'param': , 'run_number': 0, 'env': , 'nurse': , 'patients': [], 'nurse_time_used': 0, 'nurse_consult_count': 0, 'running_mean_nurse_wait': 0, 'audit_list': [], 'results_list': [], 'patient_inter_arrival_dist': , 'nurse_consult_time_dist': }\n", + "2025-01-23 13:35:55,019 - INFO - logging.py:log():128 - Parameters: {'_initialising': False, 'patient_inter': 4, 'mean_n_consult_time': 10, 'number_of_nurses': 5, 'warm_up_period': 50, 'data_collection_period': 100, 'number_of_runs': 1, 'audit_interval': 120, 'scenario_name': 0, 'cores': 0, 'logger': }\n", + "2025-01-23 13:35:55,019 - INFO - logging.py:log():128 - Patient X (warm-up) arrives at: 0.000\n", + "2025-01-23 13:35:55,020 - INFO - logging.py:log():128 - Patient X (warm-up) is seen by nurse after 0.000 minutes. Consultation length: 8.031 minutes.\n", + "2025-01-23 13:35:55,020 - INFO - logging.py:log():128 - Patient X (warm-up) arrives at: 13.174\n", + "2025-01-23 13:35:55,020 - INFO - logging.py:log():128 - Patient X (warm-up) is seen by nurse after 13.174 minutes. Consultation length: 3.820 minutes.\n", + "2025-01-23 13:35:55,020 - INFO - logging.py:log():128 - Patient X (warm-up) arrives at: 16.227\n", + "2025-01-23 13:35:55,020 - INFO - logging.py:log():128 - Patient X (warm-up) is seen by nurse after 16.227 minutes. Consultation length: 3.642 minutes.\n", + "2025-01-23 13:35:55,021 - INFO - logging.py:log():128 - Patient X (warm-up) arrives at: 21.236\n", + "2025-01-23 13:35:55,021 - INFO - logging.py:log():128 - Patient X (warm-up) is seen by nurse after 21.236 minutes. Consultation length: 5.295 minutes.\n", + "2025-01-23 13:35:55,021 - INFO - logging.py:log():128 - Patient X (warm-up) arrives at: 22.140\n", + "2025-01-23 13:35:55,021 - INFO - logging.py:log():128 - Patient X (warm-up) is seen by nurse after 22.140 minutes. Consultation length: 27.884 minutes.\n", + "2025-01-23 13:35:55,021 - INFO - logging.py:log():128 - Patient X (warm-up) arrives at: 23.023\n", + "2025-01-23 13:35:55,021 - INFO - logging.py:log():128 - Patient X (warm-up) is seen by nurse after 23.023 minutes. Consultation length: 19.610 minutes.\n", + "2025-01-23 13:35:55,022 - INFO - logging.py:log():128 - Patient X (warm-up) arrives at: 30.223\n", + "2025-01-23 13:35:55,022 - INFO - logging.py:log():128 - Patient X (warm-up) is seen by nurse after 30.223 minutes. Consultation length: 9.490 minutes.\n", + "2025-01-23 13:35:55,022 - INFO - logging.py:log():128 - Patient X (warm-up) arrives at: 30.487\n", + "2025-01-23 13:35:55,023 - INFO - logging.py:log():128 - Patient X (warm-up) is seen by nurse after 30.487 minutes. Consultation length: 41.665 minutes.\n", + "2025-01-23 13:35:55,023 - INFO - logging.py:log():128 - Patient X (warm-up) arrives at: 34.089\n", + "2025-01-23 13:35:55,023 - INFO - logging.py:log():128 - Patient X (warm-up) is seen by nurse after 34.089 minutes. Consultation length: 5.874 minutes.\n", + "2025-01-23 13:35:55,023 - INFO - logging.py:log():128 - Patient X (warm-up) arrives at: 35.270\n", + "2025-01-23 13:35:55,024 - INFO - logging.py:log():128 - Patient X (warm-up) is seen by nurse after 35.270 minutes. Consultation length: 27.882 minutes.\n", + "2025-01-23 13:35:55,024 - INFO - logging.py:log():128 - Patient X (warm-up) arrives at: 44.470\n", + "2025-01-23 13:35:55,024 - INFO - logging.py:log():128 - Patient X (warm-up) is seen by nurse after 44.470 minutes. Consultation length: 24.915 minutes.\n", + "2025-01-23 13:35:55,024 - INFO - logging.py:log():128 - Patient 1 arrives at: 51.904\n", + "2025-01-23 13:35:55,025 - INFO - logging.py:log():128 - Patient 1 is seen by nurse after 51.904 minutes. Consultation length: 18.079 minutes.\n", + "2025-01-23 13:35:55,025 - INFO - logging.py:log():128 - Patient 2 arrives at: 51.963\n", + "2025-01-23 13:35:55,025 - INFO - logging.py:log():128 - Patient 2 is seen by nurse after 51.963 minutes. Consultation length: 3.102 minutes.\n", + "2025-01-23 13:35:55,025 - INFO - logging.py:log():128 - Patient 3 arrives at: 74.349\n", + "2025-01-23 13:35:55,025 - INFO - logging.py:log():128 - Patient 3 is seen by nurse after 74.349 minutes. Consultation length: 26.745 minutes.\n", + "2025-01-23 13:35:55,026 - INFO - logging.py:log():128 - Patient 4 arrives at: 77.534\n", + "2025-01-23 13:35:55,026 - INFO - logging.py:log():128 - Patient 4 is seen by nurse after 77.534 minutes. Consultation length: 0.748 minutes.\n", + "2025-01-23 13:35:55,026 - INFO - logging.py:log():128 - Patient 5 arrives at: 78.932\n", + "2025-01-23 13:35:55,026 - INFO - logging.py:log():128 - Patient 5 is seen by nurse after 78.932 minutes. Consultation length: 0.528 minutes.\n", + "2025-01-23 13:35:55,026 - INFO - logging.py:log():128 - Patient 6 arrives at: 86.815\n", + "2025-01-23 13:35:55,026 - INFO - logging.py:log():128 - Patient 6 is seen by nurse after 86.815 minutes. Consultation length: 2.435 minutes.\n", + "2025-01-23 13:35:55,027 - INFO - logging.py:log():128 - Patient 7 arrives at: 89.783\n", + "2025-01-23 13:35:55,027 - INFO - logging.py:log():128 - Patient 7 is seen by nurse after 89.783 minutes. Consultation length: 9.666 minutes.\n", + "2025-01-23 13:35:55,027 - INFO - logging.py:log():128 - Patient 8 arrives at: 89.807\n", + "2025-01-23 13:35:55,027 - INFO - logging.py:log():128 - Patient 8 is seen by nurse after 89.807 minutes. Consultation length: 7.005 minutes.\n", + "2025-01-23 13:35:55,027 - INFO - logging.py:log():128 - Patient 9 arrives at: 93.118\n", + "2025-01-23 13:35:55,027 - INFO - logging.py:log():128 - Patient 9 is seen by nurse after 93.118 minutes. Consultation length: 20.185 minutes.\n", + "2025-01-23 13:35:55,028 - INFO - logging.py:log():128 - Patient 10 arrives at: 95.598\n", + "2025-01-23 13:35:55,028 - INFO - logging.py:log():128 - Patient 10 is seen by nurse after 95.598 minutes. Consultation length: 7.651 minutes.\n", + "2025-01-23 13:35:55,028 - INFO - logging.py:log():128 - Patient 11 arrives at: 98.019\n", + "2025-01-23 13:35:55,028 - INFO - logging.py:log():128 - Patient 11 is seen by nurse after 98.019 minutes. Consultation length: 27.908 minutes.\n", + "2025-01-23 13:35:55,029 - INFO - logging.py:log():128 - Patient 12 arrives at: 109.379\n", + "2025-01-23 13:35:55,029 - INFO - logging.py:log():128 - Patient 12 is seen by nurse after 109.379 minutes. Consultation length: 16.811 minutes.\n", + "2025-01-23 13:35:55,029 - INFO - logging.py:log():128 - Patient 13 arrives at: 110.322\n", + "2025-01-23 13:35:55,029 - INFO - logging.py:log():128 - Patient 13 is seen by nurse after 110.322 minutes. Consultation length: 24.157 minutes.\n", + "2025-01-23 13:35:55,029 - INFO - logging.py:log():128 - Patient 14 arrives at: 120.342\n", + "2025-01-23 13:35:55,030 - INFO - logging.py:log():128 - Patient 14 is seen by nurse after 120.342 minutes. Consultation length: 1.451 minutes.\n", + "2025-01-23 13:35:55,030 - INFO - logging.py:log():128 - Patient 15 arrives at: 121.643\n", + "2025-01-23 13:35:55,031 - INFO - logging.py:log():128 - Patient 15 is seen by nurse after 121.643 minutes. Consultation length: 1.343 minutes.\n", + "2025-01-23 13:35:55,031 - INFO - logging.py:log():128 - Patient 16 arrives at: 127.827\n", + "2025-01-23 13:35:55,031 - INFO - logging.py:log():128 - Patient 16 is seen by nurse after 127.827 minutes. Consultation length: 1.554 minutes.\n", + "2025-01-23 13:35:55,031 - INFO - logging.py:log():128 - Patient 17 arrives at: 132.055\n", + "2025-01-23 13:35:55,031 - INFO - logging.py:log():128 - Patient 17 is seen by nurse after 132.055 minutes. Consultation length: 15.623 minutes.\n", + "2025-01-23 13:35:55,032 - INFO - logging.py:log():128 - Patient 18 arrives at: 133.617\n", + "2025-01-23 13:35:55,032 - INFO - logging.py:log():128 - Patient 18 is seen by nurse after 133.617 minutes. Consultation length: 4.688 minutes.\n", + "2025-01-23 13:35:55,032 - INFO - logging.py:log():128 - Patient 19 arrives at: 136.346\n", + "2025-01-23 13:35:55,032 - INFO - logging.py:log():128 - Patient 19 is seen by nurse after 136.346 minutes. Consultation length: 2.612 minutes.\n", + "2025-01-23 13:35:55,032 - INFO - logging.py:log():128 - Patient 20 arrives at: 144.142\n", + "2025-01-23 13:35:55,032 - INFO - logging.py:log():128 - Patient 20 is seen by nurse after 144.142 minutes. Consultation length: 6.348 minutes.\n" ] } ], @@ -8607,7 +8825,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Notebook run time: 0m 23s\n" + "Notebook run time: 0m 26s\n" ] } ], @@ -8623,7 +8841,7 @@ ], "metadata": { "kernelspec": { - "display_name": "template-des", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -8641,5 +8859,5 @@ } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } From b4fd987ec4e689c62fec5b27ced462567f33d91c Mon Sep 17 00:00:00 2001 From: TomMonks Date: Thu, 23 Jan 2025 13:51:05 +0000 Subject: [PATCH 3/9] chore(gitignore): added standard ext for python --- .gitignore | 172 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 171 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 3f4031f..4b28f78 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,174 @@ __pycache__ .pytest_cache .pytype -*.log \ No newline at end of file +*.log + +# vscode +.vscode/* + +# Jupyter book html +_build/ + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + + + From d50d9aa7274983e9fc822f166232363e1a57c2f5 Mon Sep 17 00:00:00 2001 From: TomMonks Date: Fri, 24 Jan 2025 17:22:40 +0000 Subject: [PATCH 4/9] chore(changes): add temp changelog to track tms changes --- notebooks/changes.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 notebooks/changes.md diff --git a/notebooks/changes.md b/notebooks/changes.md new file mode 100644 index 0000000..bfc8bf4 --- /dev/null +++ b/notebooks/changes.md @@ -0,0 +1,8 @@ +## Added + +* Added `create_user_controlled_hist` to allow users to decide the KPI histogram to view. +* + +## Changed + +* From 3ca58e874d2da33001a11293e7c5d6e0c4361539 Mon Sep 17 00:00:00 2001 From: TomMonks Date: Fri, 24 Jan 2025 17:23:04 +0000 Subject: [PATCH 5/9] feat(analysis): added user controlled kpi hist --- notebooks/analysis.ipynb | 4608 ++++++++------------------------------ 1 file changed, 947 insertions(+), 3661 deletions(-) diff --git a/notebooks/analysis.ipynb b/notebooks/analysis.ipynb index 7a70dd5..3b9e35e 100644 --- a/notebooks/analysis.ipynb +++ b/notebooks/analysis.ipynb @@ -19,6 +19,141 @@ "* Analysis of the spread of replication results was adapted from Tom Monks (2024) HPDM097 - Making a difference with health data (https://github.com/health-data-science-OR/stochastic_systems) (MIT License)." ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Plotly \"allow a user to select KPI\" histogram\n", + "\n", + "The function `create_user_controlled_hist` creates a plotly chart that allows a user to choose which of the KPIs to view. It has optional parameter to map the simulation result variable names to a display \"friendly name\" and \"units\". Users pick a KPI from a drop down list. An optional parameter can be used to exclude certain results if they are not relevant to the modeller. " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import plotly.graph_objects as go" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def create_user_controlled_hist(\n", + " results, exclude_columns=None, name_mappings=None, include_instruct=True\n", + "):\n", + " \"\"\"\n", + " Create a plotly histogram that includes a drop down list that allows a user\n", + " to select which KPI is displayed as a histogram\n", + "\n", + " Params:\n", + " -------\n", + " results: pd.DataFrame\n", + " rows = replications, cols = KPIs\n", + " exclude_columns: list, optional\n", + " List of column numbers to exclude from the dropdown list\n", + " name_mappings: dict, optional\n", + " Nested dictionary mapping column names to friendly names and units\n", + " Format: {column_name: {'friendly_name': str, 'units': str}}#\n", + " include_instruct: bool, optional\n", + " Including the instruction \"Select KPI from drop down list\" above\n", + " plot. Useful for interactive applications.\n", + "\n", + " Returns:\n", + " -------\n", + " plotly.figure\n", + "\n", + " Source:\n", + " ------\n", + " The code in this function was adapted from:\n", + " https://stackoverflow.com/questions/59406167/plotly-how-to-filter-a-pandas-\n", + " dataframe-using-a-dropdown-menu\n", + " \"\"\"\n", + "\n", + " # create a figure\n", + " fig = go.Figure()\n", + "\n", + " # Filter out excluded columns\n", + " if exclude_columns is None:\n", + " exclude_columns = []\n", + " included_columns = [\n", + " col\n", + " for i, col in enumerate(results.columns)\n", + " if i not in exclude_columns\n", + " ]\n", + "\n", + " # set up ONE trace\n", + " first_col = included_columns[0]\n", + " first_friendly_name = (\n", + " name_mappings[first_col][\"friendly_name\"]\n", + " if name_mappings and first_col in name_mappings\n", + " else first_col\n", + " )\n", + " first_units = (\n", + " name_mappings[first_col][\"units\"]\n", + " if name_mappings and first_col in name_mappings\n", + " else \"\"\n", + " )\n", + " first_x_title = (\n", + " f\"{first_friendly_name} ({first_units})\"\n", + " if first_units\n", + " else first_friendly_name\n", + " )\n", + "\n", + " fig.add_trace(go.Histogram(x=results[first_col]))\n", + " fig.update_xaxes(title_text=first_x_title)\n", + "\n", + " buttons = []\n", + "\n", + " # create list of drop down items - KPIs\n", + " for col in included_columns:\n", + " if name_mappings and col in name_mappings:\n", + " friendly_name = name_mappings[col][\"friendly_name\"]\n", + " units = name_mappings[col][\"units\"]\n", + " x_title = f\"{friendly_name} ({units})\" if units else friendly_name\n", + " else:\n", + " friendly_name = col\n", + " x_title = col\n", + "\n", + " buttons.append(\n", + " dict(\n", + " method=\"update\",\n", + " label=friendly_name,\n", + " args=[{\"x\": [results[col]]}, {\"xaxis\": {\"title\": x_title}}],\n", + " )\n", + " )\n", + "\n", + " # create update menu and parameters\n", + " updatemenu = []\n", + " your_menu = dict()\n", + " updatemenu.append(your_menu)\n", + "\n", + " updatemenu[0][\"buttons\"] = buttons\n", + " updatemenu[0][\"direction\"] = \"down\"\n", + " updatemenu[0][\"showactive\"] = True\n", + "\n", + " # add dropdown menus to the figure\n", + " fig.update_layout(showlegend=False, updatemenus=updatemenu)\n", + "\n", + " # Add annotation as instruction\n", + " if include_instruct:\n", + " fig.add_annotation(\n", + " text=\"Select a KPI from the drop down list\",\n", + " xref=\"paper\",\n", + " yref=\"paper\",\n", + " x=0.0,\n", + " y=1.1, # Positions the text above the plot\n", + " showarrow=False,\n", + " font=dict(size=12),\n", + " )\n", + "\n", + " return fig" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -30,20 +165,20 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ - "%load_ext pycodestyle_magic" + "# %load_ext pycodestyle_magic" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ - "%pycodestyle_on" + "# %pycodestyle_on" ] }, { @@ -55,7 +190,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -68,7 +203,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -91,7 +226,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -107,11 +242,11 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ - "output_dir = '../outputs/'" + "output_dir = \"../outputs/\"" ] }, { @@ -130,7 +265,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -162,7 +297,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -257,7 +392,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -362,12 +497,13 @@ "source": [ "display(trial.trial_results_df.head())\n", "trial.trial_results_df.to_csv(\n", - " os.path.join(output_dir, 'example_trial.csv'), index=False)" + " os.path.join(output_dir, \"example_trial.csv\"), index=False\n", + ")" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -472,12 +608,13 @@ "source": [ "display(trial.interval_audit_df.head())\n", "trial.interval_audit_df.to_csv(\n", - " os.path.join(output_dir, 'example_interval_audit.csv'), index=False)" + " os.path.join(output_dir, \"example_interval_audit.csv\"), index=False\n", + ")" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -561,51 +698,22 @@ "source": [ "display(trial.overall_results_df.head())\n", "trial.overall_results_df.to_csv(\n", - " os.path.join(output_dir, 'example_overall.csv'), index=False)" + " os.path.join(output_dir, \"example_overall.csv\"), index=False\n", + ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## View spread of results across replications" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_results_spread(column, x_label, file):\n", - " \"\"\"\n", - " Plot spread of results from across replications, for chosen column.\n", - " Show figure and save under specified file name.\n", - "\n", - " Arguments:\n", - " column (str):\n", - " Name of column to plot.\n", - " x_label (str):\n", - " X axis label.\n", - " file (str):\n", - " Filename to save figure to.\n", - " \"\"\"\n", - " fig = px.histogram(trial.trial_results_df[column])\n", - " fig.update_layout(\n", - " xaxis_title=x_label,\n", - " yaxis_title='Frequency'\n", - " )\n", + "## View spread of results across replications\n", "\n", - " # Show figure\n", - " fig.show()\n", - "\n", - " # Save figure\n", - " fig.write_image(os.path.join(output_dir, file))" + "> TM Note: I have kept code as before, but added the additional user controlled histogram plot to select KPIs" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -645,20 +753,6 @@ }, "data": [ { - "alignmentgroup": "True", - "bingroup": "x", - "hovertemplate": "variable=arrivals
value=%{x}
count=%{y}", - "legendgroup": "arrivals", - "marker": { - "color": "#636efa", - "pattern": { - "shape": "" - } - }, - "name": "arrivals", - "offsetgroup": "arrivals", - "orientation": "v", - "showlegend": true, "type": "histogram", "x": [ 10972, @@ -692,22 +786,24 @@ 10589, 10863, 10796 - ], - "xaxis": "x", - "yaxis": "y" + ] } ], "layout": { - "barmode": "relative", - "legend": { - "title": { - "text": "variable" - }, - "tracegroupgap": 0 - }, - "margin": { - "t": 60 - }, + "annotations": [ + { + "font": { + "size": 12 + }, + "showarrow": false, + "text": "Select a KPI from the drop down list", + "x": 0, + "xref": "paper", + "y": 1.1, + "yref": "paper" + } + ], + "showlegend": false, "template": { "data": { "bar": [ @@ -1524,32 +1620,218 @@ } } }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "Arrivals" + "updatemenus": [ + { + "buttons": [ + { + "args": [ + { + "x": [ + [ + 10972, + 10784, + 10854, + 10831, + 10720, + 10772, + 10831, + 10781, + 10772, + 10705, + 10927, + 10688, + 11092, + 10640, + 10904, + 10849, + 10719, + 10713, + 10568, + 10707, + 10845, + 10726, + 10618, + 10914, + 10660, + 10685, + 10806, + 10748, + 10589, + 10863, + 10796 + ] + ] + }, + { + "xaxis": { + "title": "Patient Arrivals (n)" + } + } + ], + "label": "Patient Arrivals", + "method": "update" + }, + { + "args": [ + { + "x": [ + [ + 0.504541081338615, + 0.514150649003393, + 0.5232349226016817, + 0.4791488631810612, + 0.46145745726579823, + 0.3882646868128185, + 0.4669381081669874, + 0.625888360901447, + 0.4684971326393017, + 0.5634349862001105, + 0.562585969190057, + 0.39781182403365434, + 0.44530362984867583, + 0.4397605749351992, + 0.6107822771635987, + 0.47670998312351787, + 0.428336230071242, + 0.505574486075843, + 0.3615821082986753, + 0.4191589720392036, + 0.6120142008002236, + 0.5173212645251098, + 0.5316566599495316, + 0.5270546197660896, + 0.5029697553047842, + 0.6270646900660448, + 0.5061794260886525, + 0.4925537687951073, + 0.4577189216542841, + 0.5422405738480466, + 0.5102078888697092 + ] + ] + }, + { + "xaxis": { + "title": "Nurse waiting time (minutes)" + } + } + ], + "label": "Nurse waiting time", + "method": "update" + }, + { + "args": [ + { + "x": [ + [ + 9.84226781662332, + 10.060480983450425, + 9.925024519746302, + 9.9370571543943, + 10.015904147971671, + 9.884995942861282, + 10.041799654744745, + 10.086979128063648, + 10.202270228377186, + 10.09260227901333, + 10.083553615426284, + 9.893334037740962, + 9.810905063859671, + 9.933879963761742, + 10.167683587926042, + 9.975581276412813, + 9.809804967118032, + 9.989154604862323, + 9.800182515281657, + 9.9193906381964, + 9.813774247048583, + 9.858186468091487, + 9.969891296475984, + 9.925291785145637, + 9.96454608027881, + 10.236338445072258, + 10.039653295082593, + 10.050997027592315, + 10.044180668559221, + 10.034383892923174, + 9.922063713004379 + ] + ] + }, + { + "xaxis": { + "title": "Patient contact time (minutes)" + } + } + ], + "label": "Patient contact time", + "method": "update" + }, + { + "args": [ + { + "x": [ + [ + 0.4996386466177992, + 0.5019905433327594, + 0.4981297032213408, + 0.49822049332297624, + 0.4968703372055205, + 0.492904233058074, + 0.503356251584998, + 0.5034489381047406, + 0.508790994907774, + 0.49997178325917613, + 0.5098373896503802, + 0.4895233535105571, + 0.5034276977164731, + 0.48925457544062534, + 0.513130373051619, + 0.5009629889699926, + 0.4866947365248423, + 0.4954087210793937, + 0.4793715775153063, + 0.4915291568180775, + 0.49261944375555833, + 0.48940978932654106, + 0.4892835610032433, + 0.5013818263178943, + 0.49160360886911897, + 0.5060501169430693, + 0.5022615440123254, + 0.4999546777219452, + 0.4923573694687436, + 0.5046064549261675, + 0.49578999982774674 + ] + ] + }, + { + "xaxis": { + "title": "Nurse Utilization (%)" + } + } + ], + "label": "Nurse Utilization", + "method": "update" + } + ], + "direction": "down", + "showactive": true } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], + ], + "xaxis": { "title": { - "text": "Frequency" + "text": "Patient Arrivals (n)" } } } }, + "image/png": "iVBORw0KGgoAAAANSUhEUgAABA0AAAFoCAYAAAA8fAKjAAAgAElEQVR4Xu3dBZxVRf/H8R9tB6JiY4ICKogiGEiIiNg0iHT30t3d3Q2SIgoiiAoGimAgqChY2EEpApL/meG/++wuu3DuzmXZM/M5r5ev54E9c+/M+zde93zvnDnpjqlDOBBAAAEEEEAAAQQQQAABBBBAAIFEAukIDZgTCCCAAAIIIIAAAggggAACCCCQlAChAfMCAQQQQAABBBBAAAEEEEAAAQSSFCA0YGIggAACCCCAAAIIIIAAAggggAChAXMAAQQQQAABBBBAAAEEEEAAAQSCC7DSILgVZyKAAAIIIIAAAggggAACCCDglQChgVflZrAIIIAAAggggAACCCCAAAIIBBcgNAhuxZkIIIAAAggggAACCCCAAAIIeCVAaOBVuRksAggggAACCCCAAAIIIIAAAsEFCA2CW3EmAggggAACCCCAAAIIIIAAAl4JEBp4VW4GiwACCCCAAAIIIIAAAggggEBwAUKD4FaciQACCCCAAAIIIIAAAggggIBXAoQGXpWbwSKAAAIIIIAAAggggAACCCAQXIDQILgVZyKAAAIIIIAAAggggAACCCDglQChgVflZrAIIIAAAggggAACCCCAAAIIBBcgNAhuxZkIIIAAAggggAACCCCAAAIIeCVAaOBVuRksAggggAACCCCAAAIIIIAAAsEFCA2CW3EmAggggAACCCCAAAIIIIAAAl4JEBp4VW4GiwACCCCAAAIIIIAAAggggEBwAUKD4FaciQACCCCAAAIIIIAAAggggIBXAoQGXpWbwSKAAAIIIIAAAggggAACCCAQXIDQILgVZyKAAAIIIIAAAggggAACCCDglQChgVflZrAIIIAAAggggAACCCCAAAIIBBcgNAhuxZkIIIAAAggggAACCCCAAAIIeCVAaOBVuRksAggggAACCCCAAAIIIIAAAsEFCA2CW3EmAggggAACCCCAAAIIIIAAAl4JEBp4VW4GiwACCCCAAAIIIIAAAggggEBwAUKD4FaciQACCCCAAAIIIIAAAggggIBXAoQGXpWbwSKAAAIIIIAAAggggAACCCAQXIDQILgVZyKAAAIIIIAAAggggAACCCDglQChgVflZrAIIIAAAggggAACCCCAAAIIBBcgNAhuxZkIIIAAAggggAACCCCAAAIIeCVAaOBVuRksAggggAACCCCAAAIIIIAAAsEFCA2CW3EmAggggAACCCCAAAIIIIAAAl4JEBp4VW4GiwACCCCAAAIIIIAAAggggEBwAUKD4FaciQACCCCAAAIIIIAAAggggIBXAoQGXpWbwSKAAAIIIIAAAggggAACCCAQXIDQILgVZyKAAAIIIIAAAggggAACCCDglQChgVflZrAIIIAAAggggAACCCCAAAIIBBcgNAhuxZkIIIAAAggggAACCCCAAAIIeCVAaOBVuRksAggggAACCCCAAAIIIIAAAsEFCA2CW3EmAggggAACCCCAAAIIIIAAAl4JEBp4VW4GiwACCCCAAAIIIIAAAggggEBwAUKD4FaciQACCCCAAAIIIIAAAggggIBXAoQGXpWbwSKAAAIIIIAAAggggAACCCAQXIDQILgVZyKAAAIIIIAAAggggAACCCDglQChgVflZrAIIIAAAggggAACCCCAAAIIBBcgNAhuxZkIIIAAAggggAACCCCAAAIIeCVAaOBVuRksAggggAACCCCAAAIIIIAAAsEFCA2CW3EmAggggAACCCCAAAIIIIAAAl4JEBp4VW4GiwACCCCAAAIIIIAAAggggEBwAUKD4FaciQACCCCAAAIIIIAAAggggIBXAoQGXpWbwSKAAAIIIIAAAggggAACCCAQXIDQILgVZyKAAAIIIIAAAggggAACCCDglQChgVflZrAIIIAAAggggAACCCCAAAIIBBcgNAhuxZkIIIAAAggggAACCCCAAAIIeCVAaOBVuRksAggggAACCCCAAAIIIIAAAsEFCA2CW3EmAggggAACCCCAAAIIIIAAAl4JEBp4VW4GiwACCCCAAAIIIIAAAggggEBwAUKD4FaciQACCCCAAAIIIIAAAggggIBXAoQGXpWbwSKAAAIIIIAAAggggAACCCAQXIDQILgVZyKAAAIIIIAAAggggAACCCDglQChgVflZrAIIIAAAggggAACCCCAAAIIBBcgNAhuxZkIIIAAAggggAACCCCAAAIIeCVAaOBVuRksAggggAACCCCAAAIIIIAAAsEFCA2CW3EmAggggAACCCCAAAIIIIAAAl4JEBp4VW4GiwACCCCAAAIIIIAAAggggEBwAUKD4FaciQACCCCAAAIIIIAAAggggIBXAoQGXpWbwSKAAAIIIIAAAggg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", "text/html": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "result, fig = plot_scenario(\n", - " results=scenario_results,\n", - " x_var='patient_inter',\n", - " result_var='mean_q_time_nurse',\n", - " colour_var='number_of_nurses',\n", - " xaxis_title='Patient inter-arrival time',\n", - " yaxis_title='Mean wait time for nurse (minutes)',\n", - " legend_title='Nurses')\n", - "\n", - "fig.show()\n", - "\n", - "fig.write_image(os.path.join(output_dir, 'scenario_nurse_wait.png'))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Mean nurse utilisation with those varying scenarios." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.plotly.v1+json": { - "config": { - "plotlyServerURL": "https://plot.ly" - }, - "data": [ - { - "hovertemplate": "number_of_nurses=5
patient_inter=%{x}
mean=%{y}", - "legendgroup": "5", - "line": { - "color": "#636efa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "5", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - 3, - 4, - 5, - 6, - 7 - ], - "xaxis": "x", - "y": [ - 0.6631648808967003, - 0.49767035119563796, - 0.3996749025127357, - 0.3330896999785892, - 0.28578397443647 - ], - "yaxis": "y" - }, - { - "hovertemplate": "number_of_nurses=6
patient_inter=%{x}
mean=%{y}", - "legendgroup": "6", - "line": { - "color": "#EF553B", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "6", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - 3, - 4, - 5, - 6, - 7 - ], - "xaxis": "x", - "y": [ - 0.5526433836201494, - 0.4147299909091962, - 0.33306573632813413, - 0.2775742508735594, - 0.2381519421139213 - ], - "yaxis": "y" - }, - { - "hovertemplate": "number_of_nurses=7
patient_inter=%{x}
mean=%{y}", - "legendgroup": "7", - "line": { - "color": "#00cc96", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "7", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - 3, - 4, - 5, - 6, - 7 - ], - "xaxis": "x", - "y": [ - 0.4736994683790893, - 0.355484213624623, - 0.2854853321983711, - 0.23792078646305095, - 0.20413023609764683 - ], - "yaxis": "y" - }, - { - "hovertemplate": "number_of_nurses=8
patient_inter=%{x}
mean=%{y}", - "legendgroup": "8", - "line": { - "color": "#ab63fa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "8", - "orientation": "v", - "showlegend": true, - "type": "scatter", - "x": [ - 3, - 4, - 5, - 6, - 7 - ], - "xaxis": "x", - "y": [ - 0.41448870138132116, - 0.3110493156249044, - 0.24979966567357464, - 0.20818068815516955, - 0.17861395658544094 - ], - "yaxis": "y" - }, - { - "hovertemplate": "number_of_nurses=5
patient_inter=%{x}
ci_upper=%{y}", - "legendgroup": "5", - "line": { - "color": "#636efa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "5", - "opacity": 0.5, - "orientation": "v", - "showlegend": false, - "type": "scatter", - "x": [ - 3, - 4, - 5, - 6, - 7 - ], - "xaxis": "x", - "y": [ - 0.6663216731194718, - 0.5004303474716477, - 0.4020643907650562, - 0.33476508901100027, - 0.28732862850808133 - ], - "yaxis": "y" - }, - { - "hovertemplate": "number_of_nurses=6
patient_inter=%{x}
ci_upper=%{y}", - "legendgroup": "6", - "line": { - "color": "#EF553B", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "6", - "opacity": 0.5, - "orientation": "v", - "showlegend": false, - "type": "scatter", - "x": [ - 3, - 4, - 5, - 6, - 7 - ], - "xaxis": "x", - "y": [ - 0.5552768316790022, - 0.41703074200388013, - 0.3350569007886222, - 0.2789706828159496, - 0.2394393487693585 - ], - "yaxis": "y" - }, - { - "hovertemplate": "number_of_nurses=7
patient_inter=%{x}
ci_upper=%{y}", - "legendgroup": "7", - "line": { - "color": "#00cc96", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "7", - "opacity": 0.5, - "orientation": "v", - "showlegend": false, - "type": "scatter", - "x": [ - 3, - 4, - 5, - 6, - 7 - ], - "xaxis": "x", - "y": [ - 0.4759564748237934, - 0.35745649018143, - 0.2871921279442676, - 0.23911772812795684, - 0.205233727516593 - ], - "yaxis": "y" - }, - { - "hovertemplate": "number_of_nurses=8
patient_inter=%{x}
ci_upper=%{y}", - "legendgroup": "8", - "line": { - "color": "#ab63fa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "8", - "opacity": 0.5, - "orientation": "v", - "showlegend": false, - "type": "scatter", - "x": [ - 3, - 4, - 5, - 6, - 7 - ], - "xaxis": "x", - "y": [ - 0.41646364586365403, - 0.31277508414642846, - 0.2512931119512341, - 0.20922801211196218, - 0.17957951157701885 - ], - "yaxis": "y" - }, - { - "hovertemplate": "number_of_nurses=5
patient_inter=%{x}
ci_lower=%{y}", - "legendgroup": "5", - "line": { - "color": "#636efa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "5", - "opacity": 0.5, - "orientation": "v", - "showlegend": false, - "type": "scatter", - "x": [ - 3, - 4, - 5, - 6, - 7 - ], - "xaxis": "x", - "y": [ - 0.6600080886739289, - 0.4949103549196282, - 0.3972854142604152, - 0.3314143109461782, - 0.2842393203648587 - ], - "yaxis": "y" - }, - { - "hovertemplate": "number_of_nurses=6
patient_inter=%{x}
ci_lower=%{y}", - "legendgroup": "6", - "line": { - "color": "#EF553B", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "6", - "opacity": 0.5, - "orientation": "v", - "showlegend": false, - "type": "scatter", - "x": [ - 3, - 4, - 5, - 6, - 7 - ], - "xaxis": "x", - "y": [ - 0.5500099355612966, - 0.4124292398145123, - 0.33107457186764605, - 0.2761778189311692, - 0.2368645354584841 - ], - "yaxis": "y" - }, - { - "hovertemplate": "number_of_nurses=7
patient_inter=%{x}
ci_lower=%{y}", - "legendgroup": "7", - "line": { - "color": "#00cc96", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "7", - "opacity": 0.5, - "orientation": "v", - "showlegend": false, - "type": "scatter", - "x": [ - 3, - 4, - 5, - 6, - 7 - ], - "xaxis": "x", - "y": [ - 0.47144246193438516, - 0.35351193706781603, - 0.2837785364524746, - 0.23672384479814507, - 0.20302674467870066 - ], - "yaxis": "y" - }, - { - "hovertemplate": "number_of_nurses=8
patient_inter=%{x}
ci_lower=%{y}", - "legendgroup": "8", - "line": { - "color": "#ab63fa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "8", - "opacity": 0.5, - "orientation": "v", - "showlegend": false, - "type": "scatter", - "x": [ - 3, - 4, - 5, - 6, - 7 - ], - "xaxis": "x", - "y": [ - 0.4125137568989883, - 0.30932354710338034, - 0.2483062193959152, - 0.2071333641983769, - 0.17764840159386303 - ], - "yaxis": "y" - } - ], - "layout": { - "legend": { - "title": { - "text": "Nurses" - }, - "tracegroupgap": 0 - }, - "margin": { - "t": 60 - }, - "template": { - "data": { - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "barpolar": [ - { - "marker": { - "line": { - "color": "#E5ECF6", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "white", - "linecolor": "white", - "minorgridcolor": "white", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ] - }, - "layout": { - "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1 - }, - "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1, - "#f0f921" - ] - ] - }, - "colorway": [ - "#636efa", - "#EF553B", - "#00cc96", - "#ab63fa", - "#FFA15A", - "#19d3f3", - "#FF6692", - "#B6E880", - "#FF97FF", - "#FECB52" - ], - "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "#E5ECF6", - "showlakes": true, - "showland": true, - "subunitcolor": "white" - }, - "hoverlabel": { - "align": "left" - }, - "hovermode": "closest", - "mapbox": { - "style": "light" - }, - "paper_bgcolor": "white", - "plot_bgcolor": "#E5ECF6", - "polar": { - "angularaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "radialaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "scene": { - "xaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "yaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - }, - "zaxis": { - "backgroundcolor": "#E5ECF6", - "gridcolor": "white", - "gridwidth": 2, - "linecolor": "white", - "showbackground": true, - "ticks": "", - "zerolinecolor": "white" - } - }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" - } - }, - "ternary": { - "aaxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "baxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - }, - "bgcolor": "#E5ECF6", - "caxis": { - "gridcolor": "white", - "linecolor": "white", - "ticks": "" - } - }, - "title": { - "x": 0.05 - }, - "xaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - }, - "yaxis": { - "automargin": true, - "gridcolor": "white", - "linecolor": "white", - "ticks": "", - "title": { - "standoff": 15 - }, - "zerolinecolor": "white", - "zerolinewidth": 2 - } - } - }, - "xaxis": { - "anchor": "y", - "domain": [ - 0, - 1 - ], - "title": { - "text": "Patient inter-arrival time" - } - }, - "yaxis": { - "anchor": "x", - "domain": [ - 0, - 1 - ], - "title": { - "text": "Mean nurse utilisation" - } - } - } - }, - "text/html": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "result, fig = plot_scenario(\n", - " results=scenario_results,\n", - " x_var='patient_inter',\n", - " result_var='mean_nurse_utilisation',\n", - " colour_var='number_of_nurses',\n", - " xaxis_title='Patient inter-arrival time',\n", - " yaxis_title='Mean nurse utilisation',\n", - " legend_title='Nurses')\n", - "\n", - "fig.show()\n", - "\n", - "fig.write_image(os.path.join(output_dir, 'scenario_nurse_util.png'))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Example table..." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\\begin{tabular}{lllll}\n", - "\\toprule\n", - "Number of nurses & 5 & 6 & 7 & 8 \\\\\n", - "Patient inter-arrival time & & & & \\\\\n", - "\\midrule\n", - "3 & 0.66 (0.66, 0.67) & 0.55 (0.55, 0.56) & 0.47 (0.47, 0.48) & 0.41 (0.41, 0.42) \\\\\n", - "4 & 0.50 (0.49, 0.50) & 0.41 (0.41, 0.42) & 0.36 (0.35, 0.36) & 0.31 (0.31, 0.31) \\\\\n", - "5 & 0.40 (0.40, 0.40) & 0.33 (0.33, 0.34) & 0.29 (0.28, 0.29) & 0.25 (0.25, 0.25) \\\\\n", - "6 & 0.33 (0.33, 0.33) & 0.28 (0.28, 0.28) & 0.24 (0.24, 0.24) & 0.21 (0.21, 0.21) \\\\\n", - "7 & 0.29 (0.28, 0.29) & 0.24 (0.24, 0.24) & 0.20 (0.20, 0.21) & 0.18 (0.18, 0.18) \\\\\n", - "\\bottomrule\n", - "\\end{tabular}\n", - "\n" - ] - } - ], - "source": [ - "table = result.copy()\n", - "\n", - "# Combine mean and CI into single column, and round\n", - "table['mean_ci'] = table.apply(\n", - " lambda row:\n", - " f'{row['mean']:.2f} ({row['ci_lower']:.2f}, {row['ci_upper']:.2f})', axis=1\n", - ")\n", - "\n", - "# Convert from long to wide format\n", - "table = (\n", - " table\n", - " .pivot(index='patient_inter', columns='number_of_nurses', values='mean_ci')\n", - " .rename_axis('Patient inter-arrival time', axis='index')\n", - " .rename_axis('Number of nurses', axis='columns')\n", - ")\n", - "\n", - "# Convert to latex, display and save\n", - "table_latex = table.to_latex()\n", - "print(table_latex)\n", - "with open(os.path.join(output_dir, 'scenario_nurse_util.tex'), 'w') as tf:\n", - " tf.write(table_latex)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Sensitivity analysis\n", - "\n", - "Can use similar code to perform sensitivity analyses.\n", - "\n", - "**How does sensitivity analysis differ from scenario analysis?**\n", - "\n", - "* Scenario analysis focuses on a set of predefined situations which are plausible or relevant to the problem being studied. It can often involve varying multiple parameters simulatenously. The purpose is to understand how the system operates under different hypothetical scenarios.\n", - "* Sensitivity analysis varies one (or a small group) of parameters and assesses the impact of small changes in that parameter on outcomes. The purpose is to understand how uncertainty in the inputs affects the model, and how robust results are to variation in those inputs." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "There are 8 scenarios. Running:\n", - "{'mean_n_consult_time': 8}\n", - "{'mean_n_consult_time': 9}\n", - "{'mean_n_consult_time': 10}\n", - "{'mean_n_consult_time': 11}\n", - "{'mean_n_consult_time': 12}\n", - "{'mean_n_consult_time': 13}\n", - "{'mean_n_consult_time': 14}\n", - "{'mean_n_consult_time': 15}\n" - ] - } - ], - "source": [ - "# Run scenarios\n", - "sensitivity_consult = run_scenarios({\n", - " 'mean_n_consult_time': [8, 9, 10, 11, 12, 13, 14, 15]\n", - "})" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ + }, { "data": { "application/vnd.plotly.v1+json": { @@ -7429,126 +4751,63 @@ }, "data": [ { - "hovertemplate": "mean_n_consult_time=%{x}
mean=%{y}", - "legendgroup": "", - "line": { - "color": "#636efa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "", - "orientation": "v", - "showlegend": false, - "type": "scatter", - "x": [ - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15 - ], - "xaxis": "x", - "y": [ - 0.15117881736778396, - 0.28394136348868726, - 0.499036905566402, - 0.8385104727236156, - 1.355692289891784, - 2.1482656075001905, - 3.3720354896743534, - 5.303240505365226 - ], - "yaxis": "y" - }, - { - "hovertemplate": "mean_n_consult_time=%{x}
ci_upper=%{y}", - "legendgroup": "", - "line": { - "color": "#636efa", - "dash": "solid" - }, + "alignmentgroup": "True", + "bingroup": "x", + "hovertemplate": "variable=mean_nurse_utilisation
value=%{x}
count=%{y}", + "legendgroup": "mean_nurse_utilisation", "marker": { - "symbol": "circle" - }, - "mode": "lines", - "name": "", - "opacity": 0.5, - "orientation": "v", - "showlegend": false, - "type": "scatter", - "x": [ - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15 - ], - "xaxis": "x", - "y": [ - 0.15983016146041065, - 0.2991290227720832, - 0.5237570297813028, - 0.87899921832706, - 1.4189265664774497, - 2.2439600794885455, - 3.520325590336425, - 5.544361101434637 - ], - "yaxis": "y" - }, - { - "hovertemplate": "mean_n_consult_time=%{x}
ci_lower=%{y}", - "legendgroup": "", - "line": { "color": "#636efa", - "dash": "solid" - }, - "marker": { - "symbol": "circle" + "pattern": { + "shape": "" + } }, - "mode": "lines", - "name": "", - "opacity": 0.5, + "name": "mean_nurse_utilisation", + "offsetgroup": "mean_nurse_utilisation", "orientation": "v", - "showlegend": false, - "type": "scatter", + "showlegend": true, + "type": "histogram", "x": [ - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15 + 0.4996386466177992, + 0.5019905433327594, + 0.4981297032213408, + 0.49822049332297624, + 0.4968703372055205, + 0.492904233058074, + 0.503356251584998, + 0.5034489381047406, + 0.508790994907774, + 0.49997178325917613, + 0.5098373896503802, + 0.4895233535105571, + 0.5034276977164731, + 0.48925457544062534, + 0.513130373051619, + 0.5009629889699926, + 0.4866947365248423, + 0.4954087210793937, + 0.4793715775153063, + 0.4915291568180775, + 0.49261944375555833, + 0.48940978932654106, + 0.4892835610032433, + 0.5013818263178943, + 0.49160360886911897, + 0.5060501169430693, + 0.5022615440123254, + 0.4999546777219452, + 0.4923573694687436, + 0.5046064549261675, + 0.49578999982774674 ], "xaxis": "x", - "y": [ - 0.14252747327515727, - 0.2687537042052913, - 0.47431678135150124, - 0.7980217271201712, - 1.2924580133061183, - 2.0525711355118355, - 3.223745389012282, - 5.062119909295815 - ], "yaxis": "y" } ], "layout": { + "barmode": "relative", "legend": { "title": { - "text": "Nurses" + "text": "variable" }, "tracegroupgap": 0 }, @@ -8378,7 +5637,7 @@ 1 ], "title": { - "text": "Mean nurse consultation time (minutes)" + "text": "Mean nurse utilisation" } }, "yaxis": { @@ -8388,15 +5647,16 @@ 1 ], "title": { - "text": "Mean wait time for nurse (minutes)" + "text": "Frequency" } } } }, + "image/png": "iVBORw0KGgoAAAANSUhEUgAABA0AAAFoCAYAAAA8fAKjAAAgAElEQVR4Xu3dCbxO1f7H8R/HlIQklNJ8m6i4pSJlSsiQDAmZp8zzPMs8zwllJhUJESkREtVVuTeV6pKSmZTM/712f+c6OMc+1n72Xut5Pvv/6vW/Za9hv3/b4fk+a6+d4oxzCAcCCCCAAAIIIIAAAggggAACCCBwnkAKQgPuCQQQQAABBBBAAAEEEEAAAQQQuJgAoQH3BQIIIIAAAggggAACCCCAAAIIXFSA0IAbAwEEEEAAAQQQQAABBBBAAAEECA24BxBAAAEEEEAAAQQQQAABBBBAwLsAKw28W3EmAggggAACCCCAAAIIIIAAAjElQGgQU+XmYhFAAAEEEEAAAQQQQAABBBDwLkBo4N2KMxFAAAEEEEAAAQQQQAABBBCIKQFCg5gqNxeLAAIIIIAAAggggAACCCCAgHcBQgPvVpyJAAIIIIAAAggggAACCCCAQEwJEBrEVLm5WAQQQAABBBBAAAEEEEAAAQS8CxAaeLfiTAQQQAABBBBAAAEEEEAAAQRiSoDQIKbKzcUigAACCCCAAAIIIIAAAggg4F2A0MC7FWcigAACCCCAAAIIIIAAAgggEFMChAYxVW4uFgEEEEAAAQQQQAABBBBAAAHvAoQG3q04EwEEEEAAAQQQQAABBBBAAIGYEiA0iKlyc7EIIIAAAggggAACCCCAAAIIeBcgNPBuxZkIIIAAAggggAACCCCAAAIIxJQAoUFMlZuLRQABBBBAAAEEEEAAAQQQQMC7AKGBdyvORAABBBBAAAEEEEAAAQQQQCCmBAgNYqrcXCwCCCCAAAIIIIAAAggggAAC3gUIDbxbcSYCCCCAAAIIIIAAAggggAACMSVAaBBT5eZiEUAAAQQQQAABBBBAAAEEEPAuQGjg3YozEUAAAQQQQAABBBBAAAEEEIgpAUKDmCo3F4sAAggggAACCCCAAAIIIICAdwFCA+9WnIkAAggggAACCCCAAAIIIIBATAkQGsRUublYBBBAAAEEEEAAAQQQQAABBLwLEBp4t+JMBBBAAAEEEEAAAQQQQAABBGJKgNAgpsrNxSKAAAIIIIAAAggggAACCCDgXYDQwLsVZyKAAAIIIIAAAggggAACCCAQUwKEBjFVbi4WAQQQQAABBBBAAAEEEEAAAe8ChAberTgTAQQQQAABBBBAAAEEEEAAgZgSIDSIqXJzsQgggAACCCCAAAIIIIAAAgh4FyA08G7FmQgggAACCCCAAAIIIIAAAgjElAChQUyVm4tFAAEEEEAAAQQQQAABBBBAwLsAoYF3K85EAAEEEEAAAQQQQAABBBBAIKYECA1iqtxcLAIIIIAAAggggAACCCCAAALeBQgNvFtxJgIIIIAAAggggAACCCCAAAIxJUBoEFPl5mIRQAABBBBAAAEEEEAAAQQQ8C5AaODdijMRQAABBBBAAAEEEEAAAQQQiCkBQoOYKjcXiwACCCCAAAIIIIAAAggggIB3AUID71aciQACCCCAAAIIIIAAAggggEBMCRAaxFS5uVgEEEAAAQQQQAABBBBAAAEEvAsQGni34kwEEEAAAQQQQAABBBBAAAEEYkqA0CCmys3FIoAAAggggAACCCCAAAIIIOBdgNDAuxVnIoAAAggggAACCCCAAAIIIBBTAoQGMVVuLhYBBBBAAAEEEEAAAQQQQAAB7wKEBt6tOBMBBBBAAAEEEEAAAQQQQACBmBIgNIipcnOxCCCAAAIIIIAAAggggAACCHgXIDTwbsWZCCCAAAIIIIAAAggggAACCMSUAKFBTJWbi0UAAQQQQAABBBBAAAEEEEDAuwChgXcrzkQAAQQQQAABBBBAAAEEEEAgpgQIDWKq3FwsAggggAACCCCAAAIIIIAAAt4FCA28W3EmAggggAACCCCAAAIIIIAAAjElQGgQU+XmYhFAAAEEEEAAAQQQQAABBBDwLkBo4N2KMxFAAAEEEEAAAQQQQAABBBCIKQFCg5gqNxeLAAIIIIAAAggggAACCCCAgHcBQgPvVpyJAAIIIIAAAggggAACCCCAQEwJEBrEVLm5WAQQQAABBBBAAAEEEEAAAQS8CxAaeLfiTAQQQAABBBBAAAEEEEAAAQRiSoDQQLPcv+w7qtkDzRFAAAEEEEAAAQQQQMAUgeuvucKUqTAPBIwQIDTQLAOhgSYgzRFAAAEEEEAAAQQQMEiA0MCgYjAVIwQIDTTLQGigCUhzBBBAAAEEEEAAAQQMEiA0MKgYTMUIAUIDzTIQGmgC0hwBBBBAAAEEEEAAAYMECA0MKgZTMUKA0ECzDIQGmoA0RwABBBBAAAEEEEDAIAFCA4OKwVSMECA00CwDoYEmIM0RQAABBBBAAAEEEDBIgNDAoGIwFSMECA08lOGb77dL3xHTZd+Bw3Jl+nTStnEVKfBgbrcloYEHQE5BAAEEEEAAAQQQQMASAUIDSwrFNAMTIDTwQF2uVhdpUvsZKVkkv3y99Uep33aIfPDGCEl/RVpCAw9+nIIAAggggAACCCCAgC0CJoYGK9d8Lt2HTJF174y7JOOAMbPktz0HZGSfZhc999l63aXi009I9WeLX7IvTkBACRAaXOI+OHPmjOQpWlc+fnuMZM6UwT27QLmmMnNsN7k113WEBvw+QgABBBBAAAEEEEAgigRMDA0OHPpdfty+S/LlueOS0oQGlyTihGQKEBp4AKvbepAUf/xBqVahmGz81zfSdeBkeXfWIEkVF0do4MGPUxBAAAEEEEAAAQQQsEXAxNAgOXaEBsnR4lwvAoQGHpS+/3Gn1Go1QE6fOi1/HT8hw3o2kaIF87otfz960kMPnIIAAggggAACCCCAAAI2CFx1RSrtaQ59+XXZvOV7mTGma3xfazd+LU27jJQ1C0bLMeczRb9RM+RT5wvJ48dPSt7ct0vPtrUlZ46scuSPo/Lw0y/KSx3rieqnae0Kkj3r1QkeT3hn+VqZNHOx7Ny1V7JcnVFqVykpNSo+6Y51NjTIkS2LzH93tbsnW7UKxaVB9TLur5//eMKMN5fL3IUfyK+/7XPH79yievz+bdoQdBAVAoQGlyij+g2t9jTo0aaWFHwot/y0Y5fUajnAeTyhq9x4fTb5/c8TUXEjcBEIIIAAAkkLtO6MEAKxJzBiQOxdM1eMwFXpU2sjqH3QqjbuIx/NHyXXOB/q1dF72FTZd/CwjO7bQtr1mSD7nU3Wh/dqKnFxKaXboCly/MRJmTCwtRso5CvRwP3g3sX5AJ/92iyyftOW+NDgh+2/StmanWVs/5by2EN55F9OOKH2XJs5rpvkuesWNzRYsHSNNK5ZTqqULSKfffmtNOs60um7jTyWP0+C0ODdlRuc82fKxMFt5c7bcsnqDZuldc9x8s7U/pIrZzZtBzqIDgFCg0vUUb05oXHH4bLqrZHxZzZoN1TKlSggZZ1/eHtCdPxG4CoQQACBSwn06KP/zdOlxuDXETBNoE8PVlSaVhPmE3kBvx5PeOr59tKwRlln08HH5fTpM1KkUivp3Ly6u7m6Wk2gjgxXXuH+//dWbXRXHqz+/1UIKjQY2KWh+3lDHeduhHjKWf283wkfrr0mczxGudpdpbrzKPVz5Yu6ocGHa7+Q9+YMkRQpUrjn1GzRX+66PZcTQtRIEBqox7Dvv/d2aVm/YnxfjToMk/vuvlWa1qkQeWxGsEKA0OASZTp85E8pVrmNvDqio5vc7dl3UCrU7S6ThraTu++4idDAitucSSKAAAL6AoQG+ob0YJ8AoYF9NWPG+gJ+hQbDJ86T73/aKeMHtJbPv/pW1Ifx1QvGyBXp0si2//4iIya+IV9984MTKJyWEydPidqAfcOSCfErDWY5KwcecD7Qnx8aqH9/de67suDdNXLg0BFJmTKFHDx8RNo1fk5qVn7KDQ1+dFYjvDKkXTxG5/6T5I+jR91VDuc+nlD8ubbuYwnnH+VKFJQBXRroY9JDVAgQGngo44frvpDRk9+Sv44dd35TppSalUq4KZ46WGngAZBTEEAAgSgQIDSIgiJyCckWIDRINhkNokDAr9Dg39/+JNWb9ZO1C8fKmFfny779h2Rw98Zy8tQpKemsQij0yP3uB32158AHH38unQdMShAavD6xp+S+85YLQoN5i1bJyFfekAmD2sj999zm/nrF+j2k/FMF40ODX5y9Dsb0a5kgNDh56qQM6f5igtCgjPOYQ1Xnc83Z/RCioHxcQgQECA00UQkNNAFpjgACCFgiQGhgSaGYpq8ChAa+ctKZJQJ+hQbqcktV7yBtnWBg0Lg50tV5NKBwgQfczQtLVG0ni6YPcF/hro6Rk96UOW+v9BQadHHCBbXvgdqcXR1qZXSRiq3cRwzOrjRY52y6qPo/e6jHE+5zAgYVUpy70qBJ5xHOnguZpG+HuvHnqpUHah8FtYKBAwElQGigeR8QGmgC0hwBBBCwRIDQwJJCMU1fBQgNfOWkM0sE/AwNVBigNiL8/sef3f0KUqdO5a5efrRsUzdEKF/yMVnlrGqeNu89+fI/22TdO+Pcc9SeBomtNBj32gJ3D4TZ47vLn0ePycCxs2Xrtu1SxHm7mwoF1OMJ6q0JHZtWc/v/bPNWadDe2ShxbDd3ZcK5ocHqTzZLqx5jZVTf5vLog/c6b3zY5r7hYcxLLeShB+6ypGJMM9IChAaawoQGmoA0RwABBCwRIDSwpFBM01cBQgNfOenMEgE/QwO1qbp6dODZ0o8n+DZfvd1ABQoqQCj86APSqXk1qdNqkOzZf1Demz3EfeViYqHBQWcfg7a9x8vmf38v2ZxXMapwYK/z6EP/0TOlmbN54c+/7nHDBPXYw6IV65w9FNK6r2Ss/VxJtwLnv3Jx5lsrZOq8ZbLPeZuDeuWiejWjetSBA4GzAoQGmvcCoYEmIM0RQAABSwQIDSwpFNP0VYDQwFdOOrNEwM/QwJJLZpoIJClAaKB5gxAaaALSHAEEELBEgNDAkkIxTV8FCA185aQzSwQIDSwpFNMMTIDQQJOa0EATkOYIIICAJQKEBpYUimn6KkBo4CsnnVkiQGhgSaGYZmAChAaa1IQGmoA0RwABBCwRIDSwpFBM01cBQgNfOenMEgFCA0sKxTQDEyA00KQmNNAEpDkCCCBgiQChgSWFYpq+ChAa+MpJZ5YIEBpYUiimGZgAoYEmNaGBJiDNEUAAAUsECA0sKRTT9FWA0MBXTjqzRIDQwJJCMc3ABAgNNKkJDTQBaY4AAghYIkBoYEmhmKavAoQGvnLSmSUChAaWFIppBiZAaKBJTWigCUhzBBBAwBIBQgNLCsU0fRUgNPCVk84sESA0sKRQTDMwAUIDTWpCA01AmiOAAAKWCBAaWFIopumrAKGBr5x0ZolAGKHBt9vOyNGj3oH+cVsKueIK7+dzJgI6AoQGOnpOW0IDTUCaI4AAApYIEBpYUiim6asAoYGvnHRmiUAYoUGfISdl+89nPAt1b5dKbroxhefzOREBHQFCAx09QgNNPZojgAAC9ggQGthTK2bqnwChgX+W9GSPAKGBPbUKY6brN22RW266TnJcm0Ve7DRCShd9WMqWKCAPP/2iLJzaT5au3CA/bP9V+naoe1nTS6z/y+rMp0aEBpqQrDTQBKQ5AgggYIkAoYElhWKavgoQGvjKSWeWCBAaWFKokKbZrMsoaVCjjNx/z21y+MifkjZNavefs6FBpqsyyKlTpyTDlZf3/Ehi/Yd0ue6whAaa+oQGmoA0RwABBCwRIDSwpFBM01cBQgNfOenMEoFoDw3Uh9tmdSrIx59+5X4j3qFJVVmz4Uv50fnfzsdDmTi4raS/Iq37a32GT5Pf9hyQ1KlTSb+O9STP3bfK6dNnpN+oGW579eE4f967pY/zrXqquDhp3nWU3P2Pm2XL1h9l996DkiNbFhnZu5nExaVMtPrT33hPtm7bISdPnpJde/bLn0ePyag+zeT6HFmlYfuh8kzJQlK62MNu+3P/PX/pxtKwRlmZ+voyWT53qLy+8AOZt+hDOeM85XHN1RllYNeGcuP12RK9jqRux8TG/eW3vTL2tQWSPevV0u7F52T+u2uSXGmwduPXMnj8HDl+/ISkTpXKbfP4I/fL3v2HpMuASbJ95245dfq01Kr8lNSo+KRMnr0k0f6//eFn6T1sqhw49LsbUrSoX1GKFMgrSfn59VuO0EBTktBAE5DmCCCAgCUChAaWFIpp+ipAaOArJ51ZIhDtoUGBck2lbtXSUr/a0/LG4lXSf/QsWfjaS5IrZ3ap23qQVC5bWEoWyS+VGvSU58oVkSrOP19986M06zJS3p83XFat+0LGvLpA3nyll6hdGCo37CWNXyjnfrBv1WOsHPr9iEwa2l7iUqaUZ+p2c0KJ56XgQ7kTrf6s+e/L+GlvO3PoJ1mzZJKXRs5wv6Vv1aBSkqGBuo4KpQpJ20bPuWOWrt7Rnd+V6dPJ28s+lqN/HZOq5Ysmeh2pU8UlOqekwopytbu6jx6olQaXejxBndurbS3Jl+cfbjAya/4K6dO+rmM+U/46dtz93zt+2S1la3WR5XOGSrasmeVi/T9d/FEpX7uLu8KhXImCbl81mvWTFU5YsmTlJ4n6+fVbjtBAU5LQQBOQ5ggggIAlAoQGlhSKafoqQGjgKyedWSIQC6HBtFGd5Y5bbpBPPvu3u2pg0fQBbnV6DHlVbrs5pzzhfBv+bL3usnHpxPhVAlUa9ZK2jZ+Th52VBcecb87Vt93q6Dn0NcmpVgU43/qr0CBfnjukpvPNuTqadxstRQvmdT/cJ3ao0OCTz7bImH4t3VNmvLlc/v3tf2VAlwaXDA3GD2gtD9x7u/sBvHDFVtLaCRqeKpxfMmfK4Pb1045dSV5HYnPyKzSo12aws2FlDqnzXEl31cPZ49Sp086KjdPuCg51lHICj/6d60ve3HdcNDS437nGyg17yieLx0uKFH9vgFm96UtSzwl+fv1tX6J+fv2WIzTQlCQ00ASkOQIIIGCJAKGBJYVimr4KEBr4yklnlgjEQmjwxiu93Q/6n37xjQyZMFfecFYNqEMtf1crDh68/06p1rSvZHc2+zt7qG/ue7SuKY/8814ZMn6u+223euzgl117pVqF4tK4Zjk3NHgsfx6pVOYJt9n5/36xW0CFBl/+e5sM6tbI/eVz/z2pD+9qpcGc8T3kphuyu+22bP3JWd6/WNY5GxXmvvMW6dGmlhz+/Y9Er0OFC4kdfoUG6jGEl6e/I++v+UwyZkgv7Z1HQQo9fJ988/12GT3lLdmz75Br+K1jOXlYe3dFwsVWGuRyrrF9nwnuYxhnjyadRziBTD43wEnMz6/fcoQGmpKEBpqANEcAAQQsESA0sKRQTNNXAUIDXznpzBIBQoPsUsp51OCZOt3cb7bPP9TKhKN/HZde7Wq7+xh0GzRFbrju2oiEBo07DpcyTz4qZZzl+eqo1qSv8+x/CfdRCBUazJ3Qww05zj3U/gFq3wG1B4CaY2LXkdTtmNS4yXk84dwxPvj4c+nU/xVZv2i8PFu/u9SuUjJ+BUaJqu3cPRgSCw3yOqs3KtbvkWClgbJQjyv8smsfoYHpP1sIDUyvEPNDAAEE/BEgNPDHkV7sEiA0sKtezNYfAUKD7FKnail3LwD1/58u9ojsP/i7DBgz03k+v450HTjZfSSgtrPkfttPO6WR88FevXawTaMqvq806D74VefVhldLU2fjRvXsf3lnj4CXOta/IDTY7KxUmDJniQzp/qL72MSCpWtk+UebZMLA1oleh9r7ILEjqXHVh/dWDSo7KwbyJLmnQZcWNaRO64Ey0tnUUb2eUc1fmarQ4LFnmsmkIe3l3jtvdvckUCs8hvVs6vZ5sf5VcFKhbnd3Hwr1v9WqivptB8uyOUNk8Yr1hAb+/NaPXC+EBpGzpWcEEEDAJAFCA5OqwVyCEiA0CEqacUwSIDT4OzRQ+wH0cj7M7tq9311Cr3b4V5sifvH1d9K5/yRJmza1+xhA4QIPOG8CmCwDuzSURSvW+fp4glot0L7vBLkmc0b3bQqHnMcN1CaNKsg4d6WB2iNAPWbx/upNzlzj3A0V+7Sv4+7PkNh1JHXPJTXu+GkL5VUnoFDBgXo7ggpMypYoEP/KxaUrN7hvbFCbJarw4pWZi923TKRLm8Z940HxQv+UOW+vlEmzFsvVma6Ssk8WkIOHj8hbSz6S11/uKW+/t/ai/auAptewafFvT2jbuIoUeDB3gsc51DWd/7iHH7+3eDxBU5HQQBOQ5ggggIAlAoQGlhSKafoqQGjgKyedWSIQ7aGBJWVgmgYJEBpoFoPQQBOQ5ggggIAlAoQGlhSKafoqQGjgKyedWSIQRmgwd/4p2b1XvcDQ21H12VTO6/m8nctZCOgKEBpoChIaaALSHAEEELBEgNDAkkIxTV8FCA185aQzSwTCCA0sobnsaapN+478+ddF288Z312S2l/gsgdNouGi5etk0uwlFz2jnPOogdo7gON/AoQGmncDoYEmIM0RQAABSwQIDSwpFNP0VYDQwFdOOrNEgNDAkkIxzcAECA00qQkNNAFpjgACCFgiQGhgSaGYpq8ChAa+ctKZJQKEBpYUimkGJkBooElNaKAJSHMEEEDAEgFCA0sKxTR9FSA08JWTziwRIDSwpFBMMzABQgNNakIDTUCaI4AAApYIEBpYUiim6asAoYGvnHRmiQChgSWFYpqBCRAaaFITGmgC0hwBBBCwRIDQwJJCMU1fBQgNfOWkM0sECA0sKRTTDEyA0ECTmtBAE5DmCCCAgCUChAaWFIpp+ipAaOArJ51ZIkBoYEmhmGZgAoQGmtSEBpqANEcAAQQsESA0sKRQTNNXAUIDXznpzBIBQgNLCsU0AxMgNNCkJjTQBKQ5AgggYIkAoYElhWKavgoQGvjKSWeWCBAaWFIophmYAKGBJjWhgSYgzRFAAAFLBAgNLCkU0/RVgNDAV046s0SA0MCSQjHNwAQIDTSpCQ00AWmOAAIIWCJAaGBJoZimrwKEBr5y0pklAoQGlhSKaQYmQGigSU1ooAlIcwQQQMASAUIDSwrFNH0VIDTwlZPOLBEgNLCkUEwzMAFCA01qQgNNQJojgAAClggQGlhSKKbpqwChga+cdGaJAKGBJYVimoEJEBpoUhMaaALSHAEEELBEgNDAkkIxTV8FCA185aQzSwQIDSwpFNMMTIDQQJOa0EATkOYIIICAJQKEBpYUimn6KkBo4CsnnVkiQGhgSaGYZmAChAaa1IQGmoA0RwABBCwRIDSwpFBM01cBQgNfOenMEgFCA0sKxTQDEyA00KQmNNAEpDkCCCBgiQChgSWFYpq+ChAa+MpJZ5YIEBpYUiimGZgAoYEmNaGBJiDNEUAAAUsECA0sKRTT9FWA0MBXTjqzRIDQwJJCMc3ABAgNNKkJDTQBaY4AAghYIkBoYEmhmKavAoQGvnLSmSUChAaWFIppBiZAaOCB+sSJk9J7+DRZ/tFGyXDlFdKmYRUp8+SjbktCAw+AnIIAAghEgQChQRQUkUtItgChQbLJaBAFAoQGUVBELsFXAUIDD5xjXp0v3/+4UwZ2bSTbd/4m3QZNkZlju0raNKkJDTz4cQoCCCAQDQKEBtFQRa4huQKEBskV4/xoECA0iIYqcg1+ChAaeNAsXqWNTB7WQW6+MccFZ7PSwAMgpyCAAAJRIEBoEAVF5BKSLUBokGwyGkSBAKFBFBSRS/BVgNDgEpyHj/wpTzzbUto2qiKz5r8v6dKmlub1KkrRgnndloQGvt6PdIYAAggYK0BoYGxpmFgEBQgNIohL18YKEBoYWxomFpIAocEl4Hfu2islq7WX5nWflQbVy8jmf2+Thu2HyuLpAyVb1syy7/CxkErHsAgggAACQQp07J4yyOEYCwEjBAb1PW3EPJgEAkEKXJMxbZDDMRYCxgsQGlyiRId+/0MKlG0qnyweL1dlSO+eXbf1IKn6TDEp8cSDcuwEf5gaf5czQQQQQMAHgabtTvnQC10gYJfAuKFxdk2Y2SLgg0Da1ITEPjDSRRQJEBp4KOYjZZrIW5P7SM4cWeNDgxoVn5Sij+Xj8QQPfpyCAAIIRIMAjydEQxW5huQK8HhCcsU4PxoEeDwhGqrINfgpQGjgQbP/6Jly9K/j0rNtLfnPd9ulQbshsmTGQLnm6oyEBh78OAUBBBCIBgFCg2ioIteQXAFCg+SKcX40CBAaREMVuQY/BQgNPGiqwKDrwEmyduPXblDQvklVKVKAjRA90HEKAgggEDUChAZRU0ouJBkChAbJwOLUqBEgNIiaUnIhPgkQGmhC8vYETUCaI4AAApYIEBpYUiim6asAoYGvnHRmiQChgSWFYpqBCRAaaFITGmgC0hwBBBCwRIDQwJJCMU1fBQgNfOWkM0sECA0sKRTTDEyA0ECTmtBAE5DmCCCAgCUChAaWFIpp+ipAaOArJ51ZIkBoYEmhmGZgAoQGmtSEBpqANEcAAQQsESA0sKRQTNNXAUIDXznpzBIBQgNLCsU0AxMgNNCkJjTQBKQ5AgggYIkAoYElhWKavgoQGvjKSWeWCBAaWFIophmYAKGBJjWhgSYgzRFAAAFLBAgNLCkU0/RVgNDAV046s0SA0MCSQjHNwAQIDTSpCQ00AWmOAAIIWCJAaGBJoZimrwKEBr5y0pklAoQGlhSKaQYmQGigSU1ooAlIcwQQQMASAUIDSwrFNH0VIDTwlZPOLBEgNLCkUEwzMAFCA01qQgNNQJojgAAClggQGlhSKKbpqwChga+cdGaJAKGBJYVimoEJEBpoUhMaaALSHAEEELBEgNDAkkIxTV8FCA185aQzSwQIDSwpFNMMTMC60KBq495StkQBKVX0EcmS+arAoBIbiNAg9BIwAQQQQCAQAUKDQJgZxDABQgPDCsJ0AhEgNAiEmUEsErAuNJgwfaGs+GiTfP/TTin4UB4p+2QBKfpYXkmXNk0o7IQGobAzKAIIIBC4AKFB4OQMaNHYABUAACAASURBVIAAoYEBRWAKgQsQGgROzoCGC1gXGpz13L5zt6xYvckJEDbKD9t/leKF/inlShSUh/PdLSlSpAiMndAgMGoGQgABBEIVIDQIlZ/BQxIgNAgJnmFDFSA0CJWfwQ0UsDY0OGt54uQpWfDuahk2cZ4c+eOo3HDdtdKgehmp+PTjgYQHhAYG3tVMCQEEEIiAAKFBBFDp0ngBQgPjS8QEIyBAaBABVLq0WsDK0ODMmTPy2ZffyqIV62T5qo2SJk1qKVP8USlf8jHZuWuPDB43R4oWzCftm1SNeHEIDSJOzAAIIICAEQKEBkaUgUkELEBoEDA4wxkhQGhgRBmYhEEC1oUGIye9KYvfXy979x9ygoG8Uv6px+Sx/HkkLi5lPKt6XEFtmPjpuy9HnJrQIOLEDIAAAggYIUBoYEQZmETAAoQGAYMznBEChAZGlIFJGCRgXWhQ9cU+8oyzoqBU0Ycl01VXXpTy1KnTMmrym9KmUZWIUxMaRJyYARBAAAEjBAgNjCgDkwhYgNAgYHCGM0KA0MCIMjAJgwSsCw2U3ZoNX0m2rJnlzttudCnXb9oiJ52goNDDeQKnJTQInJwBEUAAgVAECA1CYWfQkAUIDUIuAMOHIkBoEAo7gxosYF1oMGv++zJy0hsyoncz97EEdbzn7GvQY8ir0qJeRan+bPFAuQkNAuVmMAQQQCA0AUKD0OgZOEQBQoMQ8Rk6NAFCg9DoGdhQAetCg2KV28jQni9K3tx3JCD9/KtvpWO/V2TF3KGBUhMaBMrNYAgggEBoAoQGodEzcIgChAYh4jN0aAKEBqHRM7ChAtaFBnlLNJBVb46UTBkT7mfw254DUrJ6B/li+aRAqQkNAuVmMAQQQCA0AUKD0OgZOEQBQoMQ8Rk6NAFCg9DoGdhQAetCg7qtB8mdt+eSZnUqyJXp07ms+w4clsHj58jefYdkyvAOgVITGgTKzWAIIIBAaAKEBqHRM3CIAoQGIeIzdGgChAah0TOwoQLWhQY/7dglTbuMlB2/7JbMGTPI6dNn5ODhI3L7zTll4uC2kv3aqwOlJjQIlJvBDBHgw5MhhWAaCCCAQIQFCA0iDEz3RgoQGhhZFiYVooB1oYGyUkHB5n9/7wYHKVOmlFzXZ5P77rktFEZCg1DYGTRkAUKDkAvA8AgggEBAAoQGAUEzjFEChAZGlYPJGCBgZWhw5swZ95GEY8dPXECYM0fWQFkJDQLlZjBDBAgNDCkE00AAAQQiLEBoEGFgujdSgNDAyLIwqRAFrAsNln34qfQZPk0O/f7HRdm2rJoaKCehQaDcDGaIAKGBIYVgGggggECEBQgNIgxM90YKEBoYWRYmFaKAdaFB8efaSuMXykn+vHdJmjSpL6DLcW2WQDkJDQLlZjBDBAgNDCkE00AAAQQiLEBoEGFgujdSgNDAyLIwqRAFrAsNytbsLIumDwiRLOHQhAbGlIKJBChAaBAgNkMhgAACIQoQGoSIz9ChCRAahEbPwIYKWBcaNOk8Qrq2fEGC3rsgsfoRGhh6ZzOtiAoQGkSUl84RQAABYwQIDYwpBRMJUIDQIEBshrJCwLrQYOrry2TWgvelaMG87usVUzj/d+5Rp2qpQOEJDQLlZjBDBAgNDCkE00AAAQQiLEBoEGFgujdSgNDAyLIwqRAFrAsNKjXoKalSxSVKNndCj0A5CQ0C5WYwQwQIDQwpBNNAAAEEIixAaBBhYLo3UoDQwMiyMKkQBawLDUK0uujQhAamVYT5BCFAaBCEMmMggAAC4QsQGoRfA2YQvAChQfDmjGi2gJWhwfadu2XR8rXy8697ZUCXBnL69Bn57Mut8tADdwWuTWgQODkDGiBAaGBAEZgCAgggEIAAoUEAyAxhnAChgXElYUIhC1gXGqzb9LU06TxS8jsBwdqNX8uWVVPll117pUK97s4GiTWkXImCgZISGgTKzWCGCBAaGFIIpoEAAghEWIDQIMLAdG+kAKGBkWVhUiEKWBcaqFcutmlcRYoUyCv3Fq7thgbq+PSLb6Tf6Bmy8LV+gXISGgTKzWCGCBAaGFIIpoEAAghEWIDQIMLAdG+kAKGBkWVhUiEKWBca5C3RQDYtnShxcSkThAYnTp6Sh0s3ls+XTwqUk9AgUG4GM0SA0MCQQjANBBBAIMIChAYRBqZ7IwUIDYwsC5MKUcC60KBU9Q4yonczuev2XAlCgw/XfSH9R8+SFXOHBspJaBAoN4MZIkBoYEghmAYCCCAQYQFCgwgD072RAoQGRpaFSYUoYF1o8MbiVTJmynypVOYJmThjkXRqVk22btshS1Z+Iu1frCrVKhQLlJPQIFBuBjNEgNDAkEIwDQQQQCDCAoQGEQameyMFCA2MLAuTClHAutBAWamA4K3FH8n2X3ZLurRpJFfObPL8M8Wk0MP3BU5JaBA4OQMaIEBoYEARmAICCCAQgAChQQDIDGGcAKGBcSVhQiELWBkahGyWYHhCA5OqwVyCEiA0CEqacRBAAIFwBQgNwvVn9HAECA3CcWdUcwWsCw0GjJmVqOZJZzPE7q1rBqpNaBAoN4MZIkBoYEghmAYCCCAQYQFCgwgD072RAoQGRpaFSYUoYF1o0KrH2ARcZ86ckV9+2yc/7fhVShd7RHq3qxMoJ6FBoNwMZogAoYEhhWAaCCCAQIQFCA0iDEz3RgoQGhhZFiYVooB1oUFiVms2fCnqny4tagTKSWgQKDeDGSJAaGBIIZgGAgggEGEBQoMIA9O9kQKEBkaWhUmFKBA1oYEyLFeri7wzrX+gnIQGgXIzmCEChAaGFIJpIIAAAhEWIDSIMDDdGylAaGBkWZhUiAJRExp88/12adRhmHw0f1TEOA8eOiKlX+goLetVlOfKF3XHITSIGDcdGyxAaGBwcZgaAggg4KMAoYGPmHRljQChgTWlYqIBCVgXGhSp1OoCmmPHT8ihw39IwxplpWX9ihGj6zJgkmzcvFXqP1+a0CBiynRsgwChgQ1VYo4IIICAvgChgb4hPdgnQGhgX82YcWQFrAsN3l254QKRtGlSy803Zpfbbs4ZMa1Pv/hGxk1dIHfccoPzT05Cg4hJ07ENAoQGNlSJOSKAAAL6AoQG+ob0YJ8AoYF9NWPGkRWwLjSILMfFez9x4qRUbthLhvVqInMWrCQ0CKMIjGmUAKGBUeVgMggggEDEBAgNIkZLxwYLEBoYXBymFoqAdaHBU8+3l1Sp4jxhLZkx0NN5lzpp/NS35cTJU+6jDy+NnJEgNLhUW34dgWgUqN/yRDReFteEAAIIIHCewORRqTFBAAEEEIhxAetCg2lvvCfT5i2T4oUelFtvuk5Onz4jW7dtl1Xr/iXVny0uWTJnjC9ppTJPaJf3px27pGWPMTJvYi9Rj0GcHxqwEaI2MR1YKMBKAwuLxpQRQACByxBgpcFloNHEegFWGlhfQi7AZwHrQoM6rQdKm0bPSZ67bklAsX7TFpk8e4lMGd7BV6KpTkAxcfo7kjp1KrffP/78S+LiUkq1CsWlVYNKvD3BV206s0WA0MCWSjFPBBBAQE+A0EDPj9Z2ChAa2Fk3Zh05AetCg7wlGsiGxeMljfOt/7nHkT+OSqEKLeSL5ZMip+X0zEqDiPLSuSUChAaWFIppIoAAApoChAaagDS3UoDQwMqyMekIClgXGqg9DZ4u/ojUr/a0pL8inUujvv1/2VkN8NEnm+Wdqf0iyEVoEFFcOrdGgNDAmlIxUQQQQEBLgNBAi4/GlgoQGlhaOKYdMQHrQoO1G7+Wzv1fkYOHj0jmjBnkzJkz7v++KkN6GdWnuTz0wF0Rw7pYx+xpECg3gxkiQGhgSCGYBgIIIBBhAUKDCAPTvZEChAZGloVJhShgXWigrNSbDP719Xfy254DbmhwbdbMki/3HRc8shCEK6FBEMqMYZoAoYFpFWE+CCCAQGQECA0i40qvZgsQGphdH2YXvICVocGpU6flsy+/lZ279kiFUoVcNbWnQYYrrwhckNAgcHIGNECA0MCAIjAFBBBAIAABQoMAkBnCOAFCA+NKwoRCFrAuNPj51z1Sv+0Q2bv/oBz967hsWTXVCQ/2SsX6PWTSkHaS5+5bAyUlNAiUm8EMESA0MKQQTAMBBBCIsAChQYSB6d5IAUIDI8vCpEIUsC40qN1qoOTLc4c0rV1B7itW1w0N1DFr/gpZ/tEmmTaqc6CchAaBcjOYIQKEBoYUgmkggAACERYgNIgwMN0bKUBoYGRZmFSIAtaFBvmcVy6ud165mNZ55eK9hWvHhwZqn4OC5ZrKp+++HCgnoUGg3AxmiAChgSGFYBoIIIBAhAUIDSIMTPdGChAaGFkWJhWigHWhQeGKreTNSb0la5ZMCUKD7378WdQqhLULxwbKSWgQKDeDGSJAaGBIIZgGAgggEGEBQoMIA9O9kQKEBkaWhUmFKGBdaDBo3BzZsvVHaVLrGanXdrC8NbmPfPvDDhk/daEUfCi3dG9dM1BOQoNAuRnMEAFCA0MKwTQQQACBCAsQGkQYmO6NFCA0MLIsTCpEAetCg7+OHZeBY2bLwuVr5fjxEy5d+ivSSdXyRaVZ3QruYwtBHoQGQWozlikChAamVIJ5IIAAApEVIDSIrC+9mylAaGBmXZhVeALWhQZnqU6cOCm79x10QwL1qEJYB6FBWPKMG6YAoUGY+oyNAAIIBCdAaBCcNSOZI0BoYE4tmIkZAtaFBoWeaS4Lp/aXLJmvMkKQ0MCIMjCJgAUIDQIGZzgEEEAgJAFCg5DgGTZUAUKDUPkZ3EAB60KDZl1GSQFn74JqFYoZwUloYEQZmETAAoQGAYMzHAIIIBCSAKFBSPAMG6oAoUGo/AxuoIB1oUGXAZPk40+/kivTp5MbrssmqVLFJWCdMLB1oMyEBoFyM5ghAoQGhhSCaSCAAAIRFiA0iDAw3RspQGhgZFmYVIgC1oUG6u0Jqc8LCs71a9OoSqCchAaBcjOYIQKEBoYUgmkggAACERYgNIgwMN0bKUBoYGRZmFSIAtaFBiFaXXRoQgPTKsJ8ghAgNAhCmTEQQACB8AUIDcKvATMIXoDQIHhzRjRbwJrQIE/ROrJkxiDJlTNbvOiz9brLyD7NnP+WPTRlQoPQ6Bk4RAFCgxDxGRoBBBAIUIDQIEBshjJGgNDAmFIwEUMErAkN7i1cW5bOUqHB/wICFSTMn9JX7rjlhtA4CQ1Co2fgEAUIDULEZ2gEEEAgQAFCgwCxGcoYAUIDY0rBRAwRIDTQLAShgSYgza0UIDSwsmxMGgEEEEi2AKFBssloEAUChAZRUEQuwVcBQgNNTkIDTUCaWylAaGBl2Zg0AgggkGwBQoNkk9EgCgQIDaKgiFyCrwKEBpqchAaagDS3UoDQwMqyMWkEEEAg2QKEBskmo0EUCBAaREERuQRfBawKDepXe1oyZ8wQDzBs4jypVfkpyZolU/x/q1O1lK9Al+qM0OBSQvx6NAoQGkRjVbkmBBBA4EIBQgPuilgUIDSIxapzzUkJWBMaPP1CJ0+VXDJjoKfz/DqJ0MAvSfqxSYDQwKZqMVcEEEDg8gUIDS7fjpb2ChAa2Fs7Zh4ZAWtCg8hcvn6vhAb6hvRgnwChgX01Y8YIIIAAAnYJENiEVy9Cg/DsGdlMAUIDzboQGmgC0txKAUIDK8vGpBFAAAEELBIgNAivWIQG4dkzspkChAaadSE00ASkuZUChAZWlo1JI4AAAghYJEBoEF6xCA3Cs2dkMwUIDTTrQmigCUhzKwUIDawsG5NGAAEEELBIgNAgvGIRGoRnz8hmChAaaNaF0EATkOZWChAaWFk2Jo0AAgggYJEAoUF4xSI0CM+ekc0UIDTQrAuhgSYgza0UIDSwsmxMGgEEEEDAIgFCg/CKRWgQnj0jmylAaKBZF0IDTUCaWylAaGBl2Zg0AggggIBFAoQG4RWL0CA8e0Y2U4DQQLMuhAaagDS3UoDQwMqyMWkEEEAAAYsECA3CKxahQXj2jGymAKGBZl0IDTQBaW6lAKGBlWVj0ggggAACFgkQGoRXLEKD8OwZ2UwBQgPNuhAaaALS3EoBQgMry8akEUAAAQQsEiA0CK9YhAbh2TOymQKEBpp1ITTQBKS5lQKEBlaWjUkjgAACCFgkQGgQXrEIDcKzZ2QzBQgNNOtCaKAJSHMrBQgNrCwbk0YAAQQQsEiA0CC8YhEahGfPyGYKEBpo1oXQQBOQ5lYKEBpYWTYmjQACCCBgkQChQXjFIjQIz56RzRQgNNCsC6GBJiDNrRQgNLCybEwaAQQQQMAiAUKD8IpFaBCePSObKUBooFkXQgNNQJpbKUBoYGXZmDQCCCCAgEUChAbhFYvQIDx7RjZTgNBAsy6EBpqANLdSgNDAyrIxaQQQQAABiwQIDcIrFqFBePaMbKYAoYFmXQgNNAFpbqUAoYGVZWPSCCCAAAIWCRAahFcsQoPw7BnZTAFCA826EBpoAtLcSgFCAyvLxqQRQAABBCwSIDQIr1iEBuHZM7KZAoQGmnUhNNAEpLmVAoQGVpaNSSOAAAIIWCRAaBBesQgNwrNnZDMFCA0060JooAlIcysFCA2sLBuTRgABBBCwSIDQILxiERqEZ8/IZgoQGmjWhdBAE5DmVgoQGlhZNiaNAAIIIGCRAKFBeMUiNAjPnpHNFCA08FCXbf/9RXoNnSpbt22X7FmvlnYvVpUnHr3fbUlo4AGQU6JOgNAg6krKBSGAAAIIGCZAaBBeQQgNwrNnZDMFCA081KVc7a5S8enHpWalErJ249fSuudYWb1gjFyRLg2hgQc/Tok+AUKD6KspV4QAAgggYJYAoUF49SA0CM+ekc0UIDS4RF1Onjol85eslgqlH5fUqeLcs/OXbixvTuotuXJmJzQw875mVhEWIDSIMDDdI4AAAgjEvAChQXi3AKFBePaMbKYAoUEy6/LVf36Qlj3GyPK5QyVVXByhQTL9OD06BAgNoqOOXAUCCCCAgLkChAbh1YbQIDx7RjZTgNAgGXX5+dc90qDdUOnasoY8lj+P2/LYidPJ6IFTEYgOgabtTkXHhXAVCCCAAAIIGCowbujfK1w5ghdImzpl8IMyIgIGCxAaeCzO1m07pGX3MdKx2fNSpEDe+Fb7Dh/32AOnIRA9Ah27p4iei+FKEEAAAQQQMFBgUN8zBs4qNqZ0TcY0sXGhXCUCHgUIDTxA7fhlt7vCoH/nBpIvzx0JWvD2BA+AnBJ1AjyeEHUl5YIQQAABBAwT4PGE8ArC4wnh2TOymQKEBh7qUrvVQHn+maLyVOH8F5xNaOABkFOiToDQIOpKygUhgAACCBgmQGgQXkEIDcKzZ2QzBQgNLlEXtY/BU8+3l9SpUyU4c2iPF6V4oX+yEaKZ9zWzirAAoUGEgekeAQQQQCDmBQgNwrsFCA3Cs2dkMwUIDTTrwkoDTUCaWylAaGBl2Zg0AggggIBFAoQG4RWL0CA8e0Y2U4DQQLMuhAaagDS3UoDQwMqyMWkEEEAAAYsECA3CKxahQXj2jGymAKGBZl0IDTQBaW6lAKGBlWVj0ggggAACFgkQGoRXLEKD8OwZ2UwBQgPNuhAaaALS3EoBQgMry8akEUAAAQQsEiA0CK9YhAbh2TOymQKEBpp1ITTQBKS5lQKEBlaWjUkjgAACCFgkQGgQXrEIDcKzZ2QzBQgNNOtCaKAJSHMrBQgNrCwbk0YAAQQQsEiA0CC8YhEahGfPyGYKEBpo1oXQQBOQ5lYKEBpYWTYmjQACCCBgkQChQXjFIjQIz56RzRQgNNCsC6GBJiDNrRQgNLCybEwaAQQQQMAiAUKD8IpFaBCePSObKUBooFkXQgNNQJpbKUBoYGXZmDQCCCCAgEUChAbhFYvQIDx7RjZTgNBAsy6EBpqANLdSgNDAyrIxaQQQQAABiwQIDcIrFqFBePaMbKYAoYFmXQgNNAFpbqUAoYGVZWPSCCCAAAIWCRAahFcsQoPw7BnZTAFCA826EBpoAtLcSgFCAyvLxqQRQAABBCwSIDQIr1iEBuHZM7KZAoQGmnUhNNAEpLmVAoQGVpaNSSOAAAIIWCRAaBBesQgNwrNnZDMFCA0060JooAlIcysFCA2sLBuTRgABBBCwSIDQILxiERqEZ8/IZgoQGmjWhdBAE5DmVgoQGlhZNiaNAAIIIGCRAKFBeMUiNAjPnpHNFCA00KwLoYEmIM2tFCA0sLJsTBoBBBBAwCIBQoPwikVoEJ49I5spQGigWRdCA01AmlspQGhgZdmYNAIIIICARQKEBuEVi9AgPHtGNlOA0ECzLoQGmoA0t1KA0MDKsjFpBBBAAAGLBAgNwisWoUF49oxspgChgWZdCA00AWlupQChgZVlY9IIIIAAAhYJEBqEVyxCg/DsGdlMAUIDzboQGmgC0txKAUIDK8vGpBFAAAEELBIgNAivWIQG4dkzspkChAaadSE00ASkuZUChAZWlo1JI4AAAghYJEBoEF6xCA3Cs2dkMwUIDTTrQmigCUhzKwUIDawsG5NGAAEEELBIgNAgvGIRGoRnz8hmChAaaNalfssTmj3Q/HIF+MP0cuX02xEa6BvSAwIIIIAAAgiYKTB5VGozJ8asEAhJgNBAE57QQBNQozmhgQaeZlNCA01AmiOAAAIIIICAsQKEBsaWhomFJEBooAlPaKAJqNGc0EADT7MpoYEmIM0RQAABBBBAwFgBQgNjS8PEQhIgNNCEJzTQBNRoTmiggafZlNBAE5DmCCCAAAIIIGCsAKGBsaVhYiEJEBpowhMaaAJqNCc00MDTbEpooAlIcwQQQAABBBAwVoDQwNjSMLGQBAgNNOEJDTQBNZoTGmjgaTYlNNAEpDkCCCCAAAIIGCtAaGBsaZhYSAKEBprwhAaagBrNCQ008DSbEhpoAtIcAQQQQAABBIwVIDQwtjRMLCQBQgNNeEIDTUCN5oQGGniaTQkNNAFpjgACCCCAAALGChAaGFsaJhaSAKGBJjyhgSagRnNCAw08zaaEBpqANEcAAQQQQAABYwUIDYwtDRMLSYDQQBOe0EATUKM5oYEGnmZTQgNNQJojgAACCCCAgLEChAbGloaJhSRAaKAJT2igCajRnNBAA0+zKaGBJiDNEUAAAQQQQMBYAUIDY0vDxEISIDTQhCc00ATUaE5ooIGn2ZTQQBOQ5ggggAACCCBgrAChgbGlYWIhCRAaaMITGmgCajQnNNDA02xKaKAJSHMEEEAAAQQQMFaA0MDY0jCxkAQIDTThCQ00ATWaExpo4Gk2JTTQBKQ5AggggAACCBgrQGhgbGmYWEgChAaa8IQGmoAazQkNNPA0mxIaaALSHAEEEEAAAQSMFSA0MLY0TCwkAUIDTXhCA01AjeaEBhp4mk0JDTQBaY4AAggggAACxgoQGhhbGiYWkgChgSY8oYEmoEZzQgMNPM2mhAaagDRHAAEEEEAAAWMFCA2MLQ0TC0mA0EATntBAE1CjOaGBBp5mU0IDTUCaI4AAAggggICxAoQGxpaGiYUkQGigCU9ooAmo0ZzQQANPsymhgSYgzRFAAAEEEEDAWAFCA2NLw8RCEiA00IQnNNAE1GhOaKCBp9mU0EATkOYIIIAAAgggYKwAoYGxpWFiIQkQGmjCExpoAmo0JzTQwNNsSmigCUhzBBBAAAEEEDBWgNDA2NIwsZAECA08wO/4Zbd0H/yqbP1+u1yfI6t0bfmC5Mtzh9uS0MADYIROITSIEKyHbgkNPCBxCgIIIIAAAghYKUBoYGXZmHQEBQgNPODWajlAij6WT2o8+6Ss27TFCRCmyIrXh0nqVHGEBh78InUKoUGkZC/dL6HBpY04AwEEEEAAAQTsFCA0sLNuzDpyAoQGl7Ddd+CwlKzWQdYvHiep4uLcsys16Ckdmjwv+fPeRWgQuXvzkj0TGlySKGInEBpEjJaOEUAAAQQQQCBkAUKDkAvA8MYJEBpcoiSff/Wd9Bk+Td5+7aX4M9v2Hi8P57tHqpQtTGgQ4i1NaBAePqFBePaMjAACCCCAAAKRFSA0iKwvvdsnQGhwiZqt2/S1jJ78lsx9uWf8md0GTZF/3HqD1Kz8FKFBiPc8P9DDw2cvj/DsGRkBBBBAAAEEIivA3zEj60vv9gkQGlyiZl98/Z30HDpV3pnaL/7MNr3GSYEHc0ulMk/YV3FmjAACCCCAAAIIIIAAAggggIBHAUKDS0AdOPS7FK/SVj5eOFauSJfGPbtU9Q7Sv3MDyZv77zcocCCAAAIIIIAAAggggAACCCAQjQKEBh6qWq/NYHnogbukQfUysvTDDe7jCktnDZa4uJQeWnMKAggggAACCCCAAAIIIIAAAnYKEBp4qNvOXXuly4BJsnXbDrnx+mzSq21tuffOmz205BQEEEAAAQQQQAABBBBAAAEE7BUgNPj/2q3Z8JUMfXmu7Nl7UHLfdYv7+EHWLJkSreynX3wjdVoPlEXTB8itua4TtTni4vfX/+/8M2fkphtzyMLX+knVF/vIN9/9VyRFCvfXM2ZIL6sXjLb3rongzHf8slu6D35Vtn6/Xa7PkVW6tnxB8uVJ/DGQg4eOSOkXOkrLehXlufJF3Zkt+/BTGT/1bTl+4qTkvC6rG/KosIfjQgHd+/6Mc5+PclbevLfqU7fzf953p1sz9SgP9733O86P+37F6k1uLX7bc0Aeznu3DOjSQK5yftZwROa+H/fa2zJ/6Wo5evSYVClXRFo3rOwOxH1/+Xfc5NlLZO7bK92f3cUff1C6tKge/6rjs72qn1kvdhouqVL9/QpkdbR/sapUf7b45Q8cIy29/Lw/fvyE5C3RQFKnThWvUrRgXhneq6n774nViPve+03k9ed9UqYnT52SkZPelNfmLnUenx0jV2e6yvsEYuxMP+77/Qd/l079Jsou58/Xc/c4476PsZspxi+X0MC5AX4/8qeUdPYpGNe/lRsYqL8M/rTjVxnRu9lFbw/1h+rzTfrKnn0HZeqoBADTIgAAG1hJREFUzm5ocP6h/vKu/tBtUqu8PP1CJxnVp7ncfkvOGL/dLn35tVoOkKKP5ZMazz4p6zZtcQKEKbLi9WGS+py/IJ7bi1oBsnHzVqn/fGk3NFAfmMrX6SpvTuotN1x3rUydt0zWfPKlTBne4dKDx9gZftz3KiyYPPtdmT66i6Rx7vdWPcfKvf+4WRrXLMd9n4z7Sfe+/8VZDVWhXneZOrKT3HbT9W6ImcEJDHq0rpmMWcTGqX7c9++u3CATZ74jr43oJKdPn5Y6rQZK0zoVpGSR/Nz3l3kbqSC+59BXZcaYrpL+irTSvNtoKfbYP6VahWIJelT2K1ZvTPTP58scPuqbeb3v9+4/5P4ZutbZx+n8I6ka8fcc77eQ15/3SZk27zpK7ro9l7w84x33SyhCg4v7+3Hf//HnX/K88+XfE48+IB99sjlBaMB97/2+50z7BQgNnBqqDz5vLVktrwxp51ZU/ZApVKGFfLpkgqRJk/qCKo97bYE4X7DKcuebvZF9ml0QGqgUuVGHYTJ/Sl9JlzaNPPFsS3l9Yk/JcW0W+++YCF7BvgOHpWS1DrJ+8bj4b5cqNegpHZo8L/nz3nXRv8CMm7pA7rjlBuefnG5osMkJEPqOnO6u8FDHdz/+LGpPClZ2XFg4P+778dMWyoGDh93VBeqYNf99+fyrb2VYzybc9x5/r/hx37+zfK0s/eBTmTCwtTvqtp92ygst+su6d8Z5nEXsnObHfa9CGRXO1KlayoWb43w7vuHz/7h/HvDz/vLupb4jpkuObFncvYPU8eG6L2Tq68tkmhPMn3vMe+dD+eqbH6Vvh7qXN1CMtvJ63/+4/VdnJccIWTZ78AVSSdWI+97bjZWcn/dJmX7jrMZUoUGeonUIDZKg9+O+//PoX6LCNPVPr2HTEoQG3Pfe7nvOig4BQgOnjhNnLJJ9Bw45SyFrxFf1cSc0UN+e3uw8YnDu8dOOXdKyxxiZN7GXVG7Y66KhQdeBk+X+e25zl6yqQy31e/zh+0S9vlE98tCqQSV5/JH7o+MO8vEqPv/qO+kzfJq8/dpL8b227T1eHs53j1QpWzjBSCec5avKf1ivJjJnwcr40EAFPir5fXlQG7n7jpvc2v7orBoZ1LWRjzONjq78uO9VSNN72FSZPqaL8+1gOmnZfbQ8+fhDUvHpx7nvPd4mftz354cGu53HrIpUauUEcOPdx6E4/ifgx31/fmigHk17dc67blDMz/vLu9vqtR0sVZ3g90nnsQR1/OB8eFUrOD6aPypBh2p5/PKPNsrx4ydFvd2okPNna+fm1eXK9Okub+AYaeX1vv/y39vcVR633nSdfPfDTrnz9hule6ua7t+FkqoR9723Gyk5P++9mBIaJO3ux31/dgT1hcj5oYGXGnm7MzgLAfMFCA2cGqnnwk6dOi1tG1eJr1iJqu1k9Est3CT33KNu60HuNyGPPnivlKvd9YLQYNee/VLNeXRBvV0hrbNK4fTpM+4S+5JFHnba3CMfrdssnfpPdPdCYOVBwt8g6zZ97b6ZYu7LPeN/Qf3l/B+33iA1Kz+V4GS1Z8GJk6ekZf2K8tLIGfGhgTpp8Yr10mXgJLnS+RB7hbPMVX1TxZ4GF/4w8uu+7+N8Qzh/yUfuM8a577pVJjkrduLi4rjvPf789+O+//W3fe6S4ldHdHR/Zg1/eZ5Mf3O5rHprZJJ7s3icYlSd5sd9v2TlJzJxuvN4gvM4SCrnXm/tPJbz294DsmjaAO77y7xbqjd9yX2sSYUA6lD39DN1u8kGZ8XfuYfau2PL1p+kdpWSctpZ8te+7wR31ce5of9lTiGqm3m979UqpRlvrpCaVZ6SnM6+QurP2o/Wb3bD/MRqtH7ReO57j3eP15/3Xv/uSGiQNLwf931ioYHXGnm8NTgNAeMFCA2cEr0yc5Gob+a6tfp7ibU6HivfXGaP7ya5cmaP/29vL/tY1jvP2Q/q9ve31hcLDdSmNDt+3ZPks8RqA8WKTz8hZYo/avwNEuQE1UqMnkOnJlj61abXOCnwYG6pVOaJ+Kmcu9pDBTPnhgbf/vCzNO0yUqY5f5lXGym+t2qjjJ7ylvuX+ZQp/96IkuNvAT/u+9cXfiArP/7cCc+auyHZoHFz5Njx49K7XZ0LmLnvL37n+XHfq57VMkz1uIgKQNWmcP1GzZRNyya6j0hx/E/Aj/te/WVx7GvzRT1fnzlTBnfl2JoNX8qc8d257y/zZqvfbohULlNYnir8kNuD+vCq/tuHb45Mske12kltnrt01qDLHDk2mnm978/XUOH8QyUbyvK5w9ww3muN+Hmv9/P+Yq0vZkpokPTvXz/u+2xZM7uDXGylwfmjc9/Hxs/TWL1KQgOn8uqbixnOt3LqcQR1qM30StfoKBvenZBg52a1ZE/90IhLmdI97+DhI+7u5P061pfCBR5w/1tN5zni+tWejn/84E9nZ231XL16XOHsUaNZP3mhUon4vxzF6s13/nWrpabFq7R1dgIe6+6+r45SzgaV6k0WeXP/7w0KanND9S3f2d2d1SY1cXEpnQ2zikuWzFfJ187zroO7N47v/oHi9WTZnCGs7DgP3I/7/i1nhcHjj97v/kVSHf/a8r2zw/Ar7jJt7ntvv7P9uO/VI0/nHl/95wfp7GwSuthZ0cSRUMCP+/7sz/uzPU9xHk342QmL1S7+3PeXd8f1Hz3TeZTmSmlWt4LbgVox9vZ7H8vkoe0TdKjChKuc887+RV4F+QPGzk4QNl/eDKK7ldf7Xm3wfPj3P+S2m//euFlt/PxPJzRQ+wJNcELJi9VodN8W3Pcebx+vP++9/t2R0CBpeD/u+7ObTJ4fGnitkcdbg9MQMF6A0MApkfrQWeL5du7mbQ/ef6f0Hz3LfY2WemWZekZe/dB5tvTjFxTzYisNHirV2F3Gp5b1qUO9EvBJ51GHUX2bud+Yq2+j2vd9WZbMGCjXXJ3R+Bsk6AmqTQsfeuAu9xGQpR9ucB9XUI96qFBAPTf8iLO/wfmvwjx3pYFa+qdWK7zh7DmhvgFU/96uzwT3LzxqGTHH/wT8uO/V0r8ftv/ivo5L+aq3hnzvhGR9O9Tjvk/GzaZ736sNml5o3k8mOR+wsmTO6OwtMcbZC+RuN8DkSCjgx33/gbO65nVnQz513+93NgJVz94Pc/73Tc7KNH7eX94dp/5C3sH5s3HmuG7uo2Xq+fnnnykmFUoVkg1f/EcyXXWl++jNMOfRm+9+3OHaqxUfajWa+u9tGv3v8cLLm0F0t/J636u/o6h9aqY5X6KoRyjVZsPqTUZzJ/RwvzS5WI2KFMjLfZ+M28fLz3v156mXnyWEBknD+3Hfnx3h/NCAv98n46bn1KgQIDT4/zKqD5cDx8x2d0d9IPft0r9TA/dDp9qMqXztLvLVB69dMjRQP5zyl24sny+f5C7VPnuo5wGHTpgru50EX4UJHZo+73745bhQYKfz6jj1GsWt23a4+xD0altb7r3zZvdEtTml2p08X55/JGh4/p4GajnagqVr3HPUShD19gUVBnFcKKB736t7Xr2t4l9ff+92fvON2aVn2zpynbMLOve99zvOj/t++hvvOa8BXCSnnccTShZ92HmjRQ2CskRKoHvfqyXbPZwl8R+s/dx9/EO9Wle9vUUd3Pfe7/vzz1SP9814a7n7iE3pYo+4KzfUY2VqQ1z1lhy154H6dq/PiGmy2nn1WepUqUR9YO3YrFr86rTLHz36W3q97yfNWiyzF7zvPGp2QnLfeYvzM712/BchidWI+977/eP1531ipurDamFno1t1qE2hz666fN95PfX5X6p4n1X0nql737+/5jP3yyf12jT1s1953+JsDLrg1Zf4eR+9tw1XdhEBQgNuCwQQQAABBBBAAAEEEEAAAQQQuKgAoQE3BgIIIIAAAggggAACCCCAAAIIEBpwDyCAAAIIIIAAAggggAACCCCAgHcBVhp4t+JMBBBAAAEEEEAAAQQQQAABBGJKgNAgpsrNxSKAAAIIIIAAAggggAACCCDgXYDQwLsVZyKAAAIIIIAAAggggAACCCAQUwKEBjFVbi4WAQQQQAABBBBAAAEEEEAAAe8ChAberTgTAQQQQAABBBBAAAEEEEAAgZgSIDSIqXJzsQgggAACCCCAAAIIIIAAAgh4FyA08G7FmQgggAACCCCAAAIIIIAAAgjElAChQUyVm4tFAAEEEEAAAQQQQAABBBBAwLsAoYF3K85EAAEEEEAAAQQQQAABBBBAIKYECA1iqtxcLAIIIIAAAggggAACCCCAAALeBQgNvFtxJgIIIIAAAggggAACCCCAAAIxJUBoEFPl5mIRQAABBBBAAAEEEEAAAQQQ8C5AaODdijMRQAABBBBAAAEEEEAAAQQQiCkBQoOYKjcXiwACCCCAAAIIIIAAAggggIB3AUID71aciQACCCCAgO8CA8bMkt/2HJCRfZpJYv/bz0HPHcPPfukLAQQQQAABBKJTgNAgOuvKVSGAAAK+CDz9QifZuWuvfDR/lGS66soEfS778FNp23u8NKxRVlrWr+jLeLHQydG/jsuiFeukStnC7uVu3/mbHD9+Um6/JWeC0ODc/67jktR4Ov3SFgEEEEAAAQRiQ4DQIDbqzFUigAAClyWgQoNDh/+QFk4ocPZD7tmOmncdJZs2b5WqzxQjNEiG7vpNW2T4K2/IG6/0uqBVJFYBJDVeMqbNqQgggAACCCAQowKEBjFaeC4bAQQQ8CKgQoN7/nGT7Np9QGaM6RLf5NDvf8iTz7WVB++/U+68LVd8aDDjzeUyd+EH8utv+yRnjqzSuUV1KfBgbrfd3v2HpN+oGfLpv75xv1nPm/t26dm2tnueOio16CllnnxUPvvyW/nvjl3y51/HpP2LVeWpwg9dMNUP130hA0bPkqZ1Ksjs+e/L7n0HnHneLIO7NZYr06eT3sOmyp9Hj8mgbo3i2xYo11T6tq8nxQrlk0Hj5shh5xrUP5v/vU1WLxgtsxeslKmvL3X6OijZrskstaqUlOrPFnfb//zrHmfuM51zv5dTp05LiSceki4tasgV6dJcMLd3V26QIRPmyIdvjoz/tVY9xkr2a6+Wwo8+IC92Gi4nnT7SpU0tr0/sJfPe+fCSjyecOHlK+o+eKe+v3iR//PmX3HrT9dK+SVV5OO/d7hjvLF8rk2YudleFZLk6o9R25l6j4pOiAoOkxlNt57y9UmY5hr/t2S83Xp9Naj9XUsqVKJjsmni5nzgHAQQQQAABBOwTIDSwr2bMGAEEEAhMQIUGjV8oJ72HT5WFU/vHf8Cft2iVfPzpl5I6VSrJlTO7GxqoD8sDxsyUiYPbukHC6g2bpXXPcfKO0y5XzmzSrs8E2X/gsAzv1VTi4lJKt0FT5PiJkzJhYGv3eqq+2Ef2Ob8+dWQndxw1xshJb8jahWMlRYoUCa55zYavpHm3UVKr8lPSumFlUUvwn63XzfmQ/6T7YflSocHwifPk7WUfS6MXykrJIg/LgYO/S+VGvWT2uG7yj1tvlC1bf5QG7Yc6QUlXuf3mnPJMna7yyD/vccaqIn8dOyad+r0iWbNkkn6d6icrNOjcvLpMf+M95/GE9fErDbzsaaA+2L++8EOZPKy9ZMqYwZn7Ghn76gJZ+cZw5/GG3VK2ZmcZ27+lPPZQHvnXlu+lftshMtO5ljx33ZLkeO+t2ig9h74m4we0ljx33yoffPyZ88jJBJn7cg/JfectyapJYDclAyGAAAIIIIBAoAKEBoFyMxgCCCBgl4AKDdo4H5SXf7TR/XZbfchWR80W/aWm84F96Qcb4kODuq0Hyf333p7gUYVGHYbJfc6HUbUi4MgfR922Ga68wv3/6gOrWnmgvuU/Gxrcf89toj5Yq0M901+qekd3PwX1Af3cQ4UGjTsOk/WLx0vGDOndX+r40kRJ76wy6NmmlqfQYPlHm2TZ7MFu2y++/k7qtRksS2YMlOuyX+P+N7WiQIUbauWDurYN705wVgf8vbLgS2d1gjLYuHSipE6dKsHcklppcLmhwSszF8mK1Z+5qz3OzuHs/NT/33/wsFzrrI44e5Sr3VWqVygmz5UvmmRooOpz84054s1V+2pN+kp+ZwVDqwaV3NDAa00SIPAvCCCAAAIIIBA1AoQGUVNKLgQBBBDwX+BsaJDOWYavlserD9W/7t7vPErQQ1Y5y+879X8lPjQo7jyuoB5LOP9QS90HdGkg2/77i4yY+IZ89c0Pcvr0aVFL7s+cOSMblkxwm6gPqCWeeFDqVi3t/vsuZ7l8scptZPncofErHM72rUKDVj3GyGfvvRI/XPfBrzof9J1l/J0beAoN/vPddpk0tJ3bXn3w7jJgkhNkfCoPPnCXPPHI/VLuqYLu5o8Llq5xV0Vc7HhvzhC54bprE/xSJEID9WiH+oD/i/P4QYGHckvRx/K5j22kiotzx3517ruy4N01cuDQEUmZMoUcPHxE2jV+zg12klrZULpGR+dxhFIJ9qtwV4AcPyGDuzdOVk38v/voEQEEEEAAAQRMECA0MKEKzAEBBBAwVOBsaFCkYF4pVqW1jOnXUjZ8/h/32fkerWu6b084+3hCGWeJfFXnm231eMD5x0nnw3zJ59tLIefDuPowq/Yd+ODjz6Wz80H93NDgKWevgDpVS3kKDVr3HCObliUjNCjr7GnQ4e89DdTjCd/9uDP+0Yiz81XBxqp1/xL1Zohdu/c5y/R7uqsK+gyf5q5q8HJcLDRo2X2M5MiWxf1G/3IeT1DjqoDl86++c+e3ZOV6yXFtFvfxibfeXS0jnY0VJwxq464KUEfF+j2kvBN6XG5ooFaFqFdAqiDHa0282HAOAggggAACCNgnQGhgX82YMQIIIBCYwNnQQH3QHvbyPHfctRu/kh7OIwAPOI8inBsaNOk8Qq65OpPzwbxu/PzUyoPszofbX50P4CWqtpNF0wfIrbmuc3995KQ33U34IhEanP8WArV5YP7SjWV03xYXDQ3Uqoc/nA/KmTNlcOd2+vQZdzVF+ZKPyYP33SlVnP0O3p83XK5zPvirQ22y+Nex45Il81UX1GLlms+l+5Apsu6dcfG/VrlhL8mX547LDg3+PPqX01cKSX9FWrfPA4d+l0LPtHD3RVCbTx5zVgYM69nE/bXDR/6UIhVbuY+JXCo0UI94qNBHbep49lCPJ6gNLts0qkJoENjvNAZCAAEEEEDAXAFCA3Nrw8wQQACB0AXODQ22/bRTGrYfJmnSpJalswa5czs3NFj9yWbnkYGxMqpvc3n0wXtl85Zt0rTLSBnzUgt3k71HnW/6uzofTtUH8VXO2w+mzXtPvvzPNvfDtdrnIDnfaqvHE5JaaaDehKCW7KtNGNUH7dFT3pLXXl8mQ7u/eNHQ4HXnjQ8z3lrhzvWmG3LID86Kg7ptBkkv5+0O6lGA5xr1lmzO2w/6tq/r7nOgQgkVhLw2otMFNfreWcFQ3tk4ccGrLzmbKt7ghCxfu49SPFv6cTc0UG9LmDB9oSyY8pI7t2HOqoff9hxwv9lPbFNE5axWGnRrVdN9ZEK9PaKd898+cB4RmbPgfXd/iNnju7thxsCxs2Xrtu2iVoeoVR1JjbfCeRuDeqxj0pB2ctcdN7mPZ6jHNN6a3EfuuOWGZNUk9JuVCSCAAAIIIIBARAQIDSLCSqcIIIBAdAicGxqoK1LfuBcukFea1Cp/QWig/sNM54P31HnL3LcgqDcgNKhexl0mrw61N4BaXaC+oVevHuzUvJrUaTVI9uw/6O6P8IKzsaDXpfCXCg3UN/Pt+77svAXhJ2f1Q0Z5/pli7rya163g7AWQ/4LHE9SeBiOcNzUsWr5ODjn7AWTLerVULlvYnb861CsXXxo5QzZt/sYNTR7Jd4/77fz5GzSerbq6TnW96k0Hj+S7210JoPYf6O480qFWX9RuNVD2OK92nDS0vbvJ5KVCg/3O2x16DXvNfTTkhPPGiVuc1RrNnGsp4tTioLOPgQoV1Osg1bw7Nq3mvt5S7UHRzNmAsmSR/ImOp+Y7adZime884rB3/2Gn3xzuxpfqTRHqSE6QEx13PFeBAAIIIIAAAucLEBpwTyCAAAIIIIAAAggggAACCCCAwEUFCA24MRBAAAEEEEAAAQQQQAABBBBAgNCAewABBBBAAAEEEEAAAQQQQAABBLwLsNLAuxVnIoAAAggggAACCCCAAAIIIBBTAoQGMVVuLhYBBBBAAAEEEEAAAQQQQAAB7wKEBt6tOBMBBBBAAAEEEEAAAQQQQACBmBIgNIipcnOxCCCAAAIIIIAAAggggAACCHgXIDTwbsWZCCCAAAIIIIAAAggggAACCMSUAKFBTJWbi0UAAQQQQAABBBBAAAEEEEDAuwChgXcrzkQAAQQQQAABBBBAAAEEEEAgpgQIDWKq3FwsAggggAACCCCAAAIIIIAAAt4FCA28W3EmAggggAACCCCAAAIIIIAAAjElQGgQU+XmYhFAAAEEEEAAAQQQQAABBBDwLkBo4N2KMxFAAAEEEEAAAQQQQAABBBCIKQFCg5gqNxeLAAIIIIAAAggggAACCCCAgHcBQgPvVpyJAAIIIIAAAggggAACCCCAQEwJEBrEVLm5WAQQQAABBBBAAAEEEEAAAQS8CxAaeLfiTAQQQAABBBBAAAEEEEAAAQRiSoDQIKbKzcUigAACCCCAAAIIIIAAAggg4F2A0MC7FWcigAACCCCAAAIIIIAAAgggEFMChAYxVW4uFgEEEEAAAQQQQAABBBBAAAHvAoQG3q04EwEEEEAAAQQQQAABBBBAAIGYEiA0iKlyc7EIIIAAAggggAACCCCAAAIIeBcgNPBuxZkIIIAAAggggAACCCCAAAIIxJQAoUFMlZuLRQABBBBAAAEEEEAAAQQQQMC7AKGBdyvORAABBBBAAAEEEEAAAQQQQCCmBAgNYqrcXCwCCCCAAAIIIIAAAggggAAC3gUIDbxbcSYCCCCAAAIIIIAAAggggAACMSVAaBBT5eZiEUAAAQQQQAABBBBAAAEEEPAuQGjg3YozEUAAAQQQQAABBBBAAAEEEIgpAUKDmCo3F4sAAggggAACCCCAAAIIIICAdwFCA+9WnIkAAggggAACCCCAAAIIIIBATAkQGsRUublYBBBAAAEEEEAAAQQQQAABBLwLEBp4t+JMBBBAAAEEEEAAAQQQQAABBGJKgNAgpsrNxSKAAAIIIIAAAggggAACCCDgXYDQwLsVZyKAAAIIIIAAAggggAACCCAQUwKEBjFVbi4WAQQQQAABBBBAAAEEEEAAAe8ChAberTgTAQQQQAABBBBAAAEEEEAAgZgSIDSIqXJzsQgggAACCCCAAAIIIIAAAgh4F/g/UKYU5bYEkA4AAAAASUVORK5CYII=", "text/html": [ - "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "result, fig = plot_scenario(\n", + " results=scenario_results,\n", + " x_var=\"patient_inter\",\n", + " result_var=\"mean_q_time_nurse\",\n", + " colour_var=\"number_of_nurses\",\n", + " xaxis_title=\"Patient inter-arrival time\",\n", + " yaxis_title=\"Mean wait time for nurse (minutes)\",\n", + " legend_title=\"Nurses\",\n", + ")\n", + "\n", + "fig.show()\n", + "\n", + "fig.write_image(os.path.join(output_dir, \"scenario_nurse_wait.png\"))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Mean nurse utilisation with those varying scenarios." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "hovertemplate": "number_of_nurses=5
patient_inter=%{x}
mean=%{y}", + "legendgroup": "5", + "line": { + "color": "#636efa", + "dash": "solid" + }, + "marker": { + "symbol": "circle" + }, + "mode": "lines", + "name": "5", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": [ + 3, + 4, + 5, + 6, + 7 + ], + "xaxis": "x", + "y": [ + 0.6631648808967003, + 0.49767035119563796, + 0.3996749025127357, + 0.3330896999785892, + 0.28578397443647 + ], + "yaxis": "y" + }, + { + "hovertemplate": "number_of_nurses=6
patient_inter=%{x}
mean=%{y}", + "legendgroup": "6", + "line": { + "color": "#EF553B", + "dash": "solid" + }, + "marker": { + "symbol": "circle" + }, + "mode": "lines", + "name": "6", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": [ + 3, + 4, + 5, + 6, + 7 + ], + "xaxis": "x", + "y": [ + 0.5526433836201494, + 0.4147299909091962, + 0.33306573632813413, + 0.2775742508735594, + 0.2381519421139213 + ], + "yaxis": "y" + }, + { + "hovertemplate": "number_of_nurses=7
patient_inter=%{x}
mean=%{y}", + "legendgroup": "7", + "line": { + "color": "#00cc96", + "dash": "solid" + }, + "marker": { + "symbol": "circle" + }, + "mode": "lines", + "name": "7", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": [ + 3, + 4, + 5, + 6, + 7 + ], + "xaxis": "x", + "y": [ + 0.4736994683790893, + 0.355484213624623, + 0.2854853321983711, + 0.23792078646305095, + 0.20413023609764683 + ], + "yaxis": "y" + }, + { + "hovertemplate": "number_of_nurses=8
patient_inter=%{x}
mean=%{y}", + "legendgroup": "8", + "line": { + "color": "#ab63fa", + "dash": "solid" + }, + "marker": { + "symbol": "circle" + }, + "mode": "lines", + "name": "8", + "orientation": "v", + "showlegend": true, + "type": "scatter", + "x": [ + 3, + 4, + 5, + 6, + 7 + ], + "xaxis": "x", + "y": [ + 0.41448870138132116, + 0.3110493156249044, + 0.24979966567357464, + 0.20818068815516955, + 0.17861395658544094 + ], + "yaxis": "y" + }, + { + "hovertemplate": "number_of_nurses=5
patient_inter=%{x}
ci_upper=%{y}", + "legendgroup": "5", + "line": { + "color": "#636efa", + "dash": "solid" + }, + "marker": { + "symbol": "circle" + }, + "mode": "lines", + "name": "5", + "opacity": 0.5, + "orientation": "v", + "showlegend": false, + "type": "scatter", + "x": [ + 3, + 4, + 5, + 6, + 7 + ], + "xaxis": "x", + "y": [ + 0.6663216731194718, + 0.5004303474716477, + 0.4020643907650562, + 0.33476508901100027, + 0.28732862850808133 + ], + "yaxis": "y" + }, + { + "hovertemplate": "number_of_nurses=6
patient_inter=%{x}
ci_upper=%{y}", + "legendgroup": "6", + "line": { + "color": "#EF553B", + "dash": "solid" + }, + "marker": { + "symbol": "circle" + }, + "mode": "lines", + "name": "6", + "opacity": 0.5, + "orientation": "v", + "showlegend": false, + "type": "scatter", + "x": [ + 3, + 4, + 5, + 6, + 7 + ], + "xaxis": "x", + "y": [ + 0.5552768316790022, + 0.41703074200388013, + 0.3350569007886222, + 0.2789706828159496, + 0.2394393487693585 + ], + "yaxis": "y" + }, + { + "hovertemplate": "number_of_nurses=7
patient_inter=%{x}
ci_upper=%{y}", + "legendgroup": "7", + "line": { + "color": "#00cc96", + "dash": "solid" + }, + "marker": { + "symbol": "circle" + }, + "mode": "lines", + "name": "7", + "opacity": 0.5, + "orientation": "v", + "showlegend": false, + "type": "scatter", + "x": [ + 3, + 4, + 5, + 6, + 7 + ], + "xaxis": "x", + "y": [ + 0.4759564748237934, + 0.35745649018143, + 0.2871921279442676, + 0.23911772812795684, + 0.205233727516593 + ], + "yaxis": "y" + }, + { + "hovertemplate": "number_of_nurses=8
patient_inter=%{x}
ci_upper=%{y}", + "legendgroup": "8", + "line": { + "color": "#ab63fa", + "dash": "solid" + }, + "marker": { + "symbol": "circle" + }, + "mode": "lines", + "name": "8", + "opacity": 0.5, + "orientation": "v", + "showlegend": false, + "type": "scatter", + "x": [ + 3, + 4, + 5, + 6, + 7 + ], + "xaxis": "x", + "y": [ + 0.41646364586365403, + 0.31277508414642846, + 0.2512931119512341, + 0.20922801211196218, + 0.17957951157701885 + ], + "yaxis": "y" + }, + { + "hovertemplate": "number_of_nurses=5
patient_inter=%{x}
ci_lower=%{y}", + "legendgroup": "5", + "line": { + "color": "#636efa", + "dash": "solid" + }, + "marker": { + "symbol": "circle" + }, + "mode": "lines", + "name": "5", + "opacity": 0.5, + "orientation": "v", + "showlegend": false, + "type": "scatter", + "x": [ + 3, + 4, + 5, + 6, + 7 + ], + "xaxis": "x", + "y": [ + 0.6600080886739289, + 0.4949103549196282, + 0.3972854142604152, + 0.3314143109461782, + 0.2842393203648587 + ], + "yaxis": "y" + }, + { + "hovertemplate": "number_of_nurses=6
patient_inter=%{x}
ci_lower=%{y}", + "legendgroup": "6", + "line": { + "color": "#EF553B", + "dash": "solid" + }, + "marker": { + "symbol": "circle" + }, + "mode": "lines", + "name": "6", + "opacity": 0.5, + "orientation": "v", + "showlegend": false, + "type": "scatter", + "x": [ + 3, + 4, + 5, + 6, + 7 + ], + "xaxis": "x", + "y": [ + 0.5500099355612966, + 0.4124292398145123, + 0.33107457186764605, + 0.2761778189311692, + 0.2368645354584841 + ], + "yaxis": "y" + }, + { + "hovertemplate": "number_of_nurses=7
patient_inter=%{x}
ci_lower=%{y}", + "legendgroup": "7", + "line": { + "color": "#00cc96", + "dash": "solid" + }, + "marker": { + "symbol": "circle" + }, + "mode": "lines", + "name": "7", + "opacity": 0.5, + "orientation": "v", + "showlegend": false, + "type": "scatter", + "x": [ + 3, + 4, + 5, + 6, + 7 + ], + "xaxis": "x", + "y": [ + 0.47144246193438516, + 0.35351193706781603, + 0.2837785364524746, + 0.23672384479814507, + 0.20302674467870066 + ], + "yaxis": "y" + }, + { + "hovertemplate": "number_of_nurses=8
patient_inter=%{x}
ci_lower=%{y}", + "legendgroup": "8", + "line": { + "color": "#ab63fa", + "dash": "solid" + }, + "marker": { + "symbol": "circle" + }, + "mode": "lines", + "name": "8", + "opacity": 0.5, + "orientation": "v", + "showlegend": false, + "type": "scatter", + "x": [ + 3, + 4, + 5, + 6, + 7 + ], + "xaxis": "x", + "y": [ + 0.4125137568989883, + 0.30932354710338034, + 0.2483062193959152, + 0.2071333641983769, + 0.17764840159386303 + ], + "yaxis": "y" + } + ], + "layout": { + "legend": { + "title": { + "text": "Nurses" + }, + "tracegroupgap": 0 + }, + "margin": { + "t": 60 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "Patient inter-arrival time" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ], + "title": { + "text": "Mean nurse utilisation" + } + } + } + }, + "text/html": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "result, fig = plot_scenario(\n", + " results=scenario_results,\n", + " x_var=\"patient_inter\",\n", + " result_var=\"mean_nurse_utilisation\",\n", + " colour_var=\"number_of_nurses\",\n", + " xaxis_title=\"Patient inter-arrival time\",\n", + " yaxis_title=\"Mean nurse utilisation\",\n", + " legend_title=\"Nurses\",\n", + ")\n", + "\n", + "fig.show()\n", + "\n", + "fig.write_image(os.path.join(output_dir, \"scenario_nurse_util.png\"))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Example table..." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\\begin{tabular}{lllll}\n", + "\\toprule\n", + "Number of nurses & 5 & 6 & 7 & 8 \\\\\n", + "Patient inter-arrival time & & & & \\\\\n", + "\\midrule\n", + "3 & 0.66 (0.66, 0.67) & 0.55 (0.55, 0.56) & 0.47 (0.47, 0.48) & 0.41 (0.41, 0.42) \\\\\n", + "4 & 0.50 (0.49, 0.50) & 0.41 (0.41, 0.42) & 0.36 (0.35, 0.36) & 0.31 (0.31, 0.31) \\\\\n", + "5 & 0.40 (0.40, 0.40) & 0.33 (0.33, 0.34) & 0.29 (0.28, 0.29) & 0.25 (0.25, 0.25) \\\\\n", + "6 & 0.33 (0.33, 0.33) & 0.28 (0.28, 0.28) & 0.24 (0.24, 0.24) & 0.21 (0.21, 0.21) \\\\\n", + "7 & 0.29 (0.28, 0.29) & 0.24 (0.24, 0.24) & 0.20 (0.20, 0.21) & 0.18 (0.18, 0.18) \\\\\n", + "\\bottomrule\n", + "\\end{tabular}\n", + "\n" + ] + } + ], + "source": [ + "table = result.copy()\n", + "\n", + "# Combine mean and CI into single column, and round\n", + "table[\"mean_ci\"] = table.apply(\n", + " lambda row: f\"{row['mean']:.2f} ({row['ci_lower']:.2f}, {row['ci_upper']:.2f})\",\n", + " axis=1,\n", + ")\n", + "\n", + "# Convert from long to wide format\n", + "table = (\n", + " table.pivot(\n", + " index=\"patient_inter\", columns=\"number_of_nurses\", values=\"mean_ci\"\n", + " )\n", + " .rename_axis(\"Patient inter-arrival time\", axis=\"index\")\n", + " .rename_axis(\"Number of nurses\", axis=\"columns\")\n", + ")\n", + "\n", + "# Convert to latex, display and save\n", + "table_latex = table.to_latex()\n", + "print(table_latex)\n", + "with open(os.path.join(output_dir, \"scenario_nurse_util.tex\"), \"w\") as tf:\n", + " tf.write(table_latex)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Sensitivity analysis\n", + "\n", + "Can use similar code to perform sensitivity analyses.\n", + "\n", + "**How does sensitivity analysis differ from scenario analysis?**\n", + "\n", + "* Scenario analysis focuses on a set of predefined situations which are plausible or relevant to the problem being studied. It can often involve varying multiple parameters simulatenously. The purpose is to understand how the system operates under different hypothetical scenarios.\n", + "* Sensitivity analysis varies one (or a small group) of parameters and assesses the impact of small changes in that parameter on outcomes. The purpose is to understand how uncertainty in the inputs affects the model, and how robust results are to variation in those inputs." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "There are 8 scenarios. Running:\n", + "{'mean_n_consult_time': 8}\n", + "{'mean_n_consult_time': 9}\n", + "{'mean_n_consult_time': 10}\n", + "{'mean_n_consult_time': 11}\n", + "{'mean_n_consult_time': 12}\n", + "{'mean_n_consult_time': 13}\n", + "{'mean_n_consult_time': 14}\n", + "{'mean_n_consult_time': 15}\n" + ] + } + ], + "source": [ + "# Run scenarios\n", + "sensitivity_consult = run_scenarios(\n", + " {\"mean_n_consult_time\": [8, 9, 10, 11, 12, 13, 14, 15]}\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "hovertemplate": "mean_n_consult_time=%{x}
mean=%{y}", + "legendgroup": "", + "line": { + "color": "#636efa", + "dash": "solid" + }, + "marker": { + "symbol": "circle" + }, + "mode": "lines", + "name": "", + "orientation": "v", + "showlegend": false, + "type": "scatter", + "x": [ + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15 + ], + "xaxis": "x", + "y": [ + 0.15117881736778396, + 0.28394136348868726, + 0.499036905566402, + 0.8385104727236156, + 1.355692289891784, + 2.1482656075001905, + 3.3720354896743534, + 5.303240505365226 + ], + "yaxis": "y" + }, + { + "hovertemplate": "mean_n_consult_time=%{x}
ci_upper=%{y}", + "legendgroup": "", + "line": { + "color": "#636efa", + "dash": "solid" + }, + "marker": { + "symbol": "circle" + }, + "mode": "lines", + "name": "", + "opacity": 0.5, + "orientation": "v", + "showlegend": false, + "type": "scatter", + "x": [ + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15 + ], + "xaxis": "x", + "y": [ + 0.15983016146041065, + 0.2991290227720832, + 0.5237570297813028, + 0.87899921832706, + 1.4189265664774497, + 2.2439600794885455, + 3.520325590336425, + 5.544361101434637 + ], + "yaxis": "y" + }, + { + "hovertemplate": "mean_n_consult_time=%{x}
ci_lower=%{y}", + "legendgroup": "", + "line": { + "color": "#636efa", + "dash": "solid" + }, + "marker": { + "symbol": "circle" + }, + "mode": "lines", + "name": "", + "opacity": 0.5, + "orientation": "v", + "showlegend": false, + "type": "scatter", + "x": [ + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15 + ], + "xaxis": "x", + "y": [ + 0.14252747327515727, + 0.2687537042052913, + 0.47431678135150124, + 0.7980217271201712, + 1.2924580133061183, + 2.0525711355118355, + 3.223745389012282, + 5.062119909295815 + ], + "yaxis": "y" + } + ], + "layout": { + "legend": { + "title": { + "text": "Nurses" + }, + "tracegroupgap": 0 + }, + "margin": { + "t": 60 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "Mean nurse consultation time (minutes)" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ], + "title": { + "text": "Mean wait time for nurse (minutes)" + } + } + } + }, + "image/png": "iVBORw0KGgoAAAANSUhEUgAAApwAAAFoCAYAAAD6oCs3AAAgAElEQVR4XuydB3xb1fXHj+Qdb2fvBDLJHhAIDYS9RyDs0QAJLaPsMkrLaNmj7BaaQsJuKHslrBLgT1iZZO/tJLYT721L/3Puk2zZsnX1fC3Hz/7d1h8b694Xv5+O7K/OdHl5ERYUgAJQAApAASgABaAAFIiQAi4AZ4SUxWWhABSAAlAACkABKAAFlAIAThgCFIACUAAKQAEoAAWgQEQVAHBGVF5cHApAASgABaAAFIACUADACRuAAlAACkABKAAFoAAUiKgCAM6IyouLQwEoAAWgABSAAlAACgA4YQNQAApAASgABaAAFIACEVUAwBlReXFxKAAFoAAUgAJQAApAAQAnbAAKQAEoAAWgABSAAlAgogoAOCMqLy4OBaAAFIACUAAKQAEoAOCEDUABKAAFoAAUgAJQAApEVAEAZ0TlxcWhABSAAlAACkABKAAFAJywASgABaAAFIACUAAKQIGIKgDgjKi8uDgUgAJQAApAASgABaAAgBM2AAWgABSAAlAACkABKBBRBQCcEZUXF4cCUAAKQAEoAAWgABQAcMIGoAAUgAJQAApAASgABSKqAIAzovLi4lAACkABKAAFoAAUgAIATtgAFIACUAAKQAEoAAWgQEQVAHBGVF5cHApAASgABaAAFIACUADACRuAAlAACkABKAAFoAAUiKgCAM6IyouLQwEoAAWgABSAAlAACgA4YQNQAApAASgABaAAFIACEVUAwBlReXFxKAAFoAAUgAJQAApAAQAnbAAKQAEoAAWgABSAAlAgogoAOCMqLy4OBaAAFIACUAAKQAEoAOCEDUABKAAFoAAUgAJQAApEVAEAZ0TlxcWhABSAAlAACkABKAAFAJywASgABaAAFIACUAAKQIGIKgDgjKi8uDgUgAJQAApAASgABaAAgBM2AAWgABSAAlAACkABKBBRBQCcEZUXF4cCUAAKQAEoAAWgABQAcMIGoAAUgAJQAApAASgABSKqAIAzovLi4lAACkABKAAFoAAUgAIATtgAFIACUAAKQAEoAAWgQEQVAHBGVF5cHApAASgABaAAFIACUADACRuAAlAACkABKAAFoAAUiKgCAM6IyouLQwEoAAWgABSAAlAACgA4YQNQAApAASgABaAAFIACEVUAwBlReXFxKAAFoAAUgAJQAApAAQAnbAAKQAEoAAWgABSAAlAgogoAOCMqLy4OBaAAFIACUAAKQAEoAOCEDUABKAAFoAAUgAJQAApEVAEAZ0TlxcWhABSAAlAACkABKAAFAJywASgABaAAFIACUAAKQIGIKgDgjKi8uDgUgAJQAApAASgABaAAgBM2AAWgABSAAlAACkABKBBRBQCcEZUXF4cCUAAKQAEoAAWgABQAcMIGoAAUgAJQAApAASgABSKqAIAzovLi4lAACkABKAAFoAAUgAIATtgAFIACUAAKQAEoAAWgQEQVAHBGVF5cHApAASgABaAAFIACUADACRuAAlAACkABKAAFoAAUiKgCAM6IyouLQwEoAAWgABSAAlAACgA4YQNQAApAASgABaAAFIACEVUAwBlReXFxKAAFoAAUgAJQAApAAQAnbAAKQAEoAAWgABSAAlAgogoAOCMqLy4OBaAAFIACUAAKQAEoAOCEDUABKAAFoAAUgAJQAApEVAEAZ0TlxcWhABSAAlAACkABKAAFAJyGNpC5t9TwCm37ePeMBNqdW0peb9u+z6beXYe4KIqNiaK8ooqmXqLNn+ucGkd5xZVUWeVp8/falBuMiXZTWmIMZeeXN+V4uziTnhRLZZXVVFpe3S7u1+5Nul1EXdL5d/U+/D0LpV2Pjgl2pcX+AAUAnIbmAOAMLSCAM7Q+AE79CxDAGVojAKfehgCcoTUCcOptSHYAOMPTqbFdAE4z/QjACeA0MSEAp149ACeAU28loXcAOAGcpjYE4DRX0FHA6eW47KJf19FPi1fRuk07KDe/UCmQnppMgw7oRRPGHkTjRg4il4vjAy20AJwAThNTA3Dq1QNwAjj1VgLgNNEIHs7w1IOHMzydHO/h/PybhfTsrPdoR2YWjRk+kAYyYApoClvuyyukdRu309KVG6hXjy507WVT6Pgjx5spE+ZpACeAM0xTaXAbgFOvHoATwKm3EgCniUYAzvDUA3CGp5OjgfNPD86kJSvW0+UXnEynH384xcXGNHg/5RWV9OHn39NLb36qoPSBO2aYqRPGaQAngDMMM2l0C4BTrx6AE8CptxIAp4lGAM7w1ANwhqeTo4Hzgadfo5t/f16joFn/5gQ8H/vnf+jO6y8xUyeM0wBOAGcYZgLgNBAJwAngNDAfdRQ5nKEVBHCGZ2EAzvB0cjRw1v/h13L4fPCBvdW3d+7OoS++XUh9enalow8fY6ZGE04DOAGcTTCbmiPwcOrVA3ACOPVWEnoHgBPAaWpDch7Aaaaio4qG5FZffftzem72+/T9B89SYVEJnXrpHdSlUxpl782j3557Ik2/8BQzRWyeBnACOG2aTJ3tAE69egBOAKfeSgCcJhrBwxmeegDO8HRqbJfjgPO482+hJ++9loYN7kez58yjT776kd564W7auCWTrvnTk/TZm4+aKWLzNIATwGnTZACcNgUDcAI4bZpM0HZ4OOHhNLUheDjNFXQccI4+bjot+Xyman00/ZZHaeL4YXT5+SeTx+OlsSfMoKVf/NtcFRtXAHACOG2YS9BWeDj16gE4AZx6K4GH00QjeDhDq1fOQ7yysl00YVS8iczt/qzjgFM8nE//7Q+UmpxIJ198G70/637q17sbbdq2i6646WH6+u0nW/RJBXACOE0MDsCpVw/ACeDUWwmA00QjAGfj6lVWEi1a7KYSnvp58dlxJjK3+7OOA87X3vmCHnt+jvJwnjD5YHroT1dSXn4RXfyH++moiWO4mv3cFn1SAZwAThODA3Dq1QNwAjj1VgLgNNEIwNmwegKbi5e6qLjYRfHxXpp6CjycJnbmOOCUm92weScVFpfQyKEHUlSUmyqrqundT76hqadOVv/dkgvACeA0sTcAp149ACeAU28lAE4TjQCcweoFwmZcLNHYsR46sGeCiczt/qwjgbO62qNGXO7cnU1TTpqknsSi4lJKSmx5YwBwAjhNfosAOPXqATgBnHorAXCaaATgrKteVRWH0ZdYnk2BzTGjPdShA9oimdiYnHUccO7YlU3Tb36UcvblUWlZBa2cP1v14jx7+l0089FbaMTQA0w1sXUewAngtGUw9TYDOPXqATgBnHorAXCaaATgrFWvmmFz8TI3FRYSxfBQw3FjLNiUhbZIJlbmQOCcdsNDNHbEQLpm2hQaeczlCjhlvf7uFyTz1l9+6g4zRWyeBnACOG2aTJ3tAE69egBOAKfeSgCcJhoBOC31BDaX/OqiggKXgs2xDJuJPtgEcJpYmHXWcR7OscfPoB8+/ocaczls8rQa4JQ8zsNPv4Z+/vR5c1VsXAHACeC0YS5BWwGcevUAnABOvZUAOE00AnAybFYzbC6rhc0xo72cpuetIys8nCZW5kDgnHz2DfT2zHupU0ZqHeBcv3kHifdTJhC15AJwAjhN7A3AqVcPwAng1FsJgNNEo/YOnAKby351c8cbouho8WwGwyY8nCYW5lAP58PPvUkr126mq397Jl1x8yP0zr//Sus2bad/zP6ADj94OP3lxkvNVbFxBQAngNOGucDD2QSxAJwAziaYTZ0jmDQUWsH2DJweD8Pmchfl5rooOsoqEEpOrqtXUZGLvv+B6LLz0RbJ5LXouJB6WXkFPfTMG/TB599TRQU3yeLVISGezj/jaLr28ikq1N6SC8AJ4DSxN3g49eoBOAGceiuBh9NEo/YKnAKby1e4aO8+CzZHcxg9JbluGL2g0EX/nsXezzz+/FTL8oXJc9oazzoOODduzaQD+/agysoqytqbpwBTwuvlDJ8r1mymcSMHtajOAE4Ap4nBATj16gE4AZx6KwFwmmjUHoGTp2HTcvZsCmxGKc9mMGzmMmS+ONutiogGDvDQbX/ApCETO3MccI4/8UpaOO9fQfecm19Ix557My36LPgxE4F0ZwGcAE6djYR6HMCpVw/ACeDUWwmA00Sj9gacXoHNlS7KyXGRWzybIz2UllpXQYFN8WwWsodTYPOi8zzUq0vL9/o2eV5b21nHAOdbH82n//LH6vVbaejAvkE6Sl/OuNhYmvfGIy2qMYATwGlicABOvXoATgCn3koAnCYatSfgFNhcucpFWdkWbI4a7qX09Lph9Jy9bnpptosHyrhoyBAPnTfVQzLEEFXqJlbmoCp1afK+ZMU6uvr2J+im3wXPS4+Pj6NJE0ZS9y4ZZorYPA3gBHDaNJk62wGcevUAnABOvZUAOE00ai/AKbC5eo2bdu8hcjNAjhoRDJvZWRxGf9lNJaUWbJ7PsCl7ZQE4TazMQcDpv80fFq6kw8YPM7vrZjwN4ARwmpgTgFOvHoATwKm3EgCniUbtBThXra6FzRHs2eyYUdezKbA5k3M2y8pcNHyYl6ZOqa6BTQCniYVZZx0TUvff6lffLW70rqt4TMAJkw8xV6XeFc6/6q+0hkP55HKpR1KSOtC37z2tvgZwAjhNDA7AqVcPwAng1FsJgNNEo/YAnGvWuChzN4fR2Vs5/CAvdepUFzZ37XHRLPZsCmyO4pzOs87w+P/k10gLD6eJlTkQOCfyNKE6i20mv7BYVav36NaJPn7lQTNFGjh9yiW301N//QMN6N8z6FEAJ4DTxOAAnHr1AJwATr2VADhNNGrrwLluvZt27LR8RiPYc1kfNndmumj2K27uduNS4yzPODUYNkVfAKeJlTkQOBu63eKSMpr5+sfUu0cXOvuUI8wUaeD0kWddT3NeuJu6dQ7ODwVwAjhNDA7AqVcPwAng1FsJgNNEo7YMnIGwOYw9m1061/VsbtvholdejSJp6z3hYA+dchI356y3cvOItm930YmT0fjdxM4cF1IPdbNnT79LTR5q7jWG57cfwQVJS1asVz0/b5gxlY44dJT6ZwCcAE4TewNw6tUDcAI49VYC4DTRqK0C5/oNLtrOQCmezaFcANSta12Vtmxx0ytvuKmqqnHYzNnrohXcHF76dl58NvpwmthZmwFO8XKefPFt9M27T5noEXTWw1b2l0depBOPmsDFSgfRNwuW0e0PvEAfcehePJ5FpWypWI0qkBgfTSXlVSTVgVjBCsRESWsOF4dygt9VQy9LgYS4KCqv9JC8FrGCFXAzLcTFuKm0nAdCYzWoQHwsQ0W1V31gBSsgQNYhLpqKy9rO37P1G4k2bLKe75HDiXp2t2ow/GvdBqJ/zRKbIDpqEtEZp9R9XPbtzPTScm6h5OU/YEMGuWjEEB60jtVkBRwHnLfd90LQzVpThjap/pzP3H99k8UI9+BlNz7Eofsj6dRjD6OCEmu8JlbDCqR0iIFGIYwjJtrNI9UEFtrOL/rmfi0k8ZuWUgbyaplDhxWkQBRXQSQwUBW1IVho7qc5gWGqqtpDlVWwoYa0FdRK4t/VhW3k79mmLUTr1lt3OoKb2vTsUfeu17HncybDJpsEHX+Ml048Nhg2t20nWrWG8w6lyGiol6/hIvl7htV0BRwHnPc+PjvobmO5YKhf7250xgm/4bnqzevyLiktp/Wbd9Cogw6s+XcvvvZ+umTq8VwRfzBC6hrb656RQLtzS+HhbEQnhNT1v7wQUg+tkbxpSUuMoez8cr2Y7XRHelIslVVWwwvcyPPflkLqEkKXULqsQQN5OlC9Wl/J6XxjjpsjJkQnHOelww8Ljgxs3OSirds4+sSXGc7tkzp1tDylKBoy+wXiOOA0u137p/Pyi+i482+hp/52LU0cP5y+++lX+uPfnqdPXn2IOqanADgBnPaNKuAEgFMvH4ATwKm3ktA7AJyh9WkrwCmV6AKUjcGmNH2f87YFm6ec6KEJhwR7vFevddOuXaTmq4+UxvBptWkYAE6zV6LjgLOouJTem/sdbdq2i8rLK4Lu/oE7Zpgp0sDpb35YRo/98z+UtTePenLrpVuvuYAOHXuQ2omiodByw8MZWh8Ap/7lCuAEcOqtBMBpolFbAM5A2Bw4wEu9e9XN15XZ6W+/G6WibQ3Bpnx/BedrZvPIyxiOnI8Z5aWkpLrXAHCaWJkD2yJdxaMtt2zfTSOHHkASSq+//nbr5WaK2DwN4ARw2jSZOtsBnHr1AJwATr2VADhNNHI6cO7a5aLVa60w+oEHeKlvn7qguHSZm979wPJ8So/NcWPrejarOaq+bLmL8vK4AC/WS6NHeymxQ7CiAE4TK3MgcB59zo306WsPU3xcrNmdN9NpACeA08SUAJx69QCcAE69lQA4TTRyMnDKXHQZWSmrfz+v+ghcixa76YOPrcdletDoUXVhs5LrNZcudVFhkYsSEojGMmzGxTXczQDAaWJlDgTOSPXabKqMAE4AZ1NtR84BOPXqATgBnHorAXCaaORU4Mzi8PdK1baIVAhdQumNweY5Z1erKUOBq4InCy1h2CwuIUpM9KowemwIXxaA08TKHAic7376LW3dsYeuuPAUNdN8fy8AJ4DTxAYBnHr1AJwATr2VADhNNHIicAbCplSiS0V64PrpZzd9Ms+tmr5PPSsYNkvLiBYv4R7I5dzuKEVyNj2qUCjUAnCaWJkDgfN4rhiX4p1K9oNLWF2MKXAtnPcvM0VsngZwAjhtmkyd7QBOvXoATgCn3koAnCYaOQ04c3JcJEVA4tlsCDa//yGKPvuC2xpxJP28qR41ZShwFRW7aOkyF1Vw3XFGhpdGcOsjboesXQBOrUQhNziuSv3rBUu4UXbj3f4nTRhhpojN0wBOAKdNkwFw2hQMwAngtGkyQdvRFim0gk4Czr37GDZl1CQzZI9uPAFoSN0w+dffRtHX8y3YvPA8T5Dns6CAaAkXEUmhUGeeqy7z1eX+w1kAznBUanyP44DT7Hab/zSAE8BpYlXwcOrVA3ACOPVWAg+niUZOAc7cXJeqJhfYlLnoBw2t67kUr6Z4N8VbefGFHq5Yr/v4PobVX9kz6mHY7MHTh4YMsjd5CsBpYmUOCalPPP0aevb+G2jsiIEkX4daCz58zkwRm6cBnABOmyYDD6dNwQCcAE6bJgMPp03BnACcCjbFs8mwKLApYfLAlLpP5rrpp1/cCjZ/e7GH+vWrC5PSX3PlagtWpW2StE+yuwCcdhWru98RHs6vvltMY0cOpPTUZJKvQ61jJo01U8TmaQAngNOmyQA4bQoG4ARw2jQZAKdNwVo7cOblc+uiX3lCEMNmF18YPBA23//IzQVAbormbLtL2bNZHzYzM4nWrPNPIPJy3qd92BRJAZw2DavedkcAp9ktRvY0gBPAaWJhCKnr1QNwAjj1VhJ6B3I4Q+vTmoGzoNBqXSQ5l506cYEPtzbyw6YUDUmPTYFNmQNz6SXV1KfehKEtW120abNLnTloqJe6dmkabAI4TV+FDgmpB97mjl3Z9Mp/P6ftmVlcYVYZpMCLf7/VXBUbVwBwAjhtmEvQVgCnXj0AJ4BTbyUAThONWitwCmxKU/YqH2wOZ9j0F/gIbMr0oGXs+ZTpQNMu9VDPHnVhct16F+3YaRUQydlOHZsOmwBOEwuzzjrOwzl1xt2UkZZMI3i0ZYz4z+ut3196urkqNq4A4ARw2jAXAGcTxAJwAjibYDZ1jsDDGVrB1gichYVcTb7UrWCzo7QuGlELm5KH+fZ7UbSCC4AENi+/zEPdu9bCpMDoKs7X3JPlUr01R4/0UmqqGWwCOE1fhQ4EzhMvvJXmvv4wu8fD7GNgrlHIKwA4AZwmJgYPp149ACeAU28l8HCaaNTagFP6ZEpT9ioeO5me7qVRApu+PpnVDJtz3nbTmjVuio/30mW/rQubAqMCojl7XRTDYXaZHpSUZA6bAE4TC3Ooh3P6LY/Sw3f+jjqm82iAVrAAnABOEzMEcOrVA3ACOPVWAuA00ag1AaeMmZSczErOmBPYHClN2X0TgAQ23/iPm9ZvcFOHBC9dwbDZOSAnU/I8l/7qovx8y/M5hueid2jGgYQoGjKxMgd6ODdt20U33PUsTRw/rEHonHHRqWaK2DwN4ARw2jSZOtsBnHr1AJwATr2VADhNNGotwBkIm2mpRKNG1o6blAr11+dYsJnEc88vnyY5mbWtjwRQZXpQYZGLYZQ9mwybcXHN49n0awvgNLEyBwLn7259nJau3ED9+3TndzDsL6+3Xn7qDjNFbJ4GcAI4bZoMgNOmYABOAKdNkwnajhzO0Aq2BuAsYc/mIp9nMyWFvZMcCq/xbDJsvvammzZuclNyspemc85melotTMo8dKlkLyklSmQYHcuwKeH05l4ATjNFHVc0dMSU6+iTVx+i5KRm9JMbaAjgBHAamA/Bw6lXD8AJ4NRbCTycJhrtb+AsLeMw+mI3lfNscwWbXOTjn2BdyXmcr74eRdLeSGBzBsNmWgBsCqgKbJZXuFRhkBQI+UHVRJOGzgI4zRR1HHCef9Vf6bVn7+R56r6kDrP7Nz4N4ARwmhgRgFOvHoATwKm3EgCniUb7EzgFNpewZ7OsnBgoicaO4jC6rwFNBQPoy69F0fYdLkpjmLycczYDYbOIw+dLOIwu4fQMrmSXfE9/cZGJHo2dBXCaqeo44Pz4ix/oq/9bRGeeOIm6dEoLqlYfMqCPmSI2TwM4AZw2TabOdgCnXj0AJ4BTbyUAThON9hdwljNkLmLPpsCmhMLHjfGqaUGyyjhMPvtVN2VmMmyyR1PC6Cns4fQvKQySAiEpFJJm7kO5qbu/R6eJFqHOAjjNlHUccA6bPC3kHa+cP9tMEZunAZwATpsmA+C0KRiAE8Bp02SCtiOHM7SC+wM4BTYXc5/N0gbyLgU2X5rtpt17XNSRC4Ou4AIhKRTyL2l5JK2PpAVSjx5EQwbVnZtuai+NnQdwminrCOD0chdXf9/N4pIyfgfUeDjdX0gUeMZMotCnAZwAThP7godTrx6AE8Cpt5LQOwCcrQs4JQQunk1V5MPlGGPHeGqKfEpLXTTrlVrYnHE5tzbiFkj+Jc3cpam7NHfv39dL/fs3byU6PJymr7bGzzsCOK/842N0/+3TqXPHtLCUyN6bR3968N8087FbwtpvsgnACeA0sR8Ap149ACeAU28lAE4TjVrSwymwKX02pQWStC8aN7YWNksYNl9kz2Z2tos6d+Y+m9M8dWBTxlTKuEpZ4tUU72ZLLng4zdR2BHDOfP1jmvWfuTTlpEl0zmmTqV/vbg3e9Zbtu+m/H82n9+Z9R5eddxK1RE9OACeA0+QlCODUqwfgBHDqrQTAaaJRSwFnfdgcM9rDvTKtn1ymC70420V797qpG4+pvIxnoycEeDY3bXapSnUpCho6xKvyNlt6ATjNFHcEcMotrl6/lZ6b9T59vWAJde2cTgP796LU5EQVas8rKKJ1m7ZTVk4eHTVxDF17+RRqqeIhACeA0+QlCODUqwfgBHDqrQTAaaJRSwCnjKlcxOMqixksE9izOTYANgsKXfTvWW7Ky3Ox19JL0y7xUHxA0/Y166R4iBRsSiW6VKTvjwXgNFPdMcDpv8092bn0y9I1tHFrpgJNWQKeA/r1pINHD1Ew2pILwAngNLE3AKdePQAngFNvJQBOE40iDZwCm0uWuamwkBgkrTC637MpkPnSywybXHXeu5eXfntxNcXGWnfjYa5cucqlQuzSCVF6bEqvzf21AJxmyjsOOM1ut/lPAzgBnCZWBeDUqwfgBHDqrQTAaaJRJIGzmmFzsQ824xgkxzJsJsRbP63A5kz2bBayh1Ngc9ql1RTja4skc9OXr3DRvn0uVVAkoyoDK9VN7repZwGcTVXOOgfgNNOPAJwAThMTAnDq1QNwAjj1VgLgNNEoUsApPTKlMXtBgYtHUQs0chGQb0hgLsOmhNEFNvtxtfklFwXApjrn5nOk5qHLmEv/OZP7ND0L4DRTEMBpph+AU6Nf94wE2p1bqlpYYAUrAODUWwWAE8CptxIAp4lGkQBOgc1lv0qonJSHchy3PvJDYw4XBr3EBUJSKHTgAR66+AKeLuTrdijThQRSJddTqtjHcjP42NjW8QcEwGliZfBw2lIvL7+ITr7kNrr+irPpvDOOVmfh4YSH05YR1dsM4NSrB+AEcOqtBMBpolFzA6fA5q8cDs/NtcLh0mdT+m3KyuY+mi9yzqa0QBo4wEMXnechtw82ZczlUvZsSjP45CSei86eTTnfWhaA0+yZgIfThn5/enAm/bJsLU2/4GQAZ5i6wcMZWigAp96QAJwATr2VADhNNGpO4JTpP8uW18JmYO7lLp4cNIths6zMgs0Lz2fPJleey5K+nEt48pB4OKUwSAqE/F5Pk3trzrMATjM1HQmc78/7P3pv7ne0c1c2ffnW33nmagW9xH06r7z4VIqOkIX+vGQNPTf7PdWOaWD/ngDOMO0OwAngDNNUGt0G4ARwmtoQJg2FVrC5gFOqypczbO7lQh+ZiS7hcH+hz06eiT6bJwiVV7hoyBAPnTe1FjYlV3PZcjdJn85OHb00fBjPRfeBqOlz35znAZxmajoOOGfPmUevvfO5Ar4nZ75NMjs9Z18+yTSiSRNG0o1XnmOmSAOnKyur6Jwr76HH77ma3nzvKwCnDYUBnABOG+bS4FYAJ4DT1IYAnJEHTsnTX87zzXNyGDY5RC4FQsnJ1r8rsDnr5SiqYKAUmJw6pboGKKV4SDyiHg7DSzP3g4bKKGvTZzwy5wGcZro6DjiPPOt6eunvt9KB3Hdz2ORpCjhlbc/MostufJi+nPO4mSINnP7H7Pepsqqarp9+Nt335Kt1gLNa3tJhNapAFL91hkaNG4j8YnXx/zyoqmpUJDeL5GV98EprWCL52ywDMGBDjb/OlA3J/2BEEfldLbouWuqhzN2ccxntosMOcVNaqvVPbdzipaf+Wc2eTaJDx7to2oVRNSJhwUQAACAASURBVEC5a491zsN/R/v3ddOIg1opafpUk79nWE1XwHHAOf7EK+nnT1/gd0euOsBZWlZBE0+/hpZ8PrPpajRwUsZlXn/XM/TWC/dwW4eYIODck8tZzliNKtAlLZ6y88vwi74RhRJiozgpntt/FPNbf6wGFeiYEkv5JVVUVcXJYVhBCkRHuym1QzTtLeC/6FgNKpCaGEPllR4qq2A3GlaQAsJRHVP5d3We/b9nApsr2LO5J5vYs+niCUJeSkmxyH7zFg6jv+bm1y7ReO6/eeZptd7LXbuJVq2WNwJEB/Yn6t+v9b8b6JruayAKG2qSAo4DzvN/fy9dcs4JdMoxh9YAp3g/nn/1Q/rqu8X09sx7myREY4dmvzWPXnjlQ4YCqxttcUkZJzK76cIpx9INM6aiSl2jNkLqoQVC0ZD+5YqQemiNYhg40xiosvPL9WK20x0IqYd+4k1yOFetdtNu9lRKpfnokZ5az+YmN732hpsjXFaV+pmn1b5h3LrNRRs3Wd7CIYM8PM7SGYaJkLrZ8+Q44Fy8fJ3K1xw6sC8tXr6ejv7NWFq3cTvtyyugZx+4gSaMGWqmiOZ0/ZA62iKFFgzACeA0fUECOAGcpjYE4IwMcK5Z4+IwukvB5iiecZ6ebnkp16130xtz3BwqJ5pwsIdOOakWNtetd9GOnXyGi4KGcb5m586t37PpVw/AafZKdBxwyu1KvubHX/5A23dm8RSCWOrbsyudfsLhlJHmy1A20yTkaQCnPXEBnABOexYTvBvACeA0tSEAZ/MDZw1sMjiOGtEwbB5+WDWdcJwFlBJ6X7POTbt2Wd7QkVw8lJHhHNiUewBwmr0SHQmcVdxV1t/+qJr99Ws3bqNuXTq2CHDWlxseTng4TV6CCKnr1QNwAjj1VhJ6B4CzeYFTPJg7djI4MmyOYM9mRx84rl7jpjlvW57NIydV0zFH1cKmzEXP2etSvTXHjPJwnqfps9ry5wGcZpo7Djh/WLiSbn/gX/S//z6hqjIvve4BWr56E/f8iqIn772WJk8cbaaIzdMATgCnTZOpsx3AqVcPwAng1FsJgNNEIzs5nOs3uGj7DiskPvwgL3XqZEGltER6+90o5ckUr6Z4N2WpEZfc9iiP2x/F8jx1mR7k781p8jPvj7MATjPVHQecZ0+/iy4661g66+Qj6MPPv1e9ON/5919pIU8Aep6Le+TrllwATgCnib0BOPXqATgBnHorAXCaaBQucEqhjxT8SDu3ERwS98OmjKN89wOrU3sgbHILa1q61EWFRS5Of/OqRvAJDi70BnCaWJkDZ6mPOX4GLZz7gqoUv+mef1Cv7p3opt+dy++iPHTIyb+nRZ/9y0wRm6cBnABOmyYDD6dNwQCcAE6bJhO0HSH10AqGA5xbtrpo02YLNoexZ7OLr9hn0WI3ffCxBZunnOihCYdYBUIVPFFoCcOmjKyUOeoy4jI21lk5m/VVA3CavRId5+H8zRl/oPdn3ccu+QSafPYN9I8Hb6SxIwbS3twCOu3SO2jBR8+ZKWLzNIATwGnTZACcNgUDcAI4bZoMgNOmYDrglBC6hNIFNofyWMpuXa1/4Kef3fTJPAs2zzjVQ+O416asUm7nuXiJi8rLXZScxHPRGTZ9nQVt/mStazuA0+z5cBxw3v3YLFq2cqPK2ZT+m9J3U5q+//nhf6v/foLzOFtyATgBnCb2hpC6Xj0AJ4BTbyWhd8DDGVqfUMDph025wkFDG4bNs87wcG6mBZtFxS5auszFHk6itDSvqmCXQqG2sACcZs+i44BT5pr/9+Nv2KhLVB5np4xU1Yz9rkdfojuvv6TFK9UBnABOk5cggFOvHoATwKm3EgCniUaNAadUoktFuqyhg73UvbsVEv/+hyj67Aurcfs5Z1erfE5Z+fkMm7/yOGMuFOrU0asq2FvrXPSm6AXgbIpqtWccB5yvv/ulAs2EeC53awULwAngNDFDAKdePQAngFNvJQBOE40aAs5du1y0eq0FlYMGeqhXT+tf+N/XLpr/nTUPfepZtbC5b5+LfuXWR9ISqXt3a4JQW4JNuXcAp4mVObBo6PAzrqXXn/0z9evdzezOm+k0gBPAaWJKAE69egBOAKfeSgCcJhrVB04ZVSkjK+vDpng1xbspLZHOm+pR+Zyy9mQxnPLUIYHNXj29DKjOLg5qTEsAp4mVORA435v7Hc393090+vGHU68enVUuZ+AaPri/mSI2TwM4AZw2TabOdgCnXj0AJ4BTbyUAThONAoFTYFMauEs/zYEDvNS7lwWPn8x100+/uBVsXnieR3k9ZWVmWhOEZB3Y30t9+7ZN2JT7A3CaWJkDgXPY5Gkh73jl/Nlmitg8DeAEcNo0GQCnTcEAnABOmyYTtB1FQ6EV9APnr2vLaOUql4LNAw9geOzjVV9L26PFSyzYvORCDz9mwebmLS71IUu8nd1bR+DR1FwaPQ/gNJPWcTmcRcWlFBOiv0JcbIyZIjZPAzgBnDZNBsBpUzAAJ4DTpskAOG0KJsDpqYinrxdUKMDs38+rPuRraei+7Fc3cetrujgANsWrKd5NOSt9OTv7+nLa/KcdtR3AafZ0OQ44C4q4i2wjq6qqGlXqZvbQ7Ke7ZyTQ7txS9YsLK1gBhNT1VgHgBHDqrST0Dng4Q+sjDd1zsmKoqLRKeTXFuxkIm9HRRJcybPbr5+GR0hxyX+1SeZtuzmiTtkfp3P6oPSwAp9mz7DjgREjd7Alv6dMAztCKAzj1FgngBHDqrQTA2RSNCgokX9NFJaUuSoyPpoxOlTTgQK8q/nn7vShawfPRJWh46SXV1IdzOeX7UokuFekx/P1RIzyUktKUf9mZZwCcZs+b44Bz/eYdde5Y3oVl7s6htz76mqaeOpmOPnyMmSI2TyOkHlowACeA0+ZLKmg7gBPAaWpD8HDWVZAnQdNm9mpKU3f5GypQOWFsLMUklJE8NudtN63hwiH5/mW/raaePbyqt6b02JRem7HclXDMaI8aWdmeFoDT7Nl2HHA2drsybejymx6mN//xFzNFbJ4GcAI4bZpMne3wcOrVA3ACOPVWAg9nuBrlMTCuWk1UVmYV+8iYysFccd6zSwJlZpfS63PcPMbSTXE893zapfx9hs3KSh5VKXPReYpQQgKpqUIJ8eH+i21nH4DT7LlsM8ApYy2PO+9m+vKtv5spYvM0gBPAadNkAJw2BQNwAjhtmkzQdng4iaqqiDbwPPTM3RZoxsdxc3aeHpSR4VWFPxnJCfT4P8pp4yY3xcd72bPJVeddvWoe+hKGzZJSUh5N8WyKh7M9LgCn2bPuOOB8m8da1l/lFZX0y9I1tGNXtpqt3pILwAngNLE3eDj16gE4AZx6Kwm9o70D517OuZRcTZlvLtN/xGsphUH+GedFhS764KNoWrvBSx0SvHQ5w2aXLl4q4Rpdgc3yCpfK1Rw10kMhmsSYPk2t/jyA0+wpchxwnnLJ7UF3LK2QZPLQNZdNoQP79jBTxOZpACeA06bJwMNpUzAAJ4DTpsnAw+lTQABz3XoXZWVbXs0EhklpYZSSXCvRIu6v+dnnLipjT2ZiB4bNadziqJOHiorYs7nMpcLpaVyFPmokA6rV373dLgCn2VPvOOA0u93mPw3gBHCaWBU8nHr1AJwATr2VhN7RHj2cuzh0LiH0Sg6lS8P2vr2tKUDytaycvW764EMXbd1uwWh3zuU8d2o1dezopdw8nou+3KUKhaS/5nCG1LY2F70pNgXgbIpqtWccCZxrNmyjzdt28TsyfvtWb005aZKZIjZPAzgBnDZNps52AKdePQAngFNvJQBOvwJSDLRqDVEeQ6Ms8WYeNJRD5ey9lCUQ+b/51kx0aXMk7Y2OnuylKSfFUlZeKYOoS7VDkse6d+cJQoOtqUJYGG1pagOOA87Hnp9Ds+fMo84dU7mKLjhzed4bj5hqYus8gBPAactg6m0GcOrVA3ACOPVWAuAUBaTNkTRxF6iM5qbs/Xm2uX8Wujy+abOb3v/IVQOjA3hE5RmnWY3bu6Qn0JJVpbRmrTVH3d8A3lT7tnQeHk6zZ9NxwHnU1Bto1hO3q5zN1rAAnABOEzsEcOrVA3ACOPVW0r6BUxq3r+IZ6AWFlg5SeT6UK9DjuBJdluRjfjLPreaky0pJ8dIpJ/Ienn8uS6rUiwvi6YdFVtRw0EAv9erZPqYH2bEtAKcdtYL3Og44z7zsz/T+rPvM7roZTwM4AZwm5gTg1KsH4ARw6q2kfQKneCK3bOM8zK1WCFyCfjIpqBu3M5Ilj/+80E1f/o8rzbkoSPIwD53goWOP4mpzDqXLEm/ozp0u2r3LGm0poNq9O2CzIYsCcJq9Eh0HnA88/TpNHD+MJk8cbXbnzXQawAngNDElAKdePQAngFNvJe0POAuLSHk1i0v8Ddy9NHCAtwYkZdb5u++7SYqHZHXv5qWzp3C7Iy4C8i/J11y3nhSMpiRGU59+lVyhDthszJoAnGavRMcB558enEmff/ML9enZlbp0Sud3bNaLyb/++dCNZorYPA3gBHDaNJk62wGcevUAnABOvZW0H+CsP5YysIG7qCBtjL74yk0//WLlYsZxE/fjj/HS+LGemkpzCcGvkcIinjokSzyiE8fFU550d8dqVAEAp5lxOA44H3nuTYqWbOhG1k2/O9dMEZunAZwATpsmA+C0KRiAE8Bp02SCtreVtkiBYylVA3fOszyQC4P8DdxX8/zzT+ZKLqcFkiOHe+gkztWU/pqyJHy+mcPvO7gVkoe/lZjopcGDeNpQGqmiod37AJyhbA3AafZKdBxwmt1u006vXr+V/vbEK7Rhy07q1qUj/fGq82nShBHqYgBOAGfTrMo6BQ+nXj0AJ4BTbyWhdzgdOAUU1290U2amdZ8CkEO51ZG/gXs+eyo/4OrzDTyWUpZUnZ91pkdVmvuXhNg3bJRcTq5gj+YKdu7J2auX1V9TioYAnHorA3DqNQq1A8Cp0c8/o/366VPp1OMOo/k/LKXb7nuBvnv/GW7LFAPg1OjXPYPfNeeWqtAOVrACAE69VQA4AZx6K2m7wCljKSX8LeMlVQN3hsh+DIsCilIotODHKPqa+2pKg3eZBDTpN9V05KRar2dxMdHqtez1LPDnchId0N9TU8EuygE4w7MwAGd4OjW2C8Cp0U+ay382/xc644TDa3aOOX4GffTyA9Sre2cAJ4DT6BUI4NTLB+AEcOqtpO0Bp+RirpWxlOyZlFW/gbtUlr/7gYuycyyvpoDolDM8lJFuvbuvYgCVnpw7M13qDX9SEtHggR5KTQ3WCsAZnoUBOMPTCcBpppM6XVlVTe988g299eHX9PbMv/K7TReAE8BpZFkATr18AE4Ap95K2hZw7ubK8vUc/hborN/AXWaef/aFixYttkAzifMwTzzeSyNH1E4EytxFtJHD63I+hsPnB3CeZ48ejY+nBHCGZ2EAzvB0ajPA+fq7X9JZJx9BCfHBU4bMpAh9+usFS+gPdz5N3Tqn01N/u46GDe6nDuwt4IQYrEYVyEiOo31FrBFC6g1qFBcTxX8Q3Nz/jv8yYDWoQGpiLBWVVXHBA0bsNSRQFMdRk+KjKb84eNQvTMpSICkhhiqqPFRRycmQrXiVlRGtWEW0L9fyanbqyGMph3gpPt76oRcvddHH87hJe7H1+ISDvXTyCfy4r8F7ITd+X7HaRfJZFRX1IBrIfTn9PTcbu3XZm57Ev6sL8fcslHl0TPEJ3YptqDX/aI4LqR9+xrX0+rN/3i+ThuQP3k9LVqkczrdeuIe6d+1I5ZX4IxjKwONi3PxL3gPebEQkybmS1l5V1SDyxuwoNtrSR6pqsYIVEO9UdJSLgQoCNWYfMayPh+PKrfk9y5ZtEkL3ciSNJwTFuuigwQKMFlhm7yV6bU41FwVZd9itC9G0C6N4bKX13xX8XmMN99PcvsP6XZuW4qIRw4hS+XM4S3bF+H5Xh7O/ve6Rv2dYTVfAccD53tzvaO7/fqLTjz+cevXoHNQiafjg/k1Xo4GTOfvy6cdFq1TBkH9det0DdP4Zx9DJx0xASF2jNoqGQguEkLr+5YqQemiNxEOelhhD2fnwTjWmVGuuUpeemKvZK5lf4IPJruyV5FxLCYVLdfq330fRt9/yfHSZJMTTgY7mKUGHHuJRBUSSm7mDczm3cKsjCZ/LpCEVPrc5KQghdf3vIdmBkHp4OjW2y3HAOWzytJB3vHL+bDNF6p3OzS+kEy74Iz1211V0xKGjaO3G7STA+dqzd9LA/r0AnABOI3sDcOrlA3ACOPVWEnpHawROgcWtPJZSYFGqzes3cJfHZFJQbp7lpRw62EOnnuyl5GTLky2tkNZw9XlxiS98zj05+/fj8DmDqt0F4AxPMQBneDq1GeAsKi5l13/jryhpVdTc67ufltPjz8+hXVl7uVIwkaZfcDKdd8bR6p9BH87QasPDGVofAKf+1QrgBHDqrcRZwKnGUrJXU3Ix6zdwl1GVcz9z0a/LfUVBSVJ9zmMrD7TStyq4PZL009y9x7pnqTqX6nOpQm/qAnCGpxyAMzyd2gxwyo1ItfgvS1dT5u693JusUo25PHTs0JAgaiZT46cBnABOE9sCcOrVA3ACOPVW4gzgFE/mpi0u2s6TfsTDGdjAXf570RI3ff6li8rKrJ6bh02opqMnW0U/8vg2PreVPaL8J5DzPIkOPMBD3bqZqoM+nOEqCOAMV6mG9zkupL5h8076/W2Pk+RWyix1WVk5uVzNl0YvP3UH9ezWyUwRm6cBnABOmyZTZzuAU68egBPAqbeS1g+cMpZy9RoXlfL0yPoN3LOyXfTeB27VM1NWT25hJD01u3S2wucSVpfwuf+sjLQ8gJu/RzUhfN6QUvBwhmdhAM7wdGpsl+OA87fXP0hDB/al6644izokWL0iikvK6Il//Zcy9+TQPx680UwRm6cBnABOmyYD4LQpGIATwGnTZIK2788cTin82cBjKXf6xlIGNnCX5uxffe2iH36KsvI44710wrFeGjvGo0Lt4ulct4EoJ8cC0XSeeT54sJf/9jVvRwIAZ3gWBuAMT6c2A5yHnno1ffPuU2qsZOAqLaugY869kRZ8+JyZIjZPAzgBnDZNBsBpUzAAJ4DTpsm0GuDcx2MpV/vGUtZv4C6z0WX+uX/k5KiRHjqJG7h34DnpAqkqfM4fHv5aCooGDPDWeDxN9ah/HsAZnqIAzvB0ajPAefQ5N9Kb/7iLunID9sC1JzuXzr/qXvr67SfNFLF5GsAJ4LRpMgBOm4IBOAGcNk1mvwOntChax2Mp9/jGUmZkeLnKnPtrMjgWFnLz9rkColZRUHqal84606NGU8rKZm+mFAX5w+d9envVY1FRpio0fh7AGZ62AM7wdGozwHn/U6/SslUb6XcXn04D+vfkRGovrd+8g55/5UMaMqAP3X/7dDNFbJ4GcAI4bZoMgNOmYABOAKdNk9mvwCnV4+s3+MZKciBu0EAvde3iVUU/P/7spq/+J8MwSAHkkUd4adLEavW19ONcw95QyfWUJZA6eCBRQjOHzxvSEsAZnoUBOMPTqc0Ap4TOpUXRu59+qyrUZcVyeP2UYw6lP113UU1ep5ks4Z8GcAI4w7eW4J0oGtKrB+AEcOqtJPSOlsjhLOe++6u5sEfC6LK6deVWRgyb0sUvc5dVFOT3ePbv56EzudVReqoVPt/Mlec7JHzOUJrAeZwDGTQ7dWzePM1QCgE4w7MwAGd4OjkaOLft3MPV5535XaCbtmzfrcZaimdTKtUrKqtUtXqMJMjshwXgBHCamB2AU68egBPAqbeS/QucO3naz4ZNPA3Il285hMPn4qGUkZOff+WmXxa6rTZIiTz7/EQPj520YFK8oRs3uUlg1c1/wvr6wudSxd6SC8AZntoAzvB0cjRwjjrmClUolJaaRONPvJIWzvuX2V0342kAJ4DTxJwAnHr1AJwATr2V7B/glDzLVavdaiylauDO7YwOPMDKt1yxykWfznNTUZHV3P3gcR469hgvFwB5ueG75Q31Fwx16sReTS4K8jVeMb1d2+cBnOFJBuAMTydHA+dZV/yFSsvKqXePLvTDopV02Lhhjd71vx69xUwRm6cBnABOmyZTZzuAU68egBPAqbeSlgVO1YSdR09u5g+pIg9s4J7LOZjvf8CPbbHclJK/KT01Zb65tEGSxu/iEZVrSH6m5GmKN3R/LgBneOoDOMPTydHAmZWTR59+9SMVFBXTi298SpfzaMnG1vXTzzZTxOZpACeA06bJADhtCgbgBHDaNJmg7c2Zw1nE4yhXruL+z/xZQt/9uAG7VJFL/uX3C6Jo/rc8CYjBMjbWS8cc5aVDD7F6akoe56bNLhVmFw+onOvdy6uusb8XgDO8ZwDAGZ5OjgbOwB/+yZlv0w0zpprddTOeBnACOE3MCR5OvXoATgCn3kpC72gO4JTG7JtlLOUO9mry16qB+0FWE/Zt/L332Ku5d69Fj0OHeOi0k70839xLhRxSl16cElqX1YU9ngMPtFoktZYF4AzvmQBwhqdTmwFOs9tt/tMATgCniVUBOPXqATgBnHoriSxwFnCO5krO1ZScTfFOSp5mLx4vKZOA5n7moiXLLNBMSfHSGacJUHpIenFu5H6ambst0JSCocGDvFyLYHo3zX8ewBmepgDO8HQCcJrp1OhpACeA08S0AJx69QCcAE69lUQGOKXqXKrId+y0rh/YwH0xQ+Znn0uDdiu0ftih1XTMZKtgaAfnaG7hVkcCndHcFql/PwtQJbTeGheAM7xnBcAZnk4ATjOdAJxN1K97RgLtzi1VCfJYwQoAOPVWAeAEcOqtpPmBM3AsZQw3cB84wMO9NXmuOYfNJXwuoXVZUpl+9hQv9830UD4XDK3h6vPiEuvn6d6N6ID+nlYVPm9IKQBneBYG4AxPJwCnmU4AzibqB+AMLRyAU29YAE4Ap95Kmg84ubUzreexlLv3WEAp0DiAYVOg7OtvXPR/P0SpynSpMD/+WC+NHS3hcxdPF6Kaxu5JScTV5x5KbYXhcwBn060JwNl07eSkixuoO873tG1nFn30+fe0Y1cOPfinGZzA7aVFv66lg0cPMVOjCacRUg8tGoATwNmEl1WdIwBOAKepDYVbNBQ4ljKei3qGDuVpQDzrfNNmN73/kYvy8iwIHT3KQycex30zpWCIJwRJ+FzC7zJVqH9/r/J6ttbwOYCz6dYE4Gy6do4EzgULV9DVdzxJhzBcfv/LClo5fzYnZefQFO7Veef1F9Ppxx9upojN0wBOAKdNk6mzHR5OvXoATgCn3krMPJwVFS5axZXkEkYXUJR8ywMYHCU/U5q3SxN3WR05bD6FR1L24XZGuQyfEj6XQiJZ0mdTiokk/O60hZB6eM8YgDM8nRrb5TgP52mX3kE3/f5cOmriGBo2eZoCTlk/L1lD9z/9Kn0w634zRWyeBnACOG2aDIDTpmAATgCnTZMJ2h7Kw7kz08WFQVbvTH8D92QOif/M4yi//J+Lx066VOHP5CO8dPjEaqpkOF3H4fOcHAtCk7k90pBBHvXZqQvAGd4zB+AMT6c2A5xjjp9BC+e+oOaqBwJnZVU1TTj597T485lmitg8DeAEcNo0GQCnTcEAnABOmyYTFnAGjqWUKvO+3Ii9Hzdwz8p20bvvu2mXr51R/34eOpO9mincU1OmC22VPpwcPo+NlYIgr/JsOn0BOMN7BgGc4enUZoDzpItupSfuvZaGDOhTBzi/XrCEHnj6dfriP4+ZKWLzNIATwGnTZACcNgUDcAI4bZpMSOCUqgWpMJcRkwKOqSlWrmZMtJe++MpNP/3iVl01pGn7KSd6aBg3d89mCF2/kVTfTTUznUPu0upIcjbbwgJwhvcsAjjD06nNAOd/P55Pz7z4Lk099Uh64dWP6PZrL6S1G7fTJzz68o9XnU8XTjnGTBGbpwGcAE6bJgPgtCkYgBPAadNkGgXO7H0eWr3axdN/6jZwX73GTZ/MdVFBoQWUh4z30HHHeKiqmvM0Obczj9sdyZKqc6k+lyr0trQAnOE9mwDO8HRqM8ApNyJw+c7H39C2zCyKj4ulPj270AVnHkOTJow0U6MJpwGcAM4mmE3NERQN6dUDcAI49VYSekdqh1haua6aNmzimec8ltLfwF08lh9w9fkGbu4uqyuPnZx6lod7anrVGMsdEj5nbyf/meGCIO7DyS2S2uICcIb3rAI4w9OpTQGn2S0372kAJ4DTxKIAnHr1AJwATr2VNLyjqJho50435eVGUXmFh1xuHjvJPTW7dCZa8GOU6qsp04DiYr10zDFemsCezT1ZXETE4fNyLg6S3E4Jnx/A+Z1RbSR83pBSAM7wLAzAGZ5ObQY4d+zKplf++zltZ+9mRQX/pqi3Xvz7rWaK2DwN4ARw2jSZOtsBnHr1AJwATr2V1N2xJ0tAk/tm+kLh8bFu6sLey759qymLgfJdnhSUnWN5NYcN9dApJ0nfTC+t5jZHBQVW+Dw9jWgQh88TE+3+687bD+AM7zkDcIanU5sBzqkz7qaMtGQaMfQATtgOfsv5+0tPN1PE5mkAJ4DTpskAOG0KBuAEcIZjMuXlRJm7XJTJbY7KK6wTUkkuVeTDBsZQGXcyef9jHhKy2ALNNG7ofuZp3FOzt4cbu7tI2iNJsZA0fB8wwMteUOdXn4ejm+wBcIanFIAzPJ3aDHCeeOGtNPf1h/ndqPUudH8vACeA08QG4eHUqwfgBHCGUiA3l3MtM4n27uV8S87PlJWS4lXN2yV0XlQkhT8x9PW31Tzj3Pq7If00T+CxlJl8btMWN0fLGLqYQ3tzQ/d+Ej6P0ttlW9oB4Azv2QRwhqdTmwHO6bc8Sg/f+TvqmM69LFrBAnACOE3MEMCpVw/ACeCsr4CMkZQ+mTt3Ug1EuhkSu7FXsldvbmmU6KVVq920cDHRho2WR1NWX+6zefqpXoqP5/A5wccS+AAAIABJREFUV58LjMqSIqLBA6356O1xATjDe9YBnOHp1GaAc9O2XXTDXc/SxPHDGoTOGRedaqZIA6c3bs2kex6bze2XtlHXTul0C7dfOvKwUWongBPAaWJwAE69egBOAKdfgWIuAtrBuZl79vBkIIZOWQkJXNjDs8u7c+hcRlH+spBU2LyouDYKJtXnR05y0eBBVTxVyM2h99qzAzl8LlXp7XkBOMN79gGc4enUZoDzd7c+TktXbqD+fbpzZWHw0NqXn7rDTJEGTp8+7U46+5Qj6NKpx6v57Tfe/Sx9+94zlBAfC+DUqN09I4F255aq3CisYAUAnHqrAHC2b+CU3x1Z2XWLgEQR8Ur27iXFPV5at95NvyyyvJn+3zXSlH3YMA8dPNZLI4bE0LrN1bRmnVeNsBRvaN/eXETEHk8Jpbf3BeAMzwIAnOHp1GaA84gp19Enrz5EyUkdzO48zNNVHLt595NvacrJR3CRkpXYcwiP0Hx75r3c/7MrgBPAGaYlNbwNwKmXD8DZPoFTFQFxIY8UAvmLgAQixZPZqyeRNCkRb+bipW4q5Ibt/iXezPHjvDR6lHg8vbSbzxcWRFNpuTRy91LnTtIaiYuDOKyOZSkA4AzPEgCc4enUZoDz/Kv+Sq89eydF76es7uWrN9H1dz1Dn/MITfkZEFIPbYDwcIbWB8Cp/wUG4GxfwJmbx0VAnJsZWASUzGMmpR9m507sxeSQ+MIGvJkj2Js5frxXNW+X/M5dDJrFJZZ20hYpNo77afb3KM8oVl0FAJzhWQSAMzyd2gxwfvzFD/TV/y2iM0+cRF06pQVVq8uM9Ugt6QE645bH6M7rL6bfHDJC/TPFZRyfwWpUgQ5x0VRSDo0aEyg6ykVR/Nu+vNJXXgtbClIgIZabdld5uAIZoNCQebjZfuKi3VRa4UtqdKANST7mTq4Y37rdy4U81g1E8WujWxfitkXEDdtd9P2PHvrxZ68aP+lfPbsTTTzUReNHE39f8ju9lJUj1eqWrUi4vAtD6gH9oqgjg2Y1bKhB6xBFE/C7WvvKSYxvw93/tXdvvsHl5WV+mZa7wrDJ00L+Yyvnz47IDyPz2q//yzN027UX0FETx9T8G/nFwc3nI/IDOPSiqYkxVFBSiRzORp6/WAaFqCiGBUB5oxaelMDhUIapag6HYgUrIGAmUF5U6rw3djIJaOt2qTgnlVspKyGe2xNxyLw7w+RG7o+54CcP52haPTJlxXDq/hieYnzYBOJiH4FM6b9JVMYheP9K5mbtPfkaPfgakuovb3wrqz1UyW9csIIVkC6DyR34dzX+noU0D/l7htV0BRwHnMUlZRTty6Vs6LYbKiRqujzWSZlqJJ7NB+6YQWNHcO+MgIWQemh1EVIPrQ9C6vpXJ0LqoTWK4TctafyHMDs/gLj0su63HQKO2eyFlElAuXm1P4Y0YpciIMnTXMTtjBZxbqa/bZHs6t6VczM5ZC6h8zwOu0vYPPC8zAHpyh7R7t083Iez7u2lJ8VSWWU1v7Fzrhc4kk8YQurhqYuQeng6NbbLccBpdrtNOz3thofogjOPphMmHxJ0AQAngLNpVmWdAnDq1QNwtg3grC0CsuaUy5JU/O7dvNSjB7+x384tjTg3U9oW+b2Z4p0cPpwrzbkISPI4MxkyZTSl3xsq10hP55ZIfA1p8t5YxTmAM7QNATj1v4dkB4AzPJ0cDZwTT7+Gnr3/BuVdlK9DrQUfPmemSL3Tkrd5wgV/5DBO3dyNx+66io6dNA5FQxq14eEMLRCAU/9yBXA6GzgbKgJK7CBFQPyGi3toLlka7M2UcZRSaT50sIf27eNKde67WezL7RQ1pMK8ezeB1fCqzQGcAE79bxr9DgCnXqNQOxzh4fzqu8U0duRASk9NJvk61Dpm0lgzRWyehocztGAATgCnzZdU0HYAp/OAs6FJQJInKA3WJa8yK7sBb2asl0YO99IhB3tVnuYuzsvMCRhXKb0zu3BLI8ntlN6bdhaAE8Bpx14a2wvgNFPREcAZeIu33f+CGm1ZfxUVl9Itf/0nPf/wTWaK2DwN4ARw2jSZOtvh4dSrB+B0DnDKJKCdmW7aLUVAvnTJ2Fgp3pGQONGy5VbfzMDcTHlMQuaDBnkpmxu87+aweWABUEqyBZnS7kjyNJuyAJwAzqbYTf0zAE4zFR0DnFu27yb5uPGe5+iJe4LD6lt27Kan/v0OLfl8ppkiNk8DOAGcNk0GwGlTMABn6wZO6TSU00ARUEqKeDO9XNjjVkVAgbmZcezNHDGCvZlcBCSeT6kyz82tbXckHs5uktvJH4lccW66AJwATlMbkvMATjMVHQOc3/64jF549SM11jIpkRN/6q34uFg659TJdO3lU8wUsXkawAngtGkyAE6bggE4WydwNlQEJGHvbp29qkp85WrOz1xW15spM88lN7N/P4+C1D1cAFTp6ywnBT8ZUgDE3syOHHqXQpbmWgBOAGdz2BKA00xFxwCn/zYvu/EhmvXE7WZ33YynAZwAThNzQkhdrx6As3UBpxQB7eTel4H5lQnsAxBvZmGBi0Pm0j+zttJcvJmjRnpp7BhuvM5hdgmZFwYUACXylGIZV9mN2x5J+D0SC8AJ4GwOuwJwmqnoOOA0u93mPw3gBHCaWBWAU68egHP/A2dNERBPAyournU9ypjItFQXrd/gVbmZgY/JKErJzezFnyU3U3pvenx916UdkuRkSgGRhN4jvQCcAM7msDEAp5mKAE4z/dAWSaMfqtRDCwTg1L8AAZz7DzgbKgKSDnFd2RtZWuKipVwEJLmZ/hXH88rFmzmaJwFVVspMc54AVFYLqGmpFmR25rC7QGdLLQAngLM5bA3AaaYigNNMPwAngNPIggCcevkAnC0LnP4ioB07iPLya2FRqsxTU4m2bPWq3MxAb2avXl4aN5bD4l08ypMpBUD+5u3xcVYBkDRnl9D7/lgATgBnc9gdgNNMxTYDnDISvor7cNRv0G4mj/40QuqhNYKHEx5O/aso9A4AZ8sApyoC2sVN1jls7p8EJIU8HXleeVkZ0SouAqrjzeTm66O50nzYMC9V8Nn6BUCduGdmD27MLpOApBJ9fy4AJ4CzOewPwGmmouOA89jzbqYv5zwedNf5hcV00oW30oKPmnfSkE5eACeAU2cjoR6Hh1OvHoAzssAp88hlrnlgEZCExlNTXLQj00vLfq3rzewt3szRXurU2cNjJt1UUFj788n4SdUzk0Pu9Yaz6Z/oCO4AcAI4m8O8AJxmKjoGOL//ZQUt4I/X3vmCLj77uKC73r4ri35avJp++uSfZorYPA3gBHDaNJk62wGcevUAnM0PnI0VAaVyjmVlhZvWrPPSJq409y8ZJTmKvZlDh4i300tZUgDka+wuPTNVARDPQ09KjHwBkN5igncAOAGcTbGb+mcAnGYqOgY4N27ZSR998QO9+OYnNPmw0UF3HR8fS6cdN5GOOHSUmSI2TwM4AZw2TQbAaVMwAGfzAWdJKXstOTdzF7cmEuiUFc3FO0mcn8nv2WnlChcVBVSh9+ntpTGjuBKdw+JZ/Hgpn5clIXIJlasCIA6d7++Quc6kAJwATp2NhPM4gDMclRrf4xjg9N/Csy+91+LN3UNJDOAEcJq8BOHh1KsH4DQDTlUExG2JdnDYPLAISAp4KqtctGlTXW9mQoI103zgQBcDpof27astAJLHJC9TioDiuBjIKQvACeBsDlsFcJqp6AjgXL95B/Xs1pk6JMSRfB1qDezfy0wRm6cBnABOmyZTZzuAU68egLNpwNlQEZB4IgUas7JdtGZNXW9mX/ZmjuR2RikpkptZOwFI2hd14TZGkpspbY2cuACcAM7msFsAp5mKjgDOYZOnqelCh4wZQvJ1qLVy/mwzRWyeBnACOG2aDIDTpmAATnvA2VARkORZygjJLVvlozY30+/NPKC/l4pLiAp4UpB/ST6neDMFNqO496aTF4ATwNkc9gvgNFPREcBZUFSivJvR/FZbvm5sVVZWUcd0HuLbggvACeA0MTd4OPXqATj1wJkUH0Mr1lZwVXndSUBSKZ6910vr1ruphBu1+1ffPtzO6CCi5CSeab63Np9TwuQyYlJ6ZnbgkZNtZQE4AZzNYcsATjMVHQGc4dxiUXEpHX/BLbTgQ7RFCkevltqDPpyhlQZw6i0RwNmwRvz+mvK4wboU8mTtiaaCYv4GL2m4LgVB27bLR603swOH0kdwbmaf3gyl/L69xPfe3eq1aRUAZbSCnpl6i7C/A8AJ4LRvNcEnAJxmKjoOOLdnZtH9T71Gq9Zt4ebEHCPyrdKycjqwbw9676X7zBSxeRoeTng4bZpMne0ATr16AM5ajSRcLlN89vFHQYH1fbfbRfEx3CuzrJq/76WNG9mb6asml8f79vXQ0MFEiR28lJtXO89cKtPFkykeTQm5t+UF4ARwNod9AzjNVHQccE6/5VFKTkygk44+lO569CV64PbptGzVRlr06zp65v7rKD012UwRm6cBnABOmyYD4LQpWHsGTgmD791H6iOfx0z6Wxn5JYzmkHl0NBcArXWp/Ez/Em/m8GEe6sU1lMVFLn5zbj3in4MuBUDSpL29LAAngLM5bB3Aaaai44Dz4JN+R/PfeYrfrcfTpDP/QN+9/4xS4PNvFtL8BUvogTtmmCli8zSAE8Bp02QAnDYFa0/AKYU9+3LZi8mtiPby5/LyujMhJfxdUSHtjby0a5eAaG3IXGQVb+agAVb+pQCqLNUzM82qMpeemXKN9rYAnADO5rB5AKeZio4DzsNOvZo++89jlJLUgY4863r69LWHFXxW8hz1I6dch9GWZvbQ7KeRwxlaUoTU9SbXloFT8i3z8q0wuXgxi9gbKd+rWQyLVQyhhUVEu/e4aA9/1F89e3ppQD83paZXU3Gxlb8pS/psSr9MqTSXUZXteQE4AZzNYf8ATjMVHQecf/jz0/xLtZSevu86+uPfnqfuXTuqUZeLJaT+0rv0zbtPmSli8zQ8nKEFA3ACOG2+pIK2tzXgFCiUHEzxZOZxTmVgmFxgk987q4rynByizEx+3FNXks6dPNS3D3sru/CEIPZkej0uKinmvM3yanJzz8yuna1Kc5kEhGUpAOAEcDbHawHAaaai44AzZ18+PfjM63TvLZfR7qx99PvbHueRbPsoLjaG7rrpt3Tmib8xU8TmaQAngNOmydTZDg+nXj2nA6eEycV7aRX7BIfJKzm/spRD53v3SZjcpULmgUv6Yfbp5aUuDJgp3PVNZpn7R0zKPika6tk1ihJTKtVMc2nUjlVXAQAngLM5XhMATjMVHQecPy5eRWOHD6RYBkxZVewe2JOdq/pvxsfFmqnRhNMATgBnE8ym5giAU6+e04DTwx5JyZ8UuNzHoFnIYfLAVVnpIm6qwS2NvCpMXhzQH1P2ScFPH/ZgCjwmcw1kFXc7KiurvYLkYCZxwU9Gukz+IerU0UUdU2IoO58vitWgAgBOAGdzvDQAnGYqOg44J552Df+yrqCxIwfRoWMPosPGDaOhA/uqd/n7YwE4AZwmdgfg1KvnBOAs4jC5FPqoMHm9anLxcApgShsjycHML3RR4G8ree/cq5eHw+CWB1PC6jKW0r8EMJO5hVEaF/6kpxGJxzPQixkT7aa0RABnKEsCcAI49b9p9DsAnHqNQu1wHHB6+bfxhi07VRukRb+uVZ/Lyip47OVQOnTcQXT+GUebKWLzNIATwGnTZOpsB3Dq1WuNwFkTJs9zKy9mICBKzmVJMc8p58bqOdkSTq9Xac4h7x7S/5KLeVJTuGqc/1vC6oGAKT0ypbI8jQEzjfeEGi0J4NTbEIATwKm3Ev0OAKdeozYFnPVvpqS0jD796id6+a15tGnbLsIsdTODaO7TKBoKrSiAU29xrQE4JUwunkt/yyKpGvcv8UgW8X8Xl3Bj9Vw3Zee4yeOpLdiRtkRdOf+ya1cPeyddFBvjVWFy/5LHpSdmGofIxYOpA8z6igE49TYE4ARw6q1EvwPAqdeoTQHn3twCWrxcvJvr1Ocdmdl00OB+NGbYABrNuZ2HHzzcTBGbp+HhDC0YgBPAafMlFbR9fwGnQGRNNTnDpsfXbkhQspg9mFJtns/9MLOy3KqyPHClp3t4io+LB1F4KS6eGEDrA6YvRK7yMM0KfQCcegsDcAI49Vai3wHg1GvUpoBz2ORpdECf7nT2KUfSYeOH0cD+vVokf/PjL3+gex+fTffdNp1OmHxwjaYATgCnyUsQHk69ei0FnCpMvpdzMf1h8oAwd2mp1QuzgPMvszlMXsZV5YGBcini6c4hcsmzTGDADGyuLh5MeVy8l+nNAJjwcOptpv4OACeA077VBJ8AcJqp6Lgczn+/8QktXLaGfl29ifr07ErjRgyicVxANJY/p6Vy4lME1mwO1y9atpay9+bRZeefDOC0oTE8nPBw2jCXBrdGCjil/2VNNTm3LBKPpn9VMGzKY0XFXu6HKd5MpsYAwoyPt3IwJc8yIcEKk/uXBZi1RT7iwZQRlJFa8HDqlQVwAjj1VqLfAeDUa9SmPJz+m6nmzPzVG7YyfK6lX5auoSUr1lOn9FT68OUHzBRp4PSaDdto8IG9afrNj9K5px8F4LShMIATwGnDXCIOnDLJx+qJyTmZBbVhcsmplBxNCZOrueX8WKAHM5oLe1Qz9QxuW8TN1gU4/Y8rwEyURutWmyLxckYSMOuLBODUWxiAE8CptxL9DgCnXqM2CZwlpeW0fM0mWrJ8vYLNlWu3cL5UEn30yoNmioQ4fcVNjwA4baoL4ARw2jSZoO0mHk7xVO5T7Yqsgh/5b1n+XpkFhV72ZLoVgAbO5ZGQeOeO3Osyw0OJSW4en8uA6SNMCzBrczClTVFMBD2YOv0AnDqFMGlIp5B0FeySnkC793HuCFajCgA4zYzDcSH1B55+nZauXE/idezWOYMmcC/OCWO5JRJ/7pTB7oUIroaA01Nn8HEE/3GHXtrNf52hUeNPnvKj8f+l3RdWwwqIDYk83jpI2PBeaUkkeZjZe71cLS45l1a1jn9muaoyl0IfzsOs5pGQfOWaC3Xu7KKuDJkpKW7+YC9lzcQeF6VwA/bO0mA9Qz6IYqy5E61iyV0IBON1FuJ1JgKFaUOt4kndDz8EflfrRReNsJqugOOA87b7X6AJ0nOTAbNHt05Nv/MmnGwIOHfvCxgB0oRrtvUjXdPjKSuvTP3BxwpWICHOzfl/UZRfxBUrWA0q0DEllvJLqriVUL2h4r7dMslHemHKR16+gJf1gITPJUxeUODhMDlXkge0IpLHBSI7sgczKcmlQuHRAXmYqtE6f89f5NOaALO+SNHc+D21QzTtLQiocoIt1VEgLSmGyiqrudirYRtq73KJh7NTGv+uzsXfs1C20C2DKwKxmqyA44CzyXfaDAcRUrcvIkLqoTVDlbrepuqH1KXJuoTIZTa55FtKdbksGf+YmyeAaeVolpX5Y+DW4wkJFmCmpLhUw/W4uNp/O9GXg8lp4CoHszUDZn3FEFLX2xByOENrhJC63oZkB0Lq4enU2C4Apw39AJw2xPJtBXACOO1bTd0TGUlxtHlnJYfBvSoPU1WM8xLQzM1jryZDZj5/LiqtDXfJVzGx7LVhwExOZsDkPMtELvbxLwWYAW2KnASYAE77FgXgBHDat5rgEwBOMxUBnGHoN3XG3WqcZhV3d47iagIXvx18+M4ruVr9EEIfztACAjgBnGG8xGq2iPeypIS9lIUClpbXMtodQ/vyqxkwvda0H/ZqyuPSE9OPmBJFl5zLDG64nso5mKmpHCrnkLn/cb8HU4XJHebB1OkHD6dOIRQN6RSCh1OnkPU4gDM8nRrbBeA00w/AqdEPwAngbEgBqRIvZrAs5Cpx8VgWMVzKZ38VuZyRZuvl3GC9stJFO3fx2Ej2ZFplPrUtiQQeU9h7mcYjI+XrGg8mV5Wnp0tupkflYTrZg6n7FQXg1CkE4NQpBODUKQTgDE+h0LscCZxSob6Z56aXlQcnyU85aVJz6BL2NeDhhIczbGNpYGN7yOEsZS9lMRfwCFRKc3X5XMrhb38hWZl4NX3QWVLCj/H+fIZLyz3pB0zrc3Iyg2SK5FlauZZRvkpyCZfLf/uLfGI5nN5eFoBT/0wjpB5aIwCn3obg4QxPo1C7HAecjz0/h2bPmcctSlIproG/KvPeeMRcFRtXAHACOG2YS9DWtgSc1VwFXsTgWFjk91pajdT91eHyWSrHixgqBTwViHJovKraak7kkrY1AplMouLJjI0VwGTvFHsv4xLEi1lbzNNBPJhp7NVMt77fngCzvhEBOPWvQAAngFNvJfodCKnrNWpTwHnU1Bto1hO3U7/ePFeuFSwAJ4DTxAydCJzimSzhcLcKhfs8lvK1hMBlSS/MYv6+hMwVWKq9HB6vsHoh1iwhTAbLqCgLLKWKXDyVidxUXXIuY329LkWjqBgu/knxKLiUYp/ACnMT/dvCWQCn/lkEcAI49Vai3wHg1GvUpoDzzMv+TO/Pus/srpvxNIATwGliTq0dOCv9XkkBSL/3kkHSw3PIBTyL2VtpgSd7Nfn7pfzfJdyOqMZb6RNHHJf+EZAJDJUyqccPlvEB7YlkZKSMjlSPsRdTALRv9zgqrqikykb6cJro3xbOAjj1zyKAE8CptxL9DgCnXqM2BZwyaWji+GE0eeJosztvptMATgCniSm1FuBU8OgDRwmLqyIeDn9LmrT4ISXnUryU8iFeS/FwSr6lyrG0HJU1S77swCFwAcckbqBugaV4MK1iHxkbKWApMFkDl/y4nPHnZAZqajLa0uS5ccpZAKf+mQJwAjj1VqLfAeDUa9SmgPNPD86kz7/5hfr07EpdOqWz16TuqKl/PnSjmSI2TwM4AZw2TabO9v0BnNJ6SEFlgNdSgFIqxwMLeAQ6pZhHvJjymFoqx7L2FiQMLvmUEgJPSnSpzwKS8rJ0c0FPBxUml8d9cMlfC2TamRAH4AxtYQBO/SsQwAng1FuJfgeAU69RmwLOR557k6JrhxwH3dtNvzvXTBGbpwGcAE6bJtNiwKlyKQUsufWQAKY/51LC5ByhVv+tPJY+z6WEw+UxocHaDpfy40qxjgWNApOW19L67yj2VopX0u/F9IfBBSrFi2kHLBvTEcAJ4DR5jclZACeA09SG5DyA00xFx1Wph7rdl/7zKV1+/slmitg8DeAEcNo0mYgAp4S3/f0s/eFwCXtXc66lFQr3tSXywWVllS8ywN5KBYU+r2UUF+okcmhbANKfZ5mU5OU3eaQqwSXsncieTPFqyuPyOdIFPABOAKfJawzAqVcPbZH0GgE4w9Mo1C5HAufy1Zto1botnF/mG6LMd5i1N4/efO8rWvTZv8xVsXEFACeA04a5BG21G1JXrYWkeEcm8agqcKsFkXy/Fiyt70kovJTD526VY2lViEvbIX7Rq2lZfi9lTQGPDx6liEdA0sqvrPVs7q/m6QBOAKfJawzAqVcPwKnXCMAZnkZtCjhf/u9n9Pfn36J+fbqp5u8D+/dSn7t37ai8m2efcoS5KjauAOAEcNowl7CB018B7s+z9HstpXelKuBRvSytynBpQVTC35PKcI8ApQ8qVTdL/lrlWPpD4T6I9Ie8VeGOL1Tuz7VsqHDH5B5NzwI4AZymNoSQemgFAZzhWRhC6uHp1Ngux3k4jz33JnrkL1fR2BED6Ygp19G37z1N+YXFdO/js0mmDE2aMNJMEZunAZwATpsmU2e7eDi9nijauaeyZryjNE6XeeL+XpcClP48S/m+f7CjTN5RyxcWj49jsJT8Sgl3q89WvqUfOAPhUr4n1eJOWABOAKepnQI4AZymNgQPp7mCjgPO0cdNp4XzXqBodsMcfsa19P0HzyoVsnLyaPrNj9CHLz9groqNKwA4AZw6cxHvo1SGl7F3Un3m+eDlZV6VXxkb46bsHBfty5MweC1YStjcK70u/RdXXkv+D/4sBTw1YXAGyiSGxxQe92hBpq/dkL8VUTMV7ujuMZKPAzgBnKb2BeAEcJraEIDTXEHHAedJF91Gt11zgerDedqld9D9t0+nkQcdyB6gUjpq6o30y9znzVWxcQUAZ/sFTgl7lzM8lpV7FUxW8CQd+SythdT3ZXQjh74FMv2PVche3lfB35NWQxLyzsuV3EprdrgfKoUto3kCj4Cl5aW08inTUolS+UMKe1Qo3BcOl4rwtroAnABOU9sGcAI4TW0IwGmuoOOA872539GfH36R5r/zJL0/7/9o1py5dNi4YbR+0w7q2jmDZj52i7kqNq4A4Gy7wGlBoleNZKwBSeWllDGOXiosdluP+wDT+lzrxZSaNm+1BL5dKnxthcKlcqe2D6VAq2or5OtV6fdcyoxw+ZAwuPS69IfIZb54e1sATgCnqc0DOAGcpjYE4DRX0HHAKbe8cWsm9evVjf9Qu+mtj+bT0hXrqWe3TnTx2cdTagq7fFpwATidCZyVDIPiiazweSL9XknVFJ1zJvO5CryMRzTKpB3xRqpwOH9d7vNgVlVbE3Yk2V4hoA8i5XuBvSdlTri0DYrjlkLqM+dZxsW51NfioeyY6qKOGVzcE1VleTFVEQ/3veQ2RFiWAgBOAKfpawHACeA0tSEAp7mCjgROue1K7lC9JyeXenXvbK6CwRUAnK0POCU30sqXlHC3BYnipSxlb2RBgYsKCq2Z3wogOcQt+6zcSiv07ZFSbybHWl+iqvdWN+rvMCRfSy6lgKO0EQqEynj2SCZz78rUVA5789ex9YEz1sU9La0xjnbbIhmYqmOPAjgBnKbGC+AEcJraEIDTXEHHAWdpWQXd9+Qr9PEXP1AVk8XK+bO54KKQbr73OXqUq9c7ZXCCWwsuAGfLAqcav+gDSL+3UYCxpMRLeQVuKiywWgXVhLcZKv3QWVFpgaSMQ1WeSMZHf+ugwHHg4qFUnsh6XkkBS2mCnpxMlJJqAbAIAAAgAElEQVTsVaFuaYYu8BjPXstY5b1kELXhnQRw6l+sAE4Ap95KQu8AcAI4TW0IwGmuoOOAU/I3s7nJ+9XTzqQLr/6bAs4S7m791yde5ubX1fTYXVeZq2LjCgDO5gNOqwin1jPpr+ou4PB2PnsmC/nDX4RjhcD93kuZqONmiLRGKcp1fL5IH1z6GgnxYzUhbp9X0u+dVC2EFEh6+MPyQNYBSQWW9maAh2NGAE69SgBOAKfeSgCcJhqhD2d46qEPZ3g6NbbLccA54ZSraN4bj1B6ajINmzxNAaesgqISOuXi2+i7958xU8TmaQBn+MCpAJFD1n7PZCmPXszPt2CyoIArurl9UBkX46gQt88zWcF5lIKL/gC3byCjgktr5rcfLaXFEENiYIibvxYvpIS3xSuZlsb/zdXc4rn0eyP9Xsz91ZMSwKl/wQE4AZx6KwFwmmgE4AxPPQBneDq1GeCceNo19DVXqMfFxtQBTgmrH3/+zdyjE6MtzUwivNOcQktVXHgjxTNSgFNZ6WUPM49Y5K89AYXU5cVxtGIdNzWXIhx/AY4qwrH2WiAZ0BLIB5C1HkrhSl94O97KlxRYTOAQtrQESubQdir3oExN4z08B1weU+Ft8VDaDG+Hd+fNuwvAqdcTwAng1FsJgNNEIwBneOoBOMPTqc0A5x/ufIp6cEX6jVeeQ+NOuFJ5OHft2Uv3PfUqF3t46Z8P3WimiM3TTvdwSpGMwKIFkPx1FYMjf+bsBDWzu0TN5PaoZuVl7IGU2dyqryR/VPK+Ct5f7T/H16hmAJWlwtoMitwQyFeAUwuWVgKlNYoxKro2VzJegJI/pFpb2gNJeDuVq7gFKqVAx58n6QdKm09Vq9wO4NQ/LQBOAKfeSgCcJhoBOMNTD8AZnk5tBjh3Ze2jK295lLbtzFJFQ8lJHaiQw+kjhh5Af7/7agWjLblaA3AGehvFa1gR4G2U2dvFAo4cvpYQtszhthqVcw9J/izeSQs05TPDJoNmNX+tKrVVPqS/Qpt9kb5+P/4wtr+MW307oOpGeDKaQVKKZ6QFULSCRQZJ1U/SGrsoIJmR4VFeyTiGTPFISnhbQuDtaQE49c82gBPAqbcSAKeJRgDO8NQDcIanU5sBTrmR6moPLV25gaFzD4NMLPXp2ZWGDe5npkQTTzcXcEr1tcCfeAgVBDL0qVA1f67gULSMRyzhVj7yIRAp8Chztf19IiWcbXknrbMCjhLulv9Z0CjTbGrb+/hv1++J5Adr+kf6e0m63V4GR4FHF8Mjf81wKBCpimniuZck50NKaDs+3sNeSTcDpUy/scDR2u+iHp3iqIB/4Bj1vSaK3IaPATj1Ty6AE8CptxIAp4lGAM7w1ANwhqdTmwJOs1tu3tP1gVPBnsCfClNzaFqBoxWmlnC0QGIxt/Ap5c/ibVReR2kwXu7hfW7ez+fEy6jyIy0A9fBnle2owtC1rXwCoVEFsmtcjwKX1qMc0FZha4E/GZUY44dGKa5haIwXeGRQVKFs9i6qD2k+zpNvJIwdw7ApoCngqSCSP0v/yHBX94wE2p1b6qscD/dU+9kH4NQ/1wBOAKfeSgCcJhoBOMNTD8AZnk6OB86Lr70/rDt97dk7w9rXXJtmvlauwJFHuavqa8lrVIApHsYaaLTg0e9FtHpA+gAx4AepyXsUWvQBo7/+Jqq+t1GFq6WIRoBRvIzW1wkyrcYHjSkpFmBasGiBpwBkS45HBHCGtjQAp/6VCOAEcOqtBMBpohGAMzz1AJzh6eR44Bxx9GWUxO63Q8cdRONHDWFvnfjugtd5ZxxtpojN09OvZ6qsB401ow3902oCch8lt9ECQCu3UXo7CiwmiLcxzsPwKMDIX0t42jfqMCnRw+DoqgFG/zUCRyja/LFbbDuAE8BpamwATgCnqQ2h8XtoBQGc4VkYgDM8nRwPnDn78unTr36kj7/8QVWln3T0oXTGCYe3SO7m9sws+ssjL9HaDdtUUdKd119CY0cMVJreek8FgyDnM3JoWnIY/d5GKX7pkODh2dguFZ5O5QFIViENg6YPOgU82/oCcAI4TW0cwAngNLUhACeA09SG5DyA00xFxzV+l9vdsn23Gm35yVc/sKczik5n8Dz1uInUvUuGmRqNnP7t9Q/S0b8ZSxefdRwtWLiS4fNF+mLO4wyPUdRcRUMR+cFbwUUBnABOUzMEcAI4TW0IwAngNLUhAKe5go4EzsDbXr56k/J6fvntIurTqwvNeuJ2c1UCrrA3t4BOvPBW+uHj5xTcypo642669eoL6JAxQwCcGrUBnABO0xckgBPAaWpDAE4Ap6kNATjNFXQ0cGbl5NEnDJvzvv6Zsvbm0skcZv/j1eebqxJwhcXL19Nf//4yvT/rvprv3nzvP2jC2IPo3NMmAzgBnEb2hqIhvXwATgCn3kpC7wBwAjhNbQjAaa6g44CzuKSMvvh2IX30xQJaxr04J08co3I5J44fzu16Gi4kMpFpwcIV9PS/36H/PH93zWX+/PCLNOiAXnTpOSdQeSU30MRqVIG4GDc3ovf4e8RDqXoKiMm6uPqrqjpgHihUqqNALOc9iz6BI1MhUa0CUvARHWVN/cJqWIEY1sfDRZzcwhmrAQWkKUqM73c1BGpcAfl7htV0BRwDnN/+uExB5tffL6GhA/spyDzxqEN4BGJkR9MsWbGe7n5sNn04u7Yt0033PKcAd+qpRzZdeZyEAlAACkABKAAFoEA7UcAxwDls8jRKT01WbZE6ZaSq6TkNrTv+cFGzPnW5+YV07Lk30/998Cy3LuIeRrxOuuhWeuCOGTRm+EDaW8BjgLAaVaBjSiztK6xA4/dGFJJ3zDHRbioq5QkBWA0qkJYYQ0VlVfACN2If4t1Mio+mvOK6LdpgTrUKJCdEswfYg4hUI0YhLfbSk/l3Nf6ehXzZyN8zrKYr4BjgvPfx2WHd5d03Twtrn51NV9z0CB08egjNuOhUmvv1TyrEPvf1R1QIH1XqoZVE0VBofZDDqX8lIocztEbyhkWgPDufR5lhNagAcjhDGwb6cIb3wkFbpPB0amyXY4DT7DbNTu/cnUN/enAmrd24nXr36EL3MNT6Z7cDOAGcJtYF4NSrB+AEcOqtJPQOACeA09SG5DyA00xFAKeZfvBwavSDhxMeTsOXGAE4AZymNgTgBHCa2hCA01xBAKehhvBwwsNpYkLwcOrVA3ACOPVWAg+niUYIqYenHjyc4enU2C4Ap5l+OA0FoAAUgAJQAApAASigUQDACROBAlAACkABKAAFoAAUiKgCAM6IyouLQwEoAAWgABSAAlAACgA4YQNQAApAASgABaAAFIACEVUAwNkEeaXp/FPci/Oz+T+r0+NGDqY7r7+kpjF8Ey7Z5o6s37xDzaD3t5J68E9XqnGg7X2tXr+Vbrz7OfrNISPozzdcUiPH9sws+ssjL9HaDduoR7dOyp7Gjhj4/+2deXyMV/vGL6IU1YXaqtTWWmtrLaWWUpRaaotYiiARSwhJiCQkYkkiEiSyWGLfqdSuSm1vqVKltNTaam1Ve6v2/s59dOadjCSTyWR+b2Wu8/n4Q+Y55znne+6ZuZ57OeNwuB48fIgpM1diztKN6scWYvSPPRja1eu34Dd+Oi5evpbsl78cDVJqNnTq5/MIVr+K9uOpsyj88kvw6e+Chu9UdTQ8er3rtuyBnN08bkRfNG9UU//N8Lm9asNO9ROXj9CgdlWMHtbTIT+30/Ne6uUVhgIvPY/IoAG0oX9s6N69+6jezE39DGgOI5PG9aojKnigQzKydtEUnNYSU9eL0Jy1eAPmR/sjpzI8r6BpqPRGSXj0aJOB0bJeF/lgb93THz06NkOHDxti2ZptWPrpVqyZNyHrLdaKFcnPpI6bsgBlSxVDvrx5kgnOnkNC0fjdGujevil27/9eic9EfL4sUv0KkZMVd3j6L/UMmIryZUsgYcEa7EyKNgrOP2/fQZf+IUpAVcMO9TO3pj81+/SvOv0rSMuG2vQKUO+3Bvp99+W+I+rBZppiGONwgmru8k345tCPuHzlOlxdWhoF5yfrd2LF2m1ICPfWgmHAyMmoV7My3Lu3Tv8GZIEr0/NeStq4C3HzVqNKhdIOKThTs6Hfr95AW9cAfKl+eZDNegIUnNYz02/Ea9dvai+UtEWrtuDA4eMO+cZMCd+F366iTc+R+HpDArKp30wTAdqw/RAkRg3H66Uc18t59twl/bOs81dshnxwGTycV67dxAddh2PPuljkcHosMDu6BWH4gC6oVb18Biz06e1yTHl4RXC+2dg1meC8/dcdzUz+BUfOc1jBmZoNiWd4lRJU7Vo2MD6k1GrpgZUzx6BEscJPr0FkYOZiQ+XKFEdf7wg4t3nPKDgP/XAKuXI+o+1L2sxF63D65wsI9XfLwF2e3i6W3kvXb/yBboPG4WP14LLv4DGH/F5LzYbOnL2A/n6TsWnxxKfXAP6HM6fgzAD8/erpWcI182P8kSf3sxgyKhpNG9TU3gU24LHg9FeCM14LTmktuo2Aj0dnNKlfw+ERJcxfk0xwHjh8QqcffDpnnJGN95g41K5REc6tGzkkL3PBaYAgD3aOLDgNHMxtyNxIDh89jSGjY7B56STjQ4yjGZL8JLGp4DRd/3n163GegdHau2kIuTsan9TeSwFhs1Sa2BvImyc3Nu/Y55CC02AL5jb0nXpoEbsp/VpRnDh9DuXKFscorx4oWbyIo5lPhtZLwZkhbEDI5PnKo7ADOVTIs3L50pgZ4ZMsryODw2aJboaQerf278OlbWOVgrAPfhNmYIKfG1o2qZ0l1mjLIszFwu79RxCtcoKXJgQZhw0MT9Q5rz06NbflVk9tXwrOtLcuLcH564XLcPOZpCIw3XWusKO21ARn535jcOTHM+jarglGenZHdjn13AFbSoJTPJrRiatUuthIJTb3U3CaPbSc+ukcFqz8HD2cm6OYyrWPm/spduw5lMxZ4ICmlO4lU3CmG9V/L1y2+gts/c8BTAnx1CGa8NgluHvvHsb4uGZgtKzZ5fjpX1W+4nycv3QFjevVwHc/nMSg3u0d+gswNe+U5OUFqWIP07zEYcGxqPt2ZXRs1TBrGoiFVVFwZkxwSpHekFExGDGoC96rW90hbSc175QpDEljCY1ZpHKEnzOmRjkaLHPBef/+Azj3C8ak0f1RpmQx7SighzN1L7nYy/0HD1HzA3cVSYhEoZdfdDQTsnq9FJxWIwOksKGBqv7s1KqR7n3w+5OqenYG8zpSYSmVfZLDuXZ+qM5hdPRm7p26duMW3nf2VlXZ04wFHi26DceEkW6oXtnxKtXFPig4rRecctKBeDbFbhzxhANzYuYezp2q2OzVVwqhdImi+tK93x7VqSzrF4Q55EeSueA8fOwM+gwLx7O5cmoe95QAvas+u6VwaN7UkQ7JyNyGpBDt5q0/tSDXjBSft5TgNC1wdEhQ6Vw0BWc6QZleJse2nD57Xh+FIEUeckTSSXUMUMz4IRkYLWt2cVEVxR4ft0H92lUQr4qsDh87jekTvbPmYq1cVUrhUPlgq1mtPNy6tcLGbXt1iH3joolwcspu5ehZ43IKTusFpxxj0+WjxionsVbWMAIbV2EuFqKmL8fRE2cxecxAHZkaN3UBbv1x22GPtLGUD00PJ5QAT+7h3LX3O12/MU+dUFOkYH7Ezk3Sp4osjR9to7U6RncKzgzssxwrMVaFiw8eOal7lyxeGEHerihaKH8GRsuaXb468IM+E/DKtRuoUrEMwtQ5nAULOHbIIWzaYixV6RiP1BmAkufqpB5WOqmQuZx2cE4VMfiHzjSeWxrs3QuVypXMmsaRyqqkOrZRRy/9qoT3DGfdbVHHQ0kUwSckXg5T1GEsea2UStRPmv3fQitHgJWaDfV0/gDNu/g+kUcu4dH367/lCGiMa5QTHk6qXLsHyk6csmdHNpWjGR7grh5+q2JC9EKIp1Nek8+lYJ9eWjg4Utuy65t0vZccWXCmZkPyMCenGyxO2qK9v5XLlVLf/b10PiebZQIUnJYZ8QoSIAESIAESIAESIAEbCFBw2gCPXUmABEiABEiABEiABCwToOC0zIhXkAAJkAAJkAAJkAAJ2ECAgtMGeOxKAiRAAiRAAiRAAiRgmQAFp2VGvIIESIAESIAESIAESMAGAhScNsBjVxIgARIgARIgARIgAcsEKDgtM+IVJEACJEACJEACJEACNhCg4LQBHruSAAmQAAmQAAmQAAlYJkDBaZkRryABEiABEiABEiABErCBAAWnDfDYlQRIgARIgARIgARIwDIBCk7LjHgFCZAACZAACZAACZCADQQoOG2Ax64kQAIkQAIkQAIkQAKWCVBwWmbEK0iABEiABEiABEiABGwgQMFpAzx2JQESIAESIAESIAESsEyAgtMyI15BAiRAAiRAAiRAAiRgAwEKThvgsSsJkAAJkAAJkAAJkIBlAhSclhnxChIgARIgARIgARIgARsIUHDaAI9dSYAEsi6B0JhFuHT5GqaEDLJ5ke37jEKHDxuiW/v3bR4rrQG27jqAURGJ2L0m1q73MQz+999/w2NEFN6q8gbcu7e26p6ZydeqG6dy8f0HD9Glf4jeo3Yt6mfGkByDBEjAhAAFJ82BBDKRwIate+E7Nh69XVrC28P5iZHb9PTHqZ/P49DWRORwcsrEO3OozCZgLoiWfLoVHZVofOaZHBZv9dede1j7+W44t26krz3y4xkUzP8iChd8yWJfay8wnde1G7dw5uxF1HjzdWuHydD1i1ZtwZrPvsTiuFFwcspu1Rhnz13CvXsPULZUMav6pXTxqZ/O4aJ6OKhXs7JNY8k43QaNx6pZIXilyMs2jcXOJEACyQlQcNIiSCATCYjgnBC9UIkSJ2xdPhnZs2czjn7s5Fm4eoXh5h+3KTgzkbm9hjIVnCIg63zYH3vWxSJP7mct3nLP/u8RNWMFVswItnitLRdYOy9b7mXe9+69+2ja2RtjfF3xXt3qmTm01WNNnfWJEq/34TvAxeq+5h3kgTHfc3kxemgPm8fiACRAAv8lQMFJayCBTCQggnPe8k1KVP6JIO9eqFOjonH0iPilOH/xd2zesd8oOEUwyN+37/4WN27+iSoVS2Ps8D54tWhB3e/w0dOYGLcEIlZz5cyJJvVrIGBwd+TM+Qy2qT6h0Ysw0LUdFitP029XrqHiGyUxMdADefM8KYo6ugWhVdN38M13x/HzLxdx+85d+PZ3QfNGNfW9PvzYD66dW6Bjq4b6/yfO/IqPXAOVyIpD9mzZUFsJrnEj+mBSwjIM7NVOiYxqGBM1F98eOQkJrVav/DqCfVxRtFB+3X/Bys1YuvoLXLh0BcWUt2jk4G6o+3bKHqjbf91BaMxibNm5X3nKnNBMzclvYBe9zjt37yFS3fOL/3wLua5c2RLKe9wZb5YvhT9v30Gtlh6YOtZTc7985YZee3hAP+05kzCpPADIuHJt6dde0aKkdvUKkL2KiF+CbSunGPfIa/Q07YUc6dlNzedxSH1iYD/UaTUAIrByP5sTwwd2RYeWDTBl5kqs37oH12/8gZLFi6i/d9H7LWKzv18UHjx8hGdzPYNl04PhGxKfLKQuXknxDl66fBXFXymEXp0/QJtm9fQ8LO2TYbIisMznVeDF540hdYN99OnSEivW7cD5S79rD229Wm8iJnEVzl28jKoVyyJidH88k+Oxt92aPVu/9StMUrb7xYrJyKbsw9r7mQp6S7Y8JnKu2vu7CFd7YWh12wzEWN8+OHriZ0xfuEbZaHYUfPlFbFkWiV8vXMb4qQtx6IeTeKj2oVnDmvBX7xvZv7RsQsbef+hHuPtO0nafS9kfGwmQQOYQoODMHI4chQQ0ARExiUvWo5ESYxd/u4rxfn313x89+hvvdx6G4QO6wHtMnFFwyhfpyZ/OIzJoAF54Pi8S5q/Bxi/2YsPCcPUlDjTuNBStm9bVovLylevo6x2Bzm3eg6tLC+zaexiegVPRs1NzDHXvBBGv7fsEqhy0pujeoekTO+Ki8tOuXLuJuVP8tABcvna7Ek0r8OXqaVowpCU45Yu3RjM3LRj9lXAsXDA/AsNnKUGVE4FePdT6HiE8dgluKe+t5DwKh9CYhZg+0RvlypTAzr2HMDQoFmvmTkCJYoWemJtwOHHmnBZ3j5R49QyYiobvVIOXW0eMm7IAB78/iZhxg/HSi/m00NugxM7mpZP0vGVe9Wu/icljPB8LwrEJuHPvHqLHDoYIu2Wrt2FWpK/i+xw+3bQL02YnYeuKKGzevj9dglPWI4K/Q9/R2LcxQXs4l6/ZhpjZq7AgJgBFCxfAwk8+R+Li9dixaqoOuc9f8ZkKqe8xejhNczg/274PQZPmIC50KN6sUFoJ6W+UTcRjacJoVC5XCpb2yRSe+bxMczgN9uHZuz1EdO799ih6Dw1Hyya1Eervjr+UgGvexVc/RDR+t4bVeyZruKNsziACrb2fqeC0ZMtpCU55CBN7KVGssH6YkPfaR64BqPNWRfW+cFYPLHfhN34GXs7/gn4/pmUTkuZy//4D/XCVEO6NWtXL85ONBEggkwhQcGYSSA5DAgbBOWvxOiV+BqGTexB2JkVrUSZf9mHKYxYZPBCte4zUgvNv9cVYS32xxU3wwjtvV9IAxRtT+0MPJUaG6S+7q9dv4TnlsRNPnzQRX5KnJwJVvqQ9RkRqT8zzz+XRr48YNx151PVBw3qmKDirViyjvXfSJIeuRbcRWiTJl3F6BGeYEiqtm9XV/fv6RKDkq0WU4PzYOHdDHp8Im6qVymJI3w7GefQbHokqSmCJeDZt4nGq23qAXlODOlX1SyKkRBzXVVzeau6OiFH9tXdXmngq6ynvVlzYUFWsUk4LThGXhtdXKm/eXOXtXDc/FDMWrsXnO79RwtBf74OBscwzvR7OlASneDvF2/rSC/n0mLIn77b1xFp1z9IliqYpOIWDeEQN+yD9uw4Yq/a7ghbYIjjT2idTdpYEp9iHQSTLnIWVCHcRmNI+9pyAxvWq6wcYa/ZM+nZXuY7yYNW364d6LIM9pvd+5oIzLVu2RnCKB1/WsndDvHHPv/vhFHoMnqBYTMecZRtTtQkDW3m4aK+82PYu8kr2RuB/SCCLE6DgzOIbzOX9/xIQESOCc1XiWC0iundopj1KoyNmKyHyChq8U9UoOCVc28zFJ8UJitdJKmW37z6oRdPZc7/pfFARWyLCYsYP0V/wXqNj8M1nM4xjjJo4W4lWFUYe6fbEuCJkmjV8Wxc0SbuowrlNOg3TnkLxeKZHcC6KDUQ1JSSlHTh8HIMDY5A7dy68q8K0LRvXRs1qjz1C76vcPgmlmzcJG4f6J5+bYR4GsWbaR7y6jTp4Yf2CMC3SDE24uXVvpcPQIqKWJgTpELu0tZt3Y2riJzq0+vvVGxCBJ6kMdVVBiQgtSSEQT5YtglP2QcLJu74+rL184o2Wh4NPVLFJeRXyT8vD2bL7CBVCb2EsKJI5B4Yn6hzEiaM8tOBMa59M+VgSnN5jYvH1hgRjl0qNesF0D/sMm6j3zKNHG6v2TAZspR6cejo3R6dWjfT4Yo/W3M9ccKZly9YIzqSNuzTPlNpnSyK0CE3NJgx9+nhPRPVKr2NQ7+QPRykOyj+SAAmkiwAFZ7ow8SISSB8BU8EpYddtSjBOVSHZRh29sHrOeNz68y+j4JTcv4bth2hxWq5M8SducFKFmMXTEuzTS3sVRSSFTVuMcyo/zSA4hwbFYP+m9AvO5iqXTbxZ0iwJzuOnf0W73o9zOA0h9WXTg3TY19AkjP/lvsNaGH+2/Wu4tG2iq/NFjLi0bZxiaN98oSK8JXVgzdzxKFMyecVyWoKzp/MHOt9UBKfpvEwFp9xL8ksPHD6h5yg5l0VUOoCEwiW0bZ7DOWRUDIqoHFTTHM6UPJxSWPLL+cs6fUDGk1QCyae0RXD+oWxDxhPBmdY+WSM4fULisHd9fDLBKRXl4kGVZio4rdkzg+Ds9c8eGASnNfczF5xp2XKKgrO1yuFU+c7mIXVJSQmJmqftNrWWmk0YPPTiva+m8lspONP3ucerSCA9BCg400OJ15BAOgmYCk6pRm+ihFTAkI+xfstXmDnJB6fPXjAKThGQNVt46GpYQ5habnNOeePE4yiemsmq0lnC8obWbeA45Fd5jPYQnOZnRYpAG+g/JVXBKd7DAi89r/MopX2uCnMCwmZpj9qAkZPVay8oQdDbOHfxeErup2nlvrwoOXc1W/TTeYXi2ZN2+NgZHD/1iwpr1sfbH/RDWIA7mjZ4/JohpB4z3kunHaQlOCXsDWRTeZe5dF8Jfdf/aLDOrTx/8coTZ1Z2cg/WRwpZEpziwXVToeTOSlRL+3LfEV1okh7BKaFjyTeUIhZDE2/421XLYVg/5/+Z4LRmz2TeYovvqXC8aUjdXoLT/IgqQ7GYIZXCNIfz+x9/gnO/YGxZHmUsYJOCIyk+k/dOWjZR4fXX9JY8DqnX1/nQbCRAAplDgIIzczhyFBLQBEwFp/x/WHAsJH/My62TrhA3F5xS8S2FHrGhXrpaeeW67ZAjXiQc/MPxn+GmPC2rEkOU162ArsLe+p8DuqJYQsgSwsxMD+fQoGl6DZJ/Kvl+3sFxuvI4JQ+n5JpKEZSkDHRt9/gw89i5SbpCW0TXzq8OqXD/NF09Lvmph74/pcWr5A8awu6mJhMyeT4OHjmBSSqPU4S4cJPUARFgUmUulfCxKtc1n8pVlYp1qerfuGiiLjBKS3BKgZZ4s6Sw6YV8efV6fNTfvlCV6VdVjmhbVVySNHsc3ij9qhaNEtaV3D1zwXlGPSiIB3C5qjgvpXI0pQr9lcIv64Kb46d/Qdy81di555B6EBis81DFux0/fzWSEsdpsSteS8PB7yLMJfVhZoQPyiuBI55h/9CZmtvrpV61SnCaz0v4Gw5+F/uwRgBau2eSJiJ2IicCSLP2ftZ4OHYnMw8AAAUNSURBVBcnbcXspRt00ZnwjFYpE3OWbcKkf3J7fdQpAFLsM1btR768ueHiEYJC6rSBsb699fmgcq8Lv13BnMl+umgvNZsQQSo5xXIEVnzY4zxqNhIggcwhQMGZORw5CgmkKDh3KBEiX/o7k1Suo6qgNhec4nWR6m4RHffvP1T5f8X1UUVV/gl5ihBbv2WPzjuTyvP6tatA8sskj1LC15kpOCWEP2L8dH1OaKECL+rKZs/AaOz6NEYfNWQu7OTIpgnqi1w8kTmUCK5SoQz8PLuijDp6SJpUbkvxjhT/iMfWrVsrtG3++Ogf8ybCRQqiNm37WhVI5dDH2PgN6qpD+eKRkiNuRBBKnqMUI0mlvAh0QyFMaiF1yasMjpyDvQeOakEiYlHCpIZzI6XiXTzJUsFep0YFPZ4I3lHK62wqiMQL6z58EvYfPKaLnuq8VQkBSiTKUUPly76mq59nLlqn5r8XMyJ8tWetlzpzVVICZk7yVfNfkOxYJLl21YadKsf0pppTEQxT1dRSVS3NmpC6+bwkTzijgtPaPVun7DJq+nJ13myU9nLbU3CKDfiq0wfEeyle9S4fNdG25an2snmjWvoBR153yp5dF8Fd+v2atqf9h47pgjs5rko8ylIcZ8kmpOhIHvR4LBI/1EkgcwlQcGYuT45GAiRAAg5BwHDwu+RRNlTFcFmlyUkPeZWXlAe/Z5Ud5Tr+LQQoOP8tO8F5kAAJkMBTRkAOr5ef8FwcO+qJ3NynbCl6uhKBkHxa/rTl07h7nPO/nQAF5799hzg/EiABEviXEpBcSI8RUeo81Dfg3r31v3SW6ZuW5G6K2Ozarok+koyNBEggcwlQcGYuT45GAiRAAiRAAiRAAiRgRoCCkyZBAiRAAiRAAiRAAiRgVwIUnHbFy8FJgARIgARIgARIgAQoOGkDJEACJEACJEACJEACdiVAwWlXvBycBEiABEiABEiABEiAgpM2QAIkQAIkQAIkQAIkYFcCFJx2xcvBSYAESIAESIAESIAEKDhpAyRAAiRAAiRAAiRAAnYlQMFpV7wcnARIgARIgARIgARIgIKTNkACJEACJEACJEACJGBXAhScdsXLwUmABEiABEiABEiABCg4aQMkQAIkQAIkQAIkQAJ2JUDBaVe8HJwESIAESIAESIAESICCkzZAAiRAAiRAAiRAAiRgVwIUnHbFy8FJgARIgARIgARIgAQoOGkDJEACJEACJEACJEACdiVAwWlXvBycBEiABEiABEiABEiAgpM2QAIkQAIkQAIkQAIkYFcCFJx2xcvBSYAESIAESIAESIAEKDhpAyRAAiRAAiRAAiRAAnYlQMFpV7wcnARIgARIgARIgARIgIKTNkACJEACJEACJEACJGBXAhScdsXLwUmABEiABEiABEiABCg4aQMkQAIkQAIkQAIkQAJ2JUDBaVe8HJwESIAESIAESIAESICCkzZAAiRAAiRAAiRAAiRgVwIUnHbFy8FJgARIgARIgARIgAQoOGkDJEACJEACJEACJEACdiVAwWlXvBycBEiABEiABEiABEiAgpM2QAIkQAIkQAIkQAIkYFcCFJx2xcvBSYAESIAESIAESIAEKDhpAyRAAiRAAiRAAiRAAnYlQMFpV7wcnARIgARIgARIgARIgIKTNkACJEACJEACJEACJGBXAhScdsXLwUmABEiABEiABEiABCg4aQMkQAIkQAIkQAIkQAJ2JfB/yDRH8nToUNMAAAAASUVORK5CYII=", + "text/html": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "result, fig = plot_scenario(\n", + " results=sensitivity_consult,\n", + " x_var=\"mean_n_consult_time\",\n", + " result_var=\"mean_q_time_nurse\",\n", + " colour_var=None,\n", + " xaxis_title=\"Mean nurse consultation time (minutes)\",\n", + " yaxis_title=\"Mean wait time for nurse (minutes)\",\n", + " legend_title=\"Nurses\",\n", + ")\n", + "\n", + "fig.show()\n", + "\n", + "fig.write_image(os.path.join(output_dir, \"sensitivity_consult_time.png\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\\begin{tabular}{lrl}\n", + "\\toprule\n", + " & Mean nurse consultation time & Mean wait time for nurse (95 percent confidence interval) \\\\\n", + "\\midrule\n", + "0 & 8 & 0.15 (0.14, 0.16) \\\\\n", + "1 & 9 & 0.28 (0.27, 0.30) \\\\\n", + "2 & 10 & 0.50 (0.47, 0.52) \\\\\n", + "3 & 11 & 0.84 (0.80, 0.88) \\\\\n", + "4 & 12 & 1.36 (1.29, 1.42) \\\\\n", + "5 & 13 & 2.15 (2.05, 2.24) \\\\\n", + "6 & 14 & 3.37 (3.22, 3.52) \\\\\n", + "7 & 15 & 5.30 (5.06, 5.54) \\\\\n", + "\\bottomrule\n", + "\\end{tabular}\n", + "\n" + ] + } + ], + "source": [ + "table = result.copy()\n", + "\n", + "# Combine mean and CI into single column, and round\n", + "table[\"mean_ci\"] = table.apply(\n", + " lambda row: f\"{row['mean']:.2f} ({row['ci_lower']:.2f}, {row['ci_upper']:.2f})\",\n", + " axis=1,\n", + ")\n", "\n", "# Select relevant columns and rename\n", "cols = {\n", @@ -6044,9 +9822,96 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
patient_idarrival_timeq_time_nursetime_with_nurserun
6676862158661913.030043NaNNaN30
6676872158761915.384561NaNNaN30
6676882158861915.421934NaNNaN30
6676892158961917.817910NaNNaN30
6676902159061919.845349NaNNaN30
\n", + "
" + ], + "text/plain": [ + " patient_id arrival_time q_time_nurse time_with_nurse run\n", + "667686 21586 61913.030043 NaN NaN 30\n", + "667687 21587 61915.384561 NaN NaN 30\n", + "667688 21588 61915.421934 NaN NaN 30\n", + "667689 21589 61917.817910 NaN NaN 30\n", + "667690 21590 61919.845349 NaN NaN 30" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "param = Defaults()\n", "param.patient_inter = 2\n", @@ -6070,9 +9935,80 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 28, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2025-01-24 17:33:23,382 - INFO - logging.py:log():128 - Initialised model: {'param': , 'run_number': 0, 'env': , 'nurse': , 'patients': [], 'nurse_time_used': 0, 'nurse_consult_count': 0, 'running_mean_nurse_wait': 0, 'audit_list': [], 'results_list': [], 'patient_inter_arrival_dist': , 'nurse_consult_time_dist': }\n", + "2025-01-24 17:33:23,382 - INFO - logging.py:log():128 - Parameters: {'_initialising': False, 'patient_inter': 4, 'mean_n_consult_time': 10, 'number_of_nurses': 5, 'warm_up_period': 50, 'data_collection_period': 100, 'number_of_runs': 1, 'audit_interval': 120, 'scenario_name': 0, 'cores': 0, 'logger': }\n", + "2025-01-24 17:33:23,383 - INFO - logging.py:log():128 - Patient X (warm-up) arrives at: 0.000\n", + "2025-01-24 17:33:23,383 - INFO - logging.py:log():128 - Patient X (warm-up) is seen by nurse after 0.000 minutes. Consultation length: 8.031 minutes.\n", + "2025-01-24 17:33:23,383 - INFO - logging.py:log():128 - Patient X (warm-up) arrives at: 13.174\n", + "2025-01-24 17:33:23,384 - INFO - logging.py:log():128 - Patient X (warm-up) is seen by nurse after 13.174 minutes. Consultation length: 3.820 minutes.\n", + "2025-01-24 17:33:23,384 - INFO - logging.py:log():128 - Patient X (warm-up) arrives at: 16.227\n", + "2025-01-24 17:33:23,385 - INFO - logging.py:log():128 - Patient X (warm-up) is seen by nurse after 16.227 minutes. Consultation length: 3.642 minutes.\n", + "2025-01-24 17:33:23,385 - INFO - logging.py:log():128 - Patient X (warm-up) arrives at: 21.236\n", + "2025-01-24 17:33:23,386 - INFO - logging.py:log():128 - Patient X (warm-up) is seen by nurse after 21.236 minutes. Consultation length: 5.295 minutes.\n", + "2025-01-24 17:33:23,386 - INFO - logging.py:log():128 - Patient X (warm-up) arrives at: 22.140\n", + "2025-01-24 17:33:23,386 - INFO - logging.py:log():128 - Patient X (warm-up) is seen by nurse after 22.140 minutes. Consultation length: 27.884 minutes.\n", + "2025-01-24 17:33:23,386 - INFO - logging.py:log():128 - Patient X (warm-up) arrives at: 23.023\n", + "2025-01-24 17:33:23,387 - INFO - logging.py:log():128 - Patient X (warm-up) is seen by nurse after 23.023 minutes. Consultation length: 19.610 minutes.\n", + "2025-01-24 17:33:23,387 - INFO - logging.py:log():128 - Patient X (warm-up) arrives at: 30.223\n", + "2025-01-24 17:33:23,387 - INFO - logging.py:log():128 - Patient X (warm-up) is seen by nurse after 30.223 minutes. Consultation length: 9.490 minutes.\n", + "2025-01-24 17:33:23,387 - INFO - logging.py:log():128 - Patient X (warm-up) arrives at: 30.487\n", + "2025-01-24 17:33:23,388 - INFO - logging.py:log():128 - Patient X (warm-up) is seen by nurse after 30.487 minutes. Consultation length: 41.665 minutes.\n", + "2025-01-24 17:33:23,388 - INFO - logging.py:log():128 - Patient X (warm-up) arrives at: 34.089\n", + "2025-01-24 17:33:23,389 - INFO - logging.py:log():128 - Patient X (warm-up) is seen by nurse after 34.089 minutes. Consultation length: 5.874 minutes.\n", + "2025-01-24 17:33:23,389 - INFO - logging.py:log():128 - Patient X (warm-up) arrives at: 35.270\n", + "2025-01-24 17:33:23,389 - INFO - logging.py:log():128 - Patient X (warm-up) is seen by nurse after 35.270 minutes. Consultation length: 27.882 minutes.\n", + "2025-01-24 17:33:23,389 - INFO - logging.py:log():128 - Patient X (warm-up) arrives at: 44.470\n", + "2025-01-24 17:33:23,390 - INFO - logging.py:log():128 - Patient X (warm-up) is seen by nurse after 44.470 minutes. Consultation length: 24.915 minutes.\n", + "2025-01-24 17:33:23,390 - INFO - logging.py:log():128 - Patient 1 arrives at: 51.904\n", + "2025-01-24 17:33:23,390 - INFO - logging.py:log():128 - Patient 1 is seen by nurse after 51.904 minutes. Consultation length: 18.079 minutes.\n", + "2025-01-24 17:33:23,390 - INFO - logging.py:log():128 - Patient 2 arrives at: 51.963\n", + "2025-01-24 17:33:23,391 - INFO - logging.py:log():128 - Patient 2 is seen by nurse after 51.963 minutes. Consultation length: 3.102 minutes.\n", + "2025-01-24 17:33:23,391 - INFO - logging.py:log():128 - Patient 3 arrives at: 74.349\n", + "2025-01-24 17:33:23,391 - INFO - logging.py:log():128 - Patient 3 is seen by nurse after 74.349 minutes. Consultation length: 26.745 minutes.\n", + "2025-01-24 17:33:23,392 - INFO - logging.py:log():128 - Patient 4 arrives at: 77.534\n", + "2025-01-24 17:33:23,392 - INFO - logging.py:log():128 - Patient 4 is seen by nurse after 77.534 minutes. Consultation length: 0.748 minutes.\n", + "2025-01-24 17:33:23,393 - INFO - logging.py:log():128 - Patient 5 arrives at: 78.932\n", + "2025-01-24 17:33:23,393 - INFO - logging.py:log():128 - Patient 5 is seen by nurse after 78.932 minutes. Consultation length: 0.528 minutes.\n", + "2025-01-24 17:33:23,393 - INFO - logging.py:log():128 - Patient 6 arrives at: 86.815\n", + "2025-01-24 17:33:23,393 - INFO - logging.py:log():128 - Patient 6 is seen by nurse after 86.815 minutes. Consultation length: 2.435 minutes.\n", + "2025-01-24 17:33:23,394 - INFO - logging.py:log():128 - Patient 7 arrives at: 89.783\n", + "2025-01-24 17:33:23,394 - INFO - logging.py:log():128 - Patient 7 is seen by nurse after 89.783 minutes. Consultation length: 9.666 minutes.\n", + "2025-01-24 17:33:23,394 - INFO - logging.py:log():128 - Patient 8 arrives at: 89.807\n", + "2025-01-24 17:33:23,394 - INFO - logging.py:log():128 - Patient 8 is seen by nurse after 89.807 minutes. Consultation length: 7.005 minutes.\n", + "2025-01-24 17:33:23,395 - INFO - logging.py:log():128 - Patient 9 arrives at: 93.118\n", + "2025-01-24 17:33:23,395 - INFO - logging.py:log():128 - Patient 9 is seen by nurse after 93.118 minutes. Consultation length: 20.185 minutes.\n", + "2025-01-24 17:33:23,395 - INFO - logging.py:log():128 - Patient 10 arrives at: 95.598\n", + "2025-01-24 17:33:23,395 - INFO - logging.py:log():128 - Patient 10 is seen by nurse after 95.598 minutes. Consultation length: 7.651 minutes.\n", + "2025-01-24 17:33:23,395 - INFO - logging.py:log():128 - Patient 11 arrives at: 98.019\n", + "2025-01-24 17:33:23,396 - INFO - logging.py:log():128 - Patient 11 is seen by nurse after 98.019 minutes. Consultation length: 27.908 minutes.\n", + "2025-01-24 17:33:23,396 - INFO - logging.py:log():128 - Patient 12 arrives at: 109.379\n", + "2025-01-24 17:33:23,396 - INFO - logging.py:log():128 - Patient 12 is seen by nurse after 109.379 minutes. Consultation length: 16.811 minutes.\n", + "2025-01-24 17:33:23,396 - INFO - logging.py:log():128 - Patient 13 arrives at: 110.322\n", + "2025-01-24 17:33:23,397 - INFO - logging.py:log():128 - Patient 13 is seen by nurse after 110.322 minutes. Consultation length: 24.157 minutes.\n", + "2025-01-24 17:33:23,397 - INFO - logging.py:log():128 - Patient 14 arrives at: 120.342\n", + "2025-01-24 17:33:23,397 - INFO - logging.py:log():128 - Patient 14 is seen by nurse after 120.342 minutes. Consultation length: 1.451 minutes.\n", + "2025-01-24 17:33:23,397 - INFO - logging.py:log():128 - Patient 15 arrives at: 121.643\n", + "2025-01-24 17:33:23,397 - INFO - logging.py:log():128 - Patient 15 is seen by nurse after 121.643 minutes. Consultation length: 1.343 minutes.\n", + "2025-01-24 17:33:23,398 - INFO - logging.py:log():128 - Patient 16 arrives at: 127.827\n", + "2025-01-24 17:33:23,398 - INFO - logging.py:log():128 - Patient 16 is seen by nurse after 127.827 minutes. Consultation length: 1.554 minutes.\n", + "2025-01-24 17:33:23,398 - INFO - logging.py:log():128 - Patient 17 arrives at: 132.055\n", + "2025-01-24 17:33:23,398 - INFO - logging.py:log():128 - Patient 17 is seen by nurse after 132.055 minutes. Consultation length: 15.623 minutes.\n", + "2025-01-24 17:33:23,399 - INFO - logging.py:log():128 - Patient 18 arrives at: 133.617\n", + "2025-01-24 17:33:23,399 - INFO - logging.py:log():128 - Patient 18 is seen by nurse after 133.617 minutes. Consultation length: 4.688 minutes.\n", + "2025-01-24 17:33:23,399 - INFO - logging.py:log():128 - Patient 19 arrives at: 136.346\n", + "2025-01-24 17:33:23,400 - INFO - logging.py:log():128 - Patient 19 is seen by nurse after 136.346 minutes. Consultation length: 2.612 minutes.\n", + "2025-01-24 17:33:23,400 - INFO - logging.py:log():128 - Patient 20 arrives at: 144.142\n", + "2025-01-24 17:33:23,400 - INFO - logging.py:log():128 - Patient 20 is seen by nurse after 144.142 minutes. Consultation length: 6.348 minutes.\n" + ] + } + ], "source": [ "# Mini run of simulation with logger enabled\n", "param = Defaults()\n", @@ -6095,9 +10031,99 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "[{'patient_id': 1,\n", + " 'arrival_time': 51.90400587259546,\n", + " 'q_time_nurse': 0.0,\n", + " 'time_with_nurse': 18.07891954142075},\n", + " {'patient_id': 2,\n", + " 'arrival_time': 51.963434706622714,\n", + " 'q_time_nurse': 0.0,\n", + " 'time_with_nurse': 3.1020092355006064},\n", + " {'patient_id': 3,\n", + " 'arrival_time': 74.3494580155259,\n", + " 'q_time_nurse': 0.0,\n", + " 'time_with_nurse': 26.744513862017026},\n", + " {'patient_id': 4,\n", + " 'arrival_time': 77.53382703300574,\n", + " 'q_time_nurse': 0.0,\n", + " 'time_with_nurse': 0.7481033661053572},\n", + " {'patient_id': 5,\n", + " 'arrival_time': 78.93233230430721,\n", + " 'q_time_nurse': 0.0,\n", + " 'time_with_nurse': 0.5277574384602378},\n", + " {'patient_id': 6,\n", + " 'arrival_time': 86.81473043550623,\n", + " 'q_time_nurse': 0.0,\n", + " 'time_with_nurse': 2.4349563515001904},\n", + " {'patient_id': 7,\n", + " 'arrival_time': 89.78326290873765,\n", + " 'q_time_nurse': 0.0,\n", + " 'time_with_nurse': 9.665598479334754},\n", + " {'patient_id': 8,\n", + " 'arrival_time': 89.80720556833339,\n", + " 'q_time_nurse': 0.0,\n", + " 'time_with_nurse': 7.004542644523265},\n", + " {'patient_id': 9,\n", + " 'arrival_time': 93.11795080803735,\n", + " 'q_time_nurse': 0.0,\n", + " 'time_with_nurse': 20.185457901243318},\n", + " {'patient_id': 10,\n", + " 'arrival_time': 95.5976129513721,\n", + " 'q_time_nurse': 0.0,\n", + " 'time_with_nurse': 7.651056296080149},\n", + " {'patient_id': 11,\n", + " 'arrival_time': 98.01876244811595,\n", + " 'q_time_nurse': 0.0,\n", + " 'time_with_nurse': 27.908241618400943},\n", + " {'patient_id': 12,\n", + " 'arrival_time': 109.3788794635365,\n", + " 'q_time_nurse': 0.0,\n", + " 'time_with_nurse': 16.81120548341985},\n", + " {'patient_id': 13,\n", + " 'arrival_time': 110.32175512279903,\n", + " 'q_time_nurse': 0.0,\n", + " 'time_with_nurse': 24.156692772991306},\n", + " {'patient_id': 14,\n", + " 'arrival_time': 120.3416606997885,\n", + " 'q_time_nurse': 0.0,\n", + " 'time_with_nurse': 1.4511207498950371},\n", + " {'patient_id': 15,\n", + " 'arrival_time': 121.64300082175524,\n", + " 'q_time_nurse': 0.0,\n", + " 'time_with_nurse': 1.3431449546382932},\n", + " {'patient_id': 16,\n", + " 'arrival_time': 127.826666746174,\n", + " 'q_time_nurse': 0.0,\n", + " 'time_with_nurse': 1.553948790248819},\n", + " {'patient_id': 17,\n", + " 'arrival_time': 132.0550651782585,\n", + " 'q_time_nurse': 0.0,\n", + " 'time_with_nurse': 15.623013920647606},\n", + " {'patient_id': 18,\n", + " 'arrival_time': 133.6173285469348,\n", + " 'q_time_nurse': 0.0,\n", + " 'time_with_nurse': 4.687792366565003},\n", + " {'patient_id': 19,\n", + " 'arrival_time': 136.3456071646416,\n", + " 'q_time_nurse': 0.0,\n", + " 'time_with_nurse': 2.6115609358702656},\n", + " {'patient_id': 20,\n", + " 'arrival_time': 144.14241169590065,\n", + " 'q_time_nurse': 0.0,\n", + " 'time_with_nurse': 6.348067933102151}]" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Compare to patient-level results\n", "model.results_list" @@ -6112,9 +10138,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Notebook run time: 0m 27s\n" + ] + } + ], "source": [ "# Get run time in seconds\n", "end_time = time.time()\n", diff --git a/notebooks/changes.md b/notebooks/changes.md index bfc8bf4..8d0a52d 100644 --- a/notebooks/changes.md +++ b/notebooks/changes.md @@ -1,8 +1,9 @@ ## Added -* Added `create_user_controlled_hist` to allow users to decide the KPI histogram to view. -* +* `analysis.ipynb`: Added `create_user_controlled_hist` to allow users to decide the KPI histogram to view. ## Changed -* +* `analysis.ipynb`: modified `plot_results_spread` to accept `DataFrame` parameter containing results rather than using a variable with notebook scope. +* `environment.yaml`: patched to include channel. It now installs correctly +* `environment.yaml`: added `nbqa` and `black` to auto-format notebooks. \ No newline at end of file From d79d960d93f9dc9b97959b7d26f23eca0d134c56 Mon Sep 17 00:00:00 2001 From: TomMonks Date: Fri, 24 Jan 2025 18:06:23 +0000 Subject: [PATCH 7/9] chore(env): nbqa black. pinned versions not needed. --- environment.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/environment.yaml b/environment.yaml index e7f4f2d..6808938 100644 --- a/environment.yaml +++ b/environment.yaml @@ -2,11 +2,13 @@ name: template-des channels: - conda-forge dependencies: + - black - flake8=7.1.1 - ipykernel=6.29.5 - jinja2=3.1.4 - joblib=1.4.2 - nbformat=5.10.4 + - nbqa - numpy=2.1.3 - pandas=2.2.3 - pip=24.3.1 From 32a53e5faf1c866b1b6ac08128664b3b470088cb Mon Sep 17 00:00:00 2001 From: TomMonks Date: Fri, 24 Jan 2025 18:08:27 +0000 Subject: [PATCH 8/9] chore(fix): jinja=3.1.5 upgrade due to secruity vul --- environment.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/environment.yaml b/environment.yaml index 6808938..f05fd0c 100644 --- a/environment.yaml +++ b/environment.yaml @@ -5,7 +5,7 @@ dependencies: - black - flake8=7.1.1 - ipykernel=6.29.5 - - jinja2=3.1.4 + - jinja2=3.1.5 - joblib=1.4.2 - nbformat=5.10.4 - nbqa From aafe31a7e19eb10ba35cf65ca73e7f619b007c94 Mon Sep 17 00:00:00 2001 From: TomMonks Date: Fri, 24 Jan 2025 18:09:37 +0000 Subject: [PATCH 9/9] chore(changes): updated env details --- notebooks/changes.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/notebooks/changes.md b/notebooks/changes.md index 8d0a52d..5b65c4c 100644 --- a/notebooks/changes.md +++ b/notebooks/changes.md @@ -6,4 +6,5 @@ * `analysis.ipynb`: modified `plot_results_spread` to accept `DataFrame` parameter containing results rather than using a variable with notebook scope. * `environment.yaml`: patched to include channel. It now installs correctly -* `environment.yaml`: added `nbqa` and `black` to auto-format notebooks. \ No newline at end of file +* `environment.yaml`: added `nbqa` and `black` to auto-format notebooks. +* `environment.yaml`: added `jinja2` upgraded from 3.1.4 to 3.1.5 due to dependabot security flag. \ No newline at end of file