From 946c90511aa16b20f244531e16b0c6a683bc0e1c Mon Sep 17 00:00:00 2001 From: ChuckBuilds Date: Fri, 10 Jul 2026 09:58:23 -0400 Subject: [PATCH 1/3] Add Cricket scoreboard plugin New from-scratch cricket-scoreboard plugin covering international matches (Test/ODI/T20I) and major domestic T20 leagues (IPL, Big Bash, The Hundred, PSL, CPL, SA20, ILT20, MLC, and more), sourced from ESPN's public cricket API. Highlights: - Series-ID discovery: cricket has no stable league id on ESPN, so numeric per-tour/per-season series ids are re-resolved periodically from the header endpoint, matched against favorite_competitions (by search terms in competitions.json) and favorite_teams (national teams in series names). - Base-6 overs math: 18.4 overs -> 18.667 decimal overs before any run-rate division; current + required run rate; unit-tested. - Four render branches: live limited-overs, live Test (day/session, no clock), recent (result summary), upcoming (date/venue/format). - Config parity with the other sports scoreboards plus the dual favorite_teams / favorite_competitions filter, customization fonts+colors, dynamic duration, live priority, and Vegas hooks. - Franchise logos auto-download; bundled national-team flag placeholders. Validated: py_compile clean, all JSON parses, 21 unit tests pass, parser and live series discovery verified against the real ESPN endpoints. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01KEZK1P1Q1fu5pcuVrkrCFZ --- plugins.json | 27 + plugins/cricket-scoreboard/.gitignore | 146 ++++++ plugins/cricket-scoreboard/LICENSE | 17 + plugins/cricket-scoreboard/README.md | 109 ++++ .../cricket-scoreboard/assets/flags/AFG.png | Bin 0 -> 841 bytes .../cricket-scoreboard/assets/flags/AUS.png | Bin 0 -> 983 bytes .../cricket-scoreboard/assets/flags/BAN.png | Bin 0 -> 875 bytes .../cricket-scoreboard/assets/flags/ENG.png | Bin 0 -> 965 bytes .../cricket-scoreboard/assets/flags/IND.png | Bin 0 -> 805 bytes .../cricket-scoreboard/assets/flags/IRE.png | Bin 0 -> 860 bytes .../cricket-scoreboard/assets/flags/NZ.png | Bin 0 -> 667 bytes .../cricket-scoreboard/assets/flags/PAK.png | Bin 0 -> 871 bytes .../cricket-scoreboard/assets/flags/RSA.png | Bin 0 -> 1057 bytes .../cricket-scoreboard/assets/flags/SA.png | Bin 0 -> 883 bytes .../cricket-scoreboard/assets/flags/SL.png | Bin 0 -> 743 bytes .../cricket-scoreboard/assets/flags/WI.png | Bin 0 -> 608 bytes .../cricket-scoreboard/assets/flags/ZIM.png | Bin 0 -> 831 bytes .../assets/flags/afghanistan.png | Bin 0 -> 841 bytes .../assets/flags/australia.png | Bin 0 -> 983 bytes .../assets/flags/bangladesh.png | Bin 0 -> 875 bytes .../assets/flags/england.png | Bin 0 -> 965 bytes .../cricket-scoreboard/assets/flags/india.png | Bin 0 -> 805 bytes .../assets/flags/ireland.png | Bin 0 -> 860 bytes .../assets/flags/new_zealand.png | Bin 0 -> 667 bytes .../assets/flags/pakistan.png | Bin 0 -> 871 bytes .../assets/flags/south_africa.png | Bin 0 -> 1057 bytes .../assets/flags/south_africa2.png | Bin 0 -> 883 bytes .../assets/flags/sri_lanka.png | Bin 0 -> 743 bytes .../assets/flags/west_indies.png | Bin 0 -> 608 bytes .../assets/flags/zimbabwe.png | Bin 0 -> 831 bytes .../assets/fonts/4x6-font.ttf | Bin 0 -> 14164 bytes .../assets/fonts/5by7.regular.ttf | Bin 0 -> 454704 bytes .../assets/fonts/PressStart2P-Regular.ttf | Bin 0 -> 116008 bytes plugins/cricket-scoreboard/competitions.json | 63 +++ plugins/cricket-scoreboard/config_schema.json | 492 ++++++++++++++++++ .../cricket_data_fetcher.py | 476 +++++++++++++++++ .../cricket-scoreboard/cricket_renderer.py | 438 ++++++++++++++++ plugins/cricket-scoreboard/logo_downloader.py | 177 +++++++ plugins/cricket-scoreboard/manager.py | 470 +++++++++++++++++ plugins/cricket-scoreboard/manifest.json | 43 ++ plugins/cricket-scoreboard/requirements.txt | 12 + plugins/cricket-scoreboard/test/harness.json | 108 ++++ .../cricket-scoreboard/test_cricket_plugin.py | 225 ++++++++ 43 files changed, 2803 insertions(+) create mode 100644 plugins/cricket-scoreboard/.gitignore create mode 100644 plugins/cricket-scoreboard/LICENSE create mode 100644 plugins/cricket-scoreboard/README.md create mode 100644 plugins/cricket-scoreboard/assets/flags/AFG.png create mode 100644 plugins/cricket-scoreboard/assets/flags/AUS.png create mode 100644 plugins/cricket-scoreboard/assets/flags/BAN.png create mode 100644 plugins/cricket-scoreboard/assets/flags/ENG.png create mode 100644 plugins/cricket-scoreboard/assets/flags/IND.png create mode 100644 plugins/cricket-scoreboard/assets/flags/IRE.png create mode 100644 plugins/cricket-scoreboard/assets/flags/NZ.png create mode 100644 plugins/cricket-scoreboard/assets/flags/PAK.png create mode 100644 plugins/cricket-scoreboard/assets/flags/RSA.png create mode 100644 plugins/cricket-scoreboard/assets/flags/SA.png create mode 100644 plugins/cricket-scoreboard/assets/flags/SL.png create mode 100644 plugins/cricket-scoreboard/assets/flags/WI.png create mode 100644 plugins/cricket-scoreboard/assets/flags/ZIM.png create mode 100644 plugins/cricket-scoreboard/assets/flags/afghanistan.png create mode 100644 plugins/cricket-scoreboard/assets/flags/australia.png create mode 100644 plugins/cricket-scoreboard/assets/flags/bangladesh.png create mode 100644 plugins/cricket-scoreboard/assets/flags/england.png create mode 100644 plugins/cricket-scoreboard/assets/flags/india.png create mode 100644 plugins/cricket-scoreboard/assets/flags/ireland.png create mode 100644 plugins/cricket-scoreboard/assets/flags/new_zealand.png create mode 100644 plugins/cricket-scoreboard/assets/flags/pakistan.png create mode 100644 plugins/cricket-scoreboard/assets/flags/south_africa.png create mode 100644 plugins/cricket-scoreboard/assets/flags/south_africa2.png create mode 100644 plugins/cricket-scoreboard/assets/flags/sri_lanka.png create mode 100644 plugins/cricket-scoreboard/assets/flags/west_indies.png create mode 100644 plugins/cricket-scoreboard/assets/flags/zimbabwe.png create mode 100644 plugins/cricket-scoreboard/assets/fonts/4x6-font.ttf create mode 100644 plugins/cricket-scoreboard/assets/fonts/5by7.regular.ttf create mode 100644 plugins/cricket-scoreboard/assets/fonts/PressStart2P-Regular.ttf create mode 100644 plugins/cricket-scoreboard/competitions.json create mode 100644 plugins/cricket-scoreboard/config_schema.json create mode 100644 plugins/cricket-scoreboard/cricket_data_fetcher.py create mode 100644 plugins/cricket-scoreboard/cricket_renderer.py create mode 100644 plugins/cricket-scoreboard/logo_downloader.py create mode 100644 plugins/cricket-scoreboard/manager.py create mode 100644 plugins/cricket-scoreboard/manifest.json create mode 100644 plugins/cricket-scoreboard/requirements.txt create mode 100644 plugins/cricket-scoreboard/test/harness.json create mode 100644 plugins/cricket-scoreboard/test_cricket_plugin.py diff --git a/plugins.json b/plugins.json index c54ca1a4..aa1ad9bb 100644 --- a/plugins.json +++ b/plugins.json @@ -2,6 +2,33 @@ "version": "1.0.0", "last_updated": "2026-07-08", "plugins": [ + { + "id": "cricket-scoreboard", + "name": "Cricket Scoreboard", + "description": "Live, recent, and upcoming cricket matches across international tours (Test/ODI/T20I) and major domestic T20 leagues including the IPL, Big Bash League, The Hundred, PSL, CPL, SA20 and more. Shows runs/wickets/overs, run rates, targets, and match results.", + "author": "ChuckBuilds", + "category": "sports", + "tags": [ + "cricket", + "ipl", + "big-bash", + "t20", + "test-cricket", + "odi", + "sports", + "scoreboard", + "live-scores" + ], + "repo": "https://github.com/ChuckBuilds/ledmatrix-plugins", + "branch": "main", + "plugin_path": "plugins/cricket-scoreboard", + "stars": 0, + "downloads": 0, + "last_updated": "2026-07-10", + "verified": true, + "screenshot": "", + "latest_version": "1.0.0" + }, { "id": "7-segment-clock", "name": "7-Segment Clock", diff --git a/plugins/cricket-scoreboard/.gitignore b/plugins/cricket-scoreboard/.gitignore new file mode 100644 index 00000000..979acecd --- /dev/null +++ b/plugins/cricket-scoreboard/.gitignore @@ -0,0 +1,146 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +Pipfile.lock + +# PEP 582 +__pypcache__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# OS specific files +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# IDE files +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# Project specific +*.log +config.json +*.pem diff --git a/plugins/cricket-scoreboard/LICENSE b/plugins/cricket-scoreboard/LICENSE new file mode 100644 index 00000000..e653a0c1 --- /dev/null +++ b/plugins/cricket-scoreboard/LICENSE @@ -0,0 +1,17 @@ +GNU GENERAL PUBLIC LICENSE +Version 3, 29 June 2007 + +Copyright (C) 2025 LEDMatrix Team + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . diff --git a/plugins/cricket-scoreboard/README.md b/plugins/cricket-scoreboard/README.md new file mode 100644 index 00000000..66563202 --- /dev/null +++ b/plugins/cricket-scoreboard/README.md @@ -0,0 +1,109 @@ +# Cricket Scoreboard + +Live, recent, and upcoming cricket for the LEDMatrix display — covering both +**international** matches (Test / ODI / T20I) and the **major domestic T20 +leagues** (IPL, Big Bash, The Hundred, PSL, CPL, SA20, ILT20, MLC, and more). + +Data comes from ESPN's public cricket API (no API key required). + +## Display modes + +| Mode | Shows | +|------|-------| +| `cricket_live` | In-progress matches. Limited-overs matches show `runs/wickets (overs/max ov)`, current run rate, and — when a side is chasing — the target, runs still needed, and required run rate. Test matches show the day + session (Stumps / Lunch / Tea …) and both innings, with no clock. | +| `cricket_recent` | Completed matches: final scores + ESPN's result summary (e.g. `"RCB won by 5 wkts (12b rem)"`). | +| `cricket_upcoming` | Scheduled matches: date/time, teams, venue, and a format badge. | + +Live matches take priority in the rotation when `live_priority` is on. + +## How series discovery works + +Unlike most sports, cricket has **no single stable league id** on ESPN — it is +organised as dozens of concurrent, per-tour / per-season numeric *series* ids +(e.g. a given season of the IPL might be `8048`, Major League Cricket `21266`, +the Vitality Blast `8053`). Those ids change every season. + +So instead of hardcoding ids, the plugin **discovers them periodically**: + +1. It reads a curated seed list, [`competitions.json`](competitions.json), that + maps human competition keys (`ipl`, `bbl`, `the-hundred`, …) to stable + **search terms** (competition *names* are far more stable than their ids). +2. Every `series_discovery_interval` seconds (default 24h) it queries ESPN's + cricket header endpoint, lists every active series, and resolves them: + - **domestic** competitions are matched by name against your + `favorite_competitions` search terms; + - **international** series are matched by your `favorite_teams` national-team + names appearing in the series/event names (e.g. *"India tour of England + 2026"*). +3. Each resolved numeric id's `/scoreboard` is then fetched and parsed. + +Resolved ids are cached (via the host `cache_manager`) so discovery is cheap. + +## Overs math (base-6) + +Cricket overs are **base-6 in the fractional part**: `18.4` overs means 18 +completed overs **plus 4 balls** = `18 + 4/6 = 18.667` decimal overs, *not* +18.4. The plugin converts `overs → decimal overs` before any run-rate division: + +- current run rate = `runs / decimal_overs` +- required run rate = `runs_needed / (balls_remaining / 6)` + +This conversion is unit-tested (`test_cricket_plugin.py::TestOversMath`). + +## Configuration + +Configured under the `cricket-scoreboard` key in `config/config.json`. See +[`config_schema.json`](config_schema.json) for the full schema; key fields: + +| Key | Default | Purpose | +|-----|---------|---------| +| `enabled` | `false` | Master on/off | +| `favorite_teams` | `[]` | National teams (name or abbr, e.g. `"India"`, `"IND"`) whose international series are followed | +| `favorite_competitions` | `["international","ipl","bbl"]` | Domestic competition keys from `competitions.json` (`international` follows Test/ODI/T20I tours for your favorite teams) | +| `exclude_teams` | `[]` | Teams to always hide (spoiler protection) | +| `show_favorite_teams_only` | `false` | Restrict *international* matches to those featuring a favorite team | +| `live_game_duration` / `recent_game_duration` / `upcoming_game_duration` | 20 / 15 / 15 | Per-match on-screen seconds | +| `non_favorite_live_game_duration` | `0` | Shorter turn for live matches without a favorite (0 = same as `live_game_duration`) | +| `update_interval_seconds` / `live_update_interval` | 3600 / 30 | Data refresh cadence | +| `series_discovery_interval` | `86400` | How often numeric series ids are re-resolved | +| `recent_games_to_show` / `upcoming_games_to_show` | 5 / 5 | Match counts per mode | +| `live_priority` | `true` | Live matches interrupt the normal rotation | +| `display_modes` | all on | Toggle live / recent / upcoming | +| `dynamic_duration`, `mode_durations` | off / null | Auto-size or cap each mode's total time | +| `celebration_enabled`, `celebration_duration` | true / 8 | Win-celebration takeover | +| `background_service` | enabled | Worker/timeout/retry tuning | +| `customization` | — | Fonts + colors for score / overs / team / status / detail text | + +## Logos and flags + +- **Franchise** teams (IPL/BBL/etc.) auto-download their logo from ESPN + (`team.logos[0].href`) into `assets/logos/` on first sight, with a + text-abbreviation placeholder on failure — the same pattern the other sports + scoreboards use. +- **National** teams use bundled flag PNGs in + [`assets/flags/`](assets/flags/) (keyed by both abbreviation and lowercase + name), because national-team abbreviations can collide with franchise codes. + +> **Note:** the bundled flags are **simple generated placeholders** (solid +> national colors + abbreviation) so the wiring is complete and functional out +> of the box. Replace them with real 48×48 flag art (same filenames) for a nicer +> display. + +## v1 limitations + +- **No per-ball / per-player detail** (current striker, bowler figures, economy + rate). ESPN's cricket scoreboard response carries no `rosters`/`lineups`; that + would require a separate boxscore endpoint and is a possible fast-follow. +- **The Hundred** counts balls (100) rather than overs; run rates for it are + best-effort. +- Flag art is placeholder (see above). + +## Testing + +```bash +python -m unittest test_cricket_plugin # needs Pillow + requests +``` + +Covers the base-6 overs conversion, run-rate math, format normalization, all +four renderer branches at every matrix size, and a manager update/display +smoke test driven by the mocked responses in [`test/harness.json`](test/harness.json). diff --git a/plugins/cricket-scoreboard/assets/flags/AFG.png b/plugins/cricket-scoreboard/assets/flags/AFG.png new file mode 100644 index 0000000000000000000000000000000000000000..18d83f32e80978189f62d796c2d1ebdb6aa5fc63 GIT binary patch literal 841 zcmV-P1GfB$P)n`)4PCdkOt(ATju$qTrKKgUSxNS}?VD%bd44-PlgXlFGRffr3kMxwP=x?N zD+CByAwbXy0fJTt5VS&opcMiHtqTtz_G_e+7AU1fe_hx03?U?OczC$pPai@^Lf7?7 zw|;(KuYP?2P)ZApMx*p7Iy$pFqNlw2qIr<}Old(;lp6p5U&e1NoYiN?Wlq+qRlVnx zm~lI+#jf}A4Gh2-GqY-R;=Zh1+HJDhlbTgnjgQT)MB>x0XmxMXbx%yTVIP$?Y+Ca7 zF)0M4I;cb@J)Do){Rw`!wdGN_t8pk-TG@@9d)zz!=O)it*90%Wr)F zcAKpB-l_kRWqHD@A%sMMkO-^VI{*M{#&~94QWBq7!)o_>J`KxKuWWq*0Q~(lp4F`4 z)8nu+2Yc&l#&~8q5>MZi6yt$;kZT`b3pX_1b=W?VH=Ajx1gEdl_RUW6WH%oy6mqaqFfi#Q*@B&F1h

