@claudinho/core 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,2909 @@
1
+ // src/flags.ts
2
+ var REGIONAL_INDICATOR_A = 127462;
3
+ var TAG_BASE = 917504;
4
+ var TAG_CANCEL = 917631;
5
+ var BLACK_FLAG = 127988;
6
+ var NEUTRAL = "\u{1F3F3}\uFE0F";
7
+ function norm(s) {
8
+ return s.toLowerCase().normalize("NFD").replace(/[̀-ͯ]/g, "").replace(/[^a-z]/g, "");
9
+ }
10
+ function subdivisionFlag(lettersOnly) {
11
+ const tags = [...lettersOnly].map((c) => TAG_BASE + c.charCodeAt(0));
12
+ return String.fromCodePoint(BLACK_FLAG, ...tags, TAG_CANCEL);
13
+ }
14
+ function flagEmoji(region) {
15
+ const r = region.trim();
16
+ if (r.includes("-")) {
17
+ const letters = r.toLowerCase().replace(/-/g, "");
18
+ return subdivisionFlag(letters);
19
+ }
20
+ const cc = r.toUpperCase();
21
+ if (!/^[A-Z]{2}$/.test(cc)) return NEUTRAL;
22
+ return String.fromCodePoint(
23
+ REGIONAL_INDICATOR_A + (cc.charCodeAt(0) - 65),
24
+ REGIONAL_INDICATOR_A + (cc.charCodeAt(1) - 65)
25
+ );
26
+ }
27
+ var NATIONS = [
28
+ ["Mexico", "MX"],
29
+ ["South Africa", "ZA"],
30
+ ["South Korea", "KR"],
31
+ ["Czechia", "CZ"],
32
+ ["Canada", "CA"],
33
+ ["Bosnia-Herzegovina", "BA"],
34
+ ["United States", "US"],
35
+ ["Paraguay", "PY"],
36
+ ["Qatar", "QA"],
37
+ ["Switzerland", "CH"],
38
+ ["Brazil", "BR"],
39
+ ["Morocco", "MA"],
40
+ ["Haiti", "HT"],
41
+ ["Scotland", "GB-SCT"],
42
+ ["Australia", "AU"],
43
+ ["T\xFCrkiye", "TR"],
44
+ ["Germany", "DE"],
45
+ ["Curacao", "CW"],
46
+ ["Netherlands", "NL"],
47
+ ["Japan", "JP"],
48
+ ["Ivory Coast", "CI"],
49
+ ["Ecuador", "EC"],
50
+ ["Sweden", "SE"],
51
+ ["Tunisia", "TN"],
52
+ ["Argentina", "AR"],
53
+ ["France", "FR"],
54
+ ["Spain", "ES"],
55
+ ["Portugal", "PT"],
56
+ ["England", "GB-ENG"],
57
+ ["Wales", "GB-WLS"],
58
+ ["Belgium", "BE"],
59
+ ["Croatia", "HR"],
60
+ ["Uruguay", "UY"],
61
+ ["Colombia", "CO"],
62
+ ["Senegal", "SN"],
63
+ ["Iran", "IR"],
64
+ ["Saudi Arabia", "SA"],
65
+ ["Egypt", "EG"],
66
+ ["Nigeria", "NG"],
67
+ ["Ghana", "GH"],
68
+ ["Cameroon", "CM"],
69
+ ["Algeria", "DZ"],
70
+ ["Norway", "NO"],
71
+ ["Denmark", "DK"],
72
+ ["Austria", "AT"],
73
+ ["Poland", "PL"],
74
+ ["Italy", "IT"],
75
+ ["Serbia", "RS"],
76
+ ["Panama", "PA"],
77
+ ["Costa Rica", "CR"],
78
+ ["Jordan", "JO"],
79
+ ["Uzbekistan", "UZ"],
80
+ ["New Zealand", "NZ"],
81
+ ["Cape Verde", "CV"],
82
+ ["Jamaica", "JM"],
83
+ ["Peru", "PE"],
84
+ ["Chile", "CL"],
85
+ ["Honduras", "HN"],
86
+ ["DR Congo", "CD"],
87
+ ["Mali", "ML"],
88
+ ["Venezuela", "VE"],
89
+ ["Greece", "GR"],
90
+ ["Hungary", "HU"],
91
+ ["Slovenia", "SI"],
92
+ ["Slovakia", "SK"],
93
+ ["Romania", "RO"],
94
+ ["Ukraine", "UA"],
95
+ ["Angola", "AO"],
96
+ ["Benin", "BJ"],
97
+ ["Gabon", "GA"],
98
+ ["Bolivia", "BO"],
99
+ ["Guinea", "GN"],
100
+ ["Burkina Faso", "BF"],
101
+ ["Zambia", "ZM"],
102
+ ["Iraq", "IQ"],
103
+ ["United Arab Emirates", "AE"],
104
+ ["Oman", "OM"],
105
+ ["Bahrain", "BH"],
106
+ ["China", "CN"],
107
+ ["Indonesia", "ID"],
108
+ ["Thailand", "TH"],
109
+ ["Vietnam", "VN"],
110
+ ["India", "IN"],
111
+ ["Russia", "RU"],
112
+ ["Finland", "FI"],
113
+ ["Ireland", "IE"],
114
+ ["Northern Ireland", "GB-NIR"],
115
+ ["Iceland", "IS"],
116
+ ["Albania", "AL"],
117
+ ["Georgia", "GE"],
118
+ ["North Macedonia", "MK"],
119
+ ["Montenegro", "ME"],
120
+ ["Kosovo", "XK"]
121
+ ];
122
+ var ALIASES = [
123
+ ["Turkey", "TR"],
124
+ ["Korea Republic", "KR"],
125
+ ["Republic of Korea", "KR"],
126
+ ["Korea DPR", "KP"],
127
+ ["North Korea", "KP"],
128
+ ["Czech Republic", "CZ"],
129
+ ["Cote d'Ivoire", "CI"],
130
+ ["Cote dIvoire", "CI"],
131
+ ["C\xF4te d\u2019Ivoire", "CI"],
132
+ ["Bosnia and Herzegovina", "BA"],
133
+ ["Bosnia", "BA"],
134
+ ["USA", "US"],
135
+ ["United States of America", "US"],
136
+ ["US", "US"],
137
+ ["Cabo Verde", "CV"],
138
+ ["Congo DR", "CD"],
139
+ ["Democratic Republic of the Congo", "CD"],
140
+ ["IR Iran", "IR"],
141
+ ["Cura\xE7ao", "CW"],
142
+ ["Holland", "NL"],
143
+ ["Republic of Ireland", "IE"],
144
+ ["UAE", "AE"],
145
+ // Names where Intl's English label differs from the common short form.
146
+ ["Hong Kong", "HK"],
147
+ ["Myanmar", "MM"],
148
+ ["Palestine", "PS"],
149
+ ["Burma", "MM"],
150
+ ["Cape Verde", "CV"]
151
+ ];
152
+ var BY_NATION = Object.fromEntries(
153
+ [...NATIONS, ...ALIASES].map(([name, code]) => [norm(name), code])
154
+ );
155
+ var BY_CODE = {
156
+ MEX: "MX",
157
+ RSA: "ZA",
158
+ KOR: "KR",
159
+ CZE: "CZ",
160
+ CAN: "CA",
161
+ BIH: "BA",
162
+ USA: "US",
163
+ PAR: "PY",
164
+ QAT: "QA",
165
+ SUI: "CH",
166
+ BRA: "BR",
167
+ MAR: "MA",
168
+ HAI: "HT",
169
+ SCO: "GB-SCT",
170
+ AUS: "AU",
171
+ TUR: "TR",
172
+ GER: "DE",
173
+ CUW: "CW",
174
+ NED: "NL",
175
+ JPN: "JP",
176
+ CIV: "CI",
177
+ ECU: "EC",
178
+ SWE: "SE",
179
+ TUN: "TN",
180
+ ARG: "AR",
181
+ FRA: "FR",
182
+ ESP: "ES",
183
+ POR: "PT",
184
+ ENG: "GB-ENG",
185
+ WAL: "GB-WLS",
186
+ BEL: "BE",
187
+ CRO: "HR",
188
+ URU: "UY",
189
+ COL: "CO",
190
+ SEN: "SN",
191
+ IRN: "IR",
192
+ KSA: "SA",
193
+ EGY: "EG",
194
+ NGA: "NG",
195
+ GHA: "GH",
196
+ CMR: "CM",
197
+ ALG: "DZ",
198
+ NOR: "NO",
199
+ DEN: "DK",
200
+ AUT: "AT",
201
+ POL: "PL",
202
+ ITA: "IT",
203
+ SRB: "RS",
204
+ PAN: "PA",
205
+ CRC: "CR",
206
+ JOR: "JO",
207
+ UZB: "UZ",
208
+ NZL: "NZ",
209
+ CPV: "CV",
210
+ JAM: "JM",
211
+ PER: "PE",
212
+ CHI: "CL",
213
+ HON: "HN",
214
+ COD: "CD",
215
+ MLI: "ML"
216
+ };
217
+ function nationToFlag(nameOrCode) {
218
+ const region = nationToRegion(nameOrCode);
219
+ return region ? flagEmoji(region) : NEUTRAL;
220
+ }
221
+ var INTL_BY_NAME;
222
+ function intlNameMap() {
223
+ if (INTL_BY_NAME) return INTL_BY_NAME;
224
+ const map = {};
225
+ try {
226
+ const dn = new Intl.DisplayNames(["en"], { type: "region" });
227
+ for (let a = 65; a <= 90; a++) {
228
+ for (let b = 65; b <= 90; b++) {
229
+ const code = String.fromCharCode(a, b);
230
+ let name;
231
+ try {
232
+ name = dn.of(code);
233
+ } catch {
234
+ name = void 0;
235
+ }
236
+ if (name && name !== code) {
237
+ const key = norm(name);
238
+ if (!(key in map)) map[key] = code;
239
+ }
240
+ }
241
+ }
242
+ } catch {
243
+ }
244
+ INTL_BY_NAME = map;
245
+ return map;
246
+ }
247
+ function nationToRegion(nameOrCode) {
248
+ if (!nameOrCode) return void 0;
249
+ const byName = BY_NATION[norm(nameOrCode)];
250
+ if (byName) return byName;
251
+ const byCode = BY_CODE[nameOrCode.trim().toUpperCase()];
252
+ if (byCode) return byCode;
253
+ return intlNameMap()[norm(nameOrCode)];
254
+ }
255
+
256
+ // src/validate.ts
257
+ function isValidTimeZone(tz) {
258
+ if (!tz) return false;
259
+ try {
260
+ new Intl.DateTimeFormat("en", { timeZone: tz });
261
+ return true;
262
+ } catch {
263
+ return false;
264
+ }
265
+ }
266
+ function isValidDate(s) {
267
+ if (!s || !/^\d{4}-\d{2}-\d{2}$/.test(s)) return false;
268
+ const d = /* @__PURE__ */ new Date(`${s}T00:00:00Z`);
269
+ if (Number.isNaN(d.getTime())) return false;
270
+ return d.toISOString().slice(0, 10) === s;
271
+ }
272
+
273
+ // src/time.ts
274
+ function envTz() {
275
+ if (typeof process !== "undefined" && process.env && process.env.CLAUDINHO_TZ) {
276
+ return process.env.CLAUDINHO_TZ;
277
+ }
278
+ return void 0;
279
+ }
280
+ function systemTz() {
281
+ try {
282
+ return Intl.DateTimeFormat().resolvedOptions().timeZone;
283
+ } catch {
284
+ return void 0;
285
+ }
286
+ }
287
+ function resolveTz(explicit) {
288
+ if (explicit && isValidTimeZone(explicit)) return explicit;
289
+ const fromEnv = envTz();
290
+ if (fromEnv && isValidTimeZone(fromEnv)) return fromEnv;
291
+ return systemTz();
292
+ }
293
+ function safeLocale(locale) {
294
+ if (!locale) return "en";
295
+ try {
296
+ Intl.getCanonicalLocales(locale);
297
+ return locale;
298
+ } catch {
299
+ return "en";
300
+ }
301
+ }
302
+ function formatKickoff(iso, opts = {}) {
303
+ const tz = resolveTz(opts.tz);
304
+ const locale = safeLocale(opts.locale);
305
+ return new Intl.DateTimeFormat(locale, {
306
+ weekday: "short",
307
+ hour: "2-digit",
308
+ minute: "2-digit",
309
+ hour12: false,
310
+ timeZone: tz
311
+ }).format(new Date(iso));
312
+ }
313
+ function countdown(iso, from = /* @__PURE__ */ new Date()) {
314
+ const ms = new Date(iso).getTime() - from.getTime();
315
+ if (ms <= 0) return "now";
316
+ const totalMin = Math.floor(ms / 6e4);
317
+ const days = Math.floor(totalMin / 1440);
318
+ const hours = Math.floor(totalMin % 1440 / 60);
319
+ const mins = totalMin % 60;
320
+ if (days > 0) return `${days}d${hours}h`;
321
+ if (hours > 0) return `${hours}h${mins}m`;
322
+ return `${mins}m`;
323
+ }
324
+ function localDate(iso, tz) {
325
+ const zone = resolveTz(tz);
326
+ return new Intl.DateTimeFormat("en-CA", {
327
+ year: "numeric",
328
+ month: "2-digit",
329
+ day: "2-digit",
330
+ timeZone: zone
331
+ }).format(new Date(iso));
332
+ }
333
+
334
+ // src/normalize.ts
335
+ function outcomeFromScore(home, away) {
336
+ if (home > away) return "H";
337
+ if (home < away) return "A";
338
+ return "D";
339
+ }
340
+ function isLive(status) {
341
+ return status === "LIVE" || status === "HT";
342
+ }
343
+ function isFinished(status) {
344
+ return status === "FT";
345
+ }
346
+ function scoreline(match) {
347
+ if (!match.score) return "vs";
348
+ return `${match.score.home}\u2013${match.score.away}`;
349
+ }
350
+ function matchLocation(match) {
351
+ return [match.venue, match.city, match.country].filter(Boolean).join(", ");
352
+ }
353
+ function byKickoff(a, b) {
354
+ return a.kickoff.localeCompare(b.kickoff);
355
+ }
356
+
357
+ // src/flavor.ts
358
+ var FLAVOR_LEVELS = ["off", "subtle", "full"];
359
+ var DEFAULT_FLAVOR = "full";
360
+ function isFlavorLevel(s) {
361
+ return FLAVOR_LEVELS.includes(s);
362
+ }
363
+ function asFlavorLevel(s) {
364
+ return s && isFlavorLevel(s) ? s : DEFAULT_FLAVOR;
365
+ }
366
+ var BANKS = {
367
+ en: {
368
+ scheduled: ["the big one is coming!", "mark your calendar!", "football is in the air!"],
369
+ live: ["the tension is electric!", "eyes glued to the pitch!", "anything can happen!"],
370
+ goal: ["GOOOAL!", "what a strike!", "the stadium erupts!", "they buried it!"],
371
+ ft: ["the final whistle blows!", "it's all over!", "into the history books!"]
372
+ },
373
+ es: {
374
+ scheduled: ["\xA1se viene el partidazo!", "\xA1huele a f\xFAtbol!", "\xA1a cancha llena!"],
375
+ live: ["\xA1est\xE1 que arde!", "\xA1vibra el estadio!", "\xA1no despeguen los ojos!"],
376
+ goal: ["\xA1GOOOOL!", "\xA1qu\xE9 golazo!", "\xA1para callar bocas!", "\xA1se cae el estadio!"],
377
+ ft: ["\xA1suena el silbatazo final!", "\xA1se acab\xF3, se\xF1ores!", "\xA1a los libros de historia!"]
378
+ },
379
+ pt: {
380
+ scheduled: ["vem jog\xE3o por a\xED!", "cheira a futebol!", "est\xE1dio lotado!"],
381
+ live: ["est\xE1 pegando fogo!", "o est\xE1dio ferve!", "n\xE3o tire os olhos!"],
382
+ goal: ["GOOOL!", "que gola\xE7o!", "pra calar a boca!", "o est\xE1dio explode!"],
383
+ ft: ["apita o juiz, acabou!", "fim de jogo, senhores!", "pros livros de hist\xF3ria!"]
384
+ },
385
+ fr: {
386
+ scheduled: ["\xE7a promet, le grand match arrive !", "\xE7a sent le football !", "stade plein !"],
387
+ live: ["c'est bouillant !", "le stade vibre !", "ne quittez pas des yeux !"],
388
+ goal: ["BUUUT !", "quelle frappe !", "le stade explose !", "imparable !"],
389
+ ft: ["coup de sifflet final !", "c'est termin\xE9 !", "dans les livres d'histoire !"]
390
+ }
391
+ };
392
+ var LEVEL_MOMENTS = {
393
+ off: /* @__PURE__ */ new Set(),
394
+ subtle: /* @__PURE__ */ new Set(["goal", "ft"]),
395
+ full: /* @__PURE__ */ new Set(["scheduled", "live", "goal", "ft"])
396
+ };
397
+ function pick(id, bank) {
398
+ let h = 0;
399
+ for (let i = 0; i < id.length; i++) h = h * 31 + id.charCodeAt(i) >>> 0;
400
+ return bank.length ? bank[h % bank.length] : "";
401
+ }
402
+ function momentOf(m) {
403
+ switch (m.status) {
404
+ case "LIVE":
405
+ case "HT": {
406
+ const goals = (m.score?.home ?? 0) + (m.score?.away ?? 0);
407
+ return goals > 0 ? "goal" : "live";
408
+ }
409
+ case "FT":
410
+ return "ft";
411
+ case "SCHEDULED":
412
+ return "scheduled";
413
+ default:
414
+ return void 0;
415
+ }
416
+ }
417
+ function matchFlavor(m, opts = {}) {
418
+ const level = opts.level ?? DEFAULT_FLAVOR;
419
+ if (level === "off") return "";
420
+ const moment = momentOf(m);
421
+ if (!moment || !LEVEL_MOMENTS[level].has(moment)) return "";
422
+ const lang = (opts.locale ?? "en").slice(0, 2);
423
+ const langBank = BANKS[lang] ?? BANKS.en;
424
+ return langBank ? pick(m.id, langBank[moment]) : "";
425
+ }
426
+
427
+ // src/data/schedule.2026.json
428
+ var schedule_2026_default = [
429
+ {
430
+ id: "760415",
431
+ stage: "GROUP",
432
+ group: "A",
433
+ kickoff: "2026-06-11T19:00Z",
434
+ venue: "Estadio Banorte",
435
+ city: "Mexico City",
436
+ country: "Mexico",
437
+ home: {
438
+ code: "MEX",
439
+ name: "Mexico",
440
+ flag: "\u{1F1F2}\u{1F1FD}"
441
+ },
442
+ away: {
443
+ code: "RSA",
444
+ name: "South Africa",
445
+ flag: "\u{1F1FF}\u{1F1E6}"
446
+ },
447
+ status: "SCHEDULED",
448
+ updatedAt: "2026-06-07T07:52:54.333Z"
449
+ },
450
+ {
451
+ id: "760414",
452
+ stage: "GROUP",
453
+ group: "A",
454
+ kickoff: "2026-06-12T02:00Z",
455
+ venue: "Estadio Akron",
456
+ city: "Guadalajara",
457
+ country: "Mexico",
458
+ home: {
459
+ code: "KOR",
460
+ name: "South Korea",
461
+ flag: "\u{1F1F0}\u{1F1F7}"
462
+ },
463
+ away: {
464
+ code: "CZE",
465
+ name: "Czechia",
466
+ flag: "\u{1F1E8}\u{1F1FF}"
467
+ },
468
+ status: "SCHEDULED",
469
+ updatedAt: "2026-06-07T07:52:54.337Z"
470
+ },
471
+ {
472
+ id: "760416",
473
+ stage: "GROUP",
474
+ group: "B",
475
+ kickoff: "2026-06-12T19:00Z",
476
+ venue: "BMO Field",
477
+ city: "Toronto",
478
+ country: "Canada",
479
+ home: {
480
+ code: "CAN",
481
+ name: "Canada",
482
+ flag: "\u{1F1E8}\u{1F1E6}"
483
+ },
484
+ away: {
485
+ code: "BIH",
486
+ name: "Bosnia-Herzegovina",
487
+ flag: "\u{1F1E7}\u{1F1E6}"
488
+ },
489
+ status: "SCHEDULED",
490
+ updatedAt: "2026-06-07T07:52:54.337Z"
491
+ },
492
+ {
493
+ id: "760417",
494
+ stage: "GROUP",
495
+ group: "D",
496
+ kickoff: "2026-06-13T01:00Z",
497
+ venue: "SoFi Stadium",
498
+ city: "Inglewood, California",
499
+ country: "USA",
500
+ home: {
501
+ code: "USA",
502
+ name: "United States",
503
+ flag: "\u{1F1FA}\u{1F1F8}"
504
+ },
505
+ away: {
506
+ code: "PAR",
507
+ name: "Paraguay",
508
+ flag: "\u{1F1F5}\u{1F1FE}"
509
+ },
510
+ status: "SCHEDULED",
511
+ updatedAt: "2026-06-07T07:52:54.337Z"
512
+ },
513
+ {
514
+ id: "760420",
515
+ stage: "GROUP",
516
+ group: "B",
517
+ kickoff: "2026-06-13T19:00Z",
518
+ venue: "Levi's Stadium",
519
+ city: "Santa Clara, California",
520
+ country: "USA",
521
+ home: {
522
+ code: "QAT",
523
+ name: "Qatar",
524
+ flag: "\u{1F1F6}\u{1F1E6}"
525
+ },
526
+ away: {
527
+ code: "SUI",
528
+ name: "Switzerland",
529
+ flag: "\u{1F1E8}\u{1F1ED}"
530
+ },
531
+ status: "SCHEDULED",
532
+ updatedAt: "2026-06-07T07:52:54.337Z"
533
+ },
534
+ {
535
+ id: "760419",
536
+ stage: "GROUP",
537
+ group: "C",
538
+ kickoff: "2026-06-13T22:00Z",
539
+ venue: "MetLife Stadium",
540
+ city: "East Rutherford, New Jersey",
541
+ country: "USA",
542
+ home: {
543
+ code: "BRA",
544
+ name: "Brazil",
545
+ flag: "\u{1F1E7}\u{1F1F7}"
546
+ },
547
+ away: {
548
+ code: "MAR",
549
+ name: "Morocco",
550
+ flag: "\u{1F1F2}\u{1F1E6}"
551
+ },
552
+ status: "SCHEDULED",
553
+ updatedAt: "2026-06-07T07:52:54.337Z"
554
+ },
555
+ {
556
+ id: "760418",
557
+ stage: "GROUP",
558
+ group: "C",
559
+ kickoff: "2026-06-14T01:00Z",
560
+ venue: "Gillette Stadium",
561
+ city: "Foxborough, Massachusetts",
562
+ country: "USA",
563
+ home: {
564
+ code: "HAI",
565
+ name: "Haiti",
566
+ flag: "\u{1F1ED}\u{1F1F9}"
567
+ },
568
+ away: {
569
+ code: "SCO",
570
+ name: "Scotland",
571
+ flag: "\u{1F3F4}\u{E0067}\u{E0062}\u{E0073}\u{E0063}\u{E0074}\u{E007F}"
572
+ },
573
+ status: "SCHEDULED",
574
+ updatedAt: "2026-06-07T07:52:54.337Z"
575
+ },
576
+ {
577
+ id: "760421",
578
+ stage: "GROUP",
579
+ group: "D",
580
+ kickoff: "2026-06-14T04:00Z",
581
+ venue: "BC Place",
582
+ city: "Vancouver",
583
+ country: "Canada",
584
+ home: {
585
+ code: "AUS",
586
+ name: "Australia",
587
+ flag: "\u{1F1E6}\u{1F1FA}"
588
+ },
589
+ away: {
590
+ code: "TUR",
591
+ name: "T\xFCrkiye",
592
+ flag: "\u{1F1F9}\u{1F1F7}"
593
+ },
594
+ status: "SCHEDULED",
595
+ updatedAt: "2026-06-07T07:52:54.337Z"
596
+ },
597
+ {
598
+ id: "760422",
599
+ stage: "GROUP",
600
+ group: "E",
601
+ kickoff: "2026-06-14T17:00Z",
602
+ venue: "NRG Stadium",
603
+ city: "Houston, Texas",
604
+ country: "USA",
605
+ home: {
606
+ code: "GER",
607
+ name: "Germany",
608
+ flag: "\u{1F1E9}\u{1F1EA}"
609
+ },
610
+ away: {
611
+ code: "CUW",
612
+ name: "Cura\xE7ao",
613
+ flag: "\u{1F1E8}\u{1F1FC}"
614
+ },
615
+ status: "SCHEDULED",
616
+ updatedAt: "2026-06-07T07:52:54.337Z"
617
+ },
618
+ {
619
+ id: "760425",
620
+ stage: "GROUP",
621
+ group: "F",
622
+ kickoff: "2026-06-14T20:00Z",
623
+ venue: "AT&T Stadium",
624
+ city: "Arlington, Texas",
625
+ country: "USA",
626
+ home: {
627
+ code: "NED",
628
+ name: "Netherlands",
629
+ flag: "\u{1F1F3}\u{1F1F1}"
630
+ },
631
+ away: {
632
+ code: "JPN",
633
+ name: "Japan",
634
+ flag: "\u{1F1EF}\u{1F1F5}"
635
+ },
636
+ status: "SCHEDULED",
637
+ updatedAt: "2026-06-07T07:52:54.337Z"
638
+ },
639
+ {
640
+ id: "760423",
641
+ stage: "GROUP",
642
+ group: "E",
643
+ kickoff: "2026-06-14T23:00Z",
644
+ venue: "Lincoln Financial Field",
645
+ city: "Philadelphia, Pennsylvania",
646
+ country: "USA",
647
+ home: {
648
+ code: "CIV",
649
+ name: "Ivory Coast",
650
+ flag: "\u{1F1E8}\u{1F1EE}"
651
+ },
652
+ away: {
653
+ code: "ECU",
654
+ name: "Ecuador",
655
+ flag: "\u{1F1EA}\u{1F1E8}"
656
+ },
657
+ status: "SCHEDULED",
658
+ updatedAt: "2026-06-07T07:52:54.337Z"
659
+ },
660
+ {
661
+ id: "760424",
662
+ stage: "GROUP",
663
+ group: "F",
664
+ kickoff: "2026-06-15T02:00Z",
665
+ venue: "Estadio BBVA",
666
+ city: "Guadalupe",
667
+ country: "Mexico",
668
+ home: {
669
+ code: "SWE",
670
+ name: "Sweden",
671
+ flag: "\u{1F1F8}\u{1F1EA}"
672
+ },
673
+ away: {
674
+ code: "TUN",
675
+ name: "Tunisia",
676
+ flag: "\u{1F1F9}\u{1F1F3}"
677
+ },
678
+ status: "SCHEDULED",
679
+ updatedAt: "2026-06-07T07:52:54.337Z"
680
+ },
681
+ {
682
+ id: "760428",
683
+ stage: "GROUP",
684
+ group: "H",
685
+ kickoff: "2026-06-15T16:00Z",
686
+ venue: "Mercedes-Benz Stadium",
687
+ city: "Atlanta, Georgia",
688
+ country: "USA",
689
+ home: {
690
+ code: "ESP",
691
+ name: "Spain",
692
+ flag: "\u{1F1EA}\u{1F1F8}"
693
+ },
694
+ away: {
695
+ code: "CPV",
696
+ name: "Cape Verde",
697
+ flag: "\u{1F1E8}\u{1F1FB}"
698
+ },
699
+ status: "SCHEDULED",
700
+ updatedAt: "2026-06-07T07:52:54.337Z"
701
+ },
702
+ {
703
+ id: "760426",
704
+ stage: "GROUP",
705
+ group: "G",
706
+ kickoff: "2026-06-15T19:00Z",
707
+ venue: "Lumen Field",
708
+ city: "Seattle, Washington",
709
+ country: "USA",
710
+ home: {
711
+ code: "BEL",
712
+ name: "Belgium",
713
+ flag: "\u{1F1E7}\u{1F1EA}"
714
+ },
715
+ away: {
716
+ code: "EGY",
717
+ name: "Egypt",
718
+ flag: "\u{1F1EA}\u{1F1EC}"
719
+ },
720
+ status: "SCHEDULED",
721
+ updatedAt: "2026-06-07T07:52:54.337Z"
722
+ },
723
+ {
724
+ id: "760429",
725
+ stage: "GROUP",
726
+ group: "H",
727
+ kickoff: "2026-06-15T22:00Z",
728
+ venue: "Hard Rock Stadium",
729
+ city: "Miami Gardens, Florida",
730
+ country: "USA",
731
+ home: {
732
+ code: "KSA",
733
+ name: "Saudi Arabia",
734
+ flag: "\u{1F1F8}\u{1F1E6}"
735
+ },
736
+ away: {
737
+ code: "URU",
738
+ name: "Uruguay",
739
+ flag: "\u{1F1FA}\u{1F1FE}"
740
+ },
741
+ status: "SCHEDULED",
742
+ updatedAt: "2026-06-07T07:52:54.337Z"
743
+ },
744
+ {
745
+ id: "760427",
746
+ stage: "GROUP",
747
+ group: "G",
748
+ kickoff: "2026-06-16T01:00Z",
749
+ venue: "SoFi Stadium",
750
+ city: "Inglewood, California",
751
+ country: "USA",
752
+ home: {
753
+ code: "IRN",
754
+ name: "Iran",
755
+ flag: "\u{1F1EE}\u{1F1F7}"
756
+ },
757
+ away: {
758
+ code: "NZL",
759
+ name: "New Zealand",
760
+ flag: "\u{1F1F3}\u{1F1FF}"
761
+ },
762
+ status: "SCHEDULED",
763
+ updatedAt: "2026-06-07T07:52:54.337Z"
764
+ },
765
+ {
766
+ id: "760432",
767
+ stage: "GROUP",
768
+ group: "I",
769
+ kickoff: "2026-06-16T19:00Z",
770
+ venue: "MetLife Stadium",
771
+ city: "East Rutherford, New Jersey",
772
+ country: "USA",
773
+ home: {
774
+ code: "FRA",
775
+ name: "France",
776
+ flag: "\u{1F1EB}\u{1F1F7}"
777
+ },
778
+ away: {
779
+ code: "SEN",
780
+ name: "Senegal",
781
+ flag: "\u{1F1F8}\u{1F1F3}"
782
+ },
783
+ status: "SCHEDULED",
784
+ updatedAt: "2026-06-07T07:52:54.337Z"
785
+ },
786
+ {
787
+ id: "760430",
788
+ stage: "GROUP",
789
+ group: "I",
790
+ kickoff: "2026-06-16T22:00Z",
791
+ venue: "Gillette Stadium",
792
+ city: "Foxborough, Massachusetts",
793
+ country: "USA",
794
+ home: {
795
+ code: "IRQ",
796
+ name: "Iraq",
797
+ flag: "\u{1F1EE}\u{1F1F6}"
798
+ },
799
+ away: {
800
+ code: "NOR",
801
+ name: "Norway",
802
+ flag: "\u{1F1F3}\u{1F1F4}"
803
+ },
804
+ status: "SCHEDULED",
805
+ updatedAt: "2026-06-07T07:52:54.337Z"
806
+ },
807
+ {
808
+ id: "760433",
809
+ stage: "GROUP",
810
+ group: "J",
811
+ kickoff: "2026-06-17T01:00Z",
812
+ venue: "GEHA Field at Arrowhead Stadium",
813
+ city: "Kansas City, Missouri",
814
+ country: "USA",
815
+ home: {
816
+ code: "ARG",
817
+ name: "Argentina",
818
+ flag: "\u{1F1E6}\u{1F1F7}"
819
+ },
820
+ away: {
821
+ code: "ALG",
822
+ name: "Algeria",
823
+ flag: "\u{1F1E9}\u{1F1FF}"
824
+ },
825
+ status: "SCHEDULED",
826
+ updatedAt: "2026-06-07T07:52:54.337Z"
827
+ },
828
+ {
829
+ id: "760431",
830
+ stage: "GROUP",
831
+ group: "J",
832
+ kickoff: "2026-06-17T04:00Z",
833
+ venue: "Levi's Stadium",
834
+ city: "Santa Clara, California",
835
+ country: "USA",
836
+ home: {
837
+ code: "AUT",
838
+ name: "Austria",
839
+ flag: "\u{1F1E6}\u{1F1F9}"
840
+ },
841
+ away: {
842
+ code: "JOR",
843
+ name: "Jordan",
844
+ flag: "\u{1F1EF}\u{1F1F4}"
845
+ },
846
+ status: "SCHEDULED",
847
+ updatedAt: "2026-06-07T07:52:54.337Z"
848
+ },
849
+ {
850
+ id: "760435",
851
+ stage: "GROUP",
852
+ group: "K",
853
+ kickoff: "2026-06-17T17:00Z",
854
+ venue: "NRG Stadium",
855
+ city: "Houston, Texas",
856
+ country: "USA",
857
+ home: {
858
+ code: "POR",
859
+ name: "Portugal",
860
+ flag: "\u{1F1F5}\u{1F1F9}"
861
+ },
862
+ away: {
863
+ code: "COD",
864
+ name: "Congo DR",
865
+ flag: "\u{1F1E8}\u{1F1E9}"
866
+ },
867
+ status: "SCHEDULED",
868
+ updatedAt: "2026-06-07T07:52:54.337Z"
869
+ },
870
+ {
871
+ id: "760437",
872
+ stage: "GROUP",
873
+ group: "L",
874
+ kickoff: "2026-06-17T20:00Z",
875
+ venue: "AT&T Stadium",
876
+ city: "Arlington, Texas",
877
+ country: "USA",
878
+ home: {
879
+ code: "ENG",
880
+ name: "England",
881
+ flag: "\u{1F3F4}\u{E0067}\u{E0062}\u{E0065}\u{E006E}\u{E0067}\u{E007F}"
882
+ },
883
+ away: {
884
+ code: "CRO",
885
+ name: "Croatia",
886
+ flag: "\u{1F1ED}\u{1F1F7}"
887
+ },
888
+ status: "SCHEDULED",
889
+ updatedAt: "2026-06-07T07:52:54.337Z"
890
+ },
891
+ {
892
+ id: "760434",
893
+ stage: "GROUP",
894
+ group: "L",
895
+ kickoff: "2026-06-17T23:00Z",
896
+ venue: "BMO Field",
897
+ city: "Toronto",
898
+ country: "Canada",
899
+ home: {
900
+ code: "GHA",
901
+ name: "Ghana",
902
+ flag: "\u{1F1EC}\u{1F1ED}"
903
+ },
904
+ away: {
905
+ code: "PAN",
906
+ name: "Panama",
907
+ flag: "\u{1F1F5}\u{1F1E6}"
908
+ },
909
+ status: "SCHEDULED",
910
+ updatedAt: "2026-06-07T07:52:54.337Z"
911
+ },
912
+ {
913
+ id: "760436",
914
+ stage: "GROUP",
915
+ group: "K",
916
+ kickoff: "2026-06-18T02:00Z",
917
+ venue: "Estadio Banorte",
918
+ city: "Mexico City",
919
+ country: "Mexico",
920
+ home: {
921
+ code: "UZB",
922
+ name: "Uzbekistan",
923
+ flag: "\u{1F1FA}\u{1F1FF}"
924
+ },
925
+ away: {
926
+ code: "COL",
927
+ name: "Colombia",
928
+ flag: "\u{1F1E8}\u{1F1F4}"
929
+ },
930
+ status: "SCHEDULED",
931
+ updatedAt: "2026-06-07T07:52:54.337Z"
932
+ },
933
+ {
934
+ id: "760438",
935
+ stage: "GROUP",
936
+ group: "A",
937
+ kickoff: "2026-06-18T16:00Z",
938
+ venue: "Mercedes-Benz Stadium",
939
+ city: "Atlanta, Georgia",
940
+ country: "USA",
941
+ home: {
942
+ code: "CZE",
943
+ name: "Czechia",
944
+ flag: "\u{1F1E8}\u{1F1FF}"
945
+ },
946
+ away: {
947
+ code: "RSA",
948
+ name: "South Africa",
949
+ flag: "\u{1F1FF}\u{1F1E6}"
950
+ },
951
+ status: "SCHEDULED",
952
+ updatedAt: "2026-06-07T07:52:54.418Z"
953
+ },
954
+ {
955
+ id: "760439",
956
+ stage: "GROUP",
957
+ group: "B",
958
+ kickoff: "2026-06-18T19:00Z",
959
+ venue: "SoFi Stadium",
960
+ city: "Inglewood, California",
961
+ country: "USA",
962
+ home: {
963
+ code: "SUI",
964
+ name: "Switzerland",
965
+ flag: "\u{1F1E8}\u{1F1ED}"
966
+ },
967
+ away: {
968
+ code: "BIH",
969
+ name: "Bosnia-Herzegovina",
970
+ flag: "\u{1F1E7}\u{1F1E6}"
971
+ },
972
+ status: "SCHEDULED",
973
+ updatedAt: "2026-06-07T07:52:54.418Z"
974
+ },
975
+ {
976
+ id: "760440",
977
+ stage: "GROUP",
978
+ group: "B",
979
+ kickoff: "2026-06-18T22:00Z",
980
+ venue: "BC Place",
981
+ city: "Vancouver",
982
+ country: "Canada",
983
+ home: {
984
+ code: "CAN",
985
+ name: "Canada",
986
+ flag: "\u{1F1E8}\u{1F1E6}"
987
+ },
988
+ away: {
989
+ code: "QAT",
990
+ name: "Qatar",
991
+ flag: "\u{1F1F6}\u{1F1E6}"
992
+ },
993
+ status: "SCHEDULED",
994
+ updatedAt: "2026-06-07T07:52:54.418Z"
995
+ },
996
+ {
997
+ id: "760441",
998
+ stage: "GROUP",
999
+ group: "A",
1000
+ kickoff: "2026-06-19T01:00Z",
1001
+ venue: "Estadio Akron",
1002
+ city: "Guadalajara",
1003
+ country: "Mexico",
1004
+ home: {
1005
+ code: "MEX",
1006
+ name: "Mexico",
1007
+ flag: "\u{1F1F2}\u{1F1FD}"
1008
+ },
1009
+ away: {
1010
+ code: "KOR",
1011
+ name: "South Korea",
1012
+ flag: "\u{1F1F0}\u{1F1F7}"
1013
+ },
1014
+ status: "SCHEDULED",
1015
+ updatedAt: "2026-06-07T07:52:54.418Z"
1016
+ },
1017
+ {
1018
+ id: "760442",
1019
+ stage: "GROUP",
1020
+ group: "D",
1021
+ kickoff: "2026-06-19T19:00Z",
1022
+ venue: "Lumen Field",
1023
+ city: "Seattle, Washington",
1024
+ country: "USA",
1025
+ home: {
1026
+ code: "USA",
1027
+ name: "United States",
1028
+ flag: "\u{1F1FA}\u{1F1F8}"
1029
+ },
1030
+ away: {
1031
+ code: "AUS",
1032
+ name: "Australia",
1033
+ flag: "\u{1F1E6}\u{1F1FA}"
1034
+ },
1035
+ status: "SCHEDULED",
1036
+ updatedAt: "2026-06-07T07:52:54.418Z"
1037
+ },
1038
+ {
1039
+ id: "760445",
1040
+ stage: "GROUP",
1041
+ group: "C",
1042
+ kickoff: "2026-06-19T22:00Z",
1043
+ venue: "Gillette Stadium",
1044
+ city: "Foxborough, Massachusetts",
1045
+ country: "USA",
1046
+ home: {
1047
+ code: "SCO",
1048
+ name: "Scotland",
1049
+ flag: "\u{1F3F4}\u{E0067}\u{E0062}\u{E0073}\u{E0063}\u{E0074}\u{E007F}"
1050
+ },
1051
+ away: {
1052
+ code: "MAR",
1053
+ name: "Morocco",
1054
+ flag: "\u{1F1F2}\u{1F1E6}"
1055
+ },
1056
+ status: "SCHEDULED",
1057
+ updatedAt: "2026-06-07T07:52:54.418Z"
1058
+ },
1059
+ {
1060
+ id: "760444",
1061
+ stage: "GROUP",
1062
+ group: "C",
1063
+ kickoff: "2026-06-20T00:30Z",
1064
+ venue: "Lincoln Financial Field",
1065
+ city: "Philadelphia, Pennsylvania",
1066
+ country: "USA",
1067
+ home: {
1068
+ code: "BRA",
1069
+ name: "Brazil",
1070
+ flag: "\u{1F1E7}\u{1F1F7}"
1071
+ },
1072
+ away: {
1073
+ code: "HAI",
1074
+ name: "Haiti",
1075
+ flag: "\u{1F1ED}\u{1F1F9}"
1076
+ },
1077
+ status: "SCHEDULED",
1078
+ updatedAt: "2026-06-07T07:52:54.418Z"
1079
+ },
1080
+ {
1081
+ id: "760443",
1082
+ stage: "GROUP",
1083
+ group: "D",
1084
+ kickoff: "2026-06-20T03:00Z",
1085
+ venue: "Levi's Stadium",
1086
+ city: "Santa Clara, California",
1087
+ country: "USA",
1088
+ home: {
1089
+ code: "TUR",
1090
+ name: "T\xFCrkiye",
1091
+ flag: "\u{1F1F9}\u{1F1F7}"
1092
+ },
1093
+ away: {
1094
+ code: "PAR",
1095
+ name: "Paraguay",
1096
+ flag: "\u{1F1F5}\u{1F1FE}"
1097
+ },
1098
+ status: "SCHEDULED",
1099
+ updatedAt: "2026-06-07T07:52:54.418Z"
1100
+ },
1101
+ {
1102
+ id: "760447",
1103
+ stage: "GROUP",
1104
+ group: "F",
1105
+ kickoff: "2026-06-20T17:00Z",
1106
+ venue: "NRG Stadium",
1107
+ city: "Houston, Texas",
1108
+ country: "USA",
1109
+ home: {
1110
+ code: "NED",
1111
+ name: "Netherlands",
1112
+ flag: "\u{1F1F3}\u{1F1F1}"
1113
+ },
1114
+ away: {
1115
+ code: "SWE",
1116
+ name: "Sweden",
1117
+ flag: "\u{1F1F8}\u{1F1EA}"
1118
+ },
1119
+ status: "SCHEDULED",
1120
+ updatedAt: "2026-06-07T07:52:54.418Z"
1121
+ },
1122
+ {
1123
+ id: "760448",
1124
+ stage: "GROUP",
1125
+ group: "E",
1126
+ kickoff: "2026-06-20T20:00Z",
1127
+ venue: "BMO Field",
1128
+ city: "Toronto",
1129
+ country: "Canada",
1130
+ home: {
1131
+ code: "GER",
1132
+ name: "Germany",
1133
+ flag: "\u{1F1E9}\u{1F1EA}"
1134
+ },
1135
+ away: {
1136
+ code: "CIV",
1137
+ name: "Ivory Coast",
1138
+ flag: "\u{1F1E8}\u{1F1EE}"
1139
+ },
1140
+ status: "SCHEDULED",
1141
+ updatedAt: "2026-06-07T07:52:54.418Z"
1142
+ },
1143
+ {
1144
+ id: "760446",
1145
+ stage: "GROUP",
1146
+ group: "E",
1147
+ kickoff: "2026-06-21T00:00Z",
1148
+ venue: "GEHA Field at Arrowhead Stadium",
1149
+ city: "Kansas City, Missouri",
1150
+ country: "USA",
1151
+ home: {
1152
+ code: "ECU",
1153
+ name: "Ecuador",
1154
+ flag: "\u{1F1EA}\u{1F1E8}"
1155
+ },
1156
+ away: {
1157
+ code: "CUW",
1158
+ name: "Cura\xE7ao",
1159
+ flag: "\u{1F1E8}\u{1F1FC}"
1160
+ },
1161
+ status: "SCHEDULED",
1162
+ updatedAt: "2026-06-07T07:52:54.418Z"
1163
+ },
1164
+ {
1165
+ id: "760449",
1166
+ stage: "GROUP",
1167
+ group: "F",
1168
+ kickoff: "2026-06-21T04:00Z",
1169
+ venue: "Estadio BBVA",
1170
+ city: "Guadalupe",
1171
+ country: "Mexico",
1172
+ home: {
1173
+ code: "TUN",
1174
+ name: "Tunisia",
1175
+ flag: "\u{1F1F9}\u{1F1F3}"
1176
+ },
1177
+ away: {
1178
+ code: "JPN",
1179
+ name: "Japan",
1180
+ flag: "\u{1F1EF}\u{1F1F5}"
1181
+ },
1182
+ status: "SCHEDULED",
1183
+ updatedAt: "2026-06-07T07:52:54.418Z"
1184
+ },
1185
+ {
1186
+ id: "760453",
1187
+ stage: "GROUP",
1188
+ group: "H",
1189
+ kickoff: "2026-06-21T16:00Z",
1190
+ venue: "Mercedes-Benz Stadium",
1191
+ city: "Atlanta, Georgia",
1192
+ country: "USA",
1193
+ home: {
1194
+ code: "ESP",
1195
+ name: "Spain",
1196
+ flag: "\u{1F1EA}\u{1F1F8}"
1197
+ },
1198
+ away: {
1199
+ code: "KSA",
1200
+ name: "Saudi Arabia",
1201
+ flag: "\u{1F1F8}\u{1F1E6}"
1202
+ },
1203
+ status: "SCHEDULED",
1204
+ updatedAt: "2026-06-07T07:52:54.418Z"
1205
+ },
1206
+ {
1207
+ id: "760451",
1208
+ stage: "GROUP",
1209
+ group: "G",
1210
+ kickoff: "2026-06-21T19:00Z",
1211
+ venue: "SoFi Stadium",
1212
+ city: "Inglewood, California",
1213
+ country: "USA",
1214
+ home: {
1215
+ code: "BEL",
1216
+ name: "Belgium",
1217
+ flag: "\u{1F1E7}\u{1F1EA}"
1218
+ },
1219
+ away: {
1220
+ code: "IRN",
1221
+ name: "Iran",
1222
+ flag: "\u{1F1EE}\u{1F1F7}"
1223
+ },
1224
+ status: "SCHEDULED",
1225
+ updatedAt: "2026-06-07T07:52:54.418Z"
1226
+ },
1227
+ {
1228
+ id: "760450",
1229
+ stage: "GROUP",
1230
+ group: "H",
1231
+ kickoff: "2026-06-21T22:00Z",
1232
+ venue: "Hard Rock Stadium",
1233
+ city: "Miami Gardens, Florida",
1234
+ country: "USA",
1235
+ home: {
1236
+ code: "URU",
1237
+ name: "Uruguay",
1238
+ flag: "\u{1F1FA}\u{1F1FE}"
1239
+ },
1240
+ away: {
1241
+ code: "CPV",
1242
+ name: "Cape Verde",
1243
+ flag: "\u{1F1E8}\u{1F1FB}"
1244
+ },
1245
+ status: "SCHEDULED",
1246
+ updatedAt: "2026-06-07T07:52:54.418Z"
1247
+ },
1248
+ {
1249
+ id: "760452",
1250
+ stage: "GROUP",
1251
+ group: "G",
1252
+ kickoff: "2026-06-22T01:00Z",
1253
+ venue: "BC Place",
1254
+ city: "Vancouver",
1255
+ country: "Canada",
1256
+ home: {
1257
+ code: "NZL",
1258
+ name: "New Zealand",
1259
+ flag: "\u{1F1F3}\u{1F1FF}"
1260
+ },
1261
+ away: {
1262
+ code: "EGY",
1263
+ name: "Egypt",
1264
+ flag: "\u{1F1EA}\u{1F1EC}"
1265
+ },
1266
+ status: "SCHEDULED",
1267
+ updatedAt: "2026-06-07T07:52:54.418Z"
1268
+ },
1269
+ {
1270
+ id: "760456",
1271
+ stage: "GROUP",
1272
+ group: "J",
1273
+ kickoff: "2026-06-22T17:00Z",
1274
+ venue: "AT&T Stadium",
1275
+ city: "Arlington, Texas",
1276
+ country: "USA",
1277
+ home: {
1278
+ code: "ARG",
1279
+ name: "Argentina",
1280
+ flag: "\u{1F1E6}\u{1F1F7}"
1281
+ },
1282
+ away: {
1283
+ code: "AUT",
1284
+ name: "Austria",
1285
+ flag: "\u{1F1E6}\u{1F1F9}"
1286
+ },
1287
+ status: "SCHEDULED",
1288
+ updatedAt: "2026-06-07T07:52:54.418Z"
1289
+ },
1290
+ {
1291
+ id: "760457",
1292
+ stage: "GROUP",
1293
+ group: "I",
1294
+ kickoff: "2026-06-22T21:00Z",
1295
+ venue: "Lincoln Financial Field",
1296
+ city: "Philadelphia, Pennsylvania",
1297
+ country: "USA",
1298
+ home: {
1299
+ code: "FRA",
1300
+ name: "France",
1301
+ flag: "\u{1F1EB}\u{1F1F7}"
1302
+ },
1303
+ away: {
1304
+ code: "IRQ",
1305
+ name: "Iraq",
1306
+ flag: "\u{1F1EE}\u{1F1F6}"
1307
+ },
1308
+ status: "SCHEDULED",
1309
+ updatedAt: "2026-06-07T07:52:54.418Z"
1310
+ },
1311
+ {
1312
+ id: "760454",
1313
+ stage: "GROUP",
1314
+ group: "I",
1315
+ kickoff: "2026-06-23T00:00Z",
1316
+ venue: "MetLife Stadium",
1317
+ city: "East Rutherford, New Jersey",
1318
+ country: "USA",
1319
+ home: {
1320
+ code: "NOR",
1321
+ name: "Norway",
1322
+ flag: "\u{1F1F3}\u{1F1F4}"
1323
+ },
1324
+ away: {
1325
+ code: "SEN",
1326
+ name: "Senegal",
1327
+ flag: "\u{1F1F8}\u{1F1F3}"
1328
+ },
1329
+ status: "SCHEDULED",
1330
+ updatedAt: "2026-06-07T07:52:54.418Z"
1331
+ },
1332
+ {
1333
+ id: "760455",
1334
+ stage: "GROUP",
1335
+ group: "J",
1336
+ kickoff: "2026-06-23T03:00Z",
1337
+ venue: "Levi's Stadium",
1338
+ city: "Santa Clara, California",
1339
+ country: "USA",
1340
+ home: {
1341
+ code: "JOR",
1342
+ name: "Jordan",
1343
+ flag: "\u{1F1EF}\u{1F1F4}"
1344
+ },
1345
+ away: {
1346
+ code: "ALG",
1347
+ name: "Algeria",
1348
+ flag: "\u{1F1E9}\u{1F1FF}"
1349
+ },
1350
+ status: "SCHEDULED",
1351
+ updatedAt: "2026-06-07T07:52:54.418Z"
1352
+ },
1353
+ {
1354
+ id: "760461",
1355
+ stage: "GROUP",
1356
+ group: "K",
1357
+ kickoff: "2026-06-23T17:00Z",
1358
+ venue: "NRG Stadium",
1359
+ city: "Houston, Texas",
1360
+ country: "USA",
1361
+ home: {
1362
+ code: "POR",
1363
+ name: "Portugal",
1364
+ flag: "\u{1F1F5}\u{1F1F9}"
1365
+ },
1366
+ away: {
1367
+ code: "UZB",
1368
+ name: "Uzbekistan",
1369
+ flag: "\u{1F1FA}\u{1F1FF}"
1370
+ },
1371
+ status: "SCHEDULED",
1372
+ updatedAt: "2026-06-07T07:52:54.418Z"
1373
+ },
1374
+ {
1375
+ id: "760458",
1376
+ stage: "GROUP",
1377
+ group: "L",
1378
+ kickoff: "2026-06-23T20:00Z",
1379
+ venue: "Gillette Stadium",
1380
+ city: "Foxborough, Massachusetts",
1381
+ country: "USA",
1382
+ home: {
1383
+ code: "ENG",
1384
+ name: "England",
1385
+ flag: "\u{1F3F4}\u{E0067}\u{E0062}\u{E0065}\u{E006E}\u{E0067}\u{E007F}"
1386
+ },
1387
+ away: {
1388
+ code: "GHA",
1389
+ name: "Ghana",
1390
+ flag: "\u{1F1EC}\u{1F1ED}"
1391
+ },
1392
+ status: "SCHEDULED",
1393
+ updatedAt: "2026-06-07T07:52:54.418Z"
1394
+ },
1395
+ {
1396
+ id: "760460",
1397
+ stage: "GROUP",
1398
+ group: "L",
1399
+ kickoff: "2026-06-23T23:00Z",
1400
+ venue: "BMO Field",
1401
+ city: "Toronto",
1402
+ country: "Canada",
1403
+ home: {
1404
+ code: "PAN",
1405
+ name: "Panama",
1406
+ flag: "\u{1F1F5}\u{1F1E6}"
1407
+ },
1408
+ away: {
1409
+ code: "CRO",
1410
+ name: "Croatia",
1411
+ flag: "\u{1F1ED}\u{1F1F7}"
1412
+ },
1413
+ status: "SCHEDULED",
1414
+ updatedAt: "2026-06-07T07:52:54.419Z"
1415
+ },
1416
+ {
1417
+ id: "760459",
1418
+ stage: "GROUP",
1419
+ group: "K",
1420
+ kickoff: "2026-06-24T02:00Z",
1421
+ venue: "Estadio Akron",
1422
+ city: "Guadalajara",
1423
+ country: "Mexico",
1424
+ home: {
1425
+ code: "COL",
1426
+ name: "Colombia",
1427
+ flag: "\u{1F1E8}\u{1F1F4}"
1428
+ },
1429
+ away: {
1430
+ code: "COD",
1431
+ name: "Congo DR",
1432
+ flag: "\u{1F1E8}\u{1F1E9}"
1433
+ },
1434
+ status: "SCHEDULED",
1435
+ updatedAt: "2026-06-07T07:52:54.419Z"
1436
+ },
1437
+ {
1438
+ id: "760462",
1439
+ stage: "GROUP",
1440
+ group: "B",
1441
+ kickoff: "2026-06-24T19:00Z",
1442
+ venue: "Lumen Field",
1443
+ city: "Seattle, Washington",
1444
+ country: "USA",
1445
+ home: {
1446
+ code: "BIH",
1447
+ name: "Bosnia-Herzegovina",
1448
+ flag: "\u{1F1E7}\u{1F1E6}"
1449
+ },
1450
+ away: {
1451
+ code: "QAT",
1452
+ name: "Qatar",
1453
+ flag: "\u{1F1F6}\u{1F1E6}"
1454
+ },
1455
+ status: "SCHEDULED",
1456
+ updatedAt: "2026-06-07T07:52:54.419Z"
1457
+ },
1458
+ {
1459
+ id: "760463",
1460
+ stage: "GROUP",
1461
+ group: "B",
1462
+ kickoff: "2026-06-24T19:00Z",
1463
+ venue: "BC Place",
1464
+ city: "Vancouver",
1465
+ country: "Canada",
1466
+ home: {
1467
+ code: "SUI",
1468
+ name: "Switzerland",
1469
+ flag: "\u{1F1E8}\u{1F1ED}"
1470
+ },
1471
+ away: {
1472
+ code: "CAN",
1473
+ name: "Canada",
1474
+ flag: "\u{1F1E8}\u{1F1E6}"
1475
+ },
1476
+ status: "SCHEDULED",
1477
+ updatedAt: "2026-06-07T07:52:54.419Z"
1478
+ },
1479
+ {
1480
+ id: "760464",
1481
+ stage: "GROUP",
1482
+ group: "C",
1483
+ kickoff: "2026-06-24T22:00Z",
1484
+ venue: "Mercedes-Benz Stadium",
1485
+ city: "Atlanta, Georgia",
1486
+ country: "USA",
1487
+ home: {
1488
+ code: "MAR",
1489
+ name: "Morocco",
1490
+ flag: "\u{1F1F2}\u{1F1E6}"
1491
+ },
1492
+ away: {
1493
+ code: "HAI",
1494
+ name: "Haiti",
1495
+ flag: "\u{1F1ED}\u{1F1F9}"
1496
+ },
1497
+ status: "SCHEDULED",
1498
+ updatedAt: "2026-06-07T07:52:54.419Z"
1499
+ },
1500
+ {
1501
+ id: "760465",
1502
+ stage: "GROUP",
1503
+ group: "C",
1504
+ kickoff: "2026-06-24T22:00Z",
1505
+ venue: "Hard Rock Stadium",
1506
+ city: "Miami Gardens, Florida",
1507
+ country: "USA",
1508
+ home: {
1509
+ code: "SCO",
1510
+ name: "Scotland",
1511
+ flag: "\u{1F3F4}\u{E0067}\u{E0062}\u{E0073}\u{E0063}\u{E0074}\u{E007F}"
1512
+ },
1513
+ away: {
1514
+ code: "BRA",
1515
+ name: "Brazil",
1516
+ flag: "\u{1F1E7}\u{1F1F7}"
1517
+ },
1518
+ status: "SCHEDULED",
1519
+ updatedAt: "2026-06-07T07:52:54.419Z"
1520
+ },
1521
+ {
1522
+ id: "760467",
1523
+ stage: "GROUP",
1524
+ group: "A",
1525
+ kickoff: "2026-06-25T01:00Z",
1526
+ venue: "Estadio Banorte",
1527
+ city: "Mexico City",
1528
+ country: "Mexico",
1529
+ home: {
1530
+ code: "CZE",
1531
+ name: "Czechia",
1532
+ flag: "\u{1F1E8}\u{1F1FF}"
1533
+ },
1534
+ away: {
1535
+ code: "MEX",
1536
+ name: "Mexico",
1537
+ flag: "\u{1F1F2}\u{1F1FD}"
1538
+ },
1539
+ status: "SCHEDULED",
1540
+ updatedAt: "2026-06-07T07:52:54.419Z"
1541
+ },
1542
+ {
1543
+ id: "760466",
1544
+ stage: "GROUP",
1545
+ group: "A",
1546
+ kickoff: "2026-06-25T01:00Z",
1547
+ venue: "Estadio BBVA",
1548
+ city: "Guadalupe",
1549
+ country: "Mexico",
1550
+ home: {
1551
+ code: "RSA",
1552
+ name: "South Africa",
1553
+ flag: "\u{1F1FF}\u{1F1E6}"
1554
+ },
1555
+ away: {
1556
+ code: "KOR",
1557
+ name: "South Korea",
1558
+ flag: "\u{1F1F0}\u{1F1F7}"
1559
+ },
1560
+ status: "SCHEDULED",
1561
+ updatedAt: "2026-06-07T07:52:54.419Z"
1562
+ },
1563
+ {
1564
+ id: "760473",
1565
+ stage: "GROUP",
1566
+ group: "E",
1567
+ kickoff: "2026-06-25T20:00Z",
1568
+ venue: "Lincoln Financial Field",
1569
+ city: "Philadelphia, Pennsylvania",
1570
+ country: "USA",
1571
+ home: {
1572
+ code: "CUW",
1573
+ name: "Cura\xE7ao",
1574
+ flag: "\u{1F1E8}\u{1F1FC}"
1575
+ },
1576
+ away: {
1577
+ code: "CIV",
1578
+ name: "Ivory Coast",
1579
+ flag: "\u{1F1E8}\u{1F1EE}"
1580
+ },
1581
+ status: "SCHEDULED",
1582
+ updatedAt: "2026-06-07T07:52:54.511Z"
1583
+ },
1584
+ {
1585
+ id: "760468",
1586
+ stage: "GROUP",
1587
+ group: "E",
1588
+ kickoff: "2026-06-25T20:00Z",
1589
+ venue: "MetLife Stadium",
1590
+ city: "East Rutherford, New Jersey",
1591
+ country: "USA",
1592
+ home: {
1593
+ code: "ECU",
1594
+ name: "Ecuador",
1595
+ flag: "\u{1F1EA}\u{1F1E8}"
1596
+ },
1597
+ away: {
1598
+ code: "GER",
1599
+ name: "Germany",
1600
+ flag: "\u{1F1E9}\u{1F1EA}"
1601
+ },
1602
+ status: "SCHEDULED",
1603
+ updatedAt: "2026-06-07T07:52:54.511Z"
1604
+ },
1605
+ {
1606
+ id: "760471",
1607
+ stage: "GROUP",
1608
+ group: "F",
1609
+ kickoff: "2026-06-25T23:00Z",
1610
+ venue: "AT&T Stadium",
1611
+ city: "Arlington, Texas",
1612
+ country: "USA",
1613
+ home: {
1614
+ code: "JPN",
1615
+ name: "Japan",
1616
+ flag: "\u{1F1EF}\u{1F1F5}"
1617
+ },
1618
+ away: {
1619
+ code: "SWE",
1620
+ name: "Sweden",
1621
+ flag: "\u{1F1F8}\u{1F1EA}"
1622
+ },
1623
+ status: "SCHEDULED",
1624
+ updatedAt: "2026-06-07T07:52:54.511Z"
1625
+ },
1626
+ {
1627
+ id: "760472",
1628
+ stage: "GROUP",
1629
+ group: "F",
1630
+ kickoff: "2026-06-25T23:00Z",
1631
+ venue: "GEHA Field at Arrowhead Stadium",
1632
+ city: "Kansas City, Missouri",
1633
+ country: "USA",
1634
+ home: {
1635
+ code: "TUN",
1636
+ name: "Tunisia",
1637
+ flag: "\u{1F1F9}\u{1F1F3}"
1638
+ },
1639
+ away: {
1640
+ code: "NED",
1641
+ name: "Netherlands",
1642
+ flag: "\u{1F1F3}\u{1F1F1}"
1643
+ },
1644
+ status: "SCHEDULED",
1645
+ updatedAt: "2026-06-07T07:52:54.511Z"
1646
+ },
1647
+ {
1648
+ id: "760469",
1649
+ stage: "GROUP",
1650
+ group: "D",
1651
+ kickoff: "2026-06-26T02:00Z",
1652
+ venue: "Levi's Stadium",
1653
+ city: "Santa Clara, California",
1654
+ country: "USA",
1655
+ home: {
1656
+ code: "PAR",
1657
+ name: "Paraguay",
1658
+ flag: "\u{1F1F5}\u{1F1FE}"
1659
+ },
1660
+ away: {
1661
+ code: "AUS",
1662
+ name: "Australia",
1663
+ flag: "\u{1F1E6}\u{1F1FA}"
1664
+ },
1665
+ status: "SCHEDULED",
1666
+ updatedAt: "2026-06-07T07:52:54.511Z"
1667
+ },
1668
+ {
1669
+ id: "760470",
1670
+ stage: "GROUP",
1671
+ group: "D",
1672
+ kickoff: "2026-06-26T02:00Z",
1673
+ venue: "SoFi Stadium",
1674
+ city: "Inglewood, California",
1675
+ country: "USA",
1676
+ home: {
1677
+ code: "TUR",
1678
+ name: "T\xFCrkiye",
1679
+ flag: "\u{1F1F9}\u{1F1F7}"
1680
+ },
1681
+ away: {
1682
+ code: "USA",
1683
+ name: "United States",
1684
+ flag: "\u{1F1FA}\u{1F1F8}"
1685
+ },
1686
+ status: "SCHEDULED",
1687
+ updatedAt: "2026-06-07T07:52:54.511Z"
1688
+ },
1689
+ {
1690
+ id: "760475",
1691
+ stage: "GROUP",
1692
+ group: "I",
1693
+ kickoff: "2026-06-26T19:00Z",
1694
+ venue: "Gillette Stadium",
1695
+ city: "Foxborough, Massachusetts",
1696
+ country: "USA",
1697
+ home: {
1698
+ code: "NOR",
1699
+ name: "Norway",
1700
+ flag: "\u{1F1F3}\u{1F1F4}"
1701
+ },
1702
+ away: {
1703
+ code: "FRA",
1704
+ name: "France",
1705
+ flag: "\u{1F1EB}\u{1F1F7}"
1706
+ },
1707
+ status: "SCHEDULED",
1708
+ updatedAt: "2026-06-07T07:52:54.511Z"
1709
+ },
1710
+ {
1711
+ id: "760474",
1712
+ stage: "GROUP",
1713
+ group: "I",
1714
+ kickoff: "2026-06-26T19:00Z",
1715
+ venue: "BMO Field",
1716
+ city: "Toronto",
1717
+ country: "Canada",
1718
+ home: {
1719
+ code: "SEN",
1720
+ name: "Senegal",
1721
+ flag: "\u{1F1F8}\u{1F1F3}"
1722
+ },
1723
+ away: {
1724
+ code: "IRQ",
1725
+ name: "Iraq",
1726
+ flag: "\u{1F1EE}\u{1F1F6}"
1727
+ },
1728
+ status: "SCHEDULED",
1729
+ updatedAt: "2026-06-07T07:52:54.511Z"
1730
+ },
1731
+ {
1732
+ id: "760478",
1733
+ stage: "GROUP",
1734
+ group: "H",
1735
+ kickoff: "2026-06-27T00:00Z",
1736
+ venue: "NRG Stadium",
1737
+ city: "Houston, Texas",
1738
+ country: "USA",
1739
+ home: {
1740
+ code: "CPV",
1741
+ name: "Cape Verde",
1742
+ flag: "\u{1F1E8}\u{1F1FB}"
1743
+ },
1744
+ away: {
1745
+ code: "KSA",
1746
+ name: "Saudi Arabia",
1747
+ flag: "\u{1F1F8}\u{1F1E6}"
1748
+ },
1749
+ status: "SCHEDULED",
1750
+ updatedAt: "2026-06-07T07:52:54.511Z"
1751
+ },
1752
+ {
1753
+ id: "760479",
1754
+ stage: "GROUP",
1755
+ group: "H",
1756
+ kickoff: "2026-06-27T00:00Z",
1757
+ venue: "Estadio Akron",
1758
+ city: "Guadalajara",
1759
+ country: "Mexico",
1760
+ home: {
1761
+ code: "URU",
1762
+ name: "Uruguay",
1763
+ flag: "\u{1F1FA}\u{1F1FE}"
1764
+ },
1765
+ away: {
1766
+ code: "ESP",
1767
+ name: "Spain",
1768
+ flag: "\u{1F1EA}\u{1F1F8}"
1769
+ },
1770
+ status: "SCHEDULED",
1771
+ updatedAt: "2026-06-07T07:52:54.511Z"
1772
+ },
1773
+ {
1774
+ id: "760476",
1775
+ stage: "GROUP",
1776
+ group: "G",
1777
+ kickoff: "2026-06-27T03:00Z",
1778
+ venue: "Lumen Field",
1779
+ city: "Seattle, Washington",
1780
+ country: "USA",
1781
+ home: {
1782
+ code: "EGY",
1783
+ name: "Egypt",
1784
+ flag: "\u{1F1EA}\u{1F1EC}"
1785
+ },
1786
+ away: {
1787
+ code: "IRN",
1788
+ name: "Iran",
1789
+ flag: "\u{1F1EE}\u{1F1F7}"
1790
+ },
1791
+ status: "SCHEDULED",
1792
+ updatedAt: "2026-06-07T07:52:54.511Z"
1793
+ },
1794
+ {
1795
+ id: "760477",
1796
+ stage: "GROUP",
1797
+ group: "G",
1798
+ kickoff: "2026-06-27T03:00Z",
1799
+ venue: "BC Place",
1800
+ city: "Vancouver",
1801
+ country: "Canada",
1802
+ home: {
1803
+ code: "NZL",
1804
+ name: "New Zealand",
1805
+ flag: "\u{1F1F3}\u{1F1FF}"
1806
+ },
1807
+ away: {
1808
+ code: "BEL",
1809
+ name: "Belgium",
1810
+ flag: "\u{1F1E7}\u{1F1EA}"
1811
+ },
1812
+ status: "SCHEDULED",
1813
+ updatedAt: "2026-06-07T07:52:54.511Z"
1814
+ },
1815
+ {
1816
+ id: "760480",
1817
+ stage: "GROUP",
1818
+ group: "L",
1819
+ kickoff: "2026-06-27T21:00Z",
1820
+ venue: "Lincoln Financial Field",
1821
+ city: "Philadelphia, Pennsylvania",
1822
+ country: "USA",
1823
+ home: {
1824
+ code: "CRO",
1825
+ name: "Croatia",
1826
+ flag: "\u{1F1ED}\u{1F1F7}"
1827
+ },
1828
+ away: {
1829
+ code: "GHA",
1830
+ name: "Ghana",
1831
+ flag: "\u{1F1EC}\u{1F1ED}"
1832
+ },
1833
+ status: "SCHEDULED",
1834
+ updatedAt: "2026-06-07T07:52:54.512Z"
1835
+ },
1836
+ {
1837
+ id: "760485",
1838
+ stage: "GROUP",
1839
+ group: "L",
1840
+ kickoff: "2026-06-27T21:00Z",
1841
+ venue: "MetLife Stadium",
1842
+ city: "East Rutherford, New Jersey",
1843
+ country: "USA",
1844
+ home: {
1845
+ code: "PAN",
1846
+ name: "Panama",
1847
+ flag: "\u{1F1F5}\u{1F1E6}"
1848
+ },
1849
+ away: {
1850
+ code: "ENG",
1851
+ name: "England",
1852
+ flag: "\u{1F3F4}\u{E0067}\u{E0062}\u{E0065}\u{E006E}\u{E0067}\u{E007F}"
1853
+ },
1854
+ status: "SCHEDULED",
1855
+ updatedAt: "2026-06-07T07:52:54.512Z"
1856
+ },
1857
+ {
1858
+ id: "760481",
1859
+ stage: "GROUP",
1860
+ group: "K",
1861
+ kickoff: "2026-06-27T23:30Z",
1862
+ venue: "Hard Rock Stadium",
1863
+ city: "Miami Gardens, Florida",
1864
+ country: "USA",
1865
+ home: {
1866
+ code: "COL",
1867
+ name: "Colombia",
1868
+ flag: "\u{1F1E8}\u{1F1F4}"
1869
+ },
1870
+ away: {
1871
+ code: "POR",
1872
+ name: "Portugal",
1873
+ flag: "\u{1F1F5}\u{1F1F9}"
1874
+ },
1875
+ status: "SCHEDULED",
1876
+ updatedAt: "2026-06-07T07:52:54.512Z"
1877
+ },
1878
+ {
1879
+ id: "760482",
1880
+ stage: "GROUP",
1881
+ group: "K",
1882
+ kickoff: "2026-06-27T23:30Z",
1883
+ venue: "Mercedes-Benz Stadium",
1884
+ city: "Atlanta, Georgia",
1885
+ country: "USA",
1886
+ home: {
1887
+ code: "COD",
1888
+ name: "Congo DR",
1889
+ flag: "\u{1F1E8}\u{1F1E9}"
1890
+ },
1891
+ away: {
1892
+ code: "UZB",
1893
+ name: "Uzbekistan",
1894
+ flag: "\u{1F1FA}\u{1F1FF}"
1895
+ },
1896
+ status: "SCHEDULED",
1897
+ updatedAt: "2026-06-07T07:52:54.512Z"
1898
+ },
1899
+ {
1900
+ id: "760484",
1901
+ stage: "GROUP",
1902
+ group: "J",
1903
+ kickoff: "2026-06-28T02:00Z",
1904
+ venue: "GEHA Field at Arrowhead Stadium",
1905
+ city: "Kansas City, Missouri",
1906
+ country: "USA",
1907
+ home: {
1908
+ code: "ALG",
1909
+ name: "Algeria",
1910
+ flag: "\u{1F1E9}\u{1F1FF}"
1911
+ },
1912
+ away: {
1913
+ code: "AUT",
1914
+ name: "Austria",
1915
+ flag: "\u{1F1E6}\u{1F1F9}"
1916
+ },
1917
+ status: "SCHEDULED",
1918
+ updatedAt: "2026-06-07T07:52:54.512Z"
1919
+ },
1920
+ {
1921
+ id: "760483",
1922
+ stage: "GROUP",
1923
+ group: "J",
1924
+ kickoff: "2026-06-28T02:00Z",
1925
+ venue: "AT&T Stadium",
1926
+ city: "Arlington, Texas",
1927
+ country: "USA",
1928
+ home: {
1929
+ code: "JOR",
1930
+ name: "Jordan",
1931
+ flag: "\u{1F1EF}\u{1F1F4}"
1932
+ },
1933
+ away: {
1934
+ code: "ARG",
1935
+ name: "Argentina",
1936
+ flag: "\u{1F1E6}\u{1F1F7}"
1937
+ },
1938
+ status: "SCHEDULED",
1939
+ updatedAt: "2026-06-07T07:52:54.512Z"
1940
+ },
1941
+ {
1942
+ id: "760486",
1943
+ stage: "R32",
1944
+ kickoff: "2026-06-28T19:00Z",
1945
+ venue: "SoFi Stadium",
1946
+ city: "Inglewood, California",
1947
+ country: "USA",
1948
+ home: {
1949
+ code: "2A",
1950
+ name: "Group A 2nd Place",
1951
+ flag: "\u{1F3F3}\uFE0F"
1952
+ },
1953
+ away: {
1954
+ code: "2B",
1955
+ name: "Group B 2nd Place",
1956
+ flag: "\u{1F3F3}\uFE0F"
1957
+ },
1958
+ status: "SCHEDULED",
1959
+ updatedAt: "2026-06-07T07:52:54.540Z"
1960
+ },
1961
+ {
1962
+ id: "760487",
1963
+ stage: "R32",
1964
+ kickoff: "2026-06-29T17:00Z",
1965
+ venue: "NRG Stadium",
1966
+ city: "Houston, Texas",
1967
+ country: "USA",
1968
+ home: {
1969
+ code: "1C",
1970
+ name: "Group C Winner",
1971
+ flag: "\u{1F3F3}\uFE0F"
1972
+ },
1973
+ away: {
1974
+ code: "2F",
1975
+ name: "Group F 2nd Place",
1976
+ flag: "\u{1F3F3}\uFE0F"
1977
+ },
1978
+ status: "SCHEDULED",
1979
+ updatedAt: "2026-06-07T07:52:54.540Z"
1980
+ },
1981
+ {
1982
+ id: "760489",
1983
+ stage: "R32",
1984
+ kickoff: "2026-06-29T20:30Z",
1985
+ venue: "Gillette Stadium",
1986
+ city: "Foxborough, Massachusetts",
1987
+ country: "USA",
1988
+ home: {
1989
+ code: "1E",
1990
+ name: "Group E Winner",
1991
+ flag: "\u{1F3F3}\uFE0F"
1992
+ },
1993
+ away: {
1994
+ code: "3RD",
1995
+ name: "Third Place Group A/B/C/D/F",
1996
+ flag: "\u{1F3F3}\uFE0F"
1997
+ },
1998
+ status: "SCHEDULED",
1999
+ updatedAt: "2026-06-07T07:52:54.540Z"
2000
+ },
2001
+ {
2002
+ id: "760488",
2003
+ stage: "R32",
2004
+ kickoff: "2026-06-30T01:00Z",
2005
+ venue: "Estadio BBVA",
2006
+ city: "Guadalupe",
2007
+ country: "Mexico",
2008
+ home: {
2009
+ code: "1F",
2010
+ name: "Group F Winner",
2011
+ flag: "\u{1F3F3}\uFE0F"
2012
+ },
2013
+ away: {
2014
+ code: "2C",
2015
+ name: "Group C 2nd Place",
2016
+ flag: "\u{1F3F3}\uFE0F"
2017
+ },
2018
+ status: "SCHEDULED",
2019
+ updatedAt: "2026-06-07T07:52:54.540Z"
2020
+ },
2021
+ {
2022
+ id: "760490",
2023
+ stage: "R32",
2024
+ kickoff: "2026-06-30T17:00Z",
2025
+ venue: "AT&T Stadium",
2026
+ city: "Arlington, Texas",
2027
+ country: "USA",
2028
+ home: {
2029
+ code: "2E",
2030
+ name: "Group E 2nd Place",
2031
+ flag: "\u{1F3F3}\uFE0F"
2032
+ },
2033
+ away: {
2034
+ code: "2I",
2035
+ name: "Group I 2nd Place",
2036
+ flag: "\u{1F3F3}\uFE0F"
2037
+ },
2038
+ status: "SCHEDULED",
2039
+ updatedAt: "2026-06-07T07:52:54.540Z"
2040
+ },
2041
+ {
2042
+ id: "760492",
2043
+ stage: "R32",
2044
+ kickoff: "2026-06-30T21:00Z",
2045
+ venue: "MetLife Stadium",
2046
+ city: "East Rutherford, New Jersey",
2047
+ country: "USA",
2048
+ home: {
2049
+ code: "1I",
2050
+ name: "Group I Winner",
2051
+ flag: "\u{1F3F3}\uFE0F"
2052
+ },
2053
+ away: {
2054
+ code: "3RD",
2055
+ name: "Third Place Group C/D/F/G/H",
2056
+ flag: "\u{1F3F3}\uFE0F"
2057
+ },
2058
+ status: "SCHEDULED",
2059
+ updatedAt: "2026-06-07T07:52:54.541Z"
2060
+ },
2061
+ {
2062
+ id: "760491",
2063
+ stage: "R32",
2064
+ kickoff: "2026-07-01T01:00Z",
2065
+ venue: "Estadio Banorte",
2066
+ city: "Mexico City",
2067
+ country: "Mexico",
2068
+ home: {
2069
+ code: "1A",
2070
+ name: "Group A Winner",
2071
+ flag: "\u{1F3F3}\uFE0F"
2072
+ },
2073
+ away: {
2074
+ code: "3RD",
2075
+ name: "Third Place Group C/E/F/H/I",
2076
+ flag: "\u{1F3F3}\uFE0F"
2077
+ },
2078
+ status: "SCHEDULED",
2079
+ updatedAt: "2026-06-07T07:52:54.541Z"
2080
+ },
2081
+ {
2082
+ id: "760495",
2083
+ stage: "R32",
2084
+ kickoff: "2026-07-01T16:00Z",
2085
+ venue: "Mercedes-Benz Stadium",
2086
+ city: "Atlanta, Georgia",
2087
+ country: "USA",
2088
+ home: {
2089
+ code: "1L",
2090
+ name: "Group L Winner",
2091
+ flag: "\u{1F3F3}\uFE0F"
2092
+ },
2093
+ away: {
2094
+ code: "3RD",
2095
+ name: "Third Place Group E/H/I/J/K",
2096
+ flag: "\u{1F3F3}\uFE0F"
2097
+ },
2098
+ status: "SCHEDULED",
2099
+ updatedAt: "2026-06-07T07:52:54.541Z"
2100
+ },
2101
+ {
2102
+ id: "760493",
2103
+ stage: "R32",
2104
+ kickoff: "2026-07-01T20:00Z",
2105
+ venue: "Lumen Field",
2106
+ city: "Seattle, Washington",
2107
+ country: "USA",
2108
+ home: {
2109
+ code: "1G",
2110
+ name: "Group G Winner",
2111
+ flag: "\u{1F3F3}\uFE0F"
2112
+ },
2113
+ away: {
2114
+ code: "3RD",
2115
+ name: "Third Place Group A/E/H/I/J",
2116
+ flag: "\u{1F3F3}\uFE0F"
2117
+ },
2118
+ status: "SCHEDULED",
2119
+ updatedAt: "2026-06-07T07:52:54.541Z"
2120
+ },
2121
+ {
2122
+ id: "760494",
2123
+ stage: "R32",
2124
+ kickoff: "2026-07-02T00:00Z",
2125
+ venue: "Levi's Stadium",
2126
+ city: "Santa Clara, California",
2127
+ country: "USA",
2128
+ home: {
2129
+ code: "1D",
2130
+ name: "Group D Winner",
2131
+ flag: "\u{1F3F3}\uFE0F"
2132
+ },
2133
+ away: {
2134
+ code: "3RD",
2135
+ name: "Third Place Group B/E/F/I/J",
2136
+ flag: "\u{1F3F3}\uFE0F"
2137
+ },
2138
+ status: "SCHEDULED",
2139
+ updatedAt: "2026-06-07T07:52:54.541Z"
2140
+ },
2141
+ {
2142
+ id: "760497",
2143
+ stage: "R32",
2144
+ kickoff: "2026-07-02T19:00Z",
2145
+ venue: "SoFi Stadium",
2146
+ city: "Inglewood, California",
2147
+ country: "USA",
2148
+ home: {
2149
+ code: "1H",
2150
+ name: "Group H Winner",
2151
+ flag: "\u{1F3F3}\uFE0F"
2152
+ },
2153
+ away: {
2154
+ code: "2J",
2155
+ name: "Group J 2nd Place",
2156
+ flag: "\u{1F3F3}\uFE0F"
2157
+ },
2158
+ status: "SCHEDULED",
2159
+ updatedAt: "2026-06-07T07:52:54.616Z"
2160
+ },
2161
+ {
2162
+ id: "760496",
2163
+ stage: "R32",
2164
+ kickoff: "2026-07-02T23:00Z",
2165
+ venue: "BMO Field",
2166
+ city: "Toronto",
2167
+ country: "Canada",
2168
+ home: {
2169
+ code: "2K",
2170
+ name: "Group K 2nd Place",
2171
+ flag: "\u{1F3F3}\uFE0F"
2172
+ },
2173
+ away: {
2174
+ code: "2L",
2175
+ name: "Group L 2nd Place",
2176
+ flag: "\u{1F3F3}\uFE0F"
2177
+ },
2178
+ status: "SCHEDULED",
2179
+ updatedAt: "2026-06-07T07:52:54.616Z"
2180
+ },
2181
+ {
2182
+ id: "760498",
2183
+ stage: "R32",
2184
+ kickoff: "2026-07-03T03:00Z",
2185
+ venue: "BC Place",
2186
+ city: "Vancouver",
2187
+ country: "Canada",
2188
+ home: {
2189
+ code: "1B",
2190
+ name: "Group B Winner",
2191
+ flag: "\u{1F3F3}\uFE0F"
2192
+ },
2193
+ away: {
2194
+ code: "3RD",
2195
+ name: "Third Place Group E/F/G/I/J",
2196
+ flag: "\u{1F3F3}\uFE0F"
2197
+ },
2198
+ status: "SCHEDULED",
2199
+ updatedAt: "2026-06-07T07:52:54.616Z"
2200
+ },
2201
+ {
2202
+ id: "760499",
2203
+ stage: "R32",
2204
+ kickoff: "2026-07-03T18:00Z",
2205
+ venue: "AT&T Stadium",
2206
+ city: "Arlington, Texas",
2207
+ country: "USA",
2208
+ home: {
2209
+ code: "2D",
2210
+ name: "Group D 2nd Place",
2211
+ flag: "\u{1F3F3}\uFE0F"
2212
+ },
2213
+ away: {
2214
+ code: "2G",
2215
+ name: "Group G 2nd Place",
2216
+ flag: "\u{1F3F3}\uFE0F"
2217
+ },
2218
+ status: "SCHEDULED",
2219
+ updatedAt: "2026-06-07T07:52:54.616Z"
2220
+ },
2221
+ {
2222
+ id: "760500",
2223
+ stage: "R32",
2224
+ kickoff: "2026-07-03T22:00Z",
2225
+ venue: "Hard Rock Stadium",
2226
+ city: "Miami Gardens, Florida",
2227
+ country: "USA",
2228
+ home: {
2229
+ code: "1J",
2230
+ name: "Group J Winner",
2231
+ flag: "\u{1F3F3}\uFE0F"
2232
+ },
2233
+ away: {
2234
+ code: "2H",
2235
+ name: "Group H 2nd Place",
2236
+ flag: "\u{1F3F3}\uFE0F"
2237
+ },
2238
+ status: "SCHEDULED",
2239
+ updatedAt: "2026-06-07T07:52:54.616Z"
2240
+ },
2241
+ {
2242
+ id: "760501",
2243
+ stage: "R32",
2244
+ kickoff: "2026-07-04T01:30Z",
2245
+ venue: "GEHA Field at Arrowhead Stadium",
2246
+ city: "Kansas City, Missouri",
2247
+ country: "USA",
2248
+ home: {
2249
+ code: "1K",
2250
+ name: "Group K Winner",
2251
+ flag: "\u{1F3F3}\uFE0F"
2252
+ },
2253
+ away: {
2254
+ code: "3RD",
2255
+ name: "Third Place Group D/E/I/J/L",
2256
+ flag: "\u{1F3F3}\uFE0F"
2257
+ },
2258
+ status: "SCHEDULED",
2259
+ updatedAt: "2026-06-07T07:52:54.616Z"
2260
+ },
2261
+ {
2262
+ id: "760502",
2263
+ stage: "R16",
2264
+ kickoff: "2026-07-04T17:00Z",
2265
+ venue: "NRG Stadium",
2266
+ city: "Houston, Texas",
2267
+ country: "USA",
2268
+ home: {
2269
+ code: "RD32",
2270
+ name: "Round of 32 1 Winner",
2271
+ flag: "\u{1F3F3}\uFE0F"
2272
+ },
2273
+ away: {
2274
+ code: "RD32",
2275
+ name: "Round of 32 3 Winner",
2276
+ flag: "\u{1F3F3}\uFE0F"
2277
+ },
2278
+ status: "SCHEDULED",
2279
+ updatedAt: "2026-06-07T07:52:54.616Z"
2280
+ },
2281
+ {
2282
+ id: "760503",
2283
+ stage: "R16",
2284
+ kickoff: "2026-07-04T21:00Z",
2285
+ venue: "Lincoln Financial Field",
2286
+ city: "Philadelphia, Pennsylvania",
2287
+ country: "USA",
2288
+ home: {
2289
+ code: "RD32",
2290
+ name: "Round of 32 2 Winner",
2291
+ flag: "\u{1F3F3}\uFE0F"
2292
+ },
2293
+ away: {
2294
+ code: "RD32",
2295
+ name: "Round of 32 5 Winner",
2296
+ flag: "\u{1F3F3}\uFE0F"
2297
+ },
2298
+ status: "SCHEDULED",
2299
+ updatedAt: "2026-06-07T07:52:54.616Z"
2300
+ },
2301
+ {
2302
+ id: "760504",
2303
+ stage: "R16",
2304
+ kickoff: "2026-07-05T20:00Z",
2305
+ venue: "MetLife Stadium",
2306
+ city: "East Rutherford, New Jersey",
2307
+ country: "USA",
2308
+ home: {
2309
+ code: "RD32",
2310
+ name: "Round of 32 4 Winner",
2311
+ flag: "\u{1F3F3}\uFE0F"
2312
+ },
2313
+ away: {
2314
+ code: "RD32",
2315
+ name: "Round of 32 6 Winner",
2316
+ flag: "\u{1F3F3}\uFE0F"
2317
+ },
2318
+ status: "SCHEDULED",
2319
+ updatedAt: "2026-06-07T07:52:54.616Z"
2320
+ },
2321
+ {
2322
+ id: "760505",
2323
+ stage: "R16",
2324
+ kickoff: "2026-07-06T00:00Z",
2325
+ venue: "Estadio Banorte",
2326
+ city: "Mexico City",
2327
+ country: "Mexico",
2328
+ home: {
2329
+ code: "RD32",
2330
+ name: "Round of 32 7 Winner",
2331
+ flag: "\u{1F3F3}\uFE0F"
2332
+ },
2333
+ away: {
2334
+ code: "RD32",
2335
+ name: "Round of 32 8 Winner",
2336
+ flag: "\u{1F3F3}\uFE0F"
2337
+ },
2338
+ status: "SCHEDULED",
2339
+ updatedAt: "2026-06-07T07:52:54.616Z"
2340
+ },
2341
+ {
2342
+ id: "760506",
2343
+ stage: "R16",
2344
+ kickoff: "2026-07-06T19:00Z",
2345
+ venue: "AT&T Stadium",
2346
+ city: "Arlington, Texas",
2347
+ country: "USA",
2348
+ home: {
2349
+ code: "RD32",
2350
+ name: "Round of 32 11 Winner",
2351
+ flag: "\u{1F3F3}\uFE0F"
2352
+ },
2353
+ away: {
2354
+ code: "RD32",
2355
+ name: "Round of 32 12 Winner",
2356
+ flag: "\u{1F3F3}\uFE0F"
2357
+ },
2358
+ status: "SCHEDULED",
2359
+ updatedAt: "2026-06-07T07:52:54.616Z"
2360
+ },
2361
+ {
2362
+ id: "760507",
2363
+ stage: "R16",
2364
+ kickoff: "2026-07-07T00:00Z",
2365
+ venue: "Lumen Field",
2366
+ city: "Seattle, Washington",
2367
+ country: "USA",
2368
+ home: {
2369
+ code: "RD32",
2370
+ name: "Round of 32 9 Winner",
2371
+ flag: "\u{1F3F3}\uFE0F"
2372
+ },
2373
+ away: {
2374
+ code: "RD32",
2375
+ name: "Round of 32 10 Winner",
2376
+ flag: "\u{1F3F3}\uFE0F"
2377
+ },
2378
+ status: "SCHEDULED",
2379
+ updatedAt: "2026-06-07T07:52:54.616Z"
2380
+ },
2381
+ {
2382
+ id: "760509",
2383
+ stage: "R16",
2384
+ kickoff: "2026-07-07T16:00Z",
2385
+ venue: "Mercedes-Benz Stadium",
2386
+ city: "Atlanta, Georgia",
2387
+ country: "USA",
2388
+ home: {
2389
+ code: "RD32",
2390
+ name: "Round of 32 14 Winner",
2391
+ flag: "\u{1F3F3}\uFE0F"
2392
+ },
2393
+ away: {
2394
+ code: "RD32",
2395
+ name: "Round of 32 16 Winner",
2396
+ flag: "\u{1F3F3}\uFE0F"
2397
+ },
2398
+ status: "SCHEDULED",
2399
+ updatedAt: "2026-06-07T07:52:54.616Z"
2400
+ },
2401
+ {
2402
+ id: "760508",
2403
+ stage: "R16",
2404
+ kickoff: "2026-07-07T20:00Z",
2405
+ venue: "BC Place",
2406
+ city: "Vancouver",
2407
+ country: "Canada",
2408
+ home: {
2409
+ code: "RD32",
2410
+ name: "Round of 32 13 Winner",
2411
+ flag: "\u{1F3F3}\uFE0F"
2412
+ },
2413
+ away: {
2414
+ code: "RD32",
2415
+ name: "Round of 32 15 Winner",
2416
+ flag: "\u{1F3F3}\uFE0F"
2417
+ },
2418
+ status: "SCHEDULED",
2419
+ updatedAt: "2026-06-07T07:52:54.616Z"
2420
+ },
2421
+ {
2422
+ id: "760510",
2423
+ stage: "QF",
2424
+ kickoff: "2026-07-09T20:00Z",
2425
+ venue: "Gillette Stadium",
2426
+ city: "Foxborough, Massachusetts",
2427
+ country: "USA",
2428
+ home: {
2429
+ code: "RD16 W1",
2430
+ name: "Round of 16 1 Winner",
2431
+ flag: "\u{1F3F3}\uFE0F"
2432
+ },
2433
+ away: {
2434
+ code: "RD16 W2",
2435
+ name: "Round of 16 2 Winner",
2436
+ flag: "\u{1F3F3}\uFE0F"
2437
+ },
2438
+ status: "SCHEDULED",
2439
+ updatedAt: "2026-06-07T07:52:54.684Z"
2440
+ },
2441
+ {
2442
+ id: "760511",
2443
+ stage: "QF",
2444
+ kickoff: "2026-07-10T19:00Z",
2445
+ venue: "SoFi Stadium",
2446
+ city: "Inglewood, California",
2447
+ country: "USA",
2448
+ home: {
2449
+ code: "RD16 W5",
2450
+ name: "Round of 16 5 Winner",
2451
+ flag: "\u{1F3F3}\uFE0F"
2452
+ },
2453
+ away: {
2454
+ code: "RD16 W6",
2455
+ name: "Round of 16 6 Winner",
2456
+ flag: "\u{1F3F3}\uFE0F"
2457
+ },
2458
+ status: "SCHEDULED",
2459
+ updatedAt: "2026-06-07T07:52:54.684Z"
2460
+ },
2461
+ {
2462
+ id: "760512",
2463
+ stage: "QF",
2464
+ kickoff: "2026-07-11T21:00Z",
2465
+ venue: "Hard Rock Stadium",
2466
+ city: "Miami Gardens, Florida",
2467
+ country: "USA",
2468
+ home: {
2469
+ code: "RD16 W3",
2470
+ name: "Round of 16 3 Winner",
2471
+ flag: "\u{1F3F3}\uFE0F"
2472
+ },
2473
+ away: {
2474
+ code: "RD16 W4",
2475
+ name: "Round of 16 4 Winner",
2476
+ flag: "\u{1F3F3}\uFE0F"
2477
+ },
2478
+ status: "SCHEDULED",
2479
+ updatedAt: "2026-06-07T07:52:54.684Z"
2480
+ },
2481
+ {
2482
+ id: "760513",
2483
+ stage: "QF",
2484
+ kickoff: "2026-07-12T01:00Z",
2485
+ venue: "GEHA Field at Arrowhead Stadium",
2486
+ city: "Kansas City, Missouri",
2487
+ country: "USA",
2488
+ home: {
2489
+ code: "RD16 W7",
2490
+ name: "Round of 16 7 Winner",
2491
+ flag: "\u{1F3F3}\uFE0F"
2492
+ },
2493
+ away: {
2494
+ code: "RD16 W8",
2495
+ name: "Round of 16 8 Winner",
2496
+ flag: "\u{1F3F3}\uFE0F"
2497
+ },
2498
+ status: "SCHEDULED",
2499
+ updatedAt: "2026-06-07T07:52:54.684Z"
2500
+ },
2501
+ {
2502
+ id: "760514",
2503
+ stage: "SF",
2504
+ kickoff: "2026-07-14T19:00Z",
2505
+ venue: "AT&T Stadium",
2506
+ city: "Arlington, Texas",
2507
+ country: "USA",
2508
+ home: {
2509
+ code: "QFW1",
2510
+ name: "Quarterfinal 1 Winner",
2511
+ flag: "\u{1F3F3}\uFE0F"
2512
+ },
2513
+ away: {
2514
+ code: "QFW2",
2515
+ name: "Quarterfinal 2 Winner",
2516
+ flag: "\u{1F3F3}\uFE0F"
2517
+ },
2518
+ status: "SCHEDULED",
2519
+ updatedAt: "2026-06-07T07:52:54.684Z"
2520
+ },
2521
+ {
2522
+ id: "760515",
2523
+ stage: "SF",
2524
+ kickoff: "2026-07-15T19:00Z",
2525
+ venue: "Mercedes-Benz Stadium",
2526
+ city: "Atlanta, Georgia",
2527
+ country: "USA",
2528
+ home: {
2529
+ code: "QFW3",
2530
+ name: "Quarterfinal 3 Winner",
2531
+ flag: "\u{1F3F3}\uFE0F"
2532
+ },
2533
+ away: {
2534
+ code: "QW4",
2535
+ name: "Quarterfinal 4 Winner",
2536
+ flag: "\u{1F3F3}\uFE0F"
2537
+ },
2538
+ status: "SCHEDULED",
2539
+ updatedAt: "2026-06-07T07:52:54.684Z"
2540
+ },
2541
+ {
2542
+ id: "760516",
2543
+ stage: "3P",
2544
+ kickoff: "2026-07-18T21:00Z",
2545
+ venue: "Hard Rock Stadium",
2546
+ city: "Miami Gardens, Florida",
2547
+ country: "USA",
2548
+ home: {
2549
+ code: "SF L1",
2550
+ name: "Semifinal 1 Loser",
2551
+ flag: "\u{1F3F3}\uFE0F"
2552
+ },
2553
+ away: {
2554
+ code: "SF L2",
2555
+ name: "Semifinal 2 Loser",
2556
+ flag: "\u{1F3F3}\uFE0F"
2557
+ },
2558
+ status: "SCHEDULED",
2559
+ updatedAt: "2026-06-07T07:52:54.772Z"
2560
+ },
2561
+ {
2562
+ id: "760517",
2563
+ stage: "F",
2564
+ kickoff: "2026-07-19T19:00Z",
2565
+ venue: "MetLife Stadium",
2566
+ city: "East Rutherford, New Jersey",
2567
+ country: "USA",
2568
+ home: {
2569
+ code: "SFW1",
2570
+ name: "Semifinal 1 Winner",
2571
+ flag: "\u{1F3F3}\uFE0F"
2572
+ },
2573
+ away: {
2574
+ code: "SFW2",
2575
+ name: "Semifinal 2 Winner",
2576
+ flag: "\u{1F3F3}\uFE0F"
2577
+ },
2578
+ status: "SCHEDULED",
2579
+ updatedAt: "2026-06-07T07:52:54.772Z"
2580
+ }
2581
+ ];
2582
+
2583
+ // src/schedule.ts
2584
+ var SCHEDULE = schedule_2026_default;
2585
+ function allFixtures() {
2586
+ return SCHEDULE;
2587
+ }
2588
+ function fixturesByDate(dateISO, fixtures = SCHEDULE, tz) {
2589
+ const day = dateISO.slice(0, 10);
2590
+ return fixtures.filter((m) => localDate(m.kickoff, tz) === day).sort(byKickoff);
2591
+ }
2592
+ function fixturesByTeam(code, fixtures = SCHEDULE) {
2593
+ const c = code.toUpperCase();
2594
+ return fixtures.filter((m) => m.home.code.toUpperCase() === c || m.away.code.toUpperCase() === c).sort(byKickoff);
2595
+ }
2596
+ function fixturesByGroup(group, fixtures = SCHEDULE) {
2597
+ const g = group.toUpperCase();
2598
+ return fixtures.filter((m) => (m.group ?? "").toUpperCase() === g).sort(byKickoff);
2599
+ }
2600
+ function nextFixtureForTeam(code, opts = {}) {
2601
+ const from = opts.from ?? /* @__PURE__ */ new Date();
2602
+ return fixturesByTeam(code, opts.fixtures ?? SCHEDULE).find(
2603
+ (m) => new Date(m.kickoff).getTime() >= from.getTime()
2604
+ );
2605
+ }
2606
+ function groups(fixtures = SCHEDULE) {
2607
+ const set = /* @__PURE__ */ new Set();
2608
+ for (const m of fixtures) if (m.group) set.add(m.group);
2609
+ return [...set].sort();
2610
+ }
2611
+
2612
+ // src/standings.ts
2613
+ function blankRow(team) {
2614
+ return {
2615
+ team,
2616
+ played: 0,
2617
+ won: 0,
2618
+ drawn: 0,
2619
+ lost: 0,
2620
+ goalsFor: 0,
2621
+ goalsAgainst: 0,
2622
+ goalDiff: 0,
2623
+ points: 0
2624
+ };
2625
+ }
2626
+ function computeStandings(matches) {
2627
+ const rows = /* @__PURE__ */ new Map();
2628
+ const ensure = (t) => {
2629
+ let r = rows.get(t.code);
2630
+ if (!r) {
2631
+ r = blankRow(t);
2632
+ rows.set(t.code, r);
2633
+ }
2634
+ return r;
2635
+ };
2636
+ for (const m of matches) {
2637
+ const home = ensure(m.home);
2638
+ const away = ensure(m.away);
2639
+ if (!isFinished(m.status) || !m.score) continue;
2640
+ const { home: hg, away: ag } = m.score;
2641
+ home.played++;
2642
+ away.played++;
2643
+ home.goalsFor += hg;
2644
+ home.goalsAgainst += ag;
2645
+ away.goalsFor += ag;
2646
+ away.goalsAgainst += hg;
2647
+ if (hg > ag) {
2648
+ home.won++;
2649
+ away.lost++;
2650
+ home.points += 3;
2651
+ } else if (hg < ag) {
2652
+ away.won++;
2653
+ home.lost++;
2654
+ away.points += 3;
2655
+ } else {
2656
+ home.drawn++;
2657
+ away.drawn++;
2658
+ home.points++;
2659
+ away.points++;
2660
+ }
2661
+ }
2662
+ for (const r of rows.values()) r.goalDiff = r.goalsFor - r.goalsAgainst;
2663
+ return [...rows.values()].sort(
2664
+ (a, b) => b.points - a.points || b.goalDiff - a.goalDiff || b.goalsFor - a.goalsFor || a.team.name.localeCompare(b.team.name)
2665
+ );
2666
+ }
2667
+
2668
+ // src/adapters/espn.ts
2669
+ var ESPN_SOCCER = "https://site.api.espn.com/apis/site/v2/sports/soccer";
2670
+ var DEFAULT_COMPETITION = "fifa.world";
2671
+ var DEFAULT_BASE = `${ESPN_SOCCER}/${DEFAULT_COMPETITION}`;
2672
+ var USER_AGENT = "claudinho/0.0 (+https://github.com/arturogarrido/claudinho)";
2673
+ function competitionBase(slug) {
2674
+ return `${ESPN_SOCCER}/${slug}`;
2675
+ }
2676
+ function mapStatus(st) {
2677
+ const name = (st?.type?.name ?? "").toUpperCase();
2678
+ const state = st?.type?.state ?? "";
2679
+ if (name.includes("HALFTIME")) return "HT";
2680
+ if (name.includes("POSTPONED")) return "POSTPONED";
2681
+ if (name.includes("CANCEL")) return "CANCELLED";
2682
+ if (state === "pre") return "SCHEDULED";
2683
+ if (state === "post") return "FT";
2684
+ if (state === "in") return "LIVE";
2685
+ return "SCHEDULED";
2686
+ }
2687
+ function parseMinute(st) {
2688
+ if (st?.type?.state !== "in") return void 0;
2689
+ const dc = st.displayClock?.match(/(\d+)/);
2690
+ if (dc) return parseInt(dc[1], 10);
2691
+ if (typeof st.clock === "number" && st.clock > 0) {
2692
+ return Math.floor(st.clock / 60) || void 0;
2693
+ }
2694
+ return void 0;
2695
+ }
2696
+ var SLUG_TO_STAGE = {
2697
+ "group-stage": "GROUP",
2698
+ "round-of-32": "R32",
2699
+ "round-of-16": "R16",
2700
+ quarterfinals: "QF",
2701
+ semifinals: "SF",
2702
+ "3rd-place-match": "3P",
2703
+ final: "F"
2704
+ };
2705
+ function stageFromSlug(slug) {
2706
+ if (slug && SLUG_TO_STAGE[slug]) return SLUG_TO_STAGE[slug];
2707
+ if (!slug) return "GROUP";
2708
+ return "FRIENDLY";
2709
+ }
2710
+ function toInt(s) {
2711
+ if (s == null || s === "") return void 0;
2712
+ const n = parseInt(s, 10);
2713
+ return Number.isFinite(n) ? n : void 0;
2714
+ }
2715
+ function toTeam(t) {
2716
+ const name = t?.displayName ?? t?.name ?? t?.location ?? t?.shortDisplayName ?? "TBD";
2717
+ const code = (t?.abbreviation ?? name.slice(0, 3)).toUpperCase();
2718
+ return { code, name, flag: nationToFlag(t?.displayName ?? t?.abbreviation ?? name) };
2719
+ }
2720
+ function mapEspnEvent(ev, ctx = {}) {
2721
+ const comp = ev.competitions?.[0];
2722
+ const competitors = comp?.competitors ?? [];
2723
+ const homeC = competitors.find((c) => c.homeAway === "home") ?? competitors[0];
2724
+ const awayC = competitors.find((c) => c.homeAway === "away") ?? competitors[1];
2725
+ const status = mapStatus(ev.status ?? comp?.status);
2726
+ const stage = stageFromSlug(ev.season?.slug);
2727
+ const home = toTeam(homeC?.team);
2728
+ const away = toTeam(awayC?.team);
2729
+ let group;
2730
+ if (stage === "GROUP" && ctx.groupByTeam) {
2731
+ group = ctx.groupByTeam[home.code] ?? ctx.groupByTeam[away.code];
2732
+ }
2733
+ const hs = toInt(homeC?.score);
2734
+ const as = toInt(awayC?.score);
2735
+ const hasScore = status !== "SCHEDULED" && hs !== void 0 && as !== void 0;
2736
+ return {
2737
+ id: ev.id,
2738
+ stage,
2739
+ group,
2740
+ kickoff: ev.date,
2741
+ venue: comp?.venue?.fullName ?? "",
2742
+ city: comp?.venue?.address?.city || void 0,
2743
+ country: comp?.venue?.address?.country || void 0,
2744
+ home,
2745
+ away,
2746
+ score: hasScore ? { home: hs, away: as } : void 0,
2747
+ minute: parseMinute(ev.status ?? comp?.status),
2748
+ status,
2749
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
2750
+ };
2751
+ }
2752
+ function toEspnDate(d) {
2753
+ return d.replace(/\D/g, "").slice(0, 8);
2754
+ }
2755
+ var EspnAdapter = class {
2756
+ constructor(opts = {}) {
2757
+ this.opts = opts;
2758
+ }
2759
+ opts;
2760
+ name = "espn";
2761
+ capabilities = { push: false, latencyHintSec: 45 };
2762
+ /** Cached team-code -> group-letter map (built lazily from standings). */
2763
+ groupMap;
2764
+ async fetchByDate(dateISO) {
2765
+ return this.fetchScoreboard(toEspnDate(dateISO));
2766
+ }
2767
+ async fetchWindow(startDate, endDate) {
2768
+ return this.fetchScoreboard(`${toEspnDate(startDate)}-${toEspnDate(endDate)}`);
2769
+ }
2770
+ async fetchLive() {
2771
+ const today = await this.fetchScoreboard();
2772
+ return today.filter((m) => m.status === "LIVE" || m.status === "HT");
2773
+ }
2774
+ /**
2775
+ * Build (and cache) a team-code -> group-letter map from the standings
2776
+ * endpoint. Best-effort: returns {} if standings are unavailable.
2777
+ */
2778
+ async fetchGroupMap(force = false) {
2779
+ if (this.groupMap && !force) return this.groupMap;
2780
+ const base = this.opts.baseUrl ?? DEFAULT_BASE;
2781
+ const standingsUrl = `${base.replace("/apis/site/v2/", "/apis/v2/")}/standings`;
2782
+ const map = {};
2783
+ try {
2784
+ const data = await this.get(standingsUrl);
2785
+ for (const child of data.children ?? []) {
2786
+ const letter = (child.name ?? child.abbreviation ?? "").match(/Group\s+([A-L])/i)?.[1]?.toUpperCase();
2787
+ if (!letter) continue;
2788
+ for (const e of child.standings?.entries ?? []) {
2789
+ const code = e.team?.abbreviation?.toUpperCase();
2790
+ if (code) map[code] = letter;
2791
+ }
2792
+ }
2793
+ } catch {
2794
+ }
2795
+ this.groupMap = map;
2796
+ return map;
2797
+ }
2798
+ async fetchScoreboard(dates) {
2799
+ const base = this.opts.baseUrl ?? DEFAULT_BASE;
2800
+ const url = new URL(`${base}/scoreboard`);
2801
+ url.searchParams.set("limit", "300");
2802
+ if (dates) url.searchParams.set("dates", dates);
2803
+ const groupByTeam = this.opts.enrichGroups === false ? {} : await this.fetchGroupMap();
2804
+ const data = await this.get(url.toString());
2805
+ return (data.events ?? []).map((ev) => mapEspnEvent(ev, { groupByTeam }));
2806
+ }
2807
+ async get(url) {
2808
+ const doFetch = this.opts.fetchImpl ?? fetch;
2809
+ const controller = new AbortController();
2810
+ const timer = setTimeout(
2811
+ () => controller.abort(),
2812
+ this.opts.timeoutMs ?? 15e3
2813
+ );
2814
+ try {
2815
+ const res = await doFetch(url, {
2816
+ signal: controller.signal,
2817
+ headers: { Accept: "application/json", "User-Agent": USER_AGENT }
2818
+ });
2819
+ if (!res.ok) {
2820
+ throw new Error(`ESPN request failed: ${res.status} ${res.statusText}`);
2821
+ }
2822
+ return await res.json();
2823
+ } finally {
2824
+ clearTimeout(timer);
2825
+ }
2826
+ }
2827
+ };
2828
+
2829
+ // src/live.ts
2830
+ function resolveCompetition(explicit) {
2831
+ if (explicit) return explicit;
2832
+ if (typeof process !== "undefined" && process.env?.CLAUDINHO_COMPETITION) {
2833
+ return process.env.CLAUDINHO_COMPETITION;
2834
+ }
2835
+ return DEFAULT_COMPETITION;
2836
+ }
2837
+ function makeAdapter(source = "espn") {
2838
+ switch (source) {
2839
+ default: {
2840
+ const competition = resolveCompetition();
2841
+ const baseUrl = competition === DEFAULT_COMPETITION ? void 0 : competitionBase(competition);
2842
+ return new EspnAdapter({ baseUrl });
2843
+ }
2844
+ }
2845
+ }
2846
+ function mergeLive(base, live) {
2847
+ const byId = new Map(base.map((m) => [m.id, m]));
2848
+ for (const m of live) byId.set(m.id, m);
2849
+ return [...byId.values()];
2850
+ }
2851
+ async function getMatchesForDate(adapter, dateISO) {
2852
+ const base = allFixtures();
2853
+ const day = dateISO.slice(0, 10);
2854
+ try {
2855
+ const live = adapter.fetchWindow ? await adapter.fetchWindow(shiftUtcDate(day, -1), shiftUtcDate(day, 1)) : await adapter.fetchByDate(day);
2856
+ return { matches: mergeLive(base, live), degraded: false };
2857
+ } catch {
2858
+ return { matches: base, degraded: true };
2859
+ }
2860
+ }
2861
+ function shiftUtcDate(dateISO, days) {
2862
+ const [y, m, d] = dateISO.slice(0, 10).split("-").map(Number);
2863
+ return new Date(Date.UTC(y ?? 1970, (m ?? 1) - 1, (d ?? 1) + days)).toISOString().slice(0, 10);
2864
+ }
2865
+ async function getLiveMatches(adapter) {
2866
+ try {
2867
+ return { matches: await adapter.fetchLive(), degraded: false };
2868
+ } catch {
2869
+ return { matches: [], degraded: true };
2870
+ }
2871
+ }
2872
+ export {
2873
+ DEFAULT_COMPETITION,
2874
+ DEFAULT_FLAVOR,
2875
+ EspnAdapter,
2876
+ FLAVOR_LEVELS,
2877
+ allFixtures,
2878
+ asFlavorLevel,
2879
+ byKickoff,
2880
+ competitionBase,
2881
+ computeStandings,
2882
+ countdown,
2883
+ fixturesByDate,
2884
+ fixturesByGroup,
2885
+ fixturesByTeam,
2886
+ flagEmoji,
2887
+ formatKickoff,
2888
+ getLiveMatches,
2889
+ getMatchesForDate,
2890
+ groups,
2891
+ isFinished,
2892
+ isFlavorLevel,
2893
+ isLive,
2894
+ isValidDate,
2895
+ isValidTimeZone,
2896
+ localDate,
2897
+ makeAdapter,
2898
+ mapEspnEvent,
2899
+ matchFlavor,
2900
+ matchLocation,
2901
+ mergeLive,
2902
+ nationToFlag,
2903
+ nationToRegion,
2904
+ nextFixtureForTeam,
2905
+ outcomeFromScore,
2906
+ resolveCompetition,
2907
+ resolveTz,
2908
+ scoreline
2909
+ };