From 4c783f1e4665cda5a2a1b63ed4468f82a2015c99 Mon Sep 17 00:00:00 2001 From: istoolsfox Date: Mon, 26 Oct 2026 09:56:27 +0800 Subject: [PATCH] feat(settings): an app-exception list that leaves programs' own keys alone Rebased onto v0.6.0: the helper protocol gains version 7 on top of the teammate's 6 (the skipApps config field, the foregroundApp and appList events and the getForegroundApp and getAppList commands). --- README.md | 1 + README.zh-CN.md | 1 + docs/design.md | 10 +- docs/media/app-exceptions.png | Bin 0 -> 201629 bytes native/hook-helper/build.cmd | 2 +- native/hook-helper/build.sh | 10 +- native/hook-helper/src/commands.cpp | 5 + native/hook-helper/src/commands.h | 2 +- native/hook-helper/src/decision.cpp | 36 +++++ native/hook-helper/src/decision.h | 13 +- native/hook-helper/src/hooks_mac.cpp | 36 +++++ native/hook-helper/src/hooks_win.cpp | 124 ++++++++++++++++++ native/hook-helper/src/output.cpp | 19 ++- native/hook-helper/src/output.h | 11 ++ native/hook-helper/tests/helper_tests.cpp | 112 ++++++++++++++++ src/main/appIcons.ts | 33 +++++ src/main/index.ts | 36 +++++ src/main/inputBridge.ts | 28 +++- src/main/settingsIpc.ts | 9 +- src/preload/settings.ts | 2 + src/renderer/settings/App.tsx | 2 + src/renderer/settings/components/SkipApps.tsx | 100 ++++++++++++++ src/renderer/settings/settings.css | 14 ++ src/shared/i18n.ts | 16 +++ src/shared/ipc.ts | 17 +++ src/shared/protocol.ts | 24 +++- src/shared/settings.ts | 38 ++++++ src/shared/settingsChannels.ts | 2 + tests/helper/protocol.test.ts | 2 +- tests/main/appIcons.test.ts | 34 +++++ tests/main/fixtures/fake-helper.mjs | 12 +- tests/main/inputBridge.test.ts | 22 +++- tests/shared/protocol.test.ts | 21 ++- tests/shared/settings.test.ts | 26 +++- 34 files changed, 798 insertions(+), 22 deletions(-) create mode 100644 docs/media/app-exceptions.png create mode 100644 src/main/appIcons.ts create mode 100644 src/renderer/settings/components/SkipApps.tsx create mode 100644 tests/main/appIcons.test.ts diff --git a/README.md b/README.md index 664f94fe..f5c99429 100644 --- a/README.md +++ b/README.md @@ -84,6 +84,7 @@ The wheel, from the top going clockwise: Danger, Push, On My Way, All In, Assist - **Trigger key:** Alt, Ctrl, Shift, Win, Caps Lock, Mouse 4, Mouse 5 or any other key (on a Mac: Option, Control, Shift, Command, Mouse 4, Mouse 5 or any other key). A custom key still types when tapped, but its letter appears when the key comes up, and holding it alone doesn't repeat. - **Alt + click places a ping:** off by default, so ordinary Alt + click shortcuts keep working. The ping is the one in the centre of the wheel editor (Generic unless you change it). - **Pause in fullscreen apps:** on by default. A fullscreen game keeps every click — trigger + click does nothing there — and gestures resume on the desktop and on other monitors. Windowed games aren't detected, and with an auto-hiding taskbar only borderless fullscreen counts. Windows only for now. +- **App exceptions:** name apps (by process name, or captured from whatever is in front) where lolPing stands down entirely — gestures and hotkeys pass through, so Photoshop's Option + click colour picker and a Tab that toggles panels keep working. - **Enable / disable shortcut:** must include Ctrl, Alt or Win (⌃, ⌥ or ⌘ on a Mac). - **Pings and sound:** size, duration, volume, mute and the wheel's tick sound. **Keep my last ping on screen** leaves your newest ping up until your next one or until you pause lolPing, for example to mark where you stopped reading. - **Wheel:** adjust the size of both the ping and emote wheels, without changing placed pings or emotes. Drag any ping onto any slice, including Bait, Vision Cleared and the upside-down Enemy Missing, or onto the centre to make it the Alt + click ping. Click a ping to preview it. **Reset to default** brings back League's layout. diff --git a/README.zh-CN.md b/README.zh-CN.md index c8be35de..163f3dbf 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -90,6 +90,7 @@ Mac 版需要 Apple 芯片(M1 或更新)的 Mac 和 macOS 13 或更新版本 - **触发键:** Alt、Ctrl、Shift、Win、Caps Lock、鼠标侧键 4/5,或任意其他按键(Mac 上:Option、Control、Shift、Command、鼠标侧键 4/5,或任意其他按键)。自定义按键单按时仍会输入字符,但字符在松开按键时才出现,单独按住也不会连续输入。 - **Alt + 单击发送信号:** 默认关闭,这样平时的 Alt + 单击快捷操作不受影响。发送的是轮盘编辑器中心的信号(默认是普通信号)。 - **全屏程序中暂停:** 默认开启。全屏游戏独占所有点击——触发键 + 单击原样交给程序——回到桌面或在其他显示器上手势恢复正常。窗口化游戏检测不到;任务栏自动隐藏时只识别无边框全屏。目前仅限 Windows。 +- **程序例外:** 指定一些程序(按进程名,或一键捕获当前前台程序),在这些程序里 lolPing 完全待机——手势和快捷键都原样传给程序,Photoshop 的 Option + 单击取色、切换工具面板的 Tab 都不受影响。 - **开关快捷键:** 必须包含 Ctrl、Alt 或 Win(Mac 上为 ⌃、⌥ 或 ⌘)。 - **信号与声音:** 大小、持续时间、音量、静音、轮盘提示音。打开**保留我最后一个信号**后,你最新的信号会一直留在屏幕上,直到你发出下一个信号或暂停 lolPing,比如用来标记读到哪里。 - **轮盘:** 可以调整信号和表情轮盘的大小,不影响已放出的信号或表情。把任意信号(包括诱饵、视野已清除和反向问号)拖到任意扇区,或拖到中心设为 Alt + 单击发送的信号。单击信号可预览。**恢复默认**会还原英雄联盟的布局。 diff --git a/docs/design.md b/docs/design.md index 15f770cc..e7c14d0f 100644 --- a/docs/design.md +++ b/docs/design.md @@ -135,6 +135,7 @@ States: `Idle`, `Pending` (trigger held + button down, not yet moved past the th | Situation | Action | |---|---| | Disabled | Pass everything through; only the toggle hotkey is checked | +| The foreground app is on the skip list (`config`'s `skipApps`) | Stand down like a suspension: gestures and every hotkey but the toggle pass through. Matched on the app's process name, case-insensitively without a trailing `.exe`; an empty list never asks for the foreground app. | | Mouse down that would start a gesture, `gameCheck` on and the foreground window fullscreen on the clicked monitor (its rect contains the monitor; where the monitor reserves no work area, only caption-less windows count; desktop and taskbar excluded; Windows only) | Pass through; the fullscreen app keeps every click | | Left button down while trigger held | **Swallow**, record the point, go to `Pending` | | `Pending`, movement > `dragThresholdPx` | Send `wheelOpen{x,y}` with the *press* point, go to `Wheel` | @@ -416,10 +417,17 @@ Every member counts the ballots itself. Nobody announces a result. - `config` gains `textMods`, `textVk` and `panelVk`. A `textVk` or `panelVk` of 0 means "not live": the helper then leaves that key to other apps. The main process sends a real code only while lolPing is on, we are in a room, and the matching feature is on (`liveKeys` in `src/shared/features.ts`). - Events gain `{"type":"textRequested"}` and `{"type":"panel","show":bool}`. The main process reads the cursor position itself. - **Text hotkey:** while live it is swallowed, together with its key-up, and the helper sends `textRequested`. An app's own Alt+T (the Tools menu in Firefox, the Office ribbon) and the Mac's ⌥T character do not reach it. Alt is also the default ping trigger; Alt+T is a key combination and the wheel needs the mouse, so they do not conflict. The same holds for a custom trigger key — the text branch matches its chord exactly, modifiers included, before the trigger branch sees the key — so the settings let a text chord share a custom ping or emote key (issue #100). When Alt is released after a swallowed T, the helper injects the mask key (§5.2) so Windows does not open the menu bar. -- **Panel key (default Tab):** with no modifier held, the key down is captured at once and never replayed, and the helper sends `panel {show: true}`. Its key-up sends `panel {show: false}`. Auto-repeat is swallowed. These cases pass untouched: a key down with Ctrl, Alt, Shift, Win or ⌘ held (Alt+Tab, Ctrl+Tab, Shift+Tab), a fullscreen app in front with `gameCheck` on (Windows only, so League keeps its own scoreboard), lolPing paused, and no room or the feature off. +- **Panel key (default Tab):** with no modifier held, the key down is captured at once and never replayed, and the helper sends `panel {show: true}`. Its key-up sends `panel {show: false}`. Auto-repeat is swallowed. These cases pass untouched: a key down with Ctrl, Alt, Shift, Win or ⌘ held (Alt+Tab, Ctrl+Tab, Shift+Tab), a fullscreen app in front with `gameCheck` on (Windows only, so League keeps its own scoreboard), an app on the skip list (§App exceptions), lolPing paused, and no room or the feature off. - **Release paths:** if the configuration changes while the key is down (the room is left, lolPing is paused, the feature is turned off), the panel hides and the key-up is still swallowed, so the key never stays pressed. On Windows a watchdog hides the panel when a captured key has not repeated for 1.5 s, in case the key-up was lost. On macOS and Linux a held key does not reliably repeat, so the watchdog is off there and the panel waits for the key-up. - **The panel key is a deliberate exception to guarantee 1 in AGENTS.md** (input passes through), chosen by the maintainer. League shows its scoreboard the moment Tab goes down. Holding the key back to see whether it is a tap, and replaying it, would delay the panel or reorder input. So the key is taken at once and not given back. The exception is as small as it can be: only while in a room, only that one key, only with no modifier, never over a fullscreen game with `gameCheck` on, and the user can change the key or turn the panel off. The Settings page, both READMEs and this section say so. +### App exceptions in the helper + +- `config` gains `skipApps`: one comma-separated list of process names where lolPing stands down entirely — gestures and every hotkey but the toggle — for as long as one of them is the foreground app. The names are matched case-insensitively and without a trailing `.exe`. An empty list costs nothing: the foreground app is then never queried. +- The helper learns the foreground app's process image name per platform: `GetForegroundWindow` + `QueryFullProcessImageName` on Windows, cached per window so a press costs one `GetForegroundWindow`; `NSWorkspace`'s frontmost application on macOS, for which `hooks_mac.cpp` now compiles as Objective-C++. Linux has no list yet: its helper never skips. +- The settings window asks `{"type":"getForegroundApp"}` and the helper answers `{"type":"foregroundApp","name":"..."}`, for the capture button: the settings window minimizes for three seconds — minimizing hands focus to the next top-level window, so the app the user wants is the one in front — and the window is restored on top with the answer. The exception box also offers a dropdown: `{"type":"getAppList"}` is answered with `{"type":"appList","apps":[{name, desc, path}]}`, each window the user can switch to (visible, titled, not tool windows or shell surfaces on Windows; regular-policy apps on macOS), at most 64 — its process image name, the words the system shows for it (the file's FileDescription on Windows, the localised name on macOS, read only for this list), and the image path. The main process turns each path into the file's own icon with Electron's `app.getFileIcon` (`src/main/appIcons.ts` caches one fetch per path); where the platform has no icon the option shows the name only. A name typed by hand is matched against those display words first (`resolveSkipApp`), so the "网易UU远程" an IME offers adds GameViewer, not a name that never matches. Asked only when the dropdown opens, never in the hooks. The helper's `ready` version becomes 5. +- The setting is `skipApps` (default `[]`, at most 32): process names as stored, lower-case without `.exe`. In an excepted app the wheel's own Tab and Ctrl+Alt chords reach it untouched, which is the point: Photoshop's Option + click colour picker and a Tab that toggles tool panels stop being taken. + ### Windows that take clicks without focus (`src/main/panelWindows.ts`) - The roster panel and the vote widgets take clicks but not focus: `focusable: false`, shown with `showInactive()`, always on top at the level of the overlay. On macOS the window is `type: 'panel'`. They are created when needed, and each has its own preload with only what it needs. diff --git a/docs/media/app-exceptions.png b/docs/media/app-exceptions.png new file mode 100644 index 0000000000000000000000000000000000000000..07a492f0886f20616713d235b6bc885ec6a94767 GIT binary patch literal 201629 zcmeFZXIN8R(*_zvMO5TbL{yqc6A@5)M^QmKf`D|DCcOu#!GiB2oeb zh|~Zfv;dJ3kQPcHIU8Sn-tTzzCS{DvHMY!(DMa?#=5Jv}QB=w)hrl%gix-G4&4_^!Tw_wI=a`;#Yy zorPiVPV)2L{n|x;AC8`rX`A&l*Qs7-9l?DpEv<>C-T4ZuuGS#IEh}C{T@&x_t!hE9 zbbq_n?&){wzC(WjG_AKSw`#NJ_5P#+Aa^-eztTC;H~ z<$CGj6qi-%g7~(_(&#ptjQ3dPOUF}Xq^N1`_&|qs1wI-lWpBvX?kDd@a?!mqCij9Tk!JThSC|X0E>v#(H)eruL zcl0i}XVx7*X4?_dUxY(%CRA5T$a5JK#Ys30J~@RRulJf8GPX+KkoVP~rBKkh zP)q*59(Lgv6a;eL92$q)(@qG6Qdeo538Khkc5^BTtIR7RqH}7@#NIbn*bFwZ%l|p0 zV`nYHb__A_wv$38q1X0ApqgFrLeP8)cxcGDYo;xn6!`dYT%dALXp_j_Tc~|J~BbAUe&wH2)e^C z3x>Oxt%Az2DGqRg%=(CRq=vs~gSkgrd=ktefaK#j;YZZe*N@@l{YU3-{GB>`7<_y` z@-sd``L&aeK_#6nE1th=lz(2gzmCR$(?SQ|P$_Q#yFN6nRpK7l5;7`zA@Fylr_Ku_ zj)1PKn07Y$_c-oa&vUI0=qh*h=W5zcB7*csyw5CvNn@Q+zM);aM5`zVoIpl!jDra( zYnW0P+xz~s^M>2D?HJ4nE3!L>wXzwl%mwc+HuirFL?;M~`L39o)HoU@d|VxOW&U$V zy};i~JvRdPjcnYW2v{F&WvC3IkhO5vczEWPt1!`spgj#jyLQf3d;lg$%x5ufY8`L~ zF_%?eFXbe~fP}Qju&`(oaoQPIO?CC?vmChN(5+zP`g*b0!iM^K^T@VsAwwQrbIZN4&Yz2}zl(14+o)umsOj1D!YHTM1`QP%=4vI0 zfrFc0@2-Cje{=lrZipRXwcZEIfCIzPIuC32`e!Yn>qAfj+jUl}&cwb|w5~Gsnz7|5 zPo0I(XD+`@Ws~-&A`h2_OJkb?wogEdjmx>;JK-B@&a637HxK1!S1WEi(~7a(^HmZ3JG^ zbBccJtj%-!xf-3CqKIogOT&z114cO7E>bPWZ)3jMhfT^kN}0NI@6?+UQ*W$ZDh)Km z%K0YntnDqiX;8=<%ZY&T3p4!J9m2u{ImQJV-)%FA2S?%IzVy%(35OeR=#f_$*(9pb zrX~|*7V>@@pKEghch`^peUATZ1}|iP4eqkW;ZF5qefZ`CW92gI<;#L}draNcEAWNM zuIPvAvR6AhJDVL2_O`^V+t1V^ur=$1Nb%Pc2l8qe`ZpedV2b$T5iEDj*xs~ksMx|r@8_7=p-I)6)L7?jw#x&#~gQvak9DH?| z#`csil_`4{uw6bUD2iM!l5icrf7ZCluE%TKs751R3+>=g$p1D1wgKQ$XLYH=K%OjT zzR5?+j#AW!VoISrS@6A)X>i>LosDAOkM^%YQv%8X~dSh+iUXYoy}FzAYgak=F^ z9oe}H^+hPd{;$t?WKCxX%(IgaTFr*Tf2R|NjJ~sYC>l( z>4{oaKm7AnAU?X^fW`}WOiy)VVB0$TwnastUm0LL{oLoyS2^T3G)>=r7E<)z44B#S zuUdvC))}tMjEZ(=X{WIHtck*|LJlzVD<@J`0ssTaE%b=N+t#H@B$L>kBv>5vt_zlkaC%&|cb=)yIZ zHO1MqXZq!qO5MjX0Itr}+h;(@B>9fDZ0weFN2UN($Y;qeIJkOmKa|Zi zZd>(pbYhgz)St}>nGse2f$n4#Ss@XD`$%1z&BQ)2j~RQwErzvll8H*hWv?9F48(88 znK(>)p1X6#9b^*Dc3@sxA7So?n^(|#fUrhIXi);j`H&6lf8JT+#{b|1vS)V!El0mT z`{F!WX`-*MpKH41s9$U+92ORK&SsUug@D3W8hGmVN4`X&4UH{?|9!gOc>gg9M~Vh^ zVPxSY%mpV^Ux}KFNnfc!3nxoMYbQCcMMp;`kvIIC!~h3M8m@61()jawP#g217hm@@ zEP5QRBLI#m9LO7+o22bnoH$cw())8*J6YO|JNn$YO3$GiyHA%XmENQMQ(Fz*vL?xr zPJg*a$V}M9Nl=J&v&X;;8-3}M3Y8OQ8ckr%qcQmh7{zS`zs1gchxdQ+vMtdJxO>Fw z6O30na>A@SSd7h+mV*2G`aCC_w$T7`YRUY~FKz5BgTVV9VHrf#mzvdf09g&-8big# z>PaJF{WjodT>p*6sH6XK8&CvY_0Hiz?ay_A;lFU1~ed){oUMsn}~U9R>?L+z$qH6?vp5e&Biq1O(7c+Y`c*LEEK&_wf|dZ!o)%5xf_6)1slZH{<1V zf%^I6bnp!;M5Bdqp4R0;%O+KK2xB!}>`!m^d-E=%iOP`Ruch0a7CH=N*n}A&Q<8 z`V!i>HID=KoX2avH#$<8nqi@wNxLIx1}jOU{rti-S5M67AwR*3BCZdtqiB@-rqwT! z9MU3`Ieq}dU}_&p6R8>+DthoRU{w!mjyE8$j0%+_*OC?7X>at4ja>fv^M$jAFs7Fo z6BFYMU#{MifR7_A=##|egyfaUZz{-QV%PMuH6NhgG7zfX_Ppnj$h2&4O>>L>U0#GH2qd%TxPq^Oyve-(!)TQ5 z1Q}{lWjF6YJ3OR3x3+%6GT6`v#+xQdIAmKOC@TRr_y!-TZlh_I!GP_Rcmo~M`I0!1 z>#LEwcgA2Ye~&48=lMuF)zEk$|F9F;6$SQHm0WZWCETT(q#D-xiP?pzMp8p3ug#jUn&N zZ&<7sS-(Fk=CX)28K!M+=&l3j!I9l?k!9Bv6e)(w@Wtxi)O0)|WKZVV_nC|HDC*lN z!#@3QXMNb#*4DNYNkpP&kT3-2Ox~4NR6K|UxJ7BlGvvni*Wq680BRRuX4};|DmY$_ zq+Ury{>)zapPs;Oacq#gERYBdp3#oH3{k^MA3xsvwyUS7ZM5E*saNg(eTCSls9)5(fw*`5xHb7v)haB+w z3rUGtA1cPZ#bGzWP$H4lzPYor(`!c-V|Ikp*!3i590$2~CyU!hq#dR15SZjy^3<6H z78$gf=KvZqzu-?y^Hn;G=-=0cYeyXkl~^S5KKtZ*+ag0BClfiiJR^cBe?| z#>B?v2CD=WnwA#beDd`UK-{3VG(iJojG>V6aVT_~h3!w$?{`$fsRyu$a zHG`SMC~lJoZLrN_U$qAh82&tD<}dc`BU^3dTJjj8HYG=Et|*%2ij;RN(JMDUw_)3L zVzZgATuYm>Kd~Xu<pvR^!B~{*ce>NFu^69d?RswTX}%{#&97-F^$!B+cPVm(nK*|y#!oxR? zB|t?i8mxTLb*`70LsK2?47v#v)HwBGC!H74@qw!9urvn6Syk71Y?j^|P%=n7+bejp z8~K!@pnn$n2#)n@p=@(8nhoeKL!n$Oqjbj~uXj*c+%+LX=9BWpg_U<_uXaY>wpK;= zrpb$!7C*_#ZlqD^O^&``tP+LqpO<%|Qn)$f)35)rO~`jb0%4@>4N{?H&I@wUAWP-( zZk{%Kxio&xCs4maU0l$j-tld0I(dyxR10w@f(Hl<3+D6Z5t3QIPE_rDsox*bGEn5i zs8qSU8zqOBtVXL;1|RID&BI(Jso^7#R4{^E01PzUcqy=g*&o zS-75{mFIc>c6+1d(tXDU47w%o%MGInc?^tfQYA412e+}ZL(3a*hJ0*FTSm9n8Z>D$ zQPg3?c5jaC;+l_S{MPs80Z zf}c~_c>i55aK_cMB9GPP?=%+1ej#+l75%7ADm@L}uP-L-up8&j3v*cQz3OPffwg34 zg&t6?pc0g{{&$C+WtrX$yJ46dll?GXVmPbT)8ecHTR^v%;CuJ9?IVj>PmqbDo!R?w zFo&#`QbzeF20{LmQKM;Gw}+^%uCCiKpcf5`+jT!=!W-4P;xEq62vzBtj|^3F>;~~K z4-9R|8zIF<~P=YAaiI&AKp@5EetdAR z!PGBI%EOr1DOg>dnC!$nu;Ay#*+VsoPUrRT{&z*1USsQe>_xRE*eYeQ1_NZ{Q!Tr+1p%gCG{e@b`SMY z_1JwLug8V@4_uK4I&Alm`~7JBQd3DdwJIz_opwYTy;P30Tm6x;3K-r2ptR>UD&gzH=7m#-qbaJI!c(ct% zFIg24(HrUevwbUX_@N0gDC^h5TCb{1sC`-t#YUx$SD2Z<2!G{bfcF}1En$^4PrZ_L zmG$bASf-Z5w%8o~xi~*#>t%vbNWUZwNlqGmPXa&ssbXU@d$kI3@HL226Y!Wz92^$S z;~D7gYO$0c5U3qM9bQSvq25}@AyXaYCZ}88uHyw27Q;_v%G)DpkMnd=ZdhsW-oTMe zKP&!3>K=n~1^=Y|ri9ocL$mfzmx~3sM(0MW>^nb1ua5aKegzb1p98nZKcN9SHR-{u z=L>NN960?2w?C7!r{oS5HO>k|$MWHclFj*@+1gi1V^^nagbELy)u?Zz^pyBS|bN-4|R-%GW z=Mi!1yMZm;2Vo5LX$SnbsD@`_>#4+f>Lk*0uB*nb&uJbawWJ!lV(nUfcVtNCj9GA> z`Rc-95`NO)y}-FKsI~r50h&lyW(M842nbaSy~R^0hSKwO|llPaRIBSG_r@agHq2o-N155$nPI%a;fZO|yF2~71q4z{BFPy#I zxSb9q@T=oiQNUcsO-3t^sc*0Ray9K2hdCSRfccQQzjI>Jt^uh0CIwRK zAvb@9GP2Ff*m-9juQNsLTlKYbuxUMQ?9>7{KZ9$)uPk~o3pX-g^X6UFMF?`1EbkhN zq*2jjz>YM2V!y57I8?%igSo_F_;sSz2q^S?554mDEu=NpBA_YNt5;Ucd*q+pU3;en7m0yXyxlW-a~|LZQti|^A9vL0*?6gMdmd-Q$Io7;(qT{{2vXBYC`8O>vUC6U<2Kt|pZo!`a z^wc3Js;Q}!V_u%6!+HU+T)Ypg6#Q`dQa!*&sOQ0mJHhqlWjC?gFBNojC@H_L4SR^W zOk@lo#%AQ9?i`>9O&S%h_5S_Wjr=sQe*)>sEkNjeVpQ_P6)N<&cKR-P6u*gpa_ zxK^YYf5Y|-QJI$Nf?Xh%pXe$Av@fw4{G0yVJ`Jt*!SDN!jvdFYey#pn>k+lFglF!3tr7Xy78jjz6BA#V{8Z zS2o$cw%a%(Db$EK>9ITuBWOB_m73&OQ~coO4HHW~yJi9MGyR<@eT%r+0jkfujK|iM zhxPnDTOn_BkV`c@EGuqgpEGbY+d17U_Zj=+Sw(C$u2h}m77WFR}{W1e)tM+allHw z@eQMr>n))OA?;*|iY2*}s||o6-%RjX@T@$;MJ{9bs&=AfAtZuBH;xvxS@G%0ZaPQp z7-7vgp!UUt3ZQsD{`W9h5@ULoM3#GGZJw)e+cw$zf0O0s`V z__dWX_X`)WM2e8&-sJK8bh{b#>h0TO!Uv}#?ggIy1#rXv^aZ$Z1~7TuzUGYt7_ifv zUxkwF5zwhOMsiMH_jif0IjWzpG;d*)m7m1KG9`lG5pjYB?M8|jUgUcHdQV$f+WzUB z2jL0*Ks6}r^XDFNo#~N-vEp(~ps3<3@0LqyRL+o)tt+YiyiK>Qe0=~(({XK_R&^Np z+LyIb$ynqw*5Fe7iA!2X&S&MOcgJ7;_S*Ow-C{UZez84nu!%!RLfIId!6EQPL#|`a z#(NW>3{@DX@Eq}r)s5zK4zyEhVxEo}s5#LxA9+i!%o`*On3T5nEKP0;zukMz&-5er z2Hie(-lRdzagucguFQKT>&1@o zMV?Egwf`ksadj6b0ZpV(pl!)tqDaL>pfb=8H92gClcF!meqit-RytW7yDNZ$;na1# zc!hi7Z%q|_0#tYEJXKV_5Aa7Rif;PP%US2n`uA($j-H;cKqaCmX?~niNe<~Ixui~v zgu%aA4+QFnJb#(4DL#m;vMvT)!zGx>h z)-vAP%KvH|aM1e#9#iJ85gD547?9PhQf*G3xfzzDRFic^MLS|HVE@`^lMjGtL&H9nr%%2yxkhEHg8S?Z0? zK+LZ1^&cG?rWY#VvtADq;;l~j(4U+0c+S!Ds^Zoa!91-Ig|@eYzTrrSUsUHar{qrN zhTdiA9>UuA4ZiV@EJDGOtp5GY{Xe#-RTpOsHrUOd+HL>cQJ^D1LD1nyjX)clhmK9W z>CDTX7y`JJ=+;J(dF4@npJ6JsFl8X+ue zUx#1zonD_q`=ULb0)-!|#KI)(l8eLZz3^_YA44T&4#O5M>2J1NdAuQ2iWdJ`5oCkr zmy`1{n{j<`WI!8-NjpSQndUX`DGTGpxfs`-U7lDhNm);S zIlwGW+ocv)7u*K_)!5R;v0g1l!sjeQ-x|Sh=R@V%b&-k=7r8uH41(@`Q}nJsm!U zS{m2ORY&y+wJRD6Q@h@`GMfxfgr1lv`xN7ho0k8QEm!IN0E$hSsk5+6PHub7rI!+A zNH>ZU%OgZEBy&Z6{MaDIpKeNLDAruA8~@k(-=c4T zSqAOLmA&g2jx5Q;=xUJgN|gOk;>mI$;jKH20v5@J@=H1b|L`=7&y)v~BQKNsU&spk z!AmGJ$JcUmOYn_T*ohSAep8#XcKjQcQpvi=ve9Y-(v6<6&k2bmi;N=hNfw9KZnT1- zYp+uKLx=pI`o1mMnY|qAlrI|jG0MlX9PP0@g{AlPP2F^(vQx%SzqYmn%8pCPQU34V zrnWvykWSp5VE3xWny0%M88X1f=r40ih3tO;sQLayCE?!zhTK#z#(DCk^CJQX3& z-^=wC-nRBr%Izb1u2n|oYU*(N1mfv^=Ufv0+L8d0e}O*6*d=+}dex=)qQjhbWzyM> z<`6l3qO?d-{qWLqJ;F4$_X`xVr;-+GtjHUkE40f*>VNK3%P}@)WROCO)PBJ~K}Ub3 zL9zegS=9m0r%S5FdlNZyg@O*!r#~Kdu}_bRy7i+Q;g~05VXv}aI-i|@G}ym8&qx$s zI+5hQ=kPbVf!Gq)t^rl>x}nFwLP=_ z$qw7ia`Qnc7e7k-L3aWtth8mCI!iRqL1apyuR`Rs_eqE}VNKT3;>XCA3|Fh?B*mqR z>bt7>8c**m-q9_b{aQ? z_(Xzq^p;DWR6I|suQMg4NV{3u0qs4e99CUV>bw{F75~;pK%lFbkN8W2Gf2#efg5C3 z-^zclE^#l7FHc7ZD#NKJ_SymHU?3PcJzefC@RrJ|MyEY;a5=x6GlY~;hiEhF=GYIG z^kK&Nsf!DD;z$W&HDAWkCzgWLwVSfLIu&!ARp=RDXPFe7E?b-8eEh4F7#@4dCr7&N zc~mc3z+WJx`3g7o!+2QLReuVDLfk(c)=_?6cg}UKUivMAyWn7*)B_5itn6r6IM4|M zv?>AQ*AOWAh}BP8wqF`-lgu3E&R0y^WAg7(-r+YqV>s3sx z8*`}|e|6JW0~bi2ZSS>#qowo9+w1n}!LhGJCoYT9)42m>gpQAZ#{8cv$oS*-mEqLMCbVVwPa?5n89XP6DMcNil#DBA7y#o zq)elo=cCM%xstmzIIH<(SaVI;#z?au~T%aEaRwRce#fOB*jcMJUD@LLCy_;qX1n}6b z^}-Nw}Fef9I^G?jy0(kvU`T`!ktaeSluX%I? ztJc1M6xfRDH%#7R4i=6Ccc((kolr0``2F#oh@K`}%$Tw*eimCp*s04MP(qmPH*X#h z&pio9*RyZ`r)8lb{-m**%4hee!H9Ch;)KCcGwCIg?Xf{u!Qj-W&RVC9#Z5zHNZ+J~ zKC4^$Z7uy6SQtj#CvZVr<3}liFn!Wn4N06& zz@*ShyP+;gDEc-FDPn8_H~eTxvO3E2T6MPRQN?ehN=wzc*>B|d8E||;fkw?i3Wskd zTV1`KYJj^LxYXDece~W(U5!bNJzl}&U>7|DZd5KgSi-^e0U_ERJgmNiukn|=bwUz! zRplxy2|^aOv@U_c;|^mle20-%H!ka=H4K&5KcMf-Yq|Y7*jH9nWU2+F4r&@ zxA%7wz}MQKKV^A7C93w_aLkZ?!0wj3qd#B{+mlsnvz_-DMJka(&_<>ya|M+?fYg@z zCVtrez`Hb6hqb)PwO!6FnIH+ZTs?wc(b(TsGuhbPnDOk-D^H{J;Q3RB_2hmG%WJdm5l^gLpy{imu z9_vu>qmi}Y#@(q>--z024PLzhF`KL9rfbXVex#9snA@S%F9*)nEz1naU92%O3}8z9 zXKWdoys~a=mcK{0T>Tg-E!?)2%MTB9xJ)oj$uw=Wv?qvK+bp?dJT%ql`oV&PtZ|)V z)4@@=>2dxBivPnhPt#+JNrZZ)#MYPsav@@IU|tjoY572%QgR|8JT_i3;*#a z8U18GKLyUU`!9J9%ca@bymE4;Az!lU=m)z}dgKlyaVEQHqMNkB!ORKu)A^}v7Snbf zNy;*@Dk;e3lQazeiYi=znrLQD^~RB;UR7H=p?w6P1gVsPO^v<$r58B24c41%kU*>L zJ@nfF>ozVOr@75np9KHWp#b%>*@tuvE?e0Kh5CJm^6Jbt>zVR|vyXL{fj-?R`YT$i_*&yY%ZxZ-Rsq9eL#bEZ>bv%Tjv(&NeJW7}*VC@? z!L&+D44PqX6IJ%*%Q|Diu90S4tqI%(s?pcgk;j~_vcGt{VxtvP=h2qnS;MAW1wr={ zzZ6S*W}}BTYgfQ<4$`8_wHK&^${YXo1uod2mae@!ow#8f&!=F^yY zy~>dhE9Jb=^-i;uONYKaRR>+i#Fx$GkfB6ZF2=Mg7K!p*{WaYpJx7wGTam;VpbD;I zOYeoAQSW}1ady6rMwIC_1DZl;+@dHF&_=X8Qej=Ap|~?X5xCLwIY?={HiAd=^A*YE zo^Qc@(YYB9w{sQb{WpJF#HbzYoeAs*)T8V#`0d7xUipBQ+HI2jl*tCQK*4kN2lXgO z<{I30H32B5smB+^=K_5ue+WwEPlx7*?@rB;;()p&gEu;zH)FxK_*L>CzfW3-Yr07UtgE`Q+d# zr|D0gb14}P>+KRKF1aNdCF2BRY0cBI&><11aw0gOt-{(6&gZcv8k1bz28R$60u0E@ z3{3g=aG$sg0+lke|tgqHd2pDJ{O#TGySq8%^D{(WD zKm>ygMv}FYvYp@5U%UEkYOQ+<{P~jPX7n%I0=C>r5+zXDQ<2YfMWW!FY3laRKAx`e zY1jD#2-DjEGPOQ8jkYH1b#zHJf?cUoAr#%}K_z;?gIBSu39dY&Db5tcXe_V+v1lW`JTzlm+y(i( z&s3gT$C?{|{BCL_`#9f_(_={_fdtgx&lc)sy%v@_a>`VlWBIm(&EWb?OvDx%7GLyu zjyqQMEFS3)9aq%<Z-iUKg$%*XNcTTCk77TeXq)dfpBx^Y>* zApfi|!86c649|ob>Sgz(O*F}ibNJ47Jd4%NbUo@qlxI$a_zq~(H6XSpzCMuUm~6c3 z3hrL|>FKAoMG|*!^vkZ~6;R3ua$wjmm=}`k z0%O6E%wv7-{yg80)Mw8zR4wtTYV98ahrHfWFBl$+sq zV?uIzYXJZ+inuO4xpP#ihZQ^ITI=OAGW^K@iR_tqrBpYj`Wl4#0BsI>LC15^#%opN&lATP_f z>P3-GcAcfffwmi|MiB%#{G6v$6VS4T_8ujXl|&F95*8NHrzp+Gh7WpTYsE0r)tp${ zqmF9e#3lR{g$T_XiQ!rEFXd-{rMazaij-pqvUM|F2_HpC)*3W7-ludopgkM1M~Qbg zAZvCRFEcO)0A8&+_cp%wTb>tmXP-Q2apkt-Pd|N`#rMYX_LxFZklyQ`i32P`hF|S1 z{zTGsC5apzUENybnqir_Nyux@#$$sp&Dtb|!hmhn<{Zh?X}nIw%#7YNARm2OVa3~3iyhM7_d@(A+EmtA zMCa^HAftRO_0!|%xrdvm#e`(Elq-7RlfY+AMStk*6c9qCJTp$y%6@m0(00%&iz}aqcXQBKym{c|Co2QQgsN`q zWdc%k<#QH59S3MpQ*|~`AO@_xAIKUSXcI|AtTf1X=c_rId8GPMwpY25l9R8nja=m7 zLI(WEylZ+c7%7q>Fzbez+vgZ@O@Jp7ufx}%7D~0-e4nF&W&%?k-Vhe&6WPK)f@v{x zrV-v7b(%eklWt|+3>v260&_^j>x@eK{mx@&33qZ>e5 z&__wpZMf{plBcp0r;~jrU9CZ0Lj6c0NvhU2*fcr6c-Fus#}@&*bK8zexzi zlfDLfEp#m}+gh{0N1ztv(O6jNHBlRZChpgJOk+g5nk!1eU1Un1KkpxtjX+zk@7P+F zn-kXJ{FT4D0Akq|1uv1=o+&(jmGxl>s!}y;pbU(q*)!zwq4Bp;5%mihk;_tUi{?5pt|~P zadbPM+rU3#Br;-ltHJGdU$X=MLn&@A8y64xmNt+1q_^Z_YqI&|1@WspGCjc@-?_XG z>l6V^h-UDnt6Ge9HUwdE5bX*8E0Cv&)wfXo@^H%Y*XvvK`qy*?4R36Tdu@vDkvV>G zG0QL|+;gw*_g|Qr5M$i8QOmseW*$wje z5#b?+uC4YfqsdnqFK}f6s3I2M`hfu~uL!mCSe~UvqeEpt+v*G+$s_E8oi_u!St47O zp*QJ^^S3T33Fftb4v-vGICtfe716UE_UVeGbAjJ247OcClhVfG5hjvyAOfzR zP5NeIly*5-!K#6BmpN-#YI^hi{1xl&q79%Ef0oQ8T3HU$@>OYvpWU8*@3tahA-AaF zg)f|!!E7&yPw{vinCqtAsvW{jC_^bj9S==1aB&GU0mA!xKIawzN%X~z zW_Q!#{BReiRXq`?eYM|}6T5+BD|TydzWLYUD7jd+4UeXV`19COTnW=A^%2i|Mn-4M zi#5gT%kDkh29<(hV?k;fAB&qbQ(rk@T@{uhBWsIt2#WT(t=TZPF3)x34nTY$Od}H z$Xdc`tzR!;$6a@ytY4Ls6cqIK1IPTwSj$>_p2`tww}DP zV@#EF8Oj`M3hH^Sd_&sd;LiQ~N#eC4>AN44kyS&IzgrU0fF7pB1+o;R04 z%nFfQvYs7kvaY&b8IBXSkLDRliVT0o(7V=d;69vdL9l?X+j*Z!PE5S?XNh|2KiwdE zY*&v+MzpS7(W7twG8`f&N$9T)TG+>Q=NbX0+QMN$i;uf?16i(h&z_ckIGG>Hkj|Ep z|IE^rk{se2g&`h$V_b{#fus3+=fNDlZ&!ug8kT~Yc?D!<{9E7lQgT6?D|mQg{XI;| zs89MyVts`*YGrjGAHoGCBqyZL@7t-&ZKy?Zl2?1A85=tUdY^2Z68#tf%s#$vCU_X$ za*IND--gwj_pYRpz1X3sMz5Kk@$B&kqL;k=NNu8~h!hP{G5Zd)Wwk*AMy)=k0o~_e z;o&TQ!kACj+dFOK!;I#n!0#ie8u~YP0op5W#svDEo zZgYs*st5Nbzv&~D=$M(d?&swHbMe0J-@bqV(?mTi`N+0RZ=m4Sb1V8S-H(j&HK zU8A0Nc#KOPc$EnQI2naqivMu(Z}Z%Bzs*|Z1IB*H~lyc`m4G*7C zYC<&6``%L)E0ahFom<11K|fTOLXUaLDI`ENB;3t`nZjiqW~!Zhs3)MA=-k2#Uht@Y zZXrT61*mbYS!xFRTF^lGty0|%X?hW(@2yFQ2q}7vAmtnu9Bftn`#@e7J-gt zTu?I3_~8P~B>rk`GhDQe*odo#^2_^5C84j_ttoiFw|&;i|sQ=55- zJq5aOZyw1!1Lj&KBLCQ$FZOrLA60uDGN#+|0&2r)-_T0)*&+ov-7Ck+4|F$ZgZ66} zUQdcQyW%0h;Ges*v-2UBsjf6vZIlkItG|>!;GrcG^d3Fu-xql8K@uh>1)wtIu(HFm zbyZJ8WOoC$$#UB(h;mk9qfA%dAjqk4qG^@=hJsWx*m#3`yB_U9B8M$?_kDR^GQ0)M z35(3FwVJzFW>b2eYl^$v7PWF?Mj$6^S3| z{0lI?Y#LU76KE8>z%1b_wjqKNSWP-G&-e8Uwr@D(xCVKA3d)8M$2+F z^XU04-?GcL-yJNZffzX#w09=aB?fEB&*|!DR3mNRP^FvWBA@1A!TcD)B@=-mQo2dt zjGJX2mQ+9a2Wan*KCwybnB^mjV;S0j62ACAyx7oU zWs7y}M0Mr}nt1;)JosIefHrSKd6Kp`ML9Wn{_-A`;ArrB*a_BG}Ug$Q>Pnj{MG6{O_MlB3y7?38gPnV7$KLu8?7pOyN8Y z;n5lt{s$g`FMN8L|xDy)2bLN5{p8A6?^0L3^!$_UIVNE*r$fqJDf&Tbl6& z!gsZIj(HT%JT)^$!dj2So?~13CH)-VOlVGsmtyEY#1PeNwSM z8LtoM5_i|2)$)Co!1RbLjs$c&!r8-Ob>sv$NPMH$BY-lPyVliA5$=-(RsCF#Hcvme z`)fCF1`Pi_a;$NKF;Cic{JOmF$_3E3yDUORalj-4C-Ys&BR-uT)khso1Az&+^TaWy zau$@w>=xDv3iLh9@A@~;%8}F?kqYY{Qr*8Z_#x7+x0XUcx0|$jN#LCK3+qOI)6n6lO(QY8MI{>&;*n+=eF#YgK$j&wZIXxbNUA=pL-j);cvS| z@Qp{@mKVUmy0rh|FgpsFd72miEOG!K)wO{^<_UG zd(L)51D}R5I2COA*#Zv!J-in3<*rb^wDYgXeM4Y2Auz-F42Ul+bm+=sC$%tOZea|g z#i1Xe;dsILaEd##^~d7E?gmj)OY75pH8nIaK}qs2l>>?mk*z2c(Lcx~BhISI9s`^9 z4!|z>LnzgaHFd%M0Y-6>m-d@lSKXC4pr`u=|sS`Io%%37x) zgphr!RI)1}V=eoPv5$QaMT-a_JC!ZQK4agjvF{8s)@(7x*!MBNdpe)%V(~~HJjAjV7UWHUX zV6(SA=T%MFCXoE#B845^V{YMp)@xt6+sp(1JQVC?4*gW`W|?H~isI_UQ|Dy=BuJm@ ziM$}!A2^#d1l9q2U#3$qQ{y{M@%S`le@$SB15FCbRM0*ZVU#`d+o$gvh&LtT;j(c2 zt*5Ve#Lnn@lkn0VCGleB(1o)64A$ONKcJzyDY9Q~SLN0U_k)AhO*^pV9Clw!e~8&5~K{ya=w0j2;{l4adnX> z29<;5GAognZoORu{0-A6ORrJe z82-8TxY&lHeUZvTkSf8;OyJKdRk%XP;TZC8nO#xUJQsJGUW%MVrSi?6+hEN+BP24% zBbJ?c)sp|14{kr|C!1;NEi=;1Mg@97Z==$)jt^dUra?lQZE8^GKVSJtCq z$|d9EfFnK~JbChD(-g4WQa^$dKk018wJY-{_JhhzpSj6&05ejUq+0{{a7YJY1-d1NiVL^T{sl zoR$I6GjgM}#jF2xn>^_vZf$MNNcTbYMNfC5y^wwijYARqTpSRR0N%ic0Sdq-7dlM9 zzZWQt3~VE|EY_zbGeEDFk=hIgo&a5yJsWNw;)M}EDr`Q8@FQ*3sX7)JImP3qG7KWB+mS&*E@9W-Ssf9$qAV<3;?Kd9`PWHT~TECr_S4 zKEq&~s=;fzT#F;34X1$}I00-8w<>$UCPkX7Mi6Z}KS_AigM6yYcZ)hdv^i@883Pz4 zgfz3o3-_P=7qPuA{Ad5XR|RI3q;soXvXe9z%-388#0Gc)mjiS~tI9yoU|~dfu_X&$ z=Tf`&K(WDf`mUlSIKLOcnQ*vIEb>AEE)*(vSmHkiMn>-6v@hgr7I<-J&TGY@CMOU` z%L18TFB4M;?3LRyE@eMYR|}T|{prd`W7Liin5aj-#2gN5(5CPmz_k2d$;YGhX9>P> zC%`K}8phma0nOqS&dM7S*QOw|kzZ7w3D%xc+5qLlXl}RWTXH8U~Elu#}x)bej zPE}@ebbi4`beFGyFZg3i=Ckr@@U8+A${mYMi6SK^9*4|Tdx8({%D;dByehp+nAlcU1pKdl;K;?KxKvIZ@hafMAS2%bh zm{z>OCByu)arhJzl^qBozc#=DB$K zZ7FaChyd`IZK}dTipOk%Wnjq=U?5N`%AH30F$|XAH+D@2HLQOg$8aVw&gcpMqTI;; z9;oZ}f8URhYD9kB;HlsG3V|E;>B#s5wc}WCBL$UBKv}V6SZb{7m+!j-A=tz6mw~3o zj05N46P3eNwHn<}50)@Q!2*b&wt;#KP9y;Ukmjk7$QoszRjZ3KPM-i?r(*R6xkt1Q1njX+SERMgRAE=zse6Ehx6_IPahLtQ_;*2<(>$Qr&V_Ml}7w2`kgs zbsD8Vtoa*Mun*$JEz@S?x*%w!=ig5#7IF0BA&P@11yig{-FB9Sv_Jq~QBeq$6i7nj zN_ms_T|bIjPB2Y_(+p$2GME=T2uA%(tUMRS>_G~ihB}ic*KS-@QBfJ#Li5Veexs@1 z{p>kgFYQQ`hM=SuGOsS@fo;wbbJ7Fxtg>4G?xq3QP{+Ye_V03R25a@Iuy8wOftBSA zIDtt%y-WI*%PrWVm5I6Q8P9(wVVEv+iB9f;Mg-USFEEev+({PcTnSW)zMlG1GaW55_QEVJYRsGhn4zU(89zpIQdHGCpj)st>x@2u}eirI=5j90=jChZOMiN6y0lzyR#D z+g@Okm91JX?QrUFp-9YpXV?1(^6aN+kA%mC>z2bM01irFd8M|v(*^=^1TxYu#O?RV z_I>ju@a}g4M`E}sZR?$L?F8p>npuIMtO%vvi?W3yG@6R!Y{}SzeNiNSYxeg^c7c&g zrVV6A=91dg7P`KSVW9ipW-u}!H5O+iXfLR&JdPn-l-j&8 zkBp3r2M~{^*?Q^D43?CT^q82lV?iL=7xUqRm6~-CP6RxhSP-shGg8b4o4*;Y?qqPI ztbL}T>*~Uqxa5KW<^+RC=`U+b_xbfko75ovHE`_*=NuT-#x#X8cYwo(N9l@1eq&Mf zlCa_;8}IZnYX|aJ)xbmp=nX8F2J@_g&h!bB0PMw-)}0=-{8VF8zRE7BTONy%#T@|N z9EakBr&YvFr1Pd}=Y@Yg8#_btU`0LWNwYuh(pb$}8uD8Q|({I^!jf#X5o%mF*s z9+_rdNGgnrq!cu*druYhrVWAzin^OOe{ySYv$(wSMwS9Gy1Tt@-SeP zW4>#{QYu|JOo?Oa$NxgXaD^s6F|56scFOD)MPIP}Wz&cw0MLwkCtfc{AUdEoLG;jR zm*+x|Hn!QK#tT(Ptr+)8HqYT82&M;=qK@s(C0Ndq8>sOBuBV|3DkA~f=XR}K8n3B< z&!Gev^pb7~VK3EWIJDLVQv4LDARh=|h-$!jtr^D33vGyn4x!U33rH1?MJ#mJ3(fvN zhU||tOsexpZv8nl*o`}A2PzOcTgxqQjz5Yq4+hTLay|DZPmCL>!?axB(Zj%gt%iBv z51Jrw4#>dq$8n2tR(@mpAcS9ReFt_Ebs3mxFK$9e1w%Nldkf*1+ySGxeINJFDEzIl zVX4h6O!<5B3{n-wUNPn1FWSclCxUfRp1`Z%`N8^ykq|(g7|ZNZKuwla{QG1#eoHgl zsbAAZxkN69Jy~t>O+Q{ks{y-3p0wl(+@01Yp#2kAsb2+MVBizB7Tl?f{DPXqq5rAz zSm@ra-sipfQN=>J%2d(G@kHUKZ*Oev5ZF!NY5{1l`R$Q|sIUdZt}y9r{J8bt%5xCm ze^aNoPcc>WbxcN(=&}V3VF|m{QA*+YGfPQys(^(s!lMDSxNnB(l^D^NqT6eceD$VQ<38rz?VrA6|5IIE1+bow{#{TCpp=)&0%}->o7J+dVHh-o^1c%w~{XJrt z{{>N*vkXv1gG@Dm+6Ks=wF6;&`#$9c#%5+I%Y+I&roS#+0;6_T3-wTU;J`up1RH%M zDx?CfP|$a)U8LxE%OYq1^wNTkd=nKA-)dKzPh*amExw`aQQFWh#P$(z*jzQUMeANG zbB6oKzaS{=gF^$i-5&f=L1@o6`0o?XgZ38%2}#vA zf8R8u59iho=NB9V#8Y^9Ax+0%8d5Ne^SUr_i3AR|Qo|0&t3!a!VJb2J6`3Olab#mg zAt)5l^P6c!;q0rhRzL1I&#r%Hzg0v4_Lwr{w!2sNzz%l<+ZGx2UBSXb4sObK;5$|J|4&h;2LW!1y}&*4wkGP6c&_DQvvIMxUb z^AE>n?!w|c0$*7OdIl`&b7?aln_5mm44X6&nSXu~I{}JJP%Stv=qZwJ9hli+NnTo@ zCn41`1pvlCmsbN&1n#&4exb5IAe=JMv*M=1244;|Mql}_?xwrc0`^N$TB#5Ge|w(g4Fl3Ddj8N(&{4A!>cgj!#ZLhM65J+`oB1y-*+eO9Vg z0MT2u!i^tR1d2fL7n1&E>FHbg#kBM3-#;fF0hv)Al$@l)*61r)mr~t+UId(1+XdPw ztYql|)={bF;$y|4nTHFvetI}?uPy^5oa9puKCXEFJWz@;Eimjz3Hmx3vYtby+=Vtf zW=!30edKCKE-yp=vru(UK~c=u+AXCW_XUlL1Y~1Mzi@JFnlrk8>WcZYy^jm<1AJLb7u;tqnl75|yck8(wBk2v8F&R8E37 z7tZLB@!q?#%430Pfu^?1xUDOyV3@k_cvFT|nh=CTG7w;cxt9TC+zS2uQ|dBp*|Z8;#;Z=? z;Tl$Z05F1QT^)vs!v>+C@N)mbVcZH#PFDe+bRckJp{Ig=d#WjvUPU4 zcXxyBOBgh-NvT1bed@NL#+5l|OhaQ)DdeDangBJ&uBY?}2+Mr*k@vYC0>^KtE7$d_ zuO@!g5Oo%fYXZ8lk)W+$M}70!Gb`&_*p-%=c(;4+e-B;?=tqIY@GY>RMUzy3gU5Ru z5o0Mk<{ApLZo(zw&_$q+_36?uX{ELu_}e>;FBqCAfFgYT%Y*mrB?#}}NH=pJZF2j- z8hJQ5?bYTtH#etL{1oNUJN5HPuw_Jr%cK}h9X9s{pSdGePemyF^UU)Ga3u7X+3T4U zTiv-ilK-^i^D=l*D=k6Z%NBH;O(m5tto!1OEgS{u7>o2pa^Z3$IsVgh86*8YZWJZX zKfitOOaxOQ*YMKr0N3WyZeOMW;8Ho|FSj5-q0;gF4SN>Azn%Six=3)q>M6t8Z8_A; zE!fZ+=&%KV$lpES2I{sz?z=GQEzr(~OnU|d)Yk4V<+}p`dDdqfh!Y*U;Jjxk?9k(O zhI1cH_>)KVU*6hs|4$1rO~1l%A_tACVwwWYT*+l6x~bhK4xx$;rcY6|0MqhjsxmcF z>cM@A(5o-=6Uqm&CqQqfHC+4%Nl%v{=gJc6;!E5pc{*($Bb6;&&;zU#*BR3sZg{BSP|=S$hDu$^l+G{K-u z%8URN;R>KaMPDhg@0rj>^&A7;xInA`@-mQ!2YIvmYkWMCHkASLzM2?9JvA^4 z`Bz&T^Vge;llAptV9wG#aJ0XJB1awW%gk)ydR~wHwtuym1{#j!gF&qW_O_7?I7@O^7`F@nCaa$A+$W6}QczRtBq4H=6 zr`K9ak!3&e$7W$WmGzxCG-Ezpo#bd(1YFuVZLVL*EN{N%~CaHZ~lLy?u@40kShm{d)>>K{c3qupI=rN)JKhs+F4-lMcg+LZ?$eO@vpzN4oy0t{ z8%wTQ(4~EB0gx(dcr+6wZNIAVSsK^9XFPorJ>SLFVE*h;Epx&R6KEva#-u2nnae6( z)Y$0xb4`svhgad^$<|Cya`jb4zUh;sUzF5~@#=LFE)t_uBp-6!Di8+^OT{b}D5E5j zk5Uy?F84+4O2UUT;*7Q}Vei+;4IOh2uU-94=$TsXJo1PH@{s}S+?Obo_&I7}ae6Eq zpLR(a`Xr&YH`c%0UGR3gASD?-Qv9Mbz2Opp2w)HoX?o0`?IL69oaSwK^J2|$I{jaA zVhMru?D}7x_MOs&+n)ah5JP88tIJVhPWW=Sc;fHTX}@?MIhIOB3HNlrN1Gorw}rn@@<$i+seXvWLWv|ApqWI>07*XNUuR9%qW z+1iN$mO&e-=FUUkUj4=6Q+AHA2xqUy*V;wTE=ZzR|Bg)p#0i) z3nw%LH6ROb@u2ie?#7ewc-?$iHX8$Y-gG9@Y#;)PYxlT~YAR(~M6ApGH1~>}_tzIGX73`7UkAAq?=DV3M!!PH?6S1>oI@+lwP5p|>3L zRVxbwc_J=uyhs^E<$KESeZ7Glj1^5oZZkSMs%WWACeL-)v-(^5?jih}u`d{oWR@GK zDg#C<;rk6#|3($Nar?2#lkOqDMJYbdnf)!p|3czciUcKQ@4xgdV%aBKH`$V2_qEsJ zt}e?D6&|M^Oy+D?r!oWY=5%M06`Jy;*Sy2C#S66olK2c99!f-jXxe^wQz_@^1e$`YZ%&4C@vY$Jipp^fRp43{e8XOD?nCacOCyu}I|1$qu~${uKZ4pCZe4xNAC~?_s)@O^BeI^a_RW5-7rrk>wmC>E& z2T_d$bpt8DDgug3JJwXhbOfZ~Kn!k(UFBBB$`BEMLr~&42(pzJ+@4a-Ph~32f6aRQ z5dTXhCw@YcoX#|epO}Q-eU20vQ{qIN^i{&ol3ste3d_NRn>Pj^Wf`q z8FM!9bv#nO5`f!j_1QQ|x1SKNbE$5smt`o=0=$~rZa``R9@7lD>#M=|YyG2uG^LT1 zzHyAl8gN@7*(Hw>l5gq>vfStMnc}M{v;#aPs40qTNE5e;K~=pcDtNC<3S2d_#TE=3 zH9qQll-Qg^$C7ibN!yFi(!vi{E##;Hlm7Q9Za)`eEc5al1xEJ!!wk5NK^woG7u!|$ zB9C4%Hb=hlTp1H05Ovd(eqc(6gFQxi|8Cmacc}u5FW3sfjy6$QW6-|RDjwL;MyuNPI+ZU_`M;KR`^MtoBrE8U{3YYlN^|t;`vxmNSn*7o_Z9HVf1*-(q`e^`X2H&PSW^3(@H+T zSqGkN?B;z_+V}FP%J8ZPs(MJ6;0m%A6$#w3PMux{pfI~8n`NyOUZ3vu>Kn?p=f#?eByZWg^XQRRd<6M9a6Nht3dEv0h{QT(At4=iePJ%KuXKr>ZU5C#V!ETui?+ed{+u zvOe7L0FKgbSPj|udhml2kC124a=pad5_e6YmY@d+MbGTIFj85~_ zx-hE=vE-FQo|tmMHnUJ)!1|1_LSR(bHs(cdHfg13?+JUna;w{|?k_Yq-E&_*M|f-| zqKM9Nc6b`J(N&>|WhKE|sq@_A5d;u&@_1P6(-2`PfHsym%=j~7*lTgxS|9dW+G|-o zTxmsRgU2xosv9WNL+QEP6J!C>2f*ZHur5-ulMwb?VUbv`Vr}+&ch|28)5p~dW{9Ti zGjHxh%_~H%Et>@4J0b-!2`!IC$W6VyV$XvjS_8RAh&UJ7~_K>>k<~_MoHq3@_S$$ z#g-^BlcO!zRA5qP6fhqsXftM4+1snU>LdM8<%$2Ab(3XKSH+GcAg8f&3TS__$^R;y z!MC$`{Jj`xzupzK8tAc<-dP9pv`%6=Li-?`&+jVXAX8BL zcj^Bl(&d1_Clh&NWD@_$^3k!OWN!aoAA7tCOo+%(A{Y%wE2)dhK!A{WKVcH>ats)gHQgm{77D2yr#TreBrVp+kpJ$~RekDNHBbo!Ta6PUnCDao~Y@ zQZhElTs?RfR3vNPS^JA7bp&cHosPUZJ|Rrh{CE$>7Kqk*N++JkCkU|%0v0F2HC-cJ zFaGI9MbNg%_;M+3fnAR^Zcahv01RiK;TE}xZfBo#L8SkfG3j`!p7ZKY`sA59*UnC{ zo!VjDKHrhCAIGe`?VV~L=4*>BthLnR_pdoGc5%H#FTSAjU}kvIDqz%ead6VDp6Bdk z4gY)2K62(U2CU9RM2V?Ufs`sAWM=kAZf3!($bZq6 zlW-oZumTULt9Eb88lT(3O~!xzyt4+Z0H?%YaSPcxrpp1b**Z?I4MoC>?}_|{{s-jFKV-@H%}*dnAUoZ2;a}5qH$0ixM@NA{LOjzqu#dEik#+g9xhOY zpUW-knH8@uwI)Hi_e@>5KiEzNofnHSw)7vssDX+<_NwZw6x}hjR<|=n0H*kgk0ykBQ+1%QVM|CInzl0J)=@FDe=0QS*OTw#p<>>L^zxH6hM;G}Qp1!F8nYgDoAGHH2 zpYKp#gERfXdv5$%wc4TwJ1;MMXGrLhK=#L!K2&}xj>_tgb4>Y}2F|gDypZny2!eJN z0%G2ycuf!G%l8<7+t0x^{3Y1TUuo$>L3U~cJg!I|^N(~_bLqYdrr$h!s!wd)_$ ze+I0?O2oePiuit|FAuGSzva>PjYYS<+0ihkS_>lWu3@GU&KIzx8+EII7{mF%$F}=( zD8JPfu`+~XFmu{d%Y(a4e2eP3v*ME;pp><%)Ib+JGf-%*V7JL!I`oon=$kQZdVQ@! z#Zo6Ro+xoEV;K67*8?H~mvx!==YAW>i;)n+d>jy#&J`ez#{~eVT0GFR@p}~$JkQn8 zKpbub$0;1==s#E1y<|ra;fE`*Zq^o;WH3S5w?GB-O&36{Dg8(jN~llm6lKZ=PaBsL`03jf}jqGy-UP2PTw z8Ub=Pv(s+n;UtF_!K0_aL1Z4CTFFEP=7J~1kBv?3!lTqtag+4;Q`LFCfoMNj*%#+Y zw(UGT?8>WZFNimP20BmFCZ^t9BtEKoe2uW8Tr`Zb6nAM*9z5b5l1{e;lP~g3a{6um zz2L!fR5>!&6rm)w#r9BQMNhZeeH;{tyh>g_ce|}8slAv5HYJxU4{GhhjjzM_$fw0s zL`M5!={Cu_dLz9hRs8-p4&27nCUJskzk?6zjh_I?D(oetLs=?^6Q}trFG}DU*ZAIQPa18yp_LcQ` z!(4miEJ|IHD!0A!Sp7kS_z3oIM~gL#KxdQ;bz(qY>B$$rqXm!ArA{K}5wUeZt!{m_ zi*IqVMHHR?rdA0rn3BRkCl`P9+O^TQvS^>R$8X-6If|@z%kSK%T5s=I_JfZrZA6(! z{%(j$44$>xn!#BH*{em~3FSk_wF|p$A0c-p;UXKQr*lr$0PeHL}c{DN2FLcmP64#u6DCzu`^_MU45s>||WYi}6t z??sLVs=WcXocEIFXVmtP*9f74{K32?#$9O}bY2N!f{0SlH^7r_4xd|8bYY8C=R=Mh zugwBioiP*M&Vk9~KOI}Zh^+HQqGBUmov(dMqEosDo^jV4Yu_yb?*kqo&TW7FhS%aI zrJZKkgy9|q$J`p<0XyHBF7FUQaR(7+7HUw+T5P~>pJ1YJ_Lj=Mdv??~2Ozr3C@G6u zzotW_Sz?wg9S7!L-Z+51D#g5Ig|CsiF34hM+JbKLI+O5-(vEEJzGMsLr!CyYo;;#_c>oEKKAp?i1rGGzWpo?VOxBkgp z)BwjOu^ifKw48<0b8{{f*$wh5Y_E)q1SK`<R-5v9T>LS0j}malA_nc#7enD)u0zA z7b%8w`$|jes`I`l$H-qe^f|*A=J_oTwpU_-?^Lt{bNe*;qUxay_5o`S`HNcL6cMCL zV$y^5x|muxbQ-rBLwA@e(p~SuK&h#2N{=!GV(NA=iw>{g0gw@3C9C|t+f{<0MbXtj z2<%#$EEY6%xRhu3*>8Ed9ELN>4v-!?s(XpaX3a7z21B`Wcr-9)oHR}4U0O&FjNZ}N z4Z@jM*eizlS2p{xL30ZXo3zf0#|=g_NKlejT<-QNAfN=OTU``PyI0P!-^M>Am?f(P z@?dEr>+-j>OCNYqPmD!P(d7y0I-hJzRa6hg3?74dvi3pY)B1j+>)~nWm90GnXa(Vl z`cl4l4!#2lda@exP)B4D$^wlydQ~IEN6gFdjJA+9OUQcfduJr(k$KTfApc2Zx_RJU z(>DY~X*d`nl3K>i9JtVZPjM^+LyeMFZ5{&+xBFY)6nXUVp-e82@QW^oj@~V-TS>Y> z0M}!)hw?=?93=@3bshXpcF7?Wa_@V);vI8%9?`set`2zK2h{i9%!}nD{-Rq~S5-6& zRDjcC-<~zxDY}ft91I8JF^A56%b3H+cN|qS3e+e=z1q3B(bE*wJfe$w3zM(*LsE=h z4)3o({s(da&tX(HS*Zp4I(J=;LHg52h}jq5C|*)K`ry~2;$f+pH7*N$lBKE+!2gH+ zHMETdT6y^lGjsD|Fgd5E_}Q@hf*qf+v51oN;K>MsBz`b}gT*5t2nDB+6N_#`9NQ|q zqFnQiPjfuShM5G)Rc9gwob;u!FB3s4)DafX)gLErX#@nBb36=21QFt4pTio;p1L2P zd-M8mV^B|8XJ&Dj+l!7>_zU*qoBP!|rdi>UrwcIfaREN|tJ#3-TSaNqV1%qCk8gV_ z=dYgG{2Df(t2(3$d0z`gw(Mqne+dDaCRC7eSvPbJ1kOezN(KhXFz1Hpwqm2O9dA+< zG(qG*3O-=9AFa+8)7tuQ?||$pQvgQJcQ88|Emown8K?+7nP(PWDo2w!m@C0dz#Xdi zE`m;9d|gt->RBB#Ith~R#GPdINKft}=#cWBg%BFyiz8zSjQJ%D&D{lqC3%L4#XIW3 zMoY%B)A@mExf|M_j(~pAHkfD0jO{n#dQEH-=579&$6EfH)#Y*;H_bz7hu~QX21+4e zZ8)wzj6^_}+<{&nw@f!?d19L0+g{8091hz6cw$aXIXF4r*Cj!wg8RtC^uk^2*TLB6 zU+o_yGPkeIQwE2a+N%1#ZBq{#m_v%xtejT$A@B@qG*O1+-Urm_ZQlXHAi}Th(jL&sap=UoVrUZ;kDe zc2u1VGnqUA!i&X7NB4qin+0Fj&8kZQyVF=1{XVPvj<3GyYBFe}cAdtnqr0w!?;MMNUeT6R z&!KFkg&NU@{W;8bKA4_TYUa`wlZ7dTU{!~`MyJ70RNSRr{+|06a)qNoLkXz{z5h7p zc0MdCE`1;3sJH~24|v4Bni=%zkGlRH#QKX_ZP5>Ei?IB-o_Cz0CC^-RpM5pjfx@g& zr+UOP(iC@G4$>U( zOnhDpYc|z@AXf|15KaN*ziqO71CtVWwCjb9AkM%^1j+?2=QJig+(>ouOuv6pkq{>x^<8=(znJn z!!F^Y88UEutbP-dnhT(^eIlw#b;20jmBS`1Sqj0x8^UThnoZ#Moqd+*bSwj0yB9;w z4ie`~2}*lX_*moUlYB=cfHI#E|B)Cd(I*kXK#y>SV4#-`g^e+Wa|&L?7~{ar5~>}3 z0hD+Z2Emx;^}pU~WfePKFEAWb2waP}s5)vTeEG6U4-TjQ2s=)~Z{0Fwb{OjX#Onv8eO;bvPWQayUG63L4U4W%am7LkSb-j?1{uQ95LeSRBmz!kexL?m*=qE$Jw#*@pT*zQ2A% z!E{v{z2CXzUE@%E@aL^UwoQB|r(k(x5K4HBvCY5Hd`5G<(i z2s3{$*s0u{1XdN;wTvTh+tJXsV|1;FN0`5J)4EAJ$EKbdJ!gP&IP6i{)zYl=kz_0K zBmRVHjasVuro%=}`_w_HUMyNzVG5H|EA!ImUA&?@`Sj7!Z$c5GW6r*2PPNDve!IZh zST9g;Az|~o(F%|WwjOR*m|`MY6{F@{Qk39Z$Tm{AGl*?B_I-srAP)PadY0@i1@ zn+kDOi=`c>Reh9sAj*3^s_$%@4jCV#A%^T`Lmh6D;~M@U9I4@-4KbYNp7ph|eg!F3 z$EHR``V+rJ@FQnW64npFMFuAd2awGatB`B(XDCz@y1M+5Lvevok%cwG63DpV^@WOV zY4_7T#eRJs)w3VqSYu--UY~aEJZc@eo+s$U_`70KyJBWBjA^jW&m1OF-mtfC3NAbs za&ONwUp_Esk<1c}pvi(Qe#%v!HJ+|s)SSEmzW<+*nG+cJ%Cl!>^E$TGzFnImqL5we zhvAY~%OHxVX-NQ3l9>r6oR|1589<@&x#%~bQoRUyX;UO`hm_meJ&RHy|v2Vb_B*>03_cRNS^tOR>I z4B=ZLrCZU$c3k+obmMU03BO}HIqZtZ!!Pw>*6@C2mRMGS;$iknZy{C%?v!OGQ#$&s zO>*D|(Rpm#sksh9Bs1_i#lD(%S!fp#mkkoMpWU-LPRdx@Td+*RVXtu_z(5{Z{=TBV z5DMHQ?u|sm6l~p*wsRQo+=) z08GFHfb}kx7FF)i{g(5{EbccTU0oO_WqT?*m+~g;XMRx?+cHqAa}VN=N||W7*3gNt zAqfOo1(IHY!0Bjo`uuK!DUd7je=^Drn_S#Tws25f(?@lY99-*cvaa}VYt=8SUIGU$ zw*p^YK?BCn8 zJdbBJY3Z^~4GSD-IG9jLUt2@Wxytz}^*jolix)K=(GYP436EGue=rQ0`#DiJo0Mie z+72os;kHxkPnVEmATJ-mzmv#9WE=Xq8_pm2Q5hsLIE*d4T6K?cc@nL0GLtWY{hICB zyAIm;bwR%U;VIKQ^~@Vu4CbhxLko%@>w{o81)raLUo~RktFYN2$;(D^^kPQ(R*3#fR z=4Ey)RhJ9CnNP|_DJ!(9MB$fei+_IVZUa{>k4Q9v4doy9c5GX8^+B4V6Nmp4q7O3x z_LHaS>6*S2?Z^0wV9In(6;E#qveWCdys0B7F8aTyvmJmdmM_iwk9Yy!a|(zcwuq&B z_G`#{MICz^dX`_Gc}!||@@iO+4`cQ?l3{C`vS8fpsF8#Qd8#ST{VX3e@qT#l2Dj0N!lG< zSdTuLa%?XLljH1o_xpK)DL{?R`zU6P$21rQQIsu#CTBbRV?^Js-PquVeMr~x&;Fs3 z=jeYtf2?x|bo%v2>U_oS?FP++Oiuzmpp2u=TvtT{#4$wc3dz2$r)EHK9J$n z7GvubF-I({d5|OngJNxl*Sw5TW}-tn!Kn!nUTA6eA3)}hh)Rx6L)Ykl_&Z7%cWNS7 zOT2Ex;=G-l`BU6amN zb;3Sd-+*oT@4_+-SNHk)UKt`3sZW z(hr7RMjXfnu=!xb6Tj-mllzr`(gl`Hd%lOK)dScfZY07 zMV^f=@;rq#yM_NZ`3wjturLj1s)}q$v0v|wOb&*;iqaa-e$!!Oz)y;wR0q+)8uY^- zM#eN!@!Kn?#=&pj5iklVnSuTlCOu8wBOY~O$k%ZA_!HciXB@aIU^GkuPzXw_`=C#= zNuHcH%&z0iJPhL-#m8c)$OmV=Ng#Y>#7R7-D{{@!pLC5o0wgQP3J2Vb@(qgwfbS@} zT3{F478HoFK4FN0{9t;<BO1b?4gS<22($63=);dn3M29t&~+a`+i$(OMG&i>{ank3H!4%102IE2>Pv8?8DR~$>2hKpo1@;MdIp?jd^7K5ZBCI_otK+L58j3k~Sw_- zj#`1rP16$xD`!DT=F<(Fp&OHjcEE3Se8c6yGUSdl-R;?r2D;HAg_R+0IgkF~F{VeK ziqJvafeq@o#!H+`aSPr5DScJma z_#GF}ueKJ=^*S(jA$kfA@o_f!jvkNOloAwGbeP?$?!U z%hcGiTg~4S(fAlPID=|L^yQYRi0elE@;IqhzoFF}rs4EL1a;5P*GlyKsB41>AzjZaWSJE4@;FIUFYP?p9`t{>=Vt`KJ_m*G)MP50Q(B z&Q%-xwUjeRf`P>-T79;KQ)zwYx%vvSY4YdlHf-E|Z`AqX%~la=q1)BrLjmQz)DtEp z-Ot=qjf^-brY`oG&}5-ss6Mg+(3@DjX$&)Tmn0sVL4f6rt%=I36?3m$CT`oU=t z4X`dr83o}eyy!zn$sW0M?s3OUHHGtV=Uc(2j&DPh0h6HHe#{Y(pZ}rz*dS({>$9CY z_9QO$eF@NsmAVhuL)PI3QE(UCGwN93&Xr-8|UNBAnKJ`901 zD_tH!LS0^+mh0ci3Dn)2RDE=oJ$3`x8$Xe$c5e2X>+r&XK6!Gv@JrF7z+-TVDF7S1 zSN6?t8dXYD{u55U{dJaaBcqlTSitJ~mx^vBQbS-YuSVIQb!fHh}C0bD+w z@yyKYPFPp~xR&_CVXM%YzTrYazGsNVlG%rZ4d`t-tJ|uMy~VD&4|}1j!-D1Q1N9J{ zBphzk@UCI^ib*d4#hyLGtI5TDy3K^hrF*xw z{9`j+8XDIIin$J*1lyzNZ$^j&6aZu>7Z$2aiq?3+vR=+=g(`?G;`_2%q~GH5XDr_; zsWuBHV{G{!6Unw}d^?|lA+!1EkrrB>K)BtsmHjF8$I${(zwO}a(+bBV|7#(U8c6b4 z7gsarIMo#r#`#K^L(*6|-#K-2ZLR_TnattLt)O@CLy#!*ZY&_nl&^kN)LV4{or$Pi zF|Yf4GvhxkV7y;$;u=l9E&73--}vL6`t!4#aHJ)6aEq3Zacsb1_rNseOrR1BrbgosE; zsDK~{C`zZKfYKqY0t!fXHzM67-5ZdUPC;n}C8d$>-Zbnxx92_Q{lE8jKi~C5JjcCR z>sik;bIdVzJ2x6$7385anbhtH4r|c`JY(R}@v3z8xH<^f^nb3M;;+~P+`7(|+Qyvh zVd=Z^y+LbJdm)s%+wHX`F__kNw6&f}+k z(-22K`sW5An<1zRU|^x<$3}+g+-9t@>kMx{`(3W~O!(owlhV9@ z=DR@biCsopq_D6--e{$awIOWKQd5|EZJ}`M_ddRUty8@_ z!jtC7WkiSql`BrwsqJc7z47xM<5Ze**wk3-7T>bcraHrV-lxEz(;W*3|;9g8cn zoLwULN`sEI9t=@*kboRT2zrP4L=(a?4H13nfgBC zN%3%Hg0SUKY0d;i#a;n7&(4rkBMiY;C59jSMd%)_X~m6?e_^H8te#7XvfJsX{T}-C zNSZNqZRGF4fj_qxo_Up6!Cy^|cJ+68zK)K;FinK;c~9f<;Z+jKsiA&U{8fh_0^kR~ zqQO#J;dk&MB=nvZU72ek9jeIQpp{Q*pLR>HO3p6s5<;*qJ-hqjz`0$N$Ck9usJYX$ zgvEXFp_?Z~y5?GDg^$8%4l3kdvs#++q)<0B_&@zzSY@@Gz{Y!EP?fytmM5Eo`a=}) zpZ#*vp_MOfNaQ#shlV#jPj-RTDo}!_5PfWtzk6g2vhrPTmEijKYd2lKD91|N6I zuG(Jk4}~;3>QimC*{?#?q5p2z@EdX0O3;q~DD5lX`Ch5O!lS>U9|;GC-djSs4~*Bn zL18~GtupSvV+_OW|M?hGLM*CI$pi)nna(5aPgoRK)QghV_km?XC-kc{V{-J-K3d=~ zz-SwW_5S;-+J&mFJ&Jo<_c!M7pS}F~B{Kky=Xtteu;bM>q;dbb2-UrC20}Y%FZ{(+ zdYJS#Y!UvKe*qvDZ9W_SfBff_pxgg* zDFz3cHB zL|@5>mWjeMd5;Wrk%o_SPoMDp^PTW#w%P|3g)gIbN2;n^`D*>uwa1I$<`OiM;?%<` zl*`P>G7PSz!HIV!Kdu1zq zz#d2wGuf<`jIUFHU*7-ugln>iLhk=OS43TwMv%o@ql3ch-?fCPcU`r$?=9Rfye%$1 zmq+O0)atf9Jg`RM_x`_EM@Sz-8rLc3AkNEnkeJIDZ4I>DyJ}3iIIpTPGlO@TnAi}X zz4)@Om6ggDy)P}k$bY{U{nN&6V<8;QfA9bAAMU5! z`Dac4{F!0f?D^q;Ki7waY4Sh+=C%wOJ|f_M{t=VT|F2)HBLq31qJSZqgYo~`lGw0I(K5I=#JI(-%F}kSC%m^trTN%4~)%h5Uo!VQ` zW~*MAbo;gx*7iPbcndI$Zbkq1O%oF<<~!L2S&+(kFkR(tzbco@=$2|_GjrheKWp$_ zsT=C&zLw6>2G!My_<8@kLQ1`Km?jfLV{|RXK7@I+r2nrKebD(3=7z+WsHv$1<&z0ix>rq>EqgWrsT0-*WmaB;eRKv zy4(ZVz9^ufLEquuR|H)OnL-dwZKk+I@_{ zCY$QHENXF5@1t5;T80oWj&Io6zprgF1~S%<{?nuOf)#RgzGs?bl$5m+u)8=OAi3qC zEs)a-L(gJLcrUkMcP6emqX|ohgbqcNR)OXx3i22p?Khu2F`S){E2@_W39r97Iy|I5 z=H=p2b3WK$?deJptn>BvU+qHHJ4Fe~$%)NZS5>ut=MwvOCmDYuVL_~${G8FXGhs6} zo~R93DSzDOgXa97%+im+q& z^UPF1b(12K&H4LlQVY&-VVXfhlM?47I7)`r2yw0!t@6K8h1_bDtAL=f_iJx&@6K+a zR@EF3Rdr4hHW%{SZBFXE!>5Q`Dg#0Y^`TJ{*wcFsEE zIR9)A;t4kn4H0TuIYzDJBvHh-Hn%Kwk>p8WHVR*dF;ZSLc6H1(_WV{BW?x-k@QD#` zkOcm$RE4106PY}^?kL*;)?Yi>)z6{Ur9!K+J6GHXcHP$;oIwTF`dUG)662$P%(&i!Ty@ zZD5^&45bka#QZ$2BpAY5HaLYc82)5NvGK&~0+s>r0C3nYDI7r~5KVx((}X&cPfY`2 zlG>TkVQyuQZ}k5dnv6%0#!`eKu~VLwycNRA0u~k)I{BnzWMl;`%TK_RcU?3Y`j{v0 zIW&ojP;?tF))RIcN#eEHbM1$19|?O!7v{0kw2U(Qh9iIzsuO00=YRXt${~|Ffx56X zN!VroBbuXG3D^p#cQj$(J;fZuoIS1W7*SODPGJmxVXQL6W{igJo&%O* z4^DbfoJdIQuKXn}{#XTgOqcs}W#N>QEBzY=DPB#mAGngfgF5GC`#C<4cQm4mc=787 z=GT>LEEG545N2P^uk0zH)rZiK>9R-+$Az~ShjA74oaRZFM=J`9MM6AXpgXn$ycgYY z{tH>kN{j478Z4%S{#ZIvR!tS0K5Tu$mD8hLMh!9#|7P76!In1|-=vw0DcU_+m<8X7Pi2EfV&|WRuvQd z;0>cC2J)1pfE*@6%Z*mZm8TOa$yD#S{YvM|1!|V!!#8a1-axw~G!HM&Dhv|HUQ^Jk zv6f)}$u>6G_zQc0NN_K_9Js!A&|oXOzs7+Ja^eFO7?QAe|%|;dY zw&er`$gZ)PFww{hCN9}mW6{TpsavF#qs90wBKREonFc^VSo?}nAt5+_7Wgq0Qh`Y* zy&&7{%M4g$M!eF}WavIg!#dcFnQNh$!uCE9DPSxln?}PX(3cM|J_NeB>W_L&x~YF&T9Vz$H&$Mkje5LncIl_K(G$ok zD(!8PN{g1Yw|__6uCsrm{L=36UA6M}(aaHOgY>@Rq2aM7-@_h3H{dGe1($x*zi*9f zrks~zTJ1{5&VF0aPwFzJ;4^%A07)>gEN!Rx#>Fj^ikD66Y>AqjoSa!sp}EpS6w8jq z?nW+cT6lQ)U#EEJAm}jw_ZeWHHkb>Bq+Rb8G=<=? zTolR2VwQ)d%!oSMMouyr>eq_+PzPHG`M3X2KVGXTVA3*+2KjoRj=nsD2qID$pD z243m21dX|mNxXJye&Z5Zua1-=hf{Uj(2F7PEY@f{d1N6)$Yp6KErdvub0$fMwou?kSscZ>x{s;e?eE}Zk6eX z5|MVyU1dphF`WYZaJDl=x-BR?&UxX`gm=fWujaqNch(3B4VB}3R6;> z_RtV%?@(~%=)xEv*P&*`zGPQzTw;tiMk(NouP^afP z@KICY&pxm*ND#v{D@fNl8zCXzm1mLq+VJW&9o=Qdsz^%D;`Hkt1DeXWgB-XQ79jT0QkN;#BAa@C(MJnyX8{h;4O}(1z`_oil>*m49lVl$ubq;Y zU-oLjtaDDVF>^!~yl=B_j;E!JxdCLm!XdFZz|ele{g>WC zdO!~<$X#BSzFtEyTiSN|3s`C(7Jy5AebhyXK)aPlkhDWjL?)IwVeYfyn_EBH@}T^0 zeY|IUCir^@`NEEtSgF|F_)o0g8@`OWa-DS}#(F-9nNaTby)|FT=My(mMEzRqN>!Rm z>M%{pc^cx!`5=4fy|dPStwJPdOL1~?QY@5K_`DwCIHwXcMQLB{SU9_$5H-yW*1yIo z-sTo$6VVEN#58%6w$81I$M@=+UdZ%~l5_CX2A~bb_Xw8hBx<}ZzN!YIxd1lq{AjZ= z7ydH06MHvrDO$HjiXsibAWU60<}=kBVKv*<2~9`ygJU4+U7io7cxcd*#5)rVxTH?- z0DlaVc-_A5lcy@D;i@3pWII^Se{)(gj+W{X<@M`1m|Hq78Ckl?BIrlX2#&+Lu(A-T zWVE|3jZu*y6|E{#FWsjB3^d&ZK*Z9rJ=WORNQ-D*yJ2GKT5{}^cI>^CeS9BPjDA=I z1l}w8`WJr~t)iL#!7Ji4z$Z!6PYei>|?EaJ)+ZNjczV(G$$_!1_ybvuQAL0XuGldcI@2( zZa=ZRzTVFsDn^kYJMGZ1=VFG3K*nO{D33P92EP4=Nul>g6!|x!Ti%%a4nj1d3_Cji zwr0P9oxtomo|*f&_Q zy}rsqE>U9@sm))dVpT*IeOUqXeA?KMeLO7_%p4uz8n?S>*6_1s9Dl#SY^<`=tYzod z$S&|3Gaga@Y;y&v0uHMgaakmf0L-KDRij{}iKOB+8sO6yiav@@s*rNHxervI%4j+B zV>WYdVB*BCggaYsRi2=W6kRVgUJ;teC&`bhn%s1b)|^wp{CY!FRJ2Ei4-X&zRFjoP z@%Q2P`1ttJw)yn*^jVcBI$G<>@|+?lb>MT+OyaScDM!E7__+&e>NlTDR#*VPQx*i8 z=m@MIsc=^SsCwNRVcSU;dF+q8F$8f$^gt&)9)ftq8)=BGLhe(Cy#!&_U9=QN^%$sb zAx}pkG?Bd~Ck8KM9w@saVDCsMgNfb*r)yg(TmU z;Hd83+i_%DWS5xM8SDz2rGwt-D&&q z!THlxBP1oYcy4`J(r84}UETU>SaxFK=87$&fMDFg#RrS!nU#~cIl1hCF~U_}6LdYc zndPj?W<`>orZD#9^ zx3~PVu`S*;rZiwOT|8*gpZ~O6YNBIB>Al7|_R7GK*1~Da-J&0+XNQY)qq^1ER^9US za?$BF#r>3RK>2r|Lyu*Mik(j}^+lg0a>W$s)Zr1=NZq-N;9gSJ#2Q%E;Vtx@{Hr29 zR}MM2>>U=?dsA9VXoZcxV7|`eg-%#W!8``Cb@~$Lq5J2_5JFm^;Ga7^;2p#UcJ$fV zi*pBe9+zXQpPcF_DEx3jCm~;d;N7@YPT^a81@(r15`MKI(2O6SLI8`rYSy;xhejhg zPcAa6<}cBif!{A$)I)Q{-P0%&uWx9u4UqfEuZShAn`vI8LoSi;v@;dTg;NR zZTA;r2(@+qf87bBvm76HC!p?9AZB|_0WIPp8lB*zD-u#9*!h$$;iZjSd%##URQIDa zzp40)kb5=e%Qb{SMM1956ED(=XX!F?u)ETP-X-mv9zCU??Ug-0$`_6E-|WG5HG(uz zizescS=1<@R2~NP@JhrlTZ~=zGr~l6GNwL(InH^oxN!&slUq4!e!+J%u7SO@k(CZtvLmFX z801B=J-9Rj7JF0mpcfs1$leFuK11-+Gr?dDmSwI>K@!XYVv~`qT3kAA-eb`a%cWXU z)6iW!Li{D=875=3M*DX`n9qexD2Yu45kBFBwsC!yqm-2qQ+iKX@~ozQ`Ge-kiW{?P zM(`ElpA!W7_vD3+vQnH0boS94{(`ZJ8RD0yOaoqmaX5rh< zJR_~oH0YGh@+{j?{GTxg(FpLZtAS>|zpFi@N`%n~!Ya^%OZ1Kq9A-$Nt-b>-yAI1Odo36J z9^-PPJ(+2NJt=!XZ(b=8E@Ji|0D}|Om9P~HJSO!R;BIo-z3`Wgz3%qF;mRt=ebDH$ zVFwUg#1+LZ*sSXeB~{YHy?j}VC9fDO402nIkFi0R7cN{WpNiXh2&d(p$l#;V`x=Gj8sY$6Q{C18j%uylNN6Ae^v8=)QuNQ??K0^ltMd6^}RJqKD8y#ZuHc9^O zH;Xf%&|2P&|1{!h)^srGQd>)IBb8~U0wP#fE3R?_+0EbferU9331kC=vad6@631rZ z@iE*-RT5WbGVm=dz7}}~Tfz1KowT!u_;8w~J0JJ5nkQ+oV^oghzD+VF<=n@*C3f2Q z02(>9TDQ{L9IyVmoQt6^M$X9VdRQ`1O7G%+hE$)Rp~AvqiWgxN{Kg2Zp&oQ~KWEvN zBDpQ6MbM^U$g}7X#{eA4hsT*DCcOd$fqZgu zjb}Yi_D^r!mbt-D>@SscwQCPTbUIR&7&3Hba=VL1s%6IDxaIjsJ-^&I?MdxM=B@M@ zY6l70(*R5|v$OgEK^yr*immrRVvuCZwt^1yjon@`RJk5+yNHU(k-pfh$1V-?vCiK4!mTb5Q~Z*0aw82Wp*cpwKp~+?0S$ zoorW!zVAHT@BZo9A0KHBeS*kI?@;X3SC_j^i*)Ng#x318ehs-rEh`jU%AuQ&CsU%Of zVfHFS)nf5(>ekP~`nFf8P;LAB>hMXo*6f{MBaOR~WN^yC#-+5W1r{DAvG! zrP-RSwrTVdpH1T66%K|*&*5EX-QHDYdpB*V1y)CcIT+MWOh5o|Q%htHt6bc`SbJmu2q%KEW5W5xQ4*ak+Gy zvrmwvrQ7RuZmzCR500#>vnX7~xb|Crac9m%$O36D2Wu=^{%*$<&Op<>=OrR&;S`_* z`oUU5tTsD+!MERN@El&wlhRkM^qlXAXrVH}^`g#blK>GZWI645#n6!EhJu*rlQZ%K zkJ!DO&HmK~@B07QC(#<@pXAy#+$(ine?zA9ARIx-g{|gk0fQ6UDXklDw)Ulq;qcn6 zL^tBA_QgLO9pe|06jPXha8sqX9i1804MXwzTVGis2B#CA3$>+^i&k%v&!~*(+x41% z8=h|YW*^d@P}QzZJFZ0QA?_35*G=!30I)WyLA z1fwff1_oJK7tP;>LGSgQ?`Ovke^P-z*-@U*M7_bTdCkM(GGx*Z&C^~h-DQV{I0yTP zUs}$VBsRvQcuecr7goyi?tiWPPL5fqJ2?U=XiLO@?iBg(<{o{o@BXSJ&sm==`*IYg z%A-t%gBHKb*(?Q_@`5gn5D)L_ZF$d{9}gUyWh~x? zNmU*Gw*|ha%C^WrGPN7=+O9$MkU3z{_xghbI==Pdu)qKdb!Uj_``wDP24(vK8_aH; zTqUK}YnlzP8M5wVh)Zw@F!_bl+ zEiH40+p{zIAgFhzj&LFM-Bkt|+z3V{&2mKcY%q)EeQfi$@;Q0`ZOmuP-O4(jlEr-@ zkjZ7Zs4E;0QhytiCF8uYF5jtXln`T25RmV?SZRiRa-nf#w-e$DKoo4q8BGyDWwq~C zIUUdR=VN=sdwU5-$Lb^@H%$OM7&|0G<6_AWEU9k?Nm`Hyq{w?-6h)s`zr-s~;IsU< zzt8l2u7_H9+5_r`{j1&A4kEdpHGG{Yd1g8mT*}_oNDThpXJtfoEGj za;(M#io5p3mk9_e%9VvNY>T{Z!5ymdO6yk+#Tw>5)`_nh-R+Dzbzr4Na)9O)&{a#-t?EGB z#aCZ9?d0E&%3b z2$)IT(B=RRgSL?6-I%T?*icwq#;_$5i+5mg45Ge+be?LaWy~& z27b-b$w;MHVm$;wvG%jLr4TSB&FzDy>hBH@zXI~S*o}(!LCB48F$MY6{*GV ziR!dZy-0dyIkf%lk`g|Ro;BEj8P`_dad!NAH~r}*2(>7cDxs4xxXSF&WpNvmCZRAq zDwWiPBPZjJPgBTP@*YeRTP#nExW3qfpN>4b0H;->ST6nQ~1_%`*L7Yq)oo;{-MJ&`kWq~vl!i8LR5hEe`}H3;%C}E(@B96JL`;mqoQUS&a00c8Y{&zT zZ{|ZYTB~I_Ln259-oZTNZ+5&%m3E-W)eXlY8?w9F52Lubie7wB^8t(Lur|35VQEya z(8*K(K9FcS=8#&C4G^G6t$|YhrRR^6B}$-mB7hYtxkzRQE81(#Dxm2dx)B2kr4u>j zPaOCbzX;6ZynBRetv9zUSi8+}rG-tPwcITT{HC^;|O+7q3I-z}^#jU3B zhMGe4@pt)`uy>*vT0J_5V#24d+*K^|1%}S&N^g<*!jQ=M?99lr^Kiz=$V_*PeDM#< zZ~k<-uT;NIeE9d}zPZl+x&6X1ju$V4>&%FineVMt--~a0GU{N&f*x%gz*P%7>4P~A zpoeC&SOqS^m2Oq8DwKPkms<;2KkA&nz{4Cc0@4KKL?=7l7TLNDeBjdfb1nQI52n63 zX9n4=NS6Q#h24KOS-?qVp(mjj`!8nMTpYe9CayqpYCSWDZi7%y zaD>3haL`=%z2=T#z3N;-7`W}kE}tThvwGXe-6lK?FL~BrVxMQkjY&>azO8e9>u~k* zVbI0s{m5F?hAgmu{>_i3ZMZf_N{H}t1KxMg1Rts7t4OEzUCqydUBGhJ3vUG?rAvyh zTjgKwRVdxqnT$Z@q=>IPy*v)T~ ztCc;95s&FK!oWhz70eZmi(Q?~(^_BNAz6h}d90K~#lF}sIi8PWRh;!(OHTMJ(s|om zCTrX^oCU`jQ>cad`I{*;wDo5h_F9-(1=A>5Tia+c&s~L^P0p^?TJDWB?m8&<5K8Xo zXwktHT91$65|`taQa2l_5?Hv0QQW{N_1NR5v+*y5hOi;1#NWDn{hpjX|Kv(3`SHw) zy5ZTDbM2Y48eGzB|zjdAv9&_M952hjuE>a8LL7lriS;^mO6c3o02@Vfe zsImOr^Y%&@$s`e^%s0XMJ#2Ue#tMz~LDyfF3tkU;m%X*{{VIN*ThPy}UbMFLS^Q#e z1OF`j-FHs8R(jJ>4b_u4XtUJC^QR%tB+Fxe@42YAShihaY%NkLqQx)Us5E26b!PvO zPMuu@59xiaAcdDhz!Xk`)mZfW-~fB1)JDB*HRi4kGc*nCy16upyzNA)gDtCGhpg~D zEzW9rxN7OV9BH_7Fts|nX)%HARyI^HOww0t*DW3wag2?mGh7+YGXkm$-;&XocOi zBWDpUZeQL#1NL})X}NvVku0O1w`(t;`@2f`jL4)Gr_~ozB(7V{Jk))Bnbz}xJ0Pn3 z++E1^@IBtUH?k&n>!Tx&(%LZS0Q@1nUsEa3Kod%JDe_G!^-Umz3?KQl*irIQtd#2*oz3rCQ>6JS@(|5`ODItYq*p-}^$z5eq2d<}Up-whm)>v+5xa%I#`|jh87Q*m|g1YYwh3xZw`G?uh zR%81<9tlcU2B4aVgsF;&a!TAMp$Nvamb|r0X1%&^=B9uFldG!x>-^zH$%>hhOYP*V z;7sLL5U3NF(Oz*&KAa$OK7%IR`-iTBHY*JWQEUG|-|QR8VZ-SRTd zE!1Jl23UJwc#pM*Nu$j7bkpZRpeVUAL5JU=yYUQ1yKzDqNuKiP($ntz z>0w+1h{oJ`*)9*8=Q&nM^Ci{>o1-J?kPm~c{q@@mtIoV8b7M*$MHMNy1dQv<>tAml zi;f}9b?WF%P9`%KXLp(&=o_9M%FkB}>#7y&FD?e+`FR!EXn*B&Q9oPGiUPBypFKBJ`+>22KzKH-4;*`v4H|*c@#POr zIOEWXoK8Ov(ICD%4fA3LzPkGw`e4IEYf9 zE~^)U@yF~A8>6g1PB^@{I#8J1QbWW5;ptV%t2v9cjo<_Yj+egdd>@{IK}4n8r^cy(h52>Q*4xB1fr%EiCmo+Uh{JW#lo^Gs!$^%G3-rg;Mhty zccw8D3EE)@@`xKOKt%?c2oqPPP-eGUriFBrEC>#scKeyBxV*Nq9M>!^WVpcxv zzU39#H=hnULg>O+j}a6|Vt2{dI((A(JE3_#pXyO5+fZwlY7@#QG7 zYphtsBX46BJuQc~+dXRH%(3hYPG`KQV8g`cj1MoN!?v(6>_9M@;^RuCX=w__0c;0PDcq$VA66#EVhhd#F$drlUnZ(X%}5s-v~C!kKMbBTbU zUv&==DJdejSmnf*WIj;hC9rGi(Z7hD;@>O4FXBHy>ml&CE!asOr<1&dhI1vEeihAf znsefHgfP>P$Jv_s(X3P_#|jBqMzGJ#8uw&tbmIw)RdQ_A2~6b>Pwq+PUmW0qv{yPw z{r`ng`j30Sv|&OW&OVa943(-rRmzfAt<2p?O^B8EfimN_sl3*f``-+Fey-S=I6Sq% zrRVsYx8nQZk?Wf?0WJHraRzyz5#^P^pj3H2^`b*Ovy0POTozFwiCmXgj4&}T>YbGG}$ zd*1WB40EibkvDn({xY-sY|f;VRWflRD!Y7@LH3Ev(GjmO_w9W9#RAJp2%4Bb7QRW4 z9sT4aZIUMH9Oc}jrryi`$s7~I3!@KkR1`d0#=MSOdYw`HVM15FTpw*|Z`%j`>agee zNxO5~ag%B>i-~7&j?k$X06Bo6t;37NcV!yVDukBRiZCtOv#bDN%5aLV6d(_Abb}2peo0hZ;n94QaNdKhxK(FbsPKEg>P83hcZ+~fJdhqwo`>xvK z%TRb*IkNh(lVmkW+pX5|GwrMD=`cylF2t{$5p>clL$j}D$3ke;dJ6yveCMa#d^e8F zVh<6$wug96{$eX8k?o@f3*UaINd3SOK0W-Rl9$!uLRJ29{a5LWi5Z&J8H0`(mfUia z38hr26PMFe`=uXpdhdM5g(y!-2l924)z`<=KFq!#xi}C%+yMFp=(m%?B4qh`=_&ja zJ@_BbgAr3z=dd30Q$MouOyb8;XM3t_(8*>@bq-Co9$AS`6S>5&@{aBew&QjJ;OZr%wO*~Qbde4LcOju4pkOrfKmEk!W9HLT zS6b|jgHlw@ZKC|oM7L}KNU+CebXjP7OuE+OB1TDq)PNA>kNxWWQF)bozE>Bk;%9qb zd~;hfR0`2VDBPkJSx~`vMN;8``_3vKWWxxrVBFdV!N+?LGsngrOy%xZdGkO@BkSfp zQFqWatSA3SXA_wIopnvigX~F}8$!+ch}qsF-)rE{oEzTdQqk35Q^ko?Qlte+VXsj@m5`Q)0U4_DJ70tdjY4!-S83tLrHC>)(;8d9U ztF4a$lZ0#}dlk7~?>)~$cq^!A-xiU)>9^Wa><7?>(;UpjJI^Rr)kckey8UjEAibzp zQMaz=k<9Xa!#JZLKHY9Lww7;i%%U-ldy4XIjm=3X4sB?ZJy3B2I3sdy-$*c7cB1!& zMPtfbtr4kYvBqvy5&cB1S)J|rki@xmgCtIg54NCw!Yuig3ouq|``ec?$BUh8Nk_St zYj3X4vlfTBa{kO3Qr*yQ*pLzzM5v5dR=G|4nk^rbiiS9@8+Id&!W!(?r)n=y z#w1%b2rA(eT3xbX9TQz$$2=kG@Yk0r_-t1*za!+9qB4e3Qs z%r%8tCSOjEf^2ce_fm5B(%3$Vs+SW$2Ja1|t#&TRx)&P@1SfWZ=n!+$Xv6 z+X|m&8tG zH|N#GqPpKG;y_ZCJ9%D&m=kqVd2>=)&KCy|wrv;`m0RQIGeH)67??F@r&$(Lj7TV_ zEC@@zJ;lT!lqvkcnWer-BV8or;N>voq6`Ouu2uDBqxE2FnfU~^&cswkYePVO{y#Hl zOlOX^B5rx+RYZfoCYd_PvsLd4Nv(hRPDuAMW)OMWeXZsp^FpNiSw40-26ijUMwTjOysVU zQvWOW(UZ2M@oLr!s%tjpP2(KOcvWo&Bs{&`~g$lCx!J{LzAJ)k3arTs#iVFmeUy>wY$E^~G(5%L)STNpBT-WK{-4; z{D=5S*jcr_Uos+Nqi-IgJE{4xRM>L1nd}=n+n(6(r}}gY^Fo$eY0&9c!fCD++$U-Z zYp^`_r_EWqJ{ZqfXRfoGZ{s4DDwKKdp}y2U!1c81-3#i+uDZw*4V-~t)sm2sDbtOW z+Y*8FH;!NTMoj!h8p#Tpt>8~6HQFr7^%ahZMQYL&j#h#V5be9#f_#BY0)fH6>O|t3 zbkkCtocU|pC<_%0^^Xd=y6*D~{Z8ZSBTcBZlwQ7UZ2TogbS(Fed4t1YAVNJgG=>Q? zop^bJLhA-~7U&*{ z5EfI7F$P+=nm7cMOboK47FeKY$wzHIY@wh|^*C{n;0E{VXEN6E2f4efq~=640!)gs zW^ZxB6s5C11;qDK`RruaAN1NMJ;_j;^!$q=IMCXm z*$dBT_}qtwv8_gDQ_`#g*BwJs_+8{6fYFT19lkyF{m{cXoLFFb@Ued@J)BjYU&sWzdFd zNwq*%^<2e^x>6@o(r%*G=~u}urSw-$bybfo&3yZRtpE0(Gg1h56>#?!IDEmVQE!lk z_^77qZ2aC_%bZ|WO}}wshxwv7`T1h%Tia^4!ym)}O1~dv=v=fV68NPE?a`b?AM+eh z{jtiPh!uy6>iL>bZ@c@Z=ali`n{Rz6T1R{RvQ^JD+cSXHF9TEA*^w^SzAI+tu^Qn?lUrpc@%meVN$@b;@+;{0IaHK;3E) z#y;V<5>lw12VG}XMWyQY)pTR#tfqxuJVT(R83(WS%wMjPhC7u;P!`0v1YM(}Sd z4CH+6#BrY2P~VJ`jQ-T0Ag>SG*)C)AWs*YdRT!y!_~_AI>=k0g+Q%i@%2<9px5n{_ zh~#bE0Z;Ub#t&FAKBe%u(U2zq+_GVqk^P0Czvocy~+p66ht5)CH&pv5u`@hUC_ z=L+?$+pSEy2IfZQE-e(9ZpGf79S#}gh?jq=ifJdK=agDFD8w!Kv3(Xz=AXxw*rddaUcKle?3 zEm^-`Ry)B}lYTCLYJDONh+tb0bCJO{VAZre{2=ThWJRW8F`I_tyO>aFGFoEU{0h1* z8A6_)r>69j-u~K3kK`_H${yq&b*4*eLj`>L{YbmfRf7F8*kK_6DWZ5WMUj<*F)b9zo(!6(8lJs-<}5cJKCN)K=z{4R=663Et6z9skX|SWk%_N@ zI4cM9LRaVc8O~Q##KvTeO&rLK%1z~_j;i^GuG^93j|lWmFUHB@3=a-$zB}?&lrTTx zPyawwC3Rw;a-PvLKzZS$aO|8ICE%2VXKOKDeG7uKd4#j}_OIK|zv@S5oq6o79aX37 z^4Hv?-6DT>ZuKGhu9hTU{twr4Z;2f*yna9~&X#a;d&^73j6g}?$9l6?MeWqyF~KT# zpgM<*0^Mg$pX>ca_cgm1QAYIFZ;-6^9ZLq;ONH?>eGh&b2?5tcL>E)p!W88+AXe%a~l3@OkHxp#PLP%L`fcYdZd$l2WF&5M-Z zXnbC52QC}PT;~<|Lv1;ynBDN91M5BbXZHQ8t_@#cI>o1OjHRRSa ztKwE^Z$a;NZpwp5n(LczkzAV>-u#6w1{W=rYKzHw3EHQgDB6-_tsB6r&Hw;ib(H$Z z-r4lx7k@(8fSJ}cwR@Q%$J}}zj8JQgm}w2{{IpWKBX=iD{xV`^s@^cMsG412OHS+L z@*?}nB1J6~IcxpzcG}#oyr|qgo8CiSsTK@!$MqMwhX+$9sfK63TRrm0rFgz(cWTO0N*l7b+JbSfeW64IRl(lvxM8|jiRhY&DGMM|YX7zP2Q8A?DzLUM*0 zx|yMou6K?5*-yO3_x<}F-~6%h*oOjh&wa0Tt?N3^-&xJ*n6cz&Q8iV_z13hm*VcQ3 z5UEa46(?U+B3{)n+eMDj@(ONGomqIg=!dz3xXmLdxRX?ilV|M0FC7{<3>%(!1ojq( zk9!!-u&wv3Bg0NK#O1$XZj}L7A>nQR`qA3au_?=`2-FxCxF#pbLCm)j>$TEuZLd#( z*}EDEvNY-?R(%>6LLPyXmwZsNBmQFO&1%k0g?;9u(**>yT4Q6{Jc~-b$K!d+wt}EG zV_B$jAL?2?`7zNE_9kd!;^#HuLsy#nLXrKC84#EHU&Z09`%nL9Via(R$GN zX<(yHpETO)<%HFu8e!1>`NGf zUU!g}G-{;Wbw6kVLkW?w4*w=n;RKk#h~f6G6o2Jutb@g37mY8|&ccjDqvPy#nQK=w z%K}(uj^6k*rUzNtaa2a-DwBd|=-T+CsG zlZPl9q0OB6P38wSYH`nlX%S}+3~sIlRMF?O8YHbZWD`wyjhh*l%$Jl}6{Reru* zAy-7UKF(d((lCC911x%lPCM#6{jG5R<*nx(32e=-zF86|=v0z$cJ;^UegE4CvZMx9 z*4cf0le=d&=S$Ja=Ep;GqK@bc{;WVI3|Mbh{H8k%S@JN9hP5P7zi`5|ni8h)|u$nW>z_GRF(zYfV5MO`Yao+dU{Fbg>LIlOX%Kf|Eq>_yHam*o{f;c9j ziImPS1YQl9oJJjPKLADrZ4vZS$!9ZYed~kEFR`|bu|UTf;R-nDm>2*R{4FK2^-Aqx zZ9i3*NDEc|ig9IP!@6@z9f^J<|QgPf3BQdr5R&=OdqyWNb6qtrdCw0@__aK|6u%WxONe3ejw z1K|YD-$shy?w~O4u@oooB?{jkXJ-P^zapLe{DR{fHecL09ZdlVg-IL#a!~M1XwajW zr;J+?U27M$u49773s-vv(yzmMM1wzPMA0I9ln2Qe~SjN48!y+{y7B!2E^iJ zjCtQ)e@R2jm_%WmfK(LiQ&bw>U%j`P|JviU1+>~7XtUCD<-`2jk#c03-#>ZN8vvO(R<|-QkcPY?TCTP%nBm#k|7Pn zz29b69++Wmi0u9Q_aCNH($I+Lxa~6S1y{E;j4CK7jPwi}jL?8>SD_YaBy-wa zeBu319q?xXM=(8shcVvt;-isg+Eqi(tBaG1p^nexhLLEkKEG-1^biYP%uEBRXTtl> zbDX7p)U2sby;K-z3M6To3SN-LY2FfCX;E$7x`E!c3VB@=s`IzfuLuq!vcdV?z+ zs45dl(~XOu0ql~J#|pj!{Px%)Y!D~GnGj$dcl%BKQz7EM`i%U9;Q4yZ3O~1t{MAd) zqf#ZpUGTL@PdP)wDrFzf7q|%@;AORWxzYH!>nhj_d4`jQt46(e5whUOQUyHbjqQn~ zqc6y?j5J6mM&06d54{++_BiBxWlQoNN_OVwD`I4M{pb}~vg{$(ojdmMf2)3RJ>W@Y zoShLO79q79Eqd80FIqAqfD5u@uVdes$IZS+JtCUEHZcSYm1O!crHR^~xnVjQjHFkt z9BJ`}yc4FSr0iGVl@+enK8u&wuIIj1wC9)hd9I|itavy^@4{G!*~cW5Ls-}+>VJNy z-Ocyz6wdxt)A9P~&U^mc<#FqGMr0>gAa{>)N$-7xSCG6@LKS@-3*ydR<9ZyXr%)nI zMNc1)kbmj2#a_T|bd%IgX}-Jexz%DF`Q-izdr~N!rGhb*lDyJgJ+k_d;^`5$W_;Yc z`{(tx@TU)6RlP~gp6F6W^_c`Oq|8z#7!-FGl(lfSEZstzD>OA~H+YQh*USxGyajgL z5**QJIJHPOpaId$#YtW?ZR7Rm(JQBJFW>1;TT*a?=;CUWn@3TU(5^;k_OKhfI~dx& z|Kv>N4t<}MHQfNjLNtlONgz@X`)4xs&j+5=K2Zf2m0(n6{RFUk^k{O=KVP1#!kh{O zW0$&;T|SZeTYQL+l#~Rf+RVYTJnm&KJpCi z?&8slz3KdM5w%B+I?A)>fnleO$wDizTcI%8)PF0`|Ev$@tznY*u&rHA8tpRgzZxUv zjxPon&}85YcAyB%H5zx&o42;TML9@xQ0Yi+#{{G1cdNc&?`hT`1!^L=E)eNaLF#Yl z7VkO0rvq!oe1Z9J5_uVKZ{o|BFU@P8cM;$w(;8-hSEE$)9TLW;{lUTHKd-xFw(@SA zGD}%R4y~(^dzn;XkJ6OJ{8;U-TqOa;QGE=*;p_^p8li8n8rj&5`-W*7fblWBt7Y;- zO;T^x=L}iNuk%LrKi?1hsl2vcG8^2r=%a!m=X0lodCroruj1n^@33}(lDoxc^7?Ae zG53AGj{?)aZw2kTAYUp>`A+B8*DbnQBxUCiVkldQU&&0ss_UbBBB}g8-+SY-zngpp zwvII@5L-VMUMhb2=YB@iD{^S69g7|NNRTFuv2vOu+FCSPK9X&E*DMg7dObMgs- z8e2Pu0eBGYdN2IFS}R}*{?9A7{$art7!~t;BzxVr4Z;E}z0K~g%@8fWU_ECuiN!13 zh_U;4dwAOf+>XCWX_X=U(L1wf?WrF+8R>9gqgfxGvcml|<=0FTO;Gfwy0U+|&wnn?&n8Vn1s2&Y zH;be6-8wGKvYIC8x;KnA2aAYn*xg~Y&z%Wv2X93srC`a5zpSmZd2BGGG;;`Z(UJz( z<@s6XK-3f|=C}>$BV2ArAwwQlug}jL2;B71t{ya*bcl)+2rdrl2~v|ZIFXQLXSc4b zy;J``3&$jEl3p2B{0`Hwy zOt5}2_Vd`&)Cq)hR_sy!h#Jv1+uZ$w2A&!{?6Pr9H^)DZ<)5$q;rB&|tEe8;GwKIF z-K*@-vvIz6-|$P2`JgK5P$~tg{rN<`RZ!`&^CAb$Y3O_xIpCZPSVG_a@2^N$4v{Cn zcco}RGCkc$#D?JxfIOb-wH&gl@_>}Hra01HAB!sn04!nr_W%6!1X&LRUV{^v6-Z@AB(i?6uc z?aMZNv&y6GL*nD2t?M~Yv-3G<%5#5Dm`xs#`$p^Dgl9<_>MmRT*u$J=IlslQn-flf z6J8?|ydo8~T0QRW?#o7qx~_Vo^7~PwVF#>VLVs=3L!+vepW;emLSKENCs8q!_5T07 zrhS2$arioFE4NDds24WHgfJlT}ImgC3~?14uc`n zWwbQNds=1%)Ks5RflwyeY9swWyT@bdAD6%o=jOwEi=OYMEy3K@$~;|@=Gwv{rw-j{ z<5OVgd0U?h%6w1tyF(yFy@r4wh5FxXNY@8NrPh4y420tQX_QOqUis76)i2VD5 zN#X{cF8t><;QMzV$KEBLYtJ?P562VyI(0A00%{|N$G!PS)`xZG@-@;Q+3tBesWEXi zKCFJ7djH;+;924SsrPQ(s@VoJ!Z(!kI{&#Of38hek~E_I41Hbs(??SW)XkH=TcKNkHz!dg(+2L|Ery}9y`$xXkZz7=DP}P z(P&n)e?11d_3r_#bbZ)&lgrZ6qG7IqF(x%BrIM11YrbKwS}lDf(U5oP?>i*-N%m!b zPYz0`bymaFH-F>O|AL~zCvDpDDG4FDPUH6?L5yyUZP}XHXJKgRW zYzXx3UIY@6K^kQ3H90xC?nR&$dxLYffFsTV&~gsd==1^^$!(l9hhiPj(3F5K=jCe9 z=ms$S`pBOGP;ects z2K1tCp+0GjqHUaG5)^Fz6n}Sxb`ME0`&fh=T$>9iJ_6z2#$?*h3d7vyWuIEr>P+BL zM5yYnJnz|E?!(IWR0Dn=4yq&gMAsB4;eLxA4hK(NE4036Wjg_X4XKKvN~r5UiW z=5^J8b#JZ{Ae!uefA{#vy1oo%{{m+iM=;Myx7ren1W4-+q?>E(B7Cvx03Bi1@|<;j+NweE^B~dxB`+$tHk5BqCEm)z* z?T+(sd}7QZU~=8R7uE3_Fc^*_mtXO4&HIfK{p;D)vtJ&dL9UDWTgNe1|71{W(Q& zKjrL5T{lqFBQ6g~TDR`w08-%gN(Q3y*Ie?-Jn(S5mIctTk4gl=%&IKXeQ6Jra27ZV z1=n@p+(z|908b!>5qJaI#VsR9EiN2(6TQWn$C1vVG)nDz=tLoU-+%Rgj-LV3@n%_{;U0scz_YJKga!kbLwG^6k0r z$qX>~UU{!n>lADaJPg1#X?4Mt%UM;0V|Vd;zWEM5QfiBr`0Tne;2%eDB>8?v=ri;g zdw6ujB{l(X+4jLfO>pA_RX^MnFn1_>KHd+U8Seqd^fv~jQ6mgw$<49Mpzvtflym51 z2Kd8-5Ushd-{xJI^yei`aHJP}4Lnkwe^(f_O+-y9sWPwTH^L7CXV;O8L(oTK)$cY>K9Cb;4J~_)hwlx;_ZS(TU%xDxz+2i%^l8 zDbcKePsTS*+-+RgBHYOlV3}fBWyakJMV?nJm|l!W90h<;EdT86?C~-#Z0?Uu!?p1WzSYXfg{Z0Y{^2PTHerXyE%!X(4bwW;qw*yx{rKW$V zV6YLg%p$4sWLQcjqH84;jy$#ZtTwIf0A*~I9E&@c-(1ed zOji3!XIE8iPbi)^RnU&WVngQR7C!!-nTY{21}SsmU49&s;8?oVdtSmlf$GvnoRd3~ zYjX5QrcCht5fd9wwXPv))? z^bYS9%!mA9el+I*>kZbTD99= zbBqq&3(HR%=UPLZjREh@%NH-sxj;qp_+fL%nGcUg<#PM8ns~V3B;L&m zD)~4Dp*w2gZoFW2ipvmNt@GFOJp&eftkDnGvUOHR!nkOANaV+=V(k)OKEZ8;@66pN zy_i}GA9uS!2Bq-(-Y&q$JSGu#5(%OswOZ;7>p!W2&{+1Tp!XekIQz1l<`C*u+~Icf zu=+*HX|)B_RoKjr%{Ym#zYrAclwuJhOz@JHsTM-Cg=*>1yXv8M0Mun zH!_+r62&a&{@CptG&pAaV7EYGbGKbu1pO{P{`f79?=Nv6SU{*N>kB@|N*HJ1x#NuGy&X&0sJxyB&)-R8v6 zcnw{ngQE@?w(3O#T#rcodg*p()C>ZcS1F3W`~nM>s($NzM-^-cxV`59Ys7(l?Hp5F z##|bq?xX59{wtRLfnsLpdEiUz%(gSSx+MQaae~C3-D+U+n`qLHfVN*BYfuLxk3?v% za}MYYIN#?m`fL6#>JkSg?LuRd_4UP)CTviQho}`Wo_++PMhj@oua+>N%h@hC&!<_rfoUnaouoKlxMngC9!0`qI%0AQ%6 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 vDkxK2Q$+GQBB7!3ig}GFEZBdBCK{ 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 literal 0 HcmV?d00001 diff --git a/native/hook-helper/build.cmd b/native/hook-helper/build.cmd index f75c523d..2587ee9e 100644 --- a/native/hook-helper/build.cmd +++ b/native/hook-helper/build.cmd @@ -14,7 +14,7 @@ call "%VSDIR%\VC\Auxiliary\Build\vcvars64.bat" >nul || exit /b 1 cd /d "%~dp0" if not exist build\obj mkdir build\obj set FLAGS=/nologo /std:c++20 /EHsc /W4 /WX /MT /DUNICODE /D_UNICODE /Fobuild\obj\ -cl %FLAGS% /O2 src\main_win.cpp src\hooks_win.cpp src\simulate.cpp src\commands.cpp src\output.cpp src\json.cpp src\decision.cpp /Fe:build\hook-helper.exe /link user32.lib || exit /b 1 +cl %FLAGS% /O2 src\main_win.cpp src\hooks_win.cpp src\simulate.cpp src\commands.cpp src\output.cpp src\json.cpp src\decision.cpp /Fe:build\hook-helper.exe /link user32.lib version.lib || exit /b 1 cl %FLAGS% /Od tests\helper_tests.cpp src\decision.cpp src\commands.cpp src\macinput.cpp src\json.cpp src\output.cpp /Fe:build\helper_tests.exe || exit /b 1 cl %FLAGS% /O2 src\context_main_win.cpp src\context_capture_win.cpp src\context_text_win.cpp src\context_write_win.cpp src\context.cpp src\json.cpp /Fe:build\context-helper.exe /link user32.lib gdi32.lib ole32.lib oleaut32.lib windowscodecs.lib windowsapp.lib uiautomationcore.lib shell32.lib dwmapi.lib || exit /b 1 cl %FLAGS% /Od tests\context_tests.cpp src\context.cpp src\json.cpp /Fe:build\context_tests.exe || exit /b 1 diff --git a/native/hook-helper/build.sh b/native/hook-helper/build.sh index 46b4af57..4a95fc89 100755 --- a/native/hook-helper/build.sh +++ b/native/hook-helper/build.sh @@ -8,9 +8,10 @@ case "$(uname -s)" in Darwin) CXX=${CXX:-clang++} FLAGS="-std=c++20 -arch arm64 -mmacosx-version-min=13.0 -Wall -Wextra" - "$CXX" $FLAGS -O2 src/main_posix.cpp src/hooks_mac.cpp src/macinput.cpp src/simulate.cpp src/commands.cpp \ + # hooks_mac.cpp uses AppKit's NSWorkspace, so it compiles as Objective-C++. + "$CXX" $FLAGS -O2 -x objective-c++ src/hooks_mac.cpp -x c++ src/main_posix.cpp src/macinput.cpp src/simulate.cpp src/commands.cpp \ src/output.cpp src/json.cpp src/decision.cpp \ - -framework ApplicationServices -framework CoreFoundation -o build/hook-helper + -framework ApplicationServices -framework CoreFoundation -framework Cocoa -o build/hook-helper "$CXX" $FLAGS -fobjc-arc -O2 src/context_main_posix.cpp src/context_capture_mac.mm src/context_text_mac.mm \ src/context_write_mac.mm src/context.cpp src/json.cpp -framework ScreenCaptureKit -framework CoreGraphics \ -framework ImageIO -framework AppKit -framework Carbon \ @@ -28,8 +29,9 @@ esac -o build/helper_tests "$CXX" $FLAGS ${CPPFLAGS:-} -O0 tests/context_tests.cpp src/context.cpp src/json.cpp -o build/context_tests if [ "$(uname -s)" = Darwin ]; then - "$CXX" $FLAGS -O0 tests/hooks_mac_tests.cpp src/decision.cpp src/commands.cpp src/macinput.cpp src/json.cpp src/output.cpp \ - -framework ApplicationServices -framework CoreFoundation -o build/hooks_mac_tests + # hooks_mac_tests.cpp includes hooks_mac.cpp textually, so it needs the same Objective-C++ flag. + "$CXX" $FLAGS -O0 -x objective-c++ tests/hooks_mac_tests.cpp -x c++ src/decision.cpp src/commands.cpp src/macinput.cpp src/json.cpp src/output.cpp \ + -framework ApplicationServices -framework CoreFoundation -framework Cocoa -o build/hooks_mac_tests echo "Built build/hook-helper, build/context-helper, build/helper_tests, build/context_tests and build/hooks_mac_tests" else echo "Built build/hook-helper, build/helper_tests and build/context_tests" diff --git a/native/hook-helper/src/commands.cpp b/native/hook-helper/src/commands.cpp index 74b72dea..ae613f24 100644 --- a/native/hook-helper/src/commands.cpp +++ b/native/hook-helper/src/commands.cpp @@ -75,6 +75,7 @@ Command parseCommand(const std::string& line, const Config& current) { cfg.triggerVk = static_cast(getInt(m, "triggerVk", cfg.triggerVk)); cfg.clickPing = getBool(m, "clickPing", cfg.clickPing); cfg.gameCheck = getBool(m, "gameCheck", cfg.gameCheck); + if (m.count("skipApps") != 0) cfg.skipApps = m["skipApps"]; if (m.count("emoteTrigger") != 0 && !parseEmoteTrigger(m["emoteTrigger"], cfg.emoteTrigger)) return c; cfg.emoteTriggerVk = static_cast(getInt(m, "emoteTriggerVk", cfg.emoteTriggerVk)); cfg.emoteClick = getBool(m, "emoteClick", cfg.emoteClick); @@ -101,6 +102,10 @@ Command parseCommand(const std::string& line, const Config& current) { } else if (type == "staleWatch") { c.kind = Command::Kind::StaleWatch; c.flag = getBool(m, "on", false); + } else if (type == "getForegroundApp") { + c.kind = Command::Kind::ForegroundApp; + } else if (type == "getAppList") { + c.kind = Command::Kind::AppList; } else if (type == "shutdown") { c.kind = Command::Kind::Shutdown; } else if (type == "sim") { diff --git a/native/hook-helper/src/commands.h b/native/hook-helper/src/commands.h index ea7f1b8e..c60e47ed 100644 --- a/native/hook-helper/src/commands.h +++ b/native/hook-helper/src/commands.h @@ -7,7 +7,7 @@ namespace lp { struct Command { - enum class Kind { Invalid, Config, SetEnabled, Suspend, Shutdown, SimEvent, SimTick, StaleWatch } kind = Kind::Invalid; + enum class Kind { Invalid, Config, SetEnabled, Suspend, Shutdown, StaleWatch, ForegroundApp, AppList, SimEvent, SimTick } kind = Kind::Invalid; Config config; // Config bool flag = false; // SetEnabled / Suspend / StaleWatch InputEvent event; // SimEvent diff --git a/native/hook-helper/src/decision.cpp b/native/hook-helper/src/decision.cpp index ceaeb128..a1f86cbc 100644 --- a/native/hook-helper/src/decision.cpp +++ b/native/hook-helper/src/decision.cpp @@ -1,5 +1,6 @@ #include "decision.h" +#include #include namespace lp { @@ -9,6 +10,20 @@ constexpr uint32_t kVkShift = 0x10, kVkCtrl = 0x11, kVkAlt = 0x12; constexpr uint32_t kVkLShift = 0xA0, kVkRShift = 0xA1, kVkLCtrl = 0xA2, kVkRCtrl = 0xA3; constexpr uint32_t kVkLAlt = 0xA4, kVkRAlt = 0xA5, kVkLWin = 0x5B, kVkRWin = 0x5C, kVkEsc = 0x1B; +// A process name as the skip list matches it: lower-case, without a trailing ".exe". +std::string appStem(std::string s) { + size_t start = 0; + while (start < s.size() && (s[start] == ' ' || s[start] == '\t')) ++start; + size_t end = s.size(); + while (end > start && (s[end - 1] == ' ' || s[end - 1] == '\t')) --end; + s = s.substr(start, end - start); + for (char& ch : s) { + if (ch >= 'A' && ch <= 'Z') ch += 'a' - 'A'; + } + if (s.size() > 4 && s.compare(s.size() - 4, 4, ".exe") == 0) s.resize(s.size() - 4); + return s; +} + uint32_t modBit(uint32_t vk) { switch (vk) { case kVkCtrl: @@ -231,6 +246,16 @@ Result Decision::setConfig(const Config& c) { enabled_ = c.enabled; spotWhileHeld_ = {}; resetDoubleTap(); + skipStems_.clear(); + size_t pos = 0; + while (pos < c.skipApps.size()) { + const size_t comma = c.skipApps.find(',', pos); + const std::string stem = appStem(c.skipApps.substr(pos, comma == std::string::npos ? std::string::npos : comma - pos)); + if (!stem.empty() && std::find(skipStems_.begin(), skipStems_.end(), stem) == skipStems_.end()) + skipStems_.push_back(stem); + if (comma == std::string::npos) break; + pos = comma + 1; + } return r; } @@ -262,6 +287,17 @@ Result Decision::setStaleWatch(bool on) { void Decision::setFullscreenProbe(std::function probe) { fullscreenProbe_ = std::move(probe); } +void Decision::setForegroundApp(std::function fg) { foregroundApp_ = std::move(fg); } + +// The skip list costs one supplier call per gesture or hotkey press, and none at all while it is empty. +bool Decision::inSkippedApp() const { + if (skipStems_.empty() || !foregroundApp_) return false; + const std::string name = foregroundApp_(); + if (name.empty()) return false; + const std::string stem = appStem(name); + return std::find(skipStems_.begin(), skipStems_.end(), stem) != skipStems_.end(); +} + Result Decision::releasePanel() { Result r; if (panelDown_ == 0) return r; diff --git a/native/hook-helper/src/decision.h b/native/hook-helper/src/decision.h index f16fd1a2..9d4ae462 100644 --- a/native/hook-helper/src/decision.h +++ b/native/hook-helper/src/decision.h @@ -3,6 +3,7 @@ #include #include #include +#include #include namespace lp { @@ -38,6 +39,9 @@ struct Config { // Fullscreen apps (games) keep every click. Off here so a config without the field changes nothing; // the app's setting defaults it on. bool gameCheck = false; + // Apps where lolPing stands down entirely, as one comma-separated list of process names ("Photoshop.exe, + //idea64"). The stems are matched case-insensitively without the .exe. Empty: no app is skipped. + std::string skipApps; Trigger emoteTrigger = Trigger::None; // the emote wheel's uint32_t emoteTriggerVk = 0; // only for Trigger::CustomVk bool emoteClick = false; @@ -105,6 +109,9 @@ class Decision { Result tick(uint64_t nowMs); // Per platform: does a fullscreen app own the screen under the click at (x, y)? Unset: gameCheck never fires. void setFullscreenProbe(std::function probe); + // Per platform: the foreground app's process image name ("Photoshop.exe"), '' when it can't be read. + // Used for the skipped-app stand-down. Unset: nothing is ever skipped. + void setForegroundApp(std::function fg); // Windows opens the menu bar / Start menu on a lone Alt / Win key-up, so a swallowed press while one is held // gets a mask key before that key-up. macOS has no such behaviour: its hook layer turns this off. void setMaskMenuKeys(bool on) { maskMenuKeys_ = on; } @@ -134,7 +141,9 @@ class Decision { bool click; // trigger + click places a ping / emote instead of replaying the click }; - bool active() const { return enabled_ && !suspended_; } + bool active() const { return enabled_ && !suspended_ && !inSkippedApp(); } + // The foreground app's stem is on the skip list. Cheap when no list is set: the supplier is not consulted. + bool inSkippedApp() const; uint32_t mods() const; Spec spec(WheelKind k) const; bool held(WheelKind k) const; @@ -171,6 +180,8 @@ class Decision { bool enabled_ = true; bool suspended_ = false; std::function fullscreenProbe_; + std::function foregroundApp_; + std::vector skipStems_; // cfg_.skipApps split and normalised, refreshed by setConfig State state_ = State::Idle; std::array keyDown_{}; std::set swallowKeyUps_; diff --git a/native/hook-helper/src/hooks_mac.cpp b/native/hook-helper/src/hooks_mac.cpp index 4fa5a371..b394f529 100644 --- a/native/hook-helper/src/hooks_mac.cpp +++ b/native/hook-helper/src/hooks_mac.cpp @@ -1,7 +1,9 @@ // macOS input layer: a CGEventTap feeding the shared Decision logic. Needs Accessibility permission. +#import #include #include +#include #include #include #include @@ -45,6 +47,37 @@ bool isKeyDown(uint32_t vk) { return code >= 0 && CGEventSourceKeyState(kCGEventSourceStateCombinedSessionState, static_cast(code)); } +// The frontmost app's process name ("Photoshop"), or '' when there is none. The run loop serving the tap is this +// process's main thread, which is where NSWorkspace answers from, so the query is safe in the tap callback. +std::string foregroundAppName() { + @autoreleasepool { + NSRunningApplication* app = [[NSWorkspace sharedWorkspace] frontmostApplication]; + NSString* name = app.localizedName; + return name != nil ? std::string(name.UTF8String) : std::string(); + } +} + +// The regular apps the user can switch to, by process name and bundle path, at most 64. Asked only by the settings page. +std::vector runningApps() { + @autoreleasepool { + std::vector apps; + for (NSRunningApplication* app in [[NSWorkspace sharedWorkspace] runningApplications]) { + if (apps.size() >= 64) break; + if (app.activationPolicy != NSApplicationActivationPolicyRegular) continue; + NSString* name = app.localizedName; + if (name == nil) continue; + AppEntry entry; + entry.name = name.UTF8String; + NSString* path = app.bundleURL.path; + if (path != nil) entry.path = path.UTF8String; + if (std::none_of(apps.begin(), apps.end(), [&](const AppEntry& a) { return a.name == entry.name; })) + apps.push_back(entry); + } + std::sort(apps.begin(), apps.end(), [](const AppEntry& a, const AppEntry& b) { return a.name < b.name; }); + return apps; + } +} + CGPoint cursorLocation() { CGEventRef e = CGEventCreate(nullptr); const CGPoint p = CGEventGetLocation(e); @@ -205,6 +238,8 @@ void handleCommand(const std::string& text) { case Command::Kind::SetEnabled: apply(g_decision->setEnabled(c.flag)); break; case Command::Kind::Suspend: apply(g_decision->setSuspended(c.flag)); break; case Command::Kind::StaleWatch: apply(g_decision->setStaleWatch(c.flag)); break; + case Command::Kind::ForegroundApp: g_out->foregroundApp(foregroundAppName()); break; + case Command::Kind::AppList: g_out->appList(runningApps()); break; case Command::Kind::Shutdown: CFRunLoopStop(CFRunLoopGetCurrent()); break; default: g_out->error("invalid command: " + text); break; } @@ -217,6 +252,7 @@ int runHooks(Output& out) { decision.setMaskMenuKeys(false); // The repeat watchdog only guards lost key-ups; macOS repeat delay and the repeat setting make repeats unreliable. decision.setPanelRepeatGap(0); + decision.setForegroundApp(foregroundAppName); g_decision = &decision; g_out = &out; diff --git a/native/hook-helper/src/hooks_win.cpp b/native/hook-helper/src/hooks_win.cpp index 4c7416bb..efca6e94 100644 --- a/native/hook-helper/src/hooks_win.cpp +++ b/native/hook-helper/src/hooks_win.cpp @@ -2,7 +2,9 @@ #define WIN32_LEAN_AND_MEAN #include #include +#include +#include #include #include #include @@ -38,6 +40,125 @@ bool isExtendedVk(uint32_t vk) { bool isKeyDown(uint32_t vk) { return (GetAsyncKeyState(static_cast(vk)) & 0x8000) != 0; } +// One process image's entry: its file name and full path as the file system names them, UTF-8. Empty when the +// image can't be read. QueryFullProcessImageName crosses a process boundary but sends no messages. +AppEntry entryFromPath(const std::wstring& path) { + const int bytes = WideCharToMultiByte(CP_UTF8, 0, path.data(), static_cast(path.size()), nullptr, 0, nullptr, nullptr); + if (bytes <= 0) return {}; + std::string utf8(static_cast(bytes), '\0'); + WideCharToMultiByte(CP_UTF8, 0, path.data(), static_cast(path.size()), utf8.data(), bytes, nullptr, nullptr); + const size_t slash = utf8.find_last_of("\\/"); + AppEntry out; + out.path = utf8; + out.name = slash == std::string::npos ? utf8 : utf8.substr(slash + 1); + return out; +} + +AppEntry processOf(HWND window) { + DWORD pid = 0; + if (GetWindowThreadProcessId(window, &pid) == 0 || pid == 0) return {}; + const HANDLE process = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pid); + if (process == nullptr) return {}; + wchar_t wide[MAX_PATH]; + DWORD size = MAX_PATH; + AppEntry out; + if (QueryFullProcessImageNameW(process, 0, wide, &size) && size > 0) out = entryFromPath(std::wstring(wide, size)); + CloseHandle(process); + return out; +} + +// The foreground window's process image name ("Photoshop.exe"), or '' when it can't be read. The query only +// runs when the foreground window changed since the last call, so the per-event cost is one GetForegroundWindow. +std::string foregroundAppName() { + static HWND last = nullptr; + static std::string name; + const HWND fg = GetForegroundWindow(); + if (fg == nullptr) { + last = nullptr; + name.clear(); + return name; + } + if (fg == last) return name; + last = fg; + name = processOf(fg).name; + return name; +} + +// The file's FileDescription ("网易UU远程" for GameViewer.exe): the words the system and IMEs show for an app, which +// is what a user types. Only for the settings page's app list, never in the hooks. +std::string fileDescription(const std::string& pathUtf8) { + if (pathUtf8.empty()) return {}; + const int wideLen = MultiByteToWideChar(CP_UTF8, 0, pathUtf8.data(), static_cast(pathUtf8.size()), nullptr, 0); + if (wideLen <= 0) return {}; + std::wstring path(static_cast(wideLen), L'\0'); + MultiByteToWideChar(CP_UTF8, 0, pathUtf8.data(), static_cast(pathUtf8.size()), path.data(), wideLen); + DWORD handle = 0; + const DWORD size = GetFileVersionInfoSizeW(path.c_str(), &handle); + if (size == 0) return {}; + std::vector block(size); + if (!GetFileVersionInfoW(path.c_str(), 0, size, block.data())) return {}; + struct Lang { WORD language, codepage; }* langs = nullptr; + UINT langCount = 0; + if (!VerQueryValueW(block.data(), L"\\VarFileInfo\\Translation", reinterpret_cast(&langs), &langCount) || + langCount < sizeof(Lang) || langs == nullptr) + return {}; + wchar_t key[64]; + swprintf_s(key, L"\\StringFileInfo\\%04x%04x\\FileDescription", langs[0].language, langs[0].codepage); + wchar_t* value = nullptr; + UINT valueLen = 0; + if (!VerQueryValueW(block.data(), key, reinterpret_cast(&value), &valueLen) || value == nullptr) return {}; + const std::wstring wide(value, valueLen > 0 ? valueLen - 1 : 0); // the length counts the NUL + const int bytes = WideCharToMultiByte(CP_UTF8, 0, wide.data(), static_cast(wide.size()), nullptr, 0, nullptr, nullptr); + if (bytes <= 0) return {}; + std::string utf8(static_cast(bytes), '\0'); + WideCharToMultiByte(CP_UTF8, 0, wide.data(), static_cast(wide.size()), utf8.data(), bytes, nullptr, nullptr); + return utf8; +} + +// Windows' own hosts and brokers: svchost farms hold no windows, the window hosts hold them for other apps - +// nobody works inside one, and an exception entry would silently do nothing. Same idea as the shell surfaces +// the fullscreen probe skips. +bool isSystemHost(const std::string& name) { + static const char* const hosts[] = { + "ApplicationFrameHost.exe", "TextInputHost.exe", "ShellExperienceHost.exe", "SearchHost.exe", + "StartMenuExperienceHost.exe", "RuntimeBroker.exe", "dllhost.exe", "taskhostw.exe", "Widgets.exe", + "WidgetService.exe", "svchost.exe", "csrss.exe", "smss.exe", "services.exe", "lsass.exe", "wininit.exe", + "winlogon.exe", "dwm.exe", "conhost.exe", "OpenConsole.exe", "fontdrvhost.exe", "audiodg.exe", "spoolsv.exe", + "WudfHost.exe", "MsMpEng.exe", "NisSrv.exe", "SecurityHealthService.exe", "SecurityHealthSystray.exe", + "SearchIndexer.exe", "msedgewebview2.exe", "steamwebhelper.exe", "hook-helper.exe", + }; + for (const char* host : hosts) { + if (_stricmp(name.c_str(), host) == 0) return true; + } + return false; +} + +// The apps behind the windows the user can switch to: visible, titled, not a tool window or a shell surface, +// deduplicated by name, at most 64. Run only when the settings page asks, never in the hooks. +BOOL CALLBACK collectAppWindow(HWND window, LPARAM lp) { + auto& apps = *reinterpret_cast*>(lp); + if (apps.size() >= 64) return FALSE; + if (!IsWindowVisible(window)) return TRUE; + if (GetWindowLongPtrW(window, GWL_EXSTYLE) & WS_EX_TOOLWINDOW) return TRUE; + if (GetWindowTextLengthW(window) <= 0) return TRUE; + wchar_t cls[64]; + if (GetClassNameW(window, cls, 64) != 0 && + (lstrcmpiW(cls, L"Progman") == 0 || lstrcmpiW(cls, L"WorkerW") == 0 || lstrcmpiW(cls, L"Shell_TrayWnd") == 0)) + return TRUE; + const AppEntry app = processOf(window); + if (app.name.empty() || isSystemHost(app.name)) return TRUE; + if (std::none_of(apps.begin(), apps.end(), [&](const AppEntry& a) { return a.name == app.name; })) + apps.push_back(app); + return TRUE; +} + +std::vector runningApps() { + std::vector apps; + EnumWindows(collectAppWindow, reinterpret_cast(&apps)); + for (auto& app : apps) app.desc = fileDescription(app.path); + return apps; +} + // True when the click at (x, y) lands on a monitor that the foreground window covers whole: a game, or any // fullscreen app, owns that screen, so trigger+click belongs to it, not to a wheel. A click on another // monitor still gestures. "Covers" means the window rect contains the monitor rect: borderless fullscreen @@ -229,6 +350,7 @@ int runHooks(Output& out) { g_decision = &decision; g_out = &out; decision.setFullscreenProbe(clickIsOnFullscreenApp); + decision.setForegroundApp(foregroundAppName); const DWORD threadId = GetCurrentThreadId(); g_hookThreadId = threadId; MSG msg; @@ -275,6 +397,8 @@ int runHooks(Output& out) { case Command::Kind::SetEnabled: apply(decision.setEnabled(c.flag)); break; case Command::Kind::Suspend: apply(decision.setSuspended(c.flag)); break; case Command::Kind::StaleWatch: apply(decision.setStaleWatch(c.flag)); break; + case Command::Kind::ForegroundApp: g_out->foregroundApp(foregroundAppName()); break; + case Command::Kind::AppList: g_out->appList(runningApps()); break; case Command::Kind::Shutdown: PostQuitMessage(0); break; default: out.error("invalid command: " + *text); break; } diff --git a/native/hook-helper/src/output.cpp b/native/hook-helper/src/output.cpp index f62f1899..fccf2931 100644 --- a/native/hook-helper/src/output.cpp +++ b/native/hook-helper/src/output.cpp @@ -45,8 +45,23 @@ void Output::line(std::string s) { void Output::emit(const Emit& e) { line(formatEmit(e)); } -// Version 6: the config takes askDoubleTap; askWords and scroll events and the staleWatch command are new. -void Output::ready() { line("{\"type\":\"ready\",\"version\":6}"); } +// Version 7: the config takes the skipped-app list, and the foregroundApp and appList events +// and the getForegroundApp and getAppList commands are new. +void Output::ready() { line("{\"type\":\"ready\",\"version\":7}"); } + +void Output::foregroundApp(const std::string& name) { + line("{\"type\":\"foregroundApp\",\"name\":\"" + jsonEscape(name) + "\"}"); +} + +void Output::appList(const std::vector& apps) { + std::string out = "{\"type\":\"appList\",\"apps\":["; + for (size_t i = 0; i < apps.size(); ++i) { + if (i != 0) out += ","; + out += "{\"name\":\"" + jsonEscape(apps[i].name) + "\",\"desc\":\"" + jsonEscape(apps[i].desc) + "\",\"path\":\"" + + jsonEscape(apps[i].path) + "\"}"; + } + line(out + "]}"); +} void Output::error(const std::string& message) { line("{\"type\":\"error\",\"message\":\"" + jsonEscape(message) + "\"}"); } diff --git a/native/hook-helper/src/output.h b/native/hook-helper/src/output.h index a6c2241e..0a976cab 100644 --- a/native/hook-helper/src/output.h +++ b/native/hook-helper/src/output.h @@ -5,11 +5,20 @@ #include #include #include +#include #include "decision.h" namespace lp { +/** One app the user can switch to: its process image's file name, the words the system shows for it (the file's + * description on Windows, the localised name on macOS; empty when neither is there), and the image's path. */ +struct AppEntry { + std::string name; + std::string desc; + std::string path; +}; + // Writes protocol lines on a background thread so the hook thread never blocks // on a full stdout pipe. When the queue is full, new lines are dropped. class Output { @@ -24,6 +33,8 @@ class Output { void line(std::string s); void emit(const Emit& e); void ready(); + void foregroundApp(const std::string& name); + void appList(const std::vector& apps); void error(const std::string& message); void error(const std::string& code, const std::string& message); // machine-readable code, e.g. "noAccess" void stop(); // drains the queue, then joins the writer thread diff --git a/native/hook-helper/tests/helper_tests.cpp b/native/hook-helper/tests/helper_tests.cpp index 412472c3..3e65fd06 100644 --- a/native/hook-helper/tests/helper_tests.cpp +++ b/native/hook-helper/tests/helper_tests.cpp @@ -371,6 +371,111 @@ static void test_fullscreen_probe_ignored_when_disabled() { CHECK(findEmit(r, Emit::Kind::Click) != nullptr); } +// An app on the skip list stands down entirely: its clicks and its chords (the text hotkey, the panel key) +// reach it untouched, while the enable/disable toggle still works there as the way back out. +static void test_skipped_app_stands_down() { + Config c; + c.trigger = Trigger::Alt; + c.clickPing = true; + c.skipApps = "Photoshop.exe,idea64"; + c.toggleMods = ModCtrl | ModAlt; + c.toggleVk = KEY_P; + c.textMods = ModAlt; + c.textVk = KEY_T; + c.panelVk = TAB; + Decision d; + d.setConfig(c); + std::string front = "Photoshop.exe"; + d.setForegroundApp([&front] { return front; }); + + d.onEvent(kd(ALT)); + Result r = d.onEvent(md(Btn::Left, 100, 100)); + CHECK(!r.swallow); // Photoshop keeps the click + CHECK(!findEmit(r, Emit::Kind::Click)); + CHECK(d.state() == S::Idle); + CHECK(!d.onEvent(mu(Btn::Left, 100, 100)).swallow); + d.onEvent(ku(ALT)); + + // Its chords are its own again: the text hotkey passes untouched. + d.onEvent(kd(ALT)); + r = d.onEvent(kd(KEY_T)); + CHECK(!r.swallow); + CHECK(!findEmit(r, Emit::Kind::TextRequested)); + d.onEvent(ku(KEY_T)); + d.onEvent(ku(ALT)); + // The panel key too. + r = d.onEvent(kd(TAB)); + CHECK(!r.swallow); + CHECK(!findEmit(r, Emit::Kind::Panel)); + d.onEvent(ku(TAB)); + + // Matching ignores case and the .exe suffix; another app gets gestures back. + front = "Explorer.EXE"; + d.onEvent(kd(ALT)); + r = d.onEvent(md(Btn::Left, 100, 100)); + CHECK(r.swallow); + r = d.onEvent(mu(Btn::Left, 100, 100)); + CHECK(r.swallow); + CHECK(findEmit(r, Emit::Kind::Click) != nullptr); + d.onEvent(ku(ALT)); + + // The toggle still answers in the skipped app: it is the way back out. + front = "idea64"; + d.onEvent(kd(ALT)); + d.onEvent(kd(CTRL)); + r = d.onEvent(kd(KEY_P)); + CHECK(r.swallow); + CHECK(findEmit(r, Emit::Kind::Toggled) != nullptr); + d.onEvent(ku(KEY_P)); + d.onEvent(ku(CTRL)); + d.onEvent(ku(ALT)); +} + +// With no apps on the skip list, the foreground app is never queried. +static void test_skip_apps_empty_never_queries() { + Config c; + c.trigger = Trigger::Alt; + c.clickPing = true; + Decision d; + d.setConfig(c); + int consulted = 0; + d.setForegroundApp([&consulted] { ++consulted; return "photoshop"; }); + d.onEvent(kd(ALT)); + Result r = d.onEvent(md(Btn::Left, 100, 100)); + CHECK(r.swallow); + CHECK(consulted == 0); + r = d.onEvent(mu(Btn::Left, 100, 100)); + CHECK(r.swallow); + CHECK(findEmit(r, Emit::Kind::Click) != nullptr); +} + +// Adding and removing an app by config takes effect at once, without touching the supplier. +static void test_skip_apps_live_update() { + Config c; + c.trigger = Trigger::Alt; + Decision d; + d.setConfig(c); + d.setForegroundApp([] { return "photoshop"; }); + d.onEvent(kd(ALT)); + CHECK(d.onEvent(md(Btn::Left, 100, 100)).swallow); // not on the list yet + d.onEvent(mu(Btn::Left, 100, 100)); + d.onEvent(ku(ALT)); + + Config withApp = c; + withApp.skipApps = "photoshop"; + d.setConfig(withApp); + d.onEvent(kd(ALT)); + CHECK(!d.onEvent(md(Btn::Left, 100, 100)).swallow); + d.onEvent(mu(Btn::Left, 100, 100)); + d.onEvent(ku(ALT)); + + d.setConfig(c); // the list is empty again + d.onEvent(kd(ALT)); + CHECK(d.onEvent(md(Btn::Left, 100, 100)).swallow); + d.onEvent(mu(Btn::Left, 100, 100)); + d.onEvent(ku(ALT)); +} + static void test_alt_up_after_gesture_is_masked() { Decision d; openWheel(d); @@ -1386,6 +1491,10 @@ static void test_parse_config_panel_key() { CHECK(c.kind == Command::Kind::Config && c.config.panelVk == 9); const Command keep = parseCommand(R"({"type":"config"})", c.config); CHECK(keep.config.panelVk == 9); + const Command front = parseCommand(R"({"type":"getForegroundApp"})", c.config); + CHECK(front.kind == Command::Kind::ForegroundApp); + const Command list = parseCommand(R"({"type":"getAppList"})", c.config); + CHECK(list.kind == Command::Kind::AppList); } static void test_json_parses_flat_objects() { @@ -1967,6 +2076,9 @@ int main() { test_win_tab_clicks_pass_through_and_sync_clears_flag(); test_fullscreen_game_keeps_the_click(); test_fullscreen_probe_ignored_when_disabled(); + test_skipped_app_stands_down(); + test_skip_apps_empty_never_queries(); + test_skip_apps_live_update(); test_toggle_hotkey_disables_and_enables(); test_hotkey_autorepeat_toggles_once(); test_hotkey_ignored_while_suspended(); diff --git a/src/main/appIcons.ts b/src/main/appIcons.ts new file mode 100644 index 00000000..abce142a --- /dev/null +++ b/src/main/appIcons.ts @@ -0,0 +1,33 @@ +/** + * An app's icon as a PNG data URL, or null when there is none worth showing: the platform read nothing, or the + * file only carries a copy of the shell's default program icon (an exe built without an icon embeds one anyway). + * `defaultPath` names a file that has no icon of its own, fetched once as that reference. + */ +export class AppIcons { + private readonly cache = new Map>(); + private readonly defaultIcon: Promise; + + constructor(private readonly readFileIcon: (path: string) => Promise, defaultPath?: string) { + this.defaultIcon = defaultPath ? this.fetch(defaultPath) : Promise.resolve(null); + } + + /** One fetch per path, shared by every caller: an icon doesn't change while the app runs. */ + icon(path: string): Promise { + if (path === '') return Promise.resolve(null); + let cached = this.cache.get(path); + if (!cached) { + cached = this.read(path); + this.cache.set(path, cached); + } + return cached; + } + + private async read(path: string): Promise { + const [icon, fallback] = await Promise.all([this.fetch(path), this.defaultIcon]); + return icon !== null && icon !== fallback ? icon : null; + } + + private fetch(path: string): Promise { + return this.readFileIcon(path).catch(() => null); + } +} diff --git a/src/main/index.ts b/src/main/index.ts index fe79c794..56d2e6bb 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -30,6 +30,7 @@ import type { HistoryState, MateAction, MateView } from '../shared/teammateIpc'; import { parseTextInput } from '../shared/textCommands'; import { updateErrorText, type UpdateState } from '../shared/update'; import { registerAppScheme, serveAppScheme } from './appProtocol'; +import { AppIcons } from './appIcons'; import { resolveTarget, toShared } from './displayNumbers'; import { EmoteCache } from './emoteCache'; import { EmoteLibrary, resolveEmoteArt } from './emoteLibrary'; @@ -241,6 +242,17 @@ function start(): void { ); overlays.start(); const bridge = new InputBridge({ command: helperExePath() }); + // An image file's own icon where the platform can read one (Windows); anywhere else this settles null. The small + // size is native 16px: what the dropdown shows, without a blurry downscale from 32. ApplicationFrameHost.exe has + // no icon of its own, so its icon is the system's default program icon - the copy an icon-less exe embeds. + // macOS: app.getFileIcon hands back the same generic tile for every bundle (observed on macOS 26), so the icon + // comes from the thumbnail generator instead, which draws the app's real one. + const appIcons = new AppIcons(async (path) => { + const image = IS_MAC + ? await nativeImage.createThumbnailFromPath(path, { width: 32, height: 32 }) + : await app.getFileIcon(path, { size: 'small' }); + return image.isEmpty() ? null : image.toDataURL(); + }, 'C:\\Windows\\System32\\ApplicationFrameHost.exe'); // Updates: only in an installed build, or in a development build pointed at a test server with LOLPING_UPDATE_TEST_URL. const testUrl = process.env.LOLPING_UPDATE_TEST_URL || undefined; @@ -1131,6 +1143,30 @@ function start(): void { capturing = on; syncSuspended(); }, + // The app-exception list: the capture button (the settings window hides, so the app the user wants is the one + // left in front) and everything the user can switch to (the dropdown). Icons come from the image file itself + // where the platform can read one; otherwise the dropdown shows the name only. + appList: async () => { + const apps = await bridge.ask({ type: 'getAppList' }, (ev) => (ev.type === 'appList' ? ev.apps : null), []); + return Promise.all(apps.map(async (a) => ({ ...a, icon: await appIcons.icon(a.path) }))); + }, + captureForegroundApp: async () => { + const win = settingsWindow(); + // Minimizing hands focus to the next top-level window, so the app the user wants is simply in front; + // when the answer is in, the window comes back on top. + win?.minimize(); + await new Promise((resolve) => setTimeout(resolve, 3000)); + const name = await bridge.ask( + { type: 'getForegroundApp' }, + (ev) => (ev.type === 'foregroundApp' ? ev.name : null), + null, + ); + if (win && !win.isDestroyed()) { + win.restore(); + win.focus(); + } + return name; + }, openAccessibility: () => { if (!IS_MAC) return; systemPreferences.isTrustedAccessibilityClient(true); // adds lolPing to the list and shows the system prompt diff --git a/src/main/inputBridge.ts b/src/main/inputBridge.ts index 358e359c..f0988129 100644 --- a/src/main/inputBridge.ts +++ b/src/main/inputBridge.ts @@ -2,7 +2,7 @@ import { spawn, type ChildProcess } from 'node:child_process'; import { EventEmitter } from 'node:events'; import { createInterface } from 'node:readline'; import { - HELPER_EXIT_NO_ACCESS, parseHelperLine, serializeCommand, type HelperCommand, type HelperStatus, + HELPER_EXIT_NO_ACCESS, parseHelperLine, serializeCommand, type HelperCommand, type HelperEvent, type HelperStatus, } from '../shared/protocol'; import { RestartPolicy } from './restartPolicy'; @@ -25,6 +25,7 @@ export class InputBridge extends EventEmitter { private lastConfig: HelperCommand | null = null; private restartTimer: NodeJS.Timeout | null = null; private current: HelperStatus = 'starting'; + private questions: ((ev: HelperEvent) => boolean)[] = []; private readonly policy: RestartPolicy; private readonly now: () => number; @@ -72,6 +73,30 @@ export class InputBridge extends EventEmitter { if (!this.child && !this.restartTimer) this.start(); } + /** + * One question to the running helper: resolves what `read` accepts from its next events, or `fallback` once the + * helper is gone or stays silent past `ms`. `read` returning null means "not my event" and keeps the question open. + */ + ask(cmd: HelperCommand, read: (ev: HelperEvent) => T | null, fallback: T, ms = 1500): Promise { + if (this.current !== 'running') return Promise.resolve(fallback); + return new Promise((resolve) => { + const question = (ev: HelperEvent): boolean => { + const answer = read(ev); + if (answer === null) return false; + clearTimeout(timer); + resolve(answer); + return true; // the pass that saw it drops the question + }; + const timer = setTimeout(() => { + const i = this.questions.indexOf(question); + if (i >= 0) this.questions.splice(i, 1); + resolve(fallback); + }, ms); + this.questions.push(question); + this.write(cmd); + }); + } + /** Always settles: on the child's 'exit' or 'error', or after a 1 s fallback that kills it. */ stop(): Promise { this.stopping = true; @@ -107,6 +132,7 @@ export class InputBridge extends EventEmitter { this.emit('log', `unparsed helper output: ${line}`); return; } + if (this.questions.length > 0) this.questions = this.questions.filter((q) => !q(ev)); if (ev.type === 'ready') { this.setStatus('running'); if (this.lastConfig) this.write(this.lastConfig); diff --git a/src/main/settingsIpc.ts b/src/main/settingsIpc.ts index afd51d70..bf377b1b 100644 --- a/src/main/settingsIpc.ts +++ b/src/main/settingsIpc.ts @@ -3,7 +3,8 @@ import { isCustomRef, isEmoteFx, isEmoteRefShape, type CustomEmote, type EmoteRe import type { Strings } from '../shared/i18n'; import { SETTINGS_CH, TEAMMATE_HISTORY_OPS, type About, type AppStatus, type CheckAgentResult, type CheckKeyResult, - type SecretResult, type SetSettingsResult, type TeammateHistoryOp, type TeammateStatus, type UsageMonth, + type RunningApp, type SecretResult, type SetSettingsResult, type TeammateHistoryOp, type TeammateStatus, + type UsageMonth, } from '../shared/ipc'; import { hotkeyLabel, hotkeyToAccelerator, type Hotkey } from '../shared/keys'; import { pingById, type PingId } from '../shared/pings'; @@ -35,6 +36,10 @@ export interface SettingsIpcDeps { about(): About; retryHelper(): void; setCapturing(on: boolean): void; + /** Hides the settings window for three seconds, then names the app that stayed in front; the capture button asks. */ + captureForegroundApp(): Promise; + /** The apps the user can switch to, with icons; the app-exception list's dropdown asks. */ + appList(): Promise; openAccessibility(): void; /** Strings in the app's current language. */ text(): Strings; @@ -187,6 +192,8 @@ export function registerSettingsIpc(d: SettingsIpcDeps): void { }); ipcMain.handle(SETTINGS_CH.retryHelper, () => d.retryHelper()); ipcMain.handle(SETTINGS_CH.capture, (_e, on: unknown) => d.setCapturing(on === true)); + ipcMain.handle(SETTINGS_CH.captureApp, () => d.captureForegroundApp()); + ipcMain.handle(SETTINGS_CH.appList, () => d.appList()); ipcMain.handle(SETTINGS_CH.openAccessibility, () => d.openAccessibility()); ipcMain.handle(SETTINGS_CH.roomGet, () => d.room.state()); ipcMain.handle(SETTINGS_CH.roomCreate, () => d.room.create()); diff --git a/src/preload/settings.ts b/src/preload/settings.ts index b7b0588b..29972a7e 100644 --- a/src/preload/settings.ts +++ b/src/preload/settings.ts @@ -28,6 +28,8 @@ const api: SettingsApi = { openProjectPage: () => ipcRenderer.invoke(SETTINGS_CH.openProject), retryHelper: () => ipcRenderer.invoke(SETTINGS_CH.retryHelper), setCapturing: (on) => ipcRenderer.invoke(SETTINGS_CH.capture, on), + captureForegroundApp: () => ipcRenderer.invoke(SETTINGS_CH.captureApp), + getAppList: () => ipcRenderer.invoke(SETTINGS_CH.appList), openAccessibility: () => ipcRenderer.invoke(SETTINGS_CH.openAccessibility), getRoom: () => ipcRenderer.invoke(SETTINGS_CH.roomGet), onRoom: (cb) => subscribe(SETTINGS_CH.roomChanged, cb), diff --git a/src/renderer/settings/App.tsx b/src/renderer/settings/App.tsx index 90d2e7f9..7864647a 100644 --- a/src/renderer/settings/App.tsx +++ b/src/renderer/settings/App.tsx @@ -21,6 +21,7 @@ import { KeyCapture } from './components/KeyCapture'; import { PermissionCard } from './components/PermissionCard'; import { RoomSection } from './components/RoomSection'; import { SettingRow, SliderRow, SwitchRow } from './components/rows'; +import { SkipApps } from './components/SkipApps'; import { StatusCard } from './components/StatusCard'; import { TeammateSection } from './components/TeammateSection'; import { TriggerPicker } from './components/TriggerPicker'; @@ -220,6 +221,7 @@ function SettingsPage({ settings: s, status, update }: { settings: Settings; sta description={t.gameCheckDesc} checked={s.gameCheck} onChange={(v) => void update({ gameCheck: v })} dim={off} /> )} +
{t.navToggle}
} title={t.toggleShortcut} description={t.toggleShortcutDesc}> diff --git a/src/renderer/settings/components/SkipApps.tsx b/src/renderer/settings/components/SkipApps.tsx new file mode 100644 index 00000000..168e53fe --- /dev/null +++ b/src/renderer/settings/components/SkipApps.tsx @@ -0,0 +1,100 @@ +import { Button, Combobox, Option } from '@fluentui/react-components'; +import { Add24Regular, Camera24Regular, Dismiss12Regular, FilterDismiss24Regular } from '@fluentui/react-icons'; +import { useState } from 'react'; +import type { RunningApp } from '../../../shared/ipc'; +import { appNameStem, MAX_SKIP_APPS, resolveSkipApp } from '../../../shared/settings'; +import { api } from '../api'; +import { useText } from '../text'; +import type { Update } from '../useAppState'; + +/** Process names that are lolPing itself: never offered, and a capture that never left the app adds nothing. */ +const isOwnApp = (name: string): boolean => { + const stem = appNameStem(name).toLowerCase(); + return stem === 'lolping' || stem === 'electron'; +}; + +/** + * The app-exception list: in these apps lolPing stands down entirely, so their own shortcuts (Photoshop's + * Option + click, a Tab that toggles panels) reach them untouched. The box picks from the apps running right + * now, with their icons where the platform has one, and still takes a typed name. + */ +export function SkipApps(props: { apps: string[]; dim: boolean; update: Update }) { + const t = useText(); + const [name, setName] = useState(''); + const [running, setRunning] = useState([]); + const [note, setNote] = useState(null); + + const refresh = (): void => { + void api.getAppList().then((apps) => setRunning(apps.filter((a) => !isOwnApp(a.name)))); + }; + + const add = (raw: string): void => { + setNote(null); + setName(''); + // A typed name may be the words the system shows for an app (an IME offers those); store the process name then. + const stem = resolveSkipApp(raw, running); + if (stem === '' || props.apps.includes(stem) || props.apps.length >= MAX_SKIP_APPS) return; + void props.update({ skipApps: [...props.apps, stem] }); + }; + + const remove = (app: string): void => { + setNote(null); + void props.update({ skipApps: props.apps.filter((a) => a !== app) }); + }; + + // The window hides for the wait, so the app the user wants is simply the one left in front. + const capture = async (): Promise => { + setNote(null); + const front = await api.captureForegroundApp(); + if (front !== null && !isOwnApp(front)) add(front); + else setNote(front === null ? t.skipAppsCaptureNone : t.skipAppsCaptureSelf); + }; + + return ( + <> +
+
+ +
+ {t.skipApps} + {t.skipAppsDesc} +
+
+
+ setName(e.target.value)} + onOpenChange={(_, d) => { if (d.open) refresh(); }} + onKeyDown={(e) => { if (e.key === 'Enter') add(name); }} + onOptionSelect={(_, d) => { if (typeof d.optionValue === 'string') add(d.optionValue); }}> + {running.map((a) => { + const shown = a.desc && a.desc !== a.name ? a.desc : a.name; + return ( + + ); + })} + + + +
+
+ {props.apps.length === 0 ? {t.skipAppsEmpty} : props.apps.map((a) => ( + + {a} + + + ))} +
+
+ {note ?
{note}
: null} + + ); +} diff --git a/src/renderer/settings/settings.css b/src/renderer/settings/settings.css index 510baa90..4f9ab083 100644 --- a/src/renderer/settings/settings.css +++ b/src/renderer/settings/settings.css @@ -254,3 +254,17 @@ main.content > *, .member, .mateRule, .mateStack > .mateRow { animation: lpRise @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 1ms !important; animation-delay: 0s !important; animation-iteration-count: 1 !important; transition-duration: 1ms !important; } } +/* App exceptions: a block card like the wheel editor; the picker and the chips sit under the heading, at the text's indent. */ +.card.skipApps { display: block; padding: 16px 20px 14px; } +.card.skipApps:hover { background: var(--card); } +.skipHead { display: flex; align-items: flex-start; gap: 16px; } +.skipHead .lbl { flex: 1; } +.skipPick { display: flex; align-items: center; gap: 8px; margin: 14px 0 0 40px; } +.skipList { display: flex; flex-wrap: wrap; gap: 6px; margin: 12px 0 0 40px; min-height: 22px; } +.skipOpt { display: flex; align-items: center; gap: 8px; } +.skipOptIco { display: inline-flex; width: 16px; height: 16px; } +.skipOptIco img { width: 16px; height: 16px; } +.skipDot { display: inline-flex; align-items: center; justify-content: center; width: 16px; height: 16px; border-radius: 50%; background: var(--colorNeutralBackground3); font-size: 10px; line-height: 16px; } +.skipChip { display: inline-flex; align-items: center; gap: 2px; padding: 2px 4px 2px 9px; border-radius: 4px; background: var(--colorNeutralBackground3); font-size: 12px; line-height: 16px; } +.skipChip button { display: grid; place-items: center; width: 16px; height: 16px; padding: 0; border: 0; border-radius: 50%; background: transparent; color: inherit; cursor: pointer; opacity: .55; } +.skipChip button:hover, .skipChip button:focus-visible { opacity: 1; background: var(--colorNeutralBackground3Hover); } diff --git a/src/shared/i18n.ts b/src/shared/i18n.ts index 51a8902f..855d08d7 100644 --- a/src/shared/i18n.ts +++ b/src/shared/i18n.ts @@ -472,6 +472,14 @@ const en = { `Places the ping in the centre of the wheel. When off, ${trigger} + click passes straight through to the app underneath`, gameCheck: 'Pause in fullscreen apps', gameCheckDesc: 'Games and other fullscreen apps keep every click: trigger + click passes through there, and gestures resume on the desktop', + skipApps: 'App exceptions', + skipAppsDesc: 'In these apps the ping and emote trigger keys - custom ones included - take no effect, and the app’s shortcuts work as usual.', + skipAppsPlaceholder: 'Process name, e.g. Photoshop', + skipAppsAdd: 'Add', + skipAppsCapture: 'Capture front app', + skipAppsCaptureSelf: 'lolPing itself was in front: try again from the app you want', + skipAppsCaptureNone: 'Could not read the front app. Is the helper running?', + skipAppsEmpty: 'No apps: lolPing gestures everywhere', toggleShortcut: 'Enable / disable shortcut', toggleShortcutDesc: 'Works anywhere, even while pinging is off', startEnabled: 'Start enabled', @@ -885,6 +893,14 @@ const zh: Strings = { clickPingDesc: (trigger) => `发送轮盘中心的信号。关闭时,${trigger} + 单击会直接传给下方的程序`, gameCheck: '全屏程序中暂停', gameCheckDesc: '游戏等全屏程序独占点击:触发键 + 单击原样交给程序,回到桌面后手势恢复正常', + skipApps: '程序例外', + skipAppsDesc: '在这些程序里,信号和表情的触发键(自定义的也算)不会生效,程序自己的快捷键一切照常', + skipAppsPlaceholder: '进程名,如 Photoshop', + skipAppsAdd: '添加', + skipAppsCapture: '捕获前台程序', + skipAppsCaptureSelf: '刚才在前台的是 lolPing:请在要添加的程序里再试一次', + skipAppsCaptureNone: '读取前台程序失败,请确认 helper 正在运行', + skipAppsEmpty: '还没有添加程序:手势在所有程序中生效', toggleShortcut: '开关快捷键', toggleShortcutDesc: '在任何地方都可用,即使信号已关闭', startEnabled: '启动时开启', diff --git a/src/shared/ipc.ts b/src/shared/ipc.ts index 8a807eee..757e5fa2 100644 --- a/src/shared/ipc.ts +++ b/src/shared/ipc.ts @@ -252,6 +252,18 @@ export const TEAMMATE_HISTORY_OPS: readonly TeammateHistoryOp[] = ['open', 'paus // with the overlay preload (a sandboxed preload can only require('electron'), never a sibling file). export { SETTINGS_CH } from './settingsChannels'; +/** One app the exception dropdown offers: its process name, image path and icon. */ +export interface RunningApp { + /** The process image's file name, "Photoshop.exe"; what the exception list stores. */ + name: string; + /** The words the system shows for it (the file's description); what a user types, so adding can match it. */ + desc: string; + /** The image's full path; only to fetch the icon. */ + path: string; + /** The icon as a PNG data URL, null where there is none worth showing. */ + icon: string | null; +} + /** window.settingsApi in the settings renderer. */ export interface SettingsApi { readonly platform: Platform; @@ -277,6 +289,11 @@ export interface SettingsApi { openProjectPage(): Promise; retryHelper(): Promise; setCapturing(on: boolean): Promise; + /** Hides the settings window for three seconds, then names the app that stayed in front, or null when the helper + * can't tell. Feeds the app-exception list's capture button. */ + captureForegroundApp(): Promise; + /** The apps the user can switch to right now, with icons, [] when the helper can't tell. Feeds the exception list's dropdown. */ + getAppList(): Promise; /** macOS: asks for Accessibility access and opens that page of System Settings. */ openAccessibility(): Promise; getRoom(): Promise; diff --git a/src/shared/protocol.ts b/src/shared/protocol.ts index 91d1c008..bd014141 100644 --- a/src/shared/protocol.ts +++ b/src/shared/protocol.ts @@ -8,8 +8,10 @@ export type WheelKind = 'ping' | 'emote' | 'ask'; /** * The helper's `ready` version this build expects. 5: the ask key, `"wheel":"ask"` and `triggerUp`. * 6 adds `askWords`, `scroll`, the `askDoubleTap` config field and the `staleWatch` command. + * 7 adds the app-exception list: the `skipApps` config field, the `foregroundApp` and `appList` events + * and the `getForegroundApp` and `getAppList` commands. */ -export const HELPER_VERSION = 6; +export const HELPER_VERSION = 7; /** * Messages the hook helper writes to stdout, one JSON object per line. @@ -28,6 +30,8 @@ export type HelperEvent = | { type: 'askWords'; x: number; y: number } /** A scroll while the stale watch is on; the helper sends at most one per 100 ms. */ | { type: 'scroll'; x: number; y: number } + | { type: 'foregroundApp'; name: string } + | { type: 'appList'; apps: { name: string; path: string; desc: string }[] } | { type: 'error'; message: string; code?: string } | { type: 'sim'; swallow: boolean; inject: string }; @@ -67,6 +71,19 @@ export function parseHelperLine(line: string): HelperEvent | null { case 'askWords': case 'scroll': return isInt(o.x) && isInt(o.y) ? { type: o.type, x: o.x, y: o.y } : null; + case 'foregroundApp': + return typeof o.name === 'string' ? { type: 'foregroundApp', name: o.name } : null; + case 'appList': { + if (!Array.isArray(o.apps)) return null; + const apps: { name: string; path: string; desc: string }[] = []; + for (const a of o.apps.slice(0, 64)) { + const e = typeof a === 'object' && a !== null && !Array.isArray(a) ? a as Record : null; + if (e && typeof e.name === 'string' && typeof e.path === 'string') { + apps.push({ name: e.name, path: e.path, desc: typeof e.desc === 'string' ? e.desc : '' }); + } + } + return { type: 'appList', apps }; + } case 'error': if (typeof o.message !== 'string') return null; return typeof o.code === 'string' ? { type: 'error', message: o.message, code: o.code } : { type: 'error', message: o.message }; @@ -94,6 +111,8 @@ export type HelperCommand = clickPing: boolean; /** Fullscreen apps keep every click: no wheel gestures while one is in front. */ gameCheck: boolean; + /** Comma-separated process names where lolPing stands down entirely. Empty: every app gets gestures. */ + skipApps: string; /** 'off': no emote key, so no emote gestures. */ emoteTrigger: HelperTrigger | 'off'; emoteTriggerVk: number; @@ -116,6 +135,8 @@ export type HelperCommand = | { type: 'suspend'; on: boolean } /** Report scrolls. Its own command, not a config field: a config cancels a gesture the user may be in. */ | { type: 'staleWatch'; on: boolean } + | { type: 'getForegroundApp' } + | { type: 'getAppList' } | { type: 'shutdown' }; /** @@ -141,6 +162,7 @@ export function configCommand( triggerVk: typeof t === 'object' ? t.vk : 0, clickPing: s.clickPing || sameWords, gameCheck: s.gameCheck, + skipApps: s.skipApps.join(','), emoteTrigger: typeof e === 'object' ? 'vk' : e, emoteTriggerVk: typeof e === 'object' ? e.vk : 0, emoteClick: s.emoteClick && e !== 'off', diff --git a/src/shared/settings.ts b/src/shared/settings.ts index d7e54f87..cb804723 100644 --- a/src/shared/settings.ts +++ b/src/shared/settings.ts @@ -40,6 +40,8 @@ export interface Settings { clickPingId: PingId; /** Fullscreen apps (games) keep every click: trigger + click passes through while one is front. */ gameCheck: boolean; + /** Apps where lolPing stands down entirely, gestures and hotkeys alike: process names without .exe. */ + skipApps: string[]; /** The displayed SVG size, shared by the ping and emote wheels. */ wheelSizePx: number; /** The wheel's slices, top (N) then clockwise. */ @@ -109,6 +111,7 @@ export const DEFAULT_SETTINGS: Settings = { dragThresholdPx: 8, clickPing: false, gameCheck: true, + skipApps: [], clickPingId: DEFAULT_CLICK_PING, wheelSizePx: WHEEL.size, wheel: [...DEFAULT_WHEEL], @@ -160,6 +163,26 @@ type NumKey = keyof typeof LIMITS; type BoolKey = 'enabledOnStart' | 'clickPing' | 'gameCheck' | 'keepLastPing' | 'muted' | 'tickSound' | 'launchAtStartup' | 'allowInternet' | 'rejoinRoom' | 'roomMuted' | 'emoteClick' | 'emoteSound' | 'friendEmotes' | 'autoUpdateCheck'; +/** At most MAX_SKIP_APPS entries: the list exists for a handful of apps. */ +export const MAX_SKIP_APPS = 32; + +/** One process name as the exception list stores it: trimmed, without a trailing ".exe". Case is kept for display; + * every match, here and in the helper, ignores it. */ +export const appNameStem = (name: string): string => { + const trimmed = name.trim(); + return trimmed.toLowerCase().endsWith('.exe') ? trimmed.slice(0, -4) : trimmed; +}; + +/** + * What an exception entry should store for `input`: a running app's process name when the user typed the words the + * system shows for it (an IME offers "网易UU远程", the process is GameViewer.exe), else the typed name as a stem. + */ +export const resolveSkipApp = (input: string, running: readonly { name: string; desc?: string }[]): string => { + const typed = input.trim().toLowerCase(); + const match = running.find((a) => typeof a.desc === 'string' && a.desc.trim().toLowerCase() === typed); + return match ? appNameStem(match.name) : appNameStem(input); +}; + const isObj = (v: unknown): v is Record => typeof v === 'object' && v !== null && !Array.isArray(v); const isVk = (v: unknown): v is number => Number.isInteger(v) && (v as number) >= 1 && (v as number) <= 254; @@ -299,6 +322,20 @@ function roomCode(raw: unknown): string | null { return parsed.ok ? parsed.code : null; } +/** Process names where lolPing stands down: trimmed, no .exe, no duplicate stems; the first MAX_SKIP_APPS. */ +function skipApps(raw: unknown): string[] { + if (!Array.isArray(raw)) return []; + const out: string[] = []; + for (const e of raw) { + if (out.length >= MAX_SKIP_APPS) break; + if (typeof e !== 'string') continue; + const stem = appNameStem(e); + if (stem === '' || out.some((kept) => kept.toLowerCase() === stem.toLowerCase())) continue; + out.push(stem); + } + return out; +} + /** Valid entries only, rebuilt field by field: well-formed unique ids, boolean flags, a safe name; the first MAX_CUSTOM_EMOTES. */ function customEmotes(raw: unknown): CustomEmote[] { if (!Array.isArray(raw)) return []; @@ -341,6 +378,7 @@ export function normalizeSettings(raw: unknown, platform: Platform = 'win', iden dragThresholdPx: num(r.dragThresholdPx, 'dragThresholdPx'), clickPing: bool(r.clickPing, 'clickPing'), gameCheck: bool(r.gameCheck, 'gameCheck'), + skipApps: skipApps(r.skipApps), wheelSizePx: num(r.wheelSizePx, 'wheelSizePx'), clickPingId: isPingId(r.clickPingId) ? r.clickPingId : DEFAULT_CLICK_PING, wheel: isValidWheel(r.wheel) ? [...r.wheel] : [...DEFAULT_WHEEL], diff --git a/src/shared/settingsChannels.ts b/src/shared/settingsChannels.ts index f54d88b9..246ab76b 100644 --- a/src/shared/settingsChannels.ts +++ b/src/shared/settingsChannels.ts @@ -17,6 +17,8 @@ export const SETTINGS_CH = { openProject: 'app:openProjectPage', retryHelper: 'app:retryHelper', capture: 'app:capture', + captureApp: 'app:captureApp', + appList: 'app:appList', openAccessibility: 'app:openAccessibility', roomGet: 'room:get', roomChanged: 'room:state', diff --git a/tests/helper/protocol.test.ts b/tests/helper/protocol.test.ts index b5ed981a..c9107832 100644 --- a/tests/helper/protocol.test.ts +++ b/tests/helper/protocol.test.ts @@ -34,7 +34,7 @@ describe('hook-helper --simulate', () => { it('announces itself first', async () => { const events = await simulate([]); expect(events[0]).toEqual({ type: 'ready', version: HELPER_VERSION }); - expect(HELPER_VERSION).toBe(6); + expect(HELPER_VERSION).toBe(7); }); it('opens and releases the wheel on Alt+drag', async () => { diff --git a/tests/main/appIcons.test.ts b/tests/main/appIcons.test.ts new file mode 100644 index 00000000..a3975180 --- /dev/null +++ b/tests/main/appIcons.test.ts @@ -0,0 +1,34 @@ +import { describe, expect, it } from 'vitest'; +import { AppIcons } from '../../src/main/appIcons'; + +describe('AppIcons', () => { + it('fetches one icon per path and serves the rest from the cache', async () => { + let reads = 0; + const icons = new AppIcons(async (path) => { + ++reads; + return `icon:${path}`; + }); + expect(await icons.icon('C:\\a.exe')).toBe('icon:C:\\a.exe'); + expect(await icons.icon('C:\\a.exe')).toBe('icon:C:\\a.exe'); + expect(await icons.icon('C:\\b.exe')).toBe('icon:C:\\b.exe'); + expect(reads).toBe(2); + }); + + it('reads the reference once and hides icons that only copy it', async () => { + const reads: string[] = []; + const icons = new AppIcons(async (path) => { + reads.push(path); + return path === 'ref.exe' || path === 'zcode.exe' ? 'default' : 'own'; + }, 'ref.exe'); + expect(await icons.icon('zcode.exe')).toBeNull(); // the default in disguise + expect(await icons.icon('own.exe')).toBe('own'); + expect(reads.filter((p) => p === 'ref.exe')).toHaveLength(1); + }); + + it('shows everything when there is no reference file', async () => { + const icons = new AppIcons(async (path) => (path === 'C:\\b.exe' ? null : 'own')); + expect(await icons.icon('C:\\a.exe')).toBe('own'); + expect(await icons.icon('C:\\b.exe')).toBeNull(); + expect(await icons.icon('')).toBeNull(); + }); +}); diff --git a/tests/main/fixtures/fake-helper.mjs b/tests/main/fixtures/fake-helper.mjs index 970e6184..4b90c0f0 100644 --- a/tests/main/fixtures/fake-helper.mjs +++ b/tests/main/fixtures/fake-helper.mjs @@ -16,9 +16,17 @@ if (mode === 'noaccess') { const cmd = JSON.parse(buf.slice(0, i)); buf = buf.slice(i + 1); if (cmd.type === 'shutdown') process.exit(0); - // Echo back what we received so the test can observe it. - process.stdout.write(`${JSON.stringify({ type: 'error', message: `got:${cmd.type}` })}\n`); + process.stdout.write(`${JSON.stringify(reply(cmd))}\n`); } }); process.stdin.on('end', () => process.exit(0)); } + +// 'answer' fills in the helper's app queries; every other command is echoed back so the test can observe it. +function reply(cmd) { + if (mode === 'answer' && cmd.type === 'getForegroundApp') return { type: 'foregroundApp', name: 'Photoshop.exe' }; + if (mode === 'answer' && cmd.type === 'getAppList') { + return { type: 'appList', apps: [{ name: 'GameViewer.exe', desc: '网易UU远程', path: 'C:\\NetEase\\GameViewer.exe', hasIcon: true }] }; + } + return { type: 'error', message: `got:${cmd.type}` }; +} diff --git a/tests/main/inputBridge.test.ts b/tests/main/inputBridge.test.ts index 4b8ab7cc..dd311262 100644 --- a/tests/main/inputBridge.test.ts +++ b/tests/main/inputBridge.test.ts @@ -45,7 +45,7 @@ describe('InputBridge', () => { it('re-sends the last config whenever the helper becomes ready', async () => { const b = bridge('echo'); b.send({ - type: 'config', trigger: 'alt', triggerVk: 0, clickPing: false, gameCheck: true, emoteTrigger: 'ctrl', emoteTriggerVk: 0, emoteClick: false, + type: 'config', trigger: 'alt', triggerVk: 0, clickPing: false, gameCheck: true, skipApps: '', emoteTrigger: 'ctrl', emoteTriggerVk: 0, emoteClick: false, askTrigger: 'off', askTriggerVk: 0, askClick: false, askDoubleTap: false, dragThresholdPx: 8, toggleMods: 3, toggleVk: 80, textMods: 3, textVk: 84, panelVk: 0, enabled: true, }); @@ -54,6 +54,26 @@ describe('InputBridge', () => { await echoed; }); + it('asks the helper and resolves its answer', async () => { + const b = bridge('answer'); + const read = (e: HelperEvent) => (e.type === 'foregroundApp' ? e.name : null); + expect(await b.ask({ type: 'getForegroundApp' }, read, 'none')).toBe('none'); // not running yet + const running = waitFor(b, 'status', (s) => s === 'running'); + b.start(); + await running; + expect(await b.ask({ type: 'getForegroundApp' }, read, 'none')).toBe('Photoshop.exe'); + }); + + it('settles the fallback when nothing answers in time', async () => { + const b = bridge('answer'); + const running = waitFor(b, 'status', (s) => s === 'running'); + b.start(); + await running; + // setEnabled is echoed as an error event, which the question does not read: it runs out of time instead. + const read = (e: HelperEvent) => (e.type === 'appList' ? e.apps[0]?.name ?? 'none' : null); + expect(await b.ask({ type: 'setEnabled', enabled: true }, read, 'none', 30)).toBe('none'); + }); + it('restarts a crashing helper and gives up after three crashes', async () => { const b = bridge('crash'); const failed = waitFor(b, 'status', (s) => s === 'failed'); diff --git a/tests/shared/protocol.test.ts b/tests/shared/protocol.test.ts index 7a7c856a..33fdd112 100644 --- a/tests/shared/protocol.test.ts +++ b/tests/shared/protocol.test.ts @@ -16,6 +16,17 @@ describe('parseHelperLine', () => { expect(parseHelperLine('{"type":"textRequested"}')).toEqual({ type: 'textRequested' }); expect(parseHelperLine('{"type":"panel","show":true}')).toEqual({ type: 'panel', show: true }); expect(parseHelperLine('{"type":"panel","show":false}')).toEqual({ type: 'panel', show: false }); + expect(parseHelperLine('{"type":"foregroundApp","name":"Photoshop.exe"}')).toEqual({ type: 'foregroundApp', name: 'Photoshop.exe' }); + expect(parseHelperLine('{"type":"appList","apps":[{"name":"Photoshop.exe","desc":"Adobe Photoshop","path":"C:\\\\Adobe\\\\Photoshop.exe"},{"name":"chrome","path":"/opt/chrome"}]}')) + .toEqual({ + type: 'appList', + apps: [ + { name: 'Photoshop.exe', desc: 'Adobe Photoshop', path: 'C:\\Adobe\\Photoshop.exe' }, + { name: 'chrome', desc: '', path: '/opt/chrome' }, + ], + }); + expect(parseHelperLine('{"type":"appList","apps":[{"name":"no path"},{"path":"C:\\\\b.exe"},"text",{"name":"","path":"","desc":7}]}')) + .toEqual({ type: 'appList', apps: [{ name: '', path: '', desc: '' }] }); expect(parseHelperLine('{"type":"error","message":"boom"}')).toEqual({ type: 'error', message: 'boom' }); expect(parseHelperLine('{"type":"error","code":"noAccess","message":"x"}')).toEqual({ type: 'error', code: 'noAccess', message: 'x' }); expect(parseHelperLine('{"type":"sim","swallow":true,"inject":"down:left"}')).toEqual({ type: 'sim', swallow: true, inject: 'down:left' }); @@ -54,7 +65,8 @@ describe('parseHelperLine', () => { it('rejects malformed lines', () => { for (const line of ['', 'nope', '42', 'null', '{"type":"wheelOpen","x":1}', '{"type":"click","x":1.5,"y":2}', - '{"type":"toggled"}', '{"type":"panel"}', '{"type":"panel","show":"yes"}', '{"type":"mystery"}', '{"x":1,"y":2}']) { + '{"type":"toggled"}', '{"type":"panel"}', '{"type":"panel","show":"yes"}', '{"type":"foregroundApp"}', '{"type":"appList"}', + '{"type":"appList","apps":"x"}', '{"type":"mystery"}', '{"x":1,"y":2}']) { expect(parseHelperLine(line), line).toBeNull(); } }); @@ -63,13 +75,18 @@ describe('parseHelperLine', () => { describe('commands', () => { it('builds a flat config command for named triggers', () => { expect(configCommand(DEFAULT_SETTINGS, true)).toEqual({ - type: 'config', trigger: 'alt', triggerVk: 0, clickPing: false, gameCheck: true, + type: 'config', trigger: 'alt', triggerVk: 0, clickPing: false, gameCheck: true, skipApps: '', emoteTrigger: 'ctrl', emoteTriggerVk: 0, emoteClick: false, askTrigger: 'off', askTriggerVk: 0, askClick: false, askDoubleTap: false, dragThresholdPx: 8, toggleMods: 3, toggleVk: 0x50, textMods: 2, textVk: 0, panelVk: 0, enabled: true, }); }); + it('sends the skip list as one comma-joined name', () => { + expect(configCommand({ ...DEFAULT_SETTINGS, skipApps: ['photoshop', 'idea64'] }, true)) + .toMatchObject({ skipApps: 'photoshop,idea64' }); + }); + it('sends textVk 0 outside a room', () => { expect(configCommand(DEFAULT_SETTINGS, true, { text: false, panel: false })).toMatchObject({ textMods: 2, textVk: 0 }); }); diff --git a/tests/shared/settings.test.ts b/tests/shared/settings.test.ts index b8e6c4c4..101cade1 100644 --- a/tests/shared/settings.test.ts +++ b/tests/shared/settings.test.ts @@ -3,9 +3,9 @@ import { DEFAULT_CLICK_EMOTE, DEFAULT_EMOTE_WHEEL } from '../../src/shared/emote import { MOD } from '../../src/shared/keys'; import { formatRoomCode, makeRoomCode } from '../../src/shared/roomCode'; import { - askKeyClashes, askKeyHeld, asksOnPing, DEFAULT_SETTINGS, keyboardTriggers, mergeSettings, normalizeSettings, - overlaySettings, patchClashes, rendererPatch, sameTrigger, separateAskKey, soundLevel, triggerLabel, triggersClash, - type TriggerKey, + askKeyClashes, askKeyHeld, asksOnPing, DEFAULT_SETTINGS, keyboardTriggers, MAX_SKIP_APPS, mergeSettings, + normalizeSettings, overlaySettings, patchClashes, rendererPatch, resolveSkipApp, sameTrigger, separateAskKey, + soundLevel, triggerLabel, triggersClash, type TriggerKey, } from '../../src/shared/settings'; import type { AskTrigger } from '../../src/shared/teammate/settings'; @@ -317,6 +317,26 @@ describe('emote settings', () => { expect(list).toEqual([{ ...entry('a'), sound: true }, entry('b')]); }); + it('skip apps keep their case but match stems without .exe, deduplicated', () => { + expect(normalizeSettings({ skipApps: [' Photoshop.EXE ', 'photoshop', 'IDEA64', '', 'nope.EXE', 7, null] }).skipApps) + .toEqual(['Photoshop', 'IDEA64', 'nope']); + expect(normalizeSettings({ skipApps: 'nope' }).skipApps).toEqual([]); + expect(DEFAULT_SETTINGS.skipApps).toEqual([]); + }); + + it('a typed display name becomes the running app it names', () => { + const running = [{ name: 'GameViewer.exe', desc: '网易UU远程' }, { name: 'ZCode.exe', desc: 'ZCode' }]; + expect(resolveSkipApp(' 网易UU远程 ', running)).toBe('GameViewer'); + expect(resolveSkipApp('zcode.exe', running)).toBe('zcode'); + expect(resolveSkipApp('Notepad', running)).toBe('Notepad'); + }); + + it('skip apps keep the first 32', () => { + const kept = normalizeSettings({ skipApps: Array.from({ length: 40 }, (_, i) => `app${i}`) }).skipApps; + expect(kept).toHaveLength(MAX_SKIP_APPS); + expect(kept[0]).toBe('app0'); + }); + it('custom emotes keep the first 24', () => { const many = Array.from({ length: 30 }, (_, i) => ({ id: `c:${i.toString(16).padStart(32, '0')}`, name: `E${i}`, animated: false })); const kept = normalizeSettings({ customEmotes: many }).customEmotes;