Dz2 zC-jA_Z@aAS9j_Q;8Dm+NG1e%hMQ{IPBk}Z{q$D0%KezL&VOCo$cAh-v251jPDgAoZ zgcxH*Rn81r+mQ)IY%|HYhL>TCU;R7FaQ=b&{iI2KISN71Z ze}N!~2KqzbjT>jeHUx`5W`0$QUBXpJtQHM)S-=mJ`!3uw)$7ci*}ynYj@#bxll z?Y}HzCL9E92x6tXePIrP>sK)zo@cxh$bM8w3piu>{1U*6NHsF@c38q`vzZ z52#l{uT_Ua?0!cs8edovQlEW@F#y2%YnK23MUDr!gI{{S$V{1HXjBCei1Gm7os7&D zWX9gRmRI4j04J--OSM4kFO=>{(+r&Ki;#C7qxfeEXWqR4&-C~${_Z~)Gij-J%<8iW zucc6dt81=K<$aK$q$O0+5B57f)8hpRjm2f~s|l1=moal(ZpWShLl7&m1Vm7yZdhD) zBWevunWu|Vqi(|Ha`f9;|H=7lmq0NzRkGZMP5kNa0?*xD zxT&rv1K&b#PGC6sJ;IJ5^%uZ%G|ErVZYdy4MoA`#FTWu({1(}8lchTGBv)WvLT!S@ zbLXQUgC#+jjDKvB)pH-jMBp*+AXD&Yl%q<9tkNt1oP?(3dPW{ zH=FtGJKJjJ8%$s~na6H2zyCb)*6Xm+&VHfkJgQ&Zz`a@>N_YE&AC7hN$8Q6Gv(DWg zA~}KafFulu#}7NyzUPd4s0zLngu#q*(C|muby>Tu>x)=!-o%2_4_T&UM zm%2X_4({h%G~W3{fcL3DVJ#Z#H$?#eE+P;Pf*y9jyq1Xm+AnSgz}PzoOr1mDt=Wq~ z|8rMkbOEi=1++#N&>CGpYjgpv(FL?d7tk7AKx5{FW>js^WlA8&H)W>UHge63`4tt ze?=9bjVeGJRe(0C0BuwO+Nc7wQ3Ysoa$}-o_ zyJ0hvvU-KN-q+KJ3IeKiI!Lk%DF7KU#?EE4ex4YbZEJr4@DWPBbUj88*R-nK$aV7Rd zT!|H~?=-Y_ASX%iheKFOBmv-dmDzfOC6+JwO!{s-92{vreeO;}YsbUnQsn9C`g&PW zf8h7rgebyVG@cN}gY=~641CUK)86g$s<+Kl>&*y15?gZK(_nXu+g)x%1p!e(xM1Mw zoi(g6vArpI#dr(=dReail-^KRy0!kAE6K8wUJfMy0AOqM=sM8?EmJl(-F11OkL3s- zkA(WeAKn0f@zccEWHu#u%zv6Kp^xRrUR!iO6bY~lqa{KnOGbTDWJ|;7pkb0*va}#? zY?Os99EY1%E}^=r;xS_Y{Y}%JeC5v<|E5ge^_AF{M zlbt(pF=o^5D^|jR1dN|1_I{k`aXR1+g#OCeosPoG{>bd~&Lcu;y-GPNAqVMAqyD)| z8C8HbssL?N0otenv{40UqYBVQ6`+kOK${~k@C&#_Km>XuSxNu^002ovPDHLkV1g%l BrM>_F literal 0 HcmV?d00001 diff --git a/plugins/cricket-scoreboard/assets/flags/ENG.png b/plugins/cricket-scoreboard/assets/flags/ENG.png new file mode 100644 index 0000000000000000000000000000000000000000..5b9308a3e1785080f3a8a9200d226333b751a5d1 GIT binary patch literal 965 zcmV;$13LVPP)9qdWyf+XRgUI5$(DBWuv5%HBMxqsb(0x{4SE=q1z!SThot|&*fJQkwc`#u zFY69t+o7;ap!6_u(RWx$HyrR-NU^ujk&;3{vSK@lW7*bDN?j+b?Jgh!dQSFFuU@~8 zWqltOWtygmbBxRG0sb$JfZaF(cH;=xjU!+;j)2`b0(RpF*v+{Ypt}`N6m{=K8fP+@ zXf~UTrBbOiLWs)qyhqn{Ly{yxQIx4{Hd~Nox%gk_TXo$&r>g(}tOsM)pLhH)_FDbz z2fwUZb;~ui2;lgi-feblDnT(qj%C%Kfa9UR7`yVujcV)iY5ffO^GYwX^(0`iTCY4= zHL6cK^HOfR-kHg=TvQZA%jfguIk3lhKA$gJSLG%n#I`(a^_!Yn=;m7p16 z(@W_Oxu-p?exXpv+sjOS2>`(8=%{aTaq$uWFbv~j7{=}Q``w*&37QesgR$!qrNW7O zsQst5Tv7|u)6>DFrKQ(3O*3ekrZ|qHJswX_3rt@EKDgY4-*X37uf*?LSq-h`XSZ%e z+UxerX1!*b&9IARy7iPKX^0S_MK2B$D{H`PCEk7K!kOK~7W2MfWZoBicGwSR_QUD4 z*}kIOInw|6)!5(t(m(uWw*>$IR#sLfFMa%J*m|F99ID?p8inVb^Fji5>*dFHkIIkR zvz;HlJy^K>(kq>{e|xC%jq)RRX{u$eX7Otzx!}e&zxCyaExIH!yin4dH$c08j(44K)Aw@y>~*6#&M^#|J+u7RmD9 z%U2ULBLD!;^Bz$Yx!iAmYD1KJfCs$dUQGbyLy&Tx_#)0!V8+Xi%y`+6&fMC_+Ot$D zC0IK#*0+vxQ4~2zl7@cX-QDr;?z`t&zQ|XDBNLrHMN#C=OyIPo@EINyPSj<9sP%fG zvc1OhyhpF-hJ=V9%W{mOD9EzB`8BY4T1yF$uA3MDP|m|$n{fo}#u2a^N5F0z0lRSo n?8XtW8%Mxy909vI_X7U{fzd_c0oD8!00000NkvXXu0mjf?wHzu literal 0 HcmV?d00001 diff --git a/plugins/cricket-scoreboard/assets/flags/IND.png b/plugins/cricket-scoreboard/assets/flags/IND.png new file mode 100644 index 0000000000000000000000000000000000000000..cec28f027aced829cb2204e708928f0a4cbe2305 GIT binary patch literal 805 zcmV+=1KRwFP)6BS0HRfHsZ*Z5#pGI0Ce}@&YcBpxA6Km6TPbm4T-Re33T~#9k{`L@Zy# z#^HH+U&s8>ShpaNK8HvkKIn_QzRmTgJ9X5ozju$rtMB(0q<6w706=w7%fKGgf9ZKA zP?QU?k~eE8-!kn zbK)DN%<`XF;k$y%XFUdQ>T>OeAp-z(yyW`<0G@uzrL5H>nH$j=h!6TAGhrz>R79GV zH40X{mNg1PMWoGyrC?)x+psI*oj}o~tSbN8HhRviT+hND-qdA)qm>e$@weg|rA%x# zN3hG#+vXMtX!Ud*4Wp&@~=%2kh;9h?UOTDvgA_E;j&xGNsNPW(|cK;=Ph&?qS&d+#uLuMxe4uA#b@V8OGIrDET*JulctkPjG zWL7<}3Rz=ctXq(*O8gCsrsJYME`a*D`VCfH(9(~q$h>nGox0U7Brv^J%B;?w{VK6~ z{HaW-bM?jnh*)3C37irU%a@P$`H46i@iAXZuM&*&=PqR&0ophMv~dJz;|S2k5ulAD jKpRJZHjV&ouDrlMJ}4pQJVkyJ00000NkvXXu0mjf&*pTC literal 0 HcmV?d00001 diff --git a/plugins/cricket-scoreboard/assets/flags/IRE.png b/plugins/cricket-scoreboard/assets/flags/IRE.png new file mode 100644 index 0000000000000000000000000000000000000000..f86c6b5d491ed2c9d542b4f6694ff085dd30fba7 GIT binary patch literal 860 zcmV-i1Ec(jP)$D9lE44O6l?eRc6u|Sqd`v(e{k^0 zl^E2@LUVibzw&qqke!YCVS;Wvjwi8f>*G;~Y3Z@NO7@w~{cVq%(_Yt|IEVoNz-D>e zejPLshNX!6-wI%sDp8SgtTnxf76fIMbq#V!s zw6`T7F{qUQ0Fdz0QSf%oyKb$vT$OjYT9bJVqLRxHwSojN1Z}oAtdQck=|B|#06-EH zhA;$yFcg6>6xlU_?T}>SYrzL&Gnbn*RhoPZ&z2*@5Ja&Q2!q?tC%9OcNhF}NhjhgG z1_Ph_?1@0CFhYV2UeFs?V~Myg9A^X3csxDNY^up+#+Jam?Y(hr>0T~=S%bW&K=%u z^cdGhbp<3BKcOoqD)!PL>ZR3X$+(818Rp5CWlvXKu^NT|RHv57o4@~DNzXf2DkHo0 z=c@o<{{)gO0KrItnp|>E>~L;;}@1%yTv5E@ZH mXhZ>_5e0-s6cC!67x)dh2RpR7s1)A-0000G8 z$LEr>v`2IFwm^xNp9%u^Z9YFceR_tY;zW-d1;{-s&vvGZ=^^aE#)4x{P-h5kjpXcz69go`*|7eJH&)@s=ZQ1X=>iLh) zR_eKPhiFZe_Pu;BYnIuUKF%hEq@Ls{m!@XUigr5j=Ypw#Q~sZ8_9vD6mS0Z1y>0Wo z9SR(bk<*eVsl-N2`?@0YR($2wsN5otKlK*7n0KwS7jimNVe{|P1&gI2>MduAcgAdp z(TlhKShd&gWrqWeue4sxG7StB^;&wVRBbXRGegPl zyX|4CP3NCY3*V%3yl-XwBv%`$UbB-aLe;D~r;Rk0R;>*SzWlP}MyEJeYjxzb^&+mF ziY;;S!M|0q6(o4#m>7DFKc0X4?X{Brx8HyJpL_EA?>;?_L$VAF8eK+;PZ|Y`mQQ(A zmpy+8GXn$1!tj$RoB9p^J=k}9kp|bfN)@4rT&+!?PvkH%Ogp{QPKHlWs<-VRySgAp zt5f20-#_d3glLsMtYzn6Yd&6M_y2Bw?tP|niy1ytYd@TmJAS%1t}qPaS5jYf`O8|zg>(P_(AnhC!gVVdf;>UFGiqBt0-0u0DAV<3~z^z-05f0 zPD~dH07xd22gPFXkWBQ3YYRd%v?SnmyW4s?yhZ~7oaU6G} zZ=k;`^5CA{%y60#AcXvR{SP%>pBv>^mQ5UQ5gO$FItSorD`DCJ(@FflbLn@Zwt&^x x0#;)SSdA@UHMW4&*aB8#3s{XUU^SOs;1|!#k>1uUH;n)Q002ovPDHLkV1jv*ncV;Y literal 0 HcmV?d00001 diff --git a/plugins/cricket-scoreboard/assets/flags/RSA.png b/plugins/cricket-scoreboard/assets/flags/RSA.png new file mode 100644 index 0000000000000000000000000000000000000000..08dd7f13afc2cf49572cf0d275dd60f3fda00845 GIT binary patch literal 1057 zcmV++1m63JP)H9LK+x>m`>oxn|8nA6C+?TcR!N+NFyTX zU?!y6^eT6jS|GUwXklzK)1HB54&D%FUg&khl?*}>O$y4v~U#e^D6hh zFTeYJ^5^&GI0EmySi~O2q;~`V7ehdA3<13{1oXxb&>KTQZwvvwF$DBx&kNLSoA}_$ z)onAufFHrf0*H;rF(-=K<^X`3=E3oaip=SrZnU~w+dlIjwif_U{ITVQ&F)1<)Y*YM zP)pbBU`r@;5cVx|W79nDE-Vhby00Vha&3DlbNsvzXSrz}a$6fZnwxe_pu`ZTEM6Xy z7dM(Z%LE{+S#W$}JX=;HqFh7s{jx^X=?6!#_XM%%cUb{#sT6=62~;%$Q?t4B@C5!G&Nf?z$JJ$FT~i}x7(aW#(+xb_sZf{2RhGMH=&exDDmZZ{^gwQoH~Hb_db@b%B~9~Vb3Q&I1mYvZ6{qDZ3ZW4$VY z{;;FHKkV2zHC`GJe`6ydtZ`g3J&iyoCq2BQCvi%vBfavbfR; zox3=an%S)0f1xUYXiQ45ldAa3M-PYgrw=_(M`Kdrz2EI=co{}`JADWMqC?8PfgcJB zu+ucQn3PMSa`Ma3OtN(S@i}Mb6YUgJO;1&CnXs;9zrC(30f31Bak!0gglfbruHBtJ zeqM-A%;cobM$qAdsx@q0P{KWy22Y*Ia%ogfzWM3e)T6cTFXt6@zD8lahZ@+a{MuSZ z%T?P?)kAzcV=0E;7jKkKlD?p|$=hso^nT|Q*onF1TAoB-kZS4+TFcJyp+Hx^)y00KlME!r0t=>y?~J=LLf$ zHRj|E|FB2&N>IwmP+43=nt@E2kLpfbN6{<5(GN+b$V8ppJ}0syYF zn&QUey8Mxu*sAkkK%*ZlkWZAx-%dIrC8U8>r>K4QE0C1w3%dINaWkQt3(KR$o znqyn9&^iW=$3e3hvnwmkdn+S(CYJXv$G)dT0l?K27;o(gNC3c`@%4M|U;qJxO&2qtxwnHkiqj{wr=ShP<#&tLcY{_ zdvkWx0Sjv+y8myG3AkUsIVo{MdvkVGRUvpsc|;G)g;B>9q*n1lY~BQ$`O)?I=Rg1c^0Ij4;xA&Va}p#jF<;>l zRp7-yXFJ6+Hr&4PUF388w1qNL<@fe}xFK6I?X`>k97)-ng0r(%^dF%?W5AeH++8Su6FH3(#|belJV-VH~#v+v6d-w z#;ndsPg|O|@=UAz*7tYk%#_cp^D~b~+8&)_T4byH<9Xc`>1g!=JC1*?n=GXh_c)d} zmb&^^M*oh!n4xmOd})hAqh=)c?dsXy(y!iE@yGP)Htyg#%YAKY)88$fi>6-n@-pgt z+rN9l`(}Gtt)d|DJ!C~c?xEU7W3=Qw+`8buOZ=2;>(DOK9?uo^Y zCzawQPd`nxt!qwY5U|PU*mB^x_=B!8XDhSDXyG4XO**m1XLe{mf3m6Yp0TX^I%bX! z33s_~+@8@s>qXJw$eYKTOUp%m9QYzq^mGQFcjjv|1LL9|rup+1l)u<2_&CV*%Zr*| z{vXRu{SjNgbbah8ZfEn0c3-$Q?td@+;qc4d-2acBirRPdM7-pb&1KIv=w1+SRH=Gc zv+i_pyI97774i?ca|IY4s6P3rEPk6|(c}ql<~20`yQ9j3kv1Ty1(-s9Fneyf)94!f S$_|)-89ZJ6T-G@yGywn`dr)Nn literal 0 HcmV?d00001 diff --git a/plugins/cricket-scoreboard/assets/flags/WI.png b/plugins/cricket-scoreboard/assets/flags/WI.png new file mode 100644 index 0000000000000000000000000000000000000000..34ed35b03757433c7ad5e72875cff7567f1ef036 GIT binary patch literal 608 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezr3(FsXaGIEGZrc{{^4|8jsx+kK05 zu}2>&Zxp(?(39J%^~D7zl_{;?*gpubkmx>gAZFthofXE+K}Or{8+#RBURfws!XeUh z%SzHoc+Q0*+ur=>ZtYmr5@5MR-21!a`Kz{e{pY^!oaTIf{oRiO2@;oBd$>ducrlRg z1J(%p*>UsgDvIsCd3ZeEW?CuE@I$~jv1;AaBxNOrkla|wY5GUqj)*3zJzp*s&&2S+ zvx0*`pKFE4_XRnkDTUVDBHSl*(_=TPI9C1;>el$@%G&VO^K_vt&@qE`)lH2 z)AQ@)Z$*7R@aoF{GJl@K{z{yiOe zV6T5xa z?_CuySvS$Q^!MdgK`aaj-q!bg+go?M$yi$w(P2Ns=gePCvvdBO_nH24H_9&#X)wWx d8pVGwe!X^c>JhhFIlz>|;OXk;vd$@?2>@Rw3pM}% literal 0 HcmV?d00001 diff --git a/plugins/cricket-scoreboard/assets/flags/ZIM.png b/plugins/cricket-scoreboard/assets/flags/ZIM.png new file mode 100644 index 0000000000000000000000000000000000000000..fab010a4b7374ad9103bfcb5afa0d4e6226c3fae GIT binary patch literal 831 zcmV-F1Hk-=P)#_M~(`#*i}egAJ;#Kprp8<=9z z1^g?PfM_fM(O3eau>?e835doL5RD}unhh_o$#lfkp~q`V@;N;KOr#S9RnR2)Y1$E> zXJmkhbb=DwW`57l;&Xa98)!7U-CUrxu3it1NvjQs4w8_=#AufMk@ng8&~DYf;<)ir zO>R+p^*5XX=;|gGe#gQu!pLnJLk;tug}gOjF7RmV<>@qe0{3rFzwE-dOo~1wcKM@< z*Ny$aUMj+!1OUR_jJzLZCZ1Hay!?J8M!#Yd>tB|)E&{D}^$!5P{+uSI{o+GXS#eyI z!$q^?k7m3YuYY{`F`b$+K8g-96`67sb7)%)gJTP?*yT?A@)0WK4hD=_DHQWX9CS+r z-4Z*?x00FD=7*%x z7D(IApP|OMeB~Cg2fZi@3$Z{F(`Xr$`CZkN4UhBFCsA5ff~}B@wQZw)N-R{K)Y?xV z9XpB#;NdeS?>y7f-OXzzh%164D%Vd_VNk3u6KoL3^inn z2WY#%5J7h}``i-VGH0O=UN6iAbX}i&#YtN+MeujaG~W3wb_c`BNfPP|j!oIEGc%|0 zDHW$OCub}b$7L_gjgPz_QFJ|!fRXn`)4PCdkOt(ATju$qTrKKgUSxNS}?VD%bd44-PlgXlFGRffr3kMxwP=x?N zD+CByAwbXy0fJTt5VS&opcMiHtqTtz_G_e+7AU1fe_hx03?U?OczC$pPai@^Lf7?7 zw|;(KuYP?2P)ZApMx*p7Iy$pFqNlw2qIr<}Old(;lp6p5U&e1NoYiN?Wlq+qRlVnx zm~lI+#jf}A4Gh2-GqY-R;=Zh1+HJDhlbTgnjgQT)MB>x0XmxMXbx%yTVIP$?Y+Ca7 zF)0M4I;cb@J)Do){Rw`!wdGN_t8pk-TG@@9d)zz!=O)it*90%Wr)F zcAKpB-l_kRWqHD@A%sMMkO-^VI{*M{#&~94QWBq7!)o_>J`KxKuWWq*0Q~(lp4F`4 z)8nu+2Yc&l#&~8q5>MZi6yt$;kZT`b3pX_1b=W?VH=Ajx1gEdl_RUW6WH%oy6mqaqFfi#Q*@B&F1h

