@weekendgoals/weekendgoals-common 1.2162.31319149261 → 1.2163.31433212367

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.
@@ -26,14 +26,25 @@
26
26
  * rename is a migration across two collections. See the LEA-8 status entry for
27
27
  * the call-site list.
28
28
  *
29
- * ## One writer
29
+ * ## One derivation, two callers
30
30
  *
31
- * `api-gateway/scripts/propose-league-global-ranks.ts` →
32
- * `apply-league-global-ranks.ts` is the only thing that writes it.
33
- * `POST /ingest/leagues/classify` no longer accepts it, and
34
- * `reclassify-world-tournaments.ts` no longer writes it — with two writers the
35
- * collisions came back every week, because a league that stopped resolving in
36
- * the Opta feed kept a rank from an older run while its neighbours moved on.
31
+ * `deriveGlobalRanks` below is the rule, and it is the reason this module
32
+ * exists rather than a script owning it: **the reviewed
33
+ * `api-gateway/scripts/propose-league-global-ranks.ts` and
34
+ * `POST /ingest/leagues/rerank` must compute the same answer.** Two writers
35
+ * with two rules is exactly what LEA-8 removed — Opta's league feed numbered
36
+ * each of its two files from 1 while `reclassify-world-tournaments.ts`
37
+ * numbered the World tournaments from 1 per confederation, so 22 leagues sat
38
+ * at rank 1 and 28 (section, rank) pairs collided. Two writers sharing ONE
39
+ * derivation is a different thing: both compute the whole collection's ranks
40
+ * from the same evidence, so whichever ran last, the answer is the same.
41
+ *
42
+ * `POST /ingest/leagues/classify` still does not accept the field, and
43
+ * `reclassify-world-tournaments.ts` still does not write it. What changed at
44
+ * Q-4 is that the derivation is no longer only reachable by hand: `rating` is
45
+ * refreshed weekly and the ranks derived from it were as old as the last time
46
+ * someone ran a script — measured on production 2026-08-09, a weekly run
47
+ * refreshed 254 league ratings and moved 0 league ranks.
37
48
  */
38
49
  import { Category } from "@weekendgoals/weekendgoals-types/dist/types";
39
50
  /** The fields the namespace is built from. */
