-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
366 lines (338 loc) · 53.9 KB
/
Copy pathindex.html
File metadata and controls
366 lines (338 loc) · 53.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>WC26 Infectious Disease Risk Dashboard</title>
<style>
:root{--bg:#faf9f6;--bg2:#f1efe8;--bg3:#e8e6df;--tx:#2c2c2a;--tx2:#5f5e5a;--tx3:#888780;--bd:rgba(0,0,0,.08);--a50:#faeeda;--a100:#fac775;--a400:#ef9f27;--a600:#ba7517;--a800:#633806;--a900:#412402;--co:#d85a30;--b50:#e6f1fb;--b800:#0c447c}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:Georgia,'Times New Roman',serif;background:var(--bg);color:var(--tx);line-height:1.55;-webkit-font-smoothing:antialiased}
a{color:var(--a600);text-decoration:none}a:hover{text-decoration:underline}
.d{max-width:1200px;margin:0 auto;padding:24px 24px 36px}
.hd{margin-bottom:18px}
.ht{font-size:23px;font-weight:normal;letter-spacing:-.3px;line-height:1.2;margin-bottom:3px}
.ht em{font-style:italic;color:var(--a600)}
.hs{font-size:11px;color:var(--tx3);font-style:italic}
.tabs{display:flex;gap:0;border-bottom:1.5px solid var(--bg3);margin-bottom:14px}
.tab{padding:8px 20px;font-size:13px;font-family:Georgia,serif;border:none;cursor:pointer;background:none;color:var(--tx3);position:relative;transition:color .15s;white-space:nowrap}
.tab:hover{color:var(--tx2)}.tab.on{color:var(--tx)}
.tab.on::after{content:'';position:absolute;bottom:-1.5px;left:0;right:0;height:2px;background:var(--a400);border-radius:1px}
.view{display:none}.view.active{display:block}
.mn{display:grid;grid-template-columns:1fr 350px;gap:14px;align-items:start}
@media(max-width:920px){.mn{grid-template-columns:1fr}}
.mw{position:relative;background:#fff;border:1px solid var(--bd);border-radius:9px;overflow:hidden}
.mw svg{display:block;width:100%}
.state-p{fill:var(--bg2);stroke:rgba(0,0,0,.06);stroke-width:.5}
.country-p{fill:var(--bg2);stroke:rgba(0,0,0,.04);stroke-width:.3}
.leg{margin-top:7px}
.lr{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.lr+.lr{margin-top:3px}
.ll{font-size:10px;color:var(--tx3);font-style:italic}
.li{display:flex;align-items:center;gap:3px;font-size:10px;color:var(--tx2)}
.ls{width:9px;height:9px;border-radius:2px;border:.5px solid rgba(0,0,0,.06)}
.sp{background:#fff;border:1px solid var(--bd);border-radius:9px;overflow:hidden;display:flex;flex-direction:column;max-height:600px}
.sp-top{padding:12px 16px;background:var(--bg2);border-bottom:1px solid var(--bd);display:flex;gap:10px}
.sp-box{flex:1;text-align:center;padding:4px}
.sp-box-l{font-size:14px;color:var(--tx);display:flex;align-items:center;justify-content:center;gap:5px;margin-bottom:4px}
.sp-box-l .ii{width:12px;height:12px;font-size:7px}
.sp-box-v{font-size:30px;font-family:Georgia,serif;color:var(--tx)}
.sp-box-v.am{color:var(--a600)}
.sp-box-v .sub48{font-size:15px;color:var(--tx3)}
.sp-body{padding:14px;overflow-y:auto;flex:1}
.sp-body::-webkit-scrollbar{width:3px}.sp-body::-webkit-scrollbar-thumb{background:var(--bg3);border-radius:2px}
.ph{display:flex;align-items:baseline;gap:6px;margin-bottom:2px;flex-wrap:wrap}
.pt{font-size:17px;font-weight:normal;color:var(--tx)}
.ps{font-size:11px;color:var(--tx3);font-style:italic}
.pm{font-size:10.5px;color:var(--tx3);font-style:italic;margin-bottom:12px;line-height:1.4}
.sl{font-size:9.5px;color:var(--tx3);text-transform:uppercase;letter-spacing:.5px;margin-bottom:5px;display:flex;align-items:center;gap:4px}
.tc{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:12px}
.chip{display:inline-flex;align-items:center;gap:4px;padding:3px 7px;border-radius:5px;font-size:10.5px;font-family:Georgia,serif;background:var(--bg2);color:var(--tx);border:.5px solid var(--bd)}
.cd{width:5px;height:5px;border-radius:50%}.gt{font-size:8.5px;color:var(--tx3);font-style:italic}
.rcs{display:flex;flex-direction:column;gap:5px}
.rc{padding:7px 9px;border-radius:7px;background:var(--bg);border:.5px solid var(--bd)}
.rc.pri{background:rgba(250,199,117,.07);border-color:rgba(239,159,39,.22)}
.rch{display:flex;align-items:center;gap:4px;margin-bottom:2px;flex-wrap:wrap}
.rcn{font-size:11.5px;font-weight:bold;color:var(--tx)}
.rct{font-size:8.5px;color:var(--tx3);font-style:italic;margin-left:auto}
.ptag{display:inline-block;padding:1px 5px;border-radius:3px;font-size:7.5px;font-weight:bold;letter-spacing:.3px;background:var(--a400);color:var(--a900);font-family:system-ui,sans-serif}
.rcf{font-size:10px;color:var(--tx2);font-style:italic;margin-bottom:2px}
.rr{display:flex;gap:5px;align-items:center;flex-wrap:wrap;margin-bottom:2px}
.rl{font-size:8.5px;color:var(--tx3)}
.rb{display:inline-block;padding:1px 5px;border-radius:3px;font-size:8.5px;font-weight:bold;font-family:system-ui,sans-serif;line-height:13px}
.r-negligible{background:#d3d1c7;color:#444441}.r-some{background:var(--a100);color:var(--a800)}
.r-likely{background:var(--a400);color:var(--a900)}.r-uncertain{background:var(--b50);color:var(--b800)}
.rcno{font-size:9.5px;color:var(--tx2);font-style:italic;margin-top:1px;line-height:1.35}
.ndm{font-size:11px;color:var(--tx3);font-style:italic}
.cbdg{display:inline-block;padding:2px 6px;border-radius:3px;font-size:9.5px;font-family:system-ui,sans-serif}
.ref-link{font-size:8px;color:var(--a600);font-style:normal;font-family:system-ui,sans-serif;margin-left:2px;opacity:.7}.ref-link:hover{opacity:1}
.tt{position:absolute;pointer-events:none;background:#fff;border:1px solid var(--bd);border-radius:7px;padding:7px 10px;max-width:230px;z-index:100;box-shadow:0 3px 10px rgba(0,0,0,.05);font-size:10.5px;opacity:0;transition:opacity .1s}
.tt.vis{opacity:1}
.ttt{font-weight:bold;font-size:12px;color:var(--tx);margin-bottom:1px}
.tts{font-size:9.5px;color:var(--tx3);font-style:italic}
.ttst{font-size:9.5px;color:var(--tx2);margin-top:2px}
.tth{font-size:8.5px;color:var(--tx3);margin-top:2px;font-style:italic}
.ttp{display:flex;flex-wrap:wrap;gap:2px;margin-top:3px}
.pp{display:inline-flex;align-items:center;gap:2px;padding:1px 5px;border-radius:3px;font-size:9px;background:var(--a50);color:var(--a800);border:.5px solid var(--a100);font-family:system-ui,sans-serif}
.ppd{width:4px;height:4px;border-radius:50%;background:var(--a400)}
.pref{margin-top:16px;padding:10px 13px;border-radius:7px;background:rgba(250,199,117,.04);border:.5px solid rgba(239,159,39,.12)}
.pref-t{font-size:10.5px;color:var(--a600);font-style:italic;margin-bottom:5px}
.pref-pills{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:5px}
.pref-n{font-size:9.5px;color:var(--tx3);font-style:italic;line-height:1.5}
.footer{font-size:8.5px;color:var(--tx3);text-align:right;margin-top:9px;font-style:italic}
.ii{display:inline-flex;align-items:center;justify-content:center;width:14px;height:14px;border-radius:50%;border:1px solid var(--tx3);font-size:9px;font-style:italic;font-family:Georgia,serif;color:var(--tx3);cursor:pointer;position:relative;flex-shrink:0;line-height:1;user-select:none}
.ii:hover{border-color:var(--tx2);color:var(--tx2)}
.ip{display:none;position:absolute;top:20px;left:-4px;width:280px;background:#fff;border:1px solid var(--bd);border-radius:7px;padding:10px 12px;font-size:11px;font-style:normal;color:var(--tx2);line-height:1.5;box-shadow:0 3px 12px rgba(0,0,0,.07);z-index:200;cursor:default}
.ip.rt{left:auto;right:-4px}.ii.open .ip{display:block}
.ipt{font-weight:bold;font-size:11px;color:var(--tx);margin-bottom:3px}
.atbl{width:100%;border-collapse:collapse;font-size:11px}
.atbl th{text-align:left;font-size:10px;color:var(--tx3);text-transform:uppercase;letter-spacing:.4px;padding:6px 8px;border-bottom:1.5px solid var(--bg3);font-weight:normal;font-style:italic;position:sticky;top:0;background:var(--bg)}
.atbl th .ii{vertical-align:middle;margin-left:2px}
.atbl td{padding:5px 8px;border-bottom:.5px solid var(--bd);vertical-align:top}
.atbl tr.pri-row td{background:rgba(250,199,117,.05)}
.atbl .pname{font-weight:bold;white-space:nowrap}
.atbl .notes-cell{font-size:10px;color:var(--tx2);font-style:italic;line-height:1.35;max-width:320px}
.asep td{padding:8px;font-size:9px;color:var(--tx3);text-transform:uppercase;letter-spacing:.5px;border-bottom:1px solid var(--bg3);background:var(--bg2)}
.mtbl{width:100%;border-collapse:collapse;font-size:10.5px}
.mtbl th{text-align:left;font-size:9px;color:var(--tx3);text-transform:uppercase;letter-spacing:.4px;padding:5px 6px;border-bottom:1.5px solid var(--bg3);font-weight:normal;font-style:italic;position:sticky;top:0;background:var(--bg)}
.mtbl td{padding:4px 6px;border-bottom:.5px solid var(--bd);vertical-align:top}
.mtbl .grp-sep td{padding:6px;font-size:9px;color:var(--tx3);text-transform:uppercase;letter-spacing:.5px;border-bottom:1px solid var(--bg3);background:var(--bg2)}
.mtbl .tname{font-weight:bold;white-space:nowrap}
.city-tag{display:inline-block;padding:1px 5px;border-radius:3px;font-size:9px;background:var(--bg2);margin:1px 2px;font-family:system-ui,sans-serif}
.flag-mini{display:inline-block;padding:1px 4px;border-radius:3px;font-size:8px;font-family:system-ui,sans-serif;margin:1px 1px}
.flag-mini.pri{background:var(--a50);color:var(--a800);border:.5px solid var(--a100)}
.flag-mini.std{background:var(--bg3);color:var(--tx2)}
.scroll-wrap{max-height:540px;overflow-y:auto;background:#fff;border:1px solid var(--bd);border-radius:9px;padding:2px}
.scroll-wrap::-webkit-scrollbar{width:3px}.scroll-wrap::-webkit-scrollbar-thumb{background:var(--bg3);border-radius:2px}
.tab-intro{font-size:12px;color:var(--tx2);font-style:italic;margin-bottom:12px;line-height:1.5}
.about-wrap{background:#fff;border:1px solid var(--bd);border-radius:9px;padding:24px 28px;max-width:820px;line-height:1.7}
.about-wrap h2{font-size:17px;font-weight:normal;color:var(--tx);margin:20px 0 8px;padding-top:16px;border-top:1px solid var(--bd)}
.about-wrap h2:first-child{margin-top:0;padding-top:0;border-top:none}
.about-wrap p{font-size:12.5px;color:var(--tx2);margin-bottom:10px}
.about-wrap ul{font-size:12px;color:var(--tx2);margin:0 0 12px 18px}
.about-wrap li{margin-bottom:3px}
.about-wrap .center-name{font-weight:bold;color:var(--tx)}
.about-wrap .center-inst{color:var(--tx3);font-style:italic;font-size:11.5px}
.about-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px 20px;margin:10px 0 16px}
@media(max-width:600px){.about-grid{grid-template-columns:1fr}}
.about-grid .cg-item{font-size:12px;padding:6px 0;border-bottom:.5px solid var(--bd)}
.rating-key{display:inline-flex;gap:6px;align-items:center;margin:2px 0}
</style>
</head>
<body>
<div class="d">
<div class="hd">
<div class="ht">WC26 <em>Infectious Disease</em> Risk Dashboard</div>
<div class="hs">Insight Net ID Cup Collaboration · EPISTORM · April 2026 · Modified Delphi assessment</div>
</div>
<div class="tabs" id="tabs"></div>
<div class="view active" id="v-us"></div>
<div class="view" id="v-world"></div>
<div class="view" id="v-assess"></div>
<div class="view" id="v-map"></div>
<div class="view" id="v-about"></div>
<div class="pref">
<div class="pref-t">Insight Net priority pathogens (modified Delphi consensus)</div>
<div class="pref-pills" id="ppills"></div>
<div class="pref-n">Assessed across three risk categories: significant additional importations, outbreak requiring public health response, and establishment as newly endemic disease. Future iterations will integrate scenario-specific importation probabilities from the GLEAM modeling framework.</div>
</div>
<div class="footer">Data: Insight Net ID Cup Collaboration Group · Visualization: EPISTORM, Northeastern University</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/7.8.5/d3.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/topojson/3.0.2/topojson.min.js"></script>
<script>
const PP=["Dengue","Measles","Mpox Clade I","Norovirus","Novel Respiratory Viruses","Oropouche"];
function np(p){const l=p.toLowerCase();if(l.includes("mpox")&&(l.includes("clade i")||l.includes("clade 1"))){if(l.includes("clade ii")||l.includes("clade 2"))return"Mpox Clade II";return"Mpox Clade I"}if(l.includes("mpox"))return"Mpox (unspecified)";if(l.includes("chikungunya"))return"Chikungunya";if(l.includes("oropouche")||l.includes("oropuche"))return"Oropouche";if(l.includes("mers"))return"MERS-CoV";if(l.includes("dengue"))return"Dengue";if(l.includes("measles"))return"Measles";if(l.includes("ebola"))return"Ebola";if(l.includes("marburg"))return"Marburg";if(l.includes("cholera"))return"Cholera";if(l.includes("yellow fever"))return"Yellow Fever";if(l.includes("west nile"))return"West Nile Virus";if(l.includes("tick-borne enceph")||l==="tbe")return"TBE";if(l.includes("crimean")||l.includes("cchf"))return"CCHF";if(l.includes("nipah"))return"Nipah";if(l.includes("zika"))return"Zika";if(l.includes("seasonal arbo")||l.includes("mediterranean arbo")||l.includes("emerging arbo"))return"Seasonal Arboviruses";return p}
function isP(n){return PP.some(p=>n.toLowerCase().includes(p.toLowerCase()))}
const TNM={"Czech Republic":"Czechia","Turkey":"T\u00fcrkiye","DRC":"DR Congo"};function rt(t){return TNM[t]||t}
const REFS={"Ivory Coast|Mpox clade II":"https://worldhealthorg.shinyapps.io/mpx_global/#sec-global","Ivory Coast|Yellow fever":"https://www.who.int/news-room/fact-sheets/detail/yellow-fever","Ivory Coast|Dengue":"https://www.who.int/news-room/fact-sheets/detail/dengue-and-severe-dengue","Australia|Dengue":"https://www.health.gov.au/diseases/dengue-virus-infection","Cura\u00e7ao|Dengue":"https://www.paho.org/en/topics/dengue","Jordan|MERS-CoV":"https://www.who.int/news-room/fact-sheets/detail/middle-east-respiratory-syndrome-coronavirus-(mers-cov)","Uzbekistan|Crimean-Congo Haemorrhagic Fever (CCHF)":"https://www.ecdc.europa.eu/en/crimean-congo-haemorrhagic-fever/surveillance-and-disease-data","New Zealand|Dengue":"https://beaconbio.org/en/report/?reportid=7a232b34-590f-4c6f-9dc0-37920767f05e","New Zealand|Measles":"https://www.phfscience.nz/digital-library/measles-dashboard/","Germany|West Nile Virus (WNV)":"https://www.ecdc.europa.eu/en/west-nile-fever/surveillance-and-disease-data/historical","Germany|Mpox clade Ib":"https://worldhealthorg.shinyapps.io/mpx_global/#sec-global","Germany|Measles":"https://www.ecdc.europa.eu/en/measles/surveillance-and-disease-data","Netherlands|Mpox clade Ib":"https://worldhealthorg.shinyapps.io/mpx_global/#sec-global","Netherlands|Measles":"https://www.ecdc.europa.eu/en/measles/surveillance-and-disease-data","Switzerland|Tick-borne Encephalitis (TBE)":"https://www.ecdc.europa.eu/en/tick-borne-encephalitis/surveillance-and-disease-data","Switzerland|Measles":"https://www.ecdc.europa.eu/en/measles/surveillance-and-disease-data","Croatia|West Nile Virus (WNV)":"https://www.ecdc.europa.eu/en/west-nile-fever/surveillance-and-disease-data/historical","Croatia|Tick-borne Encephalitis (TBE)":"https://www.ecdc.europa.eu/en/tick-borne-encephalitis/surveillance-and-disease-data","Scotland|Measles":"https://www.publichealthscotland.scot/our-areas-of-work/conditions-and-diseases/measles/","Norway|Tick-borne Encephalitis (TBE)":"https://www.ecdc.europa.eu/en/tick-borne-encephalitis/surveillance-and-disease-data","Sweden|Tick-borne Encephalitis (TBE)":"https://www.ecdc.europa.eu/en/tick-borne-encephalitis/surveillance-and-disease-data","Sweden|Measles":"https://www.ecdc.europa.eu/en/measles/surveillance-and-disease-data","Bosnia and Herzegovina|West Nile Virus (WNV)":"https://www.ecdc.europa.eu/en/west-nile-fever/surveillance-and-disease-data/historical","T\u00fcrkiye|Crimean-Congo Haemorrhagic Fever (CCHF)":"https://www.ecdc.europa.eu/en/crimean-congo-haemorrhagic-fever/surveillance-and-disease-data","T\u00fcrkiye|West Nile Virus (WNV)":"https://www.ecdc.europa.eu/en/west-nile-fever/surveillance-and-disease-data/historical","Colombia|Chikungunya":"https://www.paho.org/en/topics/chikungunya","Colombia|Oropouche":"https://www.paho.org/en/topics/oropouche","Colombia|Yellow fever":"https://www.paho.org/en/epidemiological-alerts-and-updates","France|Chikungunya":"https://www.ecdc.europa.eu/en/chikungunya/surveillance-and-disease-data","Brazil|Chikungunya":"https://www.paho.org/en/topics/chikungunya","Brazil|Measles":"https://www.paho.org/en/topics/measles","Paraguay|Chikungunya ECSA genotype":"https://www.paho.org/en/topics/chikungunya","Haiti|Cholera":"https://www.paho.org/en/topics/cholera","Cape Verde|Dengue":"https://www.ecdc.europa.eu/en/dengue-fever/surveillance-and-disease-data","Cape Verde|Emerging arboviruses":"https://www.ecdc.europa.eu/en/dengue-fever/surveillance-and-disease-data","Ecuador|Dengue":"https://www.paho.org/en/topics/dengue","Ecuador|Mpox clade Ib":"https://worldhealthorg.shinyapps.io/mpx_global/#sec-global","DR Congo|Ebola":"https://www.who.int/emergencies/disease-outbreak-news","DR Congo|Mpox clade Ib":"https://worldhealthorg.shinyapps.io/mpx_global/#sec-global","Ghana|Marburg":"https://www.who.int/news-room/fact-sheets/detail/marburg-virus-disease","Ghana|Mpox clade II":"https://worldhealthorg.shinyapps.io/mpx_global/#sec-global","Japan|Measles":"https://www.niid.go.jp/niid/en/measles-e.html","Canada|Measles":"https://health-infobase.canada.ca/measles-rubella/","Canada|Mpox clade Ib":"https://worldhealthorg.shinyapps.io/mpx_global/#sec-global","Tunisia|Mediterranean arbovirus risk":"https://www.ecdc.europa.eu/en/dengue-fever/surveillance-and-disease-data","Egypt|MERS-CoV":"https://www.who.int/news-room/fact-sheets/detail/middle-east-respiratory-syndrome-coronavirus-(mers-cov)","Egypt|Seasonal arboviruses":"https://www.ecdc.europa.eu/en/rift-valley-fever/surveillance-and-disease-data","Iraq|MERS-CoV":"https://www.who.int/news-room/fact-sheets/detail/middle-east-respiratory-syndrome-coronavirus-(mers-cov)","Saudi Arabia|MERS-CoV":"https://www.who.int/news-room/fact-sheets/detail/middle-east-respiratory-syndrome-coronavirus-(mers-cov)","Iran|MERS-CoV circulation":"https://www.who.int/news-room/fact-sheets/detail/middle-east-respiratory-syndrome-coronavirus-(mers-cov)","Senegal|Mpox":"https://worldhealthorg.shinyapps.io/mpx_global/#sec-global","South Africa|Mpox clade I":"https://worldhealthorg.shinyapps.io/mpx_global/#sec-global","Qatar|Mpox clade Ib":"https://worldhealthorg.shinyapps.io/mpx_global/#sec-global","Portugal|Mpox clade Ib":"https://worldhealthorg.shinyapps.io/mpx_global/#sec-global","England|Mpox clade Ib":"https://worldhealthorg.shinyapps.io/mpx_global/#sec-global","Belgium|Mpox clade Ib":"https://worldhealthorg.shinyapps.io/mpx_global/#sec-global","Austria|Mpox clade Ib":"https://worldhealthorg.shinyapps.io/mpx_global/#sec-global","Czechia|Mpox clade Ib":"https://worldhealthorg.shinyapps.io/mpx_global/#sec-global","Spain|Mpox clade Ib":"https://worldhealthorg.shinyapps.io/mpx_global/#sec-global","Argentina|Mpox clade Ib":"https://worldhealthorg.shinyapps.io/mpx_global/#sec-global","Argentina|Seasonal arbovirus":"https://www.paho.org/en/topics/dengue","Panama|Oropuche":"https://www.paho.org/en/topics/oropouche","Uruguay|Seasonal arbovirus":"https://www.paho.org/en/topics/dengue","Morocco|Seasonal arbovirus":"https://www.ecdc.europa.eu/en/dengue-fever/surveillance-and-disease-data","Algeria|Seasonal arbovirus":"https://www.ecdc.europa.eu/en/dengue-fever/surveillance-and-disease-data","Mexico|Dengue":"https://www.gob.mx/salud/documentos/panorama-epidemiologico-de-dengue","Mexico|Zika":"https://www.paho.org/en/topics/zika","Mexico|Oropouche":"https://www.paho.org/en/topics/oropouche","Mexico|Chikungunya":"https://www.paho.org/en/topics/chikungunya"};
const RR=[
{t:"Ivory Coast",y:"Orthopoxvirus",p:"Mpox clade II",n:"West Africa mpox clade II outbreak ongoing."},{t:"Ivory Coast",y:"Arbovirus",p:"Yellow fever",n:"Endemic; vaccination required."},{t:"Ivory Coast",y:"Arbovirus",p:"Dengue",n:"Endemic year-round transmission."},{t:"Australia",y:"Arbovirus",p:"Dengue",n:"Imported cases. No outbreak Apr 2026."},{t:"Cura\u00e7ao",y:"Arbovirus",p:"Dengue",n:"Caribbean endemic. Sporadic year-round."},{t:"Jordan",y:"Respiratory/Zoonotic",p:"MERS-CoV",n:"MERS endemic. Sporadic cases."},{t:"Uzbekistan",y:"VHF",p:"Crimean-Congo Haemorrhagic Fever (CCHF)",n:"CCHF endemic; annual sporadic cases."},{t:"New Zealand",y:"Arbovirus",p:"Dengue",n:"142 imported cases Feb 2026."},{t:"New Zealand",y:"VPD",p:"Measles",n:"Low incidence Apr 2026."},{t:"Germany",y:"Arbovirus",p:"West Nile Virus (WNV)",n:"Established since 2018."},{t:"Germany",y:"Orthopoxvirus",p:"Mpox clade Ib",n:"European cluster ongoing."},{t:"Germany",y:"VPD",p:"Measles",n:"Sporadic cases."},{t:"Netherlands",y:"Orthopoxvirus",p:"Mpox clade Ib",n:"European cluster."},{t:"Netherlands",y:"VPD",p:"Measles",n:"Sporadic, under-vaccinated communities."},{t:"Switzerland",y:"Arbovirus",p:"Tick-borne Encephalitis (TBE)",n:"Endemic."},{t:"Switzerland",y:"VPD",p:"Measles",n:"Sporadic cases."},{t:"Croatia",y:"Arbovirus",p:"West Nile Virus (WNV)",n:"Endemic since 2012."},{t:"Croatia",y:"Arbovirus",p:"Tick-borne Encephalitis (TBE)",n:"Present in continental Croatia."},{t:"Scotland",y:"VPD",p:"Measles",n:"UK-level surveillance."},{t:"Norway",y:"Arbovirus",p:"Tick-borne Encephalitis (TBE)",n:"Endemic in coastal S/E."},{t:"Sweden",y:"Arbovirus",p:"Tick-borne Encephalitis (TBE)",n:"Highest incidence in Europe."},{t:"Sweden",y:"VPD",p:"Measles",n:"Sporadic."},{t:"Bosnia and Herzegovina",y:"Arbovirus",p:"West Nile Virus (WNV)",n:"Endemic in Balkans."},{t:"T\u00fcrkiye",y:"VHF",p:"Crimean-Congo Haemorrhagic Fever (CCHF)",n:"~400\u2013500 cases/yr."},{t:"T\u00fcrkiye",y:"Arbovirus",p:"West Nile Virus (WNV)",n:"Seasonal in Thrace."},{t:"Colombia",y:"Arbovirus",p:"Chikungunya",n:"Sporadic."},{t:"Colombia",y:"Arbovirus",p:"Oropouche",n:"Autochthonous; increased vs 2025."},{t:"Colombia",y:"Arbovirus",p:"Yellow fever",n:"34 cases, 18 deaths Apr 2026."},{t:"France",y:"Arbovirus",p:"Chikungunya",n:"156 local cases 2025. Closed."},{t:"Brazil",y:"Arbovirus",p:"Chikungunya",n:"Major 2025 resurgence. ECSA."},{t:"Brazil",y:"VPD",p:"Measles",n:"Second case in Rio."},{t:"Paraguay",y:"Arbovirus",p:"Chikungunya ECSA genotype",n:"Sustained 2025 outbreak."},{t:"Haiti",y:"Bacterial",p:"Cholera",n:"Enhanced surveillance."},{t:"Cape Verde",y:"Arbovirus",p:"Dengue",n:""},{t:"Cape Verde",y:"Arbovirus",p:"Emerging arboviruses",n:""},{t:"Ecuador",y:"Arbovirus",p:"Dengue",n:"Regional circulation."},{t:"Ecuador",y:"Orthopoxvirus",p:"Mpox clade Ib",n:"First import Apr 5 2026."},{t:"DR Congo",y:"VHF",p:"Ebola",n:"Last outbreak 2025."},{t:"DR Congo",y:"Orthopoxvirus",p:"Mpox clade Ib",n:"Epidemic declared over Apr 4."},{t:"Ghana",y:"VHF",p:"Marburg",n:"Last outbreak 2022."},{t:"Ghana",y:"Orthopoxvirus",p:"Mpox clade II",n:"Sustained community transmission."},{t:"Japan",y:"VPD",p:"Measles",n:"152 cases as of Mar 2026."},{t:"Canada",y:"VPD",p:"Measles",n:"650+ cases across provinces."},{t:"Canada",y:"Orthopoxvirus",p:"Mpox clade Ib",n:"Travel-linked; 2 in 6 weeks."},{t:"Tunisia",y:"Arbovirus",p:"Mediterranean arbovirus risk",n:""},{t:"Egypt",y:"Respiratory/Zoonotic",p:"MERS-CoV",n:"Endemic."},{t:"Egypt",y:"Arbovirus",p:"Seasonal arboviruses",n:""},{t:"Iraq",y:"Respiratory/Zoonotic",p:"MERS-CoV",n:"Regional circulation."},{t:"Saudi Arabia",y:"Respiratory/Zoonotic",p:"MERS-CoV",n:"Endemic; mass gathering surveillance."},{t:"Iran",y:"Respiratory/Zoonotic",p:"MERS-CoV circulation",n:"Seasonal."},{t:"Senegal",y:"Orthopoxvirus",p:"Mpox",n:"First detection 2026."},{t:"South Africa",y:"Orthopoxvirus",p:"Mpox clade I",n:"Travel-related."},{t:"Qatar",y:"Orthopoxvirus",p:"Mpox clade Ib",n:"Travel-related."},{t:"Portugal",y:"Orthopoxvirus",p:"Mpox clade Ib",n:"1 case in 6 weeks."},{t:"England",y:"Orthopoxvirus",p:"Mpox clade Ib",n:"10 cases in 6 weeks."},{t:"Belgium",y:"Orthopoxvirus",p:"Mpox clade Ib",n:"2 cases in 6 weeks."},{t:"Austria",y:"Orthopoxvirus",p:"Mpox clade Ib",n:"2 cases in 6 weeks."},{t:"Czechia",y:"Orthopoxvirus",p:"Mpox clade Ib",n:"3 cases in 6 weeks."},{t:"Spain",y:"Orthopoxvirus",p:"Mpox clade Ib",n:"18 cases in 6 weeks."},{t:"Argentina",y:"Orthopoxvirus",p:"Mpox clade Ib",n:"2 cases in 6 weeks."},{t:"Argentina",y:"Arbovirus",p:"Seasonal arbovirus",n:""},{t:"Panama",y:"Arbovirus",p:"Oropuche",n:"Detected."},{t:"Uruguay",y:"Arbovirus",p:"Seasonal arbovirus",n:""},{t:"Morocco",y:"Arbovirus",p:"Seasonal arbovirus",n:""},{t:"Algeria",y:"Arbovirus",p:"Seasonal arbovirus",n:""},{t:"Mexico",y:"Arbovirus",p:"Dengue",n:"Highly endemic. Record 2025."},{t:"Mexico",y:"Arbovirus",p:"Zika",n:"Sporadic."},{t:"Mexico",y:"Arbovirus",p:"Oropouche",n:"Regional expansion."},{t:"Mexico",y:"Arbovirus",p:"Chikungunya",n:"Co-circulates with dengue."},
];
const RISKS=RR.map(r=>{const n=np(r.p);return{...r,np:n,pri:isP(n),ref:REFS[r.t+"|"+r.p]||""}});
const TMS=[
{g:"A",t:"Mexico",c:"CONCACAF",ci:["Mexico City","Guadalajara"]},{g:"A",t:"South Africa",c:"CAF",ci:["Mexico City","Atlanta","Monterrey"]},{g:"A",t:"Korea",c:"AFC",ci:["Guadalajara","Monterrey"]},{g:"A",t:"Czech Republic",c:"UEFA",ci:["Guadalajara","Atlanta","Mexico City"]},
{g:"B",t:"Canada",c:"CONCACAF",ci:["Toronto","Vancouver"]},{g:"B",t:"Bosnia and Herzegovina",c:"UEFA",ci:["Toronto","Los Angeles","Seattle"]},{g:"B",t:"Qatar",c:"AFC",ci:["San Francisco Bay Area","Vancouver","Seattle"]},{g:"B",t:"Switzerland",c:"UEFA",ci:["San Francisco Bay Area","Los Angeles","Vancouver"]},
{g:"C",t:"Brazil",c:"CONMEBOL",ci:["New York/New Jersey","Philadelphia","Miami"]},{g:"C",t:"Morocco",c:"CAF",ci:["New York/New Jersey","Boston","Atlanta"]},{g:"C",t:"Haiti",c:"CONCACAF",ci:["Boston","Philadelphia","Atlanta"]},{g:"C",t:"Scotland",c:"UEFA",ci:["Boston","Miami"]},
{g:"D",t:"United States",c:"CONCACAF",ci:["Los Angeles","Seattle"]},{g:"D",t:"Paraguay",c:"CONMEBOL",ci:["Los Angeles","San Francisco Bay Area"]},{g:"D",t:"Australia",c:"AFC",ci:["Vancouver","Seattle","San Francisco Bay Area"]},{g:"D",t:"Turkey",c:"UEFA",ci:["Vancouver","San Francisco Bay Area","Los Angeles"]},
{g:"E",t:"Germany",c:"UEFA",ci:["Houston","Toronto","New York/New Jersey"]},{g:"E",t:"Cura\u00e7ao",c:"CONCACAF",ci:["Houston","Kansas City","Philadelphia"]},{g:"E",t:"Ivory Coast",c:"CAF",ci:["Philadelphia","Toronto"]},{g:"E",t:"Ecuador",c:"CONMEBOL",ci:["Philadelphia","Kansas City","New York/New Jersey"]},
{g:"F",t:"Netherlands",c:"UEFA",ci:["Dallas","Houston","Kansas City"]},{g:"F",t:"Japan",c:"AFC",ci:["Dallas","Monterrey"]},{g:"F",t:"Sweden",c:"UEFA",ci:["Monterrey","Houston","Dallas"]},{g:"F",t:"Tunisia",c:"CAF",ci:["Monterrey","Kansas City"]},
{g:"G",t:"Belgium",c:"UEFA",ci:["Seattle","Los Angeles","Vancouver"]},{g:"G",t:"Egypt",c:"CAF",ci:["Seattle","Vancouver"]},{g:"G",t:"Iran",c:"AFC",ci:["Los Angeles","Seattle"]},{g:"G",t:"New Zealand",c:"OFC",ci:["Los Angeles","Vancouver"]},
{g:"H",t:"Spain",c:"UEFA",ci:["Atlanta","Guadalajara"]},{g:"H",t:"Cape Verde",c:"CAF",ci:["Atlanta","Miami","Houston"]},{g:"H",t:"Saudi Arabia",c:"AFC",ci:["Miami","Atlanta","Houston"]},{g:"H",t:"Uruguay",c:"CONMEBOL",ci:["Miami","Guadalajara"]},
{g:"I",t:"France",c:"UEFA",ci:["New York/New Jersey","Philadelphia","Boston"]},{g:"I",t:"Senegal",c:"CAF",ci:["New York/New Jersey","Toronto"]},{g:"I",t:"Iraq",c:"AFC",ci:["Boston","Philadelphia","Toronto"]},{g:"I",t:"Norway",c:"UEFA",ci:["Boston","New York/New Jersey"]},
{g:"J",t:"Argentina",c:"CONMEBOL",ci:["Kansas City","Dallas"]},{g:"J",t:"Algeria",c:"CAF",ci:["Kansas City","San Francisco Bay Area"]},{g:"J",t:"Austria",c:"UEFA",ci:["San Francisco Bay Area","Dallas","Kansas City"]},{g:"J",t:"Jordan",c:"AFC",ci:["San Francisco Bay Area","Dallas"]},
{g:"K",t:"Portugal",c:"UEFA",ci:["Houston","Miami"]},{g:"K",t:"DRC",c:"CAF",ci:["Houston","Guadalajara","Atlanta"]},{g:"K",t:"Uzbekistan",c:"AFC",ci:["Mexico City","Houston","Atlanta"]},{g:"K",t:"Colombia",c:"CONMEBOL",ci:["Mexico City","Guadalajara","Miami"]},
{g:"L",t:"England",c:"UEFA",ci:["Dallas","Boston","New York/New Jersey"]},{g:"L",t:"Croatia",c:"UEFA",ci:["Dallas","Toronto","Philadelphia"]},{g:"L",t:"Ghana",c:"CAF",ci:["Toronto","Boston","Philadelphia"]},{g:"L",t:"Panama",c:"CONCACAF",ci:["Toronto","New York/New Jersey"]},
];
const ST=[
{s:"AT&T Stadium",ct:"Dallas",st:"TX",cap:94000,m:9,d:"5 group + 2 R32 + 1 R16 + 1 SF",la:32.7473,ln:-97.0945},{s:"MetLife Stadium",ct:"New York/New Jersey",st:"NJ",cap:82500,m:8,d:"4 group + 1 R32 + 1 R16 + 1 QF + Final",la:40.8128,ln:-74.0742},{s:"Mercedes-Benz Stadium",ct:"Atlanta",st:"GA",cap:75000,m:8,d:"5 group + 1 R32 + 1 R16 + 1 SF",la:33.7553,ln:-84.4006},{s:"Arrowhead Stadium",ct:"Kansas City",st:"MO",cap:73000,m:6,d:"4 group + 1 R32 + 1 QF",la:39.0489,ln:-94.4839},{s:"NRG Stadium",ct:"Houston",st:"TX",cap:72000,m:7,d:"4 group + 1 R32 + 1 R16 + 3rd place",la:29.6847,ln:-95.4107},{s:"Levi's Stadium",ct:"San Francisco Bay Area",st:"CA",cap:71000,m:6,d:"4 group + 1 R32 + 1 R16",la:37.4033,ln:-121.9694},{s:"SoFi Stadium",ct:"Los Angeles",st:"CA",cap:70000,m:8,d:"4 group + 2 R32 + 1 R16 + 1 QF",la:33.9535,ln:-118.3392},{s:"Lincoln Financial Field",ct:"Philadelphia",st:"PA",cap:69000,m:6,d:"4 group + 1 R32 + 1 R16",la:39.9008,ln:-75.1674},{s:"Lumen Field",ct:"Seattle",st:"WA",cap:69000,m:6,d:"4 group + 1 R32 + 1 R16",la:47.5952,ln:-122.3316},{s:"Hard Rock Stadium",ct:"Miami",st:"FL",cap:65000,m:7,d:"4 group + 1 R32 + 1 QF + 3rd place",la:25.958,ln:-80.2389},{s:"Gillette Stadium",ct:"Boston",st:"MA",cap:64000,m:6,d:"4 group + 1 R32 + 1 QF",la:42.0909,ln:-71.2643},
];
const INS={"Dengue":{i:"Likely",o:"Some",e:"Uncertain",n:"Routine importation; increased travel from endemic regions. Competent vectors in CA, GA, FL, TX."},"Measles":{i:"Some",o:"Some",e:"Some",n:"Declining vaccination; domestic and international introduction risk. Concentrated under-immunized communities."},"Mpox Clade I":{i:"Some",o:"Some",e:"Some",n:"Ongoing Central/Eastern Africa transmission. Close-contact dynamics at large events may elevate risk."},"Norovirus":{i:"Negligible",o:"Likely",e:"Negligible",n:"Already endemic. Mass gathering density may amplify outbreaks."},"Novel Respiratory Viruses":{i:"Uncertain",o:"Uncertain",e:"Uncertain",n:"No specific threats identified. Increased travel may elevate general introduction risk."},"Oropouche":{i:"Uncertain",o:"Uncertain",e:"Uncertain",n:"Emerging in South/Central America. Competent vectors present in US."},"Chikungunya":{i:"Some",o:"Some",e:"Negligible",n:"History of introduction; current global resurgence (ECSA genotype)."},"Cholera":{i:"Some",o:"Negligible",e:"Negligible",n:"Limited introduction risk; public health controls limit onward transmission."},"Ebola":{i:"Negligible",o:"Some",e:"Negligible",n:"Extremely low incremental risk. High impact if introduced but negligible onward transmission."},"MERS-CoV":{i:"Negligible",o:"Negligible",e:"Negligible",n:"Sporadic; no current outbreaks."},"West Nile Virus":{i:"Negligible",o:"Negligible",e:"Negligible",n:"Already endemic. Domestic travel, not international, drives risk."},"TBE":{i:"Negligible",o:"Negligible",e:"Negligible",n:"Tick-borne; unlikely in WC context."},"CCHF":{i:"Negligible",o:"Negligible",e:"Negligible",n:"Tick-borne; unlikely in WC context."},"Zika":{i:"Negligible",o:"Some",e:"Uncertain",n:"Low global prevalence. No similar history of regular spillover."},"Yellow Fever":{i:"Negligible",o:"Negligible",e:"Negligible",n:"Low prevalence; vaccine-derived immunity."},"Mpox Clade II":{i:"Some",o:"Some",e:"Negligible",n:"Ongoing regional clusters. Residual immunity in key populations."},"Mpox (unspecified)":{i:"Some",o:"Some",e:"Negligible",n:"Clade identification ongoing."},"Marburg":{i:"Negligible",o:"Some",e:"Negligible",n:"Rare. No recent active outbreaks."},"Nipah":{i:"Negligible",o:"Negligible",e:"Negligible",n:"Extremely low human-to-human transmission."},"Seasonal Arboviruses":{i:"Negligible",o:"Negligible",e:"Negligible",n:"Background seasonal patterns; no specific WC risk."}};
const CC={UEFA:"#3266ad",CAF:"#b8860b",CONMEBOL:"#2e8b57",CONCACAF:"#8b2252",AFC:"#d05538",OFC:"#6a5acd"};
const GC={"Mexico":[23.6,-102.5],"South Africa":[-30.6,22.9],"Korea":[35.9,127.8],"Czech Republic":[49.8,15.5],"Czechia":[49.8,15.5],"Canada":[56.1,-106.3],"Bosnia and Herzegovina":[43.9,17.7],"Qatar":[25.4,51.2],"Switzerland":[46.8,8.2],"Brazil":[-14.2,-51.9],"Morocco":[31.8,-7.1],"Haiti":[19,-72.4],"Scotland":[56.5,-4.2],"United States":[39.8,-98.6],"Paraguay":[-23.4,-58.4],"Australia":[-25.3,133.8],"Turkey":[38.9,35.2],"T\u00fcrkiye":[38.9,35.2],"Germany":[51.2,10.5],"Cura\u00e7ao":[12.2,-68.9],"Ivory Coast":[7.5,-5.5],"Ecuador":[-1.8,-78.2],"Netherlands":[52.1,5.3],"Japan":[36.2,138.3],"Sweden":[60.1,18.6],"Tunisia":[33.9,9.5],"Belgium":[50.5,4.5],"Egypt":[26.8,30.8],"Iran":[32.4,53.7],"New Zealand":[-40.9,174.9],"Spain":[40.5,-3.7],"Cape Verde":[16,-24],"Saudi Arabia":[23.9,45.1],"Uruguay":[-32.5,-55.8],"France":[46.2,2.2],"Senegal":[14.5,-14.5],"Iraq":[33.2,43.7],"Norway":[60.5,8.5],"Argentina":[-38.4,-63.6],"Algeria":[28,1.7],"Austria":[47.5,14.6],"Jordan":[30.6,36.2],"Portugal":[39.4,-8.2],"DRC":[-4,21.8],"DR Congo":[-4,21.8],"Uzbekistan":[41.4,64.6],"Colombia":[4.6,-74.3],"England":[52.4,-1.2],"Croatia":[45.1,15.2],"Ghana":[7.9,-1],"Panama":[8.5,-80.8]};
function gtr(tm){const r=rt(tm);return RISKS.filter(x=>x.t===r||x.t===tm)}
function gct(c){return TMS.filter(t=>t.ci.includes(c))}
function gcrp(c){const a=[];gct(c).forEach(t=>{gtr(t.t).forEach(r=>a.push({...r,ft:t.t,gr:t.g}))});return a}
function gcpc(c){return new Set(gcrp(c).filter(r=>r.pri).map(r=>r.np)).size}
function gusc(td){return td.ci.filter(c=>ST.some(s=>s.ct===c))}
function cpc(c){const p=gcpc(c);return p===0?"#e8e6df":p===1?"#faeeda":p===2?"#fac775":"#ef9f27"}
function tpc(tm){const p=new Set(gtr(tm).filter(r=>r.pri).map(r=>r.np)).size;return p===0?"#e8e6df":p===1?"#faeeda":p===2?"#fac775":"#ef9f27"}
function rbd(r){return`<span class="rb r-${(r||"negligible").toLowerCase()}">${r}</span>`}
function cs(c){return c.replace("San Francisco Bay Area","SF Bay").replace("New York/New Jersey","NY/NJ")}
function refA(u){if(!u)return"";const d=u.replace(/https?:\/\//,"").split("/")[0].replace("www.","").split(".").slice(-2).join(".");return` <a class="ref-link" href="${u}" target="_blank">[${d}]</a>`}
const IT={priflags:{t:"Priority pathogen flags",b:"Distinct city\u2013pathogen pairs where the pathogen is one of the six Insight Net priority pathogens."},venues:{t:"US venues",b:ST.map(s=>`${s.s} (${cs(s.ct)}, ${s.st})`).join(" \u00b7 ")},teamlist:{t:"Teams",b:"National teams with group-stage matches at this venue."},riskprofile:{t:"Risk profile",b:"Pathogens flagged in countries of origin of teams playing here. Ratings: Negligible, Some, Likely, Uncertain."},survflags:{t:"Surveillance flags",b:"Active disease surveillance flags from WHO, ECDC, PAHO, and national authorities as of April 2026."},uscities:{t:"US cities",b:"US host cities where this team has group-stage matches."},withsurv:{t:"Countries with flags",b:"Countries of origin of WC teams with at least one active disease surveillance flag in the current assessment."},withpri:{t:"Priority flags",b:"Countries with surveillance activity for at least one of the six Insight Net priority pathogens."},dim_import:{t:"Risk of significant additional importations",b:"The extent to which World Cup-associated travel may increase the number of infectious individuals entering the United States. Incorporates both the relative increase in importation risk attributable to the World Cup and the absolute number of additional cases compared to baseline. Key considerations: historical baseline and expected excess volume by geographic origin, historical prevalence of pathogen at origins of interest, and likelihood that infected individuals are able to travel."},dim_outbreak:{t:"Potential public health impact",b:"The likelihood and scale of transmission and the associated level of public health and healthcare system activity, in the event of an importation. Considers mode of transmission, generation interval, basic reproductive number and super-spreading propensity, clinical severity, population susceptibility, and the intensity of required public health response activities."},dim_endemic:{t:"Risk of establishment (endemicity)",b:"The potential for an introduced pathogen to become established in the United States with sustained transmission beyond the initial introduction period. Considers suitability of environmental and ecological conditions (e.g., competent vectors), overall population susceptibility and immunity levels, and historical patterns of introduction and sustained transmission chains."}};
function ii(k,r){return`<span class="ii" onclick="ti(this)" data-k="${k}"><i>i</i><div class="ip${r?' rt':''}" onclick="event.stopPropagation()"></div></span>`}
function ti(el){const w=el.classList.contains("open");document.querySelectorAll(".ii.open").forEach(x=>x.classList.remove("open"));if(!w){const i=IT[el.dataset.k];if(i)el.querySelector(".ip").innerHTML=`<div class="ipt">${i.t}</div>${i.b}`;el.classList.add("open")}}
document.addEventListener("click",e=>{if(!e.target.closest(".ii"))document.querySelectorAll(".ii.open").forEach(x=>x.classList.remove("open"))});
let V="us",selC="Philadelphia",selT="Colombia",gUS=null,gW=null;
const TAB_DEF=[{id:"us",label:"US cities"},{id:"world",label:"World teams"},{id:"assess",label:"Risk assessment"},{id:"map",label:"Team \u2013 city mapping"},{id:"about",label:"About"}];
document.getElementById("tabs").innerHTML=TAB_DEF.map((t,i)=>`<button class="tab${i===0?' on':''}" data-v="${t.id}" onclick="sw('${t.id}')">${t.label}</button>`).join("");
document.getElementById("ppills").innerHTML=PP.map(p=>`<span class="pp"><span class="ppd"></span>${p}</span>`).join("");
function sw(v){V=v;document.querySelectorAll(".tab").forEach(t=>t.classList.toggle("on",t.dataset.v===v));document.querySelectorAll(".view").forEach(el=>el.classList.remove("active"));document.getElementById("v-"+v).classList.add("active");ren()}
Promise.all([d3.json("https://cdn.jsdelivr.net/npm/us-atlas@3/states-10m.json"),d3.json("https://cdn.jsdelivr.net/npm/world-atlas@2/countries-110m.json")]).then(([u,w])=>{gUS=u;gW=w;ren()});
function ren(){if(V==="us")renUSView();else if(V==="world")renWorldView();else if(V==="assess")renAssess();else if(V==="map")renMapping();else if(V==="about")renAbout()}
function renUSView(){
const ps=new Set();ST.forEach(s=>gcrp(s.ct).filter(r=>r.pri).forEach(r=>ps.add(s.ct+"|"+r.np)));
document.getElementById("v-us").innerHTML=`<div class="mn"><div><div class="mw" id="mc-us"><svg id="ms-us"></svg><div class="tt" id="tip-us"></div></div><div class="leg" id="leg-us"></div></div><div class="sp"><div class="sp-top"><div class="sp-box"><div class="sp-box-l">Venues ${ii('venues')}</div><div class="sp-box-v">${ST.length}</div></div><div class="sp-box"><div class="sp-box-l">Priority flags ${ii('priflags',1)}</div><div class="sp-box-v am">${ps.size}</div></div></div><div class="sp-body" id="sp-us"></div></div></div>`;
renUSMap();
document.getElementById("leg-us").innerHTML=`<div class="lr"><span class="ll">Priority pathogen flags:</span>${[{l:"None",c:"#e8e6df"},{l:"1 priority",c:"#faeeda"},{l:"2 priority",c:"#fac775"},{l:"3+ priority",c:"#ef9f27"}].map(x=>`<span class="li"><span class="ls" style="background:${x.c}"></span>${x.l}</span>`).join("")}</div>`;
document.getElementById("sp-us").innerHTML=cpan(selC);
}
function renUSMap(){
if(!gUS)return;
const svg=d3.select("#ms-us").attr("viewBox","0 0 680 430");
const pr=d3.geoAlbersUsa().scale(890).translate([340,225]);
const pa=d3.geoPath(pr);
svg.selectAll("path").data(topojson.feature(gUS,gUS.objects.states).features).join("path").attr("class","state-p").attr("d",pa);
ST.forEach(s=>{
const pt=pr([s.ln,s.la]);if(!pt)return;
const[x,y]=pt,r=8+(s.cap/94000)*13,sel=selC===s.ct,col=cpc(s.ct);
const g=svg.append("g").style("cursor","pointer")
.on("mouseenter",e=>showTip("tip-us","mc-us",`<div class="ttt">${s.ct}</div><div class="tts">${s.s} \u00b7 ${s.cap.toLocaleString()}</div><div class="ttst">${gct(s.ct).length} teams \u00b7 ${gcpc(s.ct)} priority</div><div class="tth">Click to view</div>`,e))
.on("mousemove",e=>moveTip("tip-us","mc-us",e)).on("mouseleave",()=>hideTip("tip-us"))
.on("click",()=>{selC=s.ct;renUSView()});
for(let i=0;i<3;i++){const c=g.append("circle").attr("cx",x).attr("cy",y).attr("fill","none").attr("stroke",col==="#e8e6df"?"#b4b2a9":"#ef9f27").attr("stroke-width",.8);c.append("animate").attr("attributeName","r").attr("from",r).attr("to",r+22).attr("dur","2.5s").attr("begin",i*.8+"s").attr("repeatCount","indefinite");c.append("animate").attr("attributeName","opacity").attr("from",.45).attr("to",0).attr("dur","2.5s").attr("begin",i*.8+"s").attr("repeatCount","indefinite")}
if(sel)g.append("circle").attr("cx",x).attr("cy",y).attr("r",r+4).attr("fill","none").attr("stroke","#854f0b").attr("stroke-width",1.5).attr("stroke-dasharray","4 3");
g.append("circle").attr("cx",x).attr("cy",y).attr("r",r).attr("fill",col).attr("fill-opacity",.72).attr("stroke",sel?"#633806":"rgba(0,0,0,.1)").attr("stroke-width",sel?1.5:.5);
g.append("text").attr("x",x).attr("y",y+r+12).attr("text-anchor","middle").attr("font-size",10).attr("fill","#5f5e5a").attr("font-family","Georgia,serif").text(cs(s.ct));
});
}
function renWorldView(){
const wr=TMS.filter(t=>gtr(t.t).length>0).length;
const wp=TMS.filter(t=>gtr(t.t).some(r=>r.pri)).length;
document.getElementById("v-world").innerHTML=`<div class="mn"><div><div class="mw" id="mc-w"><svg id="ms-w"></svg><div class="tt" id="tip-w"></div></div><div class="leg" id="leg-w"></div></div><div class="sp"><div class="sp-top"><div class="sp-box"><div class="sp-box-l">Countries with flags ${ii('withsurv')}</div><div class="sp-box-v">${wr}<span class="sub48"> / 48</span></div></div><div class="sp-box"><div class="sp-box-l">Priority flags ${ii('withpri',1)}</div><div class="sp-box-v am">${wp}</div></div></div><div class="sp-body" id="sp-w"></div></div></div>`;
renWMap();
let leg=`<div class="lr"><span class="ll">Priority flags:</span>${[{l:"None",c:"#e8e6df"},{l:"1 priority",c:"#faeeda"},{l:"2 priority",c:"#fac775"},{l:"3+ priority",c:"#ef9f27"}].map(x=>`<span class="li"><span class="ls" style="background:${x.c}"></span>${x.l}</span>`).join("")}</div>`;
leg+=`<div class="lr"><span class="ll">Confederation:</span>${Object.entries(CC).map(([k,v])=>`<span class="li"><span class="ls" style="background:${v};border-radius:50%"></span>${k}</span>`).join("")}</div>`;
document.getElementById("leg-w").innerHTML=leg;
document.getElementById("sp-w").innerHTML=tpan(selT);
}
function renWMap(){
if(!gW)return;
const svg=d3.select("#ms-w").attr("viewBox","0 0 680 390");
const pr=d3.geoNaturalEarth1().scale(124).translate([340,205]);
const pa=d3.geoPath(pr);
svg.selectAll("path").data(topojson.feature(gW,gW.objects.countries).features).join("path").attr("class","country-p").attr("d",pa);
TMS.forEach(t=>{
const co=GC[t.t]||GC[rt(t.t)];if(!co)return;
const pt=pr([co[1],co[0]]);if(!pt)return;
const[x,y_]=pt,rs=gtr(t.t),r=4+Math.min(rs.length,8)*.9,sel=selT===t.t,col=tpc(t.t);
const g=svg.append("g").style("cursor","pointer")
.on("mouseenter",e=>{const pri=rs.filter(r=>r.pri);showTip("tip-w","mc-w",`<div class="ttt">${t.t}</div><div class="tts">${t.c} \u00b7 Group ${t.g}</div><div class="ttst">${rs.length} flag${rs.length!==1?"s":""} \u00b7 ${pri.length} priority</div>${pri.length?`<div class="ttp">${pri.map(r=>`<span class="pp"><span class="ppd"></span>${r.np}</span>`).join("")}</div>`:""}<div class="tth">Click to view</div>`,e)})
.on("mousemove",e=>moveTip("tip-w","mc-w",e)).on("mouseleave",()=>hideTip("tip-w"))
.on("click",()=>{selT=t.t;renWorldView()});
if(sel)g.append("circle").attr("cx",x).attr("cy",y_).attr("r",r+4).attr("fill","none").attr("stroke","#854f0b").attr("stroke-width",1.5).attr("stroke-dasharray","4 3");
g.append("circle").attr("cx",x).attr("cy",y_).attr("r",r).attr("fill",col).attr("fill-opacity",.8).attr("stroke",sel?"#633806":CC[t.c]||"#888").attr("stroke-width",sel?1.5:.8);
if(sel)g.append("text").attr("x",x).attr("y",y_-r-5).attr("text-anchor","middle").attr("font-size",10).attr("fill","#2c2c2a").attr("font-family","Georgia,serif").text(t.t);
});
}
function showTip(tid,mid,h,e){const t=document.getElementById(tid);t.innerHTML=h;t.classList.add("vis");moveTip(tid,mid,e)}
function moveTip(tid,mid,e){const b=document.getElementById(mid).getBoundingClientRect();const t=document.getElementById(tid);let l=e.clientX-b.left+14,tp=e.clientY-b.top-10;if(l+240>b.width)l-=260;if(tp<10)tp=10;t.style.left=l+"px";t.style.top=tp+"px"}
function hideTip(tid){document.getElementById(tid).classList.remove("vis")}
function cpan(c){
if(!c)return`<div class="ndm">Select a city on the map.</div>`;
const s=ST.find(x=>x.ct===c),ts=gct(c),rs=gcrp(c);
const pm={};rs.forEach(r=>{if(!pm[r.np])pm[r.np]={ts:[],pri:r.pri,ns:[],refs:[]};if(!pm[r.np].ts.includes(r.ft))pm[r.np].ts.push(r.ft);if(r.n)pm[r.np].ns.push({t:r.ft,n:r.n});if(r.ref&&!pm[r.np].refs.includes(r.ref))pm[r.np].refs.push(r.ref)});
let h=`<div class="ph"><span class="pt">${c}</span>${s?`<span class="ps">${s.st}</span>`:""}</div>`;
if(s)h+=`<div class="pm">${s.s} \u00b7 ${s.cap.toLocaleString()} capacity \u00b7 ${s.m} matches<br>${s.d}</div>`;
h+=`<div class="sl">Teams ${ii('teamlist')}</div><div class="tc">${ts.map(t=>`<span class="chip"><span class="cd" style="background:${CC[t.c]}"></span>${t.t}<span class="gt">Gr.${t.g}</span></span>`).join("")}</div>`;
const so=Object.entries(pm).sort((a,b)=>(b[1].pri?1:0)-(a[1].pri?1:0));
if(so.length){h+=`<div class="sl">Risk profile ${ii('riskprofile')}</div><div class="rcs">${so.map(([p,d])=>{const ins=INS[p];return`<div class="rc ${d.pri?"pri":""}"><div class="rch"><span class="rcn">${p}</span>${d.pri?'<span class="ptag">PRIORITY</span>':""}</div><div class="rcf">From: ${d.ts.join(", ")}${d.refs.map(u=>refA(u)).join("")}</div>${ins?`<div class="rr"><span class="rl">Import:</span>${rbd(ins.i)}<span class="rl">Outbreak:</span>${rbd(ins.o)}<span class="rl">Endemic:</span>${rbd(ins.e)}</div>`:""}${d.ns.filter(x=>x.n).map(x=>`<div class="rcno">${x.t}: ${x.n}</div>`).join("")}</div>`}).join("")}</div>`}
return h;
}
function tpan(tm){
if(!tm)return`<div class="ndm">Select a team on the map.</div>`;
const td=TMS.find(x=>x.t===tm);if(!td)return"";
const rs=gtr(tm),uc=gusc(td);
let h=`<div class="ph"><span class="pt">${tm}</span><span class="cbdg" style="background:${CC[td.c]}20;color:${CC[td.c]}">${td.c}</span><span class="ps">Group ${td.g}</span></div>`;
h+=`<div class="sl" style="margin-top:10px">US cities ${ii('uscities')}</div><div class="tc">${uc.length?uc.map(c=>`<span class="chip">${c}</span>`).join(""):'<span class="ndm">Non-US venues only</span>'}</div>`;
if(rs.length){h+=`<div class="sl">Surveillance flags ${ii('survflags')}</div><div class="rcs">${rs.sort((a,b)=>(b.pri?1:0)-(a.pri?1:0)).map(r=>{const ins=INS[r.np];return`<div class="rc ${r.pri?"pri":""}"><div class="rch"><span class="rcn">${r.np}</span>${r.pri?'<span class="ptag">PRIORITY</span>':""}<span class="rct">${r.y}</span></div>${ins?`<div class="rr"><span class="rl">Import:</span>${rbd(ins.i)}<span class="rl">Outbreak:</span>${rbd(ins.o)}<span class="rl">Endemic:</span>${rbd(ins.e)}</div>`:""}${r.n?`<div class="rcno">${r.n}${refA(r.ref)}</div>`:r.ref?`<div class="rcno">${refA(r.ref)}</div>`:""}</div>`}).join("")}</div>`}
else h+='<div class="ndm">No active surveillance flags</div>';
return h;
}
function renAssess(){
const priP=PP;const othP=Object.keys(INS).filter(p=>!priP.includes(p)).sort();
let h=`<div class="tab-intro">Threat characterization from the Insight Net modified Delphi process. Priority pathogens were identified by consensus as posing the highest overall risk across importation, outbreak potential, and endemicity in the WC26 context.</div>`;
h+=`<div class="scroll-wrap"><table class="atbl"><thead><tr><th>Pathogen</th><th>Importation ${ii('dim_import')}</th><th>Outbreak impact ${ii('dim_outbreak')}</th><th>Endemicity ${ii('dim_endemic',1)}</th><th>Notes</th></tr></thead><tbody>`;
h+=`<tr class="asep"><td colspan="5">Priority pathogens</td></tr>`;
priP.forEach(p=>{const i=INS[p];if(!i)return;h+=`<tr class="pri-row"><td class="pname">${p} <span class="ptag">PRIORITY</span></td><td>${rbd(i.i)}</td><td>${rbd(i.o)}</td><td>${rbd(i.e)}</td><td class="notes-cell">${i.n||""}</td></tr>`});
h+=`<tr class="asep"><td colspan="5">Other assessed pathogens</td></tr>`;
othP.forEach(p=>{const i=INS[p];if(!i)return;h+=`<tr><td class="pname">${p}</td><td>${rbd(i.i)}</td><td>${rbd(i.o)}</td><td>${rbd(i.e)}</td><td class="notes-cell">${i.n||""}</td></tr>`});
h+=`</tbody></table></div>`;
document.getElementById("v-assess").innerHTML=h;
}
function renMapping(){
const groups=[..."ABCDEFGHIJKL"];
let h=`<div class="tab-intro">Group-stage team assignments to US host cities, with active surveillance flags. Non-US venues (Mexico, Canada) excluded.</div>`;
h+=`<div class="scroll-wrap"><table class="mtbl"><thead><tr><th>Team</th><th>Conf.</th><th>US cities</th><th>Surveillance flags</th></tr></thead><tbody>`;
groups.forEach(g=>{
h+=`<tr class="grp-sep"><td colspan="4">Group ${g}</td></tr>`;
TMS.filter(t=>t.g===g).forEach(t=>{
const uc=gusc(t),rs=gtr(t.t);
h+=`<tr><td class="tname"><span class="cd" style="background:${CC[t.c]};display:inline-block;margin-right:3px"></span>${t.t}</td><td style="font-size:9px;color:var(--tx3)">${t.c}</td><td>${uc.length?uc.map(c=>`<span class="city-tag">${cs(c)}</span>`).join(""):'<span style="font-size:9px;color:var(--tx3);font-style:italic">non-US</span>'}</td><td>${rs.length?rs.map(r=>`<span class="flag-mini ${r.pri?"pri":"std"}">${r.np}</span>`).join(""):'<span style="font-size:9px;color:var(--tx3)">\u2014</span>'}</td></tr>`;
});
});
h+=`</tbody></table></div>`;
document.getElementById("v-map").innerHTML=h;
}
function renAbout(){
document.getElementById("v-about").innerHTML=`<div class="about-wrap">
<h2>Overview</h2>
<p>This dashboard summarizes the infectious disease threat prioritization conducted by the Insight Net ID Cup Collaboration Group for the FIFA 2026 World Cup events in the United States. Using a modified Delphi process, the collaboration assessed a comprehensive list of health conditions identified by public health partners as potential concerns, evaluating each across three risk categories.</p>
<p>The assessment is intended as a decision aid for public health partners to inform preparedness planning and resource allocation. It focuses on <em>excess</em> risk attributable to WC26 travel dynamics, not on whether a disease poses any theoretical risk in general.</p>
<h2>Risk assessment framework</h2>
<p>Each pathogen was assessed across three dimensions:</p>
<ul>
<li><strong>Importation risk.</strong> The extent to which World Cup-associated travel may increase the number of infectious individuals entering the United States, incorporating both relative increase and absolute additional cases compared to baseline. Key considerations include historical travel volume by geographic origin, pathogen prevalence at origins of interest, and likelihood that infected individuals are able to travel.</li>
<li><strong>Public health impact.</strong> The likelihood and scale of transmission and associated public health and healthcare system activity in the event of an importation. Considers mode of transmission, generation interval, basic reproductive number and super-spreading propensity, clinical severity, population susceptibility, and required response intensity.</li>
<li><strong>Endemicity risk.</strong> The potential for an introduced pathogen to become established in the United States with sustained transmission. Considers suitability of environmental and ecological conditions (e.g., competent vectors), overall population immunity, and historical patterns of introduction leading to transmission chains.</li>
</ul>
<p>Ratings use four levels from the Delphi consensus:</p>
<p class="rating-key">${rbd("Negligible")} ${rbd("Some")} ${rbd("Likely")} ${rbd("Uncertain")}</p>
<h2>Priority pathogens</h2>
<p>Six pathogens were identified with the highest overall risk consensus: Dengue, Measles, Mpox Clade I, Norovirus, Novel Respiratory Viruses, and Oropouche. The dashboard highlights these throughout with the <span class="ptag">PRIORITY</span> tag. Additional pathogens are tracked via country-level surveillance flags drawn from WHO, ECDC, PAHO, and national health authority reporting.</p>
<h2>Data sources</h2>
<p>Country-level surveillance flags reflect active disease reporting as of April 2026. Team-to-city assignments follow the official FIFA WC26 group-stage draw. Stadium data covers the 11 US host venues. Reference links on individual surveillance flags point to the original reporting source (WHO, ECDC, PAHO, national health authorities).</p>
<h2>Contributing centers</h2>
<p>The Insight Net ID Cup Collaboration Group includes members from the following centers and institutions:</p>
<div class="about-grid">
<div class="cg-item"><span class="center-name">EPISTORM</span><br><span class="center-inst">Northeastern University</span></div>
<div class="cg-item"><span class="center-name">ACCIDDA</span><br><span class="center-inst">UNC-Chapel Hill, JHU, U. Pittsburgh, U. Florida, NIH</span></div>
<div class="cg-item"><span class="center-name">EpiENGAGE</span><br><span class="center-inst">UT Austin, Northern Arizona U., U. Georgia</span></div>
<div class="cg-item"><span class="center-name">ForeSITE</span><br><span class="center-inst">Washington State U., U. of Utah</span></div>
<div class="cg-item"><span class="center-name">CORI</span><br><span class="center-inst">Johns Hopkins University</span></div>
<div class="cg-item"><span class="center-name">C-CORE</span><br><span class="center-inst">UC Berkeley, Kaiser Permanente</span></div>
<div class="cg-item"><span class="center-name">Resilient Shield</span><br><span class="center-inst">UC San Diego</span></div>
<div class="cg-item"><span class="center-name">CSTE</span><br><span class="center-inst">Council of State and Territorial Epidemiologists</span></div>
<div class="cg-item"><span class="center-name">CDC</span><br><span class="center-inst">Centers for Disease Control and Prevention</span></div>
<div class="cg-item"><span class="center-name">IRS</span><br><span class="center-inst">International Responder Systems</span></div>
<div class="cg-item"><span class="center-name">DOH WA</span><br><span class="center-inst">Washington State Dept. of Health</span></div>
<div class="cg-item"><span class="center-name">CDPH</span><br><span class="center-inst">California Dept. of Public Health</span></div>
</div>
<h2>About this dashboard</h2>
<p>This visualization was developed by the EPISTORM center at Northeastern University as part of the IDCUP 26 planning framework. It is designed for STLT public health partners to quickly identify which US host cities face the most complex epidemiological profiles based on visiting team origins, and to provide a structured reference for the Insight Net Delphi assessment. Future iterations will integrate quantitative importation probability estimates from the GLEAM modeling framework.</p>
</div>`;
}
ren();
</script>
</body>
</html>