Dz2 zC-jA_Z@aAS9j_Q;8Dm+NG1e%hMQ{IPBk}Z{q$D0%KezL&VOCo$cAh-v251jPDgAoZ zgcxH*Rn81r+mQ)IY%|HYhL>TCU;R7FaQ=b&{iI2KISN71Z ze}N!~2KqzbjT>jeHUx`5W`0$QUBXpJtQHM)S-=mJ`!3uw)$7ci*}ynYj@#bxll z?Y}HzCL9E92x6tXePIrP>sK)zo@cxh$bM8w3piu>{1U*6NHsF@c38q`vzZ z52#l{uT_Ua?0!cs8edovQlEW@F#y2%YnK23MUDr!gI{{S$V{1HXjBCei1Gm7os7&D zWX9gRmRI4j04J--OSM4kFO=>{(+r&Ki;#C7qxfeEXWqR4&-C~${_Z~)Gij-J%<8iW zucc6dt81=K<$aK$q$O0+5B57f)8hpRjm2f~s|l1=moal(ZpWShLl7&m1Vm7yZdhD) zBWevunWu|Vqi(|Ha`f9;|H=7lmq0NzRkGZMP5kNa0?*xD zxT&rv1K&b#PGC6sJ;IJ5^%uZ%G|ErVZYdy4MoA`#FTWu({1(}8lchTGBv)WvLT!S@ zbLXQUgC#+jjDKvB)pH-jMBp*+AXD&Yl%q<9tkNt1oP?(3dPW{ zH=FtGJKJjJ8%$s~na6H2zyCb)*6Xm+&VHfkJgQ&Zz`a@>N_YE&AC7hN$8Q6Gv(DWg zA~}KafFulu#}7NyzUPd4s0zLngu#q*(C|muby>Tu>x)=!-o%2_4_T&UM zm%2X_4({h%G~W3{fcL3DVJ#Z#H$?#eE+P;Pf*y9jyq1Xm+AnSgz}PzoOr1mDt=Wq~ z|8rMkbOEi=1++#N&>CGpYjgpv(FL?d7tk7AKx5{FW>js^WlA8&H)W>UHge63`4tt ze?=9bjVeGJRe(0C0BuwO+Nc7wQ3Ysoa$}-o_ zyJ0hvvU-KN-q+KJ3IeKiI!Lk%DF7KU#?EE4ex4YbZEJr4@DWPBbUj88*R-nK$aV7Rd zT!|H~?=-Y_ASX%iheKFOBmv-dmDzfOC6+JwO!{s-92{vreeO;}YsbUnQsn9C`g&PW zf8h7rgebyVG@cN}gY=~641CUK)86g$s<+Kl>&*y15?gZK(_nXu+g)x%1p!e(xM1Mw zoi(g6vArpI#dr(=dReail-^KRy0!kAE6K8wUJfMy0AOqM=sM8?EmJl(-F11OkL3s- zkA(WeAKn0f@zccEWHu#u%zv6Kp^xRrUR!iO6bY~lqa{KnOGbTDWJ|;7pkb0*va}#? zY?Os99EY1%E}^=r;xS_Y{Y}%JeC5v<|E5ge^_AF{M zlbt(pF=o^5D^|jR1dN|1_I{k`aXR1+g#OCeosPoG{>bd~&Lcu;y-GPNAqVMAqyD)| z8C8HbssL?N0otenv{40UqYBVQ6`+kOK${~k@C&#_Km>XuSxNu^002ovPDHLkV1g%l BrM>_F literal 0 HcmV?d00001 diff --git a/plugins/cricket-scoreboard/assets/flags/england.png b/plugins/cricket-scoreboard/assets/flags/england.png new file mode 100644 index 0000000000000000000000000000000000000000..5b9308a3e1785080f3a8a9200d226333b751a5d1 GIT binary patch literal 965 zcmV;$13LVPP)9qdWyf+XRgUI5$(DBWuv5%HBMxqsb(0x{4SE=q1z!SThot|&*fJQkwc`#u zFY69t+o7;ap!6_u(RWx$HyrR-NU^ujk&;3{vSK@lW7*bDN?j+b?Jgh!dQSFFuU@~8 zWqltOWtygmbBxRG0sb$JfZaF(cH;=xjU!+;j)2`b0(RpF*v+{Ypt}`N6m{=K8fP+@ zXf~UTrBbOiLWs)qyhqn{Ly{yxQIx4{Hd~Nox%gk_TXo$&r>g(}tOsM)pLhH)_FDbz z2fwUZb;~ui2;lgi-feblDnT(qj%C%Kfa9UR7`yVujcV)iY5ffO^GYwX^(0`iTCY4= zHL6cK^HOfR-kHg=TvQZA%jfguIk3lhKA$gJSLG%n#I`(a^_!Yn=;m7p16 z(@W_Oxu-p?exXpv+sjOS2>`(8=%{aTaq$uWFbv~j7{=}Q``w*&37QesgR$!qrNW7O zsQst5Tv7|u)6>DFrKQ(3O*3ekrZ|qHJswX_3rt@EKDgY4-*X37uf*?LSq-h`XSZ%e z+UxerX1!*b&9IARy7iPKX^0S_MK2B$D{H`PCEk7K!kOK~7W2MfWZoBicGwSR_QUD4 z*}kIOInw|6)!5(t(m(uWw*>$IR#sLfFMa%J*m|F99ID?p8inVb^Fji5>*dFHkIIkR zvz;HlJy^K>(kq>{e|xC%jq)RRX{u$eX7Otzx!}e&zxCyaExIH!yin4dH$c08j(44K)Aw@y>~*6#&M^#|J+u7RmD9 z%U2ULBLD!;^Bz$Yx!iAmYD1KJfCs$dUQGbyLy&Tx_#)0!V8+Xi%y`+6&fMC_+Ot$D zC0IK#*0+vxQ4~2zl7@cX-QDr;?z`t&zQ|XDBNLrHMN#C=OyIPo@EINyPSj<9sP%fG zvc1OhyhpF-hJ=V9%W{mOD9EzB`8BY4T1yF$uA3MDP|m|$n{fo}#u2a^N5F0z0lRSo n?8XtW8%Mxy909vI_X7U{fzd_c0oD8!00000NkvXXu0mjf?wHzu literal 0 HcmV?d00001 diff --git a/plugins/cricket-scoreboard/assets/flags/india.png b/plugins/cricket-scoreboard/assets/flags/india.png new file mode 100644 index 0000000000000000000000000000000000000000..cec28f027aced829cb2204e708928f0a4cbe2305 GIT binary patch literal 805 zcmV+=1KRwFP)6BS0HRfHsZ*Z5#pGI0Ce}@&YcBpxA6Km6TPbm4T-Re33T~#9k{`L@Zy# z#^HH+U&s8>ShpaNK8HvkKIn_QzRmTgJ9X5ozju$rtMB(0q<6w706=w7%fKGgf9ZKA zP?QU?k~eE8-!kn zbK)DN%<`XF;k$y%XFUdQ>T>OeAp-z(yyW`<0G@uzrL5H>nH$j=h!6TAGhrz>R79GV zH40X{mNg1PMWoGyrC?)x+psI*oj}o~tSbN8HhRviT+hND-qdA)qm>e$@weg|rA%x# zN3hG#+vXMtX!Ud*4Wp&@~=%2kh;9h?UOTDvgA_E;j&xGNsNPW(|cK;=Ph&?qS&d+#uLuMxe4uA#b@V8OGIrDET*JulctkPjG zWL7<}3Rz=ctXq(*O8gCsrsJYME`a*D`VCfH(9(~q$h>nGox0U7Brv^J%B;?w{VK6~ z{HaW-bM?jnh*)3C37irU%a@P$`H46i@iAXZuM&*&=PqR&0ophMv~dJz;|S2k5ulAD jKpRJZHjV&ouDrlMJ}4pQJVkyJ00000NkvXXu0mjf&*pTC literal 0 HcmV?d00001 diff --git a/plugins/cricket-scoreboard/assets/flags/ireland.png b/plugins/cricket-scoreboard/assets/flags/ireland.png new file mode 100644 index 0000000000000000000000000000000000000000..f86c6b5d491ed2c9d542b4f6694ff085dd30fba7 GIT binary patch literal 860 zcmV-i1Ec(jP)$D9lE44O6l?eRc6u|Sqd`v(e{k^0 zl^E2@LUVibzw&qqke!YCVS;Wvjwi8f>*G;~Y3Z@NO7@w~{cVq%(_Yt|IEVoNz-D>e zejPLshNX!6-wI%sDp8SgtTnxf76fIMbq#V!s zw6`T7F{qUQ0Fdz0QSf%oyKb$vT$OjYT9bJVqLRxHwSojN1Z}oAtdQck=|B|#06-EH zhA;$yFcg6>6xlU_?T}>SYrzL&Gnbn*RhoPZ&z2*@5Ja&Q2!q?tC%9OcNhF}NhjhgG z1_Ph_?1@0CFhYV2UeFs?V~Myg9A^X3csxDNY^up+#+Jam?Y(hr>0T~=S%bW&K=%u z^cdGhbp<3BKcOoqD)!PL>ZR3X$+(818Rp5CWlvXKu^NT|RHv57o4@~DNzXf2DkHo0 z=c@o<{{)gO0KrItnp|>E>~L;;}@1%yTv5E@ZH mXhZ>_5e0-s6cC!67x)dh2RpR7s1)A-0000G8 z$LEr>v`2IFwm^xNp9%u^Z9YFceR_tY;zW-d1;{-s&vvGZ=^^aE#)4x{P-h5kjpXcz69go`*|7eJH&)@s=ZQ1X=>iLh) zR_eKPhiFZe_Pu;BYnIuUKF%hEq@Ls{m!@XUigr5j=Ypw#Q~sZ8_9vD6mS0Z1y>0Wo z9SR(bk<*eVsl-N2`?@0YR($2wsN5otKlK*7n0KwS7jimNVe{|P1&gI2>MduAcgAdp z(TlhKShd&gWrqWeue4sxG7StB^;&wVRBbXRGegPl zyX|4CP3NCY3*V%3yl-XwBv%`$UbB-aLe;D~r;Rk0R;>*SzWlP}MyEJeYjxzb^&+mF ziY;;S!M|0q6(o4#m>7DFKc0X4?X{Brx8HyJpL_EA?>;?_L$VAF8eK+;PZ|Y`mQQ(A zmpy+8GXn$1!tj$RoB9p^J=k}9kp|bfN)@4rT&+!?PvkH%Ogp{QPKHlWs<-VRySgAp zt5f20-#_d3glLsMtYzn6Yd&6M_y2Bw?tP|niy1ytYd@TmJAS%1t}qPaS5jYf`O8|zg>(P_(AnhC!gVVdf;>UFGiqBt0-0u0DAV<3~z^z-05f0 zPD~dH07xd22gPFXkWBQ3YYRd%v?SnmyW4s?yhZ~7oaU6G} zZ=k;`^5CA{%y60#AcXvR{SP%>pBv>^mQ5UQ5gO$FItSorD`DCJ(@FflbLn@Zwt&^x x0#;)SSdA@UHMW4&*aB8#3s{XUU^SOs;1|!#k>1uUH;n)Q002ovPDHLkV1jv*ncV;Y literal 0 HcmV?d00001 diff --git a/plugins/cricket-scoreboard/assets/flags/south_africa.png b/plugins/cricket-scoreboard/assets/flags/south_africa.png new file mode 100644 index 0000000000000000000000000000000000000000..08dd7f13afc2cf49572cf0d275dd60f3fda00845 GIT binary patch literal 1057 zcmV++1m63JP)H9LK+x>m`>oxn|8nA6C+?TcR!N+NFyTX zU?!y6^eT6jS|GUwXklzK)1HB54&D%FUg&khl?*}>O$y4v~U#e^D6hh zFTeYJ^5^&GI0EmySi~O2q;~`V7ehdA3<13{1oXxb&>KTQZwvvwF$DBx&kNLSoA}_$ z)onAufFHrf0*H;rF(-=K<^X`3=E3oaip=SrZnU~w+dlIjwif_U{ITVQ&F)1<)Y*YM zP)pbBU`r@;5cVx|W79nDE-Vhby00Vha&3DlbNsvzXSrz}a$6fZnwxe_pu`ZTEM6Xy z7dM(Z%LE{+S#W$}JX=;HqFh7s{jx^X=?6!#_XM%%cUb{#sT6=62~;%$Q?t4B@C5!G&Nf?z$JJ$FT~i}x7(aW#(+xb_sZf{2RhGMH=&exDDmZZ{^gwQoH~Hb_db@b%B~9~Vb3Q&I1mYvZ6{qDZ3ZW4$VY z{;;FHKkV2zHC`GJe`6ydtZ`g3J&iyoCq2BQCvi%vBfavbfR; zox3=an%S)0f1xUYXiQ45ldAa3M-PYgrw=_(M`Kdrz2EI=co{}`JADWMqC?8PfgcJB zu+ucQn3PMSa`Ma3OtN(S@i}Mb6YUgJO;1&CnXs;9zrC(30f31Bak!0gglfbruHBtJ zeqM-A%;cobM$qAdsx@q0P{KWy22Y*Ia%ogfzWM3e)T6cTFXt6@zD8lahZ@+a{MuSZ z%T?P?)kAzcV=0E;7jKkKlD?p|$=hso^nT|Q*onF1TAoB-kZS4+TFcJyp+Hx^)y00KlME!r0t=>y?~J=LLf$ zHRj|E|FB2&N>IwmP+43=nt@E2kLpfbN6{<5(GN+b$V8ppJ}0syYF zn&QUey8Mxu*sAkkK%*ZlkWZAx-%dIrC8U8>r>K4QE0C1w3%dINaWkQt3(KR$o znqyn9&^iW=$3e3hvnwmkdn+S(CYJXv$G)dT0l?K27;o(gNC3c`@%4M|U;qJxO&2qtxwnHkiqj{wr=ShP<#&tLcY{_ zdvkWx0Sjv+y8myG3AkUsIVo{MdvkVGRUvpsc|;G)g;B>9q*n1lY~BQ$`O)?I=Rg1c^0Ij4;xA&Va}p#jF<;>l zRp7-yXFJ6+Hr&4PUF388w1qNL<@fe}xFK6I?X`>k97)-ng0r(%^dF%?W5AeH++8Su6FH3(#|belJV-VH~#v+v6d-w z#;ndsPg|O|@=UAz*7tYk%#_cp^D~b~+8&)_T4byH<9Xc`>1g!=JC1*?n=GXh_c)d} zmb&^^M*oh!n4xmOd})hAqh=)c?dsXy(y!iE@yGP)Htyg#%YAKY)88$fi>6-n@-pgt z+rN9l`(}Gtt)d|DJ!C~c?xEU7W3=Qw+`8buOZ=2;>(DOK9?uo^Y zCzawQPd`nxt!qwY5U|PU*mB^x_=B!8XDhSDXyG4XO**m1XLe{mf3m6Yp0TX^I%bX! z33s_~+@8@s>qXJw$eYKTOUp%m9QYzq^mGQFcjjv|1LL9|rup+1l)u<2_&CV*%Zr*| z{vXRu{SjNgbbah8ZfEn0c3-$Q?td@+;qc4d-2acBirRPdM7-pb&1KIv=w1+SRH=Gc zv+i_pyI97774i?ca|IY4s6P3rEPk6|(c}ql<~20`yQ9j3kv1Ty1(-s9Fneyf)94!f S$_|)-89ZJ6T-G@yGywn`dr)Nn literal 0 HcmV?d00001 diff --git a/plugins/cricket-scoreboard/assets/flags/west_indies.png b/plugins/cricket-scoreboard/assets/flags/west_indies.png new file mode 100644 index 0000000000000000000000000000000000000000..34ed35b03757433c7ad5e72875cff7567f1ef036 GIT binary patch literal 608 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezr3(FsXaGIEGZrc{{^4|8jsx+kK05 zu}2>&Zxp(?(39J%^~D7zl_{;?*gpubkmx>gAZFthofXE+K}Or{8+#RBURfws!XeUh z%SzHoc+Q0*+ur=>ZtYmr5@5MR-21!a`Kz{e{pY^!oaTIf{oRiO2@;oBd$>ducrlRg z1J(%p*>UsgDvIsCd3ZeEW?CuE@I$~jv1;AaBxNOrkla|wY5GUqj)*3zJzp*s&&2S+ zvx0*`pKFE4_XRnkDTUVDBHSl*(_=TPI9C1;>el$@%G&VO^K_vt&@qE`)lH2 z)AQ@)Z$*7R@aoF{GJl@K{z{yiOe zV6T5xa z?_CuySvS$Q^!MdgK`aaj-q!bg+go?M$yi$w(P2Ns=gePCvvdBO_nH24H_9&#X)wWx d8pVGwe!X^c>JhhFIlz>|;OXk;vd$@?2>@Rw3pM}% literal 0 HcmV?d00001 diff --git a/plugins/cricket-scoreboard/assets/flags/zimbabwe.png b/plugins/cricket-scoreboard/assets/flags/zimbabwe.png new file mode 100644 index 0000000000000000000000000000000000000000..fab010a4b7374ad9103bfcb5afa0d4e6226c3fae GIT binary patch literal 831 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%0D9vC=ui%zH$H&g_yC;10rbWP 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∾qV+z8U0Dousag|<6^4NQJ~6a0q$u@67aLgE9-JR%`A32 z3(@fum&HBMLL^Tbv92a%c1#g6ALQB$x!&_WS$p(i5DO-3*ks}37o*KtSf$O`n#BOs ziaBmF;C&QO>H6nndCmvXInza+OUQEy zyb>VM8RQk6&$G%{OpY6~9Jhen?vWj()mhrTq&*ms8RUP2azvj*H7Ka_N%zY>58t-< zr24+(`CgZeyqbMk(m4H{=3xmDh8vx0VRh+7S3n2YHJdKiMg84tl@8LK>7GIG4nmiR zcNls4LyrMF27Pow#(5H`xU@ntHl_&C)Ii@4l&-mm)Jvj95i%L%$_$wX|Ba-~CS`t1 z5h4}6*duz8;TP#QO8tswGdxdcDbIs!%a9%L-UsiSyQRfgqjYoasK%HU?~^ZFmf7K% z#liY#v2s&oav!{QnI=o?as`A*cWQ&wRAY6W@pwh!1IxG2W9&0=e!N0y_@f-0>WIdQ zS1H+yx4Npb^`UYV7mb(ZG+7t<7oGj$-HU~)>D0|HlXmWmnyZUbZ#P>nuS`0vjHg0R z)%e_Su(;=4+<^Qx;B{-j>(+qRtpTrF175cVyl(gz(R2GypDRyijSoU^4nl7Z zLT?U2Zw^9l4nl7ZLT?U2Zw^9l4x-l<?U2Zw?B2a}auSkekmBqMZjI2z@EH*k++H z(?dO?WAH-SFt{yTAVo&QeOkt2t63?JX~`6kmQ?ME0h$tX3z5MwD?{XGT#zA)K$e2& zU6}WCIpyiC-$lwj{5>p1$bBGkxfaMnAdh9pljQyyyjw|mHl_&q0?5l5@+!#o40#>o zO^@s-y_=n4;hL6OdnKzu~u@_y2~+6(Ref*5@k@Ts&s_U|2J&l=-)6{%zAb+u z<=;b!EA4-S{HI4+INvl;ts&r~%9?suTd$<1azoZ+jXp#{dX;bHsduaHMlls}FiGp2 zvxZT{$6MxuOCG~n_ja+w9|Be~T71$-_GKDoQh6_qG&+E|Ef-mqjssPSD9_fllSLMk zg%@ac>p}*IRZB|DTFZAE*|<{#7L>Iy{~(gaG#?!kqGW1P$6FDb(6LjOZoP`}qjquC zvlm~PtPFIh|CEmoEs9TnOmCzl_;tTg`sdQWmHxjrN7)$jA=+AE{v2y9-eUd`&Ho{q z|3ftYhiLu}(fl8x`9DNPKSc9?h{F32&Ho{q|3ftYhe7kJtPh>${}55z2h*)Rmp?OQ zA>-4+Fg`70d|JpTu#oX-A>-3R#;1jhPdcn%A>-3R#;1jhPYcn73mKnio3q0gmY#E> zypZx6n!a38JvPEnvr7?T8yQkWZr7vKI(TG6hPzYZ-B^ETW!e-rEy2PwQ)DXjE09NX zdFkLK)UlM7s)bTj;cm6RV;Kgn`{8;pLmmNnJVR^&C**%IOZy_+IGp`^P>Ejw`Fcdu zqW79?yH68TE&H*5{s5}?^CzhI{sL7AAIW<#1pU7g{r^M0?57SP?HlyJ?RHG{e}M%3 zUm!vM7f8_mn(!>8!c(CC2-Q$DjxHk1!gbsFos~k&H;^Lo4J@QxR;Uq2DHF6TkI`?$7mszq7pmri|3!`RXr={5lf2T^S++WtwzJHx zkKT#at<;rG7u4utw`US+KvP5WTB5N9S~VzCeeq892BNc7^NPYh^6Sz^bv@g5HLY)Z zdUOOt{9eSz-rM75Asx~39fOwdh?eh&mhXs`?}(P~h?eh&mhXs`?}(P~h?eh&mhXs` z?}(PCEogat!=i^1N(JES&UW$~j1X##VK9QrV3vFxRGt-mpQiX;s3JH=Wr!U59my?c z?s>7?9w2fLOpb_n{~r+*@?T9m>e{48U3+-{u;-WSI+3zxOcByeUZM5;c{PG`XV;h3BNVmqc%q=BltkVib4Nrbe0;Z|7v!5K0TWN?OP`FIpRY9!rcl&gpNMrjne z&+_yF=z5;Dj(QE_&qPt4uk>^#WiIB=dW~zr?fj1Qt{mmDSx1VjfqSjz(H}UZZG!s= z(zayCGa%1r$V=3!lD|yKo4!_S&o@X>yPHUPKmHoMhhLH+`dd=|7*oXiXORE!i2h*q zD_nVXpLTz!fKX@MK8$D<)$VtbIK>}#mSoPO@)0hbt|YnrRHFK}lPVJ>&33#?%Svg! zb{n87=RP)?*23cwo1a@H^Pj!qbSj^P!4f~`>Me4&@kMrfOJ8&KQ<*SjsJ^Gn6;sTZ zG=Z^w0oeE1$6%}0=O!gk$K^)CcwB}wf{e}(tstI}A!GRg zhf}ddxQ6nCOoVrGkxr4=f1senWa1zpw(m1I+a#C22QbIH@B zUdqIaj$etOZW49ix^woS=rWrz=n7|3cIbpoN!%k&){Flnw?l(~w3eEZkmx#*4>Fuu z>h>c*_Uh;rWrZ)KnlppGmG~)M#~}Ps=~wj&O*-`j7pMt?U(@ z*(S3oVkSt6m61|LYw|k=`UR+3^CiSZ z0W|hI#qkCy;`ka=C4LhsTs{Qh{{U6apFxK~f35u=;Ttw@;g*(#_bv%Pf#DZ4PwMQG z{X2deUa5a#&F9J{%h zdbN!hRonu>crx>)x+h?Fs<8>WcMLe6t4Cax9wy&G=g zUpY^YNR3s!u&5Y35!GmIe?;{uy}1yImBA{p{6YPy`oulqX8IMeeXxj)y=MNr4eXE8 z2w;EMon!ecX*%YBIO5jQ8P_WM=`!?zqMtS(QETa)8!W6ypbIPVH~-2(X<~Z>whgd7 zV!=`Z9h;>-Noq+Y!*P|TvpiJ@tMD5=)ht#eNpm~`eF6F;^cDFEPoRk_82_Iwz2xNn zB@#Bnu*Jzel;_KN7QS9MbkipwSHY1Mqiwvz?2h214!LwcZz>(B`|Gce6yME0nx77e zg_EXb_f=fMj-5UtAE);h;oiPu=cH8<6w0XE;`?&w)8RA7@!L!FU#Tm#`DyNN>V*~T zZS4Oc{wCWP(Up#SAXhIss{Bk{p@X3vp+`aGqmdDN5@TlJ=`kZVMb3if+>GY}U&bu02yIZvx0A8KQ`yD?Fl^NZ_6cx2WV6!#nZm8xa(!@u2ZNE>@t6?UW(KOp$J=@4lWXDXTlf)J)Z?*3z z^$FRq73O=D6IGDroITF)VX!F6Seb>NSWGROt?sXJ6rq9&+iN@)%$G`EEq$;4t#q9F zWX?LdSSAD450?xpOtvbb~fR#Vg0Pbne**=(t##a$E>9 zk;tk;oT3mi30{>k6{<4kKvl+dP?d3$f0kvZ^gE&Am#wM%S|~jPx|x!nj3owPSWC)J0+mDQ3~wh3xbaoJfSRg`exrtVll*`zcE6cw)bbbnZC zcc-&ecZi#ORhduRD?1~*qvz_@Ci~99ED6Eqvw8?VZ`+ijl`FI=Y>w ztd@s7di`QRP~B5bsk_6l%G9M(d5O0@ol7`Rq0U300Uw1^f5S1rVdo7>q=*H2ru2i- zFG?S_>15h(CW+oUpNXGpCVr}!_^D>%r<#eMY9@XvPW|Cp!L@RQdnW(_cbW?!QP=-ljbVXv)|4+Nf;c+el~&!&}gwL$#yyLar{{ z_k<4MCm+hXs7^ltfol-R5g8&qcw~l*B=?2znlC=&7IGTAXGUHj=YX6a5w&L;$V}RK zo2ygE9FS`=#1_X>o*Uu0+4E?ZKuB9jep$NfGh`#k!x^HX=(8E}xhAw9xt}NHCEnL- zu029t0pXoFL;+DDO>gl%(!P@+-}mMG7%GlmLl1!d-f7a@t&l&NmLj%A_?F{=l+`pHOiUYZG!;x_10~tDh76fYn$7 zmImq6v0Bf!A@K$Nxy}D;ns_)LHI_>FCdbf7C47^v$=QTj^;k!Q&AJd_vyKRxbtr>% z1Usx_L2VroHtUG6(Xrs`FgVsRbzDb;%{n4%*0G>MX)ca(UFn-naN5)D*HN~n)B8}T zP-p!PNB<8;B@ai73`hSDN68LH{|`t14@dtGNB<8;{|`t14@dtG5Bh&N`hU1vrx;GT z2T*Qb${p@%6Jp9MMND}aqS(xkb`0Dnk^j^T83S^5hS-8(n#)Fj6tNK?MP@c}6c066 zNMT43ay>OHi8Tl@pG?XlpUi4_>@7;eoAL_pRfs9C6!{#vp5<>)nF{}dH>k_9ls&4@v?@Ea zwwirj>CP~FywzI=!ZLiEMBp#VR?mwdoj6~p*oROvb6%8xa@-a#6G}?-xXg zsPq9rXi@;%+yTkyc}2Vs2rfbr=AH$Htpxi%WTU;4n+CPbsr5Naxr z5g;QoMA4|q zHfP9ZK|Yruw&)%5e<@3Q4ep&8qEY4D4EYww4>RO98Vz*#j`oK=NCVUfR+I zdwm^fU>7p)oguwI_RkRM{s9@H$)0j+u|!nUuuHgK&Ak>(G_}%hfLSq@ka-{rGsK4O z&>rz9)aka!vl-;RCM#Dn32|r$R-IphJ_!9ORD8cGTd&-WkpE!hC&BjB7yK*c61gq! zJSyo?TYe@Iv$=sF)YcMBT9f);()G<6=C91)Y6gCV`5c1hr7z`~@RNtsp4Yuw;ZF_d zz#qPgk$N@Kd+}Mm;&lCNLA0V|ao6}&F_^yk+J9ILO@4T2=En`=kJE~L5Gl6d{? z>|E?v|0mPD4NS(pXQl!9YCwJ((0mQ3p$0Tx1DdY^&DVhDYe4fgp!pimd<|$mZS8fj zi4ABzZ4kEIpSCm0_6Ke8dx^I=F>avqYwwn(!vhco(a(4~-qT5*%GbQlp0)={`4;lr z9(n^}w-iHBB}%W^odp7{A#GiTJOHvOLmmZrBIbW4OM9L)9d1~(c89O^O{iM&E>x}h zo~IIN{fb}t=ifoa_is?O_AmbVBPjXm+Q}>P=h7~x-`>YZCO!8_?}z#`6%V1pw$Kxx zOQEMge*hilpUn%M?st+FoQ-8#?0~WfOo}Xm=Z46m^6v8GZGx)4C!nhTML2ix``&kd z`1e6xCq+4ISO_UXG%S42^J;1l(v<51a;dz3hUa&@w?Dh`g#2G1|K^b$rH^9TE?#pz z(dg|me5l=A){da> zgN9G}L#qOfRfc$%Y}j&W7fGkHP=rAx`?fO_E4nA2 z6EAUwNr~BT$!%UzAj#!i^SN&2TFdn~*Na?la&<(NcSgqcb?UowXW;e?0Mw#78Z8TQw$<2XW8Y}uR66_17 zBF_h6>=l&^rrMzq5zmqEjLZ;O%A+#mWRTM`Fvql#`FPmG5&f9ucj*GgqL>t6%V{xnqj zwjYf+B&G<_3g~#KE$m)W8t(?m%cxOzSihuQMXu=?GRx=E%Hy>$Mdd6;b9R;f3z{=M z_utu($%kNqGrG*7kjJO%$-4ups-_XZzIknh-0pN>f<>FIs_fMP|>>w;{@O4Vt5ehe zZR(2;XoQJ$IYn&E#&f#h7G_Z!>)h;`$p?C1Z~nl|e~0EEMRxudkxTvyH3uQr2O+6; zO4UKG^XyHB*blk=6x~F-P7K`-w1M&uf*wYykq@7CI z85#FklzAArGo1}P`Nhd6tWoPridu-t?;U>6;S298!FEGpu#sv zF3;mgEXn2VxDrHL|D7hC$sWGgbO6O2OtBrIHt7#3LWYxa9`p>Fcoy}Y=j8Jef5)a# z(k>(Istl2WQm#3q%#SHTt|jGm=)KT8p${bMOipHM$ZcFa&psVcMR51YIrDWQlhy9t zJ_<6LM!%*JuT{ThlZ>BkEUgm6CUvoBphUr95`v~P};OQxaf;gU?n(kLQGlIgzYK{sM) z$bYZwcu*T*4Y3{0R)W%OWKFrXMt%q>=Rw7x@lAn&bzIYQ>uy;oi`(~2ZpJF9<1F3j$Oc64al(V6>N?q$KI6E+LEX}@)GsWk! zePJO*^RDYkfG%igFSzv1x8Fj7-_^hiumT>RNiHxclxJn+Ts^2lSWgSDSC6JN-;* ze7Vm4x9{w9$H&nfA4hk59NqD8bjQch9Un(`d>q~JadgMW(H$R0cN_uT@o{tyK927A zIJ!rf(*|;rrccowy7R~HO!wN0`jn#65A4p;_9N|p4Cza*o5^*E&pj9p$)lC4@`5}T zh*`WT&&lMLMBB<`ND*QymnjlrSBjR~%4N!9UD^=m3t!ILTF%>A&f8kf+gi@sTF%>A z&f8kf+gi@sTF%>A&f8kf+gcvp)^gs~a%bf)r#0F;vVgWe!o9vNC+sf&ycVkG4gUE_ z=whC?LiL7TkjG>chQ0of9k6t@Xx)~Cy*y@X0KDIcsA`87250TuBv3Ly#(O3Y)F4} zpsAwx)zl*7ElkzpH@@^`?E?lJppV!U=bBUPP|s?I^GIwMt`om6$Eb2&@fPtXr@`lvnK zu0%?Av`J4m4HeRx6j`|kkut!i=$ny&M`>oQr-)hWDbh&(ld@c9wWmC?+Eu6G=Pru8 zLM{QhEJJJ}8gh$g7CiGjkJCXP`|A%n2YX>@m3u=AsX;=%3To?OAw|dr>elIC#w$eL zVx6E>AWwmOE<>ILc_Bky26-hzwo|9--bu<=V~UV>LB5qC-vjwUhWr@hry24KkY7jS zUds6`HKHmhl%;JL0*N_@I z)s?7oq*j@`xRB%)T?k>*pP$TB{fK7`wVZo4c0)<0p>k=&g3~?nCYqU5u6=`zR%qnr zH10?9P5*{c%BE1&j6YX!b7fkIQFqt9o%=r$gRQ!zmPuKmzFQZ{usF=KV#zKJ+PAi< z-p{LY`SN&#ayLqNcE^6epXl{#O24k_)aJ8hTdv?N4C!^2B!XVwgqoL*<~qNJ1j?K_UUN>ig=S4wBZ zL^`q?0@i~ZmMTOR=7AYvj=_}YaCnZ$c!q-g{Qor9t6cAJ z`M0)$x3}lDuZ80UpC!oWG5*`e|78p$=M)K7RgpS2+fUJnU&v4yZ)~p zK%7rL^N&{@8X1x*hL;vB^e|dvj`D2a5l23@G(Rh7-Du@UmUPOHH$_i&s!aTvd+kWI zFjfQ_$BY`|PsK=4zejo2mL?e$MYJ|H@1x&^ssgQSZ9W!_#=rk^{cScDwPX6>=N2D( z@4M~C>xhu+qY9c}?=Om=X_DOqD#K9jvk}mC(Bq*RgXE3S^BAbom%pMRDSDL#c5h(0e(wr@$_RFt=ThNJi51CmDD7ltB13dW)$ti}ViQXi? zttcn)dsL()4RqW8q)N)JurObX2L2Fo5NN<_r?3R-_OXq#c!Zo{zMhGDx6 z!*&~n?KTYCZ5X!OFh=}gm|4TH-G*Vi4a0UD7Hqd+*lxp|?benmhdF_e4hidu1+pjI zPN&%wNDn&XFnG0Dw@*wF(jVlI43W({*dyAu7RnL#F_fb^N5OM)O!+Lx>7Ua*gCVgX?0h8C*AT-O06y>lv=?T<>w|ySR^1 zu0;H0U#`95?I1fNBA$1etX1EJ>iGw7{M2)xkKZGbOZs>{e{t#IS7F%~*7u;tL-l-> zf7Vu)jqt5^uXjBuW`?K8<37*R@P0n>s+1Q%UXF;$m(jhG`rmWq33(gj9goPV64Jg$ znmJWc$AuZgTF#YzDZ%Tw?8u2Q>$g(~Ywx`7UbeiH_;98FaRp>i8pR z|0_fOLwfhF^9z%rMr6D!o+Ru&wOi7ANmfx-W$6KdFSWwLeW00L zl$M{~7j3r+R+FzRa2821^1MU(O?DotWj%GzA3_*!_Z7MV--V7*@Y zZJW!aiN0L=9isOJ*Y6O75+YLKzTMB<8qCL@RXY9l23E=&!Af}pE9DKWlsB+a-oQ$E z11seXtduvfQr^Hyc>^ou4Xl(muu|SY_q^e(ls9ObzE9SPAEEDJY4O7DXgg{9A)E)r zw1F{A^U7hQ$pS1+Svv;g_zXD_M7ChTb2`YG8FCKDco3`qQh#UlYduS6U0B+Jn5O!d zkhT=0C|gsrY)sI4CKiSF(WC|pj>7orO2z~()p}vh4yE? z;o8buh5K8ieK$k?p7!XyzE8@}Vv3Mog8Xwtl>7J6->cExJ>8ZP&04299j?_Qn~NV% z>gja25Y5Fq!C4@-7G;S3j3Mm+xJ~1yh-v&3IkE{S1H5Na@;TIfxvNWv!Xd_Ih?(ui zqd!^To(A_^xEEx|B9J8+vXr{S`w&z$JPB1hcX;|1RQQiv1VEe@2h|&BbsH@i8>*~n zS?FxA^qL9It5VEvEKr50g7Wk2y{THIq%g4#>NilCXw}ZesaSsU!MIp(Iwz;~*~<;F z)a**{lk@7UE^~!1QJ1OOa(8LXg(erot8>MyfGW+(v$n=K4Guw1)6?j^rCX&Gk*w$5OOJP5NStb$S}%L4dzV@yh1cYof3J4obGf? z6d-7zWqk#z^tZJR z@O8qH$&lUw1Fza8f=^%GaTLiUYb2jp#)Q1&5rAeKTYL z$e|vQAsM(;lMKldV%n)$+8EN#&X94`I-gv!K`x=a^If}y*m8M_Oo3;5#xoOSjz?sb z1nx!TznQdU8L|T8t_)d2?UUiXpEsjC55e(h#-Rn4`$_p6^m(|pLG`wFa=+dA$jqMc z(@k?|F@t2q(^(^haZ}r0RX!c|{wwe9PrUWbF91Y^g*M9eD5c>w>3zjHfHuvPK9C-$ zvaMW>t6Gz)fQzTv71C4croZA>&3>Bfwlul|V&r4Iu{8ldNeqoi=Fp+)TJz<&NDvqU zEzc0zVq3@ERJV8dkaRfXFVIYn9ZDDodm2g))b}(!)>t|$*cpx38I9N(jYv!*c19xu zej|29BR#GWJEIXhqY*o!5j&$1JEJk!8I9N(jo29$NU)Z!SE3uPr5kofr?q9Tp+zza z`4lPLp`Gc$Sf8SJ$H1dBX+-gk zh3DLuq8fCx#08`-=Y9rloWR^}h7)Zemy$9As;KL!K1Ca@1CP??!y{gsZiEz-eKRSl z{VqlKjbLJa8P@^WC1HO=TV_imTxBa^lU=fxNAw~rO+P%`eJ0)=8}Cl?cZ5b##u@Gh z2L1_=Yihiko$)V(e@TW&)2KD;Grzj2i!uu%F(%r?y+kc>7C!ctI8&)l_an(L!K*Ea zsOI(lM)S$RDPAjk6yX>wXI})a8pNDf@&1s`me@k1T9t_Cq_8iRDJEikhWaz%da-hS zE{j)Jvw7~;x<^fRS?&(9+Xvb0L!aq`?Dj!+`yji0kljAWZXaZ~53<__+3kbu_Ca=8 ziMM#RKFDq#C%b+4^Uw3LJCFNz$i*In6PXXB6CFgT*(HYRyHqUdyRNLcZM$XQ=WhCPDm@pvOV4f~uAoP}Opsf4)&R zMH{v&%cd|th8n(SsSOp#h_X9u3o=b4(*-nUAas8k(huMC{*G^`zcV|&F+N>Du2Ws( zjMH`&%_hIfTL8Trx)?eQdUG-6#sH*DVDj#tB=rviaOI>u6^V3XK(dIQeePvf?B%*K z!EpV$Y$lz|u?xm13Gt>l<~Bmb>9#(|-W_Z%E({7)@p})saeTC?&B}F(t z&aWr~BU#R!SGtjtK-bs(+$3NWr|{a%3!LG{3|?Q>j**My_L^XTft`Oj!n^pp(fMj+eN$Tmo_> zyh_nrdv=zhF-oP~1XXGBSnBy6Nz4R>Hc8B<`7yG>_adP!3=^O?Ko{}?4u4n)XhWc=Fzd|A$9YRx_L<5Jfv|S_F(9e3RU|BtHgQ~1Iq00Fk1nq0Q zlkd29@O^(Lx3t!34TlR(t=0aEN08)Myk|-B(b)Eq<+XYQC-W zOGmpDAp=M`0BXDO6oeB}hk`az*-064D*Vc4X0`EZBT!nK#>K__pqnBpd0$MfyD9J9 zhzeOxipqN&s+PX$pTFs!e_4#FVZAh8Jx$zc?uZ>Gwf-aNHrgih-RQ&*v(a+h;-AA{ zoNu^Cn`ATBgF|~_J=rNi$qH<+e`{$pUoxxH8zhG1^F3Qcjk7*mO0{X9S4YVS&6>d` zlg?CGIT5!xvf~JKg_5UO#e&PTSxVj7mN=Yg5Hy#c3Ma%GeONJrkKa|R)}VAUo@hVQ zRcc9ScsddOd8oaL-Xy1A%MHuXvHrY#&sD;b%x&;l1cBX759VuaVGeD3m)+{?f6Ja_ z(;o`elFiWvf$E3GG3!K#>~Luqv%}LAefw=T*8(ot;|t(A6EQu8MYJ=WLJ)ESDQ7}Y zrsUJIl=DEwXUN5#S6cJRn4;X%NKtEK8b1lW+0*6F**xFn=~}32-2fH;BeG8R$NrX1 z>%fdyv@NuQQ;d7XyGq+#KO|V``%{$s@25p%AjsM72UuCmy+JN@4G%~UkQq%D{Cpeq zMhzVP`8uf5*F!gfuY}&n^BSn|&CpHIE$FKv;=jV+kK1`G?U28#F`q^|H1mDx)JjRM zm(;3B?^7NhVJ3l()=KtZvxkc5vv|s8+=8O|Ho{EOtu z*nf*viyyzBU20q02pqmq7x2{1SxQXN_v_c0oil>KeQ)QCz|I+goihSEX9RZ62<)5@ z*f}Gxb4D=jKIzr;q06dbPd}pw%WOW)Vb}h*e%wJ&bYrv zwU8A!507^vV;+?!2?<-DJxBI&grDnKFqS-}UME$%f)1TgCM<*R}Y{bXKg% z{k5f`t}vZ2tC_krRaqP?!)8V$ar_6zq6d?a0q3ptaB-|1N1_gHZiMh z63En8&YXC+B;GBHclXA-jsDK+QwYdYG3~i{w>{pymGOVWy&(HNM+`YCSQ_QF4pH|N z#*kv%s#_$@SvTdDP-49VKVOYf6VBG#IlIh|$OdsFvOtr-vCJ4T!^BB+V#!oDSH5Az ziMcvMYwVdS)(ZtDXb}ol&Eg0)j8j6%&kcB>(K5ju;tQ`VVn+mMUU zR*TS9i=5l{ROp3V)423cd+0ZCJeXoK)oAL~=%Urm4!jsTgX;#aJGnM-J;Sw~>pd>}642_>(@q>^k?M}GJyKIQgsw-1 zn3hg?OiQPTY3YEd#TFQ~sC2d~`D_p^sEpw^86qBO*Qva-MUF?vT#yAGk=>c5DR^RK zOuLt$jR#%(AMtl~h`%Oe4^qYx3EybiGfx{0Jp%jwOggPDPdf3@OjY6d^B>vJ?6xQeLC2JKYO<&)-?QzXOlj z{{yJ%{|QuiegPH!n~$SoqjHWa&`y3S6rHKc)*F|VCDu@?Zblq6r#o0CD%Er`Eu9JP zrhfflxgJh*pVNgEI<;Ks)*YS~QBA38(rjwVG;Gw3aW)-q{yN>-qMEGRrv$AA(;1Yt>h}v?e76Q)>*Ch zl#X>G(*a}1?z;FpZIjd~fri6Ro`XOR&X9p1gEM3p$Wb2A-i1)^Sbo)PSJ(Oe&OBst zOKYs~&I?rE)>YYd*ihfV_ zEavS-UyB{T6Qg>z%+KE#s@{rH9 znOvWZyed~F@aL)bc~{Pt{GGKyO8j|v-t_bxsM_{zPyZgOHocDyD>wIAW%Y&maJAWO zs|rXm#%0Mu`9*~!Q!?tRD(0YR$)tnp5wsMWq{Mr4xXCl@ejw-4?)67*=%HtGa zmGFUGL8o{VtjrQiJ@G-)1X?-$ZAIpo$;ZgqYw|BEnsoJ}&5Dh<|HZwdnnFD#`sqTJ z{a11atiR4$oe?qOo$KZj<`JQ4u${~$%p*dbM}(@mhj~P(^B7alBSM`=ggTE1 zbsiDwJly^~BGh?As2Z}nujV%6a4w>Djh0sdn}O?q3xV1?tFj9dHzQ0p6me_>s>J7f z{$4mAh@7H4>?!hwD*2SpKj-r=dH73ug;zO#^vhU>T+J`{_=@=fGJg~)!u-US`MEsk zWL&*G=sCD&dCv)A(0cKUi>;>jZcva_hz$1XVvS1_AHvJR%!fb*f4$WcS z8!5s(07b2P6v}qqb8>9&<4~qT(X|B6MT#(A2lHxtH_87Vm>)%qB}D8dwV)h|AuK7af>T6}5^ol%^gSu>-+O zf+C4p`8k`qoHSwPK@mqYP-PeTygDM)whAadbwtWv0~`VDM$#>`)m`f=%xzF4;d4;7 zM2awf14S}4hJTdzoSw8+m~BvI1D}NQbfgILToTnL4kOGo5|f4t43dzs#4ec3?vxPU z1{lKCC?rPB&MyVN00Td(P08wVjA66mZ6DG42~!G1r)kfV+bG0haW97pDBVsGINYeQ z=f9zJDEI#BK5{E66Zi&H_Bxyn{tFlb%^n+BT!Tt&UD<_z)fHY90^f9$9BT}N>7Rvn zF0|Y)if01U^!c>&`MlAWl994syKcwrcn{T%hib<|wd0}M@lfp;YC9gP9S_xxhZ1W$ z9;zJ=)sBa14<4!=57nM{sCHD&pp1h0W?%z`)sHFA;A33MeMe6|rVo6&3Z&NaI7@au zCh*F(osUUloR0~Tr)SDL9}~D$$Jx}SHZ{^F!3EU0P_L7iP$L+59lZS_z#`6PfRgofpMTZozXw#EKT=E={Lv4%1XO-$AyHPbU+NP*N$^V-QM|NY5=DNg zCiOr2JDz(t(kq_;EYnHTjY+?jx2D6Qc2tv zXUPhVA^ORpg_tnH4{~i$0 z?KIN^^!WN=u_oM{H#Dqe6PF#zLhuw0jGS#xaFJOZp@9sMkGurGSBKxL!|&DM_v-L_ zb@;tH{9YY?uMWRghdZdl@73Y=>hOEquj?YSI{aQ;;`i!M;c565`Mx=%b#^63O**BL ztdq|oR+|-KwOPb!vuN5Z;-*;`|15%uS;T6yh}C8htIZ--n?YV$_;?TBQ~quajmq?3x*+Tl8Ah-*q2h@Z(&_1`BpPtboWuMs59wzqy&q5+)w1xdiNb_Y zB*yE0cG_>+DXxE1ZOIdkK!&{LZ~U2Vbf|$n%eQka%NMNwzHS>zqCek>{8M)P^p#p-bFw>U60MU202osSRmEkScgE zKa8LpylNTap?)OcX95ofp5fsg@So$;O&)dt@7P1j^^R9@waUt^3*G`0{cg$%D$Kka z_^|q~WvHagWjb5D^vX*hNK*#Fta%Cb3yPNoYk`Ap;#`U5u= zl*Y`3S9Q#Tw<+=pqpcHd9-}kitIRTtOH%P+%%~q&Y+Bk7b=;j3gV*$(7IVw|sZJyGO#!<3U3Ydm#WpN;ntIrn z;>b4oYNy)4@e0bFS4sU{nXo|Q+;C6!Wbr;2T3Sv*2&NRIIJ-hhoWf08q_^=x<(VGQ zFXt28ilNxe`!@_nz+BcN{f(!rMY;OJQD@n6VZEqff);fg0zP@3i(R`pe zf1(3DY0UA+d6`nvffoVY@twuyq9nW*=1eH6(Jhq)iZE`e%wZH02bxMJ4pXhBr3+3)e5$0Yfs%tAyZ}%8bZ}K=$baw+osi1SGE~A8}366m- zd8ZdGr$+t<4GV?vSi#u@82Fs4OEG5LPP(`MGhEP1-ri&HT*}S3D0;7viO+45> z6mav0L(M)(0bzEdP=7cIm?|)PdW>cc18peWpM-X31~YO8GN6p*&n^yaemXkCaU2|D zp_~Zp1}bn{2)6<}olVy?$7!q<&7n;??CVl)6t62O7DS8&0ZYLw%V4yBvx|4_PTom1 zTn*+rkI_BOfp#l2Hy@eCC{SDoMe~u{iNoAng5+o~(Q^?a9*y|F6EWh^V%QrVqjNBB zjxzpRdQgp9Dt3Btc%O{L8BX}oh!a@qvijiD+}Xdd2vc;;P04~`A5e(_PZ;EsAcZ^h z6qEE8U1fr?Fv?G&twQ`m@!p(WGBlU73-SX@M_r+?^NIzz&Oy0xRWUYPpC?yWOjEhg z)bzPJ7j?zjRJ4Q-Oy(67#W}I1gyT(J5Ll2Ew|b^uEY1oj&MVw?-@!hR=goJ@%bn*8 zUk*KnaKg`ceypeP2BFk$e4ai@w?Br;w|;dO^a$nvMua(l5y`0iP!N-Nrt_T5)5f!k z=Q^Ix@;uD*G|#tqv|cj`cuZoh$52~6CUm67xI1kMH0_)`HFA%D`}7^|ZY{Zw{mEYd zRGSxico9(ei-89LF9)ie#)+!!2A|i)oZI+AySl`ofaku5QP~IJl`I81f=>X2e+H;J zUjPdK3Q)4YtF@aW`7_Axj-}TVT+hZQMUY3rpomevupdx)7covZM<#y^VH7d$kAwo| z05At-FvGy;k6qvyg}mb_t&!;Iks^%Nc+SaS&I5Bn2IHoYgFKaLN8Wm%Hd$Rv`wJf# zTn*;(4CV?jS9^@Eh7H^sD1RGrt^n#YtIFR8?*kbQdELh{m@iW1E_lBTe2#K20`)ih z)=tN=_OHZ{em}%eYBE)LE zM|4_Q@8X?S@G8YHMvZAF8vIQuM;!#jf`vrM2`R}+xji?-8Y(C;-I;jzvxC zFmACp&2tDEI2GPe@Q#kW!ng&Uz$=Vf&`D!fruDWkI7+FipMc4zRc0?nDqaX3bAUmU znZ>V2EscKQnYi@v5U+{;Pg}b8E%m!fVG>0u-S>sVW>IcRS$fXo#~Bu%PL3pf*=+IJbRXKZjnAjbn?K2KJ!}U<20Ya6 zg5=dTX$@Xq@pgORopyzs^sPobK&MM-%6KS};;!{@6rJY|Jfdk=)TtTFRUfEb#dkxn zD!xzYDZij|!KDQq3-II6wGw0Os2{;m3GP?DXJznwdkp}Q41|06`93x!Tp-V*XD8a2 z@pCq5d}{vDz06-sH-oPnsu(f(uCx6HqZ7RdI^~4eh~* zQEMLA;cEXPP_=)>=bs0PuDDIDdkrZ14}AV7KuP>Z#dF_dub$$#$IOcfTtaNFd>`PF z2 zsPt-I`Z}Pb-vU%^_rUo@+OA#YZV&mBP*mcpP@azz@qP=;YrOCGlAq@%KIOL4{|rx) z?2#!EG!=V{l&2`_lnNbSVT_v{>$+~Rs95PRE;yzDQ`Kh1!=(=)_Uvz2;O@n8Qyxa{ zpla6n)Jv<(|%1t9LI0q=X z=K#gm2-MJOfz~6#w;`*D6%LSVA1j&yD3a{mrDxg-jRj$Fq z8NgBGPXmfiF84rSTM{8S1CoJ+*&n4-=P!n(uUAYj#-(S=)9c=8o-{tWj!{2vGVc?9 zXTf-=BL4buV!N;i9tsqg|J!SeUr8(M4T}rlVKfjCVOS6dA)j6kpUBz{w;GwpZHv>d zwH#OU`n4AQT8nMg>gYq5P~j~huf z)84w+v3UbZSITNV5=@Qc9bfGYdqU%Abu`=#`# zGQA%wjsG9D<;KvhC5yw#M5AsEq`x-njt4~2@mkW@)F`xYcH|H?daO40m!0Y?eF2Ml zQpajmTD`?Dz~UER@e8o{1z7w7EPg@qzwU*&hUa#k2YH_2d4P)vUl z#Gid`#Kmb^H{KVO&m;LjplTTI^V;&Im{3zQ)xe{C{&=AHb@i{VI9QPQfz!a84Mh^% z{eX_5fm+}ZZ3#T$)td3eks|q*LJ_=!{(CKdxjPcM!dwaE4&Zf^xiM0N(ebrgBSyR$ z2jA;4_yreZ>b}%t_#s^E=+=P;nX04$MU%Txs6WxDFxrY4XoH{)g?3;D^T{22iU7)C zP!30~yIob7(O|}Vj23eOP0J%%%sDxOnS~rt&IPI!9X@}J&)->yUHz~y#<5|3J-}W6 z%xoVYfs79W!0gdE!s2jNE<_$5%$Zzc8VtGTN5vGua%_ul3MFT;dOM@mTsYB{oO3HW z?AGI2!XkRnH@clLFH**=4+-^huB^lnv3SfZ9xmIpYyD%4&Ae1S>-jpV@wKug&MRzY zP0)LT&3J>&c!SMwZN?jH#v5$L%s11uZpIsI#v5$L8*IiKY{naG4&Goh-e7a$4K|}P znt(ls$DlI$F60T|@}%?hu>Ih36S2Y$04w-3+ri(9X(W+<@}3%KiffRaVCE!nvSu zzBND%y?5?f-tX8s-3|}VjeFYtn4rgZ$@IOF5y?lW2kc%}SrvAUg_0S6^s|rA3X&Ey0>!uB&(VVPlwMj3(nFy%{zGX; zFy%OSiCPj9A4y%}P$SGF#34siAb#Kq?zT4eD`j6x>Cj|n-!o)}Zf~{wCI|KWjf&I?FerE*xoq_$%NbFa?X3$8bk4?04M)Ex_-DB)h z&XeqgX%CJVX^{NN5U@2Fth`Ju*x?!MNU$Tpj*nQ?CvBA^Y1(O6htl)VK53lh1?HF1 zFlmxBN|V|Hftsf)*1C^P%R&dM3A6O3mNY)CWjCf*Or%9Sn@1}TY8I91J<&HJD5h^S_T^A(3C{YUZ*DtnXDvZajVWYmAD8}K#QO7FeXKrForPXn=G5hH&# zf*)F?w5NGoqzE$+%#;j99!@??zDt@VO_N56TRu$q`K}NAv%hnK2Mph)8pTSEy52^_ z*HF#AG+`L;`vOV$wIQtAR}= z)1ERNm3`phzJgvW(MenxDBHsTxm>1|9=cEhl<-iietC72k6B zFCe{~bgM7B+UM7Kcnz=>`i)voJB=}d40ABo)ag}DgP@P#1yEaEU(2v&i3+*3n%E=XNsU*vZm* zS~=5BIK48rPnhIDu`^x0UyChr#X(DfLD2+DE`Jw}utq-}ibq7;IQYS9$Ws2~DRdRR zEn)A%I$zq4pB^=SzKb|NL)Ul)Kh+t))h^y!9pb&!#CxlgC}4!6j0ltwP_*$GZ%aHd zj&xlTn@&Jd9Y1;l9#?yn9rg?`XTvv-MeNlHUla6&F?Tlfc1o@Wu0u7KlU5n&wP-g2 zCG}SI^#cheq~F)^B^K%TKnT)p!G2V-FLdo`RQKRg=pZ!d>%|Bk1?)#&zV;~c<7mnR zx(9dBV}nmQ9!+w{@16>jeC;5f7p2yK(OI*F5hJ;>1Myyo-iINtSG?eO15Ekm;AkQB zaX+-dNFXgCdi{d4cMR!|2o`+3zJJRO3UjeNO`7k%oa5ubVIJuTMxt2J&mN>bVIJuTMxt2J&HpI!b#L2bTf$j!KkFolq7X34rJx~jcnD&OE zNXCujgi$0@lfmd4Jqviw;Zam`4qUTP?ZX*JxqFj^8AG}H3`VYd78Ey$6nKTvoqZ=q z-UVP3Qgi|vfojEKt!HZ*a55qI{3N&|1cERR2JO92e=(Q5!X?3_K+#vE{Ck)z?tPLt zSi}c&roDJNeMs7iXXa5*nCw(>m?Z9PJ|}8u&qR;w%%pmL8u-J`28SIN0mcBEA3d3) zDI3Nd&3vXcKWn!+-E29+Av3Fs}e12kTh!?gm9++_9Q8 zMq$@fOln%>n@OqJF*lV`>J|lMB9d~IhqnNQzaypjVJF9~OjJpMd);^(Vw_ap5Nzgy zdyx+r;Y1f+YIj`;M_hbwb1dKd@ryKOWKAdZNrkbVM*Jtq-|KzHY{lymb48^+J+@lM@|iw^>SKw_sl_H;zd?E`(x4#%fHpbz=ueSSJnbcHaIb0$!99erx$ zZ{Xw!<`x0#){Epkyf?I{U_ zD|m0kZu`Tc_18Y&_fHB5e2G8lz<{EmDn%B@d#cv-7|w%rWpBpW)F!s~pM& zNI0GJO#ZObIVm=i`gM_^OF@T6AImx~VrGJArNo0kg{#W1fMZpL<1#Q;^L|$(?{ft_ z>%rWZ!Q4z~Nx2=$oslBUW-#|fjN0%hn8)cSE{K1hXTZGRF}fQyI5?CN zTb6g>qLNa6E%8UbJ5DzuyTv#zO7A3c)sk`WLB-HdkA-lsXdD!sN0?j)hyX(jNpMi` zFTqWPy3%1~ESN|vlyR}Bzd|c`zDSOxQpaXp2_M6TaasmhY9HFrq27B%*(rC(w(8!Z zU_KWg?=F4FJmKywPZNx)u z#6xYwLv2JCH{zi-;-NMM548~wwK0ht6!j_^&`fYhRr?fmQRg7l2|N&}Ui%PtGju(X zLw$%G>WLicG17V>hkA^$p2(q|$e|w7swZ-&CvvFAi_{Z2)Dt<>Cy_%v(k3TSvGJD= z3o{ktIEfax>xhM!0p`>U<_s`%Gnh|>%i#U-FsaH zW_<>8Bbb{#MmyZn+;>5HAY#4`L$Q}juKz$2Rb2zeUgh7W0sx(> zK1r{V$SZ1M`ZQ~i*Bek3hB&ElO(UP{xzB#rjcZnNDX$cHFBC#+LxQy~Uiz56k)-kR zN~G4&z1Q<--e|JNH2_tk=2!(a1{S>uC>zwy6y?>qOU4yI;n#b3JMwht*k|xSwTnrMqQzPs)2%}~^ug;3ffMHt!hN{>-=mM*2BPdqmO^-iBH zVaFwx9^7yx{couoI8t_*GT_v7ZipWOOgoA&-YH?hnF-!fwji8;f*Pk`Vu`_K22@77 zOY`)+C#~3Ai;Xn+g|rccRwS@jU*pZPbQs}8xOs)pz&Jg|)Ks|B{CGOmtIW;e*24~_ zF8$c2gIJ)0SfB%i?jRQEAQtE#7U)1PI*0{2hy^-`1v-cYI*0{2LM+fhEYOjRRyt4) zMHqs~2_meenrAR7JcK=%gProDYKO*LHM}D!(;qkvmE#yt-0shVQ=iawyFb&ID#TV(c2H8$ zAjA#fwGIV4GGd2-bqkMyPZ%vc9-ZO&@cX+?M2@D*o8!(eVdSbb{#XLk5|LVUsnWnM zplEVi%5O+4HnGvPHM(?KUk@&w%s0$N-VDu%d5ol zD$&hKEUyyFtHkmuvAjwwuM*3v#PTY!yvksCl~`V7VtJMP$c7(VP{Y|AcsHEgJ*M`i z#!3|U8Pw6G9KZTYDNCJ)>NAy}jLIG7OFN7r>uFKm>dZuJ5j5ViM@83k%?{Y&WKYf;!_lJaLkQ_)9vyLbYW`Y8SZ(sZz|AQpee=` z)II`1E#s&@eTVp3-l#LFZ=+A8&N8mxeoWcl3Yd?ekf8fo@TF!&QfMt4O3~v$yD|}& z#@ygb={Uy5$SXOUitOY=UCk2pztmh*?8ZuTJE2FS+X+ErfZ^gecL~T}@>tYP1ITD~ z8H3>C;xfUYzQr)Ab5wdKX4eY&Nv3qXS+F{`7RH!yt@YoPSj2pVw}VCa;6?OVi|Df! z(Pu59&ss#EwTM1z5q;Joy!j&ftVQ%$i|Df!g+6N$eb%BlbF?T?C(RtWlxB{U!a7iv zFmp5pby`Gzl84FeRP|Cmuf9jKIj*EQHJfvO1~VVbg|VKc8Jf->UFI>^!Ae$>>Jca# zn2Rv=ID^R7Ck+#3Uob;67)@@~L(#OnMsUPSPr&YN}&r`o9(Z--`ZkMgO-_b}Rb775(2D^nWY*zcq>3w(_Hfen4s04{VM7fJ=pbAmj@D zKpNxvflzilHMlEW@}t%3=TW{YY31DIBf+E9qInmo|fmD())m zPaDok+GX5Q%U$mF`_AfG*|y`Yt`)0m#p+tIx>l^N6{~B->RPe7R;;cSt82yTTCuuT ztgba!T`N}Cnpj;cN_B&ezHT6`c?!V+I~*KD{vgtMaEE$$A`#js8tD#cxh2Ms(@@+k zF*=M^8bWF=EpJUa4b|F+18?@2XSk9)P3wTRDq;q~y@tBgE*D(2nj4ayawBh{l-nJ* z2_8w_3{-pX2dX`f$Xd&}MMiTS>$J@RXvmi*LI(JhyQ^3;lY=rCttONsMym-2MT#)P zJVg^S$}avsVmsP}=@B_z0VRKxG-YmVlC_P2t zzEV~q0?Q1PKJaVb;VKNNyz8S1J(cUBO0G0U6E4hM_(QFQZY@1hdfboQN``+uW5rUD zW#sB@e|4DNkJB4P{pH;((miSSb(Y(OPJ7Gk!g9N?+%7D)3(M`oa=WnHE-beT%k9E) zyRh6YEVm2G?FyFLh2?f7mfM9gt@oCz^i3$%D&QSJjBYjzBDxeSsmYRtV7rZ7j32B@7OLk{ki4PHCfF)HknnPH-?|Cm_2}=!u zUexSRTUg~PRacKfalW9~aGfO%ji0Fs_7V5>m7Rrl-)o*N^LtLa8GC!1=*A|xv59VM zq8pp&#wNP4iEeD7n^N7_L^n3kjZJi86Wzfky0MAw#3s5?D}#CoHlogXda8cV8WRN_ z7*m6N%IzUkUojkYJuG4y!Dt)w#0=&rB#WZkyact>G&95D1|_aO$8#1u=SH66DYd{$ zSpuaaQY3FVm^BfjR;>eb3xA>R#N_l=w}IIlF_L%R4tG%SA>Q>-w)Q-f@NS3iX`jR1 z&*d@++52Hkp~&9PrJ$SXzu26c6c9$Ix%Y?Tumm$0%qI|j7|;dOX^IA$I=UgMX7!JX z<%BsFs>*BI`*csysh@Oh^WkZu(Muw>Ll{cA%>;p0n5&>j-t|DWR9(ID5BR)%i4Qna zLqNaq9Y%s-1Xz6OX^;Koy$t*cll9D&1RjODsxnp*w&RxQS3_S~f|Shur~5Ib{U9>* zuE|7v=roHqqxTpziqG4BLQ_61Gw~Y5=3DxL{2pKbWF97tIsF_-=HgQ~Ia*X>a3TS! zb(t2WHVS=&JMs5*^D~T7w{RP$zPJnKilmDh0Yg|+?!_@Pd(3xJZJJO;91FY4bSa75Ar<4^9qlMM3Ts$I9kL9IVb<(Vu9{$xyM7TZxyPK@+) z4D8I9I~ls$q8I4GxDREdF>b*-jd2U!Y0T;!uD&kdWTadN)CA5gzFnX7@E%%lKkuAO z@gyzZ3g(gUE=gH=qsMXUQwm%U_tS|hYhe}%t=_Wf91 znAd%KehlUBGwt~qn718$&$Y+)hq6byJ(kUzcJFk1?0#Slh^1+dJrIlzU&OzUrH8U3GZ?me+A*;`6Ep2O z3feJ|TkV?#kil^CnQaY{rK@%^ zn2t=lm|L_fLn&#CWqYVy8%iaZE5KZxY0tG_ZV08MQI^FgdyB_BWABJGwd_u4cL#~m zS$ofpM3*i5aqWYd_B;&c(J1GMP%3E$dvz@X#l%h%8?Y~cc`??dcDw>c`|tESJ!8Kc zX{vPxv>yhENjrY*+wlgJH#6<{IhbGg(#*N8VN>GOJl#CE@!ZWE>?n*%efKDo^DUe~ z4ZsyJ@s;2wFZ1rXI zJ)AV{acECPdE$N=%vUo!&x83!hUaDK67P4Q{B4HveK4=b(rVA&gZWto^BXYlWH7%) zo_PNQ%6l2g9~{M6{?NHJ#r8>J2fv203!t#FpV^idRxx`lyoBDqH&|lyA68=mWF+E3 z3>S4w(6u#+IFwCptn%r7_Ks`{YAQa4Qu}0Nd>oZ!C03;0B}+OaiK=)iOQaKdkS54nvc&C%8y-%C%Ca(&UoD8)$-C^Gsd-f=RmSYgH9iM$jm3eN7*qR>F~g=AbLd{ijA%Ay6wi3lM=dwz_#2Hmsn(cN zNY4Rx*8Rqu-`ALyyNqdj$e1NFjk)LzV^+Lv%%#s7a|Lp)g{ONx`_Ydx=FY2(+0ts5 zayJ~0GUoHI8?&AIp4ef`SKxV$=j)4&d2y35-#pitS6?&c+jTte8uLBUKcf6kZZ_s0 z-ZSPGZyNI}c;BJyZ{ITJcP|+8UpZs``%z>5^oFsyA;$KtGq(TljUD)`v4i>=JNQjw zha7Ee4fun07&~mcvAm}}Y`C#U+-2-&_{QC6Z2hCgPJG?i$?qC_T+Y}Nt}^zdn~j~e z-q@K$EvNq4*xA%E=RIT3L2eV}7tA(x@l0boD8KwAV^@zfcI{=xUUi(Y>(4dz`iaKg zguL63aVK?cdBWIx?lJa0{GPsE7bQ4 z^yg{si#5i+0{)x#82hdM#(sOMv9G;l?DvuT19;w`{7+kr{W;Gs;s0OM@o$@q{oM{@ z{{#L%2UHf7UzW`RHBT~l`Uc2jo# zL#C|dI8(NWeCM;KY$b3FWv;x@l<{{dyLp`{+em&Bb=^g~`0z{FgCkAZ=kGCP+vk|F zCtfmTPs95)+VhPUOxepdrtCF%cbsL)Uf*QO-gwoNz4=E|_Ew!K`{%t(*}uGJ%6><^ z{{{UInjf2K%I$lmyictu??08bi4Ie~&snB?$nQ=0LCn?+f5Ma>o-^fRH<|KDHKzQS zw@vxf;imi~PCm_;Xv$9ofBGAy{H*?_{9I^F>rFYocln~_rhMtMrhNGjQ+^3D)|_j~ zyMR}nWy-ICuY0N~zZn^~O*7?pA@5$wZT+Juf9yC@{>7V3`IGOO@~18{<&eizygq5ZV4DgVcZO!==!zXRXz=9u#Ler?L%pK5Zs;U?Gj1(WN4mdWjLw8`!L zw#n^xnaR~$WpcxFCPy@zJK}Yd8-Jt89ocGf$KGRdyi@L^!6r9zh{?@{Zw@@4KF;JC zA2PX?W|M1!zGShWwD19y#5lKl7%^-TrHn!b){-&aGhpDK3(^L$4-Bj%Jtf|=l zkEY@Pcn%t3Dh?TLDh_+kR1n2ijD>dscU2vgGZn{Zp{-~#wtsbk3=rUKtpamhqeae1AoxO$qYSpSx(=zi5y+O zxMQlRxQpjr+VN1Usdx<9<6kiqUw+9{d=)ugd%{$_c$}&D)?icdJ@{YmYbt)yY$|^C zj;Z)3ti$)EJ7$gQRh{<<8Wb!M)uc8ckn_t&z@>f#tHLsie z^*5V*H}uaS;Q@#n=Elgia)*^6AS*+MudwYA6|KEQN`qbpV zKRu~A)1LoXq8D2RS28O%|{{a6(k!Va$kxIw9g6Lkl%uejEHlC_#c_}LC+hu2~3 z{2#?1`iSJm8^g~xjz4KV_sC3SkJpi`4jj#{;$zs|bsRt1@hHGl&h4DY!NloY!!d)t z?-V9APvyrxjUVX@c6NP=Y0bIZ+;lcK5PX{Ti+P+oKA#nYCR=V^Vio9R?zF#x*@QP( z33{8kh!@P)%`ceo{b%zl){%0o!{)K}zO2{x<0vK{hhg7zmDz*aa;nYWnXfTd@n!P_ z-)p;;8;Bn_KQTA5i1a+SNWFS<~V+X zlKjx@VDfSss`xI;J3nTg<3||5znFjJXlFZfE=%!bY&J6g#`f}sDBU8IjBmE1u$?I2 z3Y2dpYbKX)DrpryX$?C>)^e7A9c!`gF!Q}9N6H4-yzOKA+TED{?q}X)4!pk|U@L7E zQ;`F0wcXS1We3^4?LKxev*Y{O{p}Dt)E;0zVQcJx_8@z(t+k)D!|u7K z9c2%%`tXeZet?NRn_xWIF0;$+3cJ!?Y%gIxf3>~TUS`+W%b7@AXS?hb_DXw| zy_$LcYwdb_oxPsP!!7nk+if@4o9xZ@7W)}{D{BC^+1u?Mc9Z?Az0-cq-o>QhX1m4S z!`i@o_HXR{_5mgfKWDevhwQ`l5&L=jsC~?SfpvrJ6^FO4SiCsbu%dHmeo52(&ZX^@ z9W9-0OPlAnwBv_cn)^&~=sr`HUbwWqWl^6dpKoeun!jRs%kJ~%w{^~6v1GyGmP`80 zZ(h2*X}*f~Yl+D|xL^q`Td<(tg0>4+Ahc;&>uya8+S*3fvDg(;lR|3Dn3x(HQxijK zY+X!^j;UB;?6`;T&!nYtY=(o_qbSgTzrFZvEFg9-f>a#xPs)^g7LAA@v)Bav5xVvj`6XM@v)Ba z_4&EUPa0mkzCenVj*pd&kCoQPO6y~#^|8|W*!21+r9Mijk5VSY5)-1l2~pmJ*z^gp z=@Vl6Cd4`>#5yL#Iwr(ACPsM^V;vJ?*@>|Q6Ju=?V{H>-Z4;y9iLthcv5rYm@}yYX zq$qh(lsqX)o)jfdifx$`B#*8uND1|ht_$);*9Cc_>w>(|bwS?fx*!ij^S|oox`O1; z=Fy`I)KEv=q)8Q17I(BZ^-KO;zO;SmvfS}4%bO}rYFe_SsbXr&;^j^GnN3SBXm0A$ zfUzuI+MYWHdViluN|ZM&Z|cjFWGd#gLeEXdNA%Y}&22cCWo^rLQ^s-3XzJ)_Dm!IG z*{l_1XSMY?bxB*|IcB$&pWeE(d`{DfiZj|ST+-C%Q?9})4}+xsKJV(D-P%@u0?+Ja zZT(JN(sH4zqrVrL@Z>I_MHNlSdnW(7W?ZOO?9<{Z>F=Q1{!GDT4>w?s4*^} zaf?P{HWM{2F|lxoOI$OPWU@?>nPjq>iOFOVlT4gU#%xT~@Bcsd-l|tcH;c)9zu)&w z3cBi5z4z`t_uR9ebMI4HDOH8HK&iRy9do?B-cF_TQ2aVpb2$H#b$#nMU%d88 zw3q#bo=NDV1BO^m|^}(9^v(zGLpc;ykZAaRYt` z9*C~P_l5XAe#7SeOFvb;>{)>J4@xDE+O%~|_jTWX?I9e0NU6y9&E1#w1;=H+fa@D^ zeRfOt=AN$mu4q##`ZVDGY2ViE{pY{u`hQev5?~y1X5Y4+zVD3u_Adc%9M|ttTIsjn zR+acviV*VUDeYbAy-WEx#_!&(Y6i}YS23K)sk77#`2Fe3Fy71a{%gF+f9=oTmSeUQ zdU?Be4ci*F>v!i~P&w;&$~Sj>>zM5CdEvJ%{Z3g8y)M6H0nvh|)jup* zu}|xpI`jIOxQeSaefw0b^~p`kW{nTj@jT8YyOJHrNy*`fAZ~x?jh+>q866jqA5yK) z55Kbd%G8xn(o+JLRJJ~kzRf@R#aHe7#_Q|PT9MCPzha-iwte5x{Pt}8N~MF`^=p>l zN7demS1#EdpBJARuZsog9*O+ zvN)$ev!s&<<}3x;tW-nfw$}zUCGT6;Y*O#ux^3+ib$R%G`;NZtsz3Y=Ftl(JAqJt~8);kv zQoa*T;Uv5(mC`@e_vrI=yN-j3KB6vG8`Mc^gq+hDuZOV(>JRFV^2fUaHBY@uy=>cw z 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∓eYz|5P z;&VuD6#p}@_bzI3XW*efgW;exq~{Q^=0sy~=)+w0r1Np@r73xEgje^~dlM)- zT6Eu@LCN>i&FHSz+Hf}l+mFwGJI1$xLML{E6LJbI`GOLx%7`LF&8F)^9Q=MoJ&ASN z_=im6IUgaorBATT=@&t^S|JBgPCqAj()5#@H&?~Saz+RVI4KVVu;o0E+nSfOsq5S7 zXO6|kP;$=S^{t}4&>>HrKq9nq0U}DqtDZn|TfLk&XW0YxA9w=E3ZM8T4msqD`g84x zN00-iFbDLjLfqRk%5d_>ks@g8|^%Uw#p@Y&@#>?eg_heA24( z>>Hd9`|Sp?60h_&$GwwW2<*4d!|X9ozxo>`Mm+QX)S@Qx=gHb&hR$rnJX6wS9NU=y zoe37Us_oTI^wzzpN-tl%Cu+G}+*eD?m9()rtT(qIpM$iGye3gAt9%XvxVL+7*kQ?{ zPGpHn%(X-rMGh+31WEJ?p+;m;7?Pt8D6@^8v!WTb*?dF{qKKG-iO2_JPPy7dV%VpN z1bU*F1Ue%NQ%xvs2eB%1pN42pfM(6(vqZ^HRz5aQ?&!%K;L-suGQT{F;#P*pv6zRR znyhR^_wOt^eyX;Py+@!W^#x1~L3K8((o<)nXH)3bqR_3|M7|WXA_gwE>;T9cZhP2e zZIJ1R15ikn+>1zzV9$EGfXxmCc8O0Fno1kDI++O@h82ruL}$74Tu(4X{L9Wr`G zohH^O#Cy~ovl_sz+8v+)*HoA6K}5WxOCAu(s6HS*T|Y_uv(Nz)qD z6|%lI>oyfWD8J=5gJLy44TvDK7>7aLxU|pik-D38L%}Nl$hr?U6yhRh0(YQ^o#ZG5(v|u<`VvI*SGZgAq@4-3gcPqx}&AsWXsp@|G1ed?F{M570 z7R9qKJWJbYHCQ`Q9AAR>g5hf{h~xzEVt$I^GTG}mlVTme*uF4Nhpm6etSMAm{W~x4 zFiTnKlG~~qt4~`MGfoQ1t8V%gb2MPZNuxY*-l}l%&^m6;kvFBt|Dj$tMnHSPQ#_O< ziZ<)3*~_yZK0^nk9^vH=C#^A972)MuoQamETsVxMUT<_X4IxG{t1rM?{`h=X(9rQb z9{!a*2@PX^l7-rr$jfXu6!_fJuH>`w@=0G;MgbI#9V1f8)|+Oxce8d>8!^yBLrS`{ zZ2rjkj)=F9Qby`OvrQ1OgWxNFd-*p=lqy;e;BBLJpZfajcT+ze5Ff^(w0D&D+vczM z>`2snP0e{Si>b+*3GD8c84COaq!XK$>%~dvVIft(dy}|8cOK2Am51Ab6X4S8u?QtBC?oOq5Qr#|kXyi)O1pPzwFneY*uz2w(>&)4GSTbBrl}kVm*?ps>R5r4DVws zCHrmsJUihd#Um|%U!ffa#_Sh=5Po9EE*1M#IK?B`*L- z?Y4pBK8v^I`Hd;QuW4)@VQSrnM3x`uMr6)&-;I4bj0YL?(oN+G)>r5tIKN88M5xW{qMxlVvz>4Ckm`BsvyT)!}bcY-#g9c(@hl z0LXot)~NZ|_i4;*6JGd6u8Upo`MH8>+X>Yw0hCBEoIMOo47p@zO9D$O#qTVi^1r5& z@kt3E;r*nTe+P9zGn71A8yrmOm0+7RLM5MB0p(Kz5n~rK9n(qBM-kJlO?15BzJcXI zWqZZ%2E<=0h-|6%LU%|O(}z5G*lnQIG)Zb|(%%Cu>qwbyJdrG*hnVgC{%zHLd|nqa z@q?_V;ec-WtnGZ4o{;7UB#C3}3Si=><{!HfD+~fN{|q(?IvIcUW5ri?z4$M&qh*25 zu+>xsGDFHx)H<(ROQi4*MA7$a3X>gkv{rgr=xDY*LkE$j24%q^6SgJ& zLp6Dz6g)%)!uZ`?ADH!yl*MU0I!!av31?*}pRcJ(nji}(#jq&6c9s(a%;UiKmvKL| zTWBEaNc5o0fmGl7tS75?Dt)!Ox4Yo-XY_e`U&4ydbAhePC|bkgF$raEgc~6{r$e_@ zsk}qBij0E|TCY#beT%JOA^2_m!~W1B>(G)Q=IU@b{2aU+*b$`mS*p)Ro; zU%=2r4QQhVgws=*_rCprO1x8aLC{X>sL)TpJzG*twcJZcWtm--etxB(R+O#uI>iH< z2O}F-#5jA=2=Mm3$++K2Mhkov{p^ah<8{?oRx4kEqbya{k=FwH*O)tq0kL`e*?<5y zsuew1zYxOV+#*dS)GB;p?sr%)hmQu z+W%j)-iI>qPt_gCN=u3UEzqO-x13=qCCD54JYLFC{xWSkuM^1!)RS-98kl@jUtGR1 z8I4ilhaJ*l;0@3kT0bS3w1rfliBQbW&Ttr2W5eyC3=(CRE#|h4g5?1OIix^C@jy6W zoIb3G-TQsX2UU6FnrUl-_L4j*R?HyZ3n58q{15XdkwnLr0`i z%_?H@A)HXM?^qkCz$#i^j}%q_02nwGNd;VmWx;-Ukju4b(-Y})^o{N6H^cRWPQzA)7sgFTS+2@ zwf6fHX8TSiwebUYlg+Dm*^ND7S4;@yxPzP^0_BVNj!Nq$66Y}foG}FI%7=h zjIBj;GHmpxlM)r&V)+);wweVsXNVq)mxTywpqtXS?_j=e*Ohgia~X9RA@&ktWG^y* zmf)^XLzrVd4h;7TxHiq=TRU6}CnpJv4Cb+Sb;!8`mf`-rCM85fc z@tsewwc2AkzuUK%hA;2#N-xOyOSf`9JP{?I)KnW7&hX zIB8LS@X|ey4y47mns2)~5B*dV^Xc*sae38rT-pmBgk}7xZ zY!L3;AO;!8QsATMo+!lo2{I5YwYf|bdMoEA=O}*~i9DK8_7d~Yh~NQTIfLGE%4i1_ zuG6_I6OvCvhGlP{JRKe;Y(zWJy{(_1Gl7iOOXHsV#eWU>eYv2+U~`C5j451=(MQ~j zPQAFGGzv)xS@1xpu*ox;qxaBQ?WcI_9_s*_p5h53#xr7r z5X(nvPR);=CVdI72c7P%^h5kbwvOn)UK~@sWnAQb_|! zc=H9?UUb?`AcIr8^8uoC)ML;RY)=bRIMB4pLW3tK=A)@BWsJq%j7GDWV`6M)G8v$W`?Scot4)?(f%qb$ly!iB zcEWD{U^qJ}Um%nWSFIPY!G%TL3y$|uZ5E#Q=oEm5YeSgDoTCoJQ| zcJqYO?tdix(!C1)EM@P}7aMfBlZ`PAYu} zq69d~hbnqsg{hey-&G5$uQ>&^%ElTDNd_{Lm9JNaC&OM0h}&m=AS<+5_pJEEIGg9F zE+VXi&gKWbtEN8rNhu`#HF-LpkIzX(JMDwVvK!OVKq5&yFD^^;`qE-$Ux!N$il2>@ zT}Q#fpIK^?Un3(baiw?F>VsC-E%Y%cIx(o#54^KvR(Tnv8(yYeqM?ssA#BZnK~;g_ zB~3*-pKM)m$^GKd60oPK09bu}Ma9X~8fsbrQv=4D8lXpO;HPD)Nf5$At2l!CP%5f? z%bIUNoe>b#v{9T5Vs3`A)ebg%hciJ)QhPaXD*h&hR<6BT`Ss#v@m%q8ajW>Z)?a`7 zYUc`0J2$O?gNSQL5ldUaZL?2rxnjmFr(%Y$fr+k&T+gCiV^%i5_`b9DLITvs3=!|MOFq_$55Z zXI#NaPm*quyv9~8U0lcP(G z$?oKBfoB~wwc-VvD{Fwcat2_YlU8g5&cG4K)`235=id@w*!wC#^1n;tJ`NB05Co4~ z#bNOWhRN?XNvRGVsP+YmPIJ(+cTv@ywm~;5*o!gtR=lZqF`V;8Qr%?9>P_!j)DuNph6?Jr~%b*s&< z!zrIy?(+`~f4F^f}C za)BP8N8iO*AZwK7%>6WPo`>}c)v%E_=Rq|{pH`D0Ye-8pvu5j5>G>~ptpI>Fu5xQv_)A}tMwHt52-={oM(01#Ry@XDD^|`5i*OFxo2pD&ec84 z)kfp4MrG*Sj-Ahdm0^P#-E?0c1~{fy>=@+-NvvMn)Y_1l)F2nzsW2{Fw5`%6S+L!{ z+rHoJlA=B6(omHPsAB95F1@s^nwVYn5fzE0Y$Qe16GY?wnp1pd`HJF-)qN44upE2? zzPa5igElu$4wfEkZ*bp+qk0^Kx6A_upVPVu2QuFeUU@ZDG^hW?;oGuVoKD8@L zhO7lP>#S<%j0eOCIQ9HNX(az9^rFv^nUu6?et#59NaLLfQVIvS4BrESS(BzF??~ep z*r5`LxUv+u?6X=l;ZGCisiwUqA z*Y@nHUsKl1Xr`v;+{ViL<@`}j_{rf~M#$pVcOYa&gy19Kd>Ku9c6qbY($vgIC4Q?B zO}=Y>L_I8pPPq*!eX>LJEe^+De+hlI3UCN!n831vL%LWz$Cm(Ud~u13jhsuOmXYM2 z+db`OhC&$yG;zoo5TiCqTS<0(ZyvJKQES7dJGSJkV-EUcY4q1Yib1q$JIAgsyr?-RBub$^AArD4gb9ro7gX*rN zo>)2I`SMbVhAYfADYFF0-GD-tX_;0fASKi8uF15|;l2_N4Oar7B(zfBNxqMTwpV(> zeZ+q8$Vtp#Ph+-!_gjh6rc=qDpj_L`$@FP%d;CCB_Kev|c{F01>t}k-OE-Ihe6ZmS z5YWDgcZmTYU%6p_cDtrs~*u2r4G0PVdgNnl)w3gxMtI9Hpmi6}w5<7m_)ne=?(5RfM8tl0PJU-OMsR0OR*x+KP+9R%*X`>J{3PD2+oF&BW4+RZh-D&n8`|?3!7|=N1 z_2-91gmV&;6hs6GeF2TnCH|>@3ci_Ol6Ib0c?k!<3GRgzgGAacem(ReLfz4sA#pDp zge^6}$>ODtQQjYX6{NEF&iHWW7~?wos?D^1hA^sa!yF66V|DGT91G`{jAjA`A(jZt zkWK$pl({gNmF#}!7_&P2s?BRZU5M3}ZY(rmW0~0xJLvV1m4s>t$SU)ZQR3)ZHmwln z>k|lvm}(85d{Pe)p0a-=l)^_YOWxV!lGcii>N(gz+?yLW8@OL}fPQT2tpW?~ypPc^ zB|ipx+7BtU&hj~Q?p?V({!~dk?dyKbRXpF0YLC)xyd!I+)8 zVc@>yRL#nu-A-zan1iG5w%pN>rNe~e&sVx+-^#@OH4S3*CR#|A`{>8qohn4oE!c_NL}&8zlxCIu4j0g{$+_92VW<0@qG9_Ph@G(cu_08ct>N~v zB*01Eb=8KDDG3V-6F=Mc+4Cp+n2xk~FJ^dzHH&IUr(Xs$!BYo_mWjHZJ2dGD3PO{6 z%0;tZ`&4VWuHq!YAcaSy;mLinkpQ@X&JTfpqrKcmuMMfN>X~;uY|&}W+q7b*?KRf? zble9d5yt@CY^vUnY)PZ^DaMD+&XC^3Zw zF@-sf#1z%*c9XA#W4M2BE5kk~(rxrsY$Ko*sdnH_WF`~2?zkf2U^ZB)&8z4&{}pBpsV<9_=Ay@Hy z0p9_%v|5=ETX1hD&P7U((#@ce1pR~J=a>JG%*7c_qFI4Mp*?EQ?iwM=plqT$YCF)F z9~JZYTeLt?iqF(IPoAJlS|S{OP-O6zsFYT|SP1qAfWwG$8R|gaX`_cym_lii;aCEk zUHA-~!a;lZ6`Vl`4S% zfXa0tEJ%ubicD5snh{=_-wSPoQZ%rdx*%q`k$OVC7Wt}!5u*qz(=vNESWl|pxGTZ_ zx-M;XSi7(7JwE@%1arsZ@!r@7Q#BM8&=n@~*RIm7^#!mG4hb01$%~u;VTw}*6xme^ zi0qdu{ZOjV7hW?Tjk;UJF0mfcC4nnbS|t48lZ4O|rZzT!ym4`&bef8p$Jmpr&+~9RQ>dg#IO8YR0}+VZV{G?vr6(28!>yM*lRw5l%Ci=-9e! zmz`5_B1VbJ)~6z=ou9K;yiMmYLKQ7S74VuiwvSR$x*cK|-l#_e0{o;OfL%F@Y}3A> z#>D;1MG_P=JjT$EA1MTp{-w5>ea$WmFQUB1NXNvPRf!O$1}o`y@6%r=$;FL4SqXKL ziE#$}-VJGJ4#5f&;Ta_oURa`dMZdbzfvb51iWa;=E{=*%FJA;5I?V@Fti%3a0v^qd zq9m9`Mg%3-#Uer!1Q*rg^dB(ip0+vGW$i)nPnKWbZfy|+NVD^*(D5#&*VIC5dI`=t zoxQ6Dt@NYYAzSx;`~K5UE9585aKs`h(VH|?k zI&Z)UT#lG9XjKYgA-G=PQifUVZ@K(}2j`$4Vnq?hGjX?Js7iivfm^#nBv)(S7(zi) zvzxoaZ(vEE`@n6jLjTE{5MdLG(i30AycQ2>wovjD6`^)-P}<}Gk^j8){&&A6$3on# z(jw$7-!F#WzIu6zKHqx9B8M<2JkVcaeCCCcodF237|BIZxhif_XP5vDKhaVtQ+;( zB=K;kQG=w)C%n~JDTh{g0D!&(lE8H-o@uisu9TbCn-g}=-f_k#T%;6T0%EO>Q@V2+ zRxwuAL~@$3d%}(4$?Se5v-HblLjvwZ{1v(VWVbqf_hF@r&G?Hw>nmW8RizWQuQ(^n z85yWZQ~ytQcLqiCl`^X+!&3L_fttQc{7^Wn0ww5_-ek zvTRUh&YR00l?~gVLcY0;ZwU8G89+efzyy{!peUEO zW`kNkw!#UVaCf=&)U~UZFYQoaHXec;c#?zs#HiGNiHwzlUEZ5PrN6m1L>%M?yVZX4 zAII4gydrar$VB>*;}Ob`x6@?EEVd3!A)3_3W7fh*tad*{CN#c6nT-SUA^7LY7FDdm z+L5`!u2X50Ho=NeJ*DcI8@ylFr6pey=W@qd7=O|Hb;%vs^0=0G>sW7_SZ_nT#?!$A zippM8W&-jlalR^}YI`{k=uO6hKBKpb9?%0PWNRs1UQnzGs2A`xi8=p*c9K1|m30gKyA4VrQ z)o&#MZUQn?^n=$*uZ9VC9q6t~$_5tffIBJ!H94lZKuEgfy#qn^zCXC^ zayPecI}`!z-Vx)-8jgPJ??XEs#7ZC!eo8kN-73wz&UE>Mf6?{ZQb{0? z;Ag<-Cht^-=5K(KX+oNyRBORVuuE_fw=hT&2oi}4PUe055||Q{bP+H8@EgHOR2f`l zJJU}#ou$CX7gUrkP+GL^p%;0jLDPb?uBNZxD{{N@eexWne>hg}O0 z;2~@^?jQkNyD*g`IDQ5n%PTNfS=SL%MNr~WzEBHLvJz6Xq^9Fm!3)Jp#b=A_%d4OH z^rwF0xo4kw`uepimv=22gS(G|yX(02*tEGkzjbW-HpkbI@jff~B_Jx{#2Im9`XA|t z(y1jV)qll_@&AGO44C)od^AJ7ydX)B8kg2JiA(2C2ZWQT(Uaq~@ktrBY_2+&xWr(2UMVC1&eJx8CQmL;!SCZjMcj3Sl&37iJ2a4ExA5MEoA zWn?->yR5w~$F?ImP^(DG$xPULt=&iGv*}z7y%n0xAUgKDb~;&tvCFHbu1QCygYf2< z51|}b0rjf9*SE4^r5v$Dtzc z1&`5K5#QF%j{NxLkl=Y0t}4Cvkx_pWI4lktut*lZ=&@?F)ZK6mL&F|cz~W>J+xMdq zP^lBA`*HeuPztKH@D%Egx_FOA#k4(|qC-rI_T<6Vg8sTxiz>i5 z9;a$UBG9z&L}R+Ea@Q~E9+RS_hVf5$6Y|xbe!6n0)O3w3K<$eby-H#Pm4!DFRf7nC zxWt`g2w441*sR^_+%oUT)a!~_{)aW~;IOLvy;A&6cnWS)Xh~%Rb^w7s#mI+A4~zgRNr` zgnGBxodIn_M0uQDCUKlW(4YSHX+ni|VTOzdvWBnmXBJS#?%1TMU0N}7zD?~_1w_Q7 zB*%ZxR_4DF7gM1#(c4R;{?lse(dAKpj{_Wxdw4#Qx?D`J%!aM*VoF~5)#hTmF-Ph@ zDqJa2P$zOktIFNCrTOjbDEO9(L;_(eov$M0Dir4qA^TYCwp_6-OSQp)IP^h&OVg7| zAtrBA8_!o1KT5j;AQ*Hq964Az2alww`ER^(RkM~2jY ztU>BZg4DHX|EeH06QpL>8}s1|pb*tts8VS0)YfF5VWm5Z?xWos&7Dh)?Y*7tN5$Ud z%X<%sy}ipv#pS)rZ$JP1GtWHr)YYqzcb}^yo`3Oq%50u_?wRMFJ$UNoQ#YT!an-@I z`4tZtcl>M(gioIULUOY~BcT#b`Gs<{^?e#3#T5-o0ZHO>BOtR98|o|{O(2!V!--fY zlNCzVDSjoz15BXNktb|#JAV`ziLBMOGF_b!kaf?WG3+S_3@jax97J|T>Kld^j&5b{ zL)Y!uaa&a%$+e6brUVV66&$gqBfuGi4k5HM1xZFWUY;8@a41~EBVlRf&PZv|VKxitQ(w0#>s72UPErK+qg_($T0uO6jv{+~lrU8-) z_slg)ZCN0gRy)8J4bFcO9<`JBRYD~b3QE_OT{1hkDrVZO8LL^j?Jy2=}{UIqm zC|c`57-8TxP_sBbl&TKqVcADmQW`0T#Ql{kdCqL)ZEgml3Xj3S@4e27UroIJ;yo;g zy_iVgtx_q!_iYxJLS)?g54rd6r+eS_-d_O2h4&y%RTD$ME^WM2%sREZN=g0x?~CN( zwngK6Ti^c;=eGBXSA0*(Ql$*Y#VK%#+LT2cz^w9!yiTL|!7eNxy#5VgH}vwoYmHy{ ztD^De=ZB$GM6UYt#xDRwZRqRxFy$rridGa_&YogmjpjcVYe>~de6;cQ{_>LkkDR2d z|AQ%bti5!WYP}2F?egS^Y3Q`&Z8JnKcG|*D^BdvH$939b57lYYM!3574{+KN8Rcoi zA%6&W#RJS;1CG*gzF<7MO%;jbmbmKSYh`q=ph2`Nw!|)KfkzcOm_DUg@ZB+wVEMrT z5*hf^($hx8tA3KkK=F_u1ELZt4f9;C<55^Y;1I^S8&*|VY9;+Eeq!tccYDPXKwWBm zG6cnj1$s-6a>XA%&q8Z1vAA3_un;wf7p62dNM(cE3wQ)Hz`mr!O8Roo!0dBUhGMc% z)eoOC@ItI$+brW7>B`^$Jq?sIVtnIQ|bU{vjft+OdfSPny zPxb0HLh=I%pJ9zft3sWRStR?@=~zSX6Q7)`rJhj@o|4@+C9gD|rM$b?$?M+9XSEX? zC{5fbU$TgsBhXK3T q5O7BvLkED_I;y-U+)p}i7}MNRvQ6gzu645JFOMI(iu? "T20" (defensively also handle + "T20I"/"ODI"/"Test"/"Twenty20"/"First-class") + - competitions[].competitors[].score -> e.g. "161/5 (18/20 ov, target 156)" + - competitions[].competitors[].linescores[] -> {period, runs, wickets, overs, + isBatting, description} + - status.type.state -> "pre" | "in" | "post" + - status.summary -> human result string, e.g. "RCB won by 5 wkts (12b rem)" +""" + +import logging +import math +import re +import time +from datetime import datetime, timezone +from typing import Any, Dict, List, Optional + +import requests + +logger = logging.getLogger(__name__) + +HEADER_URL = "https://site.web.api.espn.com/apis/v2/scoreboard/header?sport=cricket" +SERIES_URL = "https://site.api.espn.com/apis/site/v2/sports/cricket/{series_id}/scoreboard" + +_HEADERS = { + "User-Agent": "LEDMatrix/2.0 (https://github.com/ChuckBuilds/LEDMatrix)", + "Accept": "application/json", +} + +# Default balls-per-innings by format, used only when the score string does not +# already carry a "(x/y ov)" max-overs hint. +FORMAT_MAX_OVERS = { + "T20": 20, + "T20I": 20, + "TWENTY20": 20, + "ODI": 50, + "ODM": 50, + "LIST A": 50, + "THE HUNDRED": 100, # The Hundred counts balls, not overs; handled loosely. +} + +# States that ESPN uses in status.type.state. +STATE_PRE = "pre" +STATE_IN = "in" +STATE_POST = "post" + + +# --------------------------------------------------------------------------- # +# Overs math (base-6 fractional part) -- unit tested in test_cricket_plugin.py +# --------------------------------------------------------------------------- # + +def overs_to_decimal(overs: float) -> float: + """Convert cricket overs notation to a true decimal overs value. + + Cricket overs are base-6 in the fractional part: `18.4` means 18 completed + overs PLUS 4 balls, i.e. 18 + 4/6 = 18.6667 decimal overs -- NOT 18.4. + + Args: + overs: overs in cricket notation (e.g. 18.4, 20.0, 6.2). + + Returns: + Decimal overs suitable for run-rate division (e.g. 18.6667). + """ + if overs is None: + return 0.0 + try: + overs = float(overs) + except (TypeError, ValueError): + return 0.0 + if overs < 0: + return 0.0 + whole = int(math.floor(overs)) + # Recover the balls digit robustly against float noise (e.g. 18.399999). + balls = int(round((overs - whole) * 10)) + if balls >= 6: + # Malformed notation (a legal over only has 0..5 in the fraction); + # roll it forward rather than produce nonsense. + whole += balls // 6 + balls = balls % 6 + return whole + balls / 6.0 + + +def overs_to_balls(overs: float) -> int: + """Return the total number of legal balls represented by an overs value.""" + if overs is None: + return 0 + try: + overs = float(overs) + except (TypeError, ValueError): + return 0 + whole = int(math.floor(overs)) + balls = int(round((overs - whole) * 10)) + if balls >= 6: + whole += balls // 6 + balls = balls % 6 + return whole * 6 + balls + + +def current_run_rate(runs: int, overs: float) -> Optional[float]: + """Current run rate = runs / decimal_overs. None if no overs bowled yet.""" + dec = overs_to_decimal(overs) + if dec <= 0: + return None + return runs / dec + + +def required_run_rate(runs_needed: int, balls_remaining: int) -> Optional[float]: + """Required run rate for a chase = runs_needed / (balls_remaining / 6). + + Args: + runs_needed: runs still required to win (target - current runs). + balls_remaining: legal balls left in the innings. + + Returns: + Required runs per over, or None when no balls remain. + """ + if balls_remaining <= 0: + return None + if runs_needed < 0: + runs_needed = 0 + return runs_needed / (balls_remaining / 6.0) + + +# --------------------------------------------------------------------------- # +# Fetcher +# --------------------------------------------------------------------------- # + +class CricketDataFetcher: + """Discovers cricket series ids and fetches/parses their scoreboards.""" + + def __init__(self, cache_manager, config: Dict[str, Any], + competitions: List[Dict[str, Any]], request_timeout: int = 30): + self.cache_manager = cache_manager + self.config = config or {} + self.competitions = competitions or [] + self.request_timeout = request_timeout + self.session = requests.Session() + + # competition key -> list of lowercase search terms + self._comp_terms: Dict[str, List[str]] = {} + for comp in self.competitions: + key = comp.get("key") + terms = comp.get("search_terms") or [] + self._comp_terms[key] = [t.lower() for t in terms] + + self._discovery_interval = int(self.config.get("series_discovery_interval", 86400)) + self._last_discovery = 0.0 + self._resolved_series: List[Dict[str, Any]] = [] + + # ---- cache helpers ---------------------------------------------------- # + + def _cache_get(self, key: str, max_age: int) -> Any: + """Best-effort cache read; any cache error is treated as a miss.""" + try: + if self.cache_manager is None: + return None + return self.cache_manager.get(key, max_age=max_age) + except TypeError: + try: + return self.cache_manager.get(key) + except Exception: + return None + except Exception: + return None + + def _cache_set(self, key: str, value: Any, ttl: int) -> None: + try: + if self.cache_manager is None: + return + self.cache_manager.set(key, value, ttl=ttl) + except TypeError: + try: + self.cache_manager.set(key, value) + except Exception: + pass + except Exception: + pass + + # ---- HTTP ------------------------------------------------------------- # + + def _get_json(self, url: str) -> Optional[Dict[str, Any]]: + try: + resp = self.session.get(url, headers=_HEADERS, timeout=self.request_timeout) + if resp.status_code == 200: + return resp.json() + logger.warning("Cricket API %s returned HTTP %s", url, resp.status_code) + except Exception as e: # pragma: no cover - network failure path + logger.warning("Cricket API request failed for %s: %s", url, e) + return None + + # ---- series discovery ------------------------------------------------- # + + def _match_competition(self, league: Dict[str, Any], + enabled_keys: List[str]) -> Optional[str]: + """Return the competition key a header league belongs to, or None.""" + haystacks = " ".join( + str(league.get(f, "") or "") + for f in ("name", "shortName", "shortAlternateName", "abbreviation") + ).lower() + for key in enabled_keys: + if key == "international": + continue # international is handled by team matching + for term in self._comp_terms.get(key, []): + if term and term in haystacks: + return key + return None + + @staticmethod + def _league_event_text(league: Dict[str, Any]) -> str: + parts = [str(league.get("name", "") or ""), + str(league.get("shortName", "") or "")] + for ev in league.get("events", []) or []: + parts.append(str(ev.get("name", "") or "")) + parts.append(str(ev.get("shortName", "") or "")) + return " ".join(parts).lower() + + def discover_series(self, force: bool = False) -> List[Dict[str, Any]]: + """Resolve numeric series ids for the configured favorites. + + Returns a list of dicts: {'series_id', 'name', 'competition_key'}. + Cached to `cricket:series_ids` for `series_discovery_interval` seconds. + """ + now = time.time() + if (not force and self._resolved_series + and now - self._last_discovery < self._discovery_interval): + return self._resolved_series + + cache_key = "cricket:series_ids" + cached = self._cache_get(cache_key, max_age=self._discovery_interval) + if cached and not force: + self._resolved_series = cached + self._last_discovery = now + return cached + + enabled_keys = list(self.config.get("favorite_competitions", + ["international", "ipl", "bbl"])) + favorite_teams = [t.lower() for t in self.config.get("favorite_teams", [])] + follow_international = "international" in enabled_keys + + data = self._get_json(HEADER_URL) + resolved: List[Dict[str, Any]] = [] + seen_ids = set() + if data: + sports = data.get("sports", []) or [] + leagues = sports[0].get("leagues", []) if sports else [] + for league in leagues: + sid = str(league.get("id", "") or "") + if not sid or sid in seen_ids: + continue + + comp_key = self._match_competition(league, enabled_keys) + + # International: match a favorite national team appearing in the + # series/event names (e.g. "India Women tour of England 2026"). + if comp_key is None and follow_international and favorite_teams: + text = self._league_event_text(league) + if any(team in text for team in favorite_teams): + comp_key = "international" + + if comp_key is None: + continue + + resolved.append({ + "series_id": sid, + "name": league.get("name") or league.get("shortName") or sid, + "competition_key": comp_key, + }) + seen_ids.add(sid) + + if resolved: + self._cache_set(cache_key, resolved, ttl=self._discovery_interval) + # If discovery failed but we have a stale cache, keep using it. + if not resolved and cached: + resolved = cached + + self._resolved_series = resolved + self._last_discovery = now + logger.info("Cricket series discovery resolved %d series: %s", + len(resolved), ", ".join(r["name"] for r in resolved) or "none") + return resolved + + # ---- scoreboard fetch + parse ---------------------------------------- # + + def fetch_matches(self, ttl: int = 300) -> List[Dict[str, Any]]: + """Fetch and parse matches for every resolved series.""" + series = self.discover_series() + matches: List[Dict[str, Any]] = [] + for entry in series: + sid = entry["series_id"] + comp_key = entry["competition_key"] + cache_key = f"cricket:scoreboard:{sid}" + data = self._cache_get(cache_key, max_age=ttl) + if data is None: + data = self._get_json(SERIES_URL.format(series_id=sid)) + if data is not None: + self._cache_set(cache_key, data, ttl=ttl) + if not data: + continue + for ev in data.get("events", []) or []: + parsed = self._parse_event(ev, series_id=sid, + series_name=entry["name"], + competition_key=comp_key) + if parsed: + matches.append(parsed) + return matches + + def _parse_event(self, ev: Dict[str, Any], series_id: str, series_name: str, + competition_key: str) -> Optional[Dict[str, Any]]: + try: + comps = ev.get("competitions", []) or [] + if not comps: + return None + comp = comps[0] + status = ev.get("status") or comp.get("status") or {} + stype = status.get("type", {}) or {} + state = (stype.get("state") or "pre").lower() + + cls = comp.get("class", {}) or {} + event_type = (cls.get("eventType") or cls.get("generalClassCard") or "").strip() + fmt = self._normalize_format(event_type) + is_test = fmt in ("Test", "First-class") + + venue = "" + v = comp.get("venue") or {} + if v: + venue = v.get("fullName") or "" + + teams = [] + for c in comp.get("competitors", []) or []: + teams.append(self._parse_competitor(c)) + # Keep ESPN order (competitors are ordered home/away). + teams.sort(key=lambda t: t.get("order", 0)) + + target = self._parse_target(teams) + + match = { + "id": str(ev.get("id", "")), + "series_id": series_id, + "series_name": series_name, + "competition_key": competition_key, + "name": ev.get("name", ""), + "short_name": ev.get("shortName", ""), + "format": fmt, + "is_test": is_test, + "state": state, + "status_summary": status.get("summary", "") or "", + "status_detail": stype.get("detail", "") or "", + "status_short": stype.get("shortDetail", "") or "", + "period": int(status.get("period", 0) or 0), + "date": comp.get("date") or ev.get("date") or "", + "start_time_utc": self._parse_iso(comp.get("date") or ev.get("date")), + "venue": venue, + "teams": teams, + "target": target, + } + return match + except Exception as e: # pragma: no cover - defensive + logger.warning("Failed to parse cricket event %s: %s", ev.get("id"), e) + return None + + def _parse_competitor(self, c: Dict[str, Any]) -> Dict[str, Any]: + team = c.get("team", {}) or {} + innings = [] + for ls in c.get("linescores", []) or []: + overs_raw = ls.get("overs", 0.0) + innings.append({ + "period": int(ls.get("period", 0) or 0), + "runs": int(ls.get("runs", 0) or 0), + "wickets": int(ls.get("wickets", 0) or 0), + "overs_raw": overs_raw, + "overs_decimal": overs_to_decimal(overs_raw), + "balls": overs_to_balls(overs_raw), + "is_batting": bool(ls.get("isBatting", False)), + "description": ls.get("description", "") or "", + }) + + logo_url = None + logos = team.get("logos") or [] + if logos: + logo_url = logos[0].get("href") + + records = "" + rec = c.get("records") or [] + if rec and isinstance(rec, list): + records = rec[0].get("summary", "") if isinstance(rec[0], dict) else "" + + return { + "order": int(c.get("order", 0) or 0), + "home_away": c.get("homeAway", ""), + "id": str(team.get("id", "") or c.get("id", "")), + "name": team.get("displayName") or team.get("name") or "", + "short_name": team.get("shortDisplayName") or team.get("name") or "", + "abbr": team.get("abbreviation") or "", + "logo_url": logo_url, + "winner": bool(c.get("winner", False)), + "score_str": c.get("score", "") or "", + "innings": innings, + "records": records, + } + + @staticmethod + def _normalize_format(event_type: str) -> str: + et = (event_type or "").strip().upper() + if not et: + return "T20" + if "TEST" in et: + return "Test" + if "FIRST" in et: + return "First-class" + if et in ("T20I", "IT20"): + return "T20I" + if "T20" in et or "TWENTY20" in et or "TWENTY" in et: + return "T20" + if "ODI" in et or "ONE DAY" in et or "ONE-DAY" in et: + return "ODI" + if "HUNDRED" in et: + return "The Hundred" + if "LIST A" in et: + return "ODI" + return event_type.strip() + + @staticmethod + def _parse_target(teams: List[Dict[str, Any]]) -> Optional[int]: + """Extract the chase target from a competitor score string. + + e.g. "161/5 (18/20 ov, target 156)" -> 156 + """ + for t in teams: + m = re.search(r"target\s+(\d+)", t.get("score_str", ""), re.IGNORECASE) + if m: + return int(m.group(1)) + return None + + @staticmethod + def parse_max_overs(score_str: str, fmt: str) -> Optional[int]: + """Extract max overs from a score string like '(18/20 ov...)'. + + Falls back to the format default (T20=20, ODI=50, ...). + """ + m = re.search(r"/\s*(\d+)\s*ov", score_str or "", re.IGNORECASE) + if m: + return int(m.group(1)) + return FORMAT_MAX_OVERS.get((fmt or "").upper()) + + @staticmethod + def _parse_iso(value: Optional[str]) -> Optional[datetime]: + if not value: + return None + try: + v = value.replace("Z", "+00:00") + dt = datetime.fromisoformat(v) + if dt.tzinfo is None: + dt = dt.replace(tzinfo=timezone.utc) + return dt + except Exception: + return None diff --git a/plugins/cricket-scoreboard/cricket_renderer.py b/plugins/cricket-scoreboard/cricket_renderer.py new file mode 100644 index 00000000..36562e8a --- /dev/null +++ b/plugins/cricket-scoreboard/cricket_renderer.py @@ -0,0 +1,438 @@ +""" +Cricket scoreboard renderer. + +One render method per match state, mirroring the separate-renderer-per-view +pattern used by the olympics plugin's renderers: + + render_live_limited_overs -> live T20 / ODI (overs clock, run rate, target/RRR) + render_live_test -> live Test / first-class (day + session, no clock) + render_recent -> completed match (final scores + result summary) + render_upcoming -> scheduled match (date/time, teams, venue, format) + +Each method returns a PIL Image sized (width, height) that the manager pastes +onto the display_manager and pushes with update_display(). +""" + +import logging +import os +from datetime import datetime +from pathlib import Path +from typing import Any, Dict, List, Optional, Tuple + +from PIL import Image, ImageDraw, ImageFont + +from cricket_data_fetcher import ( + CricketDataFetcher, + current_run_rate, + required_run_rate, +) + +logger = logging.getLogger(__name__) + +_PLUGIN_DIR = Path(__file__).resolve().parent + +# Font search paths: bundled first, then the core LEDMatrix asset dirs. +_FONT_DIRS = [ + _PLUGIN_DIR / "assets" / "fonts", + Path("assets") / "fonts", + _PLUGIN_DIR.parent.parent / "assets" / "fonts", + Path.home() / "Github" / "LEDMatrix" / "assets" / "fonts", +] + +WHITE = (255, 255, 255) +BLACK = (0, 0, 0) +GREY = (170, 170, 170) +YELLOW = (255, 210, 0) +GREEN = (0, 255, 102) + + +def _hex_to_rgb(value: str, default: Tuple[int, int, int]) -> Tuple[int, int, int]: + if not value: + return default + v = value.lstrip("#") + if len(v) != 6: + return default + try: + return (int(v[0:2], 16), int(v[2:4], 16), int(v[4:6], 16)) + except ValueError: + return default + + +class CricketRenderer: + """Renders cricket match cards for the LED matrix.""" + + def __init__(self, display_width: int, display_height: int, + config: Dict[str, Any]): + self.width = display_width + self.height = display_height + self.config = config or {} + + custom = self.config.get("customization", {}) or {} + colors = custom.get("colors", {}) or {} + self.score_color = _hex_to_rgb(colors.get("score_color"), WHITE) + self.batting_color = _hex_to_rgb(colors.get("batting_color"), GREEN) + self.detail_color = _hex_to_rgb(colors.get("detail_color"), YELLOW) + self.status_color = _hex_to_rgb(colors.get("status_color"), GREY) + + self._fonts: Dict[str, ImageFont.ImageFont] = {} + self._load_fonts(custom) + + self._img_cache: Dict[str, Optional[Image.Image]] = {} + + # ---- fonts ------------------------------------------------------------ # + + @staticmethod + def _find_font(filename: str) -> Optional[str]: + for d in _FONT_DIRS: + p = Path(d) / filename + if p.exists(): + return str(p) + return None + + def _load_one(self, element_cfg: Dict[str, Any], default_font: str, + default_size: int) -> ImageFont.ImageFont: + name = (element_cfg or {}).get("font", default_font) + size = int((element_cfg or {}).get("font_size", default_size)) + path = self._find_font(name) or self._find_font(default_font) + if path: + try: + return ImageFont.truetype(path, size) + except Exception as e: + logger.warning("Font load failed %s@%s: %s", path, size, e) + return ImageFont.load_default() + + def _load_fonts(self, custom: Dict[str, Any]) -> None: + self._fonts["score"] = self._load_one(custom.get("score_text"), + "PressStart2P-Regular.ttf", 10) + self._fonts["period"] = self._load_one(custom.get("period_text"), + "PressStart2P-Regular.ttf", 8) + self._fonts["team"] = self._load_one(custom.get("team_name"), + "PressStart2P-Regular.ttf", 8) + self._fonts["status"] = self._load_one(custom.get("status_text"), + "4x6-font.ttf", 6) + self._fonts["detail"] = self._load_one(custom.get("detail_text"), + "4x6-font.ttf", 6) + + # ---- draw helpers ----------------------------------------------------- # + + def _text_size(self, draw: ImageDraw.ImageDraw, text: str, + font: ImageFont.ImageFont) -> Tuple[int, int]: + try: + bbox = draw.textbbox((0, 0), text, font=font) + return bbox[2] - bbox[0], bbox[3] - bbox[1] + except AttributeError: + return len(text) * 6, 8 + + def _draw_centered(self, draw: ImageDraw.ImageDraw, text: str, + cx: int, y: int, font: ImageFont.ImageFont, + fill: Tuple[int, int, int]) -> None: + w, _ = self._text_size(draw, text, font) + draw.text((cx - w // 2, y), text, font=font, fill=fill) + + def _blank(self) -> Tuple[Image.Image, ImageDraw.ImageDraw]: + img = Image.new("RGB", (self.width, self.height), BLACK) + return img, ImageDraw.Draw(img) + + # ---- team crest (flag / logo / placeholder) --------------------------- # + + def _load_crest(self, team: Dict[str, Any], size: int) -> Optional[Image.Image]: + """Load a national-team flag or franchise logo, cached by key+size.""" + abbr = (team.get("abbr") or "").upper() + name = (team.get("name") or "").lower().replace(" ", "_") + cache_key = f"{abbr}:{name}:{size}" + if cache_key in self._img_cache: + return self._img_cache[cache_key] + + candidates: List[Path] = [] + flags_dir = _PLUGIN_DIR / "assets" / "flags" + logos_dir = _PLUGIN_DIR / "assets" / "logos" + if abbr: + candidates += [flags_dir / f"{abbr}.png", logos_dir / f"{abbr}.png"] + if name: + candidates += [flags_dir / f"{name}.png", logos_dir / f"{name}.png"] + + img = None + for path in candidates: + if path.exists(): + try: + with Image.open(path) as raw: + crest = raw.convert("RGBA").resize((size, size), Image.NEAREST) + crest.load() + img = crest + break + except Exception as e: + logger.debug("Crest load failed %s: %s", path, e) + + self._img_cache[cache_key] = img + return img + + def _draw_team_crest(self, img: Image.Image, draw: ImageDraw.ImageDraw, + team: Dict[str, Any], x: int, y: int, size: int) -> None: + crest = self._load_crest(team, size) + if crest is not None: + img.paste(crest, (x, y), crest) + return + # Text placeholder box. + draw.rectangle([x, y, x + size - 1, y + size - 1], outline=GREY) + abbr = (team.get("abbr") or team.get("short_name") or "?")[:3] + w, h = self._text_size(draw, abbr, self._fonts["team"]) + draw.text((x + (size - w) // 2, y + (size - h) // 2), abbr, + font=self._fonts["team"], fill=WHITE) + + # ---- innings helpers -------------------------------------------------- # + + @staticmethod + def _batting_innings(team: Dict[str, Any]) -> Optional[Dict[str, Any]]: + innings = team.get("innings") or [] + if not innings: + return None + for inn in innings: + if inn.get("is_batting"): + return inn + return innings[-1] + + @staticmethod + def _score_text(team: Dict[str, Any]) -> str: + inn = CricketRenderer._batting_innings(team) + if not inn: + return "-" + return f"{inn['runs']}/{inn['wickets']}" + + # ---- public render methods ------------------------------------------- # + + def render_live_limited_overs(self, match: Dict[str, Any]) -> Image.Image: + """Live T20/ODI card: crests, runs/wickets (overs/max ov), run rates.""" + img, draw = self._blank() + teams = match.get("teams", []) + if len(teams) < 2: + return self._render_message(match.get("name", "Cricket"), "No data") + + home, away = teams[0], teams[1] + crest = min(self.height - 12, 16) + self._draw_team_crest(img, draw, away, 1, 1, crest) + self._draw_team_crest(img, draw, home, self.width - crest - 1, 1, crest) + + # Format badge / series top-center. + self._draw_centered(draw, match.get("format", "T20"), + self.width // 2, 0, self._fonts["status"], + self.status_color) + + # Abbreviations under crests. + away_abbr = (away.get("abbr") or away.get("short_name") or "")[:4] + home_abbr = (home.get("abbr") or home.get("short_name") or "")[:4] + self._draw_centered(draw, away_abbr, 1 + crest // 2, crest + 1, + self._fonts["status"], WHITE) + self._draw_centered(draw, home_abbr, self.width - crest // 2 - 1, crest + 1, + self._fonts["status"], WHITE) + + # Scores center. + away_inn = self._batting_innings(away) + home_inn = self._batting_innings(home) + away_batting = bool(away_inn and away_inn.get("is_batting")) + home_batting = bool(home_inn and home_inn.get("is_batting")) + + cx = self.width // 2 + away_score = self._score_text(away) + home_score = self._score_text(home) + self._draw_centered(draw, away_score, cx, 6, self._fonts["score"], + self.batting_color if away_batting else self.score_color) + self._draw_centered(draw, home_score, cx, 6 + 11, self._fonts["score"], + self.batting_color if home_batting else self.score_color) + + # Detail line: overs + run rate for the batting side; RRR/target on chase. + detail = self._live_detail(match, away, home, away_inn, home_inn, + away_batting, home_batting) + if detail: + self._draw_centered(draw, detail, cx, self.height - 7, + self._fonts["detail"], self.detail_color) + return img + + def _live_detail(self, match, away, home, away_inn, home_inn, + away_batting, home_batting) -> str: + bat_team = away if away_batting else (home if home_batting else None) + bat_inn = away_inn if away_batting else (home_inn if home_batting else None) + if not bat_inn: + return match.get("status_short", "") or "" + + max_overs = CricketDataFetcher.parse_max_overs( + bat_team.get("score_str", ""), match.get("format", "")) + overs_disp = self._format_overs(bat_inn.get("overs_raw", 0.0)) + if max_overs: + overs_txt = f"{overs_disp}/{max_overs} ov" + else: + overs_txt = f"{overs_disp} ov" + + crr = current_run_rate(bat_inn.get("runs", 0), bat_inn.get("overs_raw", 0.0)) + parts = [overs_txt] + if crr is not None: + parts.append(f"RR {crr:.1f}") + + target = match.get("target") + if target and max_overs: + runs_needed = target - bat_inn.get("runs", 0) + balls_bowled = bat_inn.get("balls", 0) + balls_remaining = max_overs * 6 - balls_bowled + rrr = required_run_rate(runs_needed, balls_remaining) + if runs_needed > 0 and rrr is not None: + parts.append(f"need {runs_needed} RRR {rrr:.1f}") + return " ".join(parts) + + def render_live_test(self, match: Dict[str, Any]) -> Image.Image: + """Live Test card: no clock -- day + session, both innings scores.""" + img, draw = self._blank() + teams = match.get("teams", []) + if len(teams) < 2: + return self._render_message(match.get("name", "Cricket"), "No data") + home, away = teams[0], teams[1] + + crest = min(self.height - 12, 16) + self._draw_team_crest(img, draw, away, 1, 1, crest) + self._draw_team_crest(img, draw, home, self.width - crest - 1, 1, crest) + + # Session/day from status text (e.g. "Stumps", "Lunch", "Day 3"). + session = self._test_session(match) + self._draw_centered(draw, session or "Test", self.width // 2, 0, + self._fonts["status"], self.status_color) + + cx = self.width // 2 + away_score = self._test_score_text(away) + home_score = self._test_score_text(home) + self._draw_centered(draw, (away.get("abbr") or "")[:4] + " " + away_score, + cx, 8, self._fonts["detail"], self.score_color) + self._draw_centered(draw, (home.get("abbr") or "")[:4] + " " + home_score, + cx, 8 + 8, self._fonts["detail"], self.score_color) + + lead = match.get("status_short") or match.get("status_summary") or "" + if lead: + self._draw_centered(draw, lead[:26], cx, self.height - 7, + self._fonts["detail"], self.detail_color) + return img + + @staticmethod + def _test_score_text(team: Dict[str, Any]) -> str: + innings = team.get("innings") or [] + if not innings: + return "-" + pieces = [] + for inn in innings: + wk = inn.get("wickets", 0) + runs = inn.get("runs", 0) + if wk >= 10 or inn.get("description", "").lower() in ("declared", "all out"): + pieces.append(f"{runs}") + else: + pieces.append(f"{runs}/{wk}") + return " & ".join(pieces) + + def _test_session(self, match: Dict[str, Any]) -> str: + for key in ("status_short", "status_detail", "status_summary"): + txt = match.get(key) or "" + for token in ("Stumps", "Lunch", "Tea", "Close", "Drinks", + "Innings Break", "Day"): + if token.lower() in txt.lower(): + return txt[:22] + period = match.get("period", 0) + if period: + return f"Day {period}" + return "Test" + + def render_recent(self, match: Dict[str, Any]) -> Image.Image: + """Completed match: final scores + result summary.""" + img, draw = self._blank() + teams = match.get("teams", []) + if len(teams) < 2: + return self._render_message(match.get("name", "Cricket"), "Final") + home, away = teams[0], teams[1] + + crest = min(self.height - 14, 14) + self._draw_team_crest(img, draw, away, 1, 1, crest) + self._draw_team_crest(img, draw, home, self.width - crest - 1, 1, crest) + + self._draw_centered(draw, "FINAL", self.width // 2, 0, + self._fonts["status"], self.status_color) + + cx = self.width // 2 + away_line = f"{(away.get('abbr') or '')[:4]} {self._final_score(away)}" + home_line = f"{(home.get('abbr') or '')[:4]} {self._final_score(home)}" + away_col = GREEN if away.get("winner") else self.score_color + home_col = GREEN if home.get("winner") else self.score_color + self._draw_centered(draw, away_line, cx, 7, self._fonts["detail"], away_col) + self._draw_centered(draw, home_line, cx, 7 + 8, self._fonts["detail"], home_col) + + summary = match.get("status_summary", "") + if summary: + self._draw_centered(draw, summary[:30], cx, self.height - 7, + self._fonts["status"], self.detail_color) + return img + + @staticmethod + def _final_score(team: Dict[str, Any]) -> str: + innings = team.get("innings") or [] + if not innings: + return team.get("score_str", "").split(" ")[0] or "-" + # Prefer the innings that actually has runs (its last batted innings). + inn = innings[-1] + for i in reversed(innings): + if i.get("runs", 0) or i.get("wickets", 0): + inn = i + break + return f"{inn['runs']}/{inn['wickets']}" + + def render_upcoming(self, match: Dict[str, Any]) -> Image.Image: + """Scheduled match: date/time, teams, venue, format badge.""" + img, draw = self._blank() + teams = match.get("teams", []) + cx = self.width // 2 + + self._draw_centered(draw, match.get("format", "Cricket"), cx, 0, + self._fonts["status"], self.detail_color) + + if len(teams) >= 2: + home, away = teams[0], teams[1] + crest = min(self.height - 14, 14) + self._draw_team_crest(img, draw, away, 1, 8, crest) + self._draw_team_crest(img, draw, home, self.width - crest - 1, 8, crest) + matchup = f"{(away.get('abbr') or away.get('short_name') or '')[:4]} v {(home.get('abbr') or home.get('short_name') or '')[:4]}" + self._draw_centered(draw, matchup, cx, 8, self._fonts["team"], WHITE) + + dt = match.get("start_time_utc") + when = self._format_datetime(dt) if dt else "" + if when: + self._draw_centered(draw, when, cx, self.height - 14, + self._fonts["status"], self.score_color) + + if self.config.get("show_venue", True): + venue = match.get("venue", "") + if venue: + self._draw_centered(draw, venue[:30], cx, self.height - 7, + self._fonts["status"], self.status_color) + return img + + # ---- misc ------------------------------------------------------------- # + + def _render_message(self, title: str, msg: str) -> Image.Image: + img, draw = self._blank() + cx = self.width // 2 + self._draw_centered(draw, title[:20], cx, self.height // 2 - 8, + self._fonts["team"], WHITE) + self._draw_centered(draw, msg[:24], cx, self.height // 2 + 2, + self._fonts["status"], GREY) + return img + + @staticmethod + def _format_overs(overs_raw: float) -> str: + try: + overs_raw = float(overs_raw) + except (TypeError, ValueError): + return "0" + whole = int(overs_raw) + balls = int(round((overs_raw - whole) * 10)) + if balls <= 0: + return f"{whole}" + return f"{whole}.{balls}" + + @staticmethod + def _format_datetime(dt: datetime) -> str: + try: + return dt.strftime("%b %d %H:%M") + except Exception: + return "" diff --git a/plugins/cricket-scoreboard/logo_downloader.py b/plugins/cricket-scoreboard/logo_downloader.py new file mode 100644 index 00000000..84eab918 --- /dev/null +++ b/plugins/cricket-scoreboard/logo_downloader.py @@ -0,0 +1,177 @@ +""" +Simplified LogoDownloader for plugin use +""" + +import logging +import requests +from typing import List +from pathlib import Path +from PIL import Image, ImageDraw, ImageFont +from requests.adapters import HTTPAdapter +from urllib3.util.retry import Retry + +logger = logging.getLogger(__name__) + +class LogoDownloader: + """Simplified logo downloader for team logos from ESPN API.""" + + def __init__(self, request_timeout: int = 30, retry_attempts: int = 3): + """Initialize the logo downloader with HTTP session and retry logic.""" + self.request_timeout = request_timeout + self.retry_attempts = retry_attempts + + # Set up session with retry logic + self.session = requests.Session() + retry_strategy = Retry( + total=retry_attempts, + backoff_factor=1, + status_forcelist=[429, 500, 502, 503, 504], + allowed_methods=["GET", "HEAD", "OPTIONS"] + ) + adapter = HTTPAdapter(max_retries=retry_strategy) + self.session.mount("https://", adapter) + self.session.mount("http://", adapter) + + # Set up headers + self.headers = { + 'User-Agent': 'LEDMatrix/2.0 (https://github.com/ChuckBuilds/LEDMatrix)', + 'Accept': 'application/json', + 'Accept-Language': 'en-US,en;q=0.9', + 'Accept-Encoding': 'gzip, deflate, br', + 'Connection': 'keep-alive' + } + + @staticmethod + def normalize_abbreviation(abbr: str) -> str: + """Normalize team abbreviation for filename.""" + return abbr.upper() + + @staticmethod + def get_logo_filename_variations(abbr: str) -> List[str]: + """Get possible filename variations for a team abbreviation.""" + normalized = LogoDownloader.normalize_abbreviation(abbr) + variations = [f"{normalized}.png"] + + # Add common variations + if normalized == "TA&M": + variations.append("TAANDM.png") + elif normalized == "TAMU": + variations.append("TA&M.png") + + return variations + +_downloader = LogoDownloader() + +def download_missing_logo(sport_key: str, team_id: str, team_abbr: str, logo_path: Path, logo_url: str = None) -> bool: + """ + Download missing logo for a team. + + Args: + sport_key: Sport key (e.g., 'nfl', 'ncaa_fb') + team_id: Team ID + team_abbr: Team abbreviation + logo_path: Path where logo should be saved + logo_url: Optional logo URL + + Returns: + True if logo was downloaded successfully, False otherwise + """ + try: + # Ensure directory exists and is writable + logo_dir = logo_path.parent + try: + logo_dir.mkdir(parents=True, exist_ok=True) + + # Check if we can write to the directory + test_file = logo_dir / '.write_test' + try: + test_file.touch() + test_file.unlink() + except PermissionError: + logger.error(f"Permission denied: Cannot write to directory {logo_dir}") + logger.error("Please run: sudo ./scripts/fix_perms/fix_assets_permissions.sh") + return False + except PermissionError as e: + logger.error(f"Permission denied: Cannot create directory {logo_dir}: {e}") + logger.error("Please run: sudo ./scripts/fix_perms/fix_assets_permissions.sh") + return False + except Exception as e: + logger.error(f"Failed to create logo directory {logo_dir}: {e}") + return False + + # If we have a logo URL, try to download it + if logo_url: + try: + response = _downloader.session.get(logo_url, headers=_downloader.headers, timeout=_downloader.request_timeout) + if response.status_code == 200: + # Verify it's an image + content_type = response.headers.get('content-type', '').lower() + if any(img_type in content_type for img_type in ['image/png', 'image/jpeg', 'image/jpg', 'image/gif']): + with open(logo_path, 'wb') as f: + f.write(response.content) + logger.info(f"Downloaded logo for {team_abbr} from {logo_url}") + return True + except PermissionError as e: + logger.error(f"Permission denied downloading logo for {team_abbr}: {e}") + logger.error("Please run: sudo ./scripts/fix_perms/fix_assets_permissions.sh") + return False + except Exception as e: + logger.error(f"Failed to download logo for {team_abbr}: {e}") + + # If no URL or download failed, create a placeholder + return create_placeholder_logo(team_abbr, logo_path) + + except PermissionError as e: + logger.error(f"Permission denied for {team_abbr}: {e}") + logger.error("Please run: sudo ./scripts/fix_perms/fix_assets_permissions.sh") + return False + except Exception as e: + logger.error(f"Failed to download logo for {team_abbr}: {e}") + # Try to create placeholder as fallback + try: + return create_placeholder_logo(team_abbr, logo_path) + except Exception: + return False + +def create_placeholder_logo(team_abbr: str, logo_path: Path) -> bool: + """Create a simple placeholder logo.""" + try: + # Ensure directory exists + logo_path.parent.mkdir(parents=True, exist_ok=True) + + # Create a simple text-based logo + img = Image.new('RGBA', (64, 64), (0, 0, 0, 0)) + draw = ImageDraw.Draw(img) + + # Try to load a font + try: + font = ImageFont.truetype("assets/fonts/PressStart2P-Regular.ttf", 12) + except (IOError, OSError): + font = ImageFont.load_default() + + # Draw team abbreviation + text = team_abbr[:3] # Limit to 3 characters + bbox = draw.textbbox((0, 0), text, font=font) + text_width = bbox[2] - bbox[0] + text_height = bbox[3] - bbox[1] + + x = (64 - text_width) // 2 + y = (64 - text_height) // 2 + + # Draw white text with black outline + for dx, dy in [(-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1)]: + draw.text((x + dx, y + dy), text, font=font, fill=(0, 0, 0)) + draw.text((x, y), text, font=font, fill=(255, 255, 255)) + + # Save the placeholder + img.save(logo_path) + logger.info(f"Created placeholder logo for {team_abbr}") + return True + + except PermissionError as e: + logger.error(f"Permission denied creating placeholder logo for {team_abbr}: {e}") + logger.error("Please run: sudo ./scripts/fix_perms/fix_assets_permissions.sh") + return False + except Exception as e: + logger.error(f"Failed to create placeholder logo for {team_abbr}: {e}") + return False diff --git a/plugins/cricket-scoreboard/manager.py b/plugins/cricket-scoreboard/manager.py new file mode 100644 index 00000000..38e32524 --- /dev/null +++ b/plugins/cricket-scoreboard/manager.py @@ -0,0 +1,470 @@ +""" +Cricket Scoreboard plugin. + +CricketScoreboardPlugin orchestrates series discovery, data fetching, match +categorization (live / recent / upcoming), logo/flag resolution and per-mode +rotation. It mirrors the lifecycle and config surface of the other sports +scoreboard plugins (see soccer-scoreboard/manager.py) while using a cricket- +specific data model and renderer. + +Display modes: cricket_live, cricket_recent, cricket_upcoming. +""" + +import json +import logging +import os +import threading +import time +from pathlib import Path +from typing import Any, Dict, List, Optional + +from PIL import Image + +# Guarded BasePlugin import so this module also compiles / runs standalone +# (e.g. under the test harness) without the core LEDMatrix package present. +try: + from src.plugin_system.base_plugin import BasePlugin, VegasDisplayMode +except ImportError: + BasePlugin = None + VegasDisplayMode = None + +try: + from src.background_data_service import get_background_service +except ImportError: + get_background_service = None + +from cricket_data_fetcher import CricketDataFetcher +from cricket_renderer import CricketRenderer + +try: + from logo_downloader import download_missing_logo +except ImportError: # pragma: no cover + download_missing_logo = None + +logger = logging.getLogger(__name__) + +_PLUGIN_DIR = Path(__file__).resolve().parent + +MODE_LIVE = "cricket_live" +MODE_RECENT = "cricket_recent" +MODE_UPCOMING = "cricket_upcoming" + +# ESPN competition keys that represent bundled national-team flags rather than +# auto-downloaded franchise logos. +_INTERNATIONAL_KEY = "international" + + +class CricketScoreboardPlugin(BasePlugin if BasePlugin else object): + """Cricket scoreboard plugin (international + major domestic T20 leagues).""" + + def __init__(self, plugin_id, config, display_manager, cache_manager, + plugin_manager): + if BasePlugin: + super().__init__(plugin_id, config, display_manager, cache_manager, + plugin_manager) + + self.plugin_id = plugin_id + self.config = config or {} + self.display_manager = display_manager + self.cache_manager = cache_manager + self.plugin_manager = plugin_manager + self.logger = logger + + self.is_enabled = self.config.get("enabled", False) + + if hasattr(display_manager, "matrix") and display_manager.matrix is not None: + self.display_width = display_manager.matrix.width + self.display_height = display_manager.matrix.height + else: + self.display_width = getattr(display_manager, "width", 128) + self.display_height = getattr(display_manager, "height", 32) + + # Load the curated competition seed list. + self.competitions = self._load_competitions() + + # Durations / intervals. + self.display_duration = float(self.config.get("display_duration", 15)) + self.live_game_duration = float(self.config.get("live_game_duration", 20)) + self.non_favorite_live_game_duration = float( + self.config.get("non_favorite_live_game_duration", 0)) + self.recent_game_duration = float(self.config.get("recent_game_duration", 15)) + self.upcoming_game_duration = float(self.config.get("upcoming_game_duration", 15)) + self.update_interval = int(self.config.get("update_interval_seconds", 3600)) + self.live_update_interval = int(self.config.get("live_update_interval", 30)) + self.recent_games_to_show = int(self.config.get("recent_games_to_show", 5)) + self.upcoming_games_to_show = int(self.config.get("upcoming_games_to_show", 5)) + self.live_priority = bool(self.config.get("live_priority", True)) + + self.favorite_teams = [t.lower() for t in self.config.get("favorite_teams", [])] + self.exclude_teams = [t.lower() for t in self.config.get("exclude_teams", [])] + self.show_favorite_teams_only = bool( + self.config.get("show_favorite_teams_only", False)) + + display_modes = self.config.get("display_modes", {}) or {} + self.mode_enabled = { + MODE_LIVE: display_modes.get("live", True), + MODE_RECENT: display_modes.get("recent", True), + MODE_UPCOMING: display_modes.get("upcoming", True), + } + + bg_cfg = self.config.get("background_service", {}) or {} + req_timeout = int(bg_cfg.get("request_timeout", 30)) + + self.fetcher = CricketDataFetcher(cache_manager, self.config, + self.competitions, request_timeout=req_timeout) + self.renderer = CricketRenderer(self.display_width, self.display_height, + self.config) + + # Optional background service (best-effort, same pattern as soccer). + self.background_service = None + if get_background_service: + try: + self.background_service = get_background_service(cache_manager, max_workers=1) + except Exception as e: + self.logger.warning("Cricket background service init failed: %s", e) + + # Categorized match state. + self._lock = threading.Lock() + self.live_matches: List[Dict[str, Any]] = [] + self.recent_matches: List[Dict[str, Any]] = [] + self.upcoming_matches: List[Dict[str, Any]] = [] + + self._last_update = 0.0 + + # Per-mode rotation state. + self._mode_index: Dict[str, int] = {MODE_LIVE: 0, MODE_RECENT: 0, MODE_UPCOMING: 0} + self._mode_item_start: Dict[str, float] = {} + + self.logos_dir = _PLUGIN_DIR / "assets" / "logos" + self.logos_dir.mkdir(parents=True, exist_ok=True) + + self.logger.info("Cricket scoreboard initialized (%dx%d), %d competitions seeded", + self.display_width, self.display_height, len(self.competitions)) + + # ------------------------------------------------------------------ # + # Setup helpers + # ------------------------------------------------------------------ # + + def _load_competitions(self) -> List[Dict[str, Any]]: + path = _PLUGIN_DIR / "competitions.json" + try: + with open(path, "r", encoding="utf-8") as f: + return json.load(f) + except Exception as e: + self.logger.error("Failed to load competitions.json: %s", e) + return [{"key": "international", "name": "International", "search_terms": None}] + + # ------------------------------------------------------------------ # + # Filtering + # ------------------------------------------------------------------ # + + def _match_has_team(self, match: Dict[str, Any], names: List[str]) -> bool: + for team in match.get("teams", []): + hay = f"{team.get('name', '')} {team.get('abbr', '')} {team.get('short_name', '')}".lower() + if any(n and n in hay for n in names): + return True + return False + + def _keep_match(self, match: Dict[str, Any]) -> bool: + if self.exclude_teams and self._match_has_team(match, self.exclude_teams): + return False + # show_favorite_teams_only only constrains international matches; domestic + # competitions are already the user's chosen favorites. + if (self.show_favorite_teams_only and self.favorite_teams + and match.get("competition_key") == _INTERNATIONAL_KEY): + if not self._match_has_team(match, self.favorite_teams): + return False + return True + + def _match_is_favorite(self, match: Dict[str, Any]) -> bool: + return bool(self.favorite_teams) and self._match_has_team(match, self.favorite_teams) + + # ------------------------------------------------------------------ # + # Update + # ------------------------------------------------------------------ # + + def update(self) -> None: + if not self.is_enabled: + return + now = time.time() + # Faster refresh when live content is present. + has_live = bool(self.live_matches) + interval = self.live_update_interval if has_live else self.update_interval + if now - self._last_update < interval: + return + self._last_update = now + + try: + ttl = self.live_update_interval if has_live else self.update_interval + matches = self.fetcher.fetch_matches(ttl=ttl) + except Exception as e: + self.logger.warning("Cricket fetch_matches failed: %s", e) + return + + live, recent, upcoming = [], [], [] + for m in matches: + if not self._keep_match(m): + continue + state = m.get("state") + if state == "in": + live.append(m) + elif state == "post": + recent.append(m) + else: + upcoming.append(m) + + # Sort: favorites first for live; most-recent-first for recent; soonest + # first for upcoming. + live.sort(key=lambda m: (not self._match_is_favorite(m), + m.get("start_time_utc") or _min_dt())) + recent.sort(key=lambda m: m.get("start_time_utc") or _min_dt(), reverse=True) + upcoming.sort(key=lambda m: m.get("start_time_utc") or _max_dt()) + + recent = recent[: self.recent_games_to_show] + upcoming = upcoming[: self.upcoming_games_to_show] + + # Auto-download franchise logos (national teams use bundled flags). + for m in live + recent + upcoming: + if m.get("competition_key") != _INTERNATIONAL_KEY: + self._ensure_logos(m) + + with self._lock: + self.live_matches = live + self.recent_matches = recent + self.upcoming_matches = upcoming + + self.logger.info("Cricket update: %d live, %d recent, %d upcoming", + len(live), len(recent), len(upcoming)) + + def _ensure_logos(self, match: Dict[str, Any]) -> None: + if download_missing_logo is None: + return + for team in match.get("teams", []): + abbr = (team.get("abbr") or "").upper() + url = team.get("logo_url") + if not abbr or not url: + continue + path = self.logos_dir / f"{abbr}.png" + if path.exists(): + continue + try: + download_missing_logo("cricket", team.get("id", ""), abbr, path, url) + except Exception as e: + self.logger.debug("Logo download failed for %s: %s", abbr, e) + + # ------------------------------------------------------------------ # + # Display + # ------------------------------------------------------------------ # + + def _matches_for_mode(self, mode: str) -> List[Dict[str, Any]]: + with self._lock: + if mode == MODE_LIVE: + return list(self.live_matches) + if mode == MODE_RECENT: + return list(self.recent_matches) + if mode == MODE_UPCOMING: + return list(self.upcoming_matches) + return [] + + def _per_item_duration(self, mode: str, match: Optional[Dict[str, Any]]) -> float: + if mode == MODE_LIVE: + if (self.non_favorite_live_game_duration > 0 and match is not None + and not self._match_is_favorite(match)): + return self.non_favorite_live_game_duration + return self.live_game_duration + if mode == MODE_RECENT: + return self.recent_game_duration + if mode == MODE_UPCOMING: + return self.upcoming_game_duration + return self.display_duration + + def _current_match(self, mode: str) -> Optional[Dict[str, Any]]: + matches = self._matches_for_mode(mode) + if not matches: + return None + idx = self._mode_index.get(mode, 0) % len(matches) + match = matches[idx] + + now = time.time() + start = self._mode_item_start.get(mode) + if start is None: + self._mode_item_start[mode] = now + elif now - start >= self._per_item_duration(mode, match): + idx = (idx + 1) % len(matches) + self._mode_index[mode] = idx + self._mode_item_start[mode] = now + match = matches[idx] + return match + + def _render_match(self, mode: str, match: Dict[str, Any]) -> Image.Image: + if mode == MODE_LIVE: + if match.get("is_test"): + return self.renderer.render_live_test(match) + return self.renderer.render_live_limited_overs(match) + if mode == MODE_RECENT: + return self.renderer.render_recent(match) + return self.renderer.render_upcoming(match) + + def display(self, display_mode: str = None, force_clear: bool = False) -> bool: + if not self.is_enabled: + return False + + mode = display_mode or self._pick_default_mode() + if mode not in (MODE_LIVE, MODE_RECENT, MODE_UPCOMING): + return False + if not self.mode_enabled.get(mode, True): + return False + + match = self._current_match(mode) + if match is None: + return False + + try: + image = self._render_match(mode, match) + except Exception as e: + self.logger.warning("Cricket render failed (%s): %s", mode, e) + return False + + try: + if force_clear and hasattr(self.display_manager, "clear"): + self.display_manager.clear() + self.display_manager.image.paste(image, (0, 0)) + self.display_manager.update_display() + except Exception as e: + self.logger.warning("Cricket display push failed: %s", e) + return False + return True + + def _pick_default_mode(self) -> str: + if self.mode_enabled.get(MODE_LIVE, True) and self.live_matches: + return MODE_LIVE + if self.mode_enabled.get(MODE_RECENT, True) and self.recent_matches: + return MODE_RECENT + if self.mode_enabled.get(MODE_UPCOMING, True) and self.upcoming_matches: + return MODE_UPCOMING + return MODE_LIVE + + # ------------------------------------------------------------------ # + # Duration / cycling contract + # ------------------------------------------------------------------ # + + def get_display_duration(self, display_mode: str = None) -> float: + return self.get_cycle_duration(display_mode) or self.display_duration + + def get_cycle_duration(self, display_mode: str = None) -> Optional[float]: + mode = display_mode or self._pick_default_mode() + matches = self._matches_for_mode(mode) + if not matches: + return self.display_duration + + # Explicit mode-level override wins. + mode_durations = self.config.get("mode_durations", {}) or {} + override = mode_durations.get(f"{mode.replace('cricket_', '')}_mode_duration") + if override: + return float(override) + + per = sum(self._per_item_duration(mode, m) for m in matches) + dyn = self.config.get("dynamic_duration", {}) or {} + if dyn.get("enabled", False): + lo = float(dyn.get("min_duration_seconds", 30)) + hi = float(dyn.get("max_duration_seconds", 300)) + return max(lo, min(per, hi)) + return per + + def supports_dynamic_duration(self) -> bool: + return bool((self.config.get("dynamic_duration", {}) or {}).get("enabled", False)) + + # ------------------------------------------------------------------ # + # Live priority contract + # ------------------------------------------------------------------ # + + def has_live_priority(self) -> bool: + return self.is_enabled and self.live_priority + + def has_live_content(self) -> bool: + if not self.is_enabled or not self.mode_enabled.get(MODE_LIVE, True): + return False + with self._lock: + return len(self.live_matches) > 0 + + def get_live_modes(self) -> List[str]: + return [MODE_LIVE] if self.has_live_content() else [] + + # ------------------------------------------------------------------ # + # Vegas hooks + # ------------------------------------------------------------------ # + + def get_vegas_content_type(self) -> str: + return "multi" + + def get_vegas_content(self) -> Optional[List[Image.Image]]: + cards: List[Image.Image] = [] + for mode in (MODE_LIVE, MODE_RECENT, MODE_UPCOMING): + if not self.mode_enabled.get(mode, True): + continue + for match in self._matches_for_mode(mode): + try: + cards.append(self._render_match(mode, match)) + except Exception as e: + self.logger.debug("Vegas card render failed: %s", e) + return cards or None + + def get_vegas_display_mode(self): + if VegasDisplayMode is not None: + return VegasDisplayMode.SCROLL + return None + + # ------------------------------------------------------------------ # + # Config lifecycle + # ------------------------------------------------------------------ # + + def validate_config(self, config: Dict[str, Any] = None) -> bool: + cfg = config if config is not None else self.config + if not isinstance(cfg, dict): + return False + comps = cfg.get("favorite_competitions", []) + if comps and not isinstance(comps, list): + return False + teams = cfg.get("favorite_teams", []) + if teams and not isinstance(teams, list): + return False + return True + + def on_config_change(self, new_config: Dict[str, Any]) -> None: + if BasePlugin: + try: + super().on_config_change(new_config) + except Exception: + pass + # Re-run __init__ derived state without recreating the object. + self.__init__(self.plugin_id, new_config, self.display_manager, + self.cache_manager, self.plugin_manager) + # Force a re-discovery + refetch on next update. + self._last_update = 0.0 + + def get_info(self) -> Dict[str, Any]: + info = {} + if BasePlugin: + try: + info = super().get_info() + except Exception: + info = {} + info.update({ + "name": "Cricket Scoreboard", + "enabled": self.is_enabled, + "live": len(self.live_matches), + "recent": len(self.recent_matches), + "upcoming": len(self.upcoming_matches), + "competitions": [c.get("key") for c in self.competitions], + }) + return info + + +def _min_dt(): + from datetime import datetime, timezone + return datetime.min.replace(tzinfo=timezone.utc) + + +def _max_dt(): + from datetime import datetime, timezone + return datetime.max.replace(tzinfo=timezone.utc) diff --git a/plugins/cricket-scoreboard/manifest.json b/plugins/cricket-scoreboard/manifest.json new file mode 100644 index 00000000..86c70be5 --- /dev/null +++ b/plugins/cricket-scoreboard/manifest.json @@ -0,0 +1,43 @@ +{ + "id": "cricket-scoreboard", + "name": "Cricket Scoreboard", + "version": "1.0.0", + "author": "ChuckBuilds", + "description": "Live, recent, and upcoming cricket matches across international tours (Test/ODI/T20I) and major domestic T20 leagues including the IPL, Big Bash League, The Hundred, PSL, CPL, SA20 and more. Shows runs/wickets/overs, run rates, targets, and match results.", + "category": "sports", + "tags": [ + "cricket", + "ipl", + "big-bash", + "t20", + "test-cricket", + "odi", + "sports", + "scoreboard", + "live-scores" + ], + "display_modes": [ + "cricket_live", + "cricket_recent", + "cricket_upcoming" + ], + "versions": [ + { + "released": "2026-07-10", + "version": "1.0.0", + "notes": "Initial release. Series-ID discovery via the ESPN cricket header endpoint, favorite national teams + favorite domestic competitions dual filter, live limited-overs / live Test / recent / upcoming render views, base-6 overs-to-decimal run-rate math, franchise logo auto-download and bundled national-team flags.", + "ledmatrix_min": "2.0.0" + } + ], + "last_updated": "2026-07-10", + "stars": 0, + "downloads": 0, + "verified": true, + "screenshot": "", + "entry_point": "manager.py", + "class_name": "CricketScoreboardPlugin", + "config_schema": "config_schema.json", + "compatible_versions": [ + ">=2.0.0" + ] +} diff --git a/plugins/cricket-scoreboard/requirements.txt b/plugins/cricket-scoreboard/requirements.txt new file mode 100644 index 00000000..084d3377 --- /dev/null +++ b/plugins/cricket-scoreboard/requirements.txt @@ -0,0 +1,12 @@ +# Cricket Scoreboard Plugin Requirements + +# Core dependencies (handled by main LEDMatrix) +# requests - for ESPN cricket API calls +# pytz - for timezone handling +# Pillow - for image manipulation + +# These are already included in the main LEDMatrix requirements +# but listed here for reference: +# requests>=2.25.0 +# pytz>=2021.1 +# Pillow>=8.0.0 diff --git a/plugins/cricket-scoreboard/test/harness.json b/plugins/cricket-scoreboard/test/harness.json new file mode 100644 index 00000000..b6f44f63 --- /dev/null +++ b/plugins/cricket-scoreboard/test/harness.json @@ -0,0 +1,108 @@ +{ + "_comment": "Deterministic harness config + mocked ESPN cricket responses for golden-image rendering. mock_matches is consumed directly by test_cricket_plugin.py (the plugin's live fetcher is bypassed) and covers every format branch: a live T20 chase, a live Test with a session, a completed match, and an upcoming fixture.", + "config": { + "enabled": true, + "favorite_teams": ["India", "Australia", "England"], + "favorite_competitions": ["international", "ipl", "bbl"], + "display_duration": 15, + "live_game_duration": 20, + "recent_game_duration": 15, + "upcoming_game_duration": 15, + "recent_games_to_show": 5, + "upcoming_games_to_show": 5, + "live_priority": true, + "show_venue": true, + "display_modes": {"live": true, "recent": true, "upcoming": true} + }, + "freeze_time": "2026-05-31 15:30:00", + "mock_matches": [ + { + "id": "live-t20", + "series_id": "8048", + "series_name": "Indian Premier League", + "competition_key": "ipl", + "name": "Royal Challengers Bengaluru v Gujarat Titans", + "short_name": "RCB v GT", + "format": "T20", + "is_test": false, + "state": "in", + "status_summary": "RCB need 34 runs from 42 balls", + "status_detail": "In Progress", + "status_short": "RCB 122/4", + "period": 2, + "date": "2026-05-31T14:00Z", + "venue": "Narendra Modi Stadium, Ahmedabad", + "target": 156, + "teams": [ + {"order": 0, "home_away": "home", "id": "335970", "name": "Royal Challengers Bengaluru", "short_name": "RCB", "abbr": "RCB", "logo_url": null, "winner": false, "score_str": "122/4 (13/20 ov, target 156)", "innings": [{"period": 2, "runs": 122, "wickets": 4, "overs_raw": 13.0, "overs_decimal": 13.0, "balls": 78, "is_batting": true, "description": "batting"}], "records": ""}, + {"order": 1, "home_away": "away", "id": "1298769", "name": "Gujarat Titans", "short_name": "GT", "abbr": "GT", "logo_url": null, "winner": false, "score_str": "155/8 (20 ov)", "innings": [{"period": 1, "runs": 155, "wickets": 8, "overs_raw": 20.0, "overs_decimal": 20.0, "balls": 120, "is_batting": false, "description": "complete"}], "records": ""} + ] + }, + { + "id": "live-test", + "series_id": "9999", + "series_name": "Border-Gavaskar Trophy", + "competition_key": "international", + "name": "Australia v India", + "short_name": "AUS v IND", + "format": "Test", + "is_test": true, + "state": "in", + "status_summary": "India lead by 84 runs", + "status_detail": "Stumps - Day 3", + "status_short": "Stumps Day 3", + "period": 3, + "date": "2026-05-29T00:00Z", + "venue": "Melbourne Cricket Ground", + "target": null, + "teams": [ + {"order": 0, "home_away": "home", "id": "aus", "name": "Australia", "short_name": "AUS", "abbr": "AUS", "logo_url": null, "winner": false, "score_str": "295 & 180/4", "innings": [{"period": 1, "runs": 295, "wickets": 10, "overs_raw": 88.2, "overs_decimal": 88.333, "balls": 530, "is_batting": false, "description": "all out"}, {"period": 3, "runs": 180, "wickets": 4, "overs_raw": 52.0, "overs_decimal": 52.0, "balls": 312, "is_batting": true, "description": "batting"}], "records": ""}, + {"order": 1, "home_away": "away", "id": "ind", "name": "India", "short_name": "IND", "abbr": "IND", "logo_url": null, "winner": false, "score_str": "391", "innings": [{"period": 2, "runs": 391, "wickets": 10, "overs_raw": 120.4, "overs_decimal": 120.667, "balls": 724, "is_batting": false, "description": "all out"}], "records": ""} + ] + }, + { + "id": "recent-t20", + "series_id": "8048", + "series_name": "Indian Premier League", + "competition_key": "ipl", + "name": "Royal Challengers Bengaluru v Gujarat Titans", + "short_name": "RCB v GT", + "format": "T20", + "is_test": false, + "state": "post", + "status_summary": "RCB won by 5 wkts (12b rem)", + "status_detail": "Final", + "status_short": "Final", + "period": 2, + "date": "2026-05-28T14:00Z", + "venue": "M Chinnaswamy Stadium, Bengaluru", + "target": 156, + "teams": [ + {"order": 0, "home_away": "home", "id": "335970", "name": "Royal Challengers Bengaluru", "short_name": "RCB", "abbr": "RCB", "logo_url": null, "winner": true, "score_str": "161/5 (18/20 ov, target 156)", "innings": [{"period": 2, "runs": 161, "wickets": 5, "overs_raw": 18.0, "overs_decimal": 18.0, "balls": 108, "is_batting": false, "description": "target reached"}], "records": ""}, + {"order": 1, "home_away": "away", "id": "1298769", "name": "Gujarat Titans", "short_name": "GT", "abbr": "GT", "logo_url": null, "winner": false, "score_str": "155/8 (20 ov)", "innings": [{"period": 1, "runs": 155, "wickets": 8, "overs_raw": 20.0, "overs_decimal": 20.0, "balls": 120, "is_batting": false, "description": "complete"}], "records": ""} + ] + }, + { + "id": "upcoming-t20i", + "series_id": "7777", + "series_name": "India tour of England 2026", + "competition_key": "international", + "name": "England v India", + "short_name": "ENG v IND", + "format": "T20I", + "is_test": false, + "state": "pre", + "status_summary": "", + "status_detail": "Scheduled", + "status_short": "Scheduled", + "period": 0, + "date": "2026-06-05T17:30Z", + "venue": "Lord's, London", + "target": null, + "teams": [ + {"order": 0, "home_away": "home", "id": "eng", "name": "England", "short_name": "ENG", "abbr": "ENG", "logo_url": null, "winner": false, "score_str": "", "innings": [], "records": ""}, + {"order": 1, "home_away": "away", "id": "ind", "name": "India", "short_name": "IND", "abbr": "IND", "logo_url": null, "winner": false, "score_str": "", "innings": [], "records": ""} + ] + } + ] +} diff --git a/plugins/cricket-scoreboard/test_cricket_plugin.py b/plugins/cricket-scoreboard/test_cricket_plugin.py new file mode 100644 index 00000000..a82850a5 --- /dev/null +++ b/plugins/cricket-scoreboard/test_cricket_plugin.py @@ -0,0 +1,225 @@ +""" +Unit tests for the Cricket Scoreboard plugin. + +Focus areas: + * base-6 overs -> decimal overs conversion (the easy-to-get-wrong bit) + * current/required run-rate math + * renderer smoke tests for every format branch (live T20, live Test, + recent, upcoming) using the mocked responses in test/harness.json + * manager update/display smoke test with mock display + cache managers + +Run: python -m unittest test_cricket_plugin (needs Pillow + requests) +""" + +import json +import os +import sys +import unittest +from pathlib import Path + +_HERE = Path(__file__).resolve().parent +sys.path.insert(0, str(_HERE)) + +from cricket_data_fetcher import ( # noqa: E402 + CricketDataFetcher, + overs_to_decimal, + overs_to_balls, + current_run_rate, + required_run_rate, +) + + +def _load_mock_matches(): + with open(_HERE / "test" / "harness.json", "r", encoding="utf-8") as f: + return json.load(f)["mock_matches"] + + +class TestOversMath(unittest.TestCase): + """Base-6 fractional overs conversion and run-rate math.""" + + def test_18_4_overs_is_18_667_decimal(self): + # 18.4 overs = 18 completed overs + 4 balls = 18 + 4/6 decimal overs. + self.assertAlmostEqual(overs_to_decimal(18.4), 18 + 4 / 6, places=4) + self.assertAlmostEqual(overs_to_decimal(18.4), 18.6667, places=4) + + def test_whole_overs_unchanged(self): + self.assertAlmostEqual(overs_to_decimal(20.0), 20.0, places=6) + self.assertEqual(overs_to_decimal(0.0), 0.0) + + def test_each_ball_is_one_sixth(self): + for balls in range(6): + self.assertAlmostEqual(overs_to_decimal(12 + balls / 10.0), + 12 + balls / 6.0, places=4) + + def test_float_noise_tolerant(self): + # 18.399999 should still resolve to 4 balls, not 3. + self.assertAlmostEqual(overs_to_decimal(18.399999), 18 + 4 / 6, places=4) + + def test_malformed_fraction_rolls_over(self): + # A ".6" fraction is illegal (max 5 balls) -> roll into the next over. + self.assertAlmostEqual(overs_to_decimal(4.6), 5.0, places=4) + + def test_overs_to_balls(self): + self.assertEqual(overs_to_balls(18.4), 18 * 6 + 4) + self.assertEqual(overs_to_balls(20.0), 120) + self.assertEqual(overs_to_balls(0.0), 0) + + def test_current_run_rate(self): + # 122 runs off 13.0 overs -> 9.3846 rpo. + crr = current_run_rate(122, 13.0) + self.assertAlmostEqual(crr, 122 / 13.0, places=4) + # 100 runs off 18.4 overs uses decimal overs, NOT 18.4. + crr2 = current_run_rate(100, 18.4) + self.assertAlmostEqual(crr2, 100 / (18 + 4 / 6), places=4) + # No overs bowled -> undefined. + self.assertIsNone(current_run_rate(0, 0.0)) + + def test_required_run_rate(self): + # Chase: need 34 off 42 balls -> 34 / (42/6) = 4.857 rpo. + rrr = required_run_rate(34, 42) + self.assertAlmostEqual(rrr, 34 / (42 / 6.0), places=4) + self.assertAlmostEqual(rrr, 4.8571, places=3) + # No balls left -> undefined. + self.assertIsNone(required_run_rate(10, 0)) + + def test_parse_max_overs_and_target(self): + self.assertEqual( + CricketDataFetcher.parse_max_overs("161/5 (18/20 ov, target 156)", "T20"), + 20, + ) + # Falls back to format default when no "x/y ov" hint. + self.assertEqual(CricketDataFetcher.parse_max_overs("300/6", "ODI"), 50) + target = CricketDataFetcher._parse_target( + [{"score_str": "122/4 (13/20 ov, target 156)"}]) + self.assertEqual(target, 156) + + +class TestFormatNormalization(unittest.TestCase): + def test_formats(self): + n = CricketDataFetcher._normalize_format + self.assertEqual(n("T20"), "T20") + self.assertEqual(n("Twenty20"), "T20") + self.assertEqual(n("T20I"), "T20I") + self.assertEqual(n("ODI"), "ODI") + self.assertEqual(n("Test"), "Test") + self.assertEqual(n("First-class"), "First-class") + self.assertEqual(n(""), "T20") # defensive default + + +class TestRenderer(unittest.TestCase): + """Every format branch must render to a correctly-sized image.""" + + def setUp(self): + from cricket_renderer import CricketRenderer + self.matches = {m["id"]: m for m in _load_mock_matches()} + self.renderer = CricketRenderer(128, 32, {"show_venue": True}) + + def _check(self, image): + from PIL import Image + self.assertIsInstance(image, Image.Image) + self.assertEqual(image.size, (128, 32)) + + def test_live_limited_overs(self): + self._check(self.renderer.render_live_limited_overs(self.matches["live-t20"])) + + def test_live_test(self): + self._check(self.renderer.render_live_test(self.matches["live-test"])) + + def test_recent(self): + self._check(self.renderer.render_recent(self.matches["recent-t20"])) + + def test_upcoming(self): + self._check(self.renderer.render_upcoming(self.matches["upcoming-t20i"])) + + def test_all_sizes(self): + from cricket_renderer import CricketRenderer + for size in [(64, 32), (128, 32), (128, 64), (256, 32)]: + r = CricketRenderer(size[0], size[1], {}) + img = r.render_live_limited_overs(self.matches["live-t20"]) + self.assertEqual(img.size, size) + + +class _MockMatrix: + def __init__(self, w, h): + self.width = w + self.height = h + + +class _MockDisplayManager: + def __init__(self, w=128, h=32): + from PIL import Image + self.matrix = _MockMatrix(w, h) + self.image = Image.new("RGB", (w, h), (0, 0, 0)) + self.updated = False + + def clear(self): + from PIL import Image + self.image = Image.new("RGB", (self.matrix.width, self.matrix.height), (0, 0, 0)) + + def update_display(self): + self.updated = True + + +class _MockCacheManager: + def __init__(self): + self.store = {} + + def get(self, key, max_age=None): + return self.store.get(key) + + def set(self, key, value, ttl=None): + self.store[key] = value + + +class TestManager(unittest.TestCase): + def _make_plugin(self): + from manager import CricketScoreboardPlugin + cfg = _load_harness_config() + dm = _MockDisplayManager() + plugin = CricketScoreboardPlugin("cricket-scoreboard", cfg, dm, + _MockCacheManager(), None) + # Inject mocked matches directly, bypassing the network fetcher. + matches = _load_mock_matches() + plugin.live_matches = [m for m in matches if m["state"] == "in"] + plugin.recent_matches = [m for m in matches if m["state"] == "post"] + plugin.upcoming_matches = [m for m in matches if m["state"] == "pre"] + return plugin, dm + + def test_display_live(self): + plugin, dm = self._make_plugin() + self.assertTrue(plugin.display("cricket_live", force_clear=True)) + self.assertTrue(dm.updated) + + def test_display_recent_and_upcoming(self): + plugin, dm = self._make_plugin() + self.assertTrue(plugin.display("cricket_recent")) + self.assertTrue(plugin.display("cricket_upcoming")) + + def test_live_priority_and_content(self): + plugin, _ = self._make_plugin() + self.assertTrue(plugin.has_live_priority()) + self.assertTrue(plugin.has_live_content()) + self.assertEqual(plugin.get_live_modes(), ["cricket_live"]) + + def test_vegas_hooks(self): + plugin, _ = self._make_plugin() + self.assertEqual(plugin.get_vegas_content_type(), "multi") + cards = plugin.get_vegas_content() + self.assertTrue(cards and len(cards) >= 4) + + def test_get_cycle_duration(self): + plugin, _ = self._make_plugin() + self.assertGreater(plugin.get_cycle_duration("cricket_recent"), 0) + + def test_validate_config(self): + plugin, _ = self._make_plugin() + self.assertTrue(plugin.validate_config()) + + +def _load_harness_config(): + with open(_HERE / "test" / "harness.json", "r", encoding="utf-8") as f: + return json.load(f)["config"] + + +if __name__ == "__main__": + unittest.main(verbosity=2) From 47244b2b55cde3892f07ca6f532c07fcb245139e Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 10 Jul 2026 20:14:14 +0000 Subject: [PATCH 2/3] Fix CodeRabbit findings on cricket-scoreboard plugin (PR #181) - Require non-empty favorite_teams entries in config schema - Reject negative overs in overs_to_balls - Validate ESPN JSON response is a dict before returning from _get_json - Scope the series discovery cache key by favorite_teams/favorite_competitions - Rename logo_downloader.py -> cricket_logo_downloader.py to avoid cross-plugin module collisions (deferred import from manager.py) - Require HTTPS logo URLs and sanitize team abbreviations before building logo file paths to prevent SSRF/path traversal - Preserve the update lock across on_config_change instead of replacing it via self.__init__(), which broke mutual exclusion with in-flight update()/display() calls Bump version to 1.0.1. --- plugins.json | 4 ++-- plugins/cricket-scoreboard/config_schema.json | 1 + .../cricket_data_fetcher.py | 19 +++++++++++++------ ...wnloader.py => cricket_logo_downloader.py} | 3 +++ plugins/cricket-scoreboard/manager.py | 14 +++++++++++--- plugins/cricket-scoreboard/manifest.json | 8 +++++++- 6 files changed, 37 insertions(+), 12 deletions(-) rename plugins/cricket-scoreboard/{logo_downloader.py => cricket_logo_downloader.py} (97%) diff --git a/plugins.json b/plugins.json index aa1ad9bb..5aa8ac90 100644 --- a/plugins.json +++ b/plugins.json @@ -1,6 +1,6 @@ { "version": "1.0.0", - "last_updated": "2026-07-08", + "last_updated": "2026-07-10", "plugins": [ { "id": "cricket-scoreboard", @@ -27,7 +27,7 @@ "last_updated": "2026-07-10", "verified": true, "screenshot": "", - "latest_version": "1.0.0" + "latest_version": "1.0.1" }, { "id": "7-segment-clock", diff --git a/plugins/cricket-scoreboard/config_schema.json b/plugins/cricket-scoreboard/config_schema.json index d64262b3..224166f7 100644 --- a/plugins/cricket-scoreboard/config_schema.json +++ b/plugins/cricket-scoreboard/config_schema.json @@ -13,6 +13,7 @@ "type": "array", "items": { "type": "string", + "minLength": 1, "description": "National team name or abbreviation (e.g. 'India', 'IND', 'Australia', 'England')" }, "uniqueItems": true, diff --git a/plugins/cricket-scoreboard/cricket_data_fetcher.py b/plugins/cricket-scoreboard/cricket_data_fetcher.py index 110d06b0..924c8f7c 100644 --- a/plugins/cricket-scoreboard/cricket_data_fetcher.py +++ b/plugins/cricket-scoreboard/cricket_data_fetcher.py @@ -108,6 +108,8 @@ def overs_to_balls(overs: float) -> int: overs = float(overs) except (TypeError, ValueError): return 0 + if overs < 0: + return 0 whole = int(math.floor(overs)) balls = int(round((overs - whole) * 10)) if balls >= 6: @@ -202,7 +204,11 @@ def _get_json(self, url: str) -> Optional[Dict[str, Any]]: try: resp = self.session.get(url, headers=_HEADERS, timeout=self.request_timeout) if resp.status_code == 200: - return resp.json() + payload = resp.json() + if isinstance(payload, dict): + return payload + logger.warning("Cricket API %s returned non-object JSON", url) + return None logger.warning("Cricket API %s returned HTTP %s", url, resp.status_code) except Exception as e: # pragma: no cover - network failure path logger.warning("Cricket API request failed for %s: %s", url, e) @@ -245,16 +251,17 @@ def discover_series(self, force: bool = False) -> List[Dict[str, Any]]: and now - self._last_discovery < self._discovery_interval): return self._resolved_series - cache_key = "cricket:series_ids" + enabled_keys = list(self.config.get("favorite_competitions", + ["international", "ipl", "bbl"])) + favorite_teams = [t.lower() for t in self.config.get("favorite_teams", [])] + + cache_key = "cricket:series_ids:" + "|".join( + sorted(enabled_keys) + sorted(favorite_teams)) cached = self._cache_get(cache_key, max_age=self._discovery_interval) if cached and not force: self._resolved_series = cached self._last_discovery = now return cached - - enabled_keys = list(self.config.get("favorite_competitions", - ["international", "ipl", "bbl"])) - favorite_teams = [t.lower() for t in self.config.get("favorite_teams", [])] follow_international = "international" in enabled_keys data = self._get_json(HEADER_URL) diff --git a/plugins/cricket-scoreboard/logo_downloader.py b/plugins/cricket-scoreboard/cricket_logo_downloader.py similarity index 97% rename from plugins/cricket-scoreboard/logo_downloader.py rename to plugins/cricket-scoreboard/cricket_logo_downloader.py index 84eab918..f100695a 100644 --- a/plugins/cricket-scoreboard/logo_downloader.py +++ b/plugins/cricket-scoreboard/cricket_logo_downloader.py @@ -100,6 +100,9 @@ def download_missing_logo(sport_key: str, team_id: str, team_abbr: str, logo_pat return False # If we have a logo URL, try to download it + if logo_url and not logo_url.lower().startswith("https://"): + logger.warning(f"Skipping non-HTTPS logo URL for {team_abbr}: {logo_url}") + logo_url = None if logo_url: try: response = _downloader.session.get(logo_url, headers=_downloader.headers, timeout=_downloader.request_timeout) diff --git a/plugins/cricket-scoreboard/manager.py b/plugins/cricket-scoreboard/manager.py index 38e32524..5ceee124 100644 --- a/plugins/cricket-scoreboard/manager.py +++ b/plugins/cricket-scoreboard/manager.py @@ -37,7 +37,7 @@ from cricket_renderer import CricketRenderer try: - from logo_downloader import download_missing_logo + from cricket_logo_downloader import download_missing_logo except ImportError: # pragma: no cover download_missing_logo = None @@ -241,10 +241,13 @@ def _ensure_logos(self, match: Dict[str, Any]) -> None: return for team in match.get("teams", []): abbr = (team.get("abbr") or "").upper() + abbr = "".join(c for c in abbr if c.isalnum() or c in ("&", "_")) url = team.get("logo_url") if not abbr or not url: continue path = self.logos_dir / f"{abbr}.png" + if path.parent != self.logos_dir: + continue if path.exists(): continue try: @@ -435,10 +438,15 @@ def on_config_change(self, new_config: Dict[str, Any]) -> None: try: super().on_config_change(new_config) except Exception: - pass - # Re-run __init__ derived state without recreating the object. + self.logger.debug("BasePlugin on_config_change failed", exc_info=True) + # Re-run __init__ derived state without recreating the object, but + # preserve the lock in place -- another thread may be holding it + # inside update()/display(), and replacing it would break mutual + # exclusion. + lock = self._lock self.__init__(self.plugin_id, new_config, self.display_manager, self.cache_manager, self.plugin_manager) + self._lock = lock # Force a re-discovery + refetch on next update. self._last_update = 0.0 diff --git a/plugins/cricket-scoreboard/manifest.json b/plugins/cricket-scoreboard/manifest.json index 86c70be5..cfb8479a 100644 --- a/plugins/cricket-scoreboard/manifest.json +++ b/plugins/cricket-scoreboard/manifest.json @@ -1,7 +1,7 @@ { "id": "cricket-scoreboard", "name": "Cricket Scoreboard", - "version": "1.0.0", + "version": "1.0.1", "author": "ChuckBuilds", "description": "Live, recent, and upcoming cricket matches across international tours (Test/ODI/T20I) and major domestic T20 leagues including the IPL, Big Bash League, The Hundred, PSL, CPL, SA20 and more. Shows runs/wickets/overs, run rates, targets, and match results.", "category": "sports", @@ -22,6 +22,12 @@ "cricket_upcoming" ], "versions": [ + { + "released": "2026-07-10", + "version": "1.0.1", + "notes": "Fix CodeRabbit findings: reject empty favorite_teams entries, reject negative overs in overs_to_balls, validate ESPN JSON response shape, scope series discovery cache by configured filters, rename logo_downloader.py to cricket_logo_downloader.py to avoid cross-plugin module collisions, require HTTPS logo URLs and sanitize team abbreviations used in logo filenames, and preserve the update lock across on_config_change.", + "ledmatrix_min": "2.0.0" + }, { "released": "2026-07-10", "version": "1.0.0", From 0c4fb9d432fe86afcb69f506f03c6113da9b3c6b Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 10 Jul 2026 20:34:42 +0000 Subject: [PATCH 3/3] Address Codacy findings on cricket-scoreboard (PR #181) - Drop the http:// adapter mount in LogoDownloader's session now that download_missing_logo only ever requests HTTPS logo URLs (fixes the CWE-319 cleartext-transmission finding) - Fix implicit-Optional type annotation on download_missing_logo's logo_url parameter (PEP 484 / Ruff RUF013) Bump version to 1.0.2. --- plugins.json | 2 +- plugins/cricket-scoreboard/cricket_logo_downloader.py | 5 ++--- plugins/cricket-scoreboard/manifest.json | 8 +++++++- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/plugins.json b/plugins.json index 5aa8ac90..563d0774 100644 --- a/plugins.json +++ b/plugins.json @@ -27,7 +27,7 @@ "last_updated": "2026-07-10", "verified": true, "screenshot": "", - "latest_version": "1.0.1" + "latest_version": "1.0.2" }, { "id": "7-segment-clock", diff --git a/plugins/cricket-scoreboard/cricket_logo_downloader.py b/plugins/cricket-scoreboard/cricket_logo_downloader.py index f100695a..822d8b7d 100644 --- a/plugins/cricket-scoreboard/cricket_logo_downloader.py +++ b/plugins/cricket-scoreboard/cricket_logo_downloader.py @@ -4,7 +4,7 @@ import logging import requests -from typing import List +from typing import List, Optional from pathlib import Path from PIL import Image, ImageDraw, ImageFont from requests.adapters import HTTPAdapter @@ -30,7 +30,6 @@ def __init__(self, request_timeout: int = 30, retry_attempts: int = 3): ) adapter = HTTPAdapter(max_retries=retry_strategy) self.session.mount("https://", adapter) - self.session.mount("http://", adapter) # Set up headers self.headers = { @@ -62,7 +61,7 @@ def get_logo_filename_variations(abbr: str) -> List[str]: _downloader = LogoDownloader() -def download_missing_logo(sport_key: str, team_id: str, team_abbr: str, logo_path: Path, logo_url: str = None) -> bool: +def download_missing_logo(sport_key: str, team_id: str, team_abbr: str, logo_path: Path, logo_url: Optional[str] = None) -> bool: """ Download missing logo for a team. diff --git a/plugins/cricket-scoreboard/manifest.json b/plugins/cricket-scoreboard/manifest.json index cfb8479a..e9ac40d6 100644 --- a/plugins/cricket-scoreboard/manifest.json +++ b/plugins/cricket-scoreboard/manifest.json @@ -1,7 +1,7 @@ { "id": "cricket-scoreboard", "name": "Cricket Scoreboard", - "version": "1.0.1", + "version": "1.0.2", "author": "ChuckBuilds", "description": "Live, recent, and upcoming cricket matches across international tours (Test/ODI/T20I) and major domestic T20 leagues including the IPL, Big Bash League, The Hundred, PSL, CPL, SA20 and more. Shows runs/wickets/overs, run rates, targets, and match results.", "category": "sports", @@ -22,6 +22,12 @@ "cricket_upcoming" ], "versions": [ + { + "released": "2026-07-10", + "version": "1.0.2", + "notes": "Address Codacy security/lint findings: drop the unused http:// adapter mount in the logo downloader now that only HTTPS logo URLs are ever requested, and fix an implicit-Optional type annotation on download_missing_logo's logo_url parameter.", + "ledmatrix_min": "2.0.0" + }, { "released": "2026-07-10", "version": "1.0.1",