@@ -67,4 +78,55 @@ export interface GlobalRankCollision {
67
78
  export declare function globalRankCollisions(leagues: RankableLeague[]): GlobalRankCollision[];
68
79
  /** Ranked leagues that name no namespace, so their rank compares to nothing. */
69
80
  export declare function rankedWithoutNamespace<T extends RankableLeague>(leagues: T[]): T[];
81
+ /** A row with enough of itself to be ordered as well as namespaced. */
82
+ export interface DerivableLeague extends RankableLeague {
83
+ name?: string;
84
+ externalId?: string;
85
+ rating?: number | null;
86
+ }
87
+ export interface GlobalRankDerivation<T> {
88
+ /** id → the rank the row should hold. A row absent from it holds none. */
89
+ ranks: Map<string, number>;
90
+ /** How many (scope, confederation, category) sections got a rank. */
91
+ sections: number;
92
+ /**
93
+ * Rows holding a rank that nothing orders — no `rating` and no entry in the
94
+ * curated World table. The derivation CLEARS these; a rank nothing can
95
+ * reproduce is worse than no rank, and the service's `?? 999` already
96
+ * expects a missing one.
97
+ */
98
+ noEvidence: T[];
99
+ /**
100
+ * Rows that could be ordered but name no section, so their rank would
101
+ * compare to nothing. Left unranked and reported.
102
+ */
103
+ noNamespace: T[];
104
+ }
105
+ /**
106
+ * The whole collection's `globalRank`, derived from the collection.
107
+ *
108
+ * The rule, unchanged since LEA-8 and stated here because two callers depend
109
+ * on it being one rule:
110
+ *
111
+ * - **Domestic sections order by `rating`, descending.** Opta's rating is the
112
+ * strength measure its own league ranking is computed from, so this
113
+ * reproduces Opta's order for every co-rated row while also placing a row
114
+ * rated in an older run — which the raw rank could not, and which is exactly
115
+ * how the collisions arose: a league that stopped resolving kept a number
116
+ * from a run its neighbours had moved past. Ties break on the rank held
117
+ * today, then the name, so a rerun over unchanged evidence is a no-op.
118
+ * - **International sections take only the ORDER from the curated World
119
+ * table** and are renumbered densely from 1. See `./world-tournament-order`
120
+ * for why the numbers in it are not the numbers stored.
121
+ * - **A row with neither evidence keeps no rank.**
122
+ *
123
+ * The two never mix — measured on the collection: 0 World rows carry an Opta
124
+ * `rating`, and 0 domestic ranked rows lack one. The comparator handles a
125
+ * mixed section anyway, rated rows leading.
126
+ *
127
+ * `idOf` is passed rather than assumed because the callers hold different
128
+ * shapes of the same row (a lean Mongo document, a DAO projection). It must be
129
+ * injective over `leagues` or two rows would claim one rank.
130
+ */
131
+ export declare function deriveGlobalRanks<T extends DerivableLeague>(leagues: T[], idOf: (league: T) => string): GlobalRankDerivation<T>;
70
132
  //# sourceMappingURL=global-rank.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"global-rank.d.ts","sourceRoot":"","sources":["../../src/classification/global-rank.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,6CAA6C,CAAC;AAEvE,8CAA8C;AAC9C,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,cAAc,GACrB,MAAM,GAAG,SAAS,CAIpB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,cAAc,EAAE,GACxB,mBAAmB,EAAE,CAyBvB;AAED,gFAAgF;AAChF,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,cAAc,EAC7D,OAAO,EAAE,CAAC,EAAE,GACX,CAAC,EAAE,CAIL"}
1
+ {"version":3,"file":"global-rank.d.ts","sourceRoot":"","sources":["../../src/classification/global-rank.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,6CAA6C,CAAC;AAGvE,8CAA8C;AAC9C,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,cAAc,GACrB,MAAM,GAAG,SAAS,CAIpB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,cAAc,EAAE,GACxB,mBAAmB,EAAE,CAyBvB;AAED,gFAAgF;AAChF,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,cAAc,EAC7D,OAAO,EAAE,CAAC,EAAE,GACX,CAAC,EAAE,CAIL;AAED,uEAAuE;AACvE,MAAM,WAAW,eAAgB,SAAQ,cAAc;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB,CAAC,CAAC;IACrC,0EAA0E;IAC1E,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,qEAAqE;IACrE,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,UAAU,EAAE,CAAC,EAAE,CAAC;IAChB;;;OAGG;IACH,WAAW,EAAE,CAAC,EAAE,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,eAAe,EACzD,OAAO,EAAE,CAAC,EAAE,EACZ,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,GAC1B,oBAAoB,CAAC,CAAC,CAAC,CA6CzB"}
@@ -27,19 +27,32 @@
27
27
  * rename is a migration across two collections. See the LEA-8 status entry for
28
28
  * the call-site list.
29
29
  *
30
- * ## One writer
30
+ * ## One derivation, two callers
31
31
  *
32
- * `api-gateway/scripts/propose-league-global-ranks.ts` →
33
- * `apply-league-global-ranks.ts` is the only thing that writes it.
34
- * `POST /ingest/leagues/classify` no longer accepts it, and
35
- * `reclassify-world-tournaments.ts` no longer writes it — with two writers the
36
- * collisions came back every week, because a league that stopped resolving in
37
- * the Opta feed kept a rank from an older run while its neighbours moved on.
32
+ * `deriveGlobalRanks` below is the rule, and it is the reason this module
33
+ * exists rather than a script owning it: **the reviewed
34
+ * `api-gateway/scripts/propose-league-global-ranks.ts` and
35
+ * `POST /ingest/leagues/rerank` must compute the same answer.** Two writers
36
+ * with two rules is exactly what LEA-8 removed — Opta's league feed numbered
37
+ * each of its two files from 1 while `reclassify-world-tournaments.ts`
38
+ * numbered the World tournaments from 1 per confederation, so 22 leagues sat
39
+ * at rank 1 and 28 (section, rank) pairs collided. Two writers sharing ONE
40
+ * derivation is a different thing: both compute the whole collection's ranks
41
+ * from the same evidence, so whichever ran last, the answer is the same.
42
+ *
43
+ * `POST /ingest/leagues/classify` still does not accept the field, and
44
+ * `reclassify-world-tournaments.ts` still does not write it. What changed at
45
+ * Q-4 is that the derivation is no longer only reachable by hand: `rating` is
46
+ * refreshed weekly and the ranks derived from it were as old as the last time
47
+ * someone ran a script — measured on production 2026-08-09, a weekly run
48
+ * refreshed 254 league ratings and moved 0 league ranks.
38
49
  */
39
50
  Object.defineProperty(exports, "__esModule", { value: true });
40
51
  exports.globalRankNamespaceOf = globalRankNamespaceOf;
41
52
  exports.globalRankCollisions = globalRankCollisions;
42
53
  exports.rankedWithoutNamespace = rankedWithoutNamespace;
54
+ exports.deriveGlobalRanks = deriveGlobalRanks;
55
+ const world_tournament_order_1 = require("./world-tournament-order");
43
56
  /**
44
57
  * The section a league's `globalRank` counts inside, or `undefined` when the
45
58
  * row cannot name one. An unclassified row has no section, so it can hold no
@@ -88,4 +101,80 @@ function globalRankCollisions(leagues) {
88
101
  function rankedWithoutNamespace(leagues) {
89
102
  return leagues.filter((l) => l.globalRank != null && !globalRankNamespaceOf(l));
90
103
  }
104
+ /**
105
+ * The whole collection's `globalRank`, derived from the collection.
106
+ *
107
+ * The rule, unchanged since LEA-8 and stated here because two callers depend
108
+ * on it being one rule:
109
+ *
110
+ * - **Domestic sections order by `rating`, descending.** Opta's rating is the
111
+ * strength measure its own league ranking is computed from, so this
112
+ * reproduces Opta's order for every co-rated row while also placing a row
113
+ * rated in an older run — which the raw rank could not, and which is exactly
114
+ * how the collisions arose: a league that stopped resolving kept a number
115
+ * from a run its neighbours had moved past. Ties break on the rank held
116
+ * today, then the name, so a rerun over unchanged evidence is a no-op.
117
+ * - **International sections take only the ORDER from the curated World
118
+ * table** and are renumbered densely from 1. See `./world-tournament-order`
119
+ * for why the numbers in it are not the numbers stored.
120
+ * - **A row with neither evidence keeps no rank.**
121
+ *
122
+ * The two never mix — measured on the collection: 0 World rows carry an Opta
123
+ * `rating`, and 0 domestic ranked rows lack one. The comparator handles a
124
+ * mixed section anyway, rated rows leading.
125
+ *
126
+ * `idOf` is passed rather than assumed because the callers hold different
127
+ * shapes of the same row (a lean Mongo document, a DAO projection). It must be
128
+ * injective over `leagues` or two rows would claim one rank.
129
+ */
130
+ function deriveGlobalRanks(leagues, idOf) {
131
+ const curated = (0, world_tournament_order_1.curatedWorldOrder)(world_tournament_order_1.ALL_RANKS);
132
+ const sections = new Map();
133
+ const noEvidence = [];
134
+ const noNamespace = [];
135
+ for (const league of leagues) {
136
+ const hasEvidence = league.rating != null || curated.has(String(league.externalId));
137
+ if (!hasEvidence) {
138
+ if (league.globalRank != null)
139
+ noEvidence.push(league);
140
+ continue;
141
+ }
142
+ const namespace = globalRankNamespaceOf(league);
143
+ if (!namespace) {
144
+ noNamespace.push(league);
145
+ continue;
146
+ }
147
+ const held = sections.get(namespace);
148
+ if (held)
149
+ held.push(league);
150
+ else
151
+ sections.set(namespace, [league]);
152
+ }
153
+ const ranks = new Map();
154
+ for (const [, members] of sections) {
155
+ members.sort((a, b) => {
156
+ var _a, _b, _c, _d, _e, _f, _g, _h;
157
+ // Rated rows lead a mixed section; in practice none is mixed.
158
+ const ratingDiff = ((_a = b.rating) !== null && _a !== void 0 ? _a : -Infinity) - ((_b = a.rating) !== null && _b !== void 0 ? _b : -Infinity);
159
+ if (Number.isFinite(ratingDiff) && ratingDiff !== 0)
160
+ return ratingDiff;
161
+ if (a.rating != null && b.rating == null)
162
+ return -1;
163
+ if (a.rating == null && b.rating != null)
164
+ return 1;
165
+ const curatedDiff = ((_c = curated.get(String(a.externalId))) !== null && _c !== void 0 ? _c : Number.MAX_SAFE_INTEGER) -
166
+ ((_d = curated.get(String(b.externalId))) !== null && _d !== void 0 ? _d : Number.MAX_SAFE_INTEGER);
167
+ if (curatedDiff !== 0)
168
+ return curatedDiff;
169
+ const heldDiff = ((_e = a.globalRank) !== null && _e !== void 0 ? _e : 9999) - ((_f = b.globalRank) !== null && _f !== void 0 ? _f : 9999);
170
+ if (heldDiff !== 0)
171
+ return heldDiff;
172
+ return ((_g = a.name) !== null && _g !== void 0 ? _g : "").localeCompare((_h = b.name) !== null && _h !== void 0 ? _h : "");
173
+ });
174
+ members.forEach((league, index) => {
175
+ ranks.set(idOf(league), index + 1);
176
+ });
177
+ }
178
+ return { ranks, sections: sections.size, noEvidence, noNamespace };
179
+ }
91
180
  //# sourceMappingURL=global-rank.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"global-rank.js","sourceRoot":"","sources":["../../src/classification/global-rank.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;;AAkBH,sDAMC;AAiBD,oDA2BC;AAGD,wDAMC;AAjED;;;;;GAKG;AACH,SAAgB,qBAAqB,CACnC,MAAsB;IAEtB,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAClD,IAAI,CAAC,KAAK,IAAI,CAAC,aAAa,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC5D,OAAO,GAAG,KAAK,KAAK,aAAa,KAAK,QAAQ,EAAE,CAAC;AACnD,CAAC;AAQD;;;;;;;;GAQG;AACH,SAAgB,oBAAoB,CAClC,OAAyB;;IAEzB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,MAAM,UAAU,GAA0B,EAAE,CAAC;IAE7C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,UAAU,IAAI,IAAI;YAAE,SAAS;QACxC,MAAM,SAAS,GAAG,MAAA,qBAAqB,CAAC,MAAM,CAAC,mCAAI,EAAE,CAAC;QACtD,MAAM,GAAG,GAAG,GAAG,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QAChD,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAA,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,mCAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;QAClC,IAAI,KAAK,GAAG,CAAC;YAAE,SAAS;QACxB,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAClC,UAAU,CAAC,IAAI,CAAC;YACd,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;YAC7B,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YACvC,KAAK;SACN,CAAC,CAAC;IACL,CAAC;IAED,OAAO,UAAU,CAAC,IAAI,CACpB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CACxE,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,SAAgB,sBAAsB,CACpC,OAAY;IAEZ,OAAO,OAAO,CAAC,MAAM,CACnB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,IAAI,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CACzD,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"global-rank.js","sourceRoot":"","sources":["../../src/classification/global-rank.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * The curated ORDER of the World tournaments — the ordering evidence for the
3
+ * rows Opta does not rate.
4
+ *
5
+ * It lived in `api-gateway/scripts/reclassify-world-tournaments.ts`, which is
6
+ * where it was authored and where it was once WRITTEN from. It is here because
7
+ * two things now need it and neither may keep a copy: the reviewed
8
+ * `propose-league-global-ranks.ts` and `POST /ingest/leagues/rerank`. A table
9
+ * that disagreed with itself across those two would put a different order on
10
+ * the homepage depending on which one ran last, which is the two-writer defect
11
+ * LEA-8 removed, one level up.
12
+ *
13
+ * **The numbers below are a sequence within their own group, not a value any
14
+ * league holds.** `deriveGlobalRanks` in `./global-rank` takes only the order
15
+ * from them and renumbers densely per `(scope, confederation, category)` —
16
+ * these groups are per (confederation, category), and rows have since moved
17
+ * category (LEA-10 re-derived ten women's youth competitions into
18
+ * `category: youth`), so the sections they land in now are different ones.
19
+ */
20
+ export interface RankEntry {
21
+ externalId: string;
22
+ globalRank: number;
23
+ name: string;
24
+ }
25
+ export interface RankGroup {
26
+ confederation: string;
27
+ category: string;
28
+ entries: RankEntry[];
29
+ }
30
+ export declare const ALL_RANKS: RankGroup[];
31
+ /**
32
+ * `externalId` → its position inside its own curated group. Order only, and a
33
+ * duplicate keeps the first entry so the map is a function — a repeat would
34
+ * mean the table lists one competition twice.
35
+ */
36
+ export declare function curatedWorldOrder(groups?: RankGroup[]): Map<string, number>;
37
+ //# sourceMappingURL=world-tournament-order.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"world-tournament-order.d.ts","sourceRoot":"","sources":["../../src/classification/world-tournament-order.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,SAAS,EAAE,CAAC;CACtB;AAED,eAAO,MAAM,SAAS,EAAE,SAAS,EA6QhC,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,GAAE,SAAS,EAAc,GAC9B,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAUrB"}
@@ -0,0 +1,304 @@
1
+ "use strict";
2
+ /**
3
+ * The curated ORDER of the World tournaments — the ordering evidence for the
4
+ * rows Opta does not rate.
5
+ *
6
+ * It lived in `api-gateway/scripts/reclassify-world-tournaments.ts`, which is
7
+ * where it was authored and where it was once WRITTEN from. It is here because
8
+ * two things now need it and neither may keep a copy: the reviewed
9
+ * `propose-league-global-ranks.ts` and `POST /ingest/leagues/rerank`. A table
10
+ * that disagreed with itself across those two would put a different order on
11
+ * the homepage depending on which one ran last, which is the two-writer defect
12
+ * LEA-8 removed, one level up.
13
+ *
14
+ * **The numbers below are a sequence within their own group, not a value any
15
+ * league holds.** `deriveGlobalRanks` in `./global-rank` takes only the order
16
+ * from them and renumbers densely per `(scope, confederation, category)` —
17
+ * these groups are per (confederation, category), and rows have since moved
18
+ * category (LEA-10 re-derived ten women's youth competitions into
19
+ * `category: youth`), so the sections they land in now are different ones.
20
+ */
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.ALL_RANKS = void 0;
23
+ exports.curatedWorldOrder = curatedWorldOrder;
24
+ exports.ALL_RANKS = [
25
+ // --- GLOBAL ---
26
+ {
27
+ confederation: "GLOBAL", category: "men", entries: [
28
+ { externalId: "1", globalRank: 1, name: "World Cup" },
29
+ { externalId: "15", globalRank: 2, name: "FIFA Club World Cup" },
30
+ { externalId: "1168", globalRank: 3, name: "FIFA Intercontinental Cup" },
31
+ { externalId: "480", globalRank: 4, name: "Olympics Men" },
32
+ { externalId: "768", globalRank: 5, name: "Arab Club Champions Cup" },
33
+ { externalId: "860", globalRank: 6, name: "Arab Cup" },
34
+ { externalId: "30", globalRank: 7, name: "World Cup - Qualification Asia" },
35
+ { externalId: "37", globalRank: 8, name: "World Cup - Qualification Intercontinental Play-offs" },
36
+ { externalId: "1186", globalRank: 9, name: "FIFA Club World Cup - Play-In" },
37
+ { externalId: "26", globalRank: 10, name: "International Champions Cup" },
38
+ { externalId: "10", globalRank: 11, name: "Friendlies" },
39
+ { externalId: "667", globalRank: 12, name: "Friendlies Clubs" },
40
+ { externalId: "937", globalRank: 13, name: "Emirates Cup" },
41
+ { externalId: "769", globalRank: 14, name: "Premier League Asia Trophy" },
42
+ { externalId: "1105", globalRank: 15, name: "Olympics - Intercontinental Play-offs" },
43
+ { externalId: "1016", globalRank: 16, name: "CAC Games" },
44
+ { externalId: "941", globalRank: 17, name: "Islamic Solidarity Games" },
45
+ { externalId: "919", globalRank: 18, name: "Mediterranean Games" },
46
+ { externalId: "1045", globalRank: 19, name: "Pan American Games" },
47
+ { externalId: "1213", globalRank: 20, name: "Kings World Cup Nations" },
48
+ { externalId: "21", globalRank: 21, name: "Confederations Cup" },
49
+ ],
50
+ },
51
+ {
52
+ confederation: "GLOBAL", category: "women", entries: [
53
+ { externalId: "8", globalRank: 1, name: "World Cup - Women" },
54
+ { externalId: "524", globalRank: 2, name: "Olympics Women" },
55
+ { externalId: "1217", globalRank: 3, name: "Fifa Women Champions Cup" },
56
+ { externalId: "945", globalRank: 4, name: "International Champions Cup - Women" },
57
+ { externalId: "666", globalRank: 5, name: "Friendlies Women" },
58
+ { externalId: "882", globalRank: 6, name: "Olympics Women - Qualification Asia" },
59
+ { externalId: "920", globalRank: 7, name: "World Cup - U20 - Women" },
60
+ { externalId: "950", globalRank: 8, name: "World Cup - U17 - Women" },
61
+ ],
62
+ },
63
+ {
64
+ confederation: "GLOBAL", category: "youth", entries: [
65
+ { externalId: "490", globalRank: 1, name: "World Cup - U20" },
66
+ { externalId: "587", globalRank: 2, name: "World Cup - U17" },
67
+ { externalId: "934", globalRank: 3, name: "Arab Championship - U20" },
68
+ { externalId: "1039", globalRank: 4, name: "Premier League International Cup" },
69
+ ],
70
+ },
71
+ // --- UEFA ---
72
+ {
73
+ confederation: "UEFA", category: "men", entries: [
74
+ { externalId: "2", globalRank: 1, name: "UEFA Champions League" },
75
+ { externalId: "3", globalRank: 2, name: "UEFA Europa League" },
76
+ { externalId: "848", globalRank: 3, name: "UEFA Europa Conference League" },
77
+ { externalId: "4", globalRank: 4, name: "Euro Championship" },
78
+ { externalId: "5", globalRank: 5, name: "UEFA Nations League" },
79
+ { externalId: "531", globalRank: 6, name: "UEFA Super Cup" },
80
+ { externalId: "960", globalRank: 7, name: "Euro Championship - Qualification" },
81
+ { externalId: "32", globalRank: 8, name: "World Cup - Qualification Europe" },
82
+ { externalId: "913", globalRank: 9, name: "CONMEBOL - UEFA Finalissima" },
83
+ { externalId: "1024", globalRank: 10, name: "UEFA - CONMEBOL - Club Challenge" },
84
+ { externalId: "849", globalRank: 11, name: "Baltic Cup" },
85
+ { externalId: "903", globalRank: 12, name: "The Atlantic Cup" },
86
+ { externalId: "900", globalRank: 13, name: "Tipsport Malta Cup" },
87
+ ],
88
+ },
89
+ {
90
+ confederation: "UEFA", category: "women", entries: [
91
+ { externalId: "525", globalRank: 1, name: "UEFA Champions League Women" },
92
+ { externalId: "743", globalRank: 2, name: "UEFA Championship - Women" },
93
+ { externalId: "1040", globalRank: 3, name: "UEFA Nations League - Women" },
94
+ { externalId: "1191", globalRank: 4, name: "UEFA Europa Cup - Women" },
95
+ { externalId: "1083", globalRank: 5, name: "UEFA Championship - Women - Qualification" },
96
+ { externalId: "880", globalRank: 6, name: "World Cup - Women - Qualification Europe" },
97
+ { externalId: "902", globalRank: 7, name: "Algarve Cup" },
98
+ { externalId: "918", globalRank: 8, name: "UEFA U19 Championship - Women" },
99
+ { externalId: "1102", globalRank: 9, name: "UEFA U17 Championship - Women" },
100
+ { externalId: "1013", globalRank: 10, name: "All-Island Cup - Women" },
101
+ ],
102
+ },
103
+ {
104
+ confederation: "UEFA", category: "youth", entries: [
105
+ { externalId: "14", globalRank: 1, name: "UEFA Youth League" },
106
+ { externalId: "38", globalRank: 2, name: "UEFA U21 Championship" },
107
+ { externalId: "493", globalRank: 3, name: "UEFA U19 Championship" },
108
+ { externalId: "921", globalRank: 4, name: "UEFA U17 Championship" },
109
+ { externalId: "850", globalRank: 5, name: "UEFA U21 Championship - Qualification" },
110
+ { externalId: "893", globalRank: 6, name: "UEFA U19 Championship - Qualification" },
111
+ { externalId: "886", globalRank: 7, name: "UEFA U17 Championship - Qualification" },
112
+ { externalId: "914", globalRank: 8, name: "Tournoi Maurice Revello" },
113
+ { externalId: "940", globalRank: 9, name: "COTIF Tournament" },
114
+ { externalId: "890", globalRank: 10, name: "U20 Elite League" },
115
+ { externalId: "910", globalRank: 11, name: "Youth Viareggio Cup" },
116
+ ],
117
+ },
118
+ // --- CONMEBOL ---
119
+ {
120
+ confederation: "CONMEBOL", category: "men", entries: [
121
+ { externalId: "13", globalRank: 1, name: "CONMEBOL Libertadores" },
122
+ { externalId: "9", globalRank: 2, name: "Copa America" },
123
+ { externalId: "11", globalRank: 3, name: "CONMEBOL Sudamericana" },
124
+ { externalId: "541", globalRank: 4, name: "CONMEBOL Recopa" },
125
+ { externalId: "34", globalRank: 5, name: "World Cup - Qualification South America" },
126
+ { externalId: "1060", globalRank: 6, name: "CONMEBOL - Pre-Olympic Tournament" },
127
+ { externalId: "1216", globalRank: 7, name: "Serie Rio De La Plata" },
128
+ ],
129
+ },
130
+ {
131
+ confederation: "CONMEBOL", category: "women", entries: [
132
+ { externalId: "926", globalRank: 1, name: "Copa America Femenina" },
133
+ { externalId: "949", globalRank: 2, name: "CONMEBOL Libertadores Femenina" },
134
+ { externalId: "1206", globalRank: 3, name: "CONMEBOL Nations League Women" },
135
+ ],
136
+ },
137
+ {
138
+ confederation: "CONMEBOL", category: "youth", entries: [
139
+ { externalId: "773", globalRank: 1, name: "Sudamericano U20" },
140
+ { externalId: "540", globalRank: 2, name: "CONMEBOL Libertadores U20" },
141
+ { externalId: "970", globalRank: 3, name: "CONMEBOL - U17" },
142
+ { externalId: "1085", globalRank: 4, name: "CONMEBOL U20 Femenino" },
143
+ { externalId: "1081", globalRank: 5, name: "CONMEBOL - U17 Femenino" },
144
+ { externalId: "951", globalRank: 6, name: "South American Youth Games" },
145
+ ],
146
+ },
147
+ // --- AFC ---
148
+ {
149
+ confederation: "AFC", category: "men", entries: [
150
+ { externalId: "17", globalRank: 1, name: "AFC Champions League" },
151
+ { externalId: "7", globalRank: 2, name: "Asian Cup" },
152
+ { externalId: "18", globalRank: 3, name: "AFC Cup" },
153
+ { externalId: "35", globalRank: 4, name: "Asian Cup - Qualification" },
154
+ { externalId: "23", globalRank: 5, name: "EAFF E-1 Football Championship" },
155
+ { externalId: "24", globalRank: 6, name: "ASEAN Championship" },
156
+ { externalId: "25", globalRank: 7, name: "Gulf Cup of Nations" },
157
+ { externalId: "28", globalRank: 8, name: "SAFF Championship" },
158
+ { externalId: "1008", globalRank: 9, name: "CAFA Nations Cup" },
159
+ { externalId: "803", globalRank: 10, name: "Asian Games" },
160
+ { externalId: "911", globalRank: 11, name: "Southeast Asian Games" },
161
+ { externalId: "807", globalRank: 12, name: "AFC Challenge Cup" },
162
+ { externalId: "1132", globalRank: 13, name: "AFC Challenge League" },
163
+ { externalId: "1129", globalRank: 14, name: "ASEAN Club Championship" },
164
+ { externalId: "1162", globalRank: 15, name: "AGCFF Gulf Champions League" },
165
+ { externalId: "1169", globalRank: 16, name: "EAFF E-1 Football Championship - Qualification" },
166
+ { externalId: "766", globalRank: 17, name: "China Cup" },
167
+ { externalId: "1038", globalRank: 18, name: "King's Cup" },
168
+ { externalId: "916", globalRank: 19, name: "Kirin Cup" },
169
+ { externalId: "1123", globalRank: 20, name: "Qatar-UAE Super Cup" },
170
+ { externalId: "1089", globalRank: 21, name: "UAE-Qatar - Super Shield" },
171
+ ],
172
+ },
173
+ {
174
+ confederation: "AFC", category: "women", entries: [
175
+ { externalId: "897", globalRank: 1, name: "Asian Cup Women" },
176
+ { externalId: "1140", globalRank: 2, name: "AFC Women's Champions League" },
177
+ { externalId: "894", globalRank: 3, name: "Asian Cup Women - Qualification" },
178
+ { externalId: "1070", globalRank: 4, name: "AFC U20 Asian Cup - Women" },
179
+ { externalId: "1101", globalRank: 5, name: "AFC U17 Asian Cup - Women" },
180
+ { externalId: "1189", globalRank: 6, name: "Asean Championship Women" },
181
+ { externalId: "1188", globalRank: 7, name: "EAFF E-1 Football Championship - Women" },
182
+ ],
183
+ },
184
+ {
185
+ confederation: "AFC", category: "youth", entries: [
186
+ { externalId: "532", globalRank: 1, name: "AFC U23 Asian Cup" },
187
+ { externalId: "965", globalRank: 2, name: "AFC U20 Asian Cup" },
188
+ { externalId: "1012", globalRank: 3, name: "AFC U17 Asian Cup" },
189
+ { externalId: "952", globalRank: 4, name: "AFC U23 Asian Cup - Qualification" },
190
+ { externalId: "1153", globalRank: 5, name: "AFC U20 Asian Cup - Qualification" },
191
+ { externalId: "1161", globalRank: 6, name: "AFC U17 Asian Cup - Qualification" },
192
+ { externalId: "908", globalRank: 7, name: "ASEAN Championship U23" },
193
+ { externalId: "928", globalRank: 8, name: "ASEAN Championship U19" },
194
+ { externalId: "1208", globalRank: 9, name: "Arabian Gulf Cup U23" },
195
+ { externalId: "1077", globalRank: 10, name: "WAFF Championship U23" },
196
+ ],
197
+ },
198
+ // --- CONCACAF ---
199
+ {
200
+ confederation: "CONCACAF", category: "men", entries: [
201
+ { externalId: "16", globalRank: 1, name: "CONCACAF Champions League" },
202
+ { externalId: "22", globalRank: 2, name: "CONCACAF Gold Cup" },
203
+ { externalId: "536", globalRank: 3, name: "CONCACAF Nations League" },
204
+ { externalId: "772", globalRank: 4, name: "Leagues Cup" },
205
+ { externalId: "767", globalRank: 5, name: "CONCACAF League" },
206
+ { externalId: "858", globalRank: 6, name: "CONCACAF Gold Cup - Qualification" },
207
+ { externalId: "808", globalRank: 7, name: "CONCACAF Nations League - Qualification" },
208
+ { externalId: "31", globalRank: 8, name: "World Cup - Qualification CONCACAF" },
209
+ { externalId: "885", globalRank: 9, name: "Campeones Cup" },
210
+ { externalId: "805", globalRank: 10, name: "Copa Centroamericana" },
211
+ { externalId: "804", globalRank: 11, name: "Caribbean Cup" },
212
+ { externalId: "856", globalRank: 12, name: "CONCACAF Caribbean Club Championship" },
213
+ { externalId: "534", globalRank: 13, name: "CONCACAF Caribbean Club Shield" },
214
+ { externalId: "1028", globalRank: 14, name: "Concacaf Central American Cup" },
215
+ { externalId: "1207", globalRank: 15, name: "CONCACAF Series" },
216
+ { externalId: "881", globalRank: 16, name: "Olympics Men - Qualification Concacaf" },
217
+ ],
218
+ },
219
+ {
220
+ confederation: "CONCACAF", category: "women", entries: [
221
+ { externalId: "1057", globalRank: 1, name: "CONCACAF Gold Cup - Women" },
222
+ { externalId: "1136", globalRank: 2, name: "CONCACAF W Champions Cup" },
223
+ { externalId: "927", globalRank: 3, name: "World Cup - Women - Qualification Concacaf" },
224
+ { externalId: "904", globalRank: 4, name: "SheBelieves Cup" },
225
+ { externalId: "1046", globalRank: 5, name: "CONCACAF Gold Cup - Qualification - Women" },
226
+ { externalId: "1001", globalRank: 6, name: "CONCACAF Women U20" },
227
+ { externalId: "912", globalRank: 7, name: "CONCACAF Women U17" },
228
+ ],
229
+ },
230
+ {
231
+ confederation: "CONCACAF", category: "youth", entries: [
232
+ { externalId: "537", globalRank: 1, name: "CONCACAF U20" },
233
+ { externalId: "963", globalRank: 2, name: "CONCACAF U17" },
234
+ { externalId: "1066", globalRank: 3, name: "CONCACAF U20 - Qualification" },
235
+ ],
236
+ },
237
+ // --- CAF ---
238
+ {
239
+ confederation: "CAF", category: "men", entries: [
240
+ { externalId: "12", globalRank: 1, name: "CAF Champions League" },
241
+ { externalId: "6", globalRank: 2, name: "Africa Cup of Nations" },
242
+ { externalId: "20", globalRank: 3, name: "CAF Confederation Cup" },
243
+ { externalId: "36", globalRank: 4, name: "Africa Cup of Nations - Qualification" },
244
+ { externalId: "533", globalRank: 5, name: "CAF Super Cup" },
245
+ { externalId: "19", globalRank: 6, name: "African Nations Championship" },
246
+ { externalId: "1043", globalRank: 7, name: "African Football League" },
247
+ { externalId: "1163", globalRank: 8, name: "African Nations Championship - Qualification" },
248
+ { externalId: "29", globalRank: 9, name: "World Cup - Qualification Africa" },
249
+ { externalId: "859", globalRank: 10, name: "COSAFA Cup" },
250
+ { externalId: "535", globalRank: 11, name: "CECAFA Senior Challenge Cup" },
251
+ { externalId: "869", globalRank: 12, name: "CECAFA Club Cup" },
252
+ { externalId: "1072", globalRank: 13, name: "All Africa Games" },
253
+ ],
254
+ },
255
+ {
256
+ confederation: "CAF", category: "women", entries: [
257
+ { externalId: "922", globalRank: 1, name: "Africa Cup of Nations - Women" },
258
+ { externalId: "1164", globalRank: 2, name: "CAF Women's Champions League" },
259
+ { externalId: "1047", globalRank: 3, name: "Olympics Women - Qualification CAF" },
260
+ ],
261
+ },
262
+ {
263
+ confederation: "CAF", category: "youth", entries: [
264
+ { externalId: "538", globalRank: 1, name: "Africa Cup of Nations U20" },
265
+ { externalId: "1015", globalRank: 2, name: "CAF U23 Cup of Nations" },
266
+ { externalId: "973", globalRank: 3, name: "CAF Cup of Nations - U17" },
267
+ { externalId: "953", globalRank: 4, name: "Africa U23 Cup of Nations - Qualification" },
268
+ { externalId: "1159", globalRank: 5, name: "CECAFA U20 Championship" },
269
+ { externalId: "771", globalRank: 6, name: "COSAFA U20 Championship" },
270
+ ],
271
+ },
272
+ // --- OFC ---
273
+ {
274
+ confederation: "OFC", category: "men", entries: [
275
+ { externalId: "27", globalRank: 1, name: "OFC Champions League" },
276
+ { externalId: "806", globalRank: 2, name: "OFC Nations Cup" },
277
+ { externalId: "1214", globalRank: 3, name: "Ofc Pro League" },
278
+ { externalId: "770", globalRank: 4, name: "Pacific Games" },
279
+ { externalId: "33", globalRank: 5, name: "World Cup - Qualification Oceania" },
280
+ ],
281
+ },
282
+ {
283
+ confederation: "OFC", category: "youth", entries: [
284
+ { externalId: "1122", globalRank: 1, name: "OFC U19 Championship" },
285
+ ],
286
+ },
287
+ ];
288
+ /**
289
+ * `externalId` → its position inside its own curated group. Order only, and a
290
+ * duplicate keeps the first entry so the map is a function — a repeat would
291
+ * mean the table lists one competition twice.
292
+ */
293
+ function curatedWorldOrder(groups = exports.ALL_RANKS) {
294
+ const order = new Map();
295
+ for (const group of groups) {
296
+ for (const entry of group.entries) {
297
+ if (!order.has(entry.externalId)) {
298
+ order.set(entry.externalId, entry.globalRank);
299
+ }
300
+ }
301
+ }
302
+ return order;
303
+ }
304
+ //# sourceMappingURL=world-tournament-order.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"world-tournament-order.js","sourceRoot":"","sources":["../../src/classification/world-tournament-order.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;GAkBG;;;AAkSH,8CAYC;AAhSY,QAAA,SAAS,GAAgB;IACpC,iBAAiB;IACjB;QACE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE;YACjD,EAAE,UAAU,EAAE,GAAG,EAAK,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,WAAW,EAAE;YACzD,EAAE,UAAU,EAAE,IAAI,EAAI,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,qBAAqB,EAAE;YACnE,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,2BAA2B,EAAE;YACzE,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,cAAc,EAAE;YAC5D,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,yBAAyB,EAAE;YACvE,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,UAAU,EAAE;YACxD,EAAE,UAAU,EAAE,IAAI,EAAI,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,gCAAgC,EAAE;YAC9E,EAAE,UAAU,EAAE,IAAI,EAAI,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,sDAAsD,EAAE;YACpG,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,+BAA+B,EAAE;YAC7E,EAAE,UAAU,EAAE,IAAI,EAAI,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,6BAA6B,EAAE;YAC3E,EAAE,UAAU,EAAE,IAAI,EAAI,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE;YAC1D,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE;YAChE,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE;YAC5D,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,4BAA4B,EAAE;YAC1E,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,uCAAuC,EAAE;YACrF,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;YACzD,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,0BAA0B,EAAE;YACxE,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE;YACnE,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE;YAClE,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,yBAAyB,EAAE;YACvE,EAAE,UAAU,EAAE,IAAI,EAAI,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE;SACnE;KACF;IACD;QACE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE;YACnD,EAAE,UAAU,EAAE,GAAG,EAAK,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE;YAChE,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE;YAC7D,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,0BAA0B,EAAE;YACvE,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,qCAAqC,EAAE;YAClF,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE;YAC/D,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,qCAAqC,EAAE;YAClF,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE;YACtE,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE;SACvE;KACF;IACD;QACE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE;YACnD,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE;YAC9D,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE;YAC9D,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE;YACtE,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,kCAAkC,EAAE;SAChF;KACF;IAED,eAAe;IACf;QACE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE;YAC/C,EAAE,UAAU,EAAE,GAAG,EAAK,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,uBAAuB,EAAE;YACrE,EAAE,UAAU,EAAE,GAAG,EAAK,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,oBAAoB,EAAE;YAClE,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,+BAA+B,EAAE;YAC7E,EAAE,UAAU,EAAE,GAAG,EAAK,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,mBAAmB,EAAE;YACjE,EAAE,UAAU,EAAE,GAAG,EAAK,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,qBAAqB,EAAE;YACnE,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,gBAAgB,EAAE;YAC9D,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,mCAAmC,EAAE;YACjF,EAAE,UAAU,EAAE,IAAI,EAAI,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,kCAAkC,EAAE;YAChF,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,6BAA6B,EAAE;YAC3E,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,kCAAkC,EAAE;YAChF,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE;YAC1D,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE;YAChE,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE;SACnE;KACF;IACD;QACE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE;YACjD,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,6BAA6B,EAAE;YAC3E,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,2BAA2B,EAAE;YACzE,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,6BAA6B,EAAE;YAC3E,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,yBAAyB,EAAE;YACvE,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,2CAA2C,EAAE;YACzF,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,0CAA0C,EAAE;YACxF,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,aAAa,EAAE;YAC3D,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,+BAA+B,EAAE;YAC7E,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,+BAA+B,EAAE;YAC7E,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,wBAAwB,EAAE;SACvE;KACF;IACD;QACE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE;YACjD,EAAE,UAAU,EAAE,IAAI,EAAI,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,mBAAmB,EAAE;YACjE,EAAE,UAAU,EAAE,IAAI,EAAI,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,uBAAuB,EAAE;YACrE,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,uBAAuB,EAAE;YACrE,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,uBAAuB,EAAE;YACrE,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,uCAAuC,EAAE;YACrF,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,uCAAuC,EAAE;YACrF,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,uCAAuC,EAAE;YACrF,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,yBAAyB,EAAE;YACvE,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,kBAAkB,EAAE;YAChE,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE;YAChE,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE;SACpE;KACF;IAED,mBAAmB;IACnB;QACE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE;YACnD,EAAE,UAAU,EAAE,IAAI,EAAI,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE;YACpE,EAAE,UAAU,EAAE,GAAG,EAAK,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE;YAC3D,EAAE,UAAU,EAAE,IAAI,EAAI,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE;YACpE,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE;YAC9D,EAAE,UAAU,EAAE,IAAI,EAAI,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,yCAAyC,EAAE;YACtF,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,mCAAmC,EAAE;YAChF,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE;SACrE;KACF;IACD;QACE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE;YACrD,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE;YACpE,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,gCAAgC,EAAE;YAC7E,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,+BAA+B,EAAE;SAC7E;KACF;IACD;QACE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE;YACrD,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE;YAC/D,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,2BAA2B,EAAE;YACxE,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE;YAC7D,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE;YACpE,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE;YACtE,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,4BAA4B,EAAE;SAC1E;KACF;IAED,cAAc;IACd;QACE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE;YAC9C,EAAE,UAAU,EAAE,IAAI,EAAI,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,sBAAsB,EAAE;YACpE,EAAE,UAAU,EAAE,GAAG,EAAK,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,WAAW,EAAE;YACzD,EAAE,UAAU,EAAE,IAAI,EAAI,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,SAAS,EAAE;YACvD,EAAE,UAAU,EAAE,IAAI,EAAI,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,2BAA2B,EAAE;YACzE,EAAE,UAAU,EAAE,IAAI,EAAI,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,gCAAgC,EAAE;YAC9E,EAAE,UAAU,EAAE,IAAI,EAAI,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,oBAAoB,EAAE;YAClE,EAAE,UAAU,EAAE,IAAI,EAAI,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,qBAAqB,EAAE;YACnE,EAAE,UAAU,EAAE,IAAI,EAAI,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,mBAAmB,EAAE;YACjE,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,kBAAkB,EAAE;YAChE,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;YAC3D,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,uBAAuB,EAAE;YACrE,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE;YACjE,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE;YACpE,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,yBAAyB,EAAE;YACvE,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,6BAA6B,EAAE;YAC3E,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,gDAAgD,EAAE;YAC9F,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;YACzD,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE;YAC1D,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;YACzD,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE;YACnE,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,0BAA0B,EAAE;SACzE;KACF;IACD;QACE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE;YAChD,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE;YAC9D,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,8BAA8B,EAAE;YAC3E,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,iCAAiC,EAAE;YAC9E,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,2BAA2B,EAAE;YACxE,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,2BAA2B,EAAE;YACxE,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,0BAA0B,EAAE;YACvE,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,wCAAwC,EAAE;SACtF;KACF;IACD;QACE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE;YAChD,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,mBAAmB,EAAE;YACjE,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,mBAAmB,EAAE;YACjE,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,mBAAmB,EAAE;YACjE,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,mCAAmC,EAAE;YACjF,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,mCAAmC,EAAE;YACjF,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,mCAAmC,EAAE;YACjF,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,wBAAwB,EAAE;YACtE,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,wBAAwB,EAAE;YACtE,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,sBAAsB,EAAE;YACpE,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,uBAAuB,EAAE;SACtE;KACF;IAED,mBAAmB;IACnB;QACE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE;YACnD,EAAE,UAAU,EAAE,IAAI,EAAI,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,2BAA2B,EAAE;YACzE,EAAE,UAAU,EAAE,IAAI,EAAI,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,mBAAmB,EAAE;YACjE,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,yBAAyB,EAAE;YACvE,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,aAAa,EAAE;YAC3D,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,iBAAiB,EAAE;YAC/D,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,mCAAmC,EAAE;YACjF,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,yCAAyC,EAAE;YACvF,EAAE,UAAU,EAAE,IAAI,EAAI,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,oCAAoC,EAAE;YAClF,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,eAAe,EAAE;YAC7D,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE;YACpE,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE;YAC7D,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,sCAAsC,EAAE;YACpF,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,gCAAgC,EAAE;YAC9E,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,+BAA+B,EAAE;YAC7E,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE;YAC/D,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,uCAAuC,EAAE;SACtF;KACF;IACD;QACE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE;YACrD,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,2BAA2B,EAAE;YACxE,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,0BAA0B,EAAE;YACvE,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,4CAA4C,EAAE;YACzF,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE;YAC9D,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,2CAA2C,EAAE;YACxF,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE;YACjE,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE;SAClE;KACF;IACD;QACE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE;YACrD,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE;YAC3D,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE;YAC3D,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,8BAA8B,EAAE;SAC5E;KACF;IAED,cAAc;IACd;QACE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE;YAC9C,EAAE,UAAU,EAAE,IAAI,EAAI,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,sBAAsB,EAAE;YACpE,EAAE,UAAU,EAAE,GAAG,EAAK,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,uBAAuB,EAAE;YACrE,EAAE,UAAU,EAAE,IAAI,EAAI,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,uBAAuB,EAAE;YACrE,EAAE,UAAU,EAAE,IAAI,EAAI,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,uCAAuC,EAAE;YACrF,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,eAAe,EAAE;YAC7D,EAAE,UAAU,EAAE,IAAI,EAAI,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,8BAA8B,EAAE;YAC5E,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,yBAAyB,EAAE;YACvE,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,8CAA8C,EAAE;YAC5F,EAAE,UAAU,EAAE,IAAI,EAAI,UAAU,EAAE,CAAC,EAAG,IAAI,EAAE,kCAAkC,EAAE;YAChF,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE;YAC1D,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,6BAA6B,EAAE;YAC3E,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE;YAC/D,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE;SACjE;KACF;IACD;QACE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE;YAChD,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,+BAA+B,EAAE;YAC5E,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,8BAA8B,EAAE;YAC3E,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,oCAAoC,EAAE;SAClF;KACF;IACD;QACE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE;YAChD,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,2BAA2B,EAAE;YACxE,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE;YACrE,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,0BAA0B,EAAE;YACvE,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,2CAA2C,EAAE;YACxF,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE;YACtE,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE;SACvE;KACF;IAED,cAAc;IACd;QACE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE;YAC9C,EAAE,UAAU,EAAE,IAAI,EAAI,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE;YACnE,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE;YAC9D,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE;YAC7D,EAAE,UAAU,EAAE,KAAK,EAAG,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE;YAC5D,EAAE,UAAU,EAAE,IAAI,EAAI,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,mCAAmC,EAAE;SACjF;KACF;IACD;QACE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE;YAChD,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE;SACpE;KACF;CACF,CAAC;AAEF;;;;GAIG;AACH,SAAgB,iBAAiB,CAC/B,SAAsB,iBAAS;IAE/B,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;gBACjC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -117,8 +117,9 @@ export declare function renameRejectionOf(proposed: string, ctx: RenameContext):
117
117
  * `normalize(name)::normalizeCountry(country)`. A miss is not retried: the row
118
118
  * goes to `notFound` and is absent from the payload posted to
119
119
  * `/ingest/leagues/classify`, so `rating` quietly stops being refreshed for
120
- * that league — and a reviewed script derives `globalRank` from that `rating`,
121
- * so the position ordering every homepage section goes stale with it. (The
120
+ * that league — and `globalRank` is derived from that `rating`, so the
121
+ * position ordering every homepage section goes stale with it, on the weekly
122
+ * schedule since Q-4 rather than whenever a script was next run by hand. (The
122
123
  * payload has carried no `globalRank` since LEA-8, and no `alternateNames`
123
124
  * since Q-3.)
124
125
  *