From bac06bdf231bae7214fcd60b75b3ff76d616d0ea Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Sun, 31 May 2026 23:45:28 +0300 Subject: [PATCH 001/149] Switch `sonner-native` patch to target ESM source (#10668) --- patches/sonner-native@0.21.0.patch | 41 +++++++++++++++++++++--------- pnpm-lock.yaml | 6 ++--- 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/patches/sonner-native@0.21.0.patch b/patches/sonner-native@0.21.0.patch index 8b6ce6fcf1..f045900525 100644 --- a/patches/sonner-native@0.21.0.patch +++ b/patches/sonner-native@0.21.0.patch @@ -1,22 +1,39 @@ -diff --git a/lib/commonjs/toast.js b/lib/commonjs/toast.js -index 121816a452339c1088aeba87928ff63a0bdacca5..47e74bce47323201f0bb4e5ed9dc55b373c07b97 100644 ---- a/lib/commonjs/toast.js -+++ b/lib/commonjs/toast.js -@@ -264,7 +264,7 @@ const Toast = exports.Toast = /*#__PURE__*/React.forwardRef(({ +diff --git a/lib/module/toast.js b/lib/module/toast.js +index be089f3ff23017a6844e2010cedc547729e198aa..c2dd0fa2df93f929c33bf2bcc3e6f921941fa006 100644 +--- a/lib/module/toast.js ++++ b/lib/module/toast.js +@@ -1,8 +1,8 @@ + "use strict"; + + import * as React from 'react'; +-import { ActivityIndicator, Pressable, Text, View } from 'react-native'; +-import Animated, { useAnimatedStyle, useSharedValue, withRepeat, withTiming } from 'react-native-reanimated'; ++import { ActivityIndicator, Pressable, Text, View, Platform } from 'react-native'; ++import Animated, { useAnimatedStyle, useSharedValue, withRepeat, withTiming, FadeOut } from 'react-native-reanimated'; + import { ANIMATION_DURATION, useToastLayoutAnimations } from "./animations.js"; + import { toastDefaultValues } from "./constants.js"; + import { useToastContext } from "./context.js"; +@@ -258,7 +258,10 @@ export const Toast = /*#__PURE__*/React.forwardRef(({ ...toastSwipeHandlerProps, - children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeReanimated.default.View, { + children: /*#__PURE__*/_jsx(Animated.View, { entering: entering, - exiting: exiting, -+ exiting: _reactNative.Platform.OS === 'android' ? undefined : exiting, ++ exiting: Platform.select({ ++ android: undefined, ++ default: exiting ++ }), children: jsx }) }); -@@ -274,7 +274,7 @@ const Toast = exports.Toast = /*#__PURE__*/React.forwardRef(({ - children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeReanimated.default.View, { +@@ -268,7 +271,10 @@ export const Toast = /*#__PURE__*/React.forwardRef(({ + children: /*#__PURE__*/_jsx(Animated.View, { style: [unstyled ? undefined : elevationStyle, defaultStyles.toast, toastStyleCtx, styles?.toast, style, wiggleAnimationStyle], entering: entering, - exiting: exiting, -+ exiting: _reactNative.Platform.OS === 'android' ? undefined : exiting, - children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, { ++ exiting: Platform.select({ ++ android: undefined, ++ default: exiting ++ }), + children: /*#__PURE__*/_jsxs(View, { style: [defaultStyles.toastContent, toastContentStyleCtx, styles?.toastContent], - children: [promiseOptions || variant === 'loading' ? 'loading' in icons ? icons.loading : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ActivityIndicator, {}) : icon ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, { + children: [promiseOptions || variant === 'loading' ? 'loading' in icons ? icons.loading : /*#__PURE__*/_jsx(ActivityIndicator, {}) : icon ? /*#__PURE__*/_jsx(View, { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2ee7f8313e..86d20ca5f3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -235,7 +235,7 @@ patchedDependencies: react-native-uitextview@1.4.0: 62de26caadfc39d1bdff204cdc03a705c0cd343999825e06d8c0c120de06cc99 react-native-view-shot@4.0.3: a2457dc30a82cc8c21f371a6f860d9396d450a2a1b4265b1a4ee13bdb24d3268 react-native@0.81.5: 2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194 - sonner-native@0.21.0: a07ea00b9f97634a402875e49a5231407e82733dd49c5dbc230afc3d1bc7dcf5 + sonner-native@0.21.0: 4bcd0da0fec32e943460e6e788a9e4adf601b507d2dfd0c8246a6c8c74d8f638 importers: @@ -693,7 +693,7 @@ importers: version: 2.0.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0) sonner-native: specifier: 0.21.0 - version: 0.21.0(patch_hash=a07ea00b9f97634a402875e49a5231407e82733dd49c5dbc230afc3d1bc7dcf5)(4e42d15c94c2c56af69d343a007eb893) + version: 0.21.0(patch_hash=4bcd0da0fec32e943460e6e788a9e4adf601b507d2dfd0c8246a6c8c74d8f638)(4e42d15c94c2c56af69d343a007eb893) tippy.js: specifier: ^6.3.7 version: 6.3.7 @@ -18539,7 +18539,7 @@ snapshots: uuid: 8.3.2 websocket-driver: 0.7.4 - sonner-native@0.21.0(patch_hash=a07ea00b9f97634a402875e49a5231407e82733dd49c5dbc230afc3d1bc7dcf5)(4e42d15c94c2c56af69d343a007eb893): + sonner-native@0.21.0(patch_hash=4bcd0da0fec32e943460e6e788a9e4adf601b507d2dfd0c8246a6c8c74d8f638)(4e42d15c94c2c56af69d343a007eb893): dependencies: react: 19.1.0 react-native: 0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) From 855d785bf851598c71b38c02ed1439d1d7aeb0dc Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Mon, 1 Jun 2026 15:18:15 +0300 Subject: [PATCH 002/149] Gate new group chat creation on canCreateGroups (#10656) Co-authored-by: Claude Opus 4.8 (1M context) --- src/components/dms/InitiateChatFlow.tsx | 38 +++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/src/components/dms/InitiateChatFlow.tsx b/src/components/dms/InitiateChatFlow.tsx index f58d168cbe..09760aefdf 100644 --- a/src/components/dms/InitiateChatFlow.tsx +++ b/src/components/dms/InitiateChatFlow.tsx @@ -14,6 +14,7 @@ import {sanitizeDisplayName} from '#/lib/strings/display-names' import {sanitizeHandle} from '#/lib/strings/handles' import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useActorAutocompleteQuery} from '#/state/queries/actor-autocomplete' +import {useChatActorStatusQuery} from '#/state/queries/messages/get-status' import {useProfileFollowsQuery} from '#/state/queries/profile-follows' import {useSession} from '#/state/session' import {type ListMethods} from '#/view/com/util/List' @@ -31,6 +32,7 @@ import {ChevronRight_Stroke2_Corner0_Rounded as ChevronRightIcon} from '#/compon import {PersonGroup_Stroke2_Corner2_Rounded as PersonGroupIcon} from '#/components/icons/Person' import {TimesLarge_Stroke2_Corner0_Rounded as XIcon} from '#/components/icons/Times' import * as ProfileCard from '#/components/ProfileCard' +import * as Prompt from '#/components/Prompt' import {Text} from '#/components/Typography' import {IS_NATIVE, IS_WEB} from '#/env' import type * as bsky from '#/types/bsky' @@ -206,6 +208,10 @@ export function InitiateChatFlow({ const listRef = useRef(null) const {currentAccount} = useSession() const inputRef = useRef(null) + const accountTooNewPromptControl = Dialog.useDialogControl() + + const {data: chatStatus} = useChatActorStatusQuery() + const canCreateGroups = chatStatus?.canCreateGroups ?? true const [searchText, setSearchText] = useState('') @@ -358,9 +364,13 @@ export function InitiateChatFlow({ }, [chatState, control, newGroupChatTitle, title]) const handlePressNewGroupChat = useCallback(() => { + if (!canCreateGroups) { + accountTooNewPromptControl.open() + return + } LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut) dispatch({type: 'startNewGroupChat', screenTitle: newGroupChatTitle}) - }, [newGroupChatTitle]) + }, [accountTooNewPromptControl, canCreateGroups, newGroupChatTitle]) const handlePressNext = useCallback(() => { LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut) @@ -384,6 +394,7 @@ export function InitiateChatFlow({ ) } @@ -429,7 +440,13 @@ export function InitiateChatFlow({ return null } }, - [chatState, handlePressNewGroupChat, moderationOpts, onSelectChat], + [ + canCreateGroups, + chatState, + handlePressNewGroupChat, + moderationOpts, + onSelectChat, + ], ) useLayoutEffect(() => { @@ -652,6 +669,14 @@ export function InitiateChatFlow({ : l`Start chat` } style={web([a.contents])}> + {}} + showCancel={false} + /> void}) { +function NewGroupChatButton({ + onPress, + dimmed = false, +}: { + onPress: () => void + dimmed?: boolean +}) { const t = useTheme() const {t: l} = useLingui() @@ -726,6 +757,7 @@ function NewGroupChatButton({onPress}: {onPress: () => void}) { a.align_center, a.gap_sm, pressed || focused || hovered ? t.atoms.bg_contrast_25 : t.atoms.bg, + dimmed && {opacity: 0.5}, ]}> Date: Mon, 1 Jun 2026 15:35:37 +0300 Subject: [PATCH 003/149] [pnpm] Use latest pnpm (#10585) --- Dockerfile.embedr | 2 +- package.json | 2 +- pnpm-lock.yaml | 76 +++++++++++++++++++++++------------------------ 3 files changed, 40 insertions(+), 40 deletions(-) diff --git a/Dockerfile.embedr b/Dockerfile.embedr index b134bfa486..a55ddf11ac 100644 --- a/Dockerfile.embedr +++ b/Dockerfile.embedr @@ -33,7 +33,7 @@ RUN mkdir --parents $NVM_DIR && \ RUN \. "$NVM_DIR/nvm.sh" && \ nvm install $NODE_VERSION && \ nvm use $NODE_VERSION && \ - npm install --global pnpm@11.1.3 && \ + npm install --global pnpm@11.5.0 && \ pnpm install --frozen-lockfile && \ cd bskyembed && pnpm install --frozen-lockfile && cd .. && \ pnpm intl:build && \ diff --git a/package.json b/package.json index 46308b1af5..a5060568eb 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "devEngines": { "packageManager": { "name": "pnpm", - "version": "11.1.3", + "version": "11.5.0", "onFail": "warn" }, "runtime": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 86d20ca5f3..9f3c33bb4b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,52 +7,52 @@ importers: configDependencies: {} packageManagerDependencies: '@pnpm/exe': - specifier: 11.1.3 - version: 11.1.3 + specifier: 11.5.0 + version: 11.5.0 pnpm: - specifier: 11.1.3 - version: 11.1.3 + specifier: 11.5.0 + version: 11.5.0 packages: - '@pnpm/exe@11.1.3': - resolution: {integrity: sha512-J6bSMpZlHVUKuMKtPT/+lrFPpvBiOIgk6HnNC3vmoM/fsMgFhao6ITFwdsUMzdCl2qHf9cnVYA4ZBdsGmVUnpg==} + '@pnpm/exe@11.5.0': + resolution: {integrity: sha512-4hzOXq1HHrNPjwI8k1rt7Ot/Yrdx1JX3pn/L/M95ii1gid1Q6ZK6dVg4+gbSgUdPsYmYDZ4/Yfc0A7vd5C0ndg==} hasBin: true - '@pnpm/linux-arm64@11.1.3': - resolution: {integrity: sha512-sz3fc0hSqguk2eGe/InelpBD3LP82MzF+8pLzDpYNGuhasGY+VWkuxEo02HczQYRVXTsbpZVepk+Qs2CONc04Q==} + '@pnpm/linux-arm64@11.5.0': + resolution: {integrity: sha512-NV9HdzzCB0epuI9LqZZeTaqjH3OweNQSQCS76GzEkFxJHS9e5Gvu7tgex91gxVL7bCZ+R4yr/3d3yexBFtr2ug==} cpu: [arm64] os: [linux] - '@pnpm/linux-x64@11.1.3': - resolution: {integrity: sha512-UadJh5fJZWa47OtdZTWLKWDj4z5WpZFB5pS2wOh/kfKypUmQyjmbOMClP7/yJGS2ZtrSjRgYjIEWAjndkWsMaA==} + '@pnpm/linux-x64@11.5.0': + resolution: {integrity: sha512-vH83rRx4iPk/bwm9pBVCn+5hXbcQI66I/4zk6Vc09SusJgTqOdbN4U6VhMcGIqSEdr901ksYGCyIbMv7f6Guew==} cpu: [x64] os: [linux] - '@pnpm/linuxstatic-arm64@11.1.3': - resolution: {integrity: sha512-lWmGr96w+VrIRVsEfTXROB3GeQNxrX2Hy32j3USHr6WlqmpH1i7YjavJGpoXeVZbb77fCFjNFAtsJzGXSgy/Og==} + '@pnpm/linuxstatic-arm64@11.5.0': + resolution: {integrity: sha512-2nOnMW1rSwGv22q2yZz1HlGT3ly/Ij8wUlX0NB4n+Krx7nETRHA3MgWsbkVejxHknDcTulRVudAghuX9rgrXcw==} cpu: [arm64] os: [linux] libc: [musl] - '@pnpm/linuxstatic-x64@11.1.3': - resolution: {integrity: sha512-I74GDBOPbr5TXgob3ct4hv6BQtLGdsjGJrII2qNl/e2xYHXekjIWE4Eh7RGN4C7xu+BZYKtvnOOr149yR7KxUw==} + '@pnpm/linuxstatic-x64@11.5.0': + resolution: {integrity: sha512-ONOC1Mg0JusHtjzkRlre9di1QO+GAjy4HP7jMjDx21yGhrSheNdUweTXbekMH1EflRd19kTU6d8M3zewJFPtVg==} cpu: [x64] os: [linux] libc: [musl] - '@pnpm/macos-arm64@11.1.3': - resolution: {integrity: sha512-nWn155BVa54iNyg4iolVhjMtqumXHPh8ul5CFjQFJXdwgr9MRUgc5EUBML1+7mS8C/7Wcex5HUgn/w3fliHCsQ==} + '@pnpm/macos-arm64@11.5.0': + resolution: {integrity: sha512-od0ALdTxs4A7s5vAH5q2l2phzCJb98+PVOW1rq7BGpWGeYxQ+EwvL+vq0KaO6iLsn/eVVoncCkgZ/k6QNYuTgw==} cpu: [arm64] os: [darwin] - '@pnpm/win-arm64@11.1.3': - resolution: {integrity: sha512-4u6PQL7/WgwdweC2ZJcdCzhM1koRFG5ofcUSrIVsdyo9ePfGq2D9p1rkZbiLEfIGvl3GKOsfMB5DRTgs8es4AQ==} + '@pnpm/win-arm64@11.5.0': + resolution: {integrity: sha512-9HqbI80FjVVqFx4+EPxYYNfeP9Sx69W6kYqUDvOJn9G7RJ/2NNNQ898cVHTMpXlW1/PrMEcijmdpa/NjZIrWiQ==} cpu: [arm64] os: [win32] - '@pnpm/win-x64@11.1.3': - resolution: {integrity: sha512-JmhH7ljJ3MWjvWFz/YHbu/27ISCNLZsQb1JG+ib3uHlfUwIJuF6BudXYsbS5Uu0o7xUvC9sPPm+Uho4Or6R3vA==} + '@pnpm/win-x64@11.5.0': + resolution: {integrity: sha512-Q89CQqFGAsWmfvHZs5Kbbar45q3GBYtfAdPUCiVMVNJoLi3dsBS2LCvUq8ak3AufkFDaJBpvhaFcDP2M1NXr3A==} cpu: [x64] os: [win32] @@ -116,45 +116,45 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - pnpm@11.1.3: - resolution: {integrity: sha512-yFNX/hfKEt0j3XBxgiZm39fjy3b+IU4zcLXqL7NPKiMRhVCbY+cX880KyzjdP42CvNXoFyQArmeLcOpPvtCJbQ==} + pnpm@11.5.0: + resolution: {integrity: sha512-2/zE+Bz0hZev1Lw5H/3xLBHxqfuDo5W/prCi2cwv2P/rr9scy9UpYyFT95OQTCYVt/Cf4aNFRz/Rw1hFFyqOsQ==} engines: {node: '>=22.13'} hasBin: true snapshots: - '@pnpm/exe@11.1.3': + '@pnpm/exe@11.5.0': dependencies: '@reflink/reflink': 0.1.19 detect-libc: 2.1.2 optionalDependencies: - '@pnpm/linux-arm64': 11.1.3 - '@pnpm/linux-x64': 11.1.3 - '@pnpm/linuxstatic-arm64': 11.1.3 - '@pnpm/linuxstatic-x64': 11.1.3 - '@pnpm/macos-arm64': 11.1.3 - '@pnpm/win-arm64': 11.1.3 - '@pnpm/win-x64': 11.1.3 + '@pnpm/linux-arm64': 11.5.0 + '@pnpm/linux-x64': 11.5.0 + '@pnpm/linuxstatic-arm64': 11.5.0 + '@pnpm/linuxstatic-x64': 11.5.0 + '@pnpm/macos-arm64': 11.5.0 + '@pnpm/win-arm64': 11.5.0 + '@pnpm/win-x64': 11.5.0 - '@pnpm/linux-arm64@11.1.3': + '@pnpm/linux-arm64@11.5.0': optional: true - '@pnpm/linux-x64@11.1.3': + '@pnpm/linux-x64@11.5.0': optional: true - '@pnpm/linuxstatic-arm64@11.1.3': + '@pnpm/linuxstatic-arm64@11.5.0': optional: true - '@pnpm/linuxstatic-x64@11.1.3': + '@pnpm/linuxstatic-x64@11.5.0': optional: true - '@pnpm/macos-arm64@11.1.3': + '@pnpm/macos-arm64@11.5.0': optional: true - '@pnpm/win-arm64@11.1.3': + '@pnpm/win-arm64@11.5.0': optional: true - '@pnpm/win-x64@11.1.3': + '@pnpm/win-x64@11.5.0': optional: true '@reflink/reflink-darwin-arm64@0.1.19': @@ -194,7 +194,7 @@ snapshots: detect-libc@2.1.2: {} - pnpm@11.1.3: {} + pnpm@11.5.0: {} --- lockfileVersion: '9.0' From 601dae0cdae8eaa68d8348e9727520811b7b3dae Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Mon, 1 Jun 2026 17:56:34 +0300 Subject: [PATCH 004/149] fix(ios): fix Hermes startup race in ExpoBridgeModule (patch) (#10672) Co-authored-by: Claude Opus 4.8 (1M context) --- patches/expo-modules-core@3.0.30.patch | 36 +++++++++++++++++++++++ patches/expo-modules-core@3.0.30.patch.md | 25 +++++++++++++++- pnpm-lock.yaml | 6 ++-- 3 files changed, 63 insertions(+), 4 deletions(-) diff --git a/patches/expo-modules-core@3.0.30.patch b/patches/expo-modules-core@3.0.30.patch index 7de1337aac..1be4787a22 100644 --- a/patches/expo-modules-core@3.0.30.patch +++ b/patches/expo-modules-core@3.0.30.patch @@ -13,3 +13,39 @@ index 47c4d15f6b10bbd77858cfff425cda9a618735b9..afe138d22d566244482498a7be0e14b8 // Check for Content-Type val skipContentTypes = listOf( "text/event-stream", // Server Sent Events +diff --git a/ios/Core/ExpoBridgeModule.mm b/ios/Core/ExpoBridgeModule.mm +index 2ed1c00f47406e109750cc27ace7e0d88e42c00e..99d0d140eddf95a8db7beb57c61dfcb12c1424b4 100644 +--- a/ios/Core/ExpoBridgeModule.mm ++++ b/ios/Core/ExpoBridgeModule.mm +@@ -7,6 +7,9 @@ + // The runtime executor is included as of React Native 0.74 in bridgeless mode. + #if __has_include() + #import ++#else // React Native <0.74 ++// dispatchBlock:queue: is declared in RCTBridge+Private.h, not the public header. ++#import + #endif // React Native >=0.74 + + @implementation ExpoBridgeModule +@@ -46,7 +49,20 @@ - (void)setBridge:(RCTBridge *)bridge + _appContext.reactBridge = bridge; + + #if !__has_include() +- _appContext._runtime = [EXJavaScriptRuntimeManager runtimeFromBridge:bridge]; ++ // Hop the runtime install (and the prepareRuntime() chain it triggers via ++ // _runtime.didSet) onto RCTJSThread. The original line ran synchronously ++ // on whatever thread called setBridge: - typically the main thread - and ++ // raced JSIExecutor::initializeRuntime() on the JS thread, corrupting ++ // Hermes' Hades GC (HadesGC::writeBarrierSlow EXC_BAD_ACCESS). ++ __weak EXAppContext *weakAppContext = _appContext; ++ __weak RCTBridge *weakBridge = bridge; ++ [bridge dispatchBlock:^{ ++ EXAppContext *strongAppContext = weakAppContext; ++ RCTBridge *strongBridge = weakBridge; ++ if (strongAppContext != nil && strongBridge != nil && strongAppContext._runtime == nil) { ++ strongAppContext._runtime = [EXJavaScriptRuntimeManager runtimeFromBridge:strongBridge]; ++ } ++ } queue:RCTJSThread]; + #endif // React Native <0.74 + } + diff --git a/patches/expo-modules-core@3.0.30.patch.md b/patches/expo-modules-core@3.0.30.patch.md index a71324c19e..3ce964a7a9 100644 --- a/patches/expo-modules-core@3.0.30.patch.md +++ b/patches/expo-modules-core@3.0.30.patch.md @@ -1,3 +1,26 @@ ## expo-modules-core Patch -This patch fixes an issue where bitdrift's API stream gets blocked by the Expo interceptor used to power the devtools +This patch contains two unrelated fixes: + +### Android: bitdrift interceptor + +Fixes an issue where bitdrift's API stream gets blocked by the Expo interceptor used to power the devtools. + +### iOS: Hermes startup race in `ExpoBridgeModule.setBridge:` + +On the legacy bridge (old architecture, where `RCTRuntimeExecutor.h` is +absent), `setBridge:` installed the Expo runtime synchronously on whatever +thread called it - typically the main thread, since RN's lazy module-load +path ignores `+requiresMainQueueSetup`. The `_runtime.didSet` then ran +`prepareRuntime()` (JSI mutations) on the main thread while the JS thread was +concurrently inside `JSIExecutor::initializeRuntime()`. Two threads mutating +the same Hermes runtime corrupted Hades GC, producing intermittent +`EXC_BAD_ACCESS` launch crashes (e.g. `HadesGC::writeBarrierSlow`, +`prepareRuntime` / `bindNativePerformanceNow`). + +The fix hops the runtime install onto `RCTJSThread` so all JSI mutation is +serialized on the JS thread. This backports the upstream fix discussed in +expo/expo#45374; the racy `ExpoBridgeModule` is removed entirely in SDK 55+ +(expo/expo#44351), so this patch can be dropped on that upgrade. + +Refs: expo/expo#43003, expo/expo#45374, expo/expo#44351 diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9f3c33bb4b..0880afc3de 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -222,7 +222,7 @@ patchedDependencies: expo-image-picker@17.0.11: 47b28f6ddb8bcaa6483f8714c82daaa0001122f2b0dac6c05d19e98a61a6ceab expo-image@3.0.11: 6d46ffac33426c5285777da5bf5f88c68c8ce27290595dfa65f38c478930c2c4 expo-media-library@18.2.1: 2b84c17999bb0c977eaef7fa8ac297f7074d91c94fb63726b42d2a277b26b39a - expo-modules-core@3.0.30: 86e57bb33bc6c3f7021e948e099c2b5378772147b92a82a16e2e90ddcb857ace + expo-modules-core@3.0.30: 952fb1c8cb6dc8a0d8ef4e1114942a341d89b025e011f1acfff788929997346e expo-notifications@0.32.17: a45a8dcf3d8c4b5df4ee0e62bc79b755fcf9d28ca51a6f685b85830bf4afc2e5 expo-updates@29.0.17: 04f28cb005b770e9ae8f0065eab96e43cbb1e58107f5f6ad1bdd18f6deb66487 react-native-compressor@1.13.0: 58379dfaace6ced8590cb341c77f2ca8099dfa8f7df6297032ec51de767a9925 @@ -15033,7 +15033,7 @@ snapshots: require-from-string: 2.0.2 resolve-from: 5.0.0 - expo-modules-core@3.0.30(patch_hash=86e57bb33bc6c3f7021e948e099c2b5378772147b92a82a16e2e90ddcb857ace)(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + expo-modules-core@3.0.30(patch_hash=952fb1c8cb6dc8a0d8ef4e1114942a341d89b025e011f1acfff788929997346e)(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): dependencies: invariant: 2.2.4 react: 19.1.0 @@ -15169,7 +15169,7 @@ snapshots: expo-font: 14.0.11(expo@54.0.34(@babel/core@7.29.0)(react-native-webview@13.15.0(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) expo-keep-awake: 15.0.8(expo@54.0.34(@babel/core@7.29.0)(react-native-webview@13.15.0(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react@19.1.0) expo-modules-autolinking: 3.0.25 - expo-modules-core: 3.0.30(patch_hash=86e57bb33bc6c3f7021e948e099c2b5378772147b92a82a16e2e90ddcb857ace)(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + expo-modules-core: 3.0.30(patch_hash=952fb1c8cb6dc8a0d8ef4e1114942a341d89b025e011f1acfff788929997346e)(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) pretty-format: 29.7.0 react: 19.1.0 react-native: 0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) From bccca283b9521c1d7d2a16ba295f72826e0d0f1e Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Mon, 1 Jun 2026 18:28:38 +0300 Subject: [PATCH 005/149] [Chat] Add `/c/:code` handler to bskyweb (#10630) --- bskyweb/cmd/bskyweb/main.go | 6 +++ bskyweb/cmd/bskyweb/server.go | 68 ++++++++++++++++++++++++++++--- bskyweb/go.mod | 2 +- bskyweb/go.sum | 6 +-- bskyweb/templates/chatinvite.html | 25 ++++++++++++ 5 files changed, 96 insertions(+), 11 deletions(-) create mode 100644 bskyweb/templates/chatinvite.html diff --git a/bskyweb/cmd/bskyweb/main.go b/bskyweb/cmd/bskyweb/main.go index da8a30953d..c3ded18e7a 100644 --- a/bskyweb/cmd/bskyweb/main.go +++ b/bskyweb/cmd/bskyweb/main.go @@ -46,6 +46,12 @@ func run(args []string) { Required: false, EnvVars: []string{"OGCARD_HOST"}, }, + &cli.StringFlag{ + Name: "chat-host", + Usage: "scheme, hostname, and port of chat appview", + Required: false, + EnvVars: []string{"CHAT_HOST"}, + }, &cli.StringFlag{ Name: "http-address", Usage: "Specify the local IP/port to bind to", diff --git a/bskyweb/cmd/bskyweb/server.go b/bskyweb/cmd/bskyweb/server.go index 44e79bd3fb..4a4ba2fde3 100644 --- a/bskyweb/cmd/bskyweb/server.go +++ b/bskyweb/cmd/bskyweb/server.go @@ -17,11 +17,13 @@ import ( "net/url" "os" "os/signal" + "regexp" "strings" "syscall" "time" appbsky "github.com/bluesky-social/indigo/api/bsky" + chat "github.com/bluesky-social/indigo/api/chat" "github.com/bluesky-social/indigo/atproto/syntax" "github.com/bluesky-social/indigo/util/cliutil" "github.com/bluesky-social/indigo/xrpc" @@ -37,10 +39,11 @@ import ( ) type Server struct { - echo *echo.Echo - httpd *http.Server - xrpcc *xrpc.Client - cfg *Config + echo *echo.Echo + httpd *http.Server + xrpcc *xrpc.Client + chatXrpcc *xrpc.Client + cfg *Config ipccClient http.Client @@ -54,6 +57,7 @@ type Config struct { debug bool httpAddress string appviewHost string + chatHost string ogcardHost string linkHost string ipccHost string @@ -64,6 +68,7 @@ func serve(cctx *cli.Context) error { debug := cctx.Bool("debug") httpAddress := cctx.String("http-address") appviewHost := cctx.String("appview-host") + chatHost := cctx.String("chat-host") ogcardHost := cctx.String("ogcard-host") linkHost := cctx.String("link-host") ipccHost := cctx.String("ipcc-host") @@ -83,6 +88,15 @@ func serve(cctx *cli.Context) error { Host: appviewHost, } + // optional client for the chat appview, used by /c/ for OG previews. + var chatXrpcc *xrpc.Client + if chatHost != "" { + chatXrpcc = &xrpc.Client{ + Client: cliutil.NewHttpClient(), + Host: chatHost, + } + } + // httpd var ( httpTimeout = 2 * time.Minute @@ -106,12 +120,14 @@ func serve(cctx *cli.Context) error { // server // server := &Server{ - echo: e, - xrpcc: xrpcc, + echo: e, + xrpcc: xrpcc, + chatXrpcc: chatXrpcc, cfg: &Config{ debug: debug, httpAddress: httpAddress, appviewHost: appviewHost, + chatHost: chatHost, ogcardHost: ogcardHost, linkHost: linkHost, ipccHost: ipccHost, @@ -349,6 +365,9 @@ func serve(cctx *cli.Context) error { e.GET("/starter-pack-short/:code", server.WebGeneric) e.GET("/start/:handleOrDID/:rkey", server.WebStarterPack) + // chat invites + e.GET("/c/:code", server.WebChatInvite) + // bookmarks e.GET("/saved", server.WebGeneric) @@ -644,6 +663,43 @@ func (srv *Server) WebStarterPack(c echo.Context) error { return c.Render(http.StatusOK, "starterpack.html", data) } +// chatInviteCodeRe is a permissive sanity check on the join code so we don't +// proxy obviously-bad input to the chat appview. Codes are opaque per the +// lexicon, but in practice URL-safe and short. +var chatInviteCodeRe = regexp.MustCompile(`^[A-Za-z0-9_-]{1,64}$`) + +func (srv *Server) WebChatInvite(c echo.Context) error { + req := c.Request() + ctx := req.Context() + data := srv.NewTemplateContext() + data["requestURI"] = fmt.Sprintf("https://%s%s", req.Host, req.URL.Path) + + code := c.Param("code") + if !chatInviteCodeRe.MatchString(code) { + return c.Render(http.StatusOK, "chatinvite.html", data) + } + if srv.chatXrpcc == nil { + return c.Render(http.StatusOK, "chatinvite.html", data) + } + + out, err := chat.GroupGetJoinLinkPreviews(ctx, srv.chatXrpcc, []string{code}) + if err != nil { + log.Errorf("failed to fetch chat invite preview for code=%s: %v", code, err) + return c.Render(http.StatusOK, "chatinvite.html", data) + } + if len(out.JoinLinkPreviews) == 0 { + return c.Render(http.StatusOK, "chatinvite.html", data) + } + preview := out.JoinLinkPreviews[0] + + data["title"] = preview.Name + if srv.cfg.ogcardHost != "" { + // bskyogcard registers this route as /chat-invite/:code, not /c/:code. + data["imgThumbUrl"] = fmt.Sprintf("%s/chat-invite/%s", srv.cfg.ogcardHost, code) + } + return c.Render(http.StatusOK, "chatinvite.html", data) +} + func (srv *Server) WebProfile(c echo.Context) error { ctx := c.Request().Context() data := srv.NewTemplateContext() diff --git a/bskyweb/go.mod b/bskyweb/go.mod index 44be241e12..50ab9a162a 100644 --- a/bskyweb/go.mod +++ b/bskyweb/go.mod @@ -3,7 +3,7 @@ module github.com/bluesky-social/social-app/bskyweb go 1.26 require ( - github.com/bluesky-social/indigo v0.0.0-20260528134852-3e368bd18814 + github.com/bluesky-social/indigo v0.0.0-20260529183052-5368f55344e0 github.com/flosch/pongo2/v6 v6.0.0 github.com/ipfs/go-log v1.0.5 github.com/joho/godotenv v1.5.1 diff --git a/bskyweb/go.sum b/bskyweb/go.sum index be46f5753c..235e37f521 100644 --- a/bskyweb/go.sum +++ b/bskyweb/go.sum @@ -2,10 +2,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bluesky-social/indigo v0.0.0-20260527160159-3b7634c713b8 h1:heYuihJZQZMNij7+dKIEfApG10xrGnDV2rtKpvFyYYU= -github.com/bluesky-social/indigo v0.0.0-20260527160159-3b7634c713b8/go.mod h1:JqQkz8lrOI6YZivP38GHmtVOTtzsNToITKj1gMpU5Jo= -github.com/bluesky-social/indigo v0.0.0-20260528134852-3e368bd18814 h1:UZK0qmB7LAe2IZY6RASlsE0Mm1Rjasddd2T5zWWvT54= -github.com/bluesky-social/indigo v0.0.0-20260528134852-3e368bd18814/go.mod h1:JqQkz8lrOI6YZivP38GHmtVOTtzsNToITKj1gMpU5Jo= +github.com/bluesky-social/indigo v0.0.0-20260529183052-5368f55344e0 h1:eijBaF59A5c+kPqufH7YO1GOqDMkyUhtM9P9aAWtfJY= +github.com/bluesky-social/indigo v0.0.0-20260529183052-5368f55344e0/go.mod h1:JqQkz8lrOI6YZivP38GHmtVOTtzsNToITKj1gMpU5Jo= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= diff --git a/bskyweb/templates/chatinvite.html b/bskyweb/templates/chatinvite.html new file mode 100644 index 0000000000..63ae03ee39 --- /dev/null +++ b/bskyweb/templates/chatinvite.html @@ -0,0 +1,25 @@ +{% extends "base.html" %} + +{% block html_head_extra -%} + {%- if requestURI %} + + {% endif -%} + {%- if imgThumbUrl %} + + + {%- else -%} + + + {% endif -%} + + {%- if title %} + + + {%- else -%} + + + {% endif -%} + + + +{%- endblock %} From 0d38e2ab3fbcc35bdba1cc12492be43d063eeccf Mon Sep 17 00:00:00 2001 From: DS Boyce <260543580+ds-boyce@users.noreply.github.com> Date: Mon, 1 Jun 2026 10:15:21 -0700 Subject: [PATCH 006/149] Show chat info panel for empty chats (#10677) --- src/screens/Messages/components/MessagesList.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/screens/Messages/components/MessagesList.tsx b/src/screens/Messages/components/MessagesList.tsx index e1e4849fc5..99b725267e 100644 --- a/src/screens/Messages/components/MessagesList.tsx +++ b/src/screens/Messages/components/MessagesList.tsx @@ -240,7 +240,11 @@ export function MessagesList({ // Initial scroll to bottom — unconditional, not gated on isAtBottom. This is separated because contentInset // can cause an early onScroll with a negative offset that sets isAtBottom to false before we get here. - if (!hasInitiallyScrolled.current && renderItems.length > 0) { + // Empty convos take this path too (once history is done) so hasScrolled gets set without an animated scroll. + if ( + !hasInitiallyScrolled.current && + (renderItems.length > 0 || !convoState.isFetchingHistory) + ) { hasInitiallyScrolled.current = true flatListRef.current?.scrollToOffset({offset: height, animated: false}) // If history is already done loading, mark ready after a frame for the scroll to settle. From ba24c7c35752b8ba278d4402ad9cde9b79240344 Mon Sep 17 00:00:00 2001 From: DS Boyce <260543580+ds-boyce@users.noreply.github.com> Date: Mon, 1 Jun 2026 14:32:36 -0700 Subject: [PATCH 007/149] Display join requests on chat list (#10679) --- .../MembersAndRequests.tsx | 2 +- .../Messages/components/ChatListItem.tsx | 15 +++++++ .../queries/messages/list-conversations.tsx | 41 +++++++++++++++++-- 3 files changed, 53 insertions(+), 5 deletions(-) diff --git a/src/screens/Messages/ConversationSettings/MembersAndRequests.tsx b/src/screens/Messages/ConversationSettings/MembersAndRequests.tsx index 837e553923..b9d9ecc2b2 100644 --- a/src/screens/Messages/ConversationSettings/MembersAndRequests.tsx +++ b/src/screens/Messages/ConversationSettings/MembersAndRequests.tsx @@ -48,7 +48,7 @@ export function MembersAndRequests({ ? l({ message: `${requestCount}+ requests`, comment: - 'Displayed when there are more than 50 requests to join a group chat', + 'Displayed when there are more than 20 requests to join a group chat', }) : l({ message: plural(requestCount, { diff --git a/src/screens/Messages/components/ChatListItem.tsx b/src/screens/Messages/components/ChatListItem.tsx index aba3295170..eb002c581d 100644 --- a/src/screens/Messages/components/ChatListItem.tsx +++ b/src/screens/Messages/components/ChatListItem.tsx @@ -6,6 +6,7 @@ import { type ModerationDecision, type ModerationOpts, } from '@atproto/api' +import {plural} from '@lingui/core/macro' import {useLingui} from '@lingui/react/macro' import {useQueryClient} from '@tanstack/react-query' @@ -213,6 +214,20 @@ function GroupChatItem({ primaryProfileModeration={moderation} isBlockedAccount={false} isDeletedAccount={false} + subtitle={ + convo.details.joinRequestCount + ? convo.details.joinRequestCount > 20 + ? l({ + message: '20+ new join requests', + context: + 'Displayed when there are more than 20 requests to join a group chat', + }) + : plural(convo.details.joinRequestCount, { + one: '# new join request', + other: '# new join requests', + }) + : undefined + } showProfileBadges={false} selected={selected} showMenu={showMenu}> diff --git a/src/state/queries/messages/list-conversations.tsx b/src/state/queries/messages/list-conversations.tsx index 56c8a5d4a1..f026e57d33 100644 --- a/src/state/queries/messages/list-conversations.tsx +++ b/src/state/queries/messages/list-conversations.tsx @@ -489,12 +489,22 @@ export function ListConvosProviderInner({ // Join link data not included in the log event, trigger refetch to get it debouncedRefetch() } else if ( - ChatBskyConvoDefs.isLogIncomingJoinRequest(log) || ChatBskyConvoDefs.isLogApproveJoinRequest(log) || - ChatBskyConvoDefs.isLogRejectJoinRequest(log) || - ChatBskyConvoDefs.isLogOutgoingJoinRequest(log) + ChatBskyConvoDefs.isLogRejectJoinRequest(log) ) { - // TODO Update join request count here when available. -dsb + queryClient.setQueriesData( + {queryKey: [RQKEY_ROOT]}, + (old?: ConvoListQueryData) => + updateGroupConvoJoinRequestCount(log, old, -1), + ) + } else if (ChatBskyConvoDefs.isLogIncomingJoinRequest(log)) { + queryClient.setQueriesData( + {queryKey: [RQKEY_ROOT]}, + (old?: ConvoListQueryData) => + updateGroupConvoJoinRequestCount(log, old, 1), + ) + } else if (ChatBskyConvoDefs.isLogOutgoingJoinRequest(log)) { + // Viewer isn't in the chat yet, no need to do anything } else if (ChatBskyConvoDefs.isLogAddReaction(log)) { queryClient.setQueriesData( {queryKey: [RQKEY_ROOT]}, @@ -762,6 +772,29 @@ function optimisticUpdate( } } +function updateGroupConvoJoinRequestCount( + log: {convoId: string; rev: string}, + old: ConvoListQueryData | undefined, + delta: 1 | -1, +) { + return optimisticUpdate(log.convoId, old, convo => { + // Join requests are only meaningful for group convos. + if (!ChatBskyConvoDefs.isGroupConvo(convo.kind)) { + return {...convo, rev: log.rev} + } + const current = convo.kind.joinRequestCount ?? 0 + const next = Math.max(0, current + delta) + return { + ...convo, + kind: { + ...convo.kind, + joinRequestCount: next === 0 ? undefined : next, + }, + rev: log.rev, + } + }) +} + function removeMemberFromConvoView( convo: ChatBskyConvoDefs.ConvoView, did: string, From 62d1e88ce1b3946f07a69caf8cda1b3d2d155e15 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Tue, 2 Jun 2026 00:32:41 +0300 Subject: [PATCH 008/149] Fix Android crash in chat keyboard scroll (#10673) Co-authored-by: Claude Opus 4.8 (1M context) --- .../react-native-keyboard-controller@1.21.8.patch | 13 +++++++++++-- pnpm-lock.yaml | 6 +++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/patches/react-native-keyboard-controller@1.21.8.patch b/patches/react-native-keyboard-controller@1.21.8.patch index 209a551b23..09575139e0 100644 --- a/patches/react-native-keyboard-controller@1.21.8.patch +++ b/patches/react-native-keyboard-controller@1.21.8.patch @@ -1,5 +1,5 @@ diff --git a/src/components/KeyboardChatScrollView/useExtraContentPadding/index.ts b/src/components/KeyboardChatScrollView/useExtraContentPadding/index.ts -index 0f6d7c67a307885310ab184fdf9e7a5c7b296825..1e0bdd5b1d3b1eceb47bfb0050da84061fd7f77c 100644 +index 0f6d7c67a307885310ab184fdf9e7a5c7b296825..1a01093e7909973cef5268f999158df389e77634 100644 --- a/src/components/KeyboardChatScrollView/useExtraContentPadding/index.ts +++ b/src/components/KeyboardChatScrollView/useExtraContentPadding/index.ts @@ -1,8 +1,6 @@ @@ -19,7 +19,7 @@ index 0f6d7c67a307885310ab184fdf9e7a5c7b296825..1e0bdd5b1d3b1eceb47bfb0050da8406 inverted, keyboardLiftBehavior, freeze, -@@ -62,20 +59,14 @@ function useExtraContentPadding(options: UseExtraContentPaddingOptions): void { +@@ -62,20 +59,23 @@ function useExtraContentPadding(options: UseExtraContentPaddingOptions): void { (target: number) => { "worklet"; @@ -37,6 +37,15 @@ index 0f6d7c67a307885310ab184fdf9e7a5c7b296825..1e0bdd5b1d3b1eceb47bfb0050da8406 + // otherwise the native ScrollView clamps contentOffset to the old + // contentInset range (iOS Fabric) or the old contentInsetBottom (Android). + requestAnimationFrame(() => { ++ // The ScrollView can detach between scheduling this frame and now (e.g. ++ // navigating away from the screen, or the list re-creating its scroll ++ // component). Once detached, scrollViewRef() resolves to null, and on ++ // Paper reanimated's scrollTo hands that null to the native ++ // _scrollToPaper HostFunction, which throws "Value is null, expected a ++ // number". Re-check the ref now that the frame has arrived. ++ if (scrollViewRef() == null) { ++ return; ++ } scrollTo(scrollViewRef, 0, target, false); - } + }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0880afc3de..255d70f128 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -228,7 +228,7 @@ patchedDependencies: react-native-compressor@1.13.0: 58379dfaace6ced8590cb341c77f2ca8099dfa8f7df6297032ec51de767a9925 react-native-date-picker@5.0.13: f2a6697da7a7ca79b4f39efda142eee1b82db6de3aa5010ad4bd59df41fe2ce1 react-native-drawer-layout@4.2.3: 74f2c043cc22ab87054f219e7c7373a509b779b18bfa79d27e7d051d73355130 - react-native-keyboard-controller@1.21.8: 642d128c971380a1858f7a938dd715d6eb3bbc260c93188b65580d92e2226afe + react-native-keyboard-controller@1.21.8: 2f6791837622fb391c3e41fc044b91ddedbe503da14da86165ee0a73924b05f1 react-native-pager-view@6.8.0: 0979d6fe1e2fa43b2784cc0b5e0ff0117d53b53423e85ee5855eefdc41a00108 react-native-reanimated@3.19.1: 97a1967f37a4213fbab59e1fd59a1bf859b5efc79af5e1b528a47fe488e6c5d6 react-native-svg@15.12.1: 31401fa6ff01498773afb51a7b066821c471eb3e71b0764a10017938beed49e9 @@ -633,7 +633,7 @@ importers: version: 2.28.0(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) react-native-keyboard-controller: specifier: ^1.21.8 - version: 1.21.8(patch_hash=642d128c971380a1858f7a938dd715d6eb3bbc260c93188b65580d92e2226afe)(react-native-reanimated@3.19.1(patch_hash=97a1967f37a4213fbab59e1fd59a1bf859b5efc79af5e1b528a47fe488e6c5d6)(@babel/core@7.29.0)(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + version: 1.21.8(patch_hash=2f6791837622fb391c3e41fc044b91ddedbe503da14da86165ee0a73924b05f1)(react-native-reanimated@3.19.1(patch_hash=97a1967f37a4213fbab59e1fd59a1bf859b5efc79af5e1b528a47fe488e6c5d6)(@babel/core@7.29.0)(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) react-native-pager-view: specifier: 6.8.0 version: 6.8.0(patch_hash=0979d6fe1e2fa43b2784cc0b5e0ff0117d53b53423e85ee5855eefdc41a00108)(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) @@ -17926,7 +17926,7 @@ snapshots: react: 19.1.0 react-native: 0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) - react-native-keyboard-controller@1.21.8(patch_hash=642d128c971380a1858f7a938dd715d6eb3bbc260c93188b65580d92e2226afe)(react-native-reanimated@3.19.1(patch_hash=97a1967f37a4213fbab59e1fd59a1bf859b5efc79af5e1b528a47fe488e6c5d6)(@babel/core@7.29.0)(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): + react-native-keyboard-controller@1.21.8(patch_hash=2f6791837622fb391c3e41fc044b91ddedbe503da14da86165ee0a73924b05f1)(react-native-reanimated@3.19.1(patch_hash=97a1967f37a4213fbab59e1fd59a1bf859b5efc79af5e1b528a47fe488e6c5d6)(@babel/core@7.29.0)(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0): dependencies: react: 19.1.0 react-native: 0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) From 751eda59fd99edb8c5aaf359ea9b279c273194e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Cilveti?= Date: Mon, 1 Jun 2026 23:40:48 +0200 Subject: [PATCH 009/149] Fix duplicate haptic feedback when liking posts (#10678) --- src/components/PostControls/index.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/components/PostControls/index.tsx b/src/components/PostControls/index.tsx index 99bcf95a46..1f6be5ab6c 100644 --- a/src/components/PostControls/index.tsx +++ b/src/components/PostControls/index.tsx @@ -11,7 +11,6 @@ import {useLingui} from '@lingui/react/macro' import {CountWheel} from '#/lib/custom-animations/CountWheel' import {AnimatedLikeIcon} from '#/lib/custom-animations/LikeIcon' -import {useHaptics} from '#/lib/haptics' import {useOpenComposer} from '#/lib/hooks/useOpenComposer' import {type Shadow} from '#/state/cache/types' import {useFeedFeedbackContext} from '#/state/feed-feedback' @@ -93,7 +92,6 @@ let PostControls = ({ const requireAuth = useRequireAuth() const {sendInteraction} = useFeedFeedbackContext() const {captureAction} = useProgressGuideControls() - const playHaptic = useHaptics() const isBlocked = Boolean( post.author.viewer?.blocking || post.author.viewer?.blockedBy || @@ -116,7 +114,6 @@ let PostControls = ({ try { setHasLikeIconBeenToggled(true) if (!post.viewer?.like) { - playHaptic('Light') sendInteraction({ item: post.uri, event: 'app.bsky.feed.defs#interactionLike', From db1c4dc6e338dc9c8b662de2b334235488ce1d5f Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Tue, 2 Jun 2026 01:03:53 +0300 Subject: [PATCH 010/149] Update Intl polyfills (#10587) Co-authored-by: surfdude29 <149612116+surfdude29@users.noreply.github.com> --- package.json | 8 +- pnpm-lock.yaml | 107 ++++++++----------- src/locale/i18n.ts | 255 ++++++++++++++++++++++----------------------- tsconfig.json | 2 - 4 files changed, 175 insertions(+), 197 deletions(-) diff --git a/package.json b/package.json index a5060568eb..f82c2922ed 100644 --- a/package.json +++ b/package.json @@ -112,10 +112,10 @@ "@expo/webpack-config": "^19.0.1", "@floating-ui/dom": "^1.6.3", "@floating-ui/react-dom": "^2.0.8", - "@formatjs/intl-displaynames": "^6.8.13", - "@formatjs/intl-locale": "^4.2.13", - "@formatjs/intl-numberformat": "^8.15.6", - "@formatjs/intl-pluralrules": "^5.4.6", + "@formatjs/intl-displaynames": "^7.3.9", + "@formatjs/intl-locale": "^5.3.8", + "@formatjs/intl-numberformat": "^9.3.10", + "@formatjs/intl-pluralrules": "^6.3.9", "@growthbook/growthbook": "^1.6.5", "@growthbook/growthbook-react": "^1.6.5", "@ipld/dag-cbor": "^9.2.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 255d70f128..0b4789ac58 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -302,17 +302,17 @@ importers: specifier: ^2.0.8 version: 2.1.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@formatjs/intl-displaynames': - specifier: ^6.8.13 - version: 6.8.13 + specifier: ^7.3.9 + version: 7.3.9 '@formatjs/intl-locale': - specifier: ^4.2.13 - version: 4.2.13 + specifier: ^5.3.8 + version: 5.3.8 '@formatjs/intl-numberformat': - specifier: ^8.15.6 - version: 8.15.6 + specifier: ^9.3.10 + version: 9.3.10 '@formatjs/intl-pluralrules': - specifier: ^5.4.6 - version: 5.4.6 + specifier: ^6.3.9 + version: 6.3.9 '@growthbook/growthbook': specifier: ^1.6.5 version: 1.6.5 @@ -2065,33 +2065,32 @@ packages: '@floating-ui/utils@0.2.11': resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} - '@formatjs/ecma402-abstract@2.3.6': - resolution: {integrity: sha512-HJnTFeRM2kVFVr5gr5kH1XP6K0JcJtE7Lzvtr3FS/so5f1kpsqqqxy5JF+FRaO6H2qmcMfAUIox7AJteieRtVw==} + '@formatjs/bigdecimal@0.2.5': + resolution: {integrity: sha512-2XTKNrZRaCUyXK2976wfutqxMBuPO/S/zbJnQdysLI2Zy5mWPVNVEkE6tsTcSVWSE7DgO88t8DtBy+uf3I8bxg==} - '@formatjs/fast-memoize@2.2.7': - resolution: {integrity: sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ==} + '@formatjs/fast-memoize@3.1.5': + resolution: {integrity: sha512-KLi3fan6WnCHmigd9pmEEN8Hid0v4wiFBW576M/d07KMWYecf1CvyMI3n34vCmHT4AoVqG2n702kiHbXjzZX2A==} - '@formatjs/intl-displaynames@6.8.13': - resolution: {integrity: sha512-VbY7BdYJX5eURVKLk2grndUQtnbCLNbcJId/Sb/PsX7fWXiqWvg7qt/mecVHRzqoSEoGCQToKDxzpJj8RC0s3g==} + '@formatjs/intl-displaynames@7.3.9': + resolution: {integrity: sha512-UELvrHS171ElQW9iMCGqMR/HmUYQPYkYSz1A/SSkQtJ62ZH7aUWC1QnXPxL0CInQmxa/MgC7oE402XBoTe5nTQ==} - '@formatjs/intl-enumerator@1.8.12': - resolution: {integrity: sha512-rT2hnyQ0q6RDG1jISMH+MP6wlHQLUC81C0BeYEzabJb48S4tU2HGCPUxsOqMa3vDAUmpnz9Kw5vYTD5hTkOVgg==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + '@formatjs/intl-getcanonicallocales@3.2.9': + resolution: {integrity: sha512-b1dLzhFSeccG5X1PY2KodVFRGd0p6tBPc7pRBJaW6A7+fMeZnwHOAJLkMsGNDyvM9XailkkstE4jzmNa1GVh5w==} - '@formatjs/intl-getcanonicallocales@2.5.6': - resolution: {integrity: sha512-CnBbc4St61RL06gDXlCZG08Gt41uiySgsdZNBExh8/c0FBONJCrAlQ9FsyalUdq9ze0nCeknJtMmO8JnB9xHgQ==} + '@formatjs/intl-locale@5.3.8': + resolution: {integrity: sha512-pJgqQlg4zFoyCiVMXlKPBWpY7fAxvsUiShNmB/l8BW2ZwmFMefMWCrDzgocSH9WR+Z3pkihfjh1XbalCZhXc1Q==} - '@formatjs/intl-locale@4.2.13': - resolution: {integrity: sha512-Qcs0mP9JhEPCinPfpZ5JKzOa+VYDg94TQSFZozYuqG8R+hEGUTKyoyMqB5xi5QZT/hlB0CSgeNc/0fWMGtTFXA==} + '@formatjs/intl-localematcher@0.8.9': + resolution: {integrity: sha512-GmB0F/gYh4Hdl4rLWjgDsgT+x4pB54fkJeRh8kAZ4XFzKeCK8dGs+SBJWXO42QZtOUni+IDWKNuCw6wiL4lTvw==} - '@formatjs/intl-localematcher@0.6.2': - resolution: {integrity: sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA==} + '@formatjs/intl-numberformat@9.3.10': + resolution: {integrity: sha512-wYboXVXZyTvuMBgwE0AxcXYxV8LM0IkH+lfCoBlRVNjCwNzdHVbRcUxDRHE+HbFkQ6/zWFkyguvIP5y3PAt+jw==} - '@formatjs/intl-numberformat@8.15.6': - resolution: {integrity: sha512-htynTNKm5WOnbR521tNSMkWzX3yO6Z77qjOxvRujh5/A/UBKeoNElyuKCJltizdx3X33QNWQZC4aWjLKcccyeQ==} + '@formatjs/intl-pluralrules@6.3.9': + resolution: {integrity: sha512-0405uU1npNs5/N04tfIQ3pme96Xb51tEkCBTBKy8HMjAsssbhnK70gf8v3ogj1WqHf7WFRoFZu8clQTsvwBQNg==} - '@formatjs/intl-pluralrules@5.4.6': - resolution: {integrity: sha512-2HlOq+c7KsSps829SJ3B5987coX5mzKx9NbPcNwQ07eq8FBHgB3HfMoxt5HvLsdk4oQwCjAEnocbtd+wVwZ2Kg==} + '@formatjs/intl-supportedvaluesof@2.3.7': + resolution: {integrity: sha512-ZTXEKijV5H08z19odngZPsXlmGndfukHuVnjd9qyER77XSk/yJwDMiSjoJYY5C5WxFs2UN4s/EMtu75e6Tp3ug==} '@gorhom/portal@1.0.14': resolution: {integrity: sha512-MXyL4xvCjmgaORr/rtryDNFy3kU4qUbKlwtQqqsygd0xX3mhKjOLn6mQK8wfu0RkoE0pBE0nAasRoHua+/QZ7A==} @@ -11055,56 +11054,38 @@ snapshots: '@floating-ui/utils@0.2.11': {} - '@formatjs/ecma402-abstract@2.3.6': - dependencies: - '@formatjs/fast-memoize': 2.2.7 - '@formatjs/intl-localematcher': 0.6.2 - decimal.js: 10.6.0 - tslib: 2.8.1 + '@formatjs/bigdecimal@0.2.5': {} - '@formatjs/fast-memoize@2.2.7': - dependencies: - tslib: 2.8.1 + '@formatjs/fast-memoize@3.1.5': {} - '@formatjs/intl-displaynames@6.8.13': + '@formatjs/intl-displaynames@7.3.9': dependencies: - '@formatjs/ecma402-abstract': 2.3.6 - '@formatjs/intl-localematcher': 0.6.2 - tslib: 2.8.1 + '@formatjs/intl-localematcher': 0.8.9 - '@formatjs/intl-enumerator@1.8.12': - dependencies: - '@formatjs/ecma402-abstract': 2.3.6 - tslib: 2.8.1 + '@formatjs/intl-getcanonicallocales@3.2.9': {} - '@formatjs/intl-getcanonicallocales@2.5.6': + '@formatjs/intl-locale@5.3.8': dependencies: - tslib: 2.8.1 + '@formatjs/intl-getcanonicallocales': 3.2.9 + '@formatjs/intl-supportedvaluesof': 2.3.7 - '@formatjs/intl-locale@4.2.13': + '@formatjs/intl-localematcher@0.8.9': dependencies: - '@formatjs/ecma402-abstract': 2.3.6 - '@formatjs/intl-enumerator': 1.8.12 - '@formatjs/intl-getcanonicallocales': 2.5.6 - tslib: 2.8.1 + '@formatjs/fast-memoize': 3.1.5 - '@formatjs/intl-localematcher@0.6.2': + '@formatjs/intl-numberformat@9.3.10': dependencies: - tslib: 2.8.1 + '@formatjs/bigdecimal': 0.2.5 + '@formatjs/intl-localematcher': 0.8.9 - '@formatjs/intl-numberformat@8.15.6': + '@formatjs/intl-pluralrules@6.3.9': dependencies: - '@formatjs/ecma402-abstract': 2.3.6 - '@formatjs/intl-localematcher': 0.6.2 - decimal.js: 10.6.0 - tslib: 2.8.1 + '@formatjs/bigdecimal': 0.2.5 + '@formatjs/intl-localematcher': 0.8.9 - '@formatjs/intl-pluralrules@5.4.6': + '@formatjs/intl-supportedvaluesof@2.3.7': dependencies: - '@formatjs/ecma402-abstract': 2.3.6 - '@formatjs/intl-localematcher': 0.6.2 - decimal.js: 10.6.0 - tslib: 2.8.1 + '@formatjs/fast-memoize': 3.1.5 '@gorhom/portal@1.0.14(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': dependencies: diff --git a/src/locale/i18n.ts b/src/locale/i18n.ts index c063f30a4c..88d85d473c 100644 --- a/src/locale/i18n.ts +++ b/src/locale/i18n.ts @@ -1,12 +1,12 @@ // Don't remove -force from these because detection is VERY slow on low-end Android. // https://github.com/formatjs/formatjs/issues/4463#issuecomment-2176070577 -import '@formatjs/intl-locale/polyfill-force' -import '@formatjs/intl-pluralrules/polyfill-force' -import '@formatjs/intl-numberformat/polyfill-force' -import '@formatjs/intl-displaynames/polyfill-force' -import '@formatjs/intl-pluralrules/locale-data/en' -import '@formatjs/intl-numberformat/locale-data/en' -import '@formatjs/intl-displaynames/locale-data/en' +import '@formatjs/intl-locale/polyfill-force.js' +import '@formatjs/intl-pluralrules/polyfill-force.js' +import '@formatjs/intl-numberformat/polyfill-force.js' +import '@formatjs/intl-displaynames/polyfill-force.js' +import '@formatjs/intl-pluralrules/locale-data/en.js' +import '@formatjs/intl-numberformat/locale-data/en.js' +import '@formatjs/intl-displaynames/locale-data/en.js' import {useEffect, useState} from 'react' import {i18n} from '@lingui/core' @@ -66,9 +66,9 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesAn}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/es'), - import('@formatjs/intl-pluralrules/locale-data/an'), - import('@formatjs/intl-numberformat/locale-data/es'), - import('@formatjs/intl-displaynames/locale-data/es'), + import('@formatjs/intl-pluralrules/locale-data/an.js'), + import('@formatjs/intl-numberformat/locale-data/an.js'), + import('@formatjs/intl-displaynames/locale-data/an.js'), ]) return dateLocale } @@ -76,9 +76,9 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesAst}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/es'), - import('@formatjs/intl-pluralrules/locale-data/ast'), - import('@formatjs/intl-numberformat/locale-data/ast'), - import('@formatjs/intl-displaynames/locale-data/ast'), + import('@formatjs/intl-pluralrules/locale-data/ast.js'), + import('@formatjs/intl-numberformat/locale-data/ast.js'), + import('@formatjs/intl-displaynames/locale-data/ast.js'), ]) return dateLocale } @@ -86,9 +86,9 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesCa}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/ca'), - import('@formatjs/intl-pluralrules/locale-data/ca'), - import('@formatjs/intl-numberformat/locale-data/ca'), - import('@formatjs/intl-displaynames/locale-data/ca'), + import('@formatjs/intl-pluralrules/locale-data/ca.js'), + import('@formatjs/intl-numberformat/locale-data/ca.js'), + import('@formatjs/intl-displaynames/locale-data/ca.js'), ]) return dateLocale } @@ -96,9 +96,9 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesCy}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/cy'), - import('@formatjs/intl-pluralrules/locale-data/cy'), - import('@formatjs/intl-numberformat/locale-data/cy'), - import('@formatjs/intl-displaynames/locale-data/cy'), + import('@formatjs/intl-pluralrules/locale-data/cy.js'), + import('@formatjs/intl-numberformat/locale-data/cy.js'), + import('@formatjs/intl-displaynames/locale-data/cy.js'), ]) return dateLocale } @@ -106,9 +106,9 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesDa}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/da'), - import('@formatjs/intl-pluralrules/locale-data/da'), - import('@formatjs/intl-numberformat/locale-data/da'), - import('@formatjs/intl-displaynames/locale-data/da'), + import('@formatjs/intl-pluralrules/locale-data/da.js'), + import('@formatjs/intl-numberformat/locale-data/da.js'), + import('@formatjs/intl-displaynames/locale-data/da.js'), ]) return dateLocale } @@ -116,9 +116,9 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesDe}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/de'), - import('@formatjs/intl-pluralrules/locale-data/de'), - import('@formatjs/intl-numberformat/locale-data/de'), - import('@formatjs/intl-displaynames/locale-data/de'), + import('@formatjs/intl-pluralrules/locale-data/de.js'), + import('@formatjs/intl-numberformat/locale-data/de.js'), + import('@formatjs/intl-displaynames/locale-data/de.js'), ]) return dateLocale } @@ -126,9 +126,9 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesEl}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/el'), - import('@formatjs/intl-pluralrules/locale-data/el'), - import('@formatjs/intl-numberformat/locale-data/el'), - import('@formatjs/intl-displaynames/locale-data/el'), + import('@formatjs/intl-pluralrules/locale-data/el.js'), + import('@formatjs/intl-numberformat/locale-data/el.js'), + import('@formatjs/intl-displaynames/locale-data/el.js'), ]) return dateLocale } @@ -136,9 +136,9 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesEn_GB}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/en-GB'), - import('@formatjs/intl-pluralrules/locale-data/en'), - import('@formatjs/intl-numberformat/locale-data/en-GB'), - import('@formatjs/intl-displaynames/locale-data/en-GB'), + import('@formatjs/intl-pluralrules/locale-data/en.js'), + import('@formatjs/intl-numberformat/locale-data/en-GB.js'), + import('@formatjs/intl-displaynames/locale-data/en-GB.js'), ]) return dateLocale } @@ -146,10 +146,9 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesEo}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/eo'), - import('@formatjs/intl-pluralrules/locale-data/eo'), - import('@formatjs/intl-numberformat/locale-data/eo'), - // borked, see https://github.com/bluesky-social/social-app/pull/9574 - // import('@formatjs/intl-displaynames/locale-data/eo'), + import('@formatjs/intl-pluralrules/locale-data/eo.js'), + import('@formatjs/intl-numberformat/locale-data/eo.js'), + import('@formatjs/intl-displaynames/locale-data/eo.js'), ]) return dateLocale } @@ -157,9 +156,9 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesEs}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/es'), - import('@formatjs/intl-pluralrules/locale-data/es'), - import('@formatjs/intl-numberformat/locale-data/es'), - import('@formatjs/intl-displaynames/locale-data/es'), + import('@formatjs/intl-pluralrules/locale-data/es.js'), + import('@formatjs/intl-numberformat/locale-data/es.js'), + import('@formatjs/intl-displaynames/locale-data/es.js'), ]) return dateLocale } @@ -167,9 +166,9 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesEu}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/eu'), - import('@formatjs/intl-pluralrules/locale-data/eu'), - import('@formatjs/intl-numberformat/locale-data/eu'), - import('@formatjs/intl-displaynames/locale-data/eu'), + import('@formatjs/intl-pluralrules/locale-data/eu.js'), + import('@formatjs/intl-numberformat/locale-data/eu.js'), + import('@formatjs/intl-displaynames/locale-data/eu.js'), ]) return dateLocale } @@ -177,9 +176,9 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesFi}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/fi'), - import('@formatjs/intl-pluralrules/locale-data/fi'), - import('@formatjs/intl-numberformat/locale-data/fi'), - import('@formatjs/intl-displaynames/locale-data/fi'), + import('@formatjs/intl-pluralrules/locale-data/fi.js'), + import('@formatjs/intl-numberformat/locale-data/fi.js'), + import('@formatjs/intl-displaynames/locale-data/fi.js'), ]) return dateLocale } @@ -187,9 +186,9 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesFr}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/fr'), - import('@formatjs/intl-pluralrules/locale-data/fr'), - import('@formatjs/intl-numberformat/locale-data/fr'), - import('@formatjs/intl-displaynames/locale-data/fr'), + import('@formatjs/intl-pluralrules/locale-data/fr.js'), + import('@formatjs/intl-numberformat/locale-data/fr.js'), + import('@formatjs/intl-displaynames/locale-data/fr.js'), ]) return dateLocale } @@ -197,18 +196,18 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesFy}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/fy'), - import('@formatjs/intl-pluralrules/locale-data/fy'), - import('@formatjs/intl-numberformat/locale-data/fy'), - import('@formatjs/intl-displaynames/locale-data/fy'), + import('@formatjs/intl-pluralrules/locale-data/fy.js'), + import('@formatjs/intl-numberformat/locale-data/fy.js'), + import('@formatjs/intl-displaynames/locale-data/fy.js'), ]) return dateLocale } case AppLanguage.ga: { i18n.loadAndActivate({locale, messages: messagesGa}) await Promise.all([ - import('@formatjs/intl-pluralrules/locale-data/ga'), - import('@formatjs/intl-numberformat/locale-data/ga'), - import('@formatjs/intl-displaynames/locale-data/ga'), + import('@formatjs/intl-pluralrules/locale-data/ga.js'), + import('@formatjs/intl-numberformat/locale-data/ga.js'), + import('@formatjs/intl-displaynames/locale-data/ga.js'), ]) return undefined } @@ -216,9 +215,9 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesGd}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/gd'), - import('@formatjs/intl-pluralrules/locale-data/gd'), - import('@formatjs/intl-numberformat/locale-data/gd'), - import('@formatjs/intl-displaynames/locale-data/gd'), + import('@formatjs/intl-pluralrules/locale-data/gd.js'), + import('@formatjs/intl-numberformat/locale-data/gd.js'), + import('@formatjs/intl-displaynames/locale-data/gd.js'), ]) return dateLocale } @@ -226,9 +225,9 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesGl}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/gl'), - import('@formatjs/intl-pluralrules/locale-data/gl'), - import('@formatjs/intl-numberformat/locale-data/gl'), - import('@formatjs/intl-displaynames/locale-data/gl'), + import('@formatjs/intl-pluralrules/locale-data/gl.js'), + import('@formatjs/intl-numberformat/locale-data/gl.js'), + import('@formatjs/intl-displaynames/locale-data/gl.js'), ]) return dateLocale } @@ -236,9 +235,9 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesHi}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/hi'), - import('@formatjs/intl-pluralrules/locale-data/hi'), - import('@formatjs/intl-numberformat/locale-data/hi'), - import('@formatjs/intl-displaynames/locale-data/hi'), + import('@formatjs/intl-pluralrules/locale-data/hi.js'), + import('@formatjs/intl-numberformat/locale-data/hi.js'), + import('@formatjs/intl-displaynames/locale-data/hi.js'), ]) return dateLocale } @@ -246,18 +245,18 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesHu}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/hu'), - import('@formatjs/intl-pluralrules/locale-data/hu'), - import('@formatjs/intl-numberformat/locale-data/hu'), - import('@formatjs/intl-displaynames/locale-data/hu'), + import('@formatjs/intl-pluralrules/locale-data/hu.js'), + import('@formatjs/intl-numberformat/locale-data/hu.js'), + import('@formatjs/intl-displaynames/locale-data/hu.js'), ]) return dateLocale } case AppLanguage.ia: { i18n.loadAndActivate({locale, messages: messagesIa}) await Promise.all([ - import('@formatjs/intl-pluralrules/locale-data/ia'), - import('@formatjs/intl-numberformat/locale-data/ia'), - import('@formatjs/intl-displaynames/locale-data/ia'), + import('@formatjs/intl-pluralrules/locale-data/ia.js'), + import('@formatjs/intl-numberformat/locale-data/ia.js'), + import('@formatjs/intl-displaynames/locale-data/ia.js'), ]) return undefined } @@ -265,9 +264,9 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesId}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/id'), - import('@formatjs/intl-pluralrules/locale-data/id'), - import('@formatjs/intl-numberformat/locale-data/id'), - import('@formatjs/intl-displaynames/locale-data/id'), + import('@formatjs/intl-pluralrules/locale-data/id.js'), + import('@formatjs/intl-numberformat/locale-data/id.js'), + import('@formatjs/intl-displaynames/locale-data/id.js'), ]) return dateLocale } @@ -275,9 +274,9 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesIt}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/it'), - import('@formatjs/intl-pluralrules/locale-data/it'), - import('@formatjs/intl-numberformat/locale-data/it'), - import('@formatjs/intl-displaynames/locale-data/it'), + import('@formatjs/intl-pluralrules/locale-data/it.js'), + import('@formatjs/intl-numberformat/locale-data/it.js'), + import('@formatjs/intl-displaynames/locale-data/it.js'), ]) return dateLocale } @@ -285,9 +284,9 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesJa}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/ja'), - import('@formatjs/intl-pluralrules/locale-data/ja'), - import('@formatjs/intl-numberformat/locale-data/ja'), - import('@formatjs/intl-displaynames/locale-data/ja'), + import('@formatjs/intl-pluralrules/locale-data/ja.js'), + import('@formatjs/intl-numberformat/locale-data/ja.js'), + import('@formatjs/intl-displaynames/locale-data/ja.js'), ]) return dateLocale } @@ -295,9 +294,9 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesKm}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/km'), - import('@formatjs/intl-pluralrules/locale-data/km'), - import('@formatjs/intl-numberformat/locale-data/km'), - import('@formatjs/intl-displaynames/locale-data/km'), + import('@formatjs/intl-pluralrules/locale-data/km.js'), + import('@formatjs/intl-numberformat/locale-data/km.js'), + import('@formatjs/intl-displaynames/locale-data/km.js'), ]) return dateLocale } @@ -305,18 +304,18 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesKo}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/ko'), - import('@formatjs/intl-pluralrules/locale-data/ko'), - import('@formatjs/intl-numberformat/locale-data/ko'), - import('@formatjs/intl-displaynames/locale-data/ko'), + import('@formatjs/intl-pluralrules/locale-data/ko.js'), + import('@formatjs/intl-numberformat/locale-data/ko.js'), + import('@formatjs/intl-displaynames/locale-data/ko.js'), ]) return dateLocale } case AppLanguage.ne: { i18n.loadAndActivate({locale, messages: messagesNe}) await Promise.all([ - import('@formatjs/intl-pluralrules/locale-data/ne'), - import('@formatjs/intl-numberformat/locale-data/ne'), - import('@formatjs/intl-displaynames/locale-data/ne'), + import('@formatjs/intl-pluralrules/locale-data/ne.js'), + import('@formatjs/intl-numberformat/locale-data/ne.js'), + import('@formatjs/intl-displaynames/locale-data/ne.js'), ]) return undefined } @@ -324,9 +323,9 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesNl}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/nl'), - import('@formatjs/intl-pluralrules/locale-data/nl'), - import('@formatjs/intl-numberformat/locale-data/nl'), - import('@formatjs/intl-displaynames/locale-data/nl'), + import('@formatjs/intl-pluralrules/locale-data/nl.js'), + import('@formatjs/intl-numberformat/locale-data/nl.js'), + import('@formatjs/intl-displaynames/locale-data/nl.js'), ]) return dateLocale } @@ -334,9 +333,9 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesPl}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/pl'), - import('@formatjs/intl-pluralrules/locale-data/pl'), - import('@formatjs/intl-numberformat/locale-data/pl'), - import('@formatjs/intl-displaynames/locale-data/pl'), + import('@formatjs/intl-pluralrules/locale-data/pl.js'), + import('@formatjs/intl-numberformat/locale-data/pl.js'), + import('@formatjs/intl-displaynames/locale-data/pl.js'), ]) return dateLocale } @@ -344,9 +343,9 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesPt_BR}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/pt-BR'), - import('@formatjs/intl-pluralrules/locale-data/pt'), - import('@formatjs/intl-numberformat/locale-data/pt'), - import('@formatjs/intl-displaynames/locale-data/pt'), + import('@formatjs/intl-pluralrules/locale-data/pt.js'), + import('@formatjs/intl-numberformat/locale-data/pt.js'), + import('@formatjs/intl-displaynames/locale-data/pt.js'), ]) return dateLocale } @@ -354,9 +353,9 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesPt_PT}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/pt'), - import('@formatjs/intl-pluralrules/locale-data/pt-PT'), - import('@formatjs/intl-numberformat/locale-data/pt-PT'), - import('@formatjs/intl-displaynames/locale-data/pt-PT'), + import('@formatjs/intl-pluralrules/locale-data/pt-PT.js'), + import('@formatjs/intl-numberformat/locale-data/pt-PT.js'), + import('@formatjs/intl-displaynames/locale-data/pt-PT.js'), ]) return dateLocale } @@ -364,9 +363,9 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesRo}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/ro'), - import('@formatjs/intl-pluralrules/locale-data/ro'), - import('@formatjs/intl-numberformat/locale-data/ro'), - import('@formatjs/intl-displaynames/locale-data/ro'), + import('@formatjs/intl-pluralrules/locale-data/ro.js'), + import('@formatjs/intl-numberformat/locale-data/ro.js'), + import('@formatjs/intl-displaynames/locale-data/ro.js'), ]) return dateLocale } @@ -374,9 +373,9 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesRu}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/ru'), - import('@formatjs/intl-pluralrules/locale-data/ru'), - import('@formatjs/intl-numberformat/locale-data/ru'), - import('@formatjs/intl-displaynames/locale-data/ru'), + import('@formatjs/intl-pluralrules/locale-data/ru.js'), + import('@formatjs/intl-numberformat/locale-data/ru.js'), + import('@formatjs/intl-displaynames/locale-data/ru.js'), ]) return dateLocale } @@ -384,9 +383,9 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesSv}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/sv'), - import('@formatjs/intl-pluralrules/locale-data/sv'), - import('@formatjs/intl-numberformat/locale-data/sv'), - import('@formatjs/intl-displaynames/locale-data/sv'), + import('@formatjs/intl-pluralrules/locale-data/sv.js'), + import('@formatjs/intl-numberformat/locale-data/sv.js'), + import('@formatjs/intl-displaynames/locale-data/sv.js'), ]) return dateLocale } @@ -394,9 +393,9 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesTh}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/th'), - import('@formatjs/intl-pluralrules/locale-data/th'), - import('@formatjs/intl-numberformat/locale-data/th'), - import('@formatjs/intl-displaynames/locale-data/th'), + import('@formatjs/intl-pluralrules/locale-data/th.js'), + import('@formatjs/intl-numberformat/locale-data/th.js'), + import('@formatjs/intl-displaynames/locale-data/th.js'), ]) return dateLocale } @@ -404,9 +403,9 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesTr}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/tr'), - import('@formatjs/intl-pluralrules/locale-data/tr'), - import('@formatjs/intl-numberformat/locale-data/tr'), - import('@formatjs/intl-displaynames/locale-data/tr'), + import('@formatjs/intl-pluralrules/locale-data/tr.js'), + import('@formatjs/intl-numberformat/locale-data/tr.js'), + import('@formatjs/intl-displaynames/locale-data/tr.js'), ]) return dateLocale } @@ -414,9 +413,9 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesUk}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/uk'), - import('@formatjs/intl-pluralrules/locale-data/uk'), - import('@formatjs/intl-numberformat/locale-data/uk'), - import('@formatjs/intl-displaynames/locale-data/uk'), + import('@formatjs/intl-pluralrules/locale-data/uk.js'), + import('@formatjs/intl-numberformat/locale-data/uk.js'), + import('@formatjs/intl-displaynames/locale-data/uk.js'), ]) return dateLocale } @@ -424,9 +423,9 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesVi}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/vi'), - import('@formatjs/intl-pluralrules/locale-data/vi'), - import('@formatjs/intl-numberformat/locale-data/vi'), - import('@formatjs/intl-displaynames/locale-data/vi'), + import('@formatjs/intl-pluralrules/locale-data/vi.js'), + import('@formatjs/intl-numberformat/locale-data/vi.js'), + import('@formatjs/intl-displaynames/locale-data/vi.js'), ]) return dateLocale } @@ -434,9 +433,9 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesZh_CN}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/zh-CN'), - import('@formatjs/intl-pluralrules/locale-data/zh'), - import('@formatjs/intl-numberformat/locale-data/zh'), - import('@formatjs/intl-displaynames/locale-data/zh'), + import('@formatjs/intl-pluralrules/locale-data/zh.js'), + import('@formatjs/intl-numberformat/locale-data/zh.js'), + import('@formatjs/intl-displaynames/locale-data/zh.js'), ]) return dateLocale } @@ -444,9 +443,9 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesZh_HK}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/zh-HK'), - import('@formatjs/intl-pluralrules/locale-data/zh'), - import('@formatjs/intl-numberformat/locale-data/zh'), - import('@formatjs/intl-displaynames/locale-data/zh'), + import('@formatjs/intl-pluralrules/locale-data/zh.js'), + import('@formatjs/intl-numberformat/locale-data/yue-Hant.js'), + import('@formatjs/intl-displaynames/locale-data/yue-Hant.js'), ]) return dateLocale } @@ -454,9 +453,9 @@ export async function dynamicActivate(locale: AppLanguage) { i18n.loadAndActivate({locale, messages: messagesZh_TW}) const [{default: dateLocale}] = await Promise.all([ import('date-fns/locale/zh-TW'), - import('@formatjs/intl-pluralrules/locale-data/zh'), - import('@formatjs/intl-numberformat/locale-data/zh'), - import('@formatjs/intl-displaynames/locale-data/zh'), + import('@formatjs/intl-pluralrules/locale-data/zh.js'), + import('@formatjs/intl-numberformat/locale-data/zh-Hant.js'), + import('@formatjs/intl-displaynames/locale-data/zh-Hant.js'), ]) return dateLocale } diff --git a/tsconfig.json b/tsconfig.json index 8d76de8a00..c3f559d917 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,8 +8,6 @@ "paths": { "#/*": ["./src/*"], "crypto": ["./src/platform/crypto.ts"], - "multiformats/cid": ["./node_modules/multiformats/types/src/cid.d.ts"], - "multiformats/hashes/hasher": ["./node_modules/multiformats/types/src/hashes/hasher.d.ts"] }, "plugins": [ { From 237232f96cf8cfad715a0d1651efaf71eff20da3 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Tue, 2 Jun 2026 01:21:50 +0300 Subject: [PATCH 011/149] Update `date-fns` to latest (#10545) --- eslint-suppressions.json | 10 -- package.json | 2 +- pnpm-lock.yaml | 17 +-- src/locale/i18n.ts | 158 ++++++++++---------- src/locale/i18n.web.ts | 241 ++++++++++++++++--------------- src/logger/transports/console.ts | 2 +- src/platform/polyfills.web.ts | 3 +- 7 files changed, 212 insertions(+), 221 deletions(-) diff --git a/eslint-suppressions.json b/eslint-suppressions.json index 2bbe927a12..40b918e771 100644 --- a/eslint-suppressions.json +++ b/eslint-suppressions.json @@ -317,16 +317,6 @@ "count": 1 } }, - "src/locale/i18n.web.ts": { - "@typescript-eslint/no-explicit-any": { - "count": 1 - } - }, - "src/platform/polyfills.web.ts": { - "@typescript-eslint/no-explicit-any": { - "count": 1 - } - }, "src/screens/Bookmarks/index.tsx": { "@typescript-eslint/no-explicit-any": { "count": 1 diff --git a/package.json b/package.json index f82c2922ed..e156d7280e 100644 --- a/package.json +++ b/package.json @@ -150,7 +150,7 @@ "babel-plugin-transform-remove-console": "^6.9.4", "bcp-47": "^2.1.0", "bcp-47-match": "^2.0.3", - "date-fns": "^2.30.0", + "date-fns": "^4.4.0", "email-validator": "^2.0.4", "emoji-mart": "^5.6.0", "emoji-regex": "^10.4.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0b4789ac58..d0157ed61e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -416,8 +416,8 @@ importers: specifier: ^2.0.3 version: 2.0.3 date-fns: - specifier: ^2.30.0 - version: 2.30.0 + specifier: ^4.4.0 + version: 4.4.0 email-validator: specifier: ^2.0.4 version: 2.0.4 @@ -4788,13 +4788,12 @@ packages: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} - date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} - date-fns@3.6.0: resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} + date-fns@4.4.0: + resolution: {integrity: sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==} + debounce@1.2.1: resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} @@ -14216,12 +14215,10 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 - date-fns@2.30.0: - dependencies: - '@babel/runtime': 7.29.2 - date-fns@3.6.0: {} + date-fns@4.4.0: {} + debounce@1.2.1: {} debug@2.6.9: diff --git a/src/locale/i18n.ts b/src/locale/i18n.ts index 88d85d473c..17445d99b2 100644 --- a/src/locale/i18n.ts +++ b/src/locale/i18n.ts @@ -10,7 +10,7 @@ import '@formatjs/intl-displaynames/locale-data/en.js' import {useEffect, useState} from 'react' import {i18n} from '@lingui/core' -import defaultLocale from 'date-fns/locale/en-US' +import {enUS as defaultLocale} from 'date-fns/locale/en-US' import {sanitizeAppLanguageSetting} from '#/locale/helpers' import {AppLanguage} from '#/locale/languages' @@ -64,8 +64,8 @@ export async function dynamicActivate(locale: AppLanguage) { switch (locale) { case AppLanguage.an: { i18n.loadAndActivate({locale, messages: messagesAn}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/es'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/es').then(m => m.es), import('@formatjs/intl-pluralrules/locale-data/an.js'), import('@formatjs/intl-numberformat/locale-data/an.js'), import('@formatjs/intl-displaynames/locale-data/an.js'), @@ -74,8 +74,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.ast: { i18n.loadAndActivate({locale, messages: messagesAst}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/es'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/es').then(m => m.es), import('@formatjs/intl-pluralrules/locale-data/ast.js'), import('@formatjs/intl-numberformat/locale-data/ast.js'), import('@formatjs/intl-displaynames/locale-data/ast.js'), @@ -84,8 +84,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.ca: { i18n.loadAndActivate({locale, messages: messagesCa}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/ca'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/ca').then(m => m.ca), import('@formatjs/intl-pluralrules/locale-data/ca.js'), import('@formatjs/intl-numberformat/locale-data/ca.js'), import('@formatjs/intl-displaynames/locale-data/ca.js'), @@ -94,8 +94,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.cy: { i18n.loadAndActivate({locale, messages: messagesCy}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/cy'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/cy').then(m => m.cy), import('@formatjs/intl-pluralrules/locale-data/cy.js'), import('@formatjs/intl-numberformat/locale-data/cy.js'), import('@formatjs/intl-displaynames/locale-data/cy.js'), @@ -104,8 +104,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.da: { i18n.loadAndActivate({locale, messages: messagesDa}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/da'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/da').then(m => m.da), import('@formatjs/intl-pluralrules/locale-data/da.js'), import('@formatjs/intl-numberformat/locale-data/da.js'), import('@formatjs/intl-displaynames/locale-data/da.js'), @@ -114,8 +114,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.de: { i18n.loadAndActivate({locale, messages: messagesDe}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/de'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/de').then(m => m.de), import('@formatjs/intl-pluralrules/locale-data/de.js'), import('@formatjs/intl-numberformat/locale-data/de.js'), import('@formatjs/intl-displaynames/locale-data/de.js'), @@ -124,8 +124,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.el: { i18n.loadAndActivate({locale, messages: messagesEl}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/el'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/el').then(m => m.el), import('@formatjs/intl-pluralrules/locale-data/el.js'), import('@formatjs/intl-numberformat/locale-data/el.js'), import('@formatjs/intl-displaynames/locale-data/el.js'), @@ -134,8 +134,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.en_GB: { i18n.loadAndActivate({locale, messages: messagesEn_GB}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/en-GB'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/en-GB').then(m => m.enGB), import('@formatjs/intl-pluralrules/locale-data/en.js'), import('@formatjs/intl-numberformat/locale-data/en-GB.js'), import('@formatjs/intl-displaynames/locale-data/en-GB.js'), @@ -144,8 +144,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.eo: { i18n.loadAndActivate({locale, messages: messagesEo}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/eo'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/eo').then(m => m.eo), import('@formatjs/intl-pluralrules/locale-data/eo.js'), import('@formatjs/intl-numberformat/locale-data/eo.js'), import('@formatjs/intl-displaynames/locale-data/eo.js'), @@ -154,8 +154,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.es: { i18n.loadAndActivate({locale, messages: messagesEs}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/es'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/es').then(m => m.es), import('@formatjs/intl-pluralrules/locale-data/es.js'), import('@formatjs/intl-numberformat/locale-data/es.js'), import('@formatjs/intl-displaynames/locale-data/es.js'), @@ -164,8 +164,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.eu: { i18n.loadAndActivate({locale, messages: messagesEu}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/eu'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/eu').then(m => m.eu), import('@formatjs/intl-pluralrules/locale-data/eu.js'), import('@formatjs/intl-numberformat/locale-data/eu.js'), import('@formatjs/intl-displaynames/locale-data/eu.js'), @@ -174,8 +174,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.fi: { i18n.loadAndActivate({locale, messages: messagesFi}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/fi'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/fi').then(m => m.fi), import('@formatjs/intl-pluralrules/locale-data/fi.js'), import('@formatjs/intl-numberformat/locale-data/fi.js'), import('@formatjs/intl-displaynames/locale-data/fi.js'), @@ -184,8 +184,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.fr: { i18n.loadAndActivate({locale, messages: messagesFr}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/fr'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/fr').then(m => m.fr), import('@formatjs/intl-pluralrules/locale-data/fr.js'), import('@formatjs/intl-numberformat/locale-data/fr.js'), import('@formatjs/intl-displaynames/locale-data/fr.js'), @@ -194,8 +194,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.fy: { i18n.loadAndActivate({locale, messages: messagesFy}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/fy'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/fy').then(m => m.fy), import('@formatjs/intl-pluralrules/locale-data/fy.js'), import('@formatjs/intl-numberformat/locale-data/fy.js'), import('@formatjs/intl-displaynames/locale-data/fy.js'), @@ -213,8 +213,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.gd: { i18n.loadAndActivate({locale, messages: messagesGd}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/gd'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/gd').then(m => m.gd), import('@formatjs/intl-pluralrules/locale-data/gd.js'), import('@formatjs/intl-numberformat/locale-data/gd.js'), import('@formatjs/intl-displaynames/locale-data/gd.js'), @@ -223,8 +223,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.gl: { i18n.loadAndActivate({locale, messages: messagesGl}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/gl'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/gl').then(m => m.gl), import('@formatjs/intl-pluralrules/locale-data/gl.js'), import('@formatjs/intl-numberformat/locale-data/gl.js'), import('@formatjs/intl-displaynames/locale-data/gl.js'), @@ -233,8 +233,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.hi: { i18n.loadAndActivate({locale, messages: messagesHi}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/hi'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/hi').then(m => m.hi), import('@formatjs/intl-pluralrules/locale-data/hi.js'), import('@formatjs/intl-numberformat/locale-data/hi.js'), import('@formatjs/intl-displaynames/locale-data/hi.js'), @@ -243,8 +243,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.hu: { i18n.loadAndActivate({locale, messages: messagesHu}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/hu'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/hu').then(m => m.hu), import('@formatjs/intl-pluralrules/locale-data/hu.js'), import('@formatjs/intl-numberformat/locale-data/hu.js'), import('@formatjs/intl-displaynames/locale-data/hu.js'), @@ -262,8 +262,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.id: { i18n.loadAndActivate({locale, messages: messagesId}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/id'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/id').then(m => m.id), import('@formatjs/intl-pluralrules/locale-data/id.js'), import('@formatjs/intl-numberformat/locale-data/id.js'), import('@formatjs/intl-displaynames/locale-data/id.js'), @@ -272,8 +272,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.it: { i18n.loadAndActivate({locale, messages: messagesIt}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/it'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/it').then(m => m.it), import('@formatjs/intl-pluralrules/locale-data/it.js'), import('@formatjs/intl-numberformat/locale-data/it.js'), import('@formatjs/intl-displaynames/locale-data/it.js'), @@ -282,8 +282,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.ja: { i18n.loadAndActivate({locale, messages: messagesJa}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/ja'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/ja').then(m => m.ja), import('@formatjs/intl-pluralrules/locale-data/ja.js'), import('@formatjs/intl-numberformat/locale-data/ja.js'), import('@formatjs/intl-displaynames/locale-data/ja.js'), @@ -292,8 +292,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.km: { i18n.loadAndActivate({locale, messages: messagesKm}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/km'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/km').then(m => m.km), import('@formatjs/intl-pluralrules/locale-data/km.js'), import('@formatjs/intl-numberformat/locale-data/km.js'), import('@formatjs/intl-displaynames/locale-data/km.js'), @@ -302,8 +302,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.ko: { i18n.loadAndActivate({locale, messages: messagesKo}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/ko'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/ko').then(m => m.ko), import('@formatjs/intl-pluralrules/locale-data/ko.js'), import('@formatjs/intl-numberformat/locale-data/ko.js'), import('@formatjs/intl-displaynames/locale-data/ko.js'), @@ -321,8 +321,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.nl: { i18n.loadAndActivate({locale, messages: messagesNl}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/nl'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/nl').then(m => m.nl), import('@formatjs/intl-pluralrules/locale-data/nl.js'), import('@formatjs/intl-numberformat/locale-data/nl.js'), import('@formatjs/intl-displaynames/locale-data/nl.js'), @@ -331,8 +331,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.pl: { i18n.loadAndActivate({locale, messages: messagesPl}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/pl'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/pl').then(m => m.pl), import('@formatjs/intl-pluralrules/locale-data/pl.js'), import('@formatjs/intl-numberformat/locale-data/pl.js'), import('@formatjs/intl-displaynames/locale-data/pl.js'), @@ -341,8 +341,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.pt_BR: { i18n.loadAndActivate({locale, messages: messagesPt_BR}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/pt-BR'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/pt-BR').then(m => m.ptBR), import('@formatjs/intl-pluralrules/locale-data/pt.js'), import('@formatjs/intl-numberformat/locale-data/pt.js'), import('@formatjs/intl-displaynames/locale-data/pt.js'), @@ -351,8 +351,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.pt_PT: { i18n.loadAndActivate({locale, messages: messagesPt_PT}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/pt'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/pt').then(m => m.pt), import('@formatjs/intl-pluralrules/locale-data/pt-PT.js'), import('@formatjs/intl-numberformat/locale-data/pt-PT.js'), import('@formatjs/intl-displaynames/locale-data/pt-PT.js'), @@ -361,8 +361,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.ro: { i18n.loadAndActivate({locale, messages: messagesRo}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/ro'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/ro').then(m => m.ro), import('@formatjs/intl-pluralrules/locale-data/ro.js'), import('@formatjs/intl-numberformat/locale-data/ro.js'), import('@formatjs/intl-displaynames/locale-data/ro.js'), @@ -371,8 +371,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.ru: { i18n.loadAndActivate({locale, messages: messagesRu}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/ru'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/ru').then(m => m.ru), import('@formatjs/intl-pluralrules/locale-data/ru.js'), import('@formatjs/intl-numberformat/locale-data/ru.js'), import('@formatjs/intl-displaynames/locale-data/ru.js'), @@ -381,8 +381,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.sv: { i18n.loadAndActivate({locale, messages: messagesSv}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/sv'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/sv').then(m => m.sv), import('@formatjs/intl-pluralrules/locale-data/sv.js'), import('@formatjs/intl-numberformat/locale-data/sv.js'), import('@formatjs/intl-displaynames/locale-data/sv.js'), @@ -391,8 +391,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.th: { i18n.loadAndActivate({locale, messages: messagesTh}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/th'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/th').then(m => m.th), import('@formatjs/intl-pluralrules/locale-data/th.js'), import('@formatjs/intl-numberformat/locale-data/th.js'), import('@formatjs/intl-displaynames/locale-data/th.js'), @@ -401,8 +401,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.tr: { i18n.loadAndActivate({locale, messages: messagesTr}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/tr'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/tr').then(m => m.tr), import('@formatjs/intl-pluralrules/locale-data/tr.js'), import('@formatjs/intl-numberformat/locale-data/tr.js'), import('@formatjs/intl-displaynames/locale-data/tr.js'), @@ -411,8 +411,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.uk: { i18n.loadAndActivate({locale, messages: messagesUk}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/uk'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/uk').then(m => m.uk), import('@formatjs/intl-pluralrules/locale-data/uk.js'), import('@formatjs/intl-numberformat/locale-data/uk.js'), import('@formatjs/intl-displaynames/locale-data/uk.js'), @@ -421,8 +421,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.vi: { i18n.loadAndActivate({locale, messages: messagesVi}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/vi'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/vi').then(m => m.vi), import('@formatjs/intl-pluralrules/locale-data/vi.js'), import('@formatjs/intl-numberformat/locale-data/vi.js'), import('@formatjs/intl-displaynames/locale-data/vi.js'), @@ -431,8 +431,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.zh_CN: { i18n.loadAndActivate({locale, messages: messagesZh_CN}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/zh-CN'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/zh-CN').then(m => m.zhCN), import('@formatjs/intl-pluralrules/locale-data/zh.js'), import('@formatjs/intl-numberformat/locale-data/zh.js'), import('@formatjs/intl-displaynames/locale-data/zh.js'), @@ -441,8 +441,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.zh_HK: { i18n.loadAndActivate({locale, messages: messagesZh_HK}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/zh-HK'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/zh-HK').then(m => m.zhHK), import('@formatjs/intl-pluralrules/locale-data/zh.js'), import('@formatjs/intl-numberformat/locale-data/yue-Hant.js'), import('@formatjs/intl-displaynames/locale-data/yue-Hant.js'), @@ -451,8 +451,8 @@ export async function dynamicActivate(locale: AppLanguage) { } case AppLanguage.zh_TW: { i18n.loadAndActivate({locale, messages: messagesZh_TW}) - const [{default: dateLocale}] = await Promise.all([ - import('date-fns/locale/zh-TW'), + const [dateLocale] = await Promise.all([ + import('date-fns/locale/zh-TW').then(m => m.zhTW), import('@formatjs/intl-pluralrules/locale-data/zh.js'), import('@formatjs/intl-numberformat/locale-data/zh-Hant.js'), import('@formatjs/intl-displaynames/locale-data/zh-Hant.js'), @@ -471,9 +471,11 @@ export function useLocaleLanguage() { const [dateLocale, setDateLocale] = useState(defaultLocale) useEffect(() => { - dynamicActivate(sanitizeAppLanguageSetting(appLanguage)).then(locale => { - setDateLocale(locale ?? defaultLocale) - }) + void dynamicActivate(sanitizeAppLanguageSetting(appLanguage)).then( + locale => { + setDateLocale(locale ?? defaultLocale) + }, + ) }, [appLanguage]) return dateLocale diff --git a/src/locale/i18n.web.ts b/src/locale/i18n.web.ts index 2b79ae7f29..4d36ccb28b 100644 --- a/src/locale/i18n.web.ts +++ b/src/locale/i18n.web.ts @@ -1,6 +1,7 @@ import {useEffect, useState} from 'react' -import {i18n} from '@lingui/core' -import defaultLocale from 'date-fns/locale/en-US' +import {i18n, type Messages} from '@lingui/core' +import {type Locale} from 'date-fns/locale' +import {enUS as defaultLocale} from 'date-fns/locale/en-US' import {sanitizeAppLanguageSetting} from '#/locale/helpers' import {AppLanguage} from '#/locale/languages' @@ -10,288 +11,288 @@ import {useLanguagePrefs} from '#/state/preferences' * We do a dynamic import of just the catalog that we need */ export async function dynamicActivate(locale: AppLanguage) { - let mod: any + let messages: Messages let dateLocale: Locale = defaultLocale switch (locale) { case AppLanguage.an: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/an/messages`), - import('date-fns/locale/es'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/an/messages`).then(m => m.messages), + import('date-fns/locale/es').then(m => m.es), ]) break } case AppLanguage.ast: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/ast/messages`), - import('date-fns/locale/es'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/ast/messages`).then(m => m.messages), + import('date-fns/locale/es').then(m => m.es), ]) break } case AppLanguage.ca: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/ca/messages`), - import('date-fns/locale/ca'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/ca/messages`).then(m => m.messages), + import('date-fns/locale/ca').then(m => m.ca), ]) break } case AppLanguage.cy: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/cy/messages`), - import('date-fns/locale/cy'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/cy/messages`).then(m => m.messages), + import('date-fns/locale/cy').then(m => m.cy), ]) break } case AppLanguage.da: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/da/messages`), - import('date-fns/locale/da'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/da/messages`).then(m => m.messages), + import('date-fns/locale/da').then(m => m.da), ]) break } case AppLanguage.de: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/de/messages`), - import('date-fns/locale/de'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/de/messages`).then(m => m.messages), + import('date-fns/locale/de').then(m => m.de), ]) break } case AppLanguage.el: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/el/messages`), - import('date-fns/locale/el'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/el/messages`).then(m => m.messages), + import('date-fns/locale/el').then(m => m.el), ]) break } case AppLanguage.en_GB: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/en-GB/messages`), - import('date-fns/locale/en-GB'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/en-GB/messages`).then(m => m.messages), + import('date-fns/locale/en-GB').then(m => m.enGB), ]) break } case AppLanguage.eo: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/eo/messages`), - import('date-fns/locale/eo'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/eo/messages`).then(m => m.messages), + import('date-fns/locale/eo').then(m => m.eo), ]) break } case AppLanguage.es: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/es/messages`), - import('date-fns/locale/es'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/es/messages`).then(m => m.messages), + import('date-fns/locale/es').then(m => m.es), ]) break } case AppLanguage.eu: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/eu/messages`), - import('date-fns/locale/eu'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/eu/messages`).then(m => m.messages), + import('date-fns/locale/eu').then(m => m.eu), ]) break } case AppLanguage.fi: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/fi/messages`), - import('date-fns/locale/fi'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/fi/messages`).then(m => m.messages), + import('date-fns/locale/fi').then(m => m.fi), ]) break } case AppLanguage.fr: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/fr/messages`), - import('date-fns/locale/fr'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/fr/messages`).then(m => m.messages), + import('date-fns/locale/fr').then(m => m.fr), ]) break } case AppLanguage.fy: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/fy/messages`), - import('date-fns/locale/fy'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/fy/messages`).then(m => m.messages), + import('date-fns/locale/fy').then(m => m.fy), ]) break } case AppLanguage.ga: { - mod = await import(`./locales/ga/messages`) + messages = await import(`./locales/ga/messages`).then(m => m.messages) break } case AppLanguage.gd: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/gd/messages`), - import('date-fns/locale/gd'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/gd/messages`).then(m => m.messages), + import('date-fns/locale/gd').then(m => m.gd), ]) break } case AppLanguage.gl: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/gl/messages`), - import('date-fns/locale/gl'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/gl/messages`).then(m => m.messages), + import('date-fns/locale/gl').then(m => m.gl), ]) break } case AppLanguage.hi: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/hi/messages`), - import('date-fns/locale/hi'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/hi/messages`).then(m => m.messages), + import('date-fns/locale/hi').then(m => m.hi), ]) break } case AppLanguage.hu: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/hu/messages`), - import('date-fns/locale/hu'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/hu/messages`).then(m => m.messages), + import('date-fns/locale/hu').then(m => m.hu), ]) break } case AppLanguage.ia: { - mod = await import(`./locales/ia/messages`) + messages = await import(`./locales/ia/messages`).then(m => m.messages) break } case AppLanguage.id: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/id/messages`), - import('date-fns/locale/id'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/id/messages`).then(m => m.messages), + import('date-fns/locale/id').then(m => m.id), ]) break } case AppLanguage.it: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/it/messages`), - import('date-fns/locale/it'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/it/messages`).then(m => m.messages), + import('date-fns/locale/it').then(m => m.it), ]) break } case AppLanguage.ja: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/ja/messages`), - import('date-fns/locale/ja'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/ja/messages`).then(m => m.messages), + import('date-fns/locale/ja').then(m => m.ja), ]) break } case AppLanguage.km: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/km/messages`), - import('date-fns/locale/km'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/km/messages`).then(m => m.messages), + import('date-fns/locale/km').then(m => m.km), ]) break } case AppLanguage.ko: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/ko/messages`), - import('date-fns/locale/ko'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/ko/messages`).then(m => m.messages), + import('date-fns/locale/ko').then(m => m.ko), ]) break } case AppLanguage.ne: { - mod = await import(`./locales/ne/messages`) + messages = await import(`./locales/ne/messages`).then(m => m.messages) break } case AppLanguage.nl: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/nl/messages`), - import('date-fns/locale/nl'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/nl/messages`).then(m => m.messages), + import('date-fns/locale/nl').then(m => m.nl), ]) break } case AppLanguage.pl: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/pl/messages`), - import('date-fns/locale/pl'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/pl/messages`).then(m => m.messages), + import('date-fns/locale/pl').then(m => m.pl), ]) break } case AppLanguage.pt_BR: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/pt-BR/messages`), - import('date-fns/locale/pt-BR'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/pt-BR/messages`).then(m => m.messages), + import('date-fns/locale/pt-BR').then(m => m.ptBR), ]) break } case AppLanguage.pt_PT: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/pt-PT/messages`), - import('date-fns/locale/pt'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/pt-PT/messages`).then(m => m.messages), + import('date-fns/locale/pt').then(m => m.pt), ]) break } case AppLanguage.ro: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/ro/messages`), - import('date-fns/locale/ro'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/ro/messages`).then(m => m.messages), + import('date-fns/locale/ro').then(m => m.ro), ]) break } case AppLanguage.ru: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/ru/messages`), - import('date-fns/locale/ru'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/ru/messages`).then(m => m.messages), + import('date-fns/locale/ru').then(m => m.ru), ]) break } case AppLanguage.sv: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/sv/messages`), - import('date-fns/locale/sv'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/sv/messages`).then(m => m.messages), + import('date-fns/locale/sv').then(m => m.sv), ]) break } case AppLanguage.th: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/th/messages`), - import('date-fns/locale/th'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/th/messages`).then(m => m.messages), + import('date-fns/locale/th').then(m => m.th), ]) break } case AppLanguage.tr: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/tr/messages`), - import('date-fns/locale/tr'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/tr/messages`).then(m => m.messages), + import('date-fns/locale/tr').then(m => m.tr), ]) break } case AppLanguage.uk: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/uk/messages`), - import('date-fns/locale/uk'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/uk/messages`).then(m => m.messages), + import('date-fns/locale/uk').then(m => m.uk), ]) break } case AppLanguage.vi: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/vi/messages`), - import('date-fns/locale/vi'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/vi/messages`).then(m => m.messages), + import('date-fns/locale/vi').then(m => m.vi), ]) break } case AppLanguage.zh_CN: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/zh-CN/messages`), - import('date-fns/locale/zh-CN'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/zh-CN/messages`).then(m => m.messages), + import('date-fns/locale/zh-CN').then(m => m.zhCN), ]) break } case AppLanguage.zh_HK: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/zh-HK/messages`), - import('date-fns/locale/zh-HK'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/zh-HK/messages`).then(m => m.messages), + import('date-fns/locale/zh-HK').then(m => m.zhHK), ]) break } case AppLanguage.zh_TW: { - ;[mod, {default: dateLocale}] = await Promise.all([ - import(`./locales/zh-TW/messages`), - import('date-fns/locale/zh-TW'), + ;[messages, dateLocale] = await Promise.all([ + import(`./locales/zh-TW/messages`).then(m => m.messages), + import('date-fns/locale/zh-TW').then(m => m.zhTW), ]) break } default: { - mod = await import(`./locales/en/messages`) + messages = await import(`./locales/en/messages`).then(m => m.messages) break } } - i18n.load(locale, mod.messages) + i18n.load(locale, messages) i18n.activate(locale) return dateLocale @@ -305,7 +306,7 @@ export function useLocaleLanguage() { const sanitizedLanguage = sanitizeAppLanguageSetting(appLanguage) document.documentElement.lang = sanitizedLanguage - dynamicActivate(sanitizedLanguage).then(locale => { + void dynamicActivate(sanitizedLanguage).then(locale => { setDateLocale(locale) }) }, [appLanguage]) diff --git a/src/logger/transports/console.ts b/src/logger/transports/console.ts index f43ddaaca8..d67031ac4a 100644 --- a/src/logger/transports/console.ts +++ b/src/logger/transports/console.ts @@ -1,4 +1,4 @@ -import format from 'date-fns/format' +import {format} from 'date-fns/format' import {LogLevel, type Transport} from '#/logger/types' import {prepareMetadata} from '#/logger/util' diff --git a/src/platform/polyfills.web.ts b/src/platform/polyfills.web.ts index 460ac8d04d..dce9b284cc 100644 --- a/src/platform/polyfills.web.ts +++ b/src/platform/polyfills.web.ts @@ -25,7 +25,8 @@ if (process.env.NODE_ENV !== 'production') { thrownErrors.add(err) throw err } else if (!thrownErrors.has(msgOrError)) { - return realConsoleError.apply(this, arguments as any) + // @ts-expect-error + return realConsoleError.apply(this, arguments) } } } From 0dfd7cfa12655ceddd7482e486af86ff5708b9d6 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Mon, 1 Jun 2026 17:26:50 -0500 Subject: [PATCH 012/149] Update mod SDK (#10682) --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index e156d7280e..8d4580c302 100644 --- a/package.json +++ b/package.json @@ -92,7 +92,7 @@ "icons:optimize": "svgo -f ./assets/icons" }, "dependencies": { - "@atproto/api": "0.20.6", + "@atproto/api": "0.20.8", "@atproto/syntax": "0.6.1", "@bitdrift/react-native": "^0.6.8", "@braintree/sanitize-url": "^6.0.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d0157ed61e..ff8a98cd78 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -242,8 +242,8 @@ importers: .: dependencies: '@atproto/api': - specifier: 0.20.6 - version: 0.20.6 + specifier: 0.20.8 + version: 0.20.8 '@atproto/syntax': specifier: 0.6.1 version: 0.6.1 @@ -877,8 +877,8 @@ packages: graphql: optional: true - '@atproto/api@0.20.6': - resolution: {integrity: sha512-WnFPcUl+qZdXmt27+Tg93BDIvBt/WpXfLIiBzBTp3ms9aszM5hAsfc7G8KEsnsmnRvcm0xRfiKEjIt5FxTKdYg==} + '@atproto/api@0.20.8': + resolution: {integrity: sha512-rTkA6kOmA2axSrg6VgpdXpsCFWpofnHBOn6pKg69Ju5MpIHqk4haQMgjBcVh1G3kUxzwgSAr7SYrPS3dFe5Etg==} engines: {node: '>=22'} '@atproto/common-web@0.5.0': @@ -9492,7 +9492,7 @@ snapshots: '@0no-co/graphql.web@1.2.0': {} - '@atproto/api@0.20.6': + '@atproto/api@0.20.8': dependencies: '@atproto/common-web': 0.5.0 '@atproto/lexicon': 0.7.1 From 2abfba97710481599f72633f80d074e87e209cee Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Tue, 2 Jun 2026 01:36:34 +0300 Subject: [PATCH 013/149] Remove unused slider dep (#10618) --- package.json | 1 - pnpm-lock.yaml | 14 -------------- 2 files changed, 15 deletions(-) diff --git a/package.json b/package.json index 8d4580c302..e76f590e99 100644 --- a/package.json +++ b/package.json @@ -121,7 +121,6 @@ "@ipld/dag-cbor": "^9.2.7", "@lingui/core": "^5.9.2", "@lingui/react": "^5.9.2", - "@miblanchard/react-native-slider": "^2.6.0", "@mozzius/expo-dynamic-app-icon": "^1.8.0", "@react-native-async-storage/async-storage": "2.2.0", "@react-navigation/bottom-tabs": "^7.15.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ff8a98cd78..6d9210cc2d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -328,9 +328,6 @@ importers: '@lingui/react': specifier: ^5.9.2 version: 5.9.5(@lingui/babel-plugin-lingui-macro@5.9.5(typescript@6.0.3))(react@19.1.0) - '@miblanchard/react-native-slider': - specifier: ^2.6.0 - version: 2.6.0(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@mozzius/expo-dynamic-app-icon': specifier: ^1.8.0 version: 1.8.1(expo@54.0.34(@babel/core@7.29.0)(react-native-webview@13.15.0(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) @@ -2320,12 +2317,6 @@ packages: '@messageformat/parser@5.1.1': resolution: {integrity: sha512-3p0YRGCcTUCYvBKLIxtDDyrJ0YijGIwrTRu1DT8gIviIDZru8H23+FkY6MJBzM1n9n20CiM4VeDYuBsrrwnLjg==} - '@miblanchard/react-native-slider@2.6.0': - resolution: {integrity: sha512-o7hk/f/8vkqh6QNR5L52m+ws846fQeD/qNCC9CCSRdBqjq66KiCgbxzlhRzKM/gbtxcvMYMIEEJ1yes5cr6I3A==} - peerDependencies: - react: '>=16.8' - react-native: '>=0.59' - '@mozzius/expo-dynamic-app-icon@1.8.1': resolution: {integrity: sha512-JWNY9gw06s+q54b2SqWf6BEo7IYuJCtjJDtca+wTo6kP5dH/wYK85JdLrMbdy+cwOMScEY85uU6Mjn0wkWTLnw==} peerDependencies: @@ -11442,11 +11433,6 @@ snapshots: dependencies: moo: 0.5.3 - '@miblanchard/react-native-slider@2.6.0(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': - dependencies: - react: 19.1.0 - react-native: 0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) - '@mozzius/expo-dynamic-app-icon@1.8.1(expo@54.0.34(@babel/core@7.29.0)(react-native-webview@13.15.0(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': dependencies: '@expo/image-utils': 0.8.12 From 26e48e3876648d510de7cb55f62d7f591519e921 Mon Sep 17 00:00:00 2001 From: pfrazee <1270099+pfrazee@users.noreply.github.com> Date: Tue, 2 Jun 2026 03:22:13 +0000 Subject: [PATCH 014/149] Nightly source-language update --- src/locale/locales/en/messages.po | 97 ++++++++++++++++++------------- 1 file changed, 58 insertions(+), 39 deletions(-) diff --git a/src/locale/locales/en/messages.po b/src/locale/locales/en/messages.po index 9cfc7b41b9..4de882a998 100644 --- a/src/locale/locales/en/messages.po +++ b/src/locale/locales/en/messages.po @@ -81,6 +81,11 @@ msgstr "" msgid "{0, plural, one {# month} other {# months}}" msgstr "" +#. placeholder {0}: convo.details.joinRequestCount +#: src/screens/Messages/components/ChatListItem.tsx:225 +msgid "{0, plural, one {# new join request} other {# new join requests}}" +msgstr "{0, plural, one {# new join request} other {# new join requests}}" + #. placeholder {0}: reactions.length #. placeholder {1}: groupedReactions.map(g => g.value).join(' ') #: src/components/dms/MessageItem.tsx:297 @@ -534,7 +539,7 @@ msgid "{following} following" msgstr "" #: src/components/dms/components/GroupChatProfileCard.tsx:56 -#: src/components/dms/InitiateChatFlow.tsx:856 +#: src/components/dms/InitiateChatFlow.tsx:888 msgid "{handle} can’t be added" msgstr "{handle} can’t be added" @@ -542,7 +547,7 @@ msgstr "{handle} can’t be added" msgid "{handle} can't be messaged" msgstr "" -#: src/components/dms/InitiateChatFlow.tsx:817 +#: src/components/dms/InitiateChatFlow.tsx:849 msgid "{handle} can’t be messaged" msgstr "{handle} can’t be messaged" @@ -628,7 +633,7 @@ msgstr "" msgid "{requestCount, plural, one {# request} other {# requests}}" msgstr "{requestCount, plural, one {# request} other {# requests}}" -#. Displayed when there are more than 50 requests to join a group chat +#. Displayed when there are more than 20 requests to join a group chat #: src/screens/Messages/ConversationSettings/MembersAndRequests.tsx:48 msgid "{requestCount}+ requests" msgstr "{requestCount}+ requests" @@ -753,6 +758,11 @@ msgstr "" msgid "⚠Invalid Handle" msgstr "" +#: src/screens/Messages/components/ChatListItem.tsx:220 +msgctxt "Displayed when there are more than 20 requests to join a group chat" +msgid "20+ new join requests" +msgstr "20+ new join requests" + #: src/components/dialogs/MutedWords.tsx:202 #: src/components/dialogs/MutedWords.tsx:551 #: src/components/dialogs/MutedWords.tsx:554 @@ -1766,9 +1776,9 @@ msgstr "" #: src/components/dms/AddMembersFlow.tsx:342 #: src/components/dms/AddMembersFlow.tsx:509 #: src/components/dms/AddMembersFlow.tsx:515 -#: src/components/dms/InitiateChatFlow.tsx:491 -#: src/components/dms/InitiateChatFlow.tsx:676 -#: src/components/dms/InitiateChatFlow.tsx:683 +#: src/components/dms/InitiateChatFlow.tsx:508 +#: src/components/dms/InitiateChatFlow.tsx:701 +#: src/components/dms/InitiateChatFlow.tsx:708 #: src/components/moderation/LabelsOnMeDialog.tsx:334 #: src/components/moderation/LabelsOnMeDialog.tsx:335 #: src/screens/Login/ChooseAccountForm.tsx:98 @@ -2244,9 +2254,9 @@ msgstr "" msgid "Cancel search" msgstr "" -#: src/components/PostControls/index.tsx:110 -#: src/components/PostControls/index.tsx:141 -#: src/components/PostControls/index.tsx:169 +#: src/components/PostControls/index.tsx:108 +#: src/components/PostControls/index.tsx:138 +#: src/components/PostControls/index.tsx:166 #: src/state/shell/composer/index.tsx:105 msgid "Cannot interact with a blocked user" msgstr "" @@ -2611,7 +2621,7 @@ msgstr "" #: src/components/dms/AfterReportDialog.tsx:207 #: src/components/dms/AfterReportDialog.tsx:212 #: src/components/dms/EmojiPopup.android.tsx:59 -#: src/components/dms/InitiateChatFlow.tsx:516 +#: src/components/dms/InitiateChatFlow.tsx:533 #: src/components/NewskieDialog.tsx:169 #: src/components/NewskieDialog.tsx:175 #: src/components/Post/Embed/VideoEmbed/GifPresentationControls.tsx:107 @@ -2906,7 +2916,7 @@ msgid "Continue thread..." msgstr "" #: src/components/dms/AddMembersFlow.tsx:307 -#: src/components/dms/InitiateChatFlow.tsx:443 +#: src/components/dms/InitiateChatFlow.tsx:460 msgid "Continue to group name" msgstr "Continue to group name" @@ -2922,7 +2932,7 @@ msgstr "" msgid "Conversation" msgstr "" -#: src/screens/Messages/components/ChatListItem.tsx:309 +#: src/screens/Messages/components/ChatListItem.tsx:324 msgid "Conversation deleted" msgstr "" @@ -3136,7 +3146,7 @@ msgstr "" #. Text on button to create a new starter pack #: src/components/dialogs/StarterPackDialog.tsx:113 #: src/components/dialogs/StarterPackDialog.tsx:210 -#: src/components/dms/InitiateChatFlow.tsx:452 +#: src/components/dms/InitiateChatFlow.tsx:469 #: src/components/StarterPack/ProfileStarterPacks.tsx:329 msgid "Create" msgstr "" @@ -3203,7 +3213,7 @@ msgstr "" msgid "Create another" msgstr "" -#: src/components/dms/InitiateChatFlow.tsx:451 +#: src/components/dms/InitiateChatFlow.tsx:468 msgid "Create group chat" msgstr "Create group chat" @@ -3436,7 +3446,7 @@ msgid "Deleted" msgstr "" #: src/components/dms/MessagesListHeader.tsx:109 -#: src/screens/Messages/components/ChatListItem.tsx:132 +#: src/screens/Messages/components/ChatListItem.tsx:133 #: src/screens/Messages/ConversationSettings/Member.tsx:75 msgid "Deleted Account" msgstr "" @@ -5268,7 +5278,7 @@ msgid "Go to account settings" msgstr "" #. placeholder {0}: profile.handle -#: src/screens/Messages/components/ChatListItem.tsx:153 +#: src/screens/Messages/components/ChatListItem.tsx:154 msgid "Go to conversation with {0}" msgstr "" @@ -5288,7 +5298,7 @@ msgstr "" msgid "Go to profile" msgstr "" -#: src/screens/Messages/components/ChatListItem.tsx:211 +#: src/screens/Messages/components/ChatListItem.tsx:212 msgid "Go to the group chat named \"{chatName}\"" msgstr "Go to the group chat named \"{chatName}\"" @@ -5371,8 +5381,8 @@ msgstr "Group chats are now available" msgid "Group is locked" msgstr "Group is locked" -#: src/components/dms/InitiateChatFlow.tsx:231 -#: src/components/dms/InitiateChatFlow.tsx:551 +#: src/components/dms/InitiateChatFlow.tsx:237 +#: src/components/dms/InitiateChatFlow.tsx:568 #: src/screens/Messages/ConversationSettings/prompts.tsx:33 msgid "Group name" msgstr "Group name" @@ -6316,7 +6326,7 @@ msgstr "" #. Accessibility label for the like button when the post has not been liked, verb form followed by number of likes and noun form #. placeholder {0}: post.likeCount || 0 -#: src/components/PostControls/index.tsx:287 +#: src/components/PostControls/index.tsx:284 msgid "Like ({0, plural, one {# like} other {# likes}})" msgstr "" @@ -6746,7 +6756,7 @@ msgstr "" msgid "Message {displayName}" msgstr "Message {displayName}" -#: src/screens/Messages/components/ChatListItem.tsx:310 +#: src/screens/Messages/components/ChatListItem.tsx:325 msgid "Message deleted" msgstr "" @@ -7147,19 +7157,19 @@ msgstr "" msgid "New followers" msgstr "" -#: src/components/dms/InitiateChatFlow.tsx:230 +#: src/components/dms/InitiateChatFlow.tsx:236 msgid "New group chat" msgstr "New group chat" #. Button used to create a new group chat. #. Button used to create a new group chat. -#: src/components/dms/InitiateChatFlow.tsx:712 -#: src/components/dms/InitiateChatFlow.tsx:745 +#: src/components/dms/InitiateChatFlow.tsx:743 +#: src/components/dms/InitiateChatFlow.tsx:777 msgctxt "action" msgid "New group chat" msgstr "New group chat" -#: src/components/dms/InitiateChatFlow.tsx:267 +#: src/components/dms/InitiateChatFlow.tsx:273 msgid "New group chat with:" msgstr "New group chat with:" @@ -7226,7 +7236,7 @@ msgstr "" #: src/components/contacts/screens/ViewMatches.tsx:395 #: src/components/contacts/screens/ViewMatches.tsx:410 #: src/components/dms/AddMembersFlow.tsx:308 -#: src/components/dms/InitiateChatFlow.tsx:444 +#: src/components/dms/InitiateChatFlow.tsx:461 #: src/screens/Login/ForgotPasswordForm.tsx:149 #: src/screens/Login/ForgotPasswordForm.tsx:156 #: src/screens/Login/SetNewPasswordForm.tsx:186 @@ -7325,7 +7335,7 @@ msgstr "" msgid "No media yet" msgstr "" -#: src/screens/Messages/components/ChatListItem.tsx:296 +#: src/screens/Messages/components/ChatListItem.tsx:311 msgid "No messages yet" msgstr "" @@ -7399,7 +7409,7 @@ msgstr "" #: src/components/dialogs/SearchablePeopleList.tsx:250 #: src/components/dms/AddMembersFlow.tsx:240 -#: src/components/dms/InitiateChatFlow.tsx:340 +#: src/components/dms/InitiateChatFlow.tsx:346 #: src/components/ProgressGuide/FollowDialog.tsx:221 msgid "No results" msgstr "" @@ -7569,6 +7579,7 @@ msgstr "" #: src/components/BotAccountAlert.tsx:52 #: src/components/BotAccountAlert.tsx:57 +#: src/components/dms/InitiateChatFlow.tsx:676 #: src/components/dms/MessageItem.tsx:659 #: src/screens/Login/PasswordUpdatedForm.tsx:37 #: src/screens/PostThread/components/ThreadItemAnchor.tsx:661 @@ -7670,8 +7681,8 @@ msgstr "" msgid "Open chat member options for {displayName}" msgstr "Open chat member options for {displayName}" -#: src/screens/Messages/components/ChatListItem.tsx:471 -#: src/screens/Messages/components/ChatListItem.tsx:475 +#: src/screens/Messages/components/ChatListItem.tsx:486 +#: src/screens/Messages/components/ChatListItem.tsx:490 msgid "Open conversation options" msgstr "" @@ -9043,7 +9054,7 @@ msgstr "" #. Accessibility label for the reply button, verb form followed by number of replies and noun form #. placeholder {0}: post.replyCount || 0 -#: src/components/PostControls/index.tsx:243 +#: src/components/PostControls/index.tsx:240 msgid "Reply ({0, plural, one {# reply} other {# replies}})" msgstr "" @@ -9748,7 +9759,7 @@ msgstr "" msgid "Select GIF \"{0}\"" msgstr "" -#: src/components/dms/InitiateChatFlow.tsx:651 +#: src/components/dms/InitiateChatFlow.tsx:668 msgid "Select group chat members" msgstr "Select group chat members" @@ -10502,12 +10513,12 @@ msgstr "" msgid "Start adding people!" msgstr "" -#: src/components/dms/InitiateChatFlow.tsx:652 +#: src/components/dms/InitiateChatFlow.tsx:669 msgid "Start chat" msgstr "Start chat" #: src/components/dialogs/SearchablePeopleList.tsx:428 -#: src/components/dms/InitiateChatFlow.tsx:785 +#: src/components/dms/InitiateChatFlow.tsx:817 msgid "Start chat with {displayName}" msgstr "" @@ -10661,7 +10672,7 @@ msgid "Successfully verified" msgstr "" #: src/components/dms/AddMembersFlow.tsx:226 -#: src/components/dms/InitiateChatFlow.tsx:319 +#: src/components/dms/InitiateChatFlow.tsx:325 msgid "Suggested" msgstr "Suggested" @@ -11191,7 +11202,7 @@ msgstr "" msgid "This chat has ended" msgstr "This chat has ended" -#: src/screens/Messages/components/ChatListItem.tsx:360 +#: src/screens/Messages/components/ChatListItem.tsx:375 #: src/screens/Messages/components/ChatLocked.tsx:61 msgid "This chat is locked" msgstr "This chat is locked" @@ -11230,7 +11241,7 @@ msgstr "" msgid "This content is not viewable without a Bluesky account." msgstr "" -#: src/screens/Messages/components/ChatListItem.tsx:154 +#: src/screens/Messages/components/ChatListItem.tsx:155 msgid "This conversation is with a deleted or a deactivated account. Press for options" msgstr "" @@ -11830,7 +11841,7 @@ msgstr "" #. Accessibility label for the like button when the post has been liked, verb followed by number of likes and noun #. placeholder {0}: post.likeCount || 0 -#: src/components/PostControls/index.tsx:279 +#: src/components/PostControls/index.tsx:276 msgid "Unlike ({0, plural, one {# like} other {# likes}})" msgstr "" @@ -12700,7 +12711,7 @@ msgid "We're having network issues, try again" msgstr "" #: src/components/dms/AddMembersFlow.tsx:175 -#: src/components/dms/InitiateChatFlow.tsx:256 +#: src/components/dms/InitiateChatFlow.tsx:262 msgid "We’re having network issues, try again" msgstr "We’re having network issues, try again" @@ -13423,6 +13434,14 @@ msgstr "" msgid "Your account is not yet old enough to upload videos. Please try again later." msgstr "" +#: src/components/dms/InitiateChatFlow.tsx:674 +msgid "Your account is too new" +msgstr "Your account is too new" + +#: src/components/dms/InitiateChatFlow.tsx:675 +msgid "Your account must be at least 7 days old to create a new group chat." +msgstr "Your account must be at least 7 days old to create a new group chat." + #: src/screens/Settings/components/ExportCarDialog.tsx:107 msgid "Your account repository, containing all public data records, can be downloaded as a \"CAR\" file. This file does not include media embeds, such as images, or your private data, which must be fetched separately." msgstr "" From 771fd5ddf614fb0234286ea1eb745814929e2d25 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Tue, 2 Jun 2026 13:23:51 +0300 Subject: [PATCH 015/149] [Chat] Tweak styles in invite link dialog (#10638) --- src/components/forms/Toggle/index.tsx | 10 +- .../Messages/components/EditTextButton.tsx | 5 +- .../Messages/components/InviteLinkDialog.tsx | 169 ++++++++++-------- 3 files changed, 106 insertions(+), 78 deletions(-) diff --git a/src/components/forms/Toggle/index.tsx b/src/components/forms/Toggle/index.tsx index e22ede36ec..a62a82b62f 100644 --- a/src/components/forms/Toggle/index.tsx +++ b/src/components/forms/Toggle/index.tsx @@ -212,9 +212,12 @@ export function Item({ ) const highlightStyle = highlightRow - ? selected - ? [a.rounded_full, a.p_md, {backgroundColor: t.palette.primary_50}] - : [a.rounded_full, a.p_md] + ? [ + a.rounded_full, + a.p_md, + hovered && t.atoms.bg_contrast_25, + selected && {backgroundColor: t.palette.primary_50}, + ] : null return ( @@ -588,6 +591,7 @@ export function RadioWithLabel({ style={[ a.font_medium, a.flex_1, + a.text_md, a.leading_tight, selected ? t.atoms.text : t.atoms.text_contrast_high, ]}> diff --git a/src/screens/Messages/components/EditTextButton.tsx b/src/screens/Messages/components/EditTextButton.tsx index 8a1ccc620a..d578e39e5f 100644 --- a/src/screens/Messages/components/EditTextButton.tsx +++ b/src/screens/Messages/components/EditTextButton.tsx @@ -35,13 +35,14 @@ export function EditTextButton({ a.flex_row, a.align_center, a.justify_between, - a.px_md, + a.pl_lg, + a.pr_sm, a.py_sm, + a.gap_sm, ]}> {typeof children === 'function' ? children(context) : children} { + const joinLinkRuleKey = joinLink ? joinLinkToKey(joinLink) : null + const [prevKey, setPrevKey] = useState(joinLinkRuleKey) + if (joinLinkRuleKey !== prevKey) { setStep(joinLinkRuleKey ? Step.MANAGE : Step.INFO) - setWhoCanJoin([joinLinkRuleKey ?? 'anyone']) - }, [joinLinkRuleKey]) + setWhoCanJoin(joinLinkRuleKey ?? 'anyone') + setPrevKey(joinLinkRuleKey) + } const {openComposer} = useOpenComposer() @@ -163,22 +163,32 @@ export function InviteLinkDialog({ let content: React.ReactNode = null let header: string | null = null switch (step) { - case Step.INFO: + case Step.INFO: { header = l`Invite link` content = ( <> - - + + An invite link lets people join this group chat without being - added directly. You control who can use the link and whether - they need your approval. You can disable the link at any time. + added directly. You control who can join the chat. You can + disable the link at any time. - + - Your name, avatar, and the name of the group chat will be - visible to everyone. + Group chats can only have a maximum of{' '} + {plural(convo.details.memberLimit, { + one: '# person', + other: '# people', + })} + . + + + + + Your name, avatar, the name of the group chat, and the number of + members will be visible to everyone. @@ -199,15 +209,16 @@ export function InviteLinkDialog({ ) break - case Step.GENERATE: - header = - joinLink && enabledStatus === 'enabled' - ? l`Update invite link` - : l`Generate invite link` + } + case Step.GENERATE: { + const linkEnabled = joinLink?.enabledStatus === 'enabled' + const linkHasChanged = linkEnabled && joinLinkRuleKey !== whoCanJoin + + header = linkEnabled ? l`Update invite link` : l`Generate invite link` content = ( <> - + Choose who can join this group chat and how. @@ -215,9 +226,9 @@ export function InviteLinkDialog({ - + values={[whoCanJoin]} + onChange={([value]) => setWhoCanJoin(value)}> + {whoCanJoinOptions.map(option => ( ) break + } case Step.MANAGE: { + const linkEnabled = joinLink?.enabledStatus === 'enabled' + const linkDisabled = joinLink?.enabledStatus === 'disabled' const joinLinkURI = joinLink?.code ? `https://bsky.app/chat/${joinLink.code}` : 'https://bsky.app/chat' const createdAt = joinLink ? new Date(joinLink.createdAt) : null - const currentOptionName = joinLink - ? `${joinLink.joinRule}${joinLink.requireApproval ? ':requireApproval' : ''}` - : whoCanJoinOptions[0].name - const currentOption = whoCanJoinOptions.find( - o => o.name === currentOptionName, - ) + const currentOption = + whoCanJoinOptions.find( + o => o.name === (joinLink ? joinLinkToKey(joinLink) : null), + ) ?? whoCanJoinOptions[0] const ownerValue = currentOption?.owner ?? whoCanJoinOptions[0].owner const memberValue = currentOption?.member ?? whoCanJoinOptions[0].member - header = - enabledStatus === 'enabled' ? l`Invite link` : l`Invite link disabled` + header = linkEnabled ? l`Invite link` : l`Invite link disabled` content = ( <> {joinLinkURI} @@ -319,25 +336,25 @@ export function InviteLinkDialog({ ) : null} - {enabledStatus === 'enabled' ? ( + {linkEnabled ? ( {isOwner ? ( setStep(Step.GENERATE)}> - - + + {ownerValue} ) : ( - {memberValue} + {memberValue} )} ) : null} - {enabledStatus === 'enabled' ? ( + {linkEnabled ? ( {isOwner ? ( ) : null} Post link @@ -425,14 +442,7 @@ export function InviteLinkDialog({ ]}> Disable this invite link? - + Anyone who has it will no longer be able to join or request to join. You can always create a new one. @@ -465,6 +475,7 @@ export function InviteLinkDialog({ ) break + } } if (!isOwner && (!joinLink || joinLink.enabledStatus === 'disabled')) { @@ -472,7 +483,7 @@ export function InviteLinkDialog({ content = ( <> - + There is no invite link for this group chat. @@ -503,9 +514,7 @@ export function InviteLinkDialog({ header={ - - {header} - + {header} @@ -517,3 +526,17 @@ export function InviteLinkDialog({ ) } + +function joinLinkToKey(joinLink: ChatBskyGroupDefs.JoinLinkView): string { + return `${joinLink.joinRule}${joinLink.requireApproval ? ':requireApproval' : ''}` +} + +function keyToJoinLink( + key: string, +): Pick { + const [joinRule, requireApproval] = key.split(':') + return { + joinRule, + requireApproval: requireApproval === 'requireApproval', + } +} From cbf8e95bdb4b92c1ef0e69b5b9098fe47d309001 Mon Sep 17 00:00:00 2001 From: Naresh Rawat Date: Tue, 2 Jun 2026 17:10:37 +0545 Subject: [PATCH 016/149] Message sent time is not updated immediately in ChatList screen (#7768) --- src/view/com/util/TimeElapsed.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/view/com/util/TimeElapsed.tsx b/src/view/com/util/TimeElapsed.tsx index c28e9cd90f..c6efd96f57 100644 --- a/src/view/com/util/TimeElapsed.tsx +++ b/src/view/com/util/TimeElapsed.tsx @@ -22,8 +22,11 @@ export function TimeElapsed({ ) const [prevTick, setPrevTick] = useState(tick) - if (prevTick !== tick) { + const [prevTimestamp, setPrevTimestamp] = useState(timestamp) + + if (prevTick !== tick || prevTimestamp !== timestamp) { setPrevTick(tick) + setPrevTimestamp(timestamp) setTimeAgo( timeToString ? timeToString(i18n, timestamp) : ago(timestamp, tick), ) From fd9f988b905326c1bf81c3ed1c03f6bf549f32ff Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Tue, 2 Jun 2026 17:06:47 +0300 Subject: [PATCH 017/149] Ungate video upload size change (#10683) --- src/analytics/features/types.ts | 1 - src/lib/constants.ts | 4 +-- src/lib/media/video/compress.ts | 1 - src/lib/media/video/compress.web.ts | 12 +++------ src/view/com/composer/Composer.tsx | 10 ++----- src/view/com/composer/SelectMediaButton.tsx | 8 ++++-- src/view/com/composer/state/video.ts | 29 +++++---------------- 7 files changed, 20 insertions(+), 45 deletions(-) diff --git a/src/analytics/features/types.ts b/src/analytics/features/types.ts index bd48bd5851..39df48e532 100644 --- a/src/analytics/features/types.ts +++ b/src/analytics/features/types.ts @@ -16,7 +16,6 @@ export enum Features { DmsNewMessageComposerEnable = 'dms:new_message_composer:enable', ComposerLanguageDetectionEnable = 'composer:language_detection:enable', PostGalleryEmbedEnable = 'post_gallery_embed:enable', - LargeVideoUploads = 'large_video_uploads:enable', AATest = 'aa-test', } diff --git a/src/lib/constants.ts b/src/lib/constants.ts index 59d82e94f9..95eb57fd54 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -188,8 +188,8 @@ export const VIDEO_MAX_DURATION_MS = 3 * 60 * 1000 // 3 minutes in milliseconds * Maximum size of a video in megabytes, _not_ mebibytes. Backend uses * ISO megabytes. */ -export const VIDEO_MAX_SIZE_REDUCED = 1000 * 1000 * 100 // 100mb -export const VIDEO_MAX_SIZE = 3000 * 1000 * 100 // 300mb +export const VIDEO_MAX_SIZE_MB = 300 +export const VIDEO_MAX_SIZE = VIDEO_MAX_SIZE_MB * 1000 * 1000 // 300mb export const SUPPORTED_MIME_TYPES = [ 'video/mp4', diff --git a/src/lib/media/video/compress.ts b/src/lib/media/video/compress.ts index 60eda2dcee..1d00bfcea1 100644 --- a/src/lib/media/video/compress.ts +++ b/src/lib/media/video/compress.ts @@ -12,7 +12,6 @@ export async function compressVideo( opts?: { signal?: AbortSignal onProgress?: (progress: number) => void - TEMP_enableLargeVideoUploads?: boolean }, ): Promise { const {onProgress, signal} = opts || {} diff --git a/src/lib/media/video/compress.web.ts b/src/lib/media/video/compress.web.ts index 63921fe8e7..83fdfde533 100644 --- a/src/lib/media/video/compress.web.ts +++ b/src/lib/media/video/compress.web.ts @@ -1,28 +1,22 @@ import {type ImagePickerAsset} from 'expo-image-picker' -import {VIDEO_MAX_SIZE, VIDEO_MAX_SIZE_REDUCED} from '#/lib/constants' +import {VIDEO_MAX_SIZE} from '#/lib/constants' import {VideoTooLargeError} from '#/lib/media/video/errors' import {type CompressedVideo} from './types' // doesn't actually compress, converts to ArrayBuffer export async function compressVideo( asset: ImagePickerAsset, - opts?: { + _opts?: { signal?: AbortSignal onProgress?: (progress: number) => void - TEMP_enableLargeVideoUploads?: number }, ): Promise { const {mimeType, base64} = parseDataUrl(asset.uri) const blob = base64ToBlob(base64, mimeType) const uri = URL.createObjectURL(blob) - if ( - blob.size > - (opts?.TEMP_enableLargeVideoUploads - ? VIDEO_MAX_SIZE - : VIDEO_MAX_SIZE_REDUCED) - ) { + if (blob.size > VIDEO_MAX_SIZE) { throw new VideoTooLargeError() } diff --git a/src/view/com/composer/Composer.tsx b/src/view/com/composer/Composer.tsx index 033341f2c2..7299abcb1b 100644 --- a/src/view/com/composer/Composer.tsx +++ b/src/view/com/composer/Composer.tsx @@ -222,10 +222,6 @@ export const ComposePost = ({ const [publishingStage, setPublishingStage] = useState('') const [error, setError] = useState('') - const enableLargeVideoUploads = ax.features.enabled( - ax.features.LargeVideoUploads, - ) - /** * Track when a draft was created so we can measure draft age in metrics. * Set when a draft is loaded via handleSelectDraft. @@ -348,10 +344,9 @@ export const ComposePost = ({ currentDid, abortController.signal, i18n, - enableLargeVideoUploads, ) }, - [i18n, agent, currentDid, composerDispatch, enableLargeVideoUploads], + [i18n, agent, currentDid, composerDispatch], ) const onInitVideo = useNonReactiveCallback(() => { @@ -496,7 +491,6 @@ export const ComposePost = ({ currentDid, abortController.signal, i18n, - enableLargeVideoUploads, ) } catch (e) { logger.error('Failed to restore video from draft', { @@ -505,7 +499,7 @@ export const ComposePost = ({ }) } }, - [i18n, agent, currentDid, composerDispatch, enableLargeVideoUploads], + [i18n, agent, currentDid, composerDispatch], ) const handleSelectDraft = useCallback( diff --git a/src/view/com/composer/SelectMediaButton.tsx b/src/view/com/composer/SelectMediaButton.tsx index 8f44cfc3e7..2d70195488 100644 --- a/src/view/com/composer/SelectMediaButton.tsx +++ b/src/view/com/composer/SelectMediaButton.tsx @@ -5,7 +5,11 @@ import {type ImagePickerAsset} from 'expo-image-picker' import {msg, plural} from '@lingui/core/macro' import {useLingui} from '@lingui/react' -import {VIDEO_MAX_DURATION_MS, VIDEO_MAX_SIZE} from '#/lib/constants' +import { + VIDEO_MAX_DURATION_MS, + VIDEO_MAX_SIZE, + VIDEO_MAX_SIZE_MB, +} from '#/lib/constants' import { usePhotoLibraryPermission, useVideoLibraryPermission, @@ -431,7 +435,7 @@ export function SelectMediaButton({ msg`You can only select one GIF at a time.`, ), [SelectedAssetError.FileTooBig]: _( - msg`One or more of your selected files are too large. Maximum size is 100 MB.`, + msg`One or more of your selected files are too large. Maximum size is ${VIDEO_MAX_SIZE_MB} MB.`, ), }[error] }) diff --git a/src/view/com/composer/state/video.ts b/src/view/com/composer/state/video.ts index b99d0a1e9d..6d73e846e6 100644 --- a/src/view/com/composer/state/video.ts +++ b/src/view/com/composer/state/video.ts @@ -4,6 +4,7 @@ import {type I18n} from '@lingui/core' import {msg} from '@lingui/core/macro' import {AbortError} from '#/lib/async/cancelable' +import {VIDEO_MAX_SIZE_MB} from '#/lib/constants' import {compressVideo} from '#/lib/media/video/compress' import { ServerError, @@ -264,7 +265,6 @@ export async function processVideo( did: string, signal: AbortSignal, i18n: I18n, - TEMP_enableLargeVideoUploads: boolean, ) { let video: CompressedVideo | undefined try { @@ -273,14 +273,9 @@ export async function processVideo( dispatch({type: 'update_progress', progress: trunc2dp(num), signal}) }, signal, - TEMP_enableLargeVideoUploads, }) } catch (e) { - const message = getCompressErrorMessage( - e, - i18n, - TEMP_enableLargeVideoUploads, - ) + const message = getCompressErrorMessage(e, i18n) if (message !== null) { dispatch({ type: 'to_error', @@ -309,7 +304,7 @@ export async function processVideo( }, }) } catch (e) { - const message = getUploadErrorMessage(e, i18n, TEMP_enableLargeVideoUploads) + const message = getUploadErrorMessage(e, i18n) if (message !== null) { dispatch({ type: 'to_error', @@ -393,30 +388,20 @@ export async function processVideo( } } -function getCompressErrorMessage( - e: unknown, - i18n: I18n, - TEMP_enableLargeVideoUploads: boolean, -): string | null { - const videoSize = TEMP_enableLargeVideoUploads ? 300 : 100 +function getCompressErrorMessage(e: unknown, i18n: I18n): string | null { if (e instanceof AbortError) { return null } if (e instanceof VideoTooLargeError) { return i18n._( - msg`The selected video is larger than ${videoSize} MB. Please try again with a smaller file.`, + msg`The selected video is larger than ${VIDEO_MAX_SIZE_MB} MB. Please try again with a smaller file.`, ) } logger.error('Error compressing video', {safeMessage: e}) return i18n._(msg`An error occurred while compressing the video.`) } -function getUploadErrorMessage( - e: unknown, - i18n: I18n, - TEMP_enableLargeVideoUploads: boolean, -): string | null { - const videoSize = TEMP_enableLargeVideoUploads ? 300 : 100 +function getUploadErrorMessage(e: unknown, i18n: I18n): string | null { if (e instanceof AbortError) { return null } @@ -448,7 +433,7 @@ function getUploadErrorMessage( case 'file size (100000001 bytes) is larger than the maximum allowed size (100000000 bytes)': case 'file size (300000001 bytes) is larger than the maximum allowed size (300000000 bytes)': return i18n._( - msg`The selected video is larger than ${videoSize} MB. Please try again with a smaller file.`, + msg`The selected video is larger than ${VIDEO_MAX_SIZE_MB} MB. Please try again with a smaller file.`, ) case 'Confirm your email address to upload videos': return i18n._(msg`Please confirm your email address to upload videos.`) From 2b31047b0daa6f2ae2feac508d31f4a196d53460 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Tue, 2 Jun 2026 19:41:48 +0300 Subject: [PATCH 018/149] Fix scrollbar behaviour in splitview (#10685) --- src/view/com/util/List.web.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/view/com/util/List.web.tsx b/src/view/com/util/List.web.tsx index eaea3c47a9..787ca9e278 100644 --- a/src/view/com/util/List.web.tsx +++ b/src/view/com/util/List.web.tsx @@ -345,7 +345,7 @@ function ListImpl( style, disableFullWindowScroll && { flex: 1, - overflowY: 'scroll', + overflowY: isWithinSplitView ? 'auto' : 'scroll', }, ]} ref={nativeRef as unknown as React.RefObject}> From bdbf31a254208b747d58f2327aae65e4afd9799b Mon Sep 17 00:00:00 2001 From: DS Boyce <260543580+ds-boyce@users.noreply.github.com> Date: Tue, 2 Jun 2026 09:47:22 -0700 Subject: [PATCH 019/149] Use expo/expo-github-action v9 (#10689) --- .github/workflows/build-submit-android.yml | 2 +- .github/workflows/build-submit-ios.yml | 2 +- .github/workflows/bundle-deploy-eas-update.yml | 6 +++--- .github/workflows/pull-request-comment.yml | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-submit-android.yml b/.github/workflows/build-submit-android.yml index 2748f783ba..719b2e836e 100644 --- a/.github/workflows/build-submit-android.yml +++ b/.github/workflows/build-submit-android.yml @@ -47,7 +47,7 @@ jobs: run: pnpm install --frozen-lockfile - name: 🔨 Setup Expo CLI - uses: expo/expo-github-action@main + uses: expo/expo-github-action@v9 with: eas-version: '19.0.5' packager: 'pnpm --allow-build=dtrace-provider' diff --git a/.github/workflows/build-submit-ios.yml b/.github/workflows/build-submit-ios.yml index fd09b64577..151941f5e4 100644 --- a/.github/workflows/build-submit-ios.yml +++ b/.github/workflows/build-submit-ios.yml @@ -47,7 +47,7 @@ jobs: run: pnpm install --frozen-lockfile - name: 🔨 Setup Expo CLI - uses: expo/expo-github-action@main + uses: expo/expo-github-action@v9 with: eas-version: '19.0.5' packager: 'pnpm --allow-build=dtrace-provider' diff --git a/.github/workflows/bundle-deploy-eas-update.yml b/.github/workflows/bundle-deploy-eas-update.yml index f4be27b0de..22ea2d5cba 100644 --- a/.github/workflows/bundle-deploy-eas-update.yml +++ b/.github/workflows/bundle-deploy-eas-update.yml @@ -87,7 +87,7 @@ jobs: run: pnpm typecheck - name: 🔨 Setup EAS - uses: expo/expo-github-action@main + uses: expo/expo-github-action@v9 if: ${{ !steps.fingerprint.outputs.includes-changes }} with: eas-version: '19.0.5' @@ -180,7 +180,7 @@ jobs: cache: pnpm - name: 🔨 Setup EAS - uses: expo/expo-github-action@main + uses: expo/expo-github-action@v9 with: eas-version: '19.0.5' packager: 'pnpm --allow-build=dtrace-provider' @@ -327,7 +327,7 @@ jobs: cache: pnpm - name: 🔨 Setup EAS - uses: expo/expo-github-action@main + uses: expo/expo-github-action@v9 with: eas-version: '19.0.5' packager: 'pnpm --allow-build=dtrace-provider' diff --git a/.github/workflows/pull-request-comment.yml b/.github/workflows/pull-request-comment.yml index 3b70b754ca..c0d4e45da7 100644 --- a/.github/workflows/pull-request-comment.yml +++ b/.github/workflows/pull-request-comment.yml @@ -141,7 +141,7 @@ jobs: run: pnpm typecheck - name: 🔨 Setup EAS - uses: expo/expo-github-action@main + uses: expo/expo-github-action@v9 with: eas-version: '19.0.5' packager: 'pnpm --allow-build=dtrace-provider' From dfa82904ecf580febc7b781e95590766133f7eba Mon Sep 17 00:00:00 2001 From: DS Boyce <260543580+ds-boyce@users.noreply.github.com> Date: Tue, 2 Jun 2026 10:24:55 -0700 Subject: [PATCH 020/149] Run GitHub actions in parallel (#10509) Co-authored-by: Eric Bailey Co-authored-by: Claude Opus 4.8 (1M context) --- .github/workflows/lint.yml | 83 +++++++++++++++++++++++++++++++++----- package.json | 3 +- 2 files changed, 74 insertions(+), 12 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index d7715e8ea2..93729874b6 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -6,33 +6,42 @@ on: branches: - main concurrency: - group: "${{ github.workflow }}-${{ github.head_ref || github.ref }}" + group: '${{ github.workflow }}-${{ github.head_ref || github.ref }}' cancel-in-progress: true +# These jobs only check out the repo and run checks, so read access to the +# repo contents is all the GITHUB_TOKEN needs. +permissions: + contents: read + jobs: linting: name: Run linters runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + job: [lint, prettier] steps: - name: Check out Git repository uses: actions/checkout@v5 - - name: Verify Node version pins match .nvmrc + - name: Verify Node version pins match package.json run: | set -euo pipefail - expected=$(tr -d '[:space:]' < .nvmrc) + expected=$(node -p "require('./package.json').engines.node.replace(/[^0-9.]/g, '')") rc=0 check() { if [ "$2" != "$expected" ]; then - echo "::error file=$1::Node version mismatch: $1 pins '$2' but .nvmrc is '$expected'" + echo "::error file=$1::Node version mismatch: $1 pins '$2' but package.json is '$expected'" rc=1 fi } - # FROM node:X.Y.Z — service runtime images + # FROM node:X.Y.Z - service runtime images for f in Dockerfile.bskylink Dockerfile.bskyogcard; do v=$(grep -oE 'FROM node:[0-9]+\.[0-9]+\.[0-9]+' "$f" | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | sort -u) check "$f" "$v" done - # ENV NODE_VERSION=X.Y.Z — Go images that nvm-install Node for the JS build stage + # ENV NODE_VERSION=X.Y.Z - Go images that nvm-install Node for the JS build stage for f in Dockerfile.embedr; do v=$(grep -oE 'NODE_VERSION=[0-9]+\.[0-9]+\.[0-9]+' "$f" | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | sort -u) check "$f" "$v" @@ -53,10 +62,42 @@ jobs: command: pnpm install --frozen-lockfile attempt_limit: 3 attempt_delay: 2000 - - name: Lint check - run: pnpm lint - - name: Prettier check - run: pnpm prettier --check . + - name: Lint checks + run: pnpm ${{ matrix.job }} + # Aggregates the matrix results into a single stable check name so branch + # protection can require "Run linters" regardless of how many matrix jobs run. + # The result is asserted in `run` (not `if`) so a malformed expression can + # never silently skip the check and report a false pass. + linting-summary: + name: Run linters + if: always() + needs: [linting] + runs-on: ubuntu-latest + steps: + - name: Require linting to have succeeded + env: + RESULT: ${{ needs.linting.result }} + run: | + echo "linting result: $RESULT" + test "$RESULT" = "success" + typechecking: + name: Run typecheck + runs-on: ubuntu-latest + steps: + - name: Check out Git repository + uses: actions/checkout@v5 + - uses: pnpm/action-setup@v6 + - name: Install node + uses: actions/setup-node@v6 + with: + node-version-file: package.json + cache: pnpm + - name: pnpm install + uses: Wandalen/wretry.action@master + with: + command: pnpm install --frozen-lockfile + attempt_limit: 3 + attempt_delay: 2000 - name: Check & compile i18n run: pnpm intl:build - name: Type check @@ -64,6 +105,10 @@ jobs: testing: name: Run tests runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + shard: [1, 2, 3, 4] steps: - name: Check out Git repository uses: actions/checkout@v5 @@ -83,4 +128,20 @@ jobs: run: pnpm intl:build - name: Run tests run: | - NODE_ENV=test pnpm test --forceExit + NODE_ENV=test pnpm test --forceExit --shard=${{ matrix.shard }}/${{ strategy.job-total }} + # Aggregates the sharded test results into a single stable check name so branch + # protection can require "Run tests" regardless of how many shards run. + # The result is asserted in `run` (not `if`) so a malformed expression can + # never silently skip the check and report a false pass. + testing-summary: + name: Run tests + if: always() + needs: [testing] + runs-on: ubuntu-latest + steps: + - name: Require testing to have succeeded + env: + RESULT: ${{ needs.testing.result }} + run: | + echo "testing result: $RESULT" + test "$RESULT" = "success" diff --git a/package.json b/package.json index e76f590e99..0716bd085b 100644 --- a/package.json +++ b/package.json @@ -89,7 +89,8 @@ "make-deploy-bundle": "bash scripts/bundleUpdate.sh", "generate-webpack-stats-file": "EXPO_PUBLIC_GENERATE_STATS=1 pnpm build-web", "open-analyzer": "EXPO_PUBLIC_OPEN_ANALYZER=1 pnpm build-web", - "icons:optimize": "svgo -f ./assets/icons" + "icons:optimize": "svgo -f ./assets/icons", + "prettier": "prettier --check ." }, "dependencies": { "@atproto/api": "0.20.8", From 59765138ce0969411d2951ca2d22ffadf1ec21b1 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Tue, 2 Jun 2026 12:29:24 -0500 Subject: [PATCH 021/149] [ALG-96] Don't fall back to search for onboarding user suggestions (#10680) --- .../StepSuggestedAccounts/index.tsx | 26 +++---------------- 1 file changed, 4 insertions(+), 22 deletions(-) diff --git a/src/screens/Onboarding/StepSuggestedAccounts/index.tsx b/src/screens/Onboarding/StepSuggestedAccounts/index.tsx index eaa68d9254..a9cc64396a 100644 --- a/src/screens/Onboarding/StepSuggestedAccounts/index.tsx +++ b/src/screens/Onboarding/StepSuggestedAccounts/index.tsx @@ -1,18 +1,16 @@ -import {useCallback, useEffect, useMemo, useRef, useState} from 'react' +import {useCallback, useEffect, useRef, useState} from 'react' import {View} from 'react-native' import {type ModerationOpts} from '@atproto/api' import {msg} from '@lingui/core/macro' import {useLingui} from '@lingui/react' import {Trans} from '@lingui/react/macro' import {useMutation, useQueryClient} from '@tanstack/react-query' -import * as bcp47Match from 'bcp-47-match' import {wait} from '#/lib/async/wait' import {popularInterests, useInterestsDisplayNames} from '#/lib/interests' import {isBlockedOrBlocking, isMuted} from '#/lib/moderation/blocked-and-muted' import {logger} from '#/logger' import {updateProfileShadow} from '#/state/cache/profile-shadow' -import {useLanguagePrefs} from '#/state/preferences' import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useAgent, useSession} from '#/state/session' import { @@ -53,19 +51,6 @@ export function StepSuggestedAccounts() { // so we can enable/disable the button without having to dig through the shadow cache const [followedUsers, setFollowedUsers] = useState([]) - /* - * Special language handling copied wholesale from the Explore screen - */ - const {contentLanguages} = useLanguagePrefs() - const useFullExperience = useMemo(() => { - if (contentLanguages.length === 0) return true - return bcp47Match.basicFilter('en', contentLanguages).length > 0 - }, [contentLanguages]) - const interestsDisplayNames = useInterestsDisplayNames() - const interests = Object.keys(interestsDisplayNames) - .sort(boostInterests(popularInterests)) - .sort(boostInterests(state.interestsStepResults.selectedInterests)) - const { data: suggestedUsers, isLoading, @@ -73,8 +58,8 @@ export function StepSuggestedAccounts() { isRefetching, refetch, } = useSuggestedOnboardingUsers({ - category: selectedInterest || (useFullExperience ? null : interests[0]), - search: !useFullExperience, + category: selectedInterest, + search: false, overrideInterests: state.interestsStepResults.selectedInterests, }) @@ -105,7 +90,6 @@ export function StepSuggestedAccounts() { ax.metric('suggestedUser:follow', { logContext: 'Onboarding', location: 'FollowAll', - recSource: !useFullExperience ? 'Search' : undefined, recId: suggestedUsers?.recId, position: i, suggestedDid: did, @@ -156,7 +140,6 @@ export function StepSuggestedAccounts() { seenProfilesRef.current.add(did) ax.metric('suggestedUser:seen', { logContext: 'Onboarding', - recSource: !useFullExperience ? 'Search' : undefined, recId: suggestedUsers?.recId, position, suggestedDid: did, @@ -164,7 +147,7 @@ export function StepSuggestedAccounts() { }) } }, - [ax, selectedInterest, suggestedUsers?.recId, useFullExperience], + [ax, selectedInterest, suggestedUsers?.recId], ) useEffect(() => { @@ -250,7 +233,6 @@ export function StepSuggestedAccounts() { position={index} category={selectedInterest} onSeen={onProfileSeen} - recSource={!useFullExperience ? 'Search' : undefined} recId={suggestedUsers.recId} /> ))} From 61e10f7e0b90b516c6ec7c853aa2ad1b2ff632f9 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Tue, 2 Jun 2026 12:42:10 -0500 Subject: [PATCH 022/149] Remove image upload flags (#10687) --- src/analytics/features/types.ts | 2 -- src/lib/api/index.ts | 23 ++--------------------- src/state/gallery.ts | 14 +++----------- src/view/com/composer/Composer.tsx | 24 ++++++------------------ 4 files changed, 11 insertions(+), 52 deletions(-) diff --git a/src/analytics/features/types.ts b/src/analytics/features/types.ts index 39df48e532..c8a8cd72d9 100644 --- a/src/analytics/features/types.ts +++ b/src/analytics/features/types.ts @@ -9,8 +9,6 @@ export enum Features { ImportContactsOnboardingDisable = 'import_contacts:onboarding:disable', ImportContactsSettingsDisable = 'import_contacts:settings:disable', LiveNowBetaDisable = 'live_now_beta:disable', - ImageUploadsHighResolution = 'image_uploads:high_resolution', - ImageUploadsBlobSize2mbEnabled = 'image_uploads:blob_size_2mb:enabled', GroupChatsEnable = 'group_chats:enable', GroupChatsHasBeenReleased = 'group_chats:has_been_released', DmsNewMessageComposerEnable = 'dms:new_message_composer:enable', diff --git a/src/lib/api/index.ts b/src/lib/api/index.ts index 1edc8c8016..d9a026ca83 100644 --- a/src/lib/api/index.ts +++ b/src/lib/api/index.ts @@ -51,16 +51,10 @@ interface PostOpts { langs?: string[] } -type FeatureFlags = { - highResolutionImages?: boolean - increasedBlobSizeLimit?: boolean -} - export async function post( agent: BskyAgent, queryClient: QueryClient, opts: PostOpts, - featureFlags?: FeatureFlags, ) { const thread = opts.thread opts.onStateChange?.(t`Processing...`) @@ -97,7 +91,6 @@ export async function post( queryClient, draft, opts.onStateChange, - featureFlags, ) let labels: $Typed | undefined if (draft.labels.length) { @@ -257,7 +250,6 @@ async function resolveEmbed( queryClient: QueryClient, draft: PostDraft, onStateChange: ((state: string) => void) | undefined, - featureFlags?: FeatureFlags, ): Promise< | $Typed | $Typed @@ -268,13 +260,7 @@ async function resolveEmbed( > { if (draft.embed.quote) { const [resolvedMedia, resolvedQuote] = await Promise.all([ - resolveMedia( - agent, - queryClient, - draft.embed, - onStateChange, - featureFlags, - ), + resolveMedia(agent, queryClient, draft.embed, onStateChange), resolveRecord(agent, queryClient, draft.embed.quote.uri), ]) if (resolvedMedia) { @@ -297,7 +283,6 @@ async function resolveEmbed( queryClient, draft.embed, onStateChange, - featureFlags, ) if (resolvedMedia) { return resolvedMedia @@ -323,7 +308,6 @@ async function resolveMedia( queryClient: QueryClient, embedDraft: EmbedDraft, onStateChange: ((state: string) => void) | undefined, - featureFlags?: FeatureFlags, ): Promise< | $Typed | $Typed @@ -339,10 +323,7 @@ async function resolveMedia( const images: AppBskyEmbedImages.Image[] = await Promise.all( imagesDraft.map(async (image, i) => { logger.debug(`Compressing image #${i}`) - const {path, width, height, mime} = await compressImage(image, { - highResolution: featureFlags?.highResolutionImages, - increasedBlobSizeLimit: featureFlags?.increasedBlobSizeLimit, - }) + const {path, width, height, mime} = await compressImage(image) logger.debug(`Uploading image #${i}`) const res = await uploadBlob(agent, path, mime) return { diff --git a/src/state/gallery.ts b/src/state/gallery.ts index c9c7f37750..e1c1541bc3 100644 --- a/src/state/gallery.ts +++ b/src/state/gallery.ts @@ -13,7 +13,6 @@ import { } from 'expo-image-manipulator' import {nanoid} from 'nanoid/non-secure' -import {POST_IMG_MAX} from '#/lib/constants' import {getImageDim} from '#/lib/media/manip' import {openCropper} from '#/lib/media/picker' import {type PickerImage} from '#/lib/media/picker.shared' @@ -202,19 +201,12 @@ export function resetImageManipulation( return img } -export async function compressImage( - img: ComposerImage, - options?: { - highResolution?: boolean - increasedBlobSizeLimit?: boolean - }, -): Promise { +export async function compressImage(img: ComposerImage): Promise { const source = img.transformed || img.source - const highResolution = options?.highResolution ?? false let attempts = 0 - let maxDimension = highResolution ? 4000 : POST_IMG_MAX.width - let maxBytes = options?.increasedBlobSizeLimit ? 2000000 : POST_IMG_MAX.size + let maxDimension = 4000 + let maxBytes = 2000000 let minQualityPercentage = 0 let maxQualityPercentage = 101 // exclusive diff --git a/src/view/com/composer/Composer.tsx b/src/view/com/composer/Composer.tsx index 7299abcb1b..5c9f1a05fe 100644 --- a/src/view/com/composer/Composer.tsx +++ b/src/view/com/composer/Composer.tsx @@ -877,24 +877,12 @@ export const ComposePost = ({ try { logger.info(`composer: posting...`) postUri = ( - await apilib.post( - agent, - queryClient, - { - thread: filteredThread, - replyTo: replyTo?.uri, - onStateChange: setPublishingStage, - langs: currentLanguages, - }, - { - highResolutionImages: ax.features.enabled( - ax.features.ImageUploadsHighResolution, - ), - increasedBlobSizeLimit: ax.features.enabled( - ax.features.ImageUploadsBlobSize2mbEnabled, - ), - }, - ) + await apilib.post(agent, queryClient, { + thread: filteredThread, + replyTo: replyTo?.uri, + onStateChange: setPublishingStage, + langs: currentLanguages, + }) ).uris[0] /* From 53fa6b2493c43ee4c5f986c8efa2ade62d02b4c6 Mon Sep 17 00:00:00 2001 From: Austin McKinley <54160+amckinley@users.noreply.github.com> Date: Tue, 2 Jun 2026 11:04:28 -0700 Subject: [PATCH 023/149] ci: add dependabot config with 7-day cooldown (#10475) Co-authored-by: Claude Opus 4.7 (1M context) --- .github/dependabot.yml | 44 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000..9404af75f7 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,44 @@ +version: 2 +# Dependabot auto-update config. +# +# Cooldown (7 days) is the point of this config: it delays version-update +# PRs until a newly-published version has aged. Supply-chain attacks like +# the tanstack Shai-Hulud compromise (2026-05-11) live minutes-to-hours +# before the registry yanks them; a 7-day cooldown keeps poisoned +# versions out of our lockfiles. +# +# Security updates bypass cooldown and continue to flow immediately. See: +# https://docs.github.com/en/code-security/dependabot/working-with-dependabot/dependabot-options-reference#cooldown +# +# Auto-merge is deliberately NOT enabled. Every dependabot PR gets human +# review. + +updates: + - package-ecosystem: npm + directory: / + schedule: + interval: weekly + day: monday + cooldown: + default-days: 7 + open-pull-requests-limit: 5 + groups: + production: + dependency-type: production + update-types: [minor, patch] + development: + dependency-type: development + update-types: [minor, patch] + + - package-ecosystem: github-actions + directory: / + schedule: + interval: weekly + day: monday + cooldown: + default-days: 7 + open-pull-requests-limit: 3 + groups: + actions: + patterns: ["*"] + update-types: [minor, patch] From 8e5ac6790f643d68436d22db80f891a1d9cf7fba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jun 2026 11:55:39 -0700 Subject: [PATCH 024/149] Bump slackapi/slack-github-action from 2.1.1 to 3.0.3 (#10693) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-submit-android.yml | 6 +++--- .github/workflows/build-submit-ios.yml | 2 +- .github/workflows/bundle-deploy-eas-update.yml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build-submit-android.yml b/.github/workflows/build-submit-android.yml index 719b2e836e..fe9d5b1c5b 100644 --- a/.github/workflows/build-submit-android.yml +++ b/.github/workflows/build-submit-android.yml @@ -128,7 +128,7 @@ jobs: - name: 🔔 Notify Slack of Production Build if: ${{ inputs.profile == 'production' }} - uses: slackapi/slack-github-action@v2.1.1 + uses: slackapi/slack-github-action@v3.0.3 with: webhook: ${{ secrets.SLACK_CLIENT_ALERT_WEBHOOK }} webhook-type: incoming-webhook @@ -138,7 +138,7 @@ jobs: - name: 🔔 Notify Slack of Testflight Build if: ${{ inputs.profile != 'production' }} - uses: slackapi/slack-github-action@v2.1.1 + uses: slackapi/slack-github-action@v3.0.3 with: webhook: ${{ secrets.SLACK_CLIENT_ALERT_WEBHOOK }} webhook-type: incoming-webhook @@ -174,7 +174,7 @@ jobs: - name: 🔔 Notify Slack of Production APK Build if: ${{ inputs.profile == 'production' }} - uses: slackapi/slack-github-action@v2.1.1 + uses: slackapi/slack-github-action@v3.0.3 with: webhook: ${{ secrets.SLACK_CLIENT_ALERT_WEBHOOK }} webhook-type: incoming-webhook diff --git a/.github/workflows/build-submit-ios.yml b/.github/workflows/build-submit-ios.yml index 151941f5e4..d2cc7a7abb 100644 --- a/.github/workflows/build-submit-ios.yml +++ b/.github/workflows/build-submit-ios.yml @@ -155,7 +155,7 @@ jobs: - name: 🔔 Notify Slack of Production Build if: ${{ inputs.profile == 'production' }} - uses: slackapi/slack-github-action@v2.1.1 + uses: slackapi/slack-github-action@v3.0.3 with: webhook: ${{ secrets.SLACK_CLIENT_ALERT_WEBHOOK }} webhook-type: incoming-webhook diff --git a/.github/workflows/bundle-deploy-eas-update.yml b/.github/workflows/bundle-deploy-eas-update.yml index 22ea2d5cba..983494dd18 100644 --- a/.github/workflows/bundle-deploy-eas-update.yml +++ b/.github/workflows/bundle-deploy-eas-update.yml @@ -386,7 +386,7 @@ jobs: path: build.apk - name: 🔔 Notify Slack - uses: slackapi/slack-github-action@v2.1.1 + uses: slackapi/slack-github-action@v3.0.3 with: webhook: ${{ secrets.SLACK_CLIENT_ALERT_WEBHOOK }} webhook-type: incoming-webhook From a2c8b47b8721eca2cd14dd64e56ef0246457dc01 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jun 2026 11:56:46 -0700 Subject: [PATCH 025/149] Bump marocchino/sticky-pull-request-comment from 2 to 3 (#10692) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/pull-request-comment.yml | 6 +++--- .github/workflows/pull-request-commit.yml | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/pull-request-comment.yml b/.github/workflows/pull-request-comment.yml index c0d4e45da7..a497a5625d 100644 --- a/.github/workflows/pull-request-comment.yml +++ b/.github/workflows/pull-request-comment.yml @@ -94,7 +94,7 @@ jobs: core.setOutput('head-ref', pr.data.head.ref); - name: 💬 Drop a comment - uses: marocchino/sticky-pull-request-comment@v2 + uses: marocchino/sticky-pull-request-comment@v3 with: header: pull-request-eas-build-${{ steps.pr-info.outputs.head-sha }} number: ${{ github.event.issue.number }} @@ -181,7 +181,7 @@ jobs: RUNTIME_VERSION: - name: 💬 Drop a comment - uses: marocchino/sticky-pull-request-comment@v2 + uses: marocchino/sticky-pull-request-comment@v3 env: ISSUE_NUMBER: ${{ github.event.issue.number }} with: @@ -198,7 +198,7 @@ jobs: *Generated by [PR labeler](https://github.com/expo/expo/actions/workflows/pr-labeler.yml) 🤖* - name: 💬 Drop a comment - uses: marocchino/sticky-pull-request-comment@v2 + uses: marocchino/sticky-pull-request-comment@v3 if: failure() with: header: pull-request-eas-build-${{ steps.pr-info.outputs.head-sha }} diff --git a/.github/workflows/pull-request-commit.yml b/.github/workflows/pull-request-commit.yml index 722af1f000..976fa35662 100644 --- a/.github/workflows/pull-request-commit.yml +++ b/.github/workflows/pull-request-commit.yml @@ -96,7 +96,7 @@ jobs: excluded_assets: "(.+).chunk.js|(.+).js.map|(.+).json|(.+).png|(.+).svg|(.+).webp|(.+).jpg|(.+).ico" - name: 💬 Drop a comment - uses: marocchino/sticky-pull-request-comment@v2 + uses: marocchino/sticky-pull-request-comment@v3 with: header: bundle-diff message: | @@ -133,7 +133,7 @@ jobs: profile: pull-request - name: 💬 Drop a comment - uses: marocchino/sticky-pull-request-comment@v2 + uses: marocchino/sticky-pull-request-comment@v3 if: ${{ steps.fingerprint.outputs.includes-changes }} with: header: fingerprint-diff @@ -151,7 +151,7 @@ jobs: *Generated by [PR labeler](https://github.com/expo/expo/actions/workflows/pr-labeler.yml) 🤖* - name: 💬 Delete comment - uses: marocchino/sticky-pull-request-comment@v2 + uses: marocchino/sticky-pull-request-comment@v3 if: ${{ !steps.fingerprint.outputs.includes-changes }} with: header: fingerprint-diff From d08ab487d87457b6cb8d804a48cd4b37952dd45e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jun 2026 11:57:43 -0700 Subject: [PATCH 026/149] Bump actions/create-github-app-token from 1 to 3 (#10691) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/sync-internal.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sync-internal.yaml b/.github/workflows/sync-internal.yaml index 562ce96bea..03120eaebc 100644 --- a/.github/workflows/sync-internal.yaml +++ b/.github/workflows/sync-internal.yaml @@ -15,7 +15,7 @@ jobs: fetch-depth: 0 - name: Generate GitHub App Token id: app-token - uses: actions/create-github-app-token@v1 + uses: actions/create-github-app-token@v3 with: app-id: ${{ vars.SYNC_INTERNAL_APP_ID }} private-key: ${{ secrets.SYNC_INTERNAL_PK }} From 56496520d6cfbbb6699587b7949df81efa548810 Mon Sep 17 00:00:00 2001 From: DS Boyce <260543580+ds-boyce@users.noreply.github.com> Date: Tue, 2 Jun 2026 12:02:49 -0700 Subject: [PATCH 027/149] Create logged-out view for group chat invites (#10598) Co-authored-by: Samuel Newman --- assets/images/chat-desktop-bg-dark.webp | Bin 0 -> 264956 bytes assets/images/chat-desktop-bg-light.webp | Bin 0 -> 220052 bytes assets/images/chat-mobile-bg-dark.webp | Bin 0 -> 68756 bytes assets/images/chat-mobile-bg-light.webp | Bin 0 -> 65602 bytes src/App.native.tsx | 12 +- src/App.web.tsx | 12 +- src/Navigation.tsx | 14 + src/components/AvatarBubbles.tsx | 26 +- src/components/Link.tsx | 10 + ...ry.native.ts => useLandingEntry.native.ts} | 32 +- ...StarterPackEntry.ts => useLandingEntry.ts} | 12 +- .../intents/GroupChatJoinDialog.tsx | 432 ++++++++++++++++++ src/components/intents/IntentDialogs.tsx | 71 ++- src/lib/constants.ts | 1 + src/lib/hooks/useIntentHandler.ts | 51 +++ src/lib/strings/url-helpers.ts | 22 + src/screens/Messages/JoinRequest.tsx | 305 +++++++++++++ .../Messages/components/InviteLinkDialog.tsx | 4 +- .../components/MessagesListGroupInfoPanel.tsx | 9 +- src/screens/Onboarding/StepFinished/index.tsx | 4 +- src/screens/Signup/index.tsx | 2 +- .../StarterPack/StarterPackLandingScreen.tsx | 2 +- src/screens/StarterPack/StarterPackScreen.tsx | 2 +- src/state/preferences/moderation-opts.tsx | 4 +- src/state/queries/join-links.ts | 72 +++ .../messages/request-join-group-chat.ts | 37 ++ .../messages/withdraw-join-group-chat.ts | 38 ++ src/state/shell/landing.tsx | 66 +++ src/state/shell/logged-out.tsx | 42 +- src/view/com/auth/LoggedOut.tsx | 49 +- src/view/com/util/Link.tsx | 23 +- src/view/icons/LogomarkWithType.tsx | 55 +++ 32 files changed, 1331 insertions(+), 78 deletions(-) create mode 100644 assets/images/chat-desktop-bg-dark.webp create mode 100644 assets/images/chat-desktop-bg-light.webp create mode 100644 assets/images/chat-mobile-bg-dark.webp create mode 100644 assets/images/chat-mobile-bg-light.webp rename src/components/hooks/{useStarterPackEntry.native.ts => useLandingEntry.native.ts} (64%) rename src/components/hooks/{useStarterPackEntry.ts => useLandingEntry.ts} (76%) create mode 100644 src/components/intents/GroupChatJoinDialog.tsx create mode 100644 src/screens/Messages/JoinRequest.tsx create mode 100644 src/state/queries/join-links.ts create mode 100644 src/state/queries/messages/request-join-group-chat.ts create mode 100644 src/state/queries/messages/withdraw-join-group-chat.ts create mode 100644 src/state/shell/landing.tsx create mode 100644 src/view/icons/LogomarkWithType.tsx diff --git a/assets/images/chat-desktop-bg-dark.webp b/assets/images/chat-desktop-bg-dark.webp new file mode 100644 index 0000000000000000000000000000000000000000..9a3929f2f210b2597e7b8936358f85a2ae97cb66 GIT binary patch literal 264956 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%0D&IvS+H?9*eOlf+rY5X6?-a06bFA5VK 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

}BtX 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 Dp>5*g literal 0 HcmV?d00001 diff --git a/assets/images/chat-desktop-bg-light.webp b/assets/images/chat-desktop-bg-light.webp new file mode 100644 index 0000000000000000000000000000000000000000..099a1045a3afc32a8b118b6d5a072dc27a5e4798 GIT binary patch literal 220052 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

xhVN@Z^Mn~9swZQ;KJY(Ot`kZRS z7=A(zEP2HhUSGtrj?hAGh>7E57(Cb%osCev9PP!FBa3n|s9sjB)pKhB79azfLkoa> zj?Agx^Xbq?*fv&*&X&otygueVGh;@FMgS{a0-YGFBMupMVb74cdNLW_UQ(XU2!Ks5 zk^&7u(~RJ9GyqR^0fQi~UGfv$!}bTNwS5#dy%YB#Q+#>l;Uhk#Z;QwAE}S^iaDhmY z0Na@d$8gbD(rUy4`&mK^752d-;4`y&h{}w#HEa%H)QL%W4A9 zU3DgTKQxv0>2p8#79Sn{3EBs-U#dEt^3Xzi4{KB?SWtjLhl)2|0a!Rkoc0nfrj+zs zK0c<#$t1~;@&(Wp_o>#uJyI_a?`~i?q6P@yIGAuGr2@wo@(t*&to)LgWT*f%m1AC1 zQ~1!H6O%R2vfMKC*PSC@+|l5OFpy50GdZ!>X}C?{*@GkulgWg4Kzf-Zi3aL0&wL}U zN*=U?AU(3m08E_gwk#ZLf>VIvjEYgAU==zWv+A{8!$|r%fANqlCU3HQd|F3lG()Vy zJ69K2gXY0zH|?MyH7A`V1q^#Avzw0i!b?WhS$hLY1yF(z)pJbl>!VmOBH!M8WI(EE zhk5RWiCrQ=bZLg=j+TOjP zJksj|25pDR|JXM!cw=?+Ko(e53zOk-c0`ISOMF0U^4Hh!Ihh$VLx$P4xWlzLT<}7M z%WF=0rlox3BVm#`n z2eGMm-sB#PF%#gf_%i5BoUr3AUT=~W0<`tlzshmT6G=+8LKCVyGTS=_LEA}ZMV+hL zUC_IxfKv8;u-3AAEN$52h&n?z0RD8Q61*m_MxryiS(d^5E#CglmH6=3#bL!oi54>+o_BX<=59@52=n zbb{8lS8~dyw#tw&9ik~qTHrO;KT;jC&*lfaWqJps;Zpdf6=&O2zndoSyYJB%Wcu4TG~toGN;mk%|HhB z(vsnWGp9Vlk`8bk_OeSh*?rXWp0{I0E7U&2 z`GDHH?e+9(FQ3|4-B~$UnDh`FARW|t|^9(@x zJ3}qLv2{g_I$*fB+@tPtW+0)}GD+>rH!^WT zkUGVylGh~Abj&rHZmDc+@lp zQA@pSzxnuh&!?Z6$&9vrLlyuIgJwx*<>1T`DD?&-r*shBRV{}(e(-%+P{6_gj_p;` zDjbjDE^4x2l8+stIjFQ8y(Wy{10N+AlN>P&1WD{v z1~eMbz%Cic?1^~Uu2@tZ>FvFIe9Y$@W9HNfUi|Xx3tI*55#~ha%HY7F0mXaB5!r~9 zVTi*bweplJOc_zW%tzw&A7S!PABza!>%`HydhzvSS1=AA4OBqPnn?^oQ&pXptY9iz ze6{n_>6N5*4WXLvomXRh9$|`@=jXZ9y-SbxHkk@*0K68Y11x)MSu(&bnZ1-@<4fsm zhRni=y#l<4WS(wkozTv3`R{1;AncmFUN^VJwR8*yXOzl$GuC_YNAjnX_$e##4Tr_D zz+EC?_K5*0y81Qz307;Lr^of&Z6CW`Bq<~yS`KRYHLOCMXt4Mt0mg?RpkNqdqjkrYV`U_D`I0G z7q3B`53?@xGA}P7OqxxHxGjxxvO7QO!e!F*5<v1$%Y+QNodLYdq>60j%1RhCcH(woN}Zu-zVd=R#0iAR(@}a8m(7>);<0L* z9S_yI!#Hgb&s_t25ljL*GA~WW7 zD3E_iH}vkxn?nmQK|6X6fs36_wcs+cpco@wvx?(UD%L>IJP?R8vFH&fA*H3T6*jwim(I#ht-KwG>T0gNnj z);;QCR@U*X(U&9%T&eut-7N1^o{!Tk3o_TgWqU1iZ02uHb2 zi*issi6W#RnAtXt3C0>-^gILwMivF{%6mR693}+{uo({{i8jDV_GWo+w$PRj$MLj( zEWC<3BaR|-mfZ&@x^V#cSf@A#vNDs87^Bgevcci~)g%MOu@p4P-#p@~s^&~SjMBO_z3g?{I!;;&C&w^De5wLHA@rz9;TROl zvhc=&PAn`g)#G8myT`J7-n$=X$ZPUCC0_rUcFDl8eX%`G1qYS`#!=!ajMfKjk(dlp z7gXIY7zbm3xWMm!uq?^Ob%W~TkhgHrVJqe8bTocm9L5k$W|~?z_kk0pg`%rpb2QNQ zZm$t@wG0lAl%!B9PI(9?tZHL{Roa%>U}14q7I@DNzzDFeV9z56V7=_JynFg{^?PTM ziD`5HLt=n*U~(M8ZO8Ov#0+Q5vh)^!la&Ei5))LzFvDJVOoQ~TJ|#mW3*o#u;tX*| zEe6x;TniR~9K|#=;R*>(;$SYfi+b%LnAWz>_-$J!_8=12<)4pb@pO5)+%1TX-1h(r zdC+b$A0IOxZPPo1`Iq*o^Y&&mdZ{9Cz(lme;rc<%X^IT2gltCBzk0sokmfVK0t8Rl zYf54+SU%QSz;+H&TrZ{~%EdQk<3IJ%TdcZK|&$? zo95b$LB$kEQcaT2`S_fg%w$}X3jZLEuNv>(_ik}y7AAwqryz*6h>2@WB8Jp4f0+LE z9x_odn#4V@WqgG^ZK5XvD6Hw3$o23-?@U->026fbjH^yR%txy9{(HlAThZxVg40@*?N0>v<3ooayTzB2BaM&e#9)yk2uu$-EbQr1kEr(LUa37 zulGwxz)AlWn`cC89)f~E^dKz2s0#{6w+Evqf z`!4*i2FO@m77bjb!$}5{1uhO&dI|(az=tdGB_RZ6MComNFrm~^k72TsTv;PaAjrHz z#1+w2(b)Ofk|DDT z%W7DaSy|pVL#X2gcFDk!L8u2CS17GzmpAVte~vR5M&&;t|Ef_eIv4H<*H<^Oyv*(?-bkW3SZ6i95E?E!t3bDg9^pdomiHRa**L~G% zt(7Ez^Ih9A{)`i`0Wk5%0P(+ISsKX_Sb)hTH1^Z-;h%8ge^m>ZjrVTAWpa};(G44T z3czdzO`Pl#Aeoi|SYw8Q7TApoveVLuONx0S%DiICJbr z!FaHx*yjMtUXpC5`JAe4JX>4&=cEC!@ba>=IP3~gwQ3-#ehMNMGy0OxWcoDVjOx*$ zGnQKmda}4Bt$DNz909z3#TX%Hu7C2T97TH~+qx zjO>xjwTqS_-n@D5&V0_iJ|}I7M))U{IS8sBY6p7z6sEwD0NgKGxlS1LIgM(hYN?M; zjHHZUhSAJ(?V%A#LUKhHaWULT12!$jd}{(Z@Y^*)*qddOHzD;UPx2C1RIOLrKKE@) z?^H!vcZU?L)T35a0qSIcbXYQ|K41-;qqCsd%n~oei^ynHK}bOm*YA4y_k8 z%;)!AI>{g!HLngNrgdSabw9(9&1c^Rk$XUX|taP?=gJj8)$Y*(KRsKIh|In#`Cak@$~^ zIke|1Ogb#5RZ{@M0Vw0q1H`&A3CXV_qoE$Z!JrC+mwIbSLc%;U8r}8(%r00WYRrsv zIsgf^ECC~Vlntq|wog4;E{7tKcn}fLn5g)pTjQH#N#=j`(KseULjKucL5m-< z9KF@!_sm;;jj)9fujPj;C=6_c;X4jIgEOvKBUG zr@U=JYhfMX17WV=oDi1p?t`Dnr|L-QU+Uk3Qh1E5<(MdyhBfV&;>+PB#M)%KS&wr& z+8)6OO6hoDAn}?E(x~)<-DO3W=U}e3$IyBVXZJQjZrAecg8}Y&a;4)Nq+E^oa)v+b zF!I>8zENf6knFP0U&~=65&yOQ=&6IxojDO^KdZsT7Rc)#02C_)8K1-zquI_nibVi9 z(D@e0dJ8ip&zYO?LmX{?xC*lyzfITWDP7nrus!k|_%Lei?P#?30?|J@7V*cU0muNE z{jAL1+Vg4DvBDF|vejm4y~li*jFL+3f6?|htrspp>rjQGUCzi7$y<#ed%2Pj6GNJr zQG4HBNobI2f19_OoouZcdaD6`61`Vc9el(BywWzl-M_GeH%ZuQ@Gz4BPl76Kw^Lyh zA>h=1ef(ZoP=K?cM}pq>-Sk;o_wZPD$(=M(are8e^)|1` z@bc{ct-?38m_tuH3;z`W84l=Ky!_O;1;K<7Ito(1PPFAp7+5TYuTJ6-77IK*L;^Xz z1YoB4Q~yOJiA=`eCl+}Br6(-hx)QU(MwUvI(S(tN$hQQnZ+h!nyaA7v)u%RY`XD83M}I96tc?fmV*1 zGnOpbI1X3taxv#sRAhA&4brGY+XlzdW*xrBbg0?DD;wW8UdekbfyZ!rrjM#k`?F88wHX9ot^Il^bq}EBQ!t z1((P;d)w}&`o@fKC6|`Rcjo8DcbQiMTPY9hjS8{k+no zN%3PBXY`PqaNuYFuESPXZIOgbGZ28SvE$#Grdrz-p1V}*H8T}mXkHXj<6}iR$ES$jWd`yzjEkXXV zHIIn*%;zf5D&P>5b17Yiqay6&%dpH`2kLH?8mRE8A}oC8-})R%CviO&Kr~A6aT>tX ztfzSJ4M`5^04Ts)$yNZzW;|!|Ca1%i3biR}G-8F+BE&Ed6VItEz?&AZXm42sZ}18u z>&yiU>wc1K>`!wy`S4R%BP)@AP5`N|ntAn^HMSWGaBbr~PD@${NSHARY5w#ulSUV* zQYwuzxJGTuEHFQ3bhd~YlVctD>c)&HeqcY*Ra)nLle|e{f=ZQ!28{QSS?cttsyu15 zDi*a~f#qe@$z+x#g)+PG5{7WK1OSgmu9J}X@Uq^^jIVkb6O~9d`KP{l*r8X>94|Ps zXxO_4ghiRGIv<%PMhB$sCWK#o1|EFRDKaONUbkqsS$xS;c?KpOuB&4&Aq9xm7V~wU z$@%RO&{RMedW6C<2x9T?nO(uiJxWzyBTffc-p*v|PGXdQTBYDU+V~2`qM#4UGnibs zTq|ap+1ngHaEc=wwTbsmww5F$5TWNb!i|aAif-CELAEHbWOBgt?cN7*;#iE7Gdc5` zGbG@q917Vjs~aXT|DGqWMr~}ljBxPDEqG>9&zQkK`p24&L)L|t+lN<;!}TiXg%|qa z%4ee4G*-)w0Cm2}tgqzK+5`dQ9U`uXIE0I4I5)4wSL5v($T+-?;s?T#<$o6TVkAay z)|oexR+@&22DTlA!}+&O=FoT~Y>PQu0}9W3(?F6W5?J|X1IOawLgSc263)Qo|2Ho^ z3W8OBObWyRpmZ|_Rc!@8Gh~ghWaRv+^Zb02OBc1a+N1JVd}rju!~3-RWNU59VP z(QF?63r_hrAK|6m%a&|B);d?Eq*NT{5p!HTw-T>!SQOPc4seR@BP<3iJ8x!{HMe0* zn1{GUy!3Tt{X`Z}7-2zAIhY);h6?p6q7nr>;W&)n3cvksl{qit_kxGp2C~$-j!%vheDm((Rl+e}m#D zB0v?u8IDa9RiOj-eb#*VGS!T5CqLhjl)sMSckLqp57tvx-d_YS09F)6GePGY{V%(_ zSqBi3bk29KH;HSeX&ec^5Z(na1JR+53Kq-;3+N#X!WxavRj*1-j;9&95}tB?jOECT z^`82We=D5hF1=!Myafvd4f8Aq4tm=ki8ls$ zg)a#I)t$$ZWQlr$%XRPF%}YVW^s2JX5!u@pGWl$U^(Vv))UiEAwWez!goAW%zH zG@8lQl85-v9C_15#eao6SFF)iW=cq+-Rnap705R5=zQNP-z3RE(72^(r2t)@>iy>U z0;5_^EwE-YtE0t`Q30>4(h=ayBB=buOST8Qn&M!^<2>~wD+Im%F)a_5a^iHZ<$@AG z-~uQOWL@Fq9RAIW`DT*QTYEfXfoNwvAsKp2Am>2o{7X!Ui17YRO`+;q;PoJpFvv9Af8jj?@h*`yD}Z)X%PW{&wNUS70Fc9^End>msNk1} zktE>%l!p`u)8fF;}%pay*vyz=v!#O%(Iub zu&<@7ErMvDmzZ0;Su2ppwB1kGq9yPc`n_-7yqqx;<|8EW^k@U*3Dp1uy?KWhuHD1Zfkup%o)reH?L+L<^^l8Q(~{w;gU zqJRNd7K_F;tVA^c(;_jUena6O{E z&B+$kWOBZ74EZiBA_*Y^+&BB?Vqd%L3di<-`TJ`Zq7x`>2gnGd0+N^%nv9vuTho}K zSqNSs|EhsgKU%Bjm;h|A6q|5My;9fWYil+^{A{1*xDUJme)*%a^haBsuYk|Ly0n#C4u%hYX znUSP#-0*K|=`sE4CxC65p>Z^jJOt80b(-y&9fksBo|#y!L(Pn=WNS%Antt9(d@`yc zckeu+UDt0t(*3i*9(eJFa8bTZ4bIvxtKjGh*>Dfq~KStKcIRTy(1;i3%&+ z{GVLhz#YzM2WC(9r7Y-2wU$}ZSq&_Z`LqIkA9Z<>G2JFfg^~pCK>jH)0A!qwEaq<5 z033%{m~im;VFY>s#FgC=#?(@tyK%_G`5K<pOX_K&dp4PnoEl=8^^HTTn4p*5~+p4VmoQ-;HL?pp}vI^cXAE%0w3Da_wGXZY~I~u zMrUlsq{Pe2)c;lj(CaV{7M9n&Sip@}phr47J(=~*vhGo^-ps=+l+?gW$D3lQ4A*Od;*vyIB~ZQa%kd4IwKzuu-ES z{8x-FSFdM@)|q#p&bRpAoJE79fQy>j=LiO{hRm{iXjx)_&5&WqWFUUryR3$IxZwcv0_CF_v%eBgD`{z{fC*hlpgWCjN(qgBTc_bAYPU(841iZQ4%i^pUC zLoC(Q7$(=Qco*0sWguVOJrO|q5XFclF|mAzQVMZ{;Pr1U-`|4LG8uqTY3T7X zlbCClfYP%NF7jl}Y>DBJQrcdd1=!T`85@Eg^OAVpXTfMRXkM{EHpDBexQ4Q07?nZYb)k2V zUVC4;(jfyN11yjMG)pE7>_R4WhGjQHW;f2TnXA7?PtdAn#-O^*Z~4>u6A zV$uOl?G0}&ONNDA*cc$RL(G1>zSprXOPp~qK|{ehs3tgcrr-M?;^F_|oe_8& z(ZqS+qso5qmduvPv(_I~gK#X0GRZL3Y{KJY11nDVrUhzQ09gI7yt0lFpa*YZK1Pen zLZGXJkR+NglB63f54iXKR-1W;%*S^5p`Cj<4@{>#uW7Xf7*>5BcANl=GBYQbY6@ll zH}I1a!{WHN{|zt5YI|P+a8|@OEEZo*V36_c`>T8bF@4UaU@{VUeC|7F9o4`Imi?kF zKeKfqZ_I9nx0f_QavU)-JBc3mb5D+c1(yAUzau};ep&;MD+8tJZZ=i}I0Jx3Sut>X zUor~S|A3i79UnuD31hLfG%fTb_R-k3h;J~($i>sRE10|=aa!|b0tLO|WY!oZYH3F=Wj~ z;w5>yy%z3Mz0_L;=tuP_hXNKO=7lfUIK5@D^H@S-?wh@$!mGqO*=Y*SQvW z9au`^e6im3ao8uf;J#k!^iJ30mih?frOv9eh)#^^U14_P)ERX$q;$f>A40*Il;NX8 zhfUms98V!>utL1LzE}8HCIhf{=iJ}IaysQWWir5ZxO6A4HKSW+>th;$|G=2zTUCO$ zV{@%#kJ|aYRUgB%O@rr^ZkPeR2>{-Q761!xz7c`7f)K2a40RunK#-%jmh5}2mDa=yyT}`>4n`fdv&6#kl1XPn zM`lw-Hy#bkYFN+^$7%pa}yDxl{@^25>s_ zA+#zMAjZVC(TIQvd*AmDqT~D3Q@r<4%T7?9xBQ5Xw)2q)wUn0JGxhVq=B^XOv3$ zgaXj|e8jx?vSL0QGj_gXW37cb43j-!==~}~e($H*UlX0$do;zXv>JaA3eEz9X3*od zP2r3>4ABiC8z_(wX*pp3&|y(;m|U;*-u0c*I-m%3gcZu49+JCuuEipkbM&bX$%kZ! zk43y0P)#O7aB9eCHhkk1lLFw?$#Tl61L6q+Lh+H9Buo-hp_I0V#&P)2I`u7X*7!Q% z;3PNfRx`p)t@CnUr?wc)fo;MC*9^`LV8LUL5Chf{R_qY(2Jrrgan%LOkJ!h(xx+bu zY}N|xE657O-Ao|+_M3fw0{ihUwE#4`3oI*#5$r-{5nlDjoZ&1sz5w08Vb00~L}8Ha z!HMN_#Db7`&5(>hT<|!VXsf6>yye%duVd@9!#9R8D1owgxMnaCH&P1pQ!Pft{2`AH zB!q9EFuID~zTpjDPj4p>z^Pthulx)|HpIrE52t5twLP2UaGj zPa1^PC#neu1rP7QeFat!f`Ehlq28hspu@wy=HQpgjQkEgGmD0JHzotiW>jYYHnWS0#nU=>&#>Zh0VFk0Kr_et_gXU| zj!RghR5jh>KaB8^*2mOfaUXO<}4n5a4;H*$>Eu}3mv8+)7_oD2!ezTBXrO=eM@S!6N($ z#kRf%a!^bX*ZaTWGiso^;V>8|^zl~@Jh_&oDO}QnK}j*4S4{b;S%)2Oijw}7l`&B# z7=&%ij82ll!rp^sRhHVmKLbaO4aL&0eXZt0RliQ02REe2~aPqv-S#TsRdYc zVsgd;Ef(zq?e4HDIV{*sO+d^r>IU*bPE6~Zkg!z*8k!vql74l>ld<{9yqA`D`5m(W zN8sBaV#o@!$;&ZkQ6iWX59aT?<(1cDQppMltgu2r5R2b(U!6CUjzjC>nGq0+?NY#u zK*Vz@W*4V>{R0vx78Xz_U)U-Sw_Gk*Tuujchm*Q@S=g*KcL0VI<2BWwptnx1;VfU` zN%DP|jfQeVgi2|tre@ZewTy<84qNF1`|kcWH@I2B>p_8pOfq4;l8}&0oCFz2uNlv9 zE&@V*0f-(NV$u$1HYTH%*6D0U1AAy;Xv8f*)Z#BN z%f^8PIkIf2jgSJhSv5d8=9T1w1U8MsOFrT`wE@9lxCR1J`E=B)X4K0)v3lV=OL+Sw zGowhN=%@&Y+IyYf3*#QSFBcIf$s`H7BHqs1G2<8|*#u#oR|?2%=EEqz=Fp;Q zmtjpnkX39CLm(D+V#w7kXGMU&MYW z)h-QC9YGyxrtGbDqx*GlF79{i%MFhEeCvxdBx;7wUUCWlr)JHlKFuziH)TWU^Gtgj zkG5ca2-X*}EDF>K&^cv#S=Dxj6^vq~Ak|uB3tISsWHbU+4*gs1vt0qa1FMLeRm~Zy zM@)ih9BeE-pn&+L4w;P!nkv+BH3K@t!K+-$mXJVD`rguJx;{F~M|t}OpNoecEXCxb zX#|$+yAUDJ{Y;L4NOo<49H|bY3B$4rXwWPfb{94S%Vw^SVxE?@&#VqeEt+!(0l^I6 zWlFE&ZfE!J*s|#TA+-p^Zt)Hj#CgEs+>3m}q<~T4N|HE*+tm7SjToJ~PG)!|*;&O~zzY%DO+&hTnCu04%SVQHwr}Xq{CI z3hbo)(MqI8yiSUbAPeg+YJvV%!g9|2a8(0Y13CYjAl3uY47;_7X`llfN3R(C=_%vA zhvZ#=K|SsD_9kO{oAJP9r!n zhZO`RGN7P6!wbS5o#RQ85Z4NbO)1A?p9I85`&g}M(8Qfw8DazCi={32{1G!u!J|F6 zYKM5K^WU&uDPq)_#0lmC`sq01+hj-xIU-?&gOd&*CMG6~2FRRC!vg9+h9$GSo$9P5 zxJwWO8HH3BsR$_`Hyen>wWxZt`vVJd4uHY3oQ%EYx@iMkpLp-ln;YDL&P7_Z@ z!S}y~Qrflz)kCzYhD8!~E-hI`v`br<%@1iB@@j83fY&OmM;wv7%)A?@0LllQjFWwj z>pSyK#-Z@4Y(eW<^gF%v94FRbIh;|4!(nu@P%4DvfB-3Aa>wBY=_gd{Q`Li806kQ2 zpohG=&>>bzlEUKQD{iQA6$MP`?(NQeka|(-BuRLgjX{N42f7Iz)KLxf*yth1A?}uF zw|S4$#~sy2RD2P2)(fwa7c7>A;}{Lo2^cXeJ@SLiuL z-VMH97?F(^5dw3ga&FI^jY#NwlqwKrsC6x&ssN-gmKA#!;;-Ct5*}*%if`5iNC~bq3N-idR-U zF>=g7A*$^sRRE;OItXnSgiwN3Jqn=R-Ogk*;pH&$ss(V4dt}6{prys~t_l`jQOg@H zrxg()2#JJ{`gwFp84wK(38mlEgv?Dsf~Ki%SA(MT4MG?`L^8%?iGtqIqmtp%ccw&dD+bFBJZLJzzPJnKuG7D2?>ax<{FS$s+pgp1qG?scM_8U zsMPYbU1<7(BW}D8U6y7o?&uoMciBKT3Ksw8&lL>Xa=@14s1CY+{EY|WM<5~w~4F>E37_MQfq#{v?kt_E=qAavdUcx zWnH8Yi6EpRq+Y9y!-q_UI6m)8CQgUUai*OGU;#FxA;Xe(1Q4KCh)51Xk`QvxQe;tm zluSyO;S~gk>&G)mjgD8^XAo6uYo)r-B<^G{{z&LLWT~*dc9|Ai%0U(YtFl*tBPKFQ z2FklxZM;y~-AAT6}>Lsk(qPk2Z| zkg}Utc=rRF4ZmWGpIax9?Ix^2JTDuOAgCb(L@5KNQGP%HaahWj&zBg3D5br!<@E^Vk}LL&Go3*u(WvYh`Z}%%SblSF_wiHDeBN%MfCmIJ16=XB}rUIz|aWaD(6_ zP~of>U|~-!yZ_Zkx(9!Faz3a76K2H~6p}-epah+eS5V$o0jqd-cXi1t3m5@UX5mn* zuZ{poMSXgaAb&?46a^U&4rgrhBOtwESV_KF8&IXS?bQ$%3_1C}p_i5<8%&+gQo?p` zt*yMTxaKM2ldi+mnE9X93o_w}4nB>q$qbVuBJT4*Kzwj!Go-_69-9oB;JwNZ)udSU zuveV3Wy#h|~t!TuO+}tV#$4fxx`n1EF_Y z0PEu63-`;gkh=(RTPq|nTBZcGgP@?cl@i1QsvuSDnRp4yY+u^86Epri;!Uo#JjJnD z@=OEvnfS|E=OI!ymR6JSg-MdYRQzzpmsKjVLV@0U?(hff$B5-P)dE%6dSEf>Whv-6 zOX&X2LOPl2Uf6UVcv*mr*<~S}MIE&Rq=w9r)`xV*Al?b7ucSs3k`Pr?2Ei0UnemF3 zH3zRGydm)qzs%!vO8xQ{e&>N@7MKqvdFYB^@Yys>3>F(Z_JX0v{8S7dI= z-kDTB`am8LDSyOH=RPoOt5|3jPp!A+3D3b=?tb&h8$Q~yI2S+xu=v&%zy^A3fkV-# zGEoaf5K*Js;Tg;1Tj<9pCT0wAMach_I^rG>q*CAOHRQi);JS(iIwNm`DKSHW?h2U| zmj;|9lhJn;UrjQ}5JJ3rOY2W<-Y}jRu_Hlnj1hMv#a_LF7}QF5$*?Oiped8u;eo=Z zwKg@3SfjSR)t@{&n7orE8r~5lUS6kiJp?A>G_b@ZOnm!Z3@$!ukG_>CwO49;rGIdM zxjh^O?I4~KPe_y}LHZ?0ill^)wDchOyf!1s7cReLug)`^QG`TMwVELr68SsopsI-v zfggmkzDb@j0S9bn0gaaS}d>`RsiKI_v)>CSbT8F2-J2^l1zq-Ii`q+Ef+Ps_pbX{0yW;W z!4*hT>co?UV4<&Jj(RUkmeV2b=yUD$BY;XpwFAbn7lgy|(QqG<-Apn}VhH;=btECU zA&^TT{gdNeAkU28sL(o!^ziWOJU!vHOdVr*TKp~6iG+}NXyPz2qskOf`>d#@_+1TI zE}kJ<{PBl99tfkhloo7&FgCfCE!%MVrH2Zlh#Ml{&}papK!F%u$xK5D2}u%vRvFbG zXI?WiZ*?fSIl!IXe^!r{8PL+TO3;%;k)AwRmGtCD>>kXrWCHY5oVnPtVM48mNrw!` zVHP%Z1~QpdoncpnRS*&k83r>tjBooKB8d1)5mP8vQ-TuDAS-|QCYgLfsy}eWarcT3$PfquQjdN2?SHmIY7;MrYe=oN-h})>T^G^jal#S3mei z-Muokt45V^syXl(bKYpyGzqBbz!oz%)>i7Q=ehJq;(utLKVcE>s)~xO7(Oc(UdQu3 zVD7|dGRg1Tq)6#&*Ss`^c!lv!$i9N?WZOc-JXxdI9c#%T|(U%m&j4(-vAwZR&_IILv}Ipridu zoX&~_JQ~LK2v0Rgh{v3Smy#e^f~WmR2#5)1Nb;G)Xlf2h$8Z2Gty=S|Uyy`EpkK;@ zRza&e20xm=XLe#lD4 zmiCqkRntHm_EXl70X8G3S>#RIQoOK`(Zp#-opjiR;FVzm#6lo>z9dW1qva0xgOO2b z4_;o!>HX6X?`2++#FKpZGyV@ekEOoUhdlh+Yvvq)*4K7|xu$oNfaQZun;Pmj?_rny zRN*jTfk%G-iTdLCJ4O|Ch+A4(n}cGGxyu)!6T1k+hT+;LjA0| zk>t2|T<-l7RY9yx&WYDyaK~mG*jdy6sGn#nK=D0ez{O_pRtBh}EC9X(1BpyB?<={8 zVe?pOznAy4oTv{u0N#TCndVw+C4m@5t2kfn?EtlcjS%FlDbxWA3xL$H#2J8vm}M6Y z>1-I(0Z0wYlF2M&1n7PqM#9p=>0oT(B*sKb0oL)n`KjGHt|7k=GfsaY&8SNsCpb1& z&YFk#(1O~kf&!wVd=@-)7EPMV)ywOkfQJgtCZ>kc?`5JH{Q_^oS^~Mq{EbP7#?&=R_o`0oWNz6<&P}4s>Zp*D!MS>VF2Z!B_Gn?|uw)n~- zgy-tPwFoL>q~ob3VV=V7_;V4T|819eZeL0}%&48T@Ms{6apj4U1kj(;yv0&iG>MJ7 z;HkU7Es_sQ=_spa*Vt_9H#KtF`H$ z;p4kd?D5fx#MI=3-h&!5$vj>dwN%7c=Iwz=0PA1jn182z-$(L65Df)qbK4=0yB12* z&?v)vj>~G;Ma*i#0HDbrYB|sev#?7B(t0zRbTm5i**pYWs9HrR7P_jABoWK007RTqX_QVJh=zxkk}4g(-$X2D5iBt2oee6s*Uv&S8C| z)_ZJv4BUh*Va4VES7>dVVo4MmujBp5v^30#B#Ey{5L4LjNSMK=r2su7?rS~CL(pq( z{pK=|I&yt>1G++R7ooUtiRCk zlGkib@}-$nOMk^w{;>6cBr8WP9_H)UdSQlW3!*NlO$5;}UB|I6XhSmjgGWx98EadG z8VTKG95Un-Pq+S^%77+-0^<+*F;1B)G(Q$|tPBu(V+-rXec_Iv0MKuxN_y;*Hb~vTm8lC!+Q+hoU3E>8VF&^5z;XY22L9`QPys=C-; zj6Eh97I|67fQH=+fXtGK&!7Po88R#a(EUdY(xIt}TOT_ynJ5WC#PH#J6}Az@j znUA_MMo9pv0IlBh{iuXILFL^*n`Z4&z|_+yIsmGKM&~!X6jygVvT)h*y&9tPr3@?N!jKcNwCt zMe{V;)5W)@d-7x^c_JkN)Z*o~zFKw65uV5Xr}ii>9w!i=!ksXe@pe(8$>)qS zV@6Sc@G$GwfBp8@OjO|*nm#`5@!X7(N@YZbIg$nRK7dU-0AxOe1r0!k%`A|)LJWwW z_$(|Tu0O5uQ!=ANVmxdE@FTHuaDZgO9cY1&6<; z-(y|qSlEL5cn_;nVVF^rI`D4vqfiUH1oHBE8c*DIm;t}zz`t}(7D-mFoS-kT2#R_$I%Qj}S=5qYQu7 zKE3X?4@0)v6lCT^URnG-)(DZHK7{qDqfb>&#>C`McE|7Ai{c4uNPJ^H5(w349)|%c zpVqV1gnQ>&Pb7sfVz1)NpGQZ`F>ZnjU_mY~Z;5LD)Zco8m6jh$6;1f`!>ON0$lj-x z*Y7v|V;N&=Din^#Zl*o1Y1=yFJYxVlf6a@Jk)ve9AOzp$@t0dMlaiJ74g!ny1Kpb8 ze3Q&L8bfh6{W2e|A3jiwSah&Pr&FbE2e5(KWRC;IlX9k2VyL8nB~md$!n6BBYZVc zl;6Jhr!<)D!BN`s-1jig-5$qr%%b{LAG-rBvl{@ccPM}b&}Xo&(08bX1xHdW+f`qq zLmbMb27Oe1Grb6qhrfSjF?tCro+cw6xHt3UrS2%CX#z=Bay^L@#E6$^{RYpv*^WJe zsI3LZUwC;{gxNBVPu6Vsv_49M;XRX2$6+8rzMcsD(`SB;u0iSaxAV2VI->h-D_hN& zf57}@&Kx%qwc0}H^nR%r9+hK~WKj3h|6ynWU)5hoK45!;272SbR;|XwWaU~{v(=)- zH%!z<-FKCGec3NqAt7Vt{Q}17{+FqBbf#jWa>$D>=TVe@piBtNp1RrN>eF8B(_=S< z>ZAc`ARRPpCId?*m}Mab4RO3cj7IIK!=g?GP}>OrB1HCl|7WKKw%RDyIOAw~B!Z%^JI)t8SSB_U`!K90co!Z?vne%kfRGT|RSCr7vQ<5hIYOcYWdAtadWU_#gcvo&t?6?I29?hdCLH5> zA}Im1bJfzWHMjm9iFWJhYaR&{xmLF@S-)`$Vc$L<73*5vX);h`WA-Y)@ z8OKz8ep*H;9hv_=%z{!5Hs8PZD^C7~mWO8YI&ehDA+Po0U=`%sFq%keDjTi@6iRKW zG>zVyL$VZ$7Qk=R-WPwM0pILi0360kbA|%~?@;=le4KdJAgtr`;(Oz>UI7NO$h(Z~ zXGKKMy9|+yo%Ivn7W1pQZ`&SMdtE)QKKFgw-BiZMw+0molTMh-u3DIYWm(YC2rp<> zwF<3S;>~9Sl@D8NmedQOk@d$a8TA*7E{yga_Wv0s}k&# zOMD8echAqIU4{*$e*$H;nND#I2nJY_FUuj?|=NW@`pE~w`zU*d&|0%>ea1g$A@+I z>xizW?KLoZDmeVZ_~ReZTeZNd1@tZJk~gO;pw~O*e`>(RD6r1nZld#~%0xGWYp$Ov zoSF4pNs`Y+2GRd83Wrz$4BmH=D_bZQwN*dE0N}!V0jvWCjhdN*%lp6;TRxw^;XnV> zYj6Rh(=_yQxf8s>ns`AqqLz2nS=9^TvnMdSAy$t(p;M5xAMRD>9DjZmwk@sWW^5Q} ztwDGNmRI*M0<6dIs(lQnP^;E?ST|NO5+ih49oWCz1NcdAq6m4oukY#}hHUIG>vcQe zsO>#y`fvRrnz6W6o@6h5?W^@$it5BoIVx74<69#nDXT!@g0`)csxjx^8UN|Hb&IJE zm?-caAYchXB}vYg~G-(mJ)ELYN9%@j^zXu8;4q!c5z_?oV${m0o1+;6iWnQwakzs1NT1`gltT<(pv#Q-hGws4?w(ailBrj zPa^$SI4*j1`=j7;FTy{Vp+f=i>KvF2_m~{N)W<)Fbyao1I_Vw6N+*-}gbpXLI`QO{ z8BInKR;8N1fYS)_!<-?mG(c_T>Ax8DxBKy0uVX$uQ9>-$01KdAe=#y-c1h{LW|mbQ914Y5bu=j*;t|dc+NGA) zv$9Y3KV^BOj%>yZ=3xr}Kbn&ku=q8n6GW1+BrFhUmA}+A`A{F$*z2#T)v7~w>3l&-}NuE4W#~gj0_PDyC994j^F@|$x_)EOv z>^;IZ2K92P{=4+gYaAVwL_l`wFW~)G@`Z69`S=)L+F?dGJ5C9BC)vpgJfzP9ia!|l zhq)u-=%2?eMw6Kw@lM!}_VH87Jd?lsdl-xl(7gNxVKfWr#K+ANFe?BH!1@@hCmwZr zvQF3+J!>Cr`*8j1e^4z=L2Sk_d~^m#eJBRvmofl*E0am*K{oB(*nS8G)}axxV#d6t zvk~ElKWN^>1q`!R5)4c|!C=a#7N7JsG0EkB*Yt=V8(+t(4OWOT749oB80_F-elt1$ zjAy2`*8o%iITmNN-+6(|60BJ=#F^z73!&c30tG-Fuxjby(K;7Lx8mvb>!`S4Vc3Pt z%Ayly)6uA2dE=EqgDi^)INlZ15Dc;?y-EU-BwJYLTgpQ^mt@AwLkM`}zhJ3e@{IXm z%nws0F>fD7?X1UQMqb1FwZKIzAgU`m#V6ZQE-yrs$yoR#n2y%Zr@nBa|4zqK5AB*5 zosA%yBkgJe2V4!o;tyC5#LCh>EzjMySFir97E)*$r6aKp8CAh%5T?Fm*Ycj70L(`~?xtn3W_U z;cF&Uy2a@)#;*>-knCgy0$;H@eYr9ia6E7Shz9QK!c7cQ;W%R=&bEAB*?Q(Po@tji z@4NCYts!O)yqV1`%b&PoLW&UOAG=ID_IUc-eeUUxQUw|tGng>3_-h>C=xfBr=)jt= zw~_(9W-J>SEWi8o`cWt#ji?OFAtnvfTQ{?i8T6e+ve)(KQGzz9-L-yaIjT0FWdQR5 zUXKbA59J66CoK4Rd}A`xJ=eW^bT+y={LmRX1+CmnoTb9!UwW;I|)uM`3h+AESw2_4R;OV2HM5 zLaNgCp;Xb4ncwd8L%e&MNUTu=@`s0J;Pa+OV?&RjZ85Dcme##0A@lfo*R81A*i8)+CLoi z;PJSJyYoazN(I#SlZc9_YMzc&m5t-1bq53GS>c%k@A03GXa7Dq52V5Z=%}3q)hqs# z<53EQhqKfnI`DXP|HsJC&H-+Wu)xAP)K9Vs78JlbRPgE{>qI&(%N^HR2VmI?pe;Am zDj~uOtRLbNKtOzxNh=9X&|l!kDU9{=v3^5;(O=9xaS|`y^wQV1z zsv%DQnOzqHIo2*-^eObbHuKQ#-pZtdW`)zb^QIP~a}@paZ+Pyu$J3TaT1TOoBQH;f zIye)fS+&d($C*_p6SKi-Ev(T5>Nq2;7Cvrw3(ImA01L1= z)+_XG5P>*Q`^Q-7aQE>Slxk7Gj&p!yGq2OS-XXhMJRD9Bdn^7Tq#ZJ3PVJR4Uz7+Q6eW71_rP&HEv@sb;TX`G zSk_;FIaN|5cs$i`%I;&oUVEJOBe0J3BcUZvAlZCOlCH0*?BD~LExbN$CUFUfmx4l&! zzonnj{Z~ty`8{?!`JGg$P-mMA3|NjBJph~jQQobe6V(~Upk^r;TE->IXMV7T z2l|UEV9fz%m7=%t9%67M%~CG8B^j3kpWt7y<+=DvO1caSYZ$-_(q8<;zW+h09kjI1YlOZb+|W~e zZW(kD zpGH&9J}BU;q-h#U39Rkgorbvj8%2mKuM;zs-X{meS4Lkw)D^67-7{ z>t+5(-gqo8q=GKt9{s`h{VQyumcp>GYW z#?J0#Sjs1-9U<;^WKJdF^%q`zarv^FAaECjS(Nvbq`UhuNC>6@YC-5J`Jhf4kcaCHvzZ5lpS_#6clC9U{5Gp{`~0*NcfLJ z7YbO5x%REi`f@^Wh1c)*+W$(lDC^AQuVt(71FBd8J$fv_9;I@c0+8;zW$bv zJF-I6cvV;DsTBvfDfHH^d;jMLDLuBnP#r57yd#W}KuPjyC0w6|&X&mj$_^|=aj@`1d>UEwJbauHF|_Un_=*DRDB#_u6)I!1uu!1IS+AVecw1?H6OK_43keDJka*bH zltX7VY@l~~c)dF=znkLRoYyAv?=MVrFo&r!CtwuWP3yP&O{9++{+6uvKw^87P02c> z&f0bVMoE#rsfW30CI1Y2#=Iuz#EomfUs97z85`~;%T=0sfI6|Ef48=a9~T{fF?tDX z+2V#T^5z8UZHjX56Bb{BLejXr$6(R`OtvQl{ErP?B za}I=j=!(QHlYjSV_m1v*w6B-xn4VJ~qSqDf&DXTLCLDlVj_?=mU%B83ZYv!C_&c1g z;=j**T8H^KEW_R+C`N^T9in}`@Tcy%>Igpui0iuoZd^v=91GFb; z5~(e;_~S^5NpGi3-`AI}^##p^Q%AdF5z~CVb<`Ce%C;Ia9o)#(mLmxNz=`JP>w&*0N6V)vK8fBXjzlPqJ*H_b-3Fw%1V?w`p}& zh*jR{dKT#6goI)K_Rl{U9wEwa7VUd8sD*hQw`gs)d$=5T?Izm4;n17p6GdGoNP)gONC(T+AdK#hSIi1Xn+{~;DJ2V5QJoM?dyQ~aIlGy)WvrigiGzajUx^E&`{~ z*!|M=OQWxW3o1LOAa+<Ba)2(+~v`$H`Zj)A7c^Fm&F zFx4|OE-4^dFf|C*jOA3N`%$7pZu^wnuVBcTz?rQut)VF?1=Pfe{9Ka*Vz<%{Q3xM{ ztKTE}D{LlNjV!{y84_}1S=+bHX8x*r^BO($H5Y48XCH2J4PD#I&sOFDlUw$UK7Xd> zLlA*GrG!PLdXLQM8`CYZ@FwlkA-&B4L|TB)a;?C6UP~H+@IN71jdfqg z$|MuSAAJUkre2qikEsZX%U-|)`ZP*9d^e}zs))L z9)|T3IY}t;MtD6(E#-?-p9UnrtUMwlw5|vy8@T^1ciJ3O$@dTMfbe5Hj?ir12{R~~ zh){Y{;;E11zJk21RKTh9jn044NS^ZtD06FSHLbS0V+OEb91Ccn>L2M#Od96PVfEzp z{r30ZuX~pZjIKUi-1zM4G^tL!wDDc!C%Hqob4*Bf?jP?MJ$PgJZklPQ?uQarbpg0f zJaW3lo~G55M`=o|mrzjwp3nn`!vmXxnQBre*q1u1`Q~L*^c;~1d_GO`M@pTxf0YZX z@i+Y9P1}XVy2ZrC`sfbheDp#BBdMwx`}7TEVv^6tNm3(U%74`Vx6M{On%Gc6Cz&rK zYs&`3;;)zmJ6oJlc?w9r4IU1b&4mQ!gDda;#EO%jeRYq2_^@c@3sp@`3>CGlk$m}y z0D8T5Aog1H6h!{&x#TP^GNx6jLSfuEaIUIZb<6X={u2DUD2`+0zq95X*HC*MqJ8HD zn_#+fppp%mcV?#rcu=&qj@6v)m?RH&TaL#{Ez1PLQMY{g_033i;K|EGF}+drLIJfj zix(Ho9B_*Rtq*7b)r~BLT?JCcRsL=@%O7pRn^0=ACk)-;g;{X^-oLHK3TR|4|MV{R z?}M@)n|HOw*yQJHI@k=24cB~pEwuXjj|_Bm@a7Lh6NeCoefAI(s7Sdk5+Mw}JsJ8t z4PJKlAp*4_9^(SuP!}0eu|E)*>Mp3lbXesq$+aV*$ADm*uIP@JT3`z=?ZOY4@V`ae zMpI^gCJ80lnKt}O-6b`+@MB|(Zc7i14TTgbd|F6TF9|(Df?@uy7dlQO(Vd{+G&Bs; zM(QrKmOjBlR_`az?eHg0FA3ly_yuR>Lq?_$Q0I+(J*~Xi8GNx?88<0+EY#U9v9MdG zu3NIFp`oM!d0`_4GW#m73MA8b6!(p#eCTsgR*c>`xNG-6k}CcaQ&E>^4u>ByZuHjW z5ui@ozt3v#wOW+6oE8U}Fa>4(1Q{_+B=l){Nz{fXg|uX!k`RZ&ed5tA-5NMT$PjRx zn5Gz~Y@sS)b}oceu}Xdv96^r*Rvww`-benf!D{7sNYX1vKb&xD|J53^RDn&4JRwGg zU}NpF#S;Rp3I7fG$X61u-6^rWAjX^W z%zI_qyO3BpWc+(w%GE#_haX!u%%B&!8>%=8<+MRC=jb6k)M>S)Ej2+JW_Bx3SZCD@ zA;gVH?}jq_slu}4L<#>+!mOj+#Nrzct&`}?K@~>nddf#Giz|f#gfe#=GqX+>up7n~ zLdyDE7WNNdgSg}6`XyF$l}6Mw456lp`s@i#kF+jZ&z{W62ew8f+`vKQQHnIEtMx7tzulvIw0Y#XPA;XBX`0TbsHrv$X{+cj~p}#_e>bibd8-PjO zvDfn;(5L6vYjmHM1>YgxFZ_ch8LtsK&RnG=rb|-YIcCm-2yCCiih3dcyA;iA@P;(b zny42$CAQCg3-RRJ$rK~|miq|WOTx)*5l}LJVq`3!?&_(2-(79Ip)ZX;sM=$AfMoYw zN*4yTv!OwS0k4df%$kh{g*!Hly%HKwL+d6h;zi>Yhwk?bIkv__%S9*D4J*Y2Rm4*| z;LJr)j7o};ZqgDCR?~tSKuGK+Bg<$JTa`aggwJ*rMn*`b{oRLyVLSOj;%o(kpnf!ZR{vC7N}J)RQSXOA@I`N= z)AmJ`PTZ6aw(tB_O-3!}+E7DpYGgLTia&< zT)>7hSDf;zZxjX9SR65!JC}$?%j-1mYPHK^;lSCn4Rf$fE#UeVGVOgwF7022X2ymX zp4-Ep=Ha_ROU}~5Pkz5FpZj$@vh!2yH_;^dT?B4Cwgy3pYzm!f3`0nqVgl)#3XIj@ zCWFy8R%-^)q6I?iv6-ZAcFpEx{k-cLNSFXJor6#9X@NGQ0!L+6zkm{r99f#^wId8o zK84gizX!x*mPl`M>#H;#9)uST0dS%iYnCzm5JFjx!$gDuAr^5rGkeJHytuNy^1c-{ zhhl`i0hc+Zmnl$zm#uk``qpG5Aj@+5Hdxwml<7t^Me^0Lnf3;eFxtof%nEVysg2d zJ-ZG$EJKz%iIV`2C$U#+3vn+`eT{2Pb^^iQC|)rN6_3&~VlVLoZ7FU^n@BPoGYp>(k#bv>{53*xGxbUQXhNA4F>A-p8H7+xiUKt4 z^rZrhsrorXo?+Xeq=hgwJ00;p({Z7WF6a=z2sY6GSG?$Vk@)Sb@HM;B*Ly^PQ)Pf| z5ljOROWa+i#GC?E(gQPz8VBL8*y^BptBV959WmDUD@NG)I!8eUGj-7J7x_4{l9F!< zH!opT4s&b47)O*ca{Kp0n2T+H@I99Roc~457HJk1M=DwIe8znvSo4DW77juN?^O#z zFztLRh(zW)dV1z;&n3(z=YJxFKr022Muji{lPJgx$~B+niDs?-pqjWG%I&{fq?skk zIKyMN;^|JbGi6Kl@O&`MfSrn)xTSoa`yjZMwU(|0ciFika?;qqXAj;ZvS1$7vfhbb zJwh&YhIcYTD0~NSC*O@KHyn7$?VV0XM->mC+^qP7Oz#nl6PmQjS{`xLVwp&{((1R3 zL=b){Hl{|ojC@OY-B8RCml3A&{{WRb#ihg=8?D%Qc3if8>CmY|btfm6 zE5SwT#w5fU-F@o{ehCWhY$GE48E4f0Ho`Yl`@fo1lxatD`~LgU3!cARLEO)_x!9Av z2`kUBmZoAfvlLF!PnHzqs}T%yE4xKef<;l(lOK1~BPPx80sg~?>q-ox8W@32;y)$e zFZpE8YR7vT7d*K>@qOE?Ym8?U&Yj#Q&tP^mgTi!0jJOa(OI%(yHXWTg2FSyEsRSNd z3lr0OiW&M`@&Gz;i8|D#Tl;h+fQPk*_$R^ihkMkG5ef>b7(9iKN|I=;#EJoSihnNqL9j(EQcl6bXaAeP3GEE-INUMUpjz+4Ro}opYMR{P0aqIv z8popN%2H95E3t)~cXk0yOB7L2k0eHF(4`4^C->)E$?#bhAMATt#oFIr*BF1>ww_IQ zNFM$!r$QMg$Z{Fmq;hCA;OAXDll!KWV#AT_x6qluKAo=!t}sAx|oT`Kv$%;JI{%= zV$nPvwZJ{}ZCbnnYF`1dm)XbCmGXlP@87x(Ki{3dQJIAOUKqG_dTpyn5qV?CvPDg# z$rK9oh&9BBc~30$oov9-#B4OLcl?_$5*@`G@Om`!)~KB01!E}-oR==F1G_9ZoUPHy2%hLDl zb@G==Kh5J-xmM3Sj^dYx>)5tX0V1{5lXX5rJc?nKJmN57-lFdlx*8=laUrPkgdb|Y zXv`EJe~WIj0SxUV4uu37j1Kw4qrP9(dSzcIi5OVeGs9pKm(u(~y6sV0UP9MwSI{@$ zlx4>U@}`V&&kaPxkj46}M-XGDr~%UR8-6;W;ZW9)4BehN|L(0q(yg7Lw3n`{p9Xe; zD}MIq_Pbd8WV-pBh%pY2o&)Lt*Yo z{$MAaLsP-j1n&>vgK=zNVRYqW`+vz31R!Sycsn|2jy8&ziI4N?e_fJ42_S!N#dEk^ zMSndPHs9s&`PmE9g`0-DZ4gK_(M4}F)>UvmH*nE!SMm){#~qRnhmkmL;wD^4 zFereC;SD4mx>=Ob<`lP+C1zS1maNYAx@H_^Ncl8cITNpUejd~g=R}-)fT^fXD`wvf z(nQnZUo=~4KX(oo`K<-h9#@oL*2UJ5J&Q5M{@a0_u?)?%z0v23e{EZTjX!uQEM#%b z8{PB?bk-Tu^lnrD{vj*bl(~8tGKfeaQj~}g$mwtpG926KZ-3B)%(`M<`IVa=LUJhO zg)th)quGh9htx;A1253NuRx2c^v$|T2t?xoA28ZDw|^XV@M1m)HT*iC!ap1)YR$SP zxOtSN8!S%S%DDA-?h8QpY^kCg!&O`Vp*LEGfg;x0vjh>m%fnTX!fE^$sh(t_a)>gdXuU&0T6R2h0GWO{ z$vcJo6`c4;5BrG2H{|C^>Jk89B<62?&4{vF0M>&s zOMz&j`Qz&rqvNJ}1zfywOM|iWz|S!kYFfUyBAF7t{I)TcGEPbi%Ijf!#2NxRI_GIc z-GF#Z)DlFwmOsS^YG21lUa`);PsI3*FN#mCBz9AHFqXgg&8$}0T*PjJ$83JNcJ6il zlUKFqAwIpVlu0h2L#oX`uoQ4#Pk-2Gn3^F^DuWX78 z9Vz$pIEXwN-%be-%0l&q*Pv^SwU#LL^%O-f*%=V@%C?U%ck3brr>ko7f5u;FzP`AM z*Lxg(+_6)SvHiN^f(^cpl^YSfru^*y$6>Uu^q=W0@AZXBBkLS3p#oWFkIM@{+m6|f zT>B`X?#pjgj3mm`Kb;E{)ywi%E+T!I#Qxo1=7mogb|M4`ISBXRH~?MT=SR}KVM#?o z`z7*lKoxX2V%DQ_bXHN(oFvD6Yrz~RR0mQHuHNOvO}$Od9P|emyt)S==D6(PUlH~q zRV4H=?K>V6(FNvRcG=i$gaxxrBh3w6pLzeDsfOtoPsCJkemtcF0ZZZ5RxV^{wlnu8 z(V=s@$B|GLj2I^i_WX~ldS97VN9J1yDf6g&4W3p~2!w*CT4aQl9)d}MrM!ktUEz8{ zaBd_(7T{g|4}&S=&QYeiQLSmqJ`*2yd%=9CFH>wB3%40v^Oxf{0@xSP4StK`5I%`& zkHOFzJ0|;Md(PaAwRNHW+dmJm33#yB0fBwo2I6@B$GF8;u|2rEJnwf5PA0* zzt6{txG^*oB5SJUp@})Jw31b_*8(9AyT)A3VK${Cz+`*mnBhJ`XNjiv1q*%(Ij7AC#ngl|{GqdW5ohQbl_RldkrZ){~J>+?<-xWX7P3}NUUEo z$sLJl{q$c=jQD4crUkpN*5M+Z<#Y`*?Jek&Z%(sH0A3feEUOIs8n$@IiF&1w!&_r9 zp>@jwm+&Ft&15H-yq;}W>mH6j$54wXd`IT7S@=Y0TpZ$U0DLq#J2m1CcOL=Cgo}FC zUBXl)r*%=MRWjdx)l)S9E!T2w=%yS}9N4@jd}|%S!1r>yi~vP=0E%AV;8Y{u@B)!X zRqPw;rQy`e>LMLQagRQ~oy5i5DKzx>h@xk9+ZTPxYM}&3T<|o61TXr!>L%WT7V-y#v__|fdms@y_1fs|0xoQ(Ttm^$=0(GaI^2^>6RtBmmUPdUNlI+q zr9_!}rx9Y{iDthBpYHgs)c&3`tYk+MPD&p+h@_xg^^M07TghDfB(u_79n^VZTizrs z(_U1^3pl_f_|P|gX+s1IrD|(?T92wG9PG;xaF`|$^`@qOYbgH$0;*Fjb|CVhr~bgN zYrJ)X=(8x?8+4zCt~o)M9=i8P@8k~MrmqC!qK3_Gn-7hkSVwX80D8_~TOkP~Ft#k@mv5jN33A${YJ8iLeT&3Ka50=KrgREc4n9;XW}ogtFgnj5Gd0D z2EJ)z>fVrt7#RK(N3W<9U~GjMra??J^wqFM0GHr0O#>k?Ygayz%;Hzozp(26kL_OI z(vTwR{UkH2qQ>*cL{xZB?zMewiu`!o-zxrGI0zmuV>?_2rs-3i2%U}7n1xGwou9KY z!`y3aUn zTuewEVK?dtu+3wqF8LG~D_(iyM)yvC@18{?pb-LE*JSd}py&RJf8?z-%Sx!eBeS3j zia)4DDmz^rn?3XFagiV-0PEP}cG*0^iv8e?t5Zj=3zO&2G-2Y|N7Pqrz7rt9LzxF7 zy@|u~m*~H*)9%c2hU|%EpS&N4+B6$OeYgD#>W68O>AHU*BZiJvn3fsdF8&(Pd0uj= zSrAXZg$yd{t>w&0vH9?LXGj59$XuyKtG4NXio98^0m3pRiI z6EWdcmBg5_l^Ayo()*r+7(zu9VtayT2-^opP6UxNj<&1Hw+Ap;0t!XMzx*3cGXL_T z7i7)+Q1gKk+yix6#UC*lH_;An$8qs=XU{oNbPW9yKhJB`7F4f9&Hisi^MHT?+frK^ zKwSyRR5a0YC}uAIQD zp5lWI5vo`UUC&pYH%B|W*HgASIx+o$Y+PZnV!VuSUKMLnY2yV68u+|1ORqt4d;2O| z#8@g}#tWS?Tp7Ucx0%ZZXc=Ts$%wVf7s@@>H?Q%6QGu1Uzj`aX0)bBZgAs|Ng8oetVcgNRg_sE#sO0N?RYO{u|+T)rT(aKuYU&(EsKKp zCPVl_&_ejvK@P^o+j9a|F6>&h^9A0*>nH0d7?4$ci~%ecmdzmV;RlZSRyIifcpa_o zoGNA$Ow-Ko5?lA59?w09oxK9gU@_ubSy52rZFQPd-mY_jNeU*B^dg?Gu|C)OujfBP zm@oK;&9Sg*>5e@;xdpBBIfqf~hVbzIHWS~rT5MgqJxFe1ws!LJSNQd>`#*Vy#kvY( z+5!${ab9CxDFtDXVOE-Dz&AXMB$TbpFiMWNlQ3Cea?pvAVs>vvsUpmqIF{Boqj{g} zHVSV4nt%3xdGTrWgTCrr^csjPVYC0rf?rDULR%9{V<)8hnpDKD#3gH8BQg_Nfif(M zG!+r)gCe{))RL`8tAYZkWuC5R?UokEN#~_*WJ=&N(KxYp9b+3^dDKV8ZrhGWNR@t} zQ7t23P17vBx$`1tVOn6zGLu$owk!nW5yCd%uKaO#_3@3;G8-EddszOU z^$MHYrZ#brv2Jca1F?IP3+$(|=3{R;=D@=jyS>ElNKQIF1x!_nN6D&L%#xCKQ`J!T zei{TZf(LY2>Bz~Epst_D&8@B5SDK@|2wau8O;JUQ5i)xBksDb}b!DvgD0Afy5vBZM zw4qI<5|PADhuq;I0&G2dnZNn^JvL9|sU}oT>r(}UcF%VGXQST2bCP8QVU^%o(<&l; ztKA=KQUyWQ1=bM|jgIK5vSx@E4?uLN{hV4EYt27!yzozOQLwE;p}VG;xa&BMk)h9P zRN~pzzDq9(?JU>N84eekDyZ)UOL#qLe2DaZWIUDd1R~wkf7^J)iBd;E6Xtb!2O_Dw zc$#@Te)LaGN@D2v5tUL7QH$au%3t3KJgc{HIt&{O)nm3yU1iJ0ZYUuHowrFsN1Ej5RVbY#1-oD< zQmEZHrk7Rkf&+04iZId&?wbF}u|8S}(J{cn8p3r;+3SJ(Om@mJf5bn}i@=uIVntN- zDxl-J9Sgb9@GFX>z=v%WM`LZ*=2|S;XqxFDrs{G;g|J2+gjB!nr?V$(5Z8$Hs{MG+ zo;Ty+!%ypdOezl%&L^^ll=!|dURVdWlAxYf*X-L@=5 zV7cDUo-V|EaGP3yWDc;(J61u{nmxY(S(&w!%@3a6m`~1BuwCBJWUk`OPv4sp;eVrj zqm^5IOExC3q+7oXRa(~;LxG@nW@c(qAeJIEesy_&0Q7|N#{fM4dleChX?GRj>~RWp zmkUyR;Im7>{2AJ39}9Q9_9&FV#%#1~m|TV4*iKBinom&?{LDm8K;e`cTJX%2WoPmH zhgS=#kpS1&J;F5K47RnoskfvpoUHUB9pqj*L7-0Ql;RRmq@-DosqD=l!-yLsLIj1J zB`gRiZ(y&lhixA23nVfe9FZRyh;hlb2^tAr%X(VR{f@w>8=cB@1eeoCkobNEwr42d z?Lsh{hW&1*I_!rsyrbeKyZ9U3BAw0|OR{6u=h(F97wWJK>pD>-7tz=N6%;1`=gqBBVPRw5 zcRxtT(J76vd@sJDBy8Z~k?ML|K;fw{HFG}NiJ?dejHGA!k6>$y!98;#EU%97@+bYj zy!Ls|lhBB+{&1Xa2i&v;2DNN{%AXWXKfC|F9L{11PSf_nY7Z3%&#rF!Oo-nHnv zNT4P-tC==B+cIj^=#JHrtX)pF;{&L2KR}oB{aAbN=@Uw}x)D|DtW`Eh(l+?IO~191S_sCv&t}+f>Uq=3%z)9UGuB-;M+?C3DLR= zT!Z+3UMP%=tGMGnL85u@5#)FBzZa1ht^zs-DbSHsB%-`rZ|uRpB=qGS3E9Vt1#t;0Oun6(lRQqt+2)(*plH|X(*6Xf!*KHjZBtftQc;$qAZUCj%!1gHqmb)K+BT5G z(KbMa@lbARdEzK}f)sdYjXCF%dRJ-F#3ht1kLa$`FITp(Wmun&DkVAF@3Os6C+=m! z+4zjgwpZafvzH^DZ`wwYX%ksoUfJgPE+TT`5Q!Nqv!7gHj8{~&xwE)+|0(no1EYws zhKiC^BP3Vfj=%crn(zeunJ<51B`W|4fvmL#>o_!!XdD`SVTB97Lqo~^_v6y=`)U;? z67qOHc|<1eB2@wC?h6R^xNB@l7&sM|_rG-Xi{7XD4SWh&e6!MY@4rlc>Ce=J;iImy z{dPc(6rR!=2d0kO|5u%gfoc;IG{GnRyVpOTn=P*yIc=kKnDM&|^fcYl0C9s}jV%|u zBgj$d;T^M~Q|g;&G(||e+YBVL2xSc5$*R{FEkM?8-RX`V2Lai}zJV zD|D6Q;$2Jo;WRmrq_f-631uZsl0s_=1~#A!owGXGNEoOCye4n_U;g=oR($qBIq8#$ zJ$i!^0A&wi?^#W6P&(NZ+Tgvr{I;Cz4k(&d8b1_m9w;2?P<%)}v3#h6JX0Yl}W3jW{i|5eWuUL)J| zUN4$_DYcc|usRQC9|Ho#oe&1{aQ|$Lda&^FPl;$?h1>7EJ=9j#zl`I^^}tg0TO@E= zBQ}J)1Vku}v&B`V{d6v5-0fV;W1XfMO^>K}pCYi<`_CncCiYN1!=YWWr@uz%S72h4 zvwFOtk&To+NfGEU2c#PwDyS4$-E%$)ZBQ%&w95a_Rf1;Tt1szRjOsI?DMH}>;EtGU zF9p`4(tm(MAvMP5;KwNDg6;PFtsF&|01AV=Am6&>Y7AOibtL^7`?=!@a4JK0k))WN zPl@CU2KordJMFi;aTp3|Ikck0=Y8QF7rfK`6?3*8DvZN-$lPi-jbzMGsEG{cJK55& zs*Kx2H~%su$Qb6lxiFb5!6i|-y10{ZZ(jggPn?BsM_G$KmNR2#FN;Yc!?fD^y2>c` zjxRp@hPnE+KWrq`SVM~M^jUoc$?PyS%)HUt2l{SCVj<4D?a9mCC-vYzuS?u`7ZI0P zP}iZSp7K?9CKd{2o2D3o-GHw_K(B5vcL`kMIgaHD-liISHg4P}oAE*f=CCfBYAoP1 zb4}yoT82(oXpd6doF9tW7rsd(?A0EcU$?>oD}bc$SIDOJw`OK99z#)eYj&vR7(f0m z)Af(dU#cuGr+6*<6dIlqL{~Hapq4Nf?$<^~aU}3FiKU+Ub3|JbTXz2-K&OlJ|7c}X zX{cR>M$tq0?$~Gy%Ll+?yJxp^PcXh;|E6M_+O4(*!TS)02Fuv{TmprBJu^XHLXgG& zNOgv7l=f+fSuHWKJU6$-uAP7Xg2@Xs{sXK8v@FS|I1K?2!b+b`Q`rh1u!-0rQK#j{ z;tzp0Gm?^0S~99HED_pfmgGKDs;eF}g;g|1OUumHePNx*dd#c6$f{OaN`j_5Y!-}|D!@(pJv`d3v{Qy*CKdos!)fg8EuqAKM@#gKm#82~8T=&P(A(T>Jimgfv zVv8>R(8e|FOWH&H@c#VhrHU?PNv27y^)_9@t=}WCvY*neb@7IL+(roZ6ZB9kK7Acb z&~jX<#hn`|*?a<9J=1NDC|@E;=COH30IgF_oBL~dg5EM!vf{E)h#;#tMt^S3)Up38 zV?djs;)qU5sArM=)Rk676BFq?~rU1-(_3c5lyN28lHCq%SbKbl z#+M2*lv5D>4TBXFkAcE5IAJbgf`w^(KG((^QG(mLfmU0&L;cT3e-87e1nqnAt5=p#eVoT>XLhaX17_i9>-< z)OX6*5%h-H+)DK_QC`vAQCpe>%1qvC5@@B8zP0`L_bMUNz==qlsc0B;u3W8FS(kR~ zodU&pIppa#-n`!@PhT&$iOP_KaPa@G`G!)k- z>b_{f5>C7)jELi(Y!&B*6rK{_MSH{jy$!jr4mF27(nQy0P~P*vLKM~DOjmC|p=tAk zwGyVXl|oL%a7L~3d{;-#=m>8dY{)dD(LqXP z?+W$K?>DO6=kBvFnTK+=Oqg!k@#yMfiA!qQhnm#pIT1K^6rl=3K|#5L)s)$MWPLFrq!wP|Yy zX1+{jU8HX~K|TrJuXAm|9`ftf(_6q5pqpxI2$MNA_;qzi1XMYjH)+m+aygb6Y>|mt zYzReHI;h$m{If9{3Es*wJ8`T=W)b^~f0r*n1N|c8{=7~#5vuGwqGO!Cvs3`L%2h1MP8ALDEENTSpy0**neZ4zRFB;?seLb}}^d}(C zls;|(fwAA8fLkRzq!G0C>CSPH*x>(^tmz+-(E+Q8lPkE3P`1fv&${5%g)m^8f4IDz(^k(i?P96{ z0;O786^A=&9mU#?F&G&{G3;+2$kw>(s*sPGg7s6^;C4p!B5C0Ljm;&SjzQM$W(NsA zI6+E2hwYqkfrpDqPPXBciY0>BW}xCnmXjhyd_GCE7j%?61_h{2!J(5K0Z7&4z%}L* z{@?5nVP8$9N`#o~_*%J5%}PRTyVt632lhrK1m61ge*PX060X8r1~%tt^Rz2gn5Rrp z$7t<;dsKqQ5*Hs$j6y5FbP=lx7->CLYQRmj=R-vze|QVXRN{z|o~aEz*P%R-%M#9% zDT)}e8*LqCAM>#Vi`n~Ap=N(2^f2a(#2aTaFEBWFUzf;M|AhRT1;hCjB?@GH+5je{ zIR)OSkHK<%SgU(Y5d1D}ogK%Fq)qfXo$~rI4frZKf^*PM(%$|qXtt<@s3(Ky1FDLO zY7&po2!`|;g4Cx}%#;~2mMu)5mGAE|TSgDmw1N4QMB!tbYTN|ZADw2(`U=|L6EC@@ zO21{V6k(=vFj{UXOjZrYpw~#r;K8HakDB6TrzzQzN|{hTo=iADE78A3U$FDQ;Qxm=o&N|V!Hq;7N|B^msS@JHCCZE-+-Q$S?rtE{far%@>K zmy{N^FbL{pB944DKl{EyJ;~UcNr=r(Bb(Ck*{h1?$kf}}eYFa2Xc|mM6dd|lVhq)K zhKoFp2`G2CF;N|WZuFnt`LU9|#Axj13G4b(ndBNUd>?nBns9+me$}Hr1|Bm71)9#Sec+(`r!f0s?JaS)d?2j9a^}{p0L0 zj;@;E>zehpO4DW-x3)ZE>&&EjghOeA=@;?VWCBd(E~@Vgxai_Z>&RHB0_t3+hg@_r zVe{-J0t$F?e}KaY6N@IW=@*6&)#gX+9CVRf;eHaEYo{NSoiAH(Y>UW6gyDBj3qVe;bO_m8)lR6gt&~S(aLh>cya%CyDI;-i-ao=F3mT9M z`cmC2yX|1mPwC03f^(LnLj}a@R(pB|9O*K6RVM4III9e`3`00elmx4=$r3PMwo_r4 zkQfPO=C$oSdxYP#5n80vDw?l(+fKp&1tmds<-Uun z;g!z^2?mmx$=O5*Fh&1ltQ>tt9|+M|0fZSsQ)mMo6iQtCoTQ`o|LNJ!u? zJzKW4P;H>|3smqVBjet{Ud`f=N4%EF=@U-xVb&8&`=XvD{IoyIaFzg7!^mB@yvZ_+ z?(94f#|74xq7mg&j`)&(=7EbIoh?`Li3!=I_s@l8^;#QFs{!K0??{E2-Q(q!V^exS z7hfGb$0Dp-lo~yAVw(a8yl_#jjCrf$i1?9^NldxIDiUMT){aLnQ4_PZ{h_q=XGT0} zvk%er$DK|vB(;{42lL*~ZMJ!$s@!6Wi{X#4m+rz5e^%`kW!5L-6&EWWTC`M!oBht} z(k1>SjMXyyBPaK{KIBPb(058;ne4UHQq+_@SH^7hG+v%T<7L?a+rl6$!T+CbJ??lH zb0u(AA|`<3T_@PKxmZCgVc@<;7*?gOZU`uCp0}*xtKWmTrvpL5(t_{G$S~*pGMAlu zCqd#6^c}giba;Aj8NMu|LvN1gW+doczh}F38{ZY?0eLVx9POz=PhPMo2X4=RXI{M7 z7VQ&@uT!dv#@l~Ju34A&C;xz(KU2!uydGT3`65gny>-YmT39~ZQo*|s*~s!?Sh}w%AgF>0HfUU zXJ1%h9&l7x-b!2AaV1_@%K9=1!T&Y!OycKay!WmhMaeBDkSzn1CnZpf@AsJa6)pn! zLeMcJSAM*ws~biFHaj)QB#(YfRYC#+>$HNdSn+XPVabmDz%qK4ox62N6)45k^NW`8 zdc`6&=9aF1-q8s5`O*V73v&JHhXTW+ZPob6I1@L=v~mRS1<5cPie1*JTO=aUy*WiM znCq0k7rMNyW=~VG7^N!_br6lk8S24*(8=N8h}-sj-{6=guA3d50G_f9IC)ppw2k)x0$?K2q(&Sb{(_Kkvd^+g&`xU2jdE02{OS5APo zvO64c^FHfm>k9_a9{vy*x@2!)NU-4YV<1Hf14|r3&g}mGCcqu1|6SYbReQ|@oV=yMhjxR#*;36-BEyMO zz6t#%gSCrZFu86_d)GGvVw^Fet#&nn=E(v<9YGG_Iw4Kaj9?*z8lK28@g;MR9Cz_h zx*)(G8^$KsQa8k|Vnmg_ZAb0n5(snLNlxlicQGe-ZWggPyy|z_;>j}GHwzq%i@)Ku zb*L80xy5I@u)zhJYVJIoG6k*gQYylGYQH9Y&;?(-L!!ircM{5_ltVlb#!&}kSXjR< z`qpe)HQosk9;n{eE(EX*D*kzz$Rlo5naXf1;=^s}+tlB2fLT zp*Sv!r$>wU+oL{F>^|Z?8@bV0&SPNRqXjgVSgks&2`xP7(3UWr6KrpO8{bjo*k}zw^Y;XOA4%z$m^7eQ%mbV zDFAMEE|?sGR?7MT#tZntEO4HouTTpMfWCu;Wj(T2UtFVlHTrOc7_&jf)L#`(5`sin z6Bov~v58W_Q+9crl^%M`jAqg)tjg!<+UiVGlPRG;QxR*fC+T>&@1D*R>e*&NS zxi~3GJG}nq!o|)&ZZl17HDjf@mb;3lu37{@%F=NXNjIyK#+3?FczxDVP~WUgPcZ z8bqb#VGrzkLTjbqZwSlbsErI#rmeRfhcqzOM!m;87LsI6D7|jcZnOB3r}7L;%I+)P z(NwkVW2I?=IcD6cR|X`Jz+6vnN%pu-9g(Cx+Y+x9}xQi4{$*?+=x1tD1 z3exKat>-yqtUcpRX!3BiQQ%@IaS)XHQkkt{sA~(xeB|9*ggc9QZZK z74iZb%DlvDJholRC4`@_tdzx0)B#2?83fF-`jPq*Sx;H~%-0|4JNDn4O*5+FZbDmaY(S;r4R)7|h{tuaZ+2?*|L+~~mr zfT5=5fQF~a?p7|(!u_pJSbj_5gJE%c{b4prn0KIIgx7#2c@I~Wi+EO1>#tb=p{)>C zJaA=)!d#NMw1omflETkEC=6p@?xIhzuzQY;Sz$JFg-iy`E<*k!6IGluLgZswMO zp3R7F%wcO7$GMN>BrK->&Feyr8QbmBknn@Fj~1Kb&)y4&S;!ER(VPolcUgc8pvi=R z%%RK@g9c#Z)sPObncYK~tIL(+^l?bjP*V*RMTd_XXmDdb_m48t@jOW(cwyWV3;>P5 z5r`-C`SwjTtP3gSpi4e9n!0P3{sC!%8sQ9mN=ZZDj%1jAK zDo(BiznJuK(mU~>)7GT|u5|yUHQOK`-{8F#6v}76M=d_Nyleqb3(Eqa02cHf7Q-HK z#YDH#pH-$o%m`YIx3Rn1{>bDQDL{lEBzWhT6DXKYave%Q2ulF3(()VOkPx&gfs-0E zP18R+#r%me%oCix;?6aJoCBrvFEJ$|!uvNhg{o_T*MmgDB;)%^!ab<)tv8r>r=DVC zh?VvJF<*8t17i)}IJ3Ymo3`z6Ef!X7TkmF$eQ1xZNe99Jn#@VPtR|gTjQM60)9@FJ zuj4}Ax|W;M+5TLldenT03`9(oJ?)0Q|C;kgImBtx%$a-9x%f&XEO^M1A3ko zw=KT2RiJ$5@^-vc>6CiRcDy81BKEedra@R5YzN<1`+~+ zEOIZq_|{9Yj*xgz?u0QvjO=zS2~jy&qt1!x! z^JME6sHk_6__H(dRrvYhe~ywc_8JDx?O3DoZ?W03tqEgA-HA<77;yRJeiq3I)S||X ztz;91qc|(g3vfjt0XB}5KV`aNuins1{`)N zJs7)r3Cp{@9>re=F)G4ALkQrb-VlagXc*I7H-gyIQSJWJVaGAtVv7ilC5Z*-Ai1ye ze}n50?QKrBs3wyG5b|WlF_^ped`FWHQaHw^_%W)wF&5Bj83?^s>D*<(I!15)-6(+b zW_8ZtSWrd-+!n%ql2X#XtK#AYHy|Xj%w&e@YQupz#)PBBy>x;byBCY12r^(UF2yFC z`GY=8y3{mPWjq~5r=G@Xg#_D`6ToQK+Ti^@8GJoYUBn0<|Ecv{;UT=YeZ;(H<`ehi zUV0#B)=La^x)F?=pb$`T=bN(iMX-SWptY`GSx4UM5Q2n}Rvi>2WD#zTku_Uo7?XKR zhgGbzFv&Y6_Q(ypU9r1qY&UF7?F&#i8c1$~E3S|(wq~T#Kn)`@1*uj?kVB~M4@)~@ zgR~?gO+W7?J{eV!yLTSZuIsm+=>j*zs7@CN-^?nO(D45A=AXQYD`}{eQh}yPh*)pL zf7)19U?;Si6*3RX*3H9PAw)@%aj0EsbEN_<3O{Ve4NcQMy^QHDyYb%D#I}{PTEX_> z2A?r54E*&YtAD|WM@0W`#vg*&VFz=A4Q89?9p<2|{%VtSlMa$hjX6) zMo_TsQ19wQs~P~kKm`Exn8OoHK24mL;Zrc^boTfk$ z4uFe45eGnb1=THL%S5Mr;)C&jC%FIK>0u1#+>UK9oL@)!rz=yW< zy}M98n|C*v(HWaDDe*EhJ3158_ZRtVw!Cl7@mHXFl-lw1j-rteS{kWqg)5;KltUX4nt05lRb;pae~+qkFPa`Nag|M4>vy{g7rYpuu{i3yx`t%Wag8}mXhW@&)FE& z(vGxNfhU!9NBYkba1jDwlmd;k;AXv81UFH`B$L-Td0kydhk>afU=mUW3paS@)f;bR z5ELh{h~NH)=G_Z_~=qn#GdrbZCp;E71Q((OHGJT~u@=czq*yh1qH{ zg*W*knS^k#>-^`;`HpPBquoNNL`hCgy{H+rs;78kh?lfZC-rIsUQ$NGF3YBck%>{A z(Zs~T!T=gFfeGLY7X}@xLL80WBoGpkVKNpUfBafiJi_1=&w%%H)6n3iaKj;Gz-+n% zls@FgIl^XB^ZwMN>a>1`O=~uh6B1HA9xB%Ij0{T%e}||#JWpMw(W#ET(W(vz#4vG$ zI&R5ivVQY_P|{H6Kkv(k4V^^iDm?3l1Q@+MLkbYZE2~(?-vGs|W>?;ok6A3Qz^W0n z)&!t1AaJa0@8Pqdsp`xNVp5I)W9VE$uZl7S8L?s1 zvl~nYDEH5De&(nELJw^J71fX-Q{dtM;++wA8_~ph;G@cZ@s`Y%N$WzwnK;=-4V(9T z-y{iv)^1}h97a0^MEtVi_>0;pfCCovs(?`oMmM&ALr^0CEGPh_R*%>VaxAG`21I!2 z?jWK}>P?}CVGvDC1LlPxX=Z)sMrDI{WuPG-_N5766H3*0As9)`VU_zchu z)dSUZ0XPGIYax7qp*FqM{h+D(=jVe;!{jL7bZT~(KBT2-p(nAA#6gAgoGG_s8p+^T7^TQp{5#!p9gT)8P__ffIqS^ zJyFUXCGP3Evi6F=Ky=EzzFG@{7 zGc%+|8B!P)_K>g`0+S&OXk^t8Yc_)hR^HURsC3d|*f5)Rb~j!u_6TGZ%n^#kor{$# zRIjF({@F*k+SXRbh=FmOEqGe=oVID88mMtXpd!G*fpH<9Ljnk$*)UsC_d-OSS7i@l zkkzqen?^aM1f}mOqNEHWFho}o_-I}dyD}0sSK5d`2j$)`aAm(>M^gH3% zy?*ade#3zd=kFB@l&dci7&0y)06F3wDp-uw>aoo@oH0UPVoK=t{XCTMp~bYm?xz`@|p|nw)Qv zjE3Vcopg^-o+yb>$Z3b+cgK1U3+n^4__3|mxXQUrv1evLn{feNL>Nrs@TaZynUB7o z?z439%$h(0oC~WSs9I`vcQ^>(bmnC+F#p(}kA{vQhiYgVq@iBqdm!xHcJ#!u6O`vI zKcb`Ud}Kr9OB*rgXh>vC*(G*k!G&3JFBcI2sv#_-j zL!jkUb3GUe4~;yK1d!pHOS}4dG5K798Fv;{Ix8KI;R(%?#ZF&Kf7)N04yvq8i*mC$CiO}WFUqGK(p)u zC*KH)wa6pCv zXOv2Lh3U2ej?r{fg;G}DS(G;)JYWzj0Bf%Ia znHk5ULPKw{VC_`Tq_KH;g0$)pRV`=$V!m%ID1Zgv)o~ZV0{R`aAiiA{Jut)96G9U* zI+@Am%zNhb{_yVgZXal?HT5;-_RgNFOL_ok&XmLaRn{)24u}hc=rSE)wT`s1No%NS zKt)G`umZ+`T|sqlSmW!2gOl8_Tg?bJwa&|Zo!VkFjUh|N$z(<+fn!m1zBv=plyY3X z`aErq=XQHigcMX?)pXjh3y{gMmon_7WiuIoJ(7kD3o#iDyBFOIz>+z%y8_-~l~a9w zhqBfZL{u_e%-gB??De!QS1T3hZFup*KMk;MfQF$83=|ZF0|*)*!&z*+#7EMknvu|Z zRMpya*dMbH6`vvC5a73eu$N>6;)2J?L|aA8;Vr*reH~ke`HY7dH$EV5@)Df%^qG|x z&uw{>2R#G@NI4$f$NDs^zJ~?S6QAp&%a2?@S$zy;0Lt%oh16j(X7c$*2b=Klv875= z4M(UBEjrDfo!z0;?mZJ+z;)vLYAHNNyHK|%zmqJW}9!L|3el`^DBjz=Op{ibJ54%< z2CA7n%Y7ZhG4xMv(Gc9J88XlSM|ujE4%Ww2F4mQoxTR}1nGu+1TnAPr8KI8>lf?PV z6V|Pq@0Xz1-gkRFPoF+scWaxa{qmYGvA*jI^tyXCKX7koS=ZQ$hnF$jUu8UN^_4q> zSZaICJI6imEqjfz(ol^iBrHE5Obk#jAO=V%7i=L0N;f~Q_!0u18geup4KYf1Kwlq)l1W71X zhu@h!<|i+ilYij_$iQ-P_A}1Nx?igdc<7mpdVQ!01R~Kio=oZ8Ak*^5MMT!S}Lv0(JIB7|1JFJ)e{p!4*q|!mj6i^;Sj(?a?Qv@)B6#a zyn?*v?N!&au!80pYn=F=872tOMcyPv`+sfwJkN;Q<7zqhul${?5W){nKZf$rEnsmu z0|KD$D$@f^570n1E~z1?DOhiL2t}qV&RyPA?_TYrQ8uB!_`2wp2SQA z9CWgkR)tZdeG}e~)6*${0~RB%j%!k^&I${#sAWL`uL@X&3AMno4qD5)>dh_WUO{ks=@p@` z5btPABU0!Vv!n0hJeEQc!x7XG1~N;A%!c!+^VnIf@mw4kpRy7L4a=r(*)ZR{4nMv) zvkNf(^p8Hup@$vps0<^fxGGomMf+g9j&Pq0^T`qoP;`H6=h5D*zt^T527GPE1~*#iG4Ri#iwcsuo_s{kG458^mtitat?&(Ez=dTCcu& zx1V0`Pe1L)iM85s=EV{4s+|?}vb({na*oWyLdK{Y$lDMSe#Pllz%hy(($I9YjvbC* z8*hVOoCrqCyZnw>fFtm25HVzh+2rMzvk02_$vE@jVTxXUX$=w^V_%F30Y#N#TfhG- zUf!<^n%!kdy_-@-9U0Z?5EE}^V-3W+Y)S`KvoWxcNsmzP#)3Brgurn}+<1o&O+&Mp z^6u02^BiU0Wv$Y5l!V;20I&dNMPZiBjOM@q6!g~VJD7YJoCBSb%0YpS2ZH+yX8;Vh z+WnlW+?LUh(qSuoVBg)}<_0$_cs(ePkVz)2myl$V{KU5^QoiW#`C79UYjY0RWhqUL zN*N&hH?s0$GF;vx0U4GI8NTuI@It(t&Tv^hOCKb}T`%Pb)8FV#Wiw~fcdz%mAK#Np zpH#_NB(oa6v14RN3LgZ@F|Q==>Ja0M)uD&?wmGP&`=zFfK>%!rT_``RW%a^&mhkpV zW=4@j(NPf)wf8!|7sz#BRg;fLyd=(KW|)9bMX!HfKU&ib2{+g{hcLjw0gafL|Gyex z9d(85DoB4>k%QqqQmE38ES-K}d$sdZJlq+aIf^f;4Ztp?aXIFH3qQ8dP0)Mq-8$%E z5Px3Q$M!Eiv9{Wc?$^D!xZklaH#qL|tuM}ys2M){A=kvo8XP#*DPG^}d)Ask2$R@O zx>SZ**vOas|JTU5Li)5y>&YQP8ebHSzAfW4!RFj zH4ZkGu4IdWv2`z%(iEkdrV(+_vv3H3#|B`QEg^xR^u49cbbWM|kMi~nJ{J!?Sc=I< z(*eWApM?^N+pn+nt%?T@#@E;mn0izJ4axtXAt&C)Ul9=!VGvIl&|zC2@7>Rk_VY|3 z*W$4;VcAn)7RW4s2AFValA>`q_ad+4BVd@KQrYSX&8(%_dku(yw{Z@z8v$uaa*O_y zoB)cLGLE{`;8sUN4@-&6A3cQS9p5vm;dr~MzSdeL27+_BIGEIRlsaV0|DT=k>d1oR zcq9@D@nAv2w>gB*W3REF=hI%FcCv+^_|85Ht3V6&0vUh;3Vy6Sta^)m}`WWsfv@XnN0 z#bAEDwO;-kdn@zQ0-1;Qp$tHnWitz#Ss(+D5kLSUAcraT;d#0bEL^R9p0@q8pDEh* znZKjK9J4%KtG+jus~zkt1|3kksbfA9bP2fa2))y)B2WW>fP^-%?Pk*-?FVdxua?pg zuB-vvZP6ybK}ftYL z(iVLFh#98f(H>m2L%h`aZfJA7ZVRb4so|cyUlx~KJKVKqT-9FvtD?WykM~`9LK|gMx7bwgKpE^>wDIc zG=stRO_Kh5TdiZ&kR-WXYPG#NBYX44@|23BPN)r&eCfQ&%u zUIU5DE=46IjRrs~*4nzE?R(HXHZ&8A_lbs0=c>ILAOm_vE-Gj;wA`K#!DAx(YFqLQ`ovO;ezmfn$Er?zqkxAGFJ~BpG9}L_+DR zvfCd`PjlkAzl7A!%r-72f5kRy>7K6^10l&x?2w$jjoRC4YD~z<%WKY$U*7s6?5eYe z7C?s0Tmv9xcQu-fM%3{F8^em;b!v;1qD)zoM)7-wEvCnNj~tJdOR9!6oP*ir<#XTV zm^K!;R5M@7j#M=jj=HsDe)NH+4q^yk?EP9!IkPOyTHMh^5Y^5G<6Z7&OTB)9y+aaS zIc%YuNfrPvUiH@u$PoK~v47(as}wDBj`tMB&e^|qB(XE49deOjZ@z%J|!4zbucQGHjBG|)7g=@bCeJ$1B& zdtBd3gjSy89u+yd`-fLL}6!$2AxT<=Pq z%*1|tPvFz`u~sWH_^FErML;f1dWVF#^#uT%mli|_h^buXxyRS zZvBIWn01L?(Pu>w5w4`S>3w=V92dAR2#u3`G~CUwaCG>>`d(V@@r7l)L&>7FCAz(NKVAOq}i2Rv{{HL0alBp8OmpwzVt^VDJUzTjt;R$H&d>pqXy6x%D_9{5y-1tZRV9cR@&u89no zM)?lL;W4#=!tXYfDZwh@sQYjUPq8=kY>mO8;TLA?;rghxvbPE5(01voS#F}5F$Vy{ zFv;Xs9_9=BHyTh#xPSNn(QYdZpvjkym9ctPDwR1g#zR0pfP>(t{-b3K{kfuACFf6KBxw3$~8+$nMLDp#x{Q<4hp|& zXr`)L#+EcA6{4Pv9UQjVK2tbal58+_K1&JPy|uRTzT%pvj8D1_Q)8y(lF6TZhgYp{ zt)&?N634feNr3(WhW`gd&S7`awFQ%2VFAR1o@xt>m|fjf88O1hM-ScrnG=P$MTt>) zS?4e$FRnCn;3H7WRo)NNK0Tg26b!vzFU&rZxpPjXog+YVU;qj>#&^g_;@ZF{oFom1 zqti5X-uN6yDl!fa@`B&%$r|o|M9VtQG&Yl`S>%(Ms98nx>b2I=(!dxezV;25VA!;@ z8i0JfzT^!#efj+#XdxWngiD~7)e%_Mq*j5pl-WQFP^cFHXHU@GM0bXm45P-VhUpKw z$I_4O$3eb5umW3{Ut#Yadfs7xf~y@niW5r^H}Vk&SF^2-m!^THsv;cj6!3qi8vo(* zW-m{1Y?eIJfPE(ZvetQsl#MMPc9}iv(*G@KaRkA>H*peUjC@d(nM> z0Oe_otTS75goQW7qF&LfZ7sZyw;@t}qfw0+b6z#T{>xHnA3N{Edk$B*b{Qcrf8d8( z3$q8p!f`$`Xp|ZESn*_Hd>M16g2;&HKpl?*9rrhF^T;v_%mj zDkHA|EWiS;mx9P~9ZiyCl8hB*rCU_#*kgxXA6r_xyZ^=gV;;)_3}m?NIEHq3#xi*o zJ`&7GHQQ$!@mHi)nAf=>4gs^v{$C7SSJ6Oc)n=joj*l(62eY~v!0B;5U%acXjAky+`w630;YjxZ&YX5jK%R_ zw!y}>xdc-8uGscgfAZ{L@=lg$ct@0Yd7aAj5SWa$jyq=gB?v|L>uar9nqhWueB-~U zw72OnfVz@+=I5N>|v!`rcNUBJPTz3SlQ=KL9Fq97K zjHp^X&;XA5!>&RiFO%0^M0HEl+)A_V_pA{DoV4+)iZksz`DtE~ygzEeHR7BZAhYN! zCysaJ)u;m-t9V)Dz{ms)tbAN-AObHWCf#YqOp>W*iU7w_>T!6_&{oP~HRRPhM_{;Y zb%f8oXXs;{1&%FbbzcRO@ysX;<)BMLw9zHFc8i8YIi<5O?&s_WBV(rJ~va z6;O(c_Kh8g1+gF4;3@keBok8QbHt4sUhY{Ti79x8|;Zis+Gr=9Kt1!8z5Gqq$9Co^%95a=pi zKWnYgqMmJEU)#pUKx>5teaZLv=G#DW&PfZQuz>)e0`lG`X&D*P4!dNCSr#%t42TY- zR~^#SicN>fB%=dOO?9$xQMGR7I)wS5H@yueCcoyfDCV+-(*ZRj;qLv_=DR z@XbxdDWGDYE=fLz4$t>9dr80bS5$>_cXRL!c&!tBa|3mxy z35#%7Ra9)n@L9R=I-d6db0A0m?+)^xiy(lbsq_Rm;D zJ;-Ui*r2jOdU8OB*|9;6t#+3Gsx$VBo#j#^j~@OXunjw@J^M1MJUk{Kv>yuw6OQ+ zPlojxk9Pt=-9KX~RffQE7MwzPTc|8!G%4&RJOwDImEkpDg^0r(?K=1s(CtG458AFqUsVbuH&(8L_NpGZO?&@W{{tDsdKgCEgzjA&1n@#1+F3$i)B|I;!UGl}md z2zBUwtyKufIKJ_9;!yF?^XQi%DQLTq7w>g052gAOhx4b$!4d;8u$jyf48iKaq5;Tc zaswHbZUL>&RBS*7AwSMq`?%0dx=98}(ESinaQ=*X_Mt`02MY(S?JR$Vqd>Mn5+H-Z z5Hp5p+nqSBNWIZ;jAZBG*IqN{0JOfg6U;TeqXaA;#b3NdXEIJOP;^zVwPr~Iz`lLZ zs`z;%NeN;G^~5tk&%_{j1y%@NA^ijHHu=|a=IDEE^Q)I0=sHC8G4wbi&@y*Y$YdC0 zAPTwj5bA{kDYyVIb@<)%aqqqgGpUeTI(dsS0GqMaCii%#3K*P`4AEAA;(Nw`i_PGz z3{Xc|0DK1q5}9O52qx#fh$?|DUbTK2jtEJ7lbev|KTm#TKS5Yks~2<(E8qzOVFjU& zVFN(GD*&TY)+Ot^s*ohix}S0Mu}6J;p`jp6Svji7m?U}S=*u5Mc$=9xP|KwkiGiGw zwU1@KB^00v2&C|oQM0u}VrN*(v*TqjH5K2&D_5c?5)bjA1+`TL1w=*pEO_cHnlzWI zm)Ai7TXpw0)N$NXSXEv6o_|`ykb@In-z4ojc?t^iU7 zSuiVW5KO!p4Tuh^173|RSaD1;0Vvcu?H~`_G?ig0&CXT-92GNEln^=btG-wk?BI;j zw19SagoG>HnlMt(X#?40Gyk|Yxd_fpRn2SsI3YX#4u!me=p0e)eb~rH8c}gfJ%-26mB;`|oX18fS}WFrJ2ZamrmaI;KClX->B z0O@2hKn6C$3J9rlb_$ypLFo^ybADDb*>QMfB%?dZir|xa1g#|*v^nR|0Hq8E(A#(g zv|n0*1R=uc;`p;sZl$F$_t*%IRai{cmE=*90Qz&9w^-_mCb4lBJareiCGs*e^omh4 zIGcQ7t+hrPU}NX{#=hilSEFA~b{&Y>*jeir;o92xLgJN~wpm)Z;8T zH0ylS+N8H?st-z9DWSDm@jhJ5a;;#poY6QSFOe2-y43w=xwOuH`YUT zvXe&-?`m!OXZZLo6nlKMA~7{Nq4%K1yr$V!ljzJOSroi@>1%083}9~3-}dQ3&y%ZS zkfDHTDDS^3dq-A;JO~1y{}!$?2N4a zi!=u&L^lc!k{5y?1!1|MxXf7gziQ|ZV;4~~JDN9UtrY@Lrw5=~rxW+sOv%Obtg3>$ z;+V6xl=()MbXWanea%`kOb#Tux!ifyl-GJ`ovG&THM9pMsNiZ>SCX?WiqN-nO)e@Y8 z<6FeVzg%lc$w<6JItIsq010*xJEYb|Sj4}NHV_|V2C5r-CJM!d9zOMadk$w})DVW+ z$i|u5#6nTUwjS9yy-OEX>3-CXtXJWH;Mt0mLy3;&q&JFF}B^ zRNJi^0f@5zs|ooaX0$s-V@pZG(eZJf+ikM0l|;Xu3S!>sFJ>>7N7N`6OJznZdb}VE z9S$=jOeT)HV%Ds+Mr#m6w~N@p7xOH{y=s$HSF6zGNz5U{+XQU1dOLf$Ec5XIk1; zE6w#iC!G+Ecd(`=)bcw5u0t)}$0sRV&h0-S9xa_?82iIywzV9GcZklqsTvkvUg{_z zzM;jRP9Y!hEnWq1U;V3Z9x;<-h8YsLMOD4lT1z7_0Vlb!?|D}A=y?(;L5MS+0Zb1< z`pc1mq{=|9pUDT@pVxt)Xh4Bq`qqyt_Z;^kW=p?-%y00QLr)S zZZ^J13PM`wlwoVqFpadMUxw+&*PD>B-Yb7+tq`C^?N!jKcNwCtMe{V;)5Z5jBuAi^ z!Qdpm9V2q->V6egd`iBt?c`IeC&{|GYB&tZ=^@3fhJ+?5#G?GJMT&xInku#Rv90an z{3)N5sWqMR1CBi;y2*;0;D&V;VppkZAOPHOXn}G7-K9D7H&Ctj7GWM64N0}u(u0@) zQY!#r!kkI;D+!<$FSqs8s$-7uJoZ1eM|tr$p?=299!ZFk$s`H6MbWQXYt0%VU^~7^ zd`ZX)(!;aX?9(~9cP(PyaT`LEMtk=8%}xf*wF9^hTMt6FwmOA08#m}_Mm+Y}R>gz8 z)kD1W0vnp%KG97x&ntWZatbn!7*L8RU zgaEUuMfUC`4baq)dHnuEe)UOMQq4hH*TFHMF46w?BDe9BubdZbw~mtXUpo#U_D0xtQ!kO?)}HqZYbTg zDohlE;V4uki3}=)(CMqtYLQM8Jjd)x)q4oW;MnZ~2-sZ#8^;wh>ZqyXINEmlD}t}+ zb?y8{-wN{y?#*fM=f661;}mCu!>@d&x?bg4Fg_>P_i0=>%PflmF~CMm8IMf8B;in@ zB?K!FK<23hG?_zt9hr1kjbO!jc5qX<&i}E}^FY%e5YCG25?;N92tqygVK>JN4B~a# z835#{9rTP>ay8kApcP*}V_adk-rREa?i~#}oQh&F_ir&Pg)m~T;>@2%N6ay9f(u|l zE-!Ce8HaiZnqelY52{}+354s{3x=K9kJeKbIAfrib#ivr_sB~5x!Ci2Gb?LIof>sC zo6*RmW?5o3unJ%nkCZ+~T~8!f=cVhTW~bRoQWf6m{Gb!I7*%JfTI}5H3}-ZugcNIpj#fT3?EnX1;p$ANAR^d#YiV}W{g#TpgWCQU0656zvg!)kV%b*0kX{ol2g zv@{F``zF11aiT|hB37N3-?NWM&fC5sNvcW6*)RH{EvLQV<(_$js_<&q-VXSwvqu;d z)NJ$xL@6FTsK6301dfV3>9tybs=xtEiEaQrg;_@hOb8@o6DDSU>}~1Q+mQbMR7$B+ zvUouW;gCCTCOX8e9ec0RI?&41Au!hD7`J++xpjGn|RcW@5Nv=G2~7d)69E=gb~8S8J^_U5D^$j){Q*64$wr zY*>NyELv;HlfEI%&fGk3Y|9m1PJGVoKgPb>rw(qPO+d8LT6K6ra_{R`q$eTXHP;s3 zI1%?O9_C5o5!UanpY)>_g(dR&S_;h1L~MG5h)TFb%uk)lkYAtp>wxk7*s z>vi{p;H6cqm(xv?MbTv3{wvdY(VN#SaRn6zY&JlS{WRf8IHqE^*3I@!8mn{ zCm~?!c09wNj#;gyF>I2ZVHhjUPNX>kq3Z$cW-@?gVZ*UE1{T;Q1F;|| zOsp=a-*|B9Gz>~LM)Je<4(TK!o!ool-W((70LQ&7fKw<@=le~7oIaZjFT;X1rKRn2 zM?;l5G#`zLNp`MhU(HsF7T+*Y8+G4R>h)#6U_D^xK4fj24-0^<>dh>A?5a~DqSqQ$ zB!*h;;>WKuLu%CYlk_Se{Dyms3x|UtVue;)uC|sIIuv!AnLyl;!c9_tL%uL{&oGcq zi}&g6Q{VvaXMD?BY;m8N#)M>k=TZRsObE2cWk7|an(ME7yU4buF4FWNCi#cxkFv~&DRe?6f9UHh4Frh#dhee4bA z25Tf^+{X+`0nqcMj{qWm!|b2fm{*3oaY-^?Xu4nhQ)`fbkX$Z>fiwHr_dyAWlMUW` z)s-YVWXMQ{I^=v;^NYTQdW>zTmfAX654I(GoNbKv3xrgI1UCfm4y7$TbCr%ke)S5P zW@kV*{Sq#Cr-^GOF~bYf4>R|S?EzuPmE><$1npe4^fibK(O^9Uo}`fn8SYEAqK^LA zPvS8E*%LHssxskQ>^!seSTLTGg&}p4hrCw3D|m5Eyq~BhZ&%&hkOLVG$A(hggx52v zQ|(2PNPxP*Yrg#EKpN3|pYn{J5Q`STZ`9rwf1m;1>|OvI#!JT>`rG{`QBx;fRrUJP z`Zro=0OMSeglFa~J%`KyZ>y=>p7W});hraX(#)olfd!Tfsqe8%${EkB13Rc^qQ~%C z3FH-+FF`3iCCJ_nq+nuV1chJ4(4aVZL-&(>A=Z2(zv>TwdCngis-M~l4VaL#{-p#0 zK*3#g-7V3cMwlt{5b%W8+unwW3;b~My3`4gDqDI7a_Oio|2B)x)Ce z?nwoki@Lxx4U2Hx^0%t@DJlFXS1_+ad5szWiHCM$+_c;?cuS;+LxmM&*i&i1xo~C% zVAAW(dZ~V0DZhCAzH$tfGkedN~$?I4bk_Vr7J{r;-(xG ztIzSR5t1Bsz7)=NbXFt9tLl~0l|itv6quq*0RO&6vrt>gr-Q%dJNp1{NndZ%$6UdbaWYf?jI`9#VkCQ8lEA zfm+MI7n-rc$~Go(rAwQmwLMyN+-E>lFbu90d;NorbKJ?!?Jz`#0N8_TTzaq4I<=re zjFT_qN;1gtb``JJ`5E&I&vo^B`W)?3%afdtK*~qprVXS4F725f_Z_l!8TbS16*yip zVlpb6kdVZhWRjL?V7GV8PI#qmc|#7cdx;Cf9@PM$z#wSR0-z_HY3?{Cj{mqu6nMs6 z@Was3yKTpVN;_&9xJh#Vzdy@U=2AMGd3z6uxaR@GiHr3E^RR=G+f-G(-j5hIbm;48 zM?|~b{8|SDRSkybGmD41{Ueqt(*k1Ccr)kC4C$?cHKc`kj({K%C8k39I^=Nkd6)*r z%R^q{;xTg0JoE^l_=9PP&`m}v)>EB5tJp>WfcxdQeVC7P3 z2U$fym4!_M^rSk~GXwDuThy^A13A=3hR!k!qxqxbelyzM)7bcYe4C}K?Lh>Pwtk^G zPA#uIUpP?)Xf^ZZ|4=rr%9kXGrwL#kuTN`Kp?q3;h;f^X{o73Gi4Y}DjF=EbZja`B zoGxIMB4b{2mpn+EL=h;uU!4uNma9*%=Xtz(JRFzfYekUQ z04m3%RXv^EOqeIO&MI&h6&Xj(r<@khkp6lJ zLkqKJmj0+7tlwUJ3{Xcr4pnD!M8G@APP{C!aBUAr9_aoscSIch^SBF}Ox#FFnEaFf zoJla!AL#YmokOGdTJ!+Dj=MQRD0Q!6s)3i=%(9~w+q1i@u2PPu z@kAM&Vtm+lTMRw>I)0G@nNWzAJnz;UEhvW$7)Tia!vOTmp!xt8_Il? zmQSrudYhQ!a_g(6TKs49b-dbOg;+jQzq`QrAmKvus;VR(0cvlrK2M*gBlZ|Yq9j5g zEof+U&z7dBm5op?DARy<0uSFdb2Ufk$B>>em5;N%xp95QVAgFY%uB}#V8b;u8CdTy zGNcU9qO}yKwlOi#d13Hp>!|3gGszc{pmVo@e9rJwzhl;8k&NXS&K?36v4E(q=oFu9 zN4dNZQ6^)6y9_2tbP})+#j83AaohHK`t-WmWBx{xo{EA%KsC@b>tn1^R6yTcKbYIs-b}%pl1sLR}BlSc)0*t7M-dxGC;K~ zItH^&^FDukRs$++{Y}ma6 z7F1Qga=P-3vz_K?kLzwN0}qmfQm|U^-nOZtrBXWxDm(#f+zl1G8k|?Z~uq}?(4!$3}Yr|3+5VhqOLyBq1P28F8P-tBmzo zPC*I8#NffW>2{iKGaYYfeH3cysT=$qy!BbEEDBtQQrqsVt7pHppfNjee9t@rh=ZSJ zMlnNrW*1O~xYfV_MQ^aC4D*c(0P=qP5+MMkqke7!N9R9YC1)+k<~UqG0FT1x{60n# z!RqS)t-ut@6yAug{y|gS|D7;WTCe^OSFg6cYvGY1B_RZc0Zg+=t02>L!t@8`Xx8gL zlr`*fde}1r#7zhzu{$QoNO5;}{E@q58gLr+SG+CW?va6JR%>RxW`-)qVD)ZV zOXdSs@_wwBByUfW&b^(zL8tg>9pK?^4RI=g{QVM95mn98v8u8#FDKLNPY9Y!jAYR- zUP{GCiFvR`GxEN9h!-E>zSA)Rff9jL);!| z6gb9bG(hW+=JVq{EU^H6w^@S70~eVg<|DF6RL8RN*KBl5z&aGKdYwt45o+7xdfMw| zSgN9jhZO;sG#GO(D3sb-`lEoU&4;Gx0jM%FsDsmLX;$@>Va{ryFk)E(k%%GD0~JqW zyIJ-7D-#1~&H-e|IV@l^V2EMP+Hs&TfK{u3PBjf`&V0Y#kFluU8R&5>#_41Ev{WUH zn_TQHTNc8=MOgxfX3hMHb(o12N*8}H^ro8nh28V-SmE$GwJ zXe|@}fPSQjs!)%%M=zru{Ml!0UTU_qY;-`05kRpn{L`e1GI{w)v~aPm%U&)hRFaUr$Dd0qNwDUAON&X=cwmz8L8L`8GGd_f_* zgJwG1`-N-(x);7Ajyc*sZ7<7pOXZpUk=Wo1S(<7&b6b9hwzoN--<&y5m<1Ti%jG%* zYjK1mF^mi0uI>Q?KCboBk%2{&j}DXlx5e}dEg$QPh5-x=wdL=YBY9)0w3>`9JHeaB- zoAFY(%A5W6$rx>H+zohkA*ic@7z*aFZ@!!`&@U*`b>4KqxM_pI&US{pG@_-Gmgln$ zot84RnrZ-FP^M=Nn1P-_KUcdFW2!r@4zbeOPc1yrdu7V9Y?~=S^~aL;t%mtA>mf+( zYw4)M3!YZ;d2WHe8~%*&-$oho#Gy{|Nbi~FG zjm$$WBq_a{hYi8#L!HYum^6@HN+})~2Bc zCMIQol!wd$ShLUpUkJRM<33>OB#M$vn`V6&XhC^+n|>)-Hf3O1O<`#8UiU#$3!k28 z{oo3ip>Nw>_fL-cDWw9M5cgyl=xa&H-0EARxz}*TO{|$|;9kJopgMU-oo5`wsN3RKx<&|!W_%zzgGaE@Bv89-juh>U}jX5 z;~9QtVL|U|XszGiDL1{d0T%{*Vm4@fbN$0;4(n#TQAS-qr8XEAZ=q2GdALS(=DtV6 z;V)t@9%jWZEL=z67|}`0l0$br7_rc!b8b33QL=>C-HFCtuPOAQUhU(>+q$u7W8=NP z`qg?zvnK&MCoBV8#~BDKL8(u@X7x?+k-;&;kp4sV${U($=-Cf9`x#6bd}QJm@Iyj{ z4ZU8ak9~BEWO6M_vT>+RCnc^pl5O)|U9{@*;1CYWOjF)+nWv!lHbvKKO}N2{k=0a1 z?1(s~+%#o-@fBz2)zVV2)4CfUU!Hhi7_pF7FhB=7%Yd)p``Xue26umkG(NtUr&Cpq z`Hm3)jsd)DQwAI3mE8k6G)lmzs*M98uNG zkj26~B$_w@E?jcKm`{QpLKWTZL@*71W~Ok!h{F0I1PVhnr?!KkwY68drqm~wLq6j^ ztr>`60A?kNIWaItJm}DwTo+!z9qgT855es2{7>c9hKog#mvaHN-o~2yb${Ii15eGG>JNh9IsnnR-uQh_g(Grn~!l zzjy{0W_}-fkFJ`8WeIu7&`o#ajxDsbb-9It=#>}g{4TgC9IuBKpX-Lrz5rNRf>bGz z&}Y*$tYwh-Q)?X&UTXSwF5?Ct{&`sqwEA@4ugx;zANZq_XVxmg?;EfzBig&)Fk(Wv zm~UBu#9ALkS<+@jaTq))i|*>=O};oHc%~ScRC&npiV;Pb26tmOM|eiputG!mj9II^ zR9n45>-`42<~SKI!*q9fEjNG=A=OFKZRr6hr?V8N0XhQk2Cu9_U&sUW!ftTWI~vN( z-c)bk7xyFUWy0oP>_31b`sWM{FZ{7suzgCD_#xdK^VAFA8KI_Q7A4CAg-cNrq z)MT-z*hXNkm{l2{%jzxjG5^z5X5AdpwI_iRXOv7C)}&NOCM8c z`2QV55JXcBnoS%GdU`T#h(DO|A*dL^h@LdOc)1(c{}gt0tY7o))q4n-1cn*Vn6RP{ zH>}k239rA6cbH;1rX8CK?e{-2O}B~H5NQVOLw_uJ%VvJe>b1f^4qNZyui0YwV-<~i zW&VEHL=hPU6u0Ch@dpASnB5ft1hl{`IvyHA z&Nje`@_QD2$VB7)LWACD*eeGM*mef@FJV*dX8-37@R{&ueGF*AmE_WrH07$UZ8JbL z*dllQ2OT?FVQQMo1v;wAKN`A&m%}uNHvy9>sC6K0=I1 zIIocxs8fvAT4BX~VlS`X!UR<6G?x)8wfw8agCy*i+F*XqsIgJocE7%&7p#afX0qZ7 zgoMYiK229+4?QUe%Cjqe?Y!ty1f@{1r;K|i1P)Zo$5kqFNI^UyA^FIMYyRbynN$j) zR4au?7(#@d|oeV8K@k3yCiRn$zjML`ojr3IM+rwxj%e1Kw1rf0oZN z2}usIj6v_4foM2f-)^lJfY+B&$2|UkK2}2>arMiZB@t85bK;_7v+?U3b6oWS(HMpj;ynr&FFsC{a!3~ zKzd^uoMK9dD-R{%I^Hjti;v2TA1@7$($>~WO=H4d86nwxqjW@6G#87Dpzx#QU|u{; zAZeTalSdrB;DQ$z(?D8CPgbdAf|MWQ$bjj5yEHTtB=NCW3ef;Wa3Ic_*x=;If9Vp&dmRFY5qfD6% zI2<4)FU%hGR--6rbd`h^m^5B^8LVkuV(6h=$c0e$VR zWZwK5#5riKZ3wT^r`MqgPYW-=uAF)`u#k~SJA3HH#F6!+Vu0lm61qf=`8{p%%`~fr z@b@lp*3+*7K#6yHPtB*SvXwD;LE#oR!=QJWu5S8(y&^rygB}vJkhN|&(@?8xni?vP zmez7XWfr1{C?Lozm{WhQGYMfDHI0l(NH%~_?D6u2_;}*!U0&9(eDabjZZOO=Y>A3D zV(qXZ1j5tg@8ccT(rMNRPqAt+aUXovB}!b-W9iTTftATP&4tzMcrr;irlG4=)muU@ zPf3D8&|G_`Ow-LK09Cq-jy5$=Ma&Z@XH0RRP@#2>?j;|F5O8~-ijuGt5W8s6EC8g( z>WE*p0CXG!#xzw^B@HNQHGu?J>o|S|uOwg!~|fV3K*6=20#LoKXddsc{Jj9crJ0tZNK>nz*s-wU5% zIn2K|=3k6>98ku>GxoA97VYCdTI6W*hGa$Ci#}*!%=q4fT>PEg7($)%<$xgs<)8cF zMb<_q4=hd7(@kqSwbjbXFf~*aR2LMCvSw@(twS9{97UQM_IVb{#wt>@X5&IPhP1Q! z@#sstLf+vxX%uXrss>^_YQ)V`{1r5ZZ;Ymg0eze@EdhRjpHULt0ZFOAWXviSQ;=nQh zCGsUCVQ^qHlW-^=9wd|$X_3~(G8{TtCa!ad4xpO)->sd4Zl2fr4ZWc0 zFS<28srA$L5yv7VNv^e6GE(0gY|DgbYaUqRrmZiYS1U}C*Op5jOeRSnP|$9>F-s!o z;XzM8+MQtiaL3S?9v4WOP64%Qa|9)bfC30^Y2pd4FcM91zK2JWl(2dbyC3ziw2#PH zg$~QEhFHfsx+T^zCa`ERCXE56SFGAFPme+({4#!tAr*St_VNm7J)+L{jpML1Ym_|D zaER)z0-|I4;#jbR*)mqH<1%5cE)xs@w;O+Gv)-($6%)=PfMPLA6Z`EPHLPul(9j!0 zQ5i9FaYg5g8)2Y1bd*n`L{bzaL{5%LU-kKxPu>N{Z06PGEFhR5FPiP2SnBZ@Nw*%| z>f`sqc#N#i{oH}7eHbz^Br8d5OURBrsX%5@cqQWRb*`7^Bh6RHdSIpP+}e1c7Y%M(Xg( zUiA_oh=!^(wL;S+i6ufnj`>Z6V>9h#0EWEOX4X5|TDFY*eU~UPdWed0F}>dtqP9I> z2R@V~%gC^D5-Nrrvv^-DHYHsH1fOo;EC`GC&{MdpZ;~|)pk9_PgrX$;EDM4CT z%u25l3%tL5sH7MsY3el9$N8|Uk$7h%JiXtNAy7FUyFrTOjidHTu4TzA+O^qdX%2b| zg{>*dv+o70Fk3Zq7P-jE76yb$@6$9;5FS=5q-7y5ZCW(Yb6@{3J*~bjO{XPhNol`E z8yYBO&4P_EG<1XmdLljSs~oR)sX!V1_JUjr2&6NWN#aoEp(q)0p$l~hCM7OmD16gmy!&T6%oikpj2B1JsPQg=fpSJLk8?PNa?G{yRXr9 zH1b${-PYGD=^$`ngA*r{JYxF%&vifNgsgJk#A4P%Ed*8740Mc}y-XucV# zZ-*WyF&~@Oj1FsS7R)*d%5MuYIbv%$MwT@z3dN$}IM13uFfVARrjJr+?c_1kcgsJ3 zv*Px~wa18?($1Jpm~Rc~1?Girn_a0|`*K@dbcjr8zdy6yW7j=E`!lw?2dW^qNSNJe zB}TWU=f;E0t~7M$Gy{u*YNnKc(%ef);)>ftv$d4Mv!o}Ip4w5M-+BZb2dm%}J_tR7 zMP~&QXhG<#QFTnMkJPPA`fhaCK9#?%kW7X3v28D=SpOWWj4(6y$TsI1D4oR7;Bkj< zcfuK_-@=4_7;{}bc12a3#;K0%BBwKG7*J&*+&y&Abr!`S(QGuv;ZQ$xS z;cRBnv8*zpt?!rP*a93}D{rN(aF{5GV0LG(-xR3ywqqTt<v39pKdC3K&xZ{DP=0w>OY8pv1hb=&H#}{8>f*BTS z>c+PoJ$g=+j5N_$^e(%S}7gONys=`OVdi{eINF- z7H#a-4*2RlU^RIG_i1$fCXWH=Pxt@C#^e1fm&ej=U>d3qQ7APb-np zd|XKeM5xXI&gL{n#va=}Hei7su0ReKHPCi+C=)nR*$p4q*S&n>rh71ZW$V#?)>_6) zghQKFI=bViyB*T7?aDqWMrIe%iPir2ybi{t0#sT{TOSHXnNb=)?q3U%=5U(!G61D^ zV0FY~&c)h)vF&km+(bl2J>r_IyH&Q7#w5pFVzA1jLGSx3FX*1Tj21nR^Lx2$;T-je zann7Gdles6z^6p8fwf_CK{Yt{HhB1fRD{bpe!;A*kj6(*9V>W#DLKux|GLTxW zSLZwLuol0%tafr4lVq@L1#;|P2`e$CN_lL1T*LWP|7hvNGw!vPv=FbD5S4p$;T~aH zqGR;^G(vsN9Km>-8D}fWN#gOe>lnVs)ea26EYRV$0Mu~g6IeBNQ!lH;-sfgk03886 zxaXD`MBUA8Z_Bm&d+f9s`LxWY_lN;`K|gCOP!ZvEMT0ce+9PpU%1&)rNq8u{miuoj zB!N_z=4u^_I%^7JVY1>Lvb4~0^`kCG-Ad{GUb8i7+WKO5&~dILcf5afUTH-jW?nsb zN&#O5uCBHQxLWd3S^!d2q?iN_;Q7Gxn;uPv7qn`L5-B3P#Y?~VKj(Z4y zTY=1%xYMtg^Nss@l24hSLTgokgv&msc#BpDsnCJ5GEjiR**&@%jSb8?# zFWZKXxs%$i%T2C)FoC9H1 zJA}O!Mw50_3&MHgm)$JaxR#~y0J;ufPi1z)aM>gc8r=PmZLN=WTXEE8kmnDwygHBF zW%onOK<0^7C&tvE2hFux$Ctd4s+9te`*^=(1XC#k&omw1hksIQ_&=~%#=9M*zDmJv zvt3>gbVrkUU&);Wf_yK395U+9)YEmkYk{7x10w?r55KMyOu50E4#sptQw9P0(N0J{ zBf+UK16ng(w2-%Ij zZF@Y``>g%%HP0A;WH9 zbnx#SKq&+?Re-CskL5Fgi%~NS1{naKEWd(xGwgH!8;=KV9}1<$aJ;{zy;k!*jUNpv zA_7mXPd!gIgPOb_f-g`$6HJnG#$yj|p^KhbjYIt zzoALPSdZO!JG_2Ar2=oVr9WvcBR-^+=9;g15E7Y~SLT_)WE>5rxzo9m3mK!w0KC=Byh|XnM*olm=Gi1m1js%}PihxX+;D?{8GA zcYe_%d9 z2|L;UA4iq;j$)6v;L&+LwqA#A5-a}s6N65=10l&wJGJf7SWDM(wasLJPR=TG5ZK2F z#%wM(G@k8pjBtAoIP4q54613U)>>MwT8>#O>WoijkzE0(fQ&%2KqxQo9ron9Y8t}4 zDu<_~4`Zz`7_WpNK(61BD{&bLTwDB#e^lDQs53)a3oW-tL=>GB5gql23%pgt6~gR# zGgopDaspWEqyg`E&HOSQ=C(4REr=_00Gt6YD+>z_N`YF=xSNrIv>oDf z1QaJph~t6ch^DvYawG0A#1`e-3?-cXF$$U0`B#=zFS}$^Ba1^xmyOeJJQ%HI@{k$| zLfBrw-`8%`)Y>uEZ+*b0b=GFF)>s^EJtFGr1H4x>od);@y$Gvu=FeI&G_|x+H6%=3 z54JHIh&AYN2cQP9Ebs<02msB?8kTxqXbg*BSyI3&TI&@)27)frjO5Qvb<>eB-uzqh zeV)mMQ%bl1o0DY74f~;)zzPjn!?&20UbW9^GBOe*O=+#)!lpAG*EFiNV|jS+b|<;? zr=_*L9(Aj$pI2N`s}FWqj6256?7_^ifTA(xm{qss+aSb4nP+c}th3!fCNHP~52oRz z$LAXH6Axj~Fz2w8&ce|S1#F*$BzXZ4YybfpKmaR?%gdtKv~_$h0g~RToW<30)oxCb zDkOxIoz4CY{E4ZKo5YB5|KtqwW!6gzt*1`OJDL%545lSALxPk!^NPpF;&(63^IXHY zxb%t~P++G=ys+Su%fez+07FC7Vhv`U4PoW;Yao*$lMb+i8Luf&73SRzqD(`BxP3Ca ztJkGm5H1vF!Uy*_h0bS$?&nJmB;`#qDhZ*?JAGa2x6Bl#dD=L|@hKJ2n5^V-EiEB| zm=ck;MZj^GEWTiUg`dOZYJlsT2R4;H}dEPe+E$Fz3FeC3Eg3T@DYiT5<6W%FCx|Naz%A%_s|idW#w1H#Sr zq^tp27zzUoLl3iCnf!)aVMgw;w3L>=Vz>p6$w|I^$sXfGIv|3;1^@xXu^4$}Jr$A( zsVP#p9?Ahya}JSI=dphaf1qOTX`g{dwAL|6NRsQ1|D?r&1>mYh01*>fd1TR*cx(tH zGBF=lawmrL9`Gp@Ao0$k(_(WBSNbAXtOB3eOC}?3i$YZcRb^ULW$2ju#V>ejqmePy zpUXj^sfOS(iElWQ6m)K_SRn*^om{O3fmihkCBT2(WGu=h*l=#?IKnj_@y)bluo zU}T+Vju9XLO?3-f?YOa~?nB=7*5B72YwAxp<+0Dh;8!29^S89L5UX@9V>80s^Qb!4 z*Kd>5&nwA60vhP!Z~Yo_diOJ}2b=N$k+4e!pf{P!o;w&FeU$;|(5&g%zT=4Dr_j?; z2Gih}DrM(`O*LpH%sG1rkkB>HQ)C3l0w93n-SiySVu8%-(NYS>mLgJV1LXQ0OJXMI zvC&b}+Wy~I5`P>A#b!g4b^eIxsOZLdtEf&7;PoU^_$UYlXnpJ;81HyIwf#;Ipn&!= zyJxu%yeUUV_M%!oO$@L6N5(fNI@m|y~AYoJzJ=j{^= zC+CdL5LV~!@$P#?dWVBRDOhF&C&0Y^gE*k6mC7X*%$p>pSiHkp=pejX|3~i`Akp5fMXg=OWrkH15w6IJd(t} zQY%ekOlG^Ti-9Xb&~pix40w53lo5xGs@YRL=)P?@0bm_f3s}GizJ%l>#Eo=>*sAjy zYJl*|ykFiPOh*n$h0ZD&U5#eNN2ef?08!FZ<;SP`Y9vD>LY5%h4cz-T^f3(E@0C$o zI+q0;F*o{?v``rX5jULTSWOlq(#gfc2uT>naAl%_YF~9=;?FR)v8fh?J39<(@v{xzWp+(VrjjA6ChM10jF_ zR6aWZI#0X_4Qwk#3c@LCyCLUw{q3+Jh+=PBcY=IH<`)cYJ}dQdwKwZ&>ZE_;`K@PMryzWJ<>4bfrf-YK@h+S=Q#@j_W}Jy}5K?Eo&n0_>C6a>C zA@K|Y%yzAwlzi@KMfnig4G2~iS$CC^DaOVT{dOWn6%lNwC# zge~JFa$Oly|f-y zw3j{K*Z1%yhF2zkv<<`HjPpsAsT^ZEnxF;}vJ47Nu#()X5~th#K2%y4hGJhWY{hq!hd1iN3|>2+W9;A#NG^>&}rc?r3mC z7)YnhnVi_`G~A}}+y+txRcH8#PEb%MdH$dX}ANR4$QQHEV%dTns(hr)lwlrnT6We9(dRM0pidt|Z_Ct1o1Gx}xB1ZK&iF(aXGP*kcSv)#$K8rZ8t#`NFae1xQws zDBYRZ#Ler;(u&qkg+MBBaM^1!GoI1&Ap5|JZwd|O^?6>j>VRZGmg>hhW>Q#MO86cQi6^~r~m{M9vJ%Q zHwt2vi9;u|vPLGen?VM(HLDR=+Wy+n#Zsi?LDGW~ghC)aaO5x^0DS@)w;8m896Q4T z>>*tly+cA65^IiZWz1(d6;$>7qaUr)X^y8Ya0YFE^;jeadqBwpqiEuqUxn8@2&oy5 zC?U}}j+2N2)W>$)4ITnoEDNLk1L(~+@LI;=8>a&qE-&AB0SfltfvfCUh$l!qAkd~; zjYKpx^}vm3!g0~r?!uc=_(AJe@8kjRVD|rmKbL?MA>9+w5}+1@qJh?4wTl?UAM~5D zu~5Vlp0%Y2DIp@j2@UST0ANE?4alAZ$)${HfioHvASX}mD3vUgb?64Wc?->%?_WRS zVM=YU7EGc1>i00S-lfIwc^jxnaQSHg2lQUt_?J?d)?uB(^hmG#H=QCKY}E*rGc|BwQ+^T4w0`OpA$UitzI zfp86h1z12WfFt*{5($Z6q|P08;ihq`xg`t!lx8#IK09XZQ4jT+wa0+qTM{4(y} z8F~ORx%-8yJgQn=SVRE}CX8wo%W7u?kYcZp6cP{GHrX_UK&m0ReegoqL)Va~RpF>bbSI-k|*XVwR)P|I_-S3sq|YJgw}nPDyYQ%d}lmH39k z>P?Q2rNihrFN3yY3UM_{dN zi-gvM)$c17iC3@ zRqyJ4c;mpZWY`6k&{8nOX%93Cdvq2OC`UZ(h}Nl%_wS}VP0eh#2Jje@tNy~dAi;f< zD+w{=Y;m(AM?EP6KerqO*4{T)%W?9i=yM*?bu<9;>$5N#17q zEbc?1<9fLF)406y?X-ck$XjFpFg3& z*s3UHf2!_zah`nqYJHBgz9k$mk^?QV2h)ZgXrQ_C?e%{W#~w>cwR~m>`6MCPD_)*J zeDhE=BN}b}9bMiP98a@Vd}OXTm9B@-^auq>PxK^7Pzc(Q6fH3H&?hV}fJNm`InF_1 z=cRDE3L5PkfX-*YZW<6MRI5Sq(BiPX&WTY9kJV9`vcf4?GT!#0Zi|#(D^rb$t)?r)rfGVMN&<% z`h7O#b?F$WpQ?WtE#>$PdYEI8Q>#CtOlQIXYA)V+)0)tK3u%&Frd57u4H zopx^y+CF-sED+X11p!(;P>uIHc~bxc^cU2(24VuSm{W$Z&t@oufQq%YY(APQm0Ft) zrbdI&-3V_0xLeRw5kdEUxRsS9EZl779b#zlQ_D2~rR~)x2fxoxW*l5A){<;oH>f@i zc?%aEwog&N&{pzaSMqc zyLDk|X`hjSYiIaqI z4s^HO4K0s|B0Z-}w4w+q!ZwEWdtFrac-HY8uV|ef!l}auz@a$S2n#R`LpC`{mD(r> zg}o<)Jxx!;hdx|uDRdhE4Gi52Lap+!uFn;uG7=$jG&DY|noZI_Sg(Xhy`{(1LsF@X zrW8=K%!y?u=7Qy8ods;?AjS1!DxzF`V^&Uid}R5RI6;n3ba&I>b(2NcjgqWC%I=7P zzHh+jSk~(-UY!FdBMXjeL>aXf-s5=&0k12y^2;9uMA$m@DnB$-n4Qw5g7CuhkkE*a z4h2|&wSovlWF3H&`WOQ=P?Xv8Q!7lWb(-Eo-U3Lon6-xCE97YtJyF#Rre`A8!wZR} z*sKe4WwxMr%kHwh9<}O6dGbV$&Y+|S1A3t6i9DL)bS6{@-64H(mKVlZW*RjxUYw9Zcn;}E1@d~rG(u;jhE*od24y~_ ztD}x@7zqTKSBSVG+A2C*p`*Rl*F8bfie1?@kzpn#Sxr;rmk&~;N6(WdPwovtT)TrC za1R6!0nq(-#W5_eDAeJwWkJ1rmgUt7WWh?K(T;`U7p|t7rknqX{cR7wB87&AnG@%m zy=h^soM(U#+z>=I0%gkgTOGr8`u62Y!XO4cZD-Wix-ks7_Y@=g?0F|HT{N*-+lbDi zOV&fZLM+W`n492lvj(J~8{0H6K}nW-qOD}x(M-3VD%Hu9`D{@Xc>A2j`)%A5l1mFn&EH}oBAk9N$H5^xFcp9ckjGfUVvAJO(J6^_Fep$J;R`+550ZU0<`KU z&!e@jO#sD=@Uo5fUgF%lfjASs^4&wNnpJ`G4G16>#9~B1g-D@7$L~e6ST`SY)v2yN z)Y|z9rgz9m_hX&e0C-W4c&$KKp#zWuZZ_&sFBLsM5ynZC%U*q=2z@+)q46Twxz@6^ z2l$9zh)Q|y%^ecej8oil*`Th22H@eAJ1 zf~&O-k7oqD_JJ@Vtlwf7LgUz1N33(8JybPY94{6h9h~FXARH0W=z8p$8E|NbYXiQ0 z9I+1c&rSm)_r4_| zS}iTD(BP2>1yF8i_{>`6hMrya3;<0q6DU}I$<`sqFbmc&Ttw^@s2&X7wAX(Ib*o1! zFohBS0R+nzf=mxU?bxsrn4UEB%(*dis)v`U?|pkLVHD-q;#2IOO_4yjlWWCGwhf0N z;bT6(@6t&I(WrTKP{y*7@IBlZg3Sjvy<7Ky!L%Bn1>Ph+ z`~(?bZ*2z109OwNFgykWh&ctJgQ;$e-EKFdhrRlw)T)flfgjz*8v_fR1x*Yc17-UB zc*n1DFxjE?{l{cd4th(Udmx3+h}H^fvVL-g*~4W!BCi@(|7iPbe&obs??;S@nHU79 z)BV2N9}6uVpv^ELoCF@OGkC%Bi!Jj^q|UIRoh2uR_Kx(v!}SG}!5DXApKl+J z@~Ei+h?HaJ1GVn@Olz%K=8ez;m=>KXS3~eBJK%2*Of&2-SC0`q+VYQ&6ihQ^U4ND> z8;AI0>A2M+$}7B=851!kNYd61j$#rg$=Pw!l{e?hX%bVnX4Wu)5QG+9cFXkIC(*m3 z<58ztt)6dD-=P*m%vsHK_3Q+*ut(59({y+9Y3Sl3RE8@sHQIBmoQX5+k~!~)GBT$= z{Ql~72Rt!222}o;yT=Yw+H&<6e$@Sx3TP6N?becngn48%y6gX$U9d#d94aq_y-6l4 zwtw?xi~)LE9w$VTDai3_6D_0 zL&pFXEvgFGZ6BjgIE0Rd47cyi=&DmNBLLM>v-t5s=U(lvFmX^2IY|tgb~2gGTn&vn zrphusvjQ!XCC^}BXlCbA|BQl|R*&{>4?uCosK+ASNv>qsk`XQV7`|4_h;F!F+}XYs z0B%5$zl5mfeS{0%RZOBPN4idR#;!F;TF2csr9tPQquVXGGB!{K>vw8rAd@=7kL)Ei zz@W2S%bgSe=`GI+-l2tys}3z!AKWOc86i^27v883uG(b-)j&@$)JCL%21d=9`XLd@ zpnA1K{K=q-j_?Q#%(_GgDDe}zOrxl83-J0b)(3q1h+x>q1k&8@&Y7G^LO!acla65s zI&bvyaW}nq%WPW>I377xPa5&nSVLx)%mT!VKHMe-a1L;tYeoP)EWUAD%6fWrlSOQr%27Lbt<9*H2WeFL!S1r6 z%X2VS+hZ`VX-c@i@s`DIsN!|z%$vk%dfS%XR7ON{?#!?ou=!vX?A24O+=ABI)de*_ z7=?k|y}Atpz(A~mmkvx1-PB+0b_1=gqAy)0;8iODRP_y{_idI7KuhkzlRX~4|~+uf$t zuYAu@KN}>d^u!qz3%u&Y!GZ-kzc+x3Xi{kt1Fin;611S^VVtTTp zHA8PTz)zz0imHQ;Sb$f`I^3lpHw+7ANq5zoGjq_4o?**I3PCN>YUstc*^j27-#;=i zlM_0GA2k;3!0t_E*%MyQiyANI?w(orWiuRw>k|jUSz8!^b=@Y8mw>JNTXYOBg5hm` zBCNQa#4#5fbuE974lv$Havy;(#BnP9v^_WXT7~@z6DI?D^xVvYR_sz*1~ z5h0;n2Uu;hxx1k$n~qzCIyOd~7JyS<8>@KPIHh#NY$mg>T6KKp)Z2NxT7h0?&OJ}d zwdcng62gjD1&-&H)05&j9aA*&`kT-8sRpyA9K-D5`~Mab{OV>l{8u>Z#TZ($Sm5a) z63FQ#05ip(`Y$R;WHJWYLI_#HnCv~h?wQ1_pwMT8N2}0CL8;@w@S)kkP51QBY~REH zGmKa>XegLn77ahKVPUyF2V_#bjA^j3+dko$qP*uoEeZzZYyvpWS&9OXp<~wc5D)ZL zL+yG7&r&0kKKy4^5*)AoCLU`aKCM&k^&Jzhw88vO(5wDFaXy*~TtLNHH6G!1cjwKN z7-Z{uQ>&640u!sj_iSCy1h!8ecUHzBQPEA)OY) zBLD_i;AqJJEE&GD<;}o}iP@Ao1it|9)$f`38LJsVW8!=0A^^I zEg06XpQ%@3G_`K#z*PEOPoYAZWXh5y8^__wT`uOlii)g`qCpyU&Fd+XDux%7D_{J| zjx8yw`u*}IUxLQcj=YtMtblGXtlRwx!Sn!h%z9OO0oE*l)%nDV!w}k0Ythl9ojZE1 zDxfzy!F2PPwm%tfA4kVmp&n<2Hh?;+Q-;8xIbnyE0jme-iFrF^8SiB#KD_lq%Y_Qv zife{vR0J0xUdg59@tyg(@m=QCz*fowd!s@u`EH=kjvrpbIYL)2@r@@2I0lYU3;aU8 zsBB|vrzIlY-?#E-2*iX_mw?~6}Q<8J74Hx^YdFZVk>5S?^n zer&I-S?-H#EPJhOy2|ynzo)7oiU@&NJbm?IW(&uxF-5H-4*(4&-a)lV>nB1OW@5(2 z6;h#(<@2itVQeP<*5^<NOG#kHq4qaAwW@Gd(4Q&9c@bs za|2y97^HyF>vbif!|+mCZx*ddl`{KCgYl{QQI;L%+DE}En>#x zSO>nkF(a%)$|U$S0$o*a&WzEew6~p;((oXZn=#$feR4O(t7<4i95VvY?yU~yaQz5r z!J<&7rIt0D)`Zb$xV+f_(CpefK&AX>DE&4Qfc%FXZTP~OU79^T0F>#=d(;4BsInTG zf!qDu!q5$mPcUUT{~oP6;$37;D7|jcZnOB3r}7L;+PK^nbF+N%Fhy0p@0Yv`tCVZv zmNM#*5D2#LQkxIPZWf?<8(B<90SuiOD07t1QhMzXFaVhh@&cQhuiSIgELEm#pXq4F zp?i`Mh=mNB$!GxXTg_q(&~m3R)c_5r^$qhverg3wwH`ZxRF2JD1mnGvttANwMCiGV zaATsjqMNo(kS)q9nVi*MkhpH5NSdmucb!R25(2G{ZMhsz6qFPMXc;fo8})RvDhwFW z0U*G7-VAgA?rj#$YBonA1BX~{FOd2A!wQFdTBS3Tk9GR085;s3qffK|Y`9~3X4lX_ z89Lr)S!m+)Pc9P|D)x5JWl;ET$BznQBwop-wFv^qJ49R&aR?X9aBg0Uug2Roka2h| zQW9LAw;EWdU+0;eNyrEGw)DAutW^n82mmQlUbkQ3$+JF()p`PHFsJIw9)J1Z3_o&< z0}Aj;|JPBQ5vFhh6xf0b3y#XHW;e66;cIB5w*F%>bk=*>l8wh&=c<&Hio-l&j*I73 z;`I%SqB;i376i@zN#cYhc2&Q5Glpe2O2=@Fy@%GEx`(FuOt;&;L31I{TBns`4Tkj| zIRh}~&MX;jFB-mgU4C#Ix4S(}Ez`Afn*G;gH+*5W0Iim>ygRSZP#F50hPVe%-=gRH z!%J`)y2VDO@aM0ddUzH~@*b`#7xAp3)?c##LR-q}EPqK@GH5Q)&ARK%7Eg7zmR2!B zS|JVVx7&R9VAqFUq=7zp0$M2u&VzYjzwUh!=?`e($8H6 zbbK=#SiRru*XqL?It_S0{<&qcjAL5|9>aKi%HIfRM!1uo??}pD$ML)N5r7BlsVna< zf)@ZQ3Zt2s&~e!7X97ta_6P1Tqtrj@49#R~$wPc-j=X83;=jV3E7oW$GbJQZI|wW>yyNgr zz}u|idq2+@qs?&~ZF_9%`MbvJ_sgu7rr$aa4Wq!E+b5en7uWd>%{+dGeRcq5se8KV zHm(5E_|-wec7Rx+Z$|1A@BlrV_1PLdFy>CT%sV=#4m9)?s^h_*Y# zeIEYcrWV3i0dls$=UfcHyz30#Izxs%f4$m`8aLhDxT<3x*`Vx8?=8qTIdCzcfyQzf z8+vW%U3JIwteDGxfJ~Y(^tSEgrQTFqTS~_UGtXY$!oHTSwg{qqUSe+XX01RX)5fJF zp!w}rv@Auh$s3b&c}ur(WGKo0@jlI`cklMH|LEpT(kI$p|l*wRZAH!|K9=$ zYx8bw+aEr-7v6o=i$(5Hn8#k|P;K#zqVVrk%tx^mz?ulep!rYE?ZbyBTWgG!f zp-UbCL=WbEh%0hfc)a|^TO2fms>91}=l~+o^W=FR{nwLqlCbIkoR!z_U=Ir~Lc;)P zS)sE8LV?AGP%smyW9p+U;|OS7-vFJx#@*9_|IucJ zJgh3W449Y!3*g&pv&Y=BApoNuuUZ3PY;s$YSbz?a`#S$OxE|5o=46X%GC5rCg&@ZK zo#oFt6t52kpU;!$`CI?5{6lU)Pkgh7b!;!eG&E_D1!$y@kQ6#%Ar%ml0`~ug0>BJ7 zAGw>x-m0T7lT0j_AWF$qTVP!mTpuVQBtoinyS;)jxG?k*Y56R^bv77gJa9Y>XmvuR zjvMwGvBCR&GWdF)x`+`z{!{C@!b5mB73#QzndFlM1?Vm}9;yH(dRG0njvm&6km1dJ zLhYt(3>~M}AFaD`bSg1I+@SrxdY-x#XACs38r+RXMoq?{Zq;ZT0SQiI1TBCC@e#e& zN|2Q^gdw;Q(}P*w&_g^x@pHjY_PE20C^Me#n~{}lEy+mJ&wGhaMpfkQokz6m`mJZW zzzs2~GYym=qAvDH(+$SWUP#aLcOLzh{wq)P@MLWcaPK)W(Etb2e!LWmTx zAPs8q!~P| z1)e-RKMBv597CaH_->XAJwrOX%kI!dL9Dl|74zkBlbPj4&e>4-*&| z9V=Wwf@?+w`!M5Feh`LH zkHsU5>-1|4*w6+_rGb3PMC~+}EI8kSim|ftG$9GjWH1t-tGp~uk)TKW=+~nsNstg% z0374COqsUD-malMDIkR9q~x4)M+5>)dj232wX@DA<;4d#D-N2P|4fpXHKc+Z3Lm|M zo&h{$2SXwWD_Ny6y+3AtZ0&Cpo7rf{0&z?psIB_$|eco=?4@-TFj2`--Yto ze7G;h46POV#U7KSLN}ySVd51ZonC{}3=-G0twfe<73BsD^mSD~69#_8*If-1O50Xx z8bVfbV53Gu_^%jUu3pa)tuycJKkPekG6~`;+I9og0!2@rJWqZ-dH&8_flI)Pv~}Gz z$L@}4%E00&B9z@o7Y9UYEm98OI;|~$UE&^Wl_bMZe<)xDL}#l4SZ^rUP4HSd?idm= z2?_RYwlnm|=ln=L5emI$aT%o^wWVr2Hrewb=a9?;${%iiLImr9o?)eqad^SKtRjDJ zvnF+@`ZTV!Qb>B9Q#@LcAOwiQap}`|sIhSa21fga(J;u~*?__m{rYtjNfLT9 zoZ{l=%_hx~JOsjONRoZ`(T)>h0r6|y|3}eTFTAQ6Sn^=pY|qf0Mh%IiyBvaG-Ph=R zCzost3PU`uNQk>NjdwIKEui&-fx|y+gx1GHs02Ccy*wks62jjhst(UnmuYmWV{f#o z0|GHj9HEYX@kYmq5rJD}w{goNgh$V#=gC&0tRd%sFUD<)J!Np+gV#+JOjr!*LD{wv z7Ti9-%v+AC!}GKNdWe_6J!W}g^4>|3KktiPoH16xyW%(sp#KD%x7RewU#ZnFlUy?{IV~tw+ko>uSeXyndx<(nDG-A7Bu^=D5R|J z@95EU>W~9m6)1D-2fDp(Fq9XApx5?64^c>phYxg$kT|~)2wJc#@Z{I+xW9kQMms@Nn3|3ku6+@VJZp^=UX9V6xG;tpI zsIp(YC9`GH>JtLS#Bp>`q@mi~O`~ch=*gqCvmfDGz}QRMVb@LX4=L6~QuZj4kVJx( z1rej-%Zb3-h+22f4jY-KSzeOly-hcHxO;61uqv~%hFy&iXm>}L-Cb3qtH5rWGJV2X zw0gcS>OIQydbOXeYLf-BEDg<_;Lb+jBnpf$u|1y9}Gwx>ca

4D29ATHO;R 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�sBMRs<65Gh(PRVAp@ql`+V%nHt?@@)or5~&eN*KcV_VjnZ~o7 zMoT0DfwR%k0z@i8Ghh*8usIH*jY7L=Wwjx*)IqJC6=<<1>%L_c3j>T9$Xu6( zKlI^*_h0hK>!o3oMvIbUL3==N^I-l*q7bcL7gY*TI`58)=H$#!pu2O>SPc6XYvztA z4HMJQ965d@o{~j;j4Tn^;brSRQQe}io8ZuXDc-21d{cfN;x+ij$N~>IPeF~n{RUmZ z@>pFZF7p+U;q@h*BqDV_=#|5!>4?7U_sR=dZUY9V`hZJFQSZU+Bp+boWSrnjEy(E8 zO(wKxs<;1T!HDmK9UqHVBo~*!k=+A23P?Fzz`rYeIGQYLVYzXM-_L{ zNAya@4$3liV3c@8H8F_3FtF<_`{lYjB)1~8&?y}n%ViI5JKS!WB%DTjuM zsc1^ZEeI5W?E+1bGGBHDwxfPyh`kvC68Q9WL!7?Lo?p{;Klwar0o-Q61m0aT6%uqKA1lN{Pi?jR*jJo1{bjTVtFtAFfB*mh5sT_w|1aCF!M%MCcNKS$ zB?*rZvX)l0yib?onDW!_$PEL8cYk~(K9+wzBA%nf@8N94dpDBEY$p&j+|_jM7kxto z$ff(_Qp~6dEb@En3;sHEibx$k=u0fc=Uyj#dOtPdxdd@e5h^(Z!y+`H&);1Bz zb&`xB=D$8MtlVYCLxP6&bT&)2t8NfH!O$e~vg;1@4P$4s_iM^_?e6Ha5-s)9S;D{3 zLb?7J8uu#5VX}NvOt}Q{9&dR$&Uy3(MHLw`yrAx-#EZ!Y2;kD;lVf;qC>D$4Y*F;= z0xm|9tXBuZ1Xr^VDwywtI~$IsnE428MdCgA>9amtu4y7isNu0~5M0-%)fGfW4(@z54};^LJV?@H zfK?(W;M*H2aa8xb9f2~>>&|{`2@yc76gq_7_&Qen>q_V<#B47c=eA||9; zjOJHu=tcoe%W48I|8X2rzubU5?%j>+m#kh%+VeftL~-Y?ROam%M>3AX9w8KpT>Z`u z?=*rF!v{4>P)~(pqn%R%->ZL@Ef!v4j{UAdCNjj*j__-tjMUT?j^etHx)u@KQXLBa zH^S=WStVjLkM{%dKEM-%?a~r`s1(+?M1g3q{xKxZ7B<=UZliQMRv%fiup5wXP_KYh zub}5|_%J!cgwgqX5D|r=T)7RKhFm1i;=ciT*l|iiB4qUU&NyD2Q>QmGqI7pNZca5H z5ZbxRK1rr=at6yI@_b*#4IP5h>y-#cMA7p6{2D`s5n3vHC2I}sp1Ofmyoz_DQQZIP z8$3%dGujJVthpQ6YA3wV6=cHEBGNpz8U6eyQqCmha;xQKr)@RbTN7`%ai>{K_aI8Rn!7$!#kGMr>WcdHh%+g27T}5TeS1h zA0hosep`cmX4eOZm}N`rWyylX{2kpb-{u1}iVxd$wNKqtCFw)ziY_jm;G{r6e{;~& z?01$>b|xWNIVVLlmE>|T6hOvDAXg0Vz{5XPuJQO?Jv{-Fr}((S^COhEQLLipegxl4 zi%@{0QCoH!aVs;KH$GMfwD@Ek`W-ydR z_h$H$B5$v3nJe<9ca1~-e|0RuJ+5Kp4gWgoN{HT_JeKuDx)6Itk@oq>mTr)KJAsHj zG%xbiSI+2q;b+}I+-RjYx>{-q|i~E^Mo57&=E8w=N8VOXY)2M-F(6+x`Z-JgbWoD+a|8LV;>2W~ShqSZ+ z2=%1Ow;RhRb{s;`;-=izfZ>%(+H=3?xh4`^fGs>>q}jXcvMQMqv%VO=uxyQIu9y3P(&PMV;;sKdQ0Yd{PPs^tR?ArqDgtt`pVy@A zXeIezg%D_S5upiBaJ#s?@+*o6r?c%+sILGn{=euj_0++ps=BKF^*M=kAgsZ1yZfOF zG~UUP<_dU*U2>r?`LvI zF%b{c3XFGgK(vC!{e;a#uxKq3jT_8$8Rnahga@4o%sCcg2G>{V(OUKqms`yUkcG)0 zX$dQf(Nw#oTA?DlL)`bL6xH&O3Ys$((@!z)FBX_Xhckd2z$*(|Dq_4U$^%%h&PD** z;bt#tnC-=V-YqkGK*oI0RSI|y4di3op8=QnO&!p(uL%iK|Iv>oS0MYRYZAW#? zCU_>-&D(qsVJ}CtWh94ciox1cxRRk@(ZElWFl06HJxtAoxaV_YNU{56?dixz35=qf z2uccbiYYV~sstP}A{-VRt-=hxP20Qv+Hu{4vnL@)f&Yf=$0(**xq6 z7!u5rbrcsVn%8QiV%KF*?wc9tIZ#3qda~FD88D1dJlVOL+WUN>Ttl_tQCuFtHqC=# ziFn!&XQ@=W-GK|KQ5J9W^vnP>PR9FJ|>mEvCQFlFRJ_%%Ue>9H%K^-@d zmB@8-MZe4H;Q(?gC$H?c3u@XJ*_L*1dnAf!k}Z*-y`IPoD5t}D$REsZ7{Om|G@Cru{C0m}&C$m?$sBMpfc=eEXp0X(1&sRx zl-st=zaKgvcBRvyi)SyrXp-|i(y`&FrvDwrFt!u4%9IiG3&6L;H&&%P&Jv++qnRN}rv%qyt|)C=MYa+=zDosD!rt;W*wJc^AX<;7=R>+xhow zJL^-jg<`^plC$qeJz8kRUhr%it5gClK%BTA zYl_kbl+hG5QObx`Bg~rwiQiEAUK#0{88+u2l7ns#xR}T5DEnunRAcAIb&HD{u z?1$!g=d(s+uh_17(Km_C2cHujIyam6GE@40vP&(OX*mdDoz+xicgs9)qajgr1=|Ea zVYautrKNj|sRSLFgHU%Z{wM^AK=`IbP)!zu{m?wW$}|YRmu^Rat8o}`GEwo|GUh5H z@~m>rRXXWGt0RXoi zS*}D>xjxGdEUlF+U=#noG%0cxAzX)q zPS%|Qz_PrAdxdezWC;LGz9x%1E@&X7gBPe`#%Av{OTj@+!QusjnDp;Muo}PpNtMvr zs(Z$oJ1l|l5x7)G`DA}j9MzwupluF3U@J?vmHaP3Fo}I{NAaP6W4dh-Dzk5p&*q|E zthP`hKZ_ZE+Q)R0aS%9FJj7|~M^P8B;z-dol$&mIz@Y*nQa&>8WKQu}~6U9y{ z9e)Q3%t^L*PcL#lVV4428d%L(SX&^IDtqSq3(v>t)CiVA73CGz zRx`(4DA~M`8#$$WoJ*UkC%qI@E+cV#?SHfIseoGF0$-2w zYcae;=;L>;RUqf6E)UzjxaL0g(U>{Cd98LR#_RB{c+4i3-eVL+bwNGKtfv@in8}_I zt5S^dSrQ6>tCty~?>`ZZGzAyMOFM-lk=2*-H>3x%1O09it-8lTBm3HoejGSyiud73Q-C zCc6?G0qPj4(QXBy7+<6bxyaB$(=R_>8y=YHC6d7o0wr4qFQ&N zV7VrbmUqu$yNa&o`I$yKLhu7>ljkX%*OtxEtkKLYp?B)!M%L@*TkAlT; zuL}tf*$|0el~YwVVT6#-kx#(4s)ANlGPW>CmX_Vc=3{ydo6Bdc?g1k^Ev=^DsiVtg z2pYitav42NG0EA?E}LDeOCYy#9O2e-T;Kv5*k-9n{w*{6%e7kl7lbv&jkt-S5NVB% z4`9L_nQW?xIRF3PG{X;G38eh6%L}ycn94D|s8-?R&;jV)z={f|j@YlG#?;l(7P1r) z=zO(8%a>s*0rNr|w^fj&|JSumn&~2@1!+#yhTlcdG3Z9wonL2*xFITi18g>r3;Ip$0ak$iGDxi6`fa*AZ*GD)D2vVo zn68S*YBsDzB}j$uoQ@V#1PGG-6WJ;&MdIvOg?YovE{T0eYf+7kU7&Lx<{e`~G5Qk~ zSeu&?-DC;3oGT+_@auvz?TIf~8xOfi-BJZI+RFgbXAfqC{2nmu`Jdc8y&G)q@V7ZD zWX#Er^unDR_Ke}zfUaXQd&^=nfCN8L7r832p4y_-?7bWgrYNjvS-Dt7S?T>smV&ZckosuSN2-A9VWa1hr!iiN{UNNn=g{~%~_pR zL{^>-#=um_dLfqNA@WXi2R&Faa!;=hKl5X|p4T&)=U56J(8y@Ew!eQ5bR&h5`H66+ zXgocrN7_pxQ@NyR@0kd@A=}l&vz5^_`U40$mNFZzR+ld3|S7V-*FNlH-5Fx zY={Ll4;ZwM8`OB4v($y(Jgt@^(Nj3tA&B7T*=sIV>7Q3xdbKrAI3Y!O!eaP;PjZmR ze+?of@D23Wl_khT^z=3}l&Dy3e|OrQ|JtCi65%ljC3M__Qyb0@R3m&$E9?!`<9#GY zW8B0Co3GhD69_+{>GG!fq7Yo<&Sgp=vsc~j)=m3a6SGl1+9n9KeO4H?yPPlsy~H{P z>6f1U1SbYk z*C9k#baHRLW3dvFT&80IhJt1Is0LXE?#o;z205_Q_C_s~lBQ zE*qQNAE+~Nw9vhYIZ`H|tWzMS8FmD`t3+)VmwzXa4X|`45T51(qt#vBn^F*E2_F}q zHk#sX8@DWpw=G%O&7n;Zq62Ej?T6CGanZ7|Y!8-y?GLt97Bld*b2mt$HnaXWB=j_c z5*6RVgOCC~=aN>yMw>O*RD_V8FqI7swEsGs*n&`Eia3K*MSQRBvVNmyWWB81VBQDU zuxv6#dM0IWbtX>e@xsa!F&aGMmic_AeZyF^QSl8t*5&fa77ua=D*fjTL}@Z*USB{0 zh5T#czHU1Rr8NQK`W%ugxLHQAY+ljaIYZVWRMzK#QZx1~B=)uO%ny{K-~!`0>ekb1 zUX1*Z`avHnj0xiuNDlymJ+9~l5tC-(x6cFhk?jIVpB@@GV>r^ z1kXDLBs4{v;Ovh+;b=86aWUr@nJ2w614^CzyhuDe1A@5gN)rJ2j<*c<>|GfD;xjIh zv*Bv*vArmdzvgLxedvv`%9!XDt>jH5!pMyM$!%oB-}U>u26^kkeeN+$YUoadWr;iU zR@%Z*_&M%A)NEK}1jU==A@TaBgsZ&2Lxf2h?j@_oo~}LwMl-I9BDkvvF9eXv;Fn17dXydi|_LFw4Re$Amt9(|ICmZ-4~hmklj~ zV~>|ZoAWyta0iip*CjQ`z>)o^q-xK!Cl!lJE8W!wQw)QS6=#9k%PyK+eNYqvdIN(; z&MkJc2#jyVwB_Sp(0Z|JA7)C;n2YDUHTPRDbvy@dHi&!|OUbP4Jlc|gw12oTO}Btwwo<=FAuiiCSL8@6)y9u%(7|Y! zDGaTl$MU=67f~kfymOgEzz}mA1xhx#E*F$-y=#=#e>G{DS)20FR~(7pF-O7r?+-}2 z|Kf1lnm~)k&T?DdMGm+9b|lUM@mhba1L}!62(fY<#uA#B$Tso`cI|g_Zi`B`!(H71 zt_C{4RZRo1GWBVEEsep~k5DA?GsYE-wHTc}06B#WQJI`P2pTqsEZ8t5JA`)d1&gcA zW335YX&d%kvU_XQ+dfVw)J4EX>Z5ao%|h-<&*)Vm2H79cfBw zg@my780}bvde1ORPXIMt&a9kRFy@(Nv*l1pq;r{zbe;e)C#S_ zJ)`A^wIyJC7pBmb%K^DJaA9(;p!cRY*Ga{w!+^E3bxjsL_#RBB;CGe#%X* z8mRv2e>P20JMacldosJ0fz`s~1q92$h^zS*dyP_NvSVHfd}%p}UwO@fCqXeA&8hMa z95*SU7||CRQw@iMrMaY1fKtG%cc09FkNg;(4BIQ2JA?uUXVYq1ZR~yXJ=xk-Ebu%j zbho=${=k^)CAZ?Apbb=Wc*XeI$zX-l{3d$#`|eOYV?D{Xk_n^&9eDpAN3EJ2ot-R4 z*uWUS&06>P-{a8;CbvQQU`@dddIlH+!G|vz@a;x@wMb{%MxT&$ z*?mtxp_IDRC536X!Y*xuPg_Q#^}X}!NT)fF&3gj_IOUUylKj~INM4Fc@s0pJUNQ=F zSrwE21}H(LpASy{Vpk68BuQm?=j9rSw&@3*#~TBx0hG zVC;)IYjiLR9%EyyD2dq(x_|XK-`|Q6RjK!6<{PgW)=nG={3O$IVkdew>9j2^FBl#M ztV9T8sKCbPNi?cCbi$~-hr&?qd-mq>K?2v{2RwEl?jY3J8&8f!x;s@C884WTTz`XQ~3i9E8flf`GClx`Qqmn=vTDL%@*h2b=l=0%{!(Q5X^hU08(5mW4n zrB-rT1`k7P-d>&pv!??bmecL5;~TnAn*JMKJNm{azbTKk<$wpYv(aHdX;dv|HS>a{ z{%ou54YPU%XVnzKqWe0SV=qCnWhi5W!=#=%~ zpG|xugcrG7U8QmIbW0gH&yh5NK~NLIJUbgGJtZ;%^h0RXCB>d`^(hUZCFEU@OT$Wi z`H{v9YfHL{oWzt7n6?68q-;cOW%lnU6xwe#%Dgjj-6x3pr$(TL^>PBCa?8QUHIeD= zISHXO6;<5nIK|xd+S7`oUXW~evYx@Xz;Uv3sbifNJI@_g{nZRm$z@RCL?Q~8-$pvfH8R?MX=j~3a|rkgK5DXSooOWRvsIPF(*CUu0!@ z5X(wf)*0UoIdF8C*#G0Y(!T+V_tE?JhEqV0Mzzl)de;Lmf7z9O7lEwCHR7#7M`Vjy zZ+fkB_}|l-0?Gk~G?$w7P44I-$jnaFj#|y9UjBnon7N`j#W+W@y6uRWh7i$FYXSDZ zfPEmD=%oHEri5~X28gl$o@`zS(c+J<#lt=IvPrQr88X7_&_{NP!|G90ut6H?3H!fA zYXUrhj2FGUB_qZ6Vg5CHIkijh0H1f*f57EVr~Y+U6i3*B4!@{{{r<&3kA15 zy7m}1YjWc>;r;&FP?8nM?kesoWg}~|MlShMG`ZQ2U7OL3UZxSvJBqDkPhU&>m&DQ* z1^GruRrnN>4d;4{%fsRFB-s!(C2ZI-A9`gfT6Uik^zxU_=?gjK?EYJ?K;AFp%AJ3K zLLNZucCBW=24V;CY_+rx)6dl?TyAd=`_dx$yGy6w3)V&Wv$yggurBMg0?cxON#@m0 zcf5YL$E~4_nv1!HR~Sa~DG}0?l3zwsyoo{PyqT4tL|V)^+yVvs$S zo%dQ8%H#ey1w$aajMX1dI{wa4VBA=7$4itIVt!>uI>2g6zKk?#lC8taJ!Bk6^4;u- z)Sk*jHD~AE9_*#g`F>di^-OCYatsN9(g7V~(0mUWHe;UBA&T4=GBV=MY^B4f)Tz2k zBd=zpv0Q#hloI=@{CcL@IV`GX|Bhh%l^;){-waj40l~9r1q#~T_j#Ly=LNBr5#l}s zbv?1ibNog~|A@Z&Fm9TQ*_ju7>kZMZ#8>g_39?^bXyc-I90gZ@2^r;}hL()Xje=4s zlwsBeJ<%pAGJbaV(4GD zkw!gNb3D=UhnE*Qij;jBo9}d}mpY>77krIx*wbm9q;~XtlHdS1#UwJpN2DWVTRDEJ z+`F?&wI)&VWmsSls z3XT!Wq4hVYe1|7cg5zf^FSP}o19N7AX@220`~N_d@?6T(`I#rzdQP7bCR(R)))9L| zzv4sFjs|pey3>QvD_zi$+Hj`SfuocrxbMQ}rKWqG`?tf?bXEEeJwt?d&PXaHT*;G^^V2EbWgA9WH6 zFE2&^EFcsQ%@-&@rBK+^O*g2zn#*69e zZeL-dL{s08u; zeJ?y5KK4z2*D)iknEpaKgRR5|D#`jB&YXQH%x=0%}YlpHa5)|*!^WvdmeZLP8YYo-LSEiA%((^E3AVmH?_Y6L1P0D}Pyi(y^)a z87q7mgJ79F1GpyO`Z(VipbBuIq}IOWc)>NSu zbu+=kO0ULt*)FNf%^&*++VDRZcezf$kR^a#iILKN{Buxe+JFDx#o{HQnNxT&cW)Y; zAUKN1vsVVK@<0`4*31+|FRPhXpA#3bE?*C!vjfF*>|`xwHD)!n>O9&5D-l0ny8s?S zG%e3rqR{M`zO+~aC0#^6T@G! zsZy(7_KHlFd;_65b{5MdR)p+{*)v^n!tYIg>}rFOJK)g8Ue__zTIYbG4#<79Yge}Z zVL2JL0l){{xG>mJ*ehn?)wlcdc6LCH)_(>dQk!Q2;6?}h5RSbiQuaQd^aQW8Lcxbz zzT{M-3Anl@-7M9g#I}Dta-xqwn^)W@{eGV}bCJ@@RfPVrlm>RhKzbodtrL2-=a^9q zIm4TTj_NK&`luSXu0h*}m!3@zKj5{p_ceg#F?pse0dLMC)TA1NII--CE!X|;Wu;cP z@&9|xw@5e1MS+=Y8xnd+KrB^%O>}M;Is}P+x~_M)5AH+vYD~+N@Wi$|)ojvs-Q8K* z!2-r7J0%c%&tZgnZ)h>Tmvoo_xDOlt3Ox?XV9fy7l=;FGjZ`Nw)TA6Ur!3N9ltvq6 zf|y}TJl2YvnZ;*mVzuWh8;A;JcO*a?p=%KV^OK(RYSu=Q-ZczDLtVmafrgV%En`|x zpjk?4zTFaA!LlZLKu{2b4+QO?)A~?$j1pi`&(#uNmU&Q@|1^wkzK&~kMWo*rr~j9o zpxNIS_rQew0DzsiWZz&&$M6p@`~It_Po8;{nQc$FIRj(@U|z!Y5$oA!rhJ?6JqnB` z?T!|xFgFgMyz}>Nf8B@7E>i}Ddl-Y@^|x<@SfM`=f2~?mRZ@3MYL-pTcyxo8@~?MI zsc|TQQxNRx+b#}%-Wp${O;yry{GNT;;_KMAiw+kfDlz^4l)4#o(b@@g{Q~5XUszfG zsV%ml*L#DQ?B6Faqu0H&i~+akwNYW-`+s_yp(`TkSWb*HeJCZtE_eA!$_4w?IS5jH zXw8BfXXrh`;jRIVp&%w&t$&C4#VVXB&jV&Nug829LYyL_<+NnQ-_w>ik`Q2`A}#~f z%k9M~TF*6-z&6g3Ps1sR_KFTC+B?N^IF?Mj;HBqxR*g&^2Q1nCG}h(sTj>$?&}yIf z3qie>{|e74-}B{Wf;|S&g<-X4A$?7fCjeEk1{}^#vzW8rfFY&e8`%+zOZ;C6wZ*$C zC@!FhNS|=OWyEJ1cqI{TZnN57m-_+93Axh($5h%U5e%yYxt$yGP5thW+!Iv0=!W+Y zE?Lk(_WI;4({T!3MkPT$8Nyu~ z@UrmFb$U|8ao`PFLV>>x7O>qrPfk<~wr&FSaW8DH4KtZ&D4!oz*Jk#K&mvEJ%M&7V zih(3S{v43hsV;xKI0Is#dNz*i3jnwq@%X+H9i%U=h&cyO28h$b^{><;oo>iT$1rts zfJBG4)U8O}SxP@L%Io}LkYkQEufCCdA_*Af=4Yi!;Xo5X9i6SG;k~P67V59#>^2{d zneO^F#G+P}>HI+J2237ip!X}l#=|BDYIZre4iC=Fqc|?Vng?Rt;gk-R$+O#v&2S2v z(4xWj)fKm6s|iIWYqrm|fK+E-wjxop3k|z?+uN{)FSFfh#;&RQ$1og*R!U(h9(@D& zh#11!nMTdlK+u{WrmwUX69McW7bZj0&mVXhy09v-HE!_H4q9JbOe+dX^rYRzM|S%F z;9~!~-FK|(fi~fkBQ%rUj$G@o29X50&$#TDX*eSLx8^os?m@L~w$k0gvoz4{>i&P5|2s z>5}UV|2eHqu03=6DAmz+9Wu-!nZ?T3xsUL0hDF zs{>c^&02mFvVvLpa>s+DnLv@sIKNqk>H_bPc~zmV-N`32!}b5b7KP;T#yGPP2d5CL zYVD~d(RJ+!$W3GdvTZRjj`;o?Be5_=+*bwL4=XE6MmUoL0P-eYE|`Ttb!W>R@X&;+ z0NYKoEYX~>sfD1Fx+7*WkjdjYj!1A2XO=mhYYFZl?eO}4u>2Le+V@y?(g8?OzD|0^R|pUmR@C|wBRW*)M+K-W`nU%&f6I$Q`q zCM!`Nl}z{MXAsnaS0e(1Ee!~~Yx?KS$v_}>Jmh~I-Bw5GU`zSZu@x(zk{Y$)>);V~o7#lZue^|p3K4S$LG4CKSv z)6eBBwd*r+N*w8gO$63IP=E~pV;{>l@ueEf~ z1u7Lp?=Vgt$+U|@466>Oyzl&F2K*hI@4`%=L;8m85cv}|uEhQsQ+havjrw81&84Cr8v>Gua2inp%dC@ed3O7S^pj_2Arc@QzvJ;$d6MUFw?GEKsr1{V5_yK( zRAd&k`7mTC;FZA_m{JpnyRqiad#`bxJ9+>vY|v1zE$$T!P^BMG;B6O{8(U-V3RcCg z_s@xZv4oe>aA8j(#JGym6-RJd5`^hP+yRNBHkz3=#NqBjN@DWTAw+sm@^)V>CC> zL&A%%;Gk#;-u8_VH=Q0AaA%pg4!AGROvAUPw??%SZU%C44|8M%btu1yeT|Q*S2JWi zdSw+}1I!SzAB}nHF8|tp%~5g0W&kn0j$xqqD`miYa>W+5#m839NW0>yNudGB^J8nftMErS}i&DQDmY4ha!QhF~{0AlwIU;Ls$;X8+C1WA&h7k}oz zObk{8?PgNwQXw1T~cRDHCuF4mbWO7F-l5LoZ}2ZM~6y9lWRJ=MkgA0{ss#{VV%w3-c;0k3#p7}z~Z<*VHzd7 zttkCa->5Y(z9`QAyTv7cVKO~%^7!`l%VmNpWv;i?O>7GJ-qDSi}cYnv)__5un+k!%*O#vtu&+Z?lAQ;s01p8#dnq!gfFdtmAeI&FbqJ;~!c z=N%5$O0<^s{JMU>fr5x5GB#Qv>p$-s;T_w(;u06FRC!dz8o3Li^A8tlUCe47m~0if zUs{96fZTX%N1wqZ@fe!C?AIA)Q=NJ&ALv;Ct)2A}D{YT~ZB4eCW`d4T02gcJD7-_@ zDOz~W=)73m5js&YT=-tu-YtC+j+h9c&+pHHA!T}_^l*|gI05OLVr8vZC-jyZa|I7{ z$-{fifyTmO3H=$!u%+rTyn$Abk{6k~ZF;AtVbhPy>gnOJRecN+hWm}hgK&?Fkk(JV z9h`1IX}yAs-vdANl05lHGvB8x|eU z$&dOmpH56*bZn2%lR|jQ#gIbRC>SEknm4HbQMD{3B?hVOAsTcp<(Vxxa)335DwTiu z{L=m;vCJEm)X=IjU6+<4Z-5(qnpY?6q<0Hyoi=mReZuH=dL!Hfg9-TVNr@vJ9wa$iG<$$9ER@DqBH#HxvjO3NYoaL)${v?0vMRg4Q8L|GSuA0*@_K` z7e@g5x4)GMUd2m~#Gu=htio7c8?Us7?)^;-M7r#@2tx}%02^#?Q4IJ8LScb62MF&- zkKE7G*PNrAl`NCBbBvXS^n{MZCJ#832&b5L}}@3s;|9%|?ln52@UD*Emr z_-10N{qxzQo~cFZ8iV5=Re2J#0I@RhOZ!=>`IdnCX7*)7I_051Zta1%6bw+%In%5U zymWMxM9uMCXps9eB`2%^sgUuF!IsX|!^ub1>`!i^DM8m(Bo`1^K{oMn5v={ncby}C z#si|Tbz?`5mqLZS%$+f_Aox%T@mRcjZF9|(%&{aOG?20?-Pt3wG?Ydm3|}25yXpff zm|DKAdP?#IG93L zA?f|Z{qXiEd9+q4A(`Q-?Z7KLD^RrvaMjxxgn$~o$9uIU=Cw(n0+8k z?wCbhnnN}<+fjpF5_a9o9=#4o=7Tr!xxNsT$%=||qzdM+v+w+fd1#uaB@$14+!$u% z*US?4sGt*@A`v+;dV@v;c%(igb`!YEzjzEF-|MKu#7lVCvgBVy*Z)gEt8S15y1h_bpK)xY1>9W>fowriiG247(@ z(uRF_9O+|J#!hJ9FIX$^C0;1IoX3}S68j=km zPmWz;CYTg!@u|BZu}x5|uKOZ$G`XS9E-Z|QTI93AcCt(FT=)%6B^7Zc$R;fC$c+HH z<8lyb;ccSESh+Ya6}r=%9VmInbxY-8|J?YqS)vTR6N6S3`DXDm)sfymYOF*Kod3FC z%6v*?f5B*NiyUa+5RkE{W6kidyWIZ-I{Yy0F1Y463)MDm#+V<_Izwm_gfZbVCn0V1 zv%o~fiTP2o{#ZfDTQI5Ga&-X)uBjS)o&Y>Th5KZ#W|pg(DRkM%PJ+_67JQ zgisXw>LP-*4}v1uIh6E_dV2CPHS}*M!7xglexI;wG*v z%&E+p2`%sg{v8!+?#pgXeZ+7aQJ(|yRMpZ7Y zTXi6XU~1s`OX{&2@Pgzss90yx18FVrS0u+TYx)h?w2)I5H)1F>?PkcSgTiot--s9Q4drG&?#jVf(K{O<>R&ss{~M*k?`S#gMNG*UXK- zGblo|Lw`1=ncG$*bwHl%JZ<7)xBvs(0}VpxsnH5dmp6rZ9d3epC?2o{Kz@W75vI3l zfmzOe3O!+${8TI7Oe+Y0-c1e*e!w;O)Hy~x;$Tp6*o}s$Oz7c}kfaDKsz7yx0F`{g zRX$jbc&;aoa`72Cgb7t*#{Qo)yRjO7aH1>ZQU$M;`L_A^*GnGyb|QTKg!^f2*x(q{ zOTO9<;M(7D2up&sz__hrE;F^uy3t5NDkW{iV7th0x^qk3ZhC(LS54c)wCP#e?0eWn$GGI+KRr zXdG518qJ$UeV@pQQ zX#{hd&y%NLFwE{MtIQ^g@=-ynUHfcnyKL!KR73&r4yozX^ka+oDw;CNBO)brh@!gF z$H{wB8NmVv(S;h|!`)b3Gk`9prr-!P3i6F;r}gJW?gIqOGqup-G%7p(By-Md6efUh z3g-7afcz%`h11G@h9@&F0QC_y>;L3E6i(+i0n*)@xG@Vq^?OTG;_GoB(d& zv~`BrKpJsBVgU6HYcDms+0b~cUUNnF=9w2134h!F?z)BJhzW}it>47x3T6ja+?Sog z!h=!pD4VxRn&V|&U&1_H&kcoUaNKhrAy#G@f$zJP`ZY?!tm)d@((Ttu91mnosg)VQ z-RZ09fb5J=L}W}QZR^N~=cMM%xW~iS>_s($p{&60`97~i_zA1zJZzo(Is^-C4Nk;c zotU|f#a3l}-OEjRE`vON+FX!w4ek?XB8}F zeEkg4#9dg{-<2xmdBBehX(wTT<~pH|JQo`v2Gc_M!gZ1aj+Ww7RM{nvoJY~2y1!R~ zh zik%$ZbIw8`J(#cUGPN4dMIrDcU!{5uMoV3va!HYUXoN(YTaJaTt-XHinaqeuqj>L)nOMK z%7WZ<=0a{m=j6&O4uj$E>sAF*0Aq_SD$5FDjowxZ&>P}6C>x0!&EQW=e(E6|Gj)Mb z+z~_=-mXS~u30l>)fr30>$=O(r%{`56A%tb9 zg=6tnY?B?cTjg?j`a4@d<&Q7OdFn1(sfy+Ogk$6&Yqe7RWK70J|Fk#qUX*mRMtN>g zJXw>ihm`*L8FP#eL?iPY9>m`4z}l$7$do3#q5-A=9AroA1N?C_Ek3~LZ+C{hBv~}u z{_q=iO-iquCRK-ksyo%xrsR7d>O#d80dUW_Tv2-|s*FZ1oe%2t_&yujY|wT&T88b; z70*SwcinrC#_B#pLd56*JnA3M)>?Gi7L|s+rC@?aJ0K*nN<~<3Z^pFihd4OkX-`@& z<=um;!j9rBl9!a;=Rmp`IC3twOXdTAy?<8@5IQM*t8P#Sq)eoQ{9qnlbo`BnntR7pzq$#ECZ*r<;H>I6I>ooSFDRMacNJL zG4h|9T}&lEd$u%8>j@{G2l%L{8va@#r&tG8zGKdBj*JZq!(t4 zZCi|fbr=#I^KRC}a;ocY(uNtgT`@VZVojT93pZpcb!*UhLY9dILxJd3D%PlR?n^|&7&CK%BG{_NS@fKZ?Esd-CB-=v)M3`m}U4%suHRyy}a1L-L$9V$ko%G3=i_8Q+)1u931F`&GcTI&-OOGkL5&xdtRcg z#FKk+ly6*E9GL?Rok~IB9k>|{eE}=AFHT#FKML2`_Q#&$&qR{_?Nmz2wjftT$m3#< z`xywb8>nX^Jq7X6V!}C~aw2FJNMmybprC*N000053)GM~8ubksaqY^!c3WKBVGiWw zSBe0ZDirZaP)*)QAJwZ5-2??3nF*UMJfntf)Pr+{B=>ZEh{Rpm_m2oMm`D!SLpv0?Bg` zqJhheTWAPONz%W9IDTN=gXt?&822eegL<|)JMzM`eqh8>>tT0)yDe<|5OFIAoCpn6tvXNfq4^X zFRj;b2N4LTImdq2>H^9;__w9IS&7c?j{Xc_A9U&^4OkQP4q9;!!dUMVpw~$W5^aa2)%Mc+?uzJ=m*53qm)pENhmGxY38}@i60& zR=M2t8jLwIYXOpN7t>vt!HE?Kd*C+1;QWv1!EDOI0C4dw0tqOo;L?dWuTLXG@mqDa_dWt`g&uf~G zjo;JL8;DGXJR3)p`aUYzP=_GsHNEc#Ze(SzUG4UnlPKC6-iadIviKMA4t9r856qRq zY@Z9RH)Bx&`2Pa=)Yy!B`L(;g0VQ1p&_Fq=e%*>W)B#B^_&I+DV;f#Wt7-gzaV?2f zA?A_@lpTo#%C{*oM{k?MrWUDYgWvu(F2=*!~+(Q4ML6)j=t(93foo zLaGbdg3eMY6~o8<{8`(*60FvXPSM`s^f`QQjN-~XBR2{t=Zwjb{aWHAqRG)bDp##S zoeH1CS8@6-iFi<)5s{sO5#RpQKcy!1u(c!F3e6wSP?(Fp{}0h5q`Hnha$S@xze_wy z#R)kHxDaGpynpYe;70IkVJtM28;!_Tc&l}9sl9GO1Ph|89*-;FPTZEUAtcOt|6-J$ z2+|ny)WxhCY6Hs1sYDW`AqJ;nFB9dqwf2CTGi+y&5PT#A+eszh`k3KeKr|tRc_~cUnd_(z(;&tG7tavHlfF`y-RFZ?6A#mAD z*yv;QR9T9&v|0k0evLp#!X1W8XBMoUy#6c<|FNye@@k=lYCq7MVKz=`cM~YPDz9li zbpUc88)jMZOa`l<9kh4e3L0-iI^bL5?xtsG2i;t!zwHV(Gf z$=g}qtr4dMN84Qj=kv@<{Za^Dy^`=*iogXz6{N;fLQ(WIpTxv(s5iBwfo$pEy$LV3 z>%IJ|t;1`1X4Emd;7B;lkQ8P*WRAK3`|3QG2j&9rJQp~Ny{-f%zfbSggcBtucYsmg zW8lqO47Jsc(>&D3#i)DE;wYF*HZ)x&Y5Ewx7h5@%&Mqs#F%c})3CHmHuq@NR!?XwaT2i zax^v3hRwuoJy4@hm==4QQMEmJlgE|0tz=KXo_l)2<-9uiMeX5rT9PkKT}DoNfU+Tf z6I`3$E$O!bPW?rGf4$`9UWSxIy-c1@?Aj8qIWlzh>HO6~I9i}Gnn?0}95ryHiIhHy z69!ZLM>=d+@4wAI3oCPE~U1W@|Dz#V7FCoq97lPaoTQu%R#5n+xhqfrjFU2~JK|WF1g^D^< zHR4bY*{~X~SQmtdcn*DK4ME901AGb*SpqpAMDhY%=xouLXExlFgI6Zf19EIC+ro30 zB1~!CNXki=3F<|Qr?F0^)|NFemLAmS&x*PSX$(wj-AB(~>|qV3E?u2zU^AGg*x5U` z@kpbH?+M(Ftf={{s44t40c{tuWixWUvvPgWT^8sp3shRgewqjEzE?E5?03UQw8})H zA07Q&L2g#E5Gd*zEvYZXTR-rpx$3S(Q>qbwA^}8Lqea=m!~Dw)Qnw@kN_a3^ATI$# z9Aymm3-7`YXpHKC79s7J)K<-;dDnnSO)}?Ksl_gUX+<~$F^W6P3qWS0EDy=xr9LlJ;~l`)bJMfZV-w^MCc1{ z^(Z-8rHD0?xY`V)cdh~G4+B-m*ii@B(<1HJQmU8Iwh}xMuO5XjMM1Ky zFHoTrYcMA1acj4`z$MV@r=cSX-V|V>@CEi432=-ZB#N|WjUg$Gyu=_8;diq<0_v62 zg?^3l(zSo^2)j`nKaf~S*equNbM78cE#~|RWTRp)+P^5Oz}^ya;ITml3lmA8u1M~; zz`5TH5q?Vhll?cDGsf;#n436S{S1~BT)guium}O9S$}68j!v&*Wx?A_T~8T`L{VE2 z>02#i^^6yB-yJtzqL19T3*T%HOkM#=;v`q+gMWbo{MeJ1#k+_%=YnrgN<03k3#g3) zK*AM%J66;_W1qv(KUId^VNzFxJaM;evXGf#Cdff#w{7dQ{uu31!Cx-XG+;I~ntvd= zqUbNIj&g%}T%~Ca7C|tLIzsi_BB|suOdH z{Q*a-%m3fjasd$ZLwB7f;cGL|n^n*5t1%WZ{>Ny1wy=RHKHZK0yUK#q78Q?)u`= z>XJfjlq){P<%)Y3=__h-p8{p)cYF7)E83tgl+JpN;KD@Wv9rmV#aHtOVNU+Ai_;9< zZoz-X|A$%Y{yRx)Kn_=!E6^Hh+fn%+3B?xCcPW@Lj)xF#0yYQo<7O^jTh=4BJo_i8 zKS;`SdUQCBJ{UB~@RH}F#Y4Z;i)c=Igv3CaRYiafJ?B=0PvpZK=dd3>^G>3#?C8-? z7|`6lyK%FT&Uzt?F4@*$XSqK%>CpNy^7x7ir>=4dkt-Li^a}Nm(@B=Z!8)P@V5X_0 z$&;qfBsczl_y!PMTbr>RiRuc(4?C(W4tTI4G-?G=60ZT`z}Xfr#0kZZlWz_dOekO& zsnB}FqD}4TVBn=5N`r>zL)fXEaxv61V-h@uU4R6LMqe_tl_;F3v#?hwF~y|87CNqN zMOUW8G#VmyJ;D}0FFf_2*)J`s=uQIz^$&I1F=&-^K{(5<6>#QmV(Zg*>Qv>SLB9=1 z0Tirj@Sqg3{R-(Q_%}F!qd1sGXGUM15KkoH<>S321}aU|%Hi|v;-D~&;;z7=?gfL1 zY==#(d%XJCy%+_`Yqb&ZbNWhXVN3rMwqFthW|On%IPGT&2@M7y&iDzwmi^nc^k$1p zw+*h8Eh@u7|FY?ylLdxphM5rH|Hke09YL)P0VOor>vvW?ckSHF>S%6`iaoJe_Yi7} zKeJObPwc2;Fq?3WS)o@Y(i}9syc^gKy%p|w8$$Rr=xC%13~@Mu zTK&&5!Fln!%a0|E?0%vj$*Jn|G2g=s<*(o2B<2-R+kWfDCp^RC)T96@L^z_J^X%O z{4v2%-$XbdKyJ!0_}V1tF0PhdfgbBg}L+;w*K6_qpa4y)E?cHnoQ3`^Ypghf2 zrf{jso_VvIt%D3O>P#e6$;gJZ?GOqO;s5w1&2Hm_fzs&#fX^>6 zfIQM=s&(;ZTdwB5Tc49dXkUNGlCY0-aEUdY9n9?JuMV6sSZ%@)aPr-z&rNR6#KCN( z2FZw7s&!wpEp8(VA@YMhVz_(OY%+3i<*pc*ExD3$I609XmPSXL=O7vuhc)(}P~_!i zH)Im|3XxUqdCTt{4PHq`7sMt#R+IN0bL(^dE!4RZJ^Lt^g1c|VGcygP37>T?NOi1S zF0g$yAh-;wAeG$YmLQ?Mbxf_w?Xv-00HjfP&@u;Soz>w{+qq5fJILHq0iN-Xx9*R@ z7M|l-z+gZ*BunmHOOi3IvU*6c{yzb=Z6L&jckrO(0FSxkm9P<}&2|+hv%1MhTcV3H ziJdvOgugz~RN>!a-)|NzDM6paeV~N1&|uwquQq)1#iO;S4nsAaAZrYckl7(HjhD*r z6DnPJ__X43fu7b~mF7OW$LCBiGPl4wZ0L13s!}!w(NUaNYcOgBTE#`iI77xkbmA3I z=R~|*dM_o!75+dagcUCA}L9v1bwH$1}~5LzSzy< zuY$8~y#5k+*a~{b`e7Gxf>ykIEXtJf&?fH}PYE+F6VIaCglDNUG!vIK)ov>3dUQ;3Y(m{2f4Jl7D=Lo^VNs58&XFo=5#9Gv^ zpJYc;Zx=LR?f&J6C^!*f=*RyNnRJbx3s-%O=|p}1GfV^TL~V{#$3V4jB55ubL}%_x zYbGZDuie-)&t4Pnaf)kKLUb!EN#B~b))J4w&vEvnV#6RNEZ-pykJUUSUFG^5B1yyK z<|cxz`e(ppMj6b9X04I2XJ{F29G0W2*#}eJoN+N%BxF*Kh5!pp$2aI#rN$vEz)d%& zod7;LvkG;thVm2AQDz9h#{6$vH7$Dc=g1)LQ27Lu`yxahMkI_&VclUjhA%A_d z*etZK*IfaZj=GA*0%LETrizlykra;N^*oV9?0Y^JOn89D?>l%!%NP(-1hb*F*#AhN z2!PIE-1%fB)^yREtpA8zB1b=Oi>SP3aJ~6p$$i>5uF;G#8QV;Z$3a%;j#+#ed47Z{ z`xlt??R)0|hR)epu6iJNA;5(Iyaj+95KKIRgFduu)1W&K87m4gV&MvIA%i^v$ChrH zR;Rc(vokjh-0Y8{HzWpZ5Wu{Z0?U75!TCw_ZuEp-VxDaVO0_r~8Jpv6?f?q-}qDGT@q(Q*{i50z>zJ0(@JVV^eNB zX0}ky@mFC-yCBA}OwmL?7jQXg3DIYw9EmICwH6EVZkgx zjQj`#PjL5@zxr@sy#^tk$|$&|ADbBJ>mb@tgzBx(=5~ zpKR%Jp^!@i=hvw7Jq^yt1s__OF4MM6Z}tg>qs&iJuw9X^8*R6#W%>aEr9fLNS`PBF zto}sdi%l#JXe%a|C5Hrm(U8ulS+NM04Q>Z?52QmG)dLo@O4im=8zzYu_ue{4IKoyb zT|YB2`$`d;DH z?g0PxDA3G_SJcGxodAcBs`$jt6 zTnBAaz!4?-k0hmvEj@u`GNIA1Rg3CPZU9RpU^M6*iA>B$HWO&Q)c>MP2wH8xDm55n zlsL#%dwUVYs(9&!o8Vy%8oECn~om68tH1Eu6lz$EO*hr`LokXj7(u+qC{ zu=tmk$phM=?|kegz5vW?E$Q`Phj<-rB3a16%Ao8JkS6sNz(Tc(t^mIW{;kswQi~Y{ zzz0Px?PBc|z-Xl@98G#o?q(`lt0hwlr4~9w~bYV~$uG^^@ z*hV0}{XV_Lhs~e@WWdwQ>k7C+C__wJ%h3-7JYGfZ2ISl6a{2!w*pL|J0KP<=r(X@# zyc1&nLlc&#cI+fZCDyL^1)5tBMZTP??*ECc4KdQMi)0agxsx0Raq;C&=g`&$;PH(a@jld z1UvtJmwwcLy_P~4X}Qu7fA-{fwU0%U{x3Zvk^C?H0pAz-qhq=sDaug-x}du@#|pnj z&jZF|3EgHEccG=t{71S;#wCOq4rlXI8SDZ~_aov6ZEY;I5 z{`FI$W%Yro(~2t&;AmbiU)8}GhOAD$i)%qSz-Rq<-CTU%9B=!q+itux&TS*iTU+~R z@xA#@3R?TuT;@q59EMGWan@bO1f*4CTdJn0rl4sd0SXo^h~gCvnj?>MpUxdzY+N{l z0Sr!bFpwUn=kkXv5byJ>xvJ+~nyz)iSUCk0vA8wz`+`auWL*I2g_~35;_U|oi-mOPM`Pi(}jw-8dws6a&Udd?EGwOL?k-;E?Ho4$9+ zet_x=g0*MlMkA|05asH?*Qs{P!GU3npJR7Se93Jf%W-g$i42e)6qUUMzsS?6HO)=q zHS!>EUu}!f!74*V_IXSgI#~I0zIW`spp;ZsD-xZJY1l z&*}3{>;#Axh}$DiAU@G88!3q)jAwpwrY~^@#1cs{d0@aG7c=I5JmzuQ1(h*uaipb4 zE8e|X1>fmpE!YN9v_Pr__!1p?_R^aO6RrOUcPm>CBW3YHV`7NZ0MHTXAg6}X?NOyb==8kkQ6EHsK z72pC!lRGmHff&w$jN`btlzWI-*_%PJ{ed+r0#ehFRx~Uj?zr?|pXO_-{x8F$ukDD% zE@(tXOuzFzrm^sc?3kXO^`0`}dG3xKtm5jK>ewxq^aZU@R|)=mvwMMA`BmyW<;$QN ztTWww$d!;gifz2acIOkCch{NLpKNiU!ZtV>gdB^yxfe1e z;E{l@;mQTxm6)tE0)7DdY#I=IvGB;Vd523xq*i!Rh7nFext4mR8s~RFI`0~$e7YgN z!I(UHrj({)tk@6Ax0rbM_>w7w#HS3=`!Ni=O>VTx^U1ej=TBn-JCthS2sgq^m9M6PwrjQP(=H5|$F(${5m(zTLx zh^B?@k7No$tA7wCSFvj0G+O7iqnf@3a=e0$4aXx?)z@DZ&1Ozyo28wnk} zhT?2LDNpw(9PXKo@xm*iA(F#EoaT7vWIcHLkZYEGd_Eu!h23vct>f-6xo}^%7`Vm} zWY1996M;5JkuUO&6)r~w;sRQ<3;u=NLBE5gF;5A-=^-A*NR=eSaS~Lseo^;7-=V5^ zq~`S5NVX|T%^5fHP2%92jZC3%iwY~iULZ%?{Wf#6_t!VuWv0r+yDiK{PY>wM<^6nX zhkeO8-nwL3FhRmNtJ?0iv6^DHejWIC;o9u1GWv&7OtRW4rZ+O|a+LYZ(`P1Z`vOuG zY4M>26s})FHls z&!AveeX}Y~a^UMC-NH+~&c1Vu2XgZJd=7lz0aFRA_GzDr!de$Zh@FtK9X4xWG+2ZQ z8m?ydWJ76m_jds!4@*463?(WDsxxKo5RI_GzzBCW(qnqJS)d)NRT>1JNbfFYQ7vSXN(NtbWCn?MD3qwNP(4OK7fPAZfqu-$x% zPlbF^$$qRL}vLSO33dS9{+R!fls%9D?V=55K3ExRF> z)^qLP+3(me(}YA1L@7DzzG|i7?=TK@=M8s*&S?;z5;S_fE>s{pMrg-l|CjpY*rr=I zvS}{6Vyt~PK9W0nSaPMbh7!Mi9DWNqk;a~#80+YMs||Egm3w0_>^U;Ia%BF zY!f1hxUj{ha&?0lTFtYDTL$=q-vOtm=FbprUt8}3?D$`6&Y zR{kO3hEg7O>qG+9cB*p&OeX*=QUhO0!x7D&B;Mn%DRpZebJEclgzv$4L?=R7sCna| zbGkqO@M7^2(9Eg489TR)P7GBM|mAR92wOaO7r-$ z0j_l$3MhvHmS^Fg%B2UupbYK4{%G{oGqOJ*iP#x!qdL6ZMy}Q!Sso>==wTm{ikYro zkAaQfEHMU}5rII8H@Tjs&%kwrC0+A_|t+Vzl` zK9nz<5~x9S0ZZ7ZY#F(aOSK(}+Y$kLQ&pE}!DJNss3U^^;d2v47I zTU{6t2psT?IsDe}9}5_jU}6N`yiDWeJli+K?j zt+t@8P_Lc1qG<7kEYJtWmPbF#Vb#lJVl_Q64GVY#Xu>JBkQ?Nii-7sC^nG7~u*z`h z0_!U?j-|t0+2ocdy5FePSP0sE)nS1++>pAh6aWG+T<(qkKhQa^E=Ec@xjIlhj}Mky zBjutDRM=xghKLzKYBdhaqVRu0Qe+xBuozt_72SpWFnx8t32^P{>fcSlw+=>!Ux7hW z^+UscKBrJ1gaqF}8QwIl*W%vIjfz$IEz^#??go-0WdR+gQ!3|z@E2Pe3y7!H1XBA= z9}4m8dVJV zqS=tZ+9!iN2$5n;kTEu#Zq?WXQkzN zXV_~;{N@NB8QJ__h7{Hg`@e z3XXlmDPn-=6en@30X}0WaIUD{*OY|SJt9?vtA4dnqyvlN!gwe@ZPobX51mBi$*XdH zF_P9faRpjR#^7YgJKrZP-@Z+Gq~Wa5i|SJ#9sw#8qx?Mxa|Rdl3j>ozvtVVi>&Qp< zaTO>+;K3=6s@f$Tx?vDZXea;x000000000012Vv^1da`Sa0t@EvqXHvrj zukzLw=LPHf=!Jic?>nCwHR8>2z>i>FX$Ut3GgkP0`j$Rr|YcU0%W0`rJ8 zpd0_<=W>NDGeL}5w#3_4nxUHBn2*gRKrT)8EpdU1N2v428PmByPH(YVpXp5o%GACj zL5}%OB6TNr&OFS8-fq^g-)?LszkyCZ$=JDU%FOOH*^5G^62NTfasY6Q;FZiRx$f{-IA1H^E(lG(H>aBHEp$T=iIXV^x%q_*sKe+8?vK4J~1 zsW4BfSqKZ~A_;aqPz8Tq1g40wVzdgaz~eW_xl~~2fC3bVV)r4l0q5J6w2m0DIm1}1 zo#RzF4WhP$(0Q~OdOPtgW^aR$Q1?5dub-Si000000|$4f)V)F~seT`&J(|V2Cfn#J zR8+JVx9N$dMh_m**_LGZTMZwL6=ub{Tr5*py(M)RD3+xVn@PDT0CvXTYr(N)`Nynz z>eDOV@AMIbHB$V`TV}Hn`wUr{V&H4a27<@65(k1$K!gIqp=z&R<_Gv%A}iEp0aG@8 zXI;MOr#)H} zIFAEV#WbazAt;T}YYd*XV?gnedom;LmLcl`E>7fpn^5)cE4)&tNO9Z#JZ50U)d3Q_M&XAjbM}6~SuGtqwfM3NXAj@v z%g6cJxWk(bLL4Kqk+X7YK;>xe48BZNsOwqdO?}uBg_Y&F5uIFIe}ud}nti+eo`Ab8 z%;wYywD|Q;rIYeB$x(MWid501AnZxcEwNk&FG00973MM6+kP&il$0000G0001p0RSxn06|PpNGx;!00lRoAZ-Jt z^>2B{MnnW^ehz}RZBw`7Px=QD5fcz3@lDw%myMpShO`fd?U$A;hi&c0Vad@2y`=`9 ztXSML#ch5?q-_4TBAXfM~shdQcP) zxpE7cd;$6YKPb zM-~Q)KM-})v+8W^_V0-P8wfx|MR3C*8c5 z^BA;k+??4P?Y#f=9CjNI=Gd3N3@WHjIkmQYOf~<(e~*pHTI=4)qE)RIarL~2998@H zFJwl=C)}@doL$VEIB#fu1bV*)prUdI$h>I6=Pbh|(k_ZYT>e)(8zZO=Jp*+1DFgo{ zen^MbYlJeBPBY|`o*2Mz+D&{&QNXMbz~lqdXMI82g$%{!hw3GE2@%yZVHENqPqO@^)b4I8>QtIC@T9-iTyK00 z(xl@U;tbD(^Hg>UUbogF~Y7l@)^7}D{G7Q})0Fub_+%FED~4(Rz-OLo$_ zm=@+;UVpOpBbEVQb1Z*lQWijXhvhdK&xqZ^tngFzz4+QFRd8ETSj~-%D9Y+kM|k^H ze9q;!?QOp?5|AD0McR403;-k0B}oG@45^k=c;wsMqW;3)0?_%UcXc}*3VP&G>moXG zZnpJSI{=u5hCTF`NsP`FBX-a*J7H$#Dsqh0MO+iL$^?4iH0hbyN%`_z%5UodvNwbm zY~GDT@2&;;ypO?9zLxmwKD56Ia1YEUoD?7nU;=fbWwmHgr|HxA5;yt%AO<9a=xvVcV3jKA3|^IrH%0s{qD^@wgBx(3hgsj0a$l*Pkajc ziR*Q6pW|Phiyv#n+LIu3{FB``!#j*qTsR+&IixXdd>j8FbbLoNB1^R$g3urpG8E`98ecgwkTw)3XRI5C~qUF)OZu#SnYwtZiPS5-3xC=NKBB?#At=8~n?KfJ-F=3R)|z_rfI|%K)=56R1m*`qWhQ z`sikfSJ>cRwK-3E-;j{#GJuY*dOkbq`3c{^?z;PY8u-=G-s~T=ud;}AiJ_0AXLc$h z-)mwRJ_!xj2VJ~l2D!w5hcBQ2P!de~mLV^=J+2l@#krcj&ngrSYt#G6x zlVM&oNbt8z#~(sMhOsm5H&I@o10DgbUY07L=s;OCf(F$M3xM_p0HXEhjtHmP!tY^i zYNAXgb)cSBk~D%=wfr3+NZL%NGcz4&pR8Y+rUN?S4U<}{M?o))Q&6pHMm=ivs3!#- z4>4&(bv$!vE)DIyH})hTh%{|SWP5hllEL4L+gg($36a`CApwAo_vdj$dRl`se_jJ47I%o&z#kf_9xX(_eO(6)D4b$B>}PGqped~D|( z2-pB20GkBme#tKh4})A1gBt(@5ZY+@^*P&C6Y&T>ePk12w&dGiV4T4!MER1{I z>&q+Z(TCGWScLXrq1_AG-hP@Sf*fm!P8ur(^yBRC*Z5HwyUu_XUTvR}B%(};y`+0wPj(@Yf*9i!KO$A~RxY{*+-12KVt81oY4V+ zpuqPSW8C8ooHIJ_S}Q}rLWCO1(p&;2kDy!O=z95&{Z7Q!O&O%5{8Fp}9UVcCz!kf& z#<5gqE0V;fN=XxV5AtfiO*zB!riV%AQK3ex+F%MZutUq+M&=>;5Runc#-X z1tK&rd#(Fl>$X#77{ZN9 z1<*LqSWu5h@ZkxU8#4Vfc#CEq^wWPRQYa{rs0d&P0J6Xx@4sj>WfBCa#VKr|A_SIz zu>|ZX^g=jV%H5_(nY^Z%JB5%4KTZ))f@oNz;WsrF0&Cp&vP{DgD1cZnY(q&BEs4aX z$?qPKsHl)%Kv@0$ow)=GVKl~C3uF5vgCq#8_=`9;Em@=ml2jsIu-V`c5rzEpJs~8C zwv;akzN4|mN0?CF3%3YcVjG_jls(H&_O)XrN%YvKY@ej1Ee00GLO@D4m`#hyP$*Q0qSnSDfXTTy z^&pZg-*O9^i0}&uBYD@u3S0I)zh?)7oB7)-Ahb>z#cJ42*^COEds%EfbYj?57wcEw(#t zr#LJGJi_yf@kNOrrVvlEP%d{Ahb4e%FcyM92wIea?W9PvU+J`QL=f=FN_zl!1_w0(AwzA|Q!93rD7%00e(Mfjt#J&yXzhtQ&!CS`wgfWss6L z6l(whQfxl*a0Fg@;DMDV^MQYe7zW}i=Ds9}p8r|5yIpq4G)UyEEf7FJZB3#f03>PO zw;hq0jsti#Q@JT%^1A!HM+?vMzyGH{CTp6Mw!8LF00;mzp(2zDQ~*$GLjwx{w1EwP zf<+%$8#+F^P&i(`D2R9X3zQ7@?7huaNYDcS#+#A`=%10pNbF5!WJLM`!kY|$YQ4y! zU@RvF|Oysifp;d(sqdV(ZhJABPIBJqvc$^{)CUE!H@T2xh)0~!#9_P~NpVJ9M@ z9C4Zv?@<7$0$NZ@3ZPX$>j}U$-vv*ANUfjI&+h8BZPLQEJ^Kr-pZh^Tpym5^Iw~_F z@*tiU$XWe{-Qv-F&O1?QMFlDRVjPzFISK-4Go9(mtW0zD^=>3S;}Da>gN4U0C#m_| zqp8_d<>q0MgpwW$0MNsaQh;Eo`^>0}45mDKW9yJuRrT{CYVG~KJG*C4+p<96-K=+A zLA4fISU`(f=>5_F@jyBvsxmW4oGJs8DvyeH7&9^P^^fmZ9v&WRK9aQU-Lqz(T($*+ z`0Z3d&%BcOEtv#BQnuB0R8*cZAjizW#LV&*zeI^?bN0MzzA0=;!l$S8ks%;SJfyO+ z(iiV>0|r2JC@5$hXi@Lr3BU!Rrl0#AXBY{8dj!(FZAV5_MMPYD%$PLDz`T<5%ncrZ zht~$%p6A^)Yj#J>{}Ui2x)J%FQH^h;NIG!0zJ|1Yv}ob)?jbabmn{qYjk*4g zk<7Hy{b%xfk#5+`Q9FG?YNI|~!CiV$8UIyLlJ@)UeRtRFs&bu-Sopgm9P#bU%&3h2 zu88T^&wV$)s?7+*-yTx3uDrWMIevio9U&%d@17y9D%-S#_oVR~#PI-W=ENj`4Q%Yw zN|qh&lHZjWl?URVKhbn<&F*%&e3AzLwrGQ*Wna;3M7%C(l^J4E9%SYx@5Mm&*WGTG z6^$N$*|(T>I*;-7w#)!B!~jhEqjw;mo^8jtS~ksyH3C=UF)$1=!z^Ql0U0JAm^_Va z+gG_<=~vAR0taYemGd9>gO5mcvt89L+d+izS4U{lCeoFT@T(?em~gT|{j)|=`^~+T zcJc84i5LPU^&&DIk$lPQJ(D_T$PWeE%cPrC)o$CSrFZ7~U&O}bgK1y1KkIgXM=0(r zdM2G8DL0rjx2Gd?TehU%>h)X1FCf1>kK8>9U-4=TBVMuxeiSj?YM09_St9Y*4Ix;x zE~gz%`$ZXI@eZ3A=4U3NI=8m0B}st(b^|tA1|Ck~*P2H#MmU++u znY)Mw06ZvYUC`=@1ypNet)&5AX)FOCC0b_MeP3@jy>E(wP7fy=b*g}(C%_?34sx*Y z*d9t!o8xGw0&D9-|Gv)xxo|P{}#?_Yqhii~!0hFDaUVbPUAU*c*?p z9|IVpM|tu@dV-`E?J&d}%>LA8GNAnoDKlr$w7dUPZq*(Ck`4z9x^&fW)cXU#gNFI37XhX*MQWq#!8-0q8BM7gDdJsGE3bXpRG6 ze4c4$LNXz)Y~H1CdO=W|DeQs4Ijac(@j^UkT}YV`<#>*7)G0HN!oke2PlNk#9~zHW zBN9c)4nlBbiG*Cl06h$(T4hxaF!=}} z9kV!r$4N0F_1o~U;`KHyfWSlM2yYiN!W%yEz#`NNffOhR;M2JPj8>K^3m%MZyPU*Bs$Z^gK)$uz+0Hh#+Qa?6;X(2`k^hO)U@*xu+ z9mFt8W&qNca-)|!ma$%)(B!;E@TwANY=u?V*3CPIILkQR42z#M=4Q9LoQ_5jT?0F?j- zxz!;IHO3H9XZA@*2oy-Q?-ucx6bJ|}dBrstK4%Yc0YQ0D?f07EN0Z%ZC;3a_(vRig@MkvpJ}s;ycExz6g~1R0IH&V9C05%d$w3 zPe6*VVdqS$3xh}`;#)7(A(A5LQqXT3oegPQZi~_>efdMDd_$bx7*Lf{J}?u?q?uR_ zW(FYUWJf_D#2>twsOk4d&f;S5Fz?2P(7tuGiiSaW*B!o(o|zbFRFdJ?y!Fc`9s96k zj(12I;&|jaPv0_qJX$0v&T`V^Ko!*^pjtq+pr{+lGdf`{v8#h98uULfi_#hfEAZeMzM4`*u3=ZbG*87ogj2DH-0|Hr*^AlKVmI_8q=#lVn5x z1*r}zd!QS4*78%$3w;u1zJsnaAt84j+$j zVL^akn8%Kc2y?QZA=p(@B|*8l_S?NusmL4rtHYf%*uy?#(yII zd~Rzd;a0T$HXVk5&*D#Yhq77|kx?1purAX6ew@+?2S_${6e;qTqb-o89qEXw%uG9E z(OrK5-}Gz;DZ&iJVl&}?jvEMYx${(~(1~?#qlH?v&Mnyy(nEng6XWSU# zGhT8I`?WQ?!e0)-CsUaf5n=n2zhS=L_Wq`+I6X-|+iUWPguj`NEHj*$Sq+D6$qkNU z;yDqI8en2lP7}|-%%prGj)6ImCKw?7MtpWa0s_g8oyHpRukaAtcD9MibeaJ-rbP=1 z>L#7Kh)4BOT1#q43n*x9G4ndUhcN>IQa)`ngjN1-4`k(i66Hu;ruk0O6FQz7KA*Eq zjZP*>bGnJd!7JCZ$N?*VU`g6crz^AaA(l-K12FM!0p@}seIkB=N%?93<`#FTs@`(8 ztrH-qbv8DY;E~^+*YzHE!j48pr0rX3`ulEme0nnsw(})qYDix;)xf**a0?#aV42}O zCep#nq`Uc2o>>dqe(n*w0iw;u*0?twz}C)cVGw`>({?uzm1*0w@Ygl1KF!fI|Fpfo zH6;YRKx)mWO;e-S#PT{`FMBCar0u-3y(l{@i(a<{R^i-GJpyO}G@<|s=m4!7>gX;- z1Dt_9+uIpK#&av2jlLM?Im1i>(PG-^{xh6S;D(MY*=h~qlJYGjgW>+n7#$@Ipyaxb4QkKn6+P`eEF&D%? zfO#8piRDAw^ipg_tOQmLMjXx51B4fBU*-q8m1s8WaM+gFpw+}9%kii>9<|DHwC4oK5&J3swDW_vK43MfS48-w>q8tN5%IQ#5)id$=_-O5R z^Dh?tDVc8yUY*&GI(FRZSxQ6uKMQDF)#CIFwips3u>c9i4hy^vP=zsk4zkmJjpZ|G#Ow0T%=OXcm{Y5PF#IPiRJW(QL-HEs4 z@_@`NA&^dRix%B1>Hp~QFKNDw0tkbWNSY#1(*GbSgc}3vXAK}I4GEK^X$1*w)4138 zpZ|H^ZN80!1PQc6w+cMyK?&@_fEej`wipB`>>a&@A>7d2{&zTb^Mwn7YPabgRI&z< zT96SaX#WDz6O<&<7EMzbvB!FM7Aot7aN*@3AsZ0c%5n}5za_k3d;ee9YiOf+!6JP;nnCRIg1S802ZlHOZe%gp z==C=4RUKLLbzB6S(7Hm=77*eM=mgy^AB;9x3 z?X26X<)hAW#{slAw2rph9g)cg?J*el>F7DKg6a`81M-A|9^sim1s!l`6`dYAP(=%X zg|#$@$qppaYTpjqJcYENngO*y2f#pHX60&c5l7L0S)pnCrJ1l>tVS}j1%wa?uNiJh z_L3~S+^%xPQ3o&!xH(%7-$w#!FceNlI!r*femE)a>E<`BYF8_2DQGWvX|pf&l?Mm* z-I7cv3XUG=nSs$I2wVODDOxVOs{37?5TFP82%6=FZzQ`p`fTqe0T}U$mmhkB3elgT z`39m8XP>^i^DFCyDq6MCqD29;S})N$u%H280a!w(HIB&4Z1H|TCVkBy95+B_U!9N3 zw37g79hQbN;EiT~EvIO;TC|{Ag;7sh7M2ACPym)yFJx&pNV>`Ke7&6l=x775B)d;n z)$DGUOLl_dnG3+soK3u38JNS&l98`QzQ_=tCVV9#O}j}{Ml@cVx;*I>4Q`(0y!!5n z!aRt0hC2Ytd?f`*qSKCuh>C~e;hvhMbh1f|$h~ zj+82sUkc}w^I-C}qcZC~BRQn{{ThUIy`e3F?Y<*KBUF8BcrmaA}&7U%ykI> zD42G8cF+FNv#Z*+rG&TGqh>}eXjRW>OJNnz%QB&;g(d*CP%X+c16T)|8U!erPG?3% zRaJhQI7@=G?C$QKLDhjogulZDL7gTQZfy?)f3-7ecvKz|4Vgo}1K zvhS!L;{j^J?3vPTn@{qW7SN=m`&Q=to>3p~?^*mQEYhOORkP=h@AY*?T+|bY|IAAO z5-q1Iv#NUhLsZ1&_AkxpuzJ>w5sj*mQy#UbMui3R2pV9R2~aJ{sTNQ@D$A)JQM3vN zD7YuEprJub0-$8uk=guP{+Izl+IDx>oIm>8?3!DwyyH`zG(ZfbA&!Y@t_zNCcb~-Do>U(v3*siKM=lu44_RLt%;ZrT3fYy7`0_f1Wqt!Z4 zSJVv}4Pq_=kZ6WKn?`@FLwJj@-QBj6z_qS(YoQi;RO`97t=H1pXkGCz8qGtJ?b~hF ze9yiNX58+6gKF11)XU`(0CkP)YKkiE=^M%IF6{wucS&bv#YcV5mHgJsS+ly?dJ^JL z)qzeyr|6MI&ji3)zTndKq%OXSb!#WBjSjWiZyf*#5NX?yO;)o}&H6Uy*KZNKB|S&% zfj9=3m+{0f+&PzQV2)@m@ywDC*uciqqi8#wf9=m2A&slMLg%cmJr;k8l0-XPneETX z9~O7u>xX$m3h7BzwN~v3o$AR#L3w6W^rSj1t1zRodeU0xNl`1aszaxs8we9voCHYg zF!ASOu0#P=clXSxDwp{Lk`Dl>tYa+Pgb8jQ@(dOWBsY`h!4}&Yat49pVeJIzSp;&-EG^E&@UqXmE%TcMzuGV z#RL`b%%bNms2I@N({m1hJ_wW^tc zw5Y0{&?6{=p^d$P$vxB-$;){ZWA?R1JnZW34s_c`EBdKBO9o(;#LQ1f`1MJ_@?k6H z94kc#Bpt7t^S#%1kL(jlW8nvvlD0&9u>VLcWu zA&k|htE*;LRZ@aL{22<6*laqYGVy5|9s_zH!NYD>*R1YxnH6z>bWExor(q^lO*{e* z!~nv>FlmSfP#Iv-5Hq0ac+xX~7N_>c2FBt;EZdPTSD(Yj2Roq=0I-e#?3aUkGNdeUZkKJ- zNl5)6Xm{Kt(|z1z7;@VS5Q1Q~+^4JDcFA&-zvR*7z%A*wEoRb%pV#8>>{^%_%5)QTx&vtCE9M=ZrR-EyCV(` zVR9}`Za^SK_b7auVfIh!0;L#-efo6%j3$7J0;m&3Yv(}gKmim$3yPgn@1XEZ8tlor z_|;A1B-*l4tB#avRFvgWbxf*oI&=UET8&s#fLdAD zf<>)G)uSFzL;drxeJ9(ryOde2kc7rI&8KOSB80xM=O+YUF74wKC|Htd+p>AbaP1fH z2!JEVkV&omnyN`4_0{Odc|jXg8`{nBhWHRz0#3I@&W)NT?F3RFo$rAVjMJsG2lVtI zGyyFh+>w>3g&^RQi`UJRu~f!me#gcq+O_C>fJgc8)FM)()m0blH*<#tmb(;5k{ava zAjr416#}64>8-^t(C0gnJK`3GYz9_l8OX4tG@9Wp;%|C{k1hDn>KHal!;(nr`g@I= zCfkSk7)&-OMfAcHK+&QFEjkO;lODAI>c{~{0Tlo>IY139!P5l*1OQF~z~Zs`#~oRL zfTK^y>{i%n)R9+)`AQEEP*CkdKpc;N`l3jQB6aDvLydbSK zxxi=19Fc65FIlRvJb_jt%QM5$fs{!D2m>>KFcdbl7HmK$P%HBVLZ1#n-46mF*arsh zN%l0(6$mdQta1BizOw;yDi8$wU)sGCKz1iwy(N%0wUyg>kYgBDf)F9VjJ^9+GcU~R|@F4lH& z48x2Jqb3I87=~2KDLg8tC!VxAO-x}3XaIsyt4>RhAPFQvf#(J^1n5a`^u&=Rrgt`}|iRyB;)3-X9!mA#4Y_r*p^5M$Ei{f%ua{K_X0%^j5PcivU*Z`1O4R$5!jS zB=Hs3GsFE}viUigccfkZcFIUvVt=53byxxDC$3^I2r(wzzj>o4$7ZgB@MK&q>%A$* zKzu<=3@{Awc~d@4F#TXd@Vr5#Ax&B$C~W|X8vww5U{&IxN2Z?Wj7VT*j~{aE^4Qz> zklhW-#W1Wqj+uQ@Wpr%|0U-3rR6~>uXUHCH0Ghqqz?UtsL{zQmK$;{W7v^q9RmPZi|19ZBj*#0LPno z+;*X!bgE|<2tBgEkfJ;SsOnTRBdo$|SyWlIqC!!tT7X5s*;_np^Rn58faZD#7r6K5 z^tuKoX@>f4QTY%EV_(Dr9$geuqZkOwWWna&lCmHp@xEbB8lZZ zI_J^j2tU0%0a10}&e`7HRx>QX;qh8u&&mPn5kPrnMsy0A0Ys}OR8PPuPZ~f}&j`y! zMJQ|qDl9t1B7OdOt4D$WtOe~o7xDOfh9XGJ*0yKcHZ@KSo4yYAc^L6!6d)mObNsSH zSKR7Lfbi0D4z0KL4J?C2Ez4XJ`jI^Gz{`a%5Pyehsnp&YD8xC!?tOGug3&IfTU<{nC+^v z{X|k)a5>fb<_1tV(WEje{}v~Bbtn)JNG00c-CbR_D=+2Ct%mwof2C!Wm6^WMBKa~D zHkOp8y1S~X-1d`5?5DOgJfC2?m)<)CQ)wUl!DA#nZe_3Tw zTMED*cuvPtUY zFACaWxm_J-yPYT7&mApjwW?ZG1|~EEL&}UC%Q5kc9GZB}ZXli+(tA&0PXQB}oCE~R z3b&tCy|69mWs#J+q3!OP$4q(>p_g0Dgz6zCUJ}F1miRD3JTa(W8Bv`wU=owST&+7{ z+L^AXkEp0@ka|@F!|xkaAdFkjDFDpH4xm=`s8t12HG_&4RhCE9!NZUqb?6Zk7EoYS zEe;N74-Tva4FWw5S7udJMWwI!mWUL$qiL4i-GR0{PZHkZwm`8KIzWjU_p>z`iiTvHGiTa9i~a`*RUi?WU6eteigfaqzB#6X_?{R#OYbH zvKadah_%o!`NLS@YRaHiW zZTfYwWQn9jE6|?Z-99SlVZ`5|0FdStj;!~rdVAm-Mxtqn-Yv_KW%E2q_*>K#Y1>g* zRrT>6^?gjs(iUv!E?2o(dXn>>fwPZKq+cVR_yfc%pHD_G(~hWmZ}EW)&)3E>?X44| zZm0GcMjI**BLi|Q3X^8yQFR>4@}$!#Go&cXlNNYpnBz-P&4|Y2o>;=hekkZ$;fQ+A zdaFNGk$H$-mew0&3W?fp}1(-pQ&ubUHK;41>xH0|C?+ zoWc|a0g`$9h~J)se%aV`5NSz4c2)ZWZz#a;2$MRu% z(!{7q@2Nf4(&UpRA57F+RaG8zznE*(i2R|@jx)7 zz@uuIVFpGmEHIF&GBIrIsj)OQwI_EQ%eJF3{(OA;2jEvZDvlNngQR1RPKp!|RewPi zG}&XvDb;)=ZM__a9=2#vj5pvu>DHqM@waM1vV3K_qN?61I@hao)8=98lmt?ePdl2^ zdZg!%EkIJX(^1)XML2F*(teFo<(5raqy$Rr)7$9LlfMUvEsm`CQ}w4JBCX33UX;^z zD=Z_0M8BCN^f4xmf%rfS6W@^XM*I?!FIcOQ*;iyl_!bSmGCjWAeoZP7N$YKIHza@k zhIrz+NX%^qg3m48pFc;XhH*v9XTAWh^lntEtAxFuf;Do+t!jI zLAA{}xoQAB7Jxk2;Q^s~2(&z+RSrcN^-P)()uLg9QO`^|mPb&~;8<81!XWkr1WR^0 z&Pj(;776ZSGynmUjk_C4gpg5ec`A8n7G8(%FHTQ7RXZ!73R(cPS^yLPEr4nPMcvKP z0Ow)@w$rZ6iUZpc2w-9H$d-WpNRk9WX`0*7R}+4 zTVjuKoO}rXX}@h#Htz){(>t2i6UfW{ky+<71F(fS{=n?7jTkq>k?p7N)(`{;K)XQ* zP?LUcQ;Cd`QJ8M$4yO=;AXor_qTY^cOY1oGQLMcI33OYL?%%cyQb#7VP8$S3NBVgO zbku2TDiXkBWng7oaC@U_@fFlqJfM&IGdmhIS?qM_MLUEc*%9?i&3xH?HlvV10`dIZ zS0B#;0T{G++2I3Qq(SIWC@i+Q+S=67uZ540q?++aSeb{{$UUdF%%O zHiVYwAUhVU{pl8v@qr~s2#K2r+|&5?u?UK!Z`zLLOp|1@$1MnIL(sH!G`tvzN#{}i1Z~}GY1Zdi%Wa3$iAU}2+fs3w~2v$Q)NOE6ElM_@&IY#iD8(vGr+_Pd(Xwa z=iFC@vbdu7oQ4CrubO@AP%)e_ya3rIFW$wpI+jmd~c6OZa9)~}hR!5$fgWnOL- z4U+2S{05H)tR_XqUdMctn33)Drq%3wHZef_hKcW(H?hAkj}ecXB*=47YTJ@T;V7Tc z%Wif{l7T(Bh)PN`XRE_kk?5u&%e172o`3|35)Dfvuc0N#+pJKA*qWI#)1*nNO73U@ z{TqG(fJS2x0zq0jE|R1`ZGbp3Ns>icAlZ1^1CI>iMei;oNljCe6gO&htv989V2^77 zfci;NhI!tCptc1;l1S5}C0?rHnwDoRd_qVhW0@|4V_HX*WI|tLjyWRoym=sC5hO{A zws?_bA_NvIvj`*1WM_kvI=T^PMp=9r)omY36i7Zu%RrO1Wm&}0Ccs)RMVMXq!4wir z?YOOsjy|nw(xa;CG>D#w(-T^lP#)AVGqTD^8$%cii&OhJ*y{cag95<@*fN;zSjL5t z{mmR?5@DDNFQJ;W&1X{mPZ|hN3rLBSKnftV+v3?@b_<9o;>G*OM!YmiQfuezl!AOy zyZb@42yCO{UW6c6lI8w*@!Hbx%eaN(zg?Pszu)$D$^?b@o8F~vK}zU(zj!ntE!xbx zA3!fekS9C?D?q#uGTsVFvgxz!=hK=l0HdCiCssjWCRUGnkVgeQa;npVT2)n0+}LAj z5Ccnl@`wobC6LE0pnv+<{UGBJ@bK|E#sg=}K~0{GK%*r^&xnHRR8Lw3 z)dh6V@FU=JxsU{etNpdj)1PNyz9XB&#nLJH6&fF1xPiB7FPZQC>w z+O`k0UYgb`Qy0^sE~Z7tv&ZXMRY&MINKvNkaJC$zcKDh(k}VfP>9*Uoy`r=YF~ny) z5DzfSk;ud{FALw*|K)%sxSKCJ^ z7Qvj=EX1e8YX&CfC1Wle4(_Gd3*lk+reizO(T9Biu!~NQ922%-w*Wv$lx4fRs@t6= z3gQ)a#V~2!W6Wz#&i{f-$MXgRL6X&cWcJ~~T9bOij7R~1i($w&TED_HPX2>$W6OY# zf$-1|0u*U0Z%1A=hC7J`z^EExfLI00`2&(bpQ_WLK7Ebpen5De;zB`^^$S6>Yqr}gJt&~B>O0O^927RtPf(zl3P)vD zpJNb2@jg{}Y)jK06k4;YT&AU?8PG-nRds_!t+ch#DmtwjS`-CM48y_Z@o7)BA#H~v zDyz>v4j?8y=~0iG85MyFf%uSkV-6XBcuTw`zRK_p1#CP% zLa@4tsOobLUYgl?%m8u#*1sDbu0(9xhb<{W|6QY}trMn%mz`@s)UAkCxC?w&p8*IBa@3V&$?02W)5QSUz|*m2s<%fc@6 z`D1_pNwT9!d;hGbYS#SG-)dG>+j)oxi2 z0w#C_SSMOLr>cM!6fJ-Psz)2O92C?-3ya!V0H8ec#y}vJw3DV)a=A1uf z&n=d+d^~ZAG7xWxV;C5Ao|Yjdh5?3{cmO5_WMWV?5OwhwSYpOQX>~_;n0-%-y(0YXyt@~~9A>#{XIRG1b62N2|cM}!$Hs1?j zlDiY%YtC-lmUOf+Gw;YOnF}VqVbn}om!u3sypRR}lY3)h2zz5c;L56x`JR(ME?u+c zw;86|c9QV>Jh5*~3KOf0$w>f{z@9p}od@4@tP(vyn&l4p@qNzO-L6xoq*?_QEvt%F zt0;gYY8A8!BdVZo&y0A%A)Q*?nrhs&Byn z%e>^q2D|A}@3}GtEwkET;-<@Xq~Ami$=UN0d?52@+3B?Vtl7V4Gl^e|Pox00AMpdE zL^BS)*NSKzb#~Y6uis|RdINN(@j`q>d}87u<)b@$x4@YR*WW>qXge~as$TE4BFk>q z7I)R3U_O=jE;Bm90NKKY$MVSqTmu@71#pj!)%gV@+ICgdkA9Ej*Nh673?t+%8^N)V zV_^_`62R0X_8>@p#=ih}v}f11p0hi^C*e2dW*ptNFa2UIkcY{+2mshEp9E?7iofw^ zvl8$Fo6PyWYF4{!>IpD=zm6`OU96ahYp|#5ck^%fzAXrxTuWA21mT@uRc2~{Wvw!Ip^GjCCom~PE{ysdh z9a-_?Mlj8?E7GcpSlaSCl?cJf2@;U&@4eKCih5g%6zg(@?W*>X^m{iPi8Ch<{5L?_ zPDfRI%-8oiBM7u?ySi$2^@j%KSRE*!b)o=zbU}*(Sn1hGA~V3h2Fc4#S5~~u_v{M| zNXt6PRW*BWC`qJ#L9&fPN)j0>;B~BAa6RD|8rl zPx#B>6Y=R+0t%L7$D95XEoA|QiHQMXR@EvjOv)n*8nt$Yq$Ev~AtmH*Wrw!YQBfar zDS|-Kw4-)8n+Tn8JnA&TsHjfiG=ieAs)tDv){mYz@kx~otQ9x{T%ZXo035&qfJM@> z!%>w#N)km{N7S}kf&2#_G3Ff#q$K+`wHo7=F2Kj@V2?#$19O2xyDiJ<%&dB!-~Wtt zTm-kmtoRO_2@pR{g+$R~+NL$t%>v5@02cx5ZuZ`T5a?T-_nO~*p%vO9BsRZ(~?Qym5r#-uu`ft3idC!Hh z20?+eXhv&=u9#S5U0_i=>j15@tut15wC=V|K1SSct#Dmy377yUh`kTfiK_aZbESYF z_%Q)(KO?d*DXV2-m?6!eRGnp18{xOFgBEw!;85Htn&55)iWGNucM24W2a3D9OYs&c zPNBsKQrz94kemNG=dOG1r+mspcAoUFaIT*G8f+ z7666`G^rpuFOD7D*={aMm464Vg5vz4|&3?ZPn2Q`JPV}`kI9%)QJ(VpFB0b(j zYy}&t+YUFx0K+Xn>5O2O%#SP8Br}K@VTgu0Ndd70b+EJGd(U%GpYT7Oe5{UuDM=fZe?#Flk}(8^ConoqJG?{Vw^TOU_b$$~27Rt`^EsD|nXL@jPF zxye40U({xmtEm7lmy67ySy{Ixp1+#rct-3Tzr8Zla2ab!g~79AdB!c}H6P2d->Rzs zXaFJz*w||3cmSoRr+C~$M>>?vps{5nUKvr7OoZqxzs(;5wgZER>JvErPj6_AMS z{pR?5A{DNCP^^SWq0 z4KnAKPbfD#L*CQ~TwH#7Ac&||i;bEuR6y=@8Rg?QIO#+;S=Nb$)*1v&alTy)2zNs# zKjr=>0#8}(pBUTGpe6jIkZ!p zN=CLfu+hskuHI~Ykoo2TR7bLp2~R`l#Oc8aBB>R09oh(a-8T^I?_NquY5nrN7ziN)^^KdmTRhWb*;qmmTNs}6yS%Kg!HJjp7TO_>7QZ(aGr`X1 zdMGQ-v!%cw57t;45o&zFC&Jj+4ApA7kO~U3Im9DkLlALYz{qWvl4oE(jt;brC!&!{ zlI9bx*=ZBt^vCZ8At!fR@eF(s8pU40A*5omhWAJWd{38t9seK!P}kA4n|4NNW)L9FyUg43o3 zC%2bAp&)*Dz;O(p`a-?`f~~!e`rQ*ppqPT$CX+04BP(2>AjxWi!{LMZM+%@oI*%ZV z85d%NqCvYW^sL|ObK113u%#eryDAkHVzr?JUd46+A9qyZf>v{|GC`%39Sg$AXMG^& za+eb>^`ZxCP$eK_AcOAVjb2(%?IC=K@W;QP3Pk`ZE`6#obgbhkg4FcssueK!pOIIP z`t&63DkfiCLBe#gxf}nY(R_xkOsjRyXMYtAvkcF;@u2aAvVns^H*0D36-nZLWH3M= z#PpIk4HV~#drIlPM5G{4H0znKQF3G%u*d(7aj?AA>9;>o%rp)dT)M2Do#F8dZH7&1 zhFGt_=gnRV-Du%}fLgXi&=W^1T{6ABVY;`>XjcE_s?!A4_o32#C#;Mj$v9*soiRRD zh&)=DFjIYJ0RJtcX5ht7F` zFE+FxzV;d571IS4`_6dCUSlCKG% z-MbA~z%?ZFVm;K@Mr|*nG}WuOWzVIAV7)v0Yha-3C9WF4LG3ML=BpsvYovjJ$hazn zN83DUnAl-3D%dg@ynUcD%wlFyINPIyhzyRD@8+Km=J6429&hl#ih2Eplw^wLQ%l1bdeh-eRB znGgHxx1B#xCJ3(`O-Cn`6)J z4*sR1h18!D+YF5_NBh4_t*Hm8`|o1^r54M|s}S}?J9r52OGO5S7t0P3v3dIy*eBwQ zGEpg_^7$4s|_M0fwB6_@#o26n2} zO+(SFXf?5>+5m_Upb=WpOF5*XwHozjIN;$SD-)^3k&N|C+7f{RqzFS|=D%y5(kK40 zXKFUiYXhoe`*y~lDy8npNpViI#7uh)j8plI zFQJh`h5|kWsiMjB%WPp+#ZshqFDKAZyAS^B;YT?z+o$a^LGVC`cs07Uzie;A$&0fi z$5_5WE~|~UnjPU`*EX4ZOedBffNU8OeTk)d#OnAXAUt2I!d9BWQ=5sL8!yFp|NS*` zUd6g{tP+5TqwP3^?1dHJnSzj6hQ&+B4KJ)sG(V>~C5(StX%+9xQop7_3HKWLRS}*; zTcH}1`2fITxaN9KeaM_6iB1ZmBni4f z?{JrS-WUI>wWm=EkL_$63bzVhGy$!pepx&9!nYa<}j2w4I>pk z3+W@Vo9}3a7wwnmP1reFBC}fL_!U1lT)SHBwIK-p{NAJ;?eP4m!VJSHU0B4tYIzOc zti6%I3rq5J)@=4Ex{~SEbm&D_<%^MKwi#*H<7E4v538+q|5&U_nq_7~pt8hQ03tf57G)+W~vIyydzuoS;OuRvrkhLQJXH(CqBM-Y77tix8->o=vI>WYZK z(#J`=p#n-gqEjeNX!bC%z?5l9lali2>LZ^6=QSIO_5!i5XtA*U##2VAuQMc};WC?+ ze>+B(2lKLm52syAC+S426N?uAU53!TQ)ECZ^pP1y<|mQCkQD2eMm0< zXU6WebUw%h~VENX?#y^VvU(@p2G%HjfZ56_(q;x1E z!Qjs@OKB4A9WjZV%utlB_!#un6bp#nnw{Owsy%Q{K5qLHW%G6bq2c(#Kns$_{5#!f zzncnGntMq!E?pKcnq-$;TXzN+ATOuo7ac1Tr>E8TSYo>wvE+osae)T;M!cNh5Gnu~ z?7={5rYkU&zLvB~AHw22Lhz3h|E}s%;QI!kDI;FXCvQFxM6l|U?-Ll(u!6Zz+X019 zbR$f=lHI;|9oTzS@vXPr7K?nrijUd<)5DAXt?5$gu0B8ds^KO#5`c|}2hfoehiFQ> zNu?FZ6UwRve0#7IJ3c3_AE`O<5rz{jMs;ushh(M;WLbv-paAS|krOyoB;!V9q3?{! z>SULSEABW=cU)hstt`PV`uAuZpMnl^gxmt_91m~b~N&j1mJ1O*%xp;0ng zdMPfg$oGw&jq2iX0-%C_OG@QXWbC3OW3ZhC4Trw(4?bB9f;erAQ>iFUZg z?W1Y@wV`%OoGik^!sEvqX=ub{4rkC6GfJNR{8KKu7k6}0HPz#*;VUHT0i`Qxe2FXo zUBJUXv9r)l! zpeX~{codSpEW@k!R6~V-wY}qqV!`}TKNOZu3PVmYfUL<7Moq-a*7ZMM-3jvgs!|Bh z{yJLK*CuvyV$Sr>oeGVdCjn6|&_4rI%#6I5$y2!QS0^Sg7pyNXbq9HPDBW|J6K%nA zPEJ^eWJ8h`7)J&4Y!cQ-q=LzN8%hGS9 z+e*x#b3~k*oOa~S@tEg+?$}Vq*qqBy^yD6%Hmq(85G!IwJ(R>1w;32 zmu$kBZ*XotI)TY;&Gc+-{sE~8T|W~AXz;u2Hq0u03IJsiR!$yE3>kr|vnMh; zmX=fB@^^5&7Lh$?%2g?Cy!?~h^x5=@uv}^1pQhc5jYN|`N<%p6J)9ABMbI-gs?2dF zZfgvihlaNS5RsL92L>gb-Yo~hzCEXSZS@7-zq+6a2S77jneGuz+0Sl%f3}AO7>3RM zV!nsHtWGD1^8oe_Hv_A{jpz+-0r95Wi=8Af&#B;L5!>_b{k85F9Sv#V`c$J`UnUXF zlj^;shx0|aRXJ<<-rb4+hJ6SL!Z!>50tMd~c~;dR!tW@G28R=(x59 zr&B+avuw~1GB$jw9slxR6sn<^jLf7jfZJW|=u-&K?g0BFPN%O^aH@BTFVy+w-oRo$%q3|ukszi zl$jK9-3e~L?G<#ab*<%>?tCqjfP)iT?sE+yj9-WhxXx zV$Y9v++3gtMj;{lJ?OSM%InITk4^IVLp*s*lY3t;3k$-J<~+$e1^KkRf6~wrQpr$$|Chagou9f3bW^noLQw&e~T@p zTV(iB>!vd2D``~HWNW7O3JWnKK-{7D-b2KXV;w{3awC+D-B4nOmj*>1;0O{MM$I-| ze()S}>cC|wD}NIfL(KtLmxx*4I!1S%3?PiUPrw5Pl3_EnCGrpc%{4>XKZ8ir>@S!4ioqJ6klqSgCh0wZ{R6 zcPb$s_~vQn5*|RK#_5+=YL!xh(MsX9=vPp23_HsEq&Z7L7+;A{etU@WRad|Eu4erbdo607It z4WX5wd-))V4Wdl5wzZL;FX*_B@z_zr41%}E4H4OXOIl9-VUXCF{#ktLrlSWXK6Ej; z86}pDD@9gvqHeQR8QP$q|A|i=dc^RSe@mzzzo5dnob%7pU*QrKjo0ijo>Q9=l{kNc zzi~gaqM120fd`dFvHi9{C7agbVl5v-0kqQ}y}apnNa~qlkqPQ@RBWZMnKP(PdN<_2Iak$iFslgD6dIlO;;boXgm&MVOa(YBAkZDFv}w^)9*K z#82QwX>~Tbby#NWWF^OEdA}Y^nsc_h+b?H>ttbQ(3f})Cy-Tn{Z*g;>QQBfDS)lwA zz;qkUTIg%Dx*f9C@cdZo=fDcyW<>|cCY|4TLJyH*vTgbfz>D0$^l99h(>#PDg&y(Z zn7pZ|s9EGdRC1k#a#BxU3g1=s;y)>prKG?@IzX<|r7b^^e^ZNdJ|n`fMhsT?_pL|JnpXYHhQC_y)k+x!M2Nk2n&H~!E15*&U0{zh+*&1`a zllEVN`uL1ojjaB+15X9HfGN}c(+8@)%+(b)($s}-=eIqkz60PKtLv4|Q9j&ufzS4D zw|j|y$>Tn*iy?r}hzAPWh9%CPL;B7toT;e#sb|2@(k|-C_zAb5CS*LRA~U-|!~5Wk z`|HGZwK&wM{Qq&@X;uvdluRN62)XnU!g-Lquewt^Q7@?Leo3MWUp5yja&JIy{9% zS9dpdmx=|f`IOMR_|iZei+l4IU64_eQ#}U~siXmdKtxd`pSS&u_S9mzLoxR>(23rY zEKtBTas5|zDrq2&;t?W6WdgKW0X8~6YHp2kX#%z<_7VVoEJz#pL)d3^dtxo$4xQ2O z28i;d6b(|&92=QoptMzs7p{L_fpG*vXr;gh=?E|0fC7%GnV@qVuzc3p&DgeX{48 zc2fV=k#eTERuDuvg49V!gh5O3r~{9Ci1JzpCsv$8{u?owrR=B>A}I=0cbNdE;ZE6G zNbDOt&Gwg@U!VDCm4Ijh99iwMhIrZwhV1VLHQ$5a6i1hk7Wl%T#V0Oe(+QC}0QH?f zQ8hdPMp$iWVJ=8m9bly>SXrI2Oa9eThpJb0w)Gl?EDqcufEyAt3w&GD z*=B2_ou(>ceadaZh=KH7mgfNC`4KpDKf7Q)TO1je6W=C_UJ8)>!Z^{fI>1c-PkJE# zogU@m<+l$fQcAza$0i{Cv|tES0t1l&$d`wd zBi-(F{+Beal+t_uI(rlS4R=AD3Px6#znXmaNl9TQDoyH&=T=pA>|AnjDaIN}dd>|yyy!Q80 zB#1Pdk3S!ZhlKgiVr_z~GyJV?)b%_?T<_$vUz95n7$U+nXbRd;k(NI?thrK;H5=5o zv&S$Z0N68w5#rW9LF{NgtP9bhZQd`p1OtQ9r?3ib$kLfe60@w6$2ST=(^0Nv)TbLzmoxxPd~|l2m(nGRmBkg{YF2jd(gw6uH?s~kBgMoclvzR&Gd7R z0e7Uc z*r7MEQwhYn;4(A`XQkjDV&b{-0Sq^Rap^31(fZcOwu-ugz-miviBh^<{P|>$@zIie zb9uEeMkT8?+N*`5@E<9}0Z$w!va)Fm>ik<07(iVR96dy6#jtAwIH-Ufl`snn)$Qwg z;1ofjY|?zarO&)mhqK{ooPy8MYzJuK{?tpyMs^1*&YkQ?-1ikDpk3#??m7mZ(Gv#% zIlMLNmzT9(dFNArFhPNPOsr+}L!CuE*_N=yZmdQ}jm@IdhXN8#yl=0J2*_yZUDNU7 zqh{mR>RO+Ns;e6$a09I189SRP9Cno^{l%#J5`?XAFIgRH8;A%TtI(w(KIgHq*gB@& z;B}{(md0w4-h#%B+a7_6#oN2Ph0}tSOD}9hzW+eSO9d#7x346A8Rtjc$t2IrG+5uN zsbXySD>^P9bx|P$g7_&~TbFUKZ=+&`9cXIKh|UzRgE0#YTf-K@i{*}G=d~0yR(-5= zuLpxj!a&&_r=v0ON-!>oJQbBZ^8+NmlMZ!DCu?_`7<*{qcGapmk*0f1FwkfIMys7Q z7&TH>n0|x5`qGzesAPoegW`v;&sd033jeLQ(@4*~gi8h_m9U}ywz5A9D*G>Kcf}5t zjk%zFtP+yjOv~!Nk0Za?BR!$54{QXiS@spr(>t`N%8-%v8tHD)c$BRqTCiJ&iO#ST zCj*neenm~S&AeBqy~@B(sS*5*Uz73U4;@Ta1wOtgogd4U!XK{bn2yK0RnoTKWHtzi zPx!zAYtE1)B>?5pQpHyeu~nvicHXzRL#CJ#HI--Ie4rTrI{&Z6E=WPgCPv9WIg49> zw6*)KCPFZ(S)6^vHJPcaC2BGqs+q->D`BbivlGl=OUfyQ2oQ#p8Dw@P(Clow>rvKk zj;s#GtP$PS2_{GUveUSGSl!M*@__z{*_qz>5UpQ%93--Af7_9jFe?7>%;f`g_dO%} zW|Bf-sflbk1Ee9-^8Is-#8q;B!vO0fgDB>QPHClAbzx>&)#u_DgN|o0X?I(&hUkm2 zyCVGrS4EfAl^Ry!#yEp-(!htF(eE*fPNTl_(wkZf&KY9!GX=tc|7We+x*(AlTuh@p z2nf#+3sF7n6N3Ed>((vqoQQN{FK%+o9Aen%Z z|Fn;LeJ7<1Lo~RC;=fdNVKNh=@fbYKZdg~q3WRqOZ&j;RC#f`@s+g1s zlnfT!ujJmreoyI4{9`mK$Psm5b7(g#xBq!~x$jzrGgNRTO6qgA3 z9a9K+@kcr$Tj}FWb-iT+dJp?q)H`j~wx>HvYuF+9DNd`Be0e)wyscAXD5pgRKJy%J zW~9R=4R2#fXMWT8M2fRC+-$-Z{_;<7_n0g~Tlw)zO9(Rf<23eNzn}p3t{gQ2B9G{o z75Cp*rItXOOmhpx+hji8%56GkYqCsmw9;c_djdgO(AU*;0@hJnCR&;CNdtk?Ggz9D zx9?|vgg=!cPPhND)Wvj61`=?`W|W$nP^HCu{~-JLMZ51JiV6wjXz>3z>e4|VJ-;7` z{lfxP^3QBc%1XYng+ulVQFs+tmALi?!;(dg27P&c2wh%pL$yqUIkhmxKgbpa70Cj^ zb4!%}e;3^e8@URQly_3P!rI1aQ%CS9ZQdbVCJr$-Q8!-;_sEOmU=sx?oZynSqOWXg z?O&89)3+gPC{$P@V4=Z7}_=hJlF#fy+-R zc9Iqu{7-F`|5Ey~@((*}xL4udaZ+zWTbWV%S_gpg_|{%3Qz=5VDQrbm%gr3k!*X`d%GZ|4&MX$9Icn z8&vg}c%v`;jYR?hfT)O$2x^SNm`Oeo@ycB%J|6Mo_CFL~wGxV~^*pcXFTSC%+)Gs? z{N`f&zr=H%v7TfqW-6g_0jpoVkl48e0VsfC8^fx9OU5p=KW4rmD2qY6%kejapaaf< znOYiO^mGM}Qcz~>b!*_w0`NphaibfcMZ?lkg@-XrMB{G&GwK3Op#f?k!C#>5%b%Qg zJB?E|{hZf>HZ^O-jN$e&;exYB);wY?B6U1OW3pdaC+6B8RBG)h?&;;e0B@QcqgX53 z+8YmuIgw%y}(7=D7 zFD4uSvX_Snv&m2;i310nhS&xqVxje0^uXSJf7o=+n<=}26e!#`% zXD2>LQI28DWc@Mw7D?K2KkUU5cAlq>{$v(M5jG4^#bTSryGFHCO*=82Ur-nS_~pDR zXZUpy_Ou~I3-24Is^dxVDhu|}CANE~DQ=-)Bk{>(k4+)+AbmU;8p3Q@Yg~A}Ki`18 zgu>fV{dPv^n=H&q^Wb8v^KV+>V5~`OxLeM_LJ`*iIBzSCH9Dv&{=MGJ@&zWox|Uj& za#TRJmX3$6jVkQC2C|OkHuo=rJ#O@e!W5>xmg&)76yIg1_hCqAar&`!bH z&P1LbtS9KBXy0b5cVEU;72M@8uEzbBa&DkB$p)Aoi=?hQfmJ$LX^yIhw6@ke3EN!{ zq^0pPd@6Ds5%!FI*q!AiZ<95gx$1~SWLm+pE$45Z?OcjnNwq7beiGgTqS)ciYU%&36L75+oR{349F3}-7 zRCkUAtmK!*j99ZSYC1Zyk?$88E??U3h1KL1&{BisooW;?wz?G?M-E5Fk)9Q{%)%ZL z9!|oLt%weXgf)n+jAu~&$A5eZ`n1e{l(CU`ZaxVLOVfa2rLb(~*dRojjV0V^JgCV| zSISLCs!wAVOfQ$qv!s?v-4bapQ0w9%O>&!swt>dH;FgTHZ>ez%h9}$$Z~4wNb$fT6 zj95UL$4)^v$oR)x)RiQ4Bp}<8Lc@84TnAzRN9}L~ssKvS$Y#uVrK-YefS|fy>969- zK7;=j)Y&BW)#l3r`(lw5vo~e<;2><>;zi}p>iV0Mw)CJgd=)Fz)@2b5q5)qmJp1GK ziMy@-28Dh9WDG9?!X>l!3fk{G%2Rv)OHX$zs}vmZNUgbJT~T74We*L~8qxwZh1r-O z-#NM3PV)TK6Uo_`h!+C2(dT86oq@Q@h z8JX~MdaG-yABH3?pu`L@qOZ}_ol=EEvTsG_2iR(=Ev-C6Z`IqxDIcup4L zNKo=U0*VT217&%G%@XQN9U&swR6q!}vh;%x0g=5ya8|jJwx1A^!k5w$40&ud?r-j% z)(?zU?McYG)y(uk21VH6xT{#+2)BQyH5QmL5q|iewoge__9KF}B+Oy#2pja$wQfOdUbq%OMaJ7Qc)*zrBSb zl4>;z=g1^`cOvYu0QS;tHQW((BFSf)92a%kZH~SZOTc!l-ov!t!n4)w7X!O&NScE+ zs(H%X$-D)Bi3r2gCv&V599BzVJq%4I8b}DgZ9%a#_3josB1G1Zgp-fn%q(8< zTrRHG3Y)$S$e=m%iquthsgdJLThIn;duf2Kam-n_n&~%lq_!e|q#`5xjgqRUOrq#0 z9GQG7l0&XZh%r7eIh2Z6J^o2_-aSAz3tdwu{C(Q2C-+m~;wh@>Ia&%+x&3T09Udn9 z0M5LVxXV!@THUVz%1g@e4>S}3Ja;&&?f1c)1pI3mV#8gF!42JY^yn;mRCE!)b|(%D zehZ3o=NrjHP&q*PIF0AJcorypbDf)-P0&b9a0nC#xy1(mC_N4VhA=(N!ZLNpGtI-i zdP>$kBUhjLGVvgau;NEPh6Wm0_fJm63vJ}zEYUHpa5EOn?ze6&DJ0mNW4MW zZI%qWl-YNNaOe~mDqM^IG~VG-lb$46G3#O!L^@%XP2G&#A3f8u!|IF7heH1^;~`(& zc#*9XWge>%MKla}8x>gSJ0EzAfuBFrY|Pb>G+2&iw#Yr5G0PkY@|$vFRuIA?tcX=2 zM7o5R@b=8sW;+JV`TEvbWMpCQ)=`CxNS>~o$3lf#95S3~2)N>LWuH6*X6k6wzo?9} z|4PAWWCw;YU2@rsog{5a)7BrB1V$Om4C-}TLRmNw$c|0!k3-g`x$$vGs3d0ikxEqX z>YMSAt_{RIg$ZRQzuHRtrOEEyQ!j!Wr-N>paY{oaP3cJg%VSqS)c<4i{T<-OV}Hv( z94IkfTU~A3s^lj7Pqj3)kv3V$wB?1c@9R7VKgXa7I#`3|t1zb#(+U z=UKKl)o??L)&xTU9vQKk+obCEsw}X!+*9oDY-Hrw;^RQh4k3*}p%3 z+P3V|cgOb`EWPwK^?w2sj?w}&j*=H#%2Gak6-?mPdWsq=(rX45{3hct=TmsfX%<$B4S1b1h&IJ8f+0&1U4x5+Q3oq|TQvH&P` zbs#OxliXj@am}?6D+ln3p!I+pjOkEBq1peEcNwZ`7TxMhK&qELQ+ZD4N{+fUh^;!# zKV)P>#%vQ!XOnCR#4fc)H3LK^JxW)1+x)F0VXGB9d-m=(kusfrJMt6Pquyp+fX{RY zm`~{-pG)T0D>G#JDt5^^v=Wk3&=4vf!{|@r>ORGl!HG!Tf3`opI317nx(G1}@~O~C zMloBx5AHW9;(R@qi(;Af>@se#_5C_g!C33w@SihCmj!d=OK$HjE^vX)k!(ya9^XE_ zds+a}sjZ!zRWGl#JL6&A`>oycj|F}zeS|kPmf?E)R7Re&+g)!d(}w-&CK*fT51~Cx z%_zXF#_9FIjqK46H6>KT#L;tzXP3JZ*N@}3dy0mgp>prqIql67{3gSgB8oZ_8*QKv(0x@GOKZdOeDqz(dhOik^ z-d5sl!02usMLqo-vb;AunyNL?{ILR_Qb#l6T;1+FUkor9`GrjWW|re!GID&|K>dEd z-_p{uZ24DCsBHj3(xv%!Z>R7!zBK*sEpsChYz%#Uy6uTzqlI5s=0tzN6JEJ=08GnO z$F=PVHBVba`baI*S%Oh)%T;!NSLsopO1d2{CBX5oiQ_7*i|ZB#3S<(b{ou3t{v7bVqwOQixhWq*MWm4gO5W*^bDFE+TOzlzeo~+amKxooJv1Bt8sdgDb1Nzaf zB)^a{UZsMX7O`|#>h~$CX$>8;Mldq?i)CWuGW6Kx&g>P&fe7D46nGE^05rBE`zF)WwKwdoBSxRE>H%z zm=OyLDGUYe@=K_O<-3m5>@{vzNj6Ki26UeH3kCn`Ot z#?`uBzl6hLVZH;j859w(2LJ9~Dk>NM!e(HO>+>zJF4*D`{>l9uY%Mh8PU2s|Q+`x% z%^l#?^Tp`(!-Ix{)Gllqruz&#XuCJP3+?C!&`wEJ!6sp(udXnuXN}7K>(GnPMwsKX z|7qME?QQ>K=v-*&Bl4^HizWQ~rq}TI&4o}H?D9SjmI1v#^?jMX>+gff_t%78!QM?0 z(A|ur6=^&D?oz?Hxb2ESHH;JVy|p7kEeYrZ3T$`pDpOBU$P9yJUJ6cNw$D;aou%a6 zBsIFlWM#4`uw_@;aypOR9U4-EL)Zn)oBh4k?zp0x&nK#OqD)P$!#8+C4cY#suW~;Q zE0`-aWP4nu=8@ZXB+hsg~eBNdDAy*#vEbvfBSv~EkvJ2aid!Ut=|m= zGYqC-N1umUo!oMX2Kb*c>4xP0txOy2ey`Os>uE7T&wfhO@+%vFR24Tv#Mk_Dw)|;! zc6gh00;>eA8X&CND0LyN_$HI;g!YP&u=$R^V$M0!jMK&MA1S~XTPB-aQjvy0e zC#&t#HX7rm5Yy;3_>1Z>@7O3|t|e#Q*5F*U6OXJq^RPq~LKUMrV+zcAc7E{ch=Z{| zxtX5paC36_tNf(Z5IP{ba92JED0Y4Ghj*?~ zkh5_ZQH~hx14#*PP8*)s@jpo(^@(ii4~CKja}OMBdnnX=#*&;K$kwh51)Z-v<65-x z6As`bgOnH=(=$|oZOo5kV@wh|OPO}iSR$JYi&@Q6{x@9ZyJGF&9&dPw%xbI%rF7;cE;l`c*95ZNUw59H*jpC^JwkM(TQmeF_6uviBZ;JV<@m$u3R;S6r^zS@Cw<9?@ zKz-!xY}>o5NJTcAKg=w?!IbiPWmP)VAEg~}C@`M~7kCh*eh)#%gF|z8@$H(vKjq%g zCO#{5hCMg84|RxzXDoNcI~QM)rBy=W`gVW5|_x+x0YLyPnd9lahGtF8LpjFlZ5ZMy0#O7FU0bo`LO z>TEDbM*1Vpt|;)&8q>A1v0Iz2X6>K1qszbCHp|LK9Uq&^sAJ~};u8B!JosOhwWsbF zSq<&O3V7bj6JhXxdfVS<)qiyaoM<#Dk)PAj&MgMz08wE_0h8=zJG=0QSr6xNzhYOXX!=(vQvN>hWFAujoH58sGpSb7iD!#txByDL2$bkX?t*=&eh8pEEx#pIC@Ev1BK)h6GZQAZyxMD|FwA zFDyg${j&K5=F}HfxhtPn0MB`5x!l+mgq}r1sg-jfR;rrQg09VWT5zlCbZ}5LK^=qV zOUsyY|IeU?C>JEs)vf8tg-h@Aj(*-J&JIJX#wH>ne!8KWP*KXrNwRxRQwRqf1yJ4R9U(W56p4NEpUy;}mNZ7toNt8zhy*=b2FWb&7 zX?Q;5@0%<*&5U>}!f{Pq_CuTwS2L+VMx;atR(iNWa&1^WLoGJ_2{RrZE-(4{)^hRg zPa*hSu*(@ME86xo_MwNHXJpN?(z9NE>up6Ho)B`jt>r;c3~r7mx=YYEdm;FSeU186 zsziAz4%P(kn-6h6);6r4gva>`cXF^?Bmu*W+}ZYqczb8n7V4(Hx*guy3o5+(^9kiJ z$8E`NQjfNHugth83EUPqoyw}*kFGByaFKp%Mc&xEoV}p0WOqb|t-z{(dRhu|62}j{ zO&>5!Iq;`fB5=m|k$8@ZX6*yyq`Y$1D(N3Da1yvqcgnvW(idSKzR@Ea0t+55thAOD z`?7Z4p0Y)i*7epS8fw`E?d{_mpoDv4j;xK0B)*Fjb!*k3@RWm0VICRKP{YO#0JNcb|RdHGU;5d(Ayx6247|i&&H@wC83o1M@ts?D&)ms$NcG`8^eNKSx z7Um-#SlOiu7@sg7cKqdBOw#Wkpb^Zw(7*cS`E6u%^?}w3!M%>o-n7Q=fQ|3ltb9Jqu!Ad8`p_ChJ(e^pDZK$C@FLAxb%!4L{{xq ztyXo$1OyB=;zripeC#cm9$U9v>TwxLo7R0*H>ju_1(s@Eo+Vj1P!nkTPHaCeyho$l zlu1Erwg5GJDsjIeSNqvefQV7>k#%CW{#&jNnTa^?)1VCB=TP^0lBtyr>KLshlLQt7 zcioMv-#bFEie0M9#~7Sfyp?G2(+eZ=I9fFik;`#&T`X?CJ)?Yg6IxG>V4qsz21Jv0 zY2|<1Ere1UZGp>DY9Xwt{fJm9ISj-4E@V{$r8rFerSG6tM^eLTq~?5FQEyc>-ydkc znRNYp)b{qxRfa#}*st3f^7CY&`mNeH55qdLMk&1(`;W`{Ji2onKIGFU_QJ)4-+99H z#3!QY-|Y8an~hUwoUNNVPorvniXv9hwN6F({Fl6yYFBLUyav~zF9CHlVW>OH>um(j z6`D`cp7@{jI9J6oGlRx(>d`X=53!V)uKxo_K)1hN&}^_C3i(bH9>}i>w@5Qe>9bbb zisVD-k4$=F(;jCE8wZtkk~R7CCDwCb@_+)?gaE5oPJOEjO8ymjO+t zd`#>-MyT%NSC?)CD+(quXCSf}liVILl7O;rdy2fT$Foc1U=WE<$KTN0dP?ZOHK|M9 z$!QY{x#@uK_{i2a*==YmB!p{s-+Y7|_(WFD;^^(>$n+T@UUy z1kcIpiVgbjvk=_aO;#)S`~#oUr%xS3XN(c&cCmh+n=k_l>qixyLH28Q)&sh(_j&Bb z=YC$ppUR==i4>cPBsG!~G#&Yio3%M{Z-l>C=)d+2}9T)8M)Fo@5cFUBN`=MUn%K=NSjzHFI5dJMPUd~2sX4l z!5FFXSOv!hA!uMy?iBb^Iij?9|2N8V79~w}{yYG~19Ci5|IF~ikA}0gw#c_nwGCTc zP2s!PKdtrYHD44As*i?cI%w+So(Do=E_TA}jYj?AE)UMg&Dz|M`>>(9KU+{${$%@y zhXtZqbsh@w_EdA5)NqzQ_v6Zqzc0UEp5_UH1Pn7|*6L7w$}*oS!uOW4&T?kJ zmz%AvgXL+8@7_)ojBMFj1x?Wj`o^q@S-@K!Mx1A;ZSxQN5gLN-DT0BV8&IB{_6B12Z62=@YA2Qco_Z-75CTo1AvG;qr!|Eirs{$ z>E|u_pa?Eihb_e1m2~H^@_|3Rv;DPEJOBUy05v1<;0^#?r$MQk7?KKyT3|3{>$qH0 zDSV~hutXa5ml|XHXAzCEgo&QT(l!stRZE?g=Y|4dn~Q77n2}NhpD~scgf{rC0<{7K zRef{^p7jc)jTmPbou`p)N9UIZLwIif(E_rnPOU*{XU)@LjsG-b;qOj98(`V&V(p8l zZK_7{T)b`R8DL4%P~?XHNiB5Ir(UEI|YP zrDNFVP6S=FPeuq(2C!W}*3y~JoT59?vDq7yV9ki0Rw<}S(R*6b@uM;<0*&6Uc8z<{ z*qnO20#s&5nJcmJP4lq>iFa712gv67o{BOS&avX+8y(L(J{?3V&7P7021^JuRcp~O zIwA!}^!ey9k&I!TmvGiTT!!wfq9QH)n-vk8Ow)h(Zka&7io-SGJaua8Kt2B002yM!$k_g3ul6c z^9l#M>GI|Dm;nTRo(Q?kS1+%B5OnYGH4H2=)2H7krBAu3oZU_`ONU(r$Rbw@`l+bt zGI7-{5qVkSx{7f_z_{w;3(3L_P|-KISGho-DNUJ?OHGKeieN7*&OPkEPpM%X?1Z$} z_gPCp@H7=YW8x6y=>aQ(^>~i@-lI6bFMLY7>^V#)_0>^DF5yckh*|B&dg#0Gc&*=J zbz*xrhOR2WlN*(jH-@irx*AL7CYqUcIkfXz%W=8Hr;Pj=@aNIkk3;xnTHk56s&GsD zpAaI;lmW^WIx&=1prJ(czh4OZe?CtfujH-c%ID2V#%u%_>-~|$#sT$PHsHQau%_~p zJ1u~aB}ne9>cRz1=y}Tr(a=`}ZMs8o$wGjTV=>_ELvVKz;4aI8Ka@zu7Xqzdym@FY zbzdn;54PyVukUgJ>2ZJQF+bC=;xdCLM0%eqcmGE;Niufc7BFQ)2Y%WgS{}msCB}16 zD>ri|ox7RXnR>k3;EY)ltyp+87R9HTD zQg&l%rH?yEM(%nnWz3)AY~#^UMkHNjaBF7bFM1}pJO1wPX2%c)8XSW}(+W~jR5pblq?%`SnK0psZ= zT?SqMu<^72od2+3a9_1bXfSGGUc@@&wU-%kG^Hz6YgAt!>zcN3YS61c_K__sKM}^h zu4d)9AD4fZWVd4{hb0$9n;(6nhk>PW-4yscpsb6#_%sgZVK#b=Mq^_Wt-b zy?sDY=3xKjPC`rpvm?&-qcA(B)!l&0cJZK~KQNXYfl8>V3OFb4EO4G~E(bqt&YNn7 zi*Us?k9t>17^N68eka71qEQS`u)BJtLaAxAnLj(Fud2JMq#$O#zas>MM--Onh@fv? z=O4>vYMvKcCIP8RQpb7!$p=xJXjPW@P$O;i@P0+1YumM}8mw!yj}^3o;`&t??s?;R zT-ET~{4Ho1vz2CuDO9E2@RxlX3$Jfuoa=aACWuoTTQB0d%g81{#hyu$of9Bkbq z&e-CI0Rv?_`Mz1qtO4y&3I^8{;IHyI^fOlqaRFVBO2)q?6Ee08U%*-EUi!LE7 zB(#$-@Os~a3fq@4Y|r1_^J+@w<9ppyb475q~!#`KbY{G^36=~L+kf? zfWdt-e_RP@TpN~lugEuMex823%Ptm;(ydDlJ}xE0Tl9L%aUS2L=9(>Eqw|)}i8K>Y zRM`nIf<=1LVAjLYK)^jn{hpgGPXBco6oPIf($vy_NhAieGGw|>ZvqfA72A_uZ3)q+ zZEoXIU_t?9_at^0PF-3!rM94unTD;aiR92!={1Dj02>hP@kcl8;=x{XYe-{`B`UGb z59n|J0LG2{ol_xKf>(~!HN6m85HfyE&Xf8k*#;PU?Qvov9&1oY7JeC=84IVl{2BNo zR)D43KwmEuulNJa6{0?W&5(iUnftrOBgw58N^94xVedo2=~(%mBU-#0go63Pq9f!G zjXR&?zG9%1RD%dWu)h2duhn2|br&-ISUU*$D7cTnxi>6m_X%n=-x9H=swPwkBenTJ zl8{@c>2<9puyFonq9yM>>ThU$WyZL-d>cfl#$b)>js!`mq*lyT3=Td7CJg^YoI02i zV~T0G4jdUAk-jptNIm9EL9>yd6+~=`niOyVq}h4x{#rDZ1twkSq=3b`>FaH-^RW{D z0sIgkzp5R)H3Q~$1HACyCzFE^cCu#;CDtLjstb=MLnKFL>vR)gy}#{)9m7-bfW>&2 z7QkMoCYoN$TQJqi!Yf~VIw$yb$TR(i7&@0zX%Z1}403Vbk1%=k!Am4Y<_3QXo*{y~ zqoU_l8sdc^FivFqkfGi%Gq9|D)=+)xELGdthoTJ#g(~ji6H*+>Yk9Q}7yUn#yy( z{Z(Sg?~9U9@2<#{Y(9J_btL43&rMhFBSBwfP?Ri*YatfDd%Y%hWoudYvqeiu(rA^tEa_KV2j=x)W9*gw1TFwb$ng%R7M9`f_bx84`|Qm#Z+?cW9C#}@inI% zkE|+;1QECLZW3}%?w)fNy(_f$FeiI%UJXf#nKS7@=L}dZZ5&bZCUj|qdDz)3$0Zlq zLKv-sKF6IWi>aq3r~&=p#;~R{ro{vTp~mmm@m;V*sXZ6JV_V!0*9U2t$va8Qt~u~; z38L2+j_^lbkjqF_4fHl;m5YaGW9~z5J}Ch_o5}Qdg(X!vwg1aUWHCt$28QfT23IE^ zoXecwp9u&Ds|MI%r>4Mn`r^*S8OMkAZRfpA7jg}61I8f{lK{ka&T3W`K>G4p`sFDZT4j&MuS^pPla9V3ysjy|en z#u@*ZGqY=Wqr}BXr@zUPbv!aJ~Ql4&Z+_O-7`TtdAnk3M3D0 z>7@^>0lK<$ZG&>P$Wmz^f)0*g`+weCM2(@6j+544OAr1ZR0#6eX149VLc_D zrBIP!cq|^2ZQ(({`qg+U;Jgxogd4pt7OwcolL##$TT<2lkad2*(>*SOmHgV?diTQ^l4V$FAfe zs*cw$7t}(DNINV;Y&B>|E2IGC5FYpIt{8pUG*8tWwBN}IO=I9`Qd)YoAc@@q^t4r; znfpzSG81Yr`r}~F-r?-S_(pT1f+tf|fdCf1OX|Zw+72S0$DEWV@BD`dECif&LSA3X zhzqP|pOCAT%tYzemHiJWK_Jr};P!sNU=%5b#`x&8H5PLs^X>4;T+-&n=%uwz@4DZ- z6DX2M3Mk%{C62Y9hvA`*3)`*w_`%&D$d6%fc@!2vlf+b;T2;UWmf*Ce)3YfGSktT zb7*83!gg|3;N~j?qG{ORAj&DZNh62wI&u-~AzRt!T55?i6NZL-GzVTydb zsiory(yt?d-X0X9X+MX=>>-gEu7(Ko3TQ#S|Hd3g! zpcY1sy`l=kzd~-VR14PD0#O@58=J-SaE08-fTKhGm<*_ z2ys(eYS!XPAqGbP;6=oKG3Q))vSzTJ;&40~b&DU7`kI<4tStp%WFFSJ*Dq!W<|7&z z&QqB_*J;0ARrWLPvVQUVd@?7PWSRvk;R8S#F;%E&nH;R^s&&)zXcf5e7XHbwa?VH| z6r(k}j7`MR3Xm^fJuY4?{$Ou7Ej!|hL{WD)!IDE703XXEG;7g07`x{j-4}e(P!dg_ zBt%S0+r8o&qiiZhMg^~U327s>{VS!XhO3WqHWHX-*$+J?T3cqf53M}g&J@Cy)Iab& zlgA5LFi+K#6WUnd1ZiuE;Vje$J3Vz2HLe0t>aSgLIx_U&F#rNxZ7-c%pQH`GWi>Qv z`3hR=BL~WwF@k0Crm}9-X(etIIwK-xEqXAi0^zMUXOl-4l?R(ji~c>b04lJDm-GHk zmCJY=aH%?K0lz`!NjTxi9qlHqB$?jv*2sNpA&?2^vG@G`eUkUNV};CJ-iGuQ?^}78 z99`pWf)9xTUyG;kc$0ELE_Cw-9U5)pq@j)aup`WXd!L@TYlW7qfyh2shJ{=8ah~q^ z^00dApm2J7V)D?PAn~cEHQ>`?2bAWeYF^ue@@z!?+VT3Lj z=)vp%n6~m>LgF*r^KyJXcA`HsNDDJ89Na65Rez9H=;qV}w%%23-thlZKv_p|b@kuW z7Wr0D-wilf1n9eY%Q9zwTjstn1f_I%8EV#wfK<(L{%hXW?Y8JJRbJer-|_zVG>eIX zVhMR5dY2&0vRoB~{xn{JkcD>~Z}e@S6pa67fD5VnvRLgjncLoc%7xZ=4W! zrClK6CPdYFN!?LuXRRf2IQcEn|ErTsu}@8r@)rEBS0YdIXpa zC^21ic%SAhX8GX1kzJj|1N`znhA%V3px#(E(mpt#LD;pNnH1^S$zmj~WvY~*D__A| zj3%)t7@&7Zv(#%Ax=FP#tKCo@0Yb#Jxckd&Y<8Kay)B@cTWqH|wS&E~I&f}?osZx@ z@q4GR1dpF(%LGFq)4~cy5OngfjD4M>2i3b8wnQw_S;M|ye^+b9TqgnPZxY0%Qo(KJN**3NFD*}+Oa4`Qm-;Klzu;F?_k znpN)DPyQybO-k5V`Nb9FH3V7^-V}4I$o|+DWEEglo*%;6^x#Z{6-Vl( zcH0FM{uE}r_RkwMbf0XQ-(OdHvSWc;*p^iybG|y|ELd|DY2nWZQV~&A`os>k1 zxpgj3U1${l;Ipsf+cCPbzML=Rv-qRI(!5BfN{{cMSD1y93af3(O0LQ^x$Nz5&pPr$lrVonkN_d zt@y@j8@Ncc%0 zBs8B@h?)xDdNWmxq`x1!E2JGs3b!UD8G|==dnhB`zHOamNSzE_@xVHh1ddw{Z?AHYAB;b zK4`J|$vU-7?Af};BZ5;Ia9gkPjL{QM{BQMo+;3+fU{6Rmv*g`i)2x$;QavVfel9+; zlf8q!4#>v(9le+~R{xI0SvqmVGJ|2TVlAqP+O?cI;I_Y+w@V6GTP@l16@15gVt*N0 zW|1tpw(qccHzb4gL7z3*IjSuRE0>F(d8s@KcgwrH+}h>1bG za%32-t?ZJF{Fdjm7Wr(^Bm(aTn9H+>&=x! zbN9bGw3bj%Uogel>onpDvY_PV9kDXkloVS;HL$_ezy%1bXYKp&t>Pq|fL^N+O}kpm z?RP%H)uA&5o?DJz|M&1%fN&HF?+d$lRLs7I1ZJ|%NxvZl827~5Ibnf)(FBAtLBC}n z;$pfTRfv}ghSVnMu1!vfL?VyxLH;M;;bi6eLW%!vIQBW0hbyAaSF*tp{l+U`hMeav zvl>k@jktF%EIyhwf7!I_&974W2WJpyW6ECcgG9r{AOF5pZy%o}55U9jQTTg8*V7Iw zw`tH3F?@W&_}3P)bj{t4%tMiw>C7iO_}dkMc}3`N%rQ6M0ic$o8HB+Uz_CaQOGu_!SA%J$@R?ysk#!j&M8?8@%4cjtiL$g-2yb>}y*13yGOZ4VBK) z|M9~37ns2>`IxuYyzh*{Nyg4QY+7P_!N|RI2;gTCpv?3QC|-2%iWgO8Xab)y*Fv(6 zYEKuZ0D11H%B;2rs_Izgfejt4nj~A=!RaFHO8~ziL4PnGZT*zTk*ICpc7Gvn5W>t(ASu9J*M_^PbLbDJU2u8N zcd(d%hZx-(va~YCR|3)a4&fj+A|?&BdB%zK9-E)Y1UOmjsu!LO?bqY=Lx^L#G{;ZY z!e~S3(;q6lX`2S$+UhEG;7kwq5J8?uWgiI;dxHn&+vSeM{u#|>FUFBiBsTXIBRrKp1SZ-M_&7& z-av7Rwx;Kwk$P<`0-AU7NSJJbbkS(NmYef%glT__o4KK$ukm?SVkxrnY%h)2pj4U)J;KAiO7Fk&jYyNW3|rj=L2*TI z>Kq1_aJ$0-T-kIbz_oux)l+rKeFtkMc)Ra?>Js@G^pcQ7Pmf;Taf`d<5JiFOP$Jib zOHI?a((>i!K?$lSsq^6AQ}9IyilHB+0QRvl1Ns+Na;rq-0#uJh{Ok1>ITkttLiF|U znI(#3YOfWOZiIuu|0JP69=iLYf%<~2yLv|fJs_e}9u1RI5Gis!dVJSz6BzI$IUCHq zxPZ)7gaWJi9V_g{}mJ``-B#Ld(DzJx?W>}CUN(!yZz?3BJ&F23F#4TW2ev&0>Ol;kL zX?UZgbLSW^{V`OElJVKtYNuLwO81f3dLj;oEYtMEX)_LWor)nr73R0yHDfz1)>zx; zJrLUMPoRCS=Rkq;FIceNHg+glu=Edv*`=#T1s;{x1jDh~Q!+#9VZJH>0&!@L7bDF_ zUQ$aeEIF%I9Zr{N{yq)Zl#XB%bK7h2eD2;knB+2$KfU1XNn0?&oXMVTZO5TNnJQ7q zE5DC{pgo(VZA~galvarvK{o1yzmmDdM6X(Dg*h2!SQw?Iw^=mP&+9oSpS}s1S-`yb0KLwKgO(dQDF8n zM7`rG9|cWT?DWKs?4rN7OBJcbyezYPJpn6{$(D_AQ3$@dnM1KT?l-5}V(n*R`pJSbSUyEjKg#@#(QS9w|h6hYeO9$t`D5J$}hG$&X7RMo!NCsb$ zr40>&n$j>@6{`h#Sk^(kKDQJ|wgx?Z;mTj^qbdbf!d2T1G#OI_r+*CEP1A)tz%Q|( zKXyVNuR8v?)B$yyo2WpLS$d!m9F=hY%8Xd9x{6Q;6i&HUYnTT6rDWr=$)h}7V=K9< z1F_&Br)SnNI;09i_C) z@FQbOFdG9BcWwlDbMg;tzCqbA!oM7gB*OGJU6K5UjXsV} zyjq*o5gXJyCoJ)M=!BOMZYpkN*vY!-`AOXoxV{hO>`6zhEHBf_3^U%+`dnk;xNemT zAWB8l$4jl}ebaVaSWtIjIISu|bz3*quV96!!DQ4B)c_$9OQQ(GEs~1J?s^gez(i7_yRfh3q^fWy@KI5~YKQ!i zPFpACHnJZm(IIuqfwozX+jf7%ZZJIcAEj7p+hAk3hk~9q5!S4M-m5bl(;Fkz9?c(GPf2|AW4L?%;fe?t!szzZ5MAE0` zBQ6Ai685Z4D*q#eY**ARnU9|3Ms?ZRa!zRDbcMicVM%3I3;_OE66BsK64kJjA8EAd zhpQ}tCj4UJ1_T&CR2L}j)*nn*;zX8nN-S?3kur|qR zzZ4&ZXiV1CxnaXggc5m53M1!LvGvi5>`07G`zdd;(nz7vkWA?68VSe$z4|t!&X=h~ zIc4OU*FMKCr3Qb(_*kNj6z;n)s?t}Nyq51_zXEq9?Q9$sL_7NZOxl>n{!)0_nx$=# z8Lw^jI#kAikw74&Jws_S{s5@xy;s1X2IId?c518%JX`f+5?`rNJ6x&H2jTuH7(=Z2 zn|0FX-`#xKz;8LCZoe4GXKR`Jvtw-8Hp!v=g})M2Ur=0P414jWOg17t9Np>wwCJhx zyv-8by@YuB3n%qd|4E*qyr-47eVnr3!i2-GS|xX%Lf5)I{OpAYwL$y0`$XhTL1jSw z*!MJ7E1PUD$%>o$eS4*$*wE&b&OlN4eaPe>O`crHP z%2hrX1Z{8ERvQEo!ymS$)GEwnP$e?L_(vrM>2;5U(}mXC9Z49=UJBJpb=~>DUKebE zS%rwmtxbG<1XEDoGSpdNMYKv-EdjEMCExi~}Hq0NP#KB`v)Pfg$eAhC4gbu>QFZh|Aunxi1f+5lz z2@>3>L9Lj_V3A$rVqr)m#H5t?_Jz}9L(eN`!ZotV;@CW;Ik2x!M_hz<Q>E$BJ%`(Q!^Z1$&Dkhy^Gtyn z?6WfgpHOL;W7{J(XeUdjbCF)Y=8|y^QuVPYmoDZfP9m7k3u-j+oI%;+7F+=kM zdbj!8f7w%BJqfWNLm*gyTzPk8evW_i4+}s0eZi%>tLVxOu%Fs=%k9g&-dg*)1^s5v zt}3#1>6eRd_93{c%kQQVlnbu2=sNs+t~(`^ZZ{-1_gfvaD$ueb;4l{#J3!I8!1o!bo@b0VpUX?rBLPqE#) z4&WFK1}|>8r$>Sw3TfD~st8UlfdRw=i*j$*AJBqvNRpF0>*2)tuE&!DSO@chr%gS# zqaE1vzV&!X-OruMsH33>7D{r2(WT+yZQ2N$K)XG=Hb>FMPOJ`(N z8(0uKvtE*eN7O`5k7NlO#B2XO>CKWAFORR}2kx3pstxynm$7E-{1-W65|eu6H?Ru- z(c67#w*#pY-B{^jfpmIG!fq5QFnwI1Gf0^&4*iLV)Y6yXuBFn8peem_&%eP`x7=}Q zN>3k$mM4<1>d5y4qj6r)79Smz&S9?F%ISJ0Mgaf@oti5il5U0uqqU(|mL}w_?*II1 z^7((FU4|s=j!UrcqnY_I^_HgPK%Q}Dl4VtzuV2i)#mFbLBED(4f#6WzEly7MuH@1; zsvrgeThucTH(I+cZ>>9=A2qBw^XnbV($1Ool_oKKvIM(IV?^9Kz6OdCgNIWBPlx!| z)<8LbbM5J7nE`dTM*97$q#y4YRTo{g!6Vzl4d4JWv{}F-c2LI05G#0q#YTqi6r;IB zU3&!tt{kl*y55DCv+U;|^o}fgTOJWAy17GY6M2^S%Gjl63<-9hIXVxs!~h`Z=LfCN zpIR7WY!u2+Ice)4(M(%6-zR&;S#bs4y4hsMMAi5~7b8mx_!0N=x&ZU+mw&Mx8Te%t z9k!F-A|XPvyIzP;QK$d^BQYg9Kj$791F#R{rVZhhM+gw#DA?E<>D1i|a>xiBi)Ays zeLajHR1@a%wHbQL51nJ?B1v%mkaFcy4 zs6=n5wvH==@9G~i7wAi#j>*L^<{fffZI7C?A7q5G~u6AH{VpufZ3O*S4fKLwQj z4`euIeYQs<%ifgcoK^F}e}1_BqN?sB>zSg#lx-TeOKD3_gtYUL@z=2)qAsmc38*dv z4ED3fLC&HV^$IZbaTfprEaZ|KuYX2E*YM(b6_a+v$ic1)Z8HW(^$T($H?ycb`~&!H ztIlfxWs9o&j&1g6i`<8$f?IF_G@_Q`6}M~0&xq;5oA2*d$5?l~F<%$*KO zXcVvc>)|atTrupXj;5(6EPw(Y#AaI`f6Zp0L@RGSZOPG}ch{)TDi^O}r#3Q2d{IP` z#@&NAjCfTCXo5$3+rOW&HI-g9TFQG00*B^}o+-3Pd7 zy8BPsNx;Mz{_0?am2PYqS|OS_gXuuC!eNUcRuh^s=X(b@oZ?3|4m8I0IEb2hTAL6% zo!pL%u1N^9d_8MppbN(yj~(L69#) zR}OQ8`da9reiS{Z1H++wr#t*F9HW9B1+W>TB@&DZ8=D;z`8X{D_CXc9vCJN8ufh(T z+eH#L3uV?*y03m<{>p>9LKmh{Oxgp{~_kN3(Ck1Nzosv{aqhXi1MQHx7uk$Uk zg}`1DO9nE$Rc~%FENUHH7u<^1zcBQKJ4z%0_h>|^FTHlHINREH$poEnzbt7V7@Xm% zALc_JV;aLMb2qYy5eHqVdP{WXCk{$-h}qEIr2DjctKtzUJVakr@~XA5DHD;j$p0ax z3^nt7+?1{4Q#r^N%Y=&$>_NkUZ; zstOZ&(_AYdqQ`I-Iw$#s%QM2!$574Ib4UK$1V8rBZz+s+yQS5YQTSUm!|6@R&0Xq#omQ`#S{5a{oT%D?}|6-7u=rFW@OewYz4 zw~t+0mirf!S9?_;es5{JP$RmOQFSTo*v2lBf%p&=4U2?NGsJb2?5FGR93_uD4>UNw*EaK~z;p>6W?( zyT2>7|87FF{nlHMgh3L6N_r~e9#~PWa7CKD`);E6g?3hNWNonc?njA{LZ zDDdhA9r1j8!M7EcnJ#2xV$v3)_)L^{Qq|RwAsaATvOehW`>Sr+`4!5bptpH#AXUV|Mcdd;Em9&BsCz*p*IQifbC-t&n5@&U#vs{?m)G0ms?G6 z*v}qWF8Dg{F$bfH&FheScqF<8%D&hq+cEuDcc;jj(YF2|`e8~fuLzinc@|mNwa@qp z56RM;c%=s%3>%yp?&!gm%vRDa*^AuiP4S)!+CB}(kX=)p|Bm#* zVtXYn5~wyKBmqzY&G%UwETrw|U>|F2-S+5hq*t4kYv$VPWU zTl}xVufggQ#yB5H32Fp(ZMGC z4wq+YbB$hRuns?SUI9fKwf9-JTb|%^E$k8ra=B5&V^XPszHhF%X*kL}(R3iydxT*g zEQdy=qN~rseH)=RQgU%K(}CiS$;=%Q z13@JX^akQUVmhv3GMkh+C+ax_YmF+QtOhedKvrKq1z<_6OLC%%z82{)$QJr10;N`8 z5(`ZLzhf29)!kNUIJ_GINl*#+GBA;(t$!^QvM+`p{A<`)w44mcT$-W=mvYEh?m>ho z^MZE9P=*FNS~?u#w-#G{stLLzBBTzMWqZW;atb!t#z`-8?US-jvF$2?VWEF}oyku4 z>?&6^%?tSdrp@O`bO8_sY5kU!KE{Jn{^o8@Z~w~$|Nd4XgPvD4faK>7GRFoh@PP&S ze09mO#rl$9m9kyeFAN_iWm3ypt-XRn02I4K|gfr+-vBgQFtFIn4x5-HZypmLSiPU)XkO7oF=Am1^`VzoCR=T&@BRC=_N% zFq)jj>SUJ*dr%tks8ZUv((9t>9D0$jzC$G~vgC+c$qyo7>=_HLRx#Ufh{UTu5*NLd zngbjiKnQ>N%*sIcKoTSOHyn39_N7{yXmSOJs8c-mh8I`WP8sJIq8&xQ@fLc8+v~O1 z2S2BUF+#9o26wCEjL&(^Jfx%5iDAr~X;sz=6Ag5DHp$F4H$h($Gv`c6;(-J%2+(^| z#Wuy^^CbAHUjMhxpGjC+^fKZkFO18|lNNm%#F8;2CW;$B4l>opeWTmGWK8yFYI5V{ zU-ZObKKK9nkZxHVC7q`nl)($ug&T*0UkGeL@tWzpfbxgMuz%=VMgkyOzyIjvPv2v) zD=u?r|xe=^HJz9 z?MByuC@^M!sonW`u&i~|D>rN1r~7j3E;+qC=$ZfYbMbMaJvt-68xtncz(vfKXVNR# zx~c>pb@?5Ssm~i5-cOA6Lc{J0s;YY9rLLW(>`@pNX zB*|J#1W$4MQgO77g;M*T%&rZ*BA4xLKyu*PdnszI$RB$B*trQN6ozZJ1*ANmouRv! zf$bDSf<7qVZQ!%2$hoxh@sV6!qG|+8+QF4UTJkUyf!@r}h+L%6!iittP&6=hr0(0? z?!pi`f~W+_cK)3x|F;+q^0RQYsDxj(DhhIV?LG-w`;+{Akp2c2+cJ$(f#MyP&9nz( z{uH7zfN~+5cY6M7K}R(J%XRgf*WY=O1v72Myd@IUTwflMPrQNk7qiweD5xW5>Xa}F zx|w1gH0O`EC72zhu_Q8Nc0{+OG}f674^kqeDi-X4ot`BJP6^=f8IVjP&5{4LZ1Gb1 zqOJ3-s6o9!`&~t{4nQW%Q<1V+{qs=2UX8X!<%pdBl6vsOY~R#L}^YXtasW3I_>Y_ zOO!A18@y)deDzx7TQ6oZ{c=Djd|pgSP?)FvM{b3e@E^3;Z+Dtnjx8mZM822(=nErT zCvQuPMI_c~>y1I(o&@V%(oQ&^z$>MD^n&Q+dyJB3Ni<))xUY#{^^&`_UgQ}3y6K33W@V~lYNm#!l9#^O;)&$XQqoMZ_~PB z7dPwqDd*r+Dq$s2$5BYe1MDJ~lIUbl?edGApvG1r%(RB3%&lH3w0rUzp9bkGfkGfh{vi4zZ|h9g z%G`wE9aE%TGUY@T=*_tNEOvZdTmPZ%03S48eDfo2@toZla`8{VE-NPDMU$#7CtCoJ zU2CGna) zX(g6BiK~XQm4rTd;xDg>Dt&|G5{z}rC@_jb=T5QNT&fbg&PffO0f=BPB_HTItd!p% z=k~edd5EJiMG_6(M2Wa#UVw({(;5>5?nTXS5rKL!zUCbFr#r(HlHMJ{Juv6er+>!+ zkLA}H(B>oA`~Hug*@U`~)XiH`N}TP?(s_M!vx=|#;R-ZymLX!uOHkiD8-nQn&AdxT zrgUJw?}4CaNwGro65}eWGrwLaWsNFGt0q<>^E4Q(oH~xtWr!98jtIdesb%ER(4P&@H%w_bMWxCd27wXH-NMv$+`cakfu3y0dD4MbV+pt0gt5N^0y7JI=LD*vUjzgZm zxLG3BUSSGFExQ%00ru}o8-s^z!J>p=69JVcAsXTF<<}Z`}w~?y+nQxyRk7_woGO@7idvOwoLvZ&9f9gc&W{>IR z{SY*h_i=|yLpYP}K^jLIO2@tP)tB{_#E^g@YhJVdJ;P`*B~R}K6K6OLMGGcL+M-=@ z-17QWrXZw*pG z*tEKX54d)qK7!~h3&}p~-7P1$eVAVpDtn9IuL&ya6D>3e8i7Z7T0iuhncN){P8b;j z7zvKn_Aoyn8H00Nht`3~6`i|uRpP@PU7G-gLB6?x#gu<}c(Vpr-&VL~JLiqTTFzqC zIC05s-C`K?cr=j8{)dzu8H{>6P6US7+(%DYh0+*KYa=e=raUbX@xsy|>o$Dl9mej1 zak6e9*D9B@ge)OvJ|nZlNX|L+39HJnd`FH&8@A}?&DeKE);z-MomwT(^kc)niJQg2 zZhk3AU`o0)xC2z7nP%$D+#yuPN-qzRMfiv*WdtOPbq8?Iq6doDow%l~>L=zFfGc26 z-Va!inkipFEV*ErmRFxc8+ZZrKGJ_RzT{ z|LBG&^IA-Rc0`Ljr(?>;|J;NUBO|6V*%ocUZ#kkT;r~~R6!?AhS?FC)1lTZ#-ju6t zN$dj3x1OkPNp52?z8#Q>TEBcQA9liC8vL;*t?pT}+$S%hviViQxSx_}AlR!G$o8f@ zLQLUVR{aLiMx2=bpL#;;x4)<&I8Z=kaU|_;eRsOuzg7WQ>Ebi~#g8`hu-gI%ew@eN z=MwN)2SyJ4)^nsQf=cMwVP-4n;J<6qoSex__*?ubRYzlT#S>l==E`?TD+ng;*QMWudf7@IOMoB1m~z7T(Q zcmR@P48GvC-=Bfm?Yk?kU@60?3){Cb^EzsHfI*-BBWlPMRl`7S>V1N&StNf4zi{zU z5@v_Wi z)~|pE`^PmL4hL61Mn*#>p^QvsgQfb7S%)MZAHWh7uZWTUaw~9v{zO2?{XW(zb>mj#{&G3ks&TMg6rE! z7lM^(DUE~XgfJLlNym9F)Mz$o!(ThZay7!P`bK&|kVCor@u0LUlA5u0JT>`IyhPW1 zA?fJeF{gB6tmL^9omxrppc0hQR94p>R zSolq&8tKu)RAM`ej}*RBN8X6tcB^=ycP4*y8b!4Z&TH@a8<88c1C0N+wIPepRSth| zD?=O;1FvB3L*wPjex_gAsffAr<^TYw9h=11O9A`yV{$b{e6W4)!Uf8q(hT_=<-ovl zRdiP1VD@^#Q?UuR8!zS?u?faKnB+?1C=H6y%jmFL+GUGZzd$;s8Zc1HgBFn-qaTPY z>rwvX+YZu{h682bVHehp_(B!Nu#iZzi@9Q#y|(H`di=M#yLsa=2fo~;4SwRgpLS2G zde3H@@6^+w9r6VTxwA}T-|qlfP&E=~_xlB$$}&_x&(NnfT5C;W4?|kt&2Z$l;E3Q~ za6l}FPNc$M#r#b23pKZ)Ya>}v$*6-Fq@s?pjF1P}!L7rY6*YX_+t1*EMZ^8Y02S3Hu0F=W|7paY(ib-7-Cwod;Pn)#t=c_oG z6OlzF(cI}Qoa=K^Z2rZl!Hxgwz5z)=1&3;F&{<_1(5r_H26S39WmLnAU#c9wnp#7- z>5A2>JJe({Q5k?xA+YfPurIe1{D9GeQ{YVQ! zUUG+Dmzajd#7cX>Ow_E8;O4Ey{Ene>IbU8DIB~9ID^+m^@mFx*{UfXY^0w`d24tT` zJv1Y{v@~;sbTR&N{r@)Vrszi0(_BPGH6I{1bS6|H*|v%_k0)sB=YcPu=WnR|ws|w5 zn?TraHf{4^zHXL`TU9Oui!9a-#kU~LAkU#ANfSs2;^j@a$6+jE6GOzecS|Fb$V;5U zOJglo*DMERMsjjDe)}?B_#GobTHnB)TyX8pzJ%*lZ+QMD(^|iPV!tC%|MUEhOlZ2$ zpqQ#Yo)k(gg;x*{1v}6AUw=FQ;CKK3ORBUern7iy7N0h(6zA>Gyoad{^N)801*%r^ zrC@Z;UbGGUCYU}lcRX9*FDw^yPQB{ZHnxTEvM8W?nK^Tqk0OxX1R5xLiNV)c#$Dkb zFk9tJ_&h?zn+EHl?sn=?OD_*Zkd>?r$N{JX0?_A*K?*4%TQ?tF+^FUMAj{zSWuguI z8&~-l^Jz-tT@pwJT0++LAiUpoaY+H|ntFH$fyJVYJ|Z+C=#_Y!Z+Y@k7;;C00-$-G zofUH2kQX>>G;E@-P8RNl^r6mNg_S$)=z49@zDDE-JQ;^=g0y#OawJoxSVv4eu&5#2 zneQKrxX=w3xM8yDyDrQDLDDNqSg$1O%v&QWXm zzfMrWT7Xs>hVzsA>a9Q~E51u+fK9^`J5Q9S+eD0X{af~&*ni!=qwYFOnH7Vx9o-H5 z2Kbej{t^6@jV50e%eKC5+}v=JWSJN5=3Dr~&X5`bRy>|R=FJf9d49K(!cBY=I7k4{ zJyxZYKh^MmqpSlTV$O77HofOl5m}w~$@1h@EE5=_+G5StabXGAc{gS!X=o`gb{rY) zZx`IW3fA&2o}fW2$G__gn-1#`Am1VrFDVd-om%whQ@Ngh)|t1L9ZgiFc-v67aIO)d zs0Ou)C9~*1la_m<0dZOI$^7_!kPr}VV-B>WzHcJ`4`Re-X@+iL9T0~3FLK<;PCM)N zc=9XwTeKKpH&=;6@rnsHNXqTZM4ON~!q|ZY-q%!hi2(){aNlBJtRXw6~UYDfX^c6R-git9iVYKE8O+&qC(z{zFjF|x~O9m zBcvUb2yL}n%p#hYQ)Imsep_v^o!rAb5wEdjfSjN8RG=3~0)?heI*lldTQ{>|O9AV^ zoA|?zC*`)oFECfv<*2O<;+Dc16;^2~9f-Rxrpn)4Q61NV0Al2<8)W`n%7aT$G) zIz*{nN<lJ!@BG*Bb{mk88|)qbH5;pxpu{`N151ZcB9}0)XtaFb8Dn zI?dA!Ar=LQ=Uc@bg2#)k16Y)F%Iw}y<#o&XF>CNc*H801|Ie1;l9;tbqu;X)^>o(C zo$;j#BO!Le0w23FM)z$1yS5o`*k-iq^AyhfI6$-KZ;HI;$=r~MU@Jp;ZO+_$Z@*Zq z#3&M((t){ec*(f6-!7l@SgsLxM(Z%_P0DMs5K=ZKkPQANMhdk=AUoMBf__#2>}qzo zmRED_YGaEaPH8{xfm|&AFKxwH97I42KT1H>q(xbnTbMeVsw*p#O(Kj^A3SO#HWfmH zy`v$(giN1_Su-}3$x|3PAm9*QwR%+IR^lfp5M)e{Y&EA^iXgU=)eOhg(F}YUELGKg zE)=^CqRN)~Xj6qW%^xR@2i;#~?~d9_DD(63X52Pc`oOn*SFbq{aig{lb$2O(FKGlDLH7C%y|Dz17~tA zN`}mXe5vaiej&jH5C{&f6zo_pY@+%GZr=Wjt73r^foI($6yrs&aXMs)7DnRg6aurt zBP_sld=&mWS38Z;7AI^={l-Qv2Og`LN3e$_q(h99`X}1@leK%+I?XTU;|{h{V)!TK zeQD1H2$~nl;f6J#nu&o2AqBW*zJoIIY-&jk69`B@e z<`g6|IzthXi%nK$$Jf(Rmk~jH@W>6e&LI(VaL2vW8+6-G=1@u4*^8*8b-_ZgsV~)wgPh^MhBG=bxbG~;#;zkS zh#?ZiWiv|AJS4;bKX-tu%8V~f=I|^3BrtyN0nDOn1lt*C>W=@?%&v44Y+YR*oFmG%5ZjQ5H!LW-LwjX&T2&@Z@7ufc8?5eLC?h(DKF>l zB;FB((?ohd+ z5M8jb|cA=*}XQv^<;yuNUs5J-%@+7+N0AI;ih=RLG2a%G?LnevJq150B*ThA=wE6gFr-I%}hRe zXXZ87-yI)lT`6b5P(+&==6y{Jq9FgU^ zsJV2N3u{Ii2_YApoHzrSQ{R6@U*dInr-xNPJ*pj3$-aqf)S(cc7?9vcX-&+caCLlq zZ`n8ag08nr>%!})%r|`|JyEOX`wL8XzVo)VZDV?%H+;o+wrXYDqFiz6 z%fBaB1Y7(*LlU_sNk4LT2{_5`Bug7nIzp zY4{a>ss|9)nEj~7-18aCj(&R?;TsxV9lbNG<7_C5p9&Y*ofTnI$sB(TVhc9)xnL5( zM_6Hi`iSG1ExE*kh^Yokeh><82PFN|47%K=Rtl}z6LJ@%9D+*|5uLd z`I}db59@K8j>R^S#G&v=~MX^kT)krvx?aUCc`1+^~Gm4m_kJqE6E<*^9k1`k9a-y%Z>zn}mB0006- z{xhA%)9bQwlw{@EfHgYGT+lp&coz#uSn&&r%L!3Ol?fQ%fUk=N+Bv)Yx-~GdT_#j6 zwxOqH6k`|ikvt%m{K2Z-mT{cPgO%G#oDrTiFwvX>ng#L>GZd~Sk<5s>K$a9%#Fh1p zn5ly}c8%(vH+3{u980X|x5OIi9Ts~t$o*1yiHf(71vJ+y(4rl>nN+c9M;M{wgwsQI z^-!W%(0h@Ytehdka$xxTY>Hz4sX2w@z5<3RDH2e31dH%Mz(#Xjds@N@*$+J;X+lg>T#g|#SjyDwO-yqf5V z1HUTs1LBjL;{j227>YWLN_Z>VY{_NaeV5g)lgAz)tR(b|G)%<_&Wt$d2G`st4jP(? z4T8PoRFc6hA4J=wWQ$oZ&o)Pd)g`6{^SC+g)X!?VG6^wa1i8~AO!i* zTD0j3qynQ`@|}l>9)>_sV^&@)NIKeO7RDN@NQ^QR%qLFvo`>N3mtBHD%GzmBYn3A} z6*uPk($|LD<8RxdlO!Hc08{}IA4t@r;}@DR@)>YETs5lntBK`{Pqt5}IL}D`93BN3 z!q>y)#}E`Ma@vGt(<|XKCbV<#r4Z!KT5QG-v)floC{^Bvy275HPXYPm=R1+FR5FwH@62H49~lMrb` z8}ix(>*pz$-zP;Rv#zP*!T+EbTfM*1KShm4uWQ|-C|34&pw8VGK7bBw&@2=XClF+N%E5fmQrIm{^zqeB zzk0e2w8EHTsUUs?zsqtZFaeD4+}7w%AcBRoGojRyxf@Z!e0oOC3^2;oCx*waO9#L~ zs2)W)D)DdSy7#AtcWi9&8i*zZd6p3W+{E~L)7l%5rxoDnDbc=c`lP}LN~y)n7eExWYU@1b097ffRLUYmg^R6K{oV_Ql?B64%y|Z z(Yf}v!WrxEkWC2Bg9a~pJ%+&YR!(mOHG&LSz!3fyEz(7?sC@-i*cMXOmo_H>CUqRP zW=T!339BOHoSccB{QAy>2v82um5QP0lE9QMT)nv)j2G)diSk;(J>&8d`QQyHX5=VD z>W&PfT(|~eA$uN_=QoGcw1=d+_7CB&$l-*>}^pax#5d_6f*u--dqCzCuL zU;LKN3vf+Is9XP*{>cjfJ!yj3i&lvrc7s;;I3VuNic#|M8Ly_l$`l&|rs0qAFUSjt*i?^St@=EB zQi@z3EPOD3>+nG;BZ)YQZ5b*7=WuLhzJr<*?}`@gelkySECDPcsEfe4SICiBxxe&!o zDVBRg??Iw@!_kWsDmc(pQWKDAz_r=nDv+ag73I^G;UwGO!axe)<=;;3c~oP7`gHT)yrU|$D#`RrUrMB$O7Y=ttpesCsq#;Bf(oFROT{ZPsG1hnSCHLp! z*FS(G4YaLa25R=zzF4eyjnC}bhyn&{VzVs6%117hCCpx?$XheS03Zc`>oxvet#DfK zkFnJeyeI2q>Y2dq?{#a04?wqf8Y?Wjym^XK&aU}Qe1*MtZ~?^k9uxN2N#wsE;fMg)9aVvtnY^m9d@Z(SDm zsHZve#jQJeBI&+~A?cy;sZc=5W@@sD0liQS>KyZaMdhY4JY?ELS6RINkdTimsRVtp z$egyV0!p|-Xqu-PrX-S1XML!!y#yD2AzWa(tQNJX{fg+RtP9kA_D1ZLshwodh9oN3 z%1O)>VxMP6X7bG-qoVyYM`Rs6+#GuuTcdF6qo=3RjU-Y|f{~(Wqk)6rAz38~`7Qm* zKve;imZ-X@GevzKl)v)QQ{-q^rXRf+~)cJw^4;KW>Vr8N-J3rbGzR9`&QeNBI;tUE4u}4Rrsyh z^!m~=rX$eUqi&IZffPFD%y~*MF2cia*P=*=h4gbVDblB;eS$07AV*mZ*Uo|RzOFI` zYZbvjXmq66PWOkoqQ6QGRKi~X<6axn@Y;q8|2Z08Bt8P8kmTvQ<2gw5gQw=1Me8lG03unr2bwE_Isgw ztOW`Cv9`=KMnZtU@j6p1?@>fz*=rB-pV8XUumNyr1qXe-6xn9Z*J|E8mTX=2V{)${ z*0`S94JMq|BGZ)`W^jb#?ue%1l%p)Bnga6}^H(p*7VAbzjv%0oL zdZuFPk+2ZW^bkJDrE2c~00~a7J`X+S_53HHEC6L3tUg2Ct3!d8kf=nSl*AkTLk9Fc z1n-zsqqh?BranoGo%z{9ICz?fmOJOgsD%_j#(GI}E;n-KF+0wx=t*S`g+H zJgQged>A$3Y3~aN$5V7^7b=O`AL5MNKv5MRtJUH<+iI}sCIcraV`-ab&4HF~mu(Sn)5Bg|PuTmw~rBfzub z#-X#pPM%WyrCU^OR)2%P?n)l6l0?ZDXf?Wrr##K7qMlKMLP+1#XE&5yzFw9X-}Q`qUd}* zJ6A0bNy%r9Ih3CCuX8=r+cV8|FQk*fVSHQk3N^18)c=ez!p7#5ZOP{VqLQOL%^4Lj z^k20G;lAOwC@iTZ?Sa()-8S&lyx&wTHEk@N#1OeuInb783xnrLFflK&yBgsn!9b|A z?wuJ}+w$FGTe5I{Fri_cTL*jsYaT!-o&VYX>dG05C;3&L04g3`(@gT$M*WjC!;sdX zQ!P^JZtTE-N{l)*DF+nh^6hUP{}UN<7UqUuf=fzd?_-OdvLiU2qpZ*x03Pfe#f-1o`g5j z_HuatQAE2u!(+MmPup&k$6Y9WSVa73lSgkf?iH!d&{lbt7v=oXDmYpF32D`Wg@78& z!nk>792|v*3ScmbRy3%CUk$!y4eIR#M*YEu*$;5l^nj*HuX`*3B1^va3GBLNG`SP2 zBp44TEjxiMwd&1mjEGLl`XC}?DfcDhu+6!TvA;9`fKJJrK28(TT0`o{HWh zZ1xPkSM^|Ja?9nbH`HOoJpauKP-V%W_iwgr=KNnw>9)*Ma{iUB1;+-z;giLIQ(D6EriYpCxU z*l!iH#F^P1-L!7b($VF_-E^Ms)JA?;GPbJ}$8z;!hm_lgE}5zIZ56FL(W~j$aylDG zdOn7y9!u#gd$O)7DS=0nTyY?a2h6q;F$=e9c1Sow)JWPulh83ZDI0&>n@sAXB||(X z;eo2y6!uKWq7+<$YSYcVhKlITwB2OTR9k_(@3(50&$(+G4uFD)0d?6~)e+1!ad-F* zx10*TjH}E+rk3E7LmnBzEFc=@S1 zpQCP9VcwINwNs>_7g3vHG-%bH<}1Zxa#bSseW*gg_+aJ7l)v;5;EIA0wJ zy@V&IV`V<`me54P41WeG3AG=(v@i$e#oQiiE^O=YzQ@DSmQL_uUd|0xY2Z;jTZ}GR zHZp=yve6~`)C~td%P^AR&QKMlm=KicIN$AU4(qyc*YHZaiY_hA2-`&ZEI4RKGOdR?@@|iXL@|n4B zJ9k4LWATJ0xPuVy*DoDP#yp)a=JEa<-rM#ufJExJ0klXSKy4hjBwQiP9c@+Q9va z%=WdA;3yd(r=4koKUdh~#q~)2ASTzr7;33AVpZ^NKMd1i5PrZa?il&>J7<5ruK&#| zp2nI#z)0`u&^0kMXZKDuu`MK_k+QtcnQLHo-X_6dW*K_nxKB6rp&`v8_37a%!@=Oe zNgDajwnKXI>^cx3{x5w9oURtNWFk~!2WC+n1+Y(U$tEK(E>m+Lq!CP1`4{5psvMfU>~6#Ar{dX)Gvn-#m#G3q5`$5WVg!`u{>mh{(6t+*i`n#*##3fRQ9Whg?tR|6uf+ z7m+o|JL*nykXSf-)&ONt)Q9L5|I*I{a{?#$5Mty6{KQ-j6-%&-y6@7%%U7ab^kg#! zvX}V_ct%yYT-(%Q*W5}~FV4!zg4-MpR)YZu1Sc0h#vqx~#zfxFFP#Cz&miIT&KaR) z(A@{s*X^KYr&(bQ@K21+J_QN)_&rdlrhp^`NI}`fo88X7jZk+c>iT8-wLe}KYljBk zcK7|2p%UN2XRA17J+KrpvuWu?w0MJf2cJ=jfYWL2unPly%HYRn+d_%iOgQUcC2@ohFFxQ+&F1i0i(H*p&zz-ZX&y?e|0%KK#ngGuiS z;Cs2NYwLFngk)gw#5tV~=B034i*}F(MxrVs)4fL`EX132++yYZ8~x&{sHO0TFnk3_ zZpDn_p1+56KfqN)x(*pxdl=DvJ#wXb_0ETUJp^(R{O*sXWEOZ*0XJ$>@2@RCgFU?8pDOA=7mC44OzT^*05K zz~obXqb8YTU?=%1a_3o}Z7+@@zR?KUnq{QFZ=tJei8&hSHh>E(oF^3Bh#EI zi^(P%^Snyhj6F-$?97jhhI1o#qo%Ui1YqJ;Pg4*E5+S(A(I3eTEv>1IKj}5KbnwOX zXjxtZI#E7>uH=A-GbI@2eNrj*jkA(HWaGf-J>Vw6Ui91B3{wM1yqV#1&;ZWJ=sUFu z_26nYV7@0#fUggRw zKFO$ra0YPd2E;vX&!LfJ+lB9B!ckomm1)u+!q!f^aR#O5sb1RP8J~nT@q^ZE>?9ad ze{2ZR=Hj1tipCxhGgmKt13ql#Dy(1)=DNFekK$S0gkv0;rn3XM6Kk|#n)uSJ(@ru; zz$)`bRv>lo%vAY6pc+mBX`uLvOq&X#!lU9kvcWCWYewXIp)juAMu{d&m)3Miu|T1_ zSIC+Jqh7r%nLNI-kOr}94)<*k`MC$+ekCXcb*rm8@4`jvjnSXV0vMn*(%J7|jmPZv z8Z|mOaqj`2I3{u%sKn%kBcGsBMhlqhwJr(y=0V9S;A+SSqE$6_&5I1g8&v-tBwc4 zcm=Y3M3er2eB2N|I3s*MObd+|84FpLz8i8>Fkf@0ZQ`}1-!W#Cp_n9%+VBX$G_N#U zKOmTYBbx0f(3!WSTxhIW$irerlOWDq`M^146hV z$qtcn8E(U*Uy3#Mn}vQ+k@|}=axN={0K%+z`K9+~k)Mv4^~-9{y7WQ;eVll~_9moq zB**TKa3Xb)mWz$;~%12MF01*Xl^a(FDIw*QD z+EF>nqvaPdTLFUoR_jEvOQfDEw@>r193A$^WcmO-Fy8?2I-i0RCy#r`Q~Z9ncmx2X zR@H;=^fa7JJ{$&EX2YWGS=)g4^cFYCwnxKX`_r`Lr#Lej0|iK)p{;`?s`6ipif>qi z#AuuEJ$x1)xTLW=d=6RJwds1Q)q+Wa2yVVDL-&p;K^I8g!k6QF@%=?!N~ksc7Y(}9ObeXN=+jI|ojhm7OlqDrhj>xEZiS}+9iIev zKT;onIIMCC`5mR;Ds-@NqctvIi83P6-lSxe7-5$%E@I22XhY62t|dHiaf^j=HgB{5 zJxFKsrapj>-yh6p62$?EZ-NV#x*QZDzi+MzHjX9rzc1dy%jR_++q>)Rse#-D^qHc) zTx1wPP4`_5EZ1sTB=qJ@wvCwwu?bWTEbx1L%_-PSoulNaZCbr51}fJx7HkQgsm517 z9acWsueCUF(meuRU^UM4cdi9rR?hLT^|G|h!R^)`$46VGhZtS096Xhmm8hU`G=fqlg=uFS#*h!zy??ci^s%=|2nBx9R?I z^LW`QJ;d-xX_7Jgx-Df)_*pR-cpdYKJ3P0I@o|e^t1FXL8ZWW?fHuXsgm9kh1K{YU z29(%*PiZd2z@H_PPrCPYGxM^pc>G)j(dVPFnV{ES@X?jRJ!AlVd~4vG(qieU4xD!z zXo?6)r;)k2K+hGV)FYhiwHnX(o6`^+hT+-RG^ZTFQ`2r?3Kh^4uB`hrZnBnO>8D#P z*Nf}uT_7r}gG=$e?`I9uo{mh!(aILeA*kJiUkQeO4wpcEJE4w0=8@Q_2kV3_y0I=i zPA58VwVC763q)rQm7P%oc<~ohH38?{ew@MN)NY5?{}BCEkBhx+gqK)i4P4GUEph!I zfq!LF^F*+|mKd4vwXBvJN{w5qTwtNhu(fn!CUb4x>4TNk9F;Q|j%xV>a7;@tRs}xI zvGoEvW(ak#Md{ZGE+;5kv#d$-R{eD)-iFLUp1P^wf!XAekL|2j4>^c$^%wesYVKZbeBN8 z>RQUOlY7e<{X@n={x}@y^1%$`{w5Zbx=3^gH&rnm{zqNWBxC0(+Bmvdp0iHh@@N8I z%EGT^IQhynFD@gTUqF6fFXiZIj8$-%5wKB2(K&7jtqNoLA+%^$|5^V6&mKx8{_mRZ z#a2$Ydy2xeR781zh}jWo3*Bdl&_%Eu&6wKGYrx0N5Fr*rR<{+q&>-&dA7&J=QzA0g zgq$Ru0mqP^w(OI0@wHyRXr%@xWmsWa8Sx<-yp8+6QWvuKN_ygW$J9yEd3T@FF)Q!7 zQHa+^{p>d&6Z1CFjy(Np8=fUG4=CNDc0+!9tW}aD*-)SriGd*vhppKYPv(>(I#=xp z5vDw@u(?y6+)Uai^vIS+%0G{VkuP~K4^gq6slK$hl0=|O96&!kX1+2esW>sf4N{}q zz0kGDmAiU$UBzp!!^QLG%l)QyT13P5`%Rvqj?d)n)phw6yj%@uh>=y1ej0w--K}*m zk`cXBU9KDRv%<3g?f84TcEBQp8u>nkXl`r)tbxuPJ2)^XiBtOsLWTJJ#foI$v`NvK z*=r;JSVWA8c}|8o-L~L{8L2tuqi)A;;{A5C)na(#1oY)Bnp0i0Ho1f4aV0UP?YdQd zVMRNgK>(8|MQsS(DENL?`_F5-GEHA<(pO%3MBZNS&q9aflldCzBs*+>PJ+}{T=n3$ zH~0cZYpERdqP>Ir@phR6*RFydD8IQ4JJ0hXA)tjoc+sDfSw+eV4NS;i-U@e7{Xn8K zuC}FarW1-o?jr)9IhWc7OZX6o{xQXZhRI@MI1~ieFnnxL0jJ-@RLk6r#Ot+jiW*B= z(S=Caq*pW|?LrB&7Le<2C>K9mnvDU9io0bp#Z%-P>*`^mJ0_BjSjl89g~Rv5li~xW z0rMRHnjO_@6nprOm3fKQp!yxr7Vn%sU~LSl3_#V z>x)jeqK-rg7QkesjkO@|%lWVvk8f?KjMa@zJ+b#O9jfhB_P`D|6>=8ve6@63m-MEbv zQ6#mkfB-b2O{GVC@dmg_zLwM?H`H546~cG*519+?PK8BJhy6RX^ox(jp9ducuoe3e z9`uD?a3my{*ae;nM>wfv0v;j&4`mOCOIS;DosI)Olf!U@NuQ&}5(MIdQRu`VM7Te} zGkh*p&53(4LPZL}M?S#2;}KJN2wKMgi}`*w9#!!l0;CmLxYcg5A(rNpdI>*n9}X0a zsXW^dTtdLCUdvooKEnqOa_!h14{cjxo|u=9IXUX~g*W>&&Id3LKx?vi?Hqy0a%okr zl%Z(~hqE|p#L{GNotCpCr$>=onHR7OEL2_BUOJzAR5XaBs5^_EvNZGE^UO zrGhqg&YZinwsk+n`wtr5cX(2%?)hXA=DZQ1^oXxyP+bhkRJ$5SFnej(dbGB$$ODT- z5RIxpOZWwL4FIyESt)!Hx)~^3Y3sFvR-V~1dhR8ehN(2iSG`+a>|~(_0~iecEGj?5 zghl}s@=HockEUr^kO}D)h)fdC{lb{Z6Px!;6_8Tls`ESQ`8mV3TG=jhzY7WXoKY%L zBWLVaY+)18(7`UfiiYSid&acVaM{|-P+2Ju6yT3vWs;*MV`4W+g$6}X5OzxvhVVe$ z)}8Iv4ljEF?bOZ|k%2wp9^Ph_%6r7popGDjp*f0~^>k{*>}w5Iv<7^lQ7q(+vkhCZ z9W=9_h(_N}^I51-3eh&&e?xt{&{r&MfK6GRMY!KJ(TzMb+p%sqj0?clV;)^gTXg#p%y0bfKwz1l9$1dZrFQ!>9 z_$M0stgvpu@+aczN*%6aHh81+0iJ7^_JB5h7=~$Cex*ek+CFpuNw@Yoj+XG+0! z#0w%(2eu*gdC~P9jMw}cR%6AnNh!jz_l6AB5u=~k%VGLwoBTf`(Ji@m z6#m|lY7NC>&0lJ-|P(r;K zP*weac9lJ_Hat?uPT21k zZB~~A077d*)DY(qYhC~$G)Rw%Qj|sYZf(>Blbf7gZF90E|3|Kuc87DKRmkxd@JYyM zhe3ua%1{x+$R&*Twa+X^OR6Q0t%?UTIOd8Cb1`Wa>GIRvn~i(}ykGFU{LPX$IgRdX zpigQ1pevi-zrh}Tfs5Qsh|Q$NeG@!Lde-BV#=rOU3;RMs(*h0Ol?;_jLXdye;_e4l zqD&lb>1_>@KA}#J#1YdMm2hazRPxg3qBcy9&PGIIg3l>{2N`lTNsNS}Q%jgejbEj} zI~uacK*WbvopOav$zefdc926&reT=*dE-XVOxyX^WUYk+FP6=nKbdUjJtwP#u(bi> z^boLFZvsLSoxjjyYmIU}9rj0OSylr}|8i7*0frGd>4`Y>)e&E3xdFTz@+li+#zNc zolOv_HlD*kU!qFlTO_#N4E{H{BaE@Kq(ndN&8B!F;A_KQ4YuRwchM%!5++_DBDnF{ z^_uk5ab4~c%%!kxZ<0%10Y-(o6)jD2KLUJO5~k_FT8{f{ogP@4YhVKV*5cx={sahz z7i#+QU;qFB000000000B>^|pTkOP|n+}eH{{B@F$^}8w)Et<^P`D!s>O4HEyb{zWT zVrtQp^yJ`H~} z*Uq0`6VQWjnOk^Ppa-(!g7{qc4u}4C-A#Z1000008R|2VC9}zUx$@NXz2Kg!+uu!t zkBLvl{`Q$jG~WdmR^aUYyTgCa9{(+|p?k#xe$KD2F+t)A1UzY16|WdW6DiL$(G&Mn zd7&4DPmw6jg;NBL%BH4the7GTzWsUNAg!KkwEQ@e)8Tw`^nnnM*PmTk@58q_K+HFa z8aL$8wtH+y=jzWgK3W_L%FNY_?z9(}8(7u+s1)}96Xg;aByyJD#C)iHSZ3ZJKIS5> zYQ*Z+vwM?G?d%v@kfpQ888BqQyTJp070vA%U=|Z3y9!*@7A2EnJ_k+=LH+Cn1D>>7 z3iZb{Y;3!`SRq4q*LVN*Q~(Y360Vc)g2%bFe8yJH=V=8a8=c{cT!DQo)6w!uq98{R zl9(cYg+K;0(22>d8lI4oGgl|IX0000000C|Ju#YxA z=LJ$DjZe;CSIsgFRh+dhY@Rv_KXY@ZGovL~>EWh1(QoqpsPr@RD{*ur7j&joo9Ic} z=x*eVu{9gb@Ta~~-Lo0_*s<|ou!xVI@i*m_zZ|n7)E)6r`T3l>j@@d+~Z`HzNX9;@PFqt0K+Z7%?`WuE~ziw!ebd6kXIx_RfDlF@H4^O#`q?ZLATHe#bTbg+{#b@0GXS> A%>V!Z literal 0 HcmV?d00001 diff --git a/src/App.native.tsx b/src/App.native.tsx index 2654c6ed83..22dd39f9d7 100644 --- a/src/App.native.tsx +++ b/src/App.native.tsx @@ -47,18 +47,18 @@ import { import {readLastActiveAccount} from '#/state/session/util' import {Provider as ShellStateProvider} from '#/state/shell' import {Provider as ComposerProvider} from '#/state/shell/composer' +import {Provider as LandingProvider} from '#/state/shell/landing' import {Provider as LoggedOutViewProvider} from '#/state/shell/logged-out' import {Provider as OnboardingProvider} from '#/state/shell/onboarding' import {Provider as ProgressGuideProvider} from '#/state/shell/progress-guide' import {Provider as SelectedFeedProvider} from '#/state/shell/selected-feed' -import {Provider as StarterPackProvider} from '#/state/shell/starter-pack' import {Provider as HiddenRepliesProvider} from '#/state/threadgate-hidden-replies' import {TestCtrls} from '#/view/com/testing/TestCtrls' import {Shell} from '#/view/shell' import {atoms as a, ThemeProvider as Alf} from '#/alf' import {useColorModeTheme} from '#/alf/util/useColorModeTheme' import {Provider as ContextMenuProvider} from '#/components/ContextMenu' -import {useStarterPackEntry} from '#/components/hooks/useStarterPackEntry' +import {useLandingEntry} from '#/components/hooks/useLandingEntry' import {Provider as IntentDialogProvider} from '#/components/intents/IntentDialogs' import {Provider as LightboxStateProvider} from '#/components/Lightbox/state' import {Provider as PolicyUpdateOverlayProvider} from '#/components/PolicyUpdateOverlay' @@ -113,7 +113,7 @@ function InnerApp() { const {resumeSession} = useSessionApi() const theme = useColorModeTheme() const {t: l} = useLingui() - const hasCheckedReferrer = useStarterPackEntry() + const hasCheckedLanding = useLandingEntry() // init useEffect(() => { @@ -146,7 +146,7 @@ function InnerApp() { - + - + - + diff --git a/src/App.web.tsx b/src/App.web.tsx index 5c22b3c921..6faf6f2218 100644 --- a/src/App.web.tsx +++ b/src/App.web.tsx @@ -40,17 +40,17 @@ import { import {readLastActiveAccount} from '#/state/session/util' import {Provider as ShellStateProvider} from '#/state/shell' import {Provider as ComposerProvider} from '#/state/shell/composer' +import {Provider as LandingProvider} from '#/state/shell/landing' import {Provider as LoggedOutViewProvider} from '#/state/shell/logged-out' import {Provider as OnboardingProvider} from '#/state/shell/onboarding' import {Provider as ProgressGuideProvider} from '#/state/shell/progress-guide' import {Provider as SelectedFeedProvider} from '#/state/shell/selected-feed' -import {Provider as StarterPackProvider} from '#/state/shell/starter-pack' import {Provider as HiddenRepliesProvider} from '#/state/threadgate-hidden-replies' import {Shell} from '#/view/shell/index' import {ThemeProvider as Alf} from '#/alf' import {useColorModeTheme} from '#/alf/util/useColorModeTheme' import {Provider as ContextMenuProvider} from '#/components/ContextMenu' -import {useStarterPackEntry} from '#/components/hooks/useStarterPackEntry' +import {useLandingEntry} from '#/components/hooks/useLandingEntry' import {Provider as IntentDialogProvider} from '#/components/intents/IntentDialogs' import {Provider as LightboxStateProvider} from '#/components/Lightbox/state' import {Provider as PolicyUpdateOverlayProvider} from '#/components/PolicyUpdateOverlay' @@ -92,7 +92,7 @@ function InnerApp() { const {resumeSession} = useSessionApi() const theme = useColorModeTheme() const {t: l} = useLingui() - const hasCheckedReferrer = useStarterPackEntry() + const hasCheckedLanding = useLandingEntry() // init useEffect(() => { @@ -125,7 +125,7 @@ function InnerApp() { - + - + - + diff --git a/src/Navigation.tsx b/src/Navigation.tsx index 6284aff34b..1348a975ea 100644 --- a/src/Navigation.tsx +++ b/src/Navigation.tsx @@ -44,6 +44,7 @@ import { type State, } from '#/lib/routes/types' import {bskyTitle} from '#/lib/strings/headings' +import {CHAT_INVITE_CODE_REGEX} from '#/lib/strings/url-helpers' import {useUnreadNotifications} from '#/state/queries/notifications/unread' import {useSession} from '#/state/session' import {useLoggedOutViewControls} from '#/state/shell/logged-out' @@ -797,6 +798,19 @@ const LINKING = { return buildStateObject('Flat', 'Home', params) } + // Chat invite URLs (`/c/:code`) are handled by `useIntentHandler`, which + // opens the GroupChatJoinDialog (or the logged-out join flow). Route the + // path to Home so the dialog overlays Home instead of NotFound. On native, + // react-navigation strips the `bluesky://` prefix and passes the path + // without a leading slash, so normalize before matching. + const normalizedPath = path.startsWith('/') ? path : `/${path}` + if (CHAT_INVITE_CODE_REGEX.test(normalizedPath.split('?')[0])) { + if (IS_NATIVE) { + return buildStateObject('HomeTab', 'Home', params) + } + return buildStateObject('Flat', 'Home', params) + } + if (IS_NATIVE) { if (name === 'Search') { return buildStateObject('SearchTab', 'Search', params) diff --git a/src/components/AvatarBubbles.tsx b/src/components/AvatarBubbles.tsx index 880a5284f0..c49dada16f 100644 --- a/src/components/AvatarBubbles.tsx +++ b/src/components/AvatarBubbles.tsx @@ -28,23 +28,29 @@ type Layout = { border?: boolean } -type Props = { - animate?: boolean - profiles: bsky.profile.AnyProfileView[] - size?: number - moderationOpts?: ModerationOpts -} - export function AvatarBubbles({ animate = false, profiles: allProfiles, + self = false, size = 120, moderationOpts, -}: Props) { +}: { + animate?: boolean + profiles: bsky.profile.AnyProfileView[] + /** + * By default, when there are more than 2 profiles, the current user is + * filtered out (so you don't see yourself among your own group's members). + * Set this to `true` for cases where every passed profile should appear, + * e.g. an invite preview where the owner is meaningful regardless of viewer. + */ + self?: boolean + size?: number + moderationOpts?: ModerationOpts +}) { const {currentAccount} = useSession() const profiles = - allProfiles.length > 2 - ? allProfiles.filter(p => p.did !== currentAccount?.did) + !self && allProfiles.length > 2 + ? allProfiles.filter(p => p?.did != null && p.did !== currentAccount?.did) : allProfiles const moderations = useMemo(() => { if (!moderationOpts) return [] diff --git a/src/components/Link.tsx b/src/components/Link.tsx index fcb2e8a87f..8795c8e899 100644 --- a/src/components/Link.tsx +++ b/src/components/Link.tsx @@ -12,6 +12,7 @@ import { } from '@react-navigation/native' import {BSKY_DOWNLOAD_URL} from '#/lib/constants' +import {useGroupChatJoinIntent} from '#/lib/hooks/useIntentHandler' import {useNavigationDeduped} from '#/lib/hooks/useNavigationDeduped' import {useOpenLink} from '#/lib/hooks/useOpenLink' import {type AllNavigatorParams, type RouteParams} from '#/lib/routes/types' @@ -19,6 +20,7 @@ import {shareUrl} from '#/lib/sharing' import { convertBskyAppUrlIfNeeded, createProxiedUrl, + getChatInviteCodeFromUrl, isBskyDownloadUrl, isExternalUrl, linkRequiresWarning, @@ -130,6 +132,7 @@ export function useLink({ const {closeModal} = useModalControls() const {linkWarningDialogControl} = useGlobalDialogsControlContext() const openLink = useOpenLink() + const groupChatJoinIntent = useGroupChatJoinIntent() const onPress = useCallback( (e: GestureResponderEvent) => { @@ -148,6 +151,12 @@ export function useLink({ e.preventDefault() } + const chatInviteCode = getChatInviteCodeFromUrl(href) + if (chatInviteCode) { + groupChatJoinIntent(chatInviteCode, href) + return + } + if (requiresWarning) { linkWarningDialogControl.open({ displayText, @@ -228,6 +237,7 @@ export function useLink({ overridePresentation, shouldProxy, linkWarningDialogControl, + groupChatJoinIntent, ], ) diff --git a/src/components/hooks/useStarterPackEntry.native.ts b/src/components/hooks/useLandingEntry.native.ts similarity index 64% rename from src/components/hooks/useStarterPackEntry.native.ts rename to src/components/hooks/useLandingEntry.native.ts index 31221d599d..c5950a6469 100644 --- a/src/components/hooks/useStarterPackEntry.native.ts +++ b/src/components/hooks/useLandingEntry.native.ts @@ -1,22 +1,45 @@ import {useEffect, useState} from 'react' +import * as Linking from 'expo-linking' +import {parseLinkingUrl} from '#/lib/parseLinkingUrl' import { createStarterPackLinkFromAndroidReferrer, httpStarterPackUriToAtUri, } from '#/lib/strings/starter-pack' +import {CHAT_INVITE_CODE_REGEX} from '#/lib/strings/url-helpers' import {useHasCheckedForStarterPack} from '#/state/preferences/used-starter-packs' -import {useSetActiveStarterPack} from '#/state/shell/starter-pack' +import { + useSetActiveLanding, + useSetActiveStarterPack, +} from '#/state/shell/landing' import {IS_ANDROID} from '#/env' import {Referrer, SharedPrefs} from '../../../modules/expo-bluesky-swiss-army' -export function useStarterPackEntry() { +export function useLandingEntry() { const [ready, setReady] = useState(false) const setActiveStarterPack = useSetActiveStarterPack() + const setActiveLanding = useSetActiveLanding() const hasCheckedForStarterPack = useHasCheckedForStarterPack() useEffect(() => { if (ready) return + // Check for group chat invite link from the initial deep link URL + const linkingUrl = Linking.getLinkingURL() + if (linkingUrl) { + const urlp = parseLinkingUrl(linkingUrl) + const chatInviteMatch = urlp.pathname.match(CHAT_INVITE_CODE_REGEX) + if (chatInviteMatch) { + setActiveLanding({ + type: 'groupchat', + uri: linkingUrl, + code: chatInviteMatch[1], + }) + setReady(true) + return + } + } + // On Android, we cannot clear the referral link. It gets stored for 90 days and all we can do is query for it. So, // let's just ensure we never check again after the first time. if (hasCheckedForStarterPack) { @@ -29,7 +52,8 @@ export function useStarterPackEntry() { setReady(true) }, 500) - ;(async () => { + void (async () => { + // Check for starter pack let uri: string | null | undefined if (IS_ANDROID) { @@ -58,7 +82,7 @@ export function useStarterPackEntry() { return () => { clearTimeout(timeout) } - }, [ready, setActiveStarterPack, hasCheckedForStarterPack]) + }, [ready, setActiveStarterPack, setActiveLanding, hasCheckedForStarterPack]) return ready } diff --git a/src/components/hooks/useStarterPackEntry.ts b/src/components/hooks/useLandingEntry.ts similarity index 76% rename from src/components/hooks/useStarterPackEntry.ts rename to src/components/hooks/useLandingEntry.ts index ccbd991574..e3b728a5a0 100644 --- a/src/components/hooks/useStarterPackEntry.ts +++ b/src/components/hooks/useLandingEntry.ts @@ -1,25 +1,27 @@ import {useEffect, useState} from 'react' import {httpStarterPackUriToAtUri} from '#/lib/strings/starter-pack' -import {useSetActiveStarterPack} from '#/state/shell/starter-pack' +import {useSetActiveStarterPack} from '#/state/shell/landing' -export function useStarterPackEntry() { +export function useLandingEntry() { const [ready, setReady] = useState(false) - const setActiveStarterPack = useSetActiveStarterPack() useEffect(() => { const href = window.location.href - const atUri = httpStarterPackUriToAtUri(href) + const url = new URL(href) + // Check for starter pack + const atUri = httpStarterPackUriToAtUri(href) if (atUri) { - const url = new URL(href) // Determines if an App Clip is loading this landing page const isClip = url.searchParams.get('clip') === 'true' setActiveStarterPack({ uri: atUri, isClip, }) + setReady(true) + return } setReady(true) diff --git a/src/components/intents/GroupChatJoinDialog.tsx b/src/components/intents/GroupChatJoinDialog.tsx new file mode 100644 index 0000000000..f787a89c3a --- /dev/null +++ b/src/components/intents/GroupChatJoinDialog.tsx @@ -0,0 +1,432 @@ +import {View} from 'react-native' +import { + ChatBskyGroupRequestJoin, + ChatBskyGroupWithdrawJoinRequest, + moderateProfile, +} from '@atproto/api' +import {Trans, useLingui} from '@lingui/react/macro' +import {useNavigation} from '@react-navigation/native' + +import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name' +import {makeProfileLink} from '#/lib/routes/links' +import {type NavigationProp} from '#/lib/routes/types' +import {isNetworkError} from '#/lib/strings/errors' +import {sanitizeHandle} from '#/lib/strings/handles' +import {logger} from '#/logger' +import {useModerationOpts} from '#/state/preferences/moderation-opts' +import {useJoinLinkPreviewsQuery} from '#/state/queries/join-links' +import {useRequestJoinGroupChat} from '#/state/queries/messages/request-join-group-chat' +import {useWithdrawJoinGroupChatRequest} from '#/state/queries/messages/withdraw-join-group-chat' +import {useSession} from '#/state/session' +import {atoms as a, useTheme, web} from '#/alf' +import {AvatarBubbles} from '#/components/AvatarBubbles' +import { + Button, + type ButtonColor, + ButtonIcon, + ButtonText, +} from '#/components/Button' +import * as Dialog from '#/components/Dialog' +import {useInteractionState} from '#/components/hooks/useInteractionState' +import {ArrowRight_Stroke2_Corner0_Rounded as ArrowRightIcon} from '#/components/icons/Arrow' +import {ArrowBoxRight_Stroke2_Corner3_Rounded as JoinIcon} from '#/components/icons/ArrowBoxRight' +import {ChainLinkBroken_Stroke2_Corner0_Rounded as ChainLinkBrokenIcon} from '#/components/icons/ChainLink' +import {PersonGroup_Stroke2_Corner2_Rounded as PersonGroupIcon} from '#/components/icons/Person' +import {RaisingHand4Finger_Stroke2_Corner2_Rounded as HandIcon} from '#/components/icons/RaisingHand' +import {TimesLarge_Stroke2_Corner0_Rounded as XIcon} from '#/components/icons/Times' +import {Warning_Stroke2_Corner0_Rounded as WarningIcon} from '#/components/icons/Warning' +import {useIntentDialogs} from '#/components/intents/IntentDialogs' +import {InlineLinkText} from '#/components/Link' +import {Loader} from '#/components/Loader' +import * as Toast from '#/components/Toast' +import {Text} from '#/components/Typography' +import {ProfileBadges} from '../ProfileBadges' + +export function GroupChatJoinDialog() { + const {groupChatJoinDialogControl, groupChatJoinState} = useIntentDialogs() + + return ( + + + + + ) +} + +function GroupChatJoinDialogInner({code}: {code?: string}) { + const {t: l} = useLingui() + + return ( + + + + + + + ) +} + +function GroupChatJoinDialogContent({code}: {code?: string}) { + const t = useTheme() + const {t: l} = useLingui() + const {groupChatJoinDialogControl: control} = useIntentDialogs() + const {hasSession} = useSession() + const moderationOpts = useModerationOpts() + const navigation = useNavigation() + + const {data, error, isLoading} = useJoinLinkPreviewsQuery({ + codes: code ? [code] : undefined, + hasSession, + }) + + const {mutate: joinGroupChat, isPending: isJoinPending} = + useRequestJoinGroupChat({ + onSuccess: data => { + switch (data.status) { + case 'pending': + control.close(() => { + Toast.show( + l`Access requested! The group owner will review your request.`, + ) + }) + break + case 'joined': { + if (data.convo && data.convo.id) { + control.close(() => { + Toast.show(l`Successfully joined the group chat!`) + navigation.navigate('MessagesConversation', { + conversation: data.convo!.id, + }) + }) + } else { + logger.warn('Request to join group chat returned no convo ID', { + status: data.status, + convoId: data.convo?.id, + }) + } + break + } + } + }, + onError: error => { + let errorMessage = l`Failed to join the group chat. Please try again.` + if (isNetworkError(error)) { + errorMessage = l`There was a problem with your internet connection, please try again` + } else if (error instanceof ChatBskyGroupRequestJoin.ConvoLockedError) { + errorMessage = l`This conversation is locked.` + } else if ( + error instanceof ChatBskyGroupRequestJoin.FollowRequiredError + ) { + errorMessage = l`Only followers can join this group chat.` + } else if (error instanceof ChatBskyGroupRequestJoin.InvalidCodeError) { + errorMessage = l`Invalid group chat code.` + } else if ( + error instanceof ChatBskyGroupRequestJoin.LinkDisabledError + ) { + errorMessage = l`This invite link has been disabled.` + } else if ( + error instanceof ChatBskyGroupRequestJoin.MemberLimitReachedError + ) { + errorMessage = l`The member limit has been reached.` + } else if (error instanceof ChatBskyGroupRequestJoin.UserKickedError) { + errorMessage = l`You have been removed from this group.` + } + Toast.show(errorMessage) + }, + }) + + const {mutate: withdrawRequest, isPending: isWithdrawPending} = + useWithdrawJoinGroupChatRequest({ + onSuccess: () => { + control.close(() => { + Toast.show(l`Join request rescinded.`) + }) + }, + onError: error => { + let errorMessage = l`Failed to rescind your request. Please try again.` + if (isNetworkError(error)) { + errorMessage = l`There was a problem with your internet connection, please try again` + } else if ( + error instanceof + ChatBskyGroupWithdrawJoinRequest.InvalidJoinRequestError + ) { + errorMessage = l`Invalid rescind request.` + } + Toast.show(errorMessage) + }, + }) + + const { + state: interacted, + onIn: onInteract, + onOut: onInteractOut, + } = useInteractionState() + + const handleJoin = () => { + if (!code) return + joinGroupChat({code}) + } + + const handleWithdraw = () => { + if (!convoId) return + withdrawRequest({convoId}) + } + + // Fallback if the prefetch exceeds the timeout + if (isLoading || !data || !moderationOpts) { + return ( + + + + ) + } + + if (error) { + return ( + <> + + + This invite link is invalid + + + + ) + } + + const joinLinkPreview = data.joinLinkPreviews[0] + + if (!joinLinkPreview) { + return ( + <> + + + + + Chat invite link no longer available + + + + + + ) + } + + const convoId = joinLinkPreview.convo?.id + const isFollowing = joinLinkPreview.owner.viewer?.following ?? false + const hasRequested = !convoId && joinLinkPreview.viewer?.requestedAt != null + + let canJoin = true + let ButtonIconImage = isJoinPending || isWithdrawPending ? Loader : JoinIcon + let buttonText = joinLinkPreview.requireApproval + ? l`Request to join` + : l`Join` + let buttonColor: ButtonColor = 'primary' + if (joinLinkPreview.enabledStatus !== 'enabled') { + canJoin = false + ButtonIconImage = WarningIcon + buttonText = l`Chat invite link no longer available` + buttonColor = 'secondary' + } else if (joinLinkPreview.memberCount >= joinLinkPreview.memberLimit) { + canJoin = false + ButtonIconImage = HandIcon + buttonText = l`This chat is full` + buttonColor = 'secondary' + } else if (joinLinkPreview.joinRule === 'followedByOwner' && !isFollowing) { + canJoin = false + ButtonIconImage = HandIcon + buttonText = l`Only people the chat owner follows can join` + buttonColor = 'secondary' + } else if (hasRequested) { + ButtonIconImage = XIcon + buttonText = l`Rescind request` + buttonColor = 'secondary' + } + + return ( + <> + + + + + + Group chat + + + {joinLinkPreview.name} + + + + + + {joinLinkPreview.memberCount}/{joinLinkPreview.memberLimit}{' '} + members + + + + + + + {joinLinkPreview.joinRule === 'followedByOwner' + ? l`Followers can join` + : l`Anyone can join`} + + + + + + By{' '} + { + onInteract() + }, + onMouseLeave: () => { + onInteractOut() + }, + })}> + {createSanitizedDisplayName( + joinLinkPreview.owner, + true, + moderateProfile(joinLinkPreview.owner, moderationOpts).ui( + 'displayName', + ), + )} + + + + + + {sanitizeHandle(joinLinkPreview.owner.handle, '@')} + + + + + {convoId ? ( + + ) : ( + + )} + + ) +} diff --git a/src/components/intents/IntentDialogs.tsx b/src/components/intents/IntentDialogs.tsx index ea72f8c099..76809b366a 100644 --- a/src/components/intents/IntentDialogs.tsx +++ b/src/components/intents/IntentDialogs.tsx @@ -1,13 +1,30 @@ -import {createContext, useContext, useMemo, useState} from 'react' +import { + createContext, + useContext, + useEffect, + useMemo, + useRef, + useState, +} from 'react' +import {usePrefetchJoinLinkPreviews} from '#/state/queries/join-links' +import {useSession} from '#/state/session' +import { + useActiveGroupChatJoinRequest, + useSetActiveLanding, +} from '#/state/shell/landing' import * as Dialog from '#/components/Dialog' import {type DialogControlProps} from '#/components/Dialog' +import {GroupChatJoinDialog} from '#/components/intents/GroupChatJoinDialog' import {VerifyEmailIntentDialog} from '#/components/intents/VerifyEmailIntentDialog' interface Context { verifyEmailDialogControl: DialogControlProps verifyEmailState: {code: string} | undefined setVerifyEmailState: (state: {code: string} | undefined) => void + groupChatJoinDialogControl: DialogControlProps + groupChatJoinState: {code: string} | undefined + setGroupChatJoinState: (state: {code: string} | undefined) => void } const Context = createContext({} as Context) @@ -19,20 +36,70 @@ export function Provider({children}: {children: React.ReactNode}) { const [verifyEmailState, setVerifyEmailState] = useState< {code: string} | undefined >() + const groupChatJoinDialogControl = Dialog.useDialogControl() + const [groupChatJoinState, setGroupChatJoinState] = useState< + {code: string} | undefined + >() + + const {hasSession} = useSession() + const groupChatLanding = useActiveGroupChatJoinRequest() + const setActiveLanding = useSetActiveLanding() + const prefetchJoinLinkPreviews = usePrefetchJoinLinkPreviews() + const landingHandledRef = useRef(false) + + useEffect(() => { + if (hasSession && groupChatLanding && !landingHandledRef.current) { + landingHandledRef.current = true + const code = groupChatLanding.code + setActiveLanding(undefined) + const prefetch = prefetchJoinLinkPreviews({ + codes: [code], + hasSession: true, + }) + void Promise.race([ + prefetch, + new Promise(res => setTimeout(res, 200)), + ]).finally(() => { + setGroupChatJoinState({code}) + groupChatJoinDialogControl.open() + }) + } + if (!groupChatLanding) { + landingHandledRef.current = false + } + }, [ + hasSession, + groupChatLanding, + setActiveLanding, + setGroupChatJoinState, + prefetchJoinLinkPreviews, + groupChatJoinDialogControl, + ]) const value = useMemo( () => ({ verifyEmailDialogControl, verifyEmailState, setVerifyEmailState, + groupChatJoinDialogControl, + groupChatJoinState, + setGroupChatJoinState, }), - [verifyEmailDialogControl, verifyEmailState, setVerifyEmailState], + [ + verifyEmailDialogControl, + verifyEmailState, + setVerifyEmailState, + groupChatJoinDialogControl, + groupChatJoinState, + setGroupChatJoinState, + ], ) return ( {children} + ) } diff --git a/src/lib/constants.ts b/src/lib/constants.ts index 95eb57fd54..a22700f880 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -13,6 +13,7 @@ export const PUBLIC_BSKY_SERVICE = 'https://public.api.bsky.app' export const DEFAULT_SERVICE = BSKY_SERVICE const HELP_DESK_LANG = 'en-us' export const HELP_DESK_URL = `https://blueskyweb.zendesk.com/hc/${HELP_DESK_LANG}` +export const CHAT_SERVICE = 'https://api.bsky.chat' export const EMBED_SERVICE = 'https://embed.bsky.app' export const EMBED_SCRIPT = `${EMBED_SERVICE}/static/embed.js` export const BSKY_DOWNLOAD_URL = 'https://bsky.app/download' diff --git a/src/lib/hooks/useIntentHandler.ts b/src/lib/hooks/useIntentHandler.ts index c35ca49b16..5a9d0b39fe 100644 --- a/src/lib/hooks/useIntentHandler.ts +++ b/src/lib/hooks/useIntentHandler.ts @@ -5,7 +5,11 @@ import * as WebBrowser from 'expo-web-browser' import {useOpenComposer} from '#/lib/hooks/useOpenComposer' import {parseLinkingUrl} from '#/lib/parseLinkingUrl' +import {CHAT_INVITE_CODE_REGEX} from '#/lib/strings/url-helpers' +import {usePrefetchJoinLinkPreviews} from '#/state/queries/join-links' import {useSession} from '#/state/session' +import {useSetActiveLanding} from '#/state/shell/landing' +import {useLoggedOutViewControls} from '#/state/shell/logged-out' import {useCloseAllActiveElements} from '#/state/util' import {useIntentDialogs} from '#/components/intents/IntentDialogs' import {useAnalytics} from '#/analytics' @@ -25,6 +29,7 @@ export function useIntentHandler() { const ax = useAnalytics() const composeIntent = useComposeIntent() const verifyEmailIntent = useVerifyEmailIntent() + const groupChatJoinIntent = useGroupChatJoinIntent() const {currentAccount} = useSession() const {tryApplyUpdate} = useApplyPullRequestOTAUpdate() @@ -44,6 +49,11 @@ export function useIntentHandler() { }) } const urlp = parseLinkingUrl(url) + const chatInviteMatch = urlp.pathname.match(CHAT_INVITE_CODE_REGEX) + if (chatInviteMatch) { + groupChatJoinIntent(chatInviteMatch[1], url) + return + } const [, intent, intentType] = urlp.pathname.split('/') // On native, our links look like bluesky://intent/SomeIntent, so we have to check the hostname for the @@ -99,6 +109,7 @@ export function useIntentHandler() { ax, composeIntent, verifyEmailIntent, + groupChatJoinIntent, currentAccount, tryApplyUpdate, ]) @@ -162,6 +173,46 @@ export function useComposeIntent() { ) } +export function useGroupChatJoinIntent() { + const closeAllActiveElements = useCloseAllActiveElements() + const {hasSession} = useSession() + const {groupChatJoinDialogControl: control, setGroupChatJoinState: setState} = + useIntentDialogs() + const {requestSwitchToAccount} = useLoggedOutViewControls() + const setActiveLanding = useSetActiveLanding() + const prefetchJoinLinkPreviews = usePrefetchJoinLinkPreviews() + return useCallback( + (code: string, uri?: string) => { + closeAllActiveElements() + if (hasSession) { + setState({code}) + const prefetch = prefetchJoinLinkPreviews({ + codes: [code], + hasSession: true, + }) + void Promise.race([ + prefetch, + new Promise(res => setTimeout(res, 200)), + ]).finally(() => { + control.open() + }) + } else { + setActiveLanding({type: 'groupchat', uri: uri ?? '', code}) + requestSwitchToAccount({requestedAccount: 'groupchat'}) + } + }, + [ + closeAllActiveElements, + hasSession, + control, + setState, + prefetchJoinLinkPreviews, + requestSwitchToAccount, + setActiveLanding, + ], + ) +} + function useVerifyEmailIntent() { const closeAllActiveElements = useCloseAllActiveElements() const {verifyEmailDialogControl: control, setVerifyEmailState: setState} = diff --git a/src/lib/strings/url-helpers.ts b/src/lib/strings/url-helpers.ts index cd2ae29afe..b5c278dacf 100644 --- a/src/lib/strings/url-helpers.ts +++ b/src/lib/strings/url-helpers.ts @@ -178,6 +178,28 @@ export function isBskyStarterPackUrl(url: string): boolean { return false } +export const CHAT_INVITE_CODE_REGEX = /^\/c\/([a-zA-Z0-9]{7,10})$/ + +export function getChatInviteCodeFromUrl(url: string): string | undefined { + let pathname: string + if (isBskyAppUrl(url)) { + try { + pathname = new URL(url).pathname + } catch { + return undefined + } + } else if (url.startsWith('/')) { + pathname = url.split('?')[0].split('#')[0] + } else { + return undefined + } + return pathname.match(CHAT_INVITE_CODE_REGEX)?.[1] +} + +export function isBskyChatInviteUrl(url: string): boolean { + return getChatInviteCodeFromUrl(url) !== undefined +} + export function isBskyDownloadUrl(url: string): boolean { if (isExternalUrl(url)) { return false diff --git a/src/screens/Messages/JoinRequest.tsx b/src/screens/Messages/JoinRequest.tsx new file mode 100644 index 0000000000..c6da1f91ec --- /dev/null +++ b/src/screens/Messages/JoinRequest.tsx @@ -0,0 +1,305 @@ +import {View} from 'react-native' +import {ImageBackground} from 'expo-image' +import {moderateProfile} from '@atproto/api' +import {Trans, useLingui} from '@lingui/react/macro' + +import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name' +import {sanitizeHandle} from '#/lib/strings/handles' +import {useModerationOpts} from '#/state/preferences/moderation-opts' +import {useJoinLinkPreviewsQuery} from '#/state/queries/join-links' +import {useActiveGroupChatJoinRequest} from '#/state/shell/landing' +import {LoggedOutScreenState} from '#/view/com/auth/LoggedOut' +import {LogomarkWithType} from '#/view/icons/LogomarkWithType' +import {atoms as a, useBreakpoints, useTheme} from '#/alf' +import {AvatarBubbles} from '#/components/AvatarBubbles' +import {Button, ButtonText} from '#/components/Button' +import {ChainLinkBroken_Stroke2_Corner0_Rounded as ChainLinkBrokenIcon} from '#/components/icons/ChainLink' +import {PersonGroup_Stroke2_Corner2_Rounded as PersonGroupIcon} from '#/components/icons/Person' +import {ProfileBadges} from '#/components/ProfileBadges' +import {Text} from '#/components/Typography' + +const desktopDarkBg = require('../../../assets/images/chat-desktop-bg-dark.webp') +const desktopLightBg = require('../../../assets/images/chat-desktop-bg-light.webp') +const mobileDarkBg = require('../../../assets/images/chat-mobile-bg-dark.webp') +const mobileLightBg = require('../../../assets/images/chat-mobile-bg-light.webp') + +type Props = { + setScreenState: (state: LoggedOutScreenState) => void +} + +export function JoinRequest({setScreenState}: Props) { + const t = useTheme() + const {t: l} = useLingui() + + const {gtMobile, gtTablet} = useBreakpoints() + const moderationOpts = useModerationOpts() + + // Get code from context (logged-out only) + const contextJoinRequest = useActiveGroupChatJoinRequest() + const code = contextJoinRequest?.code + + const {data, error} = useJoinLinkPreviewsQuery({ + codes: code ? [code] : undefined, + hasSession: false, + }) + + const isDarkMode = t.name !== 'light' + const background = gtMobile + ? isDarkMode + ? desktopDarkBg + : desktopLightBg + : isDarkMode + ? mobileDarkBg + : mobileLightBg + + const requiresApproval = data?.joinLinkPreviews[0]?.requireApproval + const requiresFollow = + data?.joinLinkPreviews[0]?.joinRule === 'followedByOwner' + + return ( + + + + {error ? ( + + + + {l`This invite link has expired`} + + + + ) : data && moderationOpts ? ( + + + + + + Group chat + + + + + + {data.joinLinkPreviews[0].memberCount}/ + {data.joinLinkPreviews[0].memberLimit} + + + + + + {data.joinLinkPreviews[0].name} + + + + + + + By{' '} + {createSanitizedDisplayName( + data.joinLinkPreviews[0].owner, + true, + moderateProfile( + data.joinLinkPreviews[0].owner, + moderationOpts, + ).ui('displayName'), + )} + + + + + + {sanitizeHandle(data.joinLinkPreviews[0].owner.handle, '@')} + + + + {requiresApproval + ? l`Sign in to request access to this group chat.` + : l`Sign in to accept invite.`}{' '} + {requiresFollow && + l`Only people ${createSanitizedDisplayName( + data.joinLinkPreviews[0].owner, + true, + moderateProfile( + data.joinLinkPreviews[0].owner, + moderationOpts, + ).ui('displayName'), + )} follows can join.`} + + + + ) : null} + + + + ) +} + +function Wrapper({children}: React.PropsWithChildren) { + const t = useTheme() + + const isDarkMode = t.name !== 'light' + + return ( + <> + + + {children} + + + ) +} + +function ActionButtons({ + setScreenState, +}: { + setScreenState: (state: LoggedOutScreenState) => void +}) { + const t = useTheme() + const {t: l} = useLingui() + const isDarkMode = t.name !== 'light' + + return ( + + + + + ) +} diff --git a/src/screens/Messages/components/InviteLinkDialog.tsx b/src/screens/Messages/components/InviteLinkDialog.tsx index 755eec2108..ad6d4a08e5 100644 --- a/src/screens/Messages/components/InviteLinkDialog.tsx +++ b/src/screens/Messages/components/InviteLinkDialog.tsx @@ -297,8 +297,8 @@ export function InviteLinkDialog({ const linkEnabled = joinLink?.enabledStatus === 'enabled' const linkDisabled = joinLink?.enabledStatus === 'disabled' const joinLinkURI = joinLink?.code - ? `https://bsky.app/chat/${joinLink.code}` - : 'https://bsky.app/chat' + ? `https://bsky.app/c/${joinLink.code}` + : 'https://bsky.app/' const createdAt = joinLink ? new Date(joinLink.createdAt) : null const currentOption = whoCanJoinOptions.find( diff --git a/src/screens/Messages/components/MessagesListGroupInfoPanel.tsx b/src/screens/Messages/components/MessagesListGroupInfoPanel.tsx index cb76485af6..72d92a24ea 100644 --- a/src/screens/Messages/components/MessagesListGroupInfoPanel.tsx +++ b/src/screens/Messages/components/MessagesListGroupInfoPanel.tsx @@ -43,14 +43,11 @@ export function MessagesListGroupInfoPanel({ }, }) - // TODO Enable this once the feature is working end-to-end. -dsb - // const joinLink = groupConvo?.details.joinLink - const isJoinLinkEnabled = false - // (isOwner && groupConvo) || - // (!isOwner && groupConvo && joinLink?.enabledStatus === 'enabled') - const isOwner = convo.primaryMember?.did === currentAccount?.did + const isJoinLinkEnabled = + isOwner || convo.details.joinLink?.enabledStatus === 'enabled' + const members = (convo.members ?? []).filter( profile => profile.did !== currentAccount?.did, ) diff --git a/src/screens/Onboarding/StepFinished/index.tsx b/src/screens/Onboarding/StepFinished/index.tsx index e477528f1b..11dfd35ceb 100644 --- a/src/screens/Onboarding/StepFinished/index.tsx +++ b/src/screens/Onboarding/StepFinished/index.tsx @@ -28,11 +28,11 @@ import {preferencesQueryKey} from '#/state/queries/preferences' import {RQKEY as profileRQKey} from '#/state/queries/profile' import {useAgent} from '#/state/session' import {useOnboardingDispatch} from '#/state/shell' -import {useProgressGuideControls} from '#/state/shell/progress-guide' import { useActiveStarterPack, useSetActiveStarterPack, -} from '#/state/shell/starter-pack' +} from '#/state/shell/landing' +import {useProgressGuideControls} from '#/state/shell/progress-guide' import { OnboardingControls, OnboardingHeaderSlot, diff --git a/src/screens/Signup/index.tsx b/src/screens/Signup/index.tsx index fe67773a40..d98b6b4fea 100644 --- a/src/screens/Signup/index.tsx +++ b/src/screens/Signup/index.tsx @@ -9,7 +9,7 @@ import {FEEDBACK_FORM_URL} from '#/lib/constants' import {logger} from '#/logger' import {useServiceQuery} from '#/state/queries/service' import {useStarterPackQuery} from '#/state/queries/starter-packs' -import {useActiveStarterPack} from '#/state/shell/starter-pack' +import {useActiveStarterPack} from '#/state/shell/landing' import {LoggedOutLayout} from '#/view/com/util/layouts/LoggedOutLayout' import { initialState, diff --git a/src/screens/StarterPack/StarterPackLandingScreen.tsx b/src/screens/StarterPack/StarterPackLandingScreen.tsx index 2b08212794..f15d259e1f 100644 --- a/src/screens/StarterPack/StarterPackLandingScreen.tsx +++ b/src/screens/StarterPack/StarterPackLandingScreen.tsx @@ -19,7 +19,7 @@ import {useStarterPackQuery} from '#/state/queries/starter-packs' import { useActiveStarterPack, useSetActiveStarterPack, -} from '#/state/shell/starter-pack' +} from '#/state/shell/landing' import {LoggedOutScreenState} from '#/view/com/auth/LoggedOut' import {formatCount} from '#/view/com/util/numeric/format' import {Logo} from '#/view/icons/Logo' diff --git a/src/screens/StarterPack/StarterPackScreen.tsx b/src/screens/StarterPack/StarterPackScreen.tsx index adb27ef2ec..ddbd5cd840 100644 --- a/src/screens/StarterPack/StarterPackScreen.tsx +++ b/src/screens/StarterPack/StarterPackScreen.tsx @@ -37,12 +37,12 @@ import { useStarterPackQuery, } from '#/state/queries/starter-packs' import {useAgent, useSession} from '#/state/session' +import {useSetActiveStarterPack} from '#/state/shell/landing' import {useLoggedOutViewControls} from '#/state/shell/logged-out' import { ProgressGuideAction, useProgressGuideControls, } from '#/state/shell/progress-guide' -import {useSetActiveStarterPack} from '#/state/shell/starter-pack' import {PagerWithHeader} from '#/view/com/pager/PagerWithHeader' import {ProfileSubpageHeader} from '#/view/com/profile/ProfileSubpageHeader' import {bulkWriteFollows} from '#/screens/Onboarding/util' diff --git a/src/state/preferences/moderation-opts.tsx b/src/state/preferences/moderation-opts.tsx index a6e36b7d2b..b8592d77e0 100644 --- a/src/state/preferences/moderation-opts.tsx +++ b/src/state/preferences/moderation-opts.tsx @@ -1,5 +1,5 @@ import {createContext, useContext, useMemo} from 'react' -import {BskyAgent, type ModerationOpts} from '@atproto/api' +import {AtpAgent, type ModerationOpts} from '@atproto/api' import {useHiddenPosts, useLabelDefinitions} from '#/state/preferences' import {DEFAULT_LOGGED_OUT_LABEL_PREFERENCES} from '#/state/queries/preferences/moderation' @@ -43,7 +43,7 @@ export function Provider({children}: React.PropsWithChildren<{}>) { ...moderationPrefs, labelers: moderationPrefs.labelers.length ? moderationPrefs.labelers - : BskyAgent.appLabelers.map(did => ({ + : AtpAgent.appLabelers.map(did => ({ did, labels: DEFAULT_LOGGED_OUT_LABEL_PREFERENCES, })), diff --git a/src/state/queries/join-links.ts b/src/state/queries/join-links.ts new file mode 100644 index 0000000000..6aa10331ef --- /dev/null +++ b/src/state/queries/join-links.ts @@ -0,0 +1,72 @@ +import {AtpAgent} from '@atproto/api' +import {useQuery, useQueryClient} from '@tanstack/react-query' + +import {CHAT_SERVICE, DM_SERVICE_HEADERS} from '#/lib/constants' +import {logger} from '#/logger' +import {STALE} from '#/state/queries/index' +import {createQueryKey} from '#/state/queries/util' +import {useAgent} from '#/state/session' + +const joinLinkPreviewQueryKeyRoot = 'join-link-preview' + +export const createJoinLinkPreviewQueryKey = (args: { + codes: string[] + hasSession: boolean +}) => + createQueryKey(joinLinkPreviewQueryKeyRoot, args, { + persistedVersion: 1, + }) + +export function useJoinLinkPreviewsQuery({ + codes, + hasSession, +}: { + codes?: string[] + hasSession: boolean +}) { + const agent = useAgent() + + return useQuery({ + queryKey: createJoinLinkPreviewQueryKey({codes: codes ?? [], hasSession}), + queryFn: async () => { + if (!codes) throw new Error('No invite code') + try { + const previewAgent = new AtpAgent({service: CHAT_SERVICE}) + const res = hasSession + ? await agent.chat.bsky.group.getJoinLinkPreviews( + {codes}, + {headers: DM_SERVICE_HEADERS}, + ) + : await previewAgent.chat.bsky.group.getJoinLinkPreviews({codes}) + return res.data + } catch (error) { + logger.error('Failed to fetch join link preview', {safeMessage: error}) + throw error + } + }, + enabled: codes != null && codes.length > 0, + staleTime: STALE.SECONDS.FIFTEEN, + }) +} + +export function usePrefetchJoinLinkPreviews() { + const agent = useAgent() + const queryClient = useQueryClient() + + return ({codes, hasSession}: {codes: string[]; hasSession: boolean}) => { + return queryClient.prefetchQuery({ + queryKey: createJoinLinkPreviewQueryKey({codes, hasSession}), + queryFn: async () => { + const previewAgent = new AtpAgent({service: CHAT_SERVICE}) + const res = hasSession + ? await agent.chat.bsky.group.getJoinLinkPreviews( + {codes}, + {headers: DM_SERVICE_HEADERS}, + ) + : await previewAgent.chat.bsky.group.getJoinLinkPreviews({codes}) + return res.data + }, + staleTime: STALE.SECONDS.FIFTEEN, + }) + } +} diff --git a/src/state/queries/messages/request-join-group-chat.ts b/src/state/queries/messages/request-join-group-chat.ts new file mode 100644 index 0000000000..04e63395f7 --- /dev/null +++ b/src/state/queries/messages/request-join-group-chat.ts @@ -0,0 +1,37 @@ +import {type ChatBskyGroupRequestJoin} from '@atproto/api' +import {useMutation} from '@tanstack/react-query' + +import {DM_SERVICE_HEADERS} from '#/lib/constants' +import {logger} from '#/logger' +import {useAgent, useSession} from '#/state/session' + +export function useRequestJoinGroupChat({ + onSuccess, + onError, +}: { + onSuccess?: (data: ChatBskyGroupRequestJoin.OutputSchema) => void + onError?: (error: Error) => void +} = {}) { + const agent = useAgent() + const {hasSession} = useSession() + + return useMutation({ + mutationFn: async ({code}: {code: string}) => { + if (!hasSession) throw new Error('Must be logged in to join') + if (!code) throw new Error('No invite code') + + const res = await agent.chat.bsky.group.requestJoin( + {code}, + {headers: DM_SERVICE_HEADERS}, + ) + return res.data + }, + onSuccess: data => { + onSuccess?.(data) + }, + onError: error => { + logger.error('Failed to join group chat', {safeMessage: error}) + onError?.(error) + }, + }) +} diff --git a/src/state/queries/messages/withdraw-join-group-chat.ts b/src/state/queries/messages/withdraw-join-group-chat.ts new file mode 100644 index 0000000000..92025cc2be --- /dev/null +++ b/src/state/queries/messages/withdraw-join-group-chat.ts @@ -0,0 +1,38 @@ +import {type ChatBskyGroupWithdrawJoinRequest} from '@atproto/api' +import {useMutation} from '@tanstack/react-query' + +import {DM_SERVICE_HEADERS} from '#/lib/constants' +import {logger} from '#/logger' +import {useAgent, useSession} from '#/state/session' + +export function useWithdrawJoinGroupChatRequest({ + onSuccess, + onError, +}: { + onSuccess?: (data: ChatBskyGroupWithdrawJoinRequest.OutputSchema) => void + onError?: (error: Error) => void +} = {}) { + const agent = useAgent() + const {hasSession} = useSession() + + return useMutation({ + mutationFn: async ({convoId}: {convoId: string}) => { + if (!hasSession) + throw new Error('Must be logged in to withdraw a join request') + if (!convoId) throw new Error('No convoId provided') + + const res = await agent.chat.bsky.group.withdrawJoinRequest( + {convoId}, + {headers: DM_SERVICE_HEADERS}, + ) + return res.data + }, + onSuccess: data => { + onSuccess?.(data) + }, + onError: error => { + logger.error('Failed to withdraw join request', {safeMessage: error}) + onError?.(error) + }, + }) +} diff --git a/src/state/shell/landing.tsx b/src/state/shell/landing.tsx new file mode 100644 index 0000000000..f071c79e39 --- /dev/null +++ b/src/state/shell/landing.tsx @@ -0,0 +1,66 @@ +import {createContext, useContext, useState} from 'react' + +import {logger} from '#/logger' + +type StarterPackLanding = { + type: 'starterpack' + uri: string + isClip?: boolean +} + +type GroupChatJoinRequestLanding = { + type: 'groupchat' + uri: string + code: string +} + +type LandingType = StarterPackLanding | GroupChatJoinRequestLanding | undefined + +type SetContext = (v: LandingType) => void + +const stateContext = createContext(undefined) +stateContext.displayName = 'ActiveLandingStateContext' +const setContext = createContext((_: LandingType) => {}) +setContext.displayName = 'ActiveLandingSetContext' + +export function Provider({children}: {children: React.ReactNode}) { + const [state, setState] = useState() + + return ( + + {children} + + ) +} + +// Core hooks +export const useActiveLanding = () => useContext(stateContext) +export const useSetActiveLanding = () => useContext(setContext) + +// Filtered hooks for convenience +export const useActiveStarterPack = () => { + const landing = useActiveLanding() + return landing?.type === 'starterpack' ? landing : undefined +} + +export const useSetActiveStarterPack = () => { + const setLanding = useSetActiveLanding() + const currentLanding = useActiveLanding() + return (pack: {uri: string; isClip?: boolean} | undefined) => { + if (!pack) { + setLanding(undefined) + } else { + if (currentLanding && currentLanding.type !== 'starterpack') { + logger.debug( + `[landing] Replacing ${currentLanding.type} landing with starterpack`, + ) + } + setLanding({type: 'starterpack', ...pack}) + } + } +} + +export const useActiveGroupChatJoinRequest = () => { + const landing = useActiveLanding() + return landing?.type === 'groupchat' ? landing : undefined +} diff --git a/src/state/shell/logged-out.tsx b/src/state/shell/logged-out.tsx index fdc588dcce..fcb76818c4 100644 --- a/src/state/shell/logged-out.tsx +++ b/src/state/shell/logged-out.tsx @@ -1,7 +1,7 @@ import {createContext, useContext, useMemo, useState} from 'react' import {useSession} from '#/state/session' -import {useActiveStarterPack} from '#/state/shell/starter-pack' +import {useActiveLanding} from '#/state/shell/landing' import {IS_WEB} from '#/env' type State = { @@ -26,7 +26,12 @@ type Controls = { /** * The did of the account to populate the login form with. */ - requestedAccount?: (string & {}) | 'none' | 'new' | 'starterpack' + requestedAccount?: + | (string & {}) + | 'none' + | 'new' + | 'starterpack' + | 'groupchat' }) => void /** * Clears the requested account so that next time the logged out view is @@ -48,17 +53,34 @@ const ControlsContext = createContext({ }) ControlsContext.displayName = 'LoggedOutControlsContext' +function getRequestedAccountFromLanding( + landing: ReturnType, + hasSession: boolean, +): string | undefined { + if (hasSession || !landing) return undefined + + switch (landing.type) { + case 'starterpack': + return IS_WEB ? 'starterpack' : 'new' + case 'groupchat': + return 'groupchat' + default: + return undefined + } +} + export function Provider({children}: React.PropsWithChildren<{}>) { - const activeStarterPack = useActiveStarterPack() + const activeLanding = useActiveLanding() const {hasSession} = useSession() - const shouldShowStarterPack = Boolean(activeStarterPack?.uri) && !hasSession + + const requestedAccount = getRequestedAccountFromLanding( + activeLanding, + hasSession, + ) + const [state, setState] = useState({ - showLoggedOut: shouldShowStarterPack, - requestedAccountSwitchTo: shouldShowStarterPack - ? IS_WEB - ? 'starterpack' - : 'new' - : undefined, + showLoggedOut: Boolean(requestedAccount), + requestedAccountSwitchTo: requestedAccount, }) const controls = useMemo( diff --git a/src/view/com/auth/LoggedOut.tsx b/src/view/com/auth/LoggedOut.tsx index 0cfea7cf16..91c0b9afca 100644 --- a/src/view/com/auth/LoggedOut.tsx +++ b/src/view/com/auth/LoggedOut.tsx @@ -9,6 +9,7 @@ import {PressableScale} from '#/lib/custom-animations/PressableScale' import {STALE} from '#/state/queries' import {profilesQueryKey} from '#/state/queries/profile' import {useAgent, useSession} from '#/state/session' +import {useSetActiveLanding} from '#/state/shell/landing' import { useLoggedOutView, useLoggedOutViewControls, @@ -16,6 +17,7 @@ import { import {useEnableMinimalShellMode} from '#/state/shell/minimal-mode' import {ErrorBoundary} from '#/view/com/util/ErrorBoundary' import {Login} from '#/screens/Login' +import {JoinRequest} from '#/screens/Messages/JoinRequest' import {Signup} from '#/screens/Signup' import {LandingScreen} from '#/screens/StarterPack/StarterPackLandingScreen' import {atoms as a, native, tokens, useTheme} from '#/alf' @@ -29,9 +31,26 @@ enum ScreenState { S_Login, S_CreateAccount, S_StarterPack, + S_GroupChatJoinRequest, } export {ScreenState as LoggedOutScreenState} +function getInitialScreenState(requestedAccountSwitchTo?: string): ScreenState { + switch (requestedAccountSwitchTo) { + case 'new': + return ScreenState.S_CreateAccount + case 'starterpack': + return ScreenState.S_StarterPack + case 'groupchat': + return ScreenState.S_GroupChatJoinRequest + case undefined: + return ScreenState.S_LoginOrCreateAccount + default: + // DID or other string = login with that account + return ScreenState.S_Login + } +} + export function LoggedOut({onDismiss}: {onDismiss?: () => void}) { const {_} = useLingui() const ax = useAnalytics() @@ -39,18 +58,11 @@ export function LoggedOut({onDismiss}: {onDismiss?: () => void}) { const insets = useSafeAreaInsets() useEnableMinimalShellMode() const {requestedAccountSwitchTo} = useLoggedOutView() - const [screenState, setScreenState] = useState(() => { - if (requestedAccountSwitchTo === 'new') { - return ScreenState.S_CreateAccount - } else if (requestedAccountSwitchTo === 'starterpack') { - return ScreenState.S_StarterPack - } else if (requestedAccountSwitchTo != null) { - return ScreenState.S_Login - } else { - return ScreenState.S_LoginOrCreateAccount - } - }) + const initialScreenState = getInitialScreenState(requestedAccountSwitchTo) + const [screenState, setScreenState] = + useState(initialScreenState) const {clearRequestedAccount} = useLoggedOutViewControls() + const setActiveLanding = useSetActiveLanding() const queryClient = useQueryClient() const {accounts} = useSession() @@ -73,7 +85,9 @@ export function LoggedOut({onDismiss}: {onDismiss?: () => void}) { onDismiss() } clearRequestedAccount() - }, [clearRequestedAccount, onDismiss]) + // Clear landing context when user dismisses the modal + setActiveLanding(undefined) + }, [clearRequestedAccount, onDismiss, setActiveLanding]) return ( void}) { {screenState === ScreenState.S_StarterPack ? ( + ) : screenState === ScreenState.S_GroupChatJoinRequest ? ( + ) : screenState === ScreenState.S_LoginOrCreateAccount ? ( { @@ -122,17 +138,12 @@ export function LoggedOut({onDismiss}: {onDismiss?: () => void}) { {screenState === ScreenState.S_Login ? ( { - setScreenState(ScreenState.S_LoginOrCreateAccount) - clearRequestedAccount() + setScreenState(initialScreenState) }} /> ) : undefined} {screenState === ScreenState.S_CreateAccount ? ( - - setScreenState(ScreenState.S_LoginOrCreateAccount) - } - /> + setScreenState(initialScreenState)} /> ) : undefined} diff --git a/src/view/com/util/Link.tsx b/src/view/com/util/Link.tsx index 7e58218852..658a3ca3b3 100644 --- a/src/view/com/util/Link.tsx +++ b/src/view/com/util/Link.tsx @@ -13,6 +13,7 @@ import { import {sanitizeUrl} from '@braintree/sanitize-url' import {StackActions} from '@react-navigation/native' +import {useGroupChatJoinIntent} from '#/lib/hooks/useIntentHandler' import { type DebouncedNavigationProp, useNavigationDeduped, @@ -21,6 +22,7 @@ import {useOpenLink} from '#/lib/hooks/useOpenLink' import {getTabState, TabState} from '#/lib/routes/helpers' import { convertBskyAppUrlIfNeeded, + getChatInviteCodeFromUrl, isExternalUrl, linkRequiresWarning, } from '#/lib/strings/url-helpers' @@ -81,6 +83,7 @@ export const Link = memo(function Link({ const navigation = useNavigationDeduped() const anchorHref = asAnchor ? sanitizeUrl(href) : undefined const openLink = useOpenLink() + const groupChatJoinIntent = useGroupChatJoinIntent() const onPress = useCallback( (e?: Event) => { @@ -92,11 +95,20 @@ export const Link = memo(function Link({ sanitizeUrl(href), navigationAction, openLink, + groupChatJoinIntent, e, ) } }, - [closeModal, navigation, navigationAction, href, openLink, onBeforePress], + [ + closeModal, + navigation, + navigationAction, + href, + openLink, + onBeforePress, + groupChatJoinIntent, + ], ) const accessibilityActionsWithActivate = [ @@ -196,6 +208,7 @@ export const TextLink = memo(function TextLink({ const {closeModal} = useModalControls() const {linkWarningDialogControl} = useGlobalDialogsControlContext() const openLink = useOpenLink() + const groupChatJoinIntent = useGroupChatJoinIntent() if (!disableMismatchWarning && typeof text !== 'string') { console.error('Unable to detect mismatching label') @@ -238,6 +251,7 @@ export const TextLink = memo(function TextLink({ sanitizeUrl(href), navigationAction, openLink, + groupChatJoinIntent, e, ) }, @@ -252,6 +266,7 @@ export const TextLink = memo(function TextLink({ navigationAction, openLink, linkWarningDialogControl, + groupChatJoinIntent, ], ) const hrefAttrs = useMemo(() => { @@ -373,6 +388,7 @@ function onPressInner( href: string, navigationAction: 'push' | 'replace' | 'navigate' = 'push', openLink: (href: string) => void, + groupChatJoinIntent: (code: string, uri?: string) => void, e?: Event, ) { let shouldHandle = false @@ -400,6 +416,11 @@ function onPressInner( if (shouldHandle) { href = convertBskyAppUrlIfNeeded(href) + const chatInviteCode = getChatInviteCodeFromUrl(href) + if (chatInviteCode) { + groupChatJoinIntent(chatInviteCode, href) + return + } if ( newTab || href.startsWith('http') || diff --git a/src/view/icons/LogomarkWithType.tsx b/src/view/icons/LogomarkWithType.tsx new file mode 100644 index 0000000000..7437a5db14 --- /dev/null +++ b/src/view/icons/LogomarkWithType.tsx @@ -0,0 +1,55 @@ +import Svg, {Path, type PathProps, type SvgProps} from 'react-native-svg' + +import {useTheme} from '#/alf' + +const ratio = 17 / 64 + +export function LogomarkWithType({ + fill, + ...rest +}: {fill?: PathProps['fill']} & SvgProps) { + const t = useTheme() + const size = parseInt(`${rest.width || 32}`) + + return ( + + + + + + + + + + + ) +} From b87a51b4852a4363f50e8af8fe4b2c7801a89406 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Tue, 2 Jun 2026 15:07:14 -0500 Subject: [PATCH 028/149] Prefer opengraph image, fall back to Standard Site coverImage (#10694) --- src/lib/api/resolve.ts | 4 ++++ src/view/com/composer/ExternalEmbed.tsx | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/lib/api/resolve.ts b/src/lib/api/resolve.ts index d0600b2eb8..f75cd74db2 100644 --- a/src/lib/api/resolve.ts +++ b/src/lib/api/resolve.ts @@ -246,6 +246,10 @@ async function resolveExternal( title: result.title ?? '', description: result.description ?? '', thumb: result.image ? await imageToThumb(result.image) : undefined, + /* + * New fields from Standard Site integration. Other fields are derived from + * opengraph/oembed as before. + */ associatedRefs: result.associatedRefs, view: result.view, } diff --git a/src/view/com/composer/ExternalEmbed.tsx b/src/view/com/composer/ExternalEmbed.tsx index cc7b983c31..ecd22d7c39 100644 --- a/src/view/com/composer/ExternalEmbed.tsx +++ b/src/view/com/composer/ExternalEmbed.tsx @@ -98,7 +98,8 @@ export const ExternalEmbedLink = ({ uri, description: data.view?.external?.description || data.description, - thumb: data.view?.external?.thumb || data.thumb?.source.path, + // prefer opengraph data to atproto record-derived image + thumb: data.thumb?.source.path || data.view?.external?.thumb, }} /> ) From 75490c3cdf76118ba3852dcfdc49d0bba6286c12 Mon Sep 17 00:00:00 2001 From: DS Boyce <260543580+ds-boyce@users.noreply.github.com> Date: Tue, 2 Jun 2026 13:27:43 -0700 Subject: [PATCH 029/149] Don't show Suggested heading if there are no suggestions (#10695) --- src/components/dms/AddMembersFlow.tsx | 2 +- src/components/dms/InitiateChatFlow.tsx | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/dms/AddMembersFlow.tsx b/src/components/dms/AddMembersFlow.tsx index 1601594dab..749e6976ed 100644 --- a/src/components/dms/AddMembersFlow.tsx +++ b/src/components/dms/AddMembersFlow.tsx @@ -219,7 +219,7 @@ export function AddMembersFlow({ } } - if (searchText === '') { + if (searchText === '' && _items.length > 0) { _items.unshift({ type: 'label', key: 'suggested', diff --git a/src/components/dms/InitiateChatFlow.tsx b/src/components/dms/InitiateChatFlow.tsx index 09760aefdf..32da1e3e5b 100644 --- a/src/components/dms/InitiateChatFlow.tsx +++ b/src/components/dms/InitiateChatFlow.tsx @@ -316,6 +316,7 @@ export function InitiateChatFlow({ if ( searchText === '' && + _items.length > 0 && (chatState === ChatState.NEW_CHAT || chatState === ChatState.NEW_GROUP_CHAT) ) { From 73dae02df3067205185e210950e6243a29a3f183 Mon Sep 17 00:00:00 2001 From: DS Boyce <260543580+ds-boyce@users.noreply.github.com> Date: Tue, 2 Jun 2026 13:28:06 -0700 Subject: [PATCH 030/149] Create screen for managing chat requests (#10635) --- bskyweb/cmd/bskyweb/server.go | 1 + src/Navigation.tsx | 6 + src/lib/routes/types.ts | 1 + src/routes.ts | 1 + .../MembersAndRequests.tsx | 22 +- .../Messages/ConversationSettings/index.tsx | 3 +- src/screens/Messages/JoinRequests.tsx | 491 ++++++++++++++++++ src/state/queries/messages/join-requests.ts | 129 +++++ 8 files changed, 645 insertions(+), 9 deletions(-) create mode 100644 src/screens/Messages/JoinRequests.tsx create mode 100644 src/state/queries/messages/join-requests.ts diff --git a/bskyweb/cmd/bskyweb/server.go b/bskyweb/cmd/bskyweb/server.go index 4a4ba2fde3..cc5119e8d4 100644 --- a/bskyweb/cmd/bskyweb/server.go +++ b/bskyweb/cmd/bskyweb/server.go @@ -339,6 +339,7 @@ func serve(cctx *cli.Context) error { e.GET("/messages/inbox", server.WebGeneric) e.GET("/messages/:conversation", server.WebGeneric) e.GET("/messages/:conversation/settings", server.WebGeneric) + e.GET("/messages/:conversation/requests", server.WebGeneric) // profile endpoints; only first populates info e.GET("/profile/:handleOrDID", server.WebProfile) diff --git a/src/Navigation.tsx b/src/Navigation.tsx index 1348a975ea..efd1125295 100644 --- a/src/Navigation.tsx +++ b/src/Navigation.tsx @@ -82,6 +82,7 @@ import {MessagesScreen} from '#/screens/Messages/ChatList' import {MessagesConversationScreen} from '#/screens/Messages/Conversation' import {MessagesConversationSettingsScreen} from '#/screens/Messages/ConversationSettings' import {MessagesInboxScreen} from '#/screens/Messages/Inbox' +import {MessagesJoinRequestsScreen} from '#/screens/Messages/JoinRequests' import {MessagesSettingsScreen} from '#/screens/Messages/Settings' import {ModerationScreen} from '#/screens/Moderation' import {Screen as ModerationVerificationSettings} from '#/screens/Moderation/VerificationSettings' @@ -488,6 +489,11 @@ function commonScreens(Stack: typeof Flat, unreadCountLabel?: string) { getComponent={() => MessagesConversationSettingsScreen} options={{title: title(msg`Group chat settings`), requireAuth: true}} /> + MessagesJoinRequestsScreen} + options={{title: title(msg`Requests to join`), requireAuth: true}} + /> MessagesSettingsScreen} diff --git a/src/lib/routes/types.ts b/src/lib/routes/types.ts index 3c30b740da..22bb50572a 100644 --- a/src/lib/routes/types.ts +++ b/src/lib/routes/types.ts @@ -64,6 +64,7 @@ export type CommonNavigatorParams = { Topic: {topic: string} MessagesConversation: {conversation: string; embed?: string; accept?: true} MessagesConversationSettings: {conversation: string} + MessagesJoinRequests: {conversation: string} MessagesSettings: undefined MessagesInbox: undefined NotificationsActivityList: {posts: string} diff --git a/src/routes.ts b/src/routes.ts index 7ae73dd6e1..f7e73ff2c2 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -74,6 +74,7 @@ export const router = new Router({ MessagesInbox: '/messages/inbox', MessagesConversation: '/messages/:conversation', MessagesConversationSettings: '/messages/:conversation/settings', + MessagesJoinRequests: '/messages/:conversation/requests', // starter packs Start: '/start/:name/:rkey', StarterPackEdit: '/starter-pack/edit/:rkey', diff --git a/src/screens/Messages/ConversationSettings/MembersAndRequests.tsx b/src/screens/Messages/ConversationSettings/MembersAndRequests.tsx index b9d9ecc2b2..bb3ebafb1c 100644 --- a/src/screens/Messages/ConversationSettings/MembersAndRequests.tsx +++ b/src/screens/Messages/ConversationSettings/MembersAndRequests.tsx @@ -1,26 +1,31 @@ import {View} from 'react-native' import {plural} from '@lingui/core/macro' import {Trans, useLingui} from '@lingui/react/macro' +import {useNavigation} from '@react-navigation/native' +import {type NavigationProp} from '#/lib/routes/types' import {atoms as a, useTheme} from '#/alf' -import {InlineLinkText} from '#/components/Link' +import {type ConvoWithDetails} from '#/components/dms/util' +import {createStaticClick, InlineLinkText} from '#/components/Link' import {Text} from '#/components/Typography' export function MembersAndRequests({ - memberCount, - memberLimit, + convo, requestCount, hasMoreRequests, isOwner, }: { - memberCount: number - memberLimit: number + convo: Extract requestCount: number hasMoreRequests: boolean isOwner: boolean }) { const t = useTheme() const {t: l} = useLingui() + const navigation = useNavigation() + + const memberCount = convo.details.memberCount + const memberLimit = convo.details.memberLimit return ( @@ -42,8 +47,11 @@ export function MembersAndRequests({ + {...createStaticClick(() => { + navigation.navigate('MessagesJoinRequests', { + conversation: convo.view.id, + }) + })}> {hasMoreRequests ? l({ message: `${requestCount}+ requests`, diff --git a/src/screens/Messages/ConversationSettings/index.tsx b/src/screens/Messages/ConversationSettings/index.tsx index 056afa8b5c..5e4ad91424 100644 --- a/src/screens/Messages/ConversationSettings/index.tsx +++ b/src/screens/Messages/ConversationSettings/index.tsx @@ -247,8 +247,7 @@ function GroupSettings({ case 'MEMBERS_AND_REQUESTS': return ( + +export function MessagesJoinRequestsScreen(props: Props) { + const {t: l} = useLingui() + const aaCopy = useAgeAssuranceCopy() + return ( + + + + ) +} + +function MessagesJoinRequestsScreenInner({route}: Props) { + const convoId = route.params.conversation + + return ( + + + + + + ) +} + +function JoinRequestsInner() { + const {t: l} = useLingui() + const convoState = useConvo() + const navigation = useNavigation() + + if (convoState.status === ConvoStatus.Error) { + return ( + <> +

+ convoState.error.retry()} + sideBorders={false} + /> + + ) + } + + if (!convoState.convo) { + return ( + <> +
+ + + + + ) + } + + if (convoState.convo.kind !== 'group') { + return ( + { + if (navigation.canGoBack()) { + navigation.goBack() + } else { + navigation.replace('Messages', {animation: 'pop'}) + } + }} + /> + ) + } + + return +} + +function JoinRequestsList({ + convo, +}: { + convo: Extract +}) { + const t = useTheme() + const {t: l} = useLingui() + const moderationOpts = useModerationOpts() + const bottomBarOffset = useBottomBarOffset() + const {currentAccount} = useSession() + const navigation = useNavigation() + const queryClient = useQueryClient() + const inviteLinkControl = Dialog.useDialogControl() + + const getRemainingRequestCount = () => { + const data = queryClient.getQueryData< + InfiniteData + >(createListJoinRequestsQueryKey({convoId: convo.view.id})) + return data?.pages.reduce((sum, page) => sum + page.requests.length, 0) ?? 0 + } + + const [isPTRing, setIsPTRing] = useState(false) + const [footerHeight, setFooterHeight] = useState(0) + + const owner = convo.primaryMember + const isOwner = !!owner && owner.did === currentAccount?.did + + const { + data: joinRequestsData, + isPending, + isError, + hasNextPage, + fetchNextPage, + isFetchingNextPage, + refetch, + } = useListJoinRequestsQuery({ + convoId: convo.view.id, + }) + + const items = + joinRequestsData?.pages.flatMap(page => + page.requests.map(request => request.requestedBy), + ) ?? [] + const requestCount = + joinRequestsData?.pages.reduce( + (sum, page) => sum + page.requests.length, + 0, + ) ?? 0 + + const {mutate: approveJoinRequest, isPending: isApprovePending} = + useJoinRequestMutation('approve', convo.view.id, { + onSuccess: () => { + Toast.show(l`Request approved.`) + if (getRemainingRequestCount() < 1) { + navigation.replace('MessagesConversationSettings', { + conversation: convo.view.id, + }) + } + }, + onError: error => { + let errorMessage = l`Failed to accept join request` + if (isNetworkError(error)) { + errorMessage = l`A network error occurred. Please check your internet connection.` + } else if ( + error instanceof ChatBskyGroupApproveJoinRequest.InvalidConvoError + ) { + errorMessage = l`Conversation not found.` + } else if ( + error instanceof ChatBskyGroupApproveJoinRequest.InsufficientRoleError + ) { + errorMessage = l`Only admins can accept join requests.` + } else if ( + error instanceof + ChatBskyGroupApproveJoinRequest.MemberLimitReachedError + ) { + errorMessage = l`The member limit has been reached.` + } + Toast.show(errorMessage, {type: 'error'}) + }, + }) + + const {mutate: rejectJoinRequest, isPending: isRejectPending} = + useJoinRequestMutation('reject', convo.view.id, { + onSuccess: () => { + Toast.show(l`Request ignored.`) + if (getRemainingRequestCount() < 1) { + navigation.replace('MessagesConversationSettings', { + conversation: convo.view.id, + }) + } + }, + onError: error => { + let errorMessage = l`Failed to ignore join request` + if (isNetworkError(error)) { + errorMessage = l`A network error occurred. Please check your internet connection.` + } else if ( + error instanceof ChatBskyGroupRejectJoinRequest.InvalidConvoError + ) { + errorMessage = l`Conversation not found.` + } else if ( + error instanceof ChatBskyGroupRejectJoinRequest.InsufficientRoleError + ) { + errorMessage = l`Only admins can ignore join requests.` + } + Toast.show(errorMessage, {type: 'error'}) + }, + }) + + const isMutating = isApprovePending || isRejectPending + + const renderItem = ({item}: {item: bsky.profile.AnyProfileView}) => { + if (!moderationOpts) return null + return ( + + + + + + + + + + + + + approveJoinRequest({member: item.did})} + /> + rejectJoinRequest({member: item.did})} + /> + + + + + ) + } + + const footer = ( + setFooterHeight(evt.nativeEvent.layout.height)} + style={[ + a.absolute, + a.left_0, + a.right_0, + {bottom: 0}, + a.px_xl, + a.border_t, + t.atoms.bg, + t.atoms.border_contrast_low, + { + paddingTop: a.py_lg.paddingTop, + paddingBottom: a.py_lg.paddingBottom + bottomBarOffset, + }, + ]}> + + + ) + + const onEndReached = async () => { + if (isFetchingNextPage || !hasNextPage || isError) return + try { + await fetchNextPage() + } catch (err) { + logger.error('Failed to load more join requests', {message: err}) + } + } + + const onRefresh = async () => { + setIsPTRing(true) + try { + await refetch() + } catch (err) { + logger.error('Failed to refresh group chat requests', {message: err}) + } + setIsPTRing(false) + } + + if (isError) { + return ( + <> +
+ + + + Unable to fetch join requests. + + + + + ) + } + + const showFooter = isOwner + + return ( + <> +
+ item.did} + renderItem={renderItem} + ListEmptyComponent={ + isPending ? ( + + + + ) : null + } + contentContainerStyle={ + showFooter ? {paddingBottom: footerHeight} : undefined + } + scrollIndicatorInsets={showFooter ? {bottom: footerHeight} : undefined} + refreshing={isPTRing} + onEndReached={() => void onEndReached()} + onRefresh={() => void onRefresh()} + keyboardDismissMode="on-drag" + sideBorders={false} + desktopFixedHeight + /> + {showFooter ? footer : null} + {owner && moderationOpts && ( + + )} + + ) +} + +function Header({ + count, + hasMoreRequests, +}: { + count?: number + hasMoreRequests?: boolean +}) { + const {t: l} = useLingui() + return ( + + + + + {count === undefined ? ( + Requests to join + ) : hasMoreRequests ? ( + l({ + message: `${count}+ requests to join`, + comment: + 'Displayed when there are more requests to join a group chat than have been loaded', + }) + ) : ( + + )} + + + + + ) +} + +function AcceptButton({ + disabled, + onPress, +}: { + disabled?: boolean + onPress: () => void +}) { + const {t: l} = useLingui() + + return ( + + ) +} + +function RejectButton({ + disabled, + onPress, +}: { + disabled?: boolean + onPress: () => void +}) { + const {t: l} = useLingui() + + return ( + + ) +} diff --git a/src/state/queries/messages/join-requests.ts b/src/state/queries/messages/join-requests.ts new file mode 100644 index 0000000000..a3eda671e8 --- /dev/null +++ b/src/state/queries/messages/join-requests.ts @@ -0,0 +1,129 @@ +import { + type ChatBskyActorDefs, + type ChatBskyGroupApproveJoinRequest, + type ChatBskyGroupListJoinRequests, + type ChatBskyGroupRejectJoinRequest, +} from '@atproto/api' +import { + type InfiniteData, + useMutation, + useQueryClient, +} from '@tanstack/react-query' + +import {DM_SERVICE_HEADERS} from '#/lib/constants' +import {logger} from '#/logger' +import {useAgent} from '#/state/session' +import {listConvoMembersQueryKey} from './list-convo-members' +import {createListJoinRequestsQueryKey} from './list-join-requests' + +type JoinRequestAction = 'approve' | 'reject' + +type JoinRequestOutput = A extends 'approve' + ? ChatBskyGroupApproveJoinRequest.OutputSchema + : ChatBskyGroupRejectJoinRequest.OutputSchema + +export function useJoinRequestMutation( + action: A, + convoId: string | undefined, + { + onSuccess, + onError, + }: { + onSuccess?: (data: JoinRequestOutput) => void + onError?: (error: Error) => void + }, +) { + const queryClient = useQueryClient() + const agent = useAgent() + + return useMutation({ + mutationFn: async ({member}: {member: string}) => { + if (!convoId) throw new Error('No convoId provided') + const endpoint = + action === 'approve' + ? agent.chat.bsky.group.approveJoinRequest + : agent.chat.bsky.group.rejectJoinRequest + const {data} = await endpoint( + {convoId, member}, + {headers: DM_SERVICE_HEADERS, encoding: 'application/json'}, + ) + return data as JoinRequestOutput + }, + onMutate: ({member}) => { + if (!convoId) return + + const requestsKey = createListJoinRequestsQueryKey({convoId}) + const prevRequests = + queryClient.getQueryData< + InfiniteData + >(requestsKey) + + const requestedByProfile = prevRequests?.pages + .flatMap(page => page.requests) + .find(request => request.requestedBy.did === member)?.requestedBy + + queryClient.setQueryData< + InfiniteData + >(requestsKey, prev => { + if (!prev?.pages) return prev + return { + ...prev, + pages: prev.pages.map(page => ({ + ...page, + requests: page.requests.filter( + request => request.requestedBy.did !== member, + ), + })), + } + }) + + let prevMembers: ChatBskyActorDefs.ProfileViewBasic[] | undefined + if (action === 'approve' && requestedByProfile) { + const membersKey = listConvoMembersQueryKey(convoId) + prevMembers = + queryClient.getQueryData( + membersKey, + ) + queryClient.setQueryData( + membersKey, + prev => { + if (!prev) return prev + if (prev.some(m => m.did === member)) return prev + return [...prev, requestedByProfile] + }, + ) + } + + return {prevRequests, prevMembers} + }, + onSuccess: data => { + if (convoId) { + void queryClient.invalidateQueries({ + queryKey: createListJoinRequestsQueryKey({convoId}), + }) + if (action === 'approve') { + void queryClient.invalidateQueries({ + queryKey: listConvoMembersQueryKey(convoId), + }) + } + } + onSuccess?.(data) + }, + onError: (error, _variables, context) => { + logger.error(error) + if (convoId && context?.prevRequests) { + queryClient.setQueryData( + createListJoinRequestsQueryKey({convoId}), + context.prevRequests, + ) + } + if (convoId && action === 'approve' && context?.prevMembers) { + queryClient.setQueryData( + listConvoMembersQueryKey(convoId), + context.prevMembers, + ) + } + onError?.(error) + }, + }) +} From 0a7c08707895f557e4b339f63125b2bb76f7e99b Mon Sep 17 00:00:00 2001 From: Spence Pope Date: Tue, 2 Jun 2026 17:01:16 -0400 Subject: [PATCH 031/149] fix blur on image alt text background (#10658) --- .claude/.pre-pr-sweep-state | 1 + src/components/Lightbox/Lightbox.web.tsx | 6 +- src/components/Lightbox/chrome/Footer.tsx | 78 +++++++++++++---------- 3 files changed, 52 insertions(+), 33 deletions(-) create mode 100644 .claude/.pre-pr-sweep-state diff --git a/.claude/.pre-pr-sweep-state b/.claude/.pre-pr-sweep-state new file mode 100644 index 0000000000..f6f2d8d645 --- /dev/null +++ b/.claude/.pre-pr-sweep-state @@ -0,0 +1 @@ +alt-blur@3076a2b5a593b0d7b37198b5aebfe3a222afd52d diff --git a/src/components/Lightbox/Lightbox.web.tsx b/src/components/Lightbox/Lightbox.web.tsx index 641b2c3402..8883bfb5e5 100644 --- a/src/components/Lightbox/Lightbox.web.tsx +++ b/src/components/Lightbox/Lightbox.web.tsx @@ -230,7 +230,11 @@ function LightboxGallery({ style={[ a.px_4xl, a.py_2xl, - {backgroundColor: 'rgba(0, 0, 0, 0.45)'}, + { + backgroundColor: 'rgba(0, 0, 0, 0.5)', + // @ts-expect-error web only + backdropFilter: 'blur(16px)', + }, delayedFadeInAnim, ]}> - { - isMomentumScrolling.current = true - }} - onMomentumScrollEnd={() => { - isMomentumScrolling.current = false - }} - contentContainerStyle={[a.px_md, a.py_sm]}> - { - if (isMomentumScrolling.current) return - LayoutAnimation.configureNext({ - duration: 450, - update: {type: 'spring', springDamping: 1}, - }) - onToggleAltExpanded() - }}> - - {altText} - - - + + { + isMomentumScrolling.current = true + }} + onMomentumScrollEnd={() => { + isMomentumScrolling.current = false + }} + contentContainerStyle={[a.px_md, a.py_sm]}> + { + if (isMomentumScrolling.current) return + LayoutAnimation.configureNext({ + duration: 450, + update: {type: 'spring', springDamping: 1}, + }) + onToggleAltExpanded() + }}> + + {altText} + + + + ) @@ -74,7 +89,6 @@ export function Footer({altText, isAltExpanded, onToggleAltExpanded}: Props) { const styles = StyleSheet.create({ altWrap: { - backgroundColor: 'rgba(0, 0, 0, 0.45)', borderRadius: 12, overflow: 'hidden', }, From c88218ab870e74e417f7d708191be78f31fd5414 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Tue, 2 Jun 2026 16:28:48 -0500 Subject: [PATCH 032/149] Revert "[ALG-96] Don't fall back to search for onboarding user suggestions (#10680)" (#10699) --- .../StepSuggestedAccounts/index.tsx | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/screens/Onboarding/StepSuggestedAccounts/index.tsx b/src/screens/Onboarding/StepSuggestedAccounts/index.tsx index a9cc64396a..eaa68d9254 100644 --- a/src/screens/Onboarding/StepSuggestedAccounts/index.tsx +++ b/src/screens/Onboarding/StepSuggestedAccounts/index.tsx @@ -1,16 +1,18 @@ -import {useCallback, useEffect, useRef, useState} from 'react' +import {useCallback, useEffect, useMemo, useRef, useState} from 'react' import {View} from 'react-native' import {type ModerationOpts} from '@atproto/api' import {msg} from '@lingui/core/macro' import {useLingui} from '@lingui/react' import {Trans} from '@lingui/react/macro' import {useMutation, useQueryClient} from '@tanstack/react-query' +import * as bcp47Match from 'bcp-47-match' import {wait} from '#/lib/async/wait' import {popularInterests, useInterestsDisplayNames} from '#/lib/interests' import {isBlockedOrBlocking, isMuted} from '#/lib/moderation/blocked-and-muted' import {logger} from '#/logger' import {updateProfileShadow} from '#/state/cache/profile-shadow' +import {useLanguagePrefs} from '#/state/preferences' import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useAgent, useSession} from '#/state/session' import { @@ -51,6 +53,19 @@ export function StepSuggestedAccounts() { // so we can enable/disable the button without having to dig through the shadow cache const [followedUsers, setFollowedUsers] = useState([]) + /* + * Special language handling copied wholesale from the Explore screen + */ + const {contentLanguages} = useLanguagePrefs() + const useFullExperience = useMemo(() => { + if (contentLanguages.length === 0) return true + return bcp47Match.basicFilter('en', contentLanguages).length > 0 + }, [contentLanguages]) + const interestsDisplayNames = useInterestsDisplayNames() + const interests = Object.keys(interestsDisplayNames) + .sort(boostInterests(popularInterests)) + .sort(boostInterests(state.interestsStepResults.selectedInterests)) + const { data: suggestedUsers, isLoading, @@ -58,8 +73,8 @@ export function StepSuggestedAccounts() { isRefetching, refetch, } = useSuggestedOnboardingUsers({ - category: selectedInterest, - search: false, + category: selectedInterest || (useFullExperience ? null : interests[0]), + search: !useFullExperience, overrideInterests: state.interestsStepResults.selectedInterests, }) @@ -90,6 +105,7 @@ export function StepSuggestedAccounts() { ax.metric('suggestedUser:follow', { logContext: 'Onboarding', location: 'FollowAll', + recSource: !useFullExperience ? 'Search' : undefined, recId: suggestedUsers?.recId, position: i, suggestedDid: did, @@ -140,6 +156,7 @@ export function StepSuggestedAccounts() { seenProfilesRef.current.add(did) ax.metric('suggestedUser:seen', { logContext: 'Onboarding', + recSource: !useFullExperience ? 'Search' : undefined, recId: suggestedUsers?.recId, position, suggestedDid: did, @@ -147,7 +164,7 @@ export function StepSuggestedAccounts() { }) } }, - [ax, selectedInterest, suggestedUsers?.recId], + [ax, selectedInterest, suggestedUsers?.recId, useFullExperience], ) useEffect(() => { @@ -233,6 +250,7 @@ export function StepSuggestedAccounts() { position={index} category={selectedInterest} onSeen={onProfileSeen} + recSource={!useFullExperience ? 'Search' : undefined} recId={suggestedUsers.recId} /> ))} From 711334b34e6a41d7e38d41f7067986cb3c4c8883 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Wed, 3 Jun 2026 05:03:55 +0300 Subject: [PATCH 033/149] Add iOS peek long-press context menu for image embeds (#10300) Co-authored-by: Claude --- eslint-suppressions.json | 4 +- .../modules/bottomsheet/BottomSheetView.kt | 33 ++- package.json | 1 + pnpm-lock.yaml | 16 ++ src/components/MediaPreview.tsx | 70 ++++- src/components/PeekMenu.tsx | 1 + .../Post/Embed/ImageContextMenu.tsx | 79 +++++ src/components/Post/Embed/ImageEmbed.tsx | 64 +++-- src/components/icons/TEMPLATE.tsx | 30 +- src/components/images/AutoSizedImage.tsx | 17 +- src/components/images/Gallery/index.tsx | 272 +++++++++--------- src/components/images/ImageLayoutGridItem.tsx | 94 +++--- .../notifications/NotificationFeedItem.tsx | 1 + 13 files changed, 464 insertions(+), 218 deletions(-) create mode 100644 src/components/PeekMenu.tsx create mode 100644 src/components/Post/Embed/ImageContextMenu.tsx diff --git a/eslint-suppressions.json b/eslint-suppressions.json index 40b918e771..5b7eef4c94 100644 --- a/eslint-suppressions.json +++ b/eslint-suppressions.json @@ -76,7 +76,7 @@ }, "src/components/Post/Embed/ImageEmbed.tsx": { "@typescript-eslint/no-explicit-any": { - "count": 1 + "count": 2 } }, "src/components/Post/Embed/VideoEmbed/VideoEmbedInner/web-controls/utils.tsx": { @@ -169,7 +169,7 @@ }, "src/components/images/AutoSizedImage.tsx": { "@typescript-eslint/no-explicit-any": { - "count": 1 + "count": 2 } }, "src/components/images/Gallery/index.tsx": { diff --git a/modules/bottom-sheet/android/src/main/java/expo/modules/bottomsheet/BottomSheetView.kt b/modules/bottom-sheet/android/src/main/java/expo/modules/bottomsheet/BottomSheetView.kt index b7e81a61f6..1b9224c6e7 100644 --- a/modules/bottom-sheet/android/src/main/java/expo/modules/bottomsheet/BottomSheetView.kt +++ b/modules/bottom-sheet/android/src/main/java/expo/modules/bottomsheet/BottomSheetView.kt @@ -41,11 +41,14 @@ class BottomSheetView( private val screenHeight: Float = if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.VANILLA_ICE_CREAM) { // API 35+: edge-to-edge is mandatory, heightPixels is the full display - context.resources.displayMetrics.heightPixels.toFloat() + context.resources.displayMetrics.heightPixels + .toFloat() } else if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R) { // API 30-34: heightPixels may exclude nav bar, use currentWindowMetrics val wm = context.getSystemService(Context.WINDOW_SERVICE) as android.view.WindowManager - wm.currentWindowMetrics.bounds.height().toFloat() + wm.currentWindowMetrics.bounds + .height() + .toFloat() } else { // API < 30: currentWindowMetrics not available, use getRealSize // which includes system bars (heightPixels may exclude them) @@ -166,6 +169,7 @@ class BottomSheetView( when { // Full height sheets contentHeight >= screenHeight -> 0.99f + else -> this.clampRatio(this.getTargetHeight() / screenHeight) } @@ -271,8 +275,9 @@ class BottomSheetView( } // Apply deferred layout update after gesture completes if (newState != BottomSheetBehavior.STATE_DRAGGING && - newState != BottomSheetBehavior.STATE_SETTLING && - pendingLayoutUpdate) { + newState != BottomSheetBehavior.STATE_SETTLING && + pendingLayoutUpdate + ) { pendingLayoutUpdate = false updateLayout() } @@ -292,7 +297,6 @@ class BottomSheetView( if (!fullHeight) { this.startObservingContentHeight() } - } fun updateLayout() { @@ -365,17 +369,18 @@ class BottomSheetView( val innerViewGroup = this.innerView as? ViewGroup ?: return - val listener = OnLayoutChangeListener { _, _, top, _, bottom, _, _, oldTop, oldBottom -> - val newHeight = bottom - top - val oldHeight = oldBottom - oldTop - if (newHeight != oldHeight) { - val contentHeight = getContentHeight() - if (contentHeight != lastObservedContentHeight && contentHeight > 0 && (isOpen || isOpening) && !isClosing) { - lastObservedContentHeight = contentHeight - updateLayout() + val listener = + OnLayoutChangeListener { _, _, top, _, bottom, _, _, oldTop, oldBottom -> + val newHeight = bottom - top + val oldHeight = oldBottom - oldTop + if (newHeight != oldHeight) { + val contentHeight = getContentHeight() + if (contentHeight != lastObservedContentHeight && contentHeight > 0 && (isOpen || isOpening) && !isClosing) { + lastObservedContentHeight = contentHeight + updateLayout() + } } } - } val children = mutableListOf() for (i in 0 until innerViewGroup.childCount) { diff --git a/package.json b/package.json index 0716bd085b..b8bd26e241 100644 --- a/package.json +++ b/package.json @@ -102,6 +102,7 @@ "@bsky.app/expo-image-crop-tool": "^0.5.1", "@bsky.app/expo-scroll-edge-effect": "^0.1.4", "@bsky.app/expo-translate-text": "^0.2.9", + "@bsky.app/peek-menu": "^0.2.4", "@bsky.app/react-native-mmkv": "2.12.5", "@bsky.app/sift": "^0.3.8", "@bsky.app/tapper": "^0.5.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6d9210cc2d..b3d0003107 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -268,6 +268,9 @@ importers: '@bsky.app/expo-translate-text': specifier: ^0.2.9 version: 0.2.9(expo@54.0.34(@babel/core@7.29.0)(react-native-webview@13.15.0(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + '@bsky.app/peek-menu': + specifier: ^0.2.4 + version: 0.2.4(expo@54.0.34(@babel/core@7.29.0)(react-native-webview@13.15.0(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) '@bsky.app/react-native-mmkv': specifier: 2.12.5 version: 2.12.5(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) @@ -1649,6 +1652,13 @@ packages: react: '*' react-native: '*' + '@bsky.app/peek-menu@0.2.4': + resolution: {integrity: sha512-3E5FwgCXMU6baye3NWoBKih3SCh6s8AgAtxN523YBHZGC5TxpjGaBsjFi765y31nKmTll3QH7x4wtDgYqVvCQg==} + peerDependencies: + expo: '*' + react: '*' + react-native: '*' + '@bsky.app/react-native-mmkv@2.12.5': resolution: {integrity: sha512-3vUz1nQY1DiKIPAWRkpp5ZGxH5f2G6Ui0UuQuEYjYv81xx1qFcSzS9KQ2sHcOKYdkOM9amWV2Q8TQCxt1lrAHg==} peerDependencies: @@ -10461,6 +10471,12 @@ snapshots: react: 19.1.0 react-native: 0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) + '@bsky.app/peek-menu@0.2.4(expo@54.0.34(@babel/core@7.29.0)(react-native-webview@13.15.0(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': + dependencies: + expo: 54.0.34(@babel/core@7.29.0)(react-native-webview@13.15.0(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0))(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-native: 0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) + '@bsky.app/react-native-mmkv@2.12.5(react-native@0.81.5(patch_hash=2656ac6deb71b92a4df4af4593d13ace6a5740936432e5e7e8ef32bc3cd05194)(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0))(react@19.1.0)': dependencies: react: 19.1.0 diff --git a/src/components/MediaPreview.tsx b/src/components/MediaPreview.tsx index 530c85ae66..9aad6da864 100644 --- a/src/components/MediaPreview.tsx +++ b/src/components/MediaPreview.tsx @@ -1,11 +1,16 @@ import {type StyleProp, StyleSheet, View, type ViewStyle} from 'react-native' import {Image} from 'expo-image' -import {type AppBskyFeedDefs} from '@atproto/api' -import {Trans} from '@lingui/react/macro' +import {type AppBskyEmbedImages, type AppBskyFeedDefs} from '@atproto/api' +import {Trans, useLingui} from '@lingui/react/macro' +import {shareImageModal} from '#/lib/media/manip' +import {useSaveImageToMediaLibrary} from '#/lib/media/save-image' import {isGifEmbed} from '#/lib/strings/embed-player' -import {atoms as a, useTheme} from '#/alf' +import {atoms as a, tokens, useTheme} from '#/alf' +import {ArrowShareRight_Stroke2_Corner2_Rounded as ShareIcon} from '#/components/icons/ArrowShareRight' +import {Download_Stroke2_Corner0_Rounded as DownloadIcon} from '#/components/icons/Download' import {MediaInsetBorder} from '#/components/MediaInsetBorder' +import * as PeekMenu from '#/components/PeekMenu' import {Text} from '#/components/Typography' import {PlayButtonIcon} from '#/components/video/PlayButtonIcon' import * as bsky from '#/types/bsky' @@ -16,9 +21,11 @@ import * as bsky from '#/types/bsky' export function Embed({ embed, style, + peekable = false, }: { embed: AppBskyFeedDefs.PostView['embed'] style?: StyleProp + peekable?: boolean }) { const e = bsky.post.parseEmbed(embed) @@ -27,13 +34,17 @@ export function Embed({ if (e.type === 'images') { return ( - {e.view.images.map(image => ( - - ))} + {e.view.images.map(image => + peekable ? ( + + ) : ( + + ), + )} ) } else if (e.type === 'link') { @@ -156,6 +167,45 @@ export function VideoItem({ ) } +function PeekableImageItem({image}: {image: AppBskyEmbedImages.ViewImage}) { + const {t: l} = useLingui() + const saveImage = useSaveImageToMediaLibrary() + + const aspect = + image.aspectRatio && image.aspectRatio.height > 0 + ? image.aspectRatio.width / image.aspectRatio.height + : undefined + + return ( + + 0 ? aspect : 1, + }} + borderRadius={tokens.borderRadius.xs}> + + + + void saveImage(image.fullsize)}> + + {l`Save image`} + + void shareImageModal({uri: image.fullsize})}> + + {l`Share`} + + + + ) +} + const styles = StyleSheet.create({ altContainer: { backgroundColor: 'rgba(0, 0, 0, 0.75)', diff --git a/src/components/PeekMenu.tsx b/src/components/PeekMenu.tsx new file mode 100644 index 0000000000..53732ec3e8 --- /dev/null +++ b/src/components/PeekMenu.tsx @@ -0,0 +1 @@ +export * from '@bsky.app/peek-menu' diff --git a/src/components/Post/Embed/ImageContextMenu.tsx b/src/components/Post/Embed/ImageContextMenu.tsx new file mode 100644 index 0000000000..3aadb56901 --- /dev/null +++ b/src/components/Post/Embed/ImageContextMenu.tsx @@ -0,0 +1,79 @@ +import {type ReactNode} from 'react' +import {type StyleProp, type ViewStyle} from 'react-native' +import {useLingui} from '@lingui/react/macro' + +import {shareImageModal} from '#/lib/media/manip' +import {useSaveImageToMediaLibrary} from '#/lib/media/save-image' +import {ArrowShareRight_Stroke2_Corner2_Rounded as ShareIcon} from '#/components/icons/ArrowShareRight' +import {Download_Stroke2_Corner0_Rounded as DownloadIcon} from '#/components/icons/Download' +import * as PeekMenu from '#/components/PeekMenu' +import {IS_IOS} from '#/env' + +/** + * Wraps an image embed with the iOS peek-and-menu interaction. On non-iOS + * platforms this renders children unchanged. + * + * The aspect ratio is consumed by the native side to size the preview + * viewController correctly — which is what makes the lift animation clean + * for portrait/panorama images. + */ +export function ImageContextMenu({ + fullsizeUri, + thumbUri, + aspectRatio, + borderRadius, + onPreviewPress, + style, + children, +}: { + fullsizeUri: string + /** Thumbnail URL. Used as an instant placeholder in the native preview + * while the fullsize loads, so there's no black flash on first peek. */ + thumbUri?: string + /** width / height; defaults to 1 if missing. */ + aspectRatio: number | undefined + borderRadius?: number + onPreviewPress?: () => void + style?: StyleProp + children: ReactNode +}) { + const {t: l} = useLingui() + const saveImage = useSaveImageToMediaLibrary() + + if (!IS_IOS) { + return children + } + + const handleSave = () => { + void saveImage(fullsizeUri) + } + const handleShare = () => { + void shareImageModal({uri: fullsizeUri}) + } + + return ( + + 0 ? aspectRatio : 1, + }} + borderRadius={borderRadius} + onPreviewPress={onPreviewPress}> + {children} + + + + + {l`Save image`} + + + + {l`Share`} + + + + ) +} diff --git a/src/components/Post/Embed/ImageEmbed.tsx b/src/components/Post/Embed/ImageEmbed.tsx index d779d04876..ccd1ceb270 100644 --- a/src/components/Post/Embed/ImageEmbed.tsx +++ b/src/components/Post/Embed/ImageEmbed.tsx @@ -1,3 +1,4 @@ +import {useRef} from 'react' import {InteractionManager, View} from 'react-native' import {type AnimatedRef} from 'react-native-reanimated' import {Image} from 'expo-image' @@ -8,6 +9,7 @@ import {Gallery} from '#/components/images/Gallery' import {ImageLayoutGrid} from '#/components/images/ImageLayoutGrid' import {useLightboxControls} from '#/components/Lightbox/state' import {type Dimensions} from '#/components/Lightbox/types' +import {ImageContextMenu} from '#/components/Post/Embed/ImageContextMenu' import {PostEmbedViewContext} from '#/components/Post/Embed/types' import {useAnalytics} from '#/analytics' import {type EmbedType} from '#/types/bsky/post' @@ -24,6 +26,11 @@ export function ImageEmbed({ const {images} = embed.view const galleryEnabled = ax.features.enabled(ax.features.PostGalleryEmbedEnable) + // Captured from AutoSizedImage so the peek-commit handler can reuse the same + // ref + dims that a tap would — keeps the lightbox's return animation intact. + const singleContainerRef = useRef | null>(null) + const singleDimsRef = useRef(null) + if (images.length > 0) { const items = images.map(img => ({ uri: img.fullsize, @@ -59,24 +66,49 @@ export function ImageEmbed({ if (images.length === 1) { const image = images[0] + const aspect = + image.aspectRatio && image.aspectRatio.height > 0 + ? image.aspectRatio.width / image.aspectRatio.height + : undefined + const openFromSingle = () => { + if (singleContainerRef.current) { + onPress(0, [singleContainerRef.current], [singleDimsRef.current]) + } + } return ( - onPress(0, [containerRef], [dims])} - onPressIn={() => onPressIn(0)} - hideBadge={ - rest.viewContext === PostEmbedViewContext.FeedEmbedRecordWithMedia - } - /> + + { + singleContainerRef.current = ref + }} + onDimsChange={dims => { + singleDimsRef.current = dims + }} + onPress={(containerRef, dims) => + onPress(0, [containerRef], [dims]) + } + onPressIn={() => onPressIn(0)} + hideBadge={ + rest.viewContext === + PostEmbedViewContext.FeedEmbedRecordWithMedia + } + /> + ) } diff --git a/src/components/icons/TEMPLATE.tsx b/src/components/icons/TEMPLATE.tsx index 4feaaef359..a7ef371cd1 100644 --- a/src/components/icons/TEMPLATE.tsx +++ b/src/components/icons/TEMPLATE.tsx @@ -1,8 +1,20 @@ -import {forwardRef} from 'react' +import { + forwardRef, + type ForwardRefExoticComponent, + type RefAttributes, +} from 'react' import Svg, {Path} from 'react-native-svg' import {type Props, useCommonSVGProps} from '#/components/icons/common' +export type IconWithSvgMeta = ForwardRefExoticComponent< + Props & RefAttributes +> & { + svgPaths: string[] + svgViewBox: string + svgStrokeWidth: number +} + export const IconTemplate_Stroke2_Corner0_Rounded = forwardRef( function LogoImpl(props: Props, ref) { const {fill, size, style, ...rest} = useCommonSVGProps(props) @@ -41,7 +53,7 @@ export function createSinglePathSVG({ strokeLinecap?: 'butt' | 'round' | 'square' strokeLinejoin?: 'miter' | 'round' | 'bevel' }) { - return forwardRef(function LogoImpl(props, ref) { + const Icon = forwardRef(function LogoImpl(props, ref) { const {fill, size, style, gradient, ...rest} = useCommonSVGProps(props) const hasStroke = strokeWidth > 0 @@ -68,7 +80,11 @@ export function createSinglePathSVG({ /> ) - }) + }) as IconWithSvgMeta + Icon.svgPaths = [path] + Icon.svgViewBox = viewBox || '0 0 24 24' + Icon.svgStrokeWidth = strokeWidth + return Icon } export function createMultiPathSVG({ @@ -78,7 +94,7 @@ export function createMultiPathSVG({ paths: string[] viewBox?: string }) { - return forwardRef(function LogoImpl(props, ref) { + const Icon = forwardRef(function LogoImpl(props, ref) { const {fill, size, style, gradient, ...rest} = useCommonSVGProps(props) return ( @@ -102,5 +118,9 @@ export function createMultiPathSVG({ ))} ) - }) + }) as IconWithSvgMeta + Icon.svgPaths = paths + Icon.svgViewBox = viewBox || '0 0 24 24' + Icon.svgStrokeWidth = 0 + return Icon } diff --git a/src/components/images/AutoSizedImage.tsx b/src/components/images/AutoSizedImage.tsx index 2df8d056d6..79b41311cb 100644 --- a/src/components/images/AutoSizedImage.tsx +++ b/src/components/images/AutoSizedImage.tsx @@ -1,4 +1,4 @@ -import {useMemo, useRef} from 'react' +import {useEffect, useMemo, useRef} from 'react' import {type DimensionValue, Pressable, View} from 'react-native' import Animated, { type AnimatedRef, @@ -69,6 +69,8 @@ export function AutoSizedImage({ onPress, onLongPress, onPressIn, + onContainerRef, + onDimsChange, }: { image: AppBskyEmbedImages.ViewImage crop?: 'none' | 'square' | 'constrained' @@ -79,6 +81,11 @@ export function AutoSizedImage({ ) => void onLongPress?: () => void onPressIn?: () => void + /** Fires once with the internal container ref so a parent can drive its + * own lightbox-return animation without waiting for an `onPress`. */ + onContainerRef?: (ref: AnimatedRef) => void + /** Fires when the underlying image reports its natural dimensions. */ + onDimsChange?: (dims: Dimensions) => void }) { const t = useTheme() const {_} = useLingui() @@ -86,6 +93,10 @@ export function AutoSizedImage({ const containerRef = useAnimatedRef() const fetchedDimsRef = useRef<{width: number; height: number} | null>(null) + useEffect(() => { + onContainerRef?.(containerRef) + }, [containerRef, onContainerRef]) + let aspectRatio: number | undefined const dims = image.aspectRatio if (dims) { @@ -122,10 +133,12 @@ export function AutoSizedImage({ accessibilityHint="" onLoad={e => { if (!isContain) { - fetchedDimsRef.current = { + const dims = { width: e.source.width, height: e.source.height, } + fetchedDimsRef.current = dims + onDimsChange?.(dims) } }} loading="lazy" diff --git a/src/components/images/Gallery/index.tsx b/src/components/images/Gallery/index.tsx index 1566f09736..f4ffcd7159 100644 --- a/src/components/images/Gallery/index.tsx +++ b/src/components/images/Gallery/index.tsx @@ -24,7 +24,7 @@ import {mergeRefs} from '#/lib/merge-refs' import {useA11y} from '#/state/a11y' import {useLargeAltBadgeEnabled} from '#/state/preferences/large-alt-badge' import {BlockDrawerGesture} from '#/view/shell/BlockDrawerGesture' -import {atoms as a, useBreakpoints, useTheme, web} from '#/alf' +import {atoms as a, tokens, useBreakpoints, useTheme, web} from '#/alf' import {ArrowsDiagonalOut_Stroke2_Corner0_Rounded as Fullscreen} from '#/components/icons/ArrowsDiagonal' import {AutoSizedImage} from '#/components/images/AutoSizedImage' import { @@ -36,6 +36,7 @@ import {useKeyboardHandlers} from '#/components/images/Gallery/useKeyboardHandle import {usePointerHandlers} from '#/components/images/Gallery/usePointerHandlers' import {getAspectRatio} from '#/components/images/Gallery/utils' import {MediaInsetBorder} from '#/components/MediaInsetBorder' +import {ImageContextMenu} from '#/components/Post/Embed/ImageContextMenu' import {PostEmbedViewContext} from '#/components/Post/Embed/types' import {Text} from '#/components/Typography' import {useAnalytics} from '#/analytics' @@ -264,6 +265,21 @@ export function Gallery({ data={images} keyExtractor={(item, index) => item.thumb + index} renderItem={({item, index}) => { + const openLightboxAtIndex = onPress + ? () => { + ax.metric('post:gallery:openLightbox', { + fromImage: index + 1, // convert to 1-based index for easier analysis + totalImages: images.length, + }) + const refs: AnimatedRef[] = [] + const dims: (Dimensions | null)[] = [] + for (let i = 0; i < images.length; i++) { + refs.push(containerRefsRef.current.get(i)!) + dims.push(thumbDimsRef.current.get(i) ?? null) + } + onPress(index, refs, dims) + } + : undefined return ( { thumbDimsRef.current.set(i, dims) }} - onPress={ - onPress - ? () => { - ax.metric('post:gallery:openLightbox', { - fromImage: index + 1, // convert to 1-based index for easier analysis - totalImages: images.length, - }) - const refs: AnimatedRef[] = [] - const dims: (Dimensions | null)[] = [] - for (let i = 0; i < images.length; i++) { - refs.push(containerRefsRef.current.get(i)!) - dims.push(thumbDimsRef.current.get(i) ?? null) - } - onPress(index, refs, dims) - } - : undefined - } + onPress={openLightboxAtIndex} onPressIn={onPressIn ? () => onPressIn(index) : undefined} + onPreviewPress={openLightboxAtIndex} /> ) }} @@ -378,6 +379,7 @@ function GalleryImage({ onThumbDims, onPress, onPressIn, + onPreviewPress, }: { contentHeight: number image: AppBskyEmbedImages.ViewImage @@ -391,6 +393,7 @@ function GalleryImage({ onThumbDims: (index: number, dims: Dimensions) => void onPress?: () => void onPressIn?: () => void + onPreviewPress?: () => void }) { const t = useTheme() const {t: l} = useLingui() @@ -416,124 +419,131 @@ function GalleryImage({ collapsable={false} aria-roledescription={l`slide`} aria-label={image.alt || l`Image ${index + 1} of ${imageCount}`}> - setFocused(true)} - onBlur={() => setFocused(false)} - accessibilityRole="button" - accessibilityLabel={image.alt || l`Image ${index + 1}`} - accessibilityHint={l`Opens full image`} - android_ripple={{ - color: utils.alpha(t.atoms.bg.backgroundColor, 0.2), - foreground: true, - }} - style={({pressed}) => [ - a.rounded_md, - a.overflow_hidden, - t.atoms.bg_contrast_25, - web([ - { - cursor: 'inherit', - outline: 0, - border: 0, - }, - a.transition_transform, - {transitionDuration: '200ms'}, - pressed && {transform: [{scale: 0.99}]}, - ]), - ]}> - { - const ar = getAspectRatio(e.source) - if (ar && ar !== aspectRatio) { - setAspectRatio(ar) - } - onThumbDims(index, { - width: e.source.width, - height: e.source.height, - }) + + setFocused(true)} + onBlur={() => setFocused(false)} + accessibilityRole="button" + accessibilityLabel={image.alt || l`Image ${index + 1}`} + accessibilityHint={l`Opens full image`} + android_ripple={{ + color: utils.alpha(t.atoms.bg.backgroundColor, 0.2), + foreground: true, }} - /> - - {(hasAlt || isCropped) && !hideBadges ? ( - [ + a.rounded_md, + a.overflow_hidden, + t.atoms.bg_contrast_25, + web([ { - bottom: a.p_xs.padding, - right: a.p_xs.padding, - gap: 3, + cursor: 'inherit', + outline: 0, + border: 0, }, - largeAltBadge && { - gap: 4, - }, - ]}> - {isCropped && ( - - - - )} - {hasAlt && ( - - - ALT - - - )} - - ) : null} + a.transition_transform, + {transitionDuration: '200ms'}, + pressed && {transform: [{scale: 0.99}]}, + ]), + ]}> + { + const ar = getAspectRatio(e.source) + if (ar && ar !== aspectRatio) { + setAspectRatio(ar) + } + onThumbDims(index, { + width: e.source.width, + height: e.source.height, + }) + }} + /> - + {isCropped && ( + + + + )} + {hasAlt && ( + + + ALT + + + )} + + ) : null} + + - + /> + + ) } diff --git a/src/components/images/ImageLayoutGridItem.tsx b/src/components/images/ImageLayoutGridItem.tsx index b809a783fa..0c349b6612 100644 --- a/src/components/images/ImageLayoutGridItem.tsx +++ b/src/components/images/ImageLayoutGridItem.tsx @@ -9,8 +9,9 @@ import {Trans} from '@lingui/react/macro' import {type Dimensions} from '#/lib/media/types' import {useLargeAltBadgeEnabled} from '#/state/preferences/large-alt-badge' -import {atoms as a, useTheme} from '#/alf' +import {atoms as a, tokens, useTheme} from '#/alf' import {MediaInsetBorder} from '#/components/MediaInsetBorder' +import {ImageContextMenu} from '#/components/Post/Embed/ImageContextMenu' import {PostEmbedViewContext} from '#/components/Post/Embed/types' import {Text} from '#/components/Typography' @@ -52,46 +53,63 @@ export function GalleryItem({ const hasAlt = !!image.alt const hideBadges = viewContext === PostEmbedViewContext.FeedEmbedRecordWithMedia + + const aspect = + image.aspectRatio && image.aspectRatio.height > 0 + ? image.aspectRatio.width / image.aspectRatio.height + : undefined + + // The tap handler and the peek-commit handler do the same thing: open the + // lightbox with this cell's ref + dims so the lightbox's return animation + // can target the original thumbnail. + const openLightboxAtIndex = onPress + ? () => onPress(index, containerRefs, thumbDimsRef.current.slice()) + : undefined + return ( - onPress(index, containerRefs, thumbDimsRef.current.slice()) - : undefined - } - onPressIn={onPressIn ? () => onPressIn(index) : undefined} - onLongPress={onLongPress ? () => onLongPress(index) : undefined} - android_ripple={{ - color: utils.alpha(t.atoms.bg.backgroundColor, 0.2), - foreground: true, - }} - style={[ - a.flex_1, - a.overflow_hidden, - t.atoms.bg_contrast_25, - imageStyle, - ]} - accessibilityRole="button" - accessibilityLabel={image.alt || _(msg`Image`)} - accessibilityHint=""> - { - thumbDimsRef.current[index] = { - width: e.source.width, - height: e.source.height, - } + + onPressIn(index) : undefined} + onLongPress={onLongPress ? () => onLongPress(index) : undefined} + android_ripple={{ + color: utils.alpha(t.atoms.bg.backgroundColor, 0.2), + foreground: true, }} - loading="lazy" - /> - - + style={[ + a.flex_1, + a.overflow_hidden, + t.atoms.bg_contrast_25, + imageStyle, + ]} + accessibilityRole="button" + accessibilityLabel={image.alt || _(msg`Image`)} + accessibilityHint=""> + { + thumbDimsRef.current[index] = { + width: e.source.width, + height: e.source.height, + } + }} + loading="lazy" + /> + + + {hasAlt && !hideBadges ? ( ) From 3c06ecfa1a18cd57b26960dbe36e5d7aacd89b82 Mon Sep 17 00:00:00 2001 From: DS Boyce <260543580+ds-boyce@users.noreply.github.com> Date: Tue, 2 Jun 2026 19:13:34 -0700 Subject: [PATCH 034/149] Transpile `@atproto/api` package for older browser support (#10700) --- webpack.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webpack.config.js b/webpack.config.js index 101a762ffb..bccf95adef 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -43,7 +43,7 @@ function patchSourceMapFilter(rules, pathPattern) { module.exports = async function (env, argv) { env.babel = { - dangerouslyAddModulePathsToTranspile: ['@bsky.app/expo'], + dangerouslyAddModulePathsToTranspile: ['@bsky.app/expo', '@atproto/api'], } let config = await createExpoWebpackConfigAsync(env, argv) config = withAlias(config, { From f4f66af31c3c313916ee1ec00e9cf08f3ca151be Mon Sep 17 00:00:00 2001 From: pfrazee <1270099+pfrazee@users.noreply.github.com> Date: Wed, 3 Jun 2026 03:21:33 +0000 Subject: [PATCH 035/149] Nightly source-language update --- src/locale/locales/en/messages.po | 865 +++++++++++++++++++----------- 1 file changed, 566 insertions(+), 299 deletions(-) diff --git a/src/locale/locales/en/messages.po b/src/locale/locales/en/messages.po index 4de882a998..b1fd0337d7 100644 --- a/src/locale/locales/en/messages.po +++ b/src/locale/locales/en/messages.po @@ -86,6 +86,11 @@ msgstr "" msgid "{0, plural, one {# new join request} other {# new join requests}}" msgstr "{0, plural, one {# new join request} other {# new join requests}}" +#. placeholder {0}: convo.details.memberLimit +#: src/screens/Messages/components/InviteLinkDialog.tsx:181 +msgid "{0, plural, one {# person} other {# people}}" +msgstr "{0, plural, one {# person} other {# people}}" + #. placeholder {0}: reactions.length #. placeholder {1}: groupedReactions.map(g => g.value).join(' ') #: src/components/dms/MessageItem.tsx:297 @@ -319,6 +324,20 @@ msgstr "" msgid "{0}’s avatar" msgstr "{0}’s avatar" +#. The number of active group chat members out of the total number allowed. +#. placeholder {0}: data.joinLinkPreviews[0].memberCount +#. placeholder {1}: data.joinLinkPreviews[0].memberLimit +#: src/screens/Messages/JoinRequest.tsx:130 +msgid "{0}/{1}" +msgstr "{0}/{1}" + +#. The number of active group chat members out of the total number allowed. +#. placeholder {0}: joinLinkPreview.memberCount +#. placeholder {1}: joinLinkPreview.memberLimit +#: src/components/intents/GroupChatJoinDialog.tsx:307 +msgid "{0}/{1} members" +msgstr "{0}/{1} members" + #. How many days have passed, displayed in a narrow form #. placeholder {0}: diff.value #: src/lib/hooks/useTimeAgo.ts:171 @@ -355,6 +374,10 @@ msgstr "{count, plural, one {# request} other {# requests}}" msgid "{count, plural, one {# unread item} other {# unread items}}" msgstr "" +#: src/screens/Messages/JoinRequests.tsx:429 +msgid "{count, plural, zero {No requests to join} one {# request to join} other {# requests to join}}" +msgstr "{count, plural, zero {No requests to join} one {# request to join} other {# requests to join}}" + #. Displayed when the number of requests is greater than 20 #: src/screens/Messages/components/InboxRequests.tsx:53 msgid "{count}+" @@ -365,6 +388,11 @@ msgstr "{count}+" msgid "{count}+ requests" msgstr "{count}+ requests" +#. Displayed when there are more requests to join a group chat than have been loaded +#: src/screens/Messages/JoinRequests.tsx:423 +msgid "{count}+ requests to join" +msgstr "{count}+ requests to join" + #: src/components/dms/DateDivider.tsx:60 msgid "{date} at {time}" msgstr "{date} at {time}" @@ -539,7 +567,7 @@ msgid "{following} following" msgstr "" #: src/components/dms/components/GroupChatProfileCard.tsx:56 -#: src/components/dms/InitiateChatFlow.tsx:888 +#: src/components/dms/InitiateChatFlow.tsx:889 msgid "{handle} can’t be added" msgstr "{handle} can’t be added" @@ -547,7 +575,7 @@ msgstr "{handle} can’t be added" msgid "{handle} can't be messaged" msgstr "" -#: src/components/dms/InitiateChatFlow.tsx:849 +#: src/components/dms/InitiateChatFlow.tsx:850 msgid "{handle} can’t be messaged" msgstr "{handle} can’t be messaged" @@ -581,7 +609,7 @@ msgid "{MAX_HIDDEN_REPLIES, plural, other {You can hide a maximum of # replies.} msgstr "" #. The number of group chat members out of the total number of permitted users. -#: src/screens/Messages/ConversationSettings/MembersAndRequests.tsx:34 +#: src/screens/Messages/ConversationSettings/MembersAndRequests.tsx:39 msgid "{memberCount}/{memberLimit}" msgstr "{memberCount}/{memberLimit}" @@ -629,12 +657,12 @@ msgid "{rank}." msgstr "" #. The number of requests to join a group chat. -#: src/screens/Messages/ConversationSettings/MembersAndRequests.tsx:53 +#: src/screens/Messages/ConversationSettings/MembersAndRequests.tsx:61 msgid "{requestCount, plural, one {# request} other {# requests}}" msgstr "{requestCount, plural, one {# request} other {# requests}}" #. Displayed when there are more than 20 requests to join a group chat -#: src/screens/Messages/ConversationSettings/MembersAndRequests.tsx:48 +#: src/screens/Messages/ConversationSettings/MembersAndRequests.tsx:56 msgid "{requestCount}+ requests" msgstr "{requestCount}+ requests" @@ -802,6 +830,8 @@ msgstr "" #: src/components/contacts/screens/VerifyNumber.tsx:155 #: src/components/dms/dialogs/NewChatDialog.tsx:52 #: src/components/dms/dialogs/NewChatDialog.tsx:90 +#: src/screens/Messages/JoinRequests.tsx:188 +#: src/screens/Messages/JoinRequests.tsx:220 msgid "A network error occurred. Please check your internet connection." msgstr "" @@ -836,7 +866,7 @@ msgstr "" msgid "A selected recipient is not followed by the sender." msgstr "A selected recipient is not followed by the sender." -#: src/Navigation.tsx:457 +#: src/Navigation.tsx:459 #: src/screens/Settings/AboutSettings.tsx:78 #: src/screens/Settings/Settings.tsx:255 #: src/screens/Settings/Settings.tsx:258 @@ -852,10 +882,20 @@ msgstr "" msgid "Accept" msgstr "" +#. Accept a request to join a chat +#: src/screens/Messages/JoinRequests.tsx:460 +msgctxt "button" +msgid "Accept" +msgstr "Accept" + #: src/screens/Messages/components/RequestButtons.tsx:280 msgid "Accept chat request" msgstr "" +#: src/screens/Messages/JoinRequests.tsx:454 +msgid "Accept join request" +msgstr "Accept join request" + #. Accept a chat request #: src/screens/Messages/components/RequestListItem.tsx:48 msgid "Accept Request" @@ -870,17 +910,21 @@ msgstr "" msgid "Accepted conversations" msgstr "Accepted conversations" +#: src/components/intents/GroupChatJoinDialog.tsx:93 +msgid "Access requested! The group owner will review your request." +msgstr "Access requested! The group owner will review your request." + #: src/screens/Settings/AccessibilitySettings.tsx:45 #: src/screens/Settings/Settings.tsx:233 #: src/screens/Settings/Settings.tsx:236 msgid "Accessibility" msgstr "" -#: src/Navigation.tsx:380 +#: src/Navigation.tsx:382 msgid "Accessibility Settings" msgstr "" -#: src/Navigation.tsx:396 +#: src/Navigation.tsx:398 #: src/screens/Login/LoginForm.tsx:192 #: src/screens/Settings/AccountSettings.tsx:56 #: src/screens/Settings/Settings.tsx:173 @@ -1023,11 +1067,11 @@ msgstr "" msgid "Add another account" msgstr "" -#: src/view/com/composer/Composer.tsx:1401 +#: src/view/com/composer/Composer.tsx:1383 msgid "Add another post" msgstr "" -#: src/view/com/composer/Composer.tsx:2067 +#: src/view/com/composer/Composer.tsx:2049 msgid "Add another post to thread" msgstr "" @@ -1058,7 +1102,7 @@ msgid "Add image" msgstr "" #. Accessibility label for button in composer to add images, a video, or a GIF to a post -#: src/view/com/composer/SelectMediaButton.tsx:499 +#: src/view/com/composer/SelectMediaButton.tsx:503 msgid "Add media to post" msgstr "" @@ -1086,8 +1130,8 @@ msgstr "" msgid "Add muted words and tags" msgstr "" -#: src/screens/Messages/components/MessagesListGroupInfoPanel.tsx:135 -#: src/screens/Messages/components/MessagesListGroupInfoPanel.tsx:174 +#: src/screens/Messages/components/MessagesListGroupInfoPanel.tsx:132 +#: src/screens/Messages/components/MessagesListGroupInfoPanel.tsx:171 #: src/screens/ProfileList/AboutSection.tsx:72 #: src/screens/ProfileList/AboutSection.tsx:90 msgid "Add people" @@ -1344,9 +1388,9 @@ msgstr "" msgid "Already signed in as @{0}" msgstr "" -#: src/components/images/AutoSizedImage.tsx:190 -#: src/components/images/Gallery/index.tsx:522 -#: src/components/images/ImageLayoutGridItem.tsx:120 +#: src/components/images/AutoSizedImage.tsx:203 +#: src/components/images/Gallery/index.tsx:531 +#: src/components/images/ImageLayoutGridItem.tsx:138 #: src/components/Post/Embed/VideoEmbed/GifPresentationControls.tsx:94 #: src/view/com/composer/GifAltText.tsx:100 #: src/view/com/composer/photos/Gallery.tsx:209 @@ -1393,7 +1437,7 @@ msgstr "" msgid "An error occurred" msgstr "" -#: src/view/com/composer/state/video.ts:411 +#: src/view/com/composer/state/video.ts:401 msgid "An error occurred while compressing the video." msgstr "" @@ -1438,11 +1482,11 @@ msgstr "" msgid "An error occurred while trying to follow all" msgstr "" -#: src/view/com/composer/state/video.ts:468 +#: src/view/com/composer/state/video.ts:453 msgid "An error occurred while uploading the video. {message}" msgstr "" -#: src/view/com/composer/state/video.ts:460 +#: src/view/com/composer/state/video.ts:445 msgid "An error occurred while uploading the video. Please check your internet connection and try again." msgstr "" @@ -1468,8 +1512,8 @@ msgid "An illustration showing that Bluesky selects trusted verifiers, and trust msgstr "" #: src/screens/Messages/components/InviteLinkDialog.tsx:172 -msgid "An invite link lets people join this group chat without being added directly. You control who can use the link and whether they need your approval. You can disable the link at any time." -msgstr "An invite link lets people join this group chat without being added directly. You control who can use the link and whether they need your approval. You can disable the link at any time." +msgid "An invite link lets people join this group chat without being added directly. You control who can join the chat. You can disable the link at any time." +msgstr "An invite link lets people join this group chat without being added directly. You control who can join the chat. You can disable the link at any time." #: src/components/moderation/ReportDialog/utils/useReportOptions.ts:239 msgid "An issue not included in these options" @@ -1545,6 +1589,10 @@ msgstr "" msgid "Anyone can interact" msgstr "" +#: src/components/intents/GroupChatJoinDialog.tsx:322 +msgid "Anyone can join" +msgstr "Anyone can join" + #: src/screens/Messages/components/InviteLinkDialog.tsx:143 #: src/screens/Messages/components/InviteLinkDialog.tsx:144 msgid "Anyone can join instantly" @@ -1561,11 +1609,11 @@ msgstr "Anyone can request to join" msgid "Anyone who follows me" msgstr "" -#: src/screens/Messages/components/InviteLinkDialog.tsx:436 +#: src/screens/Messages/components/InviteLinkDialog.tsx:446 msgid "Anyone who has it will no longer be able to join or request to join. You can always create a new one." msgstr "Anyone who has it will no longer be able to join or request to join. You can always create a new one." -#: src/Navigation.tsx:465 +#: src/Navigation.tsx:467 #: src/screens/Settings/AppIconSettings/index.tsx:65 #: src/screens/Settings/AppIconSettings/SettingsListItem.tsx:19 #: src/screens/Settings/AppIconSettings/SettingsListItem.tsx:24 @@ -1603,7 +1651,7 @@ msgstr "" msgid "App passwords" msgstr "" -#: src/Navigation.tsx:348 +#: src/Navigation.tsx:350 #: src/screens/Settings/AppPasswords.tsx:51 msgid "App Passwords" msgstr "" @@ -1645,7 +1693,7 @@ msgstr "" msgid "Appeal this decision" msgstr "" -#: src/Navigation.tsx:388 +#: src/Navigation.tsx:390 #: src/screens/Settings/AppearanceSettings.tsx:73 #: src/screens/Settings/Settings.tsx:225 #: src/screens/Settings/Settings.tsx:228 @@ -1710,7 +1758,7 @@ msgstr "" msgid "Are you sure you want to remove this from your feeds?" msgstr "" -#: src/view/com/composer/Composer.tsx:1541 +#: src/view/com/composer/Composer.tsx:1523 msgid "Are you sure you'd like to discard this post?" msgstr "" @@ -1758,7 +1806,7 @@ msgstr "Automated account" msgid "Automation label" msgstr "Automation label" -#: src/Navigation.tsx:404 +#: src/Navigation.tsx:406 #: src/screens/Settings/AutomationLabelSettings.tsx:103 msgid "Automation Label" msgstr "Automation Label" @@ -1776,9 +1824,9 @@ msgstr "" #: src/components/dms/AddMembersFlow.tsx:342 #: src/components/dms/AddMembersFlow.tsx:509 #: src/components/dms/AddMembersFlow.tsx:515 -#: src/components/dms/InitiateChatFlow.tsx:508 -#: src/components/dms/InitiateChatFlow.tsx:701 -#: src/components/dms/InitiateChatFlow.tsx:708 +#: src/components/dms/InitiateChatFlow.tsx:509 +#: src/components/dms/InitiateChatFlow.tsx:702 +#: src/components/dms/InitiateChatFlow.tsx:709 #: src/components/moderation/LabelsOnMeDialog.tsx:334 #: src/components/moderation/LabelsOnMeDialog.tsx:335 #: src/screens/Login/ChooseAccountForm.tsx:98 @@ -1791,6 +1839,8 @@ msgstr "" #: src/screens/Login/SetNewPasswordForm.tsx:178 #: src/screens/Messages/components/ChatDisabled.tsx:164 #: src/screens/Messages/components/ChatDisabled.tsx:166 +#: src/screens/Messages/components/InviteLinkDialog.tsx:256 +#: src/screens/Messages/components/InviteLinkDialog.tsx:284 #: src/screens/Messages/Inbox.tsx:242 #: src/screens/Profile/Header/Shell.tsx:174 #: src/screens/Settings/components/ChangePasswordDialog.tsx:273 @@ -1970,7 +2020,7 @@ msgstr "" msgid "Blocked accounts" msgstr "" -#: src/Navigation.tsx:189 +#: src/Navigation.tsx:191 #: src/view/screens/ModerationBlockedAccounts.tsx:95 msgid "Blocked Accounts" msgstr "" @@ -2143,11 +2193,13 @@ msgstr "" msgid "Button to go back to the home timeline" msgstr "" +#. The owner (creator) of a group chat. +#. placeholder {0}: createSanitizedDisplayName( data.joinLinkPreviews[0].owner, true, moderateProfile( data.joinLinkPreviews[0].owner, moderationOpts, ).ui('displayName'), ) #. placeholder {0}: sanitizeHandle(handle, '@') #. placeholder {0}: sanitizeHandle(item.feed.creator.handle, '@') -#. placeholder {0}: sanitizeHandle(labeler.creator.handle, '@') #: src/components/LabelingServiceCard/index.tsx:62 #: src/components/moderation/ReportDialog/index.tsx:845 +#: src/screens/Messages/JoinRequest.tsx:166 #: src/screens/Search/components/StarterPackCard.tsx:107 #: src/screens/Search/Explore.tsx:971 msgid "By {0}" @@ -2218,8 +2270,8 @@ msgstr "" #: src/features/liveNow/components/GoLiveDialog.tsx:254 #: src/lib/media/picker.tsx:38 #: src/screens/Deactivated.tsx:150 -#: src/screens/Messages/components/InviteLinkDialog.tsx:458 -#: src/screens/Messages/components/InviteLinkDialog.tsx:462 +#: src/screens/Messages/components/InviteLinkDialog.tsx:468 +#: src/screens/Messages/components/InviteLinkDialog.tsx:472 #: src/screens/Messages/ConversationSettings/prompts.tsx:70 #: src/screens/Messages/ConversationSettings/prompts.tsx:94 #: src/screens/Profile/Header/EditProfileDialog.tsx:215 @@ -2234,8 +2286,8 @@ msgstr "" #: src/screens/Settings/Settings.tsx:300 #: src/screens/Takendown.tsx:102 #: src/screens/Takendown.tsx:105 -#: src/view/com/composer/Composer.tsx:1619 -#: src/view/com/composer/Composer.tsx:1629 +#: src/view/com/composer/Composer.tsx:1601 +#: src/view/com/composer/Composer.tsx:1611 #: src/view/com/composer/photos/EditImageDialog.web.tsx:44 #: src/view/com/composer/photos/EditImageDialog.web.tsx:53 #: src/view/shell/desktop/LeftNav.tsx:227 @@ -2270,7 +2322,7 @@ msgstr "" msgid "Captions & alt text" msgstr "" -#: src/components/images/Gallery/index.tsx:255 +#: src/components/images/Gallery/index.tsx:256 msgid "carousel" msgstr "carousel" @@ -2350,7 +2402,7 @@ msgid "Changes to the starter pack will not be reflected in the list after creat msgstr "" #: src/lib/hooks/useNotificationHandler.ts:133 -#: src/Navigation.tsx:483 +#: src/Navigation.tsx:485 #: src/view/shell/bottom-bar/BottomBar.tsx:229 #: src/view/shell/desktop/LeftNav.tsx:697 #: src/view/shell/Drawer.tsx:469 @@ -2367,6 +2419,11 @@ msgstr "" msgid "Chat ended" msgstr "Chat ended" +#: src/components/intents/GroupChatJoinDialog.tsx:227 +#: src/components/intents/GroupChatJoinDialog.tsx:258 +msgid "Chat invite link no longer available" +msgstr "Chat invite link no longer available" + #: src/components/dms/getSystemMessageInfo.ts:104 msgid "Chat locked" msgstr "Chat locked" @@ -2388,7 +2445,7 @@ msgstr "" msgid "Chat recipient is not followed by the sender." msgstr "Chat recipient is not followed by the sender." -#: src/Navigation.tsx:498 +#: src/Navigation.tsx:505 msgid "Chat request inbox" msgstr "" @@ -2398,7 +2455,7 @@ msgid "Chat requests" msgstr "" #: src/components/dms/ConvoMenu.tsx:84 -#: src/Navigation.tsx:493 +#: src/Navigation.tsx:500 #: src/screens/Messages/ChatList.tsx:83 #: src/screens/Messages/ChatList.tsx:87 #: src/screens/Messages/ChatList.tsx:500 @@ -2485,7 +2542,7 @@ msgstr "" msgid "Choose this color as your avatar" msgstr "" -#: src/screens/Messages/components/InviteLinkDialog.tsx:211 +#: src/screens/Messages/components/InviteLinkDialog.tsx:222 msgid "Choose who can join this group chat and how." msgstr "Choose who can join this group chat and how." @@ -2539,7 +2596,7 @@ msgstr "" msgid "click here" msgstr "" -#: src/screens/Messages/components/MessagesListGroupInfoPanel.tsx:131 +#: src/screens/Messages/components/MessagesListGroupInfoPanel.tsx:128 msgid "Click here to add people to this group chat" msgstr "Click here to add people to this group chat" @@ -2547,7 +2604,7 @@ msgstr "Click here to add people to this group chat" msgid "Click here to contact our support team" msgstr "" -#: src/screens/Messages/components/MessagesListGroupInfoPanel.tsx:145 +#: src/screens/Messages/components/MessagesListGroupInfoPanel.tsx:142 msgid "Click here to create or manage an invite link for this group chat" msgstr "Click here to create or manage an invite link for this group chat" @@ -2577,7 +2634,7 @@ msgstr "" msgid "Click here to update your email" msgstr "" -#: src/screens/Messages/components/MessagesListGroupInfoPanel.tsx:146 +#: src/screens/Messages/components/MessagesListGroupInfoPanel.tsx:143 msgid "Click here to view the invite link for this group chat" msgstr "Click here to view the invite link for this group chat" @@ -2621,7 +2678,9 @@ msgstr "" #: src/components/dms/AfterReportDialog.tsx:207 #: src/components/dms/AfterReportDialog.tsx:212 #: src/components/dms/EmojiPopup.android.tsx:59 -#: src/components/dms/InitiateChatFlow.tsx:533 +#: src/components/dms/InitiateChatFlow.tsx:534 +#: src/components/intents/GroupChatJoinDialog.tsx:204 +#: src/components/intents/GroupChatJoinDialog.tsx:239 #: src/components/NewskieDialog.tsx:169 #: src/components/NewskieDialog.tsx:175 #: src/components/Post/Embed/VideoEmbed/GifPresentationControls.tsx:107 @@ -2635,8 +2694,8 @@ msgstr "" #: src/features/gifPicker/components/GifPickerErrorBoundary.tsx:45 #: src/features/liveNow/components/EditLiveDialog.tsx:217 #: src/features/liveNow/components/EditLiveDialog.tsx:223 -#: src/screens/Messages/components/InviteLinkDialog.tsx:481 -#: src/screens/Messages/components/InviteLinkDialog.tsx:486 +#: src/screens/Messages/components/InviteLinkDialog.tsx:492 +#: src/screens/Messages/components/InviteLinkDialog.tsx:497 #: src/screens/Settings/components/ChangePasswordDialog.tsx:288 #: src/screens/Settings/components/ChangePasswordDialog.tsx:293 #: src/view/com/feeds/MissingFeed.tsx:211 @@ -2679,7 +2738,7 @@ msgid "Close image" msgstr "" #: src/components/Lightbox/Lightbox.web.tsx:73 -#: src/components/Lightbox/Lightbox.web.tsx:326 +#: src/components/Lightbox/Lightbox.web.tsx:330 msgid "Close image viewer" msgstr "" @@ -2690,6 +2749,10 @@ msgstr "" msgid "Close menu" msgstr "" +#: src/components/intents/GroupChatJoinDialog.tsx:197 +#: src/components/intents/GroupChatJoinDialog.tsx:198 +#: src/components/intents/GroupChatJoinDialog.tsx:234 +#: src/components/intents/GroupChatJoinDialog.tsx:235 #: src/components/Menu/index.tsx:361 msgid "Close this dialog" msgstr "" @@ -2702,7 +2765,7 @@ msgstr "" msgid "Closes password update alert" msgstr "" -#: src/view/com/composer/Composer.tsx:1627 +#: src/view/com/composer/Composer.tsx:1609 msgid "Closes post composer and discards post draft" msgstr "" @@ -2732,7 +2795,7 @@ msgid "Comics" msgstr "" #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:46 -#: src/Navigation.tsx:338 +#: src/Navigation.tsx:340 #: src/view/screens/CommunityGuidelines.tsx:28 msgid "Community Guidelines" msgstr "" @@ -2752,7 +2815,7 @@ msgid "Compose new post" msgstr "" #. placeholder {0}: MAX_GRAPHEME_LENGTH || 0 -#: src/view/com/composer/Composer.tsx:1503 +#: src/view/com/composer/Composer.tsx:1485 msgid "Compose posts up to {0, plural, other {# characters}} in length" msgstr "" @@ -2760,11 +2823,11 @@ msgstr "" msgid "Compose reply" msgstr "" -#: src/view/com/composer/Composer.tsx:2464 +#: src/view/com/composer/Composer.tsx:2446 msgid "Compressing GIF..." msgstr "" -#: src/view/com/composer/Composer.tsx:2466 +#: src/view/com/composer/Composer.tsx:2448 msgid "Compressing video..." msgstr "" @@ -2849,7 +2912,7 @@ msgstr "" msgid "Content and media" msgstr "" -#: src/Navigation.tsx:441 +#: src/Navigation.tsx:443 msgid "Content and Media" msgstr "" @@ -2916,7 +2979,7 @@ msgid "Continue thread..." msgstr "" #: src/components/dms/AddMembersFlow.tsx:307 -#: src/components/dms/InitiateChatFlow.tsx:460 +#: src/components/dms/InitiateChatFlow.tsx:461 msgid "Continue to group name" msgstr "Continue to group name" @@ -2948,6 +3011,11 @@ msgctxt "toast" msgid "Conversation left" msgstr "Conversation left" +#: src/screens/Messages/JoinRequests.tsx:192 +#: src/screens/Messages/JoinRequests.tsx:224 +msgid "Conversation not found." +msgstr "Conversation not found." + #: src/screens/Settings/AboutSettings.tsx:162 msgid "Copied build version to clipboard" msgstr "" @@ -3059,7 +3127,7 @@ msgstr "" #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:41 #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:108 -#: src/Navigation.tsx:343 +#: src/Navigation.tsx:345 #: src/view/screens/CopyrightPolicy.tsx:25 msgid "Copyright Policy" msgstr "" @@ -3146,7 +3214,7 @@ msgstr "" #. Text on button to create a new starter pack #: src/components/dialogs/StarterPackDialog.tsx:113 #: src/components/dialogs/StarterPackDialog.tsx:210 -#: src/components/dms/InitiateChatFlow.tsx:469 +#: src/components/dms/InitiateChatFlow.tsx:470 #: src/components/StarterPack/ProfileStarterPacks.tsx:329 msgid "Create" msgstr "" @@ -3166,7 +3234,7 @@ msgstr "" #: src/components/StarterPack/ProfileStarterPacks.tsx:207 #: src/components/StarterPack/ProfileStarterPacks.tsx:316 -#: src/Navigation.tsx:529 +#: src/Navigation.tsx:536 msgid "Create a starter pack" msgstr "" @@ -3181,6 +3249,7 @@ msgstr "" #: src/components/WelcomeModal.tsx:158 #: src/components/WelcomeModal.tsx:166 +#: src/screens/Messages/JoinRequest.tsx:300 #: src/screens/Signup/index.tsx:135 #: src/view/com/auth/SplashScreen.tsx:107 #: src/view/com/auth/SplashScreen.web.tsx:116 @@ -3213,7 +3282,7 @@ msgstr "" msgid "Create another" msgstr "" -#: src/components/dms/InitiateChatFlow.tsx:468 +#: src/components/dms/InitiateChatFlow.tsx:469 msgid "Create group chat" msgstr "Create group chat" @@ -3235,12 +3304,13 @@ msgstr "" msgid "Create moderation list" msgstr "" +#: src/screens/Messages/JoinRequest.tsx:294 #: src/view/com/auth/SplashScreen.tsx:100 #: src/view/com/auth/SplashScreen.web.tsx:108 msgid "Create new account" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:488 +#: src/screens/Messages/ConversationSettings/index.tsx:487 msgid "Create or modify an invite link for this group chat" msgstr "Create or modify an invite link for this group chat" @@ -3263,8 +3333,8 @@ msgstr "" #. placeholder {0}: i18n.date(appPassword.createdAt, { year: 'numeric', month: 'numeric', day: 'numeric', hour: '2-digit', minute: '2-digit', }) #. placeholder {0}: i18n.date(createdAt, { dateStyle: 'long', timeStyle: 'short', }) #. placeholder {0}: i18n.date(createdAt, { month: 'long', day: 'numeric', year: 'numeric', }) -#: src/screens/Messages/components/InviteLinkDialog.tsx:312 -#: src/screens/Messages/ConversationSettings/index.tsx:441 +#: src/screens/Messages/components/InviteLinkDialog.tsx:329 +#: src/screens/Messages/ConversationSettings/index.tsx:440 #: src/screens/Settings/AppPasswords.tsx:174 msgid "Created {0}" msgstr "" @@ -3420,7 +3490,7 @@ msgstr "" #: src/components/PostControls/PostMenu/PostMenuItems.tsx:787 #: src/components/PostControls/PostMenu/PostMenuItems.tsx:789 -#: src/view/com/composer/Composer.tsx:1515 +#: src/view/com/composer/Composer.tsx:1497 msgid "Delete post" msgstr "" @@ -3514,8 +3584,8 @@ msgstr "" msgid "Dim" msgstr "" -#: src/screens/Messages/components/InviteLinkDialog.tsx:344 -#: src/screens/Messages/components/InviteLinkDialog.tsx:349 +#: src/screens/Messages/components/InviteLinkDialog.tsx:361 +#: src/screens/Messages/components/InviteLinkDialog.tsx:366 msgid "Disable" msgstr "Disable" @@ -3541,8 +3611,8 @@ msgstr "" msgid "Disable haptic feedback" msgstr "" -#: src/screens/Messages/components/InviteLinkDialog.tsx:446 -#: src/screens/Messages/components/InviteLinkDialog.tsx:452 +#: src/screens/Messages/components/InviteLinkDialog.tsx:456 +#: src/screens/Messages/components/InviteLinkDialog.tsx:462 msgid "Disable link" msgstr "Disable link" @@ -3554,7 +3624,7 @@ msgstr "" msgid "Disable replies entirely" msgstr "" -#: src/screens/Messages/components/InviteLinkDialog.tsx:426 +#: src/screens/Messages/components/InviteLinkDialog.tsx:443 msgid "Disable this invite link?" msgstr "Disable this invite link?" @@ -3567,9 +3637,9 @@ msgstr "" #: src/components/dialogs/lists/CreateOrEditListDialog.tsx:101 #: src/screens/Profile/Header/EditProfileDialog.tsx:79 -#: src/view/com/composer/Composer.tsx:1294 -#: src/view/com/composer/Composer.tsx:1338 -#: src/view/com/composer/Composer.tsx:1548 +#: src/view/com/composer/Composer.tsx:1276 +#: src/view/com/composer/Composer.tsx:1320 +#: src/view/com/composer/Composer.tsx:1530 #: src/view/com/composer/drafts/DraftItem.tsx:242 #: src/view/com/composer/drafts/DraftsButton.tsx:131 msgid "Discard" @@ -3580,14 +3650,14 @@ msgstr "" msgid "Discard changes?" msgstr "" -#: src/view/com/composer/Composer.tsx:1292 +#: src/view/com/composer/Composer.tsx:1274 #: src/view/com/composer/drafts/DraftItem.tsx:239 #: src/view/com/composer/drafts/DraftsButton.tsx:98 msgid "Discard draft?" msgstr "" -#: src/view/com/composer/Composer.tsx:1309 -#: src/view/com/composer/Composer.tsx:1540 +#: src/view/com/composer/Composer.tsx:1291 +#: src/view/com/composer/Composer.tsx:1522 msgid "Discard post?" msgstr "" @@ -3624,7 +3694,7 @@ msgstr "" msgid "Dismiss banner" msgstr "" -#: src/view/com/composer/Composer.tsx:2385 +#: src/view/com/composer/Composer.tsx:2367 msgid "Dismiss error" msgstr "" @@ -3760,8 +3830,8 @@ msgctxt "button" msgid "Download chat data" msgstr "Download chat data" -#: src/components/Lightbox/Lightbox.web.tsx:304 -#: src/components/Lightbox/Lightbox.web.tsx:316 +#: src/components/Lightbox/Lightbox.web.tsx:308 +#: src/components/Lightbox/Lightbox.web.tsx:320 msgid "Download image" msgstr "Download image" @@ -3833,7 +3903,7 @@ msgstr "" msgid "Eating disorders" msgstr "" -#: src/screens/Messages/components/EditTextButton.tsx:51 +#: src/screens/Messages/components/EditTextButton.tsx:52 #: src/screens/Settings/AccountSettings.tsx:150 #: src/screens/StarterPack/StarterPackScreen.tsx:604 #: src/screens/StarterPack/Wizard/index.tsx:331 @@ -3877,7 +3947,16 @@ msgstr "" msgid "Edit interests" msgstr "" -#: src/screens/Messages/components/InviteLinkDialog.tsx:326 +#: src/screens/Messages/JoinRequests.tsx:294 +msgid "Edit invite link" +msgstr "Edit invite link" + +#: src/screens/Messages/JoinRequests.tsx:300 +msgctxt "button" +msgid "Edit invite link" +msgstr "Edit invite link" + +#: src/screens/Messages/components/InviteLinkDialog.tsx:343 msgid "Edit link settings" msgstr "Edit link settings" @@ -3895,12 +3974,12 @@ msgstr "" msgid "Edit moderation list" msgstr "" -#: src/Navigation.tsx:353 +#: src/Navigation.tsx:355 #: src/view/screens/Feeds.tsx:511 msgid "Edit My Feeds" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:475 +#: src/screens/Messages/ConversationSettings/index.tsx:474 msgid "Edit name" msgstr "Edit name" @@ -3929,7 +4008,7 @@ msgstr "" msgid "Edit starter pack" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:474 +#: src/screens/Messages/ConversationSettings/index.tsx:473 msgid "Edit this group chat’s name" msgstr "Edit this group chat’s name" @@ -3941,7 +4020,7 @@ msgstr "" msgid "Edit who can reply" msgstr "" -#: src/Navigation.tsx:534 +#: src/Navigation.tsx:541 msgid "Edit your starter pack" msgstr "" @@ -4146,7 +4225,7 @@ msgstr "" msgid "Entertainment" msgstr "" -#: src/view/com/composer/Composer.tsx:2484 +#: src/view/com/composer/Composer.tsx:2466 #: src/view/com/util/error/ErrorScreen.tsx:40 msgid "Error" msgstr "" @@ -4220,8 +4299,8 @@ msgstr "" msgid "Exit fullscreen" msgstr "" -#: src/components/Lightbox/chrome/Footer.tsx:51 -#: src/components/Lightbox/Lightbox.web.tsx:237 +#: src/components/Lightbox/chrome/Footer.tsx:65 +#: src/components/Lightbox/Lightbox.web.tsx:241 msgid "Expand alt text" msgstr "" @@ -4241,7 +4320,7 @@ msgstr "" msgid "Expands or collapses post text" msgstr "" -#: src/lib/api/index.ts:460 +#: src/lib/api/index.ts:441 msgid "Expected uri to resolve to a record" msgstr "" @@ -4280,7 +4359,7 @@ msgstr "" msgid "Explicit sexual images." msgstr "" -#: src/Navigation.tsx:738 +#: src/Navigation.tsx:745 #: src/screens/Search/Shell.tsx:362 #: src/view/shell/desktop/LeftNav.tsx:676 #: src/view/shell/Drawer.tsx:417 @@ -4322,7 +4401,7 @@ msgstr "" msgid "External media may allow websites to collect information about you and your device. No information is sent or requested until you press the \"play\" button." msgstr "" -#: src/Navigation.tsx:372 +#: src/Navigation.tsx:374 #: src/screens/Settings/ExternalMediaPreferences.tsx:35 msgid "External Media Preferences" msgstr "" @@ -4336,6 +4415,10 @@ msgctxt "toast" msgid "Failed to accept chat" msgstr "" +#: src/screens/Messages/JoinRequests.tsx:186 +msgid "Failed to accept join request" +msgstr "Failed to accept join request" + #: src/components/dms/ActionsWrapper.web.tsx:77 #: src/components/dms/MessageContextMenu.tsx:119 msgid "Failed to add emoji reaction" @@ -4354,7 +4437,7 @@ msgstr "" msgid "Failed to change handle. Please try again." msgstr "" -#: src/components/Lightbox/Lightbox.web.tsx:294 +#: src/components/Lightbox/Lightbox.web.tsx:298 msgid "Failed to copy link" msgstr "Failed to copy link" @@ -4403,7 +4486,7 @@ msgstr "Failed to disable invite link" msgid "Failed to disconnect Germ DM. Error: {0}" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:345 +#: src/screens/Messages/ConversationSettings/index.tsx:344 msgid "Failed to edit group chat name" msgstr "Failed to edit group chat name" @@ -4427,13 +4510,21 @@ msgstr "" msgid "Failed to hide suggestion, please check your internet connection" msgstr "" +#: src/screens/Messages/JoinRequests.tsx:218 +msgid "Failed to ignore join request" +msgstr "Failed to ignore join request" + +#: src/components/intents/GroupChatJoinDialog.tsx:116 +msgid "Failed to join the group chat. Please try again." +msgstr "Failed to join the group chat. Please try again." + #: src/components/contacts/screens/ViewMatches.tsx:582 msgid "Failed to launch SMS app" msgstr "" #: src/screens/Messages/components/ChatEnded.tsx:42 #: src/screens/Messages/components/ChatLocked.tsx:53 -#: src/screens/Messages/ConversationSettings/index.tsx:372 +#: src/screens/Messages/ConversationSettings/index.tsx:371 msgctxt "toast" msgid "Failed to leave group chat" msgstr "Failed to leave group chat" @@ -4484,7 +4575,7 @@ msgstr "" msgid "Failed to load suggested follows" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:393 +#: src/screens/Messages/ConversationSettings/index.tsx:392 msgid "Failed to lock group chat" msgstr "Failed to lock group chat" @@ -4493,7 +4584,7 @@ msgstr "Failed to lock group chat" msgid "Failed to mark all requests as read" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:359 +#: src/screens/Messages/ConversationSettings/index.tsx:358 msgid "Failed to mute group chat" msgstr "Failed to mute group chat" @@ -4533,15 +4624,19 @@ msgstr "Failed to remove group chat member" msgid "Failed to remove verification" msgstr "" +#: src/components/intents/GroupChatJoinDialog.tsx:150 +msgid "Failed to rescind your request. Please try again." +msgstr "Failed to rescind your request. Please try again." + #: src/components/dialogs/DeviceLocationRequestDialog.tsx:81 msgid "Failed to resolve location. Please try again." msgstr "" -#: src/view/com/composer/Composer.tsx:584 +#: src/view/com/composer/Composer.tsx:578 msgid "Failed to save draft" msgstr "" -#: src/components/Lightbox/Lightbox.web.tsx:311 +#: src/components/Lightbox/Lightbox.web.tsx:315 msgid "Failed to save image" msgstr "Failed to save image" @@ -4580,7 +4675,7 @@ msgid "Failed to toggle thread mute, please try again" msgstr "" #: src/screens/Messages/components/ChatLocked.tsx:42 -#: src/screens/Messages/ConversationSettings/index.tsx:396 +#: src/screens/Messages/ConversationSettings/index.tsx:395 msgid "Failed to unlock group chat" msgstr "Failed to unlock group chat" @@ -4632,7 +4727,7 @@ msgstr "" msgid "False information about elections" msgstr "" -#: src/Navigation.tsx:288 +#: src/Navigation.tsx:290 msgid "Feed" msgstr "" @@ -4677,7 +4772,7 @@ msgctxt "toast" msgid "Feedback sent to feed operator" msgstr "" -#: src/Navigation.tsx:514 +#: src/Navigation.tsx:521 #: src/screens/SavedFeeds.tsx:112 #: src/screens/SavedFeeds.tsx:303 #: src/screens/Search/SearchResults.tsx:80 @@ -4759,8 +4854,8 @@ msgstr "" msgid "Find accounts to follow" msgstr "" -#: src/Navigation.tsx:428 -#: src/Navigation.tsx:556 +#: src/Navigation.tsx:430 +#: src/Navigation.tsx:563 msgid "Find Contacts" msgstr "" @@ -4935,8 +5030,12 @@ msgstr "" msgid "Followed by <0>{0}, <1>{1}, and {2, plural, one {# other} other {# others}}" msgstr "" +#: src/components/intents/GroupChatJoinDialog.tsx:321 +msgid "Followers can join" +msgstr "Followers can join" + #. placeholder {0}: route.params.name -#: src/Navigation.tsx:242 +#: src/Navigation.tsx:244 msgid "Followers of @{0} that you know" msgstr "" @@ -4986,7 +5085,7 @@ msgstr "" msgid "Following feed preferences" msgstr "" -#: src/Navigation.tsx:359 +#: src/Navigation.tsx:361 #: src/screens/Settings/FollowingFeedPreferences.tsx:57 msgid "Following Feed Preferences" msgstr "" @@ -5077,17 +5176,17 @@ msgstr "" msgid "Generate a starter pack" msgstr "" -#: src/screens/Messages/components/InviteLinkDialog.tsx:206 -#: src/screens/Messages/components/InviteLinkDialog.tsx:244 -#: src/screens/Messages/components/InviteLinkDialog.tsx:268 +#: src/screens/Messages/components/InviteLinkDialog.tsx:217 +#: src/screens/Messages/components/InviteLinkDialog.tsx:257 +#: src/screens/Messages/components/InviteLinkDialog.tsx:285 msgid "Generate invite link" msgstr "Generate invite link" -#: src/screens/Messages/components/InviteLinkDialog.tsx:397 +#: src/screens/Messages/components/InviteLinkDialog.tsx:414 msgid "Generate new invite link" msgstr "Generate new invite link" -#: src/screens/Messages/components/InviteLinkDialog.tsx:402 +#: src/screens/Messages/components/InviteLinkDialog.tsx:419 msgid "Generate new link" msgstr "Generate new link" @@ -5175,17 +5274,17 @@ msgstr "" #: src/components/dialogs/EmailDialog/screens/VerificationReminder.tsx:71 #: src/components/dialogs/EmailDialog/screens/VerificationReminder.tsx:81 -#: src/screens/Messages/components/InviteLinkDialog.tsx:187 -#: src/screens/Messages/components/InviteLinkDialog.tsx:194 +#: src/screens/Messages/components/InviteLinkDialog.tsx:197 +#: src/screens/Messages/components/InviteLinkDialog.tsx:204 msgid "Get started" msgstr "" -#: src/components/MediaPreview.tsx:136 +#: src/components/MediaPreview.tsx:147 #: src/components/Post/Embed/VideoEmbed/GifPresentationControls.tsx:69 msgid "GIF" msgstr "" -#: src/view/com/composer/Composer.tsx:2489 +#: src/view/com/composer/Composer.tsx:2471 msgid "GIF uploaded" msgstr "" @@ -5208,7 +5307,7 @@ msgstr "" #: src/screens/VideoFeed/components/Header.tsx:163 #: src/screens/VideoFeed/index.tsx:1168 #: src/screens/VideoFeed/index.tsx:1172 -#: src/view/com/auth/LoggedOut.tsx:89 +#: src/view/com/auth/LoggedOut.tsx:103 #: src/view/com/profile/ProfileFollowers.tsx:178 #: src/view/com/profile/ProfileFollowers.tsx:179 #: src/view/screens/NotFound.tsx:51 @@ -5334,37 +5433,42 @@ msgstr "" msgid "Grooming or predatory behavior" msgstr "" -#: src/screens/Messages/components/InviteLinkDialog.tsx:513 +#: src/components/intents/GroupChatJoinDialog.tsx:297 +#: src/screens/Messages/JoinRequest.tsx:116 +msgid "Group chat" +msgstr "Group chat" + +#: src/screens/Messages/components/InviteLinkDialog.tsx:522 msgid "Group chat invite link dialog" msgstr "Group chat invite link dialog" -#: src/screens/Messages/ConversationSettings/index.tsx:385 +#: src/screens/Messages/ConversationSettings/index.tsx:384 msgctxt "toast" msgid "Group chat locked" msgstr "Group chat locked" -#: src/screens/Messages/ConversationSettings/index.tsx:352 +#: src/screens/Messages/ConversationSettings/index.tsx:351 msgctxt "toast" msgid "Group chat muted" msgstr "Group chat muted" -#: src/screens/Messages/ConversationSettings/index.tsx:340 +#: src/screens/Messages/ConversationSettings/index.tsx:339 msgctxt "toast" msgid "Group chat name updated" msgstr "Group chat name updated" -#: src/Navigation.tsx:488 +#: src/Navigation.tsx:490 #: src/screens/Messages/ConversationSettings/index.tsx:91 msgid "Group chat settings" msgstr "Group chat settings" #: src/screens/Messages/components/ChatLocked.tsx:38 -#: src/screens/Messages/ConversationSettings/index.tsx:387 +#: src/screens/Messages/ConversationSettings/index.tsx:386 msgctxt "toast" msgid "Group chat unlocked" msgstr "Group chat unlocked" -#: src/screens/Messages/ConversationSettings/index.tsx:354 +#: src/screens/Messages/ConversationSettings/index.tsx:353 msgctxt "toast" msgid "Group chat unmuted" msgstr "Group chat unmuted" @@ -5377,12 +5481,17 @@ msgstr "Group chats are not yet available" msgid "Group chats are now available" msgstr "Group chats are now available" +#. placeholder {0}: import {useState} from 'react' import {View} from 'react-native' import { type ChatBskyGroupDefs, moderateProfile, type ModerationOpts, } from '@atproto/api' import {plural} from '@lingui/core/macro' import {Trans, useLingui} from '@lingui/react/macro' import {useOpenComposer} from '#/lib/hooks/useOpenComposer' import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name' import {shareUrl} from '#/lib/sharing' import {useCreateJoinLink} from '#/state/queries/messages/create-join-link' import {useDisableJoinLink} from '#/state/queries/messages/disable-join-link' import {useEditJoinLink} from '#/state/queries/messages/edit-join-link' import {useEnableJoinLink} from '#/state/queries/messages/enable-join-link' import {atoms as a, useTheme, web} from '#/alf' import { Button, ButtonIcon, ButtonText, StackedButton, } from '#/components/Button' import * as Dialog from '#/components/Dialog' import { type ConvoWithDetails, type GroupConvoMember, } from '#/components/dms/util' import * as Toggle from '#/components/forms/Toggle' import {ArrowRight_Stroke2_Corner0_Rounded as ArrowRightIcon} from '#/components/icons/Arrow' import {ArrowShareRight_Stroke2_Corner2_Rounded as ArrowShareRightIcon} from '#/components/icons/ArrowShareRight' import {ChainLinkBroken_Stroke2_Corner0_Rounded as ChainLinkBrokenIcon} from '#/components/icons/ChainLink' import {EditBig_Stroke2_Corner2_Rounded as EditIcon} from '#/components/icons/EditBig' import {Loader} from '#/components/Loader' import * as Toast from '#/components/Toast' import {Text} from '#/components/Typography' import {IS_WEB} from '#/env' import {CopyTextButton} from './CopyTextButton' import {EditTextButton} from './EditTextButton' enum Step { INFO, GENERATE, MANAGE, CONFIRM_DISABLE, } export function InviteLinkDialog({ convo, control, owner, isOwner, moderationOpts, }: { convo: Extract control: Dialog.DialogOuterProps['control'] owner: GroupConvoMember isOwner: boolean moderationOpts: ModerationOpts }) { const t = useTheme() const {t: l, i18n} = useLingui() const ownerName = createSanitizedDisplayName( owner, false, moderateProfile(owner, moderationOpts).ui('displayName'), ) const {joinLink} = convo.details const defaultStep = joinLink ? Step.MANAGE : Step.INFO const defaultWhoCanJoin = joinLink ? joinLinkToKey(joinLink) : 'anyone' const [step, setStep] = useState(defaultStep) const [whoCanJoin, setWhoCanJoin] = useState(defaultWhoCanJoin) // Resync local state when the server-side join link rules change (mutation // success, refetch, or change from another client). Keyed on the rule string // so identity-only refetches don't bump a user mid-edit. const joinLinkRuleKey = joinLink ? joinLinkToKey(joinLink) : null const [prevKey, setPrevKey] = useState(joinLinkRuleKey) if (joinLinkRuleKey !== prevKey) { setStep(joinLinkRuleKey ? Step.MANAGE : Step.INFO) setWhoCanJoin(joinLinkRuleKey ?? 'anyone') setPrevKey(joinLinkRuleKey) } const {openComposer} = useOpenComposer() const {mutate: createJoinLink, isPending: isCreating} = useCreateJoinLink( convo.view.id, { onSuccess: () => { setStep(Step.MANAGE) }, onError: () => { Toast.show(l`Failed to create invite link`, { type: 'error', }) }, }, ) const {mutate: editJoinLink, isPending: isEditing} = useEditJoinLink( convo.view.id, { onSuccess: () => { setStep(Step.MANAGE) }, onError: () => { Toast.show(l`Failed to edit invite link`, { type: 'error', }) }, }, ) const {mutate: disableJoinLink, isPending: isDisabling} = useDisableJoinLink( convo.view.id, { onError: () => { Toast.show(l`Failed to disable invite link`, { type: 'error', }) }, }, ) const {mutate: enableJoinLink, isPending: isEnabling} = useEnableJoinLink( convo.view.id, { onError: () => { Toast.show(l`Failed to enable invite link`, { type: 'error', }) }, }, ) const isSaving = isCreating || isEditing const whoCanJoinOptions = [ { name: 'anyone', owner: l`Anyone can join instantly`, member: l`Anyone can join instantly`, }, { name: 'anyone:requireApproval', owner: l`Anyone can request to join`, member: l`Anyone can request to join`, }, { name: 'followedByOwner', owner: l`People I follow can join instantly`, member: l`People ${ownerName} follows can join instantly`, }, { name: 'followedByOwner:requireApproval', owner: l`People I follow can request to join`, member: l`People ${ownerName} follows can request to join`, }, ] let content: React.ReactNode = null let header: string | null = null switch (step) { case Step.INFO: { header = l`Invite link` content = ( <> An invite link lets people join this group chat without being added directly. You control who can join the chat. You can disable the link at any time. Group chats can only have a maximum of{' '} {plural(convo.details.memberLimit, { one: '# person', other: '# people', })} . Your name, avatar, the name of the group chat, and the number of members will be visible to everyone. ) break } case Step.GENERATE: { const linkEnabled = joinLink?.enabledStatus === 'enabled' const linkHasChanged = linkEnabled && joinLinkRuleKey !== whoCanJoin header = linkEnabled ? l`Update invite link` : l`Generate invite link` content = ( <> Choose who can join this group chat and how. setWhoCanJoin(value)}> {whoCanJoinOptions.map(option => ( {({selected}) => ( )} ))} ) break } case Step.MANAGE: { const linkEnabled = joinLink?.enabledStatus === 'enabled' const linkDisabled = joinLink?.enabledStatus === 'disabled' const joinLinkURI = joinLink?.code ? `https://bsky.app/c/${joinLink.code}` : 'https://bsky.app/' const createdAt = joinLink ? new Date(joinLink.createdAt) : null const currentOption = whoCanJoinOptions.find( o => o.name === (joinLink ? joinLinkToKey(joinLink) : null), ) ?? whoCanJoinOptions[0] const ownerValue = currentOption?.owner ?? whoCanJoinOptions[0].owner const memberValue = currentOption?.member ?? whoCanJoinOptions[0].member header = linkEnabled ? l`Invite link` : l`Invite link disabled` content = ( <> {joinLinkURI} {createdAt ? ( Created{' '} {i18n.date(createdAt, { dateStyle: 'long', timeStyle: 'short', })} ) : null} {linkEnabled ? ( {isOwner ? ( setStep(Step.GENERATE)}> {ownerValue} ) : ( {memberValue} )} ) : null} {linkEnabled ? ( {isOwner ? ( setStep(Step.CONFIRM_DISABLE)}> Disable ) : null} { control.close(() => { openComposer({ text: joinLinkURI, logContext: 'Other', }) }) }}> Post link { void shareUrl(joinLinkURI) }}> Share ) : ( )} ) break } case Step.CONFIRM_DISABLE: { content = ( <> Disable this invite link? Anyone who has it will no longer be able to join or request to join. You can always create a new one. ) break } } if (!isOwner && (!joinLink || joinLink.enabledStatus === 'disabled')) { header = l`Invite link` content = ( <> There is no invite link for this group chat. ) } return ( { setStep(defaultStep) setWhoCanJoin(defaultWhoCanJoin) }}> {header} } label={l`Group chat invite link dialog`} style={web({maxWidth: 400})}> {content} ) } function joinLinkToKey(joinLink: ChatBskyGroupDefs.JoinLinkView): string { return `${joinLink.joinRule}${joinLink.requireApproval ? ':requireApproval' : ''}` } function keyToJoinLink( key: string, ): Pick { const [joinRule, requireApproval] = key.split(':') return { joinRule, requireApproval: requireApproval === 'requireApproval', } } +#: src/screens/Messages/components/InviteLinkDialog.tsx:179 +msgid "Group chats can only have a maximum of {0}." +msgstr "Group chats can only have a maximum of {0}." + #: src/components/dialogs/SearchablePeopleList.tsx:569 msgid "Group is locked" msgstr "Group is locked" #: src/components/dms/InitiateChatFlow.tsx:237 -#: src/components/dms/InitiateChatFlow.tsx:568 +#: src/components/dms/InitiateChatFlow.tsx:569 #: src/screens/Messages/ConversationSettings/prompts.tsx:33 msgid "Group name" msgstr "Group name" @@ -5440,7 +5549,7 @@ msgstr "" msgid "Harming or endangering minors" msgstr "" -#: src/Navigation.tsx:472 +#: src/Navigation.tsx:474 msgid "Hashtag" msgstr "" @@ -5646,7 +5755,7 @@ msgstr "" msgid "Hmmmm, we couldn't load that moderation service." msgstr "" -#: src/view/com/composer/state/video.ts:430 +#: src/view/com/composer/state/video.ts:415 msgid "Hold up! We’re gradually giving access to video, and you’re still waiting in line. Check back soon!" msgstr "" @@ -5654,8 +5763,8 @@ msgstr "" msgid "Hold your horses! This feature isn't available to you yet. Please check back later." msgstr "Hold your horses! This feature isn't available to you yet. Please check back later." -#: src/Navigation.tsx:733 -#: src/Navigation.tsx:754 +#: src/Navigation.tsx:740 +#: src/Navigation.tsx:761 #: src/view/shell/bottom-bar/BottomBar.tsx:184 #: src/view/shell/desktop/LeftNav.tsx:666 #: src/view/shell/Drawer.tsx:443 @@ -5715,7 +5824,7 @@ msgstr "" msgid "I'm on Bluesky as {0} - come find me! https://bsky.app/download" msgstr "" -#: src/components/Lightbox/Lightbox.web.tsx:238 +#: src/components/Lightbox/Lightbox.web.tsx:242 msgid "If alt text is long, toggles alt text expanded state" msgstr "" @@ -5779,23 +5888,33 @@ msgstr "" msgid "If you're trying to change your handle or email, do so before you deactivate." msgstr "" -#: src/components/images/ImageLayoutGridItem.tsx:76 +#. Ignore a request to join a chat +#: src/screens/Messages/JoinRequests.tsx:485 +msgctxt "button" +msgid "Ignore" +msgstr "Ignore" + +#: src/screens/Messages/JoinRequests.tsx:479 +msgid "Ignore join request" +msgstr "Ignore join request" + +#: src/components/images/ImageLayoutGridItem.tsx:93 msgid "Image" msgstr "" #. placeholder {0}: index + 1 -#: src/components/images/Gallery/index.tsx:427 +#: src/components/images/Gallery/index.tsx:436 msgid "Image {0}" msgstr "Image {0}" #. placeholder {0}: index + 1 #. placeholder {1}: imgs.length -#: src/components/Lightbox/Lightbox.web.tsx:253 +#: src/components/Lightbox/Lightbox.web.tsx:257 msgid "Image {0} of {1}" msgstr "" #. placeholder {0}: index + 1 -#: src/components/images/Gallery/index.tsx:418 +#: src/components/images/Gallery/index.tsx:421 msgid "Image {0} of {imageCount}" msgstr "Image {0} of {imageCount}" @@ -5810,7 +5929,7 @@ msgid "Image cache cleared, freed {0}" msgstr "" #. placeholder {0}: images.length -#: src/components/images/Gallery/index.tsx:256 +#: src/components/images/Gallery/index.tsx:257 msgid "Image gallery, {0} images" msgstr "Image gallery, {0} images" @@ -5825,12 +5944,12 @@ msgid "Image is unavailable." msgstr "Image is unavailable." #: src/components/Lightbox/chrome/ImageMenu.tsx:73 -#: src/components/Lightbox/Lightbox.web.tsx:257 -#: src/components/Lightbox/Lightbox.web.tsx:265 +#: src/components/Lightbox/Lightbox.web.tsx:261 +#: src/components/Lightbox/Lightbox.web.tsx:269 msgid "Image options" msgstr "Image options" -#: src/components/Lightbox/Lightbox.web.tsx:308 +#: src/components/Lightbox/Lightbox.web.tsx:312 #: src/lib/media/save-image.ios.ts:25 #: src/lib/media/save-image.ts:29 msgid "Image saved" @@ -5956,6 +6075,10 @@ msgstr "" msgid "Invalid 2FA confirmation code." msgstr "" +#: src/components/intents/GroupChatJoinDialog.tsx:126 +msgid "Invalid group chat code." +msgstr "Invalid group chat code." + #: src/screens/Settings/components/ChangeHandleDialog.tsx:615 msgid "Invalid handle. Please try a different one." msgstr "" @@ -5974,6 +6097,10 @@ msgstr "" msgid "Invalid report subject" msgstr "" +#: src/components/intents/GroupChatJoinDialog.tsx:157 +msgid "Invalid rescind request." +msgstr "Invalid rescind request." + #: src/components/intents/VerifyEmailIntentDialog.tsx:86 msgid "Invalid Verification Code" msgstr "" @@ -6004,11 +6131,11 @@ msgid "Invite friends <0/>" msgstr "" #: src/screens/Messages/components/InviteLinkDialog.tsx:167 -#: src/screens/Messages/components/InviteLinkDialog.tsx:290 -#: src/screens/Messages/components/InviteLinkDialog.tsx:296 -#: src/screens/Messages/components/InviteLinkDialog.tsx:471 -#: src/screens/Messages/components/MessagesListGroupInfoPanel.tsx:151 -#: src/screens/Messages/ConversationSettings/index.tsx:491 +#: src/screens/Messages/components/InviteLinkDialog.tsx:309 +#: src/screens/Messages/components/InviteLinkDialog.tsx:315 +#: src/screens/Messages/components/InviteLinkDialog.tsx:482 +#: src/screens/Messages/components/MessagesListGroupInfoPanel.tsx:148 +#: src/screens/Messages/ConversationSettings/index.tsx:490 msgid "Invite link" msgstr "Invite link" @@ -6017,7 +6144,7 @@ msgid "Invite link created" msgstr "Invite link created" #: src/components/dms/getSystemMessageInfo.ts:138 -#: src/screens/Messages/components/InviteLinkDialog.tsx:290 +#: src/screens/Messages/components/InviteLinkDialog.tsx:309 msgid "Invite link disabled" msgstr "Invite link disabled" @@ -6067,7 +6194,7 @@ msgid "It's just you right now! Add more people to your starter pack by searchin msgstr "" #. placeholder {0}: videoState.jobId -#: src/view/com/composer/Composer.tsx:2404 +#: src/view/com/composer/Composer.tsx:2386 msgid "Job ID: {0}" msgstr "" @@ -6076,6 +6203,10 @@ msgstr "" msgid "Jobs" msgstr "" +#: src/components/intents/GroupChatJoinDialog.tsx:253 +msgid "Join" +msgstr "Join" + #: src/screens/StarterPack/StarterPackLandingScreen.tsx:210 #: src/screens/StarterPack/StarterPackLandingScreen.tsx:215 #: src/screens/StarterPack/StarterPackScreen.tsx:478 @@ -6083,17 +6214,30 @@ msgstr "" msgid "Join Bluesky" msgstr "" +#: src/components/intents/GroupChatJoinDialog.tsx:63 +#: src/components/intents/GroupChatJoinDialog.tsx:415 +msgid "Join group chat" +msgstr "Join group chat" + +#: src/components/intents/GroupChatJoinDialog.tsx:146 +msgid "Join request rescinded." +msgstr "Join request rescinded." + #: src/components/StarterPack/QrCode.tsx:72 #: src/view/shell/NavSignupCard.tsx:41 msgid "Join the conversation" msgstr "" +#: src/components/intents/GroupChatJoinDialog.tsx:420 +msgid "Join this group chat" +msgstr "Join this group chat" + #: src/lib/interests.ts:63 msgid "Journalism" msgstr "" -#: src/view/com/composer/Composer.tsx:1342 -#: src/view/com/composer/Composer.tsx:1352 +#: src/view/com/composer/Composer.tsx:1324 +#: src/view/com/composer/Composer.tsx:1334 #: src/view/com/composer/drafts/DraftsButton.tsx:135 msgid "Keep editing" msgstr "" @@ -6136,7 +6280,7 @@ msgstr "" msgid "Labels on your content" msgstr "" -#: src/Navigation.tsx:215 +#: src/Navigation.tsx:217 msgid "Language Settings" msgstr "" @@ -6246,7 +6390,7 @@ msgid "Learn more." msgstr "" #: src/components/dms/LeaveConvoPrompt.tsx:49 -#: src/screens/Messages/ConversationSettings/index.tsx:527 +#: src/screens/Messages/ConversationSettings/index.tsx:526 msgid "Leave" msgstr "" @@ -6283,7 +6427,7 @@ msgstr "Leave conversation" msgid "Leave group chat" msgstr "Leave group chat" -#: src/screens/Messages/ConversationSettings/index.tsx:526 +#: src/screens/Messages/ConversationSettings/index.tsx:525 msgid "Leave this group chat" msgstr "Leave this group chat" @@ -6347,8 +6491,8 @@ msgstr "" msgid "Like this labeler" msgstr "" -#: src/Navigation.tsx:293 -#: src/Navigation.tsx:298 +#: src/Navigation.tsx:295 +#: src/Navigation.tsx:300 msgid "Liked by" msgstr "" @@ -6394,11 +6538,11 @@ msgstr "" msgid "Linear" msgstr "" -#: src/components/Lightbox/Lightbox.web.tsx:292 +#: src/components/Lightbox/Lightbox.web.tsx:296 msgid "Link copied to clipboard" msgstr "Link copied to clipboard" -#: src/Navigation.tsx:248 +#: src/Navigation.tsx:250 msgid "List" msgstr "" @@ -6484,7 +6628,7 @@ msgctxt "toast" msgid "List unmuted" msgstr "" -#: src/Navigation.tsx:169 +#: src/Navigation.tsx:171 #: src/view/screens/Lists.tsx:60 #: src/view/screens/Profile.tsx:233 #: src/view/screens/Profile.tsx:241 @@ -6580,7 +6724,7 @@ msgstr "" msgid "Loading..." msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:505 +#: src/screens/Messages/ConversationSettings/index.tsx:504 msgid "Lock" msgstr "Lock" @@ -6592,15 +6736,15 @@ msgstr "Lock group chat" msgid "Lock group chat?" msgstr "Lock group chat?" -#: src/screens/Messages/ConversationSettings/index.tsx:503 +#: src/screens/Messages/ConversationSettings/index.tsx:502 msgid "Lock this group chat" msgstr "Lock this group chat" -#: src/screens/Messages/ConversationSettings/index.tsx:505 +#: src/screens/Messages/ConversationSettings/index.tsx:504 msgid "Locked" msgstr "Locked" -#: src/Navigation.tsx:318 +#: src/Navigation.tsx:320 msgid "Log" msgstr "" @@ -6712,7 +6856,7 @@ msgid "Media that may be disturbing or inappropriate for some audiences." msgstr "" #. The heading above the list of chat members. -#: src/screens/Messages/ConversationSettings/MembersAndRequests.tsx:29 +#: src/screens/Messages/ConversationSettings/MembersAndRequests.tsx:34 msgid "Members" msgstr "Members" @@ -6798,7 +6942,7 @@ msgstr "Message is too long ({graphemeCount}/{MAX_DM_GRAPHEME_LENGTH})" msgid "Message options" msgstr "" -#: src/Navigation.tsx:748 +#: src/Navigation.tsx:755 msgid "Messages" msgstr "" @@ -6827,7 +6971,7 @@ msgstr "" msgid "Missing media" msgstr "" -#: src/Navigation.tsx:174 +#: src/Navigation.tsx:176 #: src/screens/Moderation/index.tsx:100 msgid "Moderation" msgstr "" @@ -6871,7 +7015,7 @@ msgstr "" msgid "Moderation lists" msgstr "" -#: src/Navigation.tsx:179 +#: src/Navigation.tsx:181 #: src/view/screens/ModerationModlists.tsx:60 msgid "Moderation Lists" msgstr "" @@ -6880,7 +7024,7 @@ msgstr "" msgid "moderation settings" msgstr "" -#: src/Navigation.tsx:308 +#: src/Navigation.tsx:310 msgid "Moderation states" msgstr "" @@ -6926,7 +7070,7 @@ msgstr "" msgid "Music" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:467 +#: src/screens/Messages/ConversationSettings/index.tsx:466 msgid "Mute" msgstr "Mute" @@ -6971,7 +7115,7 @@ msgstr "" msgid "Mute these accounts?" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:465 +#: src/screens/Messages/ConversationSettings/index.tsx:464 msgid "Mute this group chat" msgstr "Mute this group chat" @@ -7009,7 +7153,7 @@ msgstr "" msgid "Mute words & tags" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:467 +#: src/screens/Messages/ConversationSettings/index.tsx:466 msgid "Muted" msgstr "Muted" @@ -7017,7 +7161,7 @@ msgstr "Muted" msgid "Muted accounts" msgstr "" -#: src/Navigation.tsx:184 +#: src/Navigation.tsx:186 #: src/view/screens/ModerationMutedAccounts.tsx:107 msgid "Muted Accounts" msgstr "" @@ -7124,19 +7268,19 @@ msgid "New chat" msgstr "" #. placeholder {0}: createSanitizedDisplayName(members[0]) -#: src/screens/Messages/components/MessagesListGroupInfoPanel.tsx:61 +#: src/screens/Messages/components/MessagesListGroupInfoPanel.tsx:58 msgid "New chat with {0}" msgstr "New chat with {0}" #. placeholder {0}: createSanitizedDisplayName(members[0]) #. placeholder {1}: createSanitizedDisplayName(members[1]) -#: src/screens/Messages/components/MessagesListGroupInfoPanel.tsx:65 +#: src/screens/Messages/components/MessagesListGroupInfoPanel.tsx:62 msgid "New chat with {0} and {1}" msgstr "New chat with {0} and {1}" #. placeholder {0}: createSanitizedDisplayName(members[0]) #. placeholder {1}: createSanitizedDisplayName(members[1]) -#: src/screens/Messages/components/MessagesListGroupInfoPanel.tsx:73 +#: src/screens/Messages/components/MessagesListGroupInfoPanel.tsx:70 msgid "New chat with {0}, {1}, and {memberCount, plural, one {{memberCount} more} other {{memberCount} more}}." msgstr "New chat with {0}, {1}, and {memberCount, plural, one {{memberCount} more} other {{memberCount} more}}." @@ -7163,8 +7307,8 @@ msgstr "New group chat" #. Button used to create a new group chat. #. Button used to create a new group chat. -#: src/components/dms/InitiateChatFlow.tsx:743 -#: src/components/dms/InitiateChatFlow.tsx:777 +#: src/components/dms/InitiateChatFlow.tsx:744 +#: src/components/dms/InitiateChatFlow.tsx:778 msgctxt "action" msgid "New group chat" msgstr "New group chat" @@ -7236,7 +7380,7 @@ msgstr "" #: src/components/contacts/screens/ViewMatches.tsx:395 #: src/components/contacts/screens/ViewMatches.tsx:410 #: src/components/dms/AddMembersFlow.tsx:308 -#: src/components/dms/InitiateChatFlow.tsx:461 +#: src/components/dms/InitiateChatFlow.tsx:462 #: src/screens/Login/ForgotPasswordForm.tsx:149 #: src/screens/Login/ForgotPasswordForm.tsx:156 #: src/screens/Login/SetNewPasswordForm.tsx:186 @@ -7409,7 +7553,7 @@ msgstr "" #: src/components/dialogs/SearchablePeopleList.tsx:250 #: src/components/dms/AddMembersFlow.tsx:240 -#: src/components/dms/InitiateChatFlow.tsx:346 +#: src/components/dms/InitiateChatFlow.tsx:347 #: src/components/ProgressGuide/FollowDialog.tsx:221 msgid "No results" msgstr "" @@ -7491,7 +7635,7 @@ msgstr "" msgid "Not followed by anyone you’re following" msgstr "Not followed by anyone you’re following" -#: src/Navigation.tsx:164 +#: src/Navigation.tsx:166 #: src/view/screens/Profile.tsx:132 msgid "Not Found" msgstr "" @@ -7518,8 +7662,8 @@ msgid "Nothing saved yet" msgstr "" #: src/components/dialogs/NotificationSettingsDialog.tsx:64 -#: src/Navigation.tsx:435 -#: src/Navigation.tsx:509 +#: src/Navigation.tsx:437 +#: src/Navigation.tsx:516 #: src/view/screens/Notifications.tsx:134 msgid "Notification settings" msgstr "" @@ -7529,8 +7673,8 @@ msgstr "" msgid "Notification sounds" msgstr "" -#: src/Navigation.tsx:504 -#: src/Navigation.tsx:743 +#: src/Navigation.tsx:511 +#: src/Navigation.tsx:750 #: src/screens/Notifications/ActivityList.tsx:31 #: src/screens/Settings/NotificationSettings/index.tsx:104 #: src/screens/Settings/Settings.tsx:197 @@ -7579,7 +7723,7 @@ msgstr "" #: src/components/BotAccountAlert.tsx:52 #: src/components/BotAccountAlert.tsx:57 -#: src/components/dms/InitiateChatFlow.tsx:676 +#: src/components/dms/InitiateChatFlow.tsx:677 #: src/components/dms/MessageItem.tsx:659 #: src/screens/Login/PasswordUpdatedForm.tsx:37 #: src/screens/PostThread/components/ThreadItemAnchor.tsx:661 @@ -7613,27 +7757,27 @@ msgstr "One of the selected recipients does not allow group chats." msgid "One of the selected recipients has blocked you and cannot be messaged." msgstr "One of the selected recipients has blocked you and cannot be messaged." -#: src/view/com/composer/Composer.tsx:793 +#: src/view/com/composer/Composer.tsx:787 msgid "One or more GIFs is missing alt text." msgstr "" -#: src/view/com/composer/Composer.tsx:790 +#: src/view/com/composer/Composer.tsx:784 msgid "One or more images is missing alt text." msgstr "" -#: src/view/com/composer/SelectMediaButton.tsx:411 +#: src/view/com/composer/SelectMediaButton.tsx:415 msgid "One or more of your selected files are not supported." msgstr "" -#: src/view/com/composer/SelectMediaButton.tsx:434 -msgid "One or more of your selected files are too large. Maximum size is 100 MB." -msgstr "" +#: src/view/com/composer/SelectMediaButton.tsx:438 +msgid "One or more of your selected files are too large. Maximum size is {VIDEO_MAX_SIZE_MB} MB." +msgstr "One or more of your selected files are too large. Maximum size is {VIDEO_MAX_SIZE_MB} MB." -#: src/view/com/composer/Composer.tsx:595 +#: src/view/com/composer/Composer.tsx:589 msgid "One or more posts are too long to save as a draft. {MAX_DRAFT_GRAPHEME_LENGTH, plural, one {The maximum number of characters is # character.} other {The maximum number of characters is # characters.}}" msgstr "" -#: src/view/com/composer/Composer.tsx:800 +#: src/view/com/composer/Composer.tsx:794 msgid "One or more videos is missing alt text." msgstr "" @@ -7642,6 +7786,18 @@ msgstr "" msgid "Only {0} can reply." msgstr "" +#: src/screens/Messages/JoinRequests.tsx:196 +msgid "Only admins can accept join requests." +msgstr "Only admins can accept join requests." + +#: src/screens/Messages/JoinRequests.tsx:228 +msgid "Only admins can ignore join requests." +msgstr "Only admins can ignore join requests." + +#: src/components/intents/GroupChatJoinDialog.tsx:124 +msgid "Only followers can join this group chat." +msgstr "Only followers can join this group chat." + #: src/screens/Settings/ActivityPrivacySettings.tsx:121 #: src/screens/Settings/ActivityPrivacySettings.tsx:126 #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:158 @@ -7652,6 +7808,15 @@ msgstr "" msgid "Only image files are supported" msgstr "" +#. placeholder {0}: createSanitizedDisplayName( data.joinLinkPreviews[0].owner, true, moderateProfile( data.joinLinkPreviews[0].owner, moderationOpts, ).ui('displayName'), ) +#: src/screens/Messages/JoinRequest.tsx:207 +msgid "Only people {0} follows can join." +msgstr "Only people {0} follows can join." + +#: src/components/intents/GroupChatJoinDialog.tsx:268 +msgid "Only people the chat owner follows can join" +msgstr "Only people the chat owner follows can join" + #: src/view/com/composer/videos/SubtitleFilePicker.tsx:41 msgid "Only WebVTT (.vtt) files are supported" msgstr "" @@ -7696,7 +7861,7 @@ msgstr "" #: src/screens/Messages/components/MessageComposer.tsx:176 #: src/screens/Messages/components/MessageInput.web.tsx:148 -#: src/view/com/composer/Composer.tsx:2044 +#: src/view/com/composer/Composer.tsx:2026 msgid "Open emoji picker" msgstr "" @@ -7717,6 +7882,10 @@ msgstr "" msgid "Open Germ DM" msgstr "" +#: src/components/intents/GroupChatJoinDialog.tsx:399 +msgid "Open group chat" +msgstr "Open group chat" + #: src/components/dms/MessagesListHeader.tsx:181 #: src/components/dms/MessagesListHeader.tsx:220 msgid "Open group chat settings" @@ -7774,6 +7943,10 @@ msgstr "" msgid "Open system log" msgstr "" +#: src/components/intents/GroupChatJoinDialog.tsx:400 +msgid "Open this group chat" +msgstr "Open this group chat" + #. placeholder {0}: feedInfo.displayName #: src/view/shell/desktop/Feeds.tsx:185 msgid "Opens {0} feed" @@ -7816,21 +7989,23 @@ msgid "Opens device camera" msgstr "" #. Accessibility hint for button in composer to add images, a video, or a GIF to a post. Maximum number of images that can be selected is currently 4 but may change. -#: src/view/com/composer/SelectMediaButton.tsx:505 +#: src/view/com/composer/SelectMediaButton.tsx:509 msgid "Opens device gallery to select up to {MAX_IMAGES, plural, other {# images}}, or a single video or GIF." msgstr "" +#: src/screens/Messages/JoinRequest.tsx:295 #: src/view/com/auth/SplashScreen.tsx:102 #: src/view/com/auth/SplashScreen.web.tsx:110 msgid "Opens flow to create a new Bluesky account" msgstr "" +#: src/screens/Messages/JoinRequest.tsx:281 #: src/view/com/auth/SplashScreen.tsx:120 #: src/view/com/auth/SplashScreen.web.tsx:124 msgid "Opens flow to sign in to your existing Bluesky account" msgstr "" -#: src/components/images/Gallery/index.tsx:428 +#: src/components/images/Gallery/index.tsx:437 msgid "Opens full image" msgstr "Opens full image" @@ -8031,12 +8206,12 @@ msgid "People {ownerName} follows can request to join" msgstr "People {ownerName} follows can request to join" #. placeholder {0}: route.params.name -#: src/Navigation.tsx:235 +#: src/Navigation.tsx:237 msgid "People followed by @{0}" msgstr "" #. placeholder {0}: route.params.name -#: src/Navigation.tsx:228 +#: src/Navigation.tsx:230 msgid "People following @{0}" msgstr "" @@ -8198,7 +8373,7 @@ msgstr "" msgid "Please complete the verification captcha." msgstr "" -#: src/view/com/composer/state/video.ts:454 +#: src/view/com/composer/state/video.ts:439 msgid "Please confirm your email address to upload videos." msgstr "" @@ -8337,7 +8512,7 @@ msgstr "" msgid "Porn" msgstr "" -#: src/view/com/composer/Composer.tsx:1693 +#: src/view/com/composer/Composer.tsx:1675 msgctxt "action" msgid "Post" msgstr "" @@ -8357,12 +8532,12 @@ msgstr "" msgid "Post a video" msgstr "" -#: src/view/com/composer/Composer.tsx:1691 +#: src/view/com/composer/Composer.tsx:1673 msgctxt "action" msgid "Post All" msgstr "" -#: src/view/com/composer/Composer.tsx:1351 +#: src/view/com/composer/Composer.tsx:1333 msgid "Post anyway" msgstr "Post anyway" @@ -8371,10 +8546,10 @@ msgid "Post blocked" msgstr "" #. placeholder {0}: route.params.name -#: src/Navigation.tsx:261 -#: src/Navigation.tsx:268 -#: src/Navigation.tsx:275 -#: src/Navigation.tsx:282 +#: src/Navigation.tsx:263 +#: src/Navigation.tsx:270 +#: src/Navigation.tsx:277 +#: src/Navigation.tsx:284 msgid "Post by @{0}" msgstr "" @@ -8383,7 +8558,7 @@ msgctxt "toast" msgid "Post deleted" msgstr "" -#: src/lib/api/index.ts:193 +#: src/lib/api/index.ts:186 msgid "Post failed to upload. Please check your Internet connection and try again." msgstr "" @@ -8408,7 +8583,7 @@ msgstr "" msgid "Post interaction settings" msgstr "" -#: src/Navigation.tsx:195 +#: src/Navigation.tsx:197 #: src/screens/ModerationInteractionSettings/index.tsx:35 msgid "Post Interaction Settings" msgstr "" @@ -8418,8 +8593,8 @@ msgstr "" msgid "Post language selection" msgstr "" -#: src/screens/Messages/components/InviteLinkDialog.tsx:354 -#: src/screens/Messages/components/InviteLinkDialog.tsx:366 +#: src/screens/Messages/components/InviteLinkDialog.tsx:371 +#: src/screens/Messages/components/InviteLinkDialog.tsx:383 msgid "Post link" msgstr "Post link" @@ -8477,6 +8652,7 @@ msgstr "" #: src/components/Error.tsx:61 #: src/components/Lists.tsx:104 #: src/screens/Messages/components/MessageListError.tsx:23 +#: src/screens/Messages/JoinRequests.tsx:350 #: src/screens/Signup/BackNextButtons.tsx:48 msgid "Press to retry" msgstr "" @@ -8508,8 +8684,8 @@ msgstr "" msgid "Privacy and security" msgstr "" -#: src/Navigation.tsx:412 -#: src/Navigation.tsx:420 +#: src/Navigation.tsx:414 +#: src/Navigation.tsx:422 #: src/screens/Settings/ActivityPrivacySettings.tsx:41 #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:45 msgid "Privacy and Security" @@ -8521,7 +8697,7 @@ msgstr "" #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:36 #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:103 -#: src/Navigation.tsx:328 +#: src/Navigation.tsx:330 #: src/screens/Settings/AboutSettings.tsx:95 #: src/screens/Settings/AboutSettings.tsx:98 #: src/view/screens/PrivacyPolicy.tsx:25 @@ -8534,15 +8710,15 @@ msgstr "" msgid "Privacy violation of a minor" msgstr "" -#: src/view/com/composer/Composer.tsx:2478 +#: src/view/com/composer/Composer.tsx:2460 msgid "Processing GIF..." msgstr "" -#: src/view/com/composer/Composer.tsx:2480 +#: src/view/com/composer/Composer.tsx:2462 msgid "Processing video..." msgstr "" -#: src/lib/api/index.ts:66 +#: src/lib/api/index.ts:60 msgid "Processing..." msgstr "" @@ -8583,22 +8759,22 @@ msgid "Public, sharable lists of users to mute or block in bulk." msgstr "" #. Accessibility label for button to publish a single post -#: src/view/com/composer/Composer.tsx:1677 +#: src/view/com/composer/Composer.tsx:1659 msgid "Publish post" msgstr "" #. Accessibility label for button to publish multiple posts in a thread -#: src/view/com/composer/Composer.tsx:1672 +#: src/view/com/composer/Composer.tsx:1654 msgid "Publish posts" msgstr "" #. Accessibility label for button to publish multiple replies in a thread -#: src/view/com/composer/Composer.tsx:1661 +#: src/view/com/composer/Composer.tsx:1643 msgid "Publish replies" msgstr "" #. Accessibility label for button to publish a single reply -#: src/view/com/composer/Composer.tsx:1666 +#: src/view/com/composer/Composer.tsx:1648 msgid "Publish reply" msgstr "" @@ -8677,11 +8853,11 @@ msgstr "" msgid "Re-attach quote" msgstr "" -#: src/screens/Messages/components/InviteLinkDialog.tsx:384 +#: src/screens/Messages/components/InviteLinkDialog.tsx:401 msgid "Re-enable invite link" msgstr "Re-enable invite link" -#: src/screens/Messages/components/InviteLinkDialog.tsx:391 +#: src/screens/Messages/components/InviteLinkDialog.tsx:408 msgid "Re-enable link" msgstr "Re-enable link" @@ -9047,7 +9223,7 @@ msgstr "" msgid "Replies to this post are disabled." msgstr "" -#: src/view/com/composer/Composer.tsx:1689 +#: src/view/com/composer/Composer.tsx:1671 msgctxt "action" msgid "Reply" msgstr "" @@ -9087,7 +9263,7 @@ msgstr "" #: src/components/dms/MessageContextMenu.tsx:193 #: src/features/liveNow/components/LiveStatusDialog.tsx:266 -#: src/screens/Messages/ConversationSettings/index.tsx:518 +#: src/screens/Messages/ConversationSettings/index.tsx:517 msgid "Report" msgstr "" @@ -9152,7 +9328,7 @@ msgstr "" msgid "Report this feed" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:517 +#: src/screens/Messages/ConversationSettings/index.tsx:516 msgid "Report this group chat" msgstr "Report this group chat" @@ -9232,16 +9408,42 @@ msgstr "" msgid "Reposts of your reposts" msgstr "" +#: src/components/intents/GroupChatJoinDialog.tsx:414 +msgid "Request access to group chat" +msgstr "Request access to group chat" + +#: src/components/intents/GroupChatJoinDialog.tsx:419 +msgid "Request access to join this group chat" +msgstr "Request access to join this group chat" + +#: src/screens/Messages/JoinRequests.tsx:178 +msgid "Request approved." +msgstr "Request approved." + #: src/screens/Settings/components/ChangePasswordDialog.tsx:226 #: src/screens/Settings/components/ChangePasswordDialog.tsx:232 msgid "Request code" msgstr "" +#: src/screens/Messages/JoinRequests.tsx:210 +msgid "Request ignored." +msgstr "Request ignored." + +#: src/components/intents/GroupChatJoinDialog.tsx:252 +msgid "Request to join" +msgstr "Request to join" + #. Incoming message requests #: src/screens/Messages/components/InboxRequests.tsx:24 msgid "Requests" msgstr "Requests" +#: src/Navigation.tsx:495 +#: src/screens/Messages/JoinRequests.tsx:58 +#: src/screens/Messages/JoinRequests.tsx:421 +msgid "Requests to join" +msgstr "Requests to join" + #: src/screens/Settings/AccessibilitySettings.tsx:59 #: src/screens/Settings/AccessibilitySettings.tsx:64 msgid "Require alt text before posting" @@ -9259,6 +9461,10 @@ msgstr "" msgid "Required in your region" msgstr "" +#: src/components/intents/GroupChatJoinDialog.tsx:272 +msgid "Rescind request" +msgstr "Rescind request" + #: src/components/dialogs/EmailDialog/components/ResendEmailText.tsx:39 msgid "Resend" msgstr "" @@ -9333,6 +9539,7 @@ msgstr "" #: src/screens/Messages/ChatList.tsx:354 #: src/screens/Messages/components/MessageListError.tsx:24 #: src/screens/Messages/Inbox.tsx:220 +#: src/screens/Messages/JoinRequests.tsx:356 #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:268 #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:271 #: src/screens/Onboarding/StepSuggestedStarterpacks/index.tsx:92 @@ -9410,27 +9617,29 @@ msgstr "" #: src/screens/SavedFeeds.tsx:124 #: src/screens/SavedFeeds.tsx:311 #: src/screens/SavedFeeds.tsx:315 -#: src/view/com/composer/Composer.tsx:1332 +#: src/view/com/composer/Composer.tsx:1314 #: src/view/com/composer/drafts/DraftsButton.tsx:125 msgid "Save changes" msgstr "" -#: src/view/com/composer/Composer.tsx:1304 +#: src/view/com/composer/Composer.tsx:1286 #: src/view/com/composer/drafts/DraftsButton.tsx:93 msgid "Save changes?" msgstr "" -#: src/view/com/composer/Composer.tsx:1332 +#: src/view/com/composer/Composer.tsx:1314 #: src/view/com/composer/drafts/DraftsButton.tsx:125 msgid "Save draft" msgstr "" -#: src/view/com/composer/Composer.tsx:1306 +#: src/view/com/composer/Composer.tsx:1288 #: src/view/com/composer/drafts/DraftsButton.tsx:95 msgid "Save draft?" msgstr "" #: src/components/Lightbox/chrome/ImageMenu.tsx:99 +#: src/components/MediaPreview.tsx:196 +#: src/components/Post/Embed/ImageContextMenu.tsx:70 #: src/components/StarterPack/ShareDialog.tsx:144 #: src/components/StarterPack/ShareDialog.tsx:150 msgid "Save image" @@ -9466,7 +9675,7 @@ msgid "Saved Feeds" msgstr "" #: src/components/dialogs/nuxs/BookmarksAnnouncement.tsx:144 -#: src/Navigation.tsx:548 +#: src/Navigation.tsx:555 #: src/screens/Bookmarks/index.tsx:59 msgid "Saved Posts" msgstr "" @@ -9518,7 +9727,7 @@ msgstr "" #. placeholder {0}: profile.handle #. placeholder {0}: route.params.name -#: src/Navigation.tsx:254 +#: src/Navigation.tsx:256 #: src/screens/Profile/ProfileSearch.tsx:37 msgid "Search @{0}'s posts" msgstr "" @@ -9759,7 +9968,7 @@ msgstr "" msgid "Select GIF \"{0}\"" msgstr "" -#: src/components/dms/InitiateChatFlow.tsx:668 +#: src/components/dms/InitiateChatFlow.tsx:669 msgid "Select group chat members" msgstr "Select group chat members" @@ -9839,7 +10048,7 @@ msgstr "" msgid "Select your preferred notification channels" msgstr "" -#: src/view/com/composer/SelectMediaButton.tsx:414 +#: src/view/com/composer/SelectMediaButton.tsx:418 msgid "Selecting multiple media types is not supported." msgstr "" @@ -9946,7 +10155,7 @@ msgstr "" msgid "Sets email for password reset" msgstr "" -#: src/Navigation.tsx:210 +#: src/Navigation.tsx:212 #: src/screens/Settings/Settings.tsx:98 #: src/view/shell/desktop/LeftNav.tsx:754 #: src/view/shell/Drawer.tsx:612 @@ -10010,10 +10219,12 @@ msgstr "" msgid "Sexually Suggestive" msgstr "" +#: src/components/MediaPreview.tsx:202 +#: src/components/Post/Embed/ImageContextMenu.tsx:74 #: src/components/StarterPack/QrCodeDialog.tsx:195 #: src/screens/Hashtag.tsx:130 -#: src/screens/Messages/components/InviteLinkDialog.tsx:370 -#: src/screens/Messages/components/InviteLinkDialog.tsx:377 +#: src/screens/Messages/components/InviteLinkDialog.tsx:387 +#: src/screens/Messages/components/InviteLinkDialog.tsx:394 #: src/screens/StarterPack/StarterPackScreen.tsx:447 #: src/screens/Topic.tsx:90 msgid "Share" @@ -10029,8 +10240,8 @@ msgid "Share author DID" msgstr "" #: src/components/Lightbox/chrome/ImageMenu.tsx:94 -#: src/components/Lightbox/Lightbox.web.tsx:273 -#: src/components/Lightbox/Lightbox.web.tsx:299 +#: src/components/Lightbox/Lightbox.web.tsx:277 +#: src/components/Lightbox/Lightbox.web.tsx:303 msgid "Share image" msgstr "Share image" @@ -10082,7 +10293,7 @@ msgstr "" msgid "Share your contacts to find friends" msgstr "" -#: src/Navigation.tsx:313 +#: src/Navigation.tsx:315 msgid "Shared Preferences Tester" msgstr "" @@ -10228,6 +10439,8 @@ msgstr "" #: src/screens/Login/LoginForm.tsx:179 #: src/screens/Login/LoginForm.tsx:350 #: src/screens/Login/LoginForm.tsx:356 +#: src/screens/Messages/JoinRequest.tsx:280 +#: src/screens/Messages/JoinRequest.tsx:286 #: src/screens/Search/SearchResults.tsx:316 #: src/view/com/auth/SplashScreen.tsx:118 #: src/view/com/auth/SplashScreen.tsx:124 @@ -10260,6 +10473,10 @@ msgstr "" msgid "Sign in or create your account to join the conversation!" msgstr "" +#: src/screens/Messages/JoinRequest.tsx:205 +msgid "Sign in to accept invite." +msgstr "Sign in to accept invite." + #: src/components/AccountList.tsx:70 msgid "Sign in to account that is not listed" msgstr "" @@ -10268,6 +10485,10 @@ msgstr "" msgid "Sign in to Bluesky or create a new account" msgstr "" +#: src/screens/Messages/JoinRequest.tsx:204 +msgid "Sign in to request access to this group chat." +msgstr "Sign in to request access to this group chat." + #: src/components/PostControls/PostMenu/PostMenuItems.tsx:571 #: src/components/PostControls/PostMenu/PostMenuItems.tsx:573 msgid "Sign in to view post" @@ -10322,7 +10543,7 @@ msgstr "" msgid "Skip contact sharing and continue to the app" msgstr "" -#: src/view/com/composer/Composer.tsx:1349 +#: src/view/com/composer/Composer.tsx:1331 msgid "Skip empty posts?" msgstr "Skip empty posts?" @@ -10336,7 +10557,7 @@ msgstr "" msgid "Skip to next step" msgstr "" -#: src/components/images/Gallery/index.tsx:417 +#: src/components/images/Gallery/index.tsx:420 msgid "slide" msgstr "slide" @@ -10424,6 +10645,7 @@ msgstr "" #: src/screens/Messages/Conversation.tsx:135 #: src/screens/Messages/ConversationSettings/index.tsx:112 +#: src/screens/Messages/JoinRequests.tsx:87 msgid "Something went wrong" msgstr "" @@ -10513,17 +10735,17 @@ msgstr "" msgid "Start adding people!" msgstr "" -#: src/components/dms/InitiateChatFlow.tsx:669 +#: src/components/dms/InitiateChatFlow.tsx:670 msgid "Start chat" msgstr "Start chat" #: src/components/dialogs/SearchablePeopleList.tsx:428 -#: src/components/dms/InitiateChatFlow.tsx:817 +#: src/components/dms/InitiateChatFlow.tsx:818 msgid "Start chat with {displayName}" msgstr "" -#: src/Navigation.tsx:519 -#: src/Navigation.tsx:524 +#: src/Navigation.tsx:526 +#: src/Navigation.tsx:531 #: src/screens/StarterPack/Wizard/index.tsx:197 msgid "Starter Pack" msgstr "" @@ -10585,7 +10807,7 @@ msgstr "" msgid "Stored as part of a secure code for matching with others" msgstr "" -#: src/Navigation.tsx:303 +#: src/Navigation.tsx:305 #: src/screens/Settings/Settings.tsx:456 msgid "Storybook" msgstr "" @@ -10667,12 +10889,16 @@ msgstr "" msgid "Success!" msgstr "" +#: src/components/intents/GroupChatJoinDialog.tsx:100 +msgid "Successfully joined the group chat!" +msgstr "Successfully joined the group chat!" + #: src/components/verification/VerificationCreatePrompt.tsx:37 msgid "Successfully verified" msgstr "" #: src/components/dms/AddMembersFlow.tsx:226 -#: src/components/dms/InitiateChatFlow.tsx:325 +#: src/components/dms/InitiateChatFlow.tsx:326 msgid "Suggested" msgstr "Suggested" @@ -10701,7 +10927,7 @@ msgctxt "Name of app icon variant" msgid "Sunset" msgstr "" -#: src/Navigation.tsx:323 +#: src/Navigation.tsx:325 #: src/view/screens/Support.tsx:25 #: src/view/screens/Support.tsx:28 msgid "Support" @@ -10855,7 +11081,7 @@ msgstr "" #: src/components/dialogs/BirthDateSettings.tsx:181 #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:31 #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:98 -#: src/Navigation.tsx:333 +#: src/Navigation.tsx:335 #: src/screens/Settings/AboutSettings.tsx:87 #: src/screens/Settings/AboutSettings.tsx:90 #: src/view/screens/TermsOfService.tsx:25 @@ -10980,6 +11206,11 @@ msgstr "" msgid "The laws in your region require you to verify you're an adult to access certain features. Tap to learn more." msgstr "" +#: src/components/intents/GroupChatJoinDialog.tsx:134 +#: src/screens/Messages/JoinRequests.tsx:201 +msgid "The member limit has been reached." +msgstr "The member limit has been reached." + #: src/view/com/composer/select-language/SuggestedLanguage.tsx:400 msgid "The post you’re replying to was marked as being written in {suggestedLanguageName} by its author. Would you like to reply in <0>{suggestedLanguageName}?" msgstr "The post you’re replying to was marked as being written in {suggestedLanguageName} by its author. Would you like to reply in <0>{suggestedLanguageName}?" @@ -10988,10 +11219,10 @@ msgstr "The post you’re replying to was marked as being written in {suggestedL msgid "The Privacy Policy has been moved to <0/>" msgstr "" -#: src/view/com/composer/state/video.ts:407 -#: src/view/com/composer/state/video.ts:451 -msgid "The selected video is larger than {videoSize} MB. Please try again with a smaller file." -msgstr "The selected video is larger than {videoSize} MB. Please try again with a smaller file." +#: src/view/com/composer/state/video.ts:397 +#: src/view/com/composer/state/video.ts:436 +msgid "The selected video is larger than {VIDEO_MAX_SIZE_MB} MB. Please try again with a smaller file." +msgstr "The selected video is larger than {VIDEO_MAX_SIZE_MB} MB. Please try again with a smaller file." #: src/lib/hooks/useCleanError.ts:41 #: src/lib/strings/errors.ts:19 @@ -11032,7 +11263,7 @@ msgstr "" msgid "There is a limit to how often you can change your birthdate. You may need to wait a day or two before updating it again." msgstr "" -#: src/screens/Messages/components/InviteLinkDialog.tsx:476 +#: src/screens/Messages/components/InviteLinkDialog.tsx:487 msgid "There is no invite link for this group chat." msgstr "There is no invite link for this group chat." @@ -11046,6 +11277,8 @@ msgid "There was a problem loading GIFs. Check your connection and try again." msgstr "There was a problem loading GIFs. Check your connection and try again." #: src/components/contacts/screens/GetContacts.tsx:147 +#: src/components/intents/GroupChatJoinDialog.tsx:118 +#: src/components/intents/GroupChatJoinDialog.tsx:152 msgid "There was a problem with your internet connection, please try again" msgstr "" @@ -11202,6 +11435,10 @@ msgstr "" msgid "This chat has ended" msgstr "This chat has ended" +#: src/components/intents/GroupChatJoinDialog.tsx:263 +msgid "This chat is full" +msgstr "This chat is full" + #: src/screens/Messages/components/ChatListItem.tsx:375 #: src/screens/Messages/components/ChatLocked.tsx:61 msgid "This chat is locked" @@ -11241,6 +11478,10 @@ msgstr "" msgid "This content is not viewable without a Bluesky account." msgstr "" +#: src/components/intents/GroupChatJoinDialog.tsx:120 +msgid "This conversation is locked." +msgstr "This conversation is locked." + #: src/screens/Messages/components/ChatListItem.tsx:155 msgid "This conversation is with a deleted or a deactivated account. Press for options" msgstr "" @@ -11299,6 +11540,18 @@ msgstr "This image could not be used. Try a different format like .jpg or .png." msgid "This information is private and not shared with other users." msgstr "" +#: src/components/intents/GroupChatJoinDialog.tsx:130 +msgid "This invite link has been disabled." +msgstr "This invite link has been disabled." + +#: src/screens/Messages/JoinRequest.tsx:83 +msgid "This invite link has expired" +msgstr "This invite link has expired" + +#: src/components/intents/GroupChatJoinDialog.tsx:194 +msgid "This invite link is invalid" +msgstr "This invite link is invalid" + #: src/view/screens/Debug.tsx:327 msgid "This is an empty state" msgstr "" @@ -11385,7 +11638,7 @@ msgstr "" msgid "This post will be hidden from feeds and threads. This cannot be undone." msgstr "" -#: src/view/com/composer/Composer.tsx:963 +#: src/view/com/composer/Composer.tsx:945 msgid "This post's author has disabled quote posts." msgstr "" @@ -11398,6 +11651,7 @@ msgid "This reply will be sorted into a hidden section at the bottom of your thr msgstr "" #: src/screens/Messages/ConversationSettings/index.tsx:132 +#: src/screens/Messages/JoinRequests.tsx:111 msgid "This screen is only available for group conversations." msgstr "This screen is only available for group conversations." @@ -11505,7 +11759,7 @@ msgstr "" msgid "Threaded" msgstr "" -#: src/Navigation.tsx:366 +#: src/Navigation.tsx:368 msgid "Threads Preferences" msgstr "" @@ -11577,7 +11831,7 @@ msgstr "" msgid "Top replies first" msgstr "" -#: src/Navigation.tsx:477 +#: src/Navigation.tsx:479 msgid "Topic" msgstr "" @@ -11694,6 +11948,10 @@ msgstr "" msgid "Unable to delete" msgstr "" +#: src/screens/Messages/JoinRequests.tsx:346 +msgid "Unable to fetch join requests." +msgstr "Unable to fetch join requests." + #: src/components/dms/dialogs/NewChatDialog.tsx:109 msgid "Unable to find a selected recipient." msgstr "Unable to find a selected recipient." @@ -11849,7 +12107,7 @@ msgstr "" msgid "Unlock chat" msgstr "Unlock chat" -#: src/screens/Messages/ConversationSettings/index.tsx:502 +#: src/screens/Messages/ConversationSettings/index.tsx:501 msgid "Unlock this group chat" msgstr "Unlock this group chat" @@ -11886,7 +12144,7 @@ msgstr "" msgid "Unmute list" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:464 +#: src/screens/Messages/ConversationSettings/index.tsx:463 msgid "Unmute this group chat" msgstr "Unmute this group chat" @@ -11965,7 +12223,7 @@ msgstr "" msgid "Unsupported clipboard content" msgstr "Unsupported clipboard content" -#: src/view/com/composer/Composer.tsx:1442 +#: src/view/com/composer/Composer.tsx:1424 msgid "Unsupported video type: {mimeType}" msgstr "" @@ -11985,9 +12243,9 @@ msgstr "" msgid "Update email" msgstr "" -#: src/screens/Messages/components/InviteLinkDialog.tsx:205 -#: src/screens/Messages/components/InviteLinkDialog.tsx:243 -#: src/screens/Messages/components/InviteLinkDialog.tsx:267 +#: src/screens/Messages/components/InviteLinkDialog.tsx:217 +#: src/screens/Messages/components/InviteLinkDialog.tsx:255 +#: src/screens/Messages/components/InviteLinkDialog.tsx:283 msgid "Update invite link" msgstr "Update invite link" @@ -12048,20 +12306,20 @@ msgstr "" msgid "Upload from Library" msgstr "" -#: src/view/com/composer/Composer.tsx:2471 +#: src/view/com/composer/Composer.tsx:2453 msgid "Uploading GIF..." msgstr "" -#: src/lib/api/index.ts:338 +#: src/lib/api/index.ts:322 msgid "Uploading images..." msgstr "" -#: src/lib/api/index.ts:409 -#: src/lib/api/index.ts:433 +#: src/lib/api/index.ts:390 +#: src/lib/api/index.ts:414 msgid "Uploading link thumbnail..." msgstr "" -#: src/view/com/composer/Composer.tsx:2473 +#: src/view/com/composer/Composer.tsx:2455 msgid "Uploading video..." msgstr "" @@ -12208,7 +12466,7 @@ msgstr "" msgid "Verification settings" msgstr "" -#: src/Navigation.tsx:203 +#: src/Navigation.tsx:205 #: src/screens/Moderation/VerificationSettings.tsx:34 msgid "Verification Settings" msgstr "" @@ -12311,11 +12569,11 @@ msgstr "" msgid "Video" msgstr "" -#: src/view/com/composer/state/video.ts:364 +#: src/view/com/composer/state/video.ts:359 msgid "Video failed to process" msgstr "" -#: src/Navigation.tsx:540 +#: src/Navigation.tsx:547 msgid "Video Feed" msgstr "" @@ -12350,7 +12608,7 @@ msgstr "" msgid "Video settings" msgstr "" -#: src/view/com/composer/Composer.tsx:2491 +#: src/view/com/composer/Composer.tsx:2473 msgid "Video uploaded" msgstr "" @@ -12363,11 +12621,11 @@ msgstr "" msgid "Videos" msgstr "" -#: src/view/com/composer/SelectMediaButton.tsx:428 +#: src/view/com/composer/SelectMediaButton.tsx:432 msgid "Videos must be less than 3 minutes long." msgstr "" -#: src/view/com/composer/Composer.tsx:1055 +#: src/view/com/composer/Composer.tsx:1037 msgctxt "Action to view the post the user just created" msgid "View" msgstr "" @@ -12434,7 +12692,7 @@ msgstr "" msgid "View full thread" msgstr "" -#: src/screens/Messages/ConversationSettings/MembersAndRequests.tsx:43 +#: src/screens/Messages/ConversationSettings/MembersAndRequests.tsx:48 msgid "View incoming group chat requests" msgstr "View incoming group chat requests" @@ -12453,7 +12711,7 @@ msgstr "" msgid "View more trending videos" msgstr "" -#: src/view/com/composer/Composer.tsx:1050 +#: src/view/com/composer/Composer.tsx:1032 msgid "View post" msgstr "" @@ -12481,7 +12739,7 @@ msgstr "View publication" msgid "View the avatar" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:489 +#: src/screens/Messages/ConversationSettings/index.tsx:488 msgid "View the invite link for this group chat" msgstr "View the invite link for this group chat" @@ -12527,8 +12785,8 @@ msgstr "" msgid "View your verifications" msgstr "" -#: src/components/images/AutoSizedImage.tsx:207 -#: src/components/images/AutoSizedImage.tsx:239 +#: src/components/images/AutoSizedImage.tsx:220 +#: src/components/images/AutoSizedImage.tsx:252 msgid "Views full image" msgstr "" @@ -12600,6 +12858,10 @@ msgstr "" msgid "We couldn't load this conversation" msgstr "" +#: src/screens/Messages/JoinRequests.tsx:88 +msgid "We couldn’t load this conversation’s join requests" +msgstr "We couldn’t load this conversation’s join requests" + #: src/screens/Messages/ConversationSettings/index.tsx:113 msgid "We couldn’t load this conversation’s settings" msgstr "We couldn’t load this conversation’s settings" @@ -12650,7 +12912,7 @@ msgstr "" msgid "We sent an email to <0>{0} containing a link. Please click on it to complete the email verification process." msgstr "" -#: src/view/com/composer/state/video.ts:434 +#: src/view/com/composer/state/video.ts:419 msgid "We were unable to determine if you are allowed to upload videos. Please try again." msgstr "" @@ -12745,7 +13007,7 @@ msgstr "We’re sorry, but your search could not be completed. Please try again msgid "We're sorry, you cannot access this screen at this time." msgstr "" -#: src/view/com/composer/Composer.tsx:961 +#: src/view/com/composer/Composer.tsx:943 msgid "We're sorry! The post you are replying to has been deleted." msgstr "" @@ -12796,7 +13058,7 @@ msgid "What do you want to call your starter pack?" msgstr "" #: src/view/com/auth/SplashScreen.web.tsx:98 -#: src/view/com/composer/Composer.tsx:1402 +#: src/view/com/composer/Composer.tsx:1384 #: src/view/com/feeds/ComposerPrompt.tsx:193 msgid "What's up?" msgstr "" @@ -12809,7 +13071,7 @@ msgstr "" msgid "Who can interact with this post?" msgstr "" -#: src/screens/Messages/components/InviteLinkDialog.tsx:216 +#: src/screens/Messages/components/InviteLinkDialog.tsx:227 msgid "Who can join this group chat and how" msgstr "Who can join this group chat and how" @@ -12882,7 +13144,7 @@ msgstr "Would you like to block this user and/or leave this conversation?" msgid "Would you like to save this as a draft before viewing your drafts?" msgstr "" -#: src/view/com/composer/Composer.tsx:1320 +#: src/view/com/composer/Composer.tsx:1302 msgid "Would you like to save this as a draft to edit later?" msgstr "" @@ -12891,12 +13153,12 @@ msgstr "" msgid "Write a post" msgstr "" -#: src/view/com/composer/Composer.tsx:1502 +#: src/view/com/composer/Composer.tsx:1484 msgid "Write post" msgstr "" #: src/screens/PostThread/components/ThreadComposePrompt.tsx:91 -#: src/view/com/composer/Composer.tsx:1400 +#: src/view/com/composer/Composer.tsx:1382 msgid "Write your reply" msgstr "" @@ -12910,6 +13172,7 @@ msgid "Wrong DID returned from server. Received: {0}" msgstr "" #: src/screens/Messages/ConversationSettings/index.tsx:131 +#: src/screens/Messages/JoinRequests.tsx:110 msgid "Wrong kind of conversation" msgstr "Wrong kind of conversation" @@ -12999,7 +13262,7 @@ msgstr "" msgid "You are no longer live" msgstr "" -#: src/view/com/composer/state/video.ts:427 +#: src/view/com/composer/state/video.ts:412 msgid "You are not allowed to upload videos." msgstr "" @@ -13062,7 +13325,7 @@ msgstr "" msgid "You can now sign in with your new password." msgstr "" -#: src/view/com/composer/Composer.tsx:1325 +#: src/view/com/composer/Composer.tsx:1307 msgid "You can only save drafts up to 1000 characters." msgstr "" @@ -13070,11 +13333,11 @@ msgstr "" msgid "You can only save drafts up to 1000 characters. Would you like to discard this post before viewing your drafts?" msgstr "" -#: src/view/com/composer/SelectMediaButton.tsx:431 +#: src/view/com/composer/SelectMediaButton.tsx:435 msgid "You can only select one GIF at a time." msgstr "" -#: src/view/com/composer/SelectMediaButton.tsx:425 +#: src/view/com/composer/SelectMediaButton.tsx:429 msgid "You can only select one video at a time." msgstr "" @@ -13087,7 +13350,7 @@ msgid "You can read chat history but can’t send new messages." msgstr "You can read chat history but can’t send new messages." #. Error message for maximum number of images that can be selected to add to a post, currently 4 but may change. -#: src/view/com/composer/SelectMediaButton.tsx:417 +#: src/view/com/composer/SelectMediaButton.tsx:421 msgid "You can select up to {MAX_IMAGES, plural, other {# images}} in total." msgstr "" @@ -13128,6 +13391,10 @@ msgstr "" msgid "You got here first" msgstr "" +#: src/components/intents/GroupChatJoinDialog.tsx:136 +msgid "You have been removed from this group." +msgstr "You have been removed from this group." + #: src/components/moderation/ModerationDetailsDialog.tsx:77 #: src/lib/moderation/useModerationCauseDescription.ts:58 #: src/lib/moderation/useModerationCauseDescription.ts:66 @@ -13197,7 +13464,7 @@ msgstr "" msgid "You have temporarily reached the limit for video uploads. Please try again later." msgstr "" -#: src/view/com/composer/Composer.tsx:1315 +#: src/view/com/composer/Composer.tsx:1297 msgid "You have unsaved changes to this draft, would you like to save them?" msgstr "" @@ -13267,7 +13534,7 @@ msgstr "" msgid "You must grant access to your photo library to save a QR code" msgstr "" -#: src/view/com/composer/SelectMediaButton.tsx:460 +#: src/view/com/composer/SelectMediaButton.tsx:464 msgid "You need to allow access to your media library." msgstr "" @@ -13394,7 +13661,7 @@ msgstr "" msgid "You've reached the end of your feed! Find some more accounts to follow." msgstr "" -#: src/view/com/composer/Composer.tsx:582 +#: src/view/com/composer/Composer.tsx:576 msgid "You've reached the maximum number of drafts" msgstr "" @@ -13406,11 +13673,11 @@ msgstr "" msgid "You've reached the start of the active content." msgstr "" -#: src/view/com/composer/state/video.ts:438 +#: src/view/com/composer/state/video.ts:423 msgid "You've reached your daily limit for video uploads (too many bytes)" msgstr "" -#: src/view/com/composer/state/video.ts:442 +#: src/view/com/composer/state/video.ts:427 msgid "You've reached your daily limit for video uploads (too many videos)" msgstr "" @@ -13430,15 +13697,15 @@ msgstr "" msgid "Your account has been suspended" msgstr "" -#: src/view/com/composer/state/video.ts:446 +#: src/view/com/composer/state/video.ts:431 msgid "Your account is not yet old enough to upload videos. Please try again later." msgstr "" -#: src/components/dms/InitiateChatFlow.tsx:674 +#: src/components/dms/InitiateChatFlow.tsx:675 msgid "Your account is too new" msgstr "Your account is too new" -#: src/components/dms/InitiateChatFlow.tsx:675 +#: src/components/dms/InitiateChatFlow.tsx:676 msgid "Your account must be at least 7 days old to create a new group chat." msgstr "Your account must be at least 7 days old to create a new group chat." @@ -13521,7 +13788,7 @@ msgstr "" msgid "Your full handle will be <0>@{0}" msgstr "" -#: src/Navigation.tsx:449 +#: src/Navigation.tsx:451 #: src/screens/Search/modules/ExploreInterestsCard.tsx:68 #: src/screens/Settings/ContentAndMediaSettings.tsx:94 #: src/screens/Settings/ContentAndMediaSettings.tsx:97 @@ -13550,9 +13817,9 @@ msgstr "" msgid "Your muted words" msgstr "" -#: src/screens/Messages/components/InviteLinkDialog.tsx:179 -msgid "Your name, avatar, and the name of the group chat will be visible to everyone." -msgstr "Your name, avatar, and the name of the group chat will be visible to everyone." +#: src/screens/Messages/components/InviteLinkDialog.tsx:189 +msgid "Your name, avatar, the name of the group chat, and the number of members will be visible to everyone." +msgstr "Your name, avatar, the name of the group chat, and the number of members will be visible to everyone." #: src/screens/Settings/components/ChangePasswordDialog.tsx:72 msgid "Your password has been changed successfully! Please use your new password when you sign in to Bluesky from now on." @@ -13562,11 +13829,11 @@ msgstr "" msgid "Your password must be at least 8 characters long." msgstr "" -#: src/view/com/composer/Composer.tsx:1046 +#: src/view/com/composer/Composer.tsx:1028 msgid "Your post was sent" msgstr "" -#: src/view/com/composer/Composer.tsx:1043 +#: src/view/com/composer/Composer.tsx:1025 msgid "Your posts were sent" msgstr "" @@ -13587,7 +13854,7 @@ msgstr "" msgid "Your profile, posts, feeds, and lists will no longer be visible to other Bluesky users. You can reactivate your account at any time by logging in." msgstr "" -#: src/view/com/composer/Composer.tsx:1045 +#: src/view/com/composer/Composer.tsx:1027 msgid "Your reply was sent" msgstr "" @@ -13600,7 +13867,7 @@ msgstr "" msgid "Your selected interests help us serve you content you care about." msgstr "" -#: src/view/com/composer/Composer.tsx:1350 +#: src/view/com/composer/Composer.tsx:1332 msgid "Your thread has empty posts that will be skipped. The remaining posts will be published as a thread." msgstr "Your thread has empty posts that will be skipped. The remaining posts will be published as a thread." From 00497964c1ab048cc676ce3924dc407ed8ef15cf Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Wed, 3 Jun 2026 09:05:46 +0300 Subject: [PATCH 036/149] [ALF] Set text to `leading_snug` by default (#10627) --- src/components/Button.tsx | 6 +++--- src/components/RichText.tsx | 2 +- src/components/Typography.tsx | 1 + 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/components/Button.tsx b/src/components/Button.tsx index aa705b1897..5f74595029 100644 --- a/src/components/Button.tsx +++ b/src/components/Button.tsx @@ -757,11 +757,11 @@ export function useSharedButtonTextStyles() { } if (size === 'large') { - baseStyles.push(a.text_md, a.leading_snug, a.font_medium) + baseStyles.push(a.text_md, a.font_medium) } else if (size === 'small') { - baseStyles.push(a.text_sm, a.leading_snug, a.font_medium) + baseStyles.push(a.text_sm, a.font_medium) } else if (size === 'tiny') { - baseStyles.push(a.text_xs, a.leading_snug, a.font_semi_bold) + baseStyles.push(a.text_xs, a.font_semi_bold) } return flatten(baseStyles) diff --git a/src/components/RichText.tsx b/src/components/RichText.tsx index 322fb9ebd9..25af851723 100644 --- a/src/components/RichText.tsx +++ b/src/components/RichText.tsx @@ -66,7 +66,7 @@ export function RichText({ } }, [value]) - const plainStyles = [a.leading_snug, style] + const plainStyles = style const interactiveStyles = [plainStyles, interactiveStyle] const {text, facets} = richText diff --git a/src/components/Typography.tsx b/src/components/Typography.tsx index 04b5e5499d..a65889f67e 100644 --- a/src/components/Typography.tsx +++ b/src/components/Typography.tsx @@ -31,6 +31,7 @@ export function Text({ [ a.text_sm, t.atoms.text, + a.leading_snug, web(numberOfLines === 1 && numberOfLinesClippingFix), style, ], From a046d8d96a94adf499682d9cb293f8dbf35d6465 Mon Sep 17 00:00:00 2001 From: RetroSunstar <57507616+RetroSunstar@users.noreply.github.com> Date: Wed, 3 Jun 2026 11:47:35 +0100 Subject: [PATCH 037/149] Use square icons for labellers in Automation Label preview card (#10701) --- src/screens/Settings/AutomationLabelSettings.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/screens/Settings/AutomationLabelSettings.tsx b/src/screens/Settings/AutomationLabelSettings.tsx index f4c6823d63..423bc0073a 100644 --- a/src/screens/Settings/AutomationLabelSettings.tsx +++ b/src/screens/Settings/AutomationLabelSettings.tsx @@ -123,7 +123,11 @@ export function AutomationLabelSettingsScreen({}: Props) { paddingRight: 20, // helps visually center }, ]}> - + From 21679b66ddeeb0df62173091994d9b0708435cda Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Wed, 3 Jun 2026 17:39:31 +0300 Subject: [PATCH 038/149] Mention default `` style in CLAUDE.md (#10705) --- CLAUDE.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index c747973c77..37e6a1c2c5 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -206,7 +206,7 @@ function MyComponent() { return ( - Hello + Hello ) } @@ -414,12 +414,16 @@ import {Text, H1, H2, P} from '#/components/Typography'

Heading

Paragraph text with default styling.

-Custom text +Custom text -// For text with emoji, add the emoji prop +// For text with emoji, add the emoji prop. User-generated text (e.g. display names) +// will almost certainly contain emoji, so only omit it when the text is static and +// does not contain an emoji Hello! 👋 ``` +The `Text` component's default style is `[a.text_sm, a.leading_snug, t.atoms.text]`. + ### TextField ```tsx From b6650d8d5c0a9dc2adbe53ce727e8a3901f0edd7 Mon Sep 17 00:00:00 2001 From: Spence Pope Date: Wed, 3 Jun 2026 10:58:43 -0400 Subject: [PATCH 039/149] Fix alt text selection in lightbox on Android (and iOS) (#10698) Co-authored-by: Eric Bailey --- src/components/Lightbox/chrome/Footer.tsx | 47 ++++++++++++++--------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/src/components/Lightbox/chrome/Footer.tsx b/src/components/Lightbox/chrome/Footer.tsx index fb190f42ff..a20c80df3d 100644 --- a/src/components/Lightbox/chrome/Footer.tsx +++ b/src/components/Lightbox/chrome/Footer.tsx @@ -1,11 +1,5 @@ import {useRef} from 'react' -import { - LayoutAnimation, - Pressable, - ScrollView, - StyleSheet, - View, -} from 'react-native' +import {LayoutAnimation, ScrollView, StyleSheet, View} from 'react-native' import {useSafeAreaInsets} from 'react-native-safe-area-context' import {BlurView} from 'expo-blur' import {useLingui} from '@lingui/react/macro' @@ -60,26 +54,41 @@ export function Footer({altText, isAltExpanded, onToggleAltExpanded}: Props) { isMomentumScrolling.current = false }} contentContainerStyle={[a.px_md, a.py_sm]}> - { - if (isMomentumScrolling.current) return - LayoutAnimation.configureNext({ - duration: 450, - update: {type: 'spring', springDamping: 1}, - }) - onToggleAltExpanded() - }}> + accessibilityHint=""> + {/* + * The press handlers must live on the Text itself, not on a + * wrapping Pressable. Text selection is driven by the platform's + * native text view long-press (RN Text on Android, UITextView on + * iOS). A parent touchable consumes that long-press before the + * selectable Text can begin a selection - on Android this prevents + * selection entirely. Keeping onPress/onLongPress on the Text lets + * the same native node own both the tap-to-expand and the + * long-press-to-select. The empty onLongPress is intentional: it + * reserves the long-press for the OS selection gesture instead of + * firing the expand toggle. RN exposes no API to arbitrate tap vs + * native selection on a single node, so this is the supported + * workaround, and it behaves consistently on both platforms. + */} + numberOfLines={isAltExpanded ? undefined : 3} + onPress={() => { + if (isMomentumScrolling.current) return + LayoutAnimation.configureNext({ + duration: 450, + update: {type: 'spring', springDamping: 1}, + }) + onToggleAltExpanded() + }} + onLongPress={() => {}}> {altText} - +
From 1b4c72f5166aec88df7ec8513a02c6e934d86327 Mon Sep 17 00:00:00 2001 From: DS Boyce <260543580+ds-boyce@users.noreply.github.com> Date: Wed, 3 Jun 2026 09:28:11 -0700 Subject: [PATCH 040/149] Mount message dialogs once at the list level (#10435) Co-authored-by: Samuel Newman --- src/components/Prompt.tsx | 4 +- src/components/dms/AfterReportDialog.tsx | 7 +- src/components/dms/MessageContextMenu.tsx | 176 +++++-------- src/components/dms/MessageItem.tsx | 47 +--- src/components/dms/MessageOverlays.tsx | 175 +++++++++++++ src/components/dms/ReactionsDialog.tsx | 38 ++- .../moderation/ReportDialog/index.tsx | 4 +- .../moderation/ReportDialog/types.ts | 4 + .../Messages/components/MessagesList.tsx | 243 +++++++++--------- 9 files changed, 420 insertions(+), 278 deletions(-) create mode 100644 src/components/dms/MessageOverlays.tsx diff --git a/src/components/Prompt.tsx b/src/components/Prompt.tsx index 916a7ec2d9..5fdf18e2a1 100644 --- a/src/components/Prompt.tsx +++ b/src/components/Prompt.tsx @@ -224,6 +224,7 @@ export function Basic({ cancelButtonCta, confirmButtonCta, onConfirm, + onClose, confirmButtonColor, showCancel = true, }: React.PropsWithChildren<{ @@ -240,11 +241,12 @@ export function Basic({ * should NOT close the dialog as a side effect of this method. */ onConfirm: (e: GestureResponderEvent) => void + onClose?: () => void confirmButtonColor?: ButtonColor showCancel?: boolean }>) { return ( - + {title} {description && {description}} diff --git a/src/components/dms/AfterReportDialog.tsx b/src/components/dms/AfterReportDialog.tsx index 3df194fc8b..060ea1fcfb 100644 --- a/src/components/dms/AfterReportDialog.tsx +++ b/src/components/dms/AfterReportDialog.tsx @@ -33,14 +33,19 @@ export const AfterReportDialog = memo(function BlockOrDeleteDialogInner({ control, params, currentScreen, + onClose, }: { control: Dialog.DialogControlProps params: ReportDialogParams currentScreen: 'list' | 'conversation' + onClose?: () => void }): React.ReactNode { const {t: l} = useLingui() return ( - + { - LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut) - convo - .deleteMessage(message.id) - .then(() => Toast.show(l({message: 'Message deleted', context: 'toast'}))) - .catch(() => Toast.show(l`Failed to delete message`)) - }, [l, convo, message.id]) - const onEmojiSelect = useCallback( (emoji: string) => { if ( @@ -128,104 +112,72 @@ export let MessageContextMenu = ({ const sender = senderProfile return ( - <> - - {IS_NATIVE && reactionsAvailable && ( - - - - )} - - - {children} - - - + {IS_NATIVE && reactionsAvailable && ( + - {message.text.length > 0 && ( - <> - - - {l`Translate`} - - - - - {l`Copy message text`} - - - - )} + + + )} + + + {children} + + + + {message.text.length > 0 && ( + <> + + + {l`Translate`} + + + + + {l`Copy message text`} + + + + )} + openDeleteMessage(message)}> + + {l`Delete for me`} + + {!isFromSelf && ( deleteControl.open()}> - - {l`Delete for me`} + testID="messageDropdownReportBtn" + label={l`Report message`} + onPress={() => openReportMessage(message, senderProfile)}> + + {l`Report`} - {!isFromSelf && ( - reportControl.open()}> - - {l`Report`} - - )} - - - { - if (sender) { - unstableCacheProfileView(queryClient, sender) - } - blockOrDeleteControl.open() - }} - /> - - - + )} + + ) } MessageContextMenu = memo(MessageContextMenu) diff --git a/src/components/dms/MessageItem.tsx b/src/components/dms/MessageItem.tsx index 6f1819ada2..ac6acb5891 100644 --- a/src/components/dms/MessageItem.tsx +++ b/src/components/dms/MessageItem.tsx @@ -40,8 +40,8 @@ import {useSession} from '#/state/session' import {atoms as a, native, platform, useTheme} from '#/alf' import {isOnlyEmoji} from '#/alf/typography' import {Button} from '#/components/Button' -import {useDialogControl} from '#/components/Dialog' import {ActionsWrapper} from '#/components/dms/ActionsWrapper' +import {useMessageDialogs} from '#/components/dms/MessageOverlays' import {InlineLinkText, Link} from '#/components/Link' import * as ProfileCard from '#/components/ProfileCard' import * as Prompt from '#/components/Prompt' @@ -49,7 +49,7 @@ import {RichText} from '#/components/RichText' import {Text} from '#/components/Typography' import {DateDivider} from './DateDivider' import {MessageItemEmbed} from './MessageItemEmbed' -import {ReactionsDialog} from './ReactionsDialog' +import {groupReactions} from './ReactionsDialog' import {CLUSTERED_MESSAGE_THRESHOLD_MS, MESSAGE_GAP_THRESHOLD_MS} from './util' const AVATAR_SIZE = 28 @@ -118,7 +118,7 @@ let MessageItem = ({ const {message} = item const profile = useMaybeProfileShadow(relatedProfiles.get(message.sender.did)) - const reactionsControl = useDialogControl() + const {openReactions} = useMessageDialogs() const isPending = item.type === 'pending-message' @@ -243,34 +243,10 @@ let MessageItem = ({ ) - const groupedReactions = useMemo(() => { - const reactions = message.reactions ?? [] - const grouped = new Map< - string, - { - key: string - value: string - senders: ChatBskyConvoDefs.ReactionViewSender[] - count: number - } - >() - for (const reaction of reactions) { - if (!reaction) continue - const existing = grouped.get(reaction.value) - if (existing) { - existing.senders.push(reaction.sender) - existing.count++ - } else { - grouped.set(reaction.value, { - key: reaction.value, - value: reaction.value, - senders: [reaction.sender], - count: 1, - }) - } - } - return Array.from(grouped.values()) - }, [message.reactions]) + const groupedReactions = useMemo( + () => groupReactions(message.reactions), + [message.reactions], + ) const reactions = useMemo(() => message.reactions ?? [], [message.reactions]) @@ -336,7 +312,7 @@ let MessageItem = ({ transform: [{translateY: -8}], }, ]} - onPress={isGroupChat ? reactionsControl.open : undefined}> + onPress={isGroupChat ? () => openReactions(message) : undefined}> {groupedReactions.map(group => (
) : null} - ) diff --git a/src/components/dms/MessageOverlays.tsx b/src/components/dms/MessageOverlays.tsx new file mode 100644 index 0000000000..41228f2899 --- /dev/null +++ b/src/components/dms/MessageOverlays.tsx @@ -0,0 +1,175 @@ +import { + createContext, + useCallback, + useContext, + useEffect, + useMemo, + useState, +} from 'react' +import {LayoutAnimation} from 'react-native' +import {type ChatBskyConvoDefs} from '@atproto/api' +import {useLingui} from '@lingui/react/macro' +import {useQueryClient} from '@tanstack/react-query' + +import {useConvoActive} from '#/state/messages/convo' +import {unstableCacheProfileView} from '#/state/queries/unstable-profile-cache' +import {useDialogControl} from '#/components/Dialog' +import {AfterReportDialog} from '#/components/dms/AfterReportDialog' +import {ReactionsDialog} from '#/components/dms/ReactionsDialog' +import {ReportDialog} from '#/components/moderation/ReportDialog' +import * as Prompt from '#/components/Prompt' +import {usePromptControl} from '#/components/Prompt' +import * as Toast from '#/components/Toast' +import type * as bsky from '#/types/bsky' + +type MessageDialogsContextType = { + openDeleteMessage: (message: ChatBskyConvoDefs.MessageView) => void + openReportMessage: ( + message: ChatBskyConvoDefs.MessageView, + senderProfile: bsky.profile.AnyProfileView | undefined, + ) => void + openReactions: (message: ChatBskyConvoDefs.MessageView) => void +} + +const Context = createContext(null) + +export function useMessageDialogs() { + const ctx = useContext(Context) + if (!ctx) { + throw new Error('useMessageDialogs must be used within a MessageOverlays') + } + return ctx +} + +export function MessageOverlays({children}: {children: React.ReactNode}) { + const {t: l} = useLingui() + const queryClient = useQueryClient() + const convo = useConvoActive() + + const deleteControl = usePromptControl() + const reportControl = usePromptControl() + const afterReportControl = usePromptControl() + const reactionsControl = useDialogControl() + + const [deleteTarget, setDeleteTarget] = + useState(null) + const [reportTarget, setReportTarget] = useState<{ + message: ChatBskyConvoDefs.MessageView + senderProfile: bsky.profile.AnyProfileView | undefined + } | null>(null) + const [afterReportTarget, setAfterReportTarget] = + useState(null) + const [reactionsTarget, setReactionsTarget] = + useState(null) + + const openDeleteMessage = useCallback( + (message: ChatBskyConvoDefs.MessageView) => { + setDeleteTarget(message) + deleteControl.open() + }, + [deleteControl], + ) + + const openReportMessage = useCallback( + ( + message: ChatBskyConvoDefs.MessageView, + senderProfile: bsky.profile.AnyProfileView | undefined, + ) => { + setReportTarget({message, senderProfile}) + reportControl.open() + }, + [reportControl], + ) + + const openReactions = useCallback( + (message: ChatBskyConvoDefs.MessageView) => { + setReactionsTarget(message) + }, + [], + ) + + // These dialogs are conditionally mounted, so we can't open them in the same + // tick that we set their targets - the control refs aren't attached yet. Open + // in an effect after the dialog has mounted. + useEffect(() => { + if (reactionsTarget) { + reactionsControl.open() + } + }, [reactionsTarget, reactionsControl]) + + useEffect(() => { + if (afterReportTarget) { + afterReportControl.open() + } + }, [afterReportTarget, afterReportControl]) + + const onConfirmDelete = useCallback(() => { + if (!deleteTarget) return + LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut) + convo + .deleteMessage(deleteTarget.id) + .then(() => Toast.show(l({message: 'Message deleted', context: 'toast'}))) + .catch(() => Toast.show(l`Failed to delete message`)) + }, [l, convo, deleteTarget]) + + const onAfterReportSubmit = useCallback(() => { + if (!reportTarget) return + if (reportTarget.senderProfile) { + unstableCacheProfileView(queryClient, reportTarget.senderProfile) + } + setAfterReportTarget(reportTarget.message) + }, [queryClient, reportTarget]) + + const ctx = useMemo( + () => ({openDeleteMessage, openReportMessage, openReactions}), + [openDeleteMessage, openReportMessage, openReactions], + ) + + const reportSubject = reportTarget + ? ({ + view: 'message', + convoId: convo.convo.view.id, + message: reportTarget.message, + } as const) + : undefined + + return ( + + {children} + setReportTarget(null)} + /> + {afterReportTarget && ( + setAfterReportTarget(null)} + /> + )} + {reactionsTarget && ( + setReactionsTarget(null)} + /> + )} + setDeleteTarget(null)} + /> + + ) +} diff --git a/src/components/dms/ReactionsDialog.tsx b/src/components/dms/ReactionsDialog.tsx index 576ef4cead..8119cc1b7c 100644 --- a/src/components/dms/ReactionsDialog.tsx +++ b/src/components/dms/ReactionsDialog.tsx @@ -1,4 +1,4 @@ -import {useRef, useState} from 'react' +import {useMemo, useRef, useState} from 'react' import { LayoutAnimation, Pressable, @@ -37,14 +37,12 @@ export function ReactionsDialog({ control, relatedProfiles, message, - reactions, - groupedReactions, + onClose, }: { control: Dialog.DialogControlProps relatedProfiles: Map message: ChatBskyConvoDefs.MessageView - reactions?: ChatBskyConvoDefs.ReactionView[] - groupedReactions?: Reaction[] + onClose?: () => void }) { const {t: l} = useLingui() @@ -54,6 +52,9 @@ export function ReactionsDialog({ const [selected, setSelected] = useState('all') + const reactions = message.reactions + const groupedReactions = useMemo(() => groupReactions(reactions), [reactions]) + const filteredReactions = reactions?.filter( r => selected === 'all' || r.value === selected, ) @@ -78,7 +79,10 @@ export function ReactionsDialog({ return ( setSelected('all')} + onClose={() => { + setSelected('all') + onClose?.() + }} nativeOptions={{ preventExpansion: true, minHeight: screenHeight / 2, @@ -388,3 +392,25 @@ function ReactionTab({ ) } + +export function groupReactions( + reactions: ChatBskyConvoDefs.ReactionView[] | undefined, +): Reaction[] { + const grouped = new Map() + for (const reaction of reactions ?? []) { + if (!reaction) continue + const existing = grouped.get(reaction.value) + if (existing) { + existing.senders.push(reaction.sender) + existing.count++ + } else { + grouped.set(reaction.value, { + key: reaction.value, + value: reaction.value, + senders: [reaction.sender], + count: 1, + }) + } + } + return Array.from(grouped.values()) +} diff --git a/src/components/moderation/ReportDialog/index.tsx b/src/components/moderation/ReportDialog/index.tsx index c24c6feae0..d1d3aa5584 100644 --- a/src/components/moderation/ReportDialog/index.tsx +++ b/src/components/moderation/ReportDialog/index.tsx @@ -75,9 +75,11 @@ export function ReportDialog( () => (props.subject ? parseReportSubject(props.subject) : undefined), [props.subject], ) + const propsOnClose = props.onClose const onClose = useCallback(() => { ax.metric('reportDialog:close', {}) - }, [ax]) + propsOnClose?.() + }, [ax, propsOnClose]) return ( diff --git a/src/components/moderation/ReportDialog/types.ts b/src/components/moderation/ReportDialog/types.ts index 89089d138b..57ed3cd279 100644 --- a/src/components/moderation/ReportDialog/types.ts +++ b/src/components/moderation/ReportDialog/types.ts @@ -88,4 +88,8 @@ export type ReportDialogProps = { * Called if the report was successfully submitted. */ onAfterSubmit?: () => void + /** + * Called after the dialog finishes closing. + */ + onClose?: () => void } diff --git a/src/screens/Messages/components/MessagesList.tsx b/src/screens/Messages/components/MessagesList.tsx index 99b725267e..fbebdc0745 100644 --- a/src/screens/Messages/components/MessagesList.tsx +++ b/src/screens/Messages/components/MessagesList.tsx @@ -56,6 +56,7 @@ import {MessageListError} from '#/screens/Messages/components/MessageListError' import {atoms as a, platform, tokens, useTheme, web} from '#/alf' import {DateDivider} from '#/components/dms/DateDivider' import {MessageItem} from '#/components/dms/MessageItem' +import {MessageOverlays} from '#/components/dms/MessageOverlays' import {NewMessagesPill} from '#/components/dms/NewMessagesPill' import {SystemMessageGroup} from '#/components/dms/SystemMessageGroup' import {SystemMessageItem} from '#/components/dms/SystemMessageItem' @@ -498,127 +499,133 @@ export function MessagesList({ return ( - - {/* Custom scroll provider so that we can use the `onScroll` event in our custom List implementation */} - - - - - {convoState.hasAllHistory ? ( - convoState.convo?.kind === 'group' ? ( - - ) : ( - - ) - ) : null} - - } - // native only (prop is not supported on web) - renderScrollComponent={renderScrollComponent} - contentContainerStyle={{ - paddingBottom: platform({ - // ios is slightly larger as the input has no top padding - ios: tokens.space.lg, - android: tokens.space.md, - web: 0, // web uses ListFooterComponent instead for scroll reasons - }), - }} - ListFooterComponent={ - - } - style={[ - web({ - scrollbarWidth: 'thin', - scrollbarColor: `${t.palette.contrast_100} transparent`, - scrollbarGutter: 'stable', - }), - ]} - pointerEvents={!hasScrolled ? 'none' : 'auto'} - contentInset={{top: transparentHeaderHeight}} - scrollIndicatorInsets={{top: transparentHeaderHeight}} - /> - - - - {footer ?? ( - - {({loading}) => - ax.features.enabled(ax.features.DmsNewMessageComposerEnable) ? ( - - void onSendMessage(message) - } - hasEmbed={!!embedUri} - setEmbed={setEmbed} - loading={loading}> - + + {/* Custom scroll provider so that we can use the `onScroll` event in our custom List implementation */} + + + + + {convoState.hasAllHistory ? ( + convoState.convo?.kind === 'group' ? ( + + ) : ( + + ) + ) : null} + + } + // native only (prop is not supported on web) + renderScrollComponent={renderScrollComponent} + contentContainerStyle={{ + paddingBottom: platform({ + // ios is slightly larger as the input has no top padding + ios: tokens.space.lg, + android: tokens.space.md, + web: 0, // web uses ListFooterComponent instead for scroll reasons + }), + }} + ListFooterComponent={ + + } + style={[ + web({ + scrollbarWidth: 'thin', + scrollbarColor: `${t.palette.contrast_100} transparent`, + scrollbarGutter: 'stable', + }), + ]} + pointerEvents={!hasScrolled ? 'none' : 'auto'} + contentInset={{top: transparentHeaderHeight}} + scrollIndicatorInsets={{top: transparentHeaderHeight}} + /> + + + + {footer ?? ( + + {({loading}) => + ax.features.enabled( + ax.features.DmsNewMessageComposerEnable, + ) ? ( + + void onSendMessage(message) + } + hasEmbed={!!embedUri} setEmbed={setEmbed} - /> - - ) : ( - - + + + ) : ( + - - ) - } - - )} - - + loading={loading}> + + + ) + } + + )} + + - {newMessagesPill.show && } + {newMessagesPill.show && ( + + )} + ) } From cdad723ea100f4cee9cae186da2454a9bc1b5c2f Mon Sep 17 00:00:00 2001 From: DS Boyce <260543580+ds-boyce@users.noreply.github.com> Date: Wed, 3 Jun 2026 10:23:13 -0700 Subject: [PATCH 041/149] Hide accept button for locked chats (#10696) --- src/screens/Messages/components/RequestListItem.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/screens/Messages/components/RequestListItem.tsx b/src/screens/Messages/components/RequestListItem.tsx index 64dbebb164..79eab480ae 100644 --- a/src/screens/Messages/components/RequestListItem.tsx +++ b/src/screens/Messages/components/RequestListItem.tsx @@ -28,6 +28,9 @@ export function RequestListItem({ const isDeletedAccount = !convo.primaryMember || convo.primaryMember.handle === 'missing.invalid' + const canAcceptRequest = + convo.kind === 'direct' || convo.details.lockStatus === 'unlocked' + return ( @@ -65,7 +68,9 @@ export function RequestListItem({ ]}> {convo.primaryMember && !isDeletedAccount ? ( <> - + {canAcceptRequest ? ( + + ) : null} Date: Wed, 3 Jun 2026 11:27:44 -0700 Subject: [PATCH 042/149] Enable ESLint errors and suppress existing violations (#10490) --- .github/workflows/lint.yml | 26 +- eslint-suppressions.json | 1834 ++++++++++++++++- eslint.config.mjs | 38 +- src/components/Toast/Toast.tsx | 6 +- src/lib/hooks/useTimeAgo.ts | 12 +- src/lib/routes/links.ts | 4 +- .../Settings/AppIconSettings/index.tsx | 4 +- src/screens/VideoFeed/components/Scrubber.tsx | 3 +- src/state/queries/notifications/feed.ts | 2 +- src/state/queries/nuxs/util.ts | 2 +- src/state/queries/suggested-follows.ts | 2 +- src/state/queries/usePostThread/traversal.ts | 2 +- src/view/com/composer/drafts/state/api.ts | 6 +- src/view/com/testing/TestCtrls.e2e.tsx | 2 +- src/view/com/util/PressableWithHover.tsx | 2 +- .../createNativeStackNavigatorWithAuth.tsx | 2 +- 16 files changed, 1879 insertions(+), 68 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 93729874b6..aa6c92765d 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -21,7 +21,7 @@ jobs: strategy: fail-fast: false matrix: - job: [lint, prettier] + job: [lint, prettier, typecheck] steps: - name: Check out Git repository uses: actions/checkout@v5 @@ -62,6 +62,8 @@ jobs: command: pnpm install --frozen-lockfile attempt_limit: 3 attempt_delay: 2000 + - name: Check & compile i18n + run: pnpm intl:build - name: Lint checks run: pnpm ${{ matrix.job }} # Aggregates the matrix results into a single stable check name so branch @@ -80,28 +82,6 @@ jobs: run: | echo "linting result: $RESULT" test "$RESULT" = "success" - typechecking: - name: Run typecheck - runs-on: ubuntu-latest - steps: - - name: Check out Git repository - uses: actions/checkout@v5 - - uses: pnpm/action-setup@v6 - - name: Install node - uses: actions/setup-node@v6 - with: - node-version-file: package.json - cache: pnpm - - name: pnpm install - uses: Wandalen/wretry.action@master - with: - command: pnpm install --frozen-lockfile - attempt_limit: 3 - attempt_delay: 2000 - - name: Check & compile i18n - run: pnpm intl:build - - name: Type check - run: pnpm typecheck testing: name: Run tests runs-on: ubuntu-latest diff --git a/eslint-suppressions.json b/eslint-suppressions.json index 5b7eef4c94..f2e677dc79 100644 --- a/eslint-suppressions.json +++ b/eslint-suppressions.json @@ -1,12 +1,72 @@ { + "src/Navigation.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/Splash.android.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/Splash.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/ageAssurance/components/RedirectOverlay.tsx": { + "@typescript-eslint/require-await": { + "count": 1 + } + }, + "src/ageAssurance/util.ts": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, "src/alf/util/flatten.ts": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 9 + } + }, + "src/alf/util/systemUI.ts": { + "@typescript-eslint/no-floating-promises": { + "count": 2 + } + }, + "src/alf/util/useGutters.ts": { + "react-hooks/immutability": { + "count": 5 } }, "src/analytics/PassiveAnalytics.tsx": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "react-hooks/purity": { + "count": 1 + } + }, + "src/analytics/features/index.ts": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + }, + "@typescript-eslint/no-misused-promises": { + "count": 1 + }, + "@typescript-eslint/require-await": { + "count": 1 + } + }, + "src/analytics/identifiers/session.test.ts": { + "@typescript-eslint/no-unsafe-call": { + "count": 9 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 9 } }, "src/analytics/metadata.ts": { @@ -17,16 +77,84 @@ "src/analytics/metrics/client.test.ts": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 8 + }, + "@typescript-eslint/require-await": { + "count": 5 } }, "src/analytics/metrics/client.ts": { "@typescript-eslint/no-explicit-any": { "count": 5 + }, + "@typescript-eslint/no-floating-promises": { + "count": 2 + }, + "@typescript-eslint/no-unsafe-call": { + "count": 1 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 1 + } + }, + "src/analytics/utils.ts": { + "react-hooks/immutability": { + "count": 1 + } + }, + "src/components/AppLanguageDropdown.tsx": { + "@typescript-eslint/no-unsafe-enum-comparison": { + "count": 1 + } + }, + "src/components/Autocomplete/Autocomplete.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/components/Autocomplete/useAutocomplete/index.ts": { + "react-hooks/immutability": { + "count": 1 + } + }, + "src/components/BotAccountAlert.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/components/Button.tsx": { + "react-hooks/immutability": { + "count": 1 } }, "src/components/Composer/index.tsx": { "@typescript-eslint/no-explicit-any": { "count": 2 + }, + "@typescript-eslint/no-floating-promises": { + "count": 1 + }, + "@typescript-eslint/no-redundant-type-constituents": { + "count": 1 + }, + "@typescript-eslint/no-unsafe-call": { + "count": 1 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 7 + }, + "react-hooks/immutability": { + "count": 1 + }, + "react-hooks/refs": { + "count": 1 + } + }, + "src/components/DebugFieldDisplay.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 } }, "src/components/Dialog/index.tsx": { @@ -37,6 +165,18 @@ "src/components/Dialog/index.web.tsx": { "@typescript-eslint/no-explicit-any": { "count": 4 + }, + "@typescript-eslint/no-misused-promises": { + "count": 1 + }, + "@typescript-eslint/no-unsafe-call": { + "count": 2 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 3 + }, + "@typescript-eslint/require-await": { + "count": 1 } }, "src/components/DraggableList/index.web.tsx": { @@ -44,6 +184,11 @@ "count": 2 } }, + "src/components/EmojiPicker/preload.web.ts": { + "@typescript-eslint/no-floating-promises": { + "count": 2 + } + }, "src/components/FeedCard.tsx": { "@typescript-eslint/no-explicit-any": { "count": 1 @@ -52,16 +197,53 @@ "src/components/FocusScope/index.tsx": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 1 + }, + "react-hooks/refs": { + "count": 1 } }, "src/components/InternationalPhoneCodeSelect.tsx": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 1 + } + }, + "src/components/KnownFollowers.tsx": { + "react-hooks/refs": { + "count": 6 + } + }, + "src/components/Lightbox/Lightbox.web.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 1 + } + }, + "src/components/Lightbox/pager/ImageItem/ImageItem.android.tsx": { + "react-hooks/immutability": { + "count": 1 + } + }, + "src/components/Lightbox/pager/ImageItem/ImageItem.ios.tsx": { + "react-hooks/refs": { + "count": 1 + } + }, + "src/components/LikedByList.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 2 } }, "src/components/Lists.tsx": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-misused-promises": { + "count": 1 } }, "src/components/Menu/types.ts": { @@ -74,34 +256,129 @@ "count": 1 } }, + "src/components/Post/Embed/ExternalEmbed/ExternalGif.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 3 + } + }, + "src/components/Post/Embed/ExternalEmbed/index.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, "src/components/Post/Embed/ImageEmbed.tsx": { "@typescript-eslint/no-explicit-any": { "count": 2 + }, + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/components/Post/Embed/StandardSiteEmbed/index.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 3 + } + }, + "src/components/Post/Embed/VideoEmbed/VideoEmbedInner/VideoEmbedInnerWeb.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 2 + }, + "@typescript-eslint/no-unsafe-enum-comparison": { + "count": 1 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 1 + }, + "react-hooks/immutability": { + "count": 1 } }, "src/components/Post/Embed/VideoEmbed/VideoEmbedInner/web-controls/utils.tsx": { "@typescript-eslint/no-explicit-any": { "count": 2 + }, + "@typescript-eslint/no-misused-promises": { + "count": 1 + }, + "@typescript-eslint/no-unsafe-call": { + "count": 3 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 3 } }, "src/components/PostControls/BookmarkButton.tsx": { "@typescript-eslint/no-explicit-any": { "count": 2 + }, + "@typescript-eslint/no-misused-promises": { + "count": 2 + } + }, + "src/components/PostControls/DiscoverDebug.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/components/PostControls/ShareMenu/ShareMenuItems.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 3 + }, + "@typescript-eslint/no-misused-promises": { + "count": 1 + } + }, + "src/components/PostControls/ShareMenu/ShareMenuItems.web.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 3 + } + }, + "src/components/PostControls/ShareMenu/index.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 } }, "src/components/ProfileHoverCard/index.web.tsx": { "@typescript-eslint/no-explicit-any": { "count": 2 + }, + "@typescript-eslint/no-floating-promises": { + "count": 3 + }, + "@typescript-eslint/require-await": { + "count": 1 + }, + "react-hooks/immutability": { + "count": 1 + }, + "react-hooks/refs": { + "count": 2 + } + }, + "src/components/ProgressGuide/FollowDialog.tsx": { + "react-hooks/refs": { + "count": 2 + } + }, + "src/components/RichTextTag.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 2 } }, "src/components/Select/index.tsx": { "@typescript-eslint/no-explicit-any": { "count": 4 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 2 } }, "src/components/Select/index.web.tsx": { "@typescript-eslint/no-explicit-any": { "count": 2 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 1 } }, "src/components/Select/types.ts": { @@ -109,9 +386,44 @@ "count": 3 } }, + "src/components/SendErrorReportDialog.tsx": { + "@typescript-eslint/require-await": { + "count": 1 + } + }, + "src/components/StarterPack/Main/ProfilesList.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 1 + } + }, "src/components/StarterPack/ProfileStarterPacks.tsx": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-misused-promises": { + "count": 2 + } + }, + "src/components/StarterPack/QrCodeDialog.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 5 + }, + "@typescript-eslint/no-misused-promises": { + "count": 2 + }, + "@typescript-eslint/require-await": { + "count": 4 + } + }, + "src/components/StarterPack/ShareDialog.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + }, + "@typescript-eslint/no-misused-promises": { + "count": 2 + }, + "@typescript-eslint/require-await": { + "count": 1 } }, "src/components/StarterPack/Wizard/WizardEditListDialog.tsx": { @@ -119,9 +431,109 @@ "count": 1 } }, + "src/components/Tooltip/index.tsx": { + "@typescript-eslint/no-base-to-string": { + "count": 1 + } + }, + "src/components/Tooltip/index.web.tsx": { + "@typescript-eslint/no-base-to-string": { + "count": 1 + } + }, + "src/components/WhoCanReply.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + }, + "react-hooks/refs": { + "count": 1 + } + }, + "src/components/ageAssurance/AgeAssuranceErrors.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 1 + } + }, + "src/components/ageAssurance/AgeAssuranceInitDialog.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 2 + }, + "react-hooks/purity": { + "count": 1 + } + }, + "src/components/ageAssurance/AgeAssuranceRedirectDialog.tsx": { + "@typescript-eslint/require-await": { + "count": 1 + } + }, + "src/components/contacts/components/OTPInput.tsx": { + "react-hooks/refs": { + "count": 1 + } + }, + "src/components/contacts/screens/GetContacts.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/components/contacts/screens/VerifyNumber.tsx": { + "@typescript-eslint/require-await": { + "count": 1 + }, + "react-hooks/purity": { + "count": 1 + } + }, + "src/components/contacts/screens/ViewMatches.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 1 + } + }, "src/components/dialogs/DeviceLocationRequestDialog.tsx": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-misused-promises": { + "count": 1 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 2 + } + }, + "src/components/dialogs/EmailDialog/components/ResendEmailText.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/components/dialogs/EmailDialog/data/useAccountEmailState.ts": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/components/dialogs/EmailDialog/screens/Manage2FA/Disable.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 3 + } + }, + "src/components/dialogs/EmailDialog/screens/Manage2FA/Enable.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 1 + } + }, + "src/components/dialogs/EmailDialog/screens/Update.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 3 + } + }, + "src/components/dialogs/EmailDialog/screens/Verify.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 3 + } + }, + "src/components/dialogs/InAppBrowserConsent.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 2 } }, "src/components/dialogs/LanguageSelectDialog.tsx": { @@ -129,27 +541,105 @@ "count": 1 } }, + "src/components/dialogs/LinkWarning.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 2 + } + }, "src/components/dialogs/MutedWords.tsx": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-floating-promises": { + "count": 2 + }, + "@typescript-eslint/no-misused-promises": { + "count": 3 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 2 + }, + "@typescript-eslint/require-await": { + "count": 1 } }, "src/components/dialogs/PostInteractionSettingsDialog.tsx": { "@typescript-eslint/no-explicit-any": { "count": 2 }, + "@typescript-eslint/no-misused-promises": { + "count": 1 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 2 + }, "react-hooks/preserve-manual-memoization": { "count": 1 } }, + "src/components/dialogs/ServerInput.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/components/dialogs/StarterPackDialog.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 1 + } + }, + "src/components/dialogs/SwitchAccount.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/components/dialogs/lists/CreateListFromStarterPackDialog.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 2 + } + }, "src/components/dialogs/lists/CreateOrEditListDialog.tsx": { "@typescript-eslint/no-explicit-any": { "count": 2 + }, + "@typescript-eslint/no-misused-promises": { + "count": 1 + } + }, + "src/components/dialogs/nuxs/FindContactsAnnouncement.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/components/dialogs/nuxs/index.tsx": { + "@typescript-eslint/no-unsafe-member-access": { + "count": 1 + }, + "react-hooks/immutability": { + "count": 1 + }, + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/components/dms/MessageItem.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 1 } }, "src/components/forms/DateField/index.web.tsx": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-unsafe-call": { + "count": 1 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 2 + } + }, + "src/components/forms/SearchInput.tsx": { + "react-hooks/refs": { + "count": 1 } }, "src/components/forms/SegmentedControl.tsx": { @@ -157,6 +647,14 @@ "count": 1 } }, + "src/components/forms/TextField.tsx": { + "@typescript-eslint/no-unsafe-member-access": { + "count": 3 + }, + "react-hooks/refs": { + "count": 1 + } + }, "src/components/forms/ToggleButton.tsx": { "@typescript-eslint/no-explicit-any": { "count": 1 @@ -165,6 +663,37 @@ "src/components/hooks/useFollowMethods.ts": { "@typescript-eslint/no-explicit-any": { "count": 2 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 2 + } + }, + "src/components/hooks/useFullscreen.ts": { + "@typescript-eslint/no-floating-promises": { + "count": 2 + }, + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/components/hooks/useLandingEntry.native.ts": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/components/hooks/useLandingEntry.ts": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/components/hooks/useRefreshOnFocus.ts": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/components/hooks/useRichText.ts": { + "@typescript-eslint/no-floating-promises": { + "count": 1 } }, "src/components/images/AutoSizedImage.tsx": { @@ -175,6 +704,15 @@ "src/components/images/Gallery/index.tsx": { "@typescript-eslint/no-explicit-any": { "count": 5 + }, + "@typescript-eslint/no-unsafe-call": { + "count": 1 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 4 + }, + "react-hooks/refs": { + "count": 1 } }, "src/components/images/Gallery/useKeyboardHandlers.ts": { @@ -197,6 +735,51 @@ "count": 2 } }, + "src/components/intents/VerifyEmailIntentDialog.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 1 + } + }, + "src/components/interstitials/TrendingVideos.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/components/moderation/ContentHider.tsx": { + "react-hooks/immutability": { + "count": 1 + } + }, + "src/components/moderation/LabelsOnMeDialog.tsx": { + "react-hooks/purity": { + "count": 1 + } + }, + "src/components/moderation/ModerationDetailsDialog.tsx": { + "react-hooks/purity": { + "count": 1 + } + }, + "src/components/verification/VerificationCreatePrompt.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 1 + } + }, + "src/components/verification/VerificationRemovePrompt.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 1 + } + }, + "src/features/liveEvents/preferences.ts": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/features/liveNow/components/LiveStatusDialog.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, "src/features/liveNow/index.tsx": { "@typescript-eslint/no-explicit-any": { "count": 3 @@ -205,6 +788,12 @@ "src/geolocation/service.ts": { "@typescript-eslint/no-explicit-any": { "count": 2 + }, + "@typescript-eslint/no-misused-promises": { + "count": 1 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 2 } }, "src/lib/ScrollContext.tsx": { @@ -212,9 +801,22 @@ "count": 3 } }, + "src/lib/api/feed/demo.ts": { + "@typescript-eslint/require-await": { + "count": 2 + } + }, + "src/lib/api/feed/posts.ts": { + "@typescript-eslint/require-await": { + "count": 1 + } + }, "src/lib/api/index.ts": { "@typescript-eslint/no-explicit-any": { "count": 5 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 3 } }, "src/lib/async/retry.ts": { @@ -232,9 +834,20 @@ "count": 1 } }, + "src/lib/custom-animations/CountWheel.web.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, "src/lib/functions.ts": { "@typescript-eslint/no-explicit-any": { "count": 6 + }, + "@typescript-eslint/no-unsafe-call": { + "count": 2 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 25 } }, "src/lib/getUserDisplayName.ts": { @@ -242,19 +855,80 @@ "count": 1 } }, + "src/lib/haptics.ts": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, "src/lib/hooks/useAccountSwitcher.ts": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 1 + } + }, + "src/lib/hooks/useAnimatedValue.ts": { + "react-hooks/refs": { + "count": 1 + } + }, + "src/lib/hooks/useDraggableScrollView.ts": { + "react-hooks/refs": { + "count": 1 + } + }, + "src/lib/hooks/useIntentHandler.ts": { + "@typescript-eslint/no-floating-promises": { + "count": 2 } }, "src/lib/hooks/useNonReactiveCallback.ts": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-unsafe-call": { + "count": 1 + } + }, + "src/lib/hooks/useNotificationHandler.ts": { + "@typescript-eslint/no-floating-promises": { + "count": 16 + }, + "@typescript-eslint/require-await": { + "count": 1 } }, "src/lib/hooks/useOTAUpdates.ts": { "@typescript-eslint/no-explicit-any": { "count": 2 + }, + "@typescript-eslint/no-floating-promises": { + "count": 1 + }, + "@typescript-eslint/no-misused-promises": { + "count": 4 + } + }, + "src/lib/hooks/useOpenLink.ts": { + "@typescript-eslint/no-floating-promises": { + "count": 2 + }, + "@typescript-eslint/require-await": { + "count": 1 + } + }, + "src/lib/hooks/usePermissions.ts": { + "@typescript-eslint/no-misused-promises": { + "count": 1 + }, + "@typescript-eslint/no-unsafe-enum-comparison": { + "count": 5 + } + }, + "src/lib/hooks/usePermissions.web.ts": { + "@typescript-eslint/require-await": { + "count": 3 } }, "src/lib/hooks/useRequireEmailVerification.tsx": { @@ -262,14 +936,33 @@ "count": 2 } }, + "src/lib/hooks/useTLDs.ts": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/lib/hooks/useTabFocusEffect.ts": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, "src/lib/hooks/useToggleMutationQueue.ts": { "@typescript-eslint/no-explicit-any": { "count": 2 + }, + "@typescript-eslint/no-floating-promises": { + "count": 1 + }, + "@typescript-eslint/no-unsafe-call": { + "count": 2 } }, "src/lib/hooks/useWebScrollRestoration.ts": { "@typescript-eslint/no-explicit-any": { "count": 2 + }, + "react-hooks/immutability": { + "count": 1 } }, "src/lib/international-telephone-codes.ts": { @@ -277,9 +970,30 @@ "count": 1 } }, + "src/lib/link-meta/link-meta.ts": { + "@typescript-eslint/no-unsafe-member-access": { + "count": 9 + } + }, "src/lib/media/manip.ts": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-floating-promises": { + "count": 5 + } + }, + "src/lib/media/manip.web.ts": { + "@typescript-eslint/prefer-promise-reject-errors": { + "count": 1 + }, + "@typescript-eslint/require-await": { + "count": 3 + } + }, + "src/lib/media/picker.web.tsx": { + "@typescript-eslint/require-await": { + "count": 2 } }, "src/lib/media/save-image.ios.ts": { @@ -297,9 +1011,34 @@ "count": 1 } }, + "src/lib/notifications/notifications.ts": { + "@typescript-eslint/no-floating-promises": { + "count": 5 + }, + "@typescript-eslint/no-misused-promises": { + "count": 1 + }, + "@typescript-eslint/no-unsafe-enum-comparison": { + "count": 2 + }, + "@typescript-eslint/require-await": { + "count": 1 + } + }, "src/lib/react-query.tsx": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 1 + }, + "react-hooks/refs": { + "count": 1 + } + }, + "src/lib/routes/links.ts": { + "@typescript-eslint/no-redundant-type-constituents": { + "count": 1 } }, "src/lib/routes/router.ts": { @@ -312,82 +1051,298 @@ "count": 1 } }, + "src/lib/sharing.ts": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, "src/lib/strings/errors.ts": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-unsafe-call": { + "count": 14 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 14 + } + }, + "src/lib/translation/index.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/lib/useGetEmojis/getEmojis.ts": { + "@typescript-eslint/require-await": { + "count": 1 + } + }, + "src/logger/transports/sentry.ts": { + "@typescript-eslint/no-unsafe-enum-comparison": { + "count": 3 + } + }, + "src/logger/types.ts": { + "@typescript-eslint/no-redundant-type-constituents": { + "count": 1 } }, "src/screens/Bookmarks/index.tsx": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-misused-promises": { + "count": 3 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 2 } }, "src/screens/Deactivated.tsx": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-floating-promises": { + "count": 1 + }, + "@typescript-eslint/no-misused-promises": { + "count": 1 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 1 + } + }, + "src/screens/E2E/SharedPreferencesTesterScreen.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 6 + }, + "@typescript-eslint/require-await": { + "count": 6 + } + }, + "src/screens/Feeds/NoFollowingFeed.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/screens/Feeds/NoSavedFeedsOfAnyType.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 1 + } + }, + "src/screens/Hashtag.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 2 + }, + "@typescript-eslint/no-misused-promises": { + "count": 1 + } + }, + "src/screens/Home/NoFeedsPinned.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 1 + } + }, + "src/screens/List/ListHiddenScreen.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 3 + }, + "@typescript-eslint/no-misused-promises": { + "count": 1 + } + }, + "src/screens/Log.tsx": { + "@typescript-eslint/no-unsafe-enum-comparison": { + "count": 2 } }, "src/screens/Login/ChooseAccountForm.tsx": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-misused-promises": { + "count": 1 } }, "src/screens/Login/ForgotPasswordForm.tsx": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-misused-promises": { + "count": 1 + }, + "@typescript-eslint/no-unsafe-call": { + "count": 1 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 1 } }, "src/screens/Login/LoginForm.tsx": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-floating-promises": { + "count": 1 + }, + "@typescript-eslint/no-misused-promises": { + "count": 3 + }, + "@typescript-eslint/no-unsafe-call": { + "count": 4 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 4 + }, + "react-hooks/refs": { + "count": 1 } }, "src/screens/Login/SetNewPasswordForm.tsx": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-misused-promises": { + "count": 2 + }, + "@typescript-eslint/no-unsafe-call": { + "count": 1 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 1 + } + }, + "src/screens/Login/index.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 1 + }, + "react-hooks/purity": { + "count": 1 + }, + "react-hooks/refs": { + "count": 1 + }, + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/screens/Messages/ChatList.tsx": { + "react-hooks/immutability": { + "count": 1 } }, "src/screens/Moderation/index.tsx": { "@typescript-eslint/no-explicit-any": { "count": 2 + }, + "@typescript-eslint/no-floating-promises": { + "count": 1 + }, + "@typescript-eslint/no-misused-promises": { + "count": 2 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 2 } }, "src/screens/ModerationInteractionSettings/index.tsx": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-misused-promises": { + "count": 1 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 1 + } + }, + "src/screens/Onboarding/StepFinished/ValuePropositionPager.tsx": { + "react-hooks/refs": { + "count": 4 } }, "src/screens/Onboarding/StepFinished/index.tsx": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-misused-promises": { + "count": 1 } }, "src/screens/Onboarding/StepInterests/index.tsx": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-misused-promises": { + "count": 1 + }, + "@typescript-eslint/require-await": { + "count": 1 + } + }, + "src/screens/Onboarding/StepProfile/index.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 2 + }, + "@typescript-eslint/no-misused-promises": { + "count": 1 + } + }, + "src/screens/Onboarding/StepSuggestedStarterpacks/StarterPackCard.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 1 + } + }, + "src/screens/Onboarding/StepSuggestedStarterpacks/index.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 1 } }, "src/screens/PostThread/components/ThreadItemAnchorFollowButton.tsx": { "@typescript-eslint/no-explicit-any": { "count": 2 + }, + "@typescript-eslint/no-unsafe-call": { + "count": 2 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 4 } }, "src/screens/PostThread/index.tsx": { "@typescript-eslint/no-explicit-any": { "count": 2 }, + "@typescript-eslint/no-misused-promises": { + "count": 1 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 3 + }, "react-hooks/preserve-manual-memoization": { "count": 1 + }, + "react-hooks/refs": { + "count": 4 } }, "src/screens/Profile/Header/EditProfileDialog.tsx": { "@typescript-eslint/no-explicit-any": { "count": 3 + }, + "@typescript-eslint/no-misused-promises": { + "count": 1 } }, "src/screens/Profile/Header/ProfileHeaderLabeler.tsx": { "@typescript-eslint/no-explicit-any": { "count": 2 + }, + "@typescript-eslint/no-misused-promises": { + "count": 1 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 3 } }, "src/screens/Profile/Header/Shell.tsx": { @@ -395,29 +1350,164 @@ "count": 1 } }, + "src/screens/Profile/KnownFollowers.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 2 + } + }, "src/screens/Profile/Sections/Feed.tsx": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-floating-promises": { + "count": 1 } }, "src/screens/Profile/components/GermButton.tsx": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 1 + } + }, + "src/screens/Profile/components/ProfileFeedHeader.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + }, + "@typescript-eslint/no-misused-promises": { + "count": 5 + } + }, + "src/screens/ProfileList/FeedSection.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/screens/ProfileList/components/Header.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 3 + } + }, + "src/screens/ProfileList/components/MoreOptionsMenu.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + }, + "@typescript-eslint/no-misused-promises": { + "count": 5 + } + }, + "src/screens/ProfileList/components/SubscribeMenu.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 2 + } + }, + "src/screens/ProfileList/index.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/screens/SavedFeeds.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 2 + } + }, + "src/screens/Search/Shell.tsx": { + "react-hooks/refs": { + "count": 4 + } + }, + "src/screens/Search/modules/ExploreSuggestedAccounts.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/screens/Search/modules/ExploreTrendingTopics.tsx": { + "react-hooks/purity": { + "count": 2 + } + }, + "src/screens/Search/modules/ExploreTrendingVideos.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/screens/Settings/AboutSettings.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/screens/Settings/AppPasswords.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 1 + } + }, + "src/screens/Settings/AutomationLabelSettings.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 2 } }, "src/screens/Settings/FindContactsSettings.tsx": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-floating-promises": { + "count": 3 + }, + "@typescript-eslint/no-misused-promises": { + "count": 1 + }, + "@typescript-eslint/require-await": { + "count": 1 + } + }, + "src/screens/Settings/InterestsSettings.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + }, + "@typescript-eslint/no-misused-promises": { + "count": 1 + }, + "@typescript-eslint/require-await": { + "count": 1 + } + }, + "src/screens/Settings/components/ChangeHandleDialog.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 4 + }, + "@typescript-eslint/no-misused-promises": { + "count": 1 } }, "src/screens/Settings/components/ChangePasswordDialog.tsx": { "@typescript-eslint/no-explicit-any": { "count": 2 + }, + "@typescript-eslint/no-misused-promises": { + "count": 2 + }, + "@typescript-eslint/no-unsafe-call": { + "count": 2 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 2 + } + }, + "src/screens/Settings/components/CopyButton.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 } }, "src/screens/Settings/components/DeactivateAccountDialog.tsx": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-misused-promises": { + "count": 1 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 1 } }, "src/screens/Settings/components/DeleteAccountDialog.tsx": { @@ -425,14 +1515,114 @@ "count": 2 } }, + "src/screens/Settings/components/DisableEmail2FADialog.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 4 + } + }, + "src/screens/Settings/components/OTAInfo.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/screens/Signup/StepCaptcha/CaptchaWebView.tsx": { + "react-hooks/purity": { + "count": 1 + } + }, + "src/screens/Signup/StepHandle/index.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 1 + } + }, "src/screens/Signup/StepInfo/Policies.tsx": { "@typescript-eslint/no-explicit-any": { "count": 1 } }, + "src/screens/Signup/StepInfo/index.tsx": { + "react-hooks/refs": { + "count": 3 + } + }, "src/screens/SignupQueued.tsx": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-floating-promises": { + "count": 1 + }, + "@typescript-eslint/no-misused-promises": { + "count": 2 + }, + "@typescript-eslint/no-unsafe-call": { + "count": 1 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 1 + }, + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/screens/StarterPack/StarterPackLandingScreen.tsx": { + "@typescript-eslint/no-unsafe-call": { + "count": 1 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 1 + } + }, + "src/screens/StarterPack/StarterPackScreen.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + }, + "@typescript-eslint/no-misused-promises": { + "count": 2 + }, + "@typescript-eslint/require-await": { + "count": 1 + } + }, + "src/screens/StarterPack/Wizard/StepFeeds.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 1 + } + }, + "src/screens/StarterPack/Wizard/StepProfiles.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 1 + } + }, + "src/screens/StarterPack/Wizard/index.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 2 + }, + "@typescript-eslint/require-await": { + "count": 1 + } + }, + "src/screens/Topic.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 2 + }, + "@typescript-eslint/no-misused-promises": { + "count": 1 + } + }, + "src/state/a11y.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/state/cache/profile-shadow.ts": { + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/state/cache/thread-mutes.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 2 } }, "src/state/cache/types.ts": { @@ -443,31 +1633,213 @@ "src/state/feed-feedback.tsx": { "@typescript-eslint/no-explicit-any": { "count": 3 + }, + "react-hooks/refs": { + "count": 2 + } + }, + "src/state/gallery.ts": { + "@typescript-eslint/prefer-promise-reject-errors": { + "count": 1 } }, "src/state/messages/events/agent.ts": { "@typescript-eslint/no-explicit-any": { "count": 2 + }, + "@typescript-eslint/no-floating-promises": { + "count": 4 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 2 + } + }, + "src/state/messages/message-drafts.tsx": { + "react-hooks/refs": { + "count": 1 } }, "src/state/persisted/index.ts": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-unsafe-call": { + "count": 1 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 1 } }, "src/state/persisted/index.web.ts": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-misused-promises": { + "count": 1 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 4 } }, "src/state/persisted/util.ts": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 1 + } + }, + "src/state/preferences/alt-text-required.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/state/preferences/autoplay.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/state/preferences/disable-haptics.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/state/preferences/external-embeds-prefs.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/state/preferences/hidden-posts.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/state/preferences/in-app-browser.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/state/preferences/kawaii.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + }, + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/state/preferences/languages.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/state/preferences/large-alt-badge.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/state/preferences/subtitles.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/state/preferences/trending.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/state/preferences/used-starter-packs.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/state/queries/activity-subscriptions.ts": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/state/queries/actor-autocomplete.ts": { + "react-hooks/immutability": { + "count": 2 + } + }, + "src/state/queries/app-passwords.ts": { + "@typescript-eslint/no-floating-promises": { + "count": 2 + } + }, + "src/state/queries/bookmarks/useBookmarkMutation.ts": { + "@typescript-eslint/no-floating-promises": { + "count": 2 + } + }, + "src/state/queries/bookmarks/useBookmarksQuery.ts": { + "@typescript-eslint/require-await": { + "count": 2 + } + }, + "src/state/queries/explore-feed-previews.tsx": { + "react-hooks/refs": { + "count": 4 + } + }, + "src/state/queries/feed.ts": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/state/queries/handle.ts": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/state/queries/list-memberships.ts": { + "@typescript-eslint/no-floating-promises": { + "count": 2 + } + }, + "src/state/queries/list.ts": { + "@typescript-eslint/no-floating-promises": { + "count": 7 + } + }, + "src/state/queries/messages/accept-conversation.ts": { + "@typescript-eslint/no-floating-promises": { + "count": 2 + } + }, + "src/state/queries/messages/update-all-read.ts": { + "@typescript-eslint/no-floating-promises": { + "count": 3 + } + }, + "src/state/queries/my-lists.ts": { + "@typescript-eslint/no-floating-promises": { + "count": 2 } }, "src/state/queries/notifications/feed.ts": { "@typescript-eslint/no-explicit-any": { "count": 2 + }, + "@typescript-eslint/no-floating-promises": { + "count": 2 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 2 + } + }, + "src/state/queries/notifications/unread.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 4 + }, + "@typescript-eslint/no-misused-promises": { + "count": 1 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 4 + }, + "react-hooks/refs": { + "count": 1 } }, "src/state/queries/nuxs/definitions.ts": { @@ -478,109 +1850,386 @@ "src/state/queries/pinned-post.ts": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-floating-promises": { + "count": 2 } }, "src/state/queries/post-feed.ts": { "@typescript-eslint/no-explicit-any": { "count": 3 + }, + "@typescript-eslint/no-floating-promises": { + "count": 3 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 3 } }, "src/state/queries/postgate/index.ts": { "@typescript-eslint/no-explicit-any": { "count": 2 + }, + "@typescript-eslint/no-floating-promises": { + "count": 1 + }, + "@typescript-eslint/no-unsafe-call": { + "count": 2 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 3 + }, + "@typescript-eslint/require-await": { + "count": 2 + } + }, + "src/state/queries/preferences/index.ts": { + "react-hooks/immutability": { + "count": 1 + } + }, + "src/state/queries/preferences/useThreadPreferences.ts": { + "react-hooks/refs": { + "count": 2 } }, "src/state/queries/search-posts.ts": { "@typescript-eslint/no-explicit-any": { "count": 2 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 2 + } + }, + "src/state/queries/starter-packs.ts": { + "@typescript-eslint/require-await": { + "count": 1 + }, + "react-hooks/immutability": { + "count": 1 + } + }, + "src/state/queries/suggested-follows.ts": { + "@typescript-eslint/no-unused-vars": { + "count": 1 } }, "src/state/queries/threadgate/index.ts": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-floating-promises": { + "count": 3 + }, + "@typescript-eslint/no-unsafe-call": { + "count": 2 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 2 + }, + "@typescript-eslint/require-await": { + "count": 3 } }, "src/state/queries/util.ts": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 1 } }, "src/state/session/agent.ts": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-floating-promises": { + "count": 1 + }, + "@typescript-eslint/require-await": { + "count": 1 + } + }, + "src/state/shell/color-mode.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 2 + } + }, + "src/state/shell/composer/index.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/state/shell/onboarding.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 5 } }, "src/state/shell/progress-guide.tsx": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-floating-promises": { + "count": 4 + } + }, + "src/state/shell/reminders.ts": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/state/shell/tick-every-minute.tsx": { + "react-hooks/purity": { + "count": 1 + } + }, + "src/storage/archive/index.ts": { + "@typescript-eslint/no-unsafe-member-access": { + "count": 1 } }, "src/storage/index.ts": { "@typescript-eslint/no-explicit-any": { "count": 8 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 1 + } + }, + "src/view/com/auth/SplashScreen.web.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 } }, "src/view/com/composer/Composer.tsx": { "@typescript-eslint/no-explicit-any": { "count": 2 }, + "@typescript-eslint/no-floating-promises": { + "count": 1 + }, + "@typescript-eslint/no-misused-promises": { + "count": 4 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 2 + }, + "react-hooks/immutability": { + "count": 2 + }, "react-hooks/preserve-manual-memoization": { "count": 3 + }, + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/view/com/composer/SelectMediaButton.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + }, + "@typescript-eslint/no-misused-promises": { + "count": 1 + } + }, + "src/view/com/composer/drafts/DraftsButton.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 1 } }, "src/view/com/composer/drafts/state/queries.ts": { "@typescript-eslint/no-explicit-any": { "count": 2 + }, + "@typescript-eslint/no-floating-promises": { + "count": 2 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 2 + } + }, + "src/view/com/composer/drafts/state/storage.ts": { + "@typescript-eslint/require-await": { + "count": 3 + } + }, + "src/view/com/composer/photos/EditImageDialog.web.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 1 + } + }, + "src/view/com/composer/photos/Gallery.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 } }, "src/view/com/composer/photos/OpenCameraBtn.tsx": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-misused-promises": { + "count": 1 + } + }, + "src/view/com/composer/select-language/SuggestedLanguage.tsx": { + "react-hooks/refs": { + "count": 1 + }, + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/view/com/composer/text-input/TextInput.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + }, + "@typescript-eslint/no-misused-promises": { + "count": 1 + } + }, + "src/view/com/composer/text-input/TextInput.web.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 1 + }, + "react-hooks/refs": { + "count": 1 + } + }, + "src/view/com/composer/text-input/web/Autocomplete.tsx": { + "@typescript-eslint/no-unsafe-member-access": { + "count": 2 + }, + "react-hooks/set-state-in-effect": { + "count": 1 + } + }, + "src/view/com/composer/videos/pickVideo.web.ts": { + "@typescript-eslint/no-misused-promises": { + "count": 1 } }, "src/view/com/feeds/ComposerPrompt.tsx": { "@typescript-eslint/no-explicit-any": { "count": 2 + }, + "@typescript-eslint/no-floating-promises": { + "count": 2 + } + }, + "src/view/com/feeds/FeedPage.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 2 } }, "src/view/com/feeds/ProfileFeedgens.tsx": { "@typescript-eslint/no-explicit-any": { "count": 3 + }, + "@typescript-eslint/no-floating-promises": { + "count": 2 + }, + "@typescript-eslint/no-misused-promises": { + "count": 3 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 2 } }, "src/view/com/lists/ListMembers.tsx": { "@typescript-eslint/no-explicit-any": { "count": 3 + }, + "@typescript-eslint/no-floating-promises": { + "count": 1 + }, + "@typescript-eslint/no-misused-promises": { + "count": 2 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 2 } }, "src/view/com/lists/MyLists.tsx": { "@typescript-eslint/no-explicit-any": { "count": 2 + }, + "@typescript-eslint/no-misused-promises": { + "count": 3 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 6 } }, "src/view/com/lists/ProfileLists.tsx": { "@typescript-eslint/no-explicit-any": { "count": 3 + }, + "@typescript-eslint/no-floating-promises": { + "count": 2 + }, + "@typescript-eslint/no-misused-promises": { + "count": 3 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 2 + } + }, + "src/view/com/modals/Modal.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 1 + }, + "@typescript-eslint/require-await": { + "count": 1 + }, + "react-hooks/refs": { + "count": 1 } }, "src/view/com/notifications/NotificationFeed.tsx": { "@typescript-eslint/no-explicit-any": { "count": 2 + }, + "@typescript-eslint/no-floating-promises": { + "count": 1 + }, + "@typescript-eslint/no-misused-promises": { + "count": 2 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 6 + }, + "react-hooks/set-state-in-effect": { + "count": 1 } }, "src/view/com/notifications/NotificationFeedItem.tsx": { "@typescript-eslint/no-explicit-any": { "count": 3 + }, + "@typescript-eslint/no-misused-promises": { + "count": 3 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 2 } }, "src/view/com/pager/Pager.tsx": { "@typescript-eslint/no-explicit-any": { "count": 4 + }, + "react-hooks/refs": { + "count": 1 } }, "src/view/com/pager/Pager.web.tsx": { + "react-hooks/immutability": { + "count": 1 + }, "react-hooks/preserve-manual-memoization": { "count": 1 + }, + "react-hooks/refs": { + "count": 1 } }, "src/view/com/pager/PagerWithHeader.tsx": { @@ -593,14 +2242,46 @@ "count": 2 } }, + "src/view/com/pager/TabBar.tsx": { + "react-hooks/immutability": { + "count": 1 + } + }, "src/view/com/pager/TabBar.web.tsx": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-unsafe-call": { + "count": 2 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 4 + } + }, + "src/view/com/post-thread/PostLikedBy.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 2 + } + }, + "src/view/com/post-thread/PostQuotes.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 2 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 1 + } + }, + "src/view/com/post-thread/PostRepostedBy.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 2 } }, "src/view/com/posts/FeedShutdownMsg.tsx": { "@typescript-eslint/no-explicit-any": { "count": 2 + }, + "@typescript-eslint/no-misused-promises": { + "count": 2 } }, "src/view/com/posts/PostFeed.tsx": { @@ -611,16 +2292,47 @@ "src/view/com/posts/PostFeedErrorMessage.tsx": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-unsafe-call": { + "count": 8 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 9 + } + }, + "src/view/com/profile/ProfileFollowers.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 2 + } + }, + "src/view/com/profile/ProfileFollows.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 2 } }, "src/view/com/profile/ProfileMenu.tsx": { "@typescript-eslint/no-explicit-any": { "count": 6 + }, + "@typescript-eslint/no-floating-promises": { + "count": 4 + }, + "@typescript-eslint/no-misused-promises": { + "count": 3 + }, + "@typescript-eslint/no-unsafe-call": { + "count": 6 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 12 } }, "src/view/com/testing/TestCtrls.e2e.tsx": { "@typescript-eslint/no-explicit-any": { - "count": 2 + "count": 1 + }, + "@typescript-eslint/no-misused-promises": { + "count": 9 } }, "src/view/com/util/EmptyState.tsx": { @@ -631,16 +2343,36 @@ "src/view/com/util/ErrorBoundary.tsx": { "@typescript-eslint/no-explicit-any": { "count": 2 + }, + "@typescript-eslint/no-unsafe-call": { + "count": 1 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 1 } }, "src/view/com/util/EventStopper.tsx": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-unsafe-call": { + "count": 1 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 1 } }, "src/view/com/util/Link.tsx": { "@typescript-eslint/no-explicit-any": { "count": 2 + }, + "@typescript-eslint/no-misused-promises": { + "count": 2 + } + }, + "src/view/com/util/LoadingPlaceholder.tsx": { + "react-hooks/purity": { + "count": 1 } }, "src/view/com/util/MainScrollProvider.tsx": { @@ -648,9 +2380,22 @@ "count": 2 } }, + "src/view/com/util/UserAvatar.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 3 + } + }, + "src/view/com/util/UserBanner.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 3 + } + }, "src/view/com/util/ViewSelector.tsx": { "@typescript-eslint/no-explicit-any": { "count": 6 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 1 } }, "src/view/com/util/Views.tsx": { @@ -658,14 +2403,101 @@ "count": 1 } }, + "src/view/com/util/Views.web.tsx": { + "@typescript-eslint/no-unsafe-member-access": { + "count": 1 + } + }, + "src/view/com/util/forms/Button.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 1 + } + }, "src/view/screens/Debug.tsx": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 4 + } + }, + "src/view/screens/Feeds.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 3 + }, + "@typescript-eslint/no-misused-promises": { + "count": 1 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 1 + } + }, + "src/view/screens/Home.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + } + }, + "src/view/screens/ModerationBlockedAccounts.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 3 + } + }, + "src/view/screens/ModerationMutedAccounts.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 3 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 1 + } + }, + "src/view/screens/Notifications.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 3 + } + }, + "src/view/screens/Storybook/ListContained.tsx": { + "@typescript-eslint/no-unsafe-call": { + "count": 1 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 2 + } + }, + "src/view/screens/Storybook/Storybook.tsx": { + "@typescript-eslint/no-misused-promises": { + "count": 1 + } + }, + "src/view/shell/Drawer.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 2 } }, "src/view/shell/createNativeStackNavigatorWithAuth.tsx": { "@typescript-eslint/no-explicit-any": { "count": 1 + }, + "@typescript-eslint/no-unsafe-call": { + "count": 1 + }, + "react-hooks/refs": { + "count": 13 + } + }, + "src/view/shell/desktop/Search.tsx": { + "@typescript-eslint/no-unsafe-call": { + "count": 3 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 3 + }, + "react-hooks/refs": { + "count": 3 + } + }, + "src/view/shell/index.web.tsx": { + "react-hooks/set-state-in-effect": { + "count": 1 } } } \ No newline at end of file diff --git a/eslint.config.mjs b/eslint.config.mjs index 50ab8e5da4..c8addf66ae 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -134,11 +134,10 @@ export default defineConfig( 'react-native/no-inline-styles': 'off', ...reactNativeA11y.configs.all.rules, 'react-compiler/react-compiler': 'warn', - // TODO: Fix these and set to error - 'react-hooks/set-state-in-effect': 'warn', - 'react-hooks/purity': 'warn', - 'react-hooks/refs': 'warn', - 'react-hooks/immutability': 'warn', + 'react-hooks/set-state-in-effect': 'error', + 'react-hooks/purity': 'error', + 'react-hooks/refs': 'error', + 'react-hooks/immutability': 'error', /** * Import sorting @@ -235,9 +234,8 @@ export default defineConfig( }, ], /** - * Maintain previous behavior - these are stricter in typescript-eslint - * v8 `warn` ones are probably worth fixing. `off` ones are a bit too - * nit-picky + * Maintain previous behavior via eslint-suppressions.json - these are + * stricter in typescript-eslint v8. `off` ones are a bit too nit-picky. */ '@typescript-eslint/no-explicit-any': 'error', '@typescript-eslint/ban-ts-comment': 'off', @@ -247,18 +245,18 @@ export default defineConfig( '@typescript-eslint/unbound-method': 'off', '@typescript-eslint/no-unsafe-argument': 'off', '@typescript-eslint/no-unsafe-return': 'off', - '@typescript-eslint/no-unsafe-member-access': 'warn', - '@typescript-eslint/no-unsafe-call': 'warn', - '@typescript-eslint/no-floating-promises': 'warn', - '@typescript-eslint/no-misused-promises': 'warn', - '@typescript-eslint/require-await': 'warn', - '@typescript-eslint/no-unsafe-enum-comparison': 'warn', - '@typescript-eslint/no-unnecessary-type-assertion': 'warn', - '@typescript-eslint/no-redundant-type-constituents': 'warn', - '@typescript-eslint/no-duplicate-type-constituents': 'warn', - '@typescript-eslint/no-base-to-string': 'warn', - '@typescript-eslint/prefer-promise-reject-errors': 'warn', - '@typescript-eslint/await-thenable': 'warn', + '@typescript-eslint/no-unsafe-member-access': 'error', + '@typescript-eslint/no-unsafe-call': 'error', + '@typescript-eslint/no-floating-promises': 'error', + '@typescript-eslint/no-misused-promises': 'error', + '@typescript-eslint/require-await': 'error', + '@typescript-eslint/no-unsafe-enum-comparison': 'error', + '@typescript-eslint/no-unnecessary-type-assertion': 'error', + '@typescript-eslint/no-redundant-type-constituents': 'error', + '@typescript-eslint/no-duplicate-type-constituents': 'error', + '@typescript-eslint/no-base-to-string': 'error', + '@typescript-eslint/prefer-promise-reject-errors': 'error', + '@typescript-eslint/await-thenable': 'error', 'no-restricted-imports': [ 'error', diff --git a/src/components/Toast/Toast.tsx b/src/components/Toast/Toast.tsx index ac5bc4889a..3e11cf051e 100644 --- a/src/components/Toast/Toast.tsx +++ b/src/components/Toast/Toast.tsx @@ -8,8 +8,10 @@ import { type UninheritableButtonProps, } from '#/components/Button' import {CircleCheck_Stroke2_Corner0_Rounded as CircleCheck} from '#/components/icons/CircleCheck' -import {CircleInfo_Stroke2_Corner0_Rounded as CircleInfo} from '#/components/icons/CircleInfo' -import {CircleInfo_Stroke2_Corner0_Rounded as ErrorIcon} from '#/components/icons/CircleInfo' +import { + CircleInfo_Stroke2_Corner0_Rounded as CircleInfo, + CircleInfo_Stroke2_Corner0_Rounded as ErrorIcon, +} from '#/components/icons/CircleInfo' import {type Props as SVGIconProps} from '#/components/icons/common' import {Warning_Stroke2_Corner0_Rounded as WarningIcon} from '#/components/icons/Warning' import {dismiss} from '#/components/Toast/sonner' diff --git a/src/lib/hooks/useTimeAgo.ts b/src/lib/hooks/useTimeAgo.ts index 67398ec547..ffc808a91f 100644 --- a/src/lib/hooks/useTimeAgo.ts +++ b/src/lib/hooks/useTimeAgo.ts @@ -58,12 +58,12 @@ export function dateDiff( if (diffSeconds < NOW) { diff = { value: 0, - unit: 'now' as DateDiff['unit'], + unit: 'now', } } else if (diffSeconds < MINUTE) { diff = { value: diffSeconds, - unit: 'second' as DateDiff['unit'], + unit: 'second', } } else if (diffSeconds < HOUR) { const value = @@ -72,7 +72,7 @@ export function dateDiff( : Math.floor(diffSeconds / MINUTE) diff = { value, - unit: 'minute' as DateDiff['unit'], + unit: 'minute', } } else if (diffSeconds < DAY) { const value = @@ -81,7 +81,7 @@ export function dateDiff( : Math.floor(diffSeconds / HOUR) diff = { value, - unit: 'hour' as DateDiff['unit'], + unit: 'hour', } } else if (diffSeconds < MONTH_30) { const value = @@ -90,7 +90,7 @@ export function dateDiff( : Math.floor(diffSeconds / DAY) diff = { value, - unit: 'day' as DateDiff['unit'], + unit: 'day', } } else { const value = @@ -99,7 +99,7 @@ export function dateDiff( : Math.floor(diffSeconds / MONTH_30) diff = { value, - unit: 'month' as DateDiff['unit'], + unit: 'month', } } diff --git a/src/lib/routes/links.ts b/src/lib/routes/links.ts index 908db7cba7..c87ccb5a39 100644 --- a/src/lib/routes/links.ts +++ b/src/lib/routes/links.ts @@ -19,8 +19,8 @@ export function makeProfileLink( export function makeCustomFeedLink( did: string, rkey: string, - segment?: string | undefined, - feedCacheKey?: 'discover' | 'explore' | undefined, + segment?: string, + feedCacheKey?: 'discover' | 'explore', ) { return ( [`/profile`, did, 'feed', rkey, ...(segment ? [segment] : [])].join('/') + diff --git a/src/screens/Settings/AppIconSettings/index.tsx b/src/screens/Settings/AppIconSettings/index.tsx index 183e161a8d..2e716a219f 100644 --- a/src/screens/Settings/AppIconSettings/index.tsx +++ b/src/screens/Settings/AppIconSettings/index.tsx @@ -129,7 +129,7 @@ function getAppIconName(icon: string | false): DynamicAppIcon.IconName { if (!icon || icon === 'DEFAULT') { return 'default_light' } else { - return icon as DynamicAppIcon.IconName + return icon } } @@ -151,7 +151,7 @@ function Group({ values={[value]} maxSelections={1} onChange={vals => { - if (vals[0]) onChange(vals[0] as DynamicAppIcon.IconName) + if (vals[0]) onChange(vals[0]) }}> {children} diff --git a/src/screens/VideoFeed/components/Scrubber.tsx b/src/screens/VideoFeed/components/Scrubber.tsx index 85bd4fddfd..acaf02453c 100644 --- a/src/screens/VideoFeed/components/Scrubber.tsx +++ b/src/screens/VideoFeed/components/Scrubber.tsx @@ -23,8 +23,7 @@ import { import {useEventListener} from 'expo' import {type VideoPlayer} from 'expo-video' -import {tokens} from '#/alf' -import {atoms as a} from '#/alf' +import {atoms as a, tokens} from '#/alf' import {formatTime} from '#/components/Post/Embed/VideoEmbed/VideoEmbedInner/web-controls/utils' import {Text} from '#/components/Typography' diff --git a/src/state/queries/notifications/feed.ts b/src/state/queries/notifications/feed.ts index 57d83cb5bb..ca885107d8 100644 --- a/src/state/queries/notifications/feed.ts +++ b/src/state/queries/notifications/feed.ts @@ -298,7 +298,7 @@ export function* findAllPostsInQueryData( if (AppBskyFeedDefs.isPostView(item.subject)) { const quotedPost = getEmbeddedPost(item.subject?.embed) if (quotedPost && didOrHandleUriMatches(atUri, quotedPost)) { - yield embedViewRecordToPostView(quotedPost!) + yield embedViewRecordToPostView(quotedPost) } } } diff --git a/src/state/queries/nuxs/util.ts b/src/state/queries/nuxs/util.ts index ef323b422e..dea35a9166 100644 --- a/src/state/queries/nuxs/util.ts +++ b/src/state/queries/nuxs/util.ts @@ -34,7 +34,7 @@ export function parseAppNux(nux: AppBskyActorDefs.Nux): AppNux | undefined { export function serializeAppNux(nux: AppNux): AppBskyActorDefs.Nux { const {data, ...rest} = nux - const schema = NuxSchemas[nux.id as Nux] + const schema = NuxSchemas[nux.id] const result: AppBskyActorDefs.Nux = { ...rest, diff --git a/src/state/queries/suggested-follows.ts b/src/state/queries/suggested-follows.ts index c1ec4a12a7..7197eb2980 100644 --- a/src/state/queries/suggested-follows.ts +++ b/src/state/queries/suggested-follows.ts @@ -85,7 +85,7 @@ export function useSuggestedFollowsByActorWithDismiss({ const profiles = useMemo(() => { return (data?.suggestions ?? []).map(profile => ({ - actor: profile as bsky.profile.AnyProfileView, + actor: profile, recId: data?.recId, })) }, [data?.suggestions, data?.recId]) diff --git a/src/state/queries/usePostThread/traversal.ts b/src/state/queries/usePostThread/traversal.ts index 889c208c35..81abd958fb 100644 --- a/src/state/queries/usePostThread/traversal.ts +++ b/src/state/queries/usePostThread/traversal.ts @@ -196,7 +196,7 @@ export function sortAndAnnotateThreadItems( * `repliesSeenCounter` later on, since `repliesSeenCounter` * is 1-indexed and `replyIndex` is 0-indexed. */ - childMetadata!.replyIndex = + childMetadata.replyIndex = childParentMetadata.repliesSeenCounter } diff --git a/src/view/com/composer/drafts/state/api.ts b/src/view/com/composer/drafts/state/api.ts index 1099c1a0fd..8f178d5282 100644 --- a/src/view/com/composer/drafts/state/api.ts +++ b/src/view/com/composer/drafts/state/api.ts @@ -470,11 +470,11 @@ export async function draftToComposerPosts( height, mime: 'image/jpeg', }, - } as ComposerImage + } satisfies ComposerImage }) const images = (await Promise.all(imagePromises)).filter( - (img): img is ComposerImage => img !== null, + (img): img is NonNullable => img !== null, ) if (images.length > 0) { embed.media = {type: 'images', images} @@ -511,7 +511,7 @@ export async function draftToComposerPosts( tinygif: mediaObject, preview: mediaObject, }, - } as Gif, + }, alt: gifData.alt, } break diff --git a/src/view/com/testing/TestCtrls.e2e.tsx b/src/view/com/testing/TestCtrls.e2e.tsx index b01651d7b1..2110c9540e 100644 --- a/src/view/com/testing/TestCtrls.e2e.tsx +++ b/src/view/com/testing/TestCtrls.e2e.tsx @@ -55,7 +55,7 @@ export function TestCtrls() { accessibilityLabel="Text input field" accessibilityHint="Enter proxy header" testID="e2eProxyHeaderInput" - onChangeText={val => setProxyHeader(val as any)} + onChangeText={val => setProxyHeader(val)} autoComplete="off" autoCorrect={false} autoCapitalize="none" diff --git a/src/view/com/util/PressableWithHover.tsx b/src/view/com/util/PressableWithHover.tsx index f4006a5268..a4a2d194fd 100644 --- a/src/view/com/util/PressableWithHover.tsx +++ b/src/view/com/util/PressableWithHover.tsx @@ -3,9 +3,9 @@ import { Pressable, type PressableProps, type StyleProp, + type View, type ViewStyle, } from 'react-native' -import {type View} from 'react-native' import {addStyle} from '#/lib/styles' import {useInteractionState} from '#/components/hooks/useInteractionState' diff --git a/src/view/shell/createNativeStackNavigatorWithAuth.tsx b/src/view/shell/createNativeStackNavigatorWithAuth.tsx index 4191f94176..a23ed693ec 100644 --- a/src/view/shell/createNativeStackNavigatorWithAuth.tsx +++ b/src/view/shell/createNativeStackNavigatorWithAuth.tsx @@ -171,7 +171,7 @@ function NativeStackNavigator({ } // Evicted screens get a lightweight placeholder instead of their full tree - finalDescriptors = {} as typeof descriptors + finalDescriptors = {} for (const key in descriptors) { if (mountSet.has(key)) { finalDescriptors[key] = descriptors[key] From 4367b9d047c8a1175aa889b7295a4591ee89c8b2 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Wed, 3 Jun 2026 23:01:54 +0300 Subject: [PATCH 043/149] [Android] Fix horizontal swipes being cancelled when leaving bounds (#10712) --- src/view/shell/BlockDrawerGesture.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/view/shell/BlockDrawerGesture.tsx b/src/view/shell/BlockDrawerGesture.tsx index bae9a8db82..93ef18cfae 100644 --- a/src/view/shell/BlockDrawerGesture.tsx +++ b/src/view/shell/BlockDrawerGesture.tsx @@ -4,6 +4,8 @@ import {Gesture, GestureDetector} from 'react-native-gesture-handler' export function BlockDrawerGesture({children}: {children: React.ReactNode}) { const drawerGesture = useContext(DrawerGestureContext) ?? Gesture.Native() // noop for web - const scrollGesture = Gesture.Native().blocksExternalGesture(drawerGesture) + let scrollGesture = Gesture.Native() + .shouldCancelWhenOutside(false) // for some reason defaults to true on Android + .blocksExternalGesture(drawerGesture) return {children} } From f99837040e0eddecb22c54c855d30297d8e0e6c4 Mon Sep 17 00:00:00 2001 From: DS Boyce <260543580+ds-boyce@users.noreply.github.com> Date: Wed, 3 Jun 2026 13:21:13 -0700 Subject: [PATCH 044/149] Compile i18n before running lint (#10711) --- .github/workflows/bundle-deploy-eas-update.yml | 12 ++++++------ .github/workflows/pull-request-comment.yml | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/bundle-deploy-eas-update.yml b/.github/workflows/bundle-deploy-eas-update.yml index 983494dd18..5f1f0a4e28 100644 --- a/.github/workflows/bundle-deploy-eas-update.yml +++ b/.github/workflows/bundle-deploy-eas-update.yml @@ -71,18 +71,18 @@ jobs: profile: ${{ inputs.channel || 'testflight' }} previous-commit-tag: ${{ inputs.runtimeVersion }} - - name: Lint check - run: pnpm lint - - - name: Prettier check - run: pnpm prettier --check . - - name: 🔤 Compile translations run: pnpm intl:build 2>&1 | tee i18n.log - name: Check for i18n compilation errors run: if grep -q "invalid syntax" "i18n.log"; then echo "\n\nFound compilation errors!\n\n" && exit 1; else echo "\n\nNo compilation errors!\n\n"; fi + - name: Lint check + run: pnpm lint + + - name: Prettier check + run: pnpm prettier --check . + - name: Type check run: pnpm typecheck diff --git a/.github/workflows/pull-request-comment.yml b/.github/workflows/pull-request-comment.yml index a497a5625d..8ede462392 100644 --- a/.github/workflows/pull-request-comment.yml +++ b/.github/workflows/pull-request-comment.yml @@ -128,15 +128,15 @@ jobs: - name: Install dependencies run: pnpm install --frozen-lockfile - - name: Lint check - run: pnpm lint - - name: 🔤 Compile translations run: pnpm intl:build 2>&1 | tee i18n.log - name: Check for i18n compilation errors run: if grep -q "invalid syntax" "i18n.log"; then echo "\n\nFound compilation errors!\n\n" && exit 1; else echo "\n\nNo compilation errors!\n\n"; fi + - name: Lint check + run: pnpm lint + - name: Type check run: pnpm typecheck From 0a5a9941705ddf1255ffaa93c5c1409c4873902e Mon Sep 17 00:00:00 2001 From: Spence Pope Date: Wed, 3 Jun 2026 16:38:36 -0400 Subject: [PATCH 045/149] Fix image peek in carousels for quote posts (#10688) Co-authored-by: Eric Bailey --- src/components/Post/Embed/ImageEmbed.tsx | 9 +++------ src/components/images/Gallery/index.tsx | 21 ++++++++++++++------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/components/Post/Embed/ImageEmbed.tsx b/src/components/Post/Embed/ImageEmbed.tsx index ccd1ceb270..2c6bb6c5de 100644 --- a/src/components/Post/Embed/ImageEmbed.tsx +++ b/src/components/Post/Embed/ImageEmbed.tsx @@ -87,8 +87,7 @@ export function ImageEmbed({ crop={ rest.viewContext === PostEmbedViewContext.ThreadHighlighted ? 'none' - : rest.viewContext === - PostEmbedViewContext.FeedEmbedRecordWithMedia + : rest.isWithinQuote ? 'square' : 'constrained' } @@ -103,10 +102,7 @@ export function ImageEmbed({ onPress(0, [containerRef], [dims]) } onPressIn={() => onPressIn(0)} - hideBadge={ - rest.viewContext === - PostEmbedViewContext.FeedEmbedRecordWithMedia - } + hideBadge={rest.isWithinQuote} /> @@ -121,6 +117,7 @@ export function ImageEmbed({ onPress={onPress} onPressIn={onPressIn} viewContext={rest.viewContext} + isWithinQuote={rest.isWithinQuote} /> ) diff --git a/src/components/images/Gallery/index.tsx b/src/components/images/Gallery/index.tsx index f4ffcd7159..fe2b63e606 100644 --- a/src/components/images/Gallery/index.tsx +++ b/src/components/images/Gallery/index.tsx @@ -54,6 +54,7 @@ interface GalleryProps { ) => void onPressIn?: (index: number) => void viewContext?: PostEmbedViewContext + isWithinQuote?: boolean } const Context = createContext<{ @@ -97,6 +98,7 @@ export function Gallery({ onPress, onPressIn, viewContext, + isWithinQuote, }: GalleryProps) { const {t: l} = useLingui() const ax = useAnalytics() @@ -104,14 +106,21 @@ export function Gallery({ const largeAltBadge = useLargeAltBadgeEnabled() const bps = useBreakpoints() const window = useWindowDimensions() - const isWithinQuote = - viewContext === PostEmbedViewContext.FeedEmbedRecordWithMedia const isWithinChat = viewContext === PostEmbedViewContext.ChatMessage const hideBadges = isWithinQuote const contentHeight = useMemo(() => { if (isWithinChat) { return 120 } + if (isWithinQuote) { + if (bps.gtMobile) { + return 220 + } else if (bps.gtPhone) { + return 190 + } else { + return 150 + } + } if (bps.gtMobile) { return 300 } else if (bps.gtPhone) { @@ -119,7 +128,7 @@ export function Gallery({ } else { return 200 } - }, [bps, isWithinChat]) + }, [bps, isWithinChat, isWithinQuote]) /* * Container overflow styles @@ -220,7 +229,7 @@ export function Gallery({ crop={ viewContext === PostEmbedViewContext.ThreadHighlighted ? 'none' - : viewContext === PostEmbedViewContext.FeedEmbedRecordWithMedia + : isWithinQuote ? 'square' : 'constrained' } @@ -229,9 +238,7 @@ export function Gallery({ onPress?.(index, [containerRef], [dims]) } onPressIn={() => onPressIn?.(index)} - hideBadge={ - viewContext === PostEmbedViewContext.FeedEmbedRecordWithMedia - } + hideBadge={isWithinQuote} /> ))}
From 57ae26fcaabfb3e9bcbb75c74ca3726975cb82fd Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Wed, 3 Jun 2026 23:57:45 +0300 Subject: [PATCH 046/149] Make extra sure the drawer gesture doesn't accidentally trigger on Android (#10713) --- src/view/shell/index.tsx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/view/shell/index.tsx b/src/view/shell/index.tsx index 827ab092c4..9b215d9f13 100644 --- a/src/view/shell/index.tsx +++ b/src/view/shell/index.tsx @@ -174,8 +174,15 @@ function DrawerLayout({children}: {children: React.ReactNode}) { // so fail the drawer gesture immediately. .failOffsetX(-1) // Don't rush declaring that a movement to the right - // is a drawer swipe. It could be a vertical scroll. - .activeOffsetX(5) + // is a drawer swipe. It could be a vertical scroll, or a + // slow horizontal carousel swipe. On Android a child + // `blocksExternalGesture` only holds the drawer off once the + // native scroll has activated, which on a slow swipe doesn't + // happen until movement crosses the native touch slop + // (~8-16px). Activating the drawer below that lets a slow + // carousel swipe pop the drawer open (APP-2119), so require + // more travel before claiming on Android. + .activeOffsetX(IS_ANDROID ? 20 : 5) ) } } else { From 153772b760ef1f67220efe40ca6b4c66d33af71b Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Thu, 4 Jun 2026 01:03:11 +0300 Subject: [PATCH 047/149] `expo-image` tweaks (#10710) --- src/components/ContextMenu/index.tsx | 1 + .../pager/ImageItem/ImageItem.ios.tsx | 1 + src/components/Lightbox/pager/ImagePager.tsx | 4 ++++ src/components/MediaPreview.tsx | 1 + .../Post/Embed/ExternalEmbed/index.tsx | 1 + .../Post/Embed/StandardSiteEmbed/index.tsx | 1 + .../contacts/FindContactsBannerNUX.tsx | 1 + .../contacts/components/HeroImage.tsx | 1 + .../dialogs/nuxs/ActivitySubscriptions.tsx | 1 + .../dialogs/nuxs/BookmarksAnnouncement.tsx | 1 + .../dialogs/nuxs/DraftsAnnouncement.tsx | 1 + .../dialogs/nuxs/FindContactsAnnouncement.tsx | 1 + .../nuxs/InitialVerificationAnnouncement.tsx | 2 ++ .../dialogs/nuxs/LiveNowBetaDialog.tsx | 1 + src/components/images/AutoSizedImage.tsx | 1 + src/components/images/Gallery/index.tsx | 1 + src/components/images/ImageLayoutGridItem.tsx | 1 + .../verification/VerifierDialog.tsx | 1 + .../components/LiveEventFeedCardCompact.tsx | 1 + .../components/LiveEventFeedCardWide.tsx | 1 + .../liveNow/components/LinkPreview.tsx | 1 + .../liveNow/components/LiveStatusDialog.tsx | 1 + .../StepFinished/ValuePropositionPager.tsx | 2 ++ src/screens/Profile/components/GermButton.tsx | 1 + src/view/com/composer/ComposerReplyTo.tsx | 20 +++++++++---------- src/view/com/composer/photos/Gallery.tsx | 1 + src/view/com/util/UserAvatar.tsx | 1 + src/view/com/util/UserBanner.tsx | 2 ++ 28 files changed, 43 insertions(+), 10 deletions(-) diff --git a/src/components/ContextMenu/index.tsx b/src/components/ContextMenu/index.tsx index 8d3d39a749..51bf83309f 100644 --- a/src/components/ContextMenu/index.tsx +++ b/src/components/ContextMenu/index.tsx @@ -499,6 +499,7 @@ function TriggerClone({ accessibilityLabel={label} accessibilityHint={_(msg`The subject of the context menu`)} accessibilityIgnoresInvertColors={false} + cachePolicy="none" /> ) diff --git a/src/components/Lightbox/pager/ImageItem/ImageItem.ios.tsx b/src/components/Lightbox/pager/ImageItem/ImageItem.ios.tsx index c0bb99c89e..19373cbe1a 100644 --- a/src/components/Lightbox/pager/ImageItem/ImageItem.ios.tsx +++ b/src/components/Lightbox/pager/ImageItem/ImageItem.ios.tsx @@ -246,6 +246,7 @@ const ImageItem = ({ } } cachePolicy="memory" + useAppleWebpCodec /> diff --git a/src/components/Lightbox/pager/ImagePager.tsx b/src/components/Lightbox/pager/ImagePager.tsx index 1c8836a0fd..7b8815f276 100644 --- a/src/components/Lightbox/pager/ImagePager.tsx +++ b/src/components/Lightbox/pager/ImagePager.tsx @@ -32,6 +32,7 @@ import Animated, { withSpring, type WithSpringConfig, } from 'react-native-reanimated' +import {Image} from 'expo-image' import * as ScreenOrientation from 'expo-screen-orientation' import {type Dimensions} from '#/lib/media/types' @@ -136,6 +137,9 @@ export default function ImageViewRoot({ 'worklet' thumbRects.set({}) })() + requestIdleCallback(() => { + void Image.clearMemoryCache() + }) }, [thumbRects]) useAnimatedReaction( diff --git a/src/components/MediaPreview.tsx b/src/components/MediaPreview.tsx index 9aad6da864..b36705d840 100644 --- a/src/components/MediaPreview.tsx +++ b/src/components/MediaPreview.tsx @@ -129,6 +129,7 @@ export function ImageItem({ contentFit="cover" accessible={true} accessibilityIgnoresInvertColors + useAppleWebpCodec /> {children} diff --git a/src/components/Post/Embed/ExternalEmbed/index.tsx b/src/components/Post/Embed/ExternalEmbed/index.tsx index 43bfbb4747..fe0be2bd25 100644 --- a/src/components/Post/Embed/ExternalEmbed/index.tsx +++ b/src/components/Post/Embed/ExternalEmbed/index.tsx @@ -108,6 +108,7 @@ export const ExternalEmbed = ({ source={{uri: imageUri}} accessibilityIgnoresInvertColors loading="lazy" + useAppleWebpCodec /> ) : undefined} diff --git a/src/components/Post/Embed/StandardSiteEmbed/index.tsx b/src/components/Post/Embed/StandardSiteEmbed/index.tsx index 70fce8ad77..5f7fc1f5e7 100644 --- a/src/components/Post/Embed/StandardSiteEmbed/index.tsx +++ b/src/components/Post/Embed/StandardSiteEmbed/index.tsx @@ -166,6 +166,7 @@ export const StandardSiteEmbed = ({ source={{uri: imageUri}} accessibilityIgnoresInvertColors loading="lazy" + useAppleWebpCodec /> ) : undefined} diff --git a/src/components/contacts/FindContactsBannerNUX.tsx b/src/components/contacts/FindContactsBannerNUX.tsx index 2997e00d4e..417379fa2b 100644 --- a/src/components/contacts/FindContactsBannerNUX.tsx +++ b/src/components/contacts/FindContactsBannerNUX.tsx @@ -60,6 +60,7 @@ export function FindContactsBannerNUX() { a.self_end, a.mt_sm, ]} + useAppleWebpCodec /> ) diff --git a/src/components/dialogs/nuxs/ActivitySubscriptions.tsx b/src/components/dialogs/nuxs/ActivitySubscriptions.tsx index ed4306459c..318b130414 100644 --- a/src/components/dialogs/nuxs/ActivitySubscriptions.tsx +++ b/src/components/dialogs/nuxs/ActivitySubscriptions.tsx @@ -113,6 +113,7 @@ export function ActivitySubscriptionsNUX() { alt={_( msg`A screenshot of a profile page with a bell icon next to the follow button, indicating the new activity notifications feature.`, )} + useAppleWebpCodec /> diff --git a/src/components/dialogs/nuxs/BookmarksAnnouncement.tsx b/src/components/dialogs/nuxs/BookmarksAnnouncement.tsx index f7e4bf04c6..153130f8ec 100644 --- a/src/components/dialogs/nuxs/BookmarksAnnouncement.tsx +++ b/src/components/dialogs/nuxs/BookmarksAnnouncement.tsx @@ -124,6 +124,7 @@ export function BookmarksAnnouncement() { 'Contains a post that originally appeared in English. Consider translating the post text if it makes sense in your language, and noting that the post was translated from English.', }), )} + useAppleWebpCodec /> diff --git a/src/components/dialogs/nuxs/DraftsAnnouncement.tsx b/src/components/dialogs/nuxs/DraftsAnnouncement.tsx index 79488fe4d9..37b93bda70 100644 --- a/src/components/dialogs/nuxs/DraftsAnnouncement.tsx +++ b/src/components/dialogs/nuxs/DraftsAnnouncement.tsx @@ -101,6 +101,7 @@ export function DraftsAnnouncement() { 'Contains a post that originally appeared in English. Consider translating the post text if it makes sense in your language, and noting that the post was translated from English.', }), )} + useAppleWebpCodec /> diff --git a/src/components/dialogs/nuxs/FindContactsAnnouncement.tsx b/src/components/dialogs/nuxs/FindContactsAnnouncement.tsx index 8fd7d2d2c5..70f29ef157 100644 --- a/src/components/dialogs/nuxs/FindContactsAnnouncement.tsx +++ b/src/components/dialogs/nuxs/FindContactsAnnouncement.tsx @@ -78,6 +78,7 @@ export function FindContactsAnnouncement() { alt={_( msg`An illustration depicting user avatars flowing from a contact book into the Bluesky app`, )} + useAppleWebpCodec /> diff --git a/src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx b/src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx index 85bc29a48f..cbe2555aac 100644 --- a/src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx +++ b/src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx @@ -85,6 +85,7 @@ export function InitialVerificationAnnouncement() { alt={_( msg`An illustration showing that Bluesky selects trusted verifiers, and trusted verifiers in turn verify individual user accounts.`, )} + useAppleWebpCodec /> @@ -119,6 +120,7 @@ export function InitialVerificationAnnouncement() { alt={_( msg`An mockup of a iPhone showing the Bluesky app open to the profile of a verified user with a blue checkmark next to their display name.`, )} + useAppleWebpCodec /> diff --git a/src/components/dialogs/nuxs/LiveNowBetaDialog.tsx b/src/components/dialogs/nuxs/LiveNowBetaDialog.tsx index 49c43a1e41..e389e11175 100644 --- a/src/components/dialogs/nuxs/LiveNowBetaDialog.tsx +++ b/src/components/dialogs/nuxs/LiveNowBetaDialog.tsx @@ -150,6 +150,7 @@ export function LiveNowBetaDialog() { 'Contains a post that originally appeared in English. Consider translating the post text if it makes sense in your language, and noting that the post was translated from English.', }), )} + useAppleWebpCodec /> diff --git a/src/components/images/AutoSizedImage.tsx b/src/components/images/AutoSizedImage.tsx index 79b41311cb..182bfe661b 100644 --- a/src/components/images/AutoSizedImage.tsx +++ b/src/components/images/AutoSizedImage.tsx @@ -142,6 +142,7 @@ export function AutoSizedImage({ } }} loading="lazy" + useAppleWebpCodec /> diff --git a/src/components/images/Gallery/index.tsx b/src/components/images/Gallery/index.tsx index fe2b63e606..9ae677c2d2 100644 --- a/src/components/images/Gallery/index.tsx +++ b/src/components/images/Gallery/index.tsx @@ -480,6 +480,7 @@ function GalleryImage({ height: e.source.height, }) }} + useAppleWebpCodec /> {(hasAlt || isCropped) && !hideBadges ? ( diff --git a/src/components/images/ImageLayoutGridItem.tsx b/src/components/images/ImageLayoutGridItem.tsx index 0c349b6612..d6cbc0aded 100644 --- a/src/components/images/ImageLayoutGridItem.tsx +++ b/src/components/images/ImageLayoutGridItem.tsx @@ -106,6 +106,7 @@ export function GalleryItem({ } }} loading="lazy" + useAppleWebpCodec /> diff --git a/src/components/verification/VerifierDialog.tsx b/src/components/verification/VerifierDialog.tsx index 570441ecd0..e8944024ca 100644 --- a/src/components/verification/VerifierDialog.tsx +++ b/src/components/verification/VerifierDialog.tsx @@ -87,6 +87,7 @@ function Inner({ alt={_( msg`An illustration showing that Bluesky selects trusted verifiers, and trusted verifiers in turn verify individual user accounts.`, )} + useAppleWebpCodec /> diff --git a/src/features/liveEvents/components/LiveEventFeedCardCompact.tsx b/src/features/liveEvents/components/LiveEventFeedCardCompact.tsx index df2bb17f83..9d2f948eb6 100644 --- a/src/features/liveEvents/components/LiveEventFeedCardCompact.tsx +++ b/src/features/liveEvents/components/LiveEventFeedCardCompact.tsx @@ -69,6 +69,7 @@ export function LiveEventFeedCardCompact({ style={[a.absolute, a.inset_0, a.w_full, a.h_full]} contentFit="cover" placeholderContentFit="cover" + useAppleWebpCodec /> setImageLoadError(false)} onError={() => setImageLoadError(true)} + useAppleWebpCodec /> )} {linkMeta && (!linkMeta.image || imageLoadError) && ( diff --git a/src/features/liveNow/components/LiveStatusDialog.tsx b/src/features/liveNow/components/LiveStatusDialog.tsx index 545e8ab943..9e916678f2 100644 --- a/src/features/liveNow/components/LiveStatusDialog.tsx +++ b/src/features/liveNow/components/LiveStatusDialog.tsx @@ -147,6 +147,7 @@ export function LiveStatus({ contentFit="cover" style={[a.absolute, a.inset_0]} accessibilityIgnoresInvertColors + useAppleWebpCodec /> {page === 1 && ( {_(msg`Your )} diff --git a/src/screens/Profile/components/GermButton.tsx b/src/screens/Profile/components/GermButton.tsx index 0bef3a22c3..e37e57edbf 100644 --- a/src/screens/Profile/components/GermButton.tsx +++ b/src/screens/Profile/components/GermButton.tsx @@ -105,6 +105,7 @@ function GermLogo({size}: {size: 'small' | 'large'}) { source={require('../../../../assets/images/germ_logo.webp')} accessibilityIgnoresInvertColors={false} contentFit="cover" + useAppleWebpCodec style={[ a.rounded_full, size === 'large' ? {width: 32, height: 32} : {width: 16, height: 16}, diff --git a/src/view/com/composer/ComposerReplyTo.tsx b/src/view/com/composer/ComposerReplyTo.tsx index a6ef1a344c..bac3e74d31 100644 --- a/src/view/com/composer/ComposerReplyTo.tsx +++ b/src/view/com/composer/ComposerReplyTo.tsx @@ -151,8 +151,8 @@ function ComposerReplyToImages({ )) || (images.length === 2 && ( @@ -160,14 +160,14 @@ function ComposerReplyToImages({ )) || @@ -176,21 +176,21 @@ function ComposerReplyToImages({ @@ -201,28 +201,28 @@ function ComposerReplyToImages({ diff --git a/src/view/com/composer/photos/Gallery.tsx b/src/view/com/composer/photos/Gallery.tsx index 7624b585f6..2cc000019f 100644 --- a/src/view/com/composer/photos/Gallery.tsx +++ b/src/view/com/composer/photos/Gallery.tsx @@ -245,6 +245,7 @@ const GalleryItem = ({ }} accessible={true} accessibilityIgnoresInvertColors + enforceEarlyResizing cachePolicy="none" autoplay={false} contentFit="cover" diff --git a/src/view/com/util/UserAvatar.tsx b/src/view/com/util/UserAvatar.tsx index 420fd0270f..9db4914b21 100644 --- a/src/view/com/util/UserAvatar.tsx +++ b/src/view/com/util/UserAvatar.tsx @@ -330,6 +330,7 @@ let UserAvatar = ({ }} blurRadius={moderation?.blur ? BLUR_AMOUNT : 0} onLoad={onLoad} + useAppleWebpCodec /> )} {!noBorder && } diff --git a/src/view/com/util/UserBanner.tsx b/src/view/com/util/UserBanner.tsx index 8146b7ad9d..033e8c14fe 100644 --- a/src/view/com/util/UserBanner.tsx +++ b/src/view/com/util/UserBanner.tsx @@ -129,6 +129,7 @@ export function UserBanner({ source={{uri: banner}} accessible={true} accessibilityIgnoresInvertColors + useAppleWebpCodec /> ) : ( ) : ( Date: Thu, 4 Jun 2026 03:21:17 +0000 Subject: [PATCH 048/149] Nightly source-language update --- src/locale/locales/en/messages.po | 424 +++++++++++++++--------------- 1 file changed, 212 insertions(+), 212 deletions(-) diff --git a/src/locale/locales/en/messages.po b/src/locale/locales/en/messages.po index b1fd0337d7..5830797c52 100644 --- a/src/locale/locales/en/messages.po +++ b/src/locale/locales/en/messages.po @@ -93,7 +93,7 @@ msgstr "{0, plural, one {# person} other {# people}}" #. placeholder {0}: reactions.length #. placeholder {1}: groupedReactions.map(g => g.value).join(' ') -#: src/components/dms/MessageItem.tsx:297 +#: src/components/dms/MessageItem.tsx:273 msgid "{0, plural, one {# person} other {# people}} reacted – {1}" msgstr "{0, plural, one {# person} other {# people}} reacted – {1}" @@ -122,7 +122,7 @@ msgstr "" #. How long it takes to read an article, in minutes. Displayed in a short form, e.g. "5m" for 5 minutes. #. placeholder {0}: view.readingTime -#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:232 +#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:233 msgid "{0, plural, one {#m} other {#m}}" msgstr "{0, plural, one {#m} other {#m}}" @@ -211,7 +211,7 @@ msgid "{0} following" msgstr "" #. placeholder {0}: sanitizeHandle(profile.handle, '@') -#: src/components/dms/MessageItem.tsx:640 +#: src/components/dms/MessageItem.tsx:609 msgid "{0} is blocking you" msgstr "{0} is blocking you" @@ -269,7 +269,7 @@ msgstr "" #. placeholder {0}: createSanitizedDisplayName(memberSender) #. placeholder {1}: reaction.value -#: src/components/dms/MessageItem.tsx:292 +#: src/components/dms/MessageItem.tsx:268 msgid "{0} reacted {1}" msgstr "" @@ -314,8 +314,8 @@ msgstr "" #. placeholder {0}: sanitizeDisplayName( profile.displayName || sanitizeHandle(profile.handle), ) #. placeholder {0}: sanitizeDisplayName( profile.displayName || sanitizeHandle(profile.handle), ) -#: src/view/com/util/UserAvatar.tsx:595 -#: src/view/com/util/UserAvatar.tsx:613 +#: src/view/com/util/UserAvatar.tsx:596 +#: src/view/com/util/UserAvatar.tsx:614 msgid "{0}'s avatar" msgstr "" @@ -839,7 +839,7 @@ msgstr "" msgid "A new code has been sent" msgstr "" -#: src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx:93 +#: src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx:94 msgid "A new form of verification" msgstr "" @@ -897,7 +897,7 @@ msgid "Accept join request" msgstr "Accept join request" #. Accept a chat request -#: src/screens/Messages/components/RequestListItem.tsx:48 +#: src/screens/Messages/components/RequestListItem.tsx:51 msgid "Accept Request" msgstr "" @@ -999,7 +999,7 @@ msgctxt "toast" msgid "Account unmuted" msgstr "" -#: src/components/verification/VerifierDialog.tsx:99 +#: src/components/verification/VerifierDialog.tsx:100 msgid "Accounts with a scalloped blue check mark <0><1/> can verify others. These trusted verifiers are selected by Bluesky." msgstr "" @@ -1085,7 +1085,7 @@ msgstr "" msgid "Add App Password" msgstr "" -#: src/screens/Settings/AutomationLabelSettings.tsx:166 +#: src/screens/Settings/AutomationLabelSettings.tsx:170 msgid "Add automation label to account" msgstr "Add automation label to account" @@ -1112,8 +1112,8 @@ msgstr "" msgid "Add members" msgstr "Add members" -#: src/components/moderation/ReportDialog/index.tsx:526 -#: src/components/moderation/ReportDialog/index.tsx:530 +#: src/components/moderation/ReportDialog/index.tsx:528 +#: src/components/moderation/ReportDialog/index.tsx:532 msgid "Add more details (optional)" msgstr "" @@ -1215,7 +1215,7 @@ msgstr "" msgid "Additional details (limit 1000 characters)" msgstr "" -#: src/components/moderation/ReportDialog/index.tsx:544 +#: src/components/moderation/ReportDialog/index.tsx:546 msgid "Additional details (limit 300 characters)" msgstr "" @@ -1283,7 +1283,7 @@ msgid "alice@example.com" msgstr "" #. the default tab in the interests tab bar -#: src/components/dms/ReactionsDialog.tsx:284 +#: src/components/dms/ReactionsDialog.tsx:288 #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:201 #: src/view/screens/Notifications.tsx:86 msgid "All" @@ -1291,7 +1291,7 @@ msgstr "" #. Tab label showing the total count of reactions on a chat message. #. placeholder {0}: tab.count -#: src/components/dms/ReactionsDialog.tsx:381 +#: src/components/dms/ReactionsDialog.tsx:385 msgid "All {0}" msgstr "All {0}" @@ -1388,9 +1388,9 @@ msgstr "" msgid "Already signed in as @{0}" msgstr "" -#: src/components/images/AutoSizedImage.tsx:203 -#: src/components/images/Gallery/index.tsx:531 -#: src/components/images/ImageLayoutGridItem.tsx:138 +#: src/components/images/AutoSizedImage.tsx:204 +#: src/components/images/Gallery/index.tsx:539 +#: src/components/images/ImageLayoutGridItem.tsx:139 #: src/components/Post/Embed/VideoEmbed/GifPresentationControls.tsx:94 #: src/view/com/composer/GifAltText.tsx:100 #: src/view/com/composer/photos/Gallery.tsx:209 @@ -1540,7 +1540,7 @@ msgstr "" msgid "An issue occurred, please try again." msgstr "" -#: src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx:120 +#: src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx:121 msgid "An mockup of a iPhone showing the Bluesky app open to the profile of a verified user with a blue checkmark next to their display name." msgstr "" @@ -1729,7 +1729,7 @@ msgstr "" msgid "Are you sure you want to delete the app password \"{0}\"?" msgstr "" -#: src/components/dms/MessageContextMenu.tsx:223 +#: src/components/dms/MessageOverlays.tsx:167 msgid "Are you sure you want to delete this message? The message will be deleted for you, but not for the other participants." msgstr "Are you sure you want to delete this message? The message will be deleted for you, but not for the other participants." @@ -1968,7 +1968,7 @@ msgstr "" msgid "Block accounts" msgstr "" -#: src/components/dms/AfterReportDialog.tsx:143 +#: src/components/dms/AfterReportDialog.tsx:148 msgid "Block and delete" msgstr "Block and delete" @@ -1992,9 +1992,9 @@ msgstr "" #: src/components/dms/AfterReportConversationDialog.tsx:221 #: src/components/dms/AfterReportConversationDialog.tsx:224 -#: src/components/dms/AfterReportDialog.tsx:149 -#: src/components/dms/AfterReportDialog.tsx:184 -#: src/components/dms/AfterReportDialog.tsx:187 +#: src/components/dms/AfterReportDialog.tsx:154 +#: src/components/dms/AfterReportDialog.tsx:189 +#: src/components/dms/AfterReportDialog.tsx:192 msgid "Block user" msgstr "" @@ -2004,7 +2004,7 @@ msgctxt "button" msgid "Block user" msgstr "Block user" -#: src/components/dms/AfterReportDialog.tsx:180 +#: src/components/dms/AfterReportDialog.tsx:185 msgid "Block user and/or delete this conversation" msgstr "" @@ -2085,7 +2085,7 @@ msgstr "" msgid "Bluesky is more fun with friends" msgstr "" -#: src/components/dialogs/nuxs/FindContactsAnnouncement.tsx:107 +#: src/components/dialogs/nuxs/FindContactsAnnouncement.tsx:108 msgid "Bluesky is more fun with friends! Import your contacts to see who’s already here." msgstr "" @@ -2109,7 +2109,7 @@ msgstr "" msgid "Bluesky will not show your profile and posts to logged-out users. Other apps may not honor this request. This does not make your account private." msgstr "" -#: src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx:134 +#: src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx:136 msgid "Bluesky will proactively verify notable and authentic accounts." msgstr "" @@ -2198,7 +2198,7 @@ msgstr "" #. placeholder {0}: sanitizeHandle(handle, '@') #. placeholder {0}: sanitizeHandle(item.feed.creator.handle, '@') #: src/components/LabelingServiceCard/index.tsx:62 -#: src/components/moderation/ReportDialog/index.tsx:845 +#: src/components/moderation/ReportDialog/index.tsx:847 #: src/screens/Messages/JoinRequest.tsx:166 #: src/screens/Search/components/StarterPackCard.tsx:107 #: src/screens/Search/Explore.tsx:971 @@ -2322,7 +2322,7 @@ msgstr "" msgid "Captions & alt text" msgstr "" -#: src/components/images/Gallery/index.tsx:256 +#: src/components/images/Gallery/index.tsx:263 msgid "carousel" msgstr "carousel" @@ -2355,7 +2355,7 @@ msgstr "" msgid "Change Handle" msgstr "" -#: src/components/moderation/ReportDialog/index.tsx:443 +#: src/components/moderation/ReportDialog/index.tsx:445 msgid "Change moderation service" msgstr "" @@ -2368,11 +2368,11 @@ msgstr "" msgid "Change password dialog" msgstr "" -#: src/components/moderation/ReportDialog/index.tsx:310 +#: src/components/moderation/ReportDialog/index.tsx:312 msgid "Change report category" msgstr "" -#: src/components/moderation/ReportDialog/index.tsx:388 +#: src/components/moderation/ReportDialog/index.tsx:390 msgid "Change report reason" msgstr "" @@ -2643,7 +2643,7 @@ msgstr "Click here to view the invite link for this group chat" msgid "Click to open tag menu for {0}" msgstr "" -#: src/components/dms/MessageItem.tsx:559 +#: src/components/dms/MessageItem.tsx:528 msgid "Click to retry failed message" msgstr "" @@ -2657,15 +2657,15 @@ msgstr "" #: src/components/ageAssurance/AgeAssuranceRedirectDialog.tsx:233 #: src/components/ageAssurance/AgeAssuranceRedirectDialog.tsx:239 #: src/components/dialogs/LanguageSelectDialog.tsx:359 -#: src/components/dialogs/nuxs/ActivitySubscriptions.tsx:159 -#: src/components/dialogs/nuxs/ActivitySubscriptions.tsx:168 -#: src/components/dialogs/nuxs/BookmarksAnnouncement.tsx:164 -#: src/components/dialogs/nuxs/BookmarksAnnouncement.tsx:172 -#: src/components/dialogs/nuxs/DraftsAnnouncement.tsx:139 -#: src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx:176 -#: src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx:185 -#: src/components/dialogs/nuxs/LiveNowBetaDialog.tsx:191 -#: src/components/dialogs/nuxs/LiveNowBetaDialog.tsx:199 +#: src/components/dialogs/nuxs/ActivitySubscriptions.tsx:160 +#: src/components/dialogs/nuxs/ActivitySubscriptions.tsx:169 +#: src/components/dialogs/nuxs/BookmarksAnnouncement.tsx:165 +#: src/components/dialogs/nuxs/BookmarksAnnouncement.tsx:173 +#: src/components/dialogs/nuxs/DraftsAnnouncement.tsx:140 +#: src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx:178 +#: src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx:187 +#: src/components/dialogs/nuxs/LiveNowBetaDialog.tsx:192 +#: src/components/dialogs/nuxs/LiveNowBetaDialog.tsx:200 #: src/components/dialogs/SearchablePeopleList.tsx:340 #: src/components/dialogs/StarterPackDialog.tsx:187 #: src/components/dms/AddMembersFlow.tsx:367 @@ -2673,10 +2673,10 @@ msgstr "" #: src/components/dms/AfterReportConversationDialog.tsx:96 #: src/components/dms/AfterReportConversationDialog.tsx:247 #: src/components/dms/AfterReportConversationDialog.tsx:252 -#: src/components/dms/AfterReportDialog.tsx:89 #: src/components/dms/AfterReportDialog.tsx:94 -#: src/components/dms/AfterReportDialog.tsx:207 +#: src/components/dms/AfterReportDialog.tsx:99 #: src/components/dms/AfterReportDialog.tsx:212 +#: src/components/dms/AfterReportDialog.tsx:217 #: src/components/dms/EmojiPopup.android.tsx:59 #: src/components/dms/InitiateChatFlow.tsx:534 #: src/components/intents/GroupChatJoinDialog.tsx:204 @@ -2688,7 +2688,7 @@ msgstr "" #: src/components/StarterPack/Wizard/WizardEditListDialog.tsx:122 #: src/components/StarterPack/Wizard/WizardEditListDialog.tsx:128 #: src/components/verification/VerificationsDialog.tsx:146 -#: src/components/verification/VerifierDialog.tsx:146 +#: src/components/verification/VerifierDialog.tsx:147 #: src/components/WhoCanReply.tsx:236 #: src/components/WhoCanReply.tsx:243 #: src/features/gifPicker/components/GifPickerErrorBoundary.tsx:45 @@ -2724,7 +2724,7 @@ msgstr "" #: src/components/dialogs/LanguageSelectDialog.tsx:354 #: src/components/dialogs/NotificationSettingsDialog.tsx:94 #: src/components/verification/VerificationsDialog.tsx:138 -#: src/components/verification/VerifierDialog.tsx:139 +#: src/components/verification/VerifierDialog.tsx:140 #: src/features/gifPicker/components/GifPickerErrorBoundary.tsx:36 msgid "Close dialog" msgstr "" @@ -2999,8 +2999,8 @@ msgstr "" msgid "Conversation deleted" msgstr "" -#: src/components/dms/AfterReportDialog.tsx:144 -#: src/components/dms/AfterReportDialog.tsx:147 +#: src/components/dms/AfterReportDialog.tsx:149 +#: src/components/dms/AfterReportDialog.tsx:152 msgctxt "toast" msgid "Conversation deleted" msgstr "" @@ -3020,7 +3020,7 @@ msgstr "Conversation not found." msgid "Copied build version to clipboard" msgstr "" -#: src/components/dms/MessageContextMenu.tsx:79 +#: src/components/dms/MessageContextMenu.tsx:71 #: src/components/PostControls/DiscoverDebug.tsx:36 #: src/components/PostControls/PostMenu/PostMenuItems.tsx:272 #: src/components/PostControls/ShareMenu/ShareMenuItems.tsx:77 @@ -3102,8 +3102,8 @@ msgstr "" msgid "Copy link to starter pack" msgstr "" -#: src/components/dms/MessageContextMenu.tsx:169 -#: src/components/dms/MessageContextMenu.tsx:173 +#: src/components/dms/MessageContextMenu.tsx:152 +#: src/components/dms/MessageContextMenu.tsx:156 msgid "Copy message text" msgstr "" @@ -3160,7 +3160,7 @@ msgid "Could not follow all matches. {0}" msgstr "" #: src/components/dms/AfterReportConversationDialog.tsx:158 -#: src/components/dms/AfterReportDialog.tsx:134 +#: src/components/dms/AfterReportDialog.tsx:139 #: src/components/dms/LeaveConvoPrompt.tsx:34 msgid "Could not leave chat" msgstr "" @@ -3316,8 +3316,8 @@ msgstr "Create or modify an invite link for this group chat" #. Accessibility label for button to create a moderation report for the selected option #. placeholder {0}: option.title -#: src/components/moderation/ReportDialog/index.tsx:707 -#: src/components/moderation/ReportDialog/index.tsx:752 +#: src/components/moderation/ReportDialog/index.tsx:709 +#: src/components/moderation/ReportDialog/index.tsx:754 msgid "Create report for {0}" msgstr "" @@ -3418,7 +3418,7 @@ msgstr "" msgid "Default icons" msgstr "" -#: src/components/dms/MessageContextMenu.tsx:224 +#: src/components/dms/MessageOverlays.tsx:168 #: src/components/PostControls/PostMenu/PostMenuItems.tsx:803 #: src/screens/ProfileList/components/MoreOptionsMenu.tsx:275 #: src/screens/Settings/AppPasswords.tsx:213 @@ -3459,15 +3459,15 @@ msgstr "" msgid "Delete contacts" msgstr "" -#: src/components/dms/AfterReportDialog.tsx:146 -#: src/components/dms/AfterReportDialog.tsx:190 -#: src/components/dms/AfterReportDialog.tsx:193 +#: src/components/dms/AfterReportDialog.tsx:151 +#: src/components/dms/AfterReportDialog.tsx:195 +#: src/components/dms/AfterReportDialog.tsx:198 #: src/screens/Messages/components/RequestButtons.tsx:142 #: src/screens/Messages/components/RequestButtons.tsx:144 msgid "Delete conversation" msgstr "" -#: src/components/dms/MessageContextMenu.tsx:184 +#: src/components/dms/MessageContextMenu.tsx:167 msgid "Delete for me" msgstr "" @@ -3476,11 +3476,11 @@ msgstr "" msgid "Delete list" msgstr "" -#: src/components/dms/MessageContextMenu.tsx:222 +#: src/components/dms/MessageOverlays.tsx:166 msgid "Delete message" msgstr "" -#: src/components/dms/MessageContextMenu.tsx:181 +#: src/components/dms/MessageContextMenu.tsx:164 msgid "Delete message for me" msgstr "" @@ -3661,8 +3661,8 @@ msgstr "" msgid "Discard post?" msgstr "" -#: src/screens/Profile/components/GermButton.tsx:261 -#: src/screens/Profile/components/GermButton.tsx:268 +#: src/screens/Profile/components/GermButton.tsx:262 +#: src/screens/Profile/components/GermButton.tsx:269 msgid "Disconnect Germ DM" msgstr "" @@ -3690,7 +3690,7 @@ msgstr "" msgid "Dismiss" msgstr "" -#: src/components/contacts/FindContactsBannerNUX.tsx:77 +#: src/components/contacts/FindContactsBannerNUX.tsx:78 msgid "Dismiss banner" msgstr "" @@ -3784,7 +3784,7 @@ msgstr "" #: src/components/dialogs/ServerInput.tsx:237 #: src/components/dialogs/ServerInput.tsx:239 #: src/components/dms/AfterReportConversationDialog.tsx:164 -#: src/components/dms/AfterReportDialog.tsx:140 +#: src/components/dms/AfterReportDialog.tsx:145 #: src/components/forms/DateField/index.tsx:104 #: src/components/forms/DateField/index.tsx:110 #: src/lib/media/picker.tsx:37 @@ -3805,7 +3805,7 @@ msgctxt "action" msgid "Done" msgstr "" -#: src/components/dms/MessageItem.tsx:463 +#: src/components/dms/MessageItem.tsx:432 msgid "Double tap or long press the message to add a reaction" msgstr "" @@ -3848,7 +3848,7 @@ msgstr "Download profile data" msgid "Doxxing" msgstr "" -#: src/components/dialogs/nuxs/DraftsAnnouncement.tsx:119 +#: src/components/dialogs/nuxs/DraftsAnnouncement.tsx:120 #: src/view/com/composer/drafts/DraftsButton.tsx:70 #: src/view/com/composer/drafts/DraftsButton.tsx:79 #: src/view/com/composer/drafts/DraftsListDialog.tsx:119 @@ -3917,7 +3917,7 @@ msgctxt "action" msgid "Edit" msgstr "" -#: src/view/com/util/UserAvatar.tsx:460 +#: src/view/com/util/UserAvatar.tsx:461 #: src/view/com/util/UserBanner.tsx:122 msgid "Edit avatar" msgstr "" @@ -4299,7 +4299,7 @@ msgstr "" msgid "Exit fullscreen" msgstr "" -#: src/components/Lightbox/chrome/Footer.tsx:65 +#: src/components/Lightbox/chrome/Footer.tsx:59 #: src/components/Lightbox/Lightbox.web.tsx:241 msgid "Expand alt text" msgstr "" @@ -4420,7 +4420,7 @@ msgid "Failed to accept join request" msgstr "Failed to accept join request" #: src/components/dms/ActionsWrapper.web.tsx:77 -#: src/components/dms/MessageContextMenu.tsx:119 +#: src/components/dms/MessageContextMenu.tsx:103 msgid "Failed to add emoji reaction" msgstr "" @@ -4465,7 +4465,7 @@ msgctxt "toast" msgid "Failed to delete chat" msgstr "" -#: src/components/dms/MessageContextMenu.tsx:101 +#: src/components/dms/MessageOverlays.tsx:112 msgid "Failed to delete message" msgstr "" @@ -4482,7 +4482,7 @@ msgid "Failed to disable invite link" msgstr "Failed to disable invite link" #. placeholder {0}: error?.message -#: src/screens/Profile/components/GermButton.tsx:195 +#: src/screens/Profile/components/GermButton.tsx:196 msgid "Failed to disconnect Germ DM. Error: {0}" msgstr "" @@ -4593,7 +4593,7 @@ msgid "Failed to pin post" msgstr "" #. placeholder {0}: e?.message -#: src/screens/Profile/components/GermButton.tsx:163 +#: src/screens/Profile/components/GermButton.tsx:164 msgid "Failed to reconnect Germ DM. Error: {0}" msgstr "" @@ -4607,8 +4607,8 @@ msgid "Failed to remove data. {0}" msgstr "" #: src/components/dms/ActionsWrapper.web.tsx:73 -#: src/components/dms/MessageContextMenu.tsx:115 -#: src/components/dms/ReactionsDialog.tsx:171 +#: src/components/dms/MessageContextMenu.tsx:99 +#: src/components/dms/ReactionsDialog.tsx:175 msgid "Failed to remove emoji reaction" msgstr "" @@ -4833,11 +4833,11 @@ msgstr "" msgid "Finalizing" msgstr "" -#: src/components/dialogs/nuxs/DraftsAnnouncement.tsx:145 +#: src/components/dialogs/nuxs/DraftsAnnouncement.tsx:146 msgid "Finally!" msgstr "" -#: src/components/dialogs/nuxs/BookmarksAnnouncement.tsx:155 +#: src/components/dialogs/nuxs/BookmarksAnnouncement.tsx:156 msgid "Finally! Keep track of posts that matter to you. Save them to revisit anytime." msgstr "" @@ -4885,7 +4885,7 @@ msgstr "" msgid "Find posts, users, and feeds on Bluesky" msgstr "" -#: src/components/dialogs/nuxs/FindContactsAnnouncement.tsx:97 +#: src/components/dialogs/nuxs/FindContactsAnnouncement.tsx:98 msgid "Find your friends" msgstr "" @@ -5191,20 +5191,20 @@ msgid "Generate new link" msgstr "Generate new link" #: src/screens/Profile/components/GermButton.tsx:86 -#: src/screens/Profile/components/GermButton.tsx:224 +#: src/screens/Profile/components/GermButton.tsx:225 msgid "Germ DM" msgstr "" -#: src/screens/Profile/components/GermButton.tsx:182 +#: src/screens/Profile/components/GermButton.tsx:183 msgid "Germ DM disconnected" msgstr "" -#: src/screens/Profile/components/GermButton.tsx:233 -#: src/screens/Profile/components/GermButton.tsx:238 +#: src/screens/Profile/components/GermButton.tsx:234 +#: src/screens/Profile/components/GermButton.tsx:239 msgid "Germ DM Link" msgstr "" -#: src/screens/Profile/components/GermButton.tsx:159 +#: src/screens/Profile/components/GermButton.tsx:160 msgid "Germ DM reconnected" msgstr "" @@ -5268,7 +5268,7 @@ msgstr "" msgid "Get notified when {name} posts" msgstr "" -#: src/components/dialogs/nuxs/ActivitySubscriptions.tsx:138 +#: src/components/dialogs/nuxs/ActivitySubscriptions.tsx:139 msgid "Get notified when someone posts" msgstr "" @@ -5279,7 +5279,7 @@ msgstr "" msgid "Get started" msgstr "" -#: src/components/MediaPreview.tsx:147 +#: src/components/MediaPreview.tsx:148 #: src/components/Post/Embed/VideoEmbed/GifPresentationControls.tsx:69 msgid "GIF" msgstr "" @@ -5413,8 +5413,8 @@ msgstr "Go to user’s profile" msgid "Going live is currently disabled for your account" msgstr "" -#: src/screens/Profile/components/GermButton.tsx:252 -#: src/screens/Profile/components/GermButton.tsx:257 +#: src/screens/Profile/components/GermButton.tsx:253 +#: src/screens/Profile/components/GermButton.tsx:258 msgid "Got it" msgstr "" @@ -5524,7 +5524,7 @@ msgid "Handle too long. Please try a shorter one." msgstr "" #: src/components/FeedCard.tsx:156 -#: src/features/liveEvents/components/LiveEventFeedCardWide.tsx:122 +#: src/features/liveEvents/components/LiveEventFeedCardWide.tsx:123 msgid "Happening now" msgstr "" @@ -5903,7 +5903,7 @@ msgid "Image" msgstr "" #. placeholder {0}: index + 1 -#: src/components/images/Gallery/index.tsx:436 +#: src/components/images/Gallery/index.tsx:443 msgid "Image {0}" msgstr "Image {0}" @@ -5914,7 +5914,7 @@ msgid "Image {0} of {1}" msgstr "" #. placeholder {0}: index + 1 -#: src/components/images/Gallery/index.tsx:421 +#: src/components/images/Gallery/index.tsx:428 msgid "Image {0} of {imageCount}" msgstr "Image {0} of {imageCount}" @@ -5929,17 +5929,17 @@ msgid "Image cache cleared, freed {0}" msgstr "" #. placeholder {0}: images.length -#: src/components/images/Gallery/index.tsx:257 +#: src/components/images/Gallery/index.tsx:264 msgid "Image gallery, {0} images" msgstr "Image gallery, {0} images" #. Image has been moderated and user has the option of showing it temporarily -#: src/features/liveNow/components/LiveStatusDialog.tsx:299 +#: src/features/liveNow/components/LiveStatusDialog.tsx:300 msgid "Image is hidden due to your moderation settings." msgstr "Image is hidden due to your moderation settings." #. Image has been moderated and is not visible to the user -#: src/features/liveNow/components/LiveStatusDialog.tsx:309 +#: src/features/liveNow/components/LiveStatusDialog.tsx:310 msgid "Image is unavailable." msgstr "Image is unavailable." @@ -5974,13 +5974,13 @@ msgstr "" msgid "Import contacts" msgstr "" -#: src/components/dialogs/nuxs/FindContactsAnnouncement.tsx:115 -#: src/components/dialogs/nuxs/FindContactsAnnouncement.tsx:126 +#: src/components/dialogs/nuxs/FindContactsAnnouncement.tsx:116 +#: src/components/dialogs/nuxs/FindContactsAnnouncement.tsx:127 msgid "Import Contacts" msgstr "" #: src/components/contacts/FindContactsBannerNUX.tsx:33 -#: src/components/contacts/FindContactsBannerNUX.tsx:71 +#: src/components/contacts/FindContactsBannerNUX.tsx:72 msgid "Import contacts to find your friends" msgstr "" @@ -6093,7 +6093,7 @@ msgstr "" msgid "Invalid phone number" msgstr "" -#: src/components/moderation/ReportDialog/index.tsx:98 +#: src/components/moderation/ReportDialog/index.tsx:100 msgid "Invalid report subject" msgstr "" @@ -6311,7 +6311,7 @@ msgid "Latest" msgstr "" #: src/components/verification/VerificationsDialog.tsx:168 -#: src/components/verification/VerifierDialog.tsx:135 +#: src/components/verification/VerifierDialog.tsx:136 #: src/screens/Moderation/VerificationSettings.tsx:50 #: src/screens/Profile/Header/EditProfileDialog.tsx:346 #: src/screens/Settings/components/ChangeHandleDialog.tsx:215 @@ -6366,7 +6366,7 @@ msgid "Learn more about this warning" msgstr "" #: src/components/verification/VerificationsDialog.tsx:153 -#: src/components/verification/VerifierDialog.tsx:121 +#: src/components/verification/VerifierDialog.tsx:122 msgctxt "english-only-resource" msgid "Learn more about verification on Bluesky" msgstr "" @@ -6376,7 +6376,7 @@ msgstr "" msgid "Learn more about what is public on Bluesky." msgstr "" -#: src/screens/Profile/components/GermButton.tsx:211 +#: src/screens/Profile/components/GermButton.tsx:212 msgid "Learn more about your Germ DM link" msgstr "" @@ -6674,7 +6674,7 @@ msgstr "" msgid "Live events appear occasionally when something exciting is happening. If you'd like, you can hide this particular event, or all events for this placement in your app interface." msgstr "" -#: src/features/liveNow/components/LiveStatusDialog.tsx:244 +#: src/features/liveNow/components/LiveStatusDialog.tsx:245 msgid "Live feature is in beta" msgstr "" @@ -6904,18 +6904,18 @@ msgstr "Message {displayName}" msgid "Message deleted" msgstr "" -#: src/components/dms/MessageContextMenu.tsx:100 +#: src/components/dms/MessageOverlays.tsx:111 msgctxt "toast" msgid "Message deleted" msgstr "" -#: src/components/dms/MessageItem.tsx:553 +#: src/components/dms/MessageItem.tsx:522 msgid "Message failed to send." msgstr "Message failed to send." #. placeholder {0}: sender?.handle ?? 'unknown' #. placeholder {1}: message.text -#: src/components/dms/MessageContextMenu.tsx:146 +#: src/components/dms/MessageContextMenu.tsx:129 msgid "Message from @{0}: {1}" msgstr "" @@ -6938,7 +6938,7 @@ msgstr "" msgid "Message is too long ({graphemeCount}/{MAX_DM_GRAPHEME_LENGTH})" msgstr "Message is too long ({graphemeCount}/{MAX_DM_GRAPHEME_LENGTH})" -#: src/components/dms/MessageContextMenu.tsx:145 +#: src/components/dms/MessageContextMenu.tsx:128 msgid "Message options" msgstr "" @@ -6946,11 +6946,11 @@ msgstr "" msgid "Messages" msgstr "" -#: src/components/dms/MessageItem.tsx:652 +#: src/components/dms/MessageItem.tsx:621 msgid "Messages from this person are hidden while they are blocking you." msgstr "Messages from this person are hidden while they are blocking you." -#: src/components/dms/MessageItem.tsx:647 +#: src/components/dms/MessageItem.tsx:616 msgid "Messages from this person are hidden while you are blocking them." msgstr "Messages from this person are hidden while you are blocking them." @@ -7229,8 +7229,8 @@ msgstr "" msgid "Navigates to your profile" msgstr "" -#: src/components/moderation/ReportDialog/index.tsx:340 -#: src/components/moderation/ReportDialog/index.tsx:356 +#: src/components/moderation/ReportDialog/index.tsx:342 +#: src/components/moderation/ReportDialog/index.tsx:358 msgid "Need to report a copyright violation, legal request, or regulatory compliance issue?" msgstr "" @@ -7452,7 +7452,7 @@ msgstr "No GIFs found for \"{query}\"." msgid "No GIFs to show right now. Try again in a moment." msgstr "No GIFs to show right now. Try again in a moment." -#: src/features/liveNow/components/LinkPreview.tsx:63 +#: src/features/liveNow/components/LinkPreview.tsx:64 msgid "No image" msgstr "" @@ -7640,7 +7640,7 @@ msgstr "Not followed by anyone you’re following" msgid "Not Found" msgstr "" -#: src/components/dialogs/nuxs/DraftsAnnouncement.tsx:130 +#: src/components/dialogs/nuxs/DraftsAnnouncement.tsx:131 msgid "Not ready to hit post? Keep your best ideas in Drafts until the timing is just right." msgstr "" @@ -7724,7 +7724,7 @@ msgstr "" #: src/components/BotAccountAlert.tsx:52 #: src/components/BotAccountAlert.tsx:57 #: src/components/dms/InitiateChatFlow.tsx:677 -#: src/components/dms/MessageItem.tsx:659 +#: src/components/dms/MessageItem.tsx:628 #: src/screens/Login/PasswordUpdatedForm.tsx:37 #: src/screens/PostThread/components/ThreadItemAnchor.tsx:661 msgid "Okay" @@ -7916,8 +7916,8 @@ msgstr "" msgid "Open post options menu" msgstr "" -#: src/features/liveNow/components/LiveStatusDialog.tsx:218 -#: src/features/liveNow/components/LiveStatusDialog.tsx:228 +#: src/features/liveNow/components/LiveStatusDialog.tsx:219 +#: src/features/liveNow/components/LiveStatusDialog.tsx:229 msgid "Open profile" msgstr "" @@ -8005,7 +8005,7 @@ msgstr "" msgid "Opens flow to sign in to your existing Bluesky account" msgstr "" -#: src/components/images/Gallery/index.tsx:437 +#: src/components/images/Gallery/index.tsx:444 msgid "Opens full image" msgstr "Opens full image" @@ -8022,7 +8022,7 @@ msgstr "" msgid "Opens link {0}" msgstr "" -#: src/view/com/util/UserAvatar.tsx:599 +#: src/view/com/util/UserAvatar.tsx:600 msgid "Opens live status dialog" msgstr "" @@ -8053,7 +8053,7 @@ msgstr "" #: src/components/dms/MessageItem.tsx:229 #: src/view/com/notifications/NotificationFeedItem.tsx:1019 -#: src/view/com/util/UserAvatar.tsx:617 +#: src/view/com/util/UserAvatar.tsx:618 msgid "Opens this profile" msgstr "" @@ -8129,8 +8129,8 @@ msgstr "" #: src/components/dms/AfterReportConversationDialog.tsx:86 #: src/components/dms/AfterReportConversationDialog.tsx:213 -#: src/components/dms/AfterReportDialog.tsx:84 -#: src/components/dms/AfterReportDialog.tsx:176 +#: src/components/dms/AfterReportDialog.tsx:89 +#: src/components/dms/AfterReportDialog.tsx:181 msgid "Our moderation team has received your report." msgstr "" @@ -8661,7 +8661,7 @@ msgstr "" msgid "Press to view followers of this account that you also follow" msgstr "" -#: src/features/liveEvents/components/LiveEventFeedCardWide.tsx:120 +#: src/features/liveEvents/components/LiveEventFeedCardWide.tsx:121 msgid "Preview" msgstr "" @@ -8865,8 +8865,8 @@ msgstr "Re-enable link" msgid "React with {emoji}" msgstr "" -#: src/components/dms/ReactionsDialog.tsx:65 -#: src/components/dms/ReactionsDialog.tsx:90 +#: src/components/dms/ReactionsDialog.tsx:66 +#: src/components/dms/ReactionsDialog.tsx:94 msgid "Reactions" msgstr "Reactions" @@ -8884,8 +8884,8 @@ msgctxt "english-only-resource" msgid "read about how to use search filters" msgstr "" -#: src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx:160 -#: src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx:171 +#: src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx:162 +#: src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx:173 msgid "Read blog post" msgstr "" @@ -9020,13 +9020,13 @@ msgstr "" msgid "Remove attachment" msgstr "" -#: src/view/com/util/UserAvatar.tsx:519 -#: src/view/com/util/UserAvatar.tsx:522 +#: src/view/com/util/UserAvatar.tsx:520 +#: src/view/com/util/UserAvatar.tsx:523 msgid "Remove Avatar" msgstr "" -#: src/view/com/util/UserBanner.tsx:189 -#: src/view/com/util/UserBanner.tsx:192 +#: src/view/com/util/UserBanner.tsx:190 +#: src/view/com/util/UserBanner.tsx:193 msgid "Remove Banner" msgstr "" @@ -9261,8 +9261,8 @@ msgstr "" msgid "Reply was successfully hidden" msgstr "" -#: src/components/dms/MessageContextMenu.tsx:193 -#: src/features/liveNow/components/LiveStatusDialog.tsx:266 +#: src/components/dms/MessageContextMenu.tsx:176 +#: src/features/liveNow/components/LiveStatusDialog.tsx:267 #: src/screens/Messages/ConversationSettings/index.tsx:517 msgid "Report" msgstr "" @@ -9279,8 +9279,8 @@ msgstr "" msgid "Report conversation" msgstr "" -#: src/components/moderation/ReportDialog/index.tsx:96 -#: src/components/moderation/ReportDialog/index.tsx:261 +#: src/components/moderation/ReportDialog/index.tsx:98 +#: src/components/moderation/ReportDialog/index.tsx:263 msgid "Report dialog" msgstr "" @@ -9294,7 +9294,7 @@ msgstr "" msgid "Report list" msgstr "" -#: src/components/dms/MessageContextMenu.tsx:190 +#: src/components/dms/MessageContextMenu.tsx:173 msgid "Report message" msgstr "" @@ -9314,8 +9314,8 @@ msgstr "" #: src/components/dms/AfterReportConversationDialog.tsx:83 #: src/components/dms/AfterReportConversationDialog.tsx:210 -#: src/components/dms/AfterReportDialog.tsx:81 -#: src/components/dms/AfterReportDialog.tsx:173 +#: src/components/dms/AfterReportDialog.tsx:86 +#: src/components/dms/AfterReportDialog.tsx:178 msgid "Report submitted" msgstr "" @@ -9337,7 +9337,7 @@ msgid "Report this list" msgstr "" #: src/components/moderation/ReportDialog/copy.ts:19 -#: src/features/liveNow/components/LiveStatusDialog.tsx:249 +#: src/features/liveNow/components/LiveStatusDialog.tsx:250 msgid "Report this livestream" msgstr "" @@ -9530,7 +9530,7 @@ msgstr "" #: src/components/contacts/screens/VerifyNumber.tsx:355 #: src/components/Error.tsx:65 #: src/components/Lists.tsx:115 -#: src/components/moderation/ReportDialog/index.tsx:295 +#: src/components/moderation/ReportDialog/index.tsx:297 #: src/components/Post/Embed/VideoEmbed/VideoEmbedInner/VideoFallback.tsx:56 #: src/components/Post/Embed/VideoEmbed/VideoEmbedInner/VideoFallback.tsx:59 #: src/components/StarterPack/ProfileStarterPacks.tsx:377 @@ -9553,7 +9553,7 @@ msgstr "" msgid "Retry" msgstr "" -#: src/components/moderation/ReportDialog/index.tsx:292 +#: src/components/moderation/ReportDialog/index.tsx:294 #: src/view/screens/Storybook/Admonitions.tsx:61 msgid "Retry loading report options" msgstr "" @@ -9638,7 +9638,7 @@ msgid "Save draft?" msgstr "" #: src/components/Lightbox/chrome/ImageMenu.tsx:99 -#: src/components/MediaPreview.tsx:196 +#: src/components/MediaPreview.tsx:197 #: src/components/Post/Embed/ImageContextMenu.tsx:70 #: src/components/StarterPack/ShareDialog.tsx:144 #: src/components/StarterPack/ShareDialog.tsx:150 @@ -9674,7 +9674,7 @@ msgstr "" msgid "Saved Feeds" msgstr "" -#: src/components/dialogs/nuxs/BookmarksAnnouncement.tsx:144 +#: src/components/dialogs/nuxs/BookmarksAnnouncement.tsx:145 #: src/Navigation.tsx:555 #: src/screens/Bookmarks/index.tsx:59 msgid "Saved Posts" @@ -9899,7 +9899,7 @@ msgstr "" msgid "Select a color" msgstr "" -#: src/components/moderation/ReportDialog/index.tsx:378 +#: src/components/moderation/ReportDialog/index.tsx:380 msgid "Select a reason" msgstr "" @@ -9990,7 +9990,7 @@ msgstr "" msgid "Select languages" msgstr "" -#: src/components/moderation/ReportDialog/index.tsx:428 +#: src/components/moderation/ReportDialog/index.tsx:430 msgid "Select moderation service" msgstr "" @@ -10092,7 +10092,7 @@ msgstr "" msgid "Send post to..." msgstr "" -#: src/components/moderation/ReportDialog/index.tsx:816 +#: src/components/moderation/ReportDialog/index.tsx:818 msgid "Send report to {title}" msgstr "" @@ -10114,7 +10114,7 @@ msgid "Send via direct message" msgstr "" #. placeholder {0}: i18n.date(new Date(message.sentAt), { timeStyle: 'short', }) -#: src/components/dms/MessageContextMenu.tsx:154 +#: src/components/dms/MessageContextMenu.tsx:137 msgid "Sent at {0}" msgstr "Sent at {0}" @@ -10219,7 +10219,7 @@ msgstr "" msgid "Sexually Suggestive" msgstr "" -#: src/components/MediaPreview.tsx:202 +#: src/components/MediaPreview.tsx:203 #: src/components/Post/Embed/ImageContextMenu.tsx:74 #: src/components/StarterPack/QrCodeDialog.tsx:195 #: src/screens/Hashtag.tsx:130 @@ -10309,16 +10309,16 @@ msgstr "" #: src/components/moderation/ScreenHider.tsx:179 #: src/components/moderation/ScreenHider.tsx:182 -#: src/features/liveNow/components/LiveStatusDialog.tsx:317 -#: src/features/liveNow/components/LiveStatusDialog.tsx:321 +#: src/features/liveNow/components/LiveStatusDialog.tsx:318 +#: src/features/liveNow/components/LiveStatusDialog.tsx:322 #: src/screens/List/ListHiddenScreen.tsx:194 #: src/screens/VideoFeed/index.tsx:646 #: src/screens/VideoFeed/index.tsx:652 msgid "Show anyway" msgstr "" -#: src/screens/Settings/AutomationLabelSettings.tsx:181 -#: src/screens/Settings/AutomationLabelSettings.tsx:194 +#: src/screens/Settings/AutomationLabelSettings.tsx:185 +#: src/screens/Settings/AutomationLabelSettings.tsx:198 msgid "Show automation label" msgstr "Show automation label" @@ -10412,7 +10412,7 @@ msgid "Show warning and filter from feeds" msgstr "" #: src/components/dialogs/nuxs/LiveNowBetaDialog.tsx:60 -#: src/components/dialogs/nuxs/LiveNowBetaDialog.tsx:170 +#: src/components/dialogs/nuxs/LiveNowBetaDialog.tsx:171 msgid "Show when you’re live" msgstr "" @@ -10557,7 +10557,7 @@ msgstr "" msgid "Skip to next step" msgstr "" -#: src/components/images/Gallery/index.tsx:420 +#: src/components/images/Gallery/index.tsx:427 msgid "slide" msgstr "slide" @@ -10614,7 +10614,7 @@ msgid "Someone left the group" msgstr "Someone left the group" #. placeholder {0}: reaction.value -#: src/components/dms/MessageItem.tsx:294 +#: src/components/dms/MessageItem.tsx:270 msgid "Someone reacted {0}" msgstr "" @@ -10639,7 +10639,7 @@ msgstr "Someone was removed" msgid "Someone was removed from the group" msgstr "Someone was removed from the group" -#: src/components/moderation/ReportDialog/index.tsx:101 +#: src/components/moderation/ReportDialog/index.tsx:103 msgid "Something wasn't quite right with the data you're trying to report. Please contact support." msgstr "" @@ -10650,7 +10650,7 @@ msgid "Something went wrong" msgstr "" #: src/components/ageAssurance/AgeAssuranceInitDialog.tsx:139 -#: src/components/moderation/ReportDialog/index.tsx:287 +#: src/components/moderation/ReportDialog/index.tsx:289 #: src/screens/Deactivated.tsx:86 #: src/screens/Settings/components/DeactivateAccountDialog.tsx:59 #: src/view/screens/Storybook/Admonitions.tsx:56 @@ -10670,7 +10670,7 @@ msgstr "" msgid "Something went wrong. Please try again in a moment." msgstr "" -#: src/components/moderation/ReportDialog/index.tsx:245 +#: src/components/moderation/ReportDialog/index.tsx:247 msgid "Something went wrong. Please try again." msgstr "" @@ -10812,7 +10812,7 @@ msgstr "" msgid "Storybook" msgstr "" -#: src/components/dialogs/nuxs/LiveNowBetaDialog.tsx:181 +#: src/components/dialogs/nuxs/LiveNowBetaDialog.tsx:182 msgid "Streaming on Twitch? Set your live status on Bluesky to add a badge to your avatar. Tapping it takes people straight to your stream." msgstr "" @@ -10837,9 +10837,9 @@ msgstr "" msgid "Submit Appeal" msgstr "" -#: src/components/moderation/ReportDialog/index.tsx:506 -#: src/components/moderation/ReportDialog/index.tsx:567 -#: src/components/moderation/ReportDialog/index.tsx:574 +#: src/components/moderation/ReportDialog/index.tsx:508 +#: src/components/moderation/ReportDialog/index.tsx:569 +#: src/components/moderation/ReportDialog/index.tsx:576 msgid "Submit report" msgstr "" @@ -10848,13 +10848,13 @@ msgid "Subscribe" msgstr "" #. placeholder {0}: highlightedPublisher.name -#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:425 -#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:434 +#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:426 +#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:435 msgid "Subscribe on {0}" msgstr "Subscribe on {0}" #. placeholder {0}: highlightedPublisher.name -#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:433 +#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:434 msgid "Subscribe to {publicationTitle} on {0}" msgstr "Subscribe to {publicationTitle} on {0}" @@ -10985,7 +10985,7 @@ msgstr "" msgid "Tap below to allow Bluesky to access your GPS location. We will then use that data to more accurately determine the content and features available in your region." msgstr "" -#: src/components/dms/MessageItem.tsx:598 +#: src/components/dms/MessageItem.tsx:567 msgid "Tap for details" msgstr "Tap for details" @@ -11015,29 +11015,29 @@ msgstr "" msgid "Tap to dismiss" msgstr "" -#: src/components/dms/ReactionsDialog.tsx:192 +#: src/components/dms/ReactionsDialog.tsx:196 msgid "Tap to remove" msgstr "Tap to remove" #. placeholder {0}: reaction.value -#: src/components/dms/ReactionsDialog.tsx:208 +#: src/components/dms/ReactionsDialog.tsx:212 msgid "Tap to remove your {0} reaction" msgstr "Tap to remove your {0} reaction" -#: src/components/dms/MessageItem.tsx:563 +#: src/components/dms/MessageItem.tsx:532 msgid "Tap to retry" msgstr "Tap to retry" #. placeholder {0}: tab.value -#: src/components/dms/ReactionsDialog.tsx:354 +#: src/components/dms/ReactionsDialog.tsx:358 msgid "Tap to show {0} reactions" msgstr "Tap to show {0} reactions" -#: src/components/dms/ReactionsDialog.tsx:353 +#: src/components/dms/ReactionsDialog.tsx:357 msgid "Tap to show all reactions" msgstr "Tap to show all reactions" -#: src/components/dms/MessageItem.tsx:317 +#: src/components/dms/MessageItem.tsx:293 msgid "Tap to view reactions" msgstr "Tap to view reactions" @@ -11427,7 +11427,7 @@ msgstr "" msgid "This author has chosen to make their posts visible only to people who are signed in." msgstr "" -#: src/screens/Profile/components/GermButton.tsx:243 +#: src/screens/Profile/components/GermButton.tsx:244 msgid "This button lets others open the Germ DM app to send you a message. You can manage its visibility from the Germ DM app, or you can disconnect your Bluesky account from Germ DM altogether by clicking the button below." msgstr "" @@ -11561,7 +11561,7 @@ msgstr "" msgid "This is not a valid link" msgstr "" -#: src/screens/Settings/AutomationLabelSettings.tsx:169 +#: src/screens/Settings/AutomationLabelSettings.tsx:173 msgid "This label lets the world know that this account is automated. If turned on, this label appears next to the account's name on their profile and posts. It can be turned on or off at any time." msgstr "This label lets the world know that this account is automated. If turned on, this label appears next to the account's name on their profile and posts. It can be turned on or off at any time." @@ -11594,13 +11594,13 @@ msgstr "" msgid "This list is empty." msgstr "" -#: src/components/dms/MessageItem.tsx:596 -#: src/components/dms/MessageItem.tsx:625 +#: src/components/dms/MessageItem.tsx:565 +#: src/components/dms/MessageItem.tsx:594 msgid "This message is hidden because this user is blocking you." msgstr "This message is hidden because this user is blocking you." -#: src/components/dms/MessageItem.tsx:595 -#: src/components/dms/MessageItem.tsx:621 +#: src/components/dms/MessageItem.tsx:564 +#: src/components/dms/MessageItem.tsx:590 msgid "This message is hidden because you are blocking this user." msgstr "This message is hidden because you are blocking this user." @@ -11835,8 +11835,8 @@ msgstr "" msgid "Topic" msgstr "" -#: src/components/dms/MessageContextMenu.tsx:162 -#: src/components/dms/MessageContextMenu.tsx:165 +#: src/components/dms/MessageContextMenu.tsx:145 +#: src/components/dms/MessageContextMenu.tsx:148 #: src/components/Post/Translated/index.tsx:150 #: src/components/Post/Translated/index.tsx:157 #: src/components/PostControls/PostMenu/PostMenuItems.tsx:553 @@ -11887,7 +11887,7 @@ msgstr "" msgid "Trolling" msgstr "" -#: src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx:140 +#: src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx:142 msgid "Trust emerges from relationships, communities, and shared context, so we’re also enabling <0>trusted verifiers: organizations that can directly issue verification." msgstr "" @@ -11980,7 +11980,7 @@ msgstr "" msgid "Unavailable feed information" msgstr "" -#: src/components/dms/MessageItem.tsx:663 +#: src/components/dms/MessageItem.tsx:632 #: src/components/dms/MessagesListBlockedFooter.tsx:97 #: src/components/dms/MessagesListBlockedFooter.tsx:104 #: src/screens/Messages/ConversationSettings/MemberMenu.tsx:222 @@ -12026,8 +12026,8 @@ msgstr "" #: src/features/liveEvents/components/LiveEventFeedOptionsMenu.tsx:79 #: src/features/liveEvents/components/SidebarLiveEventFeedsBanner.tsx:40 #: src/features/liveEvents/components/SidebarLiveEventFeedsBanner.tsx:46 -#: src/screens/Profile/components/GermButton.tsx:185 #: src/screens/Profile/components/GermButton.tsx:186 +#: src/screens/Profile/components/GermButton.tsx:187 msgid "Undo" msgstr "" @@ -12061,7 +12061,7 @@ msgstr "" msgid "Unfollows the user" msgstr "" -#: src/components/moderation/ReportDialog/index.tsx:490 +#: src/components/moderation/ReportDialog/index.tsx:492 msgid "Unfortunately, none of your subscribed labelers supports this report type." msgstr "" @@ -12287,22 +12287,22 @@ msgstr "" msgid "Upload a text file to:" msgstr "" -#: src/view/com/util/UserAvatar.tsx:490 -#: src/view/com/util/UserAvatar.tsx:493 -#: src/view/com/util/UserBanner.tsx:160 -#: src/view/com/util/UserBanner.tsx:163 +#: src/view/com/util/UserAvatar.tsx:491 +#: src/view/com/util/UserAvatar.tsx:494 +#: src/view/com/util/UserBanner.tsx:161 +#: src/view/com/util/UserBanner.tsx:164 msgid "Upload from Camera" msgstr "" -#: src/view/com/util/UserAvatar.tsx:507 -#: src/view/com/util/UserBanner.tsx:177 +#: src/view/com/util/UserAvatar.tsx:508 +#: src/view/com/util/UserBanner.tsx:178 msgid "Upload from Files" msgstr "" -#: src/view/com/util/UserAvatar.tsx:501 -#: src/view/com/util/UserAvatar.tsx:505 -#: src/view/com/util/UserBanner.tsx:171 -#: src/view/com/util/UserBanner.tsx:175 +#: src/view/com/util/UserAvatar.tsx:502 +#: src/view/com/util/UserAvatar.tsx:506 +#: src/view/com/util/UserBanner.tsx:172 +#: src/view/com/util/UserBanner.tsx:176 msgid "Upload from Library" msgstr "" @@ -12363,7 +12363,7 @@ msgid "user" msgstr "user" #: src/components/dms/AfterReportConversationDialog.tsx:187 -#: src/components/dms/AfterReportDialog.tsx:150 +#: src/components/dms/AfterReportDialog.tsx:155 msgctxt "toast" msgid "User blocked" msgstr "" @@ -12631,8 +12631,8 @@ msgid "View" msgstr "" #. placeholder {0}: view.source.title -#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:319 -#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:588 +#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:320 +#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:589 msgid "View {0}" msgstr "View {0}" @@ -12661,7 +12661,7 @@ msgstr "View {0}’s profile" msgid "View {displayName}’s profile" msgstr "View {displayName}’s profile" -#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:436 +#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:437 msgid "View {publicationTitle}" msgstr "View {publicationTitle}" @@ -12728,10 +12728,10 @@ msgstr "" msgid "View profile banner" msgstr "View profile banner" -#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:319 -#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:426 -#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:437 -#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:588 +#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:320 +#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:427 +#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:438 +#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:589 msgid "View publication" msgstr "View publication" @@ -12785,8 +12785,8 @@ msgstr "" msgid "View your verifications" msgstr "" -#: src/components/images/AutoSizedImage.tsx:220 -#: src/components/images/AutoSizedImage.tsx:252 +#: src/components/images/AutoSizedImage.tsx:221 +#: src/components/images/AutoSizedImage.tsx:253 msgid "Views full image" msgstr "" @@ -12829,8 +12829,8 @@ msgstr "" msgid "Warn content and filter from feeds" msgstr "" -#: src/features/liveNow/components/LiveStatusDialog.tsx:189 -#: src/features/liveNow/components/LiveStatusDialog.tsx:198 +#: src/features/liveNow/components/LiveStatusDialog.tsx:190 +#: src/features/liveNow/components/LiveStatusDialog.tsx:199 msgid "Watch now" msgstr "" @@ -12977,7 +12977,7 @@ msgstr "" msgid "We’re having network issues, try again" msgstr "We’re having network issues, try again" -#: src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx:96 +#: src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx:97 msgid "We’re introducing a new layer of verification on Bluesky — an easy-to-see checkmark." msgstr "" @@ -13063,7 +13063,7 @@ msgstr "" msgid "What's up?" msgstr "" -#: src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx:148 +#: src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx:150 msgid "When you tap on a check, you’ll see which organizations have granted verification." msgstr "" @@ -13080,7 +13080,7 @@ msgstr "Who can join this group chat and how" msgid "Who can reply" msgstr "" -#: src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx:129 +#: src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx:131 msgid "Who can verify?" msgstr "" @@ -13132,7 +13132,7 @@ msgstr "" msgid "Why should this user be reviewed?" msgstr "" -#: src/components/dms/AfterReportDialog.tsx:46 +#: src/components/dms/AfterReportDialog.tsx:51 msgid "Would you like to block this user and/or delete this conversation?" msgstr "" @@ -13224,7 +13224,7 @@ msgid "You are accessing Bluesky from a region that legally requires us to verif msgstr "" #. placeholder {0}: sanitizeHandle(profile.handle, '@') -#: src/components/dms/MessageItem.tsx:636 +#: src/components/dms/MessageItem.tsx:605 msgid "You are blocking {0}" msgstr "You are blocking {0}" @@ -13316,7 +13316,7 @@ msgstr "" msgid "You can continue ongoing conversations regardless of which setting you choose." msgstr "" -#: src/components/dialogs/nuxs/ActivitySubscriptions.tsx:149 +#: src/components/dialogs/nuxs/ActivitySubscriptions.tsx:150 msgid "You can now choose to be notified when specific people post. If there’s someone you want timely updates from, go to their profile and find the new bell icon near the follow button." msgstr "" @@ -13552,7 +13552,7 @@ msgid "You probably want to restart the app now." msgstr "" #. placeholder {0}: reaction.value -#: src/components/dms/MessageItem.tsx:287 +#: src/components/dms/MessageItem.tsx:263 msgid "You reacted {0}" msgstr "" @@ -13841,7 +13841,7 @@ msgstr "" msgid "Your preferred language" msgstr "" -#: src/screens/Onboarding/StepFinished/ValuePropositionPager.tsx:100 +#: src/screens/Onboarding/StepFinished/ValuePropositionPager.tsx:102 #: src/screens/Onboarding/StepFinished/ValuePropositionPager.web.tsx:53 msgid "Your profile picture" msgstr "" @@ -13859,7 +13859,7 @@ msgid "Your reply was sent" msgstr "" #. placeholder {0}: state.selectedLabeler?.creator.displayName -#: src/components/moderation/ReportDialog/index.tsx:517 +#: src/components/moderation/ReportDialog/index.tsx:519 msgid "Your report will be sent to <0>{0}." msgstr "" From a19d652a39b4e483a30a409c37a7d74b6552f7c6 Mon Sep 17 00:00:00 2001 From: surfdude29 <149612116+surfdude29@users.noreply.github.com> Date: Thu, 4 Jun 2026 07:50:56 +0100 Subject: [PATCH 049/149] Fix invalid `zero` plural category and add plural formatting (#10722) --- src/screens/Messages/JoinRequests.tsx | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/screens/Messages/JoinRequests.tsx b/src/screens/Messages/JoinRequests.tsx index 80d31299dc..98952aee34 100644 --- a/src/screens/Messages/JoinRequests.tsx +++ b/src/screens/Messages/JoinRequests.tsx @@ -411,7 +411,6 @@ function Header({ count?: number hasMoreRequests?: boolean }) { - const {t: l} = useLingui() return ( @@ -420,15 +419,15 @@ function Header({ {count === undefined ? ( Requests to join ) : hasMoreRequests ? ( - l({ - message: `${count}+ requests to join`, - comment: - 'Displayed when there are more requests to join a group chat than have been loaded', - }) + ) : ( From 9f200aab05e8f71f8e4fb74f59a9b400e89f8964 Mon Sep 17 00:00:00 2001 From: surfdude29 <149612116+surfdude29@users.noreply.github.com> Date: Thu, 4 Jun 2026 08:51:51 +0100 Subject: [PATCH 050/149] Use correct `Plural` macro in InviteLinkDialog (#10723) --- src/screens/Messages/components/InviteLinkDialog.tsx | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/screens/Messages/components/InviteLinkDialog.tsx b/src/screens/Messages/components/InviteLinkDialog.tsx index ad6d4a08e5..6e898a0a9c 100644 --- a/src/screens/Messages/components/InviteLinkDialog.tsx +++ b/src/screens/Messages/components/InviteLinkDialog.tsx @@ -5,8 +5,7 @@ import { moderateProfile, type ModerationOpts, } from '@atproto/api' -import {plural} from '@lingui/core/macro' -import {Trans, useLingui} from '@lingui/react/macro' +import {Plural, Trans, useLingui} from '@lingui/react/macro' import {useOpenComposer} from '#/lib/hooks/useOpenComposer' import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name' @@ -178,11 +177,7 @@ export function InviteLinkDialog({ Group chats can only have a maximum of{' '} - {plural(convo.details.memberLimit, { - one: '# person', - other: '# people', - })} - . + . From 49f8e5031f42762805b1ab392c68e7bf75812e9d Mon Sep 17 00:00:00 2001 From: heikadog <41552394+heikadog@users.noreply.github.com> Date: Thu, 4 Jun 2026 06:28:40 -0400 Subject: [PATCH 051/149] Fix labeller highlight when selected on bottom bar (#10716) --- src/view/shell/bottom-bar/BottomBar.tsx | 5 +++-- src/view/shell/bottom-bar/BottomBarStyles.tsx | 9 +++++++++ src/view/shell/bottom-bar/BottomBarWeb.tsx | 9 +++++++-- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/view/shell/bottom-bar/BottomBar.tsx b/src/view/shell/bottom-bar/BottomBar.tsx index e6a1eeaad5..605542749e 100644 --- a/src/view/shell/bottom-bar/BottomBar.tsx +++ b/src/view/shell/bottom-bar/BottomBar.tsx @@ -144,6 +144,7 @@ export function BottomBar({navigation}: BottomTabBarProps) { const [demoMode] = useDemoMode() const {isActive: live} = useActorStatus(profile) + const isLabeler = profile?.associated?.labeler return ( <> @@ -276,9 +277,9 @@ export function BottomBar({navigation}: BottomTabBarProps) { { closeAllActiveElements() @@ -186,9 +187,13 @@ export function BottomBarWeb() { From c79b5bfa08d6ddeb909dab0c0b392e5123d9c5bb Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Thu, 4 Jun 2026 09:29:36 -0500 Subject: [PATCH 052/149] Disable overscroll on Android to fix settle discrepancy (#10717) --- src/components/images/Gallery/index.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/components/images/Gallery/index.tsx b/src/components/images/Gallery/index.tsx index 9ae677c2d2..fd18cb8a0b 100644 --- a/src/components/images/Gallery/index.tsx +++ b/src/components/images/Gallery/index.tsx @@ -40,7 +40,7 @@ import {ImageContextMenu} from '#/components/Post/Embed/ImageContextMenu' import {PostEmbedViewContext} from '#/components/Post/Embed/types' import {Text} from '#/components/Typography' import {useAnalytics} from '#/analytics' -import {IS_WEB} from '#/env' +import {IS_ANDROID, IS_WEB} from '#/env' export * from './const' export * from './maybeApplyGalleryOffsetStyles' @@ -264,6 +264,9 @@ export function Gallery({ aria-label={l`Image gallery, ${images.length} images`} horizontal pagingEnabled={false} + // Disable Android's stretch overscroll, which can leave the carousel + // settled just off the left edge instead of aligned to x = 0 + overScrollMode={IS_ANDROID ? 'never' : 'auto'} showsHorizontalScrollIndicator={false} directionalLockEnabled nestedScrollEnabled From 08cd4e58b023e1ffe2b3681f4f8c690a24af84a0 Mon Sep 17 00:00:00 2001 From: DS Boyce <260543580+ds-boyce@users.noreply.github.com> Date: Thu, 4 Jun 2026 08:11:50 -0700 Subject: [PATCH 053/149] Add group chat join links to supported embed types (#10454) --- __tests__/lib/strings/url-helpers.test.ts | 45 +++ eslint-suppressions.json | 8 - src/components/Post/Embed/ChatInviteEmbed.tsx | 41 +++ .../Post/Embed/JoinRequestEmbed.tsx | 271 ++++++++++++++++++ src/components/Post/Embed/index.tsx | 17 ++ .../intents/GroupChatJoinDialog.tsx | 10 +- src/lib/api/index.ts | 18 +- src/lib/api/resolve.ts | 25 +- src/lib/strings/url-helpers.ts | 5 +- src/state/queries/join-links.ts | 6 +- src/view/com/composer/ExternalEmbed.tsx | 3 + .../com/composer/ExternalEmbedRemoveBtn.tsx | 7 +- 12 files changed, 434 insertions(+), 22 deletions(-) create mode 100644 src/components/Post/Embed/ChatInviteEmbed.tsx create mode 100644 src/components/Post/Embed/JoinRequestEmbed.tsx diff --git a/__tests__/lib/strings/url-helpers.test.ts b/__tests__/lib/strings/url-helpers.test.ts index 0b1b750281..23ffaa2875 100644 --- a/__tests__/lib/strings/url-helpers.test.ts +++ b/__tests__/lib/strings/url-helpers.test.ts @@ -1,6 +1,7 @@ import {describe, expect, it} from '@jest/globals' import { + getChatInviteCodeFromUrl, isPossiblyAUrl, isTrustedUrl, linkRequiresWarning, @@ -178,3 +179,47 @@ describe('isTrustedUrl', () => { expect(output).toEqual(expected) }) }) + +describe('getChatInviteCodeFromUrl', () => { + type Case = [string, string | undefined] + + const cases: Case[] = [ + ['https://bsky.app/c/abcdefg', 'abcdefg'], + ['https://bsky.app/c/abcdefghij', 'abcdefghij'], + // http is not recognized as a bsky.app url + ['http://bsky.app/c/abcdefg', undefined], + ['https://bsky.app/c/abcdefg?utm=foo', 'abcdefg'], + ['https://bsky.app/c/abcdefg#section', 'abcdefg'], + ['/c/abcdefg', 'abcdefg'], + ['/c/abcdefg?utm=foo', 'abcdefg'], + ['/c/abcdefg#section', 'abcdefg'], + + // too short + ['https://bsky.app/c/abcdef', undefined], + ['/c/abcdef', undefined], + // too long + ['https://bsky.app/c/abcdefghijk', undefined], + ['/c/abcdefghijk', undefined], + // invalid characters + ['https://bsky.app/c/abc-def', undefined], + ['/c/abc def', undefined], + // trailing path + ['https://bsky.app/c/abcdefg/extra', undefined], + ['/c/abcdefg/extra', undefined], + // wrong path + ['https://bsky.app/profile/abcdefg', undefined], + ['https://bsky.app/c', undefined], + // wrong host + ['https://example.com/c/abcdefg', undefined], + // not a url, not a path + ['c/abcdefg', undefined], + ['abcdefg', undefined], + ['', undefined], + // malformed url + ['https://[invalid/c/abcdefg', undefined], + ] + + it.each(cases)('given input %p, returns %p', (input, expected) => { + expect(getChatInviteCodeFromUrl(input)).toEqual(expected) + }) +}) diff --git a/eslint-suppressions.json b/eslint-suppressions.json index f2e677dc79..d8555ace5b 100644 --- a/eslint-suppressions.json +++ b/eslint-suppressions.json @@ -811,14 +811,6 @@ "count": 1 } }, - "src/lib/api/index.ts": { - "@typescript-eslint/no-explicit-any": { - "count": 5 - }, - "@typescript-eslint/no-unsafe-member-access": { - "count": 3 - } - }, "src/lib/async/retry.ts": { "@typescript-eslint/no-explicit-any": { "count": 2 diff --git a/src/components/Post/Embed/ChatInviteEmbed.tsx b/src/components/Post/Embed/ChatInviteEmbed.tsx new file mode 100644 index 0000000000..744fcfb7fa --- /dev/null +++ b/src/components/Post/Embed/ChatInviteEmbed.tsx @@ -0,0 +1,41 @@ +import {type StyleProp, type ViewStyle} from 'react-native' +import {type AppBskyEmbedExternal} from '@atproto/api' + +import {useJoinLinkPreviewsQuery} from '#/state/queries/join-links' +import {useSession} from '#/state/session' +import {atoms as a} from '#/alf' +import {ExternalEmbed} from '#/components/Post/Embed/ExternalEmbed' +import {JoinRequestEmbed} from '#/components/Post/Embed/JoinRequestEmbed' + +export function ChatInviteEmbed({ + code, + link, + onOpen, + style, +}: { + code: string + link: AppBskyEmbedExternal.ViewExternal + onOpen?: () => void + style?: StyleProp +}) { + const {hasSession} = useSession() + const {data, error, isPending} = useJoinLinkPreviewsQuery({ + codes: [code], + hasSession, + }) + + const preview = data?.joinLinkPreviews[0] + + if (error) { + return + } + + return ( + + ) +} diff --git a/src/components/Post/Embed/JoinRequestEmbed.tsx b/src/components/Post/Embed/JoinRequestEmbed.tsx new file mode 100644 index 0000000000..77a0223bec --- /dev/null +++ b/src/components/Post/Embed/JoinRequestEmbed.tsx @@ -0,0 +1,271 @@ +import {type StyleProp, View, type ViewStyle} from 'react-native' +import {type ChatBskyGroupDefs} from '@atproto/api' +import {Plural, Trans, useLingui} from '@lingui/react/macro' +import {useNavigation} from '@react-navigation/native' + +import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name' +import {type NavigationProp} from '#/lib/routes/types' +import {sanitizeHandle} from '#/lib/strings/handles' +import {atoms as a, useTheme} from '#/alf' +import {AvatarBubbles} from '#/components/AvatarBubbles' +import { + Button, + type ButtonColor, + ButtonIcon, + ButtonText, +} from '#/components/Button' +import {ArrowRight_Stroke2_Corner0_Rounded as ArrowRightIcon} from '#/components/icons/Arrow' +import {ArrowBoxRight_Stroke2_Corner3_Rounded as JoinIcon} from '#/components/icons/ArrowBoxRight' +import {CheckThick_Stroke2_Corner0_Rounded as CheckIcon} from '#/components/icons/Check' +import {RaisingHand4Finger_Stroke2_Corner2_Rounded as HandIcon} from '#/components/icons/RaisingHand' +import {Warning_Stroke2_Corner0_Rounded as WarningIcon} from '#/components/icons/Warning' +import {useIntentDialogs} from '#/components/intents/IntentDialogs' +import {Loader} from '#/components/Loader' +import {ProfileBadges} from '#/components/ProfileBadges' +import {Text} from '#/components/Typography' + +const JOIN_REQUEST_EMBED_HEIGHT = 152 + +export function JoinRequestEmbed({ + loading = false, + preview, + style, + onOpen, +}: { + loading?: boolean + preview?: ChatBskyGroupDefs.JoinLinkPreviewView + style?: StyleProp + onOpen?: () => void +}) { + const t = useTheme() + + if (loading) { + return ( + + + + ) + } + + if (!preview) { + return ( + + + + Chat invite link no longer available + + + ) + } + + return ( + + ) +} + +function JoinRequestEmbedInner({ + preview, + style, + onOpen, +}: { + preview: ChatBskyGroupDefs.JoinLinkPreviewView + style?: StyleProp + onOpen?: () => void +}) { + const t = useTheme() + const {t: l} = useLingui() + const navigation = useNavigation() + + const {groupChatJoinDialogControl, setGroupChatJoinState} = useIntentDialogs() + + const ownerDisplayName = createSanitizedDisplayName(preview.owner) + const ownerHandle = sanitizeHandle(preview.owner.handle, '@') + + const avatarProfiles = preview.convo?.members ?? [preview.owner] + + const convoId = preview.convo?.id + const isFollowing = preview.owner.viewer?.following ?? false + const hasRequested = !convoId && preview.viewer?.requestedAt != null + + let canJoin = true + let ButtonIconImage = JoinIcon + let buttonText = preview.requireApproval ? l`Request to join` : l`Join` + let buttonColor: ButtonColor = 'primary' + if (preview.enabledStatus !== 'enabled') { + canJoin = false + ButtonIconImage = WarningIcon + buttonText = l`Chat invite link no longer available` + buttonColor = 'secondary' + } else if (preview.memberCount >= preview.memberLimit) { + canJoin = false + ButtonIconImage = HandIcon + buttonText = l`This chat is full` + buttonColor = 'secondary' + } else if (preview.joinRule === 'followedByOwner' && !isFollowing) { + canJoin = false + ButtonIconImage = HandIcon + buttonText = l`Only people the chat owner follows can join` + buttonColor = 'secondary' + } else if (hasRequested) { + ButtonIconImage = CheckIcon + buttonText = l`Requested` + buttonColor = 'secondary' + } + + return ( + + + + + + {preview.name} + + + + Group chat + + + + {preview.memberCount}/{preview.memberLimit}{' '} + + + + + + + + By{' '} + + {ownerDisplayName} + + + + + + {ownerHandle} + + + + + {convoId ? ( + + ) : ( + + )} + + ) +} diff --git a/src/components/Post/Embed/index.tsx b/src/components/Post/Embed/index.tsx index 054558ad83..ab6f5dc439 100644 --- a/src/components/Post/Embed/index.tsx +++ b/src/components/Post/Embed/index.tsx @@ -12,6 +12,7 @@ import {Trans} from '@lingui/react/macro' import {useQueryClient} from '@tanstack/react-query' import {makeProfileLink} from '#/lib/routes/links' +import {getChatInviteCodeFromUrl} from '#/lib/strings/url-helpers' import {useModerationOpts} from '#/state/preferences/moderation-opts' import {unstableCacheProfileView} from '#/state/queries/profile' import {useSession} from '#/state/session' @@ -33,6 +34,7 @@ import { type EmbedType, parseEmbed, } from '#/types/bsky/post' +import {ChatInviteEmbed} from './ChatInviteEmbed' import {ExternalEmbed} from './ExternalEmbed' import {ModeratedFeedEmbed} from './FeedEmbed' import {ImageEmbed} from './ImageEmbed' @@ -110,6 +112,21 @@ function MediaEmbed({ ) } + const chatInviteCode = getChatInviteCodeFromUrl(embed.view.external.uri) + if (chatInviteCode) { + return ( + + + + ) + } return ( - Open chat + + Open chat + ) : ( @@ -416,8 +420,8 @@ function GroupChatJoinDialogContent({code}: {code?: string}) { } accessibilityHint={ joinLinkPreview.requireApproval - ? l`Request access to join this group chat` - : l`Join this group chat` + ? l`Tap to request access to join this group chat` + : l`Tap to join this group chat immediately` } size="large" color={buttonColor} diff --git a/src/lib/api/index.ts b/src/lib/api/index.ts index d9a026ca83..c5f6cc6eb5 100644 --- a/src/lib/api/index.ts +++ b/src/lib/api/index.ts @@ -177,7 +177,8 @@ export async function post( writes: writes, validate: true, }) - } catch (e: any) { + } catch (err) { + const e = err as Error logger.error(`Failed to create post`, { safeMessage: e.message, }) @@ -427,6 +428,16 @@ async function resolveMedia( }, } } + if (resolvedLink.type === 'chat-invite' && resolvedLink.view) { + return { + $type: 'app.bsky.embed.external', + external: { + uri: resolvedLink.uri, + title: resolvedLink.view.name, + description: `${resolvedLink.view.memberCount}/${resolvedLink.view.memberLimit}`, + }, + } + } } return undefined } @@ -470,6 +481,7 @@ async function computeCid(record: AppBskyFeedPost.Record): Promise { } // Returns a transformed version of the object for use in DAG-CBOR. +// eslint-disable-next-line @typescript-eslint/no-explicit-any function prepareForHashing(v: any): any { // IMPORTANT: BlobRef#ipld() returns the correct object we need for hashing, // the API client will convert this for you but we're hashing in the client, @@ -492,9 +504,10 @@ function prepareForHashing(v: any): any { // Walk through plain objects if (isPlainObject(v)) { - const obj: any = {} + const obj: Record = {} let pure = true for (const key in v) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access let value = v[key] // `value` is undefined if (value === undefined) { @@ -513,6 +526,7 @@ function prepareForHashing(v: any): any { return v } +// eslint-disable-next-line @typescript-eslint/no-explicit-any function isPlainObject(v: any): boolean { if (typeof v !== 'object' || v === null) { return false diff --git a/src/lib/api/resolve.ts b/src/lib/api/resolve.ts index f75cd74db2..d411bd8204 100644 --- a/src/lib/api/resolve.ts +++ b/src/lib/api/resolve.ts @@ -2,11 +2,12 @@ import { type AppBskyFeedDefs, type AppBskyGraphDefs, type BskyAgent, + type ChatBskyGroupDefs, type ComAtprotoRepoStrongRef, } from '@atproto/api' import {AtUri} from '@atproto/api' -import {POST_IMG_MAX} from '#/lib/constants' +import {DM_SERVICE_HEADERS, POST_IMG_MAX} from '#/lib/constants' import {getLinkMeta, type LinkMeta} from '#/lib/link-meta/link-meta' import {resolveShortLink} from '#/lib/link-meta/resolve-short-link' import {downloadAndResize} from '#/lib/media/manip' @@ -16,6 +17,7 @@ import { } from '#/lib/strings/starter-pack' import { convertBskyAppUrlIfNeeded, + getChatInviteCodeFromUrl, isBskyCustomFeedUrl, isBskyListUrl, isBskyPostUrl, @@ -71,12 +73,20 @@ type ResolvedStarterPackRecord = { view: AppBskyGraphDefs.StarterPackView } +type ResolvedChatInvite = { + type: 'chat-invite' + uri: string + code: string + view?: ChatBskyGroupDefs.JoinLinkPreviewView +} + export type ResolvedLink = | ResolvedExternalLink | ResolvedPostRecord | ResolvedFeedRecord | ResolvedListRecord | ResolvedStarterPackRecord + | ResolvedChatInvite export class EmbeddingDisabledError extends Error { constructor() { @@ -141,6 +151,19 @@ export async function resolveLink( view: res.data.list, } } + const chatInviteCode = getChatInviteCodeFromUrl(uri) + if (chatInviteCode) { + const res = await agent.chat.bsky.group.getJoinLinkPreviews( + {codes: [chatInviteCode]}, + {headers: DM_SERVICE_HEADERS}, + ) + return { + type: 'chat-invite', + uri, + code: chatInviteCode, + view: res.data.joinLinkPreviews[0], + } + } if (isBskyStartUrl(uri) || isBskyStarterPackUrl(uri)) { const parsed = parseStarterPackUri(uri) if (!parsed) { diff --git a/src/lib/strings/url-helpers.ts b/src/lib/strings/url-helpers.ts index b5c278dacf..fd1a5ef7d9 100644 --- a/src/lib/strings/url-helpers.ts +++ b/src/lib/strings/url-helpers.ts @@ -1,5 +1,5 @@ import {AtUri} from '@atproto/api' -import psl from 'psl' +import {parse} from 'psl' import TLDs from 'tlds' import {BSKY_SERVICE} from '#/lib/constants' @@ -178,6 +178,7 @@ export function isBskyStarterPackUrl(url: string): boolean { return false } +// Invite codes are 7 alphanumeric characters long, supporting up to 10 here to future-proof. export const CHAT_INVITE_CODE_REGEX = /^\/c\/([a-zA-Z0-9]{7,10})$/ export function getChatInviteCodeFromUrl(url: string): string | undefined { @@ -328,7 +329,7 @@ export function isPossiblyAUrl(str: string): boolean { } export function splitApexDomain(hostname: string): [string, string] { - const hostnamep = psl.parse(hostname) + const hostnamep = parse(hostname) if (hostnamep.error || !hostnamep.listed || !hostnamep.domain) { return ['', hostname] } diff --git a/src/state/queries/join-links.ts b/src/state/queries/join-links.ts index 6aa10331ef..99a37b6b06 100644 --- a/src/state/queries/join-links.ts +++ b/src/state/queries/join-links.ts @@ -20,9 +20,11 @@ export const createJoinLinkPreviewQueryKey = (args: { export function useJoinLinkPreviewsQuery({ codes, hasSession, + staleTime = STALE.MINUTES.ONE, }: { codes?: string[] hasSession: boolean + staleTime?: number }) { const agent = useAgent() @@ -45,7 +47,7 @@ export function useJoinLinkPreviewsQuery({ } }, enabled: codes != null && codes.length > 0, - staleTime: STALE.SECONDS.FIFTEEN, + staleTime, }) } @@ -66,7 +68,7 @@ export function usePrefetchJoinLinkPreviews() { : await previewAgent.chat.bsky.group.getJoinLinkPreviews({codes}) return res.data }, - staleTime: STALE.SECONDS.FIFTEEN, + staleTime: STALE.MINUTES.ONE, }) } } diff --git a/src/view/com/composer/ExternalEmbed.tsx b/src/view/com/composer/ExternalEmbed.tsx index ecd22d7c39..5cc87c63f5 100644 --- a/src/view/com/composer/ExternalEmbed.tsx +++ b/src/view/com/composer/ExternalEmbed.tsx @@ -11,6 +11,7 @@ import {atoms as a, useTheme} from '#/alf' import {Loader} from '#/components/Loader' import {ExternalEmbed} from '#/components/Post/Embed/ExternalEmbed' import {ModeratedFeedEmbed} from '#/components/Post/Embed/FeedEmbed' +import {JoinRequestEmbed} from '#/components/Post/Embed/JoinRequestEmbed' import {ModeratedListEmbed} from '#/components/Post/Embed/ListEmbed' import {StandardSiteEmbed} from '#/components/Post/Embed/StandardSiteEmbed' import {isStandardSiteEmbed} from '#/components/Post/Embed/StandardSiteEmbed/utils' @@ -115,6 +116,8 @@ export const ExternalEmbedLink = ({ hideAlt /> ) + } else if (data.type === 'chat-invite') { + return } else if (data.kind === 'feed') { return ( void} & ViewStyleProp) { const t = useTheme() - const {_} = useLingui() + const {t: l} = useLingui() return (
- ) : ( - - )} + + ) } diff --git a/src/components/dms/ChatInvite/Card.tsx b/src/components/dms/ChatInvite/Card.tsx new file mode 100644 index 0000000000..518371325e --- /dev/null +++ b/src/components/dms/ChatInvite/Card.tsx @@ -0,0 +1,90 @@ +import {View} from 'react-native' +import {Plural, Trans} from '@lingui/react/macro' + +import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name' +import {sanitizeHandle} from '#/lib/strings/handles' +import {atoms as a, useTheme} from '#/alf' +import {AvatarBubbles} from '#/components/AvatarBubbles' +import {ProfileBadges} from '#/components/ProfileBadges' +import {Text} from '#/components/Typography' +import {useChatInvite} from './Context' + +/** + * Presentational preview of a chat invite: member avatars, group name, member + * count, and owner. Reads the preview from `ChatInvite.Root` context. Renders + * nothing if there's no preview (use a fallback alongside it for that case). + */ +export function Card({size}: {size: 'large' | 'small'}) { + const t = useTheme() + const {preview} = useChatInvite() + + if (!preview) return null + + const ownerDisplayName = createSanitizedDisplayName(preview.owner) + const ownerHandle = sanitizeHandle(preview.owner.handle, '@') + const avatarProfiles = preview.convo?.members ?? [preview.owner] + + return ( + + + + + {preview.name} + + + + Group chat + + + + {preview.memberCount}/{preview.memberLimit}{' '} + + + + + + + + By {ownerDisplayName} + + + + + {ownerHandle} + + + + + ) +} diff --git a/src/components/dms/ChatInvite/Context.tsx b/src/components/dms/ChatInvite/Context.tsx new file mode 100644 index 0000000000..53c7a6cc22 --- /dev/null +++ b/src/components/dms/ChatInvite/Context.tsx @@ -0,0 +1,47 @@ +import {createContext, useContext} from 'react' +import {type ChatBskyGroupDefs} from '@atproto/api' + +import {type ButtonColor} from '#/components/Button' +import {type Props as SVGIconProps} from '#/components/icons/common' + +/** + * The derived state of the join/open action for a chat invite, computed once in + * `Root` and consumed by `JoinButton` (or any custom action UI). + */ +export type ChatInviteAction = { + label: string + accessibilityHint: string + icon: React.ComponentType + color: ButtonColor + /** + * Whether the action can be performed. False when the link is disabled, the + * chat is full, or the viewer doesn't meet the join rule. + */ + disabled: boolean + onPress: () => void + side: 'left' | 'right' +} + +export type ChatInviteContextValue = { + code: string + loading: boolean + error: boolean + preview: ChatBskyGroupDefs.JoinLinkPreviewView | undefined + /** + * The derived action descriptor. Undefined while loading or when there's no + * preview to act on. + */ + action: ChatInviteAction | undefined +} + +const ChatInviteContext = createContext(null) + +export function useChatInvite(): ChatInviteContextValue { + const ctx = useContext(ChatInviteContext) + if (!ctx) { + throw new Error('useChatInvite must be used within a ChatInvite.Root') + } + return ctx +} + +export const ChatInviteProvider = ChatInviteContext.Provider diff --git a/src/components/dms/ChatInvite/JoinButton.tsx b/src/components/dms/ChatInvite/JoinButton.tsx new file mode 100644 index 0000000000..0036391b0e --- /dev/null +++ b/src/components/dms/ChatInvite/JoinButton.tsx @@ -0,0 +1,42 @@ +import {type StyleProp, type ViewStyle} from 'react-native' + +import {atoms as a} from '#/alf' +import {Button, ButtonIcon, ButtonText} from '#/components/Button' +import {useChatInvite} from './Context' + +/** + * The join/open action button for a chat invite. Reads the derived action from + * `ChatInvite.Root` context. Pass `onPress` to intercept (e.g. to close a + * surface before navigating); it runs before the default action. Renders + * nothing while loading or when there's no preview to act on. + */ +export function JoinButton({ + onPress, + style, +}: { + onPress?: () => void + style?: StyleProp +}) { + const {action} = useChatInvite() + + if (!action) return null + + return ( + + ) +} diff --git a/src/components/dms/ChatInvite/Root.tsx b/src/components/dms/ChatInvite/Root.tsx new file mode 100644 index 0000000000..a9f2c54e3a --- /dev/null +++ b/src/components/dms/ChatInvite/Root.tsx @@ -0,0 +1,144 @@ +import {setStringAsync} from 'expo-clipboard' +import {type ChatBskyGroupDefs} from '@atproto/api' +import {useLingui} from '@lingui/react/macro' +import {useNavigation} from '@react-navigation/native' + +import {type NavigationProp} from '#/lib/routes/types' +import {useJoinLinkPreviewsQuery} from '#/state/queries/join-links' +import {useSession} from '#/state/session' +import {type ButtonColor} from '#/components/Button' +import {ArrowRight_Stroke2_Corner0_Rounded as ArrowRightIcon} from '#/components/icons/Arrow' +import {ArrowBoxRight_Stroke2_Corner3_Rounded as JoinIcon} from '#/components/icons/ArrowBoxRight' +import {ChainLink_Stroke2_Corner0_Rounded as LinkIcon} from '#/components/icons/ChainLink' +import {CheckThick_Stroke2_Corner0_Rounded as CheckIcon} from '#/components/icons/Check' +import {type Props as SVGIconProps} from '#/components/icons/common' +import {RaisingHand4Finger_Stroke2_Corner2_Rounded as HandIcon} from '#/components/icons/RaisingHand' +import {Warning_Stroke2_Corner0_Rounded as WarningIcon} from '#/components/icons/Warning' +import {useIntentDialogs} from '#/components/intents/IntentDialogs' +import * as Toast from '#/components/Toast' +import {type ChatInviteAction, ChatInviteProvider} from './Context' + +/** + * Headless data + state owner for a chat invite. Fetches the join link preview + * by code and derives the join/open action, exposing both via context for the + * composable parts (`Card`, `JoinButton`) or any custom UI to consume. + * + * Pass `initialPreview` when the preview is already known (e.g. a DM message + * embed already carries the resolved view) to avoid a loading flash. + */ +export function Root({ + code, + initialPreview, + currentConvoId, + children, +}: { + code: string + initialPreview?: ChatBskyGroupDefs.JoinLinkPreviewView + /** + * The convo this invite is being viewed within, if any. When the invite + * links to the same chat, the action becomes "Copy link" instead of + * open/join (you're already here). + */ + currentConvoId?: string + children: React.ReactNode +}) { + const {hasSession} = useSession() + const {t: l} = useLingui() + const navigation = useNavigation() + const {groupChatJoinDialogControl, setGroupChatJoinState} = useIntentDialogs() + + const {data, error, isPending} = useJoinLinkPreviewsQuery({ + codes: [code], + hasSession, + // Seed the cache with the already-resolved preview so we don't refetch. + initialData: initialPreview + ? {joinLinkPreviews: [initialPreview]} + : undefined, + }) + + const preview = data?.joinLinkPreviews[0] + const loading = isPending && !preview + + let action: ChatInviteAction | undefined + if (preview) { + const convoId = preview.convo?.id + const isFollowing = preview.owner.viewer?.following ?? false + const hasRequested = !convoId && preview.viewer?.requestedAt != null + + if (convoId && convoId === currentConvoId) { + // You're already in the chat this invite links to - offer to copy the + // link rather than open/join. + action = { + label: l`Copy link`, + accessibilityHint: l`Tap to copy this invite link`, + icon: LinkIcon, + side: 'left', + color: 'primary', + disabled: false, + onPress: () => { + void setStringAsync(`https://bsky.app/c/${preview.code}`) + Toast.show(l`Copied to clipboard`, {type: 'success'}) + }, + } + } else if (convoId) { + action = { + label: l`Open chat`, + accessibilityHint: l`Tap to open this group chat`, + icon: ArrowRightIcon, + side: 'right', + color: 'primary', + disabled: false, + onPress: () => { + navigation.push('MessagesConversation', {conversation: convoId}) + }, + } + } else { + let canJoin = true + let icon: React.ComponentType = JoinIcon + let label = preview.requireApproval ? l`Request to join` : l`Join` + let color: ButtonColor = 'primary' + if (preview.enabledStatus !== 'enabled') { + canJoin = false + icon = WarningIcon + label = l`Chat invite link no longer available` + color = 'secondary' + } else if (preview.memberCount >= preview.memberLimit) { + canJoin = false + icon = HandIcon + label = l`This chat is full` + color = 'secondary' + } else if (preview.joinRule === 'followedByOwner' && !isFollowing) { + canJoin = false + icon = HandIcon + label = l`Only people the chat owner follows can join` + color = 'secondary' + } else if (hasRequested) { + icon = CheckIcon + label = l`Requested` + color = 'secondary' + } + + action = { + label, + side: 'left', + accessibilityHint: preview.requireApproval + ? l`Tap to request access to join this group chat` + : l`Tap to join this group chat immediately`, + icon, + color, + disabled: !canJoin, + onPress: () => { + setGroupChatJoinState({code: preview.code}) + groupChatJoinDialogControl.open() + }, + } + } + } + + return ( + + {children} + + ) +} diff --git a/src/components/dms/ChatInvite/index.tsx b/src/components/dms/ChatInvite/index.tsx new file mode 100644 index 0000000000..bcea3f7651 --- /dev/null +++ b/src/components/dms/ChatInvite/index.tsx @@ -0,0 +1,8 @@ +export {Card} from './Card' +export { + type ChatInviteAction, + type ChatInviteContextValue, + useChatInvite, +} from './Context' +export {JoinButton} from './JoinButton' +export {Root} from './Root' diff --git a/src/components/dms/MessageItem.tsx b/src/components/dms/MessageItem.tsx index ac6acb5891..f4f3cdacc3 100644 --- a/src/components/dms/MessageItem.tsx +++ b/src/components/dms/MessageItem.tsx @@ -20,6 +20,7 @@ import { AppBskyEmbedRecord, type ChatBskyActorDefs, ChatBskyConvoDefs, + ChatBskyEmbedJoinLink, RichText as RichTextAPI, } from '@atproto/api' import {plural} from '@lingui/core/macro' @@ -49,6 +50,7 @@ import {RichText} from '#/components/RichText' import {Text} from '#/components/Typography' import {DateDivider} from './DateDivider' import {MessageItemEmbed} from './MessageItemEmbed' +import {MessageItemInviteEmbed} from './MessageItemInviteEmbed' import {groupReactions} from './ReactionsDialog' import {CLUSTERED_MESSAGE_THRESHOLD_MS, MESSAGE_GAP_THRESHOLD_MS} from './util' @@ -185,8 +187,10 @@ let MessageItem = ({ const rt = new RichTextAPI({text: message.text, facets: message.facets}) - const hasEmbedAndText = - AppBskyEmbedRecord.isView(message.embed) && rt.text.length > 0 + const hasEmbed = + AppBskyEmbedRecord.isView(message.embed) || + ChatBskyEmbedJoinLink.isView(message.embed) + const hasEmbedAndText = hasEmbed && rt.text.length > 0 const targetBottomRadius = squaredBottomCorner ? SQUARED_BORDER_RADIUS @@ -427,6 +431,15 @@ let MessageItem = ({ squaredTopCorner={squaredTopCorner} /> )} + {ChatBskyEmbedJoinLink.isView(message.embed) && ( + + )} {rt.text.length > 0 && ( + isFromSelf: boolean + isGroupChat: boolean + squaredTopCorner: boolean + squaredBottomCorner: boolean +}): React.ReactNode => { + const t = useTheme() + const screen = useWindowDimensions() + const convo = useConvoActive() + + return ( + + + + + + + + + + + ) +} +MessageItemInviteEmbed = memo(MessageItemInviteEmbed) +export {MessageItemInviteEmbed} diff --git a/src/screens/Messages/components/MessageComposer.tsx b/src/screens/Messages/components/MessageComposer.tsx index 0aa132e232..c6899fb9d0 100644 --- a/src/screens/Messages/components/MessageComposer.tsx +++ b/src/screens/Messages/components/MessageComposer.tsx @@ -20,7 +20,7 @@ import {countGraphemes} from 'unicode-segmenter/grapheme' import {HITSLOP_10, MAX_DM_GRAPHEME_LENGTH} from '#/lib/constants' import {useHaptics} from '#/lib/haptics' import {useNonReactiveCallback} from '#/lib/hooks/useNonReactiveCallback' -import {isBskyPostUrl} from '#/lib/strings/url-helpers' +import {isBskyChatInviteUrl, isBskyPostUrl} from '#/lib/strings/url-helpers' import {useEmail} from '#/state/email-verification' import { useMessageDraft, @@ -233,7 +233,11 @@ export function MessageComposer({ }} onChange={handleChange} onFacetCommitted={facet => { - if (facet.type === 'url' && isBskyPostUrl(facet.value)) { + if ( + facet.type === 'url' && + (isBskyPostUrl(facet.value) || + isBskyChatInviteUrl(facet.value)) + ) { setEmbed(facet.value) } }} diff --git a/src/screens/Messages/components/MessageInputEmbed.tsx b/src/screens/Messages/components/MessageInputEmbed.tsx index 5bc2f38a05..a73a6564fb 100644 --- a/src/screens/Messages/components/MessageInputEmbed.tsx +++ b/src/screens/Messages/components/MessageInputEmbed.tsx @@ -18,6 +18,8 @@ import { } from '#/lib/routes/types' import { convertBskyAppUrlIfNeeded, + getChatInviteCodeFromUrl, + isBskyChatInviteUrl, isBskyPostUrl, makeRecordUri, } from '#/lib/strings/url-helpers' @@ -26,6 +28,7 @@ import {usePostQuery} from '#/state/queries/post' import {PostMeta} from '#/view/com/util/PostMeta' import {atoms as a, useTheme} from '#/alf' import {Button} from '#/components/Button' +import * as ChatInvite from '#/components/dms/ChatInvite' import {TimesLarge_Stroke2_Corner0_Rounded as XIcon} from '#/components/icons/Times' import {Loader} from '#/components/Loader' import * as MediaPreview from '#/components/MediaPreview' @@ -35,35 +38,56 @@ import {RichText} from '#/components/RichText' import {Text} from '#/components/Typography' import * as bsky from '#/types/bsky' +/** + * The embed staged in the message composer. A message can carry at most one + * embed: either a quoted post or a group chat invite link. + */ +export type MessageEmbedState = + | {type: 'post'; uri: string} + | {type: 'invite'; code: string} + export function useMessageEmbed() { const route = useRoute>() const navigation = useNavigation() const embedFromParams = route.params.embed - const [embedUri, setEmbedUri] = useState(embedFromParams) + const [embed, setEmbedState] = useState( + embedFromParams ? {type: 'post', uri: embedFromParams} : undefined, + ) - if (embedFromParams && embedUri !== embedFromParams) { - setEmbedUri(embedFromParams) + if (embedFromParams && embed?.type !== 'post') { + setEmbedState({type: 'post', uri: embedFromParams}) } return { - embedUri, + embed, setEmbed: useCallback( (embedUrl: string | undefined) => { if (!embedUrl) { + // Only the post embed is reflected in the route param (used by the + // share-to-DM intent flow); invites are local-only. navigation.setParams({embed: ''}) - setEmbedUri(undefined) + setEmbedState(undefined) return } if (embedFromParams) return - const url = convertBskyAppUrlIfNeeded(embedUrl) - const [_0, user, _1, rkey] = url.split('/').filter(Boolean) - const uri = makeRecordUri(user, 'app.bsky.feed.post', rkey) + if (isBskyChatInviteUrl(embedUrl)) { + const code = getChatInviteCodeFromUrl(embedUrl) + if (code) { + setEmbedState({type: 'invite', code}) + } + return + } - setEmbedUri(uri) + if (isBskyPostUrl(embedUrl)) { + const url = convertBskyAppUrlIfNeeded(embedUrl) + const [_0, user, _1, rkey] = url.split('/').filter(Boolean) + const uri = makeRecordUri(user, 'app.bsky.feed.post', rkey) + setEmbedState({type: 'post', uri}) + } }, [embedFromParams, navigation], ), @@ -81,7 +105,10 @@ export function useExtractEmbedFromFacets( for (const facet of rt.facets ?? []) { for (const feature of facet.features) { - if (AppBskyRichtextFacet.isLink(feature) && isBskyPostUrl(feature.uri)) { + if ( + AppBskyRichtextFacet.isLink(feature) && + (isBskyPostUrl(feature.uri) || isBskyChatInviteUrl(feature.uri)) + ) { uriFromFacet = feature.uri break } @@ -96,16 +123,40 @@ export function useExtractEmbedFromFacets( } export function MessageInputEmbed({ - embedUri, + embed, setEmbed, }: { - embedUri: string | undefined + embed: MessageEmbedState | undefined setEmbed: (embedUrl: string | undefined) => void +}) { + const onRemove = useCallback(() => { + LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut) + setEmbed(undefined) + }, [setEmbed]) + + if (!embed) { + return null + } + + switch (embed.type) { + case 'post': + return + case 'invite': + return + } +} + +function MessageInputPostEmbed({ + uri, + onRemove, +}: { + uri: string + onRemove: () => void }) { const t = useTheme() const {t: l} = useLingui() - const {data: post, status} = usePostQuery(embedUri) + const {data: post, status} = usePostQuery(uri) const moderationOpts = useModerationOpts() const moderation = useMemo( @@ -134,15 +185,6 @@ export function MessageInputEmbed({ return {rt: undefined, record: undefined} }, [post]) - if (!embedUri) { - return null - } - - const onRemove = () => { - LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut) - setEmbed(undefined) - } - switch (status) { case 'pending': { return ( @@ -220,6 +262,71 @@ export function MessageInputEmbed({ } } +function MessageInputInviteEmbed({ + code, + onRemove, +}: { + code: string + onRemove: () => void +}) { + const t = useTheme() + const {t: l} = useLingui() + + return ( + + + + + + + ) +} + +function MessageInputInviteEmbedBody() { + const t = useTheme() + const {loading, preview} = ChatInvite.useChatInvite() + + if (loading) { + return ( + + + + ) + } + + if (!preview) { + return ( + + + Could not load invite + + + ) + } + + return +} + function SimpleContainer({ children, onRemove, diff --git a/src/screens/Messages/components/MessagesList.tsx b/src/screens/Messages/components/MessagesList.tsx index fbebdc0745..6f56c6a898 100644 --- a/src/screens/Messages/components/MessagesList.tsx +++ b/src/screens/Messages/components/MessagesList.tsx @@ -28,6 +28,7 @@ import { type AppBskyEmbedRecord, AppBskyRichtextFacet, ChatBskyConvoDefs, + type ChatBskyEmbedJoinLink, RichText, } from '@atproto/api' import {useScrollEdgeEffectRef} from '@bsky.app/expo-scroll-edge-effect' @@ -37,6 +38,7 @@ import {ScrollProvider} from '#/lib/ScrollContext' import {shortenLinks, stripInvalidMentions} from '#/lib/strings/rich-text-manip' import { convertBskyAppUrlIfNeeded, + getChatInviteCodeFromUrl, isBskyPostUrl, } from '#/lib/strings/url-helpers' import {logger} from '#/logger' @@ -46,9 +48,10 @@ import { useConvoActive, } from '#/state/messages/convo' import {type ConvoState, ConvoStatus} from '#/state/messages/convo/types' +import {useGetJoinLinkPreview} from '#/state/queries/join-links' import {useGetPost} from '#/state/queries/post' import {createEmbedViewRecordFromPost} from '#/state/queries/postgate/util' -import {useAgent} from '#/state/session' +import {useAgent, useSession} from '#/state/session' import {List, type ListMethods} from '#/view/com/util/List' import {MessageComposer} from '#/screens/Messages/components/MessageComposer' import {MessageInput} from '#/screens/Messages/components/MessageInput' @@ -131,8 +134,10 @@ export function MessagesList({ const ax = useAnalytics() const convoState = useConvoActive() const agent = useAgent() + const {hasSession} = useSession() const getPost = useGetPost() - const {embedUri, setEmbed} = useMessageEmbed() + const getJoinLinkPreview = useGetJoinLinkPreview() + const {embed: messageEmbed, setEmbed} = useMessageEmbed() const t = useTheme() const textInputId = 'chat-input-' + useId() @@ -348,12 +353,38 @@ export function MessagesList({ // we want to remove the post link from the text, re-trim, then detect facets rt.detectFacetsWithoutResolution() - let embed: $Typed | undefined - let embedView: $Typed | undefined + let embed: + | $Typed + | $Typed + | undefined + let embedView: + | $Typed + | $Typed + | undefined - if (embedUri) { + // Find the embedded link facet and, if it's at the start or end of the + // message, remove it from the text (the embed card replaces it). + const stripLinkFacet = (predicate: (uri: string) => boolean) => { + const linkFacet = rt.facets?.find(facet => + facet.features.find( + feature => + AppBskyRichtextFacet.isLink(feature) && predicate(feature.uri), + ), + ) + if (linkFacet) { + const isAtStart = linkFacet.index.byteStart === 0 + const isAtEnd = + linkFacet.index.byteEnd === rt.unicodeText.graphemeLength + if (isAtStart || isAtEnd) { + rt.delete(linkFacet.index.byteStart, linkFacet.index.byteEnd) + } + rt = new RichText({text: rt.text.trim()}, {cleanNewlines: true}) + } + } + + if (messageEmbed?.type === 'post') { try { - const post = await getPost({uri: embedUri}) + const post = await getPost({uri: messageEmbed.uri}) if (post) { embed = { $type: 'app.bsky.embed.record', @@ -368,42 +399,34 @@ export function MessagesList({ record: createEmbedViewRecordFromPost(post), } - // look for the embed uri in the facets, so we can remove it from the text - const postLinkFacet = rt.facets?.find(facet => { - return facet.features.find(feature => { - if (AppBskyRichtextFacet.isLink(feature)) { - if (isBskyPostUrl(feature.uri)) { - const url = convertBskyAppUrlIfNeeded(feature.uri) - const [_0, _1, _2, rkey] = url.split('/').filter(Boolean) - - // this might have a handle instead of a DID - // so just compare the rkey - not particularly dangerous - return post.uri.endsWith(rkey) - } - } - return false - }) + stripLinkFacet(uri => { + if (!isBskyPostUrl(uri)) return false + const url = convertBskyAppUrlIfNeeded(uri) + const [_0, _1, _2, rkey] = url.split('/').filter(Boolean) + // this might have a handle instead of a DID + // so just compare the rkey - not particularly dangerous + return post.uri.endsWith(rkey) }) - - if (postLinkFacet) { - const isAtStart = postLinkFacet.index.byteStart === 0 - const isAtEnd = - postLinkFacet.index.byteEnd === rt.unicodeText.graphemeLength - - // remove the post link from the text - if (isAtStart || isAtEnd) { - rt.delete( - postLinkFacet.index.byteStart, - postLinkFacet.index.byteEnd, - ) - } - - rt = new RichText({text: rt.text.trim()}, {cleanNewlines: true}) - } } } catch (error) { logger.error('Failed to get post as quote for DM', {error}) } + } else if (messageEmbed?.type === 'invite') { + const code = messageEmbed.code + embed = { + $type: 'chat.bsky.embed.joinLink', + code, + } + + const joinLinkPreview = await getJoinLinkPreview({code, hasSession}) + if (joinLinkPreview) { + embedView = { + $type: 'chat.bsky.embed.joinLink#view', + joinLinkPreview, + } + } + + stripLinkFacet(uri => getChatInviteCodeFromUrl(uri) === code) } await rt.detectFacets(agent) @@ -424,7 +447,16 @@ export function MessagesList({ embedView, ) }, - [agent, convoState, embedUri, getPost, hasScrolled, setHasScrolled], + [ + agent, + convoState, + messageEmbed, + getPost, + getJoinLinkPreview, + hasSession, + hasScrolled, + setHasScrolled, + ], ) const scrollToEndOnPress = useCallback(() => { @@ -595,11 +627,11 @@ export function MessagesList({ onSendMessage={(message: string) => void onSendMessage(message) } - hasEmbed={!!embedUri} + hasEmbed={!!messageEmbed} setEmbed={setEmbed} loading={loading}> @@ -607,11 +639,11 @@ export function MessagesList({ diff --git a/src/state/messages/convo/agent.ts b/src/state/messages/convo/agent.ts index 08b609f71a..e89965eb45 100644 --- a/src/state/messages/convo/agent.ts +++ b/src/state/messages/convo/agent.ts @@ -6,6 +6,7 @@ import { ChatBskyConvoDefs, type ChatBskyConvoGetLog, type ChatBskyConvoSendMessage, + type ChatBskyEmbedJoinLink, type ChatBskyGroupDefs, } from '@atproto/api' import {XRPCError} from '@atproto/api' @@ -109,7 +110,9 @@ export class Convo { { id: string message: ChatBskyConvoSendMessage.InputSchema['message'] - optimisticEmbedView?: $Typed + optimisticEmbedView?: + | $Typed + | $Typed } > = new Map() private deletedMessages: Set = new Set() @@ -942,7 +945,9 @@ export class Convo { sendMessage( message: ChatBskyConvoSendMessage.InputSchema['message'], - optimisticEmbedView?: $Typed, + optimisticEmbedView?: + | $Typed + | $Typed, ) { // Ignore empty messages for now since they have no other purpose atm if (!message.text.trim() && !message.embed) return diff --git a/src/state/messages/convo/types.ts b/src/state/messages/convo/types.ts index 51d111356a..269f32c515 100644 --- a/src/state/messages/convo/types.ts +++ b/src/state/messages/convo/types.ts @@ -5,6 +5,7 @@ import { type ChatBskyActorDefs, type ChatBskyConvoDefs, type ChatBskyConvoSendMessage, + type ChatBskyEmbedJoinLink, } from '@atproto/api' import {type MessagesEventBus} from '#/state/messages/events/agent' @@ -108,7 +109,10 @@ export type ConvoItem = type DeleteMessage = (messageId: string) => Promise type SendMessage = ( message: ChatBskyConvoSendMessage.InputSchema['message'], - optimisticEmbedView: $Typed | undefined, + optimisticEmbedView: + | $Typed + | $Typed + | undefined, ) => void type FetchMessageHistory = () => Promise type MarkConvoAccepted = () => void diff --git a/src/state/queries/join-links.ts b/src/state/queries/join-links.ts index 99a37b6b06..df87ec0a24 100644 --- a/src/state/queries/join-links.ts +++ b/src/state/queries/join-links.ts @@ -1,4 +1,9 @@ -import {AtpAgent} from '@atproto/api' +import {useCallback} from 'react' +import { + AtpAgent, + type ChatBskyGroupDefs, + type ChatBskyGroupGetJoinLinkPreviews, +} from '@atproto/api' import {useQuery, useQueryClient} from '@tanstack/react-query' import {CHAT_SERVICE, DM_SERVICE_HEADERS} from '#/lib/constants' @@ -17,14 +22,39 @@ export const createJoinLinkPreviewQueryKey = (args: { persistedVersion: 1, }) +async function fetchJoinLinkPreviews({ + agent, + codes, + hasSession, +}: { + agent: AtpAgent + codes: string[] + hasSession: boolean +}) { + const previewAgent = new AtpAgent({service: CHAT_SERVICE}) + const res = hasSession + ? await agent.chat.bsky.group.getJoinLinkPreviews( + {codes}, + {headers: DM_SERVICE_HEADERS}, + ) + : await previewAgent.chat.bsky.group.getJoinLinkPreviews({codes}) + return res.data +} + export function useJoinLinkPreviewsQuery({ codes, hasSession, staleTime = STALE.MINUTES.ONE, + initialData, }: { codes?: string[] hasSession: boolean staleTime?: number + /** + * Seed the query with an already-known preview (e.g. a DM message embed + * already carries the resolved view), avoiding a duplicate fetch. + */ + initialData?: ChatBskyGroupGetJoinLinkPreviews.OutputSchema }) { const agent = useAgent() @@ -33,14 +63,7 @@ export function useJoinLinkPreviewsQuery({ queryFn: async () => { if (!codes) throw new Error('No invite code') try { - const previewAgent = new AtpAgent({service: CHAT_SERVICE}) - const res = hasSession - ? await agent.chat.bsky.group.getJoinLinkPreviews( - {codes}, - {headers: DM_SERVICE_HEADERS}, - ) - : await previewAgent.chat.bsky.group.getJoinLinkPreviews({codes}) - return res.data + return await fetchJoinLinkPreviews({agent, codes, hasSession}) } catch (error) { logger.error('Failed to fetch join link preview', {safeMessage: error}) throw error @@ -48,6 +71,7 @@ export function useJoinLinkPreviewsQuery({ }, enabled: codes != null && codes.length > 0, staleTime, + initialData, }) } @@ -58,17 +82,42 @@ export function usePrefetchJoinLinkPreviews() { return ({codes, hasSession}: {codes: string[]; hasSession: boolean}) => { return queryClient.prefetchQuery({ queryKey: createJoinLinkPreviewQueryKey({codes, hasSession}), - queryFn: async () => { - const previewAgent = new AtpAgent({service: CHAT_SERVICE}) - const res = hasSession - ? await agent.chat.bsky.group.getJoinLinkPreviews( - {codes}, - {headers: DM_SERVICE_HEADERS}, - ) - : await previewAgent.chat.bsky.group.getJoinLinkPreviews({codes}) - return res.data - }, + queryFn: () => fetchJoinLinkPreviews({agent, codes, hasSession}), staleTime: STALE.MINUTES.ONE, }) } } + +/** + * Imperatively fetch (or read from cache) a single join link preview by code. + * Used when sending a DM invite embed so we can build an optimistic view. + * Returns undefined if the preview can't be resolved. + */ +export function useGetJoinLinkPreview() { + const agent = useAgent() + const queryClient = useQueryClient() + + return useCallback( + async ({ + code, + hasSession, + }: { + code: string + hasSession: boolean + }): Promise => { + try { + const data = await queryClient.fetchQuery({ + queryKey: createJoinLinkPreviewQueryKey({codes: [code], hasSession}), + queryFn: () => + fetchJoinLinkPreviews({agent, codes: [code], hasSession}), + staleTime: STALE.MINUTES.ONE, + }) + return data.joinLinkPreviews[0] + } catch (error) { + logger.error('Failed to fetch join link preview', {safeMessage: error}) + return undefined + } + }, + [agent, queryClient], + ) +} diff --git a/src/view/com/composer/ExternalEmbed.tsx b/src/view/com/composer/ExternalEmbed.tsx index 5cc87c63f5..0b14f16ed3 100644 --- a/src/view/com/composer/ExternalEmbed.tsx +++ b/src/view/com/composer/ExternalEmbed.tsx @@ -117,7 +117,7 @@ export const ExternalEmbedLink = ({ /> ) } else if (data.type === 'chat-invite') { - return + return } else if (data.kind === 'feed') { return ( Date: Thu, 4 Jun 2026 15:56:37 -0500 Subject: [PATCH 062/149] V smol log cleanups (#10731) --- eslint-suppressions.json | 3 -- src/analytics/PassiveAnalytics.tsx | 28 +++++++++---------- src/analytics/metrics/client.ts | 4 --- .../Post/Embed/StandardSiteEmbed/index.tsx | 4 ++- .../additional-moderation-authorities.ts | 8 ------ src/view/shell/desktop/LeftNav.tsx | 1 + 6 files changed, 17 insertions(+), 31 deletions(-) diff --git a/eslint-suppressions.json b/eslint-suppressions.json index 483ed83e7d..b8e65eb265 100644 --- a/eslint-suppressions.json +++ b/eslint-suppressions.json @@ -43,9 +43,6 @@ } }, "src/analytics/PassiveAnalytics.tsx": { - "@typescript-eslint/no-explicit-any": { - "count": 1 - }, "react-hooks/purity": { "count": 1 } diff --git a/src/analytics/PassiveAnalytics.tsx b/src/analytics/PassiveAnalytics.tsx index 34b5f2d275..c772ed09b8 100644 --- a/src/analytics/PassiveAnalytics.tsx +++ b/src/analytics/PassiveAnalytics.tsx @@ -2,8 +2,6 @@ import {useEffect, useRef} from 'react' import {getCurrentState, onAppStateChange} from '#/lib/appState' import {useAnalytics} from '#/analytics' -import {Features, features} from '#/analytics/features' -import {IS_DEV, IS_TESTFLIGHT} from '#/env' /** * Tracks passive analytics like app foreground/background time. @@ -27,19 +25,19 @@ export function PassiveAnalytics() { }) } - if (IS_DEV || IS_TESTFLIGHT) { - const feats = Object.values(Features).reduce( - (acc, feat) => { - acc[feat] = features.evalFeature(feat) - return acc - }, - {} as Record, - ) - ax.logger.info('FEATURES', { - features: feats, - definitions: features.getFeatures(), - }) - } + // if (IS_DEV || IS_TESTFLIGHT) { + // const feats = Object.values(Features).reduce( + // (acc, feat) => { + // acc[feat] = features.evalFeature(feat) + // return acc + // }, + // {} as Record, + // ) + // ax.logger.info('FEATURES', { + // features: feats, + // definitions: features.getFeatures(), + // }) + // } }) return () => sub.remove() }, [ax]) diff --git a/src/analytics/metrics/client.ts b/src/analytics/metrics/client.ts index 2aab90f265..1ea0573dcd 100644 --- a/src/analytics/metrics/client.ts +++ b/src/analytics/metrics/client.ts @@ -67,10 +67,6 @@ export class MetricsClient> { } private async sendBatch(events: Event[], isRetry: boolean = false) { - logger.debug(`sendBatch: ${events.length}`, { - isRetry, - }) - try { const body = JSON.stringify({events}) if (env.IS_WEB && 'navigator' in globalThis && navigator.sendBeacon) { diff --git a/src/components/Post/Embed/StandardSiteEmbed/index.tsx b/src/components/Post/Embed/StandardSiteEmbed/index.tsx index 5f7fc1f5e7..c7b8abf88c 100644 --- a/src/components/Post/Embed/StandardSiteEmbed/index.tsx +++ b/src/components/Post/Embed/StandardSiteEmbed/index.tsx @@ -356,6 +356,7 @@ export function PublicationCard({ /> {view.description && ( - + {view.description} @@ -617,6 +618,7 @@ export function PublicationFooter({ /> {sanitizeDisplayName( From 45bd5b45e876e8ebd61b846ad886c7e93e9300dd Mon Sep 17 00:00:00 2001 From: DS Boyce <260543580+ds-boyce@users.noreply.github.com> Date: Thu, 4 Jun 2026 14:11:50 -0700 Subject: [PATCH 063/149] Reduce stale time for join link preview queries (#10733) --- src/state/queries/join-links.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/state/queries/join-links.ts b/src/state/queries/join-links.ts index df87ec0a24..628f5e9102 100644 --- a/src/state/queries/join-links.ts +++ b/src/state/queries/join-links.ts @@ -83,7 +83,7 @@ export function usePrefetchJoinLinkPreviews() { return queryClient.prefetchQuery({ queryKey: createJoinLinkPreviewQueryKey({codes, hasSession}), queryFn: () => fetchJoinLinkPreviews({agent, codes, hasSession}), - staleTime: STALE.MINUTES.ONE, + staleTime: STALE.SECONDS.FIFTEEN, }) } } @@ -110,7 +110,7 @@ export function useGetJoinLinkPreview() { queryKey: createJoinLinkPreviewQueryKey({codes: [code], hasSession}), queryFn: () => fetchJoinLinkPreviews({agent, codes: [code], hasSession}), - staleTime: STALE.MINUTES.ONE, + staleTime: STALE.SECONDS.FIFTEEN, }) return data.joinLinkPreviews[0] } catch (error) { From de926d1838185ce08a6fbad5b6e9edb71dc02314 Mon Sep 17 00:00:00 2001 From: DS Boyce <260543580+ds-boyce@users.noreply.github.com> Date: Thu, 4 Jun 2026 14:22:29 -0700 Subject: [PATCH 064/149] Show a banner when there are incoming chat requests (#10498) Co-authored-by: Samuel Newman --- src/screens/Messages/Conversation.tsx | 29 +++++- .../Messages/components/ChatListItem.tsx | 32 +++++-- .../Messages/components/RequestStatus.tsx | 92 +++++++++++++++++++ .../queries/messages/list-join-requests.ts | 4 +- .../messages/mark-join-request-read.ts | 85 +++++++++++++++++ 5 files changed, 231 insertions(+), 11 deletions(-) create mode 100644 src/screens/Messages/components/RequestStatus.tsx create mode 100644 src/state/queries/messages/mark-join-request-read.ts diff --git a/src/screens/Messages/Conversation.tsx b/src/screens/Messages/Conversation.tsx index 6233c467ff..b269046534 100644 --- a/src/screens/Messages/Conversation.tsx +++ b/src/screens/Messages/Conversation.tsx @@ -1,7 +1,7 @@ import {useCallback, useEffect, useMemo, useRef, useState} from 'react' import {type LayoutChangeEvent, View} from 'react-native' import {useSafeAreaInsets} from 'react-native-safe-area-context' -import {moderateProfile} from '@atproto/api' +import {ChatBskyConvoDefs, moderateProfile} from '@atproto/api' import { ScrollEdgeEffect, ScrollEdgeEffectProvider, @@ -29,6 +29,7 @@ import {ConvoStatus} from '#/state/messages/convo/types' import {useCurrentConvoId} from '#/state/messages/current-convo-id' import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useConvoQuery} from '#/state/queries/messages/conversation' +import {useMarkJoinRequestsRead} from '#/state/queries/messages/mark-join-request-read' import {useSession} from '#/state/session' import {MessagesList} from '#/screens/Messages/components/MessagesList' import {atoms as a, web} from '#/alf' @@ -51,6 +52,7 @@ import {IS_INTERNAL, IS_LIQUID_GLASS} from '#/env' import {ChatDisabled} from './components/ChatDisabled' import {ChatEnded} from './components/ChatEnded' import {ChatLocked} from './components/ChatLocked' +import {RequestStatus} from './components/RequestStatus' type Props = NativeStackScreenProps< CommonNavigatorParams, @@ -180,6 +182,12 @@ function InnerReady({ const {needsEmailVerification} = useEmail() const emailDialogControl = useEmailDialogControl() + const unreadRequestCount = + convo?.kind === 'group' && ChatBskyConvoDefs.isGroupConvo(convo.view.kind) + ? (convo.view.kind.unreadJoinRequestCount ?? 0) + : 0 + const {mutate: markJoinRequestsRead} = useMarkJoinRequestsRead(convo?.view.id) + /** * Must be non-reactive, otherwise the update to open the global dialog will * cause a re-render loop. @@ -264,8 +272,25 @@ function InnerReady({ {header} ) : ( - header + {header} )} + + {isActive && convo?.kind === 'group' && unreadRequestCount > 0 ? ( + { + markJoinRequestsRead() + }} + onPress={() => { + markJoinRequestsRead() + navigation.navigate('MessagesJoinRequests', { + conversation: convo.view.id, + }) + }} + /> + ) : null} + {isActive && ( 20 + requestInfo={ + convo.details.unreadJoinRequestCount + ? convo.details.unreadJoinRequestCount > JOIN_REQUESTS_THRESHOLD ? l({ - message: '20+ new join requests', + message: `${JOIN_REQUESTS_THRESHOLD}+ new join requests`, context: 'Displayed when there are more than 20 requests to join a group chat', }) - : plural(convo.details.joinRequestCount, { + : plural(convo.details.unreadJoinRequestCount, { one: '# new join request', other: '# new join requests', }) @@ -241,6 +242,7 @@ function BaseChatItem({ avatar, title, subtitle, + requestInfo, accessibilityHint, isDeletedAccount, isBlockedAccount, @@ -256,6 +258,7 @@ function BaseChatItem({ avatar: React.ReactNode title: string subtitle?: string + requestInfo?: string accessibilityHint: string isDeletedAccount: boolean isBlockedAccount: boolean @@ -280,8 +283,10 @@ function BaseChatItem({ const playHaptic = useHaptics() const queryClient = useQueryClient() const hasUnread = - convo.view.unreadCount > 0 && !isDeletedAccount && + (convo.view.unreadCount > 0 || + (convo.kind === 'group' && + (convo.details.unreadJoinRequestCount ?? 0) > 0)) && (convo.kind !== 'group' || convo.details.lockStatus === 'unlocked') const blockInfo = useMemo(() => { @@ -607,6 +612,19 @@ function BaseChatItem({ {postAlerts} + {requestInfo && ( + + {requestInfo} + + )} + {LastMessageIcon && ( diff --git a/src/screens/Messages/components/RequestStatus.tsx b/src/screens/Messages/components/RequestStatus.tsx new file mode 100644 index 0000000000..9b35b69445 --- /dev/null +++ b/src/screens/Messages/components/RequestStatus.tsx @@ -0,0 +1,92 @@ +import {Pressable} from 'react-native' +import Animated, {FadeIn, FadeOut} from 'react-native-reanimated' +import {plural} from '@lingui/core/macro' +import {useLingui} from '@lingui/react/macro' + +import {HITSLOP_10} from '#/lib/constants' +import {JOIN_REQUESTS_THRESHOLD} from '#/state/queries/messages/list-join-requests' +import {atoms as a, tokens, useTheme} from '#/alf' +import {GlassView} from '#/components/GlassView' +import {Envelope_Stroke2_Corner2_Rounded as EnvelopeIcon} from '#/components/icons/Envelope' +import {TimesLarge_Stroke2_Corner0_Rounded as CloseIcon} from '#/components/icons/Times' +import {Text} from '#/components/Typography' +import {IS_LIQUID_GLASS} from '#/env' + +export function RequestStatus({ + top, + count, + onDismiss, + onPress, +}: { + top: number + count: number + onDismiss: () => void + onPress: () => void +}) { + const t = useTheme() + const {t: l} = useLingui() + + return ( + + + + + + {count > JOIN_REQUESTS_THRESHOLD + ? l({ + message: `${JOIN_REQUESTS_THRESHOLD}+ new join requests`, + comment: + 'Displayed when the number of requests is greater than 20', + }) + : plural(count, { + one: '# new join request', + other: '# new join requests', + })} + + + + + + + + ) +} diff --git a/src/state/queries/messages/list-join-requests.ts b/src/state/queries/messages/list-join-requests.ts index 9f0860c20d..64a999c118 100644 --- a/src/state/queries/messages/list-join-requests.ts +++ b/src/state/queries/messages/list-join-requests.ts @@ -8,6 +8,8 @@ import {createQueryKey} from '#/state/queries/util' import {useAgent} from '#/state/session' import {STALE} from '..' +export const JOIN_REQUESTS_THRESHOLD = 20 + const listJoinRequestsQueryKeyRoot = 'list-join-requests' export const createListJoinRequestsQueryKey = (args: {convoId: string}) => @@ -53,7 +55,7 @@ export function useListJoinRequestsQuery({ queryKey: createListJoinRequestsQueryKey({convoId: convoId ?? ''}), queryFn: async ({pageParam}) => { const {data} = await agent.chat.bsky.group.listJoinRequests( - {convoId: convoId!, cursor: pageParam, limit: 20}, + {convoId: convoId!, cursor: pageParam, limit: JOIN_REQUESTS_THRESHOLD}, {headers: DM_SERVICE_HEADERS}, ) return data diff --git a/src/state/queries/messages/mark-join-request-read.ts b/src/state/queries/messages/mark-join-request-read.ts new file mode 100644 index 0000000000..ae6d7e88a7 --- /dev/null +++ b/src/state/queries/messages/mark-join-request-read.ts @@ -0,0 +1,85 @@ +import {ChatBskyConvoDefs} from '@atproto/api' +import {useMutation, useQueryClient} from '@tanstack/react-query' + +import {DM_SERVICE_HEADERS} from '#/lib/constants' +import {logger} from '#/logger' +import {useAgent} from '#/state/session' +import {RQKEY as CONVO_KEY} from './conversation' +import { + type ConvoListQueryData, + RQKEY_ROOT as CONVO_LIST_ROOT_KEY, +} from './list-conversations' + +export function useMarkJoinRequestsRead(convoId: string | undefined) { + const queryClient = useQueryClient() + const agent = useAgent() + + return useMutation({ + mutationFn: async () => { + if (!convoId) throw new Error('No convoId provided') + await agent.chat.bsky.group.updateJoinRequestsRead( + {convoId}, + {headers: DM_SERVICE_HEADERS, encoding: 'application/json'}, + ) + }, + onMutate: () => { + if (!convoId) return + + const prevConvo = queryClient.getQueryData( + CONVO_KEY(convoId), + ) + queryClient.setQueryData( + CONVO_KEY(convoId), + old => { + if (!old || !ChatBskyConvoDefs.isGroupConvo(old.kind)) return old + return { + ...old, + kind: {...old.kind, unreadJoinRequestCount: 0}, + } + }, + ) + + const prevListEntries = queryClient.getQueriesData({ + queryKey: [CONVO_LIST_ROOT_KEY], + }) + queryClient.setQueriesData( + {queryKey: [CONVO_LIST_ROOT_KEY]}, + old => { + if (!old) return old + return { + ...old, + pages: old.pages.map(page => ({ + ...page, + convos: page.convos.map(convo => { + if ( + convo.id !== convoId || + !ChatBskyConvoDefs.isGroupConvo(convo.kind) + ) { + return convo + } + return { + ...convo, + kind: {...convo.kind, unreadJoinRequestCount: 0}, + } + }), + })), + } + }, + ) + + return {prevConvo, prevListEntries} + }, + onError: (error, _, context) => { + logger.error('Failed to mark join requests as read', {safeMessage: error}) + if (!convoId) return + if (context?.prevConvo) { + queryClient.setQueryData(CONVO_KEY(convoId), context.prevConvo) + } + for (const [key, data] of context?.prevListEntries ?? []) { + queryClient.setQueryData(key, data) + } + void queryClient.invalidateQueries({queryKey: CONVO_KEY(convoId)}) + void queryClient.invalidateQueries({queryKey: [CONVO_LIST_ROOT_KEY]}) + }, + }) +} From 144ba30ea647f4d80a2e76b14a380f3eb0a02149 Mon Sep 17 00:00:00 2001 From: Spence Pope Date: Thu, 4 Jun 2026 17:22:40 -0400 Subject: [PATCH 065/149] Add gallery embed type support (display + compose) (#10707) --- package.json | 2 +- pnpm-lock.yaml | 10 +- src/components/MediaPreview.tsx | 34 +++- src/components/Post/Embed/ImageEmbed.tsx | 23 ++- src/components/Post/Embed/index.tsx | 4 +- .../Gallery/maybeApplyGalleryOffsetStyles.ts | 33 +++- src/components/images/ImageLayoutGrid.tsx | 22 ++- src/components/images/ImageLayoutGridItem.tsx | 3 + .../ReportDialog/utils/parseReportSubject.ts | 5 +- src/lib/api/index.ts | 31 ++++ src/types/bsky/post.ts | 10 ++ src/view/com/composer/Composer.tsx | 124 ++++++++++---- src/view/com/composer/ComposerReplyTo.tsx | 30 +++- src/view/com/composer/SelectMediaButton.tsx | 19 ++- src/view/com/composer/drafts/state/api.ts | 159 ++++++++++++------ src/view/com/composer/drafts/state/queries.ts | 23 ++- src/view/com/composer/photos/Gallery.tsx | 7 +- src/view/com/composer/state/composer.ts | 92 +++++++--- src/view/com/feeds/ComposerPrompt.tsx | 6 +- 19 files changed, 494 insertions(+), 143 deletions(-) diff --git a/package.json b/package.json index c515ecdcee..a879182d9f 100644 --- a/package.json +++ b/package.json @@ -93,7 +93,7 @@ "prettier": "prettier --check ." }, "dependencies": { - "@atproto/api": "0.20.8", + "@atproto/api": "0.20.9", "@atproto/syntax": "0.6.1", "@bitdrift/react-native": "^0.6.8", "@braintree/sanitize-url": "^6.0.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d0136363f7..0ac8974cf9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -242,8 +242,8 @@ importers: .: dependencies: '@atproto/api': - specifier: 0.20.8 - version: 0.20.8 + specifier: 0.20.9 + version: 0.20.9 '@atproto/syntax': specifier: 0.6.1 version: 0.6.1 @@ -877,8 +877,8 @@ packages: graphql: optional: true - '@atproto/api@0.20.8': - resolution: {integrity: sha512-rTkA6kOmA2axSrg6VgpdXpsCFWpofnHBOn6pKg69Ju5MpIHqk4haQMgjBcVh1G3kUxzwgSAr7SYrPS3dFe5Etg==} + '@atproto/api@0.20.9': + resolution: {integrity: sha512-Yuw7Ewn+yMJZ8GskbuvI3lKPW65rsXic1xjFA2Dpq6H8WjVYs6xNZ31bkwtTYDDwjKIZcJmAVbAVgdfjo4T9iw==} engines: {node: '>=22'} '@atproto/common-web@0.5.0': @@ -9493,7 +9493,7 @@ snapshots: '@0no-co/graphql.web@1.2.0': {} - '@atproto/api@0.20.8': + '@atproto/api@0.20.9': dependencies: '@atproto/common-web': 0.5.0 '@atproto/lexicon': 0.7.1 diff --git a/src/components/MediaPreview.tsx b/src/components/MediaPreview.tsx index b36705d840..034094556c 100644 --- a/src/components/MediaPreview.tsx +++ b/src/components/MediaPreview.tsx @@ -1,6 +1,10 @@ import {type StyleProp, StyleSheet, View, type ViewStyle} from 'react-native' import {Image} from 'expo-image' -import {type AppBskyEmbedImages, type AppBskyFeedDefs} from '@atproto/api' +import { + AppBskyEmbedGallery, + type AppBskyEmbedImages, + type AppBskyFeedDefs, +} from '@atproto/api' import {Trans, useLingui} from '@lingui/react/macro' import {shareImageModal} from '#/lib/media/manip' @@ -47,6 +51,34 @@ export function Embed({ )} ) + } else if (e.type === 'gallery') { + // Notification/DM preview is a narrow inline strip; cap at 4 tiles so + // a 10-image gallery doesn't blow out the row width. Single pass instead + // of filter().slice().map() so we stop at 4 viewable items rather than + // walking every item in a 10-image gallery. + const tiles: React.ReactNode[] = [] + for (const item of e.view.items) { + if (tiles.length >= 4) break + if (!AppBskyEmbedGallery.isViewImage(item)) continue + if (peekable) { + const image: AppBskyEmbedImages.ViewImage = { + thumb: item.thumbnail, + fullsize: item.fullsize, + alt: item.alt, + aspectRatio: item.aspectRatio, + } + tiles.push() + } else { + tiles.push( + , + ) + } + } + return {tiles} } else if (e.type === 'link') { if (!e.view.external.thumb) return null if (!isGifEmbed(e.view.external.uri)) return null diff --git a/src/components/Post/Embed/ImageEmbed.tsx b/src/components/Post/Embed/ImageEmbed.tsx index 2c6bb6c5de..0a620efde4 100644 --- a/src/components/Post/Embed/ImageEmbed.tsx +++ b/src/components/Post/Embed/ImageEmbed.tsx @@ -2,6 +2,7 @@ import {useRef} from 'react' import {InteractionManager, View} from 'react-native' import {type AnimatedRef} from 'react-native-reanimated' import {Image} from 'expo-image' +import {AppBskyEmbedGallery, type AppBskyEmbedImages} from '@atproto/api' import {atoms as a, tokens} from '#/alf' import {AutoSizedImage} from '#/components/images/AutoSizedImage' @@ -15,16 +16,29 @@ import {useAnalytics} from '#/analytics' import {type EmbedType} from '#/types/bsky/post' import {type CommonProps} from './types' +const MAX_GRID_IMAGES = 4 + export function ImageEmbed({ embed, ...rest }: CommonProps & { - embed: EmbedType<'images'> + embed: EmbedType<'images'> | EmbedType<'gallery'> }) { const ax = useAnalytics() const {openLightbox} = useLightboxControls() - const {images} = embed.view - const galleryEnabled = ax.features.enabled(ax.features.PostGalleryEmbedEnable) + const images: AppBskyEmbedImages.ViewImage[] = + embed.type === 'gallery' + ? embed.view.items.filter(AppBskyEmbedGallery.isViewImage).map(item => ({ + thumb: item.thumbnail, + fullsize: item.fullsize, + alt: item.alt, + aspectRatio: item.aspectRatio, + })) + : embed.view.images + const useExpandedLayout = + embed.type === 'gallery' + ? images.length > MAX_GRID_IMAGES + : ax.features.enabled(ax.features.PostGalleryEmbedEnable) // Captured from AutoSizedImage so the peek-commit handler can reuse the same // ref + dims that a tap would — keeps the lightbox's return animation intact. @@ -109,7 +123,7 @@ export function ImageEmbed({ ) } - if (galleryEnabled) { + if (useExpandedLayout) { return ( ) diff --git a/src/components/Post/Embed/index.tsx b/src/components/Post/Embed/index.tsx index ab6f5dc439..28eed2aaa9 100644 --- a/src/components/Post/Embed/index.tsx +++ b/src/components/Post/Embed/index.tsx @@ -54,6 +54,7 @@ export function Embed({embed: rawEmbed, ...rest}: EmbedProps) { switch (embed.type) { case 'images': + case 'gallery': case 'link': case 'video': { return @@ -89,7 +90,8 @@ function MediaEmbed({ embed: TEmbed }) { switch (embed.type) { - case 'images': { + case 'images': + case 'gallery': { return ( ( post.record, @@ -39,6 +37,13 @@ export function maybeApplyGalleryOffsetStyles( return } + // The gate only controls whether legacy image embeds opt into the new + // expanded gallery layout. Gallery embeds always render expanded by item + // count, so their offset must apply regardless of the gate. + const isPostGalleryEmbedEnabled = features.isOn( + Features.PostGalleryEmbedEnable, + ) + /* * First check if we even have images */ @@ -49,6 +54,12 @@ export function maybeApplyGalleryOffsetStyles( embed, AppBskyEmbedImages.isMain, ) + const isGalleryEmbed = + embed && + bsky.dangerousIsType( + embed, + AppBskyEmbedGallery.isMain, + ) const isRecordWithMedia = embed && bsky.dangerousIsType( @@ -57,10 +68,16 @@ export function maybeApplyGalleryOffsetStyles( ) let hasImages = false if (isImageEmbed) { + if (!isPostGalleryEmbedEnabled) return // one image, not a gallery if (embed.images.length === 1) return hasImages = true } + if (isGalleryEmbed) { + // single (or empty) gallery - no offset needed + if (embed.items.length <= 1) return + hasImages = true + } if (isRecordWithMedia) { if ( bsky.dangerousIsType( @@ -68,9 +85,19 @@ export function maybeApplyGalleryOffsetStyles( AppBskyEmbedImages.isMain, ) ) { + if (!isPostGalleryEmbedEnabled) return // one image, not a gallery if (embed.media.images.length === 1) return } + if ( + bsky.dangerousIsType( + embed.media, + AppBskyEmbedGallery.isMain, + ) + ) { + // single (or empty) gallery - no offset needed + if (embed.media.items.length <= 1) return + } hasImages = true } if (!hasImages) return diff --git a/src/components/images/ImageLayoutGrid.tsx b/src/components/images/ImageLayoutGrid.tsx index 0017ddf9cf..5b4ba608b2 100644 --- a/src/components/images/ImageLayoutGrid.tsx +++ b/src/components/images/ImageLayoutGrid.tsx @@ -19,21 +19,28 @@ interface ImageLayoutGridProps { onPressIn?: (index: number) => void style?: StyleProp viewContext?: PostEmbedViewContext + isWithinQuote?: boolean } -export function ImageLayoutGrid({style, ...props}: ImageLayoutGridProps) { +export function ImageLayoutGrid({ + style, + isWithinQuote: isWithinQuoteProp, + ...props +}: ImageLayoutGridProps) { const {gtMobile} = useBreakpoints() - const gap = + const isWithinQuote = + isWithinQuoteProp ?? props.viewContext === PostEmbedViewContext.FeedEmbedRecordWithMedia - ? gtMobile - ? a.gap_xs - : a.gap_2xs - : a.gap_xs + const gap = isWithinQuote ? (gtMobile ? a.gap_xs : a.gap_2xs) : a.gap_xs return ( - + ) @@ -49,6 +56,7 @@ interface ImageLayoutGridInnerProps { onLongPress?: (index: number) => void onPressIn?: (index: number) => void viewContext?: PostEmbedViewContext + isWithinQuote?: boolean gap: {gap: number} } diff --git a/src/components/images/ImageLayoutGridItem.tsx b/src/components/images/ImageLayoutGridItem.tsx index d6cbc0aded..640ecd8ba2 100644 --- a/src/components/images/ImageLayoutGridItem.tsx +++ b/src/components/images/ImageLayoutGridItem.tsx @@ -29,6 +29,7 @@ interface Props { onPressIn?: EventFunction imageStyle?: StyleProp viewContext?: PostEmbedViewContext + isWithinQuote?: boolean insetBorderStyle?: StyleProp containerRefs: AnimatedRef[] thumbDimsRef: React.RefObject<(Dimensions | null)[]> @@ -42,6 +43,7 @@ export function GalleryItem({ onPressIn, onLongPress, viewContext, + isWithinQuote, insetBorderStyle, containerRefs, thumbDimsRef, @@ -52,6 +54,7 @@ export function GalleryItem({ const image = images[index] const hasAlt = !!image.alt const hideBadges = + isWithinQuote ?? viewContext === PostEmbedViewContext.FeedEmbedRecordWithMedia const aspect = diff --git a/src/components/moderation/ReportDialog/utils/parseReportSubject.ts b/src/components/moderation/ReportDialog/utils/parseReportSubject.ts index 405640c453..a7d4b94c32 100644 --- a/src/components/moderation/ReportDialog/utils/parseReportSubject.ts +++ b/src/components/moderation/ReportDialog/utils/parseReportSubject.ts @@ -87,7 +87,10 @@ export function parseReportSubject( reply: !!record.reply, image: embed.type === 'images' || - (embed.type === 'post_with_media' && embed.media.type === 'images'), + embed.type === 'gallery' || + (embed.type === 'post_with_media' && + (embed.media.type === 'images' || + embed.media.type === 'gallery')), video: embed.type === 'video' || (embed.type === 'post_with_media' && embed.media.type === 'video'), diff --git a/src/lib/api/index.ts b/src/lib/api/index.ts index 7de4e13e56..6f92e2a1dd 100644 --- a/src/lib/api/index.ts +++ b/src/lib/api/index.ts @@ -1,6 +1,7 @@ import { type $Typed, type AppBskyEmbedExternal, + type AppBskyEmbedGallery, type AppBskyEmbedImages, type AppBskyEmbedRecord, type AppBskyEmbedRecordWithMedia, @@ -254,6 +255,7 @@ async function resolveEmbed( onStateChange: ((state: string) => void) | undefined, ): Promise< | $Typed + | $Typed | $Typed | $Typed | $Typed @@ -313,6 +315,7 @@ async function resolveMedia( ): Promise< | $Typed | $Typed + | $Typed | $Typed | undefined > { @@ -343,6 +346,34 @@ async function resolveMedia( images, } } + if (embedDraft.media?.type === 'gallery') { + const imagesDraft = embedDraft.media.images + logger.debug(`Uploading images`, { + count: imagesDraft.length, + }) + onStateChange?.(t`Uploading images...`) + const items: $Typed[] = await Promise.all( + imagesDraft.map(async (image, i) => { + logger.debug(`Compressing image #${i}`) + const {path, width, height, mime} = await compressImage( + image, + IMAGE_SIZE_CONFIG_POSTS, + ) + logger.debug(`Uploading image #${i}`) + const res = await uploadBlob(agent, path, mime) + return { + $type: 'app.bsky.embed.gallery#image' as const, + image: res.data.blob, + alt: image.alt, + aspectRatio: {width, height}, + } + }), + ) + return { + $type: 'app.bsky.embed.gallery', + items, + } + } if ( embedDraft.media?.type === 'video' && embedDraft.media.video.status === 'done' diff --git a/src/types/bsky/post.ts b/src/types/bsky/post.ts index fada39da81..43621ef63b 100644 --- a/src/types/bsky/post.ts +++ b/src/types/bsky/post.ts @@ -1,6 +1,7 @@ import { type $Typed, AppBskyEmbedExternal, + AppBskyEmbedGallery, AppBskyEmbedImages, AppBskyEmbedRecord, AppBskyEmbedRecordWithMedia, @@ -47,6 +48,10 @@ export type Embed = type: 'images' view: $Typed } + | { + type: 'gallery' + view: $Typed + } | { type: 'link' view: $Typed @@ -122,6 +127,11 @@ export function parseEmbed(embed: AppBskyFeedDefs.PostView['embed']): Embed { type: 'images', view: embed, } + } else if (AppBskyEmbedGallery.isView(embed)) { + return { + type: 'gallery', + view: embed, + } } else if (AppBskyEmbedExternal.isView(embed)) { return { type: 'link', diff --git a/src/view/com/composer/Composer.tsx b/src/view/com/composer/Composer.tsx index 5c9f1a05fe..a2493557b7 100644 --- a/src/view/com/composer/Composer.tsx +++ b/src/view/com/composer/Composer.tsx @@ -159,7 +159,7 @@ import { composerReducer, createComposerState, type EmbedDraft, - MAX_IMAGES, + MAX_GALLERY_IMAGES, type PostAction, type PostDraft, type ThreadDraft, @@ -178,6 +178,65 @@ type CancelRef = { onPressCancel: () => void } +function applyGalleryCap( + currentCount: number, + incoming: ComposerImage[], +): + | {status: 'full'} + | {status: 'partial'; accepted: ComposerImage[]; dropped: number} + | {status: 'ok'; accepted: ComposerImage[]} { + const remaining = MAX_GALLERY_IMAGES - currentCount + if (remaining <= 0) { + return {status: 'full'} + } + if (incoming.length > remaining) { + return { + status: 'partial', + accepted: incoming.slice(0, remaining), + dropped: incoming.length - remaining, + } + } + return {status: 'ok', accepted: incoming} +} + +function useAddImagesWithCap( + currentCount: number, + dispatchPostAction: (action: PostAction) => void, +) { + const {t: l} = useLingui() + return useCallback( + (next: ComposerImage[]) => { + const result = applyGalleryCap(currentCount, next) + if (result.status === 'full') { + Toast.show( + l({ + message: `You can only add up to ${MAX_GALLERY_IMAGES} images per post`, + comment: + 'Toast shown when the user tries to add more images but the post gallery is already at the cap', + }), + {type: 'warning'}, + ) + return + } + if (result.status === 'partial') { + Toast.show( + l({ + message: `Only ${result.accepted.length} of ${next.length} ${plural(next.length, {one: 'image', other: 'images'})} added; limit is ${MAX_GALLERY_IMAGES}`, + comment: + 'Toast shown when adding images would exceed the post gallery cap; only the first N are kept', + }), + {type: 'warning'}, + ) + } + dispatchPostAction({ + type: 'embed_add_images', + images: result.accepted, + }) + }, + [currentCount, dispatchPostAction, l], + ) +} + type Props = ComposerOpts export const ComposePost = ({ replyTo, @@ -611,7 +670,11 @@ export const ComposePost = ({ ax.metric('draft:save', { isNewDraft, hasText: posts.some(p => p.richtext.text.trim().length > 0), - hasImages: posts.some(p => p.embed.media?.type === 'images'), + hasImages: posts.some( + p => + p.embed.media?.type === 'images' || + p.embed.media?.type === 'gallery', + ), hasVideo: posts.some(p => p.embed.media?.type === 'video'), hasGif: posts.some(p => p.embed.media?.type === 'gif'), hasQuote: posts.some(p => !!p.embed.quote), @@ -780,7 +843,10 @@ export const ComposePost = ({ for (let i = 0; i < thread.posts.length; i++) { const media = thread.posts[i].embed.media if (media) { - if (media.type === 'images' && media.images.some(img => !img.alt)) { + if ( + (media.type === 'images' || media.type === 'gallery') && + media.images.some(img => !img.alt) + ) { return l`One or more images is missing alt text.` } if (media.type === 'gif' && !media.alt) { @@ -931,7 +997,9 @@ export const ComposePost = ({ logger.error(e, { message: `Composer: create post failed`, hasImages: filteredThread.posts.some( - p => p.embed.media?.type === 'images', + p => + p.embed.media?.type === 'images' || + p.embed.media?.type === 'gallery', ), }) @@ -953,7 +1021,8 @@ export const ComposePost = ({ for (let post of filteredThread.posts) { ax.metric('post:create', { imageCount: - post.embed.media?.type === 'images' + post.embed.media?.type === 'images' || + post.embed.media?.type === 'gallery' ? post.embed.media.images.length : 0, isReply: index > 0 || !!replyTo, @@ -1395,15 +1464,11 @@ let ComposerPost = memo(function ComposerPost({ [dispatch, post.id], ) - const onImageAdd = useCallback( - (next: ComposerImage[]) => { - dispatchPost({ - type: 'embed_add_images', - images: next, - }) - }, - [dispatchPost], - ) + const postImagesCount = + post.embed.media?.type === 'images' || post.embed.media?.type === 'gallery' + ? post.embed.media.images.length + : 0 + const onImageAdd = useAddImagesWithCap(postImagesCount, dispatchPost) const onNewLink = useCallback( (uri: string) => { @@ -1708,7 +1773,7 @@ function ComposerEmbeds({ const video = embed.media?.type === 'video' ? embed.media.video : null return ( <> - {embed.media?.type === 'images' && ( + {(embed.media?.type === 'images' || embed.media?.type === 'gallery') && ( )} @@ -1819,7 +1884,11 @@ function ComposerPills({ }) { const t = useTheme() const media = post.embed.media - const hasMedia = media?.type === 'images' || media?.type === 'video' + const hasMedia = + media?.type === 'images' || + media?.type === 'gallery' || + media?.type === 'gif' || + media?.type === 'video' const hasLink = !!post.embed.link // Don't render anything if no pills are going to be displayed @@ -1908,15 +1977,16 @@ function ComposerFooter({ >(undefined) const media = post.embed.media - const images = media?.type === 'images' ? media.images : [] + const images = + media?.type === 'images' || media?.type === 'gallery' ? media.images : [] const video = media?.type === 'video' ? media.video : null - const isMaxImages = images.length >= MAX_IMAGES + const isMaxImages = images.length >= MAX_GALLERY_IMAGES const isMaxVideos = !!video let selectedAssetsCount = 0 let isMediaSelectionDisabled = false - if (media?.type === 'images') { + if (media?.type === 'images' || media?.type === 'gallery') { isMediaSelectionDisabled = isMaxImages selectedAssetsCount = images.length } else if (media?.type === 'video') { @@ -1926,15 +1996,7 @@ function ComposerFooter({ isMediaSelectionDisabled = !!media } - const onImageAdd = useCallback( - (next: ComposerImage[]) => { - dispatch({ - type: 'embed_add_images', - images: next, - }) - }, - [dispatch], - ) + const onImageAdd = useAddImagesWithCap(images.length, dispatch) const onSelectGif = useCallback( (gif: Gif) => { @@ -2017,7 +2079,11 @@ function ComposerFooter({ autoOpen={openGallery} /> diff --git a/src/view/com/composer/ComposerReplyTo.tsx b/src/view/com/composer/ComposerReplyTo.tsx index bac3e74d31..235139ef86 100644 --- a/src/view/com/composer/ComposerReplyTo.tsx +++ b/src/view/com/composer/ComposerReplyTo.tsx @@ -2,6 +2,7 @@ import {useCallback, useMemo, useState} from 'react' import {LayoutAnimation, Pressable, View} from 'react-native' import {Image} from 'expo-image' import { + AppBskyEmbedGallery, AppBskyEmbedImages, AppBskyEmbedRecord, AppBskyEmbedRecordWithMedia, @@ -61,11 +62,14 @@ export function ComposerReplyTo({replyTo}: {replyTo: ComposerOptsPostRef}) { const images = useMemo(() => { if (AppBskyEmbedImages.isView(embed)) { return embed.images - } else if ( - AppBskyEmbedRecordWithMedia.isView(embed) && - AppBskyEmbedImages.isView(embed.media) - ) { - return embed.media.images + } else if (AppBskyEmbedGallery.isView(embed)) { + return galleryItemsToImages(embed.items) + } else if (AppBskyEmbedRecordWithMedia.isView(embed)) { + if (AppBskyEmbedImages.isView(embed.media)) { + return embed.media.images + } else if (AppBskyEmbedGallery.isView(embed.media)) { + return galleryItemsToImages(embed.media.items) + } } }, [embed]) @@ -129,6 +133,22 @@ export function ComposerReplyTo({replyTo}: {replyTo: ComposerOptsPostRef}) { ) } +function galleryItemsToImages( + items: AppBskyEmbedGallery.View['items'], +): AppBskyEmbedImages.ViewImage[] { + // The reply-to thumbnail only renders up to 4 tiles; slicing here keeps + // the existing layout switch valid for galleries up to 10 items. + return items + .filter(AppBskyEmbedGallery.isViewImage) + .slice(0, 4) + .map(item => ({ + thumb: item.thumbnail, + fullsize: item.fullsize, + alt: item.alt, + aspectRatio: item.aspectRatio, + })) +} + function ComposerReplyToImages({ images, }: { diff --git a/src/view/com/composer/SelectMediaButton.tsx b/src/view/com/composer/SelectMediaButton.tsx index 2d70195488..1de39f5f54 100644 --- a/src/view/com/composer/SelectMediaButton.tsx +++ b/src/view/com/composer/SelectMediaButton.tsx @@ -16,7 +16,7 @@ import { } from '#/lib/hooks/usePermissions' import {openUnifiedPicker} from '#/lib/media/picker' import {extractDataUriMime} from '#/lib/media/util' -import {MAX_IMAGES} from '#/view/com/composer/state/composer' +import {MAX_GALLERY_IMAGES} from '#/view/com/composer/state/composer' import {atoms as a, useTheme} from '#/alf' import {Button} from '#/components/Button' import {useSheetWrapper} from '#/components/Dialog/sheet-wrapper' @@ -393,7 +393,9 @@ export function SelectMediaButton({ const t = useTheme() const hasAutoOpened = useRef(false) - const selectionCountRemaining = MAX_IMAGES - selectedAssetsCount + // Picker uses the gallery cap; the reducer decides which embed variant + // to land in based on the final image count. + const selectionCountRemaining = MAX_GALLERY_IMAGES - selectedAssetsCount const processSelectedAssets = useCallback( async (rawAssets: ImagePickerAsset[]) => { @@ -419,10 +421,10 @@ export function SelectMediaButton({ ), [SelectedAssetError.MaxImages]: _( msg({ - message: `You can select up to ${plural(MAX_IMAGES, { + message: `You can select up to ${plural(MAX_GALLERY_IMAGES, { other: '# images', })} in total.`, - comment: `Error message for maximum number of images that can be selected to add to a post, currently 4 but may change.`, + comment: `Error message for maximum number of images that can be selected to add to a post.`, }), ), [SelectedAssetError.MaxVideos]: _( @@ -507,10 +509,11 @@ export function SelectMediaButton({ )} accessibilityHint={_( msg({ - message: `Opens device gallery to select up to ${plural(MAX_IMAGES, { - other: '# images', - })}, or a single video or GIF.`, - comment: `Accessibility hint for button in composer to add images, a video, or a GIF to a post. Maximum number of images that can be selected is currently 4 but may change.`, + message: `Opens device gallery to select up to ${plural( + MAX_GALLERY_IMAGES, + {other: '# images'}, + )}, or a single video or GIF.`, + comment: `Accessibility hint for button in composer to add images, a video, or a GIF to a post.`, }), )} style={a.p_sm} diff --git a/src/view/com/composer/drafts/state/api.ts b/src/view/com/composer/drafts/state/api.ts index 8f178d5282..817820effb 100644 --- a/src/view/com/composer/drafts/state/api.ts +++ b/src/view/com/composer/drafts/state/api.ts @@ -1,7 +1,7 @@ /** * Type converters for Draft API - convert between ComposerState and server Draft types. */ -import {type AppBskyDraftDefs, AtUri, RichText} from '@atproto/api' +import {AppBskyDraftDefs, AtUri, RichText} from '@atproto/api' import {nanoid} from 'nanoid/non-secure' import {resolveLink} from '#/lib/api/resolve' @@ -15,6 +15,7 @@ import {createPublicAgent} from '#/state/session/agent' import { type ComposerState, type EmbedDraft, + LEGACY_IMAGES_EMBED_MAX, type PostDraft, } from '#/view/com/composer/state/composer' import {type VideoState} from '#/view/com/composer/state/video' @@ -115,6 +116,16 @@ async function postDraftToServerPost( post.embed.media.images, localRefPaths, ) + } else if (post.embed.media.type === 'gallery') { + draftPost.embedGallery = { + $type: 'app.bsky.draft.defs#draftEmbedGallery', + items: serializeImages(post.embed.media.images, localRefPaths).map( + img => ({ + $type: 'app.bsky.draft.defs#draftEmbedImage' as const, + ...img, + }), + ), + } } else if (post.embed.media.type === 'video') { const video = await serializeVideo(post.embed.media.video, localRefPaths) if (video) { @@ -269,6 +280,59 @@ function serializeGif(gifMedia: { } } +/** + * Restore an array of draft image refs back to ComposerImages. Shared by + * both the `embedImages` and `embedGallery` paths in draftToComposerPosts. + */ +async function restoreDraftImages( + draftImages: AppBskyDraftDefs.DraftEmbedImage[], + loadedMedia: Map, +): Promise { + const imagePromises = draftImages.map(async img => { + const path = loadedMedia.get(img.localRef.path) + if (!path) { + return null + } + + let width = 0 + let height = 0 + try { + const dims = await getImageDim(path) + width = dims.width + height = dims.height + } catch (e) { + logger.warn('Failed to get image dimensions', { + path, + error: e, + }) + } + + logger.debug('restoring image with localRefPath', { + localRefPath: img.localRef.path, + loadedPath: path, + width, + height, + }) + + return { + alt: img.alt || '', + // Preserve the original localRefPath for reuse when saving + localRefPath: img.localRef.path, + source: { + id: nanoid(), + path, + width, + height, + mime: 'image/jpeg', + }, + } satisfies ComposerImage + }) + + return (await Promise.all(imagePromises)).filter( + (img): img is NonNullable => img !== null, + ) +} + /** * Convert server DraftView to DraftSummary for list display. * Also checks which media files exist locally. @@ -314,6 +378,24 @@ export function draftViewToSummary({ } } + // Process gallery + if (post.embedGallery) { + for (const item of post.embedGallery.items) { + if (!AppBskyDraftDefs.isDraftEmbedImage(item)) continue + meta.mediaCount++ + meta.hasMedia = true + const exists = storage.mediaExists(item.localRef.path) + if (!exists) { + meta.hasMissingMedia = true + } + images.push({ + localPath: item.localRef.path, + altText: item.alt || '', + exists, + }) + } + } + // Process videos if (post.embedVideos) { for (const vid of post.embedVideos) { @@ -431,54 +513,31 @@ export async function draftToComposerPosts( media: undefined, } - // Restore images + // Restore images / gallery. Pick the variant from the restored count so + // we match the composer reducer's `imagesToMediaVariant` rule (<=4 stays + // legacy `images`, >4 promotes to `gallery`). This keeps restore robust + // to drafts whose server slot disagrees with their count - e.g. a draft + // saved in `embedImages` with 5 items would otherwise restore as a + // broken `images` variant the rest of the composer can't grow. + const restoredImages: ComposerImage[] = [] if (post.embedImages && post.embedImages.length > 0) { - const imagePromises = post.embedImages.map(async img => { - const path = loadedMedia.get(img.localRef.path) - if (!path) { - return null - } - - let width = 0 - let height = 0 - try { - const dims = await getImageDim(path) - width = dims.width - height = dims.height - } catch (e) { - logger.warn('Failed to get image dimensions', { - path, - error: e, - }) - } - - logger.debug('restoring image with localRefPath', { - localRefPath: img.localRef.path, - loadedPath: path, - width, - height, - }) - - return { - alt: img.alt || '', - // Preserve the original localRefPath for reuse when saving - localRefPath: img.localRef.path, - source: { - id: nanoid(), - path, - width, - height, - mime: 'image/jpeg', - }, - } satisfies ComposerImage - }) - - const images = (await Promise.all(imagePromises)).filter( - (img): img is NonNullable => img !== null, + restoredImages.push( + ...(await restoreDraftImages(post.embedImages, loadedMedia)), ) - if (images.length > 0) { - embed.media = {type: 'images', images} - } + } + if (post.embedGallery && post.embedGallery.items.length > 0) { + const galleryImages = post.embedGallery.items.filter( + AppBskyDraftDefs.isDraftEmbedImage, + ) + restoredImages.push( + ...(await restoreDraftImages(galleryImages, loadedMedia)), + ) + } + if (restoredImages.length > 0) { + embed.media = + restoredImages.length <= LEGACY_IMAGES_EMBED_MAX + ? {type: 'images', images: restoredImages} + : {type: 'gallery', images: restoredImages} } // Restore GIF from external embed @@ -630,6 +689,12 @@ export function extractLocalRefs(draft: AppBskyDraftDefs.Draft): Set { refs.add(img.localRef.path) } } + if (post.embedGallery) { + for (const item of post.embedGallery.items) { + if (!AppBskyDraftDefs.isDraftEmbedImage(item)) continue + refs.add(item.localRef.path) + } + } if (post.embedVideos) { for (const vid of post.embedVideos) { refs.add(vid.localRef.path) diff --git a/src/view/com/composer/drafts/state/queries.ts b/src/view/com/composer/drafts/state/queries.ts index e66c9d023b..07dd67dd88 100644 --- a/src/view/com/composer/drafts/state/queries.ts +++ b/src/view/com/composer/drafts/state/queries.ts @@ -1,4 +1,4 @@ -import {AppBskyDraftCreateDraft, type AppBskyDraftDefs} from '@atproto/api' +import {AppBskyDraftCreateDraft, AppBskyDraftDefs} from '@atproto/api' import { useInfiniteQuery, useMutation, @@ -74,6 +74,21 @@ export async function loadDraftMedia(draft: AppBskyDraftDefs.Draft): Promise<{ } } } + // Load gallery + if (post.embedGallery) { + for (const item of post.embedGallery.items) { + if (!AppBskyDraftDefs.isDraftEmbedImage(item)) continue + try { + const url = await storage.loadMediaFromLocal(item.localRef.path) + loadedMedia.set(item.localRef.path, url) + } catch (e) { + logger.error('Failed to load draft gallery image', { + path: item.localRef.path, + safeMessage: e instanceof Error ? e.message : String(e), + }) + } + } + } // Load videos if (post.embedVideos) { for (const vid of post.embedVideos) { @@ -226,6 +241,12 @@ export function useDeleteDraftMutation() { await storage.deleteMediaFromLocal(img.localRef.path) } } + if (post.embedGallery) { + for (const item of post.embedGallery.items) { + if (!AppBskyDraftDefs.isDraftEmbedImage(item)) continue + await storage.deleteMediaFromLocal(item.localRef.path) + } + } if (post.embedVideos) { for (const vid of post.embedVideos) { await storage.deleteMediaFromLocal(vid.localRef.path) diff --git a/src/view/com/composer/photos/Gallery.tsx b/src/view/com/composer/photos/Gallery.tsx index 2cc000019f..98bfac779d 100644 --- a/src/view/com/composer/photos/Gallery.tsx +++ b/src/view/com/composer/photos/Gallery.tsx @@ -70,11 +70,13 @@ const GalleryInner = ({images, containerInfo, dispatch}: GalleryInnerProps) => { const {isMobile} = useWebMediaQueries() const {altTextControlStyle, imageControlsStyle, imageStyle} = useMemo(() => { + // Cap columns at 4 so tiles stay tappable when MAX_GALLERY_IMAGES is high; + // n > 4 wraps to multiple rows via flexWrap on the gallery container. + const columns = Math.min(images.length, 4) const side = images.length === 1 ? 250 - : (containerInfo.width - IMAGE_GAP * (images.length - 1)) / - images.length + : (containerInfo.width - IMAGE_GAP * (columns - 1)) / columns const isOverflow = isMobile && images.length > 2 @@ -273,6 +275,7 @@ const styles = StyleSheet.create({ gallery: { flex: 1, flexDirection: 'row', + flexWrap: 'wrap', gap: IMAGE_GAP, marginTop: 16, }, diff --git a/src/view/com/composer/state/composer.ts b/src/view/com/composer/state/composer.ts index d2b9af7b8e..35e1706007 100644 --- a/src/view/com/composer/state/composer.ts +++ b/src/view/com/composer/state/composer.ts @@ -16,6 +16,7 @@ import { postUriToRelativePath, toBskyAppUrl, } from '#/lib/strings/url-helpers' +import {logger} from '#/logger' import {type ComposerImage, createInitialImages} from '#/state/gallery' import {createPostgateRecord} from '#/state/queries/postgate/util' import {threadgateRecordToAllowUISetting} from '#/state/queries/threadgate' @@ -38,6 +39,11 @@ type ImagesMedia = { images: ComposerImage[] } +type GalleryMedia = { + type: 'gallery' + images: ComposerImage[] +} + type VideoMedia = { type: 'video' video: VideoState @@ -59,7 +65,7 @@ type Link = { export type EmbedDraft = { // We'll always submit quote and actual media (images, video, gifs) chosen by the user. quote: Link | undefined - media: ImagesMedia | VideoMedia | GifMedia | undefined + media: ImagesMedia | GalleryMedia | VideoMedia | GifMedia | undefined // This field may end up ignored if we have more important things to display than a link card: link: Link | undefined } @@ -154,7 +160,31 @@ export type ComposerAction = draftId: string } -export const MAX_IMAGES = 4 +/** + * Threshold for picking between embed variants. <= this count uses the + * legacy `app.bsky.embed.images` shape; > this count promotes to + * `app.bsky.embed.gallery`. Named to flag that if/when we deprecate the + * legacy images embed entirely, this constant (and the variant split it + * gates) should go away. + */ +export const LEGACY_IMAGES_EMBED_MAX = 4 +export const MAX_GALLERY_IMAGES = 10 + +/** + * Picks the embed variant for a set of images. <=4 lands in the legacy + * `app.bsky.embed.images` shape; >4 promotes to `app.bsky.embed.gallery`. + * Anything beyond the gallery cap is dropped by the hard slice; callers + * should already have enforced the cap upstream (picker, paste, etc), + * and the reducer logs a warning when the cap is exceeded so the UI + * layer can surface a toast. + */ +function imagesToMediaVariant( + images: ComposerImage[], +): ImagesMedia | GalleryMedia { + return images.length <= LEGACY_IMAGES_EMBED_MAX + ? {type: 'images', images: images.slice(0, LEGACY_IMAGES_EMBED_MAX)} + : {type: 'gallery', images: images.slice(0, MAX_GALLERY_IMAGES)} +} export function composerReducer( state: ComposerState, @@ -337,16 +367,28 @@ function postReducer(state: PostDraft, action: PostAction): PostDraft { } const prevMedia = state.embed.media let nextMedia = prevMedia + const prevCount = + prevMedia?.type === 'images' || prevMedia?.type === 'gallery' + ? prevMedia.images.length + : 0 + const incomingCount = prevCount + action.images.length + if (incomingCount > MAX_GALLERY_IMAGES) { + // Defense in depth: callers (applyGalleryCap in Composer) should have + // already trimmed and surfaced a toast. The hard slice in + // imagesToMediaVariant still drops the excess so the cap holds. + logger.warn('composer: image add exceeds MAX_GALLERY_IMAGES', { + prevCount, + incomingCount, + dropped: incomingCount - MAX_GALLERY_IMAGES, + }) + } if (!prevMedia) { - nextMedia = { - type: 'images', - images: action.images.slice(0, MAX_IMAGES), - } - } else if (prevMedia.type === 'images') { - nextMedia = { - ...prevMedia, - images: [...prevMedia.images, ...action.images].slice(0, MAX_IMAGES), - } + nextMedia = imagesToMediaVariant(action.images) + } else if (prevMedia.type === 'images' || prevMedia.type === 'gallery') { + nextMedia = imagesToMediaVariant([ + ...prevMedia.images, + ...action.images, + ]) } return { ...state, @@ -358,7 +400,7 @@ function postReducer(state: PostDraft, action: PostAction): PostDraft { } case 'embed_update_image': { const prevMedia = state.embed.media - if (prevMedia?.type === 'images') { + if (prevMedia?.type === 'images' || prevMedia?.type === 'gallery') { const updatedImage = action.image const nextMedia = { ...prevMedia, @@ -382,19 +424,22 @@ function postReducer(state: PostDraft, action: PostAction): PostDraft { case 'embed_remove_image': { const prevMedia = state.embed.media let nextLabels = state.labels - if (prevMedia?.type === 'images') { + if (prevMedia?.type === 'images' || prevMedia?.type === 'gallery') { const removedImage = action.image - let nextMedia: ImagesMedia | undefined = { - ...prevMedia, - images: prevMedia.images.filter(img => { - return img.source.id !== removedImage.source.id - }), - } - if (nextMedia.images.length === 0) { + const remainingImages = prevMedia.images.filter(img => { + return img.source.id !== removedImage.source.id + }) + let nextMedia: ImagesMedia | GalleryMedia | undefined + if (remainingImages.length === 0) { nextMedia = undefined if (!state.embed.link) { nextLabels = [] } + } else { + // Re-pick the variant so a gallery that shrinks to <=4 demotes + // back to the legacy `app.bsky.embed.images` shape - keeps old + // clients rendering it when possible. + nextMedia = imagesToMediaVariant(remainingImages) } return { ...state, @@ -581,12 +626,9 @@ export function createComposerState({ | AppBskyActorDefs.PostInteractionSettingsPref | undefined }): ComposerState { - let media: ImagesMedia | undefined + let media: ImagesMedia | GalleryMedia | undefined if (initImageUris?.length) { - media = { - type: 'images', - images: createInitialImages(initImageUris), - } + media = imagesToMediaVariant(createInitialImages(initImageUris)) } let quote: Link | undefined if (initQuoteUri) { diff --git a/src/view/com/feeds/ComposerPrompt.tsx b/src/view/com/feeds/ComposerPrompt.tsx index b35c1c1adf..592266871e 100644 --- a/src/view/com/feeds/ComposerPrompt.tsx +++ b/src/view/com/feeds/ComposerPrompt.tsx @@ -12,7 +12,7 @@ import { } from '#/lib/hooks/usePermissions' import {openCamera, openUnifiedPicker} from '#/lib/media/picker' import {useCurrentAccountProfile} from '#/state/queries/useCurrentAccountProfile' -import {MAX_IMAGES} from '#/view/com/composer/state/composer' +import {MAX_GALLERY_IMAGES} from '#/view/com/composer/state/composer' import {UserAvatar} from '#/view/com/util/UserAvatar' import {atoms as a, native, useTheme, web} from '#/alf' import {Button} from '#/components/Button' @@ -64,7 +64,7 @@ export function ComposerPrompt() { Keyboard.dismiss() } - const selectionCountRemaining = MAX_IMAGES + const selectionCountRemaining = MAX_GALLERY_IMAGES const {assets, canceled} = await sheetWrapper( openUnifiedPicker({selectionCountRemaining}), ) @@ -76,7 +76,7 @@ export function ComposerPrompt() { if (assets.length > 0) { const imageUris = assets .filter(asset => asset.mimeType?.startsWith('image/')) - .slice(0, MAX_IMAGES) + .slice(0, MAX_GALLERY_IMAGES) .map(asset => ({ uri: asset.uri, width: asset.width, From f84c85aac6811e76f58b12e8880e0897f4331d66 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Fri, 5 Jun 2026 00:37:42 +0300 Subject: [PATCH 066/149] Use Reanimated layout animations for Android composer (#8546) --- src/view/shell/Composer.ios.tsx | 23 ++++++++------- src/view/shell/Composer.tsx | 52 ++++++++++++++------------------- src/view/shell/Composer.web.tsx | 7 ++--- src/view/shell/index.tsx | 4 +-- src/view/shell/index.web.tsx | 2 +- 5 files changed, 38 insertions(+), 50 deletions(-) diff --git a/src/view/shell/Composer.ios.tsx b/src/view/shell/Composer.ios.tsx index 437e610b20..7a1f599374 100644 --- a/src/view/shell/Composer.ios.tsx +++ b/src/view/shell/Composer.ios.tsx @@ -1,29 +1,30 @@ -import {useEffect, useRef} from 'react' +import {useEffect} from 'react' import {Modal, View} from 'react-native' +import {SystemBars} from 'react-native-edge-to-edge' -import {useDialogStateControlContext} from '#/state/dialogs' import {useComposerState} from '#/state/shell/composer' import {ComposePost, useComposerCancelRef} from '#/view/com/composer/Composer' import {atoms as a, useTheme} from '#/alf' import {SheetCompatProvider as TooltipSheetCompatProvider} from '#/components/Tooltip' +import {IS_LIQUID_GLASS} from '#/env' -export function Composer({}: {winHeight: number}) { - const {setFullyExpandedCount} = useDialogStateControlContext() +export function Composer() { const t = useTheme() const state = useComposerState() const ref = useComposerCancelRef() const open = !!state - const prevOpen = useRef(open) useEffect(() => { - if (open && !prevOpen.current) { - setFullyExpandedCount(c => c + 1) - } else if (!open && prevOpen.current) { - setFullyExpandedCount(c => c - 1) + if (open && !IS_LIQUID_GLASS) { + const entry = SystemBars.pushStackEntry({ + style: { + statusBar: 'light', + }, + }) + return () => SystemBars.popStackEntry(entry) } - prevOpen.current = open - }, [open, setFullyExpandedCount]) + }, [open]) return ( { - if (state) { - Animated.timing(initInterp, { - toValue: 1, - duration: 300, - easing: Easing.out(Easing.exp), - useNativeDriver: true, - }).start() - } else { - initInterp.setValue(0) + if (open) { + const entry = SystemBars.pushStackEntry({ + style: { + statusBar: t.name !== 'light' ? 'light' : 'dark', + }, + }) + return () => SystemBars.popStackEntry(entry) } - }, [initInterp, state]) - const wrapperAnimStyle = { - transform: [ - { - translateY: initInterp.interpolate({ - inputRange: [0, 1], - outputRange: [winHeight, 0], - }), - }, - ], - } + }, [open, t.name]) - // rendering - // = - - if (!state) { + if (!open) { return null } return ( - - + diff --git a/src/view/shell/index.web.tsx b/src/view/shell/index.web.tsx index bfce0729d2..62dec9bcf7 100644 --- a/src/view/shell/index.web.tsx +++ b/src/view/shell/index.web.tsx @@ -64,7 +64,7 @@ function ShellInner() { - + From 2f61c0a7b4ab735bf7ace70aa85ffc09206388e1 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Thu, 4 Jun 2026 16:51:34 -0500 Subject: [PATCH 067/149] Gate StandardSite subscribe button custom theme on AAA contrast (#10735) Co-authored-by: Claude Opus 4.8 --- src/alf/index.tsx | 8 +- src/alf/util/colorGeneration.test.ts | 38 ++++++++- src/alf/util/colorGeneration.ts | 42 ++++++++++ .../Post/Embed/StandardSiteEmbed/index.tsx | 84 ++++++++++++------- 4 files changed, 141 insertions(+), 31 deletions(-) diff --git a/src/alf/index.tsx b/src/alf/index.tsx index 0cb5ceb3f7..a1a2d8adaa 100644 --- a/src/alf/index.tsx +++ b/src/alf/index.tsx @@ -9,7 +9,12 @@ import { setFontScale as persistFontScale, } from '#/alf/fonts' import {themes} from '#/alf/themes' -import {darken, lighten, rgbToHex} from '#/alf/util/colorGeneration' +import { + contrastRatio, + darken, + lighten, + rgbToHex, +} from '#/alf/util/colorGeneration' import {type Device} from '#/storage' export {type TextStyleProp, type Theme, type ViewStyleProp} from '@bsky.app/alf' @@ -26,6 +31,7 @@ export const utils = { rgbToHex, lighten, darken, + contrastRatio, } export type Alf = { diff --git a/src/alf/util/colorGeneration.test.ts b/src/alf/util/colorGeneration.test.ts index c4a2b0bbb5..8d330201e0 100644 --- a/src/alf/util/colorGeneration.test.ts +++ b/src/alf/util/colorGeneration.test.ts @@ -1,4 +1,10 @@ -import {darken, hexToRgb, lighten, rgbToHex} from './colorGeneration' +import { + contrastRatio, + darken, + hexToRgb, + lighten, + rgbToHex, +} from './colorGeneration' describe('hexToRgb', () => { it('parses 6-digit hex', () => { @@ -92,3 +98,33 @@ describe('lighten / darken', () => { expect(darken('#zzz', 10)).toBe('#zzz') }) }) + +describe('contrastRatio', () => { + it('returns 21 for black on white', () => { + expect(contrastRatio('#000000', '#ffffff')).toBeCloseTo(21, 5) + }) + + it('returns 1 for identical colors', () => { + expect(contrastRatio('#abcdef', '#abcdef')).toBeCloseTo(1, 5) + }) + + it('is symmetric regardless of argument order', () => { + expect(contrastRatio('#123456', '#fedcba')).toBeCloseTo( + contrastRatio('#fedcba', '#123456')!, + 5, + ) + }) + + it('clears AAA large text (4.5:1) for a high-contrast pairing', () => { + expect(contrastRatio('#1d3a5f', '#ffffff')!).toBeGreaterThanOrEqual(4.5) + }) + + it('fails AAA large text (4.5:1) for a low-contrast pairing', () => { + expect(contrastRatio('#777777', '#888888')!).toBeLessThan(4.5) + }) + + it('returns null for invalid hex input', () => { + expect(contrastRatio('not-a-color', '#ffffff')).toBeNull() + expect(contrastRatio('#ffffff', '#zzz')).toBeNull() + }) +}) diff --git a/src/alf/util/colorGeneration.ts b/src/alf/util/colorGeneration.ts index 85659af25f..f3be07d502 100644 --- a/src/alf/util/colorGeneration.ts +++ b/src/alf/util/colorGeneration.ts @@ -72,6 +72,48 @@ export function rgbToHex(r: number, g: number, b: number): string { .slice(1)}` } +/** + * Computes the WCAG contrast ratio between two colors, ranging from 1 (no + * contrast) to 21 (maximum contrast, i.e. black on white). Returns null if + * either argument is not a valid hex color. + * + * @see https://www.w3.org/TR/WCAG21/#dfn-contrast-ratio + */ +export function contrastRatio(hexA: string, hexB: string): number | null { + const rgbA = hexToRgb(hexA) + const rgbB = hexToRgb(hexB) + if (!rgbA || !rgbB) return null + const luminanceA = relativeLuminance(rgbA) + const luminanceB = relativeLuminance(rgbB) + const lighter = Math.max(luminanceA, luminanceB) + const darker = Math.min(luminanceA, luminanceB) + return (lighter + 0.05) / (darker + 0.05) +} + +/** + * Computes the WCAG relative luminance of an RGB color, ranging from 0 (black) + * to 1 (white). + * + * @see https://www.w3.org/TR/WCAG21/#dfn-relative-luminance + */ +function relativeLuminance({ + r, + g, + b, +}: { + r: number + g: number + b: number +}): number { + const toLinear = (channel: number) => { + const normalized = channel / 255 + return normalized <= 0.03928 + ? normalized / 12.92 + : ((normalized + 0.055) / 1.055) ** 2.4 + } + return 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b) +} + function rgbToHsl( r: number, g: number, diff --git a/src/components/Post/Embed/StandardSiteEmbed/index.tsx b/src/components/Post/Embed/StandardSiteEmbed/index.tsx index c7b8abf88c..2c38f3806f 100644 --- a/src/components/Post/Embed/StandardSiteEmbed/index.tsx +++ b/src/components/Post/Embed/StandardSiteEmbed/index.tsx @@ -427,6 +427,26 @@ export function SubscribeButton({ ? l`Subscribe on ${highlightedPublisher.name}` : l`View publication` + /* + * The custom site theme paints the button background with `accent` and the + * text with `accentForeground`. Only honor it when that pairing clears WCAG + * AAA (4.5:1) for large text, which the button's bold label qualifies as. + * Otherwise we fall through to the default `secondary_inverted` styling, + * which is guaranteed to be legible. + */ + const {accentRGB, accentForegroundRGB} = view.source?.theme || {} + let useCustomTheme = false + if (accentRGB && accentForegroundRGB) { + const accent = utils.rgbToHex(accentRGB.r, accentRGB.g, accentRGB.b) + const accentForeground = utils.rgbToHex( + accentForegroundRGB.r, + accentForegroundRGB.g, + accentForegroundRGB.b, + ) + const ratio = utils.contrastRatio(accent, accentForeground) + useCustomTheme = ratio !== null && ratio >= 4.5 + } + if (!view.source) return null const publicationTitle = view.source.title @@ -468,36 +488,42 @@ export function SubscribeButton({ } } + const button = ( + + {highlightedPublisher ? ( + <> + + + + {cta} + + ) : ( + <> + {cta} + + + )} + + ) + + if (!useCustomTheme) { + return button + } + return ( - - - {highlightedPublisher ? ( - <> - - - - {cta} - - ) : ( - <> - {cta} - - - )} - - + {button} ) } From 68da7971806182cb99856c21954836b6facff0a9 Mon Sep 17 00:00:00 2001 From: Spence Pope Date: Thu, 4 Jun 2026 22:19:35 -0400 Subject: [PATCH 068/149] Add OTA fallback for gallery embed (#10734) Co-authored-by: Eric Bailey --- .../Post/Embed/GalleryFallbackEmbed.tsx | 99 +++++++++++++++++++ .../screens/Storybook/GalleryFallback.tsx | 25 +++++ src/view/screens/Storybook/Storybook.tsx | 2 + 3 files changed, 126 insertions(+) create mode 100644 src/components/Post/Embed/GalleryFallbackEmbed.tsx create mode 100644 src/view/screens/Storybook/GalleryFallback.tsx diff --git a/src/components/Post/Embed/GalleryFallbackEmbed.tsx b/src/components/Post/Embed/GalleryFallbackEmbed.tsx new file mode 100644 index 0000000000..38d7e4d013 --- /dev/null +++ b/src/components/Post/Embed/GalleryFallbackEmbed.tsx @@ -0,0 +1,99 @@ +import {Linking, View} from 'react-native' +import {plural} from '@lingui/core/macro' +import {Trans, useLingui} from '@lingui/react/macro' + +import {BSKY_DOWNLOAD_URL} from '#/lib/constants' +import {atoms as a, useTheme} from '#/alf' +import {Button, ButtonText} from '#/components/Button' +import {Sparkle_Stroke2_Corner0_Rounded as Sparkle} from '#/components/icons/Sparkle' +import {Text} from '#/components/Typography' +import {IS_NATIVE} from '#/env' + +/** + * OTA-able fallback that ships to native builds which don't yet know how to + * render the new gallery embed (>4 images, Photos v2). Final copy and visual + * treatment pending design from Darrin/Danielle/Alex. + * + * Native-only per APP-2308 - web builds receive the new gallery support in + * the same release that adds it. + */ +export function GalleryFallbackEmbed({count}: {count?: number}) { + const t = useTheme() + const {t: l} = useLingui() + + const bodyStyle = [ + a.text_sm, + a.text_center, + a.leading_snug, + t.atoms.text_contrast_high, + ] + + return ( + + + + Something new is here + + {count ? ( + + + {plural(count, { + one: 'This post has # photo.', + other: 'This post has # photos.', + })} + + {IS_NATIVE ? ( + + {plural(count, { + one: 'Update your app to see it.', + other: 'Update your app to see them all.', + })} + + ) : ( + + {plural(count, { + one: 'Refresh the page to see it.', + other: 'Refresh the page to see them all.', + })} + + )} + + ) : IS_NATIVE ? ( + + Update your app to see it. + + ) : ( + + Refresh the page to see it. + + )} + {IS_NATIVE && ( + + )} + + ) +} diff --git a/src/view/screens/Storybook/GalleryFallback.tsx b/src/view/screens/Storybook/GalleryFallback.tsx new file mode 100644 index 0000000000..7cca087dba --- /dev/null +++ b/src/view/screens/Storybook/GalleryFallback.tsx @@ -0,0 +1,25 @@ +import {View} from 'react-native' + +import {atoms as a} from '#/alf' +import {GalleryFallbackEmbed} from '#/components/Post/Embed/GalleryFallbackEmbed' +import {H1, H3} from '#/components/Typography' + +export function GalleryFallback() { + return ( + +

Gallery fallback (APP-2308)

+ +

No count

+ + +

1 photo

+ + +

5 photos

+ + +

10 photos

+ +
+ ) +} diff --git a/src/view/screens/Storybook/Storybook.tsx b/src/view/screens/Storybook/Storybook.tsx index 8fb85e8e0a..33c31a9ee6 100644 --- a/src/view/screens/Storybook/Storybook.tsx +++ b/src/view/screens/Storybook/Storybook.tsx @@ -16,6 +16,7 @@ import {Breakpoints} from './Breakpoints' import {Buttons} from './Buttons' import {Dialogs} from './Dialogs' import {Forms} from './Forms' +import {GalleryFallback} from './GalleryFallback' import {Icons} from './Icons' import {Links} from './Links' import {Menus} from './Menus' @@ -120,6 +121,7 @@ export default function Storybook() { +
) break } case Step.GENERATE: { const linkEnabled = joinLink?.enabledStatus === 'enabled' const linkHasChanged = linkEnabled && joinLinkRuleKey !== whoCanJoin header = linkEnabled ? l`Update invite link` : l`Generate invite link` content = ( <> Choose who can join this group chat and how. setWhoCanJoin(value)}> {whoCanJoinOptions.map(option => ( {({selected}) => ( )} ))} ) break } case Step.MANAGE: { const linkEnabled = joinLink?.enabledStatus === 'enabled' const linkDisabled = joinLink?.enabledStatus === 'disabled' const joinLinkURI = joinLink?.code ? `https://bsky.app/c/${joinLink.code}` : 'https://bsky.app/' const createdAt = joinLink ? new Date(joinLink.createdAt) : null const currentOption = whoCanJoinOptions.find( o => o.name === (joinLink ? joinLinkToKey(joinLink) : null), ) ?? whoCanJoinOptions[0] const ownerValue = currentOption?.owner ?? whoCanJoinOptions[0].owner const memberValue = currentOption?.member ?? whoCanJoinOptions[0].member header = linkEnabled ? l`Invite link` : l`Invite link disabled` content = ( <> {joinLinkURI} {createdAt ? ( Created{' '} {i18n.date(createdAt, { dateStyle: 'long', timeStyle: 'short', })} ) : null} {linkEnabled ? ( {isOwner ? ( setStep(Step.GENERATE)}> {ownerValue} ) : ( {memberValue} )} ) : null} {linkEnabled ? ( {isOwner ? ( setStep(Step.CONFIRM_DISABLE)}> Disable ) : null} { control.close(() => { openComposer({ text: joinLinkURI, logContext: 'Other', }) }) }}> Post link { void shareUrl(joinLinkURI) }}> Share ) : ( )} ) break } case Step.CONFIRM_DISABLE: { content = ( <> Disable this invite link? Anyone who has it will no longer be able to join or request to join. You can always create a new one. ) break } } if (!isOwner && (!joinLink || joinLink.enabledStatus === 'disabled')) { header = l`Invite link` content = ( <> There is no invite link for this group chat. ) } return ( { setStep(defaultStep) setWhoCanJoin(defaultWhoCanJoin) }}> {header}
} label={l`Group chat invite link dialog`} style={web({maxWidth: 400})}> {content} ) } function joinLinkToKey(joinLink: ChatBskyGroupDefs.JoinLinkView): string { return `${joinLink.joinRule}${joinLink.requireApproval ? ':requireApproval' : ''}` } function keyToJoinLink( key: string, ): Pick { const [joinRule, requireApproval] = key.split(':') return { joinRule, requireApproval: requireApproval === 'requireApproval', } } -#: src/screens/Messages/components/InviteLinkDialog.tsx:179 -msgid "Group chats can only have a maximum of {0}." -msgstr "Group chats can only have a maximum of {0}." +#. placeholder {0}: convo.details.memberLimit +#: src/screens/Messages/components/InviteLinkDialog.tsx:178 +msgid "Group chats can only have a maximum of {0, plural, other {# people}}." +msgstr "Group chats can only have a maximum of {0, plural, other {# people}}." #: src/components/dialogs/SearchablePeopleList.tsx:569 msgid "Group is locked" @@ -5586,7 +5632,7 @@ msgstr "" msgid "Help" msgstr "" -#: src/screens/Onboarding/StepProfile/index.tsx:261 +#: src/screens/Onboarding/StepProfile/index.tsx:262 msgid "Help people know you're not a bot by uploading a picture or creating an avatar." msgstr "" @@ -5759,14 +5805,14 @@ msgstr "" msgid "Hold up! We’re gradually giving access to video, and you’re still waiting in line. Check back soon!" msgstr "" -#: src/screens/Messages/Conversation.tsx:337 +#: src/screens/Messages/Conversation.tsx:362 msgid "Hold your horses! This feature isn't available to you yet. Please check back later." msgstr "Hold your horses! This feature isn't available to you yet. Please check back later." #: src/Navigation.tsx:740 #: src/Navigation.tsx:761 -#: src/view/shell/bottom-bar/BottomBar.tsx:184 -#: src/view/shell/desktop/LeftNav.tsx:666 +#: src/view/shell/bottom-bar/BottomBar.tsx:185 +#: src/view/shell/desktop/LeftNav.tsx:667 #: src/view/shell/Drawer.tsx:443 msgid "Home" msgstr "" @@ -5824,7 +5870,7 @@ msgstr "" msgid "I'm on Bluesky as {0} - come find me! https://bsky.app/download" msgstr "" -#: src/components/Lightbox/Lightbox.web.tsx:242 +#: src/components/Lightbox/Lightbox.web.tsx:246 msgid "If alt text is long, toggles alt text expanded state" msgstr "" @@ -5889,32 +5935,32 @@ msgid "If you're trying to change your handle or email, do so before you deactiv msgstr "" #. Ignore a request to join a chat -#: src/screens/Messages/JoinRequests.tsx:485 +#: src/screens/Messages/JoinRequests.tsx:484 msgctxt "button" msgid "Ignore" msgstr "Ignore" -#: src/screens/Messages/JoinRequests.tsx:479 +#: src/screens/Messages/JoinRequests.tsx:478 msgid "Ignore join request" msgstr "Ignore join request" -#: src/components/images/ImageLayoutGridItem.tsx:93 +#: src/components/images/ImageLayoutGridItem.tsx:96 msgid "Image" msgstr "" #. placeholder {0}: index + 1 -#: src/components/images/Gallery/index.tsx:443 +#: src/components/images/Gallery/index.tsx:451 msgid "Image {0}" msgstr "Image {0}" #. placeholder {0}: index + 1 #. placeholder {1}: imgs.length -#: src/components/Lightbox/Lightbox.web.tsx:257 +#: src/components/Lightbox/Lightbox.web.tsx:261 msgid "Image {0} of {1}" msgstr "" #. placeholder {0}: index + 1 -#: src/components/images/Gallery/index.tsx:428 +#: src/components/images/Gallery/index.tsx:436 msgid "Image {0} of {imageCount}" msgstr "Image {0} of {imageCount}" @@ -5944,12 +5990,12 @@ msgid "Image is unavailable." msgstr "Image is unavailable." #: src/components/Lightbox/chrome/ImageMenu.tsx:73 -#: src/components/Lightbox/Lightbox.web.tsx:261 -#: src/components/Lightbox/Lightbox.web.tsx:269 +#: src/components/Lightbox/Lightbox.web.tsx:265 +#: src/components/Lightbox/Lightbox.web.tsx:273 msgid "Image options" msgstr "Image options" -#: src/components/Lightbox/Lightbox.web.tsx:312 +#: src/components/Lightbox/Lightbox.web.tsx:316 #: src/lib/media/save-image.ios.ts:25 #: src/lib/media/save-image.ts:29 msgid "Image saved" @@ -6075,7 +6121,7 @@ msgstr "" msgid "Invalid 2FA confirmation code." msgstr "" -#: src/components/intents/GroupChatJoinDialog.tsx:126 +#: src/components/intents/GroupChatJoinDialog.tsx:127 msgid "Invalid group chat code." msgstr "Invalid group chat code." @@ -6097,7 +6143,7 @@ msgstr "" msgid "Invalid report subject" msgstr "" -#: src/components/intents/GroupChatJoinDialog.tsx:157 +#: src/components/intents/GroupChatJoinDialog.tsx:158 msgid "Invalid rescind request." msgstr "Invalid rescind request." @@ -6130,10 +6176,10 @@ msgstr "" msgid "Invite friends <0/>" msgstr "" -#: src/screens/Messages/components/InviteLinkDialog.tsx:167 -#: src/screens/Messages/components/InviteLinkDialog.tsx:309 -#: src/screens/Messages/components/InviteLinkDialog.tsx:315 -#: src/screens/Messages/components/InviteLinkDialog.tsx:482 +#: src/screens/Messages/components/InviteLinkDialog.tsx:166 +#: src/screens/Messages/components/InviteLinkDialog.tsx:304 +#: src/screens/Messages/components/InviteLinkDialog.tsx:310 +#: src/screens/Messages/components/InviteLinkDialog.tsx:477 #: src/screens/Messages/components/MessagesListGroupInfoPanel.tsx:148 #: src/screens/Messages/ConversationSettings/index.tsx:490 msgid "Invite link" @@ -6144,7 +6190,7 @@ msgid "Invite link created" msgstr "Invite link created" #: src/components/dms/getSystemMessageInfo.ts:138 -#: src/screens/Messages/components/InviteLinkDialog.tsx:309 +#: src/screens/Messages/components/InviteLinkDialog.tsx:304 msgid "Invite link disabled" msgstr "Invite link disabled" @@ -6194,7 +6240,7 @@ msgid "It's just you right now! Add more people to your starter pack by searchin msgstr "" #. placeholder {0}: videoState.jobId -#: src/view/com/composer/Composer.tsx:2386 +#: src/view/com/composer/Composer.tsx:2452 msgid "Job ID: {0}" msgstr "" @@ -6203,7 +6249,8 @@ msgstr "" msgid "Jobs" msgstr "" -#: src/components/intents/GroupChatJoinDialog.tsx:253 +#: src/components/dms/ChatInvite/Root.tsx:98 +#: src/components/intents/GroupChatJoinDialog.tsx:254 msgid "Join" msgstr "Join" @@ -6215,11 +6262,11 @@ msgid "Join Bluesky" msgstr "" #: src/components/intents/GroupChatJoinDialog.tsx:63 -#: src/components/intents/GroupChatJoinDialog.tsx:415 +#: src/components/intents/GroupChatJoinDialog.tsx:419 msgid "Join group chat" msgstr "Join group chat" -#: src/components/intents/GroupChatJoinDialog.tsx:146 +#: src/components/intents/GroupChatJoinDialog.tsx:147 msgid "Join request rescinded." msgstr "Join request rescinded." @@ -6228,16 +6275,12 @@ msgstr "Join request rescinded." msgid "Join the conversation" msgstr "" -#: src/components/intents/GroupChatJoinDialog.tsx:420 -msgid "Join this group chat" -msgstr "Join this group chat" - #: src/lib/interests.ts:63 msgid "Journalism" msgstr "" -#: src/view/com/composer/Composer.tsx:1324 -#: src/view/com/composer/Composer.tsx:1334 +#: src/view/com/composer/Composer.tsx:1393 +#: src/view/com/composer/Composer.tsx:1403 #: src/view/com/composer/drafts/DraftsButton.tsx:135 msgid "Keep editing" msgstr "" @@ -6538,7 +6581,7 @@ msgstr "" msgid "Linear" msgstr "" -#: src/components/Lightbox/Lightbox.web.tsx:296 +#: src/components/Lightbox/Lightbox.web.tsx:300 msgid "Link copied to clipboard" msgstr "Link copied to clipboard" @@ -6632,7 +6675,7 @@ msgstr "" #: src/view/screens/Lists.tsx:60 #: src/view/screens/Profile.tsx:233 #: src/view/screens/Profile.tsx:241 -#: src/view/shell/desktop/LeftNav.tsx:721 +#: src/view/shell/desktop/LeftNav.tsx:722 #: src/view/shell/Drawer.tsx:548 msgid "Lists" msgstr "" @@ -6900,7 +6943,7 @@ msgstr "" msgid "Message {displayName}" msgstr "Message {displayName}" -#: src/screens/Messages/components/ChatListItem.tsx:325 +#: src/screens/Messages/components/ChatListItem.tsx:330 msgid "Message deleted" msgstr "" @@ -6909,7 +6952,7 @@ msgctxt "toast" msgid "Message deleted" msgstr "" -#: src/components/dms/MessageItem.tsx:522 +#: src/components/dms/MessageItem.tsx:535 msgid "Message failed to send." msgstr "Message failed to send." @@ -6946,11 +6989,11 @@ msgstr "" msgid "Messages" msgstr "" -#: src/components/dms/MessageItem.tsx:621 +#: src/components/dms/MessageItem.tsx:634 msgid "Messages from this person are hidden while they are blocking you." msgstr "Messages from this person are hidden while they are blocking you." -#: src/components/dms/MessageItem.tsx:616 +#: src/components/dms/MessageItem.tsx:629 msgid "Messages from this person are hidden while you are blocking them." msgstr "Messages from this person are hidden while you are blocking them." @@ -7344,7 +7387,7 @@ msgid "New post" msgstr "" #: src/view/com/feeds/FeedPage.tsx:179 -#: src/view/shell/desktop/LeftNav.tsx:597 +#: src/view/shell/desktop/LeftNav.tsx:598 msgctxt "action" msgid "New post" msgstr "" @@ -7479,7 +7522,7 @@ msgstr "" msgid "No media yet" msgstr "" -#: src/screens/Messages/components/ChatListItem.tsx:311 +#: src/screens/Messages/components/ChatListItem.tsx:316 msgid "No messages yet" msgstr "" @@ -7680,8 +7723,8 @@ msgstr "" #: src/screens/Settings/Settings.tsx:197 #: src/screens/Settings/Settings.tsx:200 #: src/view/screens/Notifications.tsx:128 -#: src/view/shell/bottom-bar/BottomBar.tsx:260 -#: src/view/shell/desktop/LeftNav.tsx:686 +#: src/view/shell/bottom-bar/BottomBar.tsx:261 +#: src/view/shell/desktop/LeftNav.tsx:687 #: src/view/shell/Drawer.tsx:496 msgid "Notifications" msgstr "" @@ -7724,7 +7767,7 @@ msgstr "" #: src/components/BotAccountAlert.tsx:52 #: src/components/BotAccountAlert.tsx:57 #: src/components/dms/InitiateChatFlow.tsx:677 -#: src/components/dms/MessageItem.tsx:628 +#: src/components/dms/MessageItem.tsx:641 #: src/screens/Login/PasswordUpdatedForm.tsx:37 #: src/screens/PostThread/components/ThreadItemAnchor.tsx:661 msgid "Okay" @@ -7757,27 +7800,27 @@ msgstr "One of the selected recipients does not allow group chats." msgid "One of the selected recipients has blocked you and cannot be messaged." msgstr "One of the selected recipients has blocked you and cannot be messaged." -#: src/view/com/composer/Composer.tsx:787 +#: src/view/com/composer/Composer.tsx:853 msgid "One or more GIFs is missing alt text." msgstr "" -#: src/view/com/composer/Composer.tsx:784 +#: src/view/com/composer/Composer.tsx:850 msgid "One or more images is missing alt text." msgstr "" -#: src/view/com/composer/SelectMediaButton.tsx:415 +#: src/view/com/composer/SelectMediaButton.tsx:417 msgid "One or more of your selected files are not supported." msgstr "" -#: src/view/com/composer/SelectMediaButton.tsx:438 +#: src/view/com/composer/SelectMediaButton.tsx:440 msgid "One or more of your selected files are too large. Maximum size is {VIDEO_MAX_SIZE_MB} MB." msgstr "One or more of your selected files are too large. Maximum size is {VIDEO_MAX_SIZE_MB} MB." -#: src/view/com/composer/Composer.tsx:589 +#: src/view/com/composer/Composer.tsx:648 msgid "One or more posts are too long to save as a draft. {MAX_DRAFT_GRAPHEME_LENGTH, plural, one {The maximum number of characters is # character.} other {The maximum number of characters is # characters.}}" msgstr "" -#: src/view/com/composer/Composer.tsx:794 +#: src/view/com/composer/Composer.tsx:860 msgid "One or more videos is missing alt text." msgstr "" @@ -7786,6 +7829,14 @@ msgstr "" msgid "Only {0} can reply." msgstr "" +#. Toast shown when adding images would exceed the post gallery cap; only the first N are kept +#. placeholder {0}: result.accepted.length +#. placeholder {1}: next.length +#. placeholder {2}: next.length +#: src/view/com/composer/Composer.tsx:223 +msgid "Only {0} of {1} {2, plural, one {image} other {images}} added; limit is {MAX_GALLERY_IMAGES}" +msgstr "Only {0} of {1} {2, plural, one {image} other {images}} added; limit is {MAX_GALLERY_IMAGES}" + #: src/screens/Messages/JoinRequests.tsx:196 msgid "Only admins can accept join requests." msgstr "Only admins can accept join requests." @@ -7794,7 +7845,7 @@ msgstr "Only admins can accept join requests." msgid "Only admins can ignore join requests." msgstr "Only admins can ignore join requests." -#: src/components/intents/GroupChatJoinDialog.tsx:124 +#: src/components/intents/GroupChatJoinDialog.tsx:125 msgid "Only followers can join this group chat." msgstr "Only followers can join this group chat." @@ -7813,7 +7864,8 @@ msgstr "" msgid "Only people {0} follows can join." msgstr "Only people {0} follows can join." -#: src/components/intents/GroupChatJoinDialog.tsx:268 +#: src/components/dms/ChatInvite/Root.tsx:113 +#: src/components/intents/GroupChatJoinDialog.tsx:269 msgid "Only people the chat owner follows can join" msgstr "Only people the chat owner follows can join" @@ -7834,7 +7886,7 @@ msgstr "" msgid "Oops!" msgstr "" -#: src/screens/Onboarding/StepProfile/index.tsx:310 +#: src/screens/Onboarding/StepProfile/index.tsx:311 msgid "Open avatar creator" msgstr "" @@ -7842,12 +7894,17 @@ msgstr "" msgid "Open camera" msgstr "" +#: src/components/dms/ChatInvite/Root.tsx:85 +#: src/components/intents/GroupChatJoinDialog.tsx:408 +msgid "Open chat" +msgstr "Open chat" + #: src/screens/Messages/ConversationSettings/MemberMenu.tsx:139 msgid "Open chat member options for {displayName}" msgstr "Open chat member options for {displayName}" -#: src/screens/Messages/components/ChatListItem.tsx:486 -#: src/screens/Messages/components/ChatListItem.tsx:490 +#: src/screens/Messages/components/ChatListItem.tsx:491 +#: src/screens/Messages/components/ChatListItem.tsx:495 msgid "Open conversation options" msgstr "" @@ -7861,7 +7918,7 @@ msgstr "" #: src/screens/Messages/components/MessageComposer.tsx:176 #: src/screens/Messages/components/MessageInput.web.tsx:148 -#: src/view/com/composer/Composer.tsx:2026 +#: src/view/com/composer/Composer.tsx:2092 msgid "Open emoji picker" msgstr "" @@ -7882,7 +7939,7 @@ msgstr "" msgid "Open Germ DM" msgstr "" -#: src/components/intents/GroupChatJoinDialog.tsx:399 +#: src/components/intents/GroupChatJoinDialog.tsx:401 msgid "Open group chat" msgstr "Open group chat" @@ -7943,7 +8000,7 @@ msgstr "" msgid "Open system log" msgstr "" -#: src/components/intents/GroupChatJoinDialog.tsx:400 +#: src/components/intents/GroupChatJoinDialog.tsx:402 msgid "Open this group chat" msgstr "Open this group chat" @@ -7968,7 +8025,7 @@ msgstr "" msgid "Opens alt text dialog" msgstr "" -#: src/view/com/composer/photos/OpenCameraBtn.tsx:71 +#: src/view/com/composer/photos/OpenCameraBtn.tsx:70 msgid "Opens camera on device" msgstr "" @@ -7988,10 +8045,10 @@ msgstr "" msgid "Opens device camera" msgstr "" -#. Accessibility hint for button in composer to add images, a video, or a GIF to a post. Maximum number of images that can be selected is currently 4 but may change. -#: src/view/com/composer/SelectMediaButton.tsx:509 -msgid "Opens device gallery to select up to {MAX_IMAGES, plural, other {# images}}, or a single video or GIF." -msgstr "" +#. Accessibility hint for button in composer to add images, a video, or a GIF to a post. +#: src/view/com/composer/SelectMediaButton.tsx:511 +msgid "Opens device gallery to select up to {MAX_GALLERY_IMAGES, plural, other {# images}}, or a single video or GIF." +msgstr "Opens device gallery to select up to {MAX_GALLERY_IMAGES, plural, other {# images}}, or a single video or GIF." #: src/screens/Messages/JoinRequest.tsx:295 #: src/view/com/auth/SplashScreen.tsx:102 @@ -8005,7 +8062,7 @@ msgstr "" msgid "Opens flow to sign in to your existing Bluesky account" msgstr "" -#: src/components/images/Gallery/index.tsx:444 +#: src/components/images/Gallery/index.tsx:452 msgid "Opens full image" msgstr "Opens full image" @@ -8022,7 +8079,7 @@ msgstr "" msgid "Opens link {0}" msgstr "" -#: src/view/com/util/UserAvatar.tsx:600 +#: src/view/com/util/UserAvatar.tsx:603 msgid "Opens live status dialog" msgstr "" @@ -8051,9 +8108,9 @@ msgstr "" msgid "Opens this draft in the composer" msgstr "" -#: src/components/dms/MessageItem.tsx:229 +#: src/components/dms/MessageItem.tsx:233 #: src/view/com/notifications/NotificationFeedItem.tsx:1019 -#: src/view/com/util/UserAvatar.tsx:618 +#: src/view/com/util/UserAvatar.tsx:621 msgid "Opens this profile" msgstr "" @@ -8197,11 +8254,11 @@ msgstr "" msgid "People" msgstr "" -#: src/screens/Messages/components/InviteLinkDialog.tsx:154 +#: src/screens/Messages/components/InviteLinkDialog.tsx:153 msgid "People {ownerName} follows can join instantly" msgstr "People {ownerName} follows can join instantly" -#: src/screens/Messages/components/InviteLinkDialog.tsx:159 +#: src/screens/Messages/components/InviteLinkDialog.tsx:158 msgid "People {ownerName} follows can request to join" msgstr "People {ownerName} follows can request to join" @@ -8220,11 +8277,11 @@ msgstr "" msgid "People I follow" msgstr "" -#: src/screens/Messages/components/InviteLinkDialog.tsx:153 +#: src/screens/Messages/components/InviteLinkDialog.tsx:152 msgid "People I follow can join instantly" msgstr "People I follow can join instantly" -#: src/screens/Messages/components/InviteLinkDialog.tsx:158 +#: src/screens/Messages/components/InviteLinkDialog.tsx:157 msgid "People I follow can request to join" msgstr "People I follow can request to join" @@ -8512,7 +8569,7 @@ msgstr "" msgid "Porn" msgstr "" -#: src/view/com/composer/Composer.tsx:1675 +#: src/view/com/composer/Composer.tsx:1740 msgctxt "action" msgid "Post" msgstr "" @@ -8532,12 +8589,12 @@ msgstr "" msgid "Post a video" msgstr "" -#: src/view/com/composer/Composer.tsx:1673 +#: src/view/com/composer/Composer.tsx:1738 msgctxt "action" msgid "Post All" msgstr "" -#: src/view/com/composer/Composer.tsx:1333 +#: src/view/com/composer/Composer.tsx:1402 msgid "Post anyway" msgstr "Post anyway" @@ -8558,7 +8615,7 @@ msgctxt "toast" msgid "Post deleted" msgstr "" -#: src/lib/api/index.ts:186 +#: src/lib/api/index.ts:189 msgid "Post failed to upload. Please check your Internet connection and try again." msgstr "" @@ -8593,8 +8650,8 @@ msgstr "" msgid "Post language selection" msgstr "" -#: src/screens/Messages/components/InviteLinkDialog.tsx:371 -#: src/screens/Messages/components/InviteLinkDialog.tsx:383 +#: src/screens/Messages/components/InviteLinkDialog.tsx:366 +#: src/screens/Messages/components/InviteLinkDialog.tsx:378 msgid "Post link" msgstr "Post link" @@ -8710,15 +8767,15 @@ msgstr "" msgid "Privacy violation of a minor" msgstr "" -#: src/view/com/composer/Composer.tsx:2460 +#: src/view/com/composer/Composer.tsx:2526 msgid "Processing GIF..." msgstr "" -#: src/view/com/composer/Composer.tsx:2462 +#: src/view/com/composer/Composer.tsx:2528 msgid "Processing video..." msgstr "" -#: src/lib/api/index.ts:60 +#: src/lib/api/index.ts:62 msgid "Processing..." msgstr "" @@ -8726,8 +8783,8 @@ msgstr "" msgid "profile" msgstr "" -#: src/view/shell/bottom-bar/BottomBar.tsx:303 -#: src/view/shell/desktop/LeftNav.tsx:744 +#: src/view/shell/bottom-bar/BottomBar.tsx:304 +#: src/view/shell/desktop/LeftNav.tsx:745 #: src/view/shell/Drawer.tsx:80 #: src/view/shell/Drawer.tsx:599 msgid "Profile" @@ -8759,22 +8816,22 @@ msgid "Public, sharable lists of users to mute or block in bulk." msgstr "" #. Accessibility label for button to publish a single post -#: src/view/com/composer/Composer.tsx:1659 +#: src/view/com/composer/Composer.tsx:1724 msgid "Publish post" msgstr "" #. Accessibility label for button to publish multiple posts in a thread -#: src/view/com/composer/Composer.tsx:1654 +#: src/view/com/composer/Composer.tsx:1719 msgid "Publish posts" msgstr "" #. Accessibility label for button to publish multiple replies in a thread -#: src/view/com/composer/Composer.tsx:1643 +#: src/view/com/composer/Composer.tsx:1708 msgid "Publish replies" msgstr "" #. Accessibility label for button to publish a single reply -#: src/view/com/composer/Composer.tsx:1648 +#: src/view/com/composer/Composer.tsx:1713 msgid "Publish reply" msgstr "" @@ -8853,11 +8910,11 @@ msgstr "" msgid "Re-attach quote" msgstr "" -#: src/screens/Messages/components/InviteLinkDialog.tsx:401 +#: src/screens/Messages/components/InviteLinkDialog.tsx:396 msgid "Re-enable invite link" msgstr "Re-enable invite link" -#: src/screens/Messages/components/InviteLinkDialog.tsx:408 +#: src/screens/Messages/components/InviteLinkDialog.tsx:403 msgid "Re-enable link" msgstr "Re-enable link" @@ -8961,6 +9018,10 @@ msgstr "" msgid "Reconnect" msgstr "" +#: src/components/Post/Embed/GalleryFallbackEmbed.tsx:80 +msgid "Refresh the page to see it." +msgstr "Refresh the page to see it." + #. Reject a chat request, this opens a menu with options #: src/screens/Messages/components/RequestButtons.tsx:131 msgid "Reject" @@ -9016,17 +9077,17 @@ msgstr "" msgid "Remove all contacts" msgstr "" -#: src/view/com/composer/ExternalEmbedRemoveBtn.tsx:19 +#: src/view/com/composer/ExternalEmbedRemoveBtn.tsx:18 msgid "Remove attachment" msgstr "" -#: src/view/com/util/UserAvatar.tsx:520 #: src/view/com/util/UserAvatar.tsx:523 +#: src/view/com/util/UserAvatar.tsx:526 msgid "Remove Avatar" msgstr "" -#: src/view/com/util/UserBanner.tsx:190 #: src/view/com/util/UserBanner.tsx:193 +#: src/view/com/util/UserBanner.tsx:196 msgid "Remove Banner" msgstr "" @@ -9034,8 +9095,9 @@ msgstr "" msgid "Remove caption file" msgstr "Remove caption file" -#: src/screens/Messages/components/MessageInputEmbed.tsx:192 -#: src/screens/Messages/components/MessageInputEmbed.tsx:248 +#: src/screens/Messages/components/MessageInputEmbed.tsx:234 +#: src/screens/Messages/components/MessageInputEmbed.tsx:289 +#: src/screens/Messages/components/MessageInputEmbed.tsx:355 msgid "Remove embed" msgstr "" @@ -9079,7 +9141,7 @@ msgstr "" msgid "Remove from your feeds?" msgstr "" -#: src/view/com/composer/photos/Gallery.tsx:225 +#: src/view/com/composer/photos/Gallery.tsx:227 msgid "Remove image" msgstr "" @@ -9129,11 +9191,11 @@ msgstr "" msgid "Remove your verification for this account?" msgstr "" -#: src/components/Post/Embed/index.tsx:225 +#: src/components/Post/Embed/index.tsx:244 msgid "Removed by author" msgstr "" -#: src/components/Post/Embed/index.tsx:223 +#: src/components/Post/Embed/index.tsx:242 msgid "Removed by you" msgstr "" @@ -9223,7 +9285,7 @@ msgstr "" msgid "Replies to this post are disabled." msgstr "" -#: src/view/com/composer/Composer.tsx:1671 +#: src/view/com/composer/Composer.tsx:1736 msgctxt "action" msgid "Reply" msgstr "" @@ -9408,14 +9470,10 @@ msgstr "" msgid "Reposts of your reposts" msgstr "" -#: src/components/intents/GroupChatJoinDialog.tsx:414 +#: src/components/intents/GroupChatJoinDialog.tsx:418 msgid "Request access to group chat" msgstr "Request access to group chat" -#: src/components/intents/GroupChatJoinDialog.tsx:419 -msgid "Request access to join this group chat" -msgstr "Request access to join this group chat" - #: src/screens/Messages/JoinRequests.tsx:178 msgid "Request approved." msgstr "Request approved." @@ -9429,10 +9487,15 @@ msgstr "" msgid "Request ignored." msgstr "Request ignored." -#: src/components/intents/GroupChatJoinDialog.tsx:252 +#: src/components/dms/ChatInvite/Root.tsx:98 +#: src/components/intents/GroupChatJoinDialog.tsx:253 msgid "Request to join" msgstr "Request to join" +#: src/components/dms/ChatInvite/Root.tsx:117 +msgid "Requested" +msgstr "Requested" + #. Incoming message requests #: src/screens/Messages/components/InboxRequests.tsx:24 msgid "Requests" @@ -9440,7 +9503,7 @@ msgstr "Requests" #: src/Navigation.tsx:495 #: src/screens/Messages/JoinRequests.tsx:58 -#: src/screens/Messages/JoinRequests.tsx:421 +#: src/screens/Messages/JoinRequests.tsx:420 msgid "Requests to join" msgstr "Requests to join" @@ -9461,7 +9524,7 @@ msgstr "" msgid "Required in your region" msgstr "" -#: src/components/intents/GroupChatJoinDialog.tsx:272 +#: src/components/intents/GroupChatJoinDialog.tsx:273 msgid "Rescind request" msgstr "Rescind request" @@ -9617,28 +9680,28 @@ msgstr "" #: src/screens/SavedFeeds.tsx:124 #: src/screens/SavedFeeds.tsx:311 #: src/screens/SavedFeeds.tsx:315 -#: src/view/com/composer/Composer.tsx:1314 +#: src/view/com/composer/Composer.tsx:1383 #: src/view/com/composer/drafts/DraftsButton.tsx:125 msgid "Save changes" msgstr "" -#: src/view/com/composer/Composer.tsx:1286 +#: src/view/com/composer/Composer.tsx:1355 #: src/view/com/composer/drafts/DraftsButton.tsx:93 msgid "Save changes?" msgstr "" -#: src/view/com/composer/Composer.tsx:1314 +#: src/view/com/composer/Composer.tsx:1383 #: src/view/com/composer/drafts/DraftsButton.tsx:125 msgid "Save draft" msgstr "" -#: src/view/com/composer/Composer.tsx:1288 +#: src/view/com/composer/Composer.tsx:1357 #: src/view/com/composer/drafts/DraftsButton.tsx:95 msgid "Save draft?" msgstr "" #: src/components/Lightbox/chrome/ImageMenu.tsx:99 -#: src/components/MediaPreview.tsx:197 +#: src/components/MediaPreview.tsx:229 #: src/components/Post/Embed/ImageContextMenu.tsx:70 #: src/components/StarterPack/ShareDialog.tsx:144 #: src/components/StarterPack/ShareDialog.tsx:150 @@ -9663,7 +9726,7 @@ msgstr "" msgid "Save to my feeds" msgstr "" -#: src/view/shell/desktop/LeftNav.tsx:731 +#: src/view/shell/desktop/LeftNav.tsx:732 #: src/view/shell/Drawer.tsx:574 msgctxt "link to bookmarks screen" msgid "Saved" @@ -9721,7 +9784,7 @@ msgstr "" #: src/components/forms/SearchInput.tsx:53 #: src/screens/Search/Shell.tsx:362 #: src/screens/Search/Shell.tsx:525 -#: src/view/shell/bottom-bar/BottomBar.tsx:204 +#: src/view/shell/bottom-bar/BottomBar.tsx:205 msgid "Search" msgstr "" @@ -10048,7 +10111,7 @@ msgstr "" msgid "Select your preferred notification channels" msgstr "" -#: src/view/com/composer/SelectMediaButton.tsx:418 +#: src/view/com/composer/SelectMediaButton.tsx:420 msgid "Selecting multiple media types is not supported." msgstr "" @@ -10079,7 +10142,7 @@ msgstr "Send error report" msgid "Send feedback" msgstr "" -#: src/screens/Messages/components/MessageComposer.tsx:284 +#: src/screens/Messages/components/MessageComposer.tsx:288 #: src/screens/Messages/components/MessageInput.web.tsx:225 msgid "Send message" msgstr "" @@ -10157,7 +10220,7 @@ msgstr "" #: src/Navigation.tsx:212 #: src/screens/Settings/Settings.tsx:98 -#: src/view/shell/desktop/LeftNav.tsx:754 +#: src/view/shell/desktop/LeftNav.tsx:755 #: src/view/shell/Drawer.tsx:612 msgid "Settings" msgstr "" @@ -10219,12 +10282,12 @@ msgstr "" msgid "Sexually Suggestive" msgstr "" -#: src/components/MediaPreview.tsx:203 +#: src/components/MediaPreview.tsx:235 #: src/components/Post/Embed/ImageContextMenu.tsx:74 #: src/components/StarterPack/QrCodeDialog.tsx:195 #: src/screens/Hashtag.tsx:130 -#: src/screens/Messages/components/InviteLinkDialog.tsx:387 -#: src/screens/Messages/components/InviteLinkDialog.tsx:394 +#: src/screens/Messages/components/InviteLinkDialog.tsx:382 +#: src/screens/Messages/components/InviteLinkDialog.tsx:389 #: src/screens/StarterPack/StarterPackScreen.tsx:447 #: src/screens/Topic.tsx:90 msgid "Share" @@ -10240,8 +10303,8 @@ msgid "Share author DID" msgstr "" #: src/components/Lightbox/chrome/ImageMenu.tsx:94 -#: src/components/Lightbox/Lightbox.web.tsx:277 -#: src/components/Lightbox/Lightbox.web.tsx:303 +#: src/components/Lightbox/Lightbox.web.tsx:281 +#: src/components/Lightbox/Lightbox.web.tsx:307 msgid "Share image" msgstr "Share image" @@ -10446,10 +10509,10 @@ msgstr "" #: src/view/com/auth/SplashScreen.tsx:124 #: src/view/com/auth/SplashScreen.web.tsx:122 #: src/view/com/auth/SplashScreen.web.tsx:130 -#: src/view/shell/bottom-bar/BottomBar.tsx:342 -#: src/view/shell/bottom-bar/BottomBar.tsx:347 -#: src/view/shell/bottom-bar/BottomBarWeb.tsx:245 +#: src/view/shell/bottom-bar/BottomBar.tsx:343 +#: src/view/shell/bottom-bar/BottomBar.tsx:348 #: src/view/shell/bottom-bar/BottomBarWeb.tsx:250 +#: src/view/shell/bottom-bar/BottomBarWeb.tsx:255 #: src/view/shell/NavSignupCard.tsx:58 #: src/view/shell/NavSignupCard.tsx:63 msgid "Sign in" @@ -10500,9 +10563,9 @@ msgstr "" #: src/screens/SignupQueued.tsx:94 #: src/screens/SignupQueued.tsx:97 #: src/screens/Takendown.tsx:88 -#: src/view/shell/desktop/LeftNav.tsx:226 -#: src/view/shell/desktop/LeftNav.tsx:281 -#: src/view/shell/desktop/LeftNav.tsx:284 +#: src/view/shell/desktop/LeftNav.tsx:227 +#: src/view/shell/desktop/LeftNav.tsx:282 +#: src/view/shell/desktop/LeftNav.tsx:285 msgid "Sign out" msgstr "" @@ -10511,7 +10574,7 @@ msgid "Sign Out" msgstr "" #: src/screens/Settings/Settings.tsx:296 -#: src/view/shell/desktop/LeftNav.tsx:223 +#: src/view/shell/desktop/LeftNav.tsx:224 msgid "Sign out?" msgstr "" @@ -10543,7 +10606,7 @@ msgstr "" msgid "Skip contact sharing and continue to the app" msgstr "" -#: src/view/com/composer/Composer.tsx:1331 +#: src/view/com/composer/Composer.tsx:1400 msgid "Skip empty posts?" msgstr "Skip empty posts?" @@ -10557,7 +10620,7 @@ msgstr "" msgid "Skip to next step" msgstr "" -#: src/components/images/Gallery/index.tsx:427 +#: src/components/images/Gallery/index.tsx:435 msgid "slide" msgstr "slide" @@ -10614,7 +10677,7 @@ msgid "Someone left the group" msgstr "Someone left the group" #. placeholder {0}: reaction.value -#: src/components/dms/MessageItem.tsx:270 +#: src/components/dms/MessageItem.tsx:274 msgid "Someone reacted {0}" msgstr "" @@ -10639,11 +10702,15 @@ msgstr "Someone was removed" msgid "Someone was removed from the group" msgstr "Someone was removed from the group" +#: src/components/Post/Embed/GalleryFallbackEmbed.tsx:48 +msgid "Something new is here" +msgstr "Something new is here" + #: src/components/moderation/ReportDialog/index.tsx:103 msgid "Something wasn't quite right with the data you're trying to report. Please contact support." msgstr "" -#: src/screens/Messages/Conversation.tsx:135 +#: src/screens/Messages/Conversation.tsx:137 #: src/screens/Messages/ConversationSettings/index.tsx:112 #: src/screens/Messages/JoinRequests.tsx:87 msgid "Something went wrong" @@ -10848,13 +10915,13 @@ msgid "Subscribe" msgstr "" #. placeholder {0}: highlightedPublisher.name -#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:426 -#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:435 +#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:427 +#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:456 msgid "Subscribe on {0}" msgstr "Subscribe on {0}" #. placeholder {0}: highlightedPublisher.name -#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:434 +#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:455 msgid "Subscribe to {publicationTitle} on {0}" msgstr "Subscribe to {publicationTitle} on {0}" @@ -10889,7 +10956,7 @@ msgstr "" msgid "Success!" msgstr "" -#: src/components/intents/GroupChatJoinDialog.tsx:100 +#: src/components/intents/GroupChatJoinDialog.tsx:101 msgid "Successfully joined the group chat!" msgstr "Successfully joined the group chat!" @@ -10950,7 +11017,7 @@ msgstr "Suspended accounts cannot participate in chat." #: src/screens/Settings/Settings.tsx:122 #: src/screens/Settings/Settings.tsx:134 #: src/screens/Settings/Settings.tsx:615 -#: src/view/shell/desktop/LeftNav.tsx:261 +#: src/view/shell/desktop/LeftNav.tsx:262 msgid "Switch account" msgstr "" @@ -10959,7 +11026,7 @@ msgid "Switch accounts" msgstr "" #. placeholder {0}: sanitizeHandle( profile?.handle ?? account.handle, '@', ) -#: src/view/shell/desktop/LeftNav.tsx:363 +#: src/view/shell/desktop/LeftNav.tsx:364 msgid "Switch to {0}" msgstr "" @@ -10985,7 +11052,7 @@ msgstr "" msgid "Tap below to allow Bluesky to access your GPS location. We will then use that data to more accurately determine the content and features available in your region." msgstr "" -#: src/components/dms/MessageItem.tsx:567 +#: src/components/dms/MessageItem.tsx:580 msgid "Tap for details" msgstr "Tap for details" @@ -11011,10 +11078,23 @@ msgstr "" msgid "Tap to close context menu" msgstr "" +#: src/components/dms/ChatInvite/Root.tsx:73 +msgid "Tap to copy this invite link" +msgstr "Tap to copy this invite link" + #: src/components/ProgressGuide/Toast.tsx:163 msgid "Tap to dismiss" msgstr "" +#: src/components/dms/ChatInvite/Root.tsx:126 +#: src/components/intents/GroupChatJoinDialog.tsx:424 +msgid "Tap to join this group chat immediately" +msgstr "Tap to join this group chat immediately" + +#: src/components/dms/ChatInvite/Root.tsx:86 +msgid "Tap to open this group chat" +msgstr "Tap to open this group chat" + #: src/components/dms/ReactionsDialog.tsx:196 msgid "Tap to remove" msgstr "Tap to remove" @@ -11024,7 +11104,12 @@ msgstr "Tap to remove" msgid "Tap to remove your {0} reaction" msgstr "Tap to remove your {0} reaction" -#: src/components/dms/MessageItem.tsx:532 +#: src/components/dms/ChatInvite/Root.tsx:125 +#: src/components/intents/GroupChatJoinDialog.tsx:423 +msgid "Tap to request access to join this group chat" +msgstr "Tap to request access to join this group chat" + +#: src/components/dms/MessageItem.tsx:545 msgid "Tap to retry" msgstr "Tap to retry" @@ -11037,7 +11122,7 @@ msgstr "Tap to show {0} reactions" msgid "Tap to show all reactions" msgstr "Tap to show all reactions" -#: src/components/dms/MessageItem.tsx:293 +#: src/components/dms/MessageItem.tsx:297 msgid "Tap to view reactions" msgstr "Tap to view reactions" @@ -11206,7 +11291,7 @@ msgstr "" msgid "The laws in your region require you to verify you're an adult to access certain features. Tap to learn more." msgstr "" -#: src/components/intents/GroupChatJoinDialog.tsx:134 +#: src/components/intents/GroupChatJoinDialog.tsx:135 #: src/screens/Messages/JoinRequests.tsx:201 msgid "The member limit has been reached." msgstr "The member limit has been reached." @@ -11263,7 +11348,7 @@ msgstr "" msgid "There is a limit to how often you can change your birthdate. You may need to wait a day or two before updating it again." msgstr "" -#: src/screens/Messages/components/InviteLinkDialog.tsx:487 +#: src/screens/Messages/components/InviteLinkDialog.tsx:482 msgid "There is no invite link for this group chat." msgstr "There is no invite link for this group chat." @@ -11277,8 +11362,8 @@ msgid "There was a problem loading GIFs. Check your connection and try again." msgstr "There was a problem loading GIFs. Check your connection and try again." #: src/components/contacts/screens/GetContacts.tsx:147 -#: src/components/intents/GroupChatJoinDialog.tsx:118 -#: src/components/intents/GroupChatJoinDialog.tsx:152 +#: src/components/intents/GroupChatJoinDialog.tsx:119 +#: src/components/intents/GroupChatJoinDialog.tsx:153 msgid "There was a problem with your internet connection, please try again" msgstr "" @@ -11435,11 +11520,12 @@ msgstr "" msgid "This chat has ended" msgstr "This chat has ended" -#: src/components/intents/GroupChatJoinDialog.tsx:263 +#: src/components/dms/ChatInvite/Root.tsx:108 +#: src/components/intents/GroupChatJoinDialog.tsx:264 msgid "This chat is full" msgstr "This chat is full" -#: src/screens/Messages/components/ChatListItem.tsx:375 +#: src/screens/Messages/components/ChatListItem.tsx:380 #: src/screens/Messages/components/ChatLocked.tsx:61 msgid "This chat is locked" msgstr "This chat is locked" @@ -11478,11 +11564,11 @@ msgstr "" msgid "This content is not viewable without a Bluesky account." msgstr "" -#: src/components/intents/GroupChatJoinDialog.tsx:120 +#: src/components/intents/GroupChatJoinDialog.tsx:121 msgid "This conversation is locked." msgstr "This conversation is locked." -#: src/screens/Messages/components/ChatListItem.tsx:155 +#: src/screens/Messages/components/ChatListItem.tsx:156 msgid "This conversation is with a deleted or a deactivated account. Press for options" msgstr "" @@ -11532,7 +11618,7 @@ msgstr "" msgid "This handle is reserved. Please try a different one." msgstr "" -#: src/screens/Onboarding/StepProfile/index.tsx:141 +#: src/screens/Onboarding/StepProfile/index.tsx:142 msgid "This image could not be used. Try a different format like .jpg or .png." msgstr "This image could not be used. Try a different format like .jpg or .png." @@ -11540,7 +11626,7 @@ msgstr "This image could not be used. Try a different format like .jpg or .png." msgid "This information is private and not shared with other users." msgstr "" -#: src/components/intents/GroupChatJoinDialog.tsx:130 +#: src/components/intents/GroupChatJoinDialog.tsx:131 msgid "This invite link has been disabled." msgstr "This invite link has been disabled." @@ -11548,7 +11634,7 @@ msgstr "This invite link has been disabled." msgid "This invite link has expired" msgstr "This invite link has expired" -#: src/components/intents/GroupChatJoinDialog.tsx:194 +#: src/components/intents/GroupChatJoinDialog.tsx:195 msgid "This invite link is invalid" msgstr "This invite link is invalid" @@ -11594,13 +11680,13 @@ msgstr "" msgid "This list is empty." msgstr "" -#: src/components/dms/MessageItem.tsx:565 -#: src/components/dms/MessageItem.tsx:594 +#: src/components/dms/MessageItem.tsx:578 +#: src/components/dms/MessageItem.tsx:607 msgid "This message is hidden because this user is blocking you." msgstr "This message is hidden because this user is blocking you." -#: src/components/dms/MessageItem.tsx:564 -#: src/components/dms/MessageItem.tsx:590 +#: src/components/dms/MessageItem.tsx:577 +#: src/components/dms/MessageItem.tsx:603 msgid "This message is hidden because you are blocking this user." msgstr "This message is hidden because you are blocking this user." @@ -11638,7 +11724,7 @@ msgstr "" msgid "This post will be hidden from feeds and threads. This cannot be undone." msgstr "" -#: src/view/com/composer/Composer.tsx:945 +#: src/view/com/composer/Composer.tsx:1013 msgid "This post's author has disabled quote posts." msgstr "" @@ -11980,7 +12066,7 @@ msgstr "" msgid "Unavailable feed information" msgstr "" -#: src/components/dms/MessageItem.tsx:632 +#: src/components/dms/MessageItem.tsx:645 #: src/components/dms/MessagesListBlockedFooter.tsx:97 #: src/components/dms/MessagesListBlockedFooter.tsx:104 #: src/screens/Messages/ConversationSettings/MemberMenu.tsx:222 @@ -12219,11 +12305,11 @@ msgstr "" msgid "Unsubscribed from list" msgstr "" -#: src/view/com/composer/text-input/TextInput.tsx:131 +#: src/view/com/composer/text-input/TextInput.tsx:128 msgid "Unsupported clipboard content" msgstr "Unsupported clipboard content" -#: src/view/com/composer/Composer.tsx:1424 +#: src/view/com/composer/Composer.tsx:1489 msgid "Unsupported video type: {mimeType}" msgstr "" @@ -12236,6 +12322,10 @@ msgstr "" msgid "Update <0>{displayName} in Lists" msgstr "" +#: src/components/Post/Embed/GalleryFallbackEmbed.tsx:93 +msgid "Update app" +msgstr "Update app" + #: src/components/dialogs/EmailDialog/screens/Update.tsx:296 #: src/components/dialogs/EmailDialog/screens/Update.tsx:308 #: src/screens/Settings/AccountSettings.tsx:112 @@ -12243,9 +12333,9 @@ msgstr "" msgid "Update email" msgstr "" -#: src/screens/Messages/components/InviteLinkDialog.tsx:217 -#: src/screens/Messages/components/InviteLinkDialog.tsx:255 -#: src/screens/Messages/components/InviteLinkDialog.tsx:283 +#: src/screens/Messages/components/InviteLinkDialog.tsx:212 +#: src/screens/Messages/components/InviteLinkDialog.tsx:250 +#: src/screens/Messages/components/InviteLinkDialog.tsx:278 msgid "Update invite link" msgstr "Update invite link" @@ -12254,7 +12344,15 @@ msgstr "Update invite link" msgid "Update to {domain}" msgstr "" -#: src/screens/Messages/Conversation.tsx:335 +#: src/components/Post/Embed/GalleryFallbackEmbed.tsx:85 +msgid "Update your app" +msgstr "Update your app" + +#: src/components/Post/Embed/GalleryFallbackEmbed.tsx:76 +msgid "Update your app to see it." +msgstr "Update your app to see it." + +#: src/screens/Messages/Conversation.tsx:360 msgid "Update your app to the latest version to join in!" msgstr "Update your app to the latest version to join in!" @@ -12279,7 +12377,7 @@ msgctxt "toast" msgid "Updating reply visibility failed" msgstr "" -#: src/screens/Onboarding/StepProfile/index.tsx:314 +#: src/screens/Onboarding/StepProfile/index.tsx:315 msgid "Upload a photo instead" msgstr "" @@ -12287,39 +12385,40 @@ msgstr "" msgid "Upload a text file to:" msgstr "" -#: src/view/com/util/UserAvatar.tsx:491 #: src/view/com/util/UserAvatar.tsx:494 -#: src/view/com/util/UserBanner.tsx:161 +#: src/view/com/util/UserAvatar.tsx:497 #: src/view/com/util/UserBanner.tsx:164 +#: src/view/com/util/UserBanner.tsx:167 msgid "Upload from Camera" msgstr "" -#: src/view/com/util/UserAvatar.tsx:508 -#: src/view/com/util/UserBanner.tsx:178 +#: src/view/com/util/UserAvatar.tsx:511 +#: src/view/com/util/UserBanner.tsx:181 msgid "Upload from Files" msgstr "" -#: src/view/com/util/UserAvatar.tsx:502 -#: src/view/com/util/UserAvatar.tsx:506 -#: src/view/com/util/UserBanner.tsx:172 -#: src/view/com/util/UserBanner.tsx:176 +#: src/view/com/util/UserAvatar.tsx:505 +#: src/view/com/util/UserAvatar.tsx:509 +#: src/view/com/util/UserBanner.tsx:175 +#: src/view/com/util/UserBanner.tsx:179 msgid "Upload from Library" msgstr "" -#: src/view/com/composer/Composer.tsx:2453 +#: src/view/com/composer/Composer.tsx:2519 msgid "Uploading GIF..." msgstr "" -#: src/lib/api/index.ts:322 +#: src/lib/api/index.ts:327 +#: src/lib/api/index.ts:354 msgid "Uploading images..." msgstr "" -#: src/lib/api/index.ts:390 -#: src/lib/api/index.ts:414 +#: src/lib/api/index.ts:426 +#: src/lib/api/index.ts:450 msgid "Uploading link thumbnail..." msgstr "" -#: src/view/com/composer/Composer.tsx:2455 +#: src/view/com/composer/Composer.tsx:2521 msgid "Uploading video..." msgstr "" @@ -12608,7 +12707,7 @@ msgstr "" msgid "Video settings" msgstr "" -#: src/view/com/composer/Composer.tsx:2473 +#: src/view/com/composer/Composer.tsx:2539 msgid "Video uploaded" msgstr "" @@ -12621,18 +12720,18 @@ msgstr "" msgid "Videos" msgstr "" -#: src/view/com/composer/SelectMediaButton.tsx:432 +#: src/view/com/composer/SelectMediaButton.tsx:434 msgid "Videos must be less than 3 minutes long." msgstr "" -#: src/view/com/composer/Composer.tsx:1037 +#: src/view/com/composer/Composer.tsx:1106 msgctxt "Action to view the post the user just created" msgid "View" msgstr "" #. placeholder {0}: view.source.title #: src/components/Post/Embed/StandardSiteEmbed/index.tsx:320 -#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:589 +#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:616 msgid "View {0}" msgstr "View {0}" @@ -12661,7 +12760,7 @@ msgstr "View {0}’s profile" msgid "View {displayName}’s profile" msgstr "View {displayName}’s profile" -#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:437 +#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:458 msgid "View {publicationTitle}" msgstr "View {publicationTitle}" @@ -12696,6 +12795,14 @@ msgstr "" msgid "View incoming group chat requests" msgstr "View incoming group chat requests" +#: src/screens/Messages/components/RequestStatus.tsx:54 +msgid "View incoming requests" +msgstr "View incoming requests" + +#: src/screens/Messages/components/RequestStatus.tsx:55 +msgid "View incoming requests to join this group chat" +msgstr "View incoming requests to join this group chat" + #: src/components/moderation/LabelsOnMe.tsx:56 msgid "View information about these labels" msgstr "" @@ -12711,7 +12818,7 @@ msgstr "" msgid "View more trending videos" msgstr "" -#: src/view/com/composer/Composer.tsx:1032 +#: src/view/com/composer/Composer.tsx:1101 msgid "View post" msgstr "" @@ -12729,9 +12836,9 @@ msgid "View profile banner" msgstr "View profile banner" #: src/components/Post/Embed/StandardSiteEmbed/index.tsx:320 -#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:427 -#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:438 -#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:589 +#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:428 +#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:459 +#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:616 msgid "View publication" msgstr "View publication" @@ -12854,7 +12961,7 @@ msgstr "" msgid "We couldn't find any results for that topic." msgstr "" -#: src/screens/Messages/Conversation.tsx:136 +#: src/screens/Messages/Conversation.tsx:138 msgid "We couldn't load this conversation" msgstr "" @@ -13007,7 +13114,7 @@ msgstr "We’re sorry, but your search could not be completed. Please try again msgid "We're sorry, you cannot access this screen at this time." msgstr "" -#: src/view/com/composer/Composer.tsx:943 +#: src/view/com/composer/Composer.tsx:1011 msgid "We're sorry! The post you are replying to has been deleted." msgstr "" @@ -13058,7 +13165,7 @@ msgid "What do you want to call your starter pack?" msgstr "" #: src/view/com/auth/SplashScreen.web.tsx:98 -#: src/view/com/composer/Composer.tsx:1384 +#: src/view/com/composer/Composer.tsx:1453 #: src/view/com/feeds/ComposerPrompt.tsx:193 msgid "What's up?" msgstr "" @@ -13071,7 +13178,7 @@ msgstr "" msgid "Who can interact with this post?" msgstr "" -#: src/screens/Messages/components/InviteLinkDialog.tsx:227 +#: src/screens/Messages/components/InviteLinkDialog.tsx:222 msgid "Who can join this group chat and how" msgstr "Who can join this group chat and how" @@ -13144,7 +13251,7 @@ msgstr "Would you like to block this user and/or leave this conversation?" msgid "Would you like to save this as a draft before viewing your drafts?" msgstr "" -#: src/view/com/composer/Composer.tsx:1302 +#: src/view/com/composer/Composer.tsx:1371 msgid "Would you like to save this as a draft to edit later?" msgstr "" @@ -13153,12 +13260,12 @@ msgstr "" msgid "Write a post" msgstr "" -#: src/view/com/composer/Composer.tsx:1484 +#: src/view/com/composer/Composer.tsx:1549 msgid "Write post" msgstr "" #: src/screens/PostThread/components/ThreadComposePrompt.tsx:91 -#: src/view/com/composer/Composer.tsx:1382 +#: src/view/com/composer/Composer.tsx:1451 msgid "Write your reply" msgstr "" @@ -13224,7 +13331,7 @@ msgid "You are accessing Bluesky from a region that legally requires us to verif msgstr "" #. placeholder {0}: sanitizeHandle(profile.handle, '@') -#: src/components/dms/MessageItem.tsx:605 +#: src/components/dms/MessageItem.tsx:618 msgid "You are blocking {0}" msgstr "You are blocking {0}" @@ -13325,7 +13432,12 @@ msgstr "" msgid "You can now sign in with your new password." msgstr "" -#: src/view/com/composer/Composer.tsx:1307 +#. Toast shown when the user tries to add more images but the post gallery is already at the cap +#: src/view/com/composer/Composer.tsx:212 +msgid "You can only add up to {MAX_GALLERY_IMAGES} images per post" +msgstr "You can only add up to {MAX_GALLERY_IMAGES} images per post" + +#: src/view/com/composer/Composer.tsx:1376 msgid "You can only save drafts up to 1000 characters." msgstr "" @@ -13333,11 +13445,11 @@ msgstr "" msgid "You can only save drafts up to 1000 characters. Would you like to discard this post before viewing your drafts?" msgstr "" -#: src/view/com/composer/SelectMediaButton.tsx:435 +#: src/view/com/composer/SelectMediaButton.tsx:437 msgid "You can only select one GIF at a time." msgstr "" -#: src/view/com/composer/SelectMediaButton.tsx:429 +#: src/view/com/composer/SelectMediaButton.tsx:431 msgid "You can only select one video at a time." msgstr "" @@ -13349,10 +13461,10 @@ msgstr "" msgid "You can read chat history but can’t send new messages." msgstr "You can read chat history but can’t send new messages." -#. Error message for maximum number of images that can be selected to add to a post, currently 4 but may change. -#: src/view/com/composer/SelectMediaButton.tsx:421 -msgid "You can select up to {MAX_IMAGES, plural, other {# images}} in total." -msgstr "" +#. Error message for maximum number of images that can be selected to add to a post. +#: src/view/com/composer/SelectMediaButton.tsx:423 +msgid "You can select up to {MAX_GALLERY_IMAGES, plural, other {# images}} in total." +msgstr "You can select up to {MAX_GALLERY_IMAGES, plural, other {# images}} in total." #: src/components/interstitials/Trending.tsx:132 #: src/components/interstitials/TrendingVideos.tsx:138 @@ -13391,9 +13503,9 @@ msgstr "" msgid "You got here first" msgstr "" -#: src/components/intents/GroupChatJoinDialog.tsx:136 -msgid "You have been removed from this group." -msgstr "You have been removed from this group." +#: src/components/intents/GroupChatJoinDialog.tsx:137 +msgid "You have been previously removed from this group and can’t join it using this link." +msgstr "You have been previously removed from this group and can’t join it using this link." #: src/components/moderation/ModerationDetailsDialog.tsx:77 #: src/lib/moderation/useModerationCauseDescription.ts:58 @@ -13464,7 +13576,7 @@ msgstr "" msgid "You have temporarily reached the limit for video uploads. Please try again later." msgstr "" -#: src/view/com/composer/Composer.tsx:1297 +#: src/view/com/composer/Composer.tsx:1366 msgid "You have unsaved changes to this draft, would you like to save them?" msgstr "" @@ -13534,7 +13646,7 @@ msgstr "" msgid "You must grant access to your photo library to save a QR code" msgstr "" -#: src/view/com/composer/SelectMediaButton.tsx:464 +#: src/view/com/composer/SelectMediaButton.tsx:466 msgid "You need to allow access to your media library." msgstr "" @@ -13552,7 +13664,7 @@ msgid "You probably want to restart the app now." msgstr "" #. placeholder {0}: reaction.value -#: src/components/dms/MessageItem.tsx:263 +#: src/components/dms/MessageItem.tsx:267 msgid "You reacted {0}" msgstr "" @@ -13567,7 +13679,7 @@ msgid "You recently changed your birthdate" msgstr "" #: src/screens/Settings/Settings.tsx:297 -#: src/view/shell/desktop/LeftNav.tsx:224 +#: src/view/shell/desktop/LeftNav.tsx:225 msgid "You will be signed out of all your accounts." msgstr "" @@ -13661,7 +13773,7 @@ msgstr "" msgid "You've reached the end of your feed! Find some more accounts to follow." msgstr "" -#: src/view/com/composer/Composer.tsx:576 +#: src/view/com/composer/Composer.tsx:635 msgid "You've reached the maximum number of drafts" msgstr "" @@ -13817,7 +13929,7 @@ msgstr "" msgid "Your muted words" msgstr "" -#: src/screens/Messages/components/InviteLinkDialog.tsx:189 +#: src/screens/Messages/components/InviteLinkDialog.tsx:184 msgid "Your name, avatar, the name of the group chat, and the number of members will be visible to everyone." msgstr "Your name, avatar, the name of the group chat, and the number of members will be visible to everyone." @@ -13829,11 +13941,11 @@ msgstr "" msgid "Your password must be at least 8 characters long." msgstr "" -#: src/view/com/composer/Composer.tsx:1028 +#: src/view/com/composer/Composer.tsx:1097 msgid "Your post was sent" msgstr "" -#: src/view/com/composer/Composer.tsx:1025 +#: src/view/com/composer/Composer.tsx:1094 msgid "Your posts were sent" msgstr "" @@ -13854,7 +13966,7 @@ msgstr "" msgid "Your profile, posts, feeds, and lists will no longer be visible to other Bluesky users. You can reactivate your account at any time by logging in." msgstr "" -#: src/view/com/composer/Composer.tsx:1027 +#: src/view/com/composer/Composer.tsx:1096 msgid "Your reply was sent" msgstr "" @@ -13867,7 +13979,7 @@ msgstr "" msgid "Your selected interests help us serve you content you care about." msgstr "" -#: src/view/com/composer/Composer.tsx:1332 +#: src/view/com/composer/Composer.tsx:1401 msgid "Your thread has empty posts that will be skipped. The remaining posts will be published as a thread." msgstr "Your thread has empty posts that will be skipped. The remaining posts will be published as a thread." From d3f073b3d29df83cc288ea6bb4ec0e24e22c87b3 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Fri, 5 Jun 2026 16:35:06 +0300 Subject: [PATCH 070/149] [Chat] Request screen tweaks (#10747) --- src/screens/Messages/Inbox.tsx | 45 ++----------------- .../Messages/components/ChatListItem.tsx | 18 ++++---- 2 files changed, 12 insertions(+), 51 deletions(-) diff --git a/src/screens/Messages/Inbox.tsx b/src/screens/Messages/Inbox.tsx index 55d3b0f4d7..59ca05bdba 100644 --- a/src/screens/Messages/Inbox.tsx +++ b/src/screens/Messages/Inbox.tsx @@ -26,10 +26,9 @@ import {useLeftConvos} from '#/state/queries/messages/leave-conversation' import {useListConvosQuery} from '#/state/queries/messages/list-conversations' import {useUpdateAllRead} from '#/state/queries/messages/update-all-read' import {EmptyState} from '#/view/com/util/EmptyState' -import {FAB} from '#/view/com/util/fab/FAB' import {List} from '#/view/com/util/List' import {ChatListLoadingPlaceholder} from '#/view/com/util/LoadingPlaceholder' -import {atoms as a, useBreakpoints, useTheme, web} from '#/alf' +import {atoms as a, useTheme, web} from '#/alf' import {AgeRestrictedScreen} from '#/components/ageAssurance/AgeRestrictedScreen' import {useAgeAssuranceCopy} from '#/components/ageAssurance/useAgeAssuranceCopy' import {Button, ButtonIcon, ButtonText} from '#/components/Button' @@ -62,8 +61,6 @@ export function MessagesInboxScreen(props: Props) { } export function MessagesInboxScreenInner({}: Props) { - const {gtTablet} = useBreakpoints() - const listConvosQuery = useListConvosQuery({status: 'request'}) const {data} = listConvosQuery @@ -94,21 +91,16 @@ export function MessagesInboxScreenInner({}: Props) { - + Chat requests - {hasUnreadConvos && gtTablet ? ( - - ) : ( - - )} + {hasUnreadConvos ? : } ) @@ -117,14 +109,12 @@ export function MessagesInboxScreenInner({}: Props) { function RequestList({ listConvosQuery, conversations, - hasUnreadConvos, }: { listConvosQuery: UseInfiniteQueryResult< InfiniteData, Error > conversations: ChatBskyConvoDefs.ConvoView[] - hasUnreadConvos: boolean }) { const {t: l} = useLingui() const t = useTheme() @@ -285,7 +275,6 @@ function RequestList({ desktopFixedHeight sideBorders={false} /> - {hasUnreadConvos && } ) } @@ -298,34 +287,6 @@ function renderItem({item}: {item: ChatBskyConvoDefs.ConvoView}) { return } -function MarkAllReadFAB() { - const {t: l} = useLingui() - const t = useTheme() - const {mutate: markAllRead} = useUpdateAllRead('request', { - onMutate: () => { - Toast.show(l`Marked all as read`, { - type: 'success', - }) - }, - onError: () => { - Toast.show(l`Failed to mark all requests as read`, { - type: 'error', - }) - }, - }) - - return ( - markAllRead()} - icon={} - accessibilityRole="button" - accessibilityLabel={l`Mark all as read`} - accessibilityHint="" - /> - ) -} - function MarkAsReadHeaderButton() { const {t: l} = useLingui() const {mutate: markAllRead} = useUpdateAllRead('request', { diff --git a/src/screens/Messages/components/ChatListItem.tsx b/src/screens/Messages/components/ChatListItem.tsx index e8c0b9cc68..142ca4a971 100644 --- a/src/screens/Messages/components/ChatListItem.tsx +++ b/src/screens/Messages/components/ChatListItem.tsx @@ -122,7 +122,7 @@ function DirectChatItem({ }) { const {t: l} = useLingui() const profile = useProfileShadow(convo.primaryMember) - const {isWithinSplitView} = useIsWithinSplitView() + const {isWithinLeftPanel} = useIsWithinSplitView() const moderation = useMemo( () => moderateProfile(profile, moderationOpts), @@ -140,7 +140,7 @@ function DirectChatItem({ avatar={ } @@ -161,7 +161,7 @@ function DirectChatItem({ isBlockedAccount={moderation.blocked} showProfileBadges postAlerts={ - isWithinSplitView ? null : ( + isWithinLeftPanel ? null : ( @@ -205,7 +205,7 @@ function GroupChatItem({ avatar={ } @@ -278,7 +278,7 @@ function BaseChatItem({ const leaveConvoControl = useDialogControl() const {mutate: markAsRead} = useMarkAsReadMutation() const {gtMobile} = useBreakpoints() - const {isWithinSplitView} = useIsWithinSplitView() + const {isWithinLeftPanel} = useIsWithinSplitView() const playHaptic = useHaptics() const queryClient = useQueryClient() @@ -458,7 +458,7 @@ function BaseChatItem({ leftFirst: deleteAction, } - const avatarSize = isWithinSplitView ? 48 : 52 + const avatarSize = isWithinLeftPanel ? 48 : 52 return ( @@ -469,7 +469,7 @@ function BaseChatItem({ // @ts-expect-error web only onFocus={onFocus} onBlur={onMouseLeave} - style={[a.relative, t.atoms.bg, isWithinSplitView && a.mx_sm]}> + style={[a.relative, t.atoms.bg, isWithinLeftPanel && a.mx_sm]}> Date: Fri, 5 Jun 2026 16:38:23 +0300 Subject: [PATCH 071/149] [Chat] Fix stale reactions dialog after removing a reaction (#10743) Co-authored-by: Claude Opus 4.8 (1M context) --- src/components/dms/MessageOverlays.tsx | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/components/dms/MessageOverlays.tsx b/src/components/dms/MessageOverlays.tsx index 41228f2899..2384aad88d 100644 --- a/src/components/dms/MessageOverlays.tsx +++ b/src/components/dms/MessageOverlays.tsx @@ -125,6 +125,22 @@ export function MessageOverlays({children}: {children: React.ReactNode}) { [openDeleteMessage, openReportMessage, openReactions], ) + // `reactionsTarget` is a snapshot from when the dialog was opened. Read the + // live message out of the convo items so optimistic reaction changes (e.g. + // "Tap to remove") are reflected in the dialog without closing it first. + const reactionsMessage = useMemo(() => { + if (!reactionsTarget) return null + for (const item of convo.items) { + if ( + (item.type === 'message' || item.type === 'pending-message') && + item.message.id === reactionsTarget.id + ) { + return item.message + } + } + return reactionsTarget + }, [convo.items, reactionsTarget]) + const reportSubject = reportTarget ? ({ view: 'message', @@ -153,11 +169,11 @@ export function MessageOverlays({children}: {children: React.ReactNode}) { onClose={() => setAfterReportTarget(null)} /> )} - {reactionsTarget && ( + {reactionsMessage && ( setReactionsTarget(null)} /> )} From f81bb6f4942f6321837e5987d5c1dac51666eb35 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Fri, 5 Jun 2026 16:38:48 +0300 Subject: [PATCH 072/149] [Chat] Fix navigation stacking on messages links in split view (#10741) Co-authored-by: Claude Opus 4.8 (1M context) --- src/screens/Messages/ChatList.tsx | 8 ++++++++ src/screens/Messages/components/ChatListItem.tsx | 3 +++ src/screens/Messages/components/InboxRequests.tsx | 4 ++++ 3 files changed, 15 insertions(+) diff --git a/src/screens/Messages/ChatList.tsx b/src/screens/Messages/ChatList.tsx index 83c4b0c004..387fcd2bd1 100644 --- a/src/screens/Messages/ChatList.tsx +++ b/src/screens/Messages/ChatList.tsx @@ -451,6 +451,12 @@ export function Header({ const {gtMobile} = useBreakpoints() const requireEmailVerification = useRequireEmailVerification() const leftConvos = useLeftConvos() + const {isWithinSplitView} = useIsWithinSplitView() + + // In split view, the left column (and this header) stays mounted while the + // right column shows the selected route. Pushing would stack duplicate routes + // on repeated clicks, so navigate instead to dedupe by route + params. + const action = isWithinSplitView ? 'navigate' : 'push' const {data: unreadInboxData, hasNextPage: hasMoreRequests} = useListConvosQuery({ @@ -494,9 +500,11 @@ export function Header({ count={inboxAllConvos.length} more={hasMoreRequests} variant="solid" + action={action} /> From 7d4d7642fdcfe684076dbb4d13f48e36ac470071 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Fri, 5 Jun 2026 16:39:23 +0300 Subject: [PATCH 073/149] [Chat] Sync single-convo cache on chat lock firehose events (#10746) Co-authored-by: Claude Opus 4.8 (1M context) --- .../queries/messages/list-conversations.tsx | 63 +++++-------------- 1 file changed, 15 insertions(+), 48 deletions(-) diff --git a/src/state/queries/messages/list-conversations.tsx b/src/state/queries/messages/list-conversations.tsx index f026e57d33..dadf30bcdf 100644 --- a/src/state/queries/messages/list-conversations.tsx +++ b/src/state/queries/messages/list-conversations.tsx @@ -418,67 +418,34 @@ export function ListConvosProviderInner({ })), ) } else if (ChatBskyConvoDefs.isLogLockConvo(log)) { - queryClient.setQueriesData( - {queryKey: [RQKEY_ROOT]}, - (old?: ConvoListQueryData) => - optimisticUpdate(log.convoId, old, convo => { - if (ChatBskyConvoDefs.isGroupConvo(convo.kind)) { - return { - ...convo, - kind: { - ...convo.kind, - lockStatus: 'locked', - }, - rev: log.rev, - } - } - return { + mutateConvoView(log.convoId, convo => + ChatBskyConvoDefs.isGroupConvo(convo.kind) + ? { ...convo, + kind: {...convo.kind, lockStatus: 'locked'}, rev: log.rev, } - }), + : {...convo, rev: log.rev}, ) } else if (ChatBskyConvoDefs.isLogUnlockConvo(log)) { - queryClient.setQueriesData( - {queryKey: [RQKEY_ROOT]}, - (old?: ConvoListQueryData) => - optimisticUpdate(log.convoId, old, convo => { - if (ChatBskyConvoDefs.isGroupConvo(convo.kind)) { - return { - ...convo, - kind: { - ...convo.kind, - lockStatus: 'unlocked', - }, - rev: log.rev, - } - } - return { + mutateConvoView(log.convoId, convo => + ChatBskyConvoDefs.isGroupConvo(convo.kind) + ? { ...convo, + kind: {...convo.kind, lockStatus: 'unlocked'}, rev: log.rev, } - }), + : {...convo, rev: log.rev}, ) } else if (ChatBskyConvoDefs.isLogLockConvoPermanently(log)) { - queryClient.setQueriesData( - {queryKey: [RQKEY_ROOT]}, - (old?: ConvoListQueryData) => - optimisticUpdate(log.convoId, old, convo => { - if (ChatBskyConvoDefs.isGroupConvo(convo.kind)) { - return { - ...convo, - kind: { - ...convo.kind, - lockStatus: 'locked-permanently', - }, - rev: log.rev, - } - } - return { + mutateConvoView(log.convoId, convo => + ChatBskyConvoDefs.isGroupConvo(convo.kind) + ? { ...convo, + kind: {...convo.kind, lockStatus: 'locked-permanently'}, rev: log.rev, } - }), + : {...convo, rev: log.rev}, ) } else if ( ChatBskyConvoDefs.isLogCreateJoinLink(log) || From 67ed59fbcd85809ac135ae32ec3fa970d6a829ee Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Fri, 5 Jun 2026 18:10:14 +0300 Subject: [PATCH 074/149] Align group invite settings with eligibility logic (#10748) Co-authored-by: Claude Opus 4.8 (1M context) --- src/components/dms/util.ts | 16 +++++++++++ src/screens/Messages/Settings.tsx | 6 ++--- .../Messages/components/ChatListItem.tsx | 2 +- .../queries/messages/actor-declaration.ts | 27 +++++++++++++++---- 4 files changed, 41 insertions(+), 10 deletions(-) diff --git a/src/components/dms/util.ts b/src/components/dms/util.ts index 89b9c5b01f..7fe5f91dc3 100644 --- a/src/components/dms/util.ts +++ b/src/components/dms/util.ts @@ -47,6 +47,22 @@ export function canBeAddedToGroup(profile: bsky.profile.AnyProfileView) { } } +/** + * Resolves the effective `allowGroupInvites` value for a chat declaration. + * When unset, group invites follow the general DM preference + * (`allowIncoming`), which itself defaults to `following`. This mirrors the + * `undefined` fallthrough in canBeAddedToGroup, and is the single source of + * truth for both displaying and persisting the setting. + */ +export function resolveAllowGroupInvites( + chat: {allowIncoming?: string; allowGroupInvites?: string} | undefined, +): 'all' | 'none' | 'following' { + return (chat?.allowGroupInvites ?? chat?.allowIncoming ?? 'following') as + | 'all' + | 'none' + | 'following' +} + export function localDateString(date: Date) { // can't use toISOString because it should be in local time const mm = date.getMonth() diff --git a/src/screens/Messages/Settings.tsx b/src/screens/Messages/Settings.tsx index f49311b0da..91d9f879d5 100644 --- a/src/screens/Messages/Settings.tsx +++ b/src/screens/Messages/Settings.tsx @@ -13,6 +13,7 @@ import {AgeRestrictedScreen} from '#/components/ageAssurance/AgeRestrictedScreen import {useAgeAssuranceCopy} from '#/components/ageAssurance/useAgeAssuranceCopy' import * as Dialog from '#/components/Dialog' import {Divider} from '#/components/Divider' +import {resolveAllowGroupInvites} from '#/components/dms/util' import * as Toggle from '#/components/forms/Toggle' import {Bell_Stroke2_Corner0_Rounded as BellIcon} from '#/components/icons/Bell' import {Car_Stroke2_Corner2_Rounded as CarIcon} from '#/components/icons/Car' @@ -199,10 +200,7 @@ export function MessagesSettingsScreenInner({}: Props) { {allowGroupInvitesFromOptions.map(option => ( diff --git a/src/screens/Messages/components/ChatListItem.tsx b/src/screens/Messages/components/ChatListItem.tsx index 1f691290bf..b6d237f17d 100644 --- a/src/screens/Messages/components/ChatListItem.tsx +++ b/src/screens/Messages/components/ChatListItem.tsx @@ -483,7 +483,7 @@ function BaseChatItem({ to={`/messages/${convo.view.id}`} // In split view, this list stays mounted alongside the open convo, // so push would stack duplicate routes on repeated clicks. - action={isWithinSplitView ? 'navigate' : 'push'} + action={isWithinLeftPanel ? 'navigate' : 'push'} label={title} accessibilityHint={accessibilityHint} accessibilityActions={ diff --git a/src/state/queries/messages/actor-declaration.ts b/src/state/queries/messages/actor-declaration.ts index 53b493ab6a..f6cd2d51d5 100644 --- a/src/state/queries/messages/actor-declaration.ts +++ b/src/state/queries/messages/actor-declaration.ts @@ -7,6 +7,7 @@ import {useMutation, useQueryClient} from '@tanstack/react-query' import {logger} from '#/logger' import {useAgent, useSession} from '#/state/session' +import {resolveAllowGroupInvites} from '#/components/dms/util' import {RQKEY as PROFILE_RKEY} from '../profile' export function useUpdateActorDeclaration({ @@ -34,8 +35,12 @@ export function useUpdateActorDeclaration({ update.allowIncoming ?? current?.associated?.chat?.allowIncoming ?? 'following' - const allowGroupInvites = - update.allowGroupInvites ?? current?.associated?.chat?.allowGroupInvites + const allowGroupInvites = resolveAllowGroupInvites({ + allowIncoming, + allowGroupInvites: + update.allowGroupInvites ?? + current?.associated?.chat?.allowGroupInvites, + }) const result = await agent.com.atproto.repo.putRecord({ repo: currentAccount.did, collection: 'chat.bsky.actor.declaration', @@ -43,7 +48,7 @@ export function useUpdateActorDeclaration({ record: { $type: 'chat.bsky.actor.declaration', allowIncoming, - ...(allowGroupInvites && {allowGroupInvites}), + allowGroupInvites, }, }) return result @@ -54,14 +59,26 @@ export function useUpdateActorDeclaration({ PROFILE_RKEY(currentAccount?.did), (old?: AppBskyActorDefs.ProfileViewDetailed) => { if (!old) return old + const allowIncoming = + update.allowIncoming ?? + old.associated?.chat?.allowIncoming ?? + 'following' + // resolve the same concrete value the server will receive, so + // optimistic cache and persisted record stay aligned + const allowGroupInvites = resolveAllowGroupInvites({ + allowIncoming, + allowGroupInvites: + update.allowGroupInvites ?? + old.associated?.chat?.allowGroupInvites, + }) return { ...old, associated: { ...old.associated, chat: { - allowIncoming: 'following', ...old.associated?.chat, - ...update, + allowIncoming, + allowGroupInvites, }, }, } satisfies AppBskyActorDefs.ProfileViewDetailed From f8aae4a192eb81cbe551e0bf10e3f045e114eaee Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Fri, 5 Jun 2026 18:18:27 +0300 Subject: [PATCH 075/149] [Chat] Disable font scaling on fixed-height chat invite cards (#10744) Co-authored-by: Claude Opus 4.8 (1M context) --- src/components/Post/Embed/ChatInviteEmbed.tsx | 2 +- .../Post/Embed/JoinRequestEmbed.tsx | 5 ++- src/components/ProfileBadges.tsx | 12 ++++--- src/components/Typography.tsx | 4 ++- src/components/dms/ChatInvite/Card.tsx | 32 ++++++++++++------- src/components/dms/ChatInvite/Context.tsx | 2 ++ src/components/dms/ChatInvite/JoinButton.tsx | 4 +-- src/components/dms/ChatInvite/Root.tsx | 4 ++- src/components/dms/MessageItemInviteEmbed.tsx | 3 +- .../Messages/components/MessageInputEmbed.tsx | 2 +- 10 files changed, 46 insertions(+), 24 deletions(-) diff --git a/src/components/Post/Embed/ChatInviteEmbed.tsx b/src/components/Post/Embed/ChatInviteEmbed.tsx index f50085426f..387c3cfd9c 100644 --- a/src/components/Post/Embed/ChatInviteEmbed.tsx +++ b/src/components/Post/Embed/ChatInviteEmbed.tsx @@ -23,7 +23,7 @@ export function ChatInviteEmbed({ style?: StyleProp }) { return ( - + ) diff --git a/src/components/Post/Embed/JoinRequestEmbed.tsx b/src/components/Post/Embed/JoinRequestEmbed.tsx index db7ec589bb..e020bb9333 100644 --- a/src/components/Post/Embed/JoinRequestEmbed.tsx +++ b/src/components/Post/Embed/JoinRequestEmbed.tsx @@ -31,7 +31,10 @@ export function JoinRequestEmbed({ if (!resolvedCode) return null return ( - + ) diff --git a/src/components/ProfileBadges.tsx b/src/components/ProfileBadges.tsx index 22c682bbba..cb257e78b6 100644 --- a/src/components/ProfileBadges.tsx +++ b/src/components/ProfileBadges.tsx @@ -31,10 +31,12 @@ export function ProfileBadges({ interactive = false, size, style, + allowFontScaling = true, }: ViewStyleProp & { profile: bsky.profile.AnyProfileView interactive?: boolean size: Size + allowFontScaling?: boolean }) { const shadowed = useProfileShadow(profile) const verification = useSimpleVerificationState({profile}) @@ -48,10 +50,12 @@ export function ProfileBadges({ const isOnTheSmallSide = size === 'xs' || size === 'sm' - const verificationIconWidth = - verificationIconSizes[size] * nativeScaleMultiplier * alfScaleMultiplier - const botIconWidth = - botIconSizes[size] * nativeScaleMultiplier * alfScaleMultiplier + const scaleMultiplier = allowFontScaling + ? nativeScaleMultiplier * alfScaleMultiplier + : 1 + + const verificationIconWidth = verificationIconSizes[size] * scaleMultiplier + const botIconWidth = botIconSizes[size] * scaleMultiplier return ( + numberOfLines={1} + allowFontScaling={!hasFixedHeight}> {preview.name} + numberOfLines={1} + allowFontScaling={!hasFixedHeight}> Group chat + numberOfLines={1} + allowFontScaling={!hasFixedHeight}> {preview.memberCount}/{preview.memberLimit}{' '} + numberOfLines={1} + allowFontScaling={!hasFixedHeight}> - By {ownerDisplayName} + By{' '} + + {ownerDisplayName} + - + + numberOfLines={1} + allowFontScaling={!hasFixedHeight}> {ownerHandle} diff --git a/src/components/dms/ChatInvite/Context.tsx b/src/components/dms/ChatInvite/Context.tsx index 53c7a6cc22..cedcfd8d88 100644 --- a/src/components/dms/ChatInvite/Context.tsx +++ b/src/components/dms/ChatInvite/Context.tsx @@ -32,6 +32,8 @@ export type ChatInviteContextValue = { * preview to act on. */ action: ChatInviteAction | undefined + /** Whether the invite is rendered inside a fixed-height container; when true, text inside disables font scaling so the card doesn't overflow. */ + hasFixedHeight: boolean } const ChatInviteContext = createContext(null) diff --git a/src/components/dms/ChatInvite/JoinButton.tsx b/src/components/dms/ChatInvite/JoinButton.tsx index 0036391b0e..6f3b8c654d 100644 --- a/src/components/dms/ChatInvite/JoinButton.tsx +++ b/src/components/dms/ChatInvite/JoinButton.tsx @@ -17,7 +17,7 @@ export function JoinButton({ onPress?: () => void style?: StyleProp }) { - const {action} = useChatInvite() + const {action, hasFixedHeight} = useChatInvite() if (!action) return null @@ -35,7 +35,7 @@ export function JoinButton({ disabled={action.disabled} style={[a.w_full, style]}> {action.side === 'left' && } - {action.label} + {action.label} {action.side === 'right' && } ) diff --git a/src/components/dms/ChatInvite/Root.tsx b/src/components/dms/ChatInvite/Root.tsx index a9f2c54e3a..a2cfc558ea 100644 --- a/src/components/dms/ChatInvite/Root.tsx +++ b/src/components/dms/ChatInvite/Root.tsx @@ -30,6 +30,7 @@ export function Root({ code, initialPreview, currentConvoId, + hasFixedHeight, children, }: { code: string @@ -40,6 +41,7 @@ export function Root({ * open/join (you're already here). */ currentConvoId?: string + hasFixedHeight: boolean children: React.ReactNode }) { const {hasSession} = useSession() @@ -137,7 +139,7 @@ export function Root({ return ( + value={{code, loading, error: !!error, preview, action, hasFixedHeight}}> {children} ) diff --git a/src/components/dms/MessageItemInviteEmbed.tsx b/src/components/dms/MessageItemInviteEmbed.tsx index 43fd944822..d85e7fd08a 100644 --- a/src/components/dms/MessageItemInviteEmbed.tsx +++ b/src/components/dms/MessageItemInviteEmbed.tsx @@ -74,7 +74,8 @@ let MessageItemInviteEmbed = ({ + currentConvoId={convo.convo.view.id} + hasFixedHeight={false}> diff --git a/src/screens/Messages/components/MessageInputEmbed.tsx b/src/screens/Messages/components/MessageInputEmbed.tsx index a73a6564fb..21503ce8fa 100644 --- a/src/screens/Messages/components/MessageInputEmbed.tsx +++ b/src/screens/Messages/components/MessageInputEmbed.tsx @@ -273,7 +273,7 @@ function MessageInputInviteEmbed({ const {t: l} = useLingui() return ( - + Date: Fri, 5 Jun 2026 12:50:16 -0500 Subject: [PATCH 076/149] Fire embed:standardSite:view from feed viewability, not embed mount (#10736) Co-authored-by: Claude Opus 4.8 --- .../Post/Embed/StandardSiteEmbed/index.tsx | 7 ------- src/view/com/posts/PostFeed.tsx | 13 +++++++++++++ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/components/Post/Embed/StandardSiteEmbed/index.tsx b/src/components/Post/Embed/StandardSiteEmbed/index.tsx index 2c38f3806f..2bee7da91e 100644 --- a/src/components/Post/Embed/StandardSiteEmbed/index.tsx +++ b/src/components/Post/Embed/StandardSiteEmbed/index.tsx @@ -5,7 +5,6 @@ import {plural} from '@lingui/core/macro' import {useLingui} from '@lingui/react/macro' import {useHaptics} from '#/lib/haptics' -import {useCallOnce} from '#/lib/once' import {shareUrl} from '#/lib/sharing' import {niceDate} from '#/lib/strings/time' import {toNiceDomain} from '#/lib/strings/url-helpers' @@ -104,12 +103,6 @@ export const StandardSiteEmbed = ({ } } - useCallOnce(() => { - if (!preview) { - ax.metric('embed:standardSite:view', {url: view.uri}) - } - })() - if (isStandardPublication) { return ( >(new Set()) const seenPostUrisRef = useRef>(new Set()) + const seenStandardSiteUrisRef = useRef>(new Set()) // Helper to calculate position in feed (count only root posts, not interstitials or thread replies) const getPostPosition = useNonReactiveCallback( @@ -974,6 +977,16 @@ let PostFeed = ({ }) } } + + // Standard site embed view tracking + if ( + AppBskyEmbedExternal.isView(post.embed) && + isStandardSiteEmbed(post.embed.external) && + !seenStandardSiteUrisRef.current.has(post.embed.external.uri) + ) { + seenStandardSiteUrisRef.current.add(post.embed.external.uri) + ax.metric('embed:standardSite:view', {url: post.embed.external.uri}) + } } else if (item.type === 'videoGridRow') { // Track each video in the grid row for (let i = 0; i < item.items.length; i++) { From a5aa985b33c92c5b73505fda677a76e04f9186bf Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Fri, 5 Jun 2026 22:48:34 +0300 Subject: [PATCH 077/149] Fix feed scroll reset on device rotation (#10737) --- src/view/com/util/List.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/view/com/util/List.tsx b/src/view/com/util/List.tsx index cde8d50c48..f8a537a657 100644 --- a/src/view/com/util/List.tsx +++ b/src/view/com/util/List.tsx @@ -147,12 +147,10 @@ let List = forwardRef( ) } - let contentOffset if (headerOffset != null) { style = addStyle(style, { paddingTop: headerOffset, }) - contentOffset = {x: 0, y: headerOffset * -1} } return ( @@ -170,7 +168,6 @@ let List = forwardRef( ...props.scrollIndicatorInsets, }} indicatorStyle={t.scheme === 'dark' ? 'white' : 'black'} - contentOffset={contentOffset} refreshControl={refreshControl} onScroll={scrollHandler} scrollsToTop={scrollsToTop} From 6d468c8ca47d9bbace760526c5ed82bac41d511c Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Fri, 5 Jun 2026 22:49:02 +0300 Subject: [PATCH 078/149] [CI] Remove `Wandalen/wretry.action`, call pnpm install directly (#10745) --- .github/workflows/golang-test-lint.yml | 2 ++ .github/workflows/lint.yml | 12 ++---------- .../workflows/nightly-update-source-languages.yaml | 6 +----- .github/workflows/verify-pnpm-lock.yml | 8 ++------ 4 files changed, 7 insertions(+), 21 deletions(-) diff --git a/.github/workflows/golang-test-lint.yml b/.github/workflows/golang-test-lint.yml index 6531694d5c..2e7388bbd5 100644 --- a/.github/workflows/golang-test-lint.yml +++ b/.github/workflows/golang-test-lint.yml @@ -20,6 +20,7 @@ jobs: uses: actions/setup-go@v6 with: go-version-file: bskyweb/go.mod + cache-dependency-path: bskyweb/go.sum - name: Dummy Static Files run: touch bskyweb/static/js/blah.js && touch bskyweb/static/css/blah.txt && touch bskyweb/static/media/blah.txt - name: Check @@ -37,6 +38,7 @@ jobs: uses: actions/setup-go@v6 with: go-version-file: bskyweb/go.mod + cache-dependency-path: bskyweb/go.sum - name: Dummy Static Files run: touch bskyweb/static/js/blah.js && touch bskyweb/static/css/blah.txt && touch bskyweb/static/media/blah.txt - name: Lint diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index aa6c92765d..2fb464a92a 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -57,11 +57,7 @@ jobs: node-version-file: package.json cache: pnpm - name: pnpm install - uses: Wandalen/wretry.action@master - with: - command: pnpm install --frozen-lockfile - attempt_limit: 3 - attempt_delay: 2000 + run: pnpm install --frozen-lockfile - name: Check & compile i18n run: pnpm intl:build - name: Lint checks @@ -99,11 +95,7 @@ jobs: node-version-file: package.json cache: pnpm - name: pnpm install - uses: Wandalen/wretry.action@master - with: - command: pnpm install --frozen-lockfile - attempt_limit: 3 - attempt_delay: 2000 + run: pnpm install --frozen-lockfile - name: Check & compile i18n run: pnpm intl:build - name: Run tests diff --git a/.github/workflows/nightly-update-source-languages.yaml b/.github/workflows/nightly-update-source-languages.yaml index 4b14c65c69..2a6ec26ac4 100644 --- a/.github/workflows/nightly-update-source-languages.yaml +++ b/.github/workflows/nightly-update-source-languages.yaml @@ -26,11 +26,7 @@ jobs: node-version-file: package.json cache: pnpm - name: pnpm install - uses: Wandalen/wretry.action@master - with: - command: pnpm install --frozen-lockfile - attempt_limit: 3 - attempt_delay: 2000 + run: pnpm install --frozen-lockfile - name: Extract language strings run: pnpm intl:extract - name: Create commit diff --git a/.github/workflows/verify-pnpm-lock.yml b/.github/workflows/verify-pnpm-lock.yml index 2d10b11a23..f1b61e95e7 100644 --- a/.github/workflows/verify-pnpm-lock.yml +++ b/.github/workflows/verify-pnpm-lock.yml @@ -34,12 +34,8 @@ jobs: run: git show "origin/$BASE_REF:pnpm-lock.yaml" > pnpm-lock.yaml - name: pnpm install - uses: Wandalen/wretry.action@master - with: - # Fine to skip scripts since we don't run any code - command: pnpm clean && pnpm install --ignore-scripts --no-frozen-lockfile - attempt_limit: 3 - attempt_delay: 2000 + # Fine to skip scripts since we don't run any code + run: pnpm clean && pnpm install --ignore-scripts --no-frozen-lockfile - name: Verify pnpm-lock.yaml run: | From 32c0c0ec838367b5ddd00df97b0102fc36ea6a29 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Fri, 5 Jun 2026 23:08:39 +0300 Subject: [PATCH 079/149] "Follows You" string dedupe (#10751) --- src/components/Pills.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Pills.tsx b/src/components/Pills.tsx index 36bcb3370e..37e940d206 100644 --- a/src/components/Pills.tsx +++ b/src/components/Pills.tsx @@ -172,7 +172,7 @@ export function FollowsYou({size = 'sm'}: CommonProps) { return ( - Follows You + Follows you ) From 2e9bfd363c1f6cf6980361a93c1e4aec8dfa7234 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Fri, 5 Jun 2026 23:09:55 +0300 Subject: [PATCH 080/149] [Chat] Put `pointer_events_none` on chat bubbles in ChatListItem (#10752) --- src/screens/Messages/components/ChatListItem.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/screens/Messages/components/ChatListItem.tsx b/src/screens/Messages/components/ChatListItem.tsx index b6d237f17d..70390606fc 100644 --- a/src/screens/Messages/components/ChatListItem.tsx +++ b/src/screens/Messages/components/ChatListItem.tsx @@ -475,6 +475,7 @@ function BaseChatItem({ a.z_10, a.absolute, {top: tokens.space.md, left: tokens.space.lg}, + isGroupConvo && a.pointer_events_none, ]}> {avatar} From b236f274c3524a0e091a12741b6b3855ae9283ef Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Fri, 5 Jun 2026 23:17:29 +0300 Subject: [PATCH 081/149] [Chat] Enforce limits for group size (#10753) --- .../dialogs/SearchablePeopleList.tsx | 1 - src/components/dms/AddMembersFlow.tsx | 11 ++++ src/components/dms/InitiateChatFlow.tsx | 34 ++++++++++- .../dms/components/GroupChatProfileCard.tsx | 58 +++++++++++-------- src/lib/constants.ts | 2 + .../Messages/ConversationSettings/prompts.tsx | 35 +++++++++-- 6 files changed, 109 insertions(+), 32 deletions(-) diff --git a/src/components/dialogs/SearchablePeopleList.tsx b/src/components/dialogs/SearchablePeopleList.tsx index 614234c17f..cc07900bea 100644 --- a/src/components/dialogs/SearchablePeopleList.tsx +++ b/src/components/dialogs/SearchablePeopleList.tsx @@ -667,7 +667,6 @@ function SearchInput({ /> - + + {groupNameTooLong ? ( + + + Group name is too long. The maximum number of characters + is {MAX_GROUP_NAME_GRAPHEME_LENGTH}. + + + ) : null} ) : ( - - - - - - {enabled ? ( - - ) : ( - - {handle} can’t be added - - )} + {({disabled, selected}) => ( + <> + + + + + + {enabled ? ( + + ) : ( + + {handle} can’t be added + + )} + + - - - {enabled ? : null} + {enabled ? : null} + + )} ) } diff --git a/src/lib/constants.ts b/src/lib/constants.ts index 13ae162a85..91d1319c6b 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -67,6 +67,8 @@ export const MAX_DRAFT_GRAPHEME_LENGTH = 1000 export const MAX_DM_GRAPHEME_LENGTH = 1000 +export const MAX_GROUP_NAME_GRAPHEME_LENGTH = 50 + // Recommended is 100 per: https://www.w3.org/WAI/GL/WCAG20/tests/test3.html // but increasing limit per user feedback export const MAX_ALT_TEXT = 2000 diff --git a/src/screens/Messages/ConversationSettings/prompts.tsx b/src/screens/Messages/ConversationSettings/prompts.tsx index f5b980b990..e8b594c0bd 100644 --- a/src/screens/Messages/ConversationSettings/prompts.tsx +++ b/src/screens/Messages/ConversationSettings/prompts.tsx @@ -1,10 +1,13 @@ import {View} from 'react-native' import {Trans, useLingui} from '@lingui/react/macro' -import {atoms as a} from '#/alf' +import {MAX_GROUP_NAME_GRAPHEME_LENGTH} from '#/lib/constants' +import {isOverMaxGraphemeCount} from '#/lib/strings/helpers' +import {atoms as a, useTheme} from '#/alf' import type * as Dialog from '#/components/Dialog' import * as TextField from '#/components/forms/TextField' import * as Prompt from '#/components/Prompt' +import {Text} from '#/components/Typography' export function EditNamePrompt({ control, @@ -17,8 +20,14 @@ export function EditNamePrompt({ onChangeText: (value: string) => void onConfirm: () => void }) { + const t = useTheme() const {t: l} = useLingui() + const nameTooLong = isOverMaxGraphemeCount({ + text: value, + maxCount: MAX_GROUP_NAME_GRAPHEME_LENGTH, + }) + return ( <> @@ -27,7 +36,7 @@ export function EditNamePrompt({ Edit group name - + + {nameTooLong ? ( + + + Group name is too long. The maximum number of characters is{' '} + {MAX_GROUP_NAME_GRAPHEME_LENGTH}. + + + ) : null} - + From fb8316fd85d2d596266e0e1e7c47fa07823e4f98 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Sat, 6 Jun 2026 00:04:21 +0300 Subject: [PATCH 082/149] Fix external card long press on web (#10739) --- eslint-suppressions.json | 5 -- .../Post/Embed/ExternalEmbed/index.tsx | 20 +++--- .../Post/Embed/StandardSiteEmbed/index.tsx | 66 ++++++++++--------- 3 files changed, 47 insertions(+), 44 deletions(-) diff --git a/eslint-suppressions.json b/eslint-suppressions.json index b8e65eb265..1c4c89f381 100644 --- a/eslint-suppressions.json +++ b/eslint-suppressions.json @@ -261,11 +261,6 @@ "count": 1 } }, - "src/components/Post/Embed/StandardSiteEmbed/index.tsx": { - "@typescript-eslint/no-floating-promises": { - "count": 3 - } - }, "src/components/Post/Embed/VideoEmbed/VideoEmbedInner/VideoEmbedInnerWeb.tsx": { "@typescript-eslint/no-floating-promises": { "count": 2 diff --git a/src/components/Post/Embed/ExternalEmbed/index.tsx b/src/components/Post/Embed/ExternalEmbed/index.tsx index 472c403060..9a4f7e56bc 100644 --- a/src/components/Post/Embed/ExternalEmbed/index.tsx +++ b/src/components/Post/Embed/ExternalEmbed/index.tsx @@ -1,4 +1,4 @@ -import {useCallback, useMemo} from 'react' +import {useMemo} from 'react' import {type StyleProp, View, type ViewStyle} from 'react-native' import {Image} from 'expo-image' import {type AppBskyEmbedExternal} from '@atproto/api' @@ -51,17 +51,19 @@ export const ExternalEmbed = ({ }, [link.uri, externalEmbedPrefs]) const hasMedia = Boolean(imageUri || embedPlayerParams) - const onPress = useCallback(() => { + const onPress = () => { playHaptic('Light') onOpen?.() - }, [playHaptic, onOpen]) + } - const onShareExternal = useCallback(() => { - if (link.uri && IS_NATIVE) { - playHaptic('Heavy') - void shareUrl(link.uri) - } - }, [link.uri, playHaptic]) + const onShareExternal = IS_NATIVE + ? () => { + if (link.uri) { + playHaptic('Heavy') + void shareUrl(link.uri) + } + } + : undefined if ( embedPlayerParams?.source === 'tenor' || diff --git a/src/components/Post/Embed/StandardSiteEmbed/index.tsx b/src/components/Post/Embed/StandardSiteEmbed/index.tsx index 2bee7da91e..b328bc38ff 100644 --- a/src/components/Post/Embed/StandardSiteEmbed/index.tsx +++ b/src/components/Post/Embed/StandardSiteEmbed/index.tsx @@ -79,13 +79,15 @@ export const StandardSiteEmbed = ({ onEmbedInteractionCallback?.() ax.metric('embed:standardSite:article:press', {url: view.uri}) } - const onLongPress = () => { - if (view.uri && IS_NATIVE) { - playHaptic('Heavy') - shareUrl(view.uri) - ax.metric('embed:standardSite:article:longPress', {url: view.uri}) - } - } + const onLongPress = IS_NATIVE + ? () => { + if (view.uri) { + playHaptic('Heavy') + void shareUrl(view.uri) + ax.metric('embed:standardSite:article:longPress', {url: view.uri}) + } + } + : undefined const onPressPublication = () => { playHaptic('Light') onEmbedInteractionCallback?.() @@ -93,15 +95,17 @@ export const StandardSiteEmbed = ({ url: view.source?.uri || '', }) } - const onLongPressPublication = () => { - if (view.source?.uri && IS_NATIVE) { - playHaptic('Heavy') - shareUrl(view.source.uri) - ax.metric('embed:standardSite:publication:longPress', { - url: view.source.uri, - }) - } - } + const onLongPressPublication = IS_NATIVE + ? () => { + if (view.source?.uri) { + playHaptic('Heavy') + void shareUrl(view.source.uri) + ax.metric('embed:standardSite:publication:longPress', { + url: view.source.uri, + }) + } + } + : undefined if (isStandardPublication) { return ( @@ -465,21 +469,23 @@ export function SubscribeButton({ } } - const onLongPress = () => { - if (view.source?.uri && IS_NATIVE) { - playHaptic('Heavy') - shareUrl(view.source.uri) - if (highlightedPublisher) { - ax.metric('embed:standardSite:subscribe:longPress', { - url: view.source?.uri || '', - }) - } else { - ax.metric('embed:standardSite:publicationCta:longPress', { - url: view.source?.uri || '', - }) + const onLongPress = IS_NATIVE + ? () => { + if (view.source?.uri) { + playHaptic('Heavy') + void shareUrl(view.source.uri) + if (highlightedPublisher) { + ax.metric('embed:standardSite:subscribe:longPress', { + url: view.source?.uri || '', + }) + } else { + ax.metric('embed:standardSite:publicationCta:longPress', { + url: view.source?.uri || '', + }) + } + } } - } - } + : undefined const button = ( Date: Sat, 6 Jun 2026 00:13:26 +0300 Subject: [PATCH 083/149] Let specified facets take priority in feed descriptions (#10740) --- eslint-suppressions.json | 3 - .../Profile/components/ProfileFeedHeader.tsx | 74 ++++++++----------- src/state/queries/feed.ts | 28 +++++-- 3 files changed, 50 insertions(+), 55 deletions(-) diff --git a/eslint-suppressions.json b/eslint-suppressions.json index 1c4c89f381..5bd3357d19 100644 --- a/eslint-suppressions.json +++ b/eslint-suppressions.json @@ -1346,9 +1346,6 @@ } }, "src/screens/Profile/components/ProfileFeedHeader.tsx": { - "@typescript-eslint/no-floating-promises": { - "count": 1 - }, "@typescript-eslint/no-misused-promises": { "count": 5 } diff --git a/src/screens/Profile/components/ProfileFeedHeader.tsx b/src/screens/Profile/components/ProfileFeedHeader.tsx index 6966fa6fe2..c640c84f33 100644 --- a/src/screens/Profile/components/ProfileFeedHeader.tsx +++ b/src/screens/Profile/components/ProfileFeedHeader.tsx @@ -1,9 +1,7 @@ import {useCallback, useMemo, useState} from 'react' import {View} from 'react-native' import {AtUri} from '@atproto/api' -import {msg} from '@lingui/core/macro' -import {useLingui} from '@lingui/react' -import {Plural, Trans} from '@lingui/react/macro' +import {Plural, Trans, useLingui} from '@lingui/react/macro' import {useHaptics} from '#/lib/haptics' import {makeCustomFeedLink, makeProfileLink} from '#/lib/routes/links' @@ -26,7 +24,6 @@ import {atoms as a, useBreakpoints, useTheme, web} from '#/alf' import {Button, ButtonIcon, ButtonText} from '#/components/Button' import * as Dialog from '#/components/Dialog' import {Divider} from '#/components/Divider' -import {useRichText} from '#/components/hooks/useRichText' import {ArrowOutOfBoxModified_Stroke2_Corner2_Rounded as Share} from '#/components/icons/ArrowOutOfBox' import {CircleInfo_Stroke2_Corner0_Rounded as CircleInfo} from '#/components/icons/CircleInfo' import {DotGrid3x1_Stroke2_Corner0_Rounded as Ellipsis} from '#/components/icons/DotGrid' @@ -86,7 +83,7 @@ export function ProfileFeedHeaderSkeleton() { export function ProfileFeedHeader({info}: {info: FeedSourceFeedInfo}) { const t = useTheme() - const {_, i18n} = useLingui() + const {t: l, i18n} = useLingui() const ax = useAnalytics() const {hasSession} = useSession() const {gtMobile} = useBreakpoints() @@ -121,7 +118,7 @@ export function ProfileFeedHeader({info}: {info: FeedSourceFeedInfo}) { if (savedFeedConfig) { await removeFeed(savedFeedConfig) - Toast.show(_(msg`Removed from your feeds`)) + Toast.show(l`Removed from your feeds`) ax.metric('feed:unsave', {feedUrl: info.uri}) } else { await addSavedFeeds([ @@ -131,14 +128,12 @@ export function ProfileFeedHeader({info}: {info: FeedSourceFeedInfo}) { pinned: false, }, ]) - Toast.show(_(msg`Saved to your feeds`)) + Toast.show(l`Saved to your feeds`) ax.metric('feed:save', {feedUrl: info.uri}) } } catch (err) { Toast.show( - _( - msg`There was an issue updating your feeds, please check your internet connection and try again.`, - ), + l`There was an issue updating your feeds, please check your internet connection and try again.`, { type: 'error', }, @@ -161,10 +156,10 @@ export function ProfileFeedHeader({info}: {info: FeedSourceFeedInfo}) { ]) if (pinned) { - Toast.show(_(msg`Pinned ${info.displayName} to Home`)) + Toast.show(l`Pinned ${info.displayName} to Home`) ax.metric('feed:pin', {feedUrl: info.uri}) } else { - Toast.show(_(msg`Unpinned ${info.displayName} from Home`)) + Toast.show(l`Unpinned ${info.displayName} from Home`) ax.metric('feed:unpin', {feedUrl: info.uri}) } } else { @@ -175,11 +170,11 @@ export function ProfileFeedHeader({info}: {info: FeedSourceFeedInfo}) { pinned: true, }, ]) - Toast.show(_(msg`Pinned ${info.displayName} to Home`)) + Toast.show(l`Pinned ${info.displayName} to Home`) ax.metric('feed:pin', {feedUrl: info.uri}) } } catch (e) { - Toast.show(_(msg`There was an issue contacting the server`), { + Toast.show(l`There was an issue contacting the server`, { type: 'error', }) logger.error('Failed to toggle pinned feed', {message: e}) @@ -194,7 +189,7 @@ export function ProfileFeedHeader({info}: {info: FeedSourceFeedInfo}) { - - - + {typeof likeCount === 'number' && ( control.close()}> @@ -502,13 +489,12 @@ function DialogInner({ )} - {hasSession && ( <> )} - + ) } diff --git a/src/components/Lists.tsx b/src/components/Lists.tsx index e1008300ad..d0cb34215f 100644 --- a/src/components/Lists.tsx +++ b/src/components/Lists.tsx @@ -185,7 +185,6 @@ let ListMaybePlaceholder = ({ message={errorMessage ?? _(msg`Something went wrong!`)} onRetry={onRetry} onGoBack={onGoBack} - sideBorders={sideBorders} hideBackButton={hideBackButton} /> ) @@ -226,7 +225,6 @@ let ListMaybePlaceholder = ({ onRetry={onRetry} onGoBack={onGoBack} hideBackButton={hideBackButton} - sideBorders={sideBorders} /> ) } diff --git a/src/screens/Messages/Conversation.tsx b/src/screens/Messages/Conversation.tsx index b269046534..36adb63e7a 100644 --- a/src/screens/Messages/Conversation.tsx +++ b/src/screens/Messages/Conversation.tsx @@ -137,7 +137,6 @@ function Inner({convoId}: {convoId: string}) { title={l`Something went wrong`} message={l`We couldn't load this conversation`} onRetry={() => convoState.error.retry()} - sideBorders={false} /> ) diff --git a/src/screens/Messages/ConversationSettings/index.tsx b/src/screens/Messages/ConversationSettings/index.tsx index 5e4ad91424..fbc4ffcc63 100644 --- a/src/screens/Messages/ConversationSettings/index.tsx +++ b/src/screens/Messages/ConversationSettings/index.tsx @@ -112,7 +112,6 @@ function SettingsInner() { title={l`Something went wrong`} message={l`We couldn’t load this conversation’s settings`} onRetry={() => convoState.error.retry()} - sideBorders={false} /> ) } diff --git a/src/screens/Messages/JoinRequests.tsx b/src/screens/Messages/JoinRequests.tsx index 98952aee34..5198cd7f19 100644 --- a/src/screens/Messages/JoinRequests.tsx +++ b/src/screens/Messages/JoinRequests.tsx @@ -87,7 +87,6 @@ function JoinRequestsInner() { title={l`Something went wrong`} message={l`We couldn’t load this conversation’s join requests`} onRetry={() => convoState.error.retry()} - sideBorders={false} /> ) From e60e31733af4b7c82c22b3b0f4f1e9d54a343c9d Mon Sep 17 00:00:00 2001 From: DS Boyce <260543580+ds-boyce@users.noreply.github.com> Date: Mon, 8 Jun 2026 04:36:34 -0700 Subject: [PATCH 097/149] Use new listConvoRequests endpoint (#10755) Co-authored-by: Samuel Newman --- eslint-suppressions.json | 10 - src/components/AvatarBubbles.tsx | 6 +- src/screens/Messages/Inbox.tsx | 63 ++-- ...stItem.tsx => IncomingRequestListItem.tsx} | 2 +- .../components/OutgoingRequestListItem.tsx | 128 +++++++ src/state/cache/profile-shadow.ts | 2 + .../queries/messages/accept-conversation.ts | 26 +- .../messages/list-conversation-requests.tsx | 165 +++++++++ .../queries/messages/list-conversations.tsx | 348 +++++++++++------- .../messages/request-join-group-chat.ts | 5 +- src/state/queries/messages/update-all-read.ts | 39 +- .../messages/withdraw-join-group-chat.ts | 14 +- 12 files changed, 628 insertions(+), 180 deletions(-) rename src/screens/Messages/components/{RequestListItem.tsx => IncomingRequestListItem.tsx} (98%) create mode 100644 src/screens/Messages/components/OutgoingRequestListItem.tsx create mode 100644 src/state/queries/messages/list-conversation-requests.tsx diff --git a/eslint-suppressions.json b/eslint-suppressions.json index 5bd3357d19..304fd4a065 100644 --- a/eslint-suppressions.json +++ b/eslint-suppressions.json @@ -1773,16 +1773,6 @@ "count": 7 } }, - "src/state/queries/messages/accept-conversation.ts": { - "@typescript-eslint/no-floating-promises": { - "count": 2 - } - }, - "src/state/queries/messages/update-all-read.ts": { - "@typescript-eslint/no-floating-promises": { - "count": 3 - } - }, "src/state/queries/my-lists.ts": { "@typescript-eslint/no-floating-promises": { "count": 2 diff --git a/src/components/AvatarBubbles.tsx b/src/components/AvatarBubbles.tsx index c49dada16f..2f3fb8b15d 100644 --- a/src/components/AvatarBubbles.tsx +++ b/src/components/AvatarBubbles.tsx @@ -36,7 +36,7 @@ export function AvatarBubbles({ moderationOpts, }: { animate?: boolean - profiles: bsky.profile.AnyProfileView[] + profiles: (bsky.profile.AnyProfileView | undefined)[] /** * By default, when there are more than 2 profiles, the current user is * filtered out (so you don't see yourself among your own group's members). @@ -50,12 +50,12 @@ export function AvatarBubbles({ const {currentAccount} = useSession() const profiles = !self && allProfiles.length > 2 - ? allProfiles.filter(p => p?.did != null && p.did !== currentAccount?.did) + ? allProfiles.filter(p => !p || p.did !== currentAccount?.did) : allProfiles const moderations = useMemo(() => { if (!moderationOpts) return [] return profiles.map(p => { - return moderateProfile(p, moderationOpts) + return p && moderateProfile(p, moderationOpts) }) }, [profiles, moderationOpts]) diff --git a/src/screens/Messages/Inbox.tsx b/src/screens/Messages/Inbox.tsx index 59ca05bdba..60891c3c11 100644 --- a/src/screens/Messages/Inbox.tsx +++ b/src/screens/Messages/Inbox.tsx @@ -1,8 +1,9 @@ import {useCallback, useMemo, useState} from 'react' import {View} from 'react-native' import { - type ChatBskyConvoDefs, - type ChatBskyConvoListConvos, + ChatBskyConvoDefs, + type ChatBskyConvoListConvoRequests, + ChatBskyGroupDefs, } from '@atproto/api' import {Trans, useLingui} from '@lingui/react/macro' import {useFocusEffect, useNavigation} from '@react-navigation/native' @@ -23,7 +24,7 @@ import {logger} from '#/logger' import {MESSAGE_SCREEN_POLL_INTERVAL} from '#/state/messages/convo/const' import {useMessagesEventBus} from '#/state/messages/events' import {useLeftConvos} from '#/state/queries/messages/leave-conversation' -import {useListConvosQuery} from '#/state/queries/messages/list-conversations' +import {useListConvoRequests} from '#/state/queries/messages/list-conversation-requests' import {useUpdateAllRead} from '#/state/queries/messages/update-all-read' import {EmptyState} from '#/view/com/util/EmptyState' import {List} from '#/view/com/util/List' @@ -43,11 +44,16 @@ import {ListFooter} from '#/components/Lists' import * as Toast from '#/components/Toast' import {Text} from '#/components/Typography' import {IS_NATIVE} from '#/env' -import {RequestListItem} from './components/RequestListItem' +import {IncomingRequestListItem} from './components/IncomingRequestListItem' +import {OutgoingRequestListItem} from './components/OutgoingRequestListItem' import {useIsWithinSplitView} from './components/splitView/context' type Props = NativeStackScreenProps +type RequestItem = + | {type: 'incoming'; view: ChatBskyConvoDefs.ConvoView} + | {type: 'outgoing'; view: ChatBskyGroupDefs.JoinRequestConvoView} + export function MessagesInboxScreen(props: Props) { const {t: l} = useLingui() const aaCopy = useAgeAssuranceCopy() @@ -61,29 +67,36 @@ export function MessagesInboxScreen(props: Props) { } export function MessagesInboxScreenInner({}: Props) { - const listConvosQuery = useListConvosQuery({status: 'request'}) + const listConvosQuery = useListConvoRequests() const {data} = listConvosQuery const leftConvos = useLeftConvos() - const conversations = useMemo(() => { - if (data?.pages) { - const convos = data.pages - .flatMap(page => page.convos) - // filter out convos that are actively being left - .filter(convo => !leftConvos.includes(convo.id)) - - return convos + const conversations = useMemo(() => { + if (!data?.pages) return [] + const items: RequestItem[] = [] + for (const page of data.pages) { + for (const item of page.requests) { + if (ChatBskyConvoDefs.isConvoView(item)) { + // filter out convos that are actively being left + if (leftConvos.includes(item.id)) continue + items.push({type: 'incoming', view: item}) + } else if (ChatBskyGroupDefs.isJoinRequestConvoView(item)) { + items.push({type: 'outgoing', view: item}) + } + } } - return [] + return items }, [data, leftConvos]) const hasUnreadConvos = useMemo(() => { return conversations.some( - conversation => - conversation.members.every( + item => + item.type === 'incoming' && + item.view.members.every( member => member.handle !== 'missing.invalid', - ) && conversation.unreadCount > 0, + ) && + item.view.unreadCount > 0, ) }, [conversations]) @@ -111,10 +124,10 @@ function RequestList({ conversations, }: { listConvosQuery: UseInfiniteQueryResult< - InfiniteData, + InfiniteData, Error > - conversations: ChatBskyConvoDefs.ConvoView[] + conversations: RequestItem[] }) { const {t: l} = useLingui() const t = useTheme() @@ -274,17 +287,21 @@ function RequestList({ windowSize={11} desktopFixedHeight sideBorders={false} + contentContainerStyle={[web(a.py_sm)]} /> ) } -function keyExtractor(item: ChatBskyConvoDefs.ConvoView) { - return item.id +function keyExtractor(item: RequestItem) { + return item.type === 'incoming' ? item.view.id : item.view.convoId } -function renderItem({item}: {item: ChatBskyConvoDefs.ConvoView}) { - return +function renderItem({item}: {item: RequestItem}) { + if (item.type === 'incoming') { + return + } + return } function MarkAsReadHeaderButton() { diff --git a/src/screens/Messages/components/RequestListItem.tsx b/src/screens/Messages/components/IncomingRequestListItem.tsx similarity index 98% rename from src/screens/Messages/components/RequestListItem.tsx rename to src/screens/Messages/components/IncomingRequestListItem.tsx index 79eab480ae..2ddc8d1997 100644 --- a/src/screens/Messages/components/RequestListItem.tsx +++ b/src/screens/Messages/components/IncomingRequestListItem.tsx @@ -11,7 +11,7 @@ import {Text} from '#/components/Typography' import {ChatListItem, ChatListItemPortal} from './ChatListItem' import {AcceptChatButton, DeleteChatButton, RejectMenu} from './RequestButtons' -export function RequestListItem({ +export function IncomingRequestListItem({ convo: convoView, }: { convo: ChatBskyConvoDefs.ConvoView diff --git a/src/screens/Messages/components/OutgoingRequestListItem.tsx b/src/screens/Messages/components/OutgoingRequestListItem.tsx new file mode 100644 index 0000000000..8bd7ba78d0 --- /dev/null +++ b/src/screens/Messages/components/OutgoingRequestListItem.tsx @@ -0,0 +1,128 @@ +import {View} from 'react-native' +import { + type ChatBskyGroupDefs, + ChatBskyGroupWithdrawJoinRequest, +} from '@atproto/api' +import {Trans, useLingui} from '@lingui/react/macro' + +import {isNetworkError} from '#/lib/strings/errors' +import {useModerationOpts} from '#/state/preferences/moderation-opts' +import {useWithdrawJoinGroupChatRequest} from '#/state/queries/messages/withdraw-join-group-chat' +import {TimeElapsed} from '#/view/com/util/TimeElapsed' +import {atoms as a, useTheme, web} from '#/alf' +import {AvatarBubbles} from '#/components/AvatarBubbles' +import {createStaticClick, Link} from '#/components/Link' +import * as Prompt from '#/components/Prompt' +import * as Toast from '#/components/Toast' +import {Text} from '#/components/Typography' + +export function OutgoingRequestListItem({ + convo: convoView, +}: { + convo: ChatBskyGroupDefs.JoinRequestConvoView +}) { + const t = useTheme() + const {t: l} = useLingui() + + const prompt = Prompt.usePromptControl() + + const moderationOpts = useModerationOpts() + + const {mutate: withdrawRequest, isPending: isWithdrawPending} = + useWithdrawJoinGroupChatRequest({ + onSuccess: () => { + Toast.show(l`Join request rescinded.`) + }, + onError: error => { + let errorMessage = l`Failed to rescind your request. Please try again.` + if (isNetworkError(error)) { + errorMessage = l`There was a problem with your internet connection, please try again` + } else if ( + error instanceof + ChatBskyGroupWithdrawJoinRequest.InvalidJoinRequestError + ) { + errorMessage = l`Invalid rescind request.` + } + Toast.show(errorMessage) + }, + }) + + return ( + <> + { + prompt.open() + })}> + {({hovered, pressed, focused}) => ( + + + + + + + {convoView.name} + + + + + {({timeElapsed}) => ( + + {timeElapsed} + + )} + + + + + + You requested to join + + + + + )} + + { + prompt.close(() => { + if (isWithdrawPending) return + withdrawRequest({convoId: convoView.convoId}) + }) + }} + /> + + ) +} diff --git a/src/state/cache/profile-shadow.ts b/src/state/cache/profile-shadow.ts index 8b61b4416e..f387306f4e 100644 --- a/src/state/cache/profile-shadow.ts +++ b/src/state/cache/profile-shadow.ts @@ -11,6 +11,7 @@ import {findAllProfilesInQueryData as findAllProfilesInContactMatchesQueryData} import {findAllProfilesInQueryData as findAllProfilesInKnownFollowersQueryData} from '#/state/queries/known-followers' import {findAllProfilesInQueryData as findAllProfilesInListMembersQueryData} from '#/state/queries/list-members' import {findAllProfilesInQueryData as findAllProfilesInGetConvoQueryData} from '#/state/queries/messages/conversation' +import {findAllProfilesInQueryData as findAllProfilesInListConvoRequestsQueryData} from '#/state/queries/messages/list-conversation-requests' import {findAllProfilesInQueryData as findAllProfilesInListConvosQueryData} from '#/state/queries/messages/list-conversations' import {findAllProfilesInQueryData as findAllProfilesInMessagesQueryData} from '#/state/queries/messages/list-convo-members' import {findAllProfilesInQueryData as findAllProfilesInMyBlockedAccountsQueryData} from '#/state/queries/my-blocked-accounts' @@ -259,6 +260,7 @@ function* findProfilesInCache( yield* findAllProfilesInSuggestedFollowsQueryData(queryClient, did) yield* findAllProfilesInActorSearchQueryData(queryClient, did) yield* findAllProfilesInListConvosQueryData(queryClient, did) + yield* findAllProfilesInListConvoRequestsQueryData(queryClient, did) yield* findAllProfilesInFeedsQueryData(queryClient, did) yield* findAllProfilesInPostThreadV2QueryData(queryClient, did) yield* findAllProfilesInKnownFollowersQueryData(queryClient, did) diff --git a/src/state/queries/messages/accept-conversation.ts b/src/state/queries/messages/accept-conversation.ts index 0c06055b55..6f1b3d272b 100644 --- a/src/state/queries/messages/accept-conversation.ts +++ b/src/state/queries/messages/accept-conversation.ts @@ -7,6 +7,11 @@ import {useMutation, useQueryClient} from '@tanstack/react-query' import {DM_SERVICE_HEADERS} from '#/lib/constants' import {logger} from '#/logger' import {useAgent} from '#/state/session' +import { + type ConvoRequestListQueryData, + optimisticDelete as optimisticDeleteRequest, + RQKEY_ROOT as REQUESTS_RQKEY_ROOT, +} from './list-conversation-requests' import { RQKEY as CONVO_LIST_KEY, RQKEY_ROOT as CONVO_LIST_ROOT_KEY, @@ -96,11 +101,20 @@ export function useAcceptConversation( } }, ) + const prevRequestsQueries = + queryClient.getQueriesData({ + queryKey: [REQUESTS_RQKEY_ROOT], + }) + queryClient.setQueriesData( + {queryKey: [REQUESTS_RQKEY_ROOT]}, + old => optimisticDeleteRequest(convoId, old), + ) onMutate?.() - return {prevAcceptedPages, prevInboxPages} + return {prevAcceptedPages, prevInboxPages, prevRequestsQueries} }, onSuccess: data => { - queryClient.invalidateQueries({queryKey: [CONVO_LIST_KEY]}) + void queryClient.invalidateQueries({queryKey: [CONVO_LIST_KEY]}) + void queryClient.invalidateQueries({queryKey: [REQUESTS_RQKEY_ROOT]}) onSuccess?.(data) }, onError: (error, _, context) => { @@ -131,7 +145,13 @@ export function useAcceptConversation( } }, ) - queryClient.invalidateQueries({queryKey: [CONVO_LIST_ROOT_KEY]}) + if (context?.prevRequestsQueries) { + for (const [queryKey, prevData] of context.prevRequestsQueries) { + queryClient.setQueryData(queryKey, prevData) + } + } + void queryClient.invalidateQueries({queryKey: [CONVO_LIST_ROOT_KEY]}) + void queryClient.invalidateQueries({queryKey: [REQUESTS_RQKEY_ROOT]}) onError?.(error) }, }) diff --git a/src/state/queries/messages/list-conversation-requests.tsx b/src/state/queries/messages/list-conversation-requests.tsx new file mode 100644 index 0000000000..10023db4eb --- /dev/null +++ b/src/state/queries/messages/list-conversation-requests.tsx @@ -0,0 +1,165 @@ +import { + ChatBskyConvoDefs, + type ChatBskyConvoListConvoRequests, + ChatBskyGroupDefs, +} from '@atproto/api' +import { + type InfiniteData, + type QueryClient, + useInfiniteQuery, +} from '@tanstack/react-query' + +import {DM_SERVICE_HEADERS} from '#/lib/constants' +import {useAgent} from '#/state/session' + +const DEFAULT_LIMIT = 10 + +export const RQKEY_ROOT = 'convo-request-list' +export const RQKEY = (limit: number = DEFAULT_LIMIT) => [RQKEY_ROOT, limit] + +type RQPageParam = string | undefined + +export function useListConvoRequests({ + enabled = true, + limit = DEFAULT_LIMIT, +}: { + enabled?: boolean + limit?: number +} = {}) { + const agent = useAgent() + + return useInfiniteQuery({ + enabled, + queryKey: RQKEY(limit), + queryFn: async ({pageParam}) => { + const {data} = await agent.chat.bsky.convo.listConvoRequests( + {limit, cursor: pageParam}, + {headers: DM_SERVICE_HEADERS}, + ) + return data + }, + initialPageParam: undefined as RQPageParam, + getNextPageParam: lastPage => lastPage.cursor, + }) +} + +export type ConvoRequestListQueryData = { + pageParams: Array + pages: Array +} + +export type ConvoRequestItem = + ChatBskyConvoListConvoRequests.OutputSchema['requests'][number] + +export function optimisticUpdate( + chatId: string, + old: ConvoRequestListQueryData | undefined, + updateFn: (convo: ChatBskyConvoDefs.ConvoView) => ChatBskyConvoDefs.ConvoView, +): ConvoRequestListQueryData | undefined { + if (!old) return old + + return { + ...old, + pages: old.pages.map(page => ({ + ...page, + requests: page.requests.map((item): ConvoRequestItem => { + if (ChatBskyConvoDefs.isConvoView(item) && item.id === chatId) { + return { + ...updateFn(item), + $type: 'chat.bsky.convo.defs#convoView', + } + } + return item + }), + })), + } +} + +export function optimisticDelete( + chatId: string, + old: ConvoRequestListQueryData | undefined, +) { + if (!old) return old + + return { + ...old, + pages: old.pages.map(page => ({ + ...page, + requests: page.requests.filter( + item => !ChatBskyConvoDefs.isConvoView(item) || item.id !== chatId, + ), + })), + } +} + +export function markAllRead( + old: ConvoRequestListQueryData | undefined, +): ConvoRequestListQueryData | undefined { + if (!old) return old + + return { + ...old, + pages: old.pages.map(page => ({ + ...page, + requests: page.requests.map((item): ConvoRequestItem => { + if (ChatBskyConvoDefs.isConvoView(item)) { + return { + ...item, + $type: 'chat.bsky.convo.defs#convoView', + unreadCount: 0, + } + } + return item + }), + })), + } +} + +export function optimisticDeleteJoinRequest( + convoId: string, + old: ConvoRequestListQueryData | undefined, +) { + if (!old) return old + + return { + ...old, + pages: old.pages.map(page => ({ + ...page, + requests: page.requests.filter( + item => + !ChatBskyGroupDefs.isJoinRequestConvoView(item) || + item.convoId !== convoId, + ), + })), + } +} + +export function* findAllProfilesInQueryData( + queryClient: QueryClient, + did: string, +) { + const queryDatas = queryClient.getQueriesData< + InfiniteData + >({ + queryKey: [RQKEY_ROOT], + }) + for (const [_queryKey, queryData] of queryDatas) { + if (!queryData?.pages) continue + + for (const page of queryData.pages) { + for (const item of page.requests) { + if (ChatBskyConvoDefs.isConvoView(item)) { + for (const member of item.members) { + if (member.did === did) { + yield member + } + } + } else if (ChatBskyGroupDefs.isJoinRequestConvoView(item)) { + if (item.owner.did === did) { + yield item.owner + } + } + } + } + } +} diff --git a/src/state/queries/messages/list-conversations.tsx b/src/state/queries/messages/list-conversations.tsx index dadf30bcdf..372ef708f3 100644 --- a/src/state/queries/messages/list-conversations.tsx +++ b/src/state/queries/messages/list-conversations.tsx @@ -23,6 +23,13 @@ import {parseConvoView} from '#/components/dms/util' import * as bsky from '#/types/bsky' import {RQKEY as CONVO_KEY} from './conversation' import {useLeftConvos} from './leave-conversation' +import { + type ConvoRequestListQueryData, + optimisticDelete as optimisticDeleteRequest, + optimisticDeleteJoinRequest, + optimisticUpdate as optimisticUpdateRequest, + RQKEY_ROOT as REQUESTS_RQKEY_ROOT, +} from './list-conversation-requests' import {listConvoMembersQueryKey} from './list-convo-members' const DEFAULT_LIMIT = 10 @@ -130,6 +137,7 @@ export function ListConvosProviderInner({ const refetchAndInvalidate = () => { void refetch() void queryClient.invalidateQueries({queryKey: [RQKEY_ROOT]}) + void queryClient.invalidateQueries({queryKey: [REQUESTS_RQKEY_ROOT]}) } return throttle(refetchAndInvalidate, 500, { leading: true, @@ -157,6 +165,22 @@ export function ListConvosProviderInner({ ) } + function updateConvoInAllLists( + convoId: string, + fn: ( + convo: ChatBskyConvoDefs.ConvoView, + ) => ChatBskyConvoDefs.ConvoView, + ) { + queryClient.setQueriesData( + {queryKey: [RQKEY_ROOT]}, + old => optimisticUpdate(convoId, old, fn), + ) + queryClient.setQueriesData( + {queryKey: [REQUESTS_RQKEY_ROOT]}, + old => optimisticUpdateRequest(convoId, old, fn), + ) + } + function mutateConvoView( convoId: string, fn: ( @@ -167,9 +191,17 @@ export function ListConvosProviderInner({ CONVO_KEY(convoId), old => (old ? fn(old) : old), ) + updateConvoInAllLists(convoId, fn) + } + + function deleteConvoFromAllLists(convoId: string) { queryClient.setQueriesData( {queryKey: [RQKEY_ROOT]}, - old => optimisticUpdate(convoId, old, fn), + old => optimisticDelete(convoId, old), + ) + queryClient.setQueriesData( + {queryKey: [REQUESTS_RQKEY_ROOT]}, + old => optimisticDeleteRequest(convoId, old), ) } @@ -220,35 +252,26 @@ export function ListConvosProviderInner({ if (ChatBskyConvoDefs.isLogBeginConvo(log)) { debouncedRefetch() } else if (ChatBskyConvoDefs.isLogLeaveConvo(log)) { - queryClient.setQueriesData( - {queryKey: [RQKEY_ROOT]}, - (old?: ConvoListQueryData) => optimisticDelete(log.convoId, old), - ) + deleteConvoFromAllLists(log.convoId) } else if (ChatBskyConvoDefs.isLogDeleteMessage(log)) { - queryClient.setQueriesData( - {queryKey: [RQKEY_ROOT]}, - (old?: ConvoListQueryData) => - optimisticUpdate(log.convoId, old, convo => { - if ( - (ChatBskyConvoDefs.isDeletedMessageView(log.message) || - ChatBskyConvoDefs.isMessageView(log.message)) && - (ChatBskyConvoDefs.isDeletedMessageView( - convo.lastMessage, - ) || - ChatBskyConvoDefs.isMessageView(convo.lastMessage)) - ) { - return log.message.id === convo.lastMessage.id - ? { - ...convo, - rev: log.rev, - lastMessage: log.message, - } - : convo - } else { - return convo - } - }), - ) + updateConvoInAllLists(log.convoId, convo => { + if ( + (ChatBskyConvoDefs.isDeletedMessageView(log.message) || + ChatBskyConvoDefs.isMessageView(log.message)) && + (ChatBskyConvoDefs.isDeletedMessageView(convo.lastMessage) || + ChatBskyConvoDefs.isMessageView(convo.lastMessage)) + ) { + return log.message.id === convo.lastMessage.id + ? { + ...convo, + rev: log.rev, + lastMessage: log.message, + } + : convo + } else { + return convo + } + }) } else if (ChatBskyConvoDefs.isLogCreateMessage(log)) { // Store in a new var to avoid TS errors due to closures. const logRef: ChatBskyConvoDefs.LogCreateMessage = log @@ -335,27 +358,24 @@ export function ListConvosProviderInner({ ) } else if (updatedConvo.status === 'request') { queryClient.setQueriesData({queryKey: RQKEY('request')}, updateFn) + // also move-to-top in the new requests cache + queryClient.setQueriesData( + {queryKey: [REQUESTS_RQKEY_ROOT]}, + old => moveConvoToTopInRequests(updatedConvo, old), + ) } } else if (ChatBskyConvoDefs.isLogReadMessage(log)) { - queryClient.setQueriesData( - {queryKey: [RQKEY_ROOT]}, - (old?: ConvoListQueryData) => - optimisticUpdate(log.convoId, old, convo => ({ - ...convo, - unreadCount: 0, - rev: log.rev, - })), - ) + updateConvoInAllLists(log.convoId, convo => ({ + ...convo, + unreadCount: 0, + rev: log.rev, + })) } else if (ChatBskyConvoDefs.isLogReadConvo(log)) { - queryClient.setQueriesData( - {queryKey: [RQKEY_ROOT]}, - (old?: ConvoListQueryData) => - optimisticUpdate(log.convoId, old, convo => ({ - ...convo, - unreadCount: 0, - rev: log.rev, - })), - ) + updateConvoInAllLists(log.convoId, convo => ({ + ...convo, + unreadCount: 0, + rev: log.rev, + })) } else if (ChatBskyConvoDefs.isLogAcceptConvo(log)) { const requests = queryClient.getQueryData( RQKEY('request'), @@ -373,6 +393,11 @@ export function ListConvosProviderInner({ RQKEY('request'), (old?: ConvoListQueryData) => optimisticDelete(log.convoId, old), ) + // also remove from the new requests cache + queryClient.setQueriesData( + {queryKey: [REQUESTS_RQKEY_ROOT]}, + old => optimisticDeleteRequest(log.convoId, old), + ) queryClient.setQueriesData( {queryKey: RQKEY('accepted')}, (old?: ConvoListQueryData) => { @@ -398,55 +423,50 @@ export function ListConvosProviderInner({ }, ) } else if (ChatBskyConvoDefs.isLogMuteConvo(log)) { - queryClient.setQueriesData( - {queryKey: [RQKEY_ROOT]}, - (old?: ConvoListQueryData) => - optimisticUpdate(log.convoId, old, convo => ({ - ...convo, - muted: true, - rev: log.rev, - })), - ) + updateConvoInAllLists(log.convoId, convo => ({ + ...convo, + muted: true, + rev: log.rev, + })) } else if (ChatBskyConvoDefs.isLogUnmuteConvo(log)) { - queryClient.setQueriesData( - {queryKey: [RQKEY_ROOT]}, - (old?: ConvoListQueryData) => - optimisticUpdate(log.convoId, old, convo => ({ - ...convo, - muted: false, - rev: log.rev, - })), - ) + updateConvoInAllLists(log.convoId, convo => ({ + ...convo, + muted: false, + rev: log.rev, + })) } else if (ChatBskyConvoDefs.isLogLockConvo(log)) { - mutateConvoView(log.convoId, convo => - ChatBskyConvoDefs.isGroupConvo(convo.kind) - ? { - ...convo, - kind: {...convo.kind, lockStatus: 'locked'}, - rev: log.rev, - } - : {...convo, rev: log.rev}, - ) + mutateConvoView(log.convoId, convo => { + if (ChatBskyConvoDefs.isGroupConvo(convo.kind)) { + return { + ...convo, + kind: {...convo.kind, lockStatus: 'locked'}, + rev: log.rev, + } + } + return {...convo, rev: log.rev} + }) } else if (ChatBskyConvoDefs.isLogUnlockConvo(log)) { - mutateConvoView(log.convoId, convo => - ChatBskyConvoDefs.isGroupConvo(convo.kind) - ? { - ...convo, - kind: {...convo.kind, lockStatus: 'unlocked'}, - rev: log.rev, - } - : {...convo, rev: log.rev}, - ) + mutateConvoView(log.convoId, convo => { + if (ChatBskyConvoDefs.isGroupConvo(convo.kind)) { + return { + ...convo, + kind: {...convo.kind, lockStatus: 'unlocked'}, + rev: log.rev, + } + } + return {...convo, rev: log.rev} + }) } else if (ChatBskyConvoDefs.isLogLockConvoPermanently(log)) { - mutateConvoView(log.convoId, convo => - ChatBskyConvoDefs.isGroupConvo(convo.kind) - ? { - ...convo, - kind: {...convo.kind, lockStatus: 'locked-permanently'}, - rev: log.rev, - } - : {...convo, rev: log.rev}, - ) + mutateConvoView(log.convoId, convo => { + if (ChatBskyConvoDefs.isGroupConvo(convo.kind)) { + return { + ...convo, + kind: {...convo.kind, lockStatus: 'locked-permanently'}, + rev: log.rev, + } + } + return {...convo, rev: log.rev} + }) } else if ( ChatBskyConvoDefs.isLogCreateJoinLink(log) || ChatBskyConvoDefs.isLogEditJoinLink(log) || @@ -455,37 +475,68 @@ export function ListConvosProviderInner({ ) { // Join link data not included in the log event, trigger refetch to get it debouncedRefetch() + } else if (ChatBskyConvoDefs.isLogEditGroup(log)) { + // Updated group details (name etc.) aren't included in the log + // event, so refetch to pick them up. + debouncedRefetch() } else if ( ChatBskyConvoDefs.isLogApproveJoinRequest(log) || ChatBskyConvoDefs.isLogRejectJoinRequest(log) ) { - queryClient.setQueriesData( - {queryKey: [RQKEY_ROOT]}, - (old?: ConvoListQueryData) => - updateGroupConvoJoinRequestCount(log, old, -1), + // Route through mutateConvoView (not updateConvoInAllLists) so the + // single-convo cache updates too, keeping the in-convo requests + // banner in sync. + mutateConvoView(log.convoId, convo => + applyJoinRequestCountDelta(convo, log.rev, -1), ) } else if (ChatBskyConvoDefs.isLogIncomingJoinRequest(log)) { - queryClient.setQueriesData( - {queryKey: [RQKEY_ROOT]}, - (old?: ConvoListQueryData) => - updateGroupConvoJoinRequestCount(log, old, 1), + // Route through mutateConvoView (not updateConvoInAllLists) so the + // single-convo cache updates too, letting the in-convo requests + // banner appear live. + mutateConvoView(log.convoId, convo => + applyJoinRequestCountDelta(convo, log.rev, 1), ) + } else if (ChatBskyConvoDefs.isLogReadJoinRequests(log)) { + // The owner marked join requests as read (possibly on another + // device). Zero the unread count but keep the total, mirroring the + // useMarkJoinRequestsRead mutation. + mutateConvoView(log.convoId, convo => { + if (!ChatBskyConvoDefs.isGroupConvo(convo.kind)) { + return {...convo, rev: log.rev} + } + return { + ...convo, + kind: {...convo.kind, unreadJoinRequestCount: 0}, + rev: log.rev, + } + }) } else if (ChatBskyConvoDefs.isLogOutgoingJoinRequest(log)) { - // Viewer isn't in the chat yet, no need to do anything - } else if (ChatBskyConvoDefs.isLogAddReaction(log)) { - queryClient.setQueriesData( - {queryKey: [RQKEY_ROOT]}, - (old?: ConvoListQueryData) => - optimisticUpdate(log.convoId, old, convo => ({ - ...convo, - lastReaction: { - $type: 'chat.bsky.convo.defs#messageAndReactionView', - reaction: log.reaction, - message: log.message, - }, - rev: log.rev, - })), + // Viewer isn't in the chat yet, but the inbox surfaces outgoing + // requests, so refetch to pick up the new entry. + debouncedRefetch() + } else if (ChatBskyConvoDefs.isLogWithdrawIncomingJoinRequest(log)) { + // A requester rescinded their request to a group the viewer owns. + // Mirror of isLogIncomingJoinRequest: decrement the counts. + mutateConvoView(log.convoId, convo => + applyJoinRequestCountDelta(convo, log.rev, -1), ) + } else if (ChatBskyConvoDefs.isLogWithdrawOutgoingJoinRequest(log)) { + // The viewer rescinded their own outgoing join request (possibly on + // another device). Remove it from the requests inbox cache. + queryClient.setQueriesData( + {queryKey: [REQUESTS_RQKEY_ROOT]}, + old => optimisticDeleteJoinRequest(log.convoId, old), + ) + } else if (ChatBskyConvoDefs.isLogAddReaction(log)) { + updateConvoInAllLists(log.convoId, convo => ({ + ...convo, + lastReaction: { + $type: 'chat.bsky.convo.defs#messageAndReactionView', + reaction: log.reaction, + message: log.message, + }, + rev: log.rev, + })) } else if (ChatBskyConvoDefs.isLogAddMember(log)) { const data = log.message.data if ( @@ -739,27 +790,58 @@ function optimisticUpdate( } } -function updateGroupConvoJoinRequestCount( - log: {convoId: string; rev: string}, - old: ConvoListQueryData | undefined, +function applyJoinRequestCountDelta( + convo: ChatBskyConvoDefs.ConvoView, + rev: string, delta: 1 | -1, -) { - return optimisticUpdate(log.convoId, old, convo => { - // Join requests are only meaningful for group convos. - if (!ChatBskyConvoDefs.isGroupConvo(convo.kind)) { - return {...convo, rev: log.rev} +): ChatBskyConvoDefs.ConvoView { + // Join requests are only meaningful for group convos. + if (!ChatBskyConvoDefs.isGroupConvo(convo.kind)) { + return {...convo, rev} + } + // Bump the total and unread counts together. Both are clamped at 0 and + // collapse to undefined when empty, matching the server's shape. + const bump = (current: number | undefined) => { + const next = Math.max(0, (current ?? 0) + delta) + return next === 0 ? undefined : next + } + return { + ...convo, + kind: { + ...convo.kind, + joinRequestCount: bump(convo.kind.joinRequestCount), + unreadJoinRequestCount: bump(convo.kind.unreadJoinRequestCount), + }, + rev, + } +} + +function moveConvoToTopInRequests( + updatedConvo: ChatBskyConvoDefs.ConvoView, + old: ConvoRequestListQueryData | undefined, +): ConvoRequestListQueryData | undefined { + if (!old) return old + const typedConvo: ConvoRequestListQueryData['pages'][number]['requests'][number] = + { + $type: 'chat.bsky.convo.defs#convoView', + ...updatedConvo, } - const current = convo.kind.joinRequestCount ?? 0 - const next = Math.max(0, current + delta) - return { - ...convo, - kind: { - ...convo.kind, - joinRequestCount: next === 0 ? undefined : next, - }, - rev: log.rev, - } - }) + return { + ...old, + pages: old.pages.map((page, i) => { + const filtered = page.requests.filter( + item => + !ChatBskyConvoDefs.isConvoView(item) || item.id !== updatedConvo.id, + ) + if (i === 0) { + return { + ...page, + requests: [typedConvo, ...filtered], + } + } + return {...page, requests: filtered} + }), + } } function removeMemberFromConvoView( diff --git a/src/state/queries/messages/request-join-group-chat.ts b/src/state/queries/messages/request-join-group-chat.ts index 04e63395f7..f4d5650346 100644 --- a/src/state/queries/messages/request-join-group-chat.ts +++ b/src/state/queries/messages/request-join-group-chat.ts @@ -1,9 +1,10 @@ import {type ChatBskyGroupRequestJoin} from '@atproto/api' -import {useMutation} from '@tanstack/react-query' +import {useMutation, useQueryClient} from '@tanstack/react-query' import {DM_SERVICE_HEADERS} from '#/lib/constants' import {logger} from '#/logger' import {useAgent, useSession} from '#/state/session' +import {RQKEY_ROOT as REQUESTS_RQKEY_ROOT} from './list-conversation-requests' export function useRequestJoinGroupChat({ onSuccess, @@ -13,6 +14,7 @@ export function useRequestJoinGroupChat({ onError?: (error: Error) => void } = {}) { const agent = useAgent() + const queryClient = useQueryClient() const {hasSession} = useSession() return useMutation({ @@ -27,6 +29,7 @@ export function useRequestJoinGroupChat({ return res.data }, onSuccess: data => { + void queryClient.invalidateQueries({queryKey: [REQUESTS_RQKEY_ROOT]}) onSuccess?.(data) }, onError: error => { diff --git a/src/state/queries/messages/update-all-read.ts b/src/state/queries/messages/update-all-read.ts index 3d0fd3a45e..79173362dc 100644 --- a/src/state/queries/messages/update-all-read.ts +++ b/src/state/queries/messages/update-all-read.ts @@ -4,6 +4,11 @@ import {useMutation, useQueryClient} from '@tanstack/react-query' import {DM_SERVICE_HEADERS} from '#/lib/constants' import {logger} from '#/logger' import {useAgent} from '#/state/session' +import { + type ConvoRequestListQueryData, + markAllRead as markAllRequestsRead, + RQKEY_ROOT as REQUESTS_RQKEY_ROOT, +} from './list-conversation-requests' import {RQKEY as CONVO_LIST_KEY} from './list-conversations' export function useUpdateAllRead( @@ -32,6 +37,9 @@ export function useUpdateAllRead( }, onMutate: () => { let prevPages: ChatBskyConvoListConvos.OutputSchema[] = [] + let prevRequestsQueries: Array< + [readonly unknown[], ConvoRequestListQueryData | undefined] + > = [] queryClient.setQueryData( CONVO_LIST_KEY(status), (old?: { @@ -75,11 +83,24 @@ export function useUpdateAllRead( } }, ) + if (status === 'request') { + prevRequestsQueries = + queryClient.getQueriesData({ + queryKey: [REQUESTS_RQKEY_ROOT], + }) + queryClient.setQueriesData( + {queryKey: [REQUESTS_RQKEY_ROOT]}, + markAllRequestsRead, + ) + } onMutate?.() - return {prevPages} + return {prevPages, prevRequestsQueries} }, onSuccess: () => { - queryClient.invalidateQueries({queryKey: CONVO_LIST_KEY(status)}) + void queryClient.invalidateQueries({queryKey: CONVO_LIST_KEY(status)}) + if (status === 'request') { + void queryClient.invalidateQueries({queryKey: [REQUESTS_RQKEY_ROOT]}) + } onSuccess?.() }, onError: (error, _, context) => { @@ -97,8 +118,18 @@ export function useUpdateAllRead( } }, ) - queryClient.invalidateQueries({queryKey: CONVO_LIST_KEY(status)}) - queryClient.invalidateQueries({queryKey: CONVO_LIST_KEY('all', 'unread')}) + if (status === 'request' && context?.prevRequestsQueries) { + for (const [queryKey, prevData] of context.prevRequestsQueries) { + queryClient.setQueryData(queryKey, prevData) + } + } + void queryClient.invalidateQueries({queryKey: CONVO_LIST_KEY(status)}) + void queryClient.invalidateQueries({ + queryKey: CONVO_LIST_KEY('all', 'unread'), + }) + if (status === 'request') { + void queryClient.invalidateQueries({queryKey: [REQUESTS_RQKEY_ROOT]}) + } onError?.(error) }, }) diff --git a/src/state/queries/messages/withdraw-join-group-chat.ts b/src/state/queries/messages/withdraw-join-group-chat.ts index 92025cc2be..2ede8c941d 100644 --- a/src/state/queries/messages/withdraw-join-group-chat.ts +++ b/src/state/queries/messages/withdraw-join-group-chat.ts @@ -1,9 +1,14 @@ import {type ChatBskyGroupWithdrawJoinRequest} from '@atproto/api' -import {useMutation} from '@tanstack/react-query' +import {useMutation, useQueryClient} from '@tanstack/react-query' import {DM_SERVICE_HEADERS} from '#/lib/constants' import {logger} from '#/logger' import {useAgent, useSession} from '#/state/session' +import { + type ConvoRequestListQueryData, + optimisticDeleteJoinRequest, + RQKEY_ROOT as REQUESTS_RQKEY_ROOT, +} from './list-conversation-requests' export function useWithdrawJoinGroupChatRequest({ onSuccess, @@ -13,6 +18,7 @@ export function useWithdrawJoinGroupChatRequest({ onError?: (error: Error) => void } = {}) { const agent = useAgent() + const queryClient = useQueryClient() const {hasSession} = useSession() return useMutation({ @@ -27,7 +33,11 @@ export function useWithdrawJoinGroupChatRequest({ ) return res.data }, - onSuccess: data => { + onSuccess: (data, {convoId}) => { + queryClient.setQueriesData( + {queryKey: [REQUESTS_RQKEY_ROOT]}, + old => optimisticDeleteJoinRequest(convoId, old), + ) onSuccess?.(data) }, onError: error => { From 6997d220a02f34f34d311eef71f3eeef3c5f478d Mon Sep 17 00:00:00 2001 From: DS Boyce <260543580+ds-boyce@users.noreply.github.com> Date: Mon, 8 Jun 2026 04:57:08 -0700 Subject: [PATCH 098/149] Add Leave chat button to settings for chat owners (#10764) Co-authored-by: Samuel Newman --- .../Messages/ConversationSettings/index.tsx | 92 ++++++++++++------- .../Messages/ConversationSettings/prompts.tsx | 24 +++++ .../queries/messages/lock-conversation.ts | 16 +++- 3 files changed, 96 insertions(+), 36 deletions(-) diff --git a/src/screens/Messages/ConversationSettings/index.tsx b/src/screens/Messages/ConversationSettings/index.tsx index fbc4ffcc63..2ae09b5130 100644 --- a/src/screens/Messages/ConversationSettings/index.tsx +++ b/src/screens/Messages/ConversationSettings/index.tsx @@ -58,7 +58,12 @@ import {InviteLinkDialog} from '../components/InviteLinkDialog' import {AddMembersLink} from './AddMembersLink' import {Member, MemberPlaceholder} from './Member' import {MembersAndRequests} from './MembersAndRequests' -import {EditNamePrompt, LeaveChatPrompt, LockChatPrompt} from './prompts' +import { + EditNamePrompt, + LeaveAndLockChatPrompt, + LeaveChatPrompt, + LockChatPrompt, +} from './prompts' type Item = | {type: 'MEMBERS_AND_REQUESTS'; key: string} @@ -374,33 +379,49 @@ function SettingsHeader({ }, ) - const {mutate: lockConvo, isPending: isLocking} = useLockConvo( - convo.view.id, - { - onSuccess: data => { - if (!ChatBskyConvoDefs.isGroupConvo(data.convo.kind)) return - if (data.convo.kind.lockStatus === 'locked') { - Toast.show(l({message: 'Group chat locked', context: 'toast'})) - } else { - Toast.show(l({message: 'Group chat unlocked', context: 'toast'})) - } - }, - onError: (e, {lock}) => { - if (lock) { - logger.error('Failed to lock group chat', {message: e}) - Toast.show(l`Failed to lock group chat`, {type: 'error'}) - } else { - logger.error('Failed to unlock group chat', {message: e}) - Toast.show(l`Failed to unlock group chat`, {type: 'error'}) - } - }, + const { + mutate: lockConvo, + mutateAsync: lockConvoAsync, + isPending: isLocking, + } = useLockConvo(convo.view.id, { + onSuccess: (data, {silent}) => { + if (!ChatBskyConvoDefs.isGroupConvo(data.convo.kind)) return + if (silent) return + if (data.convo.kind.lockStatus === 'locked') { + Toast.show(l({message: 'Group chat locked', context: 'toast'})) + } else { + Toast.show(l({message: 'Group chat unlocked', context: 'toast'})) + } }, - ) + onError: (e, {lock}) => { + if (lock) { + logger.error('Failed to lock group chat', {message: e}) + Toast.show(l`Failed to lock group chat`, {type: 'error'}) + } else { + logger.error('Failed to unlock group chat', {message: e}) + Toast.show(l`Failed to unlock group chat`, {type: 'error'}) + } + }, + }) + + const leaveAndLockConvo = async () => { + try { + if (lockStatus === 'unlocked') { + await lockConvoAsync({lock: true, silent: true}) + } + } catch { + // Handled by onError in useLockConvo + return + } + // Owners can only leave a locked chat + leaveConvo() + } const inviteLinkDialog = Dialog.useDialogControl() const editNamePrompt = Prompt.usePromptControl() const lockChatPrompt = Prompt.usePromptControl() const leaveChatPrompt = Prompt.usePromptControl() + const leaveAndLockChatPrompt = Prompt.usePromptControl() const reportControl = Prompt.usePromptControl() const deleteControl = Prompt.usePromptControl() @@ -452,6 +473,7 @@ function SettingsHeader({ a.justify_center, a.gap_2xl, a.pt_2xl, + a.flex_wrap, ]}> ) : null} - {!isOwner ? ( - - ) : null} + + { + void leaveAndLockConvo() + }} + /> {reportSubjectDid ? ( <> void +}) { + const {t: l} = useLingui() + + return ( + + ) +} + export function BlockMemberPrompt({ control, onConfirm, diff --git a/src/state/queries/messages/lock-conversation.ts b/src/state/queries/messages/lock-conversation.ts index b10db13462..122c0633b4 100644 --- a/src/state/queries/messages/lock-conversation.ts +++ b/src/state/queries/messages/lock-conversation.ts @@ -14,15 +14,21 @@ export function useLockConvo( onSuccess, onError, }: { - onSuccess?: (data: ChatBskyConvoLockConvo.OutputSchema) => void - onError?: (error: Error, variables: {lock: boolean}) => void + onSuccess?: ( + data: ChatBskyConvoLockConvo.OutputSchema, + variables: {lock: boolean; silent?: boolean}, + ) => void + onError?: ( + error: Error, + variables: {lock: boolean; silent?: boolean}, + ) => void }, ) { const queryClient = useQueryClient() const agent = useAgent() return useMutation({ - mutationFn: async ({lock}: {lock: boolean}) => { + mutationFn: async ({lock}: {lock: boolean; silent?: boolean}) => { if (!convoId) throw new Error('No convoId provided') if (lock) { const {data} = await agent.chat.bsky.convo.lockConvo( @@ -51,8 +57,8 @@ export function useLockConvo( } }) }, - onSuccess: data => { - onSuccess?.(data) + onSuccess: (data, variables) => { + onSuccess?.(data, variables) }, onError: (e, variables, context) => { if (convoId && context) { From eb79c4d53c1558c22ed7349894ea2f91447ae505 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Mon, 8 Jun 2026 15:10:41 +0300 Subject: [PATCH 099/149] Show accept/reject footer for empty request convos (#10781) Co-authored-by: Claude Opus 4.8 (1M context) --- src/screens/Messages/components/MessagesList.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/screens/Messages/components/MessagesList.tsx b/src/screens/Messages/components/MessagesList.tsx index 6f56c6a898..727829795c 100644 --- a/src/screens/Messages/components/MessagesList.tsx +++ b/src/screens/Messages/components/MessagesList.tsx @@ -709,6 +709,10 @@ function getFooterState( convoState: ActiveConvoStates, hasAcceptOverride?: boolean, ): FooterState { + if (convoState.convo.view.status === 'request' && !hasAcceptOverride) { + return 'request' + } + if (convoState.items.length === 0) { if (convoState.isFetchingHistory) { return 'loading' @@ -717,10 +721,6 @@ function getFooterState( } } - if (convoState.convo.view.status === 'request' && !hasAcceptOverride) { - return 'request' - } - return 'standard' } From 16046cd85e0cda11f30376f16bb60418158ba54f Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Mon, 8 Jun 2026 15:27:58 +0300 Subject: [PATCH 100/149] [Chat] Invite link dialog tweaks (#10750) --- src/screens/Messages/components/InviteLinkDialog.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/screens/Messages/components/InviteLinkDialog.tsx b/src/screens/Messages/components/InviteLinkDialog.tsx index 6e898a0a9c..02d4505af0 100644 --- a/src/screens/Messages/components/InviteLinkDialog.tsx +++ b/src/screens/Messages/components/InviteLinkDialog.tsx @@ -14,7 +14,7 @@ import {useCreateJoinLink} from '#/state/queries/messages/create-join-link' import {useDisableJoinLink} from '#/state/queries/messages/disable-join-link' import {useEditJoinLink} from '#/state/queries/messages/edit-join-link' import {useEnableJoinLink} from '#/state/queries/messages/enable-join-link' -import {atoms as a, useTheme, web} from '#/alf' +import {atoms as a, native, useTheme, web} from '#/alf' import { Button, ButtonIcon, @@ -304,7 +304,7 @@ export function InviteLinkDialog({ header = linkEnabled ? l`Invite link` : l`Invite link disabled` content = ( <> - + { setStep(defaultStep) setWhoCanJoin(defaultWhoCanJoin) - }}> + }} + nativeOptions={{preventExpansion: true}}> Date: Mon, 8 Jun 2026 05:28:24 -0700 Subject: [PATCH 101/149] Block posting of invalid chat invites (#10757) Co-authored-by: Samuel Newman --- src/components/dms/ChatInvite/Root.tsx | 2 +- src/state/queries/resolve-link.ts | 31 +++++++++++--------------- src/view/com/composer/Composer.tsx | 20 ++++++++++++++++- 3 files changed, 33 insertions(+), 20 deletions(-) diff --git a/src/components/dms/ChatInvite/Root.tsx b/src/components/dms/ChatInvite/Root.tsx index a2cfc558ea..025cae7a2e 100644 --- a/src/components/dms/ChatInvite/Root.tsx +++ b/src/components/dms/ChatInvite/Root.tsx @@ -10,7 +10,7 @@ import {type ButtonColor} from '#/components/Button' import {ArrowRight_Stroke2_Corner0_Rounded as ArrowRightIcon} from '#/components/icons/Arrow' import {ArrowBoxRight_Stroke2_Corner3_Rounded as JoinIcon} from '#/components/icons/ArrowBoxRight' import {ChainLink_Stroke2_Corner0_Rounded as LinkIcon} from '#/components/icons/ChainLink' -import {CheckThick_Stroke2_Corner0_Rounded as CheckIcon} from '#/components/icons/Check' +import {Check_Stroke2_Corner0_Rounded as CheckIcon} from '#/components/icons/Check' import {type Props as SVGIconProps} from '#/components/icons/common' import {RaisingHand4Finger_Stroke2_Corner2_Rounded as HandIcon} from '#/components/icons/RaisingHand' import {Warning_Stroke2_Corner0_Rounded as WarningIcon} from '#/components/icons/Warning' diff --git a/src/state/queries/resolve-link.ts b/src/state/queries/resolve-link.ts index a6b21e0bcc..2ccd0af863 100644 --- a/src/state/queries/resolve-link.ts +++ b/src/state/queries/resolve-link.ts @@ -1,5 +1,5 @@ -import {type BskyAgent} from '@atproto/api' -import {type QueryClient, useQuery} from '@tanstack/react-query' +import {type AtpAgent} from '@atproto/api' +import {type QueryClient, queryOptions, useQuery} from '@tanstack/react-query' import {type ResolvedLink, resolveGif, resolveLink} from '#/lib/api/resolve' import {STALE} from '#/state/queries/index' @@ -12,29 +12,24 @@ export const RQKEY_LINK = (url: string) => [RQKEY_LINK_ROOT, url] export const RQKEY_GIF_ROOT = 'resolve-gif' export const RQKEY_GIF = (url: string) => [RQKEY_GIF_ROOT, url] -export function useResolveLinkQuery(url: string) { - const agent = useAgent() - - return useQuery({ +export function resolveLinkQueryOptions(agent: AtpAgent, url: string) { + return queryOptions({ staleTime: STALE.HOURS.ONE, queryKey: RQKEY_LINK(url), - queryFn: async () => { - return await resolveLink(agent, url) - }, + queryFn: () => resolveLink(agent, url), }) } + +export function useResolveLinkQuery(url: string) { + const agent = useAgent() + return useQuery(resolveLinkQueryOptions(agent, url)) +} export function fetchResolveLinkQuery( queryClient: QueryClient, - agent: BskyAgent, + agent: AtpAgent, url: string, ) { - return queryClient.fetchQuery({ - staleTime: STALE.HOURS.ONE, - queryKey: RQKEY_LINK(url), - queryFn: async () => { - return await resolveLink(agent, url) - }, - }) + return queryClient.fetchQuery(resolveLinkQueryOptions(agent, url)) } export function precacheResolveLinkQuery( queryClient: QueryClient, @@ -56,7 +51,7 @@ export function useResolveGifQuery(gif: Gif) { } export function fetchResolveGifQuery( queryClient: QueryClient, - agent: BskyAgent, + agent: AtpAgent, gif: Gif, ) { return queryClient.fetchQuery({ diff --git a/src/view/com/composer/Composer.tsx b/src/view/com/composer/Composer.tsx index e130472c72..ab8f4d9cc5 100644 --- a/src/view/com/composer/Composer.tsx +++ b/src/view/com/composer/Composer.tsx @@ -57,7 +57,7 @@ import { import {plural} from '@lingui/core/macro' import {Trans, useLingui} from '@lingui/react/macro' import {useNavigation} from '@react-navigation/native' -import {useQueryClient} from '@tanstack/react-query' +import {useQueries, useQueryClient} from '@tanstack/react-query' import * as apilib from '#/lib/api/index' import {EmbeddingDisabledError} from '#/lib/api/resolve' @@ -95,6 +95,7 @@ import { } from '#/state/preferences/languages' import {usePreferencesQuery} from '#/state/queries/preferences' import {useProfileQuery} from '#/state/queries/profile' +import {resolveLinkQueryOptions} from '#/state/queries/resolve-link' import {useAgent, useSession} from '#/state/session' import {useComposerControls} from '#/state/shell/composer' import {type ComposerOpts, type OnPostSuccessData} from '#/state/shell/composer' @@ -865,8 +866,25 @@ export const ComposePost = ({ } }, [thread, requireAltTextEnabled, l]) + // Subscribe to the resolve-link cache for any link URIs in the thread so we + // can detect chat invites that resolved to no preview (revoked/expired) and + // block publishing - otherwise the post would go out without the embed. + const linkUris = thread.posts + .filter(post => post.embed.link) + .map(post => post.embed.link!.uri) + const linkQueries = useQueries({ + queries: linkUris.map(uri => ({ + ...resolveLinkQueryOptions(agent, uri), + enabled: false, + })), + }) + const hasUnavailableChatInvite = linkQueries.some( + q => q.data?.type === 'chat-invite' && !q.data.view, + ) + const canPost = !missingAltError && + !hasUnavailableChatInvite && thread.posts.some(post => !isEmptyPost(post)) && thread.posts.every( post => From d9345cb1cfc54c54123044e0306c014e32b347ae Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Mon, 8 Jun 2026 19:20:37 +0300 Subject: [PATCH 102/149] [Chat] Fix footer logic (#10785) --- .../Messages/components/MessagesList.tsx | 17 ++++++++++++++++- .../queries/messages/list-conversations.tsx | 11 ++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/screens/Messages/components/MessagesList.tsx b/src/screens/Messages/components/MessagesList.tsx index 727829795c..2d471a8d35 100644 --- a/src/screens/Messages/components/MessagesList.tsx +++ b/src/screens/Messages/components/MessagesList.tsx @@ -709,7 +709,13 @@ function getFooterState( convoState: ActiveConvoStates, hasAcceptOverride?: boolean, ): FooterState { - if (convoState.convo.view.status === 'request' && !hasAcceptOverride) { + const isRequest = + convoState.convo.view.status === 'request' && !hasAcceptOverride + + // For group chats, the request footer is driven purely off status: the owner + // is always 'accepted' so never sees it, while members the owner added are + // 'request' until they accept. This holds even before any messages load. + if (convoState.convo.kind === 'group' && isRequest) { return 'request' } @@ -721,6 +727,15 @@ function getFooterState( } } + // For direct chats, only show the request footer once there's a message. The + // viewer's status stays 'request' until they send their first message, so an + // empty direct request is one the viewer started themselves (show the + // composer), whereas any message present must be an incoming one from the + // other user (show the accept/reject footer). + if (isRequest) { + return 'request' + } + return 'standard' } diff --git a/src/state/queries/messages/list-conversations.tsx b/src/state/queries/messages/list-conversations.tsx index 372ef708f3..62f5772bef 100644 --- a/src/state/queries/messages/list-conversations.tsx +++ b/src/state/queries/messages/list-conversations.tsx @@ -738,7 +738,16 @@ function calculateCount( moderateProfile(convo.primaryMember, moderationOpts).blocked || convo.primaryMember.handle === 'missing.invalid' || (convo.kind === 'group' && convo.details.lockStatus !== 'unlocked') - const unreadCount = !shouldIgnore && convo.view.unreadCount > 0 ? 1 : 0 + const unreadJoinRequestCount = + convo.kind === 'group' + ? (convo.details.unreadJoinRequestCount ?? 0) + : 0 + + const unreadCount = + !shouldIgnore && + (convo.view.unreadCount > 0 || unreadJoinRequestCount > 0) + ? 1 + : 0 return acc + unreadCount }, 0) ?? 0 From c4f3a2cb89b72b59ad25f2cdad303f5f3d747eb3 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Mon, 8 Jun 2026 19:26:23 +0300 Subject: [PATCH 103/149] [Chat] Rename invite route to /chat/ (#10782) --- __tests__/lib/strings/url-helpers.test.ts | 40 +++++++++---------- bskyweb/cmd/bskyweb/server.go | 6 +-- src/Navigation.tsx | 2 +- src/components/Post/Embed/ChatInviteEmbed.tsx | 2 +- src/components/dms/ChatInvite/Root.tsx | 2 +- src/lib/strings/url-helpers.ts | 2 +- .../Messages/components/InviteLinkDialog.tsx | 2 +- 7 files changed, 28 insertions(+), 28 deletions(-) diff --git a/__tests__/lib/strings/url-helpers.test.ts b/__tests__/lib/strings/url-helpers.test.ts index 23ffaa2875..dd1a096ef5 100644 --- a/__tests__/lib/strings/url-helpers.test.ts +++ b/__tests__/lib/strings/url-helpers.test.ts @@ -184,39 +184,39 @@ describe('getChatInviteCodeFromUrl', () => { type Case = [string, string | undefined] const cases: Case[] = [ - ['https://bsky.app/c/abcdefg', 'abcdefg'], - ['https://bsky.app/c/abcdefghij', 'abcdefghij'], + ['https://bsky.app/chat/abcdefg', 'abcdefg'], + ['https://bsky.app/chat/abcdefghij', 'abcdefghij'], // http is not recognized as a bsky.app url - ['http://bsky.app/c/abcdefg', undefined], - ['https://bsky.app/c/abcdefg?utm=foo', 'abcdefg'], - ['https://bsky.app/c/abcdefg#section', 'abcdefg'], - ['/c/abcdefg', 'abcdefg'], - ['/c/abcdefg?utm=foo', 'abcdefg'], - ['/c/abcdefg#section', 'abcdefg'], + ['http://bsky.app/chat/abcdefg', undefined], + ['https://bsky.app/chat/abcdefg?utm=foo', 'abcdefg'], + ['https://bsky.app/chat/abcdefg#section', 'abcdefg'], + ['/chat/abcdefg', 'abcdefg'], + ['/chat/abcdefg?utm=foo', 'abcdefg'], + ['/chat/abcdefg#section', 'abcdefg'], // too short - ['https://bsky.app/c/abcdef', undefined], - ['/c/abcdef', undefined], + ['https://bsky.app/chat/abcdef', undefined], + ['/chat/abcdef', undefined], // too long - ['https://bsky.app/c/abcdefghijk', undefined], - ['/c/abcdefghijk', undefined], + ['https://bsky.app/chat/abcdefghijk', undefined], + ['/chat/abcdefghijk', undefined], // invalid characters - ['https://bsky.app/c/abc-def', undefined], - ['/c/abc def', undefined], + ['https://bsky.app/chat/abc-def', undefined], + ['/chat/abc def', undefined], // trailing path - ['https://bsky.app/c/abcdefg/extra', undefined], - ['/c/abcdefg/extra', undefined], + ['https://bsky.app/chat/abcdefg/extra', undefined], + ['/chat/abcdefg/extra', undefined], // wrong path ['https://bsky.app/profile/abcdefg', undefined], - ['https://bsky.app/c', undefined], + ['https://bsky.app/chat', undefined], // wrong host - ['https://example.com/c/abcdefg', undefined], + ['https://example.com/chat/abcdefg', undefined], // not a url, not a path - ['c/abcdefg', undefined], + ['chat/abcdefg', undefined], ['abcdefg', undefined], ['', undefined], // malformed url - ['https://[invalid/c/abcdefg', undefined], + ['https://[invalid/chat/abcdefg', undefined], ] it.each(cases)('given input %p, returns %p', (input, expected) => { diff --git a/bskyweb/cmd/bskyweb/server.go b/bskyweb/cmd/bskyweb/server.go index cc5119e8d4..c4f31f20b4 100644 --- a/bskyweb/cmd/bskyweb/server.go +++ b/bskyweb/cmd/bskyweb/server.go @@ -88,7 +88,7 @@ func serve(cctx *cli.Context) error { Host: appviewHost, } - // optional client for the chat appview, used by /c/ for OG previews. + // optional client for the chat appview, used by /chat/ for OG previews. var chatXrpcc *xrpc.Client if chatHost != "" { chatXrpcc = &xrpc.Client{ @@ -367,7 +367,7 @@ func serve(cctx *cli.Context) error { e.GET("/start/:handleOrDID/:rkey", server.WebStarterPack) // chat invites - e.GET("/c/:code", server.WebChatInvite) + e.GET("/chat/:code", server.WebChatInvite) // bookmarks e.GET("/saved", server.WebGeneric) @@ -695,7 +695,7 @@ func (srv *Server) WebChatInvite(c echo.Context) error { data["title"] = preview.Name if srv.cfg.ogcardHost != "" { - // bskyogcard registers this route as /chat-invite/:code, not /c/:code. + // bskyogcard registers this route as /chat-invite/:code, not /chat/:code. data["imgThumbUrl"] = fmt.Sprintf("%s/chat-invite/%s", srv.cfg.ogcardHost, code) } return c.Render(http.StatusOK, "chatinvite.html", data) diff --git a/src/Navigation.tsx b/src/Navigation.tsx index efd1125295..ceebcf3986 100644 --- a/src/Navigation.tsx +++ b/src/Navigation.tsx @@ -804,7 +804,7 @@ const LINKING = { return buildStateObject('Flat', 'Home', params) } - // Chat invite URLs (`/c/:code`) are handled by `useIntentHandler`, which + // Chat invite URLs (`/chat/:code`) are handled by `useIntentHandler`, which // opens the GroupChatJoinDialog (or the logged-out join flow). Route the // path to Home so the dialog overlays Home instead of NotFound. On native, // react-navigation strips the `bluesky://` prefix and passes the path diff --git a/src/components/Post/Embed/ChatInviteEmbed.tsx b/src/components/Post/Embed/ChatInviteEmbed.tsx index 387c3cfd9c..16f05cbfea 100644 --- a/src/components/Post/Embed/ChatInviteEmbed.tsx +++ b/src/components/Post/Embed/ChatInviteEmbed.tsx @@ -8,7 +8,7 @@ import {JoinRequestEmbedBody} from '#/components/Post/Embed/JoinRequestEmbed' /** * Renders a chat invite link found in an `app.bsky.embed.external` embed (e.g. - * a `bsky.app/c/` link posted to the feed) as a join request card, + * a `bsky.app/chat/` link posted to the feed) as a join request card, * falling back to a plain external embed if the invite can't be resolved. */ export function ChatInviteEmbed({ diff --git a/src/components/dms/ChatInvite/Root.tsx b/src/components/dms/ChatInvite/Root.tsx index 025cae7a2e..ddfdec0d56 100644 --- a/src/components/dms/ChatInvite/Root.tsx +++ b/src/components/dms/ChatInvite/Root.tsx @@ -78,7 +78,7 @@ export function Root({ color: 'primary', disabled: false, onPress: () => { - void setStringAsync(`https://bsky.app/c/${preview.code}`) + void setStringAsync(`https://bsky.app/chat/${preview.code}`) Toast.show(l`Copied to clipboard`, {type: 'success'}) }, } diff --git a/src/lib/strings/url-helpers.ts b/src/lib/strings/url-helpers.ts index fd1a5ef7d9..38d3d70813 100644 --- a/src/lib/strings/url-helpers.ts +++ b/src/lib/strings/url-helpers.ts @@ -179,7 +179,7 @@ export function isBskyStarterPackUrl(url: string): boolean { } // Invite codes are 7 alphanumeric characters long, supporting up to 10 here to future-proof. -export const CHAT_INVITE_CODE_REGEX = /^\/c\/([a-zA-Z0-9]{7,10})$/ +export const CHAT_INVITE_CODE_REGEX = /^\/chat\/([a-zA-Z0-9]{7,10})$/ export function getChatInviteCodeFromUrl(url: string): string | undefined { let pathname: string diff --git a/src/screens/Messages/components/InviteLinkDialog.tsx b/src/screens/Messages/components/InviteLinkDialog.tsx index 02d4505af0..636e2be64e 100644 --- a/src/screens/Messages/components/InviteLinkDialog.tsx +++ b/src/screens/Messages/components/InviteLinkDialog.tsx @@ -292,7 +292,7 @@ export function InviteLinkDialog({ const linkEnabled = joinLink?.enabledStatus === 'enabled' const linkDisabled = joinLink?.enabledStatus === 'disabled' const joinLinkURI = joinLink?.code - ? `https://bsky.app/c/${joinLink.code}` + ? `https://bsky.app/chat/${joinLink.code}` : 'https://bsky.app/' const createdAt = joinLink ? new Date(joinLink.createdAt) : null const currentOption = From 0090285fc0e8ee8f4a722749b3e217428fdab1d7 Mon Sep 17 00:00:00 2001 From: Spence Pope Date: Mon, 8 Jun 2026 12:44:59 -0400 Subject: [PATCH 104/149] Refactor photo embed analytics to post:photoEmbed:* namespace (#10784) Co-authored-by: Eric Bailey Co-authored-by: Claude Opus 4.8 (1M context) --- src/analytics/metrics/types.ts | 31 ++++++++-- src/components/Lightbox/pager/ImagePager.tsx | 20 ++++++- src/components/Lightbox/state.tsx | 10 ++++ src/components/Post/Embed/ImageEmbed.tsx | 29 ++++++++- src/components/Post/Embed/index.tsx | 3 + src/components/Post/Embed/types.ts | 7 +++ src/components/images/Gallery/index.tsx | 20 +++++-- .../components/ThreadItemAnchor.tsx | 2 + .../PostThread/components/ThreadItemPost.tsx | 1 + .../components/ThreadItemTreePost.tsx | 1 + src/view/com/post/Post.tsx | 1 + src/view/com/posts/PostFeed.tsx | 60 +++++++++++++++---- src/view/com/posts/PostFeedItem.tsx | 5 ++ 13 files changed, 164 insertions(+), 26 deletions(-) diff --git a/src/analytics/metrics/types.ts b/src/analytics/metrics/types.ts index 90dbc4f983..5157c66e30 100644 --- a/src/analytics/metrics/types.ts +++ b/src/analytics/metrics/types.ts @@ -1175,18 +1175,37 @@ export type Events = { 'profile:associated:germ:self-disconnect': {} 'profile:associated:germ:self-reconnect': {} - // Gallery carousel events - 'post:gallery:swipe': { + // Post photo embed events + 'post:photoEmbed:impression': { + layout: 'single' | 'grid' | 'carousel' + totalImages: number + postUri: string + postAuthorDid: string + feedDescriptor?: string + } + 'post:photoEmbed:open': { + layout: 'single' | 'grid' | 'carousel' + fromImage: number + totalImages: number + postUri: string + postAuthorDid: string + feedDescriptor?: string + } + 'post:photoEmbed:carouselSwipe': { fromImage: number toImage: number totalImages: number + postUri: string + postAuthorDid: string + feedDescriptor?: string } - 'post:gallery:openLightbox': { + 'post:photoEmbed:lightboxSwipe': { + layout: 'single' | 'grid' | 'carousel' fromImage: number - totalImages: number - } - 'post:gallery:impression': { + toImage: number totalImages: number postUri: string + postAuthorDid: string + feedDescriptor?: string } } diff --git a/src/components/Lightbox/pager/ImagePager.tsx b/src/components/Lightbox/pager/ImagePager.tsx index 7b8815f276..43942b0f37 100644 --- a/src/components/Lightbox/pager/ImagePager.tsx +++ b/src/components/Lightbox/pager/ImagePager.tsx @@ -39,6 +39,7 @@ import {type Dimensions} from '#/lib/media/types' import {useTheme} from '#/alf' import {setSystemUITheme} from '#/alf/util/systemUI' import {type Lightbox} from '#/components/Lightbox/state' +import {useAnalytics} from '#/analytics' import {IS_IOS} from '#/env' import {PlatformInfo} from '../../../../modules/expo-bluesky-swiss-army' import {Footer} from '../chrome/Footer' @@ -228,7 +229,8 @@ function ImageView({ openProgress: SharedValue thumbRects: SharedValue> }) { - const {images, index: initialImageIndex} = lightbox + const {images, index: initialImageIndex, metricsContext} = lightbox + const ax = useAnalytics() const isAnimated = useMemo(() => canAnimate(lightbox), [lightbox]) const [isScaled, setIsScaled] = useState(false) const [isDragging, setIsDragging] = useState(false) @@ -377,7 +379,21 @@ function ImageView({ scrollEnabled={!isScaled} initialPage={initialImageIndex} onPageSelected={e => { - setImageIndex(e.nativeEvent.position) + const next = e.nativeEvent.position + setImageIndex(prev => { + if (metricsContext && prev !== next) { + ax.metric('post:photoEmbed:lightboxSwipe', { + layout: metricsContext.layout, + fromImage: prev + 1, + toImage: next + 1, + totalImages: images.length, + postUri: metricsContext.postUri, + postAuthorDid: metricsContext.postAuthorDid, + feedDescriptor: metricsContext.feedDescriptor, + }) + } + return next + }) setIsScaled(false) }} onPageScrollStateChanged={e => { diff --git a/src/components/Lightbox/state.tsx b/src/components/Lightbox/state.tsx index 23af527734..6a8fdbe0b7 100644 --- a/src/components/Lightbox/state.tsx +++ b/src/components/Lightbox/state.tsx @@ -11,10 +11,20 @@ import {useNonReactiveCallback} from '#/lib/hooks/useNonReactiveCallback' import {useHotkeysContext} from '#/lib/hotkeys' import {type ImageSource} from '#/components/Lightbox/types' +export type LightboxMetricsContext = { + layout: 'single' | 'grid' | 'carousel' + postUri: string + postAuthorDid: string + feedDescriptor?: string +} + export type Lightbox = { id: string images: ImageSource[] index: number + // Set for post photo embeds so the lightbox can emit post:photoEmbed:lightboxSwipe. + // Left unset for non-post contexts (e.g. profile avatar/banner lightbox). + metricsContext?: LightboxMetricsContext } const LightboxContext = createContext<{ diff --git a/src/components/Post/Embed/ImageEmbed.tsx b/src/components/Post/Embed/ImageEmbed.tsx index 0a620efde4..9d47302063 100644 --- a/src/components/Post/Embed/ImageEmbed.tsx +++ b/src/components/Post/Embed/ImageEmbed.tsx @@ -8,7 +8,10 @@ import {atoms as a, tokens} from '#/alf' import {AutoSizedImage} from '#/components/images/AutoSizedImage' import {Gallery} from '#/components/images/Gallery' import {ImageLayoutGrid} from '#/components/images/ImageLayoutGrid' -import {useLightboxControls} from '#/components/Lightbox/state' +import { + type LightboxMetricsContext, + useLightboxControls, +} from '#/components/Lightbox/state' import {type Dimensions} from '#/components/Lightbox/types' import {ImageContextMenu} from '#/components/Post/Embed/ImageContextMenu' import {PostEmbedViewContext} from '#/components/Post/Embed/types' @@ -40,6 +43,20 @@ export function ImageEmbed({ ? images.length > MAX_GRID_IMAGES : ax.features.enabled(ax.features.PostGalleryEmbedEnable) + const layout: 'single' | 'grid' | 'carousel' = + images.length === 1 ? 'single' : useExpandedLayout ? 'carousel' : 'grid' + + const postContext = rest.post + ? { + postUri: rest.post.uri, + postAuthorDid: rest.post.author.did, + feedDescriptor: rest.feedDescriptor, + } + : undefined + const metricsContext: LightboxMetricsContext | undefined = postContext + ? {layout, ...postContext} + : undefined + // Captured from AutoSizedImage so the peek-commit handler can reuse the same // ref + dims that a tap would — keeps the lightbox's return animation intact. const singleContainerRef = useRef | null>(null) @@ -57,6 +74,14 @@ export function ImageEmbed({ refs: AnimatedRef[], fetchedDims: (Dimensions | null)[], ) => { + if (postContext) { + ax.metric('post:photoEmbed:open', { + layout, + fromImage: index + 1, + totalImages: images.length, + ...postContext, + }) + } openLightbox({ images: items.map((item, i) => ({ ...item, @@ -67,6 +92,7 @@ export function ImageEmbed({ type: 'image', })), index, + metricsContext, }) } const onPressIn = (_: number) => { @@ -132,6 +158,7 @@ export function ImageEmbed({ onPressIn={onPressIn} viewContext={rest.viewContext} isWithinQuote={rest.isWithinQuote} + metricsPostContext={postContext} /> ) diff --git a/src/components/Post/Embed/index.tsx b/src/components/Post/Embed/index.tsx index 28eed2aaa9..69d92983ed 100644 --- a/src/components/Post/Embed/index.tsx +++ b/src/components/Post/Embed/index.tsx @@ -345,6 +345,9 @@ export function QuoteEmbed({ allowNestedQuotes={ parentIsWithinQuote ? false : parentAllowNestedQuotes } + // The photo embed belongs to the quoted post, so attribute its + // analytics to the quoted post rather than the parent. + post={quote} /> )} diff --git a/src/components/Post/Embed/types.ts b/src/components/Post/Embed/types.ts index 6c023a14ef..77319b0e86 100644 --- a/src/components/Post/Embed/types.ts +++ b/src/components/Post/Embed/types.ts @@ -15,6 +15,13 @@ export type CommonProps = { viewContext?: PostEmbedViewContext isWithinQuote?: boolean allowNestedQuotes?: boolean + /** + * The post that contains this embed. Used for analytics on photo embed + * events (post:photoEmbed:*). When the embed has no owning post (e.g. + * composer previews), leave this undefined and no events will be emitted. + */ + post?: AppBskyFeedDefs.PostView + feedDescriptor?: string } export type EmbedProps = CommonProps & { diff --git a/src/components/images/Gallery/index.tsx b/src/components/images/Gallery/index.tsx index 0ca46c0b67..1b4e1d6239 100644 --- a/src/components/images/Gallery/index.tsx +++ b/src/components/images/Gallery/index.tsx @@ -55,6 +55,13 @@ interface GalleryProps { onPressIn?: (index: number) => void viewContext?: PostEmbedViewContext isWithinQuote?: boolean + // Post context for the in-feed carousel swipe metric. Omit for non-post + // contexts (no event will be emitted). + metricsPostContext?: { + postUri: string + postAuthorDid: string + feedDescriptor?: string + } } const Context = createContext<{ @@ -99,6 +106,7 @@ export function Gallery({ onPressIn, viewContext, isWithinQuote, + metricsPostContext, }: GalleryProps) { const {t: l} = useLingui() const ax = useAnalytics() @@ -169,13 +177,17 @@ export function Gallery({ const emitSwipeMetric = useMemo( () => debounce((fromIndex: number, toIndex: number) => { - ax.metric('post:gallery:swipe', { + if (!metricsPostContext) return + ax.metric('post:photoEmbed:carouselSwipe', { fromImage: fromIndex + 1, // convert to 1-based index for easier analysis toImage: toIndex + 1, // convert to 1-based index for easier analysis totalImages: images.length, + postUri: metricsPostContext.postUri, + postAuthorDid: metricsPostContext.postAuthorDid, + feedDescriptor: metricsPostContext.feedDescriptor, }) }, 200), - [ax, images.length], + [ax, images.length, metricsPostContext], ) const setCurrentIndex = (index: number) => { @@ -277,10 +289,6 @@ export function Gallery({ renderItem={({item, index}) => { const openLightboxAtIndex = onPress ? () => { - ax.metric('post:gallery:openLightbox', { - fromImage: index + 1, // convert to 1-based index for easier analysis - totalImages: images.length, - }) const refs: AnimatedRef[] = [] const dims: (Dimensions | null)[] = [] for (let i = 0; i < images.length; i++) { diff --git a/src/screens/PostThread/components/ThreadItemAnchor.tsx b/src/screens/PostThread/components/ThreadItemAnchor.tsx index 17c8e54be8..dc3c55f125 100644 --- a/src/screens/PostThread/components/ThreadItemAnchor.tsx +++ b/src/screens/PostThread/components/ThreadItemAnchor.tsx @@ -414,6 +414,8 @@ const ThreadItemAnchorInner = memo(function ThreadItemAnchorInner({ moderation={moderation} viewContext={PostEmbedViewContext.ThreadHighlighted} onOpen={onOpenEmbed} + post={post} + feedDescriptor={feedFeedback.feedDescriptor} /> )} diff --git a/src/screens/PostThread/components/ThreadItemPost.tsx b/src/screens/PostThread/components/ThreadItemPost.tsx index 841c2af745..c1e27222ff 100644 --- a/src/screens/PostThread/components/ThreadItemPost.tsx +++ b/src/screens/PostThread/components/ThreadItemPost.tsx @@ -349,6 +349,7 @@ const ThreadItemPostInner = memo(function ThreadItemPostInner({ embed={post.embed} moderation={moderation} viewContext={PostEmbedViewContext.Feed} + post={post} /> )} diff --git a/src/screens/PostThread/components/ThreadItemTreePost.tsx b/src/screens/PostThread/components/ThreadItemTreePost.tsx index 6ee116d166..9868786648 100644 --- a/src/screens/PostThread/components/ThreadItemTreePost.tsx +++ b/src/screens/PostThread/components/ThreadItemTreePost.tsx @@ -371,6 +371,7 @@ const ThreadItemTreePostInner = memo(function ThreadItemTreePostInner({ embed={post.embed} moderation={moderation} viewContext={PostEmbedViewContext.Feed} + post={post} /> )} diff --git a/src/view/com/post/Post.tsx b/src/view/com/post/Post.tsx index 62e7cb2aae..c952224553 100644 --- a/src/view/com/post/Post.tsx +++ b/src/view/com/post/Post.tsx @@ -255,6 +255,7 @@ function PostInner({ embed={post.embed} moderation={moderation} viewContext={PostEmbedViewContext.Feed} + post={post} /> ) : null} diff --git a/src/view/com/posts/PostFeed.tsx b/src/view/com/posts/PostFeed.tsx index 48754d2753..20c6a31a3a 100644 --- a/src/view/com/posts/PostFeed.tsx +++ b/src/view/com/posts/PostFeed.tsx @@ -13,6 +13,8 @@ import { import { type AppBskyActorDefs, AppBskyEmbedExternal, + AppBskyEmbedGallery, + AppBskyEmbedImages, AppBskyEmbedVideo, type AppBskyFeedDefs, } from '@atproto/api' @@ -907,7 +909,9 @@ let PostFeed = ({ const seenActorWithStatusRef = useRef>(new Set()) const seenPostUrisRef = useRef>(new Set()) - const seenStandardSiteUrisRef = useRef>(new Set()) + // Tracks every post we've seen so we can fire per-post events exactly once, + // regardless of the post's position within its slice. + const seenPerPostUrisRef = useRef>(new Set()) // Helper to calculate position in feed (count only root posts, not interstitials or thread replies) const getPostPosition = useNonReactiveCallback( @@ -940,6 +944,48 @@ let PostFeed = ({ (item: FeedRow) => { feedFeedback.onItemSeen(item) + // Events that should fire exactly once for every new post, regardless of + // its position within a slice or video grid row. + const onPostSeen = (post: AppBskyFeedDefs.PostView) => { + if (seenPerPostUrisRef.current.has(post.uri)) return + seenPerPostUrisRef.current.add(post.uri) + + // Standard site embed view tracking + if ( + AppBskyEmbedExternal.isView(post.embed) && + isStandardSiteEmbed(post.embed.external) + ) { + ax.metric('embed:standardSite:view', {url: post.embed.external.uri}) + } + + // Photo embed impression tracking + if ( + AppBskyEmbedImages.isView(post.embed) || + AppBskyEmbedGallery.isView(post.embed) + ) { + const totalImages = AppBskyEmbedGallery.isView(post.embed) + ? post.embed.items.filter(AppBskyEmbedGallery.isViewImage).length + : post.embed.images.length + const useExpandedLayout = AppBskyEmbedGallery.isView(post.embed) + ? totalImages > 4 + : ax.features.enabled(ax.features.PostGalleryEmbedEnable) + const layout = + totalImages === 1 + ? 'single' + : useExpandedLayout + ? 'carousel' + : 'grid' + + ax.metric('post:photoEmbed:impression', { + layout, + totalImages, + postUri: post.uri, + postAuthorDid: post.author.did, + feedDescriptor: feedFeedback.feedDescriptor || feed, + }) + } + } + // Track post:view events if (item.type === 'sliceItem') { const slice = item.slice @@ -947,6 +993,8 @@ let PostFeed = ({ const postItem = slice.items[indexInSlice] const post = postItem.post + onPostSeen(post) + // Only track the root post of each slice (index 0) to avoid double-counting thread items if (indexInSlice === 0 && !seenPostUrisRef.current.has(post.uri)) { seenPostUrisRef.current.add(post.uri) @@ -977,16 +1025,6 @@ let PostFeed = ({ }) } } - - // Standard site embed view tracking - if ( - AppBskyEmbedExternal.isView(post.embed) && - isStandardSiteEmbed(post.embed.external) && - !seenStandardSiteUrisRef.current.has(post.embed.external.uri) - ) { - seenStandardSiteUrisRef.current.add(post.embed.external.uri) - ax.metric('embed:standardSite:view', {url: post.embed.external.uri}) - } } else if (item.type === 'videoGridRow') { // Track each video in the grid row for (let i = 0; i < item.items.length; i++) { diff --git a/src/view/com/posts/PostFeedItem.tsx b/src/view/com/posts/PostFeedItem.tsx index 748d14faca..c0ff26206d 100644 --- a/src/view/com/posts/PostFeedItem.tsx +++ b/src/view/com/posts/PostFeedItem.tsx @@ -429,6 +429,7 @@ let FeedItemInner = ({ onOpenEmbed={onOpenEmbed} post={post} additionalPostAlerts={additionalPostAlerts} + feedDescriptor={feedDescriptor} /> void post: AppBskyFeedDefs.PostView additionalPostAlerts?: AppModerationCause[] + feedDescriptor?: string }): React.ReactNode => { const [limitLines, setLimitLines] = useState( () => countLines(richText.text) >= MAX_POST_LINES, @@ -528,6 +531,8 @@ let PostContent = ({ moderation={moderation} onOpen={onOpenEmbed} viewContext={PostEmbedViewContext.Feed} + post={post} + feedDescriptor={feedDescriptor} /> ) : null} From 9b5fc19613ce92ca391f00ddb75513ba98907783 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Mon, 8 Jun 2026 20:07:35 +0300 Subject: [PATCH 105/149] [Chat] Centralize conversation report-subject resolution (#10754) Co-authored-by: Claude Opus 4.8 (1M context) --- src/components/dms/ConvoMenu.tsx | 122 ++++++++---------- src/components/dms/MessagesListHeader.tsx | 17 +-- src/components/dms/util.ts | 39 ++++++ .../Messages/components/ChatListItem.tsx | 14 +- .../Messages/components/ChatStatusInfo.tsx | 12 +- .../components/IncomingRequestListItem.tsx | 2 +- .../Messages/components/RequestButtons.tsx | 93 ++++++------- 7 files changed, 151 insertions(+), 148 deletions(-) diff --git a/src/components/dms/ConvoMenu.tsx b/src/components/dms/ConvoMenu.tsx index 1e492c80d4..2eac8cdb3a 100644 --- a/src/components/dms/ConvoMenu.tsx +++ b/src/components/dms/ConvoMenu.tsx @@ -1,6 +1,6 @@ import {memo, useCallback} from 'react' import {Keyboard, View} from 'react-native' -import {ChatBskyConvoDefs, type ModerationCause} from '@atproto/api' +import {type ModerationCause} from '@atproto/api' import {Trans, useLingui} from '@lingui/react/macro' import {useNavigation} from '@react-navigation/native' import {useQueryClient} from '@tanstack/react-query' @@ -16,13 +16,18 @@ import { unstableCacheProfileView, useProfileBlockMutationQueue, } from '#/state/queries/profile' +import {useSession} from '#/state/session' import {type ViewStyleProp} from '#/alf' import {atoms as a} from '#/alf' import {Button, ButtonIcon} from '#/components/Button' +import {AfterReportConversationDialog} from '#/components/dms/AfterReportConversationDialog' import {AfterReportDialog} from '#/components/dms/AfterReportDialog' import {BlockedByListDialog} from '#/components/dms/BlockedByListDialog' import {LeaveConvoPrompt} from '#/components/dms/LeaveConvoPrompt' -import {ReportConversationDialog} from '#/components/dms/ReportConversationDialog' +import { + type ConvoWithDetails, + getConvoReportSubject, +} from '#/components/dms/util' import {ArrowBoxLeft_Stroke2_Corner0_Rounded as ArrowBoxLeftIcon} from '#/components/icons/ArrowBoxLeft' import {Bubble_Stroke2_Corner2_Rounded as BubbleIcon} from '#/components/icons/Bubble' import {DotGrid3x1_Stroke2_Corner0_Rounded as DotsHorizontalIcon} from '#/components/icons/DotGrid' @@ -39,7 +44,6 @@ import {ReportDialog} from '#/components/moderation/ReportDialog' import * as Prompt from '#/components/Prompt' import * as Toast from '#/components/Toast' import type * as bsky from '#/types/bsky' -import {AfterReportConversationDialog} from './AfterReportConversationDialog' let ConvoMenu = ({ convo, @@ -49,10 +53,9 @@ let ConvoMenu = ({ showMarkAsRead, hideTrigger, blockInfo, - latestReportableMessage, style, }: { - convo: ChatBskyConvoDefs.ConvoView + convo: ConvoWithDetails profile: Shadow control?: Menu.MenuControlProps currentScreen: 'list' | 'conversation' @@ -62,20 +65,21 @@ let ConvoMenu = ({ listBlocks: ModerationCause[] userBlock?: ModerationCause } - latestReportableMessage?: ChatBskyConvoDefs.MessageView style?: ViewStyleProp['style'] }): React.ReactNode => { const {t: l} = useLingui() const queryClient = useQueryClient() + const {currentAccount} = useSession() const leaveConvoControl = Prompt.usePromptControl() const reportControl = Prompt.usePromptControl() const blockedByListControl = Prompt.usePromptControl() - const blockOrDeleteControl = Prompt.usePromptControl() - const deleteControl = Prompt.usePromptControl() + const afterReportControl = Prompt.usePromptControl() const {listBlocks} = blockInfo + const reportSubject = getConvoReportSubject(convo, currentAccount?.did) + return ( <> @@ -108,6 +112,7 @@ let ConvoMenu = ({ showMarkAsRead={showMarkAsRead} blockInfo={blockInfo} convo={convo} + canReport={!!reportSubject} leaveConvoControl={leaveConvoControl} reportControl={reportControl} blockedByListControl={blockedByListControl} @@ -116,54 +121,37 @@ let ConvoMenu = ({ - {latestReportableMessage ? ( - <> - { - const sender = convo.members.find( - member => member.did === latestReportableMessage.sender.did, - ) - if (sender) { - unstableCacheProfileView(queryClient, sender) - } - blockOrDeleteControl.open() - }} - /> - - + {reportSubject && ( + { + unstableCacheProfileView(queryClient, profile) + afterReportControl.open() + }} + /> + )} + {convo.kind === 'group' ? ( + ) : ( - <> - - - + )} + canReport: boolean showMarkAsRead?: boolean blockInfo: { listBlocks: ModerationCause[] @@ -201,9 +191,9 @@ function MenuContent({ const {listBlocks, userBlock} = blockInfo const isBlocking = userBlock || !!listBlocks.length const isDeletedAccount = profile.handle === 'missing.invalid' - const isGroupConvo = ChatBskyConvoDefs.isGroupConvo(initialConvo.kind) + const isGroupConvo = initialConvo.kind === 'group' - const convoId = initialConvo.id + const convoId = initialConvo.view.id const {data: convo} = useConvoQuery({convoId}) const onNavigateToProfile = useCallback(() => { @@ -299,15 +289,17 @@ function MenuContent({ )} - - - - Report conversation - - + {canReport && ( + + + + Report conversation + + + )} diff --git a/src/components/dms/MessagesListHeader.tsx b/src/components/dms/MessagesListHeader.tsx index f23e7cdfae..745adc62b7 100644 --- a/src/components/dms/MessagesListHeader.tsx +++ b/src/components/dms/MessagesListHeader.tsx @@ -1,10 +1,6 @@ import {useMemo} from 'react' import {View} from 'react-native' -import { - ChatBskyConvoDefs, - moderateProfile, - type ModerationOpts, -} from '@atproto/api' +import {moderateProfile, type ModerationOpts} from '@atproto/api' import {useLingui} from '@lingui/react/macro' import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name' @@ -12,7 +8,6 @@ import {makeProfileLink} from '#/lib/routes/links' import {sanitizeHandle} from '#/lib/strings/handles' import {useProfileShadow} from '#/state/cache/profile-shadow' import {useModerationOpts} from '#/state/preferences/moderation-opts' -import {useSession} from '#/state/session' import {PreviewableUserAvatar} from '#/view/com/util/UserAvatar' import {useIsWithinSplitView} from '#/screens/Messages/components/splitView/context' import {atoms as a, useTheme, web} from '#/alf' @@ -88,7 +83,6 @@ function ProfileHeaderReady({ }) { const t = useTheme() const {t: l} = useLingui() - const {currentAccount} = useSession() const profile = useProfileShadow(convo.primaryMember) const moderation = moderateProfile(profile, moderationOpts) @@ -110,12 +104,6 @@ function ProfileHeaderReady({ : createSanitizedDisplayName(profile, true, moderation.ui('displayName')) const handle = isDeletedAccount ? null : sanitizeHandle(profile.handle, '@') - const latestReportableMessage = - ChatBskyConvoDefs.isMessageView(convo.view.lastMessage) && - convo.view.lastMessage.sender?.did !== currentAccount?.did - ? convo.view.lastMessage - : undefined - return ( } /> diff --git a/src/components/dms/util.ts b/src/components/dms/util.ts index 7fe5f91dc3..d10b2296fb 100644 --- a/src/components/dms/util.ts +++ b/src/components/dms/util.ts @@ -10,6 +10,7 @@ import {EMOJI_REACTION_LIMIT} from '#/lib/constants' import {logger} from '#/logger' import {type Shadow} from '#/state/cache/profile-shadow' import {type ConvoState, ConvoStatus} from '#/state/messages/convo/types' +import {type ReportSubject} from '#/components/moderation/ReportDialog/types' import * as bsky from '#/types/bsky' export const MESSAGE_GAP_THRESHOLD_MS = 60 * 60 * 1000 @@ -240,3 +241,41 @@ export function parseConvoView( return null } } + +/** + * Resolves the report subject for a conversation-level "Report conversation" + * action (as opposed to reporting an individual message, which always reports + * that message + its sender). + * + * - group: always report the whole convo, targeting the owner. Returns null if + * the owner has left, in which case there is nothing to report against. + * - direct: report the last reportable message if there is one (i.e. the last + * message exists and wasn't sent by us), otherwise report the whole convo + * targeting the other user. + */ +export function getConvoReportSubject( + convo: ConvoWithDetails, + ownDid: string | undefined, +): ReportSubject | null { + if (convo.kind === 'group') { + if (!convo.primaryMember) return null + return {convoId: convo.view.id, did: convo.primaryMember.did} + } + + const lastMessage = convo.view.lastMessage + const reportableMessage = + ChatBskyConvoDefs.isMessageView(lastMessage) && + lastMessage.sender?.did !== ownDid + ? lastMessage + : null + + if (reportableMessage) { + return { + view: 'convo', + convoId: convo.view.id, + message: reportableMessage, + } + } + + return {convoId: convo.view.id, did: convo.primaryMember.did} +} diff --git a/src/screens/Messages/components/ChatListItem.tsx b/src/screens/Messages/components/ChatListItem.tsx index 70390606fc..1c83a6876b 100644 --- a/src/screens/Messages/components/ChatListItem.tsx +++ b/src/screens/Messages/components/ChatListItem.tsx @@ -307,20 +307,13 @@ function BaseChatItem({ isDeletedAccount || (convo.kind === 'group' && convo.details.lockStatus !== 'unlocked') - const { - lastMessage, - LastMessageIcon, - lastMessageSentAt, - latestReportableMessage, - } = useMemo(() => { + const {lastMessage, LastMessageIcon, lastMessageSentAt} = useMemo(() => { let lastMessage = l`No messages yet` let LastMessageIcon: React.ComponentType | null = null let lastMessageSentAt: string | null = null - let latestReportableMessage: ChatBskyConvoDefs.MessageView | undefined - // Deleted message if (ChatBskyConvoDefs.isDeletedMessageView(convo.view.lastMessage)) { lastMessageSentAt = convo.view.lastMessage.sentAt @@ -340,7 +333,6 @@ function BaseChatItem({ if (info) { lastMessage = info.message ?? lastMessage lastMessageSentAt = info.sentAt - latestReportableMessage = info.reportableMessage } } @@ -385,7 +377,6 @@ function BaseChatItem({ lastMessage, LastMessageIcon, lastMessageSentAt, - latestReportableMessage, } }, [l, convo, currentAccount?.did, isDeletedAccount, i18n]) @@ -663,7 +654,7 @@ function BaseChatItem({ {/* TODO: Allow showing menu for groups where the owner has left! */} {showMenu && primaryProfile && ( )} diff --git a/src/screens/Messages/components/ChatStatusInfo.tsx b/src/screens/Messages/components/ChatStatusInfo.tsx index ecb0139e66..e2e9a75faa 100644 --- a/src/screens/Messages/components/ChatStatusInfo.tsx +++ b/src/screens/Messages/components/ChatStatusInfo.tsx @@ -1,7 +1,7 @@ import {useCallback, useMemo} from 'react' import {View} from 'react-native' import {LinearGradient} from 'expo-linear-gradient' -import {ChatBskyConvoDefs, moderateProfile} from '@atproto/api' +import {moderateProfile} from '@atproto/api' import {Trans, useLingui} from '@lingui/react/macro' import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name' @@ -33,12 +33,6 @@ export function ChatStatusInfo({convoState}: {convoState: ActiveConvoStates}) { // if we ever allow someone other than the owner to invite people, this will need to change const otherUser = convoState.convo.primaryMember - const lastMessage = ChatBskyConvoDefs.isMessageView( - convoState.convo.view.lastMessage, - ) - ? convoState.convo.view.lastMessage - : null - if (!moderationOpts) { return null } @@ -64,9 +58,9 @@ export function ChatStatusInfo({convoState}: {convoState: ActiveConvoStates}) { {otherUser && ( ) : null} & { label?: string icon?: boolean - convo: ChatBskyConvoDefs.ConvoView + convo: ConvoWithDetails profile: ChatBskyActorDefs.ProfileViewBasic showDeleteConvo?: boolean currentScreen: 'list' | 'conversation' }) { const {t: l} = useLingui() + const {currentAccount} = useSession() const shadowedProfile = useProfileShadow(profile) const navigation = useNavigation() const queryClient = useQueryClient() - const {mutate: leaveConvo} = useLeaveConvo(convo.id, { + const {mutate: leaveConvo} = useLeaveConvo(convo.view.id, { onMutate: () => { if (currentScreen === 'conversation') { navigation.dispatch(StackActions.pop()) @@ -110,9 +117,7 @@ export function RejectMenu({ const reportControl = useDialogControl() const blockOrDeleteControl = useDialogControl() - const lastMessage = ChatBskyConvoDefs.isMessageView(convo.lastMessage) - ? convo.lastMessage - : null + const reportSubject = getConvoReportSubject(convo, currentAccount?.did) return ( <> @@ -152,50 +157,46 @@ export function RejectMenu({ - {/* note: last message will almost certainly be defined, since you can't - delete messages for other people and it's impossible for a convo on this - screen to have a message sent by you */} - {lastMessage && ( - - - Report conversation - - - - )} + + + Report conversation + + + - {lastMessage && ( - <> - { - const sender = convo.members.find( - member => member.did === lastMessage.sender.did, - ) - if (sender) { - unstableCacheProfileView(queryClient, sender) - } - blockOrDeleteControl.open() - }} - /> - - + + {reportSubject && ( + { + unstableCacheProfileView(queryClient, profile) + blockOrDeleteControl.open() + }} + /> + )} + {convo.kind === 'group' ? ( + + ) : ( + )} ) From 4142eb4834302280fc9a60751a4a3394e8f64220 Mon Sep 17 00:00:00 2001 From: DS Boyce <260543580+ds-boyce@users.noreply.github.com> Date: Mon, 8 Jun 2026 12:13:43 -0700 Subject: [PATCH 106/149] Add fade-in animation to chat footer/composer (#10786) --- .../Messages/components/MessagesList.tsx | 69 ++++++++++--------- 1 file changed, 36 insertions(+), 33 deletions(-) diff --git a/src/screens/Messages/components/MessagesList.tsx b/src/screens/Messages/components/MessagesList.tsx index 2d471a8d35..e96872a646 100644 --- a/src/screens/Messages/components/MessagesList.tsx +++ b/src/screens/Messages/components/MessagesList.tsx @@ -13,6 +13,7 @@ import { KeyboardGestureArea, } from 'react-native-keyboard-controller' import Animated, { + FadeIn, runOnJS, type ScrollEvent, type SharedValue, @@ -615,41 +616,43 @@ export function MessagesList({ opened: 0, }}> {footer ?? ( - - {({loading}) => - ax.features.enabled( - ax.features.DmsNewMessageComposerEnable, - ) ? ( - - void onSendMessage(message) - } - hasEmbed={!!messageEmbed} - setEmbed={setEmbed} - loading={loading}> - + + {({loading}) => + ax.features.enabled( + ax.features.DmsNewMessageComposerEnable, + ) ? ( + + void onSendMessage(message) + } + hasEmbed={!!messageEmbed} setEmbed={setEmbed} - /> - - ) : ( - - + + + ) : ( + - - ) - } - + loading={loading}> + + + ) + } + +
)} From fe9dabbc4a9183f0e747e37f991dbebe52b40594 Mon Sep 17 00:00:00 2001 From: DS Boyce <260543580+ds-boyce@users.noreply.github.com> Date: Mon, 8 Jun 2026 12:14:24 -0700 Subject: [PATCH 107/149] Open edit chat name dialog via tap (#10790) --- .../Messages/ConversationSettings/index.tsx | 34 +++++++++++++------ 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/src/screens/Messages/ConversationSettings/index.tsx b/src/screens/Messages/ConversationSettings/index.tsx index 2ae09b5130..b4c7e1ce03 100644 --- a/src/screens/Messages/ConversationSettings/index.tsx +++ b/src/screens/Messages/ConversationSettings/index.tsx @@ -1,5 +1,5 @@ import {useState} from 'react' -import {View} from 'react-native' +import {Pressable, View} from 'react-native' import { ChatBskyActorDefs, ChatBskyConvoDefs, @@ -8,6 +8,7 @@ import { import {Trans, useLingui} from '@lingui/react/macro' import {useNavigation} from '@react-navigation/native' +import {HITSLOP_10} from '#/lib/constants' import {useBottomBarOffset} from '#/lib/hooks/useBottomBarOffset' import {useInitialNumToRender} from '#/lib/hooks/useInitialNumToRender' import { @@ -429,6 +430,13 @@ function SettingsHeader({ const canLockGroupChat = isOwner && lockStatus !== 'locked-permanently' + const groupNameComponent = ( + + {groupName} + + ) + return ( <> - - {groupName} - + {isOwner ? ( + { + setNewGroupName(groupName) + editNamePrompt.open() + }}> + {groupNameComponent} + + ) : ( + groupNameComponent + )} Date: Mon, 8 Jun 2026 12:14:51 -0700 Subject: [PATCH 108/149] Remove TODO for uninviting group chat members (#10789) --- .../ConversationSettings/MemberMenu.tsx | 21 +++---------------- 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/src/screens/Messages/ConversationSettings/MemberMenu.tsx b/src/screens/Messages/ConversationSettings/MemberMenu.tsx index c13835a85a..9101864d91 100644 --- a/src/screens/Messages/ConversationSettings/MemberMenu.tsx +++ b/src/screens/Messages/ConversationSettings/MemberMenu.tsx @@ -38,7 +38,7 @@ export function MemberMenu({ }: { convo: ConvoWithDetails profile: Shadow - type: 'owner' | 'standard' | 'invited' + type: 'owner' | 'standard' displayName: string isOwner: boolean }) { @@ -128,10 +128,7 @@ export function MemberMenu({ } const canBlockMember = type === 'owner' || type === 'standard' - const canRemoveMember = isOwner && type !== 'invited' - // TODO Need to integrate this. -dsb - const canUninviteMember = false - // const canUninviteMember = isOwner && type === 'invited' + const canRemoveMember = isOwner return ( <> @@ -147,7 +144,7 @@ export function MemberMenu({ props.onPress() }, } - return type === 'owner' || type === 'invited' ? ( + return type === 'owner' ? ( ) : null} - {canUninviteMember ? ( - {}}> - - - Uninvite - - - ) : null} From 1c5b3dd3a152e262a1bc2c751f7b2273fbc13653 Mon Sep 17 00:00:00 2001 From: DS Boyce <260543580+ds-boyce@users.noreply.github.com> Date: Mon, 8 Jun 2026 12:15:13 -0700 Subject: [PATCH 109/149] Only show Message option if chat member can be messaged (#10788) --- .../ConversationSettings/MemberMenu.tsx | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/screens/Messages/ConversationSettings/MemberMenu.tsx b/src/screens/Messages/ConversationSettings/MemberMenu.tsx index 9101864d91..aee0cbf54e 100644 --- a/src/screens/Messages/ConversationSettings/MemberMenu.tsx +++ b/src/screens/Messages/ConversationSettings/MemberMenu.tsx @@ -12,7 +12,7 @@ import {useGetConvoForMembers} from '#/state/queries/messages/get-convo-for-memb import {useRemoveFromGroupChat} from '#/state/queries/messages/remove-from-group' import {useProfileBlockMutationQueue} from '#/state/queries/profile' import {atoms as a, useTheme} from '#/alf' -import {type ConvoWithDetails} from '#/components/dms/util' +import {canBeMessaged, type ConvoWithDetails} from '#/components/dms/util' import {ArrowBoxLeft_Stroke2_Corner0_Rounded as ArrowBoxLeftIcon} from '#/components/icons/ArrowBoxLeft' import {DotGrid3x1_Stroke2_Corner0_Rounded as EllipsisIcon} from '#/components/icons/DotGrid' import {Message_Stroke2_Corner0_Rounded as MessageIcon} from '#/components/icons/Message' @@ -127,6 +127,7 @@ export function MemberMenu({ } } + const canMessageMember = canBeMessaged(profile) const canBlockMember = type === 'owner' || type === 'standard' const canRemoveMember = isOwner @@ -188,14 +189,16 @@ export function MemberMenu({ Go to profile - - - - Message - - + {canMessageMember ? ( + + + + Message + + + ) : null} From 38ee14d517d572e9cf16261041fd9362b8b2f625 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Mon, 8 Jun 2026 23:14:29 +0300 Subject: [PATCH 110/149] Remove social proof from group invites (#10787) --- src/screens/Messages/components/IncomingRequestListItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/screens/Messages/components/IncomingRequestListItem.tsx b/src/screens/Messages/components/IncomingRequestListItem.tsx index 8c630b4a04..aa4618188a 100644 --- a/src/screens/Messages/components/IncomingRequestListItem.tsx +++ b/src/screens/Messages/components/IncomingRequestListItem.tsx @@ -34,7 +34,7 @@ export function IncomingRequestListItem({ return ( - {convo.primaryMember && ( + {convo.kind === 'direct' && convo.primaryMember && ( Date: Mon, 8 Jun 2026 23:14:43 +0300 Subject: [PATCH 111/149] [Chat] Try and resolve loading bug once and for all (#10791) --- .../Messages/components/MessagesList.tsx | 51 ++++++++++--------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/src/screens/Messages/components/MessagesList.tsx b/src/screens/Messages/components/MessagesList.tsx index e96872a646..599b928337 100644 --- a/src/screens/Messages/components/MessagesList.tsx +++ b/src/screens/Messages/components/MessagesList.tsx @@ -204,15 +204,39 @@ export function MessagesList({ // Tracks whether the initial scroll-to-bottom has been triggered. Separated from isAtBottom so that contentInset // (which causes an early onScroll with negative offset) can't prevent the first scroll. // Reset when hasScrolled goes back to false (e.g. convo re-initialization after backgrounding). + // `didInitialScroll` is the reactive mirror of the ref so the reveal effect below can depend on it; the ref + // itself stays as the synchronous re-entry guard inside onContentSizeChange. const hasInitiallyScrolled = useRef(false) + const [didInitialScroll, setDidInitialScroll] = useState(false) const prevHasScrolled = useRef(hasScrolled) useLayoutEffect(() => { if (prevHasScrolled.current && !hasScrolled) { hasInitiallyScrolled.current = false + setDidInitialScroll(false) } prevHasScrolled.current = hasScrolled }, [hasScrolled]) + // Reveal the list once history has finished loading. We can't reveal earlier because the list isn't inverted - + // we must scroll to the bottom (newest message) before fading in, or the user sees a flash of top-anchored content. + // This is purely state-driven so it doesn't depend on a layout callback firing: a firehose-delivered message can + // dedupe against the fetched history and produce no content-size change, in which case nothing would otherwise + // reveal the list and it would stay hidden forever (APP-2238). Either the initial scroll has run, or there's + // nothing to scroll (empty convo) - both are safe to reveal once !isFetchingHistory. + useEffect(() => { + if (hasScrolled || convoState.isFetchingHistory) return + if (didInitialScroll || renderItems.length === 0) { + const raf = requestAnimationFrame(() => setHasScrolled(true)) + return () => cancelAnimationFrame(raf) + } + }, [ + convoState.isFetchingHistory, + hasScrolled, + didInitialScroll, + renderItems.length, + setHasScrolled, + ]) + // -- Keep track of background state and positioning for new pill const layoutHeight = useSharedValue(0) const didBackground = useRef(false) @@ -247,20 +271,15 @@ export function MessagesList({ // Initial scroll to bottom — unconditional, not gated on isAtBottom. This is separated because contentInset // can cause an early onScroll with a negative offset that sets isAtBottom to false before we get here. - // Empty convos take this path too (once history is done) so hasScrolled gets set without an animated scroll. + // Empty convos take this path too (once history is done). Revealing the list is handled by the effect above, + // which fires once history finishes - we just record that the scroll has happened. if ( !hasInitiallyScrolled.current && (renderItems.length > 0 || !convoState.isFetchingHistory) ) { hasInitiallyScrolled.current = true + setDidInitialScroll(true) flatListRef.current?.scrollToOffset({offset: height, animated: false}) - // If history is already done loading, mark ready after a frame for the scroll to settle. - // Otherwise, the footer sentinel's onLayout will handle it when history finishes. - if (!convoState.isFetchingHistory) { - requestAnimationFrame(() => { - setHasScrolled(true) - }) - } prevContentHeight.current = height prevItemCount.current = renderItems.length return @@ -300,7 +319,6 @@ export function MessagesList({ }, [ hasScrolled, - setHasScrolled, convoState.isFetchingHistory, renderItems.length, // these are stable @@ -505,20 +523,6 @@ export function MessagesList({ return null } - // Footer sentinel: when history is still loading during the initial scroll, the footer's onLayout fires each time - // new items are prepended (shifting its position). Once history finishes, this triggers setHasScrolled. - const onFooterLayout = useCallback(() => { - if ( - hasInitiallyScrolled.current && - !hasScrolled && - !convoState.isFetchingHistory - ) { - requestAnimationFrame(() => { - setHasScrolled(true) - }) - } - }, [hasScrolled, setHasScrolled, convoState.isFetchingHistory]) - const renderScrollComponent = useCallback( (props: ScrollViewProps) => ( @@ -588,7 +592,6 @@ export function MessagesList({ ListFooterComponent={ } style={[ From 690b8184a12fa939c687862e5ccbf00b8dbdce5d Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Mon, 8 Jun 2026 15:34:51 -0500 Subject: [PATCH 112/149] Refactor age assurance flags and contexts (#10794) --- src/ageAssurance/__mocks__/data.tsx | 2 +- .../components/NoAccessScreen.tsx | 10 +- src/ageAssurance/data.tsx | 46 ++-- src/ageAssurance/debug.ts | 241 ++++++++++++++++-- src/ageAssurance/index.tsx | 62 ++--- src/ageAssurance/state.ts | 80 +++--- src/ageAssurance/types.ts | 16 ++ .../useComputeAgeAssuranceRegionAccess.ts | 11 +- src/ageAssurance/util.ts | 42 ++- src/state/session/__tests__/session-test.ts | 2 +- src/state/session/agent.ts | 12 +- src/state/session/index.tsx | 12 +- 12 files changed, 390 insertions(+), 146 deletions(-) diff --git a/src/ageAssurance/__mocks__/data.tsx b/src/ageAssurance/__mocks__/data.tsx index b548a2f866..f813e14ccc 100644 --- a/src/ageAssurance/__mocks__/data.tsx +++ b/src/ageAssurance/__mocks__/data.tsx @@ -1,3 +1,3 @@ -export const prefetchAgeAssuranceData = () => {} +export const prefetchAgeAssuranceServerData = () => {} export const setBirthdateForDid = () => {} export const setCreatedAtForDid = () => {} diff --git a/src/ageAssurance/components/NoAccessScreen.tsx b/src/ageAssurance/components/NoAccessScreen.tsx index 84584b2717..ac88e59f7a 100644 --- a/src/ageAssurance/components/NoAccessScreen.tsx +++ b/src/ageAssurance/components/NoAccessScreen.tsx @@ -32,7 +32,7 @@ import * as Toast from '#/components/Toast' import {Text} from '#/components/Typography' import {BottomSheetOutlet} from '#/../modules/bottom-sheet' import {useAgeAssurance} from '#/ageAssurance' -import {useAgeAssuranceDataContext} from '#/ageAssurance/data' +import {useAgeAssuranceServerDataContext} from '#/ageAssurance/data' import {useComputeAgeAssuranceRegionAccess} from '#/ageAssurance/useComputeAgeAssuranceRegionAccess' import { isLegacyBirthdateBug, @@ -53,7 +53,7 @@ export function NoAccessScreen() { const birthdateControl = useDialogControl() const deactivateAccountControl = useDialogControl() const deleteAccountControl = useDialogControl() - const {data} = useAgeAssuranceDataContext() + const {metadata} = useAgeAssuranceServerDataContext() const region = useAgeAssuranceRegionConfig() const isBirthdateUpdateAllowed = useIsBirthdateUpdateAllowed() const {logoutCurrentAccount} = useSessionApi() @@ -62,15 +62,15 @@ export function NoAccessScreen() { const aa = useAgeAssurance() const isBlocked = aa.state.status === aa.Status.Blocked const isAARegion = !!region - const hasDeclaredAge = data?.declaredAge !== undefined + const hasDeclaredAge = metadata?.declaredAge !== undefined const canUpdateBirthday = - isBirthdateUpdateAllowed || isLegacyBirthdateBug(data?.birthdate || '') + isBirthdateUpdateAllowed || isLegacyBirthdateBug(metadata?.birthdate || '') useEffect(() => { // just counting overall hits here ax.metric(`blockedGeoOverlay:shown`, {}) ax.metric(`ageAssurance:noAccessScreen:shown`, { - accountCreatedAt: data?.accountCreatedAt || 'unknown', + accountCreatedAt: metadata?.accountCreatedAt || 'unknown', isAARegion, hasDeclaredAge, canUpdateBirthday, diff --git a/src/ageAssurance/data.tsx b/src/ageAssurance/data.tsx index 36a06fbd22..114d946602 100644 --- a/src/ageAssurance/data.tsx +++ b/src/ageAssurance/data.tsx @@ -24,6 +24,7 @@ import {fetchActorDeclarationRecord} from '#/state/queries/messages/actor-declar import {useAgent, useSession} from '#/state/session' import * as debug from '#/ageAssurance/debug' import {logger} from '#/ageAssurance/logger' +import {type AgeAssuranceMetadata} from '#/ageAssurance/types' import { getBirthdateStringFromAge, isLegacyBirthdateBug, @@ -485,9 +486,9 @@ export function useOtherRequiredDataQuery() { } /** - * Helper to prefetch all age assurance data. + * Helper to prefetch all age assurance data from the server. */ -export function prefetchAgeAssuranceData({agent}: {agent: AtpAgent}) { +export function prefetchAgeAssuranceServerData({agent}: {agent: AtpAgent}) { return Promise.allSettled([ // config fetch initiated at the top of the App.platform.tsx files, awaited here configPrefetchPromise, @@ -496,8 +497,8 @@ export function prefetchAgeAssuranceData({agent}: {agent: AtpAgent}) { ]) } -export function clearAgeAssuranceDataForDid({did}: {did: string}) { - logger.debug(`clearAgeAssuranceDataForDid: ${did}`) +export function clearAgeAssuranceServerDataForDid({did}: {did: string}) { + logger.debug(`clearAgeAssuranceServerDataForDid: ${did}`) qc.removeQueries({queryKey: createServerStateQueryKey({did}), exact: true}) qc.removeQueries({ queryKey: createOtherRequiredDataQueryKey({did}), @@ -505,8 +506,8 @@ export function clearAgeAssuranceDataForDid({did}: {did: string}) { }) } -export function clearAgeAssuranceData() { - logger.debug(`clearAgeAssuranceData`) +export function clearAgeAssuranceServerDataForAll() { + logger.debug(`clearAgeAssuranceServerDataForAll`) qc.clear() } @@ -514,30 +515,30 @@ export function clearAgeAssuranceData() { * Context */ -export type AgeAssuranceData = { +export type AgeAssuranceServerData = { + /** + * The raw config from the appview. + */ config: AppBskyAgeassuranceDefs.Config | undefined + /** + * The raw state from the appview. Must be further processed before being useful. + */ state: AppBskyAgeassuranceDefs.State | undefined - data: - | { - accountCreatedAt: AppBskyAgeassuranceDefs.StateMetadata['accountCreatedAt'] - declaredAge: number | undefined - birthdate: string | undefined - } - | undefined + metadata: AgeAssuranceMetadata | undefined } -export const AgeAssuranceDataContext = createContext({ +const AgeAssuranceServerDataContext = createContext({ config: undefined, state: undefined, - data: { + metadata: { accountCreatedAt: undefined, declaredAge: undefined, birthdate: undefined, }, }) -export function useAgeAssuranceDataContext() { - return useContext(AgeAssuranceDataContext) +export function useAgeAssuranceServerDataContext() { + return useContext(AgeAssuranceServerDataContext) } -export function AgeAssuranceDataProvider({ +export function AgeAssuranceServerDataProvider({ children, }: { children: React.ReactNode @@ -550,7 +551,8 @@ export function AgeAssuranceDataProvider({ () => ({ config, state, - data: { + metadata: { + // yes, it's weird, but accountCreatedAt comes back on the `getState` endpoint accountCreatedAt: metadata?.accountCreatedAt, declaredAge: data?.birthdate ? getAge(new Date(data.birthdate)) @@ -561,8 +563,8 @@ export function AgeAssuranceDataProvider({ [config, state, data, metadata], ) return ( - + {children} - + ) } diff --git a/src/ageAssurance/debug.ts b/src/ageAssurance/debug.ts index 257eeff93d..3368ddf147 100644 --- a/src/ageAssurance/debug.ts +++ b/src/ageAssurance/debug.ts @@ -26,35 +26,8 @@ export const deviceGeolocation: Geolocation | undefined = } : undefined -export const config: AppBskyAgeassuranceDefs.Config = { - regions: [ - { - countryCode: 'AA', - regionCode: undefined, - minAccessAge: 13, - rules: [ - { - $type: ids.Default, - access: 'full', - }, - ], - }, - { - countryCode: 'BB', - regionCode: undefined, - minAccessAge: 16, - rules: [ - { - $type: ids.Default, - access: 'full', - }, - ], - }, - ], -} - export const otherRequiredData: OtherRequiredData = { - birthdate: new Date(2000, 1, 1).toISOString(), + birthdate: new Date(2010, 12, 1).toISOString(), } const serverStateEnabled = false || IS_E2E @@ -72,6 +45,218 @@ export const serverState: AppBskyAgeassuranceGetState.OutputSchema | undefined = } : undefined +export const config: AppBskyAgeassuranceDefs.Config = { + regions: [ + { + countryCode: 'AA', + regionCode: undefined, + minAccessAge: 13, + rules: [ + { + $type: ids.Default, + access: 'full', + }, + ], + }, + { + countryCode: 'GB', + minAccessAge: 13, + rules: [ + { + age: 18, + access: 'full', + $type: ids.IfAssuredOverAge, + }, + { + age: 13, + access: 'safe', + $type: ids.IfDeclaredOverAge, + }, + { + access: 'none', + $type: ids.Default, + }, + ], + }, + { + countryCode: 'AU', + minAccessAge: 16, + rules: [ + { + date: '2025-12-10T00:00:00Z', + access: 'none', + $type: ids.IfAccountNewerThan, + }, + { + age: 18, + access: 'full', + $type: ids.IfAssuredOverAge, + }, + { + age: 16, + access: 'safe', + $type: ids.IfAssuredOverAge, + }, + { + age: 16, + access: 'safe', + $type: ids.IfDeclaredOverAge, + }, + { + access: 'none', + $type: ids.Default, + }, + ], + }, + { + countryCode: 'US', + regionCode: 'SD', + minAccessAge: 13, + rules: [ + { + age: 18, + access: 'full', + $type: ids.IfAssuredOverAge, + }, + { + age: 13, + access: 'safe', + $type: ids.IfDeclaredOverAge, + }, + { + access: 'none', + $type: ids.Default, + }, + ], + }, + { + countryCode: 'US', + regionCode: 'WY', + minAccessAge: 13, + rules: [ + { + age: 18, + access: 'full', + $type: ids.IfAssuredOverAge, + }, + { + age: 13, + access: 'safe', + $type: ids.IfDeclaredOverAge, + }, + { + access: 'none', + $type: ids.Default, + }, + ], + }, + { + countryCode: 'US', + regionCode: 'OH', + minAccessAge: 13, + rules: [ + { + age: 18, + access: 'full', + $type: ids.IfAssuredOverAge, + }, + { + age: 13, + access: 'safe', + $type: ids.IfDeclaredOverAge, + }, + { + access: 'none', + $type: ids.Default, + }, + ], + }, + { + countryCode: 'US', + regionCode: 'MS', + minAccessAge: 18, + rules: [ + { + age: 18, + access: 'full', + $type: ids.IfAssuredOverAge, + }, + { + access: 'none', + $type: ids.Default, + }, + ], + }, + { + countryCode: 'US', + regionCode: 'VA', + minAccessAge: 16, + rules: [ + { + age: 16, + access: 'full', + $type: ids.IfAssuredOverAge, + }, + { + age: 16, + access: 'full', + $type: ids.IfDeclaredOverAge, + }, + { + access: 'none', + $type: ids.Default, + }, + ], + }, + { + countryCode: 'US', + regionCode: 'TN', + minAccessAge: 18, + rules: [ + { + age: 18, + access: 'full', + $type: ids.IfAssuredOverAge, + }, + { + age: 18, + access: 'full', + $type: ids.IfDeclaredOverAge, + }, + { + access: 'none', + $type: ids.Default, + }, + ], + }, + { + countryCode: 'BR', + minAccessAge: 13, + rules: [ + { + age: 18, + access: 'full', + $type: ids.IfAssuredOverAge, + }, + { + age: 18, + access: 'full', + $type: ids.IfDeclaredOverAge, + }, + { + age: 13, + access: 'safe', + $type: ids.IfDeclaredOverAge, + }, + { + access: 'none', + $type: ids.Default, + }, + ], + }, + ], +} + export async function resolve(data: T) { await new Promise(y => setTimeout(y, 500)) // simulate network return data diff --git a/src/ageAssurance/index.tsx b/src/ageAssurance/index.tsx index a5cca327ae..2b10c93a5d 100644 --- a/src/ageAssurance/index.tsx +++ b/src/ageAssurance/index.tsx @@ -1,11 +1,11 @@ -import {createContext, useCallback, useContext, useEffect, useMemo} from 'react' +import {createContext, useCallback, useContext, useMemo} from 'react' import {useGetAndRegisterPushToken} from '#/lib/notifications/notifications' import {useAgent} from '#/state/session' import {Provider as RedirectOverlayProvider} from '#/ageAssurance/components/RedirectOverlay' import { - AgeAssuranceDataProvider, - useAgeAssuranceDataContext, + AgeAssuranceServerDataProvider, + useAgeAssuranceServerDataContext, } from '#/ageAssurance/data' import {logger} from '#/ageAssurance/logger' import { @@ -14,19 +14,19 @@ import { } from '#/ageAssurance/state' import { AgeAssuranceAccess, + type AgeAssuranceFlags, type AgeAssuranceState, AgeAssuranceStatus, } from '#/ageAssurance/types' import { - isUnderAge, + computeAgeAssuranceFlags, maybeRestrictChatSettings, - MIN_ACCESS_AGE, useAgeAssuranceRegionConfigWithFallback, } from '#/ageAssurance/util' export { prefetchConfig as prefetchAgeAssuranceConfig, - prefetchAgeAssuranceData, + prefetchAgeAssuranceServerData, refetchServerState as refetchAgeAssuranceServerState, usePatchOtherRequiredData as usePatchAgeAssuranceOtherRequiredData, usePatchServerState as usePatchAgeAssuranceServerState, @@ -38,13 +38,7 @@ const AgeAssuranceStateContext = createContext<{ Access: typeof AgeAssuranceAccess Status: typeof AgeAssuranceStatus state: AgeAssuranceState - flags: { - adultContentDisabled: boolean - chatDisabled: boolean - isDeclaredUnderAdultAge: boolean - isOverRegionMinAccessAge: boolean - isOverAppMinAccessAge: boolean - } + flags: AgeAssuranceFlags }>({ Access: AgeAssuranceAccess, Status: AgeAssuranceStatus, @@ -73,19 +67,19 @@ export function useAgeAssurance() { export function Provider({children}: {children: React.ReactNode}) { return ( - + {children} - + ) } function InnerProvider({children}: {children: React.ReactNode}) { const agent = useAgent() const state = useAgeAssuranceState() - const {data} = useAgeAssuranceDataContext() - const config = useAgeAssuranceRegionConfigWithFallback() + const {metadata} = useAgeAssuranceServerDataContext() + const regionConfig = useAgeAssuranceRegionConfigWithFallback() const getAndRegisterPushToken = useGetAndRegisterPushToken() const handleAccessUpdate = useCallback( @@ -100,38 +94,22 @@ function InnerProvider({children}: {children: React.ReactNode}) { ) useOnAgeAssuranceAccessUpdate(handleAccessUpdate) - useEffect(() => { - logger.debug(`useAgeAssuranceState`, {state}) - }, [state]) - return ( { - const chatDisabled = state.access !== AgeAssuranceAccess.Full - const isDeclaredUnderAdultAge = data?.birthdate - ? isUnderAge(data.birthdate, 18) - : true - const isOverRegionMinAccessAge = data?.birthdate - ? !isUnderAge(data.birthdate, config.minAccessAge) - : false - const isOverAppMinAccessAge = data?.birthdate - ? !isUnderAge(data.birthdate, MIN_ACCESS_AGE) - : false - const adultContentDisabled = - state.access !== AgeAssuranceAccess.Full || isDeclaredUnderAdultAge - return { + const res = { Access: AgeAssuranceAccess, Status: AgeAssuranceStatus, state, - flags: { - adultContentDisabled, - chatDisabled, - isDeclaredUnderAdultAge, - isOverRegionMinAccessAge, - isOverAppMinAccessAge, - }, + flags: computeAgeAssuranceFlags({ + state, + regionConfig, + metadata, + }), } - }, [state, data, config])}> + logger.debug(`useAgeAssurance`, res) + return res + }, [state, metadata, regionConfig])}> {children} ) diff --git a/src/ageAssurance/state.ts b/src/ageAssurance/state.ts index 5aac40ef44..ff80bca725 100644 --- a/src/ageAssurance/state.ts +++ b/src/ageAssurance/state.ts @@ -1,24 +1,30 @@ import {useEffect, useMemo, useState} from 'react' -import {computeAgeAssuranceRegionAccess} from '@atproto/api' +import { + type AppBskyAgeassuranceDefs, + computeAgeAssuranceRegionAccess, +} from '@atproto/api' import {getAge} from '#/lib/strings/time' import {useSession} from '#/state/session' import { - type AgeAssuranceData, getConfigFromCache, getOtherRequiredDataFromCache, getServerStateFromCache, - useAgeAssuranceDataContext, + useAgeAssuranceServerDataContext, } from '#/ageAssurance/data' import {logger} from '#/ageAssurance/logger' import { AgeAssuranceAccess, + type AgeAssuranceMetadata, type AgeAssuranceState, AgeAssuranceStatus, parseAccessFromString, parseStatusFromString, } from '#/ageAssurance/types' -import {getAgeAssuranceRegionConfigWithFallback} from '#/ageAssurance/util' +import { + computeAgeAssuranceFlags, + getAgeAssuranceRegionConfigWithFallback, +} from '#/ageAssurance/util' import {type Geolocation, useGeolocation} from '#/geolocation' import {device} from '#/storage' @@ -27,18 +33,18 @@ import {device} from '#/storage' * server state before computing access based on AA config from the server + * geolocation and other data. */ -export function computeAgeAssuranceState({ +function computeAgeAssuranceState({ hasSession, - config, geolocation, + config, state, - data, + metadata, }: { hasSession: boolean - config: AgeAssuranceData['config'] geolocation: Geolocation - state: AgeAssuranceData['state'] - data: AgeAssuranceData['data'] + config?: AppBskyAgeassuranceDefs.Config + state?: AppBskyAgeassuranceDefs.State + metadata?: AgeAssuranceMetadata }) { /** * This is where we control logged-out moderation prefs. It's all @@ -88,7 +94,10 @@ export function computeAgeAssuranceState({ * accounts with an accurate birthdate, our default fallback rules should * ensure correct access. */ - const result = computeAgeAssuranceRegionAccess(region, data) + const result = computeAgeAssuranceRegionAccess(region, { + accountCreatedAt: metadata?.accountCreatedAt, + declaredAge: metadata?.declaredAge, + }) const computed = { lastInitiatedAt: state?.lastInitiatedAt, // prefer server state @@ -100,10 +109,10 @@ export function computeAgeAssuranceState({ ? parseAccessFromString(result.access) : AgeAssuranceAccess.Full, } - logger.debug('debug useAgeAssuranceState', { + logger.debug('computeAgeAssuranceState', { region, state, - data, + metadata, computed, }) return computed @@ -113,38 +122,51 @@ export function computeAgeAssuranceState({ * This is a last-ditch helper for out-of-band reads of the AA state, such as * during account creation. Don't use it for anything else. */ -export function getAndComputeAgeAssuranceState({did}: {did: string}) { +export function unsafeGetAndComputeAgeAssurance({did}: {did: string}) { const config = getConfigFromCache() const state = getServerStateFromCache({did}) - const data = getOtherRequiredDataFromCache({did}) + const requiredData = getOtherRequiredDataFromCache({did}) const geolocation = device.get(['mergedGeolocation']) - if (!geolocation || !config || !state || !data) { + if (!geolocation || !config || !state || !requiredData) { return { - status: AgeAssuranceStatus.Unknown, - access: AgeAssuranceAccess.Safe, + state: { + status: AgeAssuranceStatus.Unknown, + access: AgeAssuranceAccess.Safe, + }, } } - return computeAgeAssuranceState({ + const region = getAgeAssuranceRegionConfigWithFallback(config, geolocation) + const metadata: AgeAssuranceMetadata = { + accountCreatedAt: state.metadata?.accountCreatedAt, + declaredAge: requiredData?.birthdate + ? getAge(new Date(requiredData.birthdate)) + : undefined, + birthdate: requiredData?.birthdate, + } + const computed = computeAgeAssuranceState({ hasSession: true, config, geolocation, state: state.state, - data: { - accountCreatedAt: state.metadata?.accountCreatedAt, - declaredAge: data?.birthdate - ? getAge(new Date(data.birthdate)) - : undefined, - birthdate: data?.birthdate, - }, + metadata, }) + + return { + state: computed, + flags: computeAgeAssuranceFlags({ + state: computed, + regionConfig: region, + metadata, + }), + } } export function useAgeAssuranceState(): AgeAssuranceState { const {hasSession} = useSession() const geolocation = useGeolocation() - const {config, state, data} = useAgeAssuranceDataContext() + const {config, state, metadata} = useAgeAssuranceServerDataContext() return useMemo( () => @@ -153,9 +175,9 @@ export function useAgeAssuranceState(): AgeAssuranceState { config, geolocation, state, - data, + metadata, }), - [hasSession, geolocation, config, state, data], + [hasSession, geolocation, config, state, metadata], ) } diff --git a/src/ageAssurance/types.ts b/src/ageAssurance/types.ts index f34ed10aea..12473bc2e6 100644 --- a/src/ageAssurance/types.ts +++ b/src/ageAssurance/types.ts @@ -1,3 +1,5 @@ +import {type computeAgeAssuranceRegionAccess} from '@atproto/api' + import {logger} from '#/ageAssurance/logger' export enum AgeAssuranceAccess { @@ -14,6 +16,12 @@ export enum AgeAssuranceStatus { Blocked = 'blocked', } +export type AgeAssuranceMetadata = Parameters< + typeof computeAgeAssuranceRegionAccess +>[1] & { + birthdate: string | undefined +} + export type AgeAssuranceState = { lastInitiatedAt?: string status: AgeAssuranceStatus @@ -21,6 +29,14 @@ export type AgeAssuranceState = { error?: 'config' // maybe other specific cases in the future } +export type AgeAssuranceFlags = { + adultContentDisabled: boolean + chatDisabled: boolean + isDeclaredUnderAdultAge: boolean + isOverRegionMinAccessAge: boolean + isOverAppMinAccessAge: boolean +} + export function parseStatusFromString(raw: string) { switch (raw) { case 'unknown': diff --git a/src/ageAssurance/useComputeAgeAssuranceRegionAccess.ts b/src/ageAssurance/useComputeAgeAssuranceRegionAccess.ts index e3ea48860f..5ba9e1ba6d 100644 --- a/src/ageAssurance/useComputeAgeAssuranceRegionAccess.ts +++ b/src/ageAssurance/useComputeAgeAssuranceRegionAccess.ts @@ -1,14 +1,14 @@ import {useCallback} from 'react' import {computeAgeAssuranceRegionAccess} from '@atproto/api' -import {useAgeAssuranceDataContext} from '#/ageAssurance/data' +import {useAgeAssuranceServerDataContext} from '#/ageAssurance/data' import {logger} from '#/ageAssurance/logger' import {AgeAssuranceAccess, parseAccessFromString} from '#/ageAssurance/types' import {getAgeAssuranceRegionConfigWithFallback} from '#/ageAssurance/util' import {type Geolocation} from '#/geolocation' export function useComputeAgeAssuranceRegionAccess() { - const {config, data} = useAgeAssuranceDataContext() + const {config, metadata} = useAgeAssuranceServerDataContext() return useCallback( (geolocation: Geolocation) => { if (!config) { @@ -19,11 +19,14 @@ export function useComputeAgeAssuranceRegionAccess() { config, geolocation, ) - const result = computeAgeAssuranceRegionAccess(region, data) + const result = computeAgeAssuranceRegionAccess(region, { + accountCreatedAt: metadata?.accountCreatedAt, + declaredAge: metadata?.declaredAge, + }) return result ? parseAccessFromString(result.access) : AgeAssuranceAccess.Full }, - [config, data], + [config, metadata], ) } diff --git a/src/ageAssurance/util.ts b/src/ageAssurance/util.ts index 310725db8f..b0e601d6c7 100644 --- a/src/ageAssurance/util.ts +++ b/src/ageAssurance/util.ts @@ -13,9 +13,14 @@ import {DEFAULT_LOGGED_OUT_LABEL_PREFERENCES} from '#/state/queries/preferences/ import { getDidFromAgentSession, getOtherRequiredDataFromCache, - useAgeAssuranceDataContext, + useAgeAssuranceServerDataContext, } from '#/ageAssurance/data' -import {AgeAssuranceAccess} from '#/ageAssurance/types' +import { + AgeAssuranceAccess, + type AgeAssuranceFlags, + type AgeAssuranceMetadata, + type AgeAssuranceState, +} from '#/ageAssurance/types' import {type Geolocation, useGeolocation} from '#/geolocation' export const MIN_ACCESS_AGE = 13 @@ -62,7 +67,7 @@ export function getAgeAssuranceRegionConfigWithFallback( */ export function useAgeAssuranceRegionConfig() { const geolocation = useGeolocation() - const {config} = useAgeAssuranceDataContext() + const {config} = useAgeAssuranceServerDataContext() return useMemo(() => { if (!config) return // use generic helper, we want to potentially return undefined @@ -128,3 +133,34 @@ export function maybeRestrictChatSettings({agent}: {agent: AtpAgent}) { if (data?.actorDeclaration?.allowIncoming === 'none') return restrictChatSettings({agent, did}) } + +export function computeAgeAssuranceFlags({ + state, + regionConfig, + metadata, +}: { + state: AgeAssuranceState + regionConfig: AppBskyAgeassuranceDefs.ConfigRegion + metadata?: AgeAssuranceMetadata +}): AgeAssuranceFlags { + const chatDisabled = state.access !== AgeAssuranceAccess.Full + const isDeclaredUnderAdultAge = metadata?.declaredAge + ? metadata.declaredAge < 18 + : true + const isOverRegionMinAccessAge = metadata?.declaredAge + ? metadata.declaredAge >= regionConfig.minAccessAge + : false + const isOverAppMinAccessAge = metadata?.declaredAge + ? metadata.declaredAge >= MIN_ACCESS_AGE + : false + const adultContentDisabled = + state.access !== AgeAssuranceAccess.Full || isDeclaredUnderAdultAge + + return { + adultContentDisabled, + chatDisabled, + isDeclaredUnderAdultAge, + isOverRegionMinAccessAge, + isOverAppMinAccessAge, + } +} diff --git a/src/state/session/__tests__/session-test.ts b/src/state/session/__tests__/session-test.ts index 4b014d6448..4398a90a0b 100644 --- a/src/state/session/__tests__/session-test.ts +++ b/src/state/session/__tests__/session-test.ts @@ -13,7 +13,7 @@ jest.mock('jwt-decode', () => ({ jest.mock('../../birthdate') jest.mock('../../../ageAssurance/data') jest.mock('../../../ageAssurance/state', () => ({ - getAndComputeAgeAssuranceState: () => ({}), + unsafeGetAndComputeAgeAssurance: () => ({state: {}}), })) jest.mock('#/lib/notifications/notifications', () => ({ unregisterPushToken(_agents: BskyAgent[]) { diff --git a/src/state/session/agent.ts b/src/state/session/agent.ts index 9f2d70927b..0abc0ca6cf 100644 --- a/src/state/session/agent.ts +++ b/src/state/session/agent.ts @@ -24,11 +24,11 @@ import {snoozeBirthdateUpdateAllowedForDid} from '#/state/birthdate' import {restrictChatSettings} from '#/state/queries/messages/restrictChatSettings' import {snoozeEmailConfirmationPrompt} from '#/state/shell/reminders' import { - prefetchAgeAssuranceData, + prefetchAgeAssuranceServerData, setBirthdateForDid, setCreatedAtForDid, } from '#/ageAssurance/data' -import {getAndComputeAgeAssuranceState} from '#/ageAssurance/state' +import {unsafeGetAndComputeAgeAssurance} from '#/ageAssurance/state' import {AgeAssuranceAccess} from '#/ageAssurance/types' import {features} from '#/analytics' import {emitNetworkConfirmed, emitNetworkLost} from '../events' @@ -74,7 +74,7 @@ export async function createAgentAndResume( } // after session is attached - const aa = prefetchAgeAssuranceData({agent}) + const aa = prefetchAgeAssuranceServerData({agent}) agent.configureProxy(BLUESKY_PROXY_HEADER.get()) @@ -113,7 +113,7 @@ export async function createAgentAndLogin( const account = agentToSessionAccountOrThrow(agent) const gates = features.refresh({strategy: 'prefer-fresh-gates'}) const moderation = configureModerationForAccount(agent, account) - const aa = prefetchAgeAssuranceData({agent}) + const aa = prefetchAgeAssuranceServerData({agent}) agent.configureProxy(BLUESKY_PROXY_HEADER.get()) @@ -175,7 +175,7 @@ export async function createAgentAndCreateAccount( setBirthdateForDid({did: account.did, birthdate}) snoozeBirthdateUpdateAllowedForDid(account.did) // do this last - const aa = prefetchAgeAssuranceData({agent}) + const aa = prefetchAgeAssuranceServerData({agent}) // Not awaited so that we can still get into onboarding. // This is OK because we won't let you toggle adult stuff until you set the date. @@ -219,7 +219,7 @@ export async function createAgentAndCreateAccount( }), // wait for AA data to load first, then check state aa.then(async () => { - const state = getAndComputeAgeAssuranceState({did: account.did}) + const {state} = unsafeGetAndComputeAgeAssurance({did: account.did}) if (state.access !== AgeAssuranceAccess.Full) { restrictChatSettings({agent, did: account.did}) } diff --git a/src/state/session/index.tsx b/src/state/session/index.tsx index 09e7bd0db0..fd31261a9d 100644 --- a/src/state/session/index.tsx +++ b/src/state/session/index.tsx @@ -36,8 +36,8 @@ import { } from '#/state/session/types' import {useOnboardingDispatch} from '#/state/shell/onboarding' import { - clearAgeAssuranceData, - clearAgeAssuranceDataForDid, + clearAgeAssuranceServerDataForAll, + clearAgeAssuranceServerDataForDid, } from '#/ageAssurance/data' const StateContext = createContext({ @@ -203,7 +203,9 @@ export function Provider({children}: React.PropsWithChildren<{}>) { ) addSessionDebugLog({type: 'method:end', method: 'logout'}) if (prevState.currentAgentState.did) { - clearAgeAssuranceDataForDid({did: prevState.currentAgentState.did}) + clearAgeAssuranceServerDataForDid({ + did: prevState.currentAgentState.did, + }) void clearPersistedQueryStorage(prevState.currentAgentState.did) } // reset onboarding flow on logout @@ -234,7 +236,7 @@ export function Provider({children}: React.PropsWithChildren<{}>) { }, ) addSessionDebugLog({type: 'method:end', method: 'logout'}) - clearAgeAssuranceData() + clearAgeAssuranceServerDataForAll() for (const account of prevState.accounts) { void clearPersistedQueryStorage(account.did) } @@ -304,7 +306,7 @@ export function Provider({children}: React.PropsWithChildren<{}>) { accountDid: account.did, }) addSessionDebugLog({type: 'method:end', method: 'removeAccount', account}) - clearAgeAssuranceDataForDid({did: account.did}) + clearAgeAssuranceServerDataForDid({did: account.did}) }, [store, cancelPendingTask], ) From bfbd1cef32c312894690e6d59e14cf2fc92ad0c8 Mon Sep 17 00:00:00 2001 From: DS Boyce <260543580+ds-boyce@users.noreply.github.com> Date: Mon, 8 Jun 2026 13:53:09 -0700 Subject: [PATCH 113/149] Upgrade to pnpm 11.5.2 (#10793) --- Dockerfile.embedr | 2 +- package.json | 2 +- pnpm-lock.yaml | 76 +++++++++++++++++++++++------------------------ 3 files changed, 40 insertions(+), 40 deletions(-) diff --git a/Dockerfile.embedr b/Dockerfile.embedr index a55ddf11ac..42c1a725f5 100644 --- a/Dockerfile.embedr +++ b/Dockerfile.embedr @@ -33,7 +33,7 @@ RUN mkdir --parents $NVM_DIR && \ RUN \. "$NVM_DIR/nvm.sh" && \ nvm install $NODE_VERSION && \ nvm use $NODE_VERSION && \ - npm install --global pnpm@11.5.0 && \ + npm install --global pnpm@11.5.2 && \ pnpm install --frozen-lockfile && \ cd bskyembed && pnpm install --frozen-lockfile && cd .. && \ pnpm intl:build && \ diff --git a/package.json b/package.json index a879182d9f..e054aca94a 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "devEngines": { "packageManager": { "name": "pnpm", - "version": "11.5.0", + "version": "11.5.2", "onFail": "warn" }, "runtime": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0ac8974cf9..b2f65bf409 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,52 +7,52 @@ importers: configDependencies: {} packageManagerDependencies: '@pnpm/exe': - specifier: 11.5.0 - version: 11.5.0 + specifier: 11.5.2 + version: 11.5.2 pnpm: - specifier: 11.5.0 - version: 11.5.0 + specifier: 11.5.2 + version: 11.5.2 packages: - '@pnpm/exe@11.5.0': - resolution: {integrity: sha512-4hzOXq1HHrNPjwI8k1rt7Ot/Yrdx1JX3pn/L/M95ii1gid1Q6ZK6dVg4+gbSgUdPsYmYDZ4/Yfc0A7vd5C0ndg==} + '@pnpm/exe@11.5.2': + resolution: {integrity: sha512-4UFnP2rhNu1xjAQ+I1GdIUUEtCJuTYJlbpiWSFA4POAID3Lpt+2vrjImWO7eOJ7iCY3vpc4TFe2IW3sAolW4Kg==} hasBin: true - '@pnpm/linux-arm64@11.5.0': - resolution: {integrity: sha512-NV9HdzzCB0epuI9LqZZeTaqjH3OweNQSQCS76GzEkFxJHS9e5Gvu7tgex91gxVL7bCZ+R4yr/3d3yexBFtr2ug==} + '@pnpm/linux-arm64@11.5.2': + resolution: {integrity: sha512-MbJySnu2y9cCBqlODLjUlZ87JnRC3Inq40rvGHWJSrSQ0PnuHeSw2NDMnLI8Hf9hCY+ooussRc5iiR4IAkjUvg==} cpu: [arm64] os: [linux] - '@pnpm/linux-x64@11.5.0': - resolution: {integrity: sha512-vH83rRx4iPk/bwm9pBVCn+5hXbcQI66I/4zk6Vc09SusJgTqOdbN4U6VhMcGIqSEdr901ksYGCyIbMv7f6Guew==} + '@pnpm/linux-x64@11.5.2': + resolution: {integrity: sha512-g6g2BGpQA47wUACy6B1MdeSHPtnl6x4AeCg0IOWQ7xXorEtC+VRiSHhLpA5kByFGeSwyYh/nLc7mLul5DAaELw==} cpu: [x64] os: [linux] - '@pnpm/linuxstatic-arm64@11.5.0': - resolution: {integrity: sha512-2nOnMW1rSwGv22q2yZz1HlGT3ly/Ij8wUlX0NB4n+Krx7nETRHA3MgWsbkVejxHknDcTulRVudAghuX9rgrXcw==} + '@pnpm/linuxstatic-arm64@11.5.2': + resolution: {integrity: sha512-xTxs9BLxYW39BPNGnmvYCUBnMPWm4mzmzujmdYbpRxDnBXrx55qPR5K/3LSohX7VrmsdDrYxuH6AmG1AaOlIfA==} cpu: [arm64] os: [linux] libc: [musl] - '@pnpm/linuxstatic-x64@11.5.0': - resolution: {integrity: sha512-ONOC1Mg0JusHtjzkRlre9di1QO+GAjy4HP7jMjDx21yGhrSheNdUweTXbekMH1EflRd19kTU6d8M3zewJFPtVg==} + '@pnpm/linuxstatic-x64@11.5.2': + resolution: {integrity: sha512-RGmmc/SoGLD90gmOHcU85UEKNoNRstLvizli4wzDASmETz/VeqJOqU5nD1YBgjzcP72sUMS352dh4bmzTfKyvQ==} cpu: [x64] os: [linux] libc: [musl] - '@pnpm/macos-arm64@11.5.0': - resolution: {integrity: sha512-od0ALdTxs4A7s5vAH5q2l2phzCJb98+PVOW1rq7BGpWGeYxQ+EwvL+vq0KaO6iLsn/eVVoncCkgZ/k6QNYuTgw==} + '@pnpm/macos-arm64@11.5.2': + resolution: {integrity: sha512-gW3A2jRlC3SJRw8qX2SAzjMIu9o98daTSqCKzeeYcjF/uEbtbz3dn4HqYrYffBnenKbc4hsgZQmNOHAvUKIlSg==} cpu: [arm64] os: [darwin] - '@pnpm/win-arm64@11.5.0': - resolution: {integrity: sha512-9HqbI80FjVVqFx4+EPxYYNfeP9Sx69W6kYqUDvOJn9G7RJ/2NNNQ898cVHTMpXlW1/PrMEcijmdpa/NjZIrWiQ==} + '@pnpm/win-arm64@11.5.2': + resolution: {integrity: sha512-+VJCDoH/pRzLXBikwjvxgAnGfQufT8EALBX8cfSmrwD40JABUZvgPtjBjde7OwEoK/XwtlH8w+ZceFV0K3/YHQ==} cpu: [arm64] os: [win32] - '@pnpm/win-x64@11.5.0': - resolution: {integrity: sha512-Q89CQqFGAsWmfvHZs5Kbbar45q3GBYtfAdPUCiVMVNJoLi3dsBS2LCvUq8ak3AufkFDaJBpvhaFcDP2M1NXr3A==} + '@pnpm/win-x64@11.5.2': + resolution: {integrity: sha512-zgglREh75RbFgV/E0tNRS03ElX+hJOV43KRSSeaboxtj3ei1rrguxOgOCXUs/GsizoHVsuD+qXGABE4Kc4GMCg==} cpu: [x64] os: [win32] @@ -116,45 +116,45 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - pnpm@11.5.0: - resolution: {integrity: sha512-2/zE+Bz0hZev1Lw5H/3xLBHxqfuDo5W/prCi2cwv2P/rr9scy9UpYyFT95OQTCYVt/Cf4aNFRz/Rw1hFFyqOsQ==} + pnpm@11.5.2: + resolution: {integrity: sha512-ccYx44IGbvwlYl1c8CkHXeB7YbN/bic1D72Esb2lhkyMGWetwoB3a0XDCnFcA1mjvgj+9C1bsJ4rmQKZeWkpFg==} engines: {node: '>=22.13'} hasBin: true snapshots: - '@pnpm/exe@11.5.0': + '@pnpm/exe@11.5.2': dependencies: '@reflink/reflink': 0.1.19 detect-libc: 2.1.2 optionalDependencies: - '@pnpm/linux-arm64': 11.5.0 - '@pnpm/linux-x64': 11.5.0 - '@pnpm/linuxstatic-arm64': 11.5.0 - '@pnpm/linuxstatic-x64': 11.5.0 - '@pnpm/macos-arm64': 11.5.0 - '@pnpm/win-arm64': 11.5.0 - '@pnpm/win-x64': 11.5.0 + '@pnpm/linux-arm64': 11.5.2 + '@pnpm/linux-x64': 11.5.2 + '@pnpm/linuxstatic-arm64': 11.5.2 + '@pnpm/linuxstatic-x64': 11.5.2 + '@pnpm/macos-arm64': 11.5.2 + '@pnpm/win-arm64': 11.5.2 + '@pnpm/win-x64': 11.5.2 - '@pnpm/linux-arm64@11.5.0': + '@pnpm/linux-arm64@11.5.2': optional: true - '@pnpm/linux-x64@11.5.0': + '@pnpm/linux-x64@11.5.2': optional: true - '@pnpm/linuxstatic-arm64@11.5.0': + '@pnpm/linuxstatic-arm64@11.5.2': optional: true - '@pnpm/linuxstatic-x64@11.5.0': + '@pnpm/linuxstatic-x64@11.5.2': optional: true - '@pnpm/macos-arm64@11.5.0': + '@pnpm/macos-arm64@11.5.2': optional: true - '@pnpm/win-arm64@11.5.0': + '@pnpm/win-arm64@11.5.2': optional: true - '@pnpm/win-x64@11.5.0': + '@pnpm/win-x64@11.5.2': optional: true '@reflink/reflink-darwin-arm64@0.1.19': @@ -194,7 +194,7 @@ snapshots: detect-libc@2.1.2: {} - pnpm@11.5.0: {} + pnpm@11.5.2: {} --- lockfileVersion: '9.0' From c6e6b83d503fdb7023e0b091d0dda079d4aab9dc Mon Sep 17 00:00:00 2001 From: pfrazee <1270099+pfrazee@users.noreply.github.com> Date: Tue, 9 Jun 2026 03:18:45 +0000 Subject: [PATCH 114/149] Nightly source-language update --- src/locale/locales/en/messages.po | 561 +++++++++++++++--------------- 1 file changed, 290 insertions(+), 271 deletions(-) diff --git a/src/locale/locales/en/messages.po b/src/locale/locales/en/messages.po index 03773ccd21..6dcbc25d3a 100644 --- a/src/locale/locales/en/messages.po +++ b/src/locale/locales/en/messages.po @@ -365,7 +365,7 @@ msgstr "" msgid "{0}s" msgstr "" -#: src/screens/Messages/JoinRequests.tsx:428 +#: src/screens/Messages/JoinRequests.tsx:427 msgid "{count, plural, =0 {No requests to join} one {# request to join} other {# requests to join}}" msgstr "{count, plural, =0 {No requests to join} one {# request to join} other {# requests to join}}" @@ -398,7 +398,7 @@ msgid "{count, plural, one {Update your app to see it.} other {Update your app t msgstr "{count, plural, one {Update your app to see it.} other {Update your app to see them all.}}" #. Displayed when there are more requests to join a group chat than have been loaded -#: src/screens/Messages/JoinRequests.tsx:422 +#: src/screens/Messages/JoinRequests.tsx:421 msgid "{count, plural, other {#+ requests to join}}" msgstr "{count, plural, other {#+ requests to join}}" @@ -586,7 +586,7 @@ msgid "{following} following" msgstr "" #: src/components/dms/components/GroupChatProfileCard.tsx:62 -#: src/components/dms/InitiateChatFlow.tsx:919 +#: src/components/dms/InitiateChatFlow.tsx:922 msgid "{handle} can’t be added" msgstr "{handle} can’t be added" @@ -594,7 +594,7 @@ msgstr "{handle} can’t be added" msgid "{handle} can't be messaged" msgstr "" -#: src/components/dms/InitiateChatFlow.tsx:880 +#: src/components/dms/InitiateChatFlow.tsx:883 msgid "{handle} can’t be messaged" msgstr "{handle} can’t be messaged" @@ -749,28 +749,28 @@ msgstr "" #. Like count display, the <0> tags enclose the number of likes in bold (will never be 0) #. placeholder {0}: formatPostStatCount(post.likeCount) #. placeholder {1}: post.likeCount -#: src/screens/PostThread/components/ThreadItemAnchor.tsx:490 +#: src/screens/PostThread/components/ThreadItemAnchor.tsx:492 msgid "<0>{0} {1, plural, one {like} other {likes}}" msgstr "" #. Quote count display, the <0> tags enclose the number of quotes in bold (will never be 0) #. placeholder {0}: formatPostStatCount(post.quoteCount) #. placeholder {1}: post.quoteCount -#: src/screens/PostThread/components/ThreadItemAnchor.tsx:471 +#: src/screens/PostThread/components/ThreadItemAnchor.tsx:473 msgid "<0>{0} {1, plural, one {quote} other {quotes}}" msgstr "" #. Repost count display, the <0> tags enclose the number of reposts in bold (will never be 0) #. placeholder {0}: formatPostStatCount(post.repostCount) #. placeholder {1}: post.repostCount -#: src/screens/PostThread/components/ThreadItemAnchor.tsx:450 +#: src/screens/PostThread/components/ThreadItemAnchor.tsx:452 msgid "<0>{0} {1, plural, one {repost} other {reposts}}" msgstr "" #. Save count display, the <0> tags enclose the number of saves in bold (will never be 0) #. placeholder {0}: formatPostStatCount(post.bookmarkCount) #. placeholder {1}: post.bookmarkCount -#: src/screens/PostThread/components/ThreadItemAnchor.tsx:508 +#: src/screens/PostThread/components/ThreadItemAnchor.tsx:510 msgid "<0>{0} {1, plural, one {save} other {saves}}" msgstr "" @@ -793,7 +793,7 @@ msgid "<0>{0} members" msgstr "" #. Text identifying the person who added you to a group chat -#: src/screens/Messages/components/ChatStatusInfo.tsx:141 +#: src/screens/Messages/components/ChatStatusInfo.tsx:135 msgid "<0>{displayName}<1/><2> added you" msgstr "<0>{displayName}<1/><2> added you" @@ -855,8 +855,8 @@ msgstr "" #: src/components/dms/dialogs/NewChatDialog.tsx:52 #: src/components/dms/dialogs/NewChatDialog.tsx:90 #: src/components/dms/LeaveConvoPrompt.tsx:38 -#: src/screens/Messages/JoinRequests.tsx:188 -#: src/screens/Messages/JoinRequests.tsx:220 +#: src/screens/Messages/JoinRequests.tsx:187 +#: src/screens/Messages/JoinRequests.tsx:219 msgid "A network error occurred. Please check your internet connection." msgstr "" @@ -903,26 +903,26 @@ msgid "Abusive or discriminatory behavior" msgstr "" #. Accept a chat request -#: src/screens/Messages/components/RequestButtons.tsx:286 +#: src/screens/Messages/components/RequestButtons.tsx:287 msgid "Accept" msgstr "" #. Accept a request to join a chat -#: src/screens/Messages/JoinRequests.tsx:459 +#: src/screens/Messages/JoinRequests.tsx:458 msgctxt "button" msgid "Accept" msgstr "Accept" -#: src/screens/Messages/components/RequestButtons.tsx:280 +#: src/screens/Messages/components/RequestButtons.tsx:281 msgid "Accept chat request" msgstr "" -#: src/screens/Messages/JoinRequests.tsx:453 +#: src/screens/Messages/JoinRequests.tsx:452 msgid "Accept join request" msgstr "Accept join request" #. Accept a chat request -#: src/screens/Messages/components/RequestListItem.tsx:51 +#: src/screens/Messages/components/IncomingRequestListItem.tsx:51 msgid "Accept Request" msgstr "" @@ -958,7 +958,7 @@ msgid "Account" msgstr "" #: src/components/PostControls/PostMenu/PostMenuItems.tsx:426 -#: src/screens/Messages/components/RequestButtons.tsx:97 +#: src/screens/Messages/components/RequestButtons.tsx:104 #: src/screens/Messages/ConversationSettings/MemberMenu.tsx:117 #: src/view/com/profile/ProfileMenu.tsx:188 msgctxt "toast" @@ -1092,11 +1092,11 @@ msgstr "" msgid "Add another account" msgstr "" -#: src/view/com/composer/Composer.tsx:1454 +#: src/view/com/composer/Composer.tsx:1472 msgid "Add another post" msgstr "" -#: src/view/com/composer/Composer.tsx:2117 +#: src/view/com/composer/Composer.tsx:2135 msgid "Add another post to thread" msgstr "" @@ -1245,7 +1245,7 @@ msgid "Additional details (limit 300 characters)" msgstr "" #: src/screens/Messages/ConversationSettings/Member.tsx:82 -#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:152 +#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:150 msgid "Admin" msgstr "Admin" @@ -1414,7 +1414,7 @@ msgid "Already signed in as @{0}" msgstr "" #: src/components/images/AutoSizedImage.tsx:204 -#: src/components/images/Gallery/index.tsx:576 +#: src/components/images/Gallery/index.tsx:584 #: src/components/images/ImageLayoutGridItem.tsx:142 #: src/components/Post/Embed/VideoEmbed/GifPresentationControls.tsx:94 #: src/view/com/composer/GifAltText.tsx:100 @@ -1736,12 +1736,12 @@ msgid "Apply Pull Request" msgstr "" #. placeholder {0}: niceDate(i18n, createdAt, 'medium') -#: src/screens/PostThread/components/ThreadItemAnchor.tsx:630 +#: src/screens/PostThread/components/ThreadItemAnchor.tsx:632 msgid "Archived from {0}" msgstr "" -#: src/screens/PostThread/components/ThreadItemAnchor.tsx:601 -#: src/screens/PostThread/components/ThreadItemAnchor.tsx:639 +#: src/screens/PostThread/components/ThreadItemAnchor.tsx:603 +#: src/screens/PostThread/components/ThreadItemAnchor.tsx:641 msgid "Archived post" msgstr "" @@ -1767,7 +1767,8 @@ msgstr "" msgid "Are you sure you want to discard your changes?" msgstr "" -#: src/screens/Messages/ConversationSettings/prompts.tsx:117 +#: src/screens/Messages/ConversationSettings/prompts.tsx:120 +#: src/screens/Messages/ConversationSettings/prompts.tsx:144 msgid "Are you sure you want to leave {groupName}?" msgstr "Are you sure you want to leave {groupName}?" @@ -1783,7 +1784,12 @@ msgstr "Are you sure you want to leave this conversation? Your messages will be msgid "Are you sure you want to remove this from your feeds?" msgstr "" -#: src/view/com/composer/Composer.tsx:1590 +#. placeholder {0}: convoView.name +#: src/screens/Messages/components/OutgoingRequestListItem.tsx:117 +msgid "Are you sure you want to rescind your request to join {0}?" +msgstr "Are you sure you want to rescind your request to join {0}?" + +#: src/view/com/composer/Composer.tsx:1608 msgid "Are you sure you'd like to discard this post?" msgstr "" @@ -1850,8 +1856,8 @@ msgstr "" #: src/components/dms/AddMembersFlow.tsx:520 #: src/components/dms/AddMembersFlow.tsx:526 #: src/components/dms/InitiateChatFlow.tsx:517 -#: src/components/dms/InitiateChatFlow.tsx:732 -#: src/components/dms/InitiateChatFlow.tsx:739 +#: src/components/dms/InitiateChatFlow.tsx:735 +#: src/components/dms/InitiateChatFlow.tsx:742 #: src/components/moderation/LabelsOnMeDialog.tsx:334 #: src/components/moderation/LabelsOnMeDialog.tsx:335 #: src/screens/Login/ChooseAccountForm.tsx:98 @@ -1866,7 +1872,7 @@ msgstr "" #: src/screens/Messages/components/ChatDisabled.tsx:166 #: src/screens/Messages/components/InviteLinkDialog.tsx:251 #: src/screens/Messages/components/InviteLinkDialog.tsx:279 -#: src/screens/Messages/Inbox.tsx:232 +#: src/screens/Messages/Inbox.tsx:245 #: src/screens/Profile/Header/Shell.tsx:174 #: src/screens/Settings/components/ChangePasswordDialog.tsx:273 #: src/screens/Settings/components/ChangePasswordDialog.tsx:282 @@ -1877,7 +1883,7 @@ msgstr "" msgid "Back" msgstr "" -#: src/screens/Messages/Inbox.tsx:231 +#: src/screens/Messages/Inbox.tsx:244 msgid "Back to Chats" msgstr "" @@ -1913,7 +1919,7 @@ msgstr "" msgid "Before creating a starter pack, you must first verify your email." msgstr "" -#: src/screens/Messages/components/RequestButtons.tsx:259 +#: src/screens/Messages/components/RequestButtons.tsx:260 msgid "Before you can accept this chat request, you must first verify your email." msgstr "" @@ -1926,7 +1932,7 @@ msgstr "" #: src/screens/Messages/ChatList.tsx:147 #: src/screens/Messages/ChatList.tsx:211 #: src/screens/Messages/ChatList.tsx:482 -#: src/screens/Messages/Conversation.tsx:208 +#: src/screens/Messages/Conversation.tsx:207 #: src/screens/Messages/ConversationSettings/MemberMenu.tsx:94 msgid "Before you can message another user, you must first verify your email." msgstr "" @@ -1956,9 +1962,8 @@ msgid "Birthday" msgstr "" #: src/components/PostControls/PostMenu/PostMenuItems.tsx:853 -#: src/screens/Messages/components/ChatStatusInfo.tsx:67 #: src/screens/Messages/ConversationSettings/MemberMenu.tsx:222 -#: src/screens/Messages/ConversationSettings/prompts.tsx:142 +#: src/screens/Messages/ConversationSettings/prompts.tsx:169 #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:207 #: src/view/com/profile/ProfileMenu.tsx:563 msgid "Block" @@ -1968,18 +1973,18 @@ msgstr "" msgid "Block {displayName}" msgstr "Block {displayName}" -#: src/components/dms/ConvoMenu.tsx:294 -#: src/components/dms/ConvoMenu.tsx:298 +#: src/components/dms/ConvoMenu.tsx:284 +#: src/components/dms/ConvoMenu.tsx:288 #: src/components/PostControls/PostMenu/PostMenuItems.tsx:747 #: src/components/PostControls/PostMenu/PostMenuItems.tsx:749 -#: src/screens/Messages/components/RequestButtons.tsx:149 -#: src/screens/Messages/components/RequestButtons.tsx:151 +#: src/screens/Messages/components/RequestButtons.tsx:154 +#: src/screens/Messages/components/RequestButtons.tsx:156 #: src/view/com/profile/ProfileMenu.tsx:469 #: src/view/com/profile/ProfileMenu.tsx:476 msgid "Block account" msgstr "" -#: src/screens/Messages/ConversationSettings/prompts.tsx:139 +#: src/screens/Messages/ConversationSettings/prompts.tsx:166 msgid "Block account?" msgstr "Block account?" @@ -2007,7 +2012,7 @@ msgstr "Block and leave" msgid "Block list" msgstr "" -#: src/screens/Messages/components/ChatStatusInfo.tsx:67 +#: src/screens/Messages/components/ChatStatusInfo.tsx:61 msgid "Block or report" msgstr "" @@ -2051,7 +2056,7 @@ msgid "Blocked Accounts" msgstr "" #: src/components/PostControls/PostMenu/PostMenuItems.tsx:851 -#: src/screens/Messages/ConversationSettings/prompts.tsx:140 +#: src/screens/Messages/ConversationSettings/prompts.tsx:167 #: src/view/com/profile/ProfileMenu.tsx:558 msgid "Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you." msgstr "" @@ -2081,7 +2086,7 @@ msgstr "" msgid "Bluesky" msgstr "" -#: src/screens/PostThread/components/ThreadItemAnchor.tsx:655 +#: src/screens/PostThread/components/ThreadItemAnchor.tsx:657 msgid "Bluesky cannot confirm the authenticity of the claimed date." msgstr "" @@ -2302,8 +2307,9 @@ msgstr "" #: src/screens/Deactivated.tsx:150 #: src/screens/Messages/components/InviteLinkDialog.tsx:463 #: src/screens/Messages/components/InviteLinkDialog.tsx:467 -#: src/screens/Messages/ConversationSettings/prompts.tsx:97 -#: src/screens/Messages/ConversationSettings/prompts.tsx:121 +#: src/screens/Messages/ConversationSettings/prompts.tsx:100 +#: src/screens/Messages/ConversationSettings/prompts.tsx:124 +#: src/screens/Messages/ConversationSettings/prompts.tsx:148 #: src/screens/Profile/Header/EditProfileDialog.tsx:215 #: src/screens/Profile/Header/EditProfileDialog.tsx:223 #: src/screens/Search/Shell.tsx:405 @@ -2316,8 +2322,8 @@ msgstr "" #: src/screens/Settings/Settings.tsx:300 #: src/screens/Takendown.tsx:102 #: src/screens/Takendown.tsx:105 -#: src/view/com/composer/Composer.tsx:1668 -#: src/view/com/composer/Composer.tsx:1678 +#: src/view/com/composer/Composer.tsx:1686 +#: src/view/com/composer/Composer.tsx:1696 #: src/view/com/composer/photos/EditImageDialog.web.tsx:44 #: src/view/com/composer/photos/EditImageDialog.web.tsx:53 #: src/view/shell/desktop/LeftNav.tsx:228 @@ -2352,7 +2358,7 @@ msgstr "" msgid "Captions & alt text" msgstr "" -#: src/components/images/Gallery/index.tsx:263 +#: src/components/images/Gallery/index.tsx:275 msgid "carousel" msgstr "carousel" @@ -2439,8 +2445,8 @@ msgstr "" msgid "Chat" msgstr "" -#: src/screens/Messages/components/RequestButtons.tsx:84 -#: src/screens/Messages/components/RequestButtons.tsx:330 +#: src/screens/Messages/components/RequestButtons.tsx:91 +#: src/screens/Messages/components/RequestButtons.tsx:331 msgctxt "toast" msgid "Chat deleted" msgstr "" @@ -2468,7 +2474,7 @@ msgstr "" msgid "Chat messages - sound" msgstr "" -#: src/components/dms/ConvoMenu.tsx:216 +#: src/components/dms/ConvoMenu.tsx:206 msgctxt "toast" msgid "Chat muted" msgstr "" @@ -2481,12 +2487,12 @@ msgstr "Chat recipient is not followed by the sender." msgid "Chat request inbox" msgstr "" -#: src/screens/Messages/Inbox.tsx:56 -#: src/screens/Messages/Inbox.tsx:96 +#: src/screens/Messages/Inbox.tsx:62 +#: src/screens/Messages/Inbox.tsx:109 msgid "Chat requests" msgstr "" -#: src/components/dms/ConvoMenu.tsx:84 +#: src/components/dms/ConvoMenu.tsx:88 #: src/Navigation.tsx:500 #: src/screens/Messages/ChatList.tsx:83 #: src/screens/Messages/ChatList.tsx:87 @@ -2513,7 +2519,7 @@ msgstr "Chat title changed to {0}" msgid "Chat unlocked" msgstr "Chat unlocked" -#: src/components/dms/ConvoMenu.tsx:218 +#: src/components/dms/ConvoMenu.tsx:208 msgctxt "toast" msgid "Chat unmuted" msgstr "" @@ -2805,7 +2811,7 @@ msgstr "" msgid "Closes password update alert" msgstr "" -#: src/view/com/composer/Composer.tsx:1676 +#: src/view/com/composer/Composer.tsx:1694 msgid "Closes post composer and discards post draft" msgstr "" @@ -2855,7 +2861,7 @@ msgid "Compose new post" msgstr "" #. placeholder {0}: MAX_GRAPHEME_LENGTH || 0 -#: src/view/com/composer/Composer.tsx:1552 +#: src/view/com/composer/Composer.tsx:1570 msgid "Compose posts up to {0, plural, other {# characters}} in length" msgstr "" @@ -2863,11 +2869,11 @@ msgstr "" msgid "Compose reply" msgstr "" -#: src/view/com/composer/Composer.tsx:2514 +#: src/view/com/composer/Composer.tsx:2532 msgid "Compressing GIF..." msgstr "" -#: src/view/com/composer/Composer.tsx:2516 +#: src/view/com/composer/Composer.tsx:2534 msgid "Compressing video..." msgstr "" @@ -3035,7 +3041,7 @@ msgstr "" msgid "Conversation" msgstr "" -#: src/screens/Messages/components/ChatListItem.tsx:329 +#: src/screens/Messages/components/ChatListItem.tsx:322 msgid "Conversation deleted" msgstr "" @@ -3052,8 +3058,8 @@ msgid "Conversation left" msgstr "Conversation left" #: src/components/dms/LeaveConvoPrompt.tsx:40 -#: src/screens/Messages/JoinRequests.tsx:192 -#: src/screens/Messages/JoinRequests.tsx:224 +#: src/screens/Messages/JoinRequests.tsx:191 +#: src/screens/Messages/JoinRequests.tsx:223 msgid "Conversation not found." msgstr "Conversation not found." @@ -3222,7 +3228,7 @@ msgstr "Could not load invite" msgid "Could not load list" msgstr "" -#: src/components/dms/ConvoMenu.tsx:222 +#: src/components/dms/ConvoMenu.tsx:212 msgid "Could not mute chat" msgstr "" @@ -3357,7 +3363,7 @@ msgstr "" msgid "Create new account" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:487 +#: src/screens/Messages/ConversationSettings/index.tsx:520 msgid "Create or modify an invite link for this group chat" msgstr "Create or modify an invite link for this group chat" @@ -3381,7 +3387,7 @@ msgstr "" #. placeholder {0}: i18n.date(createdAt, { dateStyle: 'long', timeStyle: 'short', }) #. placeholder {0}: i18n.date(createdAt, { month: 'long', day: 'numeric', year: 'numeric', }) #: src/screens/Messages/components/InviteLinkDialog.tsx:324 -#: src/screens/Messages/ConversationSettings/index.tsx:440 +#: src/screens/Messages/ConversationSettings/index.tsx:472 #: src/screens/Settings/AppPasswords.tsx:174 msgid "Created {0}" msgstr "" @@ -3493,8 +3499,8 @@ msgstr "" msgid "Delete app password?" msgstr "" -#: src/screens/Messages/components/RequestButtons.tsx:343 -#: src/screens/Messages/components/RequestButtons.tsx:349 +#: src/screens/Messages/components/RequestButtons.tsx:344 +#: src/screens/Messages/components/RequestButtons.tsx:350 msgid "Delete chat" msgstr "" @@ -3509,8 +3515,8 @@ msgstr "" #: src/components/dms/AfterReportDialog.tsx:151 #: src/components/dms/AfterReportDialog.tsx:195 #: src/components/dms/AfterReportDialog.tsx:198 -#: src/screens/Messages/components/RequestButtons.tsx:142 -#: src/screens/Messages/components/RequestButtons.tsx:144 +#: src/screens/Messages/components/RequestButtons.tsx:147 +#: src/screens/Messages/components/RequestButtons.tsx:149 msgid "Delete conversation" msgstr "" @@ -3537,7 +3543,7 @@ msgstr "" #: src/components/PostControls/PostMenu/PostMenuItems.tsx:787 #: src/components/PostControls/PostMenu/PostMenuItems.tsx:789 -#: src/view/com/composer/Composer.tsx:1564 +#: src/view/com/composer/Composer.tsx:1582 msgid "Delete post" msgstr "" @@ -3562,7 +3568,7 @@ msgstr "" msgid "Deleted" msgstr "" -#: src/components/dms/MessagesListHeader.tsx:109 +#: src/components/dms/MessagesListHeader.tsx:103 #: src/screens/Messages/components/ChatListItem.tsx:134 #: src/screens/Messages/ConversationSettings/Member.tsx:75 msgid "Deleted Account" @@ -3684,9 +3690,9 @@ msgstr "" #: src/components/dialogs/lists/CreateOrEditListDialog.tsx:101 #: src/screens/Profile/Header/EditProfileDialog.tsx:79 -#: src/view/com/composer/Composer.tsx:1347 -#: src/view/com/composer/Composer.tsx:1391 -#: src/view/com/composer/Composer.tsx:1597 +#: src/view/com/composer/Composer.tsx:1365 +#: src/view/com/composer/Composer.tsx:1409 +#: src/view/com/composer/Composer.tsx:1615 #: src/view/com/composer/drafts/DraftItem.tsx:242 #: src/view/com/composer/drafts/DraftsButton.tsx:131 msgid "Discard" @@ -3697,14 +3703,14 @@ msgstr "" msgid "Discard changes?" msgstr "" -#: src/view/com/composer/Composer.tsx:1345 +#: src/view/com/composer/Composer.tsx:1363 #: src/view/com/composer/drafts/DraftItem.tsx:239 #: src/view/com/composer/drafts/DraftsButton.tsx:98 msgid "Discard draft?" msgstr "" -#: src/view/com/composer/Composer.tsx:1362 -#: src/view/com/composer/Composer.tsx:1589 +#: src/view/com/composer/Composer.tsx:1380 +#: src/view/com/composer/Composer.tsx:1607 msgid "Discard post?" msgstr "" @@ -3741,7 +3747,7 @@ msgstr "" msgid "Dismiss banner" msgstr "" -#: src/view/com/composer/Composer.tsx:2435 +#: src/view/com/composer/Composer.tsx:2453 msgid "Dismiss error" msgstr "" @@ -3994,11 +4000,11 @@ msgstr "" msgid "Edit interests" msgstr "" -#: src/screens/Messages/JoinRequests.tsx:294 +#: src/screens/Messages/JoinRequests.tsx:293 msgid "Edit invite link" msgstr "Edit invite link" -#: src/screens/Messages/JoinRequests.tsx:300 +#: src/screens/Messages/JoinRequests.tsx:299 msgctxt "button" msgid "Edit invite link" msgstr "Edit invite link" @@ -4026,7 +4032,7 @@ msgstr "" msgid "Edit My Feeds" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:474 +#: src/screens/Messages/ConversationSettings/index.tsx:507 msgid "Edit name" msgstr "Edit name" @@ -4055,7 +4061,8 @@ msgstr "" msgid "Edit starter pack" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:473 +#: src/screens/Messages/ConversationSettings/index.tsx:453 +#: src/screens/Messages/ConversationSettings/index.tsx:506 msgid "Edit this group chat’s name" msgstr "Edit this group chat’s name" @@ -4272,7 +4279,7 @@ msgstr "" msgid "Entertainment" msgstr "" -#: src/view/com/composer/Composer.tsx:2534 +#: src/view/com/composer/Composer.tsx:2552 #: src/view/com/util/error/ErrorScreen.tsx:40 msgid "Error" msgstr "" @@ -4457,12 +4464,12 @@ msgstr "" msgid "Extremist content" msgstr "" -#: src/screens/Messages/components/RequestButtons.tsx:243 +#: src/screens/Messages/components/RequestButtons.tsx:244 msgctxt "toast" msgid "Failed to accept chat" msgstr "" -#: src/screens/Messages/JoinRequests.tsx:186 +#: src/screens/Messages/JoinRequests.tsx:185 msgid "Failed to accept join request" msgstr "Failed to accept join request" @@ -4506,8 +4513,8 @@ msgstr "Failed to create invite link" msgid "Failed to create starter pack" msgstr "" -#: src/screens/Messages/components/RequestButtons.tsx:70 -#: src/screens/Messages/components/RequestButtons.tsx:317 +#: src/screens/Messages/components/RequestButtons.tsx:77 +#: src/screens/Messages/components/RequestButtons.tsx:318 msgctxt "toast" msgid "Failed to delete chat" msgstr "" @@ -4533,7 +4540,7 @@ msgstr "Failed to disable invite link" msgid "Failed to disconnect Germ DM. Error: {0}" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:344 +#: src/screens/Messages/ConversationSettings/index.tsx:349 msgid "Failed to edit group chat name" msgstr "Failed to edit group chat name" @@ -4557,7 +4564,7 @@ msgstr "" msgid "Failed to hide suggestion, please check your internet connection" msgstr "" -#: src/screens/Messages/JoinRequests.tsx:218 +#: src/screens/Messages/JoinRequests.tsx:217 msgid "Failed to ignore join request" msgstr "Failed to ignore join request" @@ -4571,13 +4578,13 @@ msgstr "" #: src/screens/Messages/components/ChatEnded.tsx:42 #: src/screens/Messages/components/ChatLocked.tsx:53 -#: src/screens/Messages/ConversationSettings/index.tsx:371 +#: src/screens/Messages/ConversationSettings/index.tsx:376 msgctxt "toast" msgid "Failed to leave group chat" msgstr "Failed to leave group chat" #: src/screens/Messages/ChatList.tsx:345 -#: src/screens/Messages/Inbox.tsx:201 +#: src/screens/Messages/Inbox.tsx:214 msgid "Failed to load conversations" msgstr "" @@ -4622,15 +4629,15 @@ msgstr "" msgid "Failed to load suggested follows" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:392 +#: src/screens/Messages/ConversationSettings/index.tsx:400 msgid "Failed to lock group chat" msgstr "Failed to lock group chat" -#: src/screens/Messages/Inbox.tsx:299 +#: src/screens/Messages/Inbox.tsx:316 msgid "Failed to mark all requests as read" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:358 +#: src/screens/Messages/ConversationSettings/index.tsx:363 msgid "Failed to mute group chat" msgstr "Failed to mute group chat" @@ -4671,6 +4678,7 @@ msgid "Failed to remove verification" msgstr "" #: src/components/intents/GroupChatJoinDialog.tsx:151 +#: src/screens/Messages/components/OutgoingRequestListItem.tsx:37 msgid "Failed to rescind your request. Please try again." msgstr "Failed to rescind your request. Please try again." @@ -4678,7 +4686,7 @@ msgstr "Failed to rescind your request. Please try again." msgid "Failed to resolve location. Please try again." msgstr "" -#: src/view/com/composer/Composer.tsx:639 +#: src/view/com/composer/Composer.tsx:640 msgid "Failed to save draft" msgstr "" @@ -4721,7 +4729,7 @@ msgid "Failed to toggle thread mute, please try again" msgstr "" #: src/screens/Messages/components/ChatLocked.tsx:42 -#: src/screens/Messages/ConversationSettings/index.tsx:395 +#: src/screens/Messages/ConversationSettings/index.tsx:403 msgid "Failed to unlock group chat" msgstr "Failed to unlock group chat" @@ -5327,7 +5335,7 @@ msgstr "" msgid "GIF" msgstr "" -#: src/view/com/composer/Composer.tsx:2539 +#: src/view/com/composer/Composer.tsx:2557 msgid "GIF uploaded" msgstr "" @@ -5359,9 +5367,9 @@ msgstr "" msgid "Go back" msgstr "" -#: src/components/Error.tsx:77 +#: src/components/Error.tsx:72 #: src/screens/List/ListHiddenScreen.tsx:228 -#: src/screens/Messages/Conversation.tsx:371 +#: src/screens/Messages/Conversation.tsx:370 #: src/screens/Profile/ErrorState.tsx:63 #: src/screens/Profile/ErrorState.tsx:67 #: src/screens/StarterPack/StarterPackScreen.tsx:807 @@ -5432,9 +5440,9 @@ msgstr "" msgid "Go to next" msgstr "" -#: src/components/dms/ConvoMenu.tsx:272 -#: src/screens/Messages/components/MessagesListInfoPanel.tsx:93 -#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:191 +#: src/components/dms/ConvoMenu.tsx:262 +#: src/screens/Messages/components/MessagesListInfoPanel.tsx:97 +#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:189 #: src/view/shell/desktop/LeftNav.tsx:336 #: src/view/shell/desktop/LeftNav.tsx:342 msgid "Go to profile" @@ -5444,11 +5452,11 @@ msgstr "" msgid "Go to the group chat named \"{chatName}\"" msgstr "Go to the group chat named \"{chatName}\"" -#: src/components/dms/ConvoMenu.tsx:268 +#: src/components/dms/ConvoMenu.tsx:258 msgid "Go to user's profile" msgstr "" -#: src/screens/Messages/components/MessagesListInfoPanel.tsx:87 +#: src/screens/Messages/components/MessagesListInfoPanel.tsx:91 msgid "Go to user’s profile" msgstr "Go to user’s profile" @@ -5482,46 +5490,46 @@ msgstr "" msgid "Group chat" msgstr "Group chat" -#: src/screens/Messages/components/InviteLinkDialog.tsx:517 +#: src/screens/Messages/components/InviteLinkDialog.tsx:518 msgid "Group chat invite link dialog" msgstr "Group chat invite link dialog" -#: src/screens/Messages/ConversationSettings/index.tsx:384 +#: src/screens/Messages/ConversationSettings/index.tsx:392 msgctxt "toast" msgid "Group chat locked" msgstr "Group chat locked" -#: src/screens/Messages/ConversationSettings/index.tsx:351 +#: src/screens/Messages/ConversationSettings/index.tsx:356 msgctxt "toast" msgid "Group chat muted" msgstr "Group chat muted" -#: src/screens/Messages/ConversationSettings/index.tsx:339 +#: src/screens/Messages/ConversationSettings/index.tsx:344 msgctxt "toast" msgid "Group chat name updated" msgstr "Group chat name updated" #: src/Navigation.tsx:490 -#: src/screens/Messages/ConversationSettings/index.tsx:91 +#: src/screens/Messages/ConversationSettings/index.tsx:97 msgid "Group chat settings" msgstr "Group chat settings" #: src/screens/Messages/components/ChatLocked.tsx:38 -#: src/screens/Messages/ConversationSettings/index.tsx:386 +#: src/screens/Messages/ConversationSettings/index.tsx:394 msgctxt "toast" msgid "Group chat unlocked" msgstr "Group chat unlocked" -#: src/screens/Messages/ConversationSettings/index.tsx:353 +#: src/screens/Messages/ConversationSettings/index.tsx:358 msgctxt "toast" msgid "Group chat unmuted" msgstr "Group chat unmuted" -#: src/screens/Messages/Conversation.tsx:355 +#: src/screens/Messages/Conversation.tsx:354 msgid "Group chats are not yet available" msgstr "Group chats are not yet available" -#: src/screens/Messages/Conversation.tsx:353 +#: src/screens/Messages/Conversation.tsx:352 msgid "Group chats are now available" msgstr "Group chats are now available" @@ -5542,8 +5550,8 @@ msgstr "Group name" #: src/components/dms/InitiateChatFlow.tsx:602 #: src/screens/Messages/ConversationSettings/prompts.tsx:61 -msgid "Group name is too long. The maximum number of characters is {MAX_GROUP_NAME_GRAPHEME_LENGTH}." -msgstr "Group name is too long. The maximum number of characters is {MAX_GROUP_NAME_GRAPHEME_LENGTH}." +msgid "Group name is too long. {MAX_GROUP_NAME_GRAPHEME_LENGTH, plural, other {The maximum number of characters is #.}}" +msgstr "Group name is too long. {MAX_GROUP_NAME_GRAPHEME_LENGTH, plural, other {The maximum number of characters is #.}}" #: src/components/moderation/ReportDialog/utils/useReportOptions.ts:219 msgid "Hacking or system attacks" @@ -5808,7 +5816,7 @@ msgstr "" msgid "Hold up! We’re gradually giving access to video, and you’re still waiting in line. Check back soon!" msgstr "" -#: src/screens/Messages/Conversation.tsx:362 +#: src/screens/Messages/Conversation.tsx:361 msgid "Hold your horses! This feature isn't available to you yet. Please check back later." msgstr "Hold your horses! This feature isn't available to you yet. Please check back later." @@ -5938,12 +5946,12 @@ msgid "If you're trying to change your handle or email, do so before you deactiv msgstr "" #. Ignore a request to join a chat -#: src/screens/Messages/JoinRequests.tsx:484 +#: src/screens/Messages/JoinRequests.tsx:483 msgctxt "button" msgid "Ignore" msgstr "Ignore" -#: src/screens/Messages/JoinRequests.tsx:478 +#: src/screens/Messages/JoinRequests.tsx:477 msgid "Ignore join request" msgstr "Ignore join request" @@ -5952,7 +5960,7 @@ msgid "Image" msgstr "" #. placeholder {0}: index + 1 -#: src/components/images/Gallery/index.tsx:451 +#: src/components/images/Gallery/index.tsx:459 msgid "Image {0}" msgstr "Image {0}" @@ -5963,7 +5971,7 @@ msgid "Image {0} of {1}" msgstr "" #. placeholder {0}: index + 1 -#: src/components/images/Gallery/index.tsx:436 +#: src/components/images/Gallery/index.tsx:444 msgid "Image {0} of {imageCount}" msgstr "Image {0} of {imageCount}" @@ -5978,7 +5986,7 @@ msgid "Image cache cleared, freed {0}" msgstr "" #. placeholder {0}: images.length -#: src/components/images/Gallery/index.tsx:264 +#: src/components/images/Gallery/index.tsx:276 msgid "Image gallery, {0} images" msgstr "Image gallery, {0} images" @@ -6075,7 +6083,7 @@ msgid "Inbox empty" msgstr "Inbox empty" #. Title message shown in chat requests inbox when it's empty -#: src/screens/Messages/Inbox.tsx:218 +#: src/screens/Messages/Inbox.tsx:231 msgid "Inbox zero!" msgstr "" @@ -6147,6 +6155,7 @@ msgid "Invalid report subject" msgstr "" #: src/components/intents/GroupChatJoinDialog.tsx:158 +#: src/screens/Messages/components/OutgoingRequestListItem.tsx:44 msgid "Invalid rescind request." msgstr "Invalid rescind request." @@ -6184,7 +6193,7 @@ msgstr "" #: src/screens/Messages/components/InviteLinkDialog.tsx:310 #: src/screens/Messages/components/InviteLinkDialog.tsx:477 #: src/screens/Messages/components/MessagesListGroupInfoPanel.tsx:148 -#: src/screens/Messages/ConversationSettings/index.tsx:490 +#: src/screens/Messages/ConversationSettings/index.tsx:523 msgid "Invite link" msgstr "Invite link" @@ -6213,7 +6222,7 @@ msgstr "" msgid "Invite your friends to follow your favorite feeds and people" msgstr "" -#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:152 +#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:150 msgid "Invited" msgstr "Invited" @@ -6243,7 +6252,7 @@ msgid "It's just you right now! Add more people to your starter pack by searchin msgstr "" #. placeholder {0}: videoState.jobId -#: src/view/com/composer/Composer.tsx:2454 +#: src/view/com/composer/Composer.tsx:2472 msgid "Job ID: {0}" msgstr "" @@ -6270,6 +6279,7 @@ msgid "Join group chat" msgstr "Join group chat" #: src/components/intents/GroupChatJoinDialog.tsx:147 +#: src/screens/Messages/components/OutgoingRequestListItem.tsx:34 msgid "Join request rescinded." msgstr "Join request rescinded." @@ -6282,8 +6292,8 @@ msgstr "" msgid "Journalism" msgstr "" -#: src/view/com/composer/Composer.tsx:1395 -#: src/view/com/composer/Composer.tsx:1405 +#: src/view/com/composer/Composer.tsx:1413 +#: src/view/com/composer/Composer.tsx:1423 #: src/view/com/composer/drafts/DraftsButton.tsx:135 msgid "Keep editing" msgstr "" @@ -6436,12 +6446,12 @@ msgid "Learn more." msgstr "" #: src/components/dms/LeaveConvoPrompt.tsx:59 -#: src/screens/Messages/ConversationSettings/index.tsx:526 +#: src/screens/Messages/ConversationSettings/index.tsx:558 msgid "Leave" msgstr "" #. Leave a conversation (reject a chat invitation) -#: src/screens/Messages/components/ChatStatusInfo.tsx:78 +#: src/screens/Messages/components/ChatStatusInfo.tsx:72 msgctxt "Button" msgid "Leave" msgstr "Leave" @@ -6455,10 +6465,10 @@ msgstr "" #: src/components/dms/AfterReportConversationDialog.tsx:229 #: src/components/dms/AfterReportConversationDialog.tsx:233 -#: src/components/dms/ConvoMenu.tsx:246 -#: src/components/dms/ConvoMenu.tsx:250 -#: src/components/dms/ConvoMenu.tsx:316 -#: src/components/dms/ConvoMenu.tsx:320 +#: src/components/dms/ConvoMenu.tsx:236 +#: src/components/dms/ConvoMenu.tsx:240 +#: src/components/dms/ConvoMenu.tsx:308 +#: src/components/dms/ConvoMenu.tsx:312 #: src/components/dms/LeaveConvoPrompt.tsx:53 msgid "Leave conversation" msgstr "" @@ -6469,11 +6479,12 @@ msgctxt "button" msgid "Leave conversation" msgstr "Leave conversation" -#: src/screens/Messages/ConversationSettings/prompts.tsx:119 +#: src/screens/Messages/ConversationSettings/prompts.tsx:122 +#: src/screens/Messages/ConversationSettings/prompts.tsx:146 msgid "Leave group chat" msgstr "Leave group chat" -#: src/screens/Messages/ConversationSettings/index.tsx:525 +#: src/screens/Messages/ConversationSettings/index.tsx:557 msgid "Leave this group chat" msgstr "Leave this group chat" @@ -6482,6 +6493,10 @@ msgstr "Leave this group chat" msgid "Leaving Bluesky" msgstr "" +#: src/screens/Messages/ConversationSettings/prompts.tsx:145 +msgid "Leaving this chat will lock it permanently and you won’t be able to rejoin." +msgstr "Leaving this chat will lock it permanently and you won’t be able to rejoin." + #: src/screens/SignupQueued.tsx:158 msgid "left to go." msgstr "" @@ -6575,7 +6590,7 @@ msgstr "" msgid "Likes of your reposts" msgstr "" -#: src/screens/PostThread/components/ThreadItemAnchor.tsx:486 +#: src/screens/PostThread/components/ThreadItemAnchor.tsx:488 msgid "Likes on this post" msgstr "" @@ -6770,23 +6785,23 @@ msgstr "" msgid "Loading..." msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:504 +#: src/screens/Messages/ConversationSettings/index.tsx:537 msgid "Lock" msgstr "Lock" -#: src/screens/Messages/ConversationSettings/prompts.tsx:96 +#: src/screens/Messages/ConversationSettings/prompts.tsx:99 msgid "Lock group chat" msgstr "Lock group chat" -#: src/screens/Messages/ConversationSettings/prompts.tsx:94 +#: src/screens/Messages/ConversationSettings/prompts.tsx:97 msgid "Lock group chat?" msgstr "Lock group chat?" -#: src/screens/Messages/ConversationSettings/index.tsx:502 +#: src/screens/Messages/ConversationSettings/index.tsx:535 msgid "Lock this group chat" msgstr "Lock this group chat" -#: src/screens/Messages/ConversationSettings/index.tsx:504 +#: src/screens/Messages/ConversationSettings/index.tsx:537 msgid "Locked" msgstr "Locked" @@ -6862,17 +6877,17 @@ msgstr "" msgid "Manage your muted words and tags" msgstr "" -#: src/screens/Messages/Inbox.tsx:307 -#: src/screens/Messages/Inbox.tsx:313 +#: src/screens/Messages/Inbox.tsx:324 +#: src/screens/Messages/Inbox.tsx:330 msgid "Mark all as read" msgstr "" -#: src/components/dms/ConvoMenu.tsx:258 -#: src/components/dms/ConvoMenu.tsx:262 +#: src/components/dms/ConvoMenu.tsx:248 +#: src/components/dms/ConvoMenu.tsx:252 msgid "Mark as read" msgstr "" -#: src/screens/Messages/Inbox.tsx:294 +#: src/screens/Messages/Inbox.tsx:311 msgid "Marked all as read" msgstr "" @@ -6904,7 +6919,7 @@ msgstr "" msgid "Members" msgstr "Members" -#: src/screens/Messages/ConversationSettings/prompts.tsx:95 +#: src/screens/Messages/ConversationSettings/prompts.tsx:98 msgid "Members can still read chat history but can’t send new messages." msgstr "Members can still read chat history but can’t send new messages." @@ -6930,7 +6945,7 @@ msgstr "Message" #: src/screens/Messages/components/MessageComposer.tsx:218 #: src/screens/Messages/components/MessageInput.tsx:235 #: src/screens/Messages/components/MessageInput.web.tsx:203 -#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:199 +#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:198 msgctxt "action" msgid "Message" msgstr "Message" @@ -6940,11 +6955,11 @@ msgstr "Message" msgid "Message {0}" msgstr "" -#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:195 +#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:194 msgid "Message {displayName}" msgstr "Message {displayName}" -#: src/screens/Messages/components/ChatListItem.tsx:330 +#: src/screens/Messages/components/ChatListItem.tsx:323 msgid "Message deleted" msgstr "" @@ -7114,7 +7129,7 @@ msgstr "" msgid "Music" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:466 +#: src/screens/Messages/ConversationSettings/index.tsx:499 msgid "Mute" msgstr "Mute" @@ -7142,8 +7157,8 @@ msgstr "" msgid "Mute accounts" msgstr "" -#: src/components/dms/ConvoMenu.tsx:277 -#: src/components/dms/ConvoMenu.tsx:284 +#: src/components/dms/ConvoMenu.tsx:267 +#: src/components/dms/ConvoMenu.tsx:274 msgid "Mute conversation" msgstr "" @@ -7159,7 +7174,7 @@ msgstr "" msgid "Mute these accounts?" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:464 +#: src/screens/Messages/ConversationSettings/index.tsx:497 msgid "Mute this group chat" msgstr "Mute this group chat" @@ -7197,7 +7212,7 @@ msgstr "" msgid "Mute words & tags" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:466 +#: src/screens/Messages/ConversationSettings/index.tsx:499 msgid "Muted" msgstr "Muted" @@ -7351,8 +7366,8 @@ msgstr "New group chat" #. Button used to create a new group chat. #. Button used to create a new group chat. -#: src/components/dms/InitiateChatFlow.tsx:774 -#: src/components/dms/InitiateChatFlow.tsx:808 +#: src/components/dms/InitiateChatFlow.tsx:777 +#: src/components/dms/InitiateChatFlow.tsx:811 msgctxt "action" msgid "New group chat" msgstr "New group chat" @@ -7523,7 +7538,7 @@ msgstr "" msgid "No media yet" msgstr "" -#: src/screens/Messages/components/ChatListItem.tsx:316 +#: src/screens/Messages/components/ChatListItem.tsx:311 msgid "No messages yet" msgstr "" @@ -7607,8 +7622,8 @@ msgstr "" msgid "No results for \"{0}\"." msgstr "" -#: src/components/Lists.tsx:204 -#: src/components/Lists.tsx:219 +#: src/components/Lists.tsx:203 +#: src/components/Lists.tsx:218 msgid "No results found" msgstr "" @@ -7767,10 +7782,10 @@ msgstr "" #: src/components/BotAccountAlert.tsx:52 #: src/components/BotAccountAlert.tsx:57 -#: src/components/dms/InitiateChatFlow.tsx:707 +#: src/components/dms/InitiateChatFlow.tsx:710 #: src/components/dms/MessageItem.tsx:641 #: src/screens/Login/PasswordUpdatedForm.tsx:37 -#: src/screens/PostThread/components/ThreadItemAnchor.tsx:661 +#: src/screens/PostThread/components/ThreadItemAnchor.tsx:663 msgid "Okay" msgstr "" @@ -7801,11 +7816,11 @@ msgstr "One of the selected recipients does not allow group chats." msgid "One of the selected recipients has blocked you and cannot be messaged." msgstr "One of the selected recipients has blocked you and cannot be messaged." -#: src/view/com/composer/Composer.tsx:855 +#: src/view/com/composer/Composer.tsx:856 msgid "One or more GIFs is missing alt text." msgstr "" -#: src/view/com/composer/Composer.tsx:852 +#: src/view/com/composer/Composer.tsx:853 msgid "One or more images is missing alt text." msgstr "" @@ -7817,11 +7832,11 @@ msgstr "" msgid "One or more of your selected files are too large. Maximum size is {VIDEO_MAX_SIZE_MB} MB." msgstr "One or more of your selected files are too large. Maximum size is {VIDEO_MAX_SIZE_MB} MB." -#: src/view/com/composer/Composer.tsx:650 +#: src/view/com/composer/Composer.tsx:651 msgid "One or more posts are too long to save as a draft. {MAX_DRAFT_GRAPHEME_LENGTH, plural, one {The maximum number of characters is # character.} other {The maximum number of characters is # characters.}}" msgstr "" -#: src/view/com/composer/Composer.tsx:862 +#: src/view/com/composer/Composer.tsx:863 msgid "One or more videos is missing alt text." msgstr "" @@ -7834,15 +7849,15 @@ msgstr "" #. placeholder {0}: result.accepted.length #. placeholder {1}: next.length #. placeholder {2}: next.length -#: src/view/com/composer/Composer.tsx:225 +#: src/view/com/composer/Composer.tsx:226 msgid "Only {0} of {1} {2, plural, one {image} other {images}} added; limit is {MAX_GALLERY_IMAGES}" msgstr "Only {0} of {1} {2, plural, one {image} other {images}} added; limit is {MAX_GALLERY_IMAGES}" -#: src/screens/Messages/JoinRequests.tsx:196 +#: src/screens/Messages/JoinRequests.tsx:195 msgid "Only admins can accept join requests." msgstr "Only admins can accept join requests." -#: src/screens/Messages/JoinRequests.tsx:228 +#: src/screens/Messages/JoinRequests.tsx:227 msgid "Only admins can ignore join requests." msgstr "Only admins can ignore join requests." @@ -7900,12 +7915,12 @@ msgstr "" msgid "Open chat" msgstr "Open chat" -#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:139 +#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:137 msgid "Open chat member options for {displayName}" msgstr "Open chat member options for {displayName}" -#: src/screens/Messages/components/ChatListItem.tsx:495 -#: src/screens/Messages/components/ChatListItem.tsx:499 +#: src/screens/Messages/components/ChatListItem.tsx:486 +#: src/screens/Messages/components/ChatListItem.tsx:490 msgid "Open conversation options" msgstr "" @@ -7919,7 +7934,7 @@ msgstr "" #: src/screens/Messages/components/MessageComposer.tsx:176 #: src/screens/Messages/components/MessageInput.web.tsx:148 -#: src/view/com/composer/Composer.tsx:2094 +#: src/view/com/composer/Composer.tsx:2112 msgid "Open emoji picker" msgstr "" @@ -7944,8 +7959,8 @@ msgstr "" msgid "Open group chat" msgstr "Open group chat" -#: src/components/dms/MessagesListHeader.tsx:181 -#: src/components/dms/MessagesListHeader.tsx:220 +#: src/components/dms/MessagesListHeader.tsx:168 +#: src/components/dms/MessagesListHeader.tsx:207 msgid "Open group chat settings" msgstr "Open group chat settings" @@ -8063,7 +8078,7 @@ msgstr "" msgid "Opens flow to sign in to your existing Bluesky account" msgstr "" -#: src/components/images/Gallery/index.tsx:452 +#: src/components/images/Gallery/index.tsx:460 msgid "Opens full image" msgstr "Opens full image" @@ -8204,8 +8219,8 @@ msgstr "Owner" msgid "Owner must lock the group before leaving." msgstr "Owner must lock the group before leaving." -#: src/components/Lists.tsx:205 -#: src/components/Lists.tsx:220 +#: src/components/Lists.tsx:204 +#: src/components/Lists.tsx:219 #: src/view/screens/NotFound.tsx:34 #: src/view/screens/NotFound.tsx:41 msgid "Page not found" @@ -8574,7 +8589,7 @@ msgstr "" msgid "Porn" msgstr "" -#: src/view/com/composer/Composer.tsx:1742 +#: src/view/com/composer/Composer.tsx:1760 msgctxt "action" msgid "Post" msgstr "" @@ -8594,12 +8609,12 @@ msgstr "" msgid "Post a video" msgstr "" -#: src/view/com/composer/Composer.tsx:1740 +#: src/view/com/composer/Composer.tsx:1758 msgctxt "action" msgid "Post All" msgstr "" -#: src/view/com/composer/Composer.tsx:1404 +#: src/view/com/composer/Composer.tsx:1422 msgid "Post anyway" msgstr "Post anyway" @@ -8711,10 +8726,10 @@ msgstr "" msgid "Press to attempt reconnection" msgstr "" -#: src/components/Error.tsx:61 +#: src/components/Error.tsx:56 #: src/components/Lists.tsx:104 #: src/screens/Messages/components/MessageListError.tsx:23 -#: src/screens/Messages/JoinRequests.tsx:350 +#: src/screens/Messages/JoinRequests.tsx:349 #: src/screens/Signup/BackNextButtons.tsx:48 msgid "Press to retry" msgstr "" @@ -8772,11 +8787,11 @@ msgstr "" msgid "Privacy violation of a minor" msgstr "" -#: src/view/com/composer/Composer.tsx:2528 +#: src/view/com/composer/Composer.tsx:2546 msgid "Processing GIF..." msgstr "" -#: src/view/com/composer/Composer.tsx:2530 +#: src/view/com/composer/Composer.tsx:2548 msgid "Processing video..." msgstr "" @@ -8821,22 +8836,22 @@ msgid "Public, sharable lists of users to mute or block in bulk." msgstr "" #. Accessibility label for button to publish a single post -#: src/view/com/composer/Composer.tsx:1726 +#: src/view/com/composer/Composer.tsx:1744 msgid "Publish post" msgstr "" #. Accessibility label for button to publish multiple posts in a thread -#: src/view/com/composer/Composer.tsx:1721 +#: src/view/com/composer/Composer.tsx:1739 msgid "Publish posts" msgstr "" #. Accessibility label for button to publish multiple replies in a thread -#: src/view/com/composer/Composer.tsx:1710 +#: src/view/com/composer/Composer.tsx:1728 msgid "Publish replies" msgstr "" #. Accessibility label for button to publish a single reply -#: src/view/com/composer/Composer.tsx:1715 +#: src/view/com/composer/Composer.tsx:1733 msgid "Publish reply" msgstr "" @@ -8898,7 +8913,7 @@ msgstr "" msgid "Quotes" msgstr "" -#: src/screens/PostThread/components/ThreadItemAnchor.tsx:467 +#: src/screens/PostThread/components/ThreadItemAnchor.tsx:469 msgid "Quotes of this post" msgstr "" @@ -9028,16 +9043,16 @@ msgid "Refresh the page to see it." msgstr "Refresh the page to see it." #. Reject a chat request, this opens a menu with options -#: src/screens/Messages/components/RequestButtons.tsx:131 +#: src/screens/Messages/components/RequestButtons.tsx:136 msgid "Reject" msgstr "" -#: src/screens/Messages/components/RequestButtons.tsx:120 +#: src/screens/Messages/components/RequestButtons.tsx:125 msgid "Reject chat request" msgstr "" #: src/screens/Messages/ChatList.tsx:349 -#: src/screens/Messages/Inbox.tsx:205 +#: src/screens/Messages/Inbox.tsx:218 msgid "Reload conversations" msgstr "" @@ -9290,7 +9305,7 @@ msgstr "" msgid "Replies to this post are disabled." msgstr "" -#: src/view/com/composer/Composer.tsx:1738 +#: src/view/com/composer/Composer.tsx:1756 msgctxt "action" msgid "Reply" msgstr "" @@ -9330,7 +9345,7 @@ msgstr "" #: src/components/dms/MessageContextMenu.tsx:176 #: src/features/liveNow/components/LiveStatusDialog.tsx:267 -#: src/screens/Messages/ConversationSettings/index.tsx:517 +#: src/screens/Messages/ConversationSettings/index.tsx:550 msgid "Report" msgstr "" @@ -9339,10 +9354,10 @@ msgstr "" msgid "Report account" msgstr "" -#: src/components/dms/ConvoMenu.tsx:304 -#: src/components/dms/ConvoMenu.tsx:308 -#: src/screens/Messages/components/RequestButtons.tsx:160 -#: src/screens/Messages/components/RequestButtons.tsx:163 +#: src/components/dms/ConvoMenu.tsx:295 +#: src/components/dms/ConvoMenu.tsx:299 +#: src/screens/Messages/components/RequestButtons.tsx:161 +#: src/screens/Messages/components/RequestButtons.tsx:164 msgid "Report conversation" msgstr "" @@ -9395,7 +9410,7 @@ msgstr "" msgid "Report this feed" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:516 +#: src/screens/Messages/ConversationSettings/index.tsx:549 msgid "Report this group chat" msgstr "Report this group chat" @@ -9465,7 +9480,7 @@ msgstr "" msgid "Reposts" msgstr "" -#: src/screens/PostThread/components/ThreadItemAnchor.tsx:446 +#: src/screens/PostThread/components/ThreadItemAnchor.tsx:448 msgid "Reposts of this post" msgstr "" @@ -9479,7 +9494,7 @@ msgstr "" msgid "Request access to group chat" msgstr "Request access to group chat" -#: src/screens/Messages/JoinRequests.tsx:178 +#: src/screens/Messages/JoinRequests.tsx:177 msgid "Request approved." msgstr "Request approved." @@ -9488,7 +9503,7 @@ msgstr "Request approved." msgid "Request code" msgstr "" -#: src/screens/Messages/JoinRequests.tsx:210 +#: src/screens/Messages/JoinRequests.tsx:209 msgid "Request ignored." msgstr "Request ignored." @@ -9508,7 +9523,7 @@ msgstr "Requests" #: src/Navigation.tsx:495 #: src/screens/Messages/JoinRequests.tsx:58 -#: src/screens/Messages/JoinRequests.tsx:420 +#: src/screens/Messages/JoinRequests.tsx:419 msgid "Requests to join" msgstr "Requests to join" @@ -9530,9 +9545,15 @@ msgid "Required in your region" msgstr "" #: src/components/intents/GroupChatJoinDialog.tsx:273 +#: src/screens/Messages/components/OutgoingRequestListItem.tsx:116 +#: src/screens/Messages/components/OutgoingRequestListItem.tsx:118 msgid "Rescind request" msgstr "Rescind request" +#: src/screens/Messages/components/OutgoingRequestListItem.tsx:53 +msgid "Rescind request to join group chat" +msgstr "Rescind request to join group chat" + #: src/components/dialogs/EmailDialog/components/ResendEmailText.tsx:39 msgid "Resend" msgstr "" @@ -9596,7 +9617,7 @@ msgstr "" #: src/components/ageAssurance/AgeAssuranceErrors.tsx:31 #: src/components/contacts/screens/VerifyNumber.tsx:350 #: src/components/contacts/screens/VerifyNumber.tsx:355 -#: src/components/Error.tsx:65 +#: src/components/Error.tsx:60 #: src/components/Lists.tsx:115 #: src/components/moderation/ReportDialog/index.tsx:297 #: src/components/Post/Embed/VideoEmbed/VideoEmbedInner/VideoFallback.tsx:56 @@ -9606,8 +9627,8 @@ msgstr "" #: src/screens/Login/LoginForm.tsx:335 #: src/screens/Messages/ChatList.tsx:354 #: src/screens/Messages/components/MessageListError.tsx:24 -#: src/screens/Messages/Inbox.tsx:210 -#: src/screens/Messages/JoinRequests.tsx:356 +#: src/screens/Messages/Inbox.tsx:223 +#: src/screens/Messages/JoinRequests.tsx:355 #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:268 #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:271 #: src/screens/Onboarding/StepSuggestedStarterpacks/index.tsx:92 @@ -9626,7 +9647,7 @@ msgstr "" msgid "Retry loading report options" msgstr "" -#: src/components/Error.tsx:73 +#: src/components/Error.tsx:68 #: src/screens/List/ListHiddenScreen.tsx:223 #: src/screens/StarterPack/StarterPackScreen.tsx:801 msgid "Return to previous page" @@ -9660,7 +9681,7 @@ msgstr "Sad GIFs" #: src/components/StarterPack/QrCodeDialog.tsx:207 #: src/features/liveNow/components/EditLiveDialog.tsx:204 #: src/features/liveNow/components/EditLiveDialog.tsx:211 -#: src/screens/Messages/ConversationSettings/prompts.tsx:71 +#: src/screens/Messages/ConversationSettings/prompts.tsx:74 #: src/screens/Profile/Header/EditProfileDialog.tsx:233 #: src/screens/Profile/Header/EditProfileDialog.tsx:247 #: src/screens/SavedFeeds.tsx:124 @@ -9685,22 +9706,22 @@ msgstr "" #: src/screens/SavedFeeds.tsx:124 #: src/screens/SavedFeeds.tsx:311 #: src/screens/SavedFeeds.tsx:315 -#: src/view/com/composer/Composer.tsx:1385 +#: src/view/com/composer/Composer.tsx:1403 #: src/view/com/composer/drafts/DraftsButton.tsx:125 msgid "Save changes" msgstr "" -#: src/view/com/composer/Composer.tsx:1357 +#: src/view/com/composer/Composer.tsx:1375 #: src/view/com/composer/drafts/DraftsButton.tsx:93 msgid "Save changes?" msgstr "" -#: src/view/com/composer/Composer.tsx:1385 +#: src/view/com/composer/Composer.tsx:1403 #: src/view/com/composer/drafts/DraftsButton.tsx:125 msgid "Save draft" msgstr "" -#: src/view/com/composer/Composer.tsx:1359 +#: src/view/com/composer/Composer.tsx:1377 #: src/view/com/composer/drafts/DraftsButton.tsx:95 msgid "Save draft?" msgstr "" @@ -10036,7 +10057,7 @@ msgstr "" msgid "Select GIF \"{0}\"" msgstr "" -#: src/components/dms/InitiateChatFlow.tsx:699 +#: src/components/dms/InitiateChatFlow.tsx:702 msgid "Select group chat members" msgstr "Select group chat members" @@ -10484,7 +10505,7 @@ msgstr "" msgid "Show when you’re live" msgstr "" -#: src/screens/PostThread/components/ThreadItemAnchor.tsx:602 +#: src/screens/PostThread/components/ThreadItemAnchor.tsx:604 msgid "Shows information about when this post was created" msgstr "" @@ -10611,7 +10632,7 @@ msgstr "" msgid "Skip contact sharing and continue to the app" msgstr "" -#: src/view/com/composer/Composer.tsx:1402 +#: src/view/com/composer/Composer.tsx:1420 msgid "Skip empty posts?" msgstr "Skip empty posts?" @@ -10625,7 +10646,7 @@ msgstr "" msgid "Skip to next step" msgstr "" -#: src/components/images/Gallery/index.tsx:435 +#: src/components/images/Gallery/index.tsx:443 msgid "slide" msgstr "slide" @@ -10716,7 +10737,7 @@ msgid "Something wasn't quite right with the data you're trying to report. Pleas msgstr "" #: src/screens/Messages/Conversation.tsx:137 -#: src/screens/Messages/ConversationSettings/index.tsx:112 +#: src/screens/Messages/ConversationSettings/index.tsx:118 #: src/screens/Messages/JoinRequests.tsx:87 msgid "Something went wrong" msgstr "" @@ -10807,12 +10828,12 @@ msgstr "" msgid "Start adding people!" msgstr "" -#: src/components/dms/InitiateChatFlow.tsx:700 +#: src/components/dms/InitiateChatFlow.tsx:703 msgid "Start chat" msgstr "Start chat" #: src/components/dialogs/SearchablePeopleList.tsx:428 -#: src/components/dms/InitiateChatFlow.tsx:848 +#: src/components/dms/InitiateChatFlow.tsx:851 msgid "Start chat with {displayName}" msgstr "" @@ -11297,7 +11318,7 @@ msgid "The laws in your region require you to verify you're an adult to access c msgstr "" #: src/components/intents/GroupChatJoinDialog.tsx:135 -#: src/screens/Messages/JoinRequests.tsx:201 +#: src/screens/Messages/JoinRequests.tsx:200 msgid "The member limit has been reached." msgstr "The member limit has been reached." @@ -11369,6 +11390,7 @@ msgstr "There was a problem loading GIFs. Check your connection and try again." #: src/components/contacts/screens/GetContacts.tsx:147 #: src/components/intents/GroupChatJoinDialog.tsx:119 #: src/components/intents/GroupChatJoinDialog.tsx:153 +#: src/screens/Messages/components/OutgoingRequestListItem.tsx:39 msgid "There was a problem with your internet connection, please try again" msgstr "" @@ -11390,7 +11412,7 @@ msgid "There was an issue fetching notifications. Tap here to try again." msgstr "" #: src/screens/Search/Explore.tsx:1027 -#: src/view/com/posts/PostFeed.tsx:775 +#: src/view/com/posts/PostFeed.tsx:777 msgid "There was an issue fetching posts. Tap here to try again." msgstr "" @@ -11530,7 +11552,7 @@ msgstr "This chat has ended" msgid "This chat is full" msgstr "This chat is full" -#: src/screens/Messages/components/ChatListItem.tsx:380 +#: src/screens/Messages/components/ChatListItem.tsx:372 #: src/screens/Messages/components/ChatLocked.tsx:61 msgid "This chat is locked" msgstr "This chat is locked" @@ -11709,7 +11731,7 @@ msgstr "This person is blocking you" #. placeholder {0}: niceDate(i18n, createdAt) #. placeholder {1}: niceDate(i18n, indexedAt) -#: src/screens/PostThread/components/ThreadItemAnchor.tsx:642 +#: src/screens/PostThread/components/ThreadItemAnchor.tsx:644 msgid "This post claims to have been created on <0>{0}, but was first seen by Bluesky on <1>{1}." msgstr "" @@ -11729,7 +11751,7 @@ msgstr "" msgid "This post will be hidden from feeds and threads. This cannot be undone." msgstr "" -#: src/view/com/composer/Composer.tsx:1015 +#: src/view/com/composer/Composer.tsx:1033 msgid "This post's author has disabled quote posts." msgstr "" @@ -11741,8 +11763,8 @@ msgstr "" msgid "This reply will be sorted into a hidden section at the bottom of your thread and will mute notifications for subsequent replies - both for yourself and others." msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:132 -#: src/screens/Messages/JoinRequests.tsx:111 +#: src/screens/Messages/ConversationSettings/index.tsx:137 +#: src/screens/Messages/JoinRequests.tsx:110 msgid "This screen is only available for group conversations." msgstr "This screen is only available for group conversations." @@ -12039,7 +12061,7 @@ msgstr "" msgid "Unable to delete" msgstr "" -#: src/screens/Messages/JoinRequests.tsx:346 +#: src/screens/Messages/JoinRequests.tsx:345 msgid "Unable to fetch join requests." msgstr "Unable to fetch join requests." @@ -12093,8 +12115,8 @@ msgstr "" msgid "Unblock {displayName}" msgstr "Unblock {displayName}" -#: src/components/dms/ConvoMenu.tsx:294 -#: src/components/dms/ConvoMenu.tsx:298 +#: src/components/dms/ConvoMenu.tsx:284 +#: src/components/dms/ConvoMenu.tsx:288 #: src/view/com/profile/ProfileMenu.tsx:468 #: src/view/com/profile/ProfileMenu.tsx:474 msgid "Unblock account" @@ -12164,14 +12186,6 @@ msgstr "" msgid "Unfortunately, your declared age indicates that you are not old enough to access Bluesky in your region." msgstr "" -#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:245 -msgid "Uninvite" -msgstr "Uninvite" - -#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:240 -msgid "Uninvite {displayName} from this group chat" -msgstr "Uninvite {displayName} from this group chat" - #: src/components/verification/VerificationsDialog.tsx:209 msgid "Unknown verifier" msgstr "" @@ -12198,7 +12212,7 @@ msgstr "" msgid "Unlock chat" msgstr "Unlock chat" -#: src/screens/Messages/ConversationSettings/index.tsx:501 +#: src/screens/Messages/ConversationSettings/index.tsx:534 msgid "Unlock this group chat" msgstr "Unlock this group chat" @@ -12226,7 +12240,7 @@ msgstr "Unmute {0}" msgid "Unmute account" msgstr "" -#: src/components/dms/ConvoMenu.tsx:282 +#: src/components/dms/ConvoMenu.tsx:272 msgid "Unmute conversation" msgstr "" @@ -12235,7 +12249,7 @@ msgstr "" msgid "Unmute list" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:463 +#: src/screens/Messages/ConversationSettings/index.tsx:496 msgid "Unmute this group chat" msgstr "Unmute this group chat" @@ -12314,7 +12328,7 @@ msgstr "" msgid "Unsupported clipboard content" msgstr "Unsupported clipboard content" -#: src/view/com/composer/Composer.tsx:1491 +#: src/view/com/composer/Composer.tsx:1509 msgid "Unsupported video type: {mimeType}" msgstr "" @@ -12357,7 +12371,7 @@ msgstr "Update your app" msgid "Update your app to see it." msgstr "Update your app to see it." -#: src/screens/Messages/Conversation.tsx:360 +#: src/screens/Messages/Conversation.tsx:359 msgid "Update your app to the latest version to join in!" msgstr "Update your app to the latest version to join in!" @@ -12409,7 +12423,7 @@ msgstr "" msgid "Upload from Library" msgstr "" -#: src/view/com/composer/Composer.tsx:2521 +#: src/view/com/composer/Composer.tsx:2539 msgid "Uploading GIF..." msgstr "" @@ -12423,7 +12437,7 @@ msgstr "" msgid "Uploading link thumbnail..." msgstr "" -#: src/view/com/composer/Composer.tsx:2523 +#: src/view/com/composer/Composer.tsx:2541 msgid "Uploading video..." msgstr "" @@ -12712,7 +12726,7 @@ msgstr "" msgid "Video settings" msgstr "" -#: src/view/com/composer/Composer.tsx:2541 +#: src/view/com/composer/Composer.tsx:2559 msgid "Video uploaded" msgstr "" @@ -12729,7 +12743,7 @@ msgstr "" msgid "Videos must be less than 3 minutes long." msgstr "" -#: src/view/com/composer/Composer.tsx:1108 +#: src/view/com/composer/Composer.tsx:1126 msgctxt "Action to view the post the user just created" msgid "View" msgstr "" @@ -12760,8 +12774,8 @@ msgstr "" msgid "View {0}’s profile" msgstr "View {0}’s profile" -#: src/components/dms/MessagesListHeader.tsx:123 -#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:185 +#: src/components/dms/MessagesListHeader.tsx:111 +#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:183 msgid "View {displayName}’s profile" msgstr "View {displayName}’s profile" @@ -12823,7 +12837,7 @@ msgstr "" msgid "View more trending videos" msgstr "" -#: src/view/com/composer/Composer.tsx:1103 +#: src/view/com/composer/Composer.tsx:1121 msgid "View post" msgstr "" @@ -12851,7 +12865,7 @@ msgstr "View publication" msgid "View the avatar" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:488 +#: src/screens/Messages/ConversationSettings/index.tsx:521 msgid "View the invite link for this group chat" msgstr "View the invite link for this group chat" @@ -12974,7 +12988,7 @@ msgstr "" msgid "We couldn’t load this conversation’s join requests" msgstr "We couldn’t load this conversation’s join requests" -#: src/screens/Messages/ConversationSettings/index.tsx:113 +#: src/screens/Messages/ConversationSettings/index.tsx:119 msgid "We couldn’t load this conversation’s settings" msgstr "We couldn’t load this conversation’s settings" @@ -13119,11 +13133,11 @@ msgstr "We’re sorry, but your search could not be completed. Please try again msgid "We're sorry, you cannot access this screen at this time." msgstr "" -#: src/view/com/composer/Composer.tsx:1013 +#: src/view/com/composer/Composer.tsx:1031 msgid "We're sorry! The post you are replying to has been deleted." msgstr "" -#: src/components/Lists.tsx:224 +#: src/components/Lists.tsx:223 #: src/view/screens/NotFound.tsx:44 msgid "We're sorry! We can't find the page you were looking for." msgstr "" @@ -13170,7 +13184,7 @@ msgid "What do you want to call your starter pack?" msgstr "" #: src/view/com/auth/SplashScreen.web.tsx:98 -#: src/view/com/composer/Composer.tsx:1455 +#: src/view/com/composer/Composer.tsx:1473 #: src/view/com/feeds/ComposerPrompt.tsx:193 msgid "What's up?" msgstr "" @@ -13198,7 +13212,7 @@ msgstr "" #: src/screens/Home/NoFeedsPinned.tsx:80 #: src/screens/Messages/ChatList.tsx:334 -#: src/screens/Messages/Inbox.tsx:190 +#: src/screens/Messages/Inbox.tsx:203 msgid "Whoops!" msgstr "" @@ -13256,7 +13270,7 @@ msgstr "Would you like to block this user and/or leave this conversation?" msgid "Would you like to save this as a draft before viewing your drafts?" msgstr "" -#: src/view/com/composer/Composer.tsx:1373 +#: src/view/com/composer/Composer.tsx:1391 msgid "Would you like to save this as a draft to edit later?" msgstr "" @@ -13265,12 +13279,12 @@ msgstr "" msgid "Write a post" msgstr "" -#: src/view/com/composer/Composer.tsx:1551 +#: src/view/com/composer/Composer.tsx:1569 msgid "Write post" msgstr "" #: src/screens/PostThread/components/ThreadComposePrompt.tsx:91 -#: src/view/com/composer/Composer.tsx:1453 +#: src/view/com/composer/Composer.tsx:1471 msgid "Write your reply" msgstr "" @@ -13283,8 +13297,8 @@ msgstr "" msgid "Wrong DID returned from server. Received: {0}" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:131 -#: src/screens/Messages/JoinRequests.tsx:110 +#: src/screens/Messages/ConversationSettings/index.tsx:136 +#: src/screens/Messages/JoinRequests.tsx:109 msgid "Wrong kind of conversation" msgstr "Wrong kind of conversation" @@ -13438,11 +13452,11 @@ msgid "You can now sign in with your new password." msgstr "" #. Toast shown when the user tries to add more images but the post gallery is already at the cap -#: src/view/com/composer/Composer.tsx:212 +#: src/view/com/composer/Composer.tsx:213 msgid "You can only add up to {MAX_GALLERY_IMAGES, plural, other {# images}} per post" msgstr "You can only add up to {MAX_GALLERY_IMAGES, plural, other {# images}} per post" -#: src/view/com/composer/Composer.tsx:1378 +#: src/view/com/composer/Composer.tsx:1396 msgid "You can only save drafts up to 1000 characters." msgstr "" @@ -13581,7 +13595,7 @@ msgstr "" msgid "You have temporarily reached the limit for video uploads. Please try again later." msgstr "" -#: src/view/com/composer/Composer.tsx:1368 +#: src/view/com/composer/Composer.tsx:1386 msgid "You have unsaved changes to this draft, would you like to save them?" msgstr "" @@ -13683,6 +13697,11 @@ msgstr "You reacted {0} to {target}" msgid "You recently changed your birthdate" msgstr "" +#. Displayed when the user has requested to join a group chat. +#: src/screens/Messages/components/OutgoingRequestListItem.tsx:106 +msgid "You requested to join" +msgstr "You requested to join" + #: src/screens/Settings/Settings.tsx:297 #: src/view/shell/desktop/LeftNav.tsx:225 msgid "You will be signed out of all your accounts." @@ -13705,7 +13724,7 @@ msgstr "" msgid "You will receive an email with a \"reset code.\" Enter that code here, then enter your new password." msgstr "" -#: src/screens/Messages/ConversationSettings/prompts.tsx:118 +#: src/screens/Messages/ConversationSettings/prompts.tsx:121 msgid "You won’t be able to rejoin unless you’re invited." msgstr "You won’t be able to rejoin unless you’re invited." @@ -13778,7 +13797,7 @@ msgstr "" msgid "You've reached the end of your feed! Find some more accounts to follow." msgstr "" -#: src/view/com/composer/Composer.tsx:637 +#: src/view/com/composer/Composer.tsx:638 msgid "You've reached the maximum number of drafts" msgstr "" @@ -13818,11 +13837,11 @@ msgstr "" msgid "Your account is not yet old enough to upload videos. Please try again later." msgstr "" -#: src/components/dms/InitiateChatFlow.tsx:705 +#: src/components/dms/InitiateChatFlow.tsx:708 msgid "Your account is too new" msgstr "Your account is too new" -#: src/components/dms/InitiateChatFlow.tsx:706 +#: src/components/dms/InitiateChatFlow.tsx:709 msgid "Your account must be at least 7 days old to create a new group chat." msgstr "Your account must be at least 7 days old to create a new group chat." @@ -13946,11 +13965,11 @@ msgstr "" msgid "Your password must be at least 8 characters long." msgstr "" -#: src/view/com/composer/Composer.tsx:1099 +#: src/view/com/composer/Composer.tsx:1117 msgid "Your post was sent" msgstr "" -#: src/view/com/composer/Composer.tsx:1096 +#: src/view/com/composer/Composer.tsx:1114 msgid "Your posts were sent" msgstr "" @@ -13971,7 +13990,7 @@ msgstr "" msgid "Your profile, posts, feeds, and lists will no longer be visible to other Bluesky users. You can reactivate your account at any time by logging in." msgstr "" -#: src/view/com/composer/Composer.tsx:1098 +#: src/view/com/composer/Composer.tsx:1116 msgid "Your reply was sent" msgstr "" @@ -13984,7 +14003,7 @@ msgstr "" msgid "Your selected interests help us serve you content you care about." msgstr "" -#: src/view/com/composer/Composer.tsx:1403 +#: src/view/com/composer/Composer.tsx:1421 msgid "Your thread has empty posts that will be skipped. The remaining posts will be published as a thread." msgstr "Your thread has empty posts that will be skipped. The remaining posts will be published as a thread." From 8015c26955d7682e1a3dda06929e621b0a94dce9 Mon Sep 17 00:00:00 2001 From: DS Boyce <260543580+ds-boyce@users.noreply.github.com> Date: Mon, 8 Jun 2026 22:13:15 -0700 Subject: [PATCH 115/149] Hide last message in chat list if it's blocked (#10800) --- src/components/dms/getMessageInfo.ts | 4 ++++ src/lib/moderation/blocked-and-muted.ts | 2 +- src/screens/Messages/components/ChatListItem.tsx | 4 +++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/components/dms/getMessageInfo.ts b/src/components/dms/getMessageInfo.ts index 6860c51f92..4eade5cb62 100644 --- a/src/components/dms/getMessageInfo.ts +++ b/src/components/dms/getMessageInfo.ts @@ -2,6 +2,7 @@ import {AppBskyEmbedRecord, ChatBskyConvoDefs} from '@atproto/api' import {type I18n} from '@lingui/core' import {msg} from '@lingui/core/macro' +import {isBlockedOrBlocking} from '#/lib/moderation/blocked-and-muted' import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name' import { postUriToRelativePath, @@ -13,6 +14,7 @@ export type UserMessageInfo = { message: string | null sentAt: string reportableMessage?: ChatBskyConvoDefs.MessageView + isBlockedMessage: boolean } export function getMessageInfo({ @@ -36,6 +38,7 @@ export function getMessageInfo({ const isGroup = ChatBskyConvoDefs.isGroupConvo(convo.kind) const reportableMessage = isFromMe ? undefined : lastMessage + const isBlockedMessage = sender ? isBlockedOrBlocking(sender) : false const prefix = (message: string) => { if (isFromMe) { @@ -89,5 +92,6 @@ export function getMessageInfo({ message, sentAt: lastMessage.sentAt, reportableMessage, + isBlockedMessage, } } diff --git a/src/lib/moderation/blocked-and-muted.ts b/src/lib/moderation/blocked-and-muted.ts index 9806ca83ad..c8cc8611ce 100644 --- a/src/lib/moderation/blocked-and-muted.ts +++ b/src/lib/moderation/blocked-and-muted.ts @@ -1,7 +1,7 @@ import type * as bsky from '#/types/bsky' export function isBlockedOrBlocking(profile: bsky.profile.AnyProfileView) { - return profile.viewer?.blockedBy || profile.viewer?.blocking + return Boolean(profile.viewer?.blockedBy || profile.viewer?.blocking) } export function isMuted(profile: bsky.profile.AnyProfileView) { diff --git a/src/screens/Messages/components/ChatListItem.tsx b/src/screens/Messages/components/ChatListItem.tsx index 1c83a6876b..d60b5f56c2 100644 --- a/src/screens/Messages/components/ChatListItem.tsx +++ b/src/screens/Messages/components/ChatListItem.tsx @@ -331,7 +331,9 @@ function BaseChatItem({ i18n, }) if (info) { - lastMessage = info.message ?? lastMessage + lastMessage = info.isBlockedMessage + ? l`This message is hidden` + : (info.message ?? lastMessage) lastMessageSentAt = info.sentAt } } From 2cb225dddde6fc0e493c8ef5a229aebc5f1fc457 Mon Sep 17 00:00:00 2001 From: surfdude29 <149612116+surfdude29@users.noreply.github.com> Date: Tue, 9 Jun 2026 14:03:52 +0100 Subject: [PATCH 116/149] Mark string for translation and add context (#10805) --- src/components/images/Gallery/index.tsx | 6 +++++- src/screens/Messages/JoinRequest.tsx | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/components/images/Gallery/index.tsx b/src/components/images/Gallery/index.tsx index 1b4e1d6239..5b0d97bc17 100644 --- a/src/components/images/Gallery/index.tsx +++ b/src/components/images/Gallery/index.tsx @@ -523,7 +523,11 @@ function GalleryImage({ a.font_bold, largeAltBadge ? a.text_xs : {fontSize: 8}, ]}> - {index + 1}/{imageCount} + + {index + 1}/{imageCount} + ) : null} diff --git a/src/screens/Messages/JoinRequest.tsx b/src/screens/Messages/JoinRequest.tsx index c6da1f91ec..1e23c3405b 100644 --- a/src/screens/Messages/JoinRequest.tsx +++ b/src/screens/Messages/JoinRequest.tsx @@ -127,7 +127,9 @@ export function JoinRequest({setScreenState}: Props) { a.leading_snug, t.atoms.text_contrast_medium, ]}> - + {data.joinLinkPreviews[0].memberCount}/ {data.joinLinkPreviews[0].memberLimit} From 84c4223ff937314b08514c9ea11d95825d1d2887 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Tue, 9 Jun 2026 16:31:22 +0300 Subject: [PATCH 117/149] [Chat] Gate group chats for under-18 users (#10548) Co-authored-by: Eric Bailey --- eslint-suppressions.json | 11 ---- src/ageAssurance/const.ts | 28 ++++++++ src/ageAssurance/index.tsx | 27 ++++++-- src/ageAssurance/types.ts | 2 + src/ageAssurance/util.ts | 49 +++----------- src/components/dms/InitiateChatFlow.tsx | 9 ++- src/screens/Messages/ChatList.tsx | 4 ++ src/screens/Messages/Settings.tsx | 24 +++++-- src/screens/Signup/StepInfo/index.tsx | 2 +- src/state/birthdate.ts | 9 ++- src/state/preferences/moderation-opts.tsx | 2 +- .../queries/messages/list-conversations.tsx | 3 + .../queries/messages/restrictChatSettings.ts | 64 ++++++++++++++++--- src/state/queries/preferences/const.ts | 15 ++++- src/state/queries/preferences/moderation.ts | 14 +--- src/state/session/agent.ts | 13 ++-- 16 files changed, 180 insertions(+), 96 deletions(-) create mode 100644 src/ageAssurance/const.ts diff --git a/eslint-suppressions.json b/eslint-suppressions.json index 304fd4a065..1eea217133 100644 --- a/eslint-suppressions.json +++ b/eslint-suppressions.json @@ -19,11 +19,6 @@ "count": 1 } }, - "src/ageAssurance/util.ts": { - "@typescript-eslint/no-floating-promises": { - "count": 1 - } - }, "src/alf/util/flatten.ts": { "@typescript-eslint/no-explicit-any": { "count": 1 @@ -1903,12 +1898,6 @@ "src/state/session/agent.ts": { "@typescript-eslint/no-explicit-any": { "count": 1 - }, - "@typescript-eslint/no-floating-promises": { - "count": 1 - }, - "@typescript-eslint/require-await": { - "count": 1 } }, "src/state/shell/color-mode.tsx": { diff --git a/src/ageAssurance/const.ts b/src/ageAssurance/const.ts new file mode 100644 index 0000000000..bd79353b51 --- /dev/null +++ b/src/ageAssurance/const.ts @@ -0,0 +1,28 @@ +import { + ageAssuranceRuleIDs as ids, + type AppBskyAgeassuranceDefs, +} from '@atproto/api' + +import {AgeAssuranceAccess} from '#/ageAssurance/types' + +/** + * Minimum age required to access the app at all. + */ +export const MIN_ACCESS_AGE = 13 + +export const FALLBACK_REGION_CONFIG: AppBskyAgeassuranceDefs.ConfigRegion = { + countryCode: '*', + regionCode: undefined, + minAccessAge: MIN_ACCESS_AGE, + rules: [ + { + $type: ids.IfDeclaredOverAge, + age: MIN_ACCESS_AGE, + access: AgeAssuranceAccess.Full, + }, + { + $type: ids.Default, + access: AgeAssuranceAccess.None, + }, + ], +} diff --git a/src/ageAssurance/index.tsx b/src/ageAssurance/index.tsx index 2b10c93a5d..20bcc2bdb8 100644 --- a/src/ageAssurance/index.tsx +++ b/src/ageAssurance/index.tsx @@ -1,6 +1,7 @@ import {createContext, useCallback, useContext, useMemo} from 'react' import {useGetAndRegisterPushToken} from '#/lib/notifications/notifications' +import {restrictChatSettings} from '#/state/queries/messages/restrictChatSettings' import {useAgent} from '#/state/session' import {Provider as RedirectOverlayProvider} from '#/ageAssurance/components/RedirectOverlay' import { @@ -20,7 +21,6 @@ import { } from '#/ageAssurance/types' import { computeAgeAssuranceFlags, - maybeRestrictChatSettings, useAgeAssuranceRegionConfigWithFallback, } from '#/ageAssurance/util' @@ -32,7 +32,6 @@ export { usePatchServerState as usePatchAgeAssuranceServerState, } from '#/ageAssurance/data' export {logger} from '#/ageAssurance/logger' -export {MIN_ACCESS_AGE} from '#/ageAssurance/util' const AgeAssuranceStateContext = createContext<{ Access: typeof AgeAssuranceAccess @@ -48,8 +47,10 @@ const AgeAssuranceStateContext = createContext<{ access: AgeAssuranceAccess.Full, }, flags: { + isAgeRestricted: false, adultContentDisabled: false, chatDisabled: false, + groupChatDisabled: false, isDeclaredUnderAdultAge: false, isOverRegionMinAccessAge: false, isOverAppMinAccessAge: false, @@ -84,13 +85,25 @@ function InnerProvider({children}: {children: React.ReactNode}) { const handleAccessUpdate = useCallback( (s: AgeAssuranceState) => { - const isAgeRestricted = s.access !== AgeAssuranceAccess.Full - if (isAgeRestricted) { - void getAndRegisterPushToken({isAgeRestricted}) - maybeRestrictChatSettings({agent}) + const flags = computeAgeAssuranceFlags({ + state: s, + regionConfig, + metadata, + }) + if (flags.isAgeRestricted) { + void getAndRegisterPushToken({ + isAgeRestricted: true, + }) + } + if (flags.chatDisabled || flags.groupChatDisabled) { + void restrictChatSettings({ + agent, + restrictIncoming: flags.chatDisabled, + restrictGroupInvites: flags.groupChatDisabled, + }) } }, - [agent, getAndRegisterPushToken], + [agent, getAndRegisterPushToken, regionConfig, metadata], ) useOnAgeAssuranceAccessUpdate(handleAccessUpdate) diff --git a/src/ageAssurance/types.ts b/src/ageAssurance/types.ts index 12473bc2e6..21abff89f0 100644 --- a/src/ageAssurance/types.ts +++ b/src/ageAssurance/types.ts @@ -30,8 +30,10 @@ export type AgeAssuranceState = { } export type AgeAssuranceFlags = { + isAgeRestricted: boolean adultContentDisabled: boolean chatDisabled: boolean + groupChatDisabled: boolean isDeclaredUnderAdultAge: boolean isOverRegionMinAccessAge: boolean isOverAppMinAccessAge: boolean diff --git a/src/ageAssurance/util.ts b/src/ageAssurance/util.ts index b0e601d6c7..0d493f1130 100644 --- a/src/ageAssurance/util.ts +++ b/src/ageAssurance/util.ts @@ -1,20 +1,14 @@ import {useMemo} from 'react' import { - ageAssuranceRuleIDs as ids, type AppBskyAgeassuranceDefs, - type AtpAgent, getAgeAssuranceRegionConfig, type ModerationPrefs, } from '@atproto/api' import {getAge} from '#/lib/strings/time' -import {restrictChatSettings} from '#/state/queries/messages/restrictChatSettings' -import {DEFAULT_LOGGED_OUT_LABEL_PREFERENCES} from '#/state/queries/preferences/moderation' -import { - getDidFromAgentSession, - getOtherRequiredDataFromCache, - useAgeAssuranceServerDataContext, -} from '#/ageAssurance/data' +import {DEFAULT_LOGGED_OUT_LABEL_PREFERENCES} from '#/state/queries/preferences/const' +import {FALLBACK_REGION_CONFIG, MIN_ACCESS_AGE} from '#/ageAssurance/const' +import {useAgeAssuranceServerDataContext} from '#/ageAssurance/data' import { AgeAssuranceAccess, type AgeAssuranceFlags, @@ -23,24 +17,6 @@ import { } from '#/ageAssurance/types' import {type Geolocation, useGeolocation} from '#/geolocation' -export const MIN_ACCESS_AGE = 13 -const FALLBACK_REGION_CONFIG: AppBskyAgeassuranceDefs.ConfigRegion = { - countryCode: '*', - regionCode: undefined, - minAccessAge: MIN_ACCESS_AGE, - rules: [ - { - $type: ids.IfDeclaredOverAge, - age: MIN_ACCESS_AGE, - access: AgeAssuranceAccess.Full, - }, - { - $type: ids.Default, - access: AgeAssuranceAccess.None, - }, - ], -} - /** * Get age assurance region config based on geolocation, with fallback to * app defaults if no region config is found. @@ -121,19 +97,6 @@ export const makeAgeRestrictedModerationPrefs = ( labels: DEFAULT_LOGGED_OUT_LABEL_PREFERENCES, }) -/** - * Checks our cache of the actor's chat declaration record, and if it's not - * already restricted, restricts it. - */ -export function maybeRestrictChatSettings({agent}: {agent: AtpAgent}) { - const did = getDidFromAgentSession(agent) - if (!did) return - const data = getOtherRequiredDataFromCache({did}) - // ...update the chat setting record if allowIncoming is not already 'none'. - if (data?.actorDeclaration?.allowIncoming === 'none') return - restrictChatSettings({agent, did}) -} - export function computeAgeAssuranceFlags({ state, regionConfig, @@ -143,10 +106,12 @@ export function computeAgeAssuranceFlags({ regionConfig: AppBskyAgeassuranceDefs.ConfigRegion metadata?: AgeAssuranceMetadata }): AgeAssuranceFlags { - const chatDisabled = state.access !== AgeAssuranceAccess.Full + const isAgeRestricted = state.access !== AgeAssuranceAccess.Full + const chatDisabled = isAgeRestricted const isDeclaredUnderAdultAge = metadata?.declaredAge ? metadata.declaredAge < 18 : true + const groupChatDisabled = chatDisabled || isDeclaredUnderAdultAge const isOverRegionMinAccessAge = metadata?.declaredAge ? metadata.declaredAge >= regionConfig.minAccessAge : false @@ -157,8 +122,10 @@ export function computeAgeAssuranceFlags({ state.access !== AgeAssuranceAccess.Full || isDeclaredUnderAdultAge return { + isAgeRestricted, adultContentDisabled, chatDisabled, + groupChatDisabled, isDeclaredUnderAdultAge, isOverRegionMinAccessAge, isOverAppMinAccessAge, diff --git a/src/components/dms/InitiateChatFlow.tsx b/src/components/dms/InitiateChatFlow.tsx index 161b0cf722..ed519fed23 100644 --- a/src/components/dms/InitiateChatFlow.tsx +++ b/src/components/dms/InitiateChatFlow.tsx @@ -36,6 +36,7 @@ import {TimesLarge_Stroke2_Corner0_Rounded as XIcon} from '#/components/icons/Ti import * as ProfileCard from '#/components/ProfileCard' import * as Prompt from '#/components/Prompt' import {Text} from '#/components/Typography' +import {useAgeAssurance} from '#/ageAssurance' import {IS_NATIVE, IS_WEB} from '#/env' import type * as bsky from '#/types/bsky' import {ChatProfileTabs} from './ChatProfileTabs' @@ -209,6 +210,7 @@ export function InitiateChatFlow({ const [footerHeight, setFooterHeight] = useState(0) const listRef = useRef(null) const {currentAccount} = useSession() + const aa = useAgeAssurance() const inputRef = useRef(null) const accountTooNewPromptControl = Dialog.useDialogControl() @@ -330,7 +332,11 @@ export function InitiateChatFlow({ }) } - if (chatState === ChatState.NEW_CHAT && searchText === '') { + if ( + chatState === ChatState.NEW_CHAT && + searchText === '' && + !aa.flags.groupChatDisabled + ) { _items.unshift({type: 'newGroupChat', key: 'newGroupChat'}) } @@ -344,6 +350,7 @@ export function InitiateChatFlow({ results, currentAccount?.did, follows, + aa.flags.groupChatDisabled, ]) if (searchText && !isFetching && !items.length && !isError) { diff --git a/src/screens/Messages/ChatList.tsx b/src/screens/Messages/ChatList.tsx index 387fcd2bd1..ab622f708a 100644 --- a/src/screens/Messages/ChatList.tsx +++ b/src/screens/Messages/ChatList.tsx @@ -198,6 +198,7 @@ export function ChatList({ }) { const t = useTheme() const {t: l} = useLingui() + const aa = useAgeAssurance() const scrollElRef: ListRef = useAnimatedRef() const {isWithinSplitView} = useIsWithinSplitView() @@ -230,6 +231,7 @@ export function ChatList({ const {refetch: refetchInbox} = useListConvosQuery({ status: 'request', + kind: aa.flags.groupChatDisabled ? 'direct' : 'all', }) useRefreshOnFocus(refetch) @@ -449,6 +451,7 @@ export function Header({ }) { const {t: l} = useLingui() const {gtMobile} = useBreakpoints() + const aa = useAgeAssurance() const requireEmailVerification = useRequireEmailVerification() const leftConvos = useLeftConvos() const {isWithinSplitView} = useIsWithinSplitView() @@ -462,6 +465,7 @@ export function Header({ useListConvosQuery({ status: 'request', readState: 'unread', + kind: aa.flags.groupChatDisabled ? 'direct' : 'all', }) const inboxAllConvos = diff --git a/src/screens/Messages/Settings.tsx b/src/screens/Messages/Settings.tsx index 91d9f879d5..195a87af62 100644 --- a/src/screens/Messages/Settings.tsx +++ b/src/screens/Messages/Settings.tsx @@ -21,6 +21,7 @@ import {ChevronRight_Stroke2_Corner0_Rounded as ChevronRightIcon} from '#/compon import * as Layout from '#/components/Layout' import * as Toast from '#/components/Toast' import {Text} from '#/components/Typography' +import {useAgeAssurance} from '#/ageAssurance' import {useAnalytics} from '#/analytics' import {IS_NATIVE} from '#/env' import {useBackgroundNotificationPreferences} from '../../../modules/expo-background-notification-handler/src/BackgroundNotificationHandlerProvider' @@ -46,6 +47,7 @@ export function MessagesSettingsScreenInner({}: Props) { const t = useTheme() const {t: l} = useLingui() const ax = useAnalytics() + const aa = useAgeAssurance() const {currentAccount} = useSession() const {data: profile} = useProfileQuery({ did: currentAccount!.did, @@ -55,6 +57,7 @@ export function MessagesSettingsScreenInner({}: Props) { const exportCarControl = Dialog.useDialogControl() const isGroupChatEnabled = ax.features.enabled(ax.features.GroupChatsEnable) + const groupInvitesLocked = aa.flags.groupChatDisabled const allowMessagesFromOptions: {name: AllowIncoming; label: string}[] = [ { @@ -192,15 +195,26 @@ export function MessagesSettingsScreenInner({}: Props) { a.leading_snug, t.atoms.text_contrast_high, ]}> - - You can continue ongoing conversations regardless of which - setting you choose. - + {groupInvitesLocked ? ( + + Group chats are only available to users 18 and over. + + ) : ( + + You can continue ongoing conversations regardless of which + setting you choose. + + )} {allowGroupInvitesFromOptions.map(option => ( diff --git a/src/screens/Signup/StepInfo/index.tsx b/src/screens/Signup/StepInfo/index.tsx index 65b2791c29..5d1ecae014 100644 --- a/src/screens/Signup/StepInfo/index.tsx +++ b/src/screens/Signup/StepInfo/index.tsx @@ -24,9 +24,9 @@ import {createStaticClick, SimpleInlineLinkText} from '#/components/Link' import {Loader} from '#/components/Loader' import {usePreemptivelyCompleteActivePolicyUpdate} from '#/components/PolicyUpdateOverlay/usePreemptivelyCompleteActivePolicyUpdate' import * as Toast from '#/components/Toast' +import {MIN_ACCESS_AGE} from '#/ageAssurance/const' import { isUnderAge, - MIN_ACCESS_AGE, useAgeAssuranceRegionConfigWithFallback, } from '#/ageAssurance/util' import {useAnalytics} from '#/analytics' diff --git a/src/state/birthdate.ts b/src/state/birthdate.ts index 71ca871df3..183e51aa45 100644 --- a/src/state/birthdate.ts +++ b/src/state/birthdate.ts @@ -1,10 +1,11 @@ import {useMemo} from 'react' import {useMutation, useQueryClient} from '@tanstack/react-query' +import {restrictChatSettings} from '#/state/queries/messages/restrictChatSettings' import {preferencesQueryKey} from '#/state/queries/preferences' import {useAgent, useSession} from '#/state/session' import {usePatchAgeAssuranceOtherRequiredData} from '#/ageAssurance' -import {isUnderAge, maybeRestrictChatSettings} from '#/ageAssurance/util' +import {isUnderAge} from '#/ageAssurance/util' import {IS_DEV} from '#/env' import {account} from '#/storage' @@ -66,7 +67,11 @@ export function useBirthdateMutation() { }) if (isUnderAge(birthDate.toISOString(), 18)) { - maybeRestrictChatSettings({agent}) + await restrictChatSettings({ + agent, + restrictIncoming: true, + restrictGroupInvites: true, + }) } /** diff --git a/src/state/preferences/moderation-opts.tsx b/src/state/preferences/moderation-opts.tsx index b8592d77e0..119c9008db 100644 --- a/src/state/preferences/moderation-opts.tsx +++ b/src/state/preferences/moderation-opts.tsx @@ -2,7 +2,7 @@ import {createContext, useContext, useMemo} from 'react' import {AtpAgent, type ModerationOpts} from '@atproto/api' import {useHiddenPosts, useLabelDefinitions} from '#/state/preferences' -import {DEFAULT_LOGGED_OUT_LABEL_PREFERENCES} from '#/state/queries/preferences/moderation' +import {DEFAULT_LOGGED_OUT_LABEL_PREFERENCES} from '#/state/queries/preferences/const' import {useSession} from '#/state/session' import {usePreferencesQuery} from '../queries/preferences' diff --git a/src/state/queries/messages/list-conversations.tsx b/src/state/queries/messages/list-conversations.tsx index 62f5772bef..0bc2f69997 100644 --- a/src/state/queries/messages/list-conversations.tsx +++ b/src/state/queries/messages/list-conversations.tsx @@ -20,6 +20,7 @@ import {useMessagesEventBus} from '#/state/messages/events' import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useAgent, useSession} from '#/state/session' import {parseConvoView} from '#/components/dms/util' +import {useAgeAssurance} from '#/ageAssurance' import * as bsky from '#/types/bsky' import {RQKEY as CONVO_KEY} from './conversation' import {useLeftConvos} from './leave-conversation' @@ -122,10 +123,12 @@ export function ListConvosProviderInner({ }: { children: React.ReactNode }) { + const aa = useAgeAssurance() const {refetch, data} = useListConvosQuery({ readState: 'unread', limit: UNREAD_LIMIT, lockStatus: 'unlocked', + kind: aa.flags.groupChatDisabled ? 'direct' : 'all', }) const messagesBus = useMessagesEventBus() const queryClient = useQueryClient() diff --git a/src/state/queries/messages/restrictChatSettings.ts b/src/state/queries/messages/restrictChatSettings.ts index 3a1e64eff1..ad33385dc8 100644 --- a/src/state/queries/messages/restrictChatSettings.ts +++ b/src/state/queries/messages/restrictChatSettings.ts @@ -3,23 +3,71 @@ import {type ChatBskyActorDeclaration} from '@atproto/api' import {networkRetry} from '#/lib/async/retry' import {logger} from '#/logger' -import {setOtherRequiredDataActorDeclarationCache} from '#/ageAssurance/data' +import { + getDidFromAgentSession, + getOtherRequiredDataFromCache, + setOtherRequiredDataActorDeclarationCache, +} from '#/ageAssurance/data' /** - * Helper to update the chat settings record. + * Updates the chat actor declaration record to restrict who can contact the + * user. Both restrictions write to the same record (`rkey: 'self'`), so this + * is a single helper to avoid two concurrent `putRecord` calls racing each + * other and clobbering one another's changes. + * + * - `restrictIncoming`: sets `allowIncoming: 'none'` (used when a user isn't + * age-assured). + * - `restrictGroupInvites`: sets `allowGroupInvites: 'none'` (used for under-18 + * users, who per spec cannot participate in group chats). + * + * Dimensions that aren't being restricted preserve their cached value, falling + * back to the lexicon defaults when the cache is empty. */ export async function restrictChatSettings({ agent, - did, + restrictIncoming = false, + restrictGroupInvites = false, }: { agent: AtpAgent - did: string + restrictIncoming?: boolean + restrictGroupInvites?: boolean }): Promise { + const did = getDidFromAgentSession(agent) + if (!did) return + + const cached = getOtherRequiredDataFromCache({did})?.actorDeclaration + + // When the cache is empty we fall back to defaults for any dimension we're + // not explicitly restricting, which could drop/downgrade a value the user + // has actually set server-side. The cache should be hydrated by + // prefetchOtherRequiredData before any of these paths fire, so log if that + // assumption ever breaks. (Restricting both dimensions is unaffected, so + // don't warn for the common signup/birthdate-change case.) + if (!cached && (!restrictIncoming || !restrictGroupInvites)) { + logger.warn( + `restrictChatSettings: cache miss, falling back to defaults for unrestricted dimensions`, + ) + } + + const record: ChatBskyActorDeclaration.Main = { + $type: 'chat.bsky.actor.declaration', + allowIncoming: restrictIncoming + ? 'none' + : (cached?.allowIncoming ?? 'following'), + allowGroupInvites: restrictGroupInvites + ? 'none' + : cached?.allowGroupInvites, + } + + // Nothing to do if the record already reflects the desired restrictions. + if ( + cached?.allowIncoming === record.allowIncoming && + cached?.allowGroupInvites === record.allowGroupInvites + ) { + return + } + try { - const record: ChatBskyActorDeclaration.Main = { - $type: 'chat.bsky.actor.declaration', - allowIncoming: 'none', - } await networkRetry(3, () => agent.com.atproto.repo.putRecord({ repo: did, diff --git a/src/state/queries/preferences/const.ts b/src/state/queries/preferences/const.ts index 7508fa4f6d..02f7d62a87 100644 --- a/src/state/queries/preferences/const.ts +++ b/src/state/queries/preferences/const.ts @@ -1,9 +1,22 @@ -import {DEFAULT_LOGGED_OUT_LABEL_PREFERENCES} from '#/state/queries/preferences/moderation' +import {DEFAULT_LABEL_SETTINGS} from '@atproto/api' + import { type ThreadViewPreferences, type UsePreferencesQueryResponse, } from '#/state/queries/preferences/types' +/** + * More strict than our default settings for logged in users. + * + * Defined here rather than in `./moderation` to avoid a module-init cycle: + * `moderation` imports `./index`, which re-exports this file, so reading the + * value from `moderation` at init time lands in its temporal dead zone. + */ +export const DEFAULT_LOGGED_OUT_LABEL_PREFERENCES: typeof DEFAULT_LABEL_SETTINGS = + Object.fromEntries( + Object.entries(DEFAULT_LABEL_SETTINGS).map(([key, _pref]) => [key, 'hide']), + ) + export const DEFAULT_HOME_FEED_PREFS: UsePreferencesQueryResponse['feedViewPrefs'] = { hideReplies: false, diff --git a/src/state/queries/preferences/moderation.ts b/src/state/queries/preferences/moderation.ts index 1c0f5a3fe5..c23e995e41 100644 --- a/src/state/queries/preferences/moderation.ts +++ b/src/state/queries/preferences/moderation.ts @@ -1,22 +1,10 @@ import {useMemo} from 'react' -import { - BskyAgent, - DEFAULT_LABEL_SETTINGS, - interpretLabelValueDefinitions, -} from '@atproto/api' +import {BskyAgent, interpretLabelValueDefinitions} from '@atproto/api' import {isNonConfigurableModerationAuthority} from '#/state/session/additional-moderation-authorities' import {useLabelersDetailedInfoQuery} from '../labeler' import {usePreferencesQuery} from './index' -/** - * More strict than our default settings for logged in users. - */ -export const DEFAULT_LOGGED_OUT_LABEL_PREFERENCES: typeof DEFAULT_LABEL_SETTINGS = - Object.fromEntries( - Object.entries(DEFAULT_LABEL_SETTINGS).map(([key, _pref]) => [key, 'hide']), - ) - export function useMyLabelersQuery({ excludeNonConfigurableLabelers = false, }: { diff --git a/src/state/session/agent.ts b/src/state/session/agent.ts index 0abc0ca6cf..fe669dfe8b 100644 --- a/src/state/session/agent.ts +++ b/src/state/session/agent.ts @@ -29,7 +29,6 @@ import { setCreatedAtForDid, } from '#/ageAssurance/data' import {unsafeGetAndComputeAgeAssurance} from '#/ageAssurance/state' -import {AgeAssuranceAccess} from '#/ageAssurance/types' import {features} from '#/analytics' import {emitNetworkConfirmed, emitNetworkLost} from '../events' import {addSessionErrorLog} from './logging' @@ -218,10 +217,14 @@ export async function createAgentAndCreateAccount( throw e }), // wait for AA data to load first, then check state - aa.then(async () => { - const {state} = unsafeGetAndComputeAgeAssurance({did: account.did}) - if (state.access !== AgeAssuranceAccess.Full) { - restrictChatSettings({agent, did: account.did}) + aa.then(() => { + const {flags} = unsafeGetAndComputeAgeAssurance({did: account.did}) + if (flags?.chatDisabled || flags?.groupChatDisabled) { + void restrictChatSettings({ + agent, + restrictIncoming: flags.chatDisabled, + restrictGroupInvites: flags.groupChatDisabled, + }) } }), ]).then(promises => { From 22643c76d0b71211aae36e32d5bec8c07ac88cc5 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Tue, 9 Jun 2026 16:51:36 +0300 Subject: [PATCH 118/149] Fix fullscreen infinite render loop in video embeds (#10807) --- eslint-suppressions.json | 8 ----- .../VideoEmbed/ActiveVideoWebContext.tsx | 11 +++++-- src/components/hooks/useFullscreen.ts | 32 +++++++++++-------- 3 files changed, 26 insertions(+), 25 deletions(-) diff --git a/eslint-suppressions.json b/eslint-suppressions.json index 1eea217133..fffa450d37 100644 --- a/eslint-suppressions.json +++ b/eslint-suppressions.json @@ -645,14 +645,6 @@ "count": 2 } }, - "src/components/hooks/useFullscreen.ts": { - "@typescript-eslint/no-floating-promises": { - "count": 2 - }, - "react-hooks/set-state-in-effect": { - "count": 1 - } - }, "src/components/hooks/useLandingEntry.native.ts": { "react-hooks/set-state-in-effect": { "count": 1 diff --git a/src/components/Post/Embed/VideoEmbed/ActiveVideoWebContext.tsx b/src/components/Post/Embed/VideoEmbed/ActiveVideoWebContext.tsx index d0f2660ba4..90f399eb21 100644 --- a/src/components/Post/Embed/VideoEmbed/ActiveVideoWebContext.tsx +++ b/src/components/Post/Embed/VideoEmbed/ActiveVideoWebContext.tsx @@ -108,10 +108,15 @@ export function useActiveVideoWeb() { return { active: activeViewId === id, - setActive: () => { + setActive: useCallback(() => { setActiveView(id) - }, + }, [setActiveView, id]), currentActiveView: activeViewId, - sendPosition: (y: number) => sendViewPosition(id, y), + sendPosition: useCallback( + (y: number) => { + sendViewPosition(id, y) + }, + [sendViewPosition, id], + ), } } diff --git a/src/components/hooks/useFullscreen.ts b/src/components/hooks/useFullscreen.ts index 107095ef84..3578dd9fc4 100644 --- a/src/components/hooks/useFullscreen.ts +++ b/src/components/hooks/useFullscreen.ts @@ -1,10 +1,4 @@ -import { - useCallback, - useEffect, - useRef, - useState, - useSyncExternalStore, -} from 'react' +import {useCallback, useEffect, useRef, useSyncExternalStore} from 'react' import {IS_WEB, IS_WEB_FIREFOX, IS_WEB_SAFARI} from '#/env' @@ -13,28 +7,38 @@ function fullscreenSubscribe(onChange: () => void) { return () => document.removeEventListener('fullscreenchange', onChange) } +function getFullscreenSnapshot() { + return Boolean(document.fullscreenElement) +} + export function useFullscreen(ref?: React.RefObject) { if (!IS_WEB) throw new Error("'useFullscreen' is a web-only hook") - const isFullscreen = useSyncExternalStore(fullscreenSubscribe, () => - Boolean(document.fullscreenElement), + const isFullscreen = useSyncExternalStore( + fullscreenSubscribe, + getFullscreenSnapshot, ) const scrollYRef = useRef(null) - const [prevIsFullscreen, setPrevIsFullscreen] = useState(isFullscreen) + // Tracked via a ref rather than state so that reacting to a fullscreen change + // never schedules its own render. Scheduling a render in response to the + // external store value (the old `setPrevIsFullscreen` pattern) was a seed for + // the commit-phase update loop reported in APP-315 / APP-5PP / APP-7ZB. + const prevIsFullscreenRef = useRef(isFullscreen) const toggleFullscreen = useCallback(() => { if (isFullscreen) { - document.exitFullscreen() + void document.exitFullscreen() } else { if (!ref) throw new Error('No ref provided') if (!ref.current) return scrollYRef.current = window.scrollY - ref.current.requestFullscreen() + void ref.current.requestFullscreen() } }, [isFullscreen, ref]) useEffect(() => { + const prevIsFullscreen = prevIsFullscreenRef.current if (prevIsFullscreen === isFullscreen) return - setPrevIsFullscreen(isFullscreen) + prevIsFullscreenRef.current = isFullscreen // Chrome has an issue where it doesn't scroll back to the top after exiting fullscreen // Let's play it safe and do it if not FF or Safari, since anything else will probably be chromium @@ -46,7 +50,7 @@ export function useFullscreen(ref?: React.RefObject) { } }, 100) } - }, [isFullscreen, prevIsFullscreen]) + }, [isFullscreen]) return [isFullscreen, toggleFullscreen] as const } From bc94c8c07be1415760342e72e0f7ff0f1971db1b Mon Sep 17 00:00:00 2001 From: Spence Pope Date: Tue, 9 Jun 2026 10:11:21 -0400 Subject: [PATCH 119/149] Fix composer horizontal swipe triggering browser back/forward (#10812) --- src/view/com/composer/Composer.tsx | 32 +++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/view/com/composer/Composer.tsx b/src/view/com/composer/Composer.tsx index ab8f4d9cc5..25ed831c3c 100644 --- a/src/view/com/composer/Composer.tsx +++ b/src/view/com/composer/Composer.tsx @@ -134,7 +134,14 @@ import * as Prompt from '#/components/Prompt' import * as Toast from '#/components/Toast' import {Text} from '#/components/Typography' import {useAnalytics} from '#/analytics' -import {IS_ANDROID, IS_IOS, IS_LIQUID_GLASS, IS_NATIVE, IS_WEB} from '#/env' +import { + IS_ANDROID, + IS_IOS, + IS_LIQUID_GLASS, + IS_NATIVE, + IS_WEB, + IS_WEB_SAFARI, +} from '#/env' import {type Gif} from '#/features/gifPicker/types' import {BottomSheetPortalProvider} from '../../../../modules/bottom-sheet' import { @@ -1219,6 +1226,24 @@ export const ComposePost = ({ } }, [composerState]) + useEffect(() => { + // Safari ignores `overscroll-behavior`, so horizontal trackpad swipes over + // the composer (e.g. on a quote post) can still trigger the browser's + // back/forward navigation gesture. Suppress predominantly-horizontal wheel + // events so the history-nav gesture never fires. Chrome and Firefox are + // covered by the `overscrollBehaviorX: 'contain'` style on the ScrollView. + if (!IS_WEB_SAFARI) return + const el = + scrollViewRef.current?.getScrollableNode() as unknown as HTMLElement | null + if (!el) return + const onWheel = (e: WheelEvent) => { + if (Math.abs(e.deltaX) <= Math.abs(e.deltaY)) return + e.preventDefault() + } + el.addEventListener('wheel', onWheel, {passive: false}) + return () => el.removeEventListener('wheel', onWheel) + }, [scrollViewRef]) + const isLastThreadedPost = thread.posts.length > 1 && nextPost === undefined const { scrollHandler, @@ -1324,6 +1349,11 @@ export const ComposePost = ({ web({ scrollbarGutter: 'stable', scrollbarColor: `${t.palette.contrast_200} transparent`, + // Prevent horizontal trackpad swipes from triggering the + // browser's back/forward overscroll-navigation gesture. + // Handles Chrome and Firefox; Safari is handled separately + // via a wheel listener since it ignores overscroll-behavior. + overscrollBehaviorX: 'contain', }), ]} keyboardShouldPersistTaps="always" From 4c4ebd0510df48b136e9bf6aee5cdf348d428e1c Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Tue, 9 Jun 2026 17:20:34 +0300 Subject: [PATCH 120/149] Catch NotAllowedError in web GIF player + lint modules/ (#10806) --- eslint-suppressions.json | 109 ++++++++++++++++++ .../expo-bluesky-gif-view/src/GifView.web.tsx | 13 ++- .../src/VisibilityView/index.native.tsx | 6 +- package.json | 2 +- 4 files changed, 125 insertions(+), 5 deletions(-) diff --git a/eslint-suppressions.json b/eslint-suppressions.json index fffa450d37..59b062cc7b 100644 --- a/eslint-suppressions.json +++ b/eslint-suppressions.json @@ -1,4 +1,113 @@ { + "modules/bottom-sheet/src/BottomSheetNativeComponent.tsx": { + "@typescript-eslint/no-explicit-any": { + "count": 2 + }, + "@typescript-eslint/no-unsafe-call": { + "count": 2 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 2 + } + }, + "modules/bottom-sheet/src/BottomSheetPortal.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, + "modules/bottom-sheet/src/lib/Portal.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, + "modules/expo-background-notification-handler/src/BackgroundNotificationHandlerProvider.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 1 + }, + "no-restricted-imports": { + "count": 1 + } + }, + "modules/expo-background-notification-handler/src/ExpoBackgroundNotificationHandlerModule.web.ts": { + "@typescript-eslint/require-await": { + "count": 4 + } + }, + "modules/expo-bluesky-gif-view/src/GifView.tsx": { + "@typescript-eslint/no-explicit-any": { + "count": 2 + }, + "@typescript-eslint/no-unsafe-call": { + "count": 4 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 4 + }, + "no-restricted-imports": { + "count": 1 + } + }, + "modules/expo-bluesky-gif-view/src/GifView.web.tsx": { + "@typescript-eslint/no-floating-promises": { + "count": 2 + }, + "@typescript-eslint/require-await": { + "count": 2 + } + }, + "modules/expo-bluesky-swiss-army/src/PlatformInfo/index.native.ts": { + "@typescript-eslint/no-unsafe-call": { + "count": 3 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 3 + } + }, + "modules/expo-bluesky-swiss-army/src/Referrer/index.android.ts": { + "@typescript-eslint/no-unsafe-call": { + "count": 2 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 2 + } + }, + "modules/expo-bluesky-swiss-army/src/SharedPrefs/index.native.ts": { + "@typescript-eslint/no-explicit-any": { + "count": 1 + }, + "@typescript-eslint/no-unsafe-call": { + "count": 9 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 9 + } + }, + "modules/expo-bluesky-swiss-army/src/VisibilityView/index.native.tsx": { + "@typescript-eslint/no-unsafe-call": { + "count": 1 + }, + "@typescript-eslint/no-unsafe-member-access": { + "count": 1 + }, + "no-restricted-imports": { + "count": 1 + } + }, + "modules/expo-bluesky-swiss-army/src/VisibilityView/index.tsx": { + "@typescript-eslint/require-await": { + "count": 1 + } + }, + "modules/expo-bluesky-swiss-army/src/VisibilityView/types.ts": { + "no-restricted-imports": { + "count": 1 + } + }, + "modules/expo-emoji-picker/src/EmojiPickerView.tsx": { + "no-restricted-imports": { + "count": 1 + } + }, "src/Navigation.tsx": { "@typescript-eslint/no-floating-promises": { "count": 1 diff --git a/modules/expo-bluesky-gif-view/src/GifView.web.tsx b/modules/expo-bluesky-gif-view/src/GifView.web.tsx index c9f439bffe..e51b9bf9fc 100644 --- a/modules/expo-bluesky-gif-view/src/GifView.web.tsx +++ b/modules/expo-bluesky-gif-view/src/GifView.web.tsx @@ -67,7 +67,18 @@ export class GifView extends PureComponent { } async playAsync(): Promise { - this.videoPlayerRef.current?.play() + try { + await this.videoPlayerRef.current?.play() + } catch (err) { + // `play()` rejects with a NotAllowedError when the browser blocks + // playback (e.g. Safari low-power mode or autoplay policy). This is + // expected and benign - the GIF simply stays paused - so swallow it + // rather than letting it surface as an unhandled rejection. + if (err instanceof DOMException && err.name === 'NotAllowedError') { + return + } + throw err + } } async pauseAsync(): Promise { diff --git a/modules/expo-bluesky-swiss-army/src/VisibilityView/index.native.tsx b/modules/expo-bluesky-swiss-army/src/VisibilityView/index.native.tsx index 9d0e8cf220..aba96c6d4b 100644 --- a/modules/expo-bluesky-swiss-army/src/VisibilityView/index.native.tsx +++ b/modules/expo-bluesky-swiss-army/src/VisibilityView/index.native.tsx @@ -1,12 +1,12 @@ import React from 'react' -import {StyleProp, ViewStyle} from 'react-native' +import {type StyleProp, type ViewStyle} from 'react-native' import {requireNativeModule, requireNativeViewManager} from 'expo-modules-core' -import {VisibilityViewProps} from './types' +import {type VisibilityViewProps} from './types' const NativeView: React.ComponentType<{ onChangeStatus: (e: {nativeEvent: {isActive: boolean}}) => void children: React.ReactNode - enabled: Boolean + enabled: boolean style: StyleProp }> = requireNativeViewManager('ExpoBlueskyVisibilityView') diff --git a/package.json b/package.json index e054aca94a..8853eb2210 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "test-watch": "NODE_ENV=test jest --watchAll", "test-ci": "NODE_ENV=test jest --ci --forceExit --reporters=default --reporters=jest-junit", "test-coverage": "NODE_ENV=test jest --coverage", - "lint": "eslint --cache --quiet src", + "lint": "eslint --cache --quiet src modules", "lint-native": "swiftlint ./modules && ktlint ./modules", "lint-native:fix": "swiftlint --fix ./modules && ktlint --format ./modules", "typecheck": "tsgo --project ./tsconfig.check.json", From c52231a449e33b184c19219e9f694da402cec9e8 Mon Sep 17 00:00:00 2001 From: DS Boyce <260543580+ds-boyce@users.noreply.github.com> Date: Tue, 9 Jun 2026 07:23:33 -0700 Subject: [PATCH 121/149] Update handling of join link previews (#10798) Co-authored-by: Samuel Newman --- bskyogcard/package.json | 2 +- bskyogcard/pnpm-lock.yaml | 10 +-- bskyogcard/src/routes/chat-invite.tsx | 4 +- package.json | 2 +- pnpm-lock.yaml | 10 +-- .../Post/Embed/JoinRequestEmbed.tsx | 13 ++-- src/components/dms/ChatInvite/Card.tsx | 3 +- src/components/dms/ChatInvite/Context.tsx | 4 +- src/components/dms/ChatInvite/Root.tsx | 19 +++--- src/components/dms/MessageItemInviteEmbed.tsx | 8 ++- src/components/dms/MessagesListHeader.tsx | 6 +- src/components/dms/SystemMessageItem.tsx | 3 +- .../intents/GroupChatJoinDialog.tsx | 17 ++--- src/lib/api/index.ts | 6 +- src/lib/api/resolve.ts | 12 ++-- src/screens/Messages/JoinRequest.tsx | 50 +++++++------- .../Messages/components/MessageInputEmbed.tsx | 28 +++++--- .../components/MessagesListGroupInfoPanel.tsx | 6 +- .../components/MessagesListInfoPanel.tsx | 3 +- .../components/OutgoingRequestListItem.tsx | 15 +++-- src/state/queries/join-links.ts | 65 +++++++++++++++++-- .../queries/messages/disable-join-link.ts | 2 + .../queries/messages/enable-join-link.ts | 2 + src/view/com/composer/Composer.tsx | 5 +- 24 files changed, 192 insertions(+), 103 deletions(-) diff --git a/bskyogcard/package.json b/bskyogcard/package.json index 0fb28334cb..50248e4cf9 100644 --- a/bskyogcard/package.json +++ b/bskyogcard/package.json @@ -18,7 +18,7 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@atproto/api": "0.20.6", + "@atproto/api": "0.20.11", "@atproto/common": "^0.6.1", "@resvg/resvg-js": "^2.6.2", "express": "^4.19.2", diff --git a/bskyogcard/pnpm-lock.yaml b/bskyogcard/pnpm-lock.yaml index 39685ea8ce..2bebbe145c 100644 --- a/bskyogcard/pnpm-lock.yaml +++ b/bskyogcard/pnpm-lock.yaml @@ -208,8 +208,8 @@ importers: .: dependencies: '@atproto/api': - specifier: 0.20.6 - version: 0.20.6 + specifier: 0.20.11 + version: 0.20.11 '@atproto/common': specifier: ^0.6.1 version: 0.6.1 @@ -259,8 +259,8 @@ importers: packages: - '@atproto/api@0.20.6': - resolution: {integrity: sha512-WnFPcUl+qZdXmt27+Tg93BDIvBt/WpXfLIiBzBTp3ms9aszM5hAsfc7G8KEsnsmnRvcm0xRfiKEjIt5FxTKdYg==} + '@atproto/api@0.20.11': + resolution: {integrity: sha512-1NoVJpBDAdotxo1iMZdMd75JstpdKWgBYOnxfVD4m+52bRjgU4cFg3EOGNUognZntFgL/bIHyEgyN7SJWVf6Ig==} engines: {node: '>=22'} '@atproto/common-web@0.5.0': @@ -1154,7 +1154,7 @@ packages: snapshots: - '@atproto/api@0.20.6': + '@atproto/api@0.20.11': dependencies: '@atproto/common-web': 0.5.0 '@atproto/lexicon': 0.7.1 diff --git a/bskyogcard/src/routes/chat-invite.tsx b/bskyogcard/src/routes/chat-invite.tsx index e3267cc0d0..36482743b8 100644 --- a/bskyogcard/src/routes/chat-invite.tsx +++ b/bskyogcard/src/routes/chat-invite.tsx @@ -1,6 +1,6 @@ import assert from 'node:assert' -import {type ChatBskyGroupDefs} from '@atproto/api' +import {ChatBskyGroupDefs} from '@atproto/api' import resvg from '@resvg/resvg-js' import {type Express} from 'express' import satori from 'satori' @@ -32,7 +32,7 @@ export default function (ctx: AppContext, app: Express) { codes: [code], }) const found = result.data.joinLinkPreviews[0] - if (!found) { + if (!ChatBskyGroupDefs.isJoinLinkPreviewView(found)) { return res.status(404).end('not found') } preview = found diff --git a/package.json b/package.json index 8853eb2210..3040ce2e90 100644 --- a/package.json +++ b/package.json @@ -93,7 +93,7 @@ "prettier": "prettier --check ." }, "dependencies": { - "@atproto/api": "0.20.9", + "@atproto/api": "0.20.11", "@atproto/syntax": "0.6.1", "@bitdrift/react-native": "^0.6.8", "@braintree/sanitize-url": "^6.0.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b2f65bf409..9d21e055cd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -242,8 +242,8 @@ importers: .: dependencies: '@atproto/api': - specifier: 0.20.9 - version: 0.20.9 + specifier: 0.20.11 + version: 0.20.11 '@atproto/syntax': specifier: 0.6.1 version: 0.6.1 @@ -877,8 +877,8 @@ packages: graphql: optional: true - '@atproto/api@0.20.9': - resolution: {integrity: sha512-Yuw7Ewn+yMJZ8GskbuvI3lKPW65rsXic1xjFA2Dpq6H8WjVYs6xNZ31bkwtTYDDwjKIZcJmAVbAVgdfjo4T9iw==} + '@atproto/api@0.20.11': + resolution: {integrity: sha512-1NoVJpBDAdotxo1iMZdMd75JstpdKWgBYOnxfVD4m+52bRjgU4cFg3EOGNUognZntFgL/bIHyEgyN7SJWVf6Ig==} engines: {node: '>=22'} '@atproto/common-web@0.5.0': @@ -9493,7 +9493,7 @@ snapshots: '@0no-co/graphql.web@1.2.0': {} - '@atproto/api@0.20.9': + '@atproto/api@0.20.11': dependencies: '@atproto/common-web': 0.5.0 '@atproto/lexicon': 0.7.1 diff --git a/src/components/Post/Embed/JoinRequestEmbed.tsx b/src/components/Post/Embed/JoinRequestEmbed.tsx index e020bb9333..a3cc08cac6 100644 --- a/src/components/Post/Embed/JoinRequestEmbed.tsx +++ b/src/components/Post/Embed/JoinRequestEmbed.tsx @@ -1,7 +1,11 @@ import {type StyleProp, View, type ViewStyle} from 'react-native' -import {type ChatBskyGroupDefs} from '@atproto/api' +import {ChatBskyGroupDefs} from '@atproto/api' import {Trans} from '@lingui/react/macro' +import { + type ChatInvitePreview, + isKnownJoinLinkPreview, +} from '#/state/queries/join-links' import {atoms as a, useTheme} from '#/alf' import * as ChatInvite from '#/components/dms/ChatInvite' import {Warning_Stroke2_Corner0_Rounded as WarningIcon} from '#/components/icons/Warning' @@ -23,11 +27,12 @@ export function JoinRequestEmbed({ onOpen, }: { code?: string - preview?: ChatBskyGroupDefs.JoinLinkPreviewView + preview?: ChatInvitePreview style?: StyleProp onOpen?: () => void }) { - const resolvedCode = code ?? preview?.code + const resolvedCode = + code ?? (isKnownJoinLinkPreview(preview) ? preview.code : undefined) if (!resolvedCode) return null return ( @@ -73,7 +78,7 @@ export function JoinRequestEmbedBody({ ) } - if (!preview) { + if (!ChatBskyGroupDefs.isJoinLinkPreviewView(preview)) { return ( = JoinIcon let label = preview.requireApproval ? l`Request to join` : l`Join` let color: ButtonColor = 'primary' - if (preview.enabledStatus !== 'enabled') { - canJoin = false - icon = WarningIcon - label = l`Chat invite link no longer available` - color = 'secondary' - } else if (preview.memberCount >= preview.memberLimit) { + if (preview.memberCount >= preview.memberLimit) { canJoin = false icon = HandIcon label = l`This chat is full` diff --git a/src/components/dms/MessageItemInviteEmbed.tsx b/src/components/dms/MessageItemInviteEmbed.tsx index d85e7fd08a..79416057c9 100644 --- a/src/components/dms/MessageItemInviteEmbed.tsx +++ b/src/components/dms/MessageItemInviteEmbed.tsx @@ -3,6 +3,7 @@ import {useWindowDimensions, View} from 'react-native' import {type $Typed, type ChatBskyEmbedJoinLink} from '@atproto/api' import {useConvoActive} from '#/state/messages/convo' +import {isKnownJoinLinkPreview} from '#/state/queries/join-links' import {atoms as a, native, useTheme, web} from '#/alf' import * as ChatInvite from '#/components/dms/ChatInvite' import {MessageContextProvider} from './MessageContext' @@ -27,6 +28,11 @@ let MessageItemInviteEmbed = ({ const screen = useWindowDimensions() const convo = useConvoActive() + const code = isKnownJoinLinkPreview(embed.joinLinkPreview) + ? embed.joinLinkPreview.code + : undefined + if (!code) return null + return ( diff --git a/src/components/dms/MessagesListHeader.tsx b/src/components/dms/MessagesListHeader.tsx index 745adc62b7..82b00645d2 100644 --- a/src/components/dms/MessagesListHeader.tsx +++ b/src/components/dms/MessagesListHeader.tsx @@ -121,7 +121,8 @@ function ProfileHeaderReady({ + numberOfLines={1} + emoji> {displayName} @@ -185,7 +186,8 @@ function GroupHeaderReady({ + numberOfLines={1} + emoji> {convo.details.name} diff --git a/src/components/dms/SystemMessageItem.tsx b/src/components/dms/SystemMessageItem.tsx index 9854255c84..7de6a0cd91 100644 --- a/src/components/dms/SystemMessageItem.tsx +++ b/src/components/dms/SystemMessageItem.tsx @@ -45,7 +45,8 @@ export function SystemMessageItem({ a.text_center, t.atoms.text_contrast_medium, {includeFontPadding: false, textAlignVertical: 'center'}, - ]}> + ]} + emoji> {text} diff --git a/src/components/intents/GroupChatJoinDialog.tsx b/src/components/intents/GroupChatJoinDialog.tsx index 8d235b9a07..dd3d8cb6e8 100644 --- a/src/components/intents/GroupChatJoinDialog.tsx +++ b/src/components/intents/GroupChatJoinDialog.tsx @@ -1,5 +1,6 @@ import {View} from 'react-native' import { + ChatBskyGroupDefs, ChatBskyGroupRequestJoin, ChatBskyGroupWithdrawJoinRequest, moderateProfile, @@ -211,7 +212,7 @@ function GroupChatJoinDialogContent({code}: {code?: string}) { const joinLinkPreview = data.joinLinkPreviews[0] - if (!joinLinkPreview) { + if (!ChatBskyGroupDefs.isJoinLinkPreviewView(joinLinkPreview)) { return ( <> @@ -253,12 +254,7 @@ function GroupChatJoinDialogContent({code}: {code?: string}) { ? l`Request to join` : l`Join` let buttonColor: ButtonColor = 'primary' - if (joinLinkPreview.enabledStatus !== 'enabled') { - canJoin = false - ButtonIconImage = WarningIcon - buttonText = l`Chat invite link no longer available` - buttonColor = 'secondary' - } else if (joinLinkPreview.memberCount >= joinLinkPreview.memberLimit) { + if (joinLinkPreview.memberCount >= joinLinkPreview.memberLimit) { canJoin = false ButtonIconImage = HandIcon buttonText = l`This chat is full` @@ -311,10 +307,7 @@ function GroupChatJoinDialogContent({code}: {code?: string}) { - + @@ -371,7 +364,7 @@ function GroupChatJoinDialogContent({code}: {code?: string}) { diff --git a/src/lib/api/index.ts b/src/lib/api/index.ts index 6f92e2a1dd..40e6743b9a 100644 --- a/src/lib/api/index.ts +++ b/src/lib/api/index.ts @@ -9,6 +9,7 @@ import { AppBskyFeedPost, BlobRef, type BskyAgent, + ChatBskyGroupDefs, type ComAtprotoLabelDefs, type ComAtprotoRepoApplyWrites, type ComAtprotoRepoStrongRef, @@ -463,7 +464,10 @@ async function resolveMedia( }, } } - if (resolvedLink.type === 'chat-invite' && resolvedLink.view) { + if ( + resolvedLink.type === 'chat-invite' && + ChatBskyGroupDefs.isJoinLinkPreviewView(resolvedLink.view) + ) { return { $type: 'app.bsky.embed.external', external: { diff --git a/src/lib/api/resolve.ts b/src/lib/api/resolve.ts index ca0b342045..476c0f1a20 100644 --- a/src/lib/api/resolve.ts +++ b/src/lib/api/resolve.ts @@ -1,8 +1,7 @@ import { type AppBskyFeedDefs, type AppBskyGraphDefs, - type BskyAgent, - type ChatBskyGroupDefs, + type AtpAgent, type ComAtprotoRepoStrongRef, } from '@atproto/api' import {AtUri} from '@atproto/api' @@ -28,6 +27,7 @@ import { } from '#/lib/strings/url-helpers' import {type ComposerImage} from '#/state/gallery' import {createComposerImage} from '#/state/gallery' +import {type ChatInvitePreview} from '#/state/queries/join-links' import {type Gif} from '#/features/gifPicker/types' import {createGIFDescription} from '../gif-alt-text' @@ -77,7 +77,7 @@ type ResolvedChatInvite = { type: 'chat-invite' uri: string code: string - view?: ChatBskyGroupDefs.JoinLinkPreviewView + view?: ChatInvitePreview } export type ResolvedLink = @@ -95,7 +95,7 @@ export class EmbeddingDisabledError extends Error { } export async function resolveLink( - agent: BskyAgent, + agent: AtpAgent, uri: string, ): Promise { if (isShortLink(uri)) { @@ -217,7 +217,7 @@ export async function resolveLink( } export async function resolveGif( - agent: BskyAgent, + agent: AtpAgent, gif: Gif, ): Promise { const gifUrl = gif.media_formats.gif.url @@ -259,7 +259,7 @@ function getFileSlug(url: string | undefined): string | undefined { } async function resolveExternal( - agent: BskyAgent, + agent: AtpAgent, uri: string, ): Promise { const result = await getLinkMeta(agent, uri) diff --git a/src/screens/Messages/JoinRequest.tsx b/src/screens/Messages/JoinRequest.tsx index 1e23c3405b..64c898dc26 100644 --- a/src/screens/Messages/JoinRequest.tsx +++ b/src/screens/Messages/JoinRequest.tsx @@ -1,6 +1,6 @@ import {View} from 'react-native' import {ImageBackground} from 'expo-image' -import {moderateProfile} from '@atproto/api' +import {ChatBskyGroupDefs, moderateProfile} from '@atproto/api' import {Trans, useLingui} from '@lingui/react/macro' import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name' @@ -52,9 +52,7 @@ export function JoinRequest({setScreenState}: Props) { ? mobileDarkBg : mobileLightBg - const requiresApproval = data?.joinLinkPreviews[0]?.requireApproval - const requiresFollow = - data?.joinLinkPreviews[0]?.joinRule === 'followedByOwner' + const joinLinkPreview = data?.joinLinkPreviews[0] return ( @@ -69,7 +67,9 @@ export function JoinRequest({setScreenState}: Props) { a.justify_center, a.align_center, ]}> - {error ? ( + {error || + (data && + !ChatBskyGroupDefs.isJoinLinkPreviewView(joinLinkPreview)) ? ( - {l`This invite link has expired`} + Chat invite link no longer available - ) : data && moderationOpts ? ( + ) : data && + moderationOpts && + ChatBskyGroupDefs.isJoinLinkPreviewView(joinLinkPreview) ? ( - {data.joinLinkPreviews[0].memberCount}/ - {data.joinLinkPreviews[0].memberLimit} + {joinLinkPreview.memberCount}/ + {joinLinkPreview.memberLimit} @@ -144,7 +143,7 @@ export function JoinRequest({setScreenState}: Props) { a.font_bold, t.atoms.text, ]}> - {data.joinLinkPreviews[0].name} + {joinLinkPreview.name} @@ -168,17 +167,17 @@ export function JoinRequest({setScreenState}: Props) { By{' '} {createSanitizedDisplayName( - data.joinLinkPreviews[0].owner, + joinLinkPreview.owner, true, moderateProfile( - data.joinLinkPreviews[0].owner, + joinLinkPreview.owner, moderationOpts, ).ui('displayName'), )} @@ -192,7 +191,7 @@ export function JoinRequest({setScreenState}: Props) { t.atoms.text_contrast_medium, a.max_w_full, ]}> - {sanitizeHandle(data.joinLinkPreviews[0].owner.handle, '@')} + {sanitizeHandle(joinLinkPreview.owner.handle, '@')} - {requiresApproval + {joinLinkPreview.requireApproval ? l`Sign in to request access to this group chat.` : l`Sign in to accept invite.`}{' '} - {requiresFollow && + {joinLinkPreview.joinRule === 'followedByOwner' && l`Only people ${createSanitizedDisplayName( - data.joinLinkPreviews[0].owner, + joinLinkPreview.owner, true, - moderateProfile( - data.joinLinkPreviews[0].owner, - moderationOpts, - ).ui('displayName'), + moderateProfile(joinLinkPreview.owner, moderationOpts).ui( + 'displayName', + ), )} follows can join.`} diff --git a/src/screens/Messages/components/MessageInputEmbed.tsx b/src/screens/Messages/components/MessageInputEmbed.tsx index 21503ce8fa..c38141ce9d 100644 --- a/src/screens/Messages/components/MessageInputEmbed.tsx +++ b/src/screens/Messages/components/MessageInputEmbed.tsx @@ -4,6 +4,7 @@ import { AppBskyFeedPost, AppBskyRichtextFacet, AtUri, + ChatBskyGroupDefs, moderatePost, RichText as RichTextAPI, } from '@atproto/api' @@ -30,6 +31,7 @@ import {atoms as a, useTheme} from '#/alf' import {Button} from '#/components/Button' import * as ChatInvite from '#/components/dms/ChatInvite' import {TimesLarge_Stroke2_Corner0_Rounded as XIcon} from '#/components/icons/Times' +import {Warning_Stroke2_Corner0_Rounded as WarningIcon} from '#/components/icons/Warning' import {Loader} from '#/components/Loader' import * as MediaPreview from '#/components/MediaPreview' import {ContentHider} from '#/components/moderation/ContentHider' @@ -52,12 +54,12 @@ export function useMessageEmbed() { const navigation = useNavigation() const embedFromParams = route.params.embed - const [embed, setEmbedState] = useState( + const [embed, setEmbed] = useState( embedFromParams ? {type: 'post', uri: embedFromParams} : undefined, ) if (embedFromParams && embed?.type !== 'post') { - setEmbedState({type: 'post', uri: embedFromParams}) + setEmbed({type: 'post', uri: embedFromParams}) } return { @@ -68,7 +70,7 @@ export function useMessageEmbed() { // Only the post embed is reflected in the route param (used by the // share-to-DM intent flow); invites are local-only. navigation.setParams({embed: ''}) - setEmbedState(undefined) + setEmbed(undefined) return } @@ -77,7 +79,7 @@ export function useMessageEmbed() { if (isBskyChatInviteUrl(embedUrl)) { const code = getChatInviteCodeFromUrl(embedUrl) if (code) { - setEmbedState({type: 'invite', code}) + setEmbed({type: 'invite', code}) } return } @@ -86,7 +88,7 @@ export function useMessageEmbed() { const url = convertBskyAppUrlIfNeeded(embedUrl) const [_0, user, _1, rkey] = url.split('/').filter(Boolean) const uri = makeRecordUri(user, 'app.bsky.feed.post', rkey) - setEmbedState({type: 'post', uri}) + setEmbed({type: 'post', uri}) } }, [embedFromParams, navigation], @@ -314,11 +316,19 @@ function MessageInputInviteEmbedBody() { ) } - if (!preview) { + if (!ChatBskyGroupDefs.isJoinLinkPreviewView(preview)) { return ( - - - Could not load invite + + + + Chat invite link no longer available ) diff --git a/src/screens/Messages/components/MessagesListGroupInfoPanel.tsx b/src/screens/Messages/components/MessagesListGroupInfoPanel.tsx index 2129182632..8428b1a4b2 100644 --- a/src/screens/Messages/components/MessagesListGroupInfoPanel.tsx +++ b/src/screens/Messages/components/MessagesListGroupInfoPanel.tsx @@ -94,7 +94,8 @@ export function MessagesListGroupInfoPanel({ /> {convo.details.name ? ( + style={[a.text_2xl, a.font_bold, a.mt_lg, a.px_xl, a.text_center]} + emoji> {convo.details.name} ) : null} @@ -107,7 +108,8 @@ export function MessagesListGroupInfoPanel({ a.text_sm, t.atoms.text_contrast_high, showButtons ? null : a.mb_4xl, - ]}> + ]} + emoji> {names} ) : null} diff --git a/src/screens/Messages/components/MessagesListInfoPanel.tsx b/src/screens/Messages/components/MessagesListInfoPanel.tsx index b30bd6fe9d..e1e620adee 100644 --- a/src/screens/Messages/components/MessagesListInfoPanel.tsx +++ b/src/screens/Messages/components/MessagesListInfoPanel.tsx @@ -60,7 +60,8 @@ export function MessagesListInfoPanel({ ]}> + numberOfLines={1} + emoji> {displayName} diff --git a/src/screens/Messages/components/OutgoingRequestListItem.tsx b/src/screens/Messages/components/OutgoingRequestListItem.tsx index 8bd7ba78d0..2f8804092d 100644 --- a/src/screens/Messages/components/OutgoingRequestListItem.tsx +++ b/src/screens/Messages/components/OutgoingRequestListItem.tsx @@ -76,7 +76,14 @@ export function OutgoingRequestListItem({ moderationOpts={moderationOpts} /> - + - - + {convoView.viewer?.requestedAt ? ( + {({timeElapsed}) => ( )} - + ) : null} + | $Typed + | $Typed + +/** + * The full open-union shape, including the `{$type: string}` fallback for + * future variants. + */ +export type ChatInvitePreview = KnownChatInvitePreview | {$type: string} + +/** + * Narrows a preview to one of the three known variants, filtering out the + * `{$type: string}` open-union fallback for unrecognized future shapes. + */ +export function isKnownJoinLinkPreview( + preview: unknown, +): preview is KnownChatInvitePreview { + return ( + ChatBskyGroupDefs.isJoinLinkPreviewView(preview) || + ChatBskyGroupDefs.isDisabledJoinLinkPreviewView(preview) || + ChatBskyGroupDefs.isInvalidJoinLinkPreviewView(preview) + ) +} + const joinLinkPreviewQueryKeyRoot = 'join-link-preview' export const createJoinLinkPreviewQueryKey = (args: { @@ -22,6 +53,29 @@ export const createJoinLinkPreviewQueryKey = (args: { persistedVersion: 1, }) +/** + * Invalidate any join link preview queries whose `codes` include the given + * code. Use this when a link's state changes (e.g. it's disabled) so cached + * previews refetch and reflect the new state. + */ +export function invalidateJoinLinkPreviewsForCode( + queryClient: QueryClient, + code: string, +) { + return queryClient.invalidateQueries({ + predicate: query => { + const [root, args] = query.queryKey as Partial< + StructuredQueryKey<{codes?: string[]}> + > + return ( + root === joinLinkPreviewQueryKeyRoot && + Array.isArray(args?.codes) && + args.codes.includes(code) + ) + }, + }) +} + async function fetchJoinLinkPreviews({ agent, codes, @@ -104,7 +158,7 @@ export function useGetJoinLinkPreview() { }: { code: string hasSession: boolean - }): Promise => { + }): Promise => { try { const data = await queryClient.fetchQuery({ queryKey: createJoinLinkPreviewQueryKey({codes: [code], hasSession}), @@ -112,7 +166,8 @@ export function useGetJoinLinkPreview() { fetchJoinLinkPreviews({agent, codes: [code], hasSession}), staleTime: STALE.SECONDS.FIFTEEN, }) - return data.joinLinkPreviews[0] + const found = data.joinLinkPreviews[0] + return isKnownJoinLinkPreview(found) ? found : undefined } catch (error) { logger.error('Failed to fetch join link preview', {safeMessage: error}) return undefined diff --git a/src/state/queries/messages/disable-join-link.ts b/src/state/queries/messages/disable-join-link.ts index 522b5939eb..c143feb6cc 100644 --- a/src/state/queries/messages/disable-join-link.ts +++ b/src/state/queries/messages/disable-join-link.ts @@ -6,6 +6,7 @@ import {useMutation, useQueryClient} from '@tanstack/react-query' import {DM_SERVICE_HEADERS} from '#/lib/constants' import {logger} from '#/logger' +import {invalidateJoinLinkPreviewsForCode} from '#/state/queries/join-links' import {useAgent} from '#/state/session' import { rollbackConvoOptimistic, @@ -59,6 +60,7 @@ export function useDisableJoinLink( } }) } + void invalidateJoinLinkPreviewsForCode(queryClient, data.joinLink.code) onSuccess?.(data) }, onError: (e, _variables, context) => { diff --git a/src/state/queries/messages/enable-join-link.ts b/src/state/queries/messages/enable-join-link.ts index a2ba505f1d..4febc85441 100644 --- a/src/state/queries/messages/enable-join-link.ts +++ b/src/state/queries/messages/enable-join-link.ts @@ -3,6 +3,7 @@ import {useMutation, useQueryClient} from '@tanstack/react-query' import {DM_SERVICE_HEADERS} from '#/lib/constants' import {logger} from '#/logger' +import {invalidateJoinLinkPreviewsForCode} from '#/state/queries/join-links' import {useAgent} from '#/state/session' import { rollbackConvoOptimistic, @@ -56,6 +57,7 @@ export function useEnableJoinLink( } }) } + void invalidateJoinLinkPreviewsForCode(queryClient, data.joinLink.code) onSuccess?.(data) }, onError: (e, _variables, context) => { diff --git a/src/view/com/composer/Composer.tsx b/src/view/com/composer/Composer.tsx index 25ed831c3c..e1d68acea6 100644 --- a/src/view/com/composer/Composer.tsx +++ b/src/view/com/composer/Composer.tsx @@ -52,6 +52,7 @@ import { type AppBskyUnspeccedGetPostThreadV2, AtUri, type BskyAgent, + ChatBskyGroupDefs, type RichText, } from '@atproto/api' import {plural} from '@lingui/core/macro' @@ -886,7 +887,9 @@ export const ComposePost = ({ })), }) const hasUnavailableChatInvite = linkQueries.some( - q => q.data?.type === 'chat-invite' && !q.data.view, + q => + q.data?.type === 'chat-invite' && + !ChatBskyGroupDefs.isJoinLinkPreviewView(q.data.view), ) const canPost = From e339a2a18cf22fde14c871773ca3336dccc4941d Mon Sep 17 00:00:00 2001 From: Spence Pope Date: Tue, 9 Jun 2026 11:24:34 -0400 Subject: [PATCH 122/149] version number (#10815) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3040ce2e90..84324a70de 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bsky.app", - "version": "1.123.0", + "version": "1.124.0", "private": true, "engines": { "node": ">=24.15.0" From fb4133cdc76eb6e4aac098bdc15c43c5e39a2916 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Tue, 9 Jun 2026 18:33:04 +0300 Subject: [PATCH 123/149] [Chat] Filter out groups from badge counts when AA'd (#10816) --- src/screens/Messages/ChatList.tsx | 7 +++++-- src/state/queries/messages/list-conversations.tsx | 7 +++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/screens/Messages/ChatList.tsx b/src/screens/Messages/ChatList.tsx index ab622f708a..f08d155e06 100644 --- a/src/screens/Messages/ChatList.tsx +++ b/src/screens/Messages/ChatList.tsx @@ -1,7 +1,7 @@ import {useCallback, useEffect, useMemo, useRef, useState} from 'react' import {View} from 'react-native' import {useAnimatedRef} from 'react-native-reanimated' -import {type ChatBskyActorGetStatus, type ChatBskyConvoDefs} from '@atproto/api' +import {type ChatBskyActorGetStatus, ChatBskyConvoDefs} from '@atproto/api' import {Trans, useLingui} from '@lingui/react/macro' import {useFocusEffect, useIsFocused} from '@react-navigation/native' import {type NativeStackScreenProps} from '@react-navigation/native-stack' @@ -475,7 +475,10 @@ export function Header({ convo => !leftConvos.includes(convo.id) && !convo.muted && - convo.members.every(member => member.handle !== 'missing.invalid'), + convo.members.every(member => member.handle !== 'missing.invalid') && + (ChatBskyConvoDefs.isGroupConvo(convo.kind) + ? !aa.flags.groupChatDisabled + : true), ) ?? [] const openChatControl = useCallback(() => { diff --git a/src/state/queries/messages/list-conversations.tsx b/src/state/queries/messages/list-conversations.tsx index 0bc2f69997..f7ad22fbae 100644 --- a/src/state/queries/messages/list-conversations.tsx +++ b/src/state/queries/messages/list-conversations.tsx @@ -21,6 +21,7 @@ import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useAgent, useSession} from '#/state/session' import {parseConvoView} from '#/components/dms/util' import {useAgeAssurance} from '#/ageAssurance' +import {type AgeAssuranceFlags} from '#/ageAssurance/types' import * as bsky from '#/types/bsky' import {RQKEY as CONVO_KEY} from './conversation' import {useLeftConvos} from './leave-conversation' @@ -679,6 +680,7 @@ export function useUnreadMessageCount() { const {currentAccount} = useSession() const {accepted, request} = useListConvos() const moderationOpts = useModerationOpts() + const aa = useAgeAssurance() return useMemo<{ count: number @@ -690,12 +692,14 @@ export function useUnreadMessageCount() { currentAccount?.did, currentConvoId, moderationOpts, + aa.flags, ) const requestCount = calculateCount( request, currentAccount?.did, currentConvoId, moderationOpts, + aa.flags, ) if (acceptedCount > 0) { const total = acceptedCount + Math.min(requestCount, 1) @@ -726,6 +730,7 @@ function calculateCount( currentAccountDid: string | undefined, currentConvoId: string | undefined, moderationOpts: ModerationOpts | undefined, + flags: AgeAssuranceFlags, ) { return ( convos @@ -735,6 +740,8 @@ function calculateCount( if (!convo || !moderationOpts) return acc + if (convo.kind === 'group' && flags.groupChatDisabled) return acc + const shouldIgnore = convo.view.muted || !convo.primaryMember || From be309470891c1ae92c8643dfeeca82919739b48d Mon Sep 17 00:00:00 2001 From: Michael Black Date: Tue, 9 Jun 2026 11:10:33 -0500 Subject: [PATCH 124/149] bskyweb: extract gallery media for SEO (#10813) --- bskyweb/cmd/bskyweb/jsonld.go | 37 ++++++- bskyweb/cmd/bskyweb/jsonld_test.go | 155 +++++++++++++++++++++++++++++ bskyweb/cmd/bskyweb/render_test.go | 34 +++++++ bskyweb/go.mod | 2 +- bskyweb/go.sum | 4 +- 5 files changed, 226 insertions(+), 6 deletions(-) diff --git a/bskyweb/cmd/bskyweb/jsonld.go b/bskyweb/cmd/bskyweb/jsonld.go index 7bc44a02f3..8d06b71262 100644 --- a/bskyweb/cmd/bskyweb/jsonld.go +++ b/bskyweb/cmd/bskyweb/jsonld.go @@ -136,9 +136,9 @@ func bskyProfileURL(handle string) string { return fmt.Sprintf("https://bsky.app/profile/%s", handle) } -// extractPostMedia returns thumbnail URLs for the post's image or video -// embed, byte-identical to what we put in og:image. Callers derive -// thumbnailUrl from urls[0]. +// extractPostMedia returns thumbnail URLs for the post's image, gallery, +// or video embed, byte-identical to what we put in og:image. Callers +// derive thumbnailUrl from urls[0]. func extractPostMedia(pv *appbsky.FeedDefs_PostView, embedHidden bool) []string { if pv == nil || pv.Embed == nil || embedHidden { return nil @@ -147,6 +147,9 @@ func extractPostMedia(pv *appbsky.FeedDefs_PostView, embedHidden bool) []string if pv.Embed.EmbedImages_View != nil { return imageThumbs(pv.Embed.EmbedImages_View.Images) } + if pv.Embed.EmbedGallery_View != nil { + return galleryThumbs(pv.Embed.EmbedGallery_View.Items) + } if pv.Embed.EmbedVideo_View != nil && pv.Embed.EmbedVideo_View.Thumbnail != nil { return []string{*pv.Embed.EmbedVideo_View.Thumbnail} } @@ -155,6 +158,9 @@ func extractPostMedia(pv *appbsky.FeedDefs_PostView, embedHidden bool) []string if media.EmbedImages_View != nil { return imageThumbs(media.EmbedImages_View.Images) } + if media.EmbedGallery_View != nil { + return galleryThumbs(media.EmbedGallery_View.Items) + } if media.EmbedVideo_View != nil && media.EmbedVideo_View.Thumbnail != nil { return []string{*media.EmbedVideo_View.Thumbnail} } @@ -174,6 +180,31 @@ func imageThumbs(images []*appbsky.EmbedImages_ViewImage) []string { return urls } +// galleryThumbs returns the thumbnail URLs of image items in a gallery +// embed, or nil if empty. Items_Elem is a union; non-image variants and +// nil entries are skipped so future gallery item types don't break SEO +// extraction. Empty Thumbnail strings are also skipped to avoid emitting +// if the appview ever returns one. +func galleryThumbs(items []*appbsky.EmbedGallery_View_Items_Elem) []string { + if len(items) == 0 { + return nil + } + urls := make([]string, 0, len(items)) + for _, item := range items { + if item == nil || item.EmbedGallery_ViewImage == nil { + continue + } + if item.EmbedGallery_ViewImage.Thumbnail == "" { + continue + } + urls = append(urls, item.EmbedGallery_ViewImage.Thumbnail) + } + if len(urls) == 0 { + return nil + } + return urls +} + // extractQuotedPostURL returns the canonical URL of a quoted post, or "" // if the embed is blocked / not-found / detached / a non-post record. func extractQuotedPostURL(pv *appbsky.FeedDefs_PostView) string { diff --git a/bskyweb/cmd/bskyweb/jsonld_test.go b/bskyweb/cmd/bskyweb/jsonld_test.go index f14cdb6f78..5c7f1c2bb7 100644 --- a/bskyweb/cmd/bskyweb/jsonld_test.go +++ b/bskyweb/cmd/bskyweb/jsonld_test.go @@ -72,6 +72,60 @@ func withImages(thumbs ...string) func(*appbsky.FeedDefs_PostView) { } } +// withGallery adds an app.bsky.embed.gallery view with image items. +func withGallery(thumbs ...string) func(*appbsky.FeedDefs_PostView) { + return func(pv *appbsky.FeedDefs_PostView) { + var items []*appbsky.EmbedGallery_View_Items_Elem + for _, t := range thumbs { + items = append(items, &appbsky.EmbedGallery_View_Items_Elem{ + EmbedGallery_ViewImage: &appbsky.EmbedGallery_ViewImage{ + Thumbnail: t, + Fullsize: t + "_full", + }, + }) + } + pv.Embed = &appbsky.FeedDefs_PostView_Embed{ + EmbedGallery_View: &appbsky.EmbedGallery_View{Items: items}, + } + } +} + +// withRecordWithMediaGallery adds a record-with-media embed whose media slot +// is an app.bsky.embed.gallery view. +func withRecordWithMediaGallery(qHandle, qDid, qRkey string, thumbs ...string) func(*appbsky.FeedDefs_PostView) { + return func(pv *appbsky.FeedDefs_PostView) { + var items []*appbsky.EmbedGallery_View_Items_Elem + for _, t := range thumbs { + items = append(items, &appbsky.EmbedGallery_View_Items_Elem{ + EmbedGallery_ViewImage: &appbsky.EmbedGallery_ViewImage{ + Thumbnail: t, + Fullsize: t + "_full", + }, + }) + } + pv.Embed = &appbsky.FeedDefs_PostView_Embed{ + EmbedRecordWithMedia_View: &appbsky.EmbedRecordWithMedia_View{ + Record: &appbsky.EmbedRecord_View{ + Record: &appbsky.EmbedRecord_View_Record{ + EmbedRecord_ViewRecord: &appbsky.EmbedRecord_ViewRecord{ + Uri: "at://" + qDid + "/app.bsky.feed.post/" + qRkey, + Cid: "bafy-quoted", + Author: &appbsky.ActorDefs_ProfileViewBasic{ + Did: qDid, + Handle: qHandle, + }, + IndexedAt: "2024-01-01T00:00:00Z", + }, + }, + }, + Media: &appbsky.EmbedRecordWithMedia_View_Media{ + EmbedGallery_View: &appbsky.EmbedGallery_View{Items: items}, + }, + }, + } + } +} + // withVideo adds a video embed with a thumbnail. func withVideo(thumb string) func(*appbsky.FeedDefs_PostView) { return func(pv *appbsky.FeedDefs_PostView) { @@ -299,6 +353,88 @@ func TestBuildPostJSONLD_WithImages(t *testing.T) { } } +func TestBuildPostJSONLD_WithGallery(t *testing.T) { + thumb1 := "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:alice/g1@jpeg" + thumb2 := "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:alice/g2@jpeg" + thumb3 := "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:alice/g3@jpeg" + pv := makePostView("alice.bsky.social", "did:plc:alice", "abc123", "gallery", withGallery(thumb1, thumb2, thumb3)) + out, err := buildPostJSONLD(pv, nil, "https://bsky.app/profile/alice.bsky.social/post/abc123", hideEmbedLabels, hideReplyLabels) + if err != nil { + t.Fatal(err) + } + main := unmarshalLD(t, out)["mainEntity"].(map[string]any) + imgs, ok := main["image"].([]any) + if !ok { + t.Fatalf("image should be array, got %T", main["image"]) + } + if len(imgs) != 3 { + t.Errorf("expected 3 gallery images, got %d", len(imgs)) + } + if imgs[0] != thumb1 || imgs[1] != thumb2 || imgs[2] != thumb3 { + t.Errorf("gallery image[] order wrong: %v", imgs) + } + if main["thumbnailUrl"] != thumb1 { + t.Errorf("thumbnailUrl should equal image[0] (Google byte-equality requirement), got %v", main["thumbnailUrl"]) + } +} + +// Gallery in the media slot of a record-with-media embed should still +// produce og:image / JSON-LD image[]. Quote-post URL still emits +// alongside via isBasedOn. +func TestBuildPostJSONLD_GalleryInRecordWithMedia(t *testing.T) { + thumb := "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:alice/g@jpeg" + pv := makePostView("alice.bsky.social", "did:plc:alice", "abc123", "quote+gallery", + withRecordWithMediaGallery("bob.example.com", "did:plc:bob", "xyz", thumb)) + out, err := buildPostJSONLD(pv, nil, "u", hideEmbedLabels, hideReplyLabels) + if err != nil { + t.Fatal(err) + } + main := unmarshalLD(t, out)["mainEntity"].(map[string]any) + imgs, ok := main["image"].([]any) + if !ok || len(imgs) != 1 || imgs[0] != thumb { + t.Errorf("expected single gallery thumb in image[], got %v", main["image"]) + } + if main["thumbnailUrl"] != thumb { + t.Errorf("thumbnailUrl wrong: %v", main["thumbnailUrl"]) + } + if main["isBasedOn"] != "https://bsky.app/profile/bob.example.com/post/xyz" { + t.Errorf("isBasedOn should still emit for record-with-media gallery, got %v", main["isBasedOn"]) + } +} + +// Forward-compat: nil items, unknown-variant union elements, and empty +// Thumbnail strings must be skipped, not panic or leak as . Unknown variants are dropped silently +// so older deploys keep working when new gallery item types ship. +func TestExtractPostMedia_GallerySkipsUnknownItems(t *testing.T) { + thumb := "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:alice/g@jpeg" + pv := makePostView("alice.bsky.social", "did:plc:alice", "abc123", "gallery") + pv.Embed = &appbsky.FeedDefs_PostView_Embed{ + EmbedGallery_View: &appbsky.EmbedGallery_View{ + Items: []*appbsky.EmbedGallery_View_Items_Elem{ + nil, + {}, // empty union, no variant set + {EmbedGallery_ViewImage: &appbsky.EmbedGallery_ViewImage{Thumbnail: ""}}, // empty Thumbnail + {EmbedGallery_ViewImage: &appbsky.EmbedGallery_ViewImage{Thumbnail: thumb}}, + }, + }, + } + got := extractPostMedia(pv, false) + if len(got) != 1 || got[0] != thumb { + t.Errorf("expected single thumb, got %v", got) + } + + // All-nil / all-unknown gallery should produce no thumbs (not [""]). + pv.Embed = &appbsky.FeedDefs_PostView_Embed{ + EmbedGallery_View: &appbsky.EmbedGallery_View{ + Items: []*appbsky.EmbedGallery_View_Items_Elem{nil, {}}, + }, + } + if got := extractPostMedia(pv, false); got != nil { + t.Errorf("expected nil for empty/unknown-only gallery, got %v", got) + } +} + func TestBuildPostJSONLD_WithVideo(t *testing.T) { thumb := "https://cdn.bsky.app/img/video_thumbnail/plain/did:plc:alice/v@jpeg" pv := makePostView("alice.bsky.social", "did:plc:alice", "abc123", "watch", withVideo(thumb)) @@ -361,6 +497,25 @@ func TestBuildPostJSONLD_HiddenEmbed(t *testing.T) { } } +// Symmetric guard for the gallery extraction path. Functionally redundant +// with the early-return at the top of extractPostMedia, but exists so the +// hide-embed contract is asserted directly against the gallery branch - +// catches anyone who later moves the embedHidden check inside an +// embed-shape branch. +func TestBuildPostJSONLD_HiddenEmbed_Gallery(t *testing.T) { + thumb := "https://cdn.bsky.app/img/g@jpeg" + pv := makePostView("alice.bsky.social", "did:plc:alice", "abc123", "nsfw", + withGallery(thumb), withSelfLabel("porn")) + out, _ := buildPostJSONLD(pv, nil, "u", hideEmbedLabels, hideReplyLabels) + main := unmarshalLD(t, out)["mainEntity"].(map[string]any) + if _, present := main["image"]; present { + t.Errorf("hidden-embed gallery post should not emit image") + } + if _, present := main["thumbnailUrl"]; present { + t.Errorf("hidden-embed gallery post should not emit thumbnailUrl") + } +} + func TestBuildPostJSONLD_TextEscaping(t *testing.T) { // Includes ", \, newline, , and a unicode char. tricky := "hello \"world\" \\ <\\>\n 🎉" diff --git a/bskyweb/cmd/bskyweb/render_test.go b/bskyweb/cmd/bskyweb/render_test.go index f7c9edd677..30b27a53d5 100644 --- a/bskyweb/cmd/bskyweb/render_test.go +++ b/bskyweb/cmd/bskyweb/render_test.go @@ -98,6 +98,40 @@ func TestRenderPost_OGImageMatchesJSONLD(t *testing.T) { } } +// Gallery posts must hit the same og:image / JSON-LD image[] byte-equality +// contract that legacy images posts do. Regression guard for the +// app.bsky.embed.gallery extraction path. +func TestRenderPost_OGImageMatchesJSONLD_Gallery(t *testing.T) { + thumb1 := "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:alice/g1@jpeg" + thumb2 := "https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:alice/g2@jpeg" + pv := makePostView("alice.bsky.social", "did:plc:alice", "abc123", "gallery", withGallery(thumb1, thumb2)) + thumbs := extractPostMedia(pv, false) + ld, _ := buildPostJSONLD(pv, nil, "https://bsky.app/profile/alice.bsky.social/post/abc123", hideEmbedLabels, hideReplyLabels) + html := renderTemplate(t, "post.html", pongo2.Context{ + "postView": pv, + "requestURI": "https://bsky.app/profile/alice.bsky.social/post/abc123", + "canonicalURL": "https://bsky.app/profile/alice.bsky.social/post/abc123", + "postJSONLD": ld, + "imgThumbUrls": thumbs, + }) + + if !strings.Contains(html, ``) { + t.Errorf("og:image[0] not found in rendered HTML for gallery post") + } + if !strings.Contains(html, ``) { + t.Errorf("og:image[1] not found in rendered HTML for gallery post") + } + body := extractJSONLD(t, html) + var parsed map[string]any + _ = json.Unmarshal([]byte(body), &parsed) + main := parsed["mainEntity"].(map[string]any) + imgs := main["image"].([]any) + if len(imgs) != 2 || imgs[0] != thumb1 || main["thumbnailUrl"] != thumb1 { + t.Errorf("JSON-LD image strings drifted from og:image for gallery; image=%v thumbnailUrl=%v", + imgs, main["thumbnailUrl"]) + } +} + func TestRenderPost_FallsBackToCanonicalizeFilter(t *testing.T) { // Without canonicalURL, the template falls back to requestURI|canonicalize_url. pv := makePostView("alice.bsky.social", "did:plc:alice", "abc123", "hi") diff --git a/bskyweb/go.mod b/bskyweb/go.mod index 50ab9a162a..e25349e947 100644 --- a/bskyweb/go.mod +++ b/bskyweb/go.mod @@ -3,7 +3,7 @@ module github.com/bluesky-social/social-app/bskyweb go 1.26 require ( - github.com/bluesky-social/indigo v0.0.0-20260529183052-5368f55344e0 + github.com/bluesky-social/indigo v0.0.0-20260605210604-af2fec94f34c github.com/flosch/pongo2/v6 v6.0.0 github.com/ipfs/go-log v1.0.5 github.com/joho/godotenv v1.5.1 diff --git a/bskyweb/go.sum b/bskyweb/go.sum index 235e37f521..d9b4b0141a 100644 --- a/bskyweb/go.sum +++ b/bskyweb/go.sum @@ -2,8 +2,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bluesky-social/indigo v0.0.0-20260529183052-5368f55344e0 h1:eijBaF59A5c+kPqufH7YO1GOqDMkyUhtM9P9aAWtfJY= -github.com/bluesky-social/indigo v0.0.0-20260529183052-5368f55344e0/go.mod h1:JqQkz8lrOI6YZivP38GHmtVOTtzsNToITKj1gMpU5Jo= +github.com/bluesky-social/indigo v0.0.0-20260605210604-af2fec94f34c h1:Jr82+1HUmwwZzDpt/eeU4sieya27iXjuPMdXZkOXoBc= +github.com/bluesky-social/indigo v0.0.0-20260605210604-af2fec94f34c/go.mod h1:JqQkz8lrOI6YZivP38GHmtVOTtzsNToITKj1gMpU5Jo= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= From 986cf62da12db942a2f1493db209ed61fbc0b58f Mon Sep 17 00:00:00 2001 From: DS Boyce <260543580+ds-boyce@users.noreply.github.com> Date: Tue, 9 Jun 2026 09:35:49 -0700 Subject: [PATCH 125/149] Fix text truncating in image menu on iOS (#10802) --- src/components/Lightbox/chrome/ImageMenu.tsx | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/components/Lightbox/chrome/ImageMenu.tsx b/src/components/Lightbox/chrome/ImageMenu.tsx index 8daa9a5b84..92b5c47749 100644 --- a/src/components/Lightbox/chrome/ImageMenu.tsx +++ b/src/components/Lightbox/chrome/ImageMenu.tsx @@ -10,7 +10,7 @@ import Animated, { } from 'react-native-reanimated' import {useLingui} from '@lingui/react/macro' -import {android, atoms as a, ios} from '#/alf' +import {atoms as a} from '#/alf' import {ArrowShareRight_Stroke2_Corner2_Rounded as ShareIcon} from '#/components/icons/ArrowShareRight' import {type Props as IconProps} from '#/components/icons/common' import {DotGrid3x1_Stroke2_Corner0_Rounded as DotsIcon} from '#/components/icons/DotGrid' @@ -25,7 +25,6 @@ type Props = { type Anchor = {x: number; y: number; width: number; height: number} -const MENU_WIDTH = 160 const GAP = 6 const CARD_BG = '#000000' const CARD_BORDER = '#232e3e' @@ -124,9 +123,8 @@ function MenuCard({ Date: Tue, 9 Jun 2026 09:36:35 -0700 Subject: [PATCH 126/149] Display toast after reacting emoji reaction limit (#10799) --- eslint-suppressions.json | 5 ----- src/components/dms/ActionsWrapper.web.tsx | 15 ++++++++++++++- src/components/dms/MessageContextMenu.tsx | 15 ++++++++++++++- src/components/dms/MessageItem.tsx | 2 +- 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/eslint-suppressions.json b/eslint-suppressions.json index 59b062cc7b..559f1e564d 100644 --- a/eslint-suppressions.json +++ b/eslint-suppressions.json @@ -707,11 +707,6 @@ "count": 1 } }, - "src/components/dms/MessageItem.tsx": { - "@typescript-eslint/no-misused-promises": { - "count": 1 - } - }, "src/components/forms/DateField/index.web.tsx": { "@typescript-eslint/no-explicit-any": { "count": 1 diff --git a/src/components/dms/ActionsWrapper.web.tsx b/src/components/dms/ActionsWrapper.web.tsx index b89712bd1f..9ea12d7f9e 100644 --- a/src/components/dms/ActionsWrapper.web.tsx +++ b/src/components/dms/ActionsWrapper.web.tsx @@ -1,8 +1,10 @@ import {useCallback, useRef, useState} from 'react' import {Pressable, View} from 'react-native' import {type ChatBskyConvoDefs, type ModerationOpts} from '@atproto/api' +import {plural} from '@lingui/core/macro' import {useLingui} from '@lingui/react/macro' +import {EMOJI_REACTION_LIMIT} from '#/lib/constants' import {useMaybeProfileShadow} from '#/state/cache/profile-shadow' import {useConvoActive} from '#/state/messages/convo' import {useSession} from '#/state/session' @@ -72,7 +74,18 @@ export function ActionsWrapper({ .removeReaction(message.id, emoji) .catch(() => Toast.show(l`Failed to remove emoji reaction`)) } else { - if (hasReachedReactionLimit(message, currentAccount?.did)) return + if (hasReachedReactionLimit(message, currentAccount?.did)) { + Toast.show( + l`You cannot add more than ${plural(EMOJI_REACTION_LIMIT, { + one: '# emoji reaction', + other: '# emoji reactions', + })}`, + { + type: 'info', + }, + ) + return + } convo.addReaction(message.id, emoji).catch(() => Toast.show(l`Failed to add emoji reaction`, { type: 'error', diff --git a/src/components/dms/MessageContextMenu.tsx b/src/components/dms/MessageContextMenu.tsx index bc77c5bd79..7cd4febd5f 100644 --- a/src/components/dms/MessageContextMenu.tsx +++ b/src/components/dms/MessageContextMenu.tsx @@ -6,8 +6,10 @@ import { type ModerationOpts, RichText, } from '@atproto/api' +import {plural} from '@lingui/core/macro' import {useLingui} from '@lingui/react/macro' +import {EMOJI_REACTION_LIMIT} from '#/lib/constants' import {useGoogleTranslate} from '#/lib/hooks/useGoogleTranslate' import {richTextToString} from '#/lib/strings/rich-text-helpers' import {useMaybeProfileShadow} from '#/state/cache/profile-shadow' @@ -98,7 +100,18 @@ export let MessageContextMenu = ({ .removeReaction(message.id, emoji) .catch(() => Toast.show(l`Failed to remove emoji reaction`)) } else { - if (hasReachedReactionLimit(message, currentAccount?.did)) return + if (hasReachedReactionLimit(message, currentAccount?.did)) { + Toast.show( + l`You cannot add more than ${plural(EMOJI_REACTION_LIMIT, { + one: '# emoji reaction', + other: '# emoji reactions', + })}`, + { + type: 'info', + }, + ) + return + } convo.addReaction(message.id, emoji).catch(() => Toast.show(l`Failed to add emoji reaction`, { type: 'error', diff --git a/src/components/dms/MessageItem.tsx b/src/components/dms/MessageItem.tsx index f4f3cdacc3..e4081d590a 100644 --- a/src/components/dms/MessageItem.tsx +++ b/src/components/dms/MessageItem.tsx @@ -641,7 +641,7 @@ function BlockedPlaceholder({ {}} cta={l`Okay`} color="primary" /> {profile.viewer?.blocking && !profile.viewer.blockingByList && ( queueUnblock()} + onPress={() => void queueUnblock()} cta={l`Unblock`} color="secondary" /> From 3fdfebfe29c070f3687ea9980c44db87ed0f757b Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Tue, 9 Jun 2026 20:15:03 +0300 Subject: [PATCH 127/149] [Chat] Surface blocked members to top of group member list for owner (#10726) Co-authored-by: Claude Opus 4.8 (1M context) --- .../Messages/ConversationSettings/Member.tsx | 35 ++++++++++++++++++- .../ConversationSettings/MemberMenu.tsx | 10 ++++-- .../Messages/ConversationSettings/index.tsx | 7 ++++ .../Messages/ConversationSettings/prompts.tsx | 24 +++++++++++++ 4 files changed, 73 insertions(+), 3 deletions(-) diff --git a/src/screens/Messages/ConversationSettings/Member.tsx b/src/screens/Messages/ConversationSettings/Member.tsx index 9786e69f55..20cc0fee52 100644 --- a/src/screens/Messages/ConversationSettings/Member.tsx +++ b/src/screens/Messages/ConversationSettings/Member.tsx @@ -7,18 +7,22 @@ import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-disp import {logger} from '#/logger' import {useProfileShadow} from '#/state/cache/profile-shadow' import {useModerationOpts} from '#/state/preferences/moderation-opts' +import {useRemoveFromGroupChat} from '#/state/queries/messages/remove-from-group' import {useProfileFollowMutationQueue} from '#/state/queries/profile' import {useRequireAuth, useSession} from '#/state/session' import {atoms as a, native, useTheme, web} from '#/alf' +import {Button, ButtonText} from '#/components/Button' import { type ConvoWithDetails, type GroupConvoMember, } from '#/components/dms/util' import {createStaticClick, SimpleInlineLinkText} from '#/components/Link' import * as ProfileCard from '#/components/ProfileCard' +import * as Prompt from '#/components/Prompt' import * as Toast from '#/components/Toast' import {Text} from '#/components/Typography' import {MemberMenu} from './MemberMenu' +import {RemoveMemberPrompt} from './prompts' import {StatusBadge} from './StatusBadge' import {SubtleHoverWrapper} from './SubtleHoverWrapper' @@ -45,6 +49,14 @@ export function Member({ const [queueFollow] = useProfileFollowMutationQueue(profile, 'GroupChat') const requireAuth = useRequireAuth() + const removeMemberPrompt = Prompt.usePromptControl() + const {mutate: removeMembers} = useRemoveFromGroupChat(convo.view.id, { + onError: e => { + logger.error('Failed to remove group chat member', {message: e}) + Toast.show(l`Failed to remove group chat member`, {type: 'error'}) + }, + }) + const isFollowing = !!profile.viewer?.following const handleFollow = () => { @@ -101,6 +113,9 @@ export function Member({ )}` : l`Added by invite link` + // Surface a prominent remove button to the owner for blocked members. + const showRemoveButton = isOwner && !isSelf && !!isBlockedOrBlocking(profile) + return ( @@ -137,7 +152,17 @@ export function Member({ - {isSelf || isFollowing || isBlockedOrBlocking(profile) ? null : ( + {showRemoveButton ? ( + + ) : isSelf || isFollowing || isBlockedOrBlocking(profile) ? null : ( + {/* Mounted outside the showRemoveButton conditional: confirming the + prompt optimistically drops this row, so gating the prompt on the + button would unmount it mid-close and race the dismiss animation. */} + removeMembers({members: [profile.did]})} + /> ) } diff --git a/src/screens/Messages/ConversationSettings/MemberMenu.tsx b/src/screens/Messages/ConversationSettings/MemberMenu.tsx index aee0cbf54e..2d36bc115f 100644 --- a/src/screens/Messages/ConversationSettings/MemberMenu.tsx +++ b/src/screens/Messages/ConversationSettings/MemberMenu.tsx @@ -26,7 +26,7 @@ import * as Prompt from '#/components/Prompt' import * as Toast from '#/components/Toast' import {useAnalytics} from '#/analytics' import type * as bsky from '#/types/bsky' -import {BlockMemberPrompt} from './prompts' +import {BlockMemberPrompt, RemoveMemberPrompt} from './prompts' import {StatusBadge} from './StatusBadge' export function MemberMenu({ @@ -50,6 +50,7 @@ export function MemberMenu({ const requireEmailVerification = useRequireEmailVerification() const blockMemberPrompt = Prompt.usePromptControl() + const removeMemberPrompt = Prompt.usePromptControl() const [menuDidOpen, setMenuDidOpen] = useState(false) const {data: convoAvailability} = useGetConvoAvailabilityQuery(profile.did, { @@ -227,7 +228,7 @@ export function MemberMenu({ removeMembers({members: [profile.did]})}> + onPress={removeMemberPrompt.open}> Remove from chat @@ -241,6 +242,11 @@ export function MemberMenu({ control={blockMemberPrompt} onConfirm={() => void handleBlockMember()} /> + removeMembers({members: [profile.did]})} + /> ) } diff --git a/src/screens/Messages/ConversationSettings/index.tsx b/src/screens/Messages/ConversationSettings/index.tsx index b4c7e1ce03..2aca54dfe0 100644 --- a/src/screens/Messages/ConversationSettings/index.tsx +++ b/src/screens/Messages/ConversationSettings/index.tsx @@ -11,6 +11,7 @@ import {useNavigation} from '@react-navigation/native' import {HITSLOP_10} from '#/lib/constants' import {useBottomBarOffset} from '#/lib/hooks/useBottomBarOffset' import {useInitialNumToRender} from '#/lib/hooks/useInitialNumToRender' +import {isBlockedOrBlocking} from '#/lib/moderation/blocked-and-muted' import { type CommonNavigatorParams, type NativeStackScreenProps, @@ -214,6 +215,12 @@ function GroupSettings({ const bIsSelf = b.did === currentAccount?.did if (aIsOwner !== bIsOwner) return aIsOwner ? -1 : 1 if (aIsSelf !== bIsSelf) return aIsSelf ? -1 : 1 + // Surface blocked members to the owner so they can be removed. + if (isOwner) { + const aBlocked = !!isBlockedOrBlocking(a) + const bBlocked = !!isBlockedOrBlocking(b) + if (aBlocked !== bBlocked) return aBlocked ? -1 : 1 + } return 0 }) diff --git a/src/screens/Messages/ConversationSettings/prompts.tsx b/src/screens/Messages/ConversationSettings/prompts.tsx index 2eb293bdef..0c3ba2e8ca 100644 --- a/src/screens/Messages/ConversationSettings/prompts.tsx +++ b/src/screens/Messages/ConversationSettings/prompts.tsx @@ -151,6 +151,30 @@ export function LeaveAndLockChatPrompt({ ) } +export function RemoveMemberPrompt({ + control, + displayName, + onConfirm, +}: { + control: Dialog.DialogOuterProps['control'] + displayName: string + onConfirm: () => void +}) { + const {t: l} = useLingui() + + return ( + + ) +} + export function BlockMemberPrompt({ control, onConfirm, From df8c731f1d1b5fd1bbb5e9a48f7aa7b2a163c36d Mon Sep 17 00:00:00 2001 From: DS Boyce <260543580+ds-boyce@users.noreply.github.com> Date: Tue, 9 Jun 2026 10:16:00 -0700 Subject: [PATCH 128/149] Fix back button behavior on conversation settings screen (#10801) Co-authored-by: Samuel Newman --- .../Messages/ConversationSettings/index.tsx | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/screens/Messages/ConversationSettings/index.tsx b/src/screens/Messages/ConversationSettings/index.tsx index 2aca54dfe0..0cade00dc3 100644 --- a/src/screens/Messages/ConversationSettings/index.tsx +++ b/src/screens/Messages/ConversationSettings/index.tsx @@ -55,6 +55,7 @@ import {Loader} from '#/components/Loader' import * as Prompt from '#/components/Prompt' import * as Toast from '#/components/Toast' import {Text} from '#/components/Typography' +import {IS_WEB} from '#/env' import * as bsky from '#/types/bsky' import {InviteLinkDialog} from '../components/InviteLinkDialog' import {AddMembersLink} from './AddMembersLink' @@ -87,12 +88,23 @@ type Props = NativeStackScreenProps< > export function MessagesConversationSettingsScreen({route}: Props) { + const navigation = useNavigation() + const convoId = route.params.conversation return ( - + { + if (IS_WEB && !navigation.canGoBack()) { + evt.preventDefault() + navigation.navigate('MessagesConversation', { + conversation: convoId, + }) + } + }} + /> Group chat settings From 994e27ded1533b8eb8b4cc2515920a135da7c80e Mon Sep 17 00:00:00 2001 From: DS Boyce <260543580+ds-boyce@users.noreply.github.com> Date: Tue, 9 Jun 2026 10:45:50 -0700 Subject: [PATCH 129/149] Don't suggest users who can't be messaged/added (#10820) --- src/components/dms/AddMembersFlow.tsx | 7 +------ src/components/dms/InitiateChatFlow.tsx | 5 +---- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/components/dms/AddMembersFlow.tsx b/src/components/dms/AddMembersFlow.tsx index ae2945d2ce..0c0b171e02 100644 --- a/src/components/dms/AddMembersFlow.tsx +++ b/src/components/dms/AddMembersFlow.tsx @@ -209,6 +209,7 @@ export function AddMembersFlow({ if (follows) { for (const page of follows.pages) { for (const profile of page.follows) { + if (!canBeAddedToGroup(profile)) continue _items.push({ type: 'profile', key: profile.did, @@ -216,12 +217,6 @@ export function AddMembersFlow({ }) } } - - _items.sort(item => { - return item.type === 'profile' && canBeAddedToGroup(item.profile) - ? -1 - : 1 - }) } else { for (let i = 0; i < 10; i++) { _items.push({type: 'placeholder', key: i + ''}) diff --git a/src/components/dms/InitiateChatFlow.tsx b/src/components/dms/InitiateChatFlow.tsx index ed519fed23..b42357585d 100644 --- a/src/components/dms/InitiateChatFlow.tsx +++ b/src/components/dms/InitiateChatFlow.tsx @@ -303,6 +303,7 @@ export function InitiateChatFlow({ if (follows) { for (const page of follows.pages) { for (const profile of page.follows) { + if (!checker(profile)) continue _items.push({ type: 'profile', key: profile.did, @@ -310,10 +311,6 @@ export function InitiateChatFlow({ }) } } - - _items = _items.sort(item => { - return item.type === 'profile' && checker(item.profile) ? -1 : 1 - }) } else { _items.push(...placeholders) } From 6ba5154bcc3e3c28fb53e4ede45b0c394e753cfb Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Tue, 9 Jun 2026 21:07:45 +0300 Subject: [PATCH 130/149] [Chat] Show invite link label in chat list preview (#10811) Co-authored-by: Claude Opus 4.8 (1M context) --- src/components/dms/getMessageInfo.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/components/dms/getMessageInfo.ts b/src/components/dms/getMessageInfo.ts index 4eade5cb62..b506dcce65 100644 --- a/src/components/dms/getMessageInfo.ts +++ b/src/components/dms/getMessageInfo.ts @@ -1,4 +1,8 @@ -import {AppBskyEmbedRecord, ChatBskyConvoDefs} from '@atproto/api' +import { + AppBskyEmbedRecord, + ChatBskyConvoDefs, + ChatBskyEmbedJoinLink, +} from '@atproto/api' import {type I18n} from '@lingui/core' import {msg} from '@lingui/core/macro' @@ -83,6 +87,8 @@ export function getMessageInfo({ } else { message = prefix(defaultEmbeddedContentMessage) } + } else if (ChatBskyEmbedJoinLink.isView(lastMessage.embed)) { + message = prefix(i18n._(msg`(chat invite link)`)) } else { message = prefix(defaultEmbeddedContentMessage) } From de5ae0480930117b975f0bfa9c94a4c76dce0335 Mon Sep 17 00:00:00 2001 From: DS Boyce <260543580+ds-boyce@users.noreply.github.com> Date: Tue, 9 Jun 2026 11:35:45 -0700 Subject: [PATCH 131/149] Fix link to profile from chat invite embed (#10822) --- src/components/dms/ChatInvite/Card.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/dms/ChatInvite/Card.tsx b/src/components/dms/ChatInvite/Card.tsx index 05829d9047..33183f82cb 100644 --- a/src/components/dms/ChatInvite/Card.tsx +++ b/src/components/dms/ChatInvite/Card.tsx @@ -7,7 +7,7 @@ import {makeProfileLink} from '#/lib/routes/links' import {sanitizeHandle} from '#/lib/strings/handles' import {atoms as a, useTheme} from '#/alf' import {AvatarBubbles} from '#/components/AvatarBubbles' -import {SimpleInlineLinkText} from '#/components/Link' +import {InlineLinkText} from '#/components/Link' import {ProfileBadges} from '#/components/ProfileBadges' import {Text} from '#/components/Typography' import {useChatInvite} from './Context' @@ -78,12 +78,12 @@ export function Card({size}: {size: 'large' | 'small'}) { allowFontScaling={!hasFixedHeight}> By{' '} - {ownerDisplayName} - + Date: Tue, 9 Jun 2026 11:36:08 -0700 Subject: [PATCH 132/149] Address chat design nits (#10823) --- src/components/dms/InitiateChatFlow.tsx | 3 +-- src/components/dms/MessageItem.tsx | 2 +- src/screens/Messages/components/InviteLinkDialog.tsx | 3 ++- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/dms/InitiateChatFlow.tsx b/src/components/dms/InitiateChatFlow.tsx index b42357585d..5eb2ec3705 100644 --- a/src/components/dms/InitiateChatFlow.tsx +++ b/src/components/dms/InitiateChatFlow.tsx @@ -514,7 +514,6 @@ export function InitiateChatFlow({ a.relative, a.align_center, a.justify_between, - web(a.pb_lg), ]}> {IS_NATIVE ? ( ) : showButton ? ( + + + ) + + if (isLoading || !hasMutualGroupChats) { + return ( + + {listHeader} + {isLoading ? ( + + + + ) : null} + {footer} + + ) + } + + return ( + + + + ) : null + } + footer={ + setFooterHeight(evt.nativeEvent.layout.height)}> + {footer} + + } + contentContainerStyle={[a.gap_0, {paddingBottom: footerHeight}]} + scrollIndicatorInsets={{top: headerHeight, bottom: footerHeight}} + onEndReached={() => void onEndReached()} + onEndReachedThreshold={0.5} + style={[web([{maxWidth: 420}])]} + /> + ) +} + +function MutualGroupChat({ + view, + profileDid, + currentConvoId, + onOptimisticallyRemoveConvo, + onRestoreConvo, +}: { + view: ChatBskyConvoDefs.ConvoView + profileDid: string + currentConvoId?: string + onOptimisticallyRemoveConvo: (convoId: string) => void + onRestoreConvo: (convoId: string) => void +}) { + const t = useTheme() + const {t: l} = useLingui() + const {currentAccount} = useSession() + const queryClient = useQueryClient() + + const convo = parseConvoView(view, currentAccount?.did) + + const {mutate: leaveConvo, isPending: isLeavePending} = useLeaveConvo( + convo?.view.id, + { + onSuccess: () => { + Toast.show(l`Left group chat.`) + void queryClient.invalidateQueries({ + queryKey: createListMutualGroupsQueryKey({subject: profileDid}), + }) + }, + onError: error => { + onRestoreConvo(view.id) + logger.error('Error leaving group chat', {message: error}) + let errorMessage = l`Could not leave chat.` + if (isNetworkError(error)) { + errorMessage = l`A network error occurred. Please check your internet connection.` + } else if (error instanceof ChatBskyConvoLeaveConvo.InvalidConvoError) { + errorMessage = l`Chat not found.` + } else if ( + error instanceof ChatBskyConvoLeaveConvo.OwnerCannotLeaveError + ) { + errorMessage = l`Chat owners cannot leave a group chat.` + } + Toast.show(errorMessage, {type: 'error'}) + }, + }, + ) + + const {mutate: removeMembers, isPending: isRemovePending} = + useRemoveFromGroupChat(convo?.view.id, { + onSuccess: () => { + Toast.show(l`Member removed from group chat.`) + void queryClient.invalidateQueries({ + queryKey: createListMutualGroupsQueryKey({subject: profileDid}), + }) + }, + onError: error => { + onRestoreConvo(view.id) + logger.error('Error removing group chat member', {message: error}) + let errorMessage = l`Could not remove member.` + if (isNetworkError(error)) { + errorMessage = l`A network error occurred. Please check your internet connection.` + } else if ( + error instanceof ChatBskyGroupRemoveMembers.InvalidConvoError + ) { + errorMessage = l`Chat not found.` + } else if ( + error instanceof ChatBskyGroupRemoveMembers.InsufficientRoleError + ) { + errorMessage = l`You must be a chat owner to remove a member.` + } + Toast.show(errorMessage, {type: 'error'}) + }, + }) + + if (!convo || convo.kind !== 'group') return null + + const owner = convo.primaryMember + const isViewerOwner = owner?.did != null && owner.did === currentAccount?.did + const isProfileOwner = owner?.did != null && owner.did === profileDid + const isCurrentConvo = view.id === currentConvoId + + return ( + + + + + + {convo.details.name} + + {isViewerOwner ? ( + + You own this chat + + ) : isProfileOwner ? ( + + They own this chat + + ) : null} + + + {isViewerOwner ? ( + + ) : isCurrentConvo ? ( + + Current chat + + ) : ( + + )} + + ) +} diff --git a/src/screens/Messages/ConversationSettings/MemberMenu.tsx b/src/screens/Messages/ConversationSettings/MemberMenu.tsx index 2d36bc115f..60b5b5e2eb 100644 --- a/src/screens/Messages/ConversationSettings/MemberMenu.tsx +++ b/src/screens/Messages/ConversationSettings/MemberMenu.tsx @@ -22,11 +22,12 @@ import { PersonX_Stroke2_Corner0_Rounded as PersonXIcon, } from '#/components/icons/Person' import * as Menu from '#/components/Menu' +import {BlockDialog} from '#/components/moderation/BlockDialog' import * as Prompt from '#/components/Prompt' import * as Toast from '#/components/Toast' import {useAnalytics} from '#/analytics' import type * as bsky from '#/types/bsky' -import {BlockMemberPrompt, RemoveMemberPrompt} from './prompts' +import {RemoveMemberPrompt} from './prompts' import {StatusBadge} from './StatusBadge' export function MemberMenu({ @@ -238,9 +239,11 @@ export function MemberMenu({ - void handleBlockMember()} + profile={profile} + onBlock={handleBlockMember} + currentConvoId={convoId} /> ) } - -export function BlockMemberPrompt({ - control, - onConfirm, -}: { - control: Dialog.DialogOuterProps['control'] - onConfirm: () => void -}) { - const {t: l} = useLingui() - - return ( - - ) -} diff --git a/src/state/queries/messages/list-mutual-groups.ts b/src/state/queries/messages/list-mutual-groups.ts new file mode 100644 index 0000000000..9ff4a1da09 --- /dev/null +++ b/src/state/queries/messages/list-mutual-groups.ts @@ -0,0 +1,39 @@ +import {useInfiniteQuery} from '@tanstack/react-query' + +import {DM_SERVICE_HEADERS} from '#/lib/constants' +import {createQueryKey} from '#/state/queries/util' +import {useAgent} from '#/state/session' + +const listMutualGroupsQueryKeyRoot = 'list-mutual-groups' + +export const createListMutualGroupsQueryKey = (args: {subject: string}) => + createQueryKey(listMutualGroupsQueryKeyRoot, args) + +export function useListMutualGroupsQuery({ + subject, + enabled, + limit = 20, +}: { + subject: string | undefined + enabled?: boolean + limit?: number +}) { + const agent = useAgent() + const isEnabled = enabled !== false && !!subject + + return useInfiniteQuery({ + gcTime: 0, + staleTime: 0, + enabled: isEnabled, + queryKey: createListMutualGroupsQueryKey({subject: subject ?? ''}), + queryFn: async ({pageParam}) => { + const {data} = await agent.chat.bsky.group.listMutualGroups( + {subject: subject!, cursor: pageParam, limit}, + {headers: DM_SERVICE_HEADERS}, + ) + return data + }, + initialPageParam: undefined as string | undefined, + getNextPageParam: page => page.cursor, + }) +} diff --git a/src/view/com/profile/ProfileMenu.tsx b/src/view/com/profile/ProfileMenu.tsx index 51edee1903..5e6c266ea8 100644 --- a/src/view/com/profile/ProfileMenu.tsx +++ b/src/view/com/profile/ProfileMenu.tsx @@ -1,8 +1,6 @@ import {memo, useCallback, useMemo} from 'react' import {type AppBskyActorDefs} from '@atproto/api' -import {msg} from '@lingui/core/macro' -import {useLingui} from '@lingui/react' -import {Trans} from '@lingui/react/macro' +import {Trans, useLingui} from '@lingui/react/macro' import {useNavigation} from '@react-navigation/native' import {useQueryClient} from '@tanstack/react-query' @@ -46,6 +44,7 @@ import {PlusLarge_Stroke2_Corner0_Rounded as Plus} from '#/components/icons/Plus import {SpeakerVolumeFull_Stroke2_Corner0_Rounded as Unmute} from '#/components/icons/Speaker' import {StarterPack} from '#/components/icons/StarterPack' import * as Menu from '#/components/Menu' +import {BlockDialog} from '#/components/moderation/BlockDialog' import { ReportDialog, useReportDialogControl, @@ -72,7 +71,7 @@ let ProfileMenu = ({ }): React.ReactNode => { const t = useTheme() const ax = useAnalytics() - const {_} = useLingui() + const {t: l} = useLingui() const {currentAccount, hasSession} = useSession() const {openModal} = useModalControls() const reportDialogControl = useReportDialogControl() @@ -116,7 +115,7 @@ let ProfileMenu = ({ }, [currentAccount, profile]) const invalidateProfileQuery = useCallback(() => { - queryClient.invalidateQueries({ + void queryClient.invalidateQueries({ queryKey: profileQueryKey(profile.did), }) }, [queryClient, profile.did]) @@ -124,10 +123,10 @@ let ProfileMenu = ({ const onPressAddToStarterPacks = useCallback(() => { ax.metric('profile:addToStarterPack', {}) addToStarterPacksDialogControl.open() - }, [addToStarterPacksDialogControl]) + }, [addToStarterPacksDialogControl, ax]) const onPressShare = useCallback(() => { - shareUrl(toShareUrl(makeProfileLink(profile))) + void shareUrl(toShareUrl(makeProfileLink(profile))) }, [profile]) const onPressAddRemoveLists = useCallback(() => { @@ -145,11 +144,12 @@ let ProfileMenu = ({ if (profile.viewer?.muted) { try { await queueUnmute() - Toast.show(_(msg({message: 'Account unmuted', context: 'toast'}))) - } catch (e: any) { + Toast.show(l({message: 'Account unmuted', context: 'toast'})) + } catch (err) { + const e = err as Error if (e?.name !== 'AbortError') { ax.logger.error('Failed to unmute account', {message: e}) - Toast.show(_(msg`There was an issue! ${e.toString()}`), { + Toast.show(l`There was an issue! ${e.toString()}`, { type: 'error', }) } @@ -157,27 +157,29 @@ let ProfileMenu = ({ } else { try { await queueMute() - Toast.show(_(msg({message: 'Account muted', context: 'toast'}))) - } catch (e: any) { + Toast.show(l({message: 'Account muted', context: 'toast'})) + } catch (err) { + const e = err as Error if (e?.name !== 'AbortError') { ax.logger.error('Failed to mute account', {message: e}) - Toast.show(_(msg`There was an issue! ${e.toString()}`), { + Toast.show(l`There was an issue! ${e.toString()}`, { type: 'error', }) } } } - }, [ax, profile.viewer?.muted, queueUnmute, _, queueMute]) + }, [ax, profile.viewer?.muted, queueUnmute, l, queueMute]) const blockAccount = useCallback(async () => { if (profile.viewer?.blocking) { try { await queueUnblock() - Toast.show(_(msg({message: 'Account unblocked', context: 'toast'}))) - } catch (e: any) { + Toast.show(l({message: 'Account unblocked', context: 'toast'})) + } catch (err) { + const e = err as Error if (e?.name !== 'AbortError') { ax.logger.error('Failed to unblock account', {message: e}) - Toast.show(_(msg`There was an issue! ${e.toString()}`), { + Toast.show(l`There was an issue! ${e.toString()}`, { type: 'error', }) } @@ -185,56 +187,59 @@ let ProfileMenu = ({ } else { try { await queueBlock() - Toast.show(_(msg({message: 'Account blocked', context: 'toast'}))) - } catch (e: any) { + Toast.show(l({message: 'Account blocked', context: 'toast'})) + } catch (err) { + const e = err as Error if (e?.name !== 'AbortError') { ax.logger.error('Failed to block account', {message: e}) - Toast.show(_(msg`There was an issue! ${e.toString()}`), { + Toast.show(l`There was an issue! ${e.toString()}`, { type: 'error', }) } } } - }, [ax, profile.viewer?.blocking, _, queueUnblock, queueBlock]) + }, [ax, profile.viewer?.blocking, l, queueUnblock, queueBlock]) const onPressFollowAccount = useCallback(async () => { try { await queueFollow() - Toast.show(_(msg({message: 'Account followed', context: 'toast'}))) - } catch (e: any) { + Toast.show(l({message: 'Account followed', context: 'toast'})) + } catch (err) { + const e = err as Error if (e?.name !== 'AbortError') { ax.logger.error('Failed to follow account', {message: e}) - Toast.show(_(msg`There was an issue! ${e.toString()}`), { + Toast.show(l`There was an issue! ${e.toString()}`, { type: 'error', }) } } - }, [_, ax, queueFollow]) + }, [l, ax, queueFollow]) const onPressUnfollowAccount = useCallback(async () => { try { await queueUnfollow() - Toast.show(_(msg({message: 'Account unfollowed', context: 'toast'}))) - } catch (e: any) { + Toast.show(l({message: 'Account unfollowed', context: 'toast'})) + } catch (err) { + const e = err as Error if (e?.name !== 'AbortError') { ax.logger.error('Failed to unfollow account', {message: e}) - Toast.show(_(msg`There was an issue! ${e.toString()}`), { + Toast.show(l`There was an issue! ${e.toString()}`, { type: 'error', }) } } - }, [_, ax, queueUnfollow]) + }, [l, ax, queueUnfollow]) const onPressReportAccount = useCallback(() => { reportDialogControl.open() }, [reportDialogControl]) const onPressShareATUri = useCallback(() => { - shareText(`at://${profile.did}`) + void shareText(`at://${profile.did}`) }, [profile.did]) const onPressShareDID = useCallback(() => { - shareText(profile.did) + void shareText(profile.did) }, [profile.did]) const onPressSearch = useCallback(() => { @@ -251,14 +256,14 @@ let ProfileMenu = ({ return ( - + {({props}) => { return ( <> - {statusNudgeActive && } ) @@ -278,9 +282,7 @@ let ProfileMenu = ({ { if (showLoggedOutWarning) { loggedOutWarningPromptControl.open() @@ -301,7 +303,7 @@ let ProfileMenu = ({ Search posts @@ -320,14 +322,12 @@ let ProfileMenu = ({ void onPressUnfollowAccount() + : () => void onPressFollowAccount() }> {isFollowing ? ( @@ -343,7 +343,7 @@ let ProfileMenu = ({ )} Add to starter packs @@ -352,7 +352,7 @@ let ProfileMenu = ({ Add to lists @@ -364,10 +364,10 @@ let ProfileMenu = ({ testID="profileHeaderDropdownListAddRemoveBtn" label={ status.isDisabled - ? _(msg`Go live (disabled)`) + ? l`Go live (disabled)` : status.isActive - ? _(msg`Edit live status`) - : _(msg`Go live`) + ? l`Edit live status` + : l`Go live` } onPress={() => { if (status.isDisabled) { @@ -418,7 +418,7 @@ let ProfileMenu = ({ (verification.viewer.hasIssuedVerification ? ( verificationRemovePromptControl.open()}> Remove verification @@ -428,7 +428,7 @@ let ProfileMenu = ({ ) : ( verificationCreatePromptControl.open()}> Verify account @@ -444,10 +444,10 @@ let ProfileMenu = ({ testID="profileHeaderDropdownMuteBtn" label={ profile.viewer?.muted - ? _(msg`Unmute account`) - : _(msg`Mute account`) + ? l`Unmute account` + : l`Mute account` } - onPress={onPressMuteAccount}> + onPress={() => void onPressMuteAccount()}> {profile.viewer?.muted ? ( Unmute account @@ -464,9 +464,9 @@ let ProfileMenu = ({ blockPromptControl.open()}> @@ -485,7 +485,7 @@ let ProfileMenu = ({ )} Report account @@ -503,7 +503,7 @@ let ProfileMenu = ({ Copy at:// URI @@ -512,7 +512,7 @@ let ProfileMenu = ({ Copy DID @@ -524,12 +524,10 @@ let ProfileMenu = ({ ) : null} - - - - - - - {status.isDisabled ? ( Date: Tue, 9 Jun 2026 22:24:28 +0300 Subject: [PATCH 134/149] [Chat] add lil gap between chats on web (#10821) --- src/screens/Messages/components/ChatListItem.tsx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/screens/Messages/components/ChatListItem.tsx b/src/screens/Messages/components/ChatListItem.tsx index d60b5f56c2..0bef7b84a4 100644 --- a/src/screens/Messages/components/ChatListItem.tsx +++ b/src/screens/Messages/components/ChatListItem.tsx @@ -40,11 +40,11 @@ import {getReactionInfo} from '#/components/dms/getReactionInfo' import {getSystemMessageInfo} from '#/components/dms/getSystemMessageInfo' import {LeaveConvoPrompt} from '#/components/dms/LeaveConvoPrompt' import {type ConvoWithDetails, parseConvoView} from '#/components/dms/util' -import {Bell2Off_Filled_Corner0_Rounded as BellStroke} from '#/components/icons/Bell2' +import {Bell2Off_Filled_Corner0_Rounded as BellStrokeIcon} from '#/components/icons/Bell2' import {type Props as SVGIconProps} from '#/components/icons/common' -import {Envelope_Open_Stroke2_Corner0_Rounded as EnvelopeOpen} from '#/components/icons/EnveopeOpen' +import {Envelope_Open_Stroke2_Corner0_Rounded as EnvelopeOpenIcon} from '#/components/icons/EnveopeOpen' import {Lock_Stroke2_Corner2_Rounded as LockIcon} from '#/components/icons/Lock' -import {Trash_Stroke2_Corner0_Rounded} from '#/components/icons/Trash' +import {Trash_Stroke2_Corner0_Rounded as TrashIcon} from '#/components/icons/Trash' import {Link} from '#/components/Link' import {useMenuControl} from '#/components/Menu' import {PostAlerts} from '#/components/moderation/PostAlerts' @@ -423,7 +423,7 @@ function BaseChatItem({ const markReadAction = { threshold: 120, color: t.palette.primary_500, - icon: EnvelopeOpen, + icon: EnvelopeOpenIcon, action: () => { markAsRead({ convoId: convo.view.id, @@ -434,7 +434,7 @@ function BaseChatItem({ const deleteAction = { threshold: 225, color: t.palette.negative_500, - icon: Trash_Stroke2_Corner0_Rounded, + icon: TrashIcon, action: () => { leaveConvoControl.open() }, @@ -509,7 +509,7 @@ function BaseChatItem({ a.px_lg, a.py_md, a.gap_md, - isWithinLeftPanel && a.rounded_sm, + isWithinLeftPanel && [a.rounded_sm, a.mt_2xs], { backgroundColor: hasUnread ? t.palette.primary_25 @@ -574,7 +574,7 @@ function BaseChatItem({ web({whiteSpace: 'preserve nowrap'}), ]}> {' '} - From 0558e8b79ad96eeb589ed9182fc8a8fbd4913950 Mon Sep 17 00:00:00 2001 From: DS Boyce <260543580+ds-boyce@users.noreply.github.com> Date: Tue, 9 Jun 2026 12:40:35 -0700 Subject: [PATCH 135/149] Change Ignore to Reject for chat invites (#10825) --- src/screens/Messages/JoinRequests.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/screens/Messages/JoinRequests.tsx b/src/screens/Messages/JoinRequests.tsx index 5198cd7f19..a5bbdd10ce 100644 --- a/src/screens/Messages/JoinRequests.tsx +++ b/src/screens/Messages/JoinRequests.tsx @@ -474,14 +474,14 @@ function RejectButton({ return ( From 7f6cfaee7104aa3f765567f2256af952e48cb712 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Tue, 9 Jun 2026 15:15:37 -0500 Subject: [PATCH 136/149] Fix image collapse in FF (#10826) --- src/components/MediaPreview.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/MediaPreview.tsx b/src/components/MediaPreview.tsx index 9ab631dc36..25a0750b35 100644 --- a/src/components/MediaPreview.tsx +++ b/src/components/MediaPreview.tsx @@ -154,7 +154,7 @@ export function ImageItem({ } return ( - + Date: Tue, 9 Jun 2026 15:54:16 -0500 Subject: [PATCH 137/149] Hide domain if matches handle, new Standard Site icon treatment (#10767) --- .../StandardSiteEmbed/StandardSiteMetaRow.tsx | 37 ++++--------------- .../Post/Embed/StandardSiteEmbed/index.tsx | 27 +++++++++++++- 2 files changed, 34 insertions(+), 30 deletions(-) diff --git a/src/components/Post/Embed/StandardSiteEmbed/StandardSiteMetaRow.tsx b/src/components/Post/Embed/StandardSiteEmbed/StandardSiteMetaRow.tsx index 8c1187216c..837f1b4a05 100644 --- a/src/components/Post/Embed/StandardSiteEmbed/StandardSiteMetaRow.tsx +++ b/src/components/Post/Embed/StandardSiteEmbed/StandardSiteMetaRow.tsx @@ -1,13 +1,10 @@ import {Fragment, type ReactNode} from 'react' import {View} from 'react-native' import {AtUri} from '@atproto/api' -import {Trans, useLingui} from '@lingui/react/macro' +import {Trans} from '@lingui/react/macro' -import {makeProfileLink} from '#/lib/routes/links' import {toNiceDomain} from '#/lib/strings/url-helpers' import {atoms as a, useTheme} from '#/alf' -import {StandardSite} from '#/components/icons/community/StandardSite' -import {InlineLinkText} from '#/components/Link' import { matchStandardSitePublisher, matchStandardSitePublisherByUri, @@ -18,19 +15,15 @@ import { isStandardSitePublicationUri, } from '#/components/Post/Embed/StandardSiteEmbed/utils' import {Text} from '#/components/Typography' -import {useAnalytics} from '#/analytics' export function StandardSiteMetaRow({ type = 'document', - preview, view, }: ssTypes.CommonProps & ssTypes.PreviewProps & { type?: 'document' | 'publication' }) { - const ax = useAnalytics() const t = useTheme() - const {t: l} = useLingui() const highlightedPublisher = !!matchStandardSitePublisher(view) const didsFromRecords = view.associatedRefs @@ -47,7 +40,11 @@ export function StandardSiteMetaRow({ : undefined const articleDomain = toNiceDomain(view.uri) const articlePublisher = matchStandardSitePublisherByUri(view.uri) - const DomainIcon = articlePublisher?.Icon || StandardSite + const domainHandleMatch = + authorProfile?.handle && + (articleDomain === authorProfile.handle || + articleDomain.endsWith(`.${authorProfile.handle}`)) + const DomainIcon = articlePublisher?.Icon const metaTextStyle = [ a.text_xs, a.leading_tight, @@ -56,7 +53,7 @@ export function StandardSiteMetaRow({ const items: {key: string; node: ReactNode}[] = [] - if (!highlightedPublisher) { + if (!highlightedPublisher && !domainHandleMatch) { items.push({ key: 'domain', node: ( @@ -77,25 +74,7 @@ export function StandardSiteMetaRow({ key: 'author', node: ( - - by{' '} - { - e.stopPropagation() - e.preventDefault() - ax.metric('embed:standardSite:authorHandle:press', { - handle: authorProfile.handle, - }) - }}> - @{authorProfile.handle} - - + by @{authorProfile.handle} ), }) diff --git a/src/components/Post/Embed/StandardSiteEmbed/index.tsx b/src/components/Post/Embed/StandardSiteEmbed/index.tsx index b328bc38ff..dc60db53ad 100644 --- a/src/components/Post/Embed/StandardSiteEmbed/index.tsx +++ b/src/components/Post/Embed/StandardSiteEmbed/index.tsx @@ -15,6 +15,7 @@ import {Divider} from '#/components/Divider' import {useInteractionState} from '#/components/hooks/useInteractionState' import {ArrowTopRight_Stroke2_Corner0_Rounded as ArrowTopRightIcon} from '#/components/icons/Arrow' import {Clock_Stroke2_Corner0_Rounded as Clock} from '#/components/icons/Clock' +import {StandardSite} from '#/components/icons/community/StandardSite' import {Link} from '#/components/Link' import {MediaInsetBorder} from '#/components/MediaInsetBorder' import {matchStandardSitePublisher} from '#/components/Post/Embed/StandardSiteEmbed/publishers' @@ -535,8 +536,9 @@ function PublicationIcon({ interacted?: boolean themeColors: ssTypes.ThemeColors }) { + const t = useTheme() if (!view.source) return null - return view.source?.icon ? ( + const icon = view.source?.icon ? ( ) + return ( + + + + + + {icon} + + ) } export function PublicationFooter({ From 38fb9c21651bf17e7e0b4032314a20b3319c3a1f Mon Sep 17 00:00:00 2001 From: Michael Black Date: Tue, 9 Jun 2026 15:54:54 -0500 Subject: [PATCH 138/149] bskyweb: meta noindex tag for non-indexable pages (#10803) --- bskyweb/cmd/bskyweb/render_test.go | 54 +++++++++++++ bskyweb/cmd/bskyweb/server.go | 121 +++++++++++++++++++---------- bskyweb/templates/base.html | 1 + 3 files changed, 133 insertions(+), 43 deletions(-) diff --git a/bskyweb/cmd/bskyweb/render_test.go b/bskyweb/cmd/bskyweb/render_test.go index 30b27a53d5..902476709f 100644 --- a/bskyweb/cmd/bskyweb/render_test.go +++ b/bskyweb/cmd/bskyweb/render_test.go @@ -43,6 +43,13 @@ func extractJSONLD(t *testing.T, html string) string { return strings.TrimSpace(m[1]) } +func TestRenderBase_NoindexMeta(t *testing.T) { + html := renderTemplate(t, "base.html", pongo2.Context{"noindex": true, "nofollow": true}) + if !strings.Contains(html, ``) { + t.Errorf("expected combined noindex,nofollow meta; got:\n%s", html) + } +} + func TestRenderPost_EmitsJSONLD(t *testing.T) { pv := makePostView("alice.bsky.social", "did:plc:alice", "abc123", "hello") ld, err := buildPostJSONLD(pv, nil, "https://bsky.app/profile/alice.bsky.social/post/abc123", hideEmbedLabels, hideReplyLabels) @@ -243,3 +250,50 @@ func TestRenderPost_VideoWithoutThumbnailEmitsOGVideo(t *testing.T) { t.Errorf("og:video:type should emit even without imgThumbUrls; got:\n%s", html) } } + +// Auth-required posts must emit noindex,nofollow so the stub page (no body +// text, no comments) is not indexed. +func TestRenderPost_AuthRequiredNoindex(t *testing.T) { + html := renderTemplate(t, "post.html", pongo2.Context{ + "requiresAuth": true, + "profileHandle": "alice.bsky.social", + "requestURI": "https://bsky.app/profile/alice.bsky.social/post/abc123", + "canonicalURL": "https://bsky.app/profile/alice.bsky.social/post/abc123", + "noindex": true, + "nofollow": true, + }) + if !strings.Contains(html, ``) { + t.Errorf("auth-required post should emit noindex,nofollow; got:\n%s", html) + } +} + +// Auth-required profiles must emit noindex,nofollow. +func TestRenderProfile_AuthRequiredNoindex(t *testing.T) { + pv := newProfileViewDetailed() + html := renderTemplate(t, "profile.html", pongo2.Context{ + "profileView": pv, + "requestURI": "https://bsky.app/profile/alice.bsky.social", + "requiresAuth": true, + "noindex": true, + "nofollow": true, + }) + if !strings.Contains(html, ``) { + t.Errorf("auth-required profile should emit noindex,nofollow; got:\n%s", html) + } +} + +// Public posts must NOT emit a robots meta tag. Guards against an accidental +// flip of the noindex flag for indexable pages. +func TestRenderPost_PublicNoNoindex(t *testing.T) { + pv := makePostView("alice.bsky.social", "did:plc:alice", "abc123", "hello") + ld, _ := buildPostJSONLD(pv, nil, "https://bsky.app/profile/alice.bsky.social/post/abc123", hideEmbedLabels, hideReplyLabels) + html := renderTemplate(t, "post.html", pongo2.Context{ + "postView": pv, + "requestURI": "https://bsky.app/profile/alice.bsky.social/post/abc123", + "canonicalURL": "https://bsky.app/profile/alice.bsky.social/post/abc123", + "postJSONLD": ld, + }) + if strings.Contains(html, ` + {% if noindex %}{% endif %} From 76694a2ba838635b5d827d080cc5466e9670216f Mon Sep 17 00:00:00 2001 From: pfrazee <1270099+pfrazee@users.noreply.github.com> Date: Wed, 10 Jun 2026 03:18:50 +0000 Subject: [PATCH 139/149] Nightly source-language update --- src/locale/locales/en/messages.po | 1033 ++++++++++++++++------------- 1 file changed, 556 insertions(+), 477 deletions(-) diff --git a/src/locale/locales/en/messages.po b/src/locale/locales/en/messages.po index 6dcbc25d3a..b17f5f1cd7 100644 --- a/src/locale/locales/en/messages.po +++ b/src/locale/locales/en/messages.po @@ -18,7 +18,11 @@ msgstr "" msgid "\"{interestsDisplayName}\" category (active)" msgstr "" -#: src/components/dms/getMessageInfo.ts:66 +#: src/components/dms/getMessageInfo.ts:91 +msgid "(chat invite link)" +msgstr "(chat invite link)" + +#: src/components/dms/getMessageInfo.ts:73 msgid "(contains embedded content)" msgstr "" @@ -117,7 +121,7 @@ msgstr "" #. How long it takes to read an article, in minutes. Displayed in a short form, e.g. "5m" for 5 minutes. #. placeholder {0}: view.readingTime -#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:230 +#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:231 msgid "{0, plural, one {#m} other {#m}}" msgstr "{0, plural, one {#m} other {#m}}" @@ -320,9 +324,10 @@ msgid "{0}’s avatar" msgstr "{0}’s avatar" #. The number of active group chat members out of the total number allowed. -#. placeholder {0}: data.joinLinkPreviews[0].memberCount -#. placeholder {1}: data.joinLinkPreviews[0].memberLimit -#: src/screens/Messages/JoinRequest.tsx:130 +#. placeholder {0}: joinLinkPreview.memberCount +#. placeholder {1}: joinLinkPreview.memberLimit +#: src/screens/Messages/JoinRequest.tsx:129 +msgctxt "group-chat-member-count" msgid "{0}/{1}" msgstr "{0}/{1}" @@ -330,17 +335,24 @@ msgstr "{0}/{1}" #. placeholder {0}: preview.memberCount #. placeholder {1}: preview.memberLimit #. placeholder {2}: preview.memberCount -#: src/components/dms/ChatInvite/Card.tsx:56 +#: src/components/dms/ChatInvite/Card.tsx:57 msgid "{0}/{1} {2, plural, one {member} other {members}}" msgstr "{0}/{1} {2, plural, one {member} other {members}}" #. The number of active group chat members out of the total number allowed. #. placeholder {0}: joinLinkPreview.memberCount #. placeholder {1}: joinLinkPreview.memberLimit -#: src/components/intents/GroupChatJoinDialog.tsx:308 +#: src/components/intents/GroupChatJoinDialog.tsx:304 msgid "{0}/{1} members" msgstr "{0}/{1} members" +#. Badge showing the current image position out of the total number of images in a gallery. +#. placeholder {0}: index + 1 +#: src/components/images/Gallery/index.tsx:526 +msgctxt "gallery-badge-image-position-numbers" +msgid "{0}/{imageCount}" +msgstr "{0}/{imageCount}" + #. How many days have passed, displayed in a narrow form #. placeholder {0}: diff.value #: src/lib/hooks/useTimeAgo.ts:171 @@ -586,7 +598,7 @@ msgid "{following} following" msgstr "" #: src/components/dms/components/GroupChatProfileCard.tsx:62 -#: src/components/dms/InitiateChatFlow.tsx:922 +#: src/components/dms/InitiateChatFlow.tsx:925 msgid "{handle} can’t be added" msgstr "{handle} can’t be added" @@ -594,7 +606,7 @@ msgstr "{handle} can’t be added" msgid "{handle} can't be messaged" msgstr "" -#: src/components/dms/InitiateChatFlow.tsx:883 +#: src/components/dms/InitiateChatFlow.tsx:886 msgid "{handle} can’t be messaged" msgstr "{handle} can’t be messaged" @@ -633,7 +645,7 @@ msgstr "{MAX_DESCRIPTION, plural, other {Description is too long. The maximum nu msgid "{MAX_DISPLAY_NAME, plural, other {Display name is too long. The maximum number of characters is #.}}" msgstr "{MAX_DISPLAY_NAME, plural, other {Display name is too long. The maximum number of characters is #.}}" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:394 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:395 msgid "{MAX_HIDDEN_REPLIES, plural, other {You can hide a maximum of # replies.}}" msgstr "" @@ -652,7 +664,7 @@ msgid "{name} reacted {0} to {target}" msgstr "{name} reacted {0} to {target}" #. When the last message in a group chat came from someone other than you. -#: src/components/dms/getMessageInfo.ts:50 +#: src/components/dms/getMessageInfo.ts:57 msgid "{name}: {message}" msgstr "{name}: {message}" @@ -855,6 +867,8 @@ msgstr "" #: src/components/dms/dialogs/NewChatDialog.tsx:52 #: src/components/dms/dialogs/NewChatDialog.tsx:90 #: src/components/dms/LeaveConvoPrompt.tsx:38 +#: src/components/moderation/BlockDialog.tsx:286 +#: src/components/moderation/BlockDialog.tsx:312 #: src/screens/Messages/JoinRequests.tsx:187 #: src/screens/Messages/JoinRequests.tsx:219 msgid "A network error occurred. Please check your internet connection." @@ -935,7 +949,7 @@ msgstr "" msgid "Accepted conversations" msgstr "Accepted conversations" -#: src/components/intents/GroupChatJoinDialog.tsx:94 +#: src/components/intents/GroupChatJoinDialog.tsx:95 msgid "Access requested! The group owner will review your request." msgstr "Access requested! The group owner will review your request." @@ -957,15 +971,15 @@ msgstr "" msgid "Account" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:426 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:427 #: src/screens/Messages/components/RequestButtons.tsx:104 -#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:117 -#: src/view/com/profile/ProfileMenu.tsx:188 +#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:119 +#: src/view/com/profile/ProfileMenu.tsx:190 msgctxt "toast" msgid "Account blocked" msgstr "" -#: src/view/com/profile/ProfileMenu.tsx:203 +#: src/view/com/profile/ProfileMenu.tsx:206 msgctxt "toast" msgid "Account followed" msgstr "" @@ -978,7 +992,7 @@ msgstr "" msgid "Account is deactivated" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:469 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:470 #: src/view/com/profile/ProfileMenu.tsx:160 msgctxt "toast" msgid "Account muted" @@ -1005,21 +1019,21 @@ msgstr "" msgid "Account removed from quick access" msgstr "" -#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:104 +#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:106 #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:88 #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:310 -#: src/view/com/profile/ProfileMenu.tsx:176 +#: src/view/com/profile/ProfileMenu.tsx:177 msgctxt "toast" msgid "Account unblocked" msgstr "" -#: src/view/com/profile/ProfileMenu.tsx:217 +#: src/view/com/profile/ProfileMenu.tsx:221 msgctxt "toast" msgid "Account unfollowed" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:449 -#: src/view/com/profile/ProfileMenu.tsx:148 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:450 +#: src/view/com/profile/ProfileMenu.tsx:147 msgctxt "toast" msgid "Account unmuted" msgstr "" @@ -1038,7 +1052,7 @@ msgstr "" #: src/components/dialogs/MutedWords.tsx:337 #: src/components/dialogs/StarterPackDialog.tsx:376 #: src/components/dialogs/StarterPackDialog.tsx:388 -#: src/components/dms/AddMembersFlow.tsx:403 +#: src/components/dms/AddMembersFlow.tsx:398 #: src/view/com/modals/UserAddRemoveLists.tsx:236 msgid "Add" msgstr "" @@ -1092,11 +1106,11 @@ msgstr "" msgid "Add another account" msgstr "" -#: src/view/com/composer/Composer.tsx:1472 +#: src/view/com/composer/Composer.tsx:1505 msgid "Add another post" msgstr "" -#: src/view/com/composer/Composer.tsx:2135 +#: src/view/com/composer/Composer.tsx:2168 msgid "Add another post to thread" msgstr "" @@ -1118,7 +1132,7 @@ msgstr "Add automation label to account" msgid "Add emoji reaction" msgstr "" -#: src/components/dms/AddMembersFlow.tsx:485 +#: src/components/dms/AddMembersFlow.tsx:480 msgid "Add group chat members" msgstr "Add group chat members" @@ -1155,8 +1169,8 @@ msgstr "" msgid "Add muted words and tags" msgstr "" -#: src/screens/Messages/components/MessagesListGroupInfoPanel.tsx:132 -#: src/screens/Messages/components/MessagesListGroupInfoPanel.tsx:171 +#: src/screens/Messages/components/MessagesListGroupInfoPanel.tsx:134 +#: src/screens/Messages/components/MessagesListGroupInfoPanel.tsx:173 #: src/screens/ProfileList/AboutSection.tsx:72 #: src/screens/ProfileList/AboutSection.tsx:90 msgid "Add people" @@ -1214,11 +1228,11 @@ msgid "Add your birthdate" msgstr "" #. placeholder {0}: createSanitizedDisplayName( profile.kind.addedBy, true, moderateProfile(profile.kind.addedBy, moderationOpts).ui('displayName'), ) -#: src/screens/Messages/ConversationSettings/Member.tsx:97 +#: src/screens/Messages/ConversationSettings/Member.tsx:109 msgid "Added by {0}" msgstr "Added by {0}" -#: src/screens/Messages/ConversationSettings/Member.tsx:102 +#: src/screens/Messages/ConversationSettings/Member.tsx:114 msgid "Added by invite link" msgstr "Added by invite link" @@ -1244,8 +1258,8 @@ msgstr "" msgid "Additional details (limit 300 characters)" msgstr "" -#: src/screens/Messages/ConversationSettings/Member.tsx:82 -#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:150 +#: src/screens/Messages/ConversationSettings/Member.tsx:94 +#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:152 msgid "Admin" msgstr "Admin" @@ -1353,13 +1367,13 @@ msgstr "" msgid "Allow anyone to reply" msgstr "" -#: src/screens/Messages/Settings.tsx:140 -#: src/screens/Messages/Settings.tsx:155 +#: src/screens/Messages/Settings.tsx:143 +#: src/screens/Messages/Settings.tsx:158 msgid "Allow direct messages from" msgstr "Allow direct messages from" -#: src/screens/Messages/Settings.tsx:186 -#: src/screens/Messages/Settings.tsx:201 +#: src/screens/Messages/Settings.tsx:189 +#: src/screens/Messages/Settings.tsx:211 msgid "Allow group chat invites from" msgstr "Allow group chat invites from" @@ -1414,7 +1428,7 @@ msgid "Already signed in as @{0}" msgstr "" #: src/components/images/AutoSizedImage.tsx:204 -#: src/components/images/Gallery/index.tsx:584 +#: src/components/images/Gallery/index.tsx:588 #: src/components/images/ImageLayoutGridItem.tsx:142 #: src/components/Post/Embed/VideoEmbed/GifPresentationControls.tsx:94 #: src/view/com/composer/GifAltText.tsx:100 @@ -1614,7 +1628,7 @@ msgstr "" msgid "Anyone can interact" msgstr "" -#: src/components/intents/GroupChatJoinDialog.tsx:323 +#: src/components/intents/GroupChatJoinDialog.tsx:316 msgid "Anyone can join" msgstr "Anyone can join" @@ -1785,11 +1799,11 @@ msgid "Are you sure you want to remove this from your feeds?" msgstr "" #. placeholder {0}: convoView.name -#: src/screens/Messages/components/OutgoingRequestListItem.tsx:117 +#: src/screens/Messages/components/OutgoingRequestListItem.tsx:124 msgid "Are you sure you want to rescind your request to join {0}?" msgstr "Are you sure you want to rescind your request to join {0}?" -#: src/view/com/composer/Composer.tsx:1608 +#: src/view/com/composer/Composer.tsx:1641 msgid "Are you sure you'd like to discard this post?" msgstr "" @@ -1809,8 +1823,8 @@ msgstr "" msgid "Artistic or non-erotic nudity." msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:607 -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:609 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:608 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:610 msgid "Assign topic for algo" msgstr "" @@ -1852,12 +1866,12 @@ msgstr "" msgid "Available" msgstr "" -#: src/components/dms/AddMembersFlow.tsx:352 -#: src/components/dms/AddMembersFlow.tsx:520 -#: src/components/dms/AddMembersFlow.tsx:526 -#: src/components/dms/InitiateChatFlow.tsx:517 -#: src/components/dms/InitiateChatFlow.tsx:735 -#: src/components/dms/InitiateChatFlow.tsx:742 +#: src/components/dms/AddMembersFlow.tsx:347 +#: src/components/dms/AddMembersFlow.tsx:515 +#: src/components/dms/AddMembersFlow.tsx:521 +#: src/components/dms/InitiateChatFlow.tsx:520 +#: src/components/dms/InitiateChatFlow.tsx:738 +#: src/components/dms/InitiateChatFlow.tsx:745 #: src/components/moderation/LabelsOnMeDialog.tsx:334 #: src/components/moderation/LabelsOnMeDialog.tsx:335 #: src/screens/Login/ChooseAccountForm.tsx:98 @@ -1930,10 +1944,10 @@ msgstr "" #: src/components/dms/dialogs/NewChatDialog.tsx:151 #: src/components/dms/MessageProfileButton.tsx:60 #: src/screens/Messages/ChatList.tsx:147 -#: src/screens/Messages/ChatList.tsx:211 -#: src/screens/Messages/ChatList.tsx:482 +#: src/screens/Messages/ChatList.tsx:212 +#: src/screens/Messages/ChatList.tsx:489 #: src/screens/Messages/Conversation.tsx:207 -#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:94 +#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:96 msgid "Before you can message another user, you must first verify your email." msgstr "" @@ -1961,22 +1975,22 @@ msgstr "" msgid "Birthday" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:853 -#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:222 -#: src/screens/Messages/ConversationSettings/prompts.tsx:169 +#: src/components/moderation/BlockDialog.tsx:186 +#: src/components/moderation/BlockDialog.tsx:192 +#: src/components/moderation/BlockDialog.tsx:211 +#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:224 #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:207 -#: src/view/com/profile/ProfileMenu.tsx:563 msgid "Block" msgstr "" -#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:211 +#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:213 msgid "Block {displayName}" msgstr "Block {displayName}" #: src/components/dms/ConvoMenu.tsx:284 #: src/components/dms/ConvoMenu.tsx:288 -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:747 -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:749 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:748 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:750 #: src/screens/Messages/components/RequestButtons.tsx:154 #: src/screens/Messages/components/RequestButtons.tsx:156 #: src/view/com/profile/ProfileMenu.tsx:469 @@ -1984,15 +1998,10 @@ msgstr "Block {displayName}" msgid "Block account" msgstr "" -#: src/screens/Messages/ConversationSettings/prompts.tsx:166 +#: src/components/moderation/BlockDialog.tsx:148 msgid "Block account?" msgstr "Block account?" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:850 -#: src/view/com/profile/ProfileMenu.tsx:546 -msgid "Block Account?" -msgstr "" - #: src/screens/ProfileList/components/SubscribeMenu.tsx:91 #: src/screens/ProfileList/components/SubscribeMenu.tsx:94 msgid "Block accounts" @@ -2055,9 +2064,7 @@ msgstr "" msgid "Blocked Accounts" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:851 -#: src/screens/Messages/ConversationSettings/prompts.tsx:167 -#: src/view/com/profile/ProfileMenu.tsx:558 +#: src/components/moderation/BlockDialog.tsx:163 msgid "Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you." msgstr "" @@ -2073,7 +2080,7 @@ msgstr "" msgid "Blocking is public. Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you." msgstr "" -#: src/view/com/profile/ProfileMenu.tsx:555 +#: src/components/moderation/BlockDialog.tsx:157 msgid "Blocking will not prevent labels from being applied on your account, but it will stop this account from replying in your threads or interacting with you." msgstr "" @@ -2224,32 +2231,32 @@ msgid "Button to go back to the home timeline" msgstr "" #. The owner (creator) of a group chat. -#. placeholder {0}: createSanitizedDisplayName( data.joinLinkPreviews[0].owner, true, moderateProfile( data.joinLinkPreviews[0].owner, moderationOpts, ).ui('displayName'), ) +#. placeholder {0}: createSanitizedDisplayName( joinLinkPreview.owner, true, moderateProfile( joinLinkPreview.owner, moderationOpts, ).ui('displayName'), ) #. placeholder {0}: sanitizeHandle(handle, '@') #. placeholder {0}: sanitizeHandle(item.feed.creator.handle, '@') #: src/components/LabelingServiceCard/index.tsx:62 #: src/components/moderation/ReportDialog/index.tsx:847 -#: src/screens/Messages/JoinRequest.tsx:166 +#: src/screens/Messages/JoinRequest.tsx:167 #: src/screens/Search/components/StarterPackCard.tsx:107 #: src/screens/Search/Explore.tsx:971 msgid "By {0}" msgstr "" +#. placeholder {0}: authorProfile.handle +#: src/components/Post/Embed/StandardSiteEmbed/StandardSiteMetaRow.tsx:77 +msgid "by @{0}" +msgstr "by @{0}" + #. placeholder {0}: sanitizeHandle(info.creatorHandle, '@') #: src/screens/Profile/components/ProfileFeedHeader.tsx:451 msgid "By <0>{0}" msgstr "" #. The group chat creator, in the format 'By {displayName}'. -#: src/components/dms/ChatInvite/Card.tsx:78 +#: src/components/dms/ChatInvite/Card.tsx:79 msgid "By <0>{ownerDisplayName}" msgstr "By <0>{ownerDisplayName}" -#. placeholder {0}: authorProfile.handle -#: src/components/Post/Embed/StandardSiteEmbed/StandardSiteMetaRow.tsx:80 -msgid "by <0>@{0}" -msgstr "by <0>@{0}" - #: src/components/PolicyUpdateOverlay/updates/202508/index.tsx:182 msgid "By clicking \"Continue\" you acknowledge that you understand and agree to these updates." msgstr "" @@ -2294,6 +2301,7 @@ msgstr "" #: src/components/dialogs/lists/CreateOrEditListDialog.tsx:291 #: src/components/dialogs/lists/CreateOrEditListDialog.tsx:299 #: src/components/Menu/index.tsx:367 +#: src/components/moderation/BlockDialog.tsx:202 #: src/components/PostControls/RepostButton.tsx:210 #: src/components/Prompt.tsx:152 #: src/components/Prompt.tsx:154 @@ -2310,6 +2318,7 @@ msgstr "" #: src/screens/Messages/ConversationSettings/prompts.tsx:100 #: src/screens/Messages/ConversationSettings/prompts.tsx:124 #: src/screens/Messages/ConversationSettings/prompts.tsx:148 +#: src/screens/Messages/ConversationSettings/prompts.tsx:172 #: src/screens/Profile/Header/EditProfileDialog.tsx:215 #: src/screens/Profile/Header/EditProfileDialog.tsx:223 #: src/screens/Search/Shell.tsx:405 @@ -2322,8 +2331,8 @@ msgstr "" #: src/screens/Settings/Settings.tsx:300 #: src/screens/Takendown.tsx:102 #: src/screens/Takendown.tsx:105 -#: src/view/com/composer/Composer.tsx:1686 -#: src/view/com/composer/Composer.tsx:1696 +#: src/view/com/composer/Composer.tsx:1719 +#: src/view/com/composer/Composer.tsx:1729 #: src/view/com/composer/photos/EditImageDialog.web.tsx:44 #: src/view/com/composer/photos/EditImageDialog.web.tsx:53 #: src/view/shell/desktop/LeftNav.tsx:228 @@ -2455,10 +2464,10 @@ msgstr "" msgid "Chat ended" msgstr "Chat ended" -#: src/components/dms/ChatInvite/Root.tsx:105 -#: src/components/intents/GroupChatJoinDialog.tsx:228 -#: src/components/intents/GroupChatJoinDialog.tsx:259 -#: src/components/Post/Embed/JoinRequestEmbed.tsx:94 +#: src/components/intents/GroupChatJoinDialog.tsx:229 +#: src/components/Post/Embed/JoinRequestEmbed.tsx:99 +#: src/screens/Messages/components/MessageInputEmbed.tsx:331 +#: src/screens/Messages/JoinRequest.tsx:83 msgid "Chat invite link no longer available" msgstr "Chat invite link no longer available" @@ -2479,6 +2488,15 @@ msgctxt "toast" msgid "Chat muted" msgstr "" +#: src/components/moderation/BlockDialog.tsx:288 +#: src/components/moderation/BlockDialog.tsx:316 +msgid "Chat not found." +msgstr "Chat not found." + +#: src/components/moderation/BlockDialog.tsx:292 +msgid "Chat owners cannot leave a group chat." +msgstr "Chat owners cannot leave a group chat." + #: src/components/dms/dialogs/NewChatDialog.tsx:69 msgid "Chat recipient is not followed by the sender." msgstr "Chat recipient is not followed by the sender." @@ -2496,13 +2514,13 @@ msgstr "" #: src/Navigation.tsx:500 #: src/screens/Messages/ChatList.tsx:83 #: src/screens/Messages/ChatList.tsx:87 -#: src/screens/Messages/ChatList.tsx:508 -#: src/screens/Messages/ChatList.tsx:543 -#: src/screens/Messages/Settings.tsx:38 +#: src/screens/Messages/ChatList.tsx:515 +#: src/screens/Messages/ChatList.tsx:550 +#: src/screens/Messages/Settings.tsx:39 msgid "Chat settings" msgstr "" -#: src/screens/Messages/Settings.tsx:131 +#: src/screens/Messages/Settings.tsx:134 msgid "Chat Settings" msgstr "" @@ -2525,8 +2543,8 @@ msgid "Chat unmuted" msgstr "" #: src/screens/Messages/ChatList.tsx:77 -#: src/screens/Messages/ChatList.tsx:494 -#: src/screens/Messages/ChatList.tsx:532 +#: src/screens/Messages/ChatList.tsx:501 +#: src/screens/Messages/ChatList.tsx:539 msgid "Chats" msgstr "" @@ -2634,7 +2652,7 @@ msgstr "" msgid "click here" msgstr "" -#: src/screens/Messages/components/MessagesListGroupInfoPanel.tsx:128 +#: src/screens/Messages/components/MessagesListGroupInfoPanel.tsx:130 msgid "Click here to add people to this group chat" msgstr "Click here to add people to this group chat" @@ -2642,7 +2660,7 @@ msgstr "Click here to add people to this group chat" msgid "Click here to contact our support team" msgstr "" -#: src/screens/Messages/components/MessagesListGroupInfoPanel.tsx:142 +#: src/screens/Messages/components/MessagesListGroupInfoPanel.tsx:144 msgid "Click here to create or manage an invite link for this group chat" msgstr "Click here to create or manage an invite link for this group chat" @@ -2672,7 +2690,7 @@ msgstr "" msgid "Click here to update your email" msgstr "" -#: src/screens/Messages/components/MessagesListGroupInfoPanel.tsx:143 +#: src/screens/Messages/components/MessagesListGroupInfoPanel.tsx:145 msgid "Click here to view the invite link for this group chat" msgstr "Click here to view the invite link for this group chat" @@ -2706,7 +2724,7 @@ msgstr "" #: src/components/dialogs/nuxs/LiveNowBetaDialog.tsx:200 #: src/components/dialogs/SearchablePeopleList.tsx:340 #: src/components/dialogs/StarterPackDialog.tsx:187 -#: src/components/dms/AddMembersFlow.tsx:377 +#: src/components/dms/AddMembersFlow.tsx:372 #: src/components/dms/AfterReportConversationDialog.tsx:91 #: src/components/dms/AfterReportConversationDialog.tsx:96 #: src/components/dms/AfterReportConversationDialog.tsx:247 @@ -2716,9 +2734,9 @@ msgstr "" #: src/components/dms/AfterReportDialog.tsx:212 #: src/components/dms/AfterReportDialog.tsx:217 #: src/components/dms/EmojiPopup.android.tsx:59 -#: src/components/dms/InitiateChatFlow.tsx:542 -#: src/components/intents/GroupChatJoinDialog.tsx:205 -#: src/components/intents/GroupChatJoinDialog.tsx:240 +#: src/components/dms/InitiateChatFlow.tsx:545 +#: src/components/intents/GroupChatJoinDialog.tsx:206 +#: src/components/intents/GroupChatJoinDialog.tsx:241 #: src/components/NewskieDialog.tsx:169 #: src/components/NewskieDialog.tsx:175 #: src/components/Post/Embed/VideoEmbed/GifPresentationControls.tsx:107 @@ -2765,6 +2783,7 @@ msgstr "" #: src/components/dialogs/LanguageSelectDialog.tsx:322 #: src/components/dialogs/LanguageSelectDialog.tsx:354 #: src/components/dialogs/NotificationSettingsDialog.tsx:94 +#: src/components/moderation/BlockDialog.tsx:199 #: src/components/verification/VerificationsDialog.tsx:138 #: src/components/verification/VerifierDialog.tsx:140 #: src/features/gifPicker/components/GifPickerErrorBoundary.tsx:36 @@ -2787,7 +2806,7 @@ msgstr "" #: src/components/ContextMenu/Backdrop.ios.tsx:53 #: src/components/ContextMenu/Backdrop.ios.tsx:79 #: src/components/ContextMenu/Backdrop.tsx:45 -#: src/components/Lightbox/chrome/ImageMenu.tsx:85 +#: src/components/Lightbox/chrome/ImageMenu.tsx:84 msgid "Close menu" msgstr "" @@ -2795,10 +2814,10 @@ msgstr "" msgid "Close the incoming requests banner" msgstr "Close the incoming requests banner" -#: src/components/intents/GroupChatJoinDialog.tsx:198 #: src/components/intents/GroupChatJoinDialog.tsx:199 -#: src/components/intents/GroupChatJoinDialog.tsx:235 +#: src/components/intents/GroupChatJoinDialog.tsx:200 #: src/components/intents/GroupChatJoinDialog.tsx:236 +#: src/components/intents/GroupChatJoinDialog.tsx:237 #: src/components/Menu/index.tsx:361 msgid "Close this dialog" msgstr "" @@ -2811,7 +2830,7 @@ msgstr "" msgid "Closes password update alert" msgstr "" -#: src/view/com/composer/Composer.tsx:1694 +#: src/view/com/composer/Composer.tsx:1727 msgid "Closes post composer and discards post draft" msgstr "" @@ -2861,7 +2880,7 @@ msgid "Compose new post" msgstr "" #. placeholder {0}: MAX_GRAPHEME_LENGTH || 0 -#: src/view/com/composer/Composer.tsx:1570 +#: src/view/com/composer/Composer.tsx:1603 msgid "Compose posts up to {0, plural, other {# characters}} in length" msgstr "" @@ -2869,11 +2888,11 @@ msgstr "" msgid "Compose reply" msgstr "" -#: src/view/com/composer/Composer.tsx:2532 +#: src/view/com/composer/Composer.tsx:2565 msgid "Compressing GIF..." msgstr "" -#: src/view/com/composer/Composer.tsx:2534 +#: src/view/com/composer/Composer.tsx:2567 msgid "Compressing video..." msgstr "" @@ -3024,8 +3043,8 @@ msgstr "" msgid "Continue thread..." msgstr "" -#: src/components/dms/AddMembersFlow.tsx:317 -#: src/components/dms/InitiateChatFlow.tsx:469 +#: src/components/dms/AddMembersFlow.tsx:312 +#: src/components/dms/InitiateChatFlow.tsx:473 msgid "Continue to group name" msgstr "Continue to group name" @@ -3067,10 +3086,10 @@ msgstr "Conversation not found." msgid "Copied build version to clipboard" msgstr "" -#: src/components/dms/ChatInvite/Root.tsx:82 -#: src/components/dms/MessageContextMenu.tsx:71 +#: src/components/dms/ChatInvite/Root.tsx:84 +#: src/components/dms/MessageContextMenu.tsx:73 #: src/components/PostControls/DiscoverDebug.tsx:36 -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:272 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:273 #: src/components/PostControls/ShareMenu/ShareMenuItems.tsx:77 #: src/lib/sharing.ts:24 #: src/lib/sharing.ts:42 @@ -3120,7 +3139,7 @@ msgstr "" msgid "Copy host" msgstr "" -#: src/components/dms/ChatInvite/Root.tsx:74 +#: src/components/dms/ChatInvite/Root.tsx:76 #: src/components/StarterPack/ShareDialog.tsx:115 #: src/screens/StarterPack/StarterPackScreen.tsx:644 msgid "Copy link" @@ -3142,8 +3161,8 @@ msgstr "" msgid "Copy link to post" msgstr "" -#: src/view/com/profile/ProfileMenu.tsx:282 -#: src/view/com/profile/ProfileMenu.tsx:293 +#: src/view/com/profile/ProfileMenu.tsx:285 +#: src/view/com/profile/ProfileMenu.tsx:295 msgid "Copy link to profile" msgstr "" @@ -3151,8 +3170,8 @@ msgstr "" msgid "Copy link to starter pack" msgstr "" -#: src/components/dms/MessageContextMenu.tsx:152 -#: src/components/dms/MessageContextMenu.tsx:156 +#: src/components/dms/MessageContextMenu.tsx:165 +#: src/components/dms/MessageContextMenu.tsx:169 msgid "Copy message text" msgstr "" @@ -3161,8 +3180,8 @@ msgstr "" msgid "Copy post at:// URI" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:562 -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:564 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:563 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:565 msgid "Copy post text" msgstr "" @@ -3189,7 +3208,7 @@ msgstr "" msgid "Could not connect to feed service" msgstr "" -#: src/screens/Messages/components/MessageInputEmbed.tsx:200 +#: src/screens/Messages/components/MessageInputEmbed.tsx:202 msgid "Could not fetch post" msgstr "Could not fetch post" @@ -3214,14 +3233,14 @@ msgstr "" msgid "Could not leave chat" msgstr "" +#: src/components/moderation/BlockDialog.tsx:284 +msgid "Could not leave chat." +msgstr "Could not leave chat." + #: src/screens/Profile/ProfileFeed/index.tsx:73 msgid "Could not load feed" msgstr "" -#: src/screens/Messages/components/MessageInputEmbed.tsx:321 -msgid "Could not load invite" -msgstr "Could not load invite" - #: src/screens/ProfileList/components/ErrorScreen.tsx:27 #: src/screens/ProfileList/index.tsx:80 #: src/screens/ProfileList/index.tsx:102 @@ -3236,6 +3255,10 @@ msgstr "" msgid "Could not process your video" msgstr "" +#: src/components/moderation/BlockDialog.tsx:310 +msgid "Could not remove member." +msgstr "Could not remove member." + #. placeholder {0}: cleanError(error) #: src/components/activity-notifications/SubscribeProfileDialog.tsx:295 msgid "Could not save changes: {0}" @@ -3267,7 +3290,7 @@ msgstr "" #. Text on button to create a new starter pack #: src/components/dialogs/StarterPackDialog.tsx:113 #: src/components/dialogs/StarterPackDialog.tsx:210 -#: src/components/dms/InitiateChatFlow.tsx:478 +#: src/components/dms/InitiateChatFlow.tsx:482 #: src/components/StarterPack/ProfileStarterPacks.tsx:329 msgid "Create" msgstr "" @@ -3335,7 +3358,7 @@ msgstr "" msgid "Create another" msgstr "" -#: src/components/dms/InitiateChatFlow.tsx:477 +#: src/components/dms/InitiateChatFlow.tsx:481 msgid "Create group chat" msgstr "Create group chat" @@ -3363,7 +3386,7 @@ msgstr "" msgid "Create new account" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:520 +#: src/screens/Messages/ConversationSettings/index.tsx:539 msgid "Create or modify an invite link for this group chat" msgstr "Create or modify an invite link for this group chat" @@ -3387,7 +3410,7 @@ msgstr "" #. placeholder {0}: i18n.date(createdAt, { dateStyle: 'long', timeStyle: 'short', }) #. placeholder {0}: i18n.date(createdAt, { month: 'long', day: 'numeric', year: 'numeric', }) #: src/screens/Messages/components/InviteLinkDialog.tsx:324 -#: src/screens/Messages/ConversationSettings/index.tsx:472 +#: src/screens/Messages/ConversationSettings/index.tsx:491 #: src/screens/Settings/AppPasswords.tsx:174 msgid "Created {0}" msgstr "" @@ -3400,6 +3423,10 @@ msgstr "" msgid "Culture" msgstr "" +#: src/components/moderation/BlockDialog.tsx:378 +msgid "Current chat" +msgstr "Current chat" + #: src/components/dialogs/ServerInput.tsx:152 #: src/components/dialogs/ServerInput.tsx:154 msgid "Custom" @@ -3472,7 +3499,7 @@ msgid "Default icons" msgstr "" #: src/components/dms/MessageOverlays.tsx:184 -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:803 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:804 #: src/screens/ProfileList/components/MoreOptionsMenu.tsx:275 #: src/screens/Settings/AppPasswords.tsx:213 #: src/screens/StarterPack/StarterPackScreen.tsx:615 @@ -3520,7 +3547,7 @@ msgstr "" msgid "Delete conversation" msgstr "" -#: src/components/dms/MessageContextMenu.tsx:167 +#: src/components/dms/MessageContextMenu.tsx:180 msgid "Delete for me" msgstr "" @@ -3533,7 +3560,7 @@ msgstr "" msgid "Delete message" msgstr "" -#: src/components/dms/MessageContextMenu.tsx:164 +#: src/components/dms/MessageContextMenu.tsx:177 msgid "Delete message for me" msgstr "" @@ -3541,9 +3568,9 @@ msgstr "" msgid "Delete my account" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:787 -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:789 -#: src/view/com/composer/Composer.tsx:1582 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:788 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:790 +#: src/view/com/composer/Composer.tsx:1615 msgid "Delete post" msgstr "" @@ -3560,7 +3587,7 @@ msgstr "" msgid "Delete this list?" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:800 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:801 msgid "Delete this post?" msgstr "" @@ -3570,7 +3597,7 @@ msgstr "" #: src/components/dms/MessagesListHeader.tsx:103 #: src/screens/Messages/components/ChatListItem.tsx:134 -#: src/screens/Messages/ConversationSettings/Member.tsx:75 +#: src/screens/Messages/ConversationSettings/Member.tsx:87 msgid "Deleted Account" msgstr "" @@ -3601,12 +3628,12 @@ msgstr "Description (1000 characters max)" msgid "Descriptive alt text" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:691 -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:701 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:692 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:702 msgid "Detach quote" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:836 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:837 msgid "Detach quote post?" msgstr "" @@ -3690,9 +3717,9 @@ msgstr "" #: src/components/dialogs/lists/CreateOrEditListDialog.tsx:101 #: src/screens/Profile/Header/EditProfileDialog.tsx:79 -#: src/view/com/composer/Composer.tsx:1365 -#: src/view/com/composer/Composer.tsx:1409 -#: src/view/com/composer/Composer.tsx:1615 +#: src/view/com/composer/Composer.tsx:1398 +#: src/view/com/composer/Composer.tsx:1442 +#: src/view/com/composer/Composer.tsx:1648 #: src/view/com/composer/drafts/DraftItem.tsx:242 #: src/view/com/composer/drafts/DraftsButton.tsx:131 msgid "Discard" @@ -3703,14 +3730,14 @@ msgstr "" msgid "Discard changes?" msgstr "" -#: src/view/com/composer/Composer.tsx:1363 +#: src/view/com/composer/Composer.tsx:1396 #: src/view/com/composer/drafts/DraftItem.tsx:239 #: src/view/com/composer/drafts/DraftsButton.tsx:98 msgid "Discard draft?" msgstr "" -#: src/view/com/composer/Composer.tsx:1380 -#: src/view/com/composer/Composer.tsx:1607 +#: src/view/com/composer/Composer.tsx:1413 +#: src/view/com/composer/Composer.tsx:1640 msgid "Discard post?" msgstr "" @@ -3747,7 +3774,7 @@ msgstr "" msgid "Dismiss banner" msgstr "" -#: src/view/com/composer/Composer.tsx:2453 +#: src/view/com/composer/Composer.tsx:2486 msgid "Dismiss error" msgstr "" @@ -3990,8 +4017,8 @@ msgstr "Edit group name" msgid "Edit image" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:768 -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:781 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:769 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:782 msgid "Edit interaction settings" msgstr "" @@ -4032,7 +4059,7 @@ msgstr "" msgid "Edit My Feeds" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:507 +#: src/screens/Messages/ConversationSettings/index.tsx:526 msgid "Edit name" msgstr "Edit name" @@ -4061,8 +4088,8 @@ msgstr "" msgid "Edit starter pack" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:453 -#: src/screens/Messages/ConversationSettings/index.tsx:506 +#: src/screens/Messages/ConversationSettings/index.tsx:472 +#: src/screens/Messages/ConversationSettings/index.tsx:525 msgid "Edit this group chat’s name" msgstr "Edit this group chat’s name" @@ -4279,7 +4306,7 @@ msgstr "" msgid "Entertainment" msgstr "" -#: src/view/com/composer/Composer.tsx:2552 +#: src/view/com/composer/Composer.tsx:2585 #: src/view/com/util/error/ErrorScreen.tsx:40 msgid "Error" msgstr "" @@ -4326,12 +4353,12 @@ msgstr "" msgid "Everyone" msgstr "" -#: src/screens/Messages/Settings.tsx:77 +#: src/screens/Messages/Settings.tsx:80 msgctxt "allow group chat invites from" msgid "Everyone" msgstr "Everyone" -#: src/screens/Messages/Settings.tsx:62 +#: src/screens/Messages/Settings.tsx:65 msgctxt "allow messages from" msgid "Everyone" msgstr "Everyone" @@ -4374,7 +4401,7 @@ msgstr "" msgid "Expands or collapses post text" msgstr "" -#: src/lib/api/index.ts:487 +#: src/lib/api/index.ts:491 msgid "Expected uri to resolve to a record" msgstr "" @@ -4425,8 +4452,8 @@ msgstr "" msgid "Explore the app" msgstr "" -#: src/screens/Messages/Settings.tsx:253 -#: src/screens/Messages/Settings.tsx:263 +#: src/screens/Messages/Settings.tsx:267 +#: src/screens/Messages/Settings.tsx:277 #: src/screens/Settings/components/ExportCarDialog.tsx:130 msgid "Export my chat data" msgstr "Export my chat data" @@ -4473,8 +4500,8 @@ msgstr "" msgid "Failed to accept join request" msgstr "Failed to accept join request" -#: src/components/dms/ActionsWrapper.web.tsx:77 -#: src/components/dms/MessageContextMenu.tsx:103 +#: src/components/dms/ActionsWrapper.web.tsx:90 +#: src/components/dms/MessageContextMenu.tsx:116 msgid "Failed to add emoji reaction" msgstr "" @@ -4500,7 +4527,7 @@ msgid "Failed to create app password. Please try again." msgstr "" #: src/components/dms/MessageProfileButton.tsx:38 -#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:64 +#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:66 msgid "Failed to create conversation" msgstr "" @@ -4523,7 +4550,7 @@ msgstr "" msgid "Failed to delete message" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:219 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:220 msgid "Failed to delete post, please try again" msgstr "" @@ -4540,7 +4567,7 @@ msgstr "Failed to disable invite link" msgid "Failed to disconnect Germ DM. Error: {0}" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:349 +#: src/screens/Messages/ConversationSettings/index.tsx:368 msgid "Failed to edit group chat name" msgstr "Failed to edit group chat name" @@ -4568,7 +4595,7 @@ msgstr "" msgid "Failed to ignore join request" msgstr "Failed to ignore join request" -#: src/components/intents/GroupChatJoinDialog.tsx:117 +#: src/components/intents/GroupChatJoinDialog.tsx:118 msgid "Failed to join the group chat. Please try again." msgstr "Failed to join the group chat. Please try again." @@ -4578,12 +4605,12 @@ msgstr "" #: src/screens/Messages/components/ChatEnded.tsx:42 #: src/screens/Messages/components/ChatLocked.tsx:53 -#: src/screens/Messages/ConversationSettings/index.tsx:376 +#: src/screens/Messages/ConversationSettings/index.tsx:395 msgctxt "toast" msgid "Failed to leave group chat" msgstr "Failed to leave group chat" -#: src/screens/Messages/ChatList.tsx:345 +#: src/screens/Messages/ChatList.tsx:347 #: src/screens/Messages/Inbox.tsx:214 msgid "Failed to load conversations" msgstr "" @@ -4629,7 +4656,7 @@ msgstr "" msgid "Failed to load suggested follows" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:400 +#: src/screens/Messages/ConversationSettings/index.tsx:419 msgid "Failed to lock group chat" msgstr "Failed to lock group chat" @@ -4637,7 +4664,7 @@ msgstr "Failed to lock group chat" msgid "Failed to mark all requests as read" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:363 +#: src/screens/Messages/ConversationSettings/index.tsx:382 msgid "Failed to mute group chat" msgstr "Failed to mute group chat" @@ -4659,8 +4686,8 @@ msgstr "" msgid "Failed to remove data. {0}" msgstr "" -#: src/components/dms/ActionsWrapper.web.tsx:73 -#: src/components/dms/MessageContextMenu.tsx:99 +#: src/components/dms/ActionsWrapper.web.tsx:75 +#: src/components/dms/MessageContextMenu.tsx:101 #: src/components/dms/ReactionsDialog.tsx:175 msgid "Failed to remove emoji reaction" msgstr "" @@ -4669,7 +4696,8 @@ msgstr "" msgid "Failed to remove from starter pack" msgstr "" -#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:71 +#: src/screens/Messages/ConversationSettings/Member.tsx:56 +#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:73 msgid "Failed to remove group chat member" msgstr "Failed to remove group chat member" @@ -4677,7 +4705,7 @@ msgstr "Failed to remove group chat member" msgid "Failed to remove verification" msgstr "" -#: src/components/intents/GroupChatJoinDialog.tsx:151 +#: src/components/intents/GroupChatJoinDialog.tsx:152 #: src/screens/Messages/components/OutgoingRequestListItem.tsx:37 msgid "Failed to rescind your request. Please try again." msgstr "Failed to rescind your request. Please try again." @@ -4686,7 +4714,7 @@ msgstr "Failed to rescind your request. Please try again." msgid "Failed to resolve location. Please try again." msgstr "" -#: src/view/com/composer/Composer.tsx:640 +#: src/view/com/composer/Composer.tsx:648 msgid "Failed to save draft" msgstr "" @@ -4724,12 +4752,12 @@ msgstr "Failed to send report" msgid "Failed to submit appeal, please try again." msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:251 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:252 msgid "Failed to toggle thread mute, please try again" msgstr "" #: src/screens/Messages/components/ChatLocked.tsx:42 -#: src/screens/Messages/ConversationSettings/index.tsx:403 +#: src/screens/Messages/ConversationSettings/index.tsx:422 msgid "Failed to unlock group chat" msgstr "Failed to unlock group chat" @@ -4754,7 +4782,7 @@ msgstr "" msgid "Failed to update notification declaration" msgstr "" -#: src/screens/Messages/Settings.tsx:94 +#: src/screens/Messages/Settings.tsx:97 msgid "Failed to update settings" msgstr "" @@ -4820,8 +4848,8 @@ msgstr "" msgid "Feedback" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:307 -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:330 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:308 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:331 msgctxt "toast" msgid "Feedback sent to feed operator" msgstr "" @@ -4987,7 +5015,7 @@ msgstr "Focus the search field" #: src/components/ProfileCard.tsx:546 #: src/components/ProfileHoverCard/index.web.tsx:495 #: src/components/ProfileHoverCard/index.web.tsx:506 -#: src/screens/Messages/ConversationSettings/Member.tsx:145 +#: src/screens/Messages/ConversationSettings/Member.tsx:170 #: src/screens/PostThread/components/ThreadItemAnchorFollowButton.tsx:157 #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:402 #: src/screens/VideoFeed/index.tsx:866 @@ -5002,7 +5030,7 @@ msgstr "" msgid "Follow {0}" msgstr "" -#: src/screens/Messages/ConversationSettings/Member.tsx:142 +#: src/screens/Messages/ConversationSettings/Member.tsx:167 msgid "Follow {displayName}" msgstr "Follow {displayName}" @@ -5084,7 +5112,7 @@ msgstr "" msgid "Followed by <0>{0}, <1>{1}, and {2, plural, one {# other} other {# others}}" msgstr "" -#: src/components/intents/GroupChatJoinDialog.tsx:322 +#: src/components/intents/GroupChatJoinDialog.tsx:315 msgid "Followers can join" msgstr "Followers can join" @@ -5126,7 +5154,7 @@ msgstr "" msgid "Following {0}" msgstr "" -#: src/screens/Messages/ConversationSettings/Member.tsx:54 +#: src/screens/Messages/ConversationSettings/Member.tsx:66 msgid "Following {displayName}" msgstr "Following {displayName}" @@ -5335,7 +5363,7 @@ msgstr "" msgid "GIF" msgstr "" -#: src/view/com/composer/Composer.tsx:2557 +#: src/view/com/composer/Composer.tsx:2590 msgid "GIF uploaded" msgstr "" @@ -5441,8 +5469,8 @@ msgid "Go to next" msgstr "" #: src/components/dms/ConvoMenu.tsx:262 -#: src/screens/Messages/components/MessagesListInfoPanel.tsx:97 -#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:189 +#: src/screens/Messages/components/MessagesListInfoPanel.tsx:98 +#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:191 #: src/view/shell/desktop/LeftNav.tsx:336 #: src/view/shell/desktop/LeftNav.tsx:342 msgid "Go to profile" @@ -5456,7 +5484,7 @@ msgstr "Go to the group chat named \"{chatName}\"" msgid "Go to user's profile" msgstr "" -#: src/screens/Messages/components/MessagesListInfoPanel.tsx:91 +#: src/screens/Messages/components/MessagesListInfoPanel.tsx:92 msgid "Go to user’s profile" msgstr "Go to user’s profile" @@ -5484,9 +5512,9 @@ msgstr "" msgid "Grooming or predatory behavior" msgstr "" -#: src/components/dms/ChatInvite/Card.tsx:45 -#: src/components/intents/GroupChatJoinDialog.tsx:298 -#: src/screens/Messages/JoinRequest.tsx:116 +#: src/components/dms/ChatInvite/Card.tsx:46 +#: src/components/intents/GroupChatJoinDialog.tsx:294 +#: src/screens/Messages/JoinRequest.tsx:115 msgid "Group chat" msgstr "Group chat" @@ -5494,33 +5522,33 @@ msgstr "Group chat" msgid "Group chat invite link dialog" msgstr "Group chat invite link dialog" -#: src/screens/Messages/ConversationSettings/index.tsx:392 +#: src/screens/Messages/ConversationSettings/index.tsx:411 msgctxt "toast" msgid "Group chat locked" msgstr "Group chat locked" -#: src/screens/Messages/ConversationSettings/index.tsx:356 +#: src/screens/Messages/ConversationSettings/index.tsx:375 msgctxt "toast" msgid "Group chat muted" msgstr "Group chat muted" -#: src/screens/Messages/ConversationSettings/index.tsx:344 +#: src/screens/Messages/ConversationSettings/index.tsx:363 msgctxt "toast" msgid "Group chat name updated" msgstr "Group chat name updated" #: src/Navigation.tsx:490 -#: src/screens/Messages/ConversationSettings/index.tsx:97 +#: src/screens/Messages/ConversationSettings/index.tsx:110 msgid "Group chat settings" msgstr "Group chat settings" #: src/screens/Messages/components/ChatLocked.tsx:38 -#: src/screens/Messages/ConversationSettings/index.tsx:394 +#: src/screens/Messages/ConversationSettings/index.tsx:413 msgctxt "toast" msgid "Group chat unlocked" msgstr "Group chat unlocked" -#: src/screens/Messages/ConversationSettings/index.tsx:358 +#: src/screens/Messages/ConversationSettings/index.tsx:377 msgctxt "toast" msgid "Group chat unmuted" msgstr "Group chat unmuted" @@ -5533,6 +5561,10 @@ msgstr "Group chats are not yet available" msgid "Group chats are now available" msgstr "Group chats are now available" +#: src/screens/Messages/Settings.tsx:199 +msgid "Group chats are only available to users 18 and over." +msgstr "Group chats are only available to users 18 and over." + #. placeholder {0}: convo.details.memberLimit #: src/screens/Messages/components/InviteLinkDialog.tsx:178 msgid "Group chats can only have a maximum of {0, plural, other {# people}}." @@ -5542,13 +5574,13 @@ msgstr "Group chats can only have a maximum of {0, plural, other {# people}}." msgid "Group is locked" msgstr "Group is locked" -#: src/components/dms/InitiateChatFlow.tsx:240 -#: src/components/dms/InitiateChatFlow.tsx:577 +#: src/components/dms/InitiateChatFlow.tsx:242 +#: src/components/dms/InitiateChatFlow.tsx:580 #: src/screens/Messages/ConversationSettings/prompts.tsx:42 msgid "Group name" msgstr "Group name" -#: src/components/dms/InitiateChatFlow.tsx:602 +#: src/components/dms/InitiateChatFlow.tsx:605 #: src/screens/Messages/ConversationSettings/prompts.tsx:61 msgid "Group name is too long. {MAX_GROUP_NAME_GRAPHEME_LENGTH, plural, other {The maximum number of characters is #.}}" msgstr "Group name is too long. {MAX_GROUP_NAME_GRAPHEME_LENGTH, plural, other {The maximum number of characters is #.}}" @@ -5682,7 +5714,7 @@ msgstr "" #: src/components/moderation/ContentHider.tsx:220 #: src/components/moderation/LabelPreference.tsx:141 #: src/components/moderation/PostHider.tsx:140 -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:811 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:812 #: src/lib/moderation/useLabelBehaviorDescription.ts:18 #: src/lib/moderation/useLabelBehaviorDescription.ts:23 #: src/lib/moderation/useLabelBehaviorDescription.ts:28 @@ -5713,18 +5745,18 @@ msgstr "Hide group chat updates" msgid "Hide lists" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:651 -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:654 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:652 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:655 msgid "Hide post for me" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:665 -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:675 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:666 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:676 msgid "Hide reply for everyone" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:651 -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:654 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:652 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:655 msgid "Hide reply for me" msgstr "" @@ -5737,19 +5769,19 @@ msgstr "" msgid "Hide this event" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:808 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:809 msgid "Hide this post?" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:808 -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:843 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:809 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:844 msgid "Hide this reply?" msgstr "" #: src/components/Post/Translated/index.tsx:216 #: src/components/Post/Translated/index.tsx:350 -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:545 -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:547 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:546 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:548 msgid "Hide translation" msgstr "Hide translation" @@ -5921,7 +5953,7 @@ msgstr "" msgid "If you need to update your email, <0>click here." msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:801 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:802 msgid "If you remove this post, you won't be able to recover it." msgstr "" @@ -5945,16 +5977,6 @@ msgstr "" msgid "If you're trying to change your handle or email, do so before you deactivate." msgstr "" -#. Ignore a request to join a chat -#: src/screens/Messages/JoinRequests.tsx:483 -msgctxt "button" -msgid "Ignore" -msgstr "Ignore" - -#: src/screens/Messages/JoinRequests.tsx:477 -msgid "Ignore join request" -msgstr "Ignore join request" - #: src/components/images/ImageLayoutGridItem.tsx:96 msgid "Image" msgstr "" @@ -6000,7 +6022,7 @@ msgstr "Image is hidden due to your moderation settings." msgid "Image is unavailable." msgstr "Image is unavailable." -#: src/components/Lightbox/chrome/ImageMenu.tsx:73 +#: src/components/Lightbox/chrome/ImageMenu.tsx:72 #: src/components/Lightbox/Lightbox.web.tsx:265 #: src/components/Lightbox/Lightbox.web.tsx:273 msgid "Image options" @@ -6078,7 +6100,7 @@ msgstr "In-app, push, everyone" msgid "In-app, push, people you follow" msgstr "In-app, push, people you follow" -#: src/screens/Messages/ChatList.tsx:362 +#: src/screens/Messages/ChatList.tsx:364 msgid "Inbox empty" msgstr "Inbox empty" @@ -6132,7 +6154,7 @@ msgstr "" msgid "Invalid 2FA confirmation code." msgstr "" -#: src/components/intents/GroupChatJoinDialog.tsx:127 +#: src/components/intents/GroupChatJoinDialog.tsx:128 msgid "Invalid group chat code." msgstr "Invalid group chat code." @@ -6140,7 +6162,7 @@ msgstr "Invalid group chat code." msgid "Invalid handle. Please try a different one." msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:400 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:401 msgctxt "toast" msgid "Invalid interaction settings." msgstr "" @@ -6154,7 +6176,7 @@ msgstr "" msgid "Invalid report subject" msgstr "" -#: src/components/intents/GroupChatJoinDialog.tsx:158 +#: src/components/intents/GroupChatJoinDialog.tsx:159 #: src/screens/Messages/components/OutgoingRequestListItem.tsx:44 msgid "Invalid rescind request." msgstr "Invalid rescind request." @@ -6192,8 +6214,8 @@ msgstr "" #: src/screens/Messages/components/InviteLinkDialog.tsx:304 #: src/screens/Messages/components/InviteLinkDialog.tsx:310 #: src/screens/Messages/components/InviteLinkDialog.tsx:477 -#: src/screens/Messages/components/MessagesListGroupInfoPanel.tsx:148 -#: src/screens/Messages/ConversationSettings/index.tsx:523 +#: src/screens/Messages/components/MessagesListGroupInfoPanel.tsx:150 +#: src/screens/Messages/ConversationSettings/index.tsx:542 msgid "Invite link" msgstr "Invite link" @@ -6222,7 +6244,7 @@ msgstr "" msgid "Invite your friends to follow your favorite feeds and people" msgstr "" -#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:150 +#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:152 msgid "Invited" msgstr "Invited" @@ -6252,7 +6274,7 @@ msgid "It's just you right now! Add more people to your starter pack by searchin msgstr "" #. placeholder {0}: videoState.jobId -#: src/view/com/composer/Composer.tsx:2472 +#: src/view/com/composer/Composer.tsx:2505 msgid "Job ID: {0}" msgstr "" @@ -6261,8 +6283,8 @@ msgstr "" msgid "Jobs" msgstr "" -#: src/components/dms/ChatInvite/Root.tsx:100 -#: src/components/intents/GroupChatJoinDialog.tsx:254 +#: src/components/dms/ChatInvite/Root.tsx:102 +#: src/components/intents/GroupChatJoinDialog.tsx:255 msgid "Join" msgstr "Join" @@ -6273,12 +6295,12 @@ msgstr "Join" msgid "Join Bluesky" msgstr "" -#: src/components/intents/GroupChatJoinDialog.tsx:63 -#: src/components/intents/GroupChatJoinDialog.tsx:419 +#: src/components/intents/GroupChatJoinDialog.tsx:64 +#: src/components/intents/GroupChatJoinDialog.tsx:412 msgid "Join group chat" msgstr "Join group chat" -#: src/components/intents/GroupChatJoinDialog.tsx:147 +#: src/components/intents/GroupChatJoinDialog.tsx:148 #: src/screens/Messages/components/OutgoingRequestListItem.tsx:34 msgid "Join request rescinded." msgstr "Join request rescinded." @@ -6292,8 +6314,8 @@ msgstr "" msgid "Journalism" msgstr "" -#: src/view/com/composer/Composer.tsx:1413 -#: src/view/com/composer/Composer.tsx:1423 +#: src/view/com/composer/Composer.tsx:1446 +#: src/view/com/composer/Composer.tsx:1456 #: src/view/com/composer/drafts/DraftsButton.tsx:135 msgid "Keep editing" msgstr "" @@ -6302,6 +6324,11 @@ msgstr "" msgid "Keep me posted" msgstr "" +#: src/components/moderation/BlockDialog.tsx:365 +#: src/components/moderation/BlockDialog.tsx:372 +msgid "Kick member" +msgstr "Kick member" + #: src/components/ageAssurance/AgeAssuranceInitDialog.tsx:200 msgid "KWS website" msgstr "" @@ -6446,7 +6473,7 @@ msgid "Learn more." msgstr "" #: src/components/dms/LeaveConvoPrompt.tsx:59 -#: src/screens/Messages/ConversationSettings/index.tsx:558 +#: src/screens/Messages/ConversationSettings/index.tsx:577 msgid "Leave" msgstr "" @@ -6458,6 +6485,8 @@ msgstr "Leave" #: src/components/dms/MessagesListBlockedFooter.tsx:109 #: src/components/dms/MessagesListBlockedFooter.tsx:116 +#: src/components/moderation/BlockDialog.tsx:384 +#: src/components/moderation/BlockDialog.tsx:391 #: src/screens/Messages/components/ChatEnded.tsx:67 #: src/screens/Messages/components/ChatLocked.tsx:100 msgid "Leave chat" @@ -6484,7 +6513,7 @@ msgstr "Leave conversation" msgid "Leave group chat" msgstr "Leave group chat" -#: src/screens/Messages/ConversationSettings/index.tsx:557 +#: src/screens/Messages/ConversationSettings/index.tsx:576 msgid "Leave this group chat" msgstr "Leave this group chat" @@ -6497,6 +6526,10 @@ msgstr "" msgid "Leaving this chat will lock it permanently and you won’t be able to rejoin." msgstr "Leaving this chat will lock it permanently and you won’t be able to rejoin." +#: src/components/moderation/BlockDialog.tsx:276 +msgid "Left group chat." +msgstr "Left group chat." + #: src/screens/SignupQueued.tsx:158 msgid "left to go." msgstr "" @@ -6785,7 +6818,7 @@ msgstr "" msgid "Loading..." msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:537 +#: src/screens/Messages/ConversationSettings/index.tsx:556 msgid "Lock" msgstr "Lock" @@ -6797,11 +6830,11 @@ msgstr "Lock group chat" msgid "Lock group chat?" msgstr "Lock group chat?" -#: src/screens/Messages/ConversationSettings/index.tsx:535 +#: src/screens/Messages/ConversationSettings/index.tsx:554 msgid "Lock this group chat" msgstr "Lock this group chat" -#: src/screens/Messages/ConversationSettings/index.tsx:537 +#: src/screens/Messages/ConversationSettings/index.tsx:556 msgid "Locked" msgstr "Locked" @@ -6914,6 +6947,10 @@ msgstr "" msgid "Media that may be disturbing or inappropriate for some audiences." msgstr "" +#: src/components/moderation/BlockDialog.tsx:302 +msgid "Member removed from group chat." +msgstr "Member removed from group chat." + #. The heading above the list of chat members. #: src/screens/Messages/ConversationSettings/MembersAndRequests.tsx:34 msgid "Members" @@ -6945,7 +6982,7 @@ msgstr "Message" #: src/screens/Messages/components/MessageComposer.tsx:218 #: src/screens/Messages/components/MessageInput.tsx:235 #: src/screens/Messages/components/MessageInput.web.tsx:203 -#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:198 +#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:200 msgctxt "action" msgid "Message" msgstr "Message" @@ -6955,7 +6992,7 @@ msgstr "Message" msgid "Message {0}" msgstr "" -#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:194 +#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:196 msgid "Message {displayName}" msgstr "Message {displayName}" @@ -6974,7 +7011,7 @@ msgstr "Message failed to send." #. placeholder {0}: sender?.handle ?? 'unknown' #. placeholder {1}: message.text -#: src/components/dms/MessageContextMenu.tsx:129 +#: src/components/dms/MessageContextMenu.tsx:142 msgid "Message from @{0}: {1}" msgstr "" @@ -6997,7 +7034,7 @@ msgstr "" msgid "Message is too long ({graphemeCount}/{MAX_DM_GRAPHEME_LENGTH})" msgstr "Message is too long ({graphemeCount}/{MAX_DM_GRAPHEME_LENGTH})" -#: src/components/dms/MessageContextMenu.tsx:128 +#: src/components/dms/MessageContextMenu.tsx:141 msgid "Message options" msgstr "" @@ -7108,8 +7145,8 @@ msgstr "" #: src/screens/ProfileList/components/MoreOptionsMenu.tsx:144 #: src/view/com/composer/drafts/DraftItem.tsx:190 -#: src/view/com/profile/ProfileMenu.tsx:254 -#: src/view/com/profile/ProfileMenu.tsx:261 +#: src/view/com/profile/ProfileMenu.tsx:259 +#: src/view/com/profile/ProfileMenu.tsx:266 msgid "More options" msgstr "" @@ -7129,7 +7166,7 @@ msgstr "" msgid "Music" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:499 +#: src/screens/Messages/ConversationSettings/index.tsx:518 msgid "Mute" msgstr "Mute" @@ -7145,8 +7182,8 @@ msgstr "" msgid "Mute {0}" msgstr "Mute {0}" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:730 -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:736 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:731 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:737 #: src/view/com/profile/ProfileMenu.tsx:448 #: src/view/com/profile/ProfileMenu.tsx:455 msgid "Mute account" @@ -7174,7 +7211,7 @@ msgstr "" msgid "Mute these accounts?" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:497 +#: src/screens/Messages/ConversationSettings/index.tsx:516 msgid "Mute this group chat" msgstr "Mute this group chat" @@ -7202,17 +7239,17 @@ msgstr "" msgid "Mute this word until you unmute it" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:621 -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:624 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:622 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:625 msgid "Mute thread" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:634 -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:636 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:635 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:637 msgid "Mute words & tags" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:499 +#: src/screens/Messages/ConversationSettings/index.tsx:518 msgid "Muted" msgstr "Muted" @@ -7242,6 +7279,10 @@ msgstr "" msgid "Muting is private. Muted accounts can interact with you, but you will not see their posts or receive notifications from them." msgstr "" +#: src/components/moderation/BlockDialog.tsx:174 +msgid "Mutual group chats" +msgstr "Mutual group chats" + #: src/components/dialogs/BirthDateSettings.tsx:54 #: src/components/dialogs/BirthDateSettings.tsx:58 msgid "My birthdate" @@ -7320,9 +7361,9 @@ msgstr "" #: src/components/dms/dialogs/NewChatDialog.tsx:176 #: src/screens/Messages/ChatList.tsx:166 #: src/screens/Messages/ChatList.tsx:167 -#: src/screens/Messages/ChatList.tsx:380 -#: src/screens/Messages/ChatList.tsx:381 -#: src/screens/Messages/ChatList.tsx:517 +#: src/screens/Messages/ChatList.tsx:382 +#: src/screens/Messages/ChatList.tsx:383 +#: src/screens/Messages/ChatList.tsx:524 msgid "New chat" msgstr "" @@ -7360,19 +7401,19 @@ msgstr "" msgid "New followers" msgstr "" -#: src/components/dms/InitiateChatFlow.tsx:239 +#: src/components/dms/InitiateChatFlow.tsx:241 msgid "New group chat" msgstr "New group chat" #. Button used to create a new group chat. #. Button used to create a new group chat. -#: src/components/dms/InitiateChatFlow.tsx:777 -#: src/components/dms/InitiateChatFlow.tsx:811 +#: src/components/dms/InitiateChatFlow.tsx:780 +#: src/components/dms/InitiateChatFlow.tsx:814 msgctxt "action" msgid "New group chat" msgstr "New group chat" -#: src/components/dms/InitiateChatFlow.tsx:276 +#: src/components/dms/InitiateChatFlow.tsx:278 msgid "New group chat with:" msgstr "New group chat with:" @@ -7438,8 +7479,8 @@ msgstr "" #: src/components/contacts/screens/ViewMatches.tsx:395 #: src/components/contacts/screens/ViewMatches.tsx:410 -#: src/components/dms/AddMembersFlow.tsx:318 -#: src/components/dms/InitiateChatFlow.tsx:470 +#: src/components/dms/AddMembersFlow.tsx:313 +#: src/components/dms/InitiateChatFlow.tsx:474 #: src/screens/Login/ForgotPasswordForm.tsx:149 #: src/screens/Login/ForgotPasswordForm.tsx:156 #: src/screens/Login/SetNewPasswordForm.tsx:186 @@ -7554,12 +7595,12 @@ msgstr "" msgid "No notifications yet!" msgstr "" -#: src/screens/Messages/Settings.tsx:88 +#: src/screens/Messages/Settings.tsx:91 msgctxt "allow group chat invites from" msgid "No one" msgstr "No one" -#: src/screens/Messages/Settings.tsx:70 +#: src/screens/Messages/Settings.tsx:73 msgctxt "allow messages from" msgid "No one" msgstr "" @@ -7611,8 +7652,8 @@ msgid "No result" msgstr "" #: src/components/dialogs/SearchablePeopleList.tsx:250 -#: src/components/dms/AddMembersFlow.tsx:250 -#: src/components/dms/InitiateChatFlow.tsx:350 +#: src/components/dms/AddMembersFlow.tsx:245 +#: src/components/dms/InitiateChatFlow.tsx:354 #: src/components/ProgressGuide/FollowDialog.tsx:221 msgid "No results" msgstr "" @@ -7703,7 +7744,7 @@ msgstr "" msgid "Not ready to hit post? Keep your best ideas in Drafts until the timing is just right." msgstr "" -#: src/view/com/profile/ProfileMenu.tsx:570 +#: src/view/com/profile/ProfileMenu.tsx:545 msgid "Note about sharing" msgstr "" @@ -7727,8 +7768,8 @@ msgstr "" msgid "Notification settings" msgstr "" -#: src/screens/Messages/Settings.tsx:230 -#: src/screens/Messages/Settings.tsx:243 +#: src/screens/Messages/Settings.tsx:244 +#: src/screens/Messages/Settings.tsx:257 msgid "Notification sounds" msgstr "" @@ -7782,7 +7823,7 @@ msgstr "" #: src/components/BotAccountAlert.tsx:52 #: src/components/BotAccountAlert.tsx:57 -#: src/components/dms/InitiateChatFlow.tsx:710 +#: src/components/dms/InitiateChatFlow.tsx:713 #: src/components/dms/MessageItem.tsx:641 #: src/screens/Login/PasswordUpdatedForm.tsx:37 #: src/screens/PostThread/components/ThreadItemAnchor.tsx:663 @@ -7816,11 +7857,11 @@ msgstr "One of the selected recipients does not allow group chats." msgid "One of the selected recipients has blocked you and cannot be messaged." msgstr "One of the selected recipients has blocked you and cannot be messaged." -#: src/view/com/composer/Composer.tsx:856 +#: src/view/com/composer/Composer.tsx:864 msgid "One or more GIFs is missing alt text." msgstr "" -#: src/view/com/composer/Composer.tsx:853 +#: src/view/com/composer/Composer.tsx:861 msgid "One or more images is missing alt text." msgstr "" @@ -7832,11 +7873,11 @@ msgstr "" msgid "One or more of your selected files are too large. Maximum size is {VIDEO_MAX_SIZE_MB} MB." msgstr "One or more of your selected files are too large. Maximum size is {VIDEO_MAX_SIZE_MB} MB." -#: src/view/com/composer/Composer.tsx:651 +#: src/view/com/composer/Composer.tsx:659 msgid "One or more posts are too long to save as a draft. {MAX_DRAFT_GRAPHEME_LENGTH, plural, one {The maximum number of characters is # character.} other {The maximum number of characters is # characters.}}" msgstr "" -#: src/view/com/composer/Composer.tsx:863 +#: src/view/com/composer/Composer.tsx:871 msgid "One or more videos is missing alt text." msgstr "" @@ -7849,7 +7890,7 @@ msgstr "" #. placeholder {0}: result.accepted.length #. placeholder {1}: next.length #. placeholder {2}: next.length -#: src/view/com/composer/Composer.tsx:226 +#: src/view/com/composer/Composer.tsx:234 msgid "Only {0} of {1} {2, plural, one {image} other {images}} added; limit is {MAX_GALLERY_IMAGES}" msgstr "Only {0} of {1} {2, plural, one {image} other {images}} added; limit is {MAX_GALLERY_IMAGES}" @@ -7861,7 +7902,7 @@ msgstr "Only admins can accept join requests." msgid "Only admins can ignore join requests." msgstr "Only admins can ignore join requests." -#: src/components/intents/GroupChatJoinDialog.tsx:125 +#: src/components/intents/GroupChatJoinDialog.tsx:126 msgid "Only followers can join this group chat." msgstr "Only followers can join this group chat." @@ -7875,13 +7916,13 @@ msgstr "" msgid "Only image files are supported" msgstr "" -#. placeholder {0}: createSanitizedDisplayName( data.joinLinkPreviews[0].owner, true, moderateProfile( data.joinLinkPreviews[0].owner, moderationOpts, ).ui('displayName'), ) -#: src/screens/Messages/JoinRequest.tsx:207 +#. placeholder {0}: createSanitizedDisplayName( joinLinkPreview.owner, true, moderateProfile(joinLinkPreview.owner, moderationOpts).ui( 'displayName', ), ) +#: src/screens/Messages/JoinRequest.tsx:208 msgid "Only people {0} follows can join." msgstr "Only people {0} follows can join." -#: src/components/dms/ChatInvite/Root.tsx:115 -#: src/components/intents/GroupChatJoinDialog.tsx:269 +#: src/components/dms/ChatInvite/Root.tsx:112 +#: src/components/intents/GroupChatJoinDialog.tsx:265 msgid "Only people the chat owner follows can join" msgstr "Only people the chat owner follows can join" @@ -7910,17 +7951,17 @@ msgstr "" msgid "Open camera" msgstr "" -#: src/components/dms/ChatInvite/Root.tsx:87 -#: src/components/intents/GroupChatJoinDialog.tsx:408 +#: src/components/dms/ChatInvite/Root.tsx:89 +#: src/components/intents/GroupChatJoinDialog.tsx:401 msgid "Open chat" msgstr "Open chat" -#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:137 +#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:139 msgid "Open chat member options for {displayName}" msgstr "Open chat member options for {displayName}" -#: src/screens/Messages/components/ChatListItem.tsx:486 -#: src/screens/Messages/components/ChatListItem.tsx:490 +#: src/screens/Messages/components/ChatListItem.tsx:488 +#: src/screens/Messages/components/ChatListItem.tsx:492 msgid "Open conversation options" msgstr "" @@ -7934,7 +7975,7 @@ msgstr "" #: src/screens/Messages/components/MessageComposer.tsx:176 #: src/screens/Messages/components/MessageInput.web.tsx:148 -#: src/view/com/composer/Composer.tsx:2112 +#: src/view/com/composer/Composer.tsx:2145 msgid "Open emoji picker" msgstr "" @@ -7955,17 +7996,17 @@ msgstr "" msgid "Open Germ DM" msgstr "" -#: src/components/intents/GroupChatJoinDialog.tsx:401 +#: src/components/intents/GroupChatJoinDialog.tsx:394 msgid "Open group chat" msgstr "Open group chat" -#: src/components/dms/MessagesListHeader.tsx:168 -#: src/components/dms/MessagesListHeader.tsx:207 +#: src/components/dms/MessagesListHeader.tsx:169 +#: src/components/dms/MessagesListHeader.tsx:209 msgid "Open group chat settings" msgstr "Open group chat settings" #: src/components/Post/Embed/ExternalEmbed/index.tsx:88 -#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:140 +#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:141 msgid "Open link to {niceUrl}" msgstr "" @@ -8016,7 +8057,7 @@ msgstr "" msgid "Open system log" msgstr "" -#: src/components/intents/GroupChatJoinDialog.tsx:402 +#: src/components/intents/GroupChatJoinDialog.tsx:395 msgid "Open this group chat" msgstr "Open this group chat" @@ -8107,7 +8148,7 @@ msgstr "" msgid "Opens post language settings" msgstr "" -#: src/components/dms/SystemMessageItem.tsx:60 +#: src/components/dms/SystemMessageItem.tsx:61 msgid "Opens profile" msgstr "Opens profile" @@ -8362,8 +8403,8 @@ msgstr "" msgid "Pin to Home" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:514 -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:519 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:515 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:520 msgid "Pin to your profile" msgstr "" @@ -8589,7 +8630,7 @@ msgstr "" msgid "Porn" msgstr "" -#: src/view/com/composer/Composer.tsx:1760 +#: src/view/com/composer/Composer.tsx:1793 msgctxt "action" msgid "Post" msgstr "" @@ -8609,12 +8650,12 @@ msgstr "" msgid "Post a video" msgstr "" -#: src/view/com/composer/Composer.tsx:1758 +#: src/view/com/composer/Composer.tsx:1791 msgctxt "action" msgid "Post All" msgstr "" -#: src/view/com/composer/Composer.tsx:1422 +#: src/view/com/composer/Composer.tsx:1455 msgid "Post anyway" msgstr "Post anyway" @@ -8630,12 +8671,12 @@ msgstr "" msgid "Post by @{0}" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:199 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:200 msgctxt "toast" msgid "Post deleted" msgstr "" -#: src/lib/api/index.ts:189 +#: src/lib/api/index.ts:190 msgid "Post failed to upload. Please check your Internet connection and try again." msgstr "" @@ -8787,15 +8828,15 @@ msgstr "" msgid "Privacy violation of a minor" msgstr "" -#: src/view/com/composer/Composer.tsx:2546 +#: src/view/com/composer/Composer.tsx:2579 msgid "Processing GIF..." msgstr "" -#: src/view/com/composer/Composer.tsx:2548 +#: src/view/com/composer/Composer.tsx:2581 msgid "Processing video..." msgstr "" -#: src/lib/api/index.ts:62 +#: src/lib/api/index.ts:63 msgid "Processing..." msgstr "" @@ -8836,22 +8877,22 @@ msgid "Public, sharable lists of users to mute or block in bulk." msgstr "" #. Accessibility label for button to publish a single post -#: src/view/com/composer/Composer.tsx:1744 +#: src/view/com/composer/Composer.tsx:1777 msgid "Publish post" msgstr "" #. Accessibility label for button to publish multiple posts in a thread -#: src/view/com/composer/Composer.tsx:1739 +#: src/view/com/composer/Composer.tsx:1772 msgid "Publish posts" msgstr "" #. Accessibility label for button to publish multiple replies in a thread -#: src/view/com/composer/Composer.tsx:1728 +#: src/view/com/composer/Composer.tsx:1761 msgid "Publish replies" msgstr "" #. Accessibility label for button to publish a single reply -#: src/view/com/composer/Composer.tsx:1733 +#: src/view/com/composer/Composer.tsx:1766 msgid "Publish reply" msgstr "" @@ -8891,11 +8932,11 @@ msgstr "" msgid "Quote post" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:350 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:351 msgid "Quote post was re-attached" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:349 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:350 msgid "Quote post was successfully detached" msgstr "" @@ -8925,8 +8966,8 @@ msgstr "" msgid "Rate limit exceeded. Please try again later." msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:690 -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:700 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:691 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:701 msgid "Re-attach quote" msgstr "" @@ -9047,11 +9088,21 @@ msgstr "Refresh the page to see it." msgid "Reject" msgstr "" +#. Reject a request to join a chat +#: src/screens/Messages/JoinRequests.tsx:483 +msgctxt "button" +msgid "Reject" +msgstr "Reject" + #: src/screens/Messages/components/RequestButtons.tsx:125 msgid "Reject chat request" msgstr "" -#: src/screens/Messages/ChatList.tsx:349 +#: src/screens/Messages/JoinRequests.tsx:477 +msgid "Reject join request" +msgstr "Reject join request" + +#: src/screens/Messages/ChatList.tsx:351 #: src/screens/Messages/Inbox.tsx:218 msgid "Reload conversations" msgstr "" @@ -9064,6 +9115,8 @@ msgstr "" #: src/components/StarterPack/Wizard/WizardListCard.tsx:106 #: src/components/StarterPack/Wizard/WizardListCard.tsx:113 #: src/screens/Bookmarks/index.tsx:265 +#: src/screens/Messages/ConversationSettings/Member.tsx:162 +#: src/screens/Messages/ConversationSettings/prompts.tsx:170 #: src/screens/Moderation/index.tsx:477 #: src/screens/Settings/Settings.tsx:673 #: src/view/com/modals/UserAddRemoveLists.tsx:236 @@ -9079,10 +9132,15 @@ msgstr "Remove {displayName} from group chat" msgid "Remove {displayName} from starter pack" msgstr "" -#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:229 +#: src/screens/Messages/ConversationSettings/Member.tsx:157 +#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:231 msgid "Remove {displayName} from this group chat" msgstr "Remove {displayName} from this group chat" +#: src/screens/Messages/ConversationSettings/prompts.tsx:168 +msgid "Remove {displayName}?" +msgstr "Remove {displayName}?" + #: src/screens/Search/components/SearchHistory.tsx:105 msgid "Remove {historyItem}" msgstr "" @@ -9115,9 +9173,9 @@ msgstr "" msgid "Remove caption file" msgstr "Remove caption file" -#: src/screens/Messages/components/MessageInputEmbed.tsx:234 -#: src/screens/Messages/components/MessageInputEmbed.tsx:289 -#: src/screens/Messages/components/MessageInputEmbed.tsx:355 +#: src/screens/Messages/components/MessageInputEmbed.tsx:236 +#: src/screens/Messages/components/MessageInputEmbed.tsx:291 +#: src/screens/Messages/components/MessageInputEmbed.tsx:365 msgid "Remove embed" msgstr "" @@ -9131,7 +9189,7 @@ msgstr "" msgid "Remove feed?" msgstr "" -#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:233 +#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:235 msgid "Remove from chat" msgstr "Remove from chat" @@ -9305,7 +9363,7 @@ msgstr "" msgid "Replies to this post are disabled." msgstr "" -#: src/view/com/composer/Composer.tsx:1756 +#: src/view/com/composer/Composer.tsx:1789 msgctxt "action" msgid "Reply" msgstr "" @@ -9334,18 +9392,18 @@ msgstr "" msgid "Reply sorting" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:388 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:389 msgctxt "toast" msgid "Reply visibility updated" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:387 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:388 msgid "Reply was successfully hidden" msgstr "" -#: src/components/dms/MessageContextMenu.tsx:176 +#: src/components/dms/MessageContextMenu.tsx:189 #: src/features/liveNow/components/LiveStatusDialog.tsx:267 -#: src/screens/Messages/ConversationSettings/index.tsx:550 +#: src/screens/Messages/ConversationSettings/index.tsx:569 msgid "Report" msgstr "" @@ -9376,12 +9434,12 @@ msgstr "" msgid "Report list" msgstr "" -#: src/components/dms/MessageContextMenu.tsx:173 +#: src/components/dms/MessageContextMenu.tsx:186 msgid "Report message" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:756 -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:758 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:757 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:759 msgid "Report post" msgstr "" @@ -9410,7 +9468,7 @@ msgstr "" msgid "Report this feed" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:549 +#: src/screens/Messages/ConversationSettings/index.tsx:568 msgid "Report this group chat" msgstr "Report this group chat" @@ -9490,7 +9548,7 @@ msgstr "" msgid "Reposts of your reposts" msgstr "" -#: src/components/intents/GroupChatJoinDialog.tsx:418 +#: src/components/intents/GroupChatJoinDialog.tsx:411 msgid "Request access to group chat" msgstr "Request access to group chat" @@ -9507,12 +9565,12 @@ msgstr "" msgid "Request ignored." msgstr "Request ignored." -#: src/components/dms/ChatInvite/Root.tsx:100 -#: src/components/intents/GroupChatJoinDialog.tsx:253 +#: src/components/dms/ChatInvite/Root.tsx:102 +#: src/components/intents/GroupChatJoinDialog.tsx:254 msgid "Request to join" msgstr "Request to join" -#: src/components/dms/ChatInvite/Root.tsx:119 +#: src/components/dms/ChatInvite/Root.tsx:116 msgid "Requested" msgstr "Requested" @@ -9544,9 +9602,9 @@ msgstr "" msgid "Required in your region" msgstr "" -#: src/components/intents/GroupChatJoinDialog.tsx:273 -#: src/screens/Messages/components/OutgoingRequestListItem.tsx:116 -#: src/screens/Messages/components/OutgoingRequestListItem.tsx:118 +#: src/components/intents/GroupChatJoinDialog.tsx:269 +#: src/screens/Messages/components/OutgoingRequestListItem.tsx:123 +#: src/screens/Messages/components/OutgoingRequestListItem.tsx:125 msgid "Rescind request" msgstr "Rescind request" @@ -9625,7 +9683,7 @@ msgstr "" #: src/components/StarterPack/ProfileStarterPacks.tsx:377 #: src/screens/Login/LoginForm.tsx:329 #: src/screens/Login/LoginForm.tsx:335 -#: src/screens/Messages/ChatList.tsx:354 +#: src/screens/Messages/ChatList.tsx:356 #: src/screens/Messages/components/MessageListError.tsx:24 #: src/screens/Messages/Inbox.tsx:223 #: src/screens/Messages/JoinRequests.tsx:355 @@ -9706,27 +9764,27 @@ msgstr "" #: src/screens/SavedFeeds.tsx:124 #: src/screens/SavedFeeds.tsx:311 #: src/screens/SavedFeeds.tsx:315 -#: src/view/com/composer/Composer.tsx:1403 +#: src/view/com/composer/Composer.tsx:1436 #: src/view/com/composer/drafts/DraftsButton.tsx:125 msgid "Save changes" msgstr "" -#: src/view/com/composer/Composer.tsx:1375 +#: src/view/com/composer/Composer.tsx:1408 #: src/view/com/composer/drafts/DraftsButton.tsx:93 msgid "Save changes?" msgstr "" -#: src/view/com/composer/Composer.tsx:1403 +#: src/view/com/composer/Composer.tsx:1436 #: src/view/com/composer/drafts/DraftsButton.tsx:125 msgid "Save draft" msgstr "" -#: src/view/com/composer/Composer.tsx:1377 +#: src/view/com/composer/Composer.tsx:1410 #: src/view/com/composer/drafts/DraftsButton.tsx:95 msgid "Save draft?" msgstr "" -#: src/components/Lightbox/chrome/ImageMenu.tsx:99 +#: src/components/Lightbox/chrome/ImageMenu.tsx:98 #: src/components/MediaPreview.tsx:231 #: src/components/Post/Embed/ImageContextMenu.tsx:70 #: src/components/StarterPack/ShareDialog.tsx:144 @@ -9781,7 +9839,7 @@ msgid "Say hello!" msgstr "" #: src/screens/Messages/ChatList.tsx:157 -#: src/screens/Messages/ChatList.tsx:371 +#: src/screens/Messages/ChatList.tsx:373 msgid "Say hi to someone" msgstr "Say hi to someone" @@ -9891,8 +9949,8 @@ msgstr "" msgid "Search my posts" msgstr "" -#: src/view/com/profile/ProfileMenu.tsx:304 -#: src/view/com/profile/ProfileMenu.tsx:307 +#: src/view/com/profile/ProfileMenu.tsx:306 +#: src/view/com/profile/ProfileMenu.tsx:309 msgid "Search posts" msgstr "" @@ -10057,7 +10115,7 @@ msgstr "" msgid "Select GIF \"{0}\"" msgstr "" -#: src/components/dms/InitiateChatFlow.tsx:702 +#: src/components/dms/InitiateChatFlow.tsx:705 msgid "Select group chat members" msgstr "Select group chat members" @@ -10203,7 +10261,7 @@ msgid "Send via direct message" msgstr "" #. placeholder {0}: i18n.date(new Date(message.sentAt), { timeStyle: 'short', }) -#: src/components/dms/MessageContextMenu.tsx:137 +#: src/components/dms/MessageContextMenu.tsx:150 msgid "Sent at {0}" msgstr "Sent at {0}" @@ -10319,7 +10377,7 @@ msgstr "" msgid "Share" msgstr "" -#: src/view/com/profile/ProfileMenu.tsx:575 +#: src/view/com/profile/ProfileMenu.tsx:548 msgid "Share anyway" msgstr "" @@ -10328,7 +10386,7 @@ msgstr "" msgid "Share author DID" msgstr "" -#: src/components/Lightbox/chrome/ImageMenu.tsx:94 +#: src/components/Lightbox/chrome/ImageMenu.tsx:93 #: src/components/Lightbox/Lightbox.web.tsx:281 #: src/components/Lightbox/Lightbox.web.tsx:307 msgid "Share image" @@ -10373,8 +10431,8 @@ msgstr "" #: src/screens/ProfileList/components/MoreOptionsMenu.tsx:166 #: src/screens/StarterPack/StarterPackScreen.tsx:638 #: src/screens/StarterPack/StarterPackScreen.tsx:646 -#: src/view/com/profile/ProfileMenu.tsx:282 -#: src/view/com/profile/ProfileMenu.tsx:295 +#: src/view/com/profile/ProfileMenu.tsx:285 +#: src/view/com/profile/ProfileMenu.tsx:297 msgid "Share via..." msgstr "" @@ -10428,8 +10486,8 @@ msgstr "" msgid "Show group chat updates" msgstr "Show group chat updates" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:593 -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:595 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:594 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:596 msgid "Show less like this" msgstr "" @@ -10450,8 +10508,8 @@ msgstr "" msgid "Show More" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:585 -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:587 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:586 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:588 msgid "Show more like this" msgstr "" @@ -10477,8 +10535,8 @@ msgstr "" msgid "Show replies as" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:664 -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:674 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:665 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:675 msgid "Show reply for everyone" msgstr "" @@ -10562,7 +10620,7 @@ msgstr "" msgid "Sign in or create your account to join the conversation!" msgstr "" -#: src/screens/Messages/JoinRequest.tsx:205 +#: src/screens/Messages/JoinRequest.tsx:206 msgid "Sign in to accept invite." msgstr "Sign in to accept invite." @@ -10574,12 +10632,12 @@ msgstr "" msgid "Sign in to Bluesky or create a new account" msgstr "" -#: src/screens/Messages/JoinRequest.tsx:204 +#: src/screens/Messages/JoinRequest.tsx:205 msgid "Sign in to request access to this group chat." msgstr "Sign in to request access to this group chat." -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:571 -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:573 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:572 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:574 msgid "Sign in to view post" msgstr "" @@ -10632,7 +10690,7 @@ msgstr "" msgid "Skip contact sharing and continue to the app" msgstr "" -#: src/view/com/composer/Composer.tsx:1420 +#: src/view/com/composer/Composer.tsx:1453 msgid "Skip empty posts?" msgstr "Skip empty posts?" @@ -10737,7 +10795,7 @@ msgid "Something wasn't quite right with the data you're trying to report. Pleas msgstr "" #: src/screens/Messages/Conversation.tsx:137 -#: src/screens/Messages/ConversationSettings/index.tsx:118 +#: src/screens/Messages/ConversationSettings/index.tsx:131 #: src/screens/Messages/JoinRequests.tsx:87 msgid "Something went wrong" msgstr "" @@ -10828,12 +10886,12 @@ msgstr "" msgid "Start adding people!" msgstr "" -#: src/components/dms/InitiateChatFlow.tsx:703 +#: src/components/dms/InitiateChatFlow.tsx:706 msgid "Start chat" msgstr "Start chat" #: src/components/dialogs/SearchablePeopleList.tsx:428 -#: src/components/dms/InitiateChatFlow.tsx:851 +#: src/components/dms/InitiateChatFlow.tsx:854 msgid "Start chat with {displayName}" msgstr "" @@ -10941,13 +10999,13 @@ msgid "Subscribe" msgstr "" #. placeholder {0}: highlightedPublisher.name -#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:424 -#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:453 +#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:425 +#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:454 msgid "Subscribe on {0}" msgstr "Subscribe on {0}" #. placeholder {0}: highlightedPublisher.name -#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:452 +#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:453 msgid "Subscribe to {publicationTitle} on {0}" msgstr "Subscribe to {publicationTitle} on {0}" @@ -10982,7 +11040,7 @@ msgstr "" msgid "Success!" msgstr "" -#: src/components/intents/GroupChatJoinDialog.tsx:101 +#: src/components/intents/GroupChatJoinDialog.tsx:102 msgid "Successfully joined the group chat!" msgstr "Successfully joined the group chat!" @@ -10990,8 +11048,8 @@ msgstr "Successfully joined the group chat!" msgid "Successfully verified" msgstr "" -#: src/components/dms/AddMembersFlow.tsx:236 -#: src/components/dms/InitiateChatFlow.tsx:329 +#: src/components/dms/AddMembersFlow.tsx:231 +#: src/components/dms/InitiateChatFlow.tsx:328 msgid "Suggested" msgstr "Suggested" @@ -11104,7 +11162,7 @@ msgstr "" msgid "Tap to close context menu" msgstr "" -#: src/components/dms/ChatInvite/Root.tsx:75 +#: src/components/dms/ChatInvite/Root.tsx:77 msgid "Tap to copy this invite link" msgstr "Tap to copy this invite link" @@ -11112,12 +11170,12 @@ msgstr "Tap to copy this invite link" msgid "Tap to dismiss" msgstr "" -#: src/components/dms/ChatInvite/Root.tsx:128 -#: src/components/intents/GroupChatJoinDialog.tsx:424 +#: src/components/dms/ChatInvite/Root.tsx:125 +#: src/components/intents/GroupChatJoinDialog.tsx:417 msgid "Tap to join this group chat immediately" msgstr "Tap to join this group chat immediately" -#: src/components/dms/ChatInvite/Root.tsx:88 +#: src/components/dms/ChatInvite/Root.tsx:90 msgid "Tap to open this group chat" msgstr "Tap to open this group chat" @@ -11130,8 +11188,8 @@ msgstr "Tap to remove" msgid "Tap to remove your {0} reaction" msgstr "Tap to remove your {0} reaction" -#: src/components/dms/ChatInvite/Root.tsx:127 -#: src/components/intents/GroupChatJoinDialog.tsx:423 +#: src/components/dms/ChatInvite/Root.tsx:124 +#: src/components/intents/GroupChatJoinDialog.tsx:416 msgid "Tap to request access to join this group chat" msgstr "Tap to request access to join this group chat" @@ -11249,9 +11307,9 @@ msgstr "" msgid "That's everything!" msgstr "" +#: src/components/moderation/BlockDialog.tsx:153 #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:201 #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:415 -#: src/view/com/profile/ProfileMenu.tsx:551 msgid "The account will be able to interact with you after unblocking." msgstr "" @@ -11317,7 +11375,7 @@ msgstr "" msgid "The laws in your region require you to verify you're an adult to access certain features. Tap to learn more." msgstr "" -#: src/components/intents/GroupChatJoinDialog.tsx:135 +#: src/components/intents/GroupChatJoinDialog.tsx:136 #: src/screens/Messages/JoinRequests.tsx:200 msgid "The member limit has been reached." msgstr "The member limit has been reached." @@ -11388,8 +11446,8 @@ msgid "There was a problem loading GIFs. Check your connection and try again." msgstr "There was a problem loading GIFs. Check your connection and try again." #: src/components/contacts/screens/GetContacts.tsx:147 -#: src/components/intents/GroupChatJoinDialog.tsx:119 -#: src/components/intents/GroupChatJoinDialog.tsx:153 +#: src/components/intents/GroupChatJoinDialog.tsx:120 +#: src/components/intents/GroupChatJoinDialog.tsx:154 #: src/screens/Messages/components/OutgoingRequestListItem.tsx:39 msgid "There was a problem with your internet connection, please try again" msgstr "" @@ -11444,12 +11502,12 @@ msgid "There was an issue updating your feeds, please check your internet connec msgstr "" #. placeholder {0}: e.toString() -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:431 -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:454 -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:474 -#: src/screens/Messages/ConversationSettings/Member.tsx:59 -#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:109 -#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:122 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:432 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:455 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:475 +#: src/screens/Messages/ConversationSettings/Member.tsx:71 +#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:111 +#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:124 #: src/screens/PostThread/components/ThreadItemAnchorFollowButton.tsx:117 #: src/screens/PostThread/components/ThreadItemAnchorFollowButton.tsx:130 #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:93 @@ -11457,11 +11515,11 @@ msgstr "" #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:299 #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:315 #: src/view/com/profile/ProfileMenu.tsx:152 -#: src/view/com/profile/ProfileMenu.tsx:164 -#: src/view/com/profile/ProfileMenu.tsx:180 -#: src/view/com/profile/ProfileMenu.tsx:192 -#: src/view/com/profile/ProfileMenu.tsx:207 -#: src/view/com/profile/ProfileMenu.tsx:221 +#: src/view/com/profile/ProfileMenu.tsx:165 +#: src/view/com/profile/ProfileMenu.tsx:182 +#: src/view/com/profile/ProfileMenu.tsx:195 +#: src/view/com/profile/ProfileMenu.tsx:211 +#: src/view/com/profile/ProfileMenu.tsx:226 msgid "There was an issue! {0}" msgstr "" @@ -11497,6 +11555,14 @@ msgstr "" msgid "These settings only apply to the Following feed." msgstr "" +#: src/components/moderation/BlockDialog.tsx:356 +msgid "They own this chat" +msgstr "They own this chat" + +#: src/screens/Messages/ConversationSettings/prompts.tsx:169 +msgid "They won’t be able to rejoin unless you invite them again." +msgstr "They won’t be able to rejoin unless you invite them again." + #: src/components/moderation/ScreenHider.tsx:118 msgid "This {screenDescription} has been flagged:" msgstr "" @@ -11547,12 +11613,12 @@ msgstr "" msgid "This chat has ended" msgstr "This chat has ended" -#: src/components/dms/ChatInvite/Root.tsx:110 -#: src/components/intents/GroupChatJoinDialog.tsx:264 +#: src/components/dms/ChatInvite/Root.tsx:107 +#: src/components/intents/GroupChatJoinDialog.tsx:260 msgid "This chat is full" msgstr "This chat is full" -#: src/screens/Messages/components/ChatListItem.tsx:372 +#: src/screens/Messages/components/ChatListItem.tsx:374 #: src/screens/Messages/components/ChatLocked.tsx:61 msgid "This chat is locked" msgstr "This chat is locked" @@ -11591,7 +11657,7 @@ msgstr "" msgid "This content is not viewable without a Bluesky account." msgstr "" -#: src/components/intents/GroupChatJoinDialog.tsx:121 +#: src/components/intents/GroupChatJoinDialog.tsx:122 msgid "This conversation is locked." msgstr "This conversation is locked." @@ -11653,15 +11719,11 @@ msgstr "This image could not be used. Try a different format like .jpg or .png." msgid "This information is private and not shared with other users." msgstr "" -#: src/components/intents/GroupChatJoinDialog.tsx:131 +#: src/components/intents/GroupChatJoinDialog.tsx:132 msgid "This invite link has been disabled." msgstr "This invite link has been disabled." -#: src/screens/Messages/JoinRequest.tsx:83 -msgid "This invite link has expired" -msgstr "This invite link has expired" - -#: src/components/intents/GroupChatJoinDialog.tsx:195 +#: src/components/intents/GroupChatJoinDialog.tsx:196 msgid "This invite link is invalid" msgstr "This invite link is invalid" @@ -11707,6 +11769,10 @@ msgstr "" msgid "This list is empty." msgstr "" +#: src/screens/Messages/components/ChatListItem.tsx:335 +msgid "This message is hidden" +msgstr "This message is hidden" + #: src/components/dms/MessageItem.tsx:578 #: src/components/dms/MessageItem.tsx:607 msgid "This message is hidden because this user is blocking you." @@ -11747,23 +11813,23 @@ msgstr "" msgid "This post was deleted by its author" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:809 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:810 msgid "This post will be hidden from feeds and threads. This cannot be undone." msgstr "" -#: src/view/com/composer/Composer.tsx:1033 +#: src/view/com/composer/Composer.tsx:1043 msgid "This post's author has disabled quote posts." msgstr "" -#: src/view/com/profile/ProfileMenu.tsx:572 +#: src/view/com/profile/ProfileMenu.tsx:546 msgid "This profile is only visible to logged-in users. It won't be visible to people who aren't signed in." msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:844 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:845 msgid "This reply will be sorted into a hidden section at the bottom of your thread and will mute notifications for subsequent replies - both for yourself and others." msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:137 +#: src/screens/Messages/ConversationSettings/index.tsx:150 #: src/screens/Messages/JoinRequests.tsx:110 msgid "This screen is only available for group conversations." msgstr "This screen is only available for group conversations." @@ -11849,7 +11915,7 @@ msgstr "" msgid "This will remove @{0} from the quick access list." msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:837 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:838 msgid "This will remove your post from this quote post for all users, and replace it with a placeholder." msgstr "" @@ -11948,12 +12014,12 @@ msgstr "" msgid "Topic" msgstr "" -#: src/components/dms/MessageContextMenu.tsx:145 -#: src/components/dms/MessageContextMenu.tsx:148 +#: src/components/dms/MessageContextMenu.tsx:158 +#: src/components/dms/MessageContextMenu.tsx:161 #: src/components/Post/Translated/index.tsx:150 #: src/components/Post/Translated/index.tsx:157 -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:553 -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:555 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:554 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:556 msgid "Translate" msgstr "" @@ -11965,8 +12031,8 @@ msgstr "Translated" msgid "Translating" msgstr "Translating" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:537 -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:539 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:538 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:540 msgid "Translating…" msgstr "Translating…" @@ -12096,13 +12162,15 @@ msgstr "" #: src/components/dms/MessageItem.tsx:645 #: src/components/dms/MessagesListBlockedFooter.tsx:97 #: src/components/dms/MessagesListBlockedFooter.tsx:104 -#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:222 +#: src/components/moderation/BlockDialog.tsx:186 +#: src/components/moderation/BlockDialog.tsx:190 +#: src/components/moderation/BlockDialog.tsx:211 +#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:224 #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:207 #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:358 #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:420 #: src/screens/ProfileList/components/Header.tsx:166 #: src/screens/ProfileList/components/Header.tsx:173 -#: src/view/com/profile/ProfileMenu.tsx:563 msgid "Unblock" msgstr "" @@ -12111,7 +12179,7 @@ msgctxt "action" msgid "Unblock" msgstr "" -#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:210 +#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:212 msgid "Unblock {displayName}" msgstr "Unblock {displayName}" @@ -12122,9 +12190,12 @@ msgstr "Unblock {displayName}" msgid "Unblock account" msgstr "" +#: src/components/moderation/BlockDialog.tsx:146 +msgid "Unblock account?" +msgstr "Unblock account?" + #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:199 #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:413 -#: src/view/com/profile/ProfileMenu.tsx:545 msgid "Unblock Account?" msgstr "" @@ -12165,7 +12236,7 @@ msgstr "" msgid "Unfollow {0}" msgstr "" -#: src/view/com/profile/ProfileMenu.tsx:324 +#: src/view/com/profile/ProfileMenu.tsx:325 #: src/view/com/profile/ProfileMenu.tsx:334 msgid "Unfollow account" msgstr "" @@ -12212,7 +12283,7 @@ msgstr "" msgid "Unlock chat" msgstr "Unlock chat" -#: src/screens/Messages/ConversationSettings/index.tsx:534 +#: src/screens/Messages/ConversationSettings/index.tsx:553 msgid "Unlock this group chat" msgstr "Unlock this group chat" @@ -12233,8 +12304,8 @@ msgstr "" msgid "Unmute {0}" msgstr "Unmute {0}" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:729 -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:735 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:730 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:736 #: src/view/com/profile/ProfileMenu.tsx:447 #: src/view/com/profile/ProfileMenu.tsx:453 msgid "Unmute account" @@ -12249,12 +12320,12 @@ msgstr "" msgid "Unmute list" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:496 +#: src/screens/Messages/ConversationSettings/index.tsx:515 msgid "Unmute this group chat" msgstr "Unmute this group chat" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:621 -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:624 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:622 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:625 msgid "Unmute thread" msgstr "" @@ -12279,8 +12350,8 @@ msgstr "" msgid "Unpin from home" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:514 -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:519 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:515 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:520 msgid "Unpin from profile" msgstr "" @@ -12328,7 +12399,7 @@ msgstr "" msgid "Unsupported clipboard content" msgstr "Unsupported clipboard content" -#: src/view/com/composer/Composer.tsx:1509 +#: src/view/com/composer/Composer.tsx:1542 msgid "Unsupported video type: {mimeType}" msgstr "" @@ -12386,12 +12457,12 @@ msgstr "" msgid "Update your location" msgstr "Update your location" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:355 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:356 msgctxt "toast" msgid "Updating quote attachment failed" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:404 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:405 msgctxt "toast" msgid "Updating reply visibility failed" msgstr "" @@ -12423,21 +12494,21 @@ msgstr "" msgid "Upload from Library" msgstr "" -#: src/view/com/composer/Composer.tsx:2539 +#: src/view/com/composer/Composer.tsx:2572 msgid "Uploading GIF..." msgstr "" -#: src/lib/api/index.ts:327 -#: src/lib/api/index.ts:354 +#: src/lib/api/index.ts:328 +#: src/lib/api/index.ts:355 msgid "Uploading images..." msgstr "" -#: src/lib/api/index.ts:426 -#: src/lib/api/index.ts:450 +#: src/lib/api/index.ts:427 +#: src/lib/api/index.ts:451 msgid "Uploading link thumbnail..." msgstr "" -#: src/view/com/composer/Composer.tsx:2541 +#: src/view/com/composer/Composer.tsx:2574 msgid "Uploading video..." msgstr "" @@ -12562,12 +12633,12 @@ msgstr "" msgid "users following <0>@{0}" msgstr "" -#: src/screens/Messages/Settings.tsx:81 +#: src/screens/Messages/Settings.tsx:84 msgctxt "allow group chat invites from" msgid "Users I follow" msgstr "Users I follow" -#: src/screens/Messages/Settings.tsx:66 +#: src/screens/Messages/Settings.tsx:69 msgctxt "allow messages from" msgid "Users I follow" msgstr "Users I follow" @@ -12726,7 +12797,7 @@ msgstr "" msgid "Video settings" msgstr "" -#: src/view/com/composer/Composer.tsx:2559 +#: src/view/com/composer/Composer.tsx:2592 msgid "Video uploaded" msgstr "" @@ -12743,14 +12814,14 @@ msgstr "" msgid "Videos must be less than 3 minutes long." msgstr "" -#: src/view/com/composer/Composer.tsx:1126 +#: src/view/com/composer/Composer.tsx:1136 msgctxt "Action to view the post the user just created" msgid "View" msgstr "" #. placeholder {0}: view.source.title -#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:317 -#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:615 +#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:318 +#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:640 msgid "View {0}" msgstr "View {0}" @@ -12775,19 +12846,14 @@ msgid "View {0}’s profile" msgstr "View {0}’s profile" #: src/components/dms/MessagesListHeader.tsx:111 -#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:183 +#: src/screens/Messages/ConversationSettings/MemberMenu.tsx:185 msgid "View {displayName}’s profile" msgstr "View {displayName}’s profile" -#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:455 +#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:456 msgid "View {publicationTitle}" msgstr "View {publicationTitle}" -#. placeholder {0}: authorProfile.handle -#: src/components/Post/Embed/StandardSiteEmbed/StandardSiteMetaRow.tsx:83 -msgid "View @{0}'s profile" -msgstr "View @{0}'s profile" - #: src/components/ProfileHoverCard/index.web.tsx:479 msgid "View blocked user's profile" msgstr "" @@ -12837,7 +12903,7 @@ msgstr "" msgid "View more trending videos" msgstr "" -#: src/view/com/composer/Composer.tsx:1121 +#: src/view/com/composer/Composer.tsx:1131 msgid "View post" msgstr "" @@ -12854,10 +12920,10 @@ msgstr "" msgid "View profile banner" msgstr "View profile banner" -#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:317 -#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:425 -#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:456 -#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:615 +#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:318 +#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:426 +#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:457 +#: src/components/Post/Embed/StandardSiteEmbed/index.tsx:640 msgid "View publication" msgstr "View publication" @@ -12865,7 +12931,7 @@ msgstr "View publication" msgid "View the avatar" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:521 +#: src/screens/Messages/ConversationSettings/index.tsx:540 msgid "View the invite link for this group chat" msgstr "View the invite link for this group chat" @@ -12988,7 +13054,7 @@ msgstr "" msgid "We couldn’t load this conversation’s join requests" msgstr "We couldn’t load this conversation’s join requests" -#: src/screens/Messages/ConversationSettings/index.tsx:119 +#: src/screens/Messages/ConversationSettings/index.tsx:132 msgid "We couldn’t load this conversation’s settings" msgstr "We couldn’t load this conversation’s settings" @@ -13099,7 +13165,7 @@ msgid "We're having network issues, try again" msgstr "" #: src/components/dms/AddMembersFlow.tsx:185 -#: src/components/dms/InitiateChatFlow.tsx:265 +#: src/components/dms/InitiateChatFlow.tsx:267 msgid "We’re having network issues, try again" msgstr "We’re having network issues, try again" @@ -13133,7 +13199,7 @@ msgstr "We’re sorry, but your search could not be completed. Please try again msgid "We're sorry, you cannot access this screen at this time." msgstr "" -#: src/view/com/composer/Composer.tsx:1031 +#: src/view/com/composer/Composer.tsx:1041 msgid "We're sorry! The post you are replying to has been deleted." msgstr "" @@ -13184,7 +13250,7 @@ msgid "What do you want to call your starter pack?" msgstr "" #: src/view/com/auth/SplashScreen.web.tsx:98 -#: src/view/com/composer/Composer.tsx:1473 +#: src/view/com/composer/Composer.tsx:1506 #: src/view/com/feeds/ComposerPrompt.tsx:193 msgid "What's up?" msgstr "" @@ -13211,7 +13277,7 @@ msgid "Who can verify?" msgstr "" #: src/screens/Home/NoFeedsPinned.tsx:80 -#: src/screens/Messages/ChatList.tsx:334 +#: src/screens/Messages/ChatList.tsx:336 #: src/screens/Messages/Inbox.tsx:203 msgid "Whoops!" msgstr "" @@ -13270,7 +13336,7 @@ msgstr "Would you like to block this user and/or leave this conversation?" msgid "Would you like to save this as a draft before viewing your drafts?" msgstr "" -#: src/view/com/composer/Composer.tsx:1391 +#: src/view/com/composer/Composer.tsx:1424 msgid "Would you like to save this as a draft to edit later?" msgstr "" @@ -13279,12 +13345,12 @@ msgstr "" msgid "Write a post" msgstr "" -#: src/view/com/composer/Composer.tsx:1569 +#: src/view/com/composer/Composer.tsx:1602 msgid "Write post" msgstr "" #: src/screens/PostThread/components/ThreadComposePrompt.tsx:91 -#: src/view/com/composer/Composer.tsx:1471 +#: src/view/com/composer/Composer.tsx:1504 msgid "Write your reply" msgstr "" @@ -13297,7 +13363,7 @@ msgstr "" msgid "Wrong DID returned from server. Received: {0}" msgstr "" -#: src/screens/Messages/ConversationSettings/index.tsx:136 +#: src/screens/Messages/ConversationSettings/index.tsx:149 #: src/screens/Messages/JoinRequests.tsx:109 msgid "Wrong kind of conversation" msgstr "Wrong kind of conversation" @@ -13325,11 +13391,11 @@ msgstr "" msgid "Yes, delete this starter pack" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:839 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:840 msgid "Yes, detach" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:846 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:847 msgid "Yes, hide" msgstr "" @@ -13437,8 +13503,8 @@ msgstr "" msgid "You can choose whether chat notifications have sound in the chat settings within the app" msgstr "" -#: src/screens/Messages/Settings.tsx:149 -#: src/screens/Messages/Settings.tsx:195 +#: src/screens/Messages/Settings.tsx:152 +#: src/screens/Messages/Settings.tsx:203 msgid "You can continue ongoing conversations regardless of which setting you choose." msgstr "" @@ -13452,11 +13518,11 @@ msgid "You can now sign in with your new password." msgstr "" #. Toast shown when the user tries to add more images but the post gallery is already at the cap -#: src/view/com/composer/Composer.tsx:213 +#: src/view/com/composer/Composer.tsx:221 msgid "You can only add up to {MAX_GALLERY_IMAGES, plural, other {# images}} per post" msgstr "You can only add up to {MAX_GALLERY_IMAGES, plural, other {# images}} per post" -#: src/view/com/composer/Composer.tsx:1396 +#: src/view/com/composer/Composer.tsx:1429 msgid "You can only save drafts up to 1000 characters." msgstr "" @@ -13491,6 +13557,11 @@ msgstr "You can select up to {MAX_GALLERY_IMAGES, plural, other {# images}} in t msgid "You can update this later from your settings." msgstr "" +#: src/components/dms/ActionsWrapper.web.tsx:79 +#: src/components/dms/MessageContextMenu.tsx:105 +msgid "You cannot add more than {EMOJI_REACTION_LIMIT, plural, one {# emoji reaction} other {# emoji reactions}}" +msgstr "You cannot add more than {EMOJI_REACTION_LIMIT, plural, one {# emoji reaction} other {# emoji reactions}}" + #: src/components/dms/dialogs/NewChatDialog.tsx:101 msgid "You cannot create a group chat yet." msgstr "You cannot create a group chat yet." @@ -13522,7 +13593,7 @@ msgstr "" msgid "You got here first" msgstr "" -#: src/components/intents/GroupChatJoinDialog.tsx:137 +#: src/components/intents/GroupChatJoinDialog.tsx:138 msgid "You have been previously removed from this group and can’t join it using this link." msgstr "You have been previously removed from this group and can’t join it using this link." @@ -13595,7 +13666,7 @@ msgstr "" msgid "You have temporarily reached the limit for video uploads. Please try again later." msgstr "" -#: src/view/com/composer/Composer.tsx:1386 +#: src/view/com/composer/Composer.tsx:1419 msgid "You have unsaved changes to this draft, would you like to save them?" msgstr "" @@ -13653,6 +13724,10 @@ msgstr "" msgid "You may only add up to 3 feeds" msgstr "" +#: src/components/moderation/BlockDialog.tsx:320 +msgid "You must be a chat owner to remove a member." +msgstr "You must be a chat owner to remove a member." + #: src/components/dialogs/BirthDateSettings.tsx:177 msgid "You must be at least 13 years old to use Bluesky. Read our <0>Terms of Service for more information." msgstr "" @@ -13673,6 +13748,10 @@ msgstr "" msgid "You need to verify your email address before you can enable email 2FA." msgstr "" +#: src/components/moderation/BlockDialog.tsx:352 +msgid "You own this chat" +msgstr "You own this chat" + #. placeholder {0}: currentAccount?.handle #: src/screens/Deactivated.tsx:120 msgid "You previously deactivated @{0}." @@ -13698,7 +13777,7 @@ msgid "You recently changed your birthdate" msgstr "" #. Displayed when the user has requested to join a group chat. -#: src/screens/Messages/components/OutgoingRequestListItem.tsx:106 +#: src/screens/Messages/components/OutgoingRequestListItem.tsx:113 msgid "You requested to join" msgstr "You requested to join" @@ -13712,11 +13791,11 @@ msgstr "" msgid "You will no longer receive notifications for {0}" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:245 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:246 msgid "You will no longer receive notifications for this thread" msgstr "" -#: src/components/PostControls/PostMenu/PostMenuItems.tsx:236 +#: src/components/PostControls/PostMenu/PostMenuItems.tsx:237 msgid "You will now receive notifications for this thread" msgstr "" @@ -13729,7 +13808,7 @@ msgid "You won’t be able to rejoin unless you’re invited." msgstr "You won’t be able to rejoin unless you’re invited." #. When the last message in a chat was made by you. -#: src/components/dms/getMessageInfo.ts:43 +#: src/components/dms/getMessageInfo.ts:50 msgid "You: {message}" msgstr "You: {message}" @@ -13797,7 +13876,7 @@ msgstr "" msgid "You've reached the end of your feed! Find some more accounts to follow." msgstr "" -#: src/view/com/composer/Composer.tsx:638 +#: src/view/com/composer/Composer.tsx:646 msgid "You've reached the maximum number of drafts" msgstr "" @@ -13837,11 +13916,11 @@ msgstr "" msgid "Your account is not yet old enough to upload videos. Please try again later." msgstr "" -#: src/components/dms/InitiateChatFlow.tsx:708 +#: src/components/dms/InitiateChatFlow.tsx:711 msgid "Your account is too new" msgstr "Your account is too new" -#: src/components/dms/InitiateChatFlow.tsx:709 +#: src/components/dms/InitiateChatFlow.tsx:712 msgid "Your account must be at least 7 days old to create a new group chat." msgstr "Your account must be at least 7 days old to create a new group chat." @@ -13965,11 +14044,11 @@ msgstr "" msgid "Your password must be at least 8 characters long." msgstr "" -#: src/view/com/composer/Composer.tsx:1117 +#: src/view/com/composer/Composer.tsx:1127 msgid "Your post was sent" msgstr "" -#: src/view/com/composer/Composer.tsx:1114 +#: src/view/com/composer/Composer.tsx:1124 msgid "Your posts were sent" msgstr "" @@ -13990,7 +14069,7 @@ msgstr "" msgid "Your profile, posts, feeds, and lists will no longer be visible to other Bluesky users. You can reactivate your account at any time by logging in." msgstr "" -#: src/view/com/composer/Composer.tsx:1116 +#: src/view/com/composer/Composer.tsx:1126 msgid "Your reply was sent" msgstr "" @@ -14003,7 +14082,7 @@ msgstr "" msgid "Your selected interests help us serve you content you care about." msgstr "" -#: src/view/com/composer/Composer.tsx:1421 +#: src/view/com/composer/Composer.tsx:1454 msgid "Your thread has empty posts that will be skipped. The remaining posts will be published as a thread." msgstr "Your thread has empty posts that will be skipped. The remaining posts will be published as a thread." From fc144271344bc6fc4a9f4ee86d362b60b81d3802 Mon Sep 17 00:00:00 2001 From: DS Boyce <260543580+ds-boyce@users.noreply.github.com> Date: Tue, 9 Jun 2026 23:31:45 -0700 Subject: [PATCH 140/149] Support dim theme on join request landing page (#10832) --- assets/images/chat-desktop-bg-dark.webp | Bin 264956 -> 247396 bytes assets/images/chat-desktop-bg-dim.webp | Bin 0 -> 263184 bytes assets/images/chat-mobile-bg-dark.webp | Bin 68756 -> 77432 bytes assets/images/chat-mobile-bg-dim.webp | Bin 0 -> 68756 bytes src/screens/Messages/JoinRequest.tsx | 23 +++++++++++++++-------- 5 files changed, 15 insertions(+), 8 deletions(-) create mode 100644 assets/images/chat-desktop-bg-dim.webp create mode 100644 assets/images/chat-mobile-bg-dim.webp diff --git a/assets/images/chat-desktop-bg-dark.webp b/assets/images/chat-desktop-bg-dark.webp index 9a3929f2f210b2597e7b8936358f85a2ae97cb66..3a2b0f16c5ff00e6a2379cd2b142a3f9f063c887 100644 GIT binary patch literal 247396 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�Le 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

|X7u8?|`PS83Rs^LLSZujK}L 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

82l3RJ*p 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 literal 264956 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%0D&IvS+H?9*eOlf+rY5X6?-a06bFA5VK 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

}BtX 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 Dp>5*g diff --git a/assets/images/chat-desktop-bg-dim.webp b/assets/images/chat-desktop-bg-dim.webp new file mode 100644 index 0000000000000000000000000000000000000000..9d82f5c05ef70a5ae9daae3b98491ea25ec6543a GIT binary patch literal 263184 zcmafacTg13*JV!t28IlhBnpB`mLO?h2$G|TAYsT^GRUAXWRN^WC1+5Ckt9)a5|Eq) zMNkIGIOMeawsya&@2lF{Kf3Bw_vu&n-MU@lt12LnWEd7Q2gy8~hW5ml8i;5>Il1UuE#!6y=&VdQ(Y_&1s1mKFH^ zM-p+=)fKZuf|gH<8iB*IoyW2mocr>6R;^^s-FPJ9otBqEs5u z%Nj84f>gPpA=ai9@ZODfQ^N{qRJ+DV1J6eai12}jFY#9fZ0+Zmi>qAG;lhAe>9qir zs~g0e3!`uLqTMvE(O8$5^We?7!-pHq>JKohHB-u$S86U2J8y;#Kr|O>Od=XM{a(H= zw>7GHG^zz}=tTK5+zNeZn06d|c#Q2oxvDDHA90Jqw{_OKW_Zh-{8u7Qk(U+DJAx;q z8v#a=7(&gA^2L>289F@jH;KysPRHADaPDX{k4B=)L$cy@Y)ip$mp>xlN-PSm(23Ew zRopJWXR}a$oh}|TT-`UfP)1I%-4j*^Q->h__IdfMk^uYthf-P{q^e?pwE->di5RoD~Mz~0utx}L&G`qvPE$s`Yl~p^gr3|&{WX?HL--wJWmBqcWA`Ugmy2c8OYC9cTH5>qx%uhV~n*~U>GFs&UM{+Z6lYfM=Oiz^{UXiyi$mLmS8SrLH)n$01CH# z_3Qa{9bkDDzA{dnBAzqanI)Wd@@$A&JlVez>#+*tx~{{C`nb=ObC z7kqyyW?ya(GF@F!nK2wt{HF{s+IJ%KUTOUYZS#C+JaI?+(a)V*l=?f_LBE#7{#{)? zy32sb{XY>qlfCL3fdd&@N=mm_l%vI&>^los>U{g2PINy?OTp@E_PTVKkJ-jjJYPS6 zjWWA7zw;zrPvzEE_R!PKi~Pfm027>=AZ!@lCg>-v6B;(Ib4=Z^!@^XGmUmN&?Z%1NCnPj-|>iJ~=K;e4GrK@J-h7k8@+UVL-XH5SJ-c$&bRpwOLghCwFI z#4quzdKuLc?rU_fyRbMwS7Y!5kEW*@`^UCO&(4ev|pi-u|2l-MlPUlK!24t|t%QpD0`tK{q^h#5XgKh63c+6Kn>xU>|QNOWrM7z|mWCFL0lvrz+oRq}A4@ zjpbE%XLYwQLt$%_*S4G?1`^IH?b%C9wWNCuozj%79!W-OEDbk!+8+k1&&@Jy4tR4c|InMMJ(| z>bxw<#`JgFO^w9e2kdVt(LUgL%4K~LwqThe)ooBY-5b*WqM0qHt&mDxFc(sq?Uc}` zCC0wMJqUwiw&aBRBU}^HnB}Tfui*aDEZ$EzN<<4?MeHVZD(p>lYHG?q(buJy3fpP* z;UtFSShn)iXz^3f+6{vvGz}x>TN9GKW)ncKSHKD0!SC1!_GA3K8p4S@+5eJziT+Il9o(w$2di3r$l1+sBX~)5w2_Qk^lH3IRbf5E)DZUQekyTY zzN+7>WvmIyvx)6liHc$av7yK7A3pl`{9*LChz-bB10w--JgC*4QXdk=E({A(OZ=7) z#DY24Q_tI6HP-<;ybj5IK! zc>pLTjD0lV4=Lf6laXEx$@)oV9?-$>@L8Yx|6);Loj4z>)fZla|%c?^jd zz?ScqgdQNqB94j}zOREP0k)*K5is+#^nchzB~AiKi2wBzTv zYecoj*zY8w?u@&DZtd2nlz2??%jW1XQ2G<&2L)&mYL&Rs3f1YQdCqV);Qj2p9Yiu*c}w@#NW9+EcH(1 z=E2H+a-Tk1S-a=Xmo5H9-9NejT<-`u4nXZD_K>U?8s$3bP{9yTfaLWb#q2b}-ME$ef>lS43S*&k6-x6ZNf)JhW5)x>?f`Zo$6z6o;~}zE~KH@*kP1r zf8i#uFUj>@vO?t}#wV4}zkNpf9_T$2^IEe>6Ka zfJT~2AUR*H-AAAS0@fVEj=;>sDyXr?@dVegRT14?O$?)d#ukgL79Z;8Xp__oWpFLf z(YAKfERH{GHEi~Eae3r&D>d=$+UH=3Ou=bFSpWz|z*j~Pz%uGek02_|-U}e_^hoq_ zzByG0P?_6PY1l^IytDytCxZKW8!DqgY&=}$paQd|Eud*oxph~+iiE2Pz=H?=J%&u` zALW&(Ey9s`YJL($jH8OQSQgIt;swgQX1Pf?)d8Bi0FDt#lv9vEQut7vN?(q~a(tTY z1?a2aDbGK;=rzHl?*#^QpD_xeltOf@zKY0xaw@FUzDqGURyo!;pTR5hh~Db-33rXL z>0GTug|Vr9Z~#&I1gbP!s6X78!CLBQhRokL^w4Tt# zN$Ox9Irp}#nb(S5d|__#nC4YYvG6LoV4ube{~}_zqUH-!rWWBGX;CvCkpY8x;W6+l z0E7qa-cMxL8(#_CfX9I)#9yF+PaU~R(3ueYc(ajVW-Jm zwPpsnXRohgIsm`4gTb%W#}W)bvWP_j+tC-VpKMN15I59RSUgMXsrq#MM;x;Uncir# zmt!QKdE1(;Q+diiBbO8Gy1^oUe5}Q}ni#@h?^2ug`%RsTpw z!Lix(#fMdGrC!|w(Ysxi2v#s_tz|1ETnMbzHRet-;<7MUv+SK#_-Ud!#ym)GEh?FA zIkF2a1wEEPx7jlV@CfXNII*cO@I>->KQ1&fZLmKdJUso|x25o>P{&d1vSnY*uI%&0 zV?Ddr7x};3P#jk0k^1hz+nl>B1SRRfj-ODM1dp+rXx){mE`iw(^(a7&ig9+<6vu=! zUaPqm`;%ksc-hE? zJLS5QW8^{7Pkc>{c?<|gw@Ws+Q}Br+B(z9wT?kL8AZ`bo+xM;}lB%vuV9-UG(OOr% z=kbunZi=D)9gd5KoL=^hY-U%!vbSY_SO`p&a4dNH>eP-EX$~9*Fa>oT_mv;qyW_&q z`f^zXg_tNzKfO{Ld|U9FWaqHp?)R8Mmm84@POj)?gjKjN#ZejoSE!)^vq z!7ag|F{W9bkm4;q-p7VIkC@O3FlX4^{7CgWl7T^i+kA9J(Yy}@kwm#{Hm!LPKH8Jl zw4bIN&_Xs!C()$vLs|&#koGK&_4NjGmjF)Qwza$c^lqJbXGm)|P|+&x)@si)(5uw3 zNEo@KIWiVNa&9FN;9q@`;B-dUxtb`FtY426daRjT_R)U&?nZf6o{_av}%+5SxEJso9Yhz;fjb9&~oZ%n)O`A~a8pm|Tb_DN4<(c;cmbhNR^Vafp) z9CPtq25k&%97IXkfK;j~_&JQu!J!peR8E}KoQksEqlJ+|5`czq69Mq{!6T+1=&{}d zyide--VDSH%f6UzhMX=Yk)Vbp=CR4($CT4qFhz`JXrM`kknac<)$SC`bZVcm< z#aQIXVUJ1B%oYh!mbYD?y=g(iC}>yj`|NyK9h3CB%f7j33H=!kmU@GmfxK@GxnDa@ z`T05Ok$CCd6j7T-@s*PMc1D}VTbT)(3J{ANvZk9u8LV4=a*1Lvd205S2ftuwTnCEr z&DdC6<4^rTjZdZu=C#?qzWsINVLbSK*7b0cnL<@w88qRRZgb){1bS4uRX;ZV#Sl@X ziSC=1*o3lTGXr_s7Nx89nA(|NK7Uvkt(Gjejj^*2QLJnYX3u z$KjYA&$Vum=4-f&_fFf*&8JH06!6nc=jZq=O4b?2#TCnGeqUx6Hq-G=i$jbcl;MLk zLes<|>>zUAq`GDBbn0++p+{n;=|=Is62QU<5JNHB=ySxh@bG0xU7+=$oA`eX2m4u! ztDVS^n$sFVwR{=@T+UNWZf&-0LBpK9_^%FIxepo^Y(I)My$?BrO{0g!U9xVGOC9Ve=+N5+fs6I49SG?M`vW%-KQ*LoL09mQ2C=4`HMO zj=Fl8wACMAVa(49bNdt$O)YPm_?0+Mh}*y09%Hiql-%ppAhrFrBy8px5O z8rNiTskwAFUlmlKVsFPXh;F+tVCeKW4%gcjd7;z5u_LV^NVzNs6~f7h01 z+RA?p8zdSCxpK%dGtG{1oi_T+X0E0DcpvFTw6U{I0l+`ien5(${hoU9keUddBy3QmL)JA}ZEiA`V5}gV;Hy_&a|2MVWW}J*)^(&n?M>mo~}13HRB?Y-kH66Q&X@&1j7) zZOyXrP%qKnQLM}6_QS0(N#`uPWdd~J`&L-<1diR0#MIvDZBbPq`3AP%Q*h(23SUOd zUA0x%k&N^9!|Pv-IJ}f^_Rp6e9OJQl*rM?KvwL5c2?WB(g+M!e7%S0MN$py4vu91Z zf~}WEXZSeh-U3ue2W$bSdk{p(wAE#K8W z-m)7?QZzYr=g24Q^g#|Yzg_fA7LI&CBBKno{I}`a|FNkUEhti9EqW1{bEc!?Xm;c= z+xni?{#U%>{$K-1BF755!WabB#*GMUUtty zCduqSvOM&DuzsvKPE=zh`}Lac^PSjw9pjVIy+SfSj*r?LHWMyGzieE2LxK;`L!M9^ zUAur}MI%Ezuwg7Sf9S;Q12W$AuHE!$-$;_1pq9@gIqA6)JZXgND~}F7ZaZD}BXG7I zx7}9oLk7ao{(sjL3dhus@0uY7>U5LO$4om#U#4yCS&)I~?!OVMJESYw7QZ5&(3mbc z`0nZ_R#Yw#r*ke`wb{Pm9e;)=alsrUeF9CZHAe=roVC&*sSGgZbLAMBJiW((1&rud z?Q8j=qio(sk9PdS-2&4OfgG|c*4#)+CBM-{t=6?0Urx;CAusPK$XlSTTLMd#(!3Tm z9>A$*tHpE1Mj*5h0+X)PNW zR=jP8!aLeoWIHPOZ|agvuZQ_4P9HjHpt(p}ih(dm?+wD^U5`U~^44?x%Xdq9iaUIC z@+U$#0N#%N!4Y8|cqd3_r!?;D|V z^7(u+EJ$p@&F}vV-_0m@iI}P(E!@=?k~yRu19=5Rb`bx@&*?2VHPn;E>wS;Ca>#kN z<>YSNOBQYaxClyr{_t2<<96A)$&{`04Sw(SV4-A_JNxg`>%{2ZFvAP&iqX5Z)-&SlAD@&!O?`Ry3^=w z4XSIlEh)Wt8zh0=8Yw$skwLey`43zs_8sP^kvINY6<-tAQCEL0@iOhg>XHRqm22Ys znP^6bqBN^WwbvujBkoAxTh^iZ(VbftSnaex`@1h>7wwy2;pRhMvmY~D(|+ujh=L5i{TpkalTmd4;R!UrolVsYkT5_@Nl zt=sy>!$XL;iX)S=l5-R)BORw^$JsXen4-CCUp{yHYcdWJyA=K;`oieQF@t({x$C<{ ze8AOD{DrdeGmsIebss5*fh)oAH}VXb66noVk!#-&ZwZ|9ik!w&t`VNu0p6R~PQ}Gg zBtGd?{DANTT*SR;jR}b)#{0}@<&lh0f(OtJVksNn3$4@XDgUxVl@g$MqOUg~{e*wN zk7Dh+&uDoAl2bkBle2PU`O^h)2c3l$5i>eI4fpSI5;aUEH(r`^bsTyAn0>7n68M#B z{hf~2x73dmY|V5y<9J;L@_Gt)r?)v7K215e3<*hrKlG@QO;I~z&N4Wtk!+lR5SCW|v>*y^VHYJRp80X*|mu*jGh3%=%Rj)JNCd<+ z3Jg;9HZ@O;4>@ou3ibg9sasTWs)^`{vccGhCSTOJScxZv{pL z%iLIr=R#Q-zAvjyPL-c3knYQ|25z#lj66fStw6Jwu1O!C&X5V+8Ua5Bz6fG^90koS z!4HzljmTZo#puFx%0Kk!ACe#r(*r#)V#cz7U}}$q#f^j7Eg1gJ5mo%2A7RxB8Va9m zMMgFBZ6BcLeWBhdY%)q8;Rto~V$aS|sT#LMO{|OfgNdW(MxR;Drf|>>!+=yfWQ2H3t@;% zm(7(CKUGBo?0X^?;XGEGN@aD@2xg@nX?Y!C_euP?2Qnd#TOzC|z8*d)LBxr<@lxhG zY?W9uSe;}kpECY+EH!OwWvNzG-%zZ4F@NSDGCxbl6D>8&b(=b=G;m=54o=C@Wn%L6 zYSRxSucX523Z)BLYK8Z6?V!f}+ZT^cxxa`rYGY#hcB`)bKC86P`Sd!&l8*_a0Dd=860-}EPHjunM z%4_(V)&zzTO(Xo8`I#E!SX;jFp~tRs&bHso_va^;+3szI5OWB_B$Tjnh%J7H>A zzHZ!~cPSL5Ufvqad>dc$U8l9XN$qHZ1FD(Qy)o3(w~}0+5NjyCs=GB=^^(IXw>ogr zT$%xx79)Y%LHU4sGE3v8%urCNhf2rnE;)g6q>k!kHloxS{5-HVM3 zs8Z6B&RY5_WYhJfyPxH%4uoCxZ0E>)(4P8$w>#b=Dmb*ji1Fr8cdYfJBjK;HKTsQf zI>!`<%aA2E?cgilU?n5&R*420NNV~{YNzFe+~J2$_O@H8EFkij+_ywbCp*6oR2ypz zSC$vHYt;|`g3Lg0j+qR(DV2zep|fhv}n^+B;wK2 zmV&!7F;*Lny&-7hy?D?)JC;2=P%V^HXpExp_9FGZj8buZOVNc8H0!K0$7Yv8QP+$rH zqcrZHiA1W$g?><@b~||qF+YLjjin0u)Ao9t=A60uOR5!%7%wT4@gdfX?-RelA*9vO zd&WKBE3hwTb|=w2?2|CBQahIpxj)k^v>20xR5pEOyyUqPZ4(>vbD`1EW&qFc(IoSZ z0{WbpW#a(-*XBvL9!A;g$Asp@X7m81n8yGg%O+H61cH+SF|?!j+Ls@YV=Rp;e{Y*B z4-ss-F&Bvh;Ld+Tcy?HgF#Yj1A|E^@l>R{+s#kZ|@iT5;x=7|@fags=Vgn^JP#*TB zjv}QLn5*-DlfvhM$qHAsgCDD45e=6!VKU6tRk3`KfYCw{1PtF4O3gNE_Sp<9QKXxP zLMO7|$2O9-Ia$2J)dU!fQ)6%6b6i;|y0Ve`Nw^=n_Hzo<-u{kT7saNq+)12avTzVq zXBpg+&|)IMK+V6#}rg&}P&^-aQwQAK0gc!T) zKK|uemJN96dskQ+Tc-BV%V31tqA@R9SO1fH=YwgWngdOd06>P5In?vEm{mtFp+L$ul@uWfc+1PhX| zCa6>Woyj}04$??iLkFLUR;-QYcN{O595pqsgyvAvnvVuhpsDkYl*#fE{D+;*V~G2i0c9Rn{6N)N8G8>cS~k zE}<(>?C|W91s)pk70k$;$LEuWe=5z|{eh481OAOB8NP65sx|%YkvKwreNU`)No_K8 zZ)on1OsiqP8mS7-b=sh!@W{*J4PW;*lWhf zoC%!b>G1rKBqNjCLJp$PV%+(%cc|m!_4ua`Vq7*M+NNCEn85C7UsfsE6M`3$GzQZB`-J4uW3Qm zNy0P2YNlWTqaO8|;qXbwRX@@WI9ESrV==oU5cW(`fCbw}($8RCkBej;A@F%6#b9~H zniM{C^ys+RU^TQw;5C^`AO`n@2fUT%Wye|_!#|G)&Z-0**#ikWosw&I~caGw|pTyE_Qqp}p&1X-Qt`UEY zEqFZD!M1WPoXTV#7cg)U?0Ug_ELhC*m4j^W&4$gt6y0aqDP*Z!c;9|fpKG;5mCD%A zcX6soMa1rrb1Xk4jeB?k(?;sIb#u0}=>wZL67u*1m|}Av{ib8bC^I^EsjuLOjf67~ zf(IogET1H<-M`6yc>AZ5=3u2|F!`0`dUYEyRE17ct})cX|LIpidl@pL%$HaklG_Qu15B5#ek+S}1!b*5W4~J$hDOBgB^eC9H?Ey+4|@ z1JhAzXBV*-6uV}XfA8Ck?=y4pD`Z@jTK}A>VWcY~?^o59zJ#m<(7M-ruC%)-qsXeh zReEj^*mS7(gzaH%*smvjIefxwku^@sRN*0cj5*N)lxS+;YeVVFhHq?YRDkQu7HwV) zIRgEIO3Iv7#_Uu4wd5y_)O$s3JgvoK{PR_JjmV-e66`I@_F9UwD)sc~HGjX?hgUx9 zs_z|q6cO;3e?U{;3ANCfKK=62qzZapHBvB~>U!tv+xJJx>z%?S>y)@Sq=6}6FIoR2 zyX_#I9(}SQh1?-o&zV8OqRHwyoL%G=4M;AOPik(lhd8K(pmhCIN@O|jdL>SLcpS-s zEt1XNPAyo5syB5d(e0glLS>n5&nXJCtUTyPh>8@c?cCNCA#qxaB!LmkiSsxP@3wPX z?yij>VQ(MSy{~ooQW+S7&fH*{tFkZvEW;gKSeL@OvlYe)B_9x1D>oTm9w0w;JPdzw zu~BXrQz>XSJ3s#>-h54e1MO|-d!J|hI|OQ)7YZ3Aok0Rk5E(yNl_w@Dy&}?xNS(Do z%fwTr;?Vdweu$lM`>X&!2eOt0p|V-`?o`HtR=_>@T6nI}!tE;Bm_OO-Vlk-Q2@(-+9K11?gM-J=U`Vq`;+@m46(XXCN_j(~`hH z7r1HEara_lI2S^`O}Y2B<_^1zKOACz5l1dM2GWL|x=NSN%y+wYTF>;__VPY)WaA z!r$`SMx_n@T;*BR)=PI-up2Gr3%!M}2}0ewS?ckH$8KMM=SD3U@t0*4s^r&-95eeJ$O{Lz20r% zIb--d@ol_N?+@i19c;HsGI6BS*58&=w}rl`7aNo}dfnGfX=un9o>e}O`B*o%-5oe- zqMPi=r{W1_|Ed3=jJBPfnc8k9qB75z*b-|lDAZJh31$xt^UgpXRpfgqCK1^@eu{FV zc|=_GsU?hBf{fTA*fy3cO8Y*y$s5^rayAws zI;K9MvD8toEFj$PYUN0tbErvv_U>l)AhECR#h0r@KtKTJ^5*lkuniJvpht~(LvkJ% zxzrq*KW~}?kD7AxWc-_z>_t`1slHr)Q_z`6e3HqhrT8vmeg2H5idbNyyJBra=t6d2 z^VZqQ{-)ULgTFOSO|vdKeztskDcqh9NV4VcZButYu{AdIcb%E|5qgeUjn|qZZ`zjO^EQ2yObGKa`lN8y)LK1w@1NnX zZ)^bA;)0QaWh*vJsVd>{S zH+qlaBxOD5b?7FF906E{DSu+ubBRGiT{`uoQ>%lnn^({k`%^xsXrH?2muc`lAhxzL z9r_S_7^HrsZg=6;Wj6OtO=v>D>bS@`kgeagZDV4w{f}C@(38Or*x{z3p$TFowu0o~ z>J{q%zHUr`zA^VstN*FAX8v2w^C%_ZeePaOEbm;bP~5Pt)tZuVKLJGzIeRl<)-LKF z`vASd==@XeoWJ9BaSb3)G185WR@}iYf}b0W19oj#l<{oH>n${m;HZ+4t~}?B2FhyP zKuYFaWr9TD0>HU26UtActF9U&9?V2Mr=;cZ6j|0q9NIo0!X(NG_-x}k zD@jHnHvUGEP)WFiV^`AEANU}$9ChLrNk_1|9Y+x zb=Q0;HUw;tS<7xl(~pY3P+-<)CN9Pu?W5NqL}EJ=+%pi3(+>Hbol2qKQ2jO4)j!{G z=XRw5EXO!nr{d*d?e)r&fBmqNuLCofWG{t65Btw`D|tJ zLJq9ILqo{VJOx6sxgGoI4Q+BX)7z52OoPUP5>5)8Ccbi4$uE5Q@<@hf82Pgl#%9V< zB)+}8awqV~)0z4`fV6<+Pk&nTyF;G!Nyog*2cz6>d4Dq5spVnI$pAI}*S{1vwPMz{ z4kc4JAG&9#DR{>3?iGtp$;H9!Y>Kc+&r_+dS=Tyc=!S2!Hmz~VjK?`rM$m4lqhZa1 zWd`mq339Ds2aoar(D+1N3b3y}1U%Qa=YwoXhAQhnax!u9cU^DrzKj?>hl_{YQT=yo z@P3eLO)bTT#pRrhW*JbhIQ@Z|RpM@@I=2+h*deAP=y1jib4Bvz_e74f{N>1uiv@%aC`ZbbrKm znr7R|;&q?%^O^65w5B`GaeDba_5z^LBfT_2I7LSp2xLapv}7qSx!jP_3EI z<%@jL=LU!Nnu1zn0(QZVH|{dRoq>3aA^G&-WX(1efsaL5-2By#Nz2K zzQ&DjZqm-*Z{?}3#1-D0p%9YsritZmj~LV?X=SfwKa$^YD{iC)SV08LK6xhhG-#|AQGY-kjp%;`r?jO(!5g7PrV=nPG9j)I<(TuHyqSpd!?J-Kg{Z)#*b2hEn7Wh(4qK$}*^>J#GPb-JP&;)6a|6KmEn#YOnLnC2~L1p8gS z+27yDKA5Iv6Tb}B{^ea;`SfEVEg5L^HKi9%6d#c>J#ZfhBjp%n!%+V9X2f9Pb6>_A zw%pD(ye}3oxtnHeR9kA3^5(j4i$MS6c8rVXRZJ!eyn@Lw_)ie^I3r=g33 z*FH-mx|J&V>C8G9h7$Q$RW3Noo2X;r5X@q`mdzAd1Di2rM3`SoR5!k?gAnQfer*gr zWeADnypWsb==}8|Ie`x8JpDnKZYws%??p0u+kf*( zfsiJCB+}(oRR-T~_Z^JvU=e1DHN3*3HJK%~u=w?VcW$OJnj|n}4X9^vw4=yf*7{DaD zW(oXmR=y8X=OYg%*B^Tov^5=m_3t4tpx}#`b<|J*_3;b5xyGQ3e&xWKh$SkG&t-1^ z_vQhKNQ}k5afW{KHKjEl(b?!_mR9!GrIi9TpyP6^$ zFuDx}D!&`f7c)JcCi8DQ#;eYxHR{1%@GP04Pp9*@Cs4c-8Tqqhc~GzaR&a~*jN zBB4b#_Ljoy5se~3b-l!V+Erebo8F$FWRtE=2Mm#4_}QH#f5w1Szf$>X;&$T0sTXQO4~`y1+P$%TXzj`u0v?mzb(# zb|vB3zKNy(P8TL0lflgLID6`jaoxxITez<9F{b^0GDw=rbX-#SSjOJt`B`87D4A%= z_jAOvci&jkDrs_>*=%ZlOtp*8$+>h=@-7c>u-=y1x>o9YI7yJ(d+zII57P#}kn>7K z*Vo>I{r)nZO8tH_d!WS{>)kIyVQi!5D-0ko3H<)-*HK(|y&MtjGJht2t=rZUkK8n3 zFkM!!at~pjUvWi!2mIVHU}46d)Nbcxr@^!@Vb^ZWMJ*>Y!hP}RrO!!Bca6fQKi2Iw zsZmm}gpiW#MIy_-$i8t9c@#TP%lthJNgF4>6yBc}AwRQ?e3wL{%I^J7hYGKFEQ?0& zNc8_%p=VE2G<$9$fM)x>nVhEJt#+9y6-r864R)!D_!QHQ?qP_fGM5kmDoT6X2fSh# zE7|Q@+;>POHsbry#?$gpBs7`WYq^P0(Tr<_k^DdQLT00OXS2k_CF{BE%q=yB;!4fO z*IrgPt4ku<5Nva|gA(l+@7vdii4qC?>P*`W9>KbDI;xCa4E+`JO1k)!bSibh4i5VB zM#DUBW1-qsz9PkKJ}`}d+dgu?{wfD>+{G*sxkGX3#97zoHKIdn2QxNHg{v(F z7IB{UgDz9S*!nE5na0bDSGF?bj(J!7^~V$pD8y01rq6yyDphsrH?Qv<3X1@movVs2 zj3UG#FLA9hCS}N`OfmLjE2nT$%OqQH=~E?Iafb@4HWTN%1vcL@zh_ZAdxSNvBEx}u znJ6&719sCU;j~t;n$L1Okj=+}%kZj0)SZ*S=`ChCZ4$E)4_*GX&58Ir<@2%8ix%6I zrOQbBmgUoU%zI7Y&8=@(=qo;&8lv>yiK}`I5SV|fm<+jQ9@r3m(baw`KAq9ymLV}R zo0yhh3vUscVPP_E&p9GxO0*8e9Od9x#5)r9H)GB$%=G!SEwGc8LN-E10nK z>gnw8C39$Buq7L2KQus2+lECkt9DOY6*nKPrYJwFJl$d~DER4bZ>z`vy*~G{u83Yd z7|oIyW#gGA;^bNvdc`SEJ$@wj-I;KVF?rSAioL0*L0i4OR&BU%V9upuaymy}A&Oyc z1nA#|h2T5nWP%eThU;CsWfZiFWY%e(~V?(t(#^`rf&upRTgX zH%IlUN1^*r*>$vol))!8?JS55TO+McXd7rLOs0nY4mvKqIQrDXR9&=T`&r$Ks24CT zouOkGrMrpa4?AnEe4@^yT7Ks?j9Fa)+ZFQq6=ve!JbFYjEJ4$!xz4Fv2QCf^6Zv^T zhkkh93f7Uwr1EB`EHi&SyV-Vh`K>muDxK1uAKRoBC*|Sc#@ELD*`4O$Z@lLbonO=-=P}KPA>kT#_QdX0 z$*Q(U0RhA{=5FnMhu<)Tf7=#PI!jC}4a(n@@bYA2B=0^(*}vJX4l`h8)?ry_K)*OV z__2PRp@C4xG*JnI<3sg*mHk{b)vMB*BEon$kDSyWk&K&_<&zN5EDL{RZjy~}io;1+ zbnF6TDT{BH4okZ#f8!OY^5>(o4tes_%+l?172^A+QacJ1uppod#On%S$_p3G+dp`M z$Av}~6l&MG@`$A=64O&9BA8k-$|7S7#lO0Zt}w!!!d0wQ8p%>k@{#cHdvE5VIe3mN zHsCMAz|m4r zx?do@dK(&gvdcmosXxS2;SMy|W`S<$&sA=I{aWCq$2)4q zc5U4YH-|RsLmYU2=Vkfow}k{2SK2kWa1CGVBWT;fEovGK(@paZEhQ=`S)PGSu|JB{ z_Mho-hcTs0(%+qo&#Eg1Bq&&twdk;>3ZyV7Qkfvzut+zd^f;knx1MpyguNFEvZEhw`BRfqPvCJoOl7c z_GKG>ZU1G{f$Cc98y@g1Fm4GG$aOpS=LO7?A~q=;J2WX939%GWf*)mPM?l4DV5y z6VC*~(yqLeVl0n2grR#=4N>4oKyeOdhT*Z@o@BJOab5En`$ML{nGC6U}^l@N>-WIiAia5{mt#m#G z3S?6-xaC{;t&UYEtP$d$*^|C>G5MKs#A>^v+$E^=U&AAd#*d}fEsUek8FdY=J&8Mm zsH+;iF!~&*AH@(yrbDhk;VD^!)vTrq=7WrGV>4=EA>;TfHZS1$!Z#-Q2 z+vFNHVPjLI;S+xx?2{>ee%17IdVf9MW;33H*-g#3BDqb!@5V^3-OD3r(Q2||RlwuKr0Fe>rnF~sKD7Pi6 zku}Ii(PT$-tkfTdsi60?gf*%tNC*9Oi;@H#L8ZBiN*|SQyI?L!z8qQNFKn71_}5Hm zJvyZw$I6I`&5G;n$L1awRc}_X#SV4{wA}epFOX@T5yK;Tq^O(Rj!LI=W*kPRh9byJ zfsMD;amGWIoUi|u4`G@;McR}Tnq@h6zb+(+^4jUG@EVYXhQ)r7++?rV&=sqbLU&6uUUV$_&oPYbiN^E@6DW++G35B}=#a77x7Gy{cBP;0wXUoW_f5th z-}r<|3et_a5~!Zykv4v2(?UH7N5W>n1XnZT$ZRpKum7>__9-wilT85=J z%B^(0B6K?E<%p7NqX~Z}s{>;dRs01_-uSevs;aYik-Ipcp!;8g+3|VJEMt$EiTgC3 z%4udtbL!sDVp@XTYM8(%++Xf3;N;;{RO+_!tFShXud~*5zeyK1TD>oT_#v0E`(cTr z|76b$jzi%lNSV68tQ|kYY>iPJOfF|6k)qo7cMQk*tYX)xU6NPHP1$_Jke=OHIXUJw zt13cSFE>Mee+#D@qVbYmHZf}VwdjczEThbdWOeP53xcjBM~BVv<}+)3B|E@6hkYdO zR6rdkDVg+2x2=c|2>f%9&te!EU6#6=BtDq?j$;QKK-pqP&`@=)G1-yyjG|x-{j6d0 zJn%r>rvq5F8K>i|@%73YPK0{bX`@?DrE9qrGbhZj)J*|p+rCeW8B@(1jbILx=SNd3 zVx4aTT0{rR#LnA!63$We?XQ<;gyg<%F(v>?ECb#@9U$OEq-V#*mtL%n zcSHA=XJv4D{?pGv!1U4Y{_vlUa2YD|HRGn6Q^iLz4?0l#>HuLJJ%1;RSXA&&Q#DE0ggXp)QuBe%i62P|_2zH$E zD4M}05*_&gFgpKNj`(1a&!!dd*|h7EtO z&j^rj6mA<-Lia5{S&BP;W%Z)r79zUYZ=6uGiJKi*B=#!E2B1^Uuh0DH*QkC)uiU9Z ziDciloM8;XNmpOWg+x_!i|d%J!8DY1OI9d6ubh~E)<-cbf&>@`lOs-7Aa@-yclQj)gXnq*KLQa4La(zTl%&RMDymM!* z`#LZ-fAQt6e56V=A~>(If6UDb0s!HI`Z>by=mGQqI5%Vi*hF68<$IpIiV}Hj;HJE> z2@=oqvfA1-NOF;X#yOB^vT95AWu!B}Wd@i*96IzmNr7E*5s(B~sHTa{o>iiHmBA1Q zBQ`^5(6+0)tASo&gF>O-$I`Hz^%#m+uMJ}cr+E{IO9Z~y0RSNc05<+Pb({wtk57w0nL4rsAUA}sRj?*}c=IxVM ztYjG{s)L4r0(>uIgp3k^eO(_LhSRp`y>B@-ABp$guJmY;I3CIb7;?9(# zyKWXvNRJwHx|BonPhIvoo_k9=(=W}vo;IUP@(gQwz$@>^hbG@;PsDtZP#DBs?`EZE zMJ`-jzy-_Y*$QpMd3)i>l9e@Eo*!Nei6KpZ0Q_+MkPW2M@CpXNTo|=B-2=5u{QJL- zjZKuiOT#Og0GZwN$zg?AgmIFD8kx>A)YLkN#!iQJ(M}epZ98;;=#}nGnr2J00%&+8 zlTkkP!rTD60%I*ZT~BGZh$cz?NRoKu$`yJ~lOEA&+x4gc(5@!*^7uMHM<4{S<*uIN z`MkDDvoO6Lgl8_;GlXYPB>YoGXE|e=rhH5#;e(N&K)T@wV`_S@(Om%Tf&dApVeFmr zLPQBGbJoEma5QPYvjRDHXaISGAh|SVyR*}_cV(kW_6;E-Z=@xyJW&6dp=Ef zKo97>OfTfakPp-QFccpKfx*1ujPxY$aDrhMKv>vA)~q#vN6bI((wDu;k^xTUm06e0 z)RA@68c&`IW>h8`+oa88eG-jca{|u4ldX@EK3f; z0Jz8}y&_2xTF$htySI!sx#A*`qqXvRKJ_FN=?2*UP;LD>wqBR@88`nmcF;`pf6^1p z4aSW>m?ZLg+WMq4AMrjePEJ3t+>hp2?zOw*F%0G1Y=16) z^EMzL@Uf1otKOOFU<3W{22MW*;{mlV^} z^)Z92(~j<5i)@+qU8t?u;)w-}7d;{@13qdlqBQEVscqxvy{CwL@b#9x!pBHWK-b4a z2-HEHkDisC7hD8P&Qf^=k_O=XKa*dBfaBaCgj}d8&EB@{SvxkPK4Zk*cC5UkwhF@) zd!(B_GLCT8kvsQ-*be%vp{9oJ(hI5cytGR~Y9RCiTyC;mHeeE7PUcHu%s6{jTrnc* z)3%IgNM^W_c*Y#vr5EVsX?i3f0Mt65S3~6Pdg(z=hjhAhc@ZD4cVHV6yj_#>yF`56Xc97+KRz6lG38d4UoB++p>}K{tdJr@hcSqd=U0p+Jig~R> zS9e&~Iom~cRu$P{l?3D!=lB`}+ZEV<84F_*^=-@Z(Visn_>@-y>CsDP0!ehx(*dLo zx&Tm@O9Fv%J+d`GX4p)&ycX`B{SWj&fCG?MiL!^!PP1L@cHn9%mnD)0$XOfCPWQ|L z)H*09=umMQCufqG(&0DjDm0Ri#`$m3Tw*@^9TXp+PmQd2!D*@`~W zCzTkI=HFuYq{oYzZ+d)^@PaG=vH(1EGR&yF%hufUnT(0>dE50`Dj-S1og_I)l36@C z@dFnB5ShL!A6yOD+VbKVTl|W5bXc@WcG6G1$E#@N>ViSAJsF#ka?uW;m*;jz2c>(P z$EVq0Rpo=|7;h2z6+m8LSCBkj1YQ%9MpxV3T{eSbYS!3Bwx!3<$EqM(&Hn*z0Wjd3 zas2m{G)OR9icQ~KU)#>CD=aj*Jh<|&T@0I)F_Q%aSCkA_o5>e=qv4>ck(@0DJ!n5MF`2zN)o0y?1*iA@`=!!EV`(B;`}N5x~i8;G~Z#U#Ztbup=hb?C}W0&r@U%e;(C=cBljH7@A|kc-jFaLEO-qyyGA zp6yQW*s}awClr_vfY2~PFTHZm>pcaGsHG$5uwdoWofZ<@ns#! zjx(V?>k#dvZ`*DvVnRZWi{!|4=NkT3cW91q9Wmyz>s~R|u&fhcSy%wv%h;b`YhT9w zA|5|eLjaM{Xok-@au3H0o3lwE5M4kgm+eFWAvul8k)&eXtjEZ5;yX!B zo9&0@8v$Q3B9Lb^Aez{uesU7;;7&n#gXdy7dZot{Zjt|~#p0jG#$YDStUS(1V*K|_ z;a+cJdp*x=p5#6`y$=rW9JR2(WxTi!M_AUlXaF#*F&JEu-sr6RS(o;Txpb}a zN$;aO(nHrnFeFJ#>0CbN$)6{wXh{Vzgv`pn%LsM+3&cse6XjYx>ppWmI6BdT;lFnO zm;k`5ehHI6!;0nH-aF^rT;UqwnlE{yabksk86XF8HisM*NTZkbs-O7@uq_}Lm=GWwyXhW}Cv^8%7m`4F z0Ue-AH+BH2L!diIFEWHccT`nXHjo8m2M7rh$NwE^Wt=;2jm=n_=`Y&PbHF^NM|CikDBA4;R|6&Xa03#UI%dl9ovj=XIB<*^6>K4@F^4D?)#)(+~IKmop#9wl9YC$?%X-2kQSEotikEGXKY7HQ- z12i<)=xSQmpgTkU^(R{UMLr=&03gt3%#nLR)?BP-BwFedlCGm2cE{_w#x{pBPQoCT z6!vBLISAm93y-gSUPF_{b`RVFyAN~>N63+<6c$3Jy3gXUtc-B>IzKzKBbs{!2c6hy zbLR*nOs^)?I*qHatHL6y$WBudCiy4t{QItz$R-BwY8V;_N&2>J8OY9G+?~L43oPI| z0DoT=ShHR=zy|K9cF8ohq|1xybh`Kn@wy4&rQk+OottA@XWFvr36-MSEldNM4Zs|L zBcS(;YBcE3bDidf90D1sDJ_ry#$;u*&vI*11$&9oj$0XkDraw{f{la5K$MT8u z-yG#4C)5F1*UgdBT{>%HoZupN?sZq|WbF$3(_vnhwDeu}`}Ml90dyB&7|f+vNwVw-JS)&0zHJaGsjBPkp0lzB)>B2pHL^nIDV}>QdvntTK>;4RE(Kq-jAh-#9a4z)j76V8mVK-F z}N21T88XdZTb5%#xF{FW|W`YmQ!GusLGP#RBHSU;vi;)M$XFKR}h5WSIQ> z_{c*D&`^EHVAT6*yK5EG^SVfKUY;Sxb(>m@OX0+DbP0luF_;Nro69U0xZ+S(U0_~a zhAzKJFA)O(?I5s0O{o*E{%OWNRz8+$g@`2lGlp+UMAbo%H1houy9yWM_)ffHL9Y28 zUg3384k75b?x>ycg>n)8-e6gZ9}5$Jbob;enU(Gl4Xj;s^g3&&?ZhR$x>u9#5^bB4 z06hq(SApFddtvXRH^CWR|9hf=4Y;Ug2>cu$#E^sBIg^~^)W9e$WoJX}kOT;-}Q2L__*Q&I{u=ShVnHW}(vYe5TX$EAmKRhS$ku zfbZe}nH%6mX2@YL%bMZr-HCUnp#XzzWJSY^3e~_rs`|qa0`zL~lgZP(>fR3~>oj$x z2nRL1*pkN<4>ui>zS=KhT0}bfo>*Tzgv7dy^Jrv9som>(sbbn9y z*nl|%K)lKh{f2dpftxcQc$-+xo6k~N4=SYp&(wyxjK?#Q93>upDVhenu}Qw~pYOex zQn_Li{_waY=qTICgzm^o0XYD4rbgoc=+XJ-MQ2^l0Cbhx-dO@<3lw}nC?V=_O*_pP zY|9yIiu)o#K;ZGmN)JL0=&Td)XosfBqse7m*J@YRu_o0krrrJ$)*sOYavff;z#Diw zqMqsQI(sHL2F{^>-;MsUCF}J`5%co<53uu}=6=i$aQ}0T0XTlCz!cB7-#K|@fAIHL zU-bU@`F=efyDm7D1#r{+F!qD70I>c(+>rqE=I+Yn7jaP~ZUIVwU1t=EO{}gT>j&Q4 zNo*(>Bp1N-Klp z0*TT5{Ep|htzFFH#biI0{{_!FJ&3MHPY1mob&vEQ&zPPLH0#g}hjKylhh;nHN-wx# zD$SXux3BkcR#k8HrBL{zPHz31CpO`cCF5MF`y zPp#NO;6fnqT1p*Z;5Eqx7e%|=u{pBrt5%AT1Edd-^TT_Y zzz*!N29UY`Qu%vb&vc@9GIduq?7G32ygxthU(eX%@4+#Eb_HZtJq!0_=m9+-&`aoP z?k<`M(dnXHdOdnTe)J^d=er6jz-zzpsmG7> z#KWJVk*AYuwQXHiMb#YN)1u95{y?Ar;r&6Vqq75dL$u)l4MhOkD4P6uA%L4F|Lbbb~x^cnNX^#+(YjvG6+*1{LFNgCCed$rbY%rIQgBK zdHd}#_Ac5R0Bs zTmwZFy8|RB^D{H!@!)P#QGo~*fI&NcNe>9gOCM41r}+DRdya0aTonosAbq`D*A+-i zLT!^D%dWR=+LWrAFz}HJLJ~+Xd_V`Nr2~HF%w`|&VIQ_H9Ee#?V89Z9pNH3$1Mz|! z0h;`sIJ9^Bmq;LUQpX*Ph-AM~EWIG~NOwciaGZ3ZX5yvbrPKfvFcc;Qpl?%*d5Z!S zfeL(2wbcJn#*d#!Qv#t=-OLkg`_k9rDfm(AarX#-%S+vn(6K`%sngSTb)t)0CuJW8 zI)IBzPaGduA0_FtDoVi6CxXc+bkz|?d5sIqV|2&TS0hVV~Fgxv2r*){0UUwGx?E?@{y3Ml z+88ttFW`lj|8(2;`9C2346{^^uIRAOV=cEn@Kmz|E+J5tbStJL^zi*BkNo#9f1VLMQATm?56hOOdP)-p zp<96UbIrG5DCS79qaJ$SGMSrQ?S_N4NfhOirz(Yp^exApU7L|(&yk5SP>eCNW_H3$ zaZUUD_nNmc;1hrV5P-7vc>Iy{sojBYD8>ev5&gM*uBm`*Am@aLqld*m$M^vYz&!@^ z^6q;;D)eap0)#rNG`lVc=qEJw+_vl7?QR`)w28@O0P*6wIP%~mb#&=CUDAzFs2;tK zd1@ZDx@=cGSYydWD8y_2K!{-oWXdD?8=ExEYS%ex9|F4%1q3o`Yei4_Cw+$oCf&^I zkKm;+0jO~SnE1K^uFIt6Ic|Yc3@Y^Sb9`c2hVip31LF-v_2-!+nfdL^)K`F=ZGjMg zHe8aN=FY{)0w-dR$&9vH8(3H_z{v=9!ar{73cIekCa2qyri9YP`Ez|jW7D>G+BNgC zjsBy>1Oj;i98L=9X-+Ss*F%6xJF0yC7;Dpw>nd3uaIobm`7-$54alp3zZnsdUzijT zcg|Q8?h_EB_Q#5!A_nB9FFewT6xAOeCo{XD-#m*YUjgf8qox^0V}oe_VTvj<2A>TCd}0!ItzD-WR!qms}+D zZ`#<^-tAv9J}1x_Y`_RP^5duc=!39fWNb#7pDY-F0^ThX@JCNwfbyf0yrEi9FI4%S zW%l%+@DtZiqk{hlzdZ~FAdN`HNgTig07tU`W--IJ$iZ`%=EN#SwPYR%B*Rw z0|{k5+tjtzx_5WI(=!Ayz$Kxh~(n2GU%3{?yT)MN_M`NBCJCG!} z*?%B}UyLwoSTu>X9dZtZ$u11oHp&PqsuJjCHiJE$TZYuMpNBhlDR`j()U?b}cT!qh zW(^-z!Gc}^#B6zHCdtjsrZ4*s>@V^kgt37fLI7n09N++44Lw5Lx#Rn^U|2u&2ZSE< z_yv}AdI6j4;6H#QOVaR4a^*@w$J<%`o@=Zp4Mjr;U;op3`aXTsW!=bns zC_s%11}LRh{M@JVg?NQ|2lSDGKL8!({Qdf8I<2>hwGjjb0)#vhEQ98r+yen801Imt zfCU2>Tza9*f?fDMWuHZfU;qOFxGsno6SbUa>se3Fv_otXGewZ+{V@e}kbP*~L;cYb z`>?9mWRyBOJ6X=AFZ3tjH{x6Xyyi;y)NOnIsjpyHA11s*q&%OBRsd{f$?V!R%nIHe z@q+2ofa|@tFZ?hAKszZg0SLZucuj?&3?7ePiYE>Al_1-{-}!#qX?rLLQbi!p*6U>3 zU@%86E*PB{gU1nc;xx;8E(-v6zZ&ou0kQ(*v_V3)w+(@X9Rp|9+*|9iNfVQVxBriL zAbr;Ts=wx$GGFjou+pg5_nHi#;8lP%k5+hqnmVQGN=oN$1m4&<+%_V|O#^kkOhA@m zpmPBOz{HE6nb2pO_mnCL!P=FDDSqR;mTh7-@Q0?;H#oLEzaGEeZVka=CeTpl7ApD1Q3o_1d}AV(ll$$agAU#PLfyfzlvEOLlmS*$ELZ{nMZM{jz<}t znDAwP2&M$L&I`oL=3$0-@gKSGy?+U^3lgfWv_@aG7fpK z^Y}SVKjQ#6KrY`>&fm2+Cqw81*@SoC_tnEKcW9UZciYTvp)ipY-emyVVqBQi6#C9A z0F*ZCZ+aemyEpunu|+h`Bf^FHUws+VLTpZcLlc;g8_g}FnC)p z1DO~v1}M}cfD48mQdG42K*7VZpO{pj`11pa^*hsC%Cg&pzWhIE$3HoQTo=46LC@Gb0};vI2X;Yw12IDKvXpu-)j$A7 zpc#aQNuSfVG45x1mr^7J2~Y!N@#|H5ePWr!FQ^vs4PfvAj?>-m|~muUGX!%H~`Zw{}Q@W#*#)774L zP4X+VE+BA36xkmS;X-I&>}KTpBLxGK*T*#=YoMlpJ39+d@O9p;7q95O`mw<93Vr-| zfC$+ms)htR%FKN2cZ&gF-2^G11cP<#_|L&QF<#i8JO(kMK?6_VdgT3xO{`~{Hnm|n z5d(tcI)oono=0Ay85C;y8wmqTs;= zT=1$SiH?}n#->S}$LIk8k393w0*e8&-W3#SbQs>@<)hCjG2)03YyKFP+4?Z}_zgz~ zHMVWfp0+vu(90nJ*@Z8Z zWz#2GgKe%iR8w3qCUU+r9S`mQ=ng`O!~&sbxwHPEVeyY6gwW}5Y>y}*Vy*)oKl3$* zSeG+K*L=f5uNnT^_pJXg=&0{}n2zL`d<`dl*?tLsVDlL#hX6kEs$UE`jmYL4`algq z_BTEn1)-bS%zD=I5>nIRzI^8{1uqXQ0B`LYpf0o@?0b5WwXY!fB|i&0O0Z#5egDSC z?Pz|!9maTX*dZahqX>q3jsY;Ro~Nwu+YvkMHE;xjy%v@QV=v*z7J`Hl!(4KhgzLBt z01-qjI~iN!(vPGU{A0izK>piJ0U^g}c$7^~DG{Wohm#a^xZa7=r09Ivbm8 z;IylUcqhn~Uny6p2K&A=Fr=Y@3EuYG#@k8x<}h0c+c*ZXvL!8^_%RIrxcJQM}-l8`5e8Wk4LaU4H4tj^!aJHLiV-fWm=dN*Efs>E?h+&P9WwT z@mcFr4|>V5VUSsyhFS6MV7*{)I|1WeXeqeHWda6(S$?Pr1`a<4lVOQVfUUf7oY}YG2HKdII^%l+dXvxF8Wa;3kirQdPF)H#fOK-gI6Tb z&=Kum8#4|^0?Ch#*WWM9t3JP@gCKC^VKN)~aq!s|fx_zc?0*!(Kt1&efgD2lgOA?5 z8=^fneP~<(J4TkD<%cTnnjfV5NcWX!3k8p@52d)~d(2!uJ{0BxhO$ziB0vTB7SEl| zQdW>R>Co&dF5bkB*89ifDaJs;3R+0gS?G?K9l)*^odB$##;l*me$_krh@K54XfT}7 z2bcQS%aP;w(6lzD%@0lHeg)wb$OG?eW<9rMVPW(Nq+#F>1NTWJUw`&0fxBp8UbY87zD?+60+1d(%JBg` z@}VAdI|xJ&2-N*FI^l5b!2t*GPSPZQWK{kpG~k7N?nl8#5N!;g&xOMPe5yOadXCpI zaYUFt%a`#7aP_@J{+Eyo65LeV?%wfQAzQ z=vR8_gaTk@YhcI(15}n*g)#(y(j-_`vdTbZnD+kN`Hmzj_BMe|Q3V+C6I4-PuoYt2 zvWz5#0K)Eimi53oOHLx#2`pTPK(W9bM>Hd5Z71A|EXzcLXYgtrg^8aa0W2<*%@K$k zC3&)yBvdf3-7DvSv)D;pnA6P(h@)5tz1H%WxO5u+87E7ea9Tq6E%SOAo15myry#Oi z8Pv1)k+BO7MIAW7h$vcl-{-FfV={qRX&8^k*!J3>+JG===BkiR5>V&Yx9Z-9^6wOUe`9IUtq0_#5W@jC<8T6d#TCiW#2_ z*5jw&8Gaod)M-+Ar*TUGhYcuO_sYsMqb4W;ftR_LR}buC^ysTRa?xOx<1m_V?D6MF`p-6T1)7Fk-q^@vQ>SSP2)>S(muz{TLZ!!YVtMpwn9gNW_RKp9;rW6VR z3hHZ?7jk{30G+{4ICmUE8lWbBGRXTrUrJRnGSZy2htP~1GIy5()VvkAxL^teK7hwv zz}KpZ81-O5RpE^vKQl*)Y@*Euia!jAuVnqdPyb25kspW@5?hjkoIoxR{sCvN2lRm6 zvxah@d)7&y{!ot;F6*or27f=to2Cz>E;a?&KsG^I=p{+7TtvmNA_PE=-OM2eWO@Lk zy9ml4IszS!gE--&ii7-7B~1+wxb_$3h0s3&7hY2gtFfNj^X#3N{Id)HxEccFj#qm4 zVs#+Uz}Ns2M#dqSVlWh3gO@@nbZ#XdQ}A`(ahG1vdzBvc6u=&yj-Nc?FCRLQWdsweoAC*OH=8|Bd5F=XGP0;gATjJ-b!upEn}__yR8if=XRB zXWR4MNic3)RR1-%Sbp_xBhoM+D@1c2t;gu#lQk6*4pdR{}r-HelBcpKb8y>-FBQ@I|Y&wk~8 zDn;c300F2B#rAZ%aFW=6nWG61dwQMj2EaB$xz8|seI+Om`X!SFdYtX3f#>e^sC%If zK&@RbArPSRa~}f#7ySJs3PR72LAKjMc_=7|B~~P9FjB1P9~pKt_MET)3kJZfonGgk zy%B~mLx(A@7;LFx0s#Y*ORo93ydrr;!u!7SIbQR{J!=k7P_ARh7kR4GC?IshWY!*! z4dC6Hd6&VJ%MVWr@Oq2^I{T@iveJ`Ht{{eCn2tY3Gm_5DuA(=MjUx~Flj;^A+m4qs zVmZF5+>5OIuVbFgI5?sWnP-Yv&kt@f&=VjeB)Tu-1w)LY3*;9jZ9n9{IY!|P*d$ucE2W;G0qpw%z@*<1`D6fZ z`G|JHY<<>`)~%PiB|ycG>8VVMr{0pklKL(Pk^Q*7PFKSNAjPrvT`4Fi)!`mlV1#A_ z*k3Eq`&KVxKS%WbhI*ZdGEQcgbgSx7Lv3`s7|;Qyl>8KV7ASvZLSr}m3c3+C_m_UiN$i=vNw7zI-i5K)rw3NdKACxyvqO3#5{B2zZjNx#O&|N7P3;ByR1lAuVu*;M2 z!ouR^K|_Mt58auO zG{Ef26CFGg{YET1dd{h;1|H1SI*C2v z`0`+IUBP+zJ`3b5Sk_Ae_q4rq0>J$k`?#<|jpI0oK0`jb^On3XGsP-ExV{#ONH7Eu zBzMOT_QDH#yr4X-5OGF2h-@0px+;q*?2Wt|*R7kZ0JA`G6;NYpm3j148Tu&>W|u>kuD@B4m2Kz&zM znzK%Q32xVvbRbEzJffl+KETv|%`Sj=n<-ZH@erR7zjbS|$=5-i^nDiSDk zt?A6HXWR>YDKIvYr8?EsfG_;GuR2x~UnPbMuaU_ijD1Y<{0=>$OOHg`6)u4kW^vIB zf=gW(Fb?y!XNa=Js&ilJh2OY9fuQRQix3eBdJK5Ne~1F;iC+d=AcqN;jTLe%O`&00p}8Qf;0M$M=;WITk{t1h>#x!1t1~Qha%cw}2cGr6N9D^a<6Bqy`J@}_5B!cNzjM>#Au zu&fhv63sHmx*7rGxqn^_q&>$z?mtFuU5crAlu|-M$Sq?4Y{+?yu$P$S0x&Fq$Z8|R zdGq@C&_)Wx7V6r&kdyi%4gjy5BLMgX&2qKvI`0Ny($KIAvj60&U!~L-$dM74wTIBN z;=10Y05xv~pJNIICVb;deQi|{-_wIdsw!?vA3y#a{V3@R)!wcoiXNRhG%c|0-0es- z5--c5`aTc<`s~^OBfTD^*CV~x5Dp=)k%SQFLCQtEa2(X>naun0{R6#iPm3{oHx@$o zeU~9%gMj>}7`<+2yAcwZHW}Swp#CUXBDZi(`pY;c+!QY16^tM1?mBzM=GXz|j`&&(Ao&rB3+|_+;Q9oh2~@o&V67}uJd9`TfANtG z6b)e8k)*Dw0+3}T9y41biKZPFMa&wIb<$@uoAV#7_ZPJr$7xat`@`=0KmQf>*e-ME zjn9J-1Oo_&KzeTR+%m8RCnM{5eSF-n1DTB!XaHvtkaR=%Fki(1dUFK8Yi=N@X`G>F zPn(!=>L#A}V_6m&a?%s}%G?bj6hi^yt)bq!U;r<5z0c{3aSH$yl@FvMunS{*JpP== zkw}ag)ObW*c~z%rK#1Wa+0jgv_I0a;5&1iNJUOej4KCUh*vW!R1hAc~VOcOP2cevj|(`Nb+jU-q8io)x?wUbn_~lbw`M*IT)Dv8 z0R_MdU<}Y%msgdQo`gWJ;Fs-jl4P>0xi>`ih_2>ClxTk*KX8X9s30=FK>uh7si6nm zK>$dA^Z=rJjs)t$L3iTw0@0bZtFF7X+v|?sGt+OcN1+_ZetzVRApqF@AK5>2M%v&G zY)QLrSyKD3RkEYEx#NuoHFt40a` z3#su3m3Mm0y0!0Vuj`+0e>%0N%q|XFv3SIy@p+5rU1DJd$ z%<@B3@bNtr02IuW@${o_9n%>K5XVc>bEq!(K(bf6G2Rha^4SSVhGV1?btA3T^50Z@L+yu8ZKvKlt-Jh{VZWpNFPLoT5a7!mqA}&B=kWVF5GRtfx+} z;SQ{qcA5oyDxJ4T^RVJI-S%F){p%n9PW|@a!L+aeavtUNe-r?u?`;*pEa2qG!ome! zT^r!FVnz4t^X38YbX%ybaLpIyM!zBmex?LtveI4e_B@l26QKPAaQrt0y5k`bjx^9r zCI=arP=*WT0}FKS!bcM@n1T!C?I~*iq}neV5B_8NIUk}5*EL6MBuP(IJq5_tigtD~ zlkG8*pGZ)CfY-|btk3c404xCZJuK$va|H+0*;=fB&69lH%>4G-X{W|5SkAt0R$iBD zYW{70+&#pT<)H;f0C9sK@q*AmVAo~7lN`z1@RNlcC2>Z3_wF6r5H>|K#GB08daBeS zAasw6eHFks3#BzRrWhu?u7-EqS>O{e;4+~A_y9cw0AJje`PLsjj${)L$fn5+tPmDS)BI;yvxEgAK!8hLxla%v`_*ho1AP|t6`@}XyuJt! zChhOg_U!49kUqIMzw;)q9=<^_%?LD17-4dqOZ&FvquCm~Wr6`pTL37O&gHd9f|cIA zmthan@ncDjNC=^!FD8lPN9V2Pd7h7DC39brT$TNUg$3s4Zw{<|oRD(S9CQik_2^Ly zfgUo6uCsQs@H0b)$tPZMPuLc{>)laJ|hHKYb`z1P$0`rH0NzIV{2sDk422=kH}%2wV8u- zryca3E*+O10eU(DK(qsTkVII31DZzc^w zzV}M8UV|mK0C@5Mz&-+`8`32JZdVmv8-MNrSQ`WZ@B$~O%k}3Eph}?V!=B_4t;8>S z3BW7b;}C#Z<6Vk*%`3w!uL?}~X!b)5tcqX(fk1(289)DG1}GO0+sZ5bssjMSBw0H< zbM9noW;wBpNkUcxINr6;kn~7u5?u{C(qYPl9y(do@rZL9yPMKV@^$8>!$m_lG)TL!>Q9t#|43T1#&(&Z~_Q~_1d7E<0Sw;mKRvaC7dHep^ckid1dH;I+p6c^^^z zKG-Hsk~!zjz6MPtsl;408~%oakO1_OS3v!Ff^?yzQ$K8oK)|4j6P4M{}_Ru3=$<9k z!0Dl*SKO=1*hRa-Jqr3PF2g8LO0UV`@Y`WuHJ4i#zce!+uh(6u4QXP_mKo+*82Z-6 z@LR>>lb&7{$}GP!#263bS_9y(;szEW_xzc3L>;K-K6{FbGsIxbc`tdYQm6zb&^>Fz zJ=);it(nilTe$#rfl>gx0B(Wey5*ygo-C!J;K7e);hd22rhVVGeH|Ch{`}upAAcOH z0C?YshJq&wMPd10!SSN6A#vU6hCG@doTe#Z1-3Azm5e!0y%PhKtq#BcYDV%xq}VFWYjBqzI?eQebPXW05ECV07g_A}@y6_nwLTw7vLn26OgFpiq;RKF`72n2 zOU^p!ZpO3G>0aU$(F^FrjzEtjk?WA82Y~{`<7*I(2<86C$!V{Dc*vIJ@%a7ekC{6G z#SH26)%2-pQDb0kXD6j^J)sEn0Oayu_p#^OTi03=Yk6^K=}X+n9qe$pn_oFQ~+Sw;-~YS z14z=-)cd}l;l*tBwe^ucj%+6M@}6FLf$G#!DJg>z{#UUuIvz<#z&4O@_CqjnD)GamU^vZoF=>e}A=z)&zS%%-oFXRX- z!kY{7{3Doz)x>tZzh3*CjA&qU2x7#NWkoGOIF7f2*%e>{3>W$aDA2hJuiPI5n6y9v zW-UmSg!HO{Lh;n&A0hGY8|VHeCWp+15t$l0Y)Y|DK z%L2>V;Ce&=7CUwJ48~T?rII8$r_D)HQUx%}Vi>)onNQ8fYuv@wJom}i>Z@5<0eFO# z0tS!^7?=a#1Qy^AMZnSFQa-5V{H^&pY~URaawxeHW8)g{zH8fT1H0(#3W;areVhvh zu*YWP7G`Dg9!w2@VZ!TbjA7Ew!rM{|vYoKU+Pinluiy_$LNsI3etnWA2Uu+B*MW^2 zwzqdVHH@jE^a(K#hR}W1LrxC32En%LE@JMhO9BG+F$TD^umH_#jWFi^ySwG2$?seh zDLnLA%o@Gqx#yj}QY*InG4jl2paUbo#od5K5P+b;>*X&;`UEf+Ads2Vl%`p|d+%F_ z4C%wZYU2@k)~8ZIAq~(IH~}UAFqal6^wZMTU`hdKaohJ4CQSIDQ2CzFwM?-+<5@T- zQEThdwrP&ASf5{?m!u?Nva@$!YhgGjiXxYez^u&XM;&^dL$3!w4_yx+0Q8>f0dfzZ zAlq{_0;-m_ZB9;4b4UpR#Rv~0dFCg*nlARDHf&(@UG~Ck0k>`48fZ;tO`!pYATX4` zDfuWE=$#ge0qA~heq1CY0?3=cF9ND%xmO_0kxemgSsXGph9d&mau*ZWfFx}2BJ@m9E=SSQ0 zs=Zc)@hsaP^2fY>5^#5A28LO+)%6^1Uqr!MfHz}m=rIbrQ!$}C%^4V>(E~sn8bA-| zey!I6p@sKDBF=0*cg_(>PJm+X-6N)qI+da>jGXWy#~}?9w;+Ln`E&)KFZUK>K9+uL z-&^^Ls#gR<`Oh$YeuVhnfs(z}(yxydC5GWN-AgysCyu2th5%{KE-&Wr%>XQ346J7X zSO6Am7Ed~|X9=uT1(KH2p5A9mN!e^;Y`=JWJTvq0ns3hiMRUN;e+do+;2xeGlvzih zr;lEM(?Rd|@y`X)`D7eOuynK9dfxw*FVRrhU`#Sa`cY%|@m^-_6rF`vQ*Q&u?>3qN zqq_tNsgcr55CO>_iiE^ykPhh>ErOKNjfB#QAT_#MP`bOj^WFO&?3}xM&+~liqvAQt zPmVd@m>S>wtixp4QvB$q>JF3rG)eGZ<7j#(p%(vjGz|Veb8L%47Yt8aPoK4zG#Jf2 z%zFMJ(@`smg-EDgTQJnN88ZfmB!!7G=(m$<8j1n^k$uWPkHl`Cyc{)rINpz=>{0kB znx*OAWaU1!&GP`u$ik@w40Cq>F~tqvI6=X-J%6uY#;lb;A|0eUPC2%H!t&KYCSo^2TQLGJiO|%TQ*= zz}KIhTd0k2?%?x%NrhoRDLW2C0}c6Gz&DUyWbIUqym?BULgH^?9jt-xS`qEEJnKe5c+yk zVdWuw_~|#6k=ZPlQ3M1J_6p$Y?5CGqT*JxfYJhwGr*&3bLZbhs$xAvQBc6S{VTBz7 zV>BM+Ou!2^s_|_|t{2exQ3*|BX`ew3S5Pm8jTThMQ-RDV=>M;%Qc9zhO z{_5S5Ko1!T^46-43vdzrd^s^$vQ?V$h~aml<@ib)Mgr?wLuuXCS0Yhi*i^$4KX}GX z(teN7yM_YZ86)As>YfezCZ-d)Z8##8U#xYm63+5DPZPaGkvWI9hBic1a1d(9CsYU& z{mg8B#Ftb>u_hH)ZvI^Lo$s*ZYUS0UNy70@{C(s3h6WLL%{PHeeeAa-qm`utjzh=I z!CP;C7Ib^y6*>57499XbGbU(vCp(T^o(QzXKFPc%s)Do>t&7(_)pH(cjmb_~>&cs7 z9P!UbH-E(Zyts8?RxEA%`@?S+nRqLtMO8eP7sjleJ`ovqm}PgxKF$IwD?E7D5AVA-L({_p;ufEBVK-Z?DgEzI2p_&F}BeXT3X=)yl=Q zPqK7M9Rb{vpA&CAi^VX@T}a$zMxM!&_{0t#CdDD_NDb21H(s#2Vyu)}o|5laGt}GYK&T0)lTy%akVfBrmS>0{;aujC@mnuJmAy&V!84 z9qhk)szcw$`Qj=xPU=*}ZF~hzEDz{&tocm$t{u~*u|>eXsl*ysTJ)+7yieF^VlgRF z8U5+H1ro5bx;;vp;)(X|rFon3Lo{3P?_G2=mt@SWN{TgllU}u@e#T8!EibQkFFY$}{rBj$102d8 zG3KVBsUfiESi7?KM>XxJyYc@oyATG-N@=tyJ&S!Xt}2MrR|>oSKs_vMV-gZkbnzc> zSv|4>1mUPv|i9n9lO#bRG(7ON?S2zSircoKy^mGmi!M2dE4-JFro0hToFY zrs|{>j=%vvJ?r>4uL>QqQ&kc$tJcjmBF?SGH#{o;MF)+Y%rmB`Ka;IH#wB-UNdK(w zfp1>t<{papP-)f5Kga4>DQKtRj&7?&wCgSNzfq~H-B22mFfy@KFa_1C(G7duOPKe( zqHdLi>aCoSeVAkb1wanN-VljJwhCU#E4DGO%R8~+&xz-}}0$+7Xdhl5~|nN+aG z`TduC*N+3d!5*)JFdxCjPo`}ol+HIH5FA4extHS=o7mEp(hH_4h-$WZ17Ex-bj_)@ zac>lq_ii0ch=xY@^HAj~Hw&#aQ@bNbd;-nieTp$2J$^4!tD>oSd}FKGue%jK7?2VX z8<@0KJz(y}Ox?0WfboZ392`)*5UXgBy4H>RW)+)@p1Dadr~9aYr^0KeUMdC)_`e(j zX5n6x7wlBE{^Y3&g5IGn5{G133D{XJpN5-Z)L`HivU4)srTX)#w7^7rwF5rYR9Z0S zn4PDk&LS`(_ZwJ^n7G*y2e5aaCB4(C-@1O8{yFgC)@BGD1)d?HxocniirkN69Pv$> z>3%^^71ta+HoKv;NQuwt^0CBoC}8oC;)>Zg+wG6#?EDfpSD_#_5rn7PxxQ7+K&NN{ z{Ov1qsH@#|2*@irZ9i{&E3sme`xoCzQL`xZg22SXp4_FBP^zbfSmZrFD|!Fkm!zU6DNfoWtu0Hpb6OC&k-Uoh|Hk*-yk zbN^XWa5Bn%w7)A?1G)rYhkE@TPnOh0$u@vjl!fU5XeXgb05uoTiON^wD!`f6_rvtJ ziV0BjpSp!1JRu#02kBypKl#V+m794V$CyUk3qLI<;xB9CRG%ANkqeLsSQqFAH$6t= zHvCEsSk1`tGm?SVQQVZD;x8$Diy zy`QboQ4ot7PGZ-uX;pPP7##%D-~KpW40(=4hx7={yC7o)VKz9?6Kt3b<99jKSb8~4 zk&v!O?y;4_*7uL^P|+evRt~lMST?P1q2XYPfw$v-S#nc60SHs@JOup`o3gMo0An#c zHg`24akzP>khF`Iz3v%pOlX;EP_6pQoLTaS*$;^?b3SQ3l@T^p>rQW2;btKrTFu|a zQZ%k8yrt0qW|>OT!iFVa_7KVw$A0Cbg1uSik8dF>*E%b!{+w%{DaemjE287veqVG0 z3EVD4XY*(~<9pGJzgrMa8d9F)n^IMIBz_1RP?gU16di)NV#W93hUdbu%(+tN*1_z+ zkA&AjKckQQHd=beM{H(1|Ki&j?f9{)n9Pv>$RPWw85|xwp5|^goo6NM%J!EazODF5(@3oI)Ph-9*JJ@ULak^@M%% zfbQ*MB9SyhSLq>NOOlR7?dkq6YB+`j9lI2gf4l)LV#DOGJ}hgXiZL5eSY*OyMqS4P z>Iv%(25EqG#od+P<9-QLq3;b)YfLEW_u@VT`hX|TWKT#@HtMWAbX8Rcx8**3b;&u+ zBZIaKeqW8OQ1qm`aM_-Cr-ubueWV!_SClJ4z9%{H9}a^?Y=lhQU6ZDMaRQrK4k$*w z-5wQesJ38^JiZ1CfCPX&DZyJ*!`^%aMb=xla^xgiu3d!Hdhzov_x{Y}s z#v&`-G^X?^O95ch!sU4b(`jB5T*fGt<)Y(X&e<d_@JF-s6m#*!7>QZ$2F{ZDki{ zt-;(6pYTOsR=<;D|K0E?Am^k)rGrx{IdINOWoWFaBWCq@Vpoz0^BXkjHc0^vbs`|) z+`oX)3^<9lx0}~-MmKo9#M2^u!jd9%dQ|nsRr$lkNLn(mTP=HCP_ZWdL{Fnxn&Rer zXd4Y4YR=k1D823!oU0@d1Y`VD+k=i{vMe``9|;*z*o=YFlfN`*(%9eG`I4VML{-0Q zLU;G-lj#rNPG6kpc~wI`FXIc{kmSQ~!&?KrzpZ@cB4 zhM`u2{nmBcM}MY~4!>m=mVEE*9s0E=d+m!Nsq?rmfV3a#n<-SYv9%`T8yU8gzritw zQ#{Fi1oHvEQM8<1Zoav6L)nLj(Y_0@Fi9WYVACg48K|skP#D%RBzZHEGua&AImhNiW|~B$;E+4_$8s6HunDIOSBo(sVn(3_A_xy+Y%(> z_)qp?Jr9t3!^0-=2z1M?kTVWt0*0&W0-wTaU z^o5T3zK{2sf3ddVWG55-bpX*xf(j-l(jMA<_B~oP6?Jm zn%=b76aD?_^P>IeGQzr~y;QHyG=%C29QjKxtA+~c^NeCg_C}3T@#mn@-TYy7$wNT~ zs6#y=DlT5S|IgiCp|3XXWA`2QCOaN7n#TrshJL+*zt!lV!BUPJJ9-vy*I1<1hHgrT z3Sy*lNT1*1dk!~u!%?ytH;Bw$ex_%8J-uYHDsM`)-L(I;j>efAD6^dzZdFDRJ?@n9L>}pa`d=X8Djo_Dt}%~X9pZXeySzxW~QP8&db=p)j2W;;aKf4=U#}Q zi&Q+bIkrGKU!^wx1I}kcKIuSmAIoH{XJpO$JN=&HKIe6%TXzbfCcc3CDo*!)V3J|M z{tEh=V`3MI!n1IU$f^B2DdIaK5&D^X#u9#8NZF8jhhZ5`YyffChNsC=h!`XbHHdXFr;>r++IK=F zdI}LD_4KD)z{yvQv5Xl(9(Pa3fRWl;0jInFBCx&q6awG^YFcqb{+c8zW(K?6nsTLb zYPpds9Dv^?F93(m$T?f94-W6k2V?aBtCdW?<>Ilok2!w=l~zIT%~~S$=>dAwi-fWg zfB?VORzpMM0&P9vsPkO1D3<& zIIv2`Mw637^uhl45N=z1^LT#UXOe<4v{}yXmdQ~CrQ>244_4g7;^g=D)i*=5GwZ_} z;!Qt}FR#dDbtj|Q?v5Ea2W3|3*Kh?oXTasTYAAhzaJmD2x8J2tiv3tZwVT|f?{{~8 z7d~vbM?Wv$F)KR@a=l^tlDKQ(Yiwj;_mQhJ{MP^XL(Wux22wimaF;Y>Uz1D4%~A$! zcd%iuIOs}e9p2o#n)qK;YHD(E&{;h`w#S-cfXp%3G(&F~OA74MKg${a-%K!@36Q)- z`6X|+(+El?>r~VTEb=9mYot%!E+wp&6XQbofLd4tDJz*H6_xub_VKiI|1Siv#Cw;%z@)^uu<~#rYGQCl5CPksa!L< zMKku_IanX@Eb1Sw&YHDuiPE$rJC|0htvWcCc?P?LHOz=Xo z362fuqo9_gC$(&GE~>2IbSrgTDE!5e*7&NvMpaz^+JY*%lbc`kj=MLen zE)){y;GVX{o*uvKJ?UjqN#3vfSR>;nI(0EFJ5iqcF=XXn0Wak9{Rc+m1!-^E4wp>Z z0!9~I#3KGspn_ZBd+}vY-8sw*ukEYx$K`4)7@ebAsEY@63WfQ=sv8I289#y$2a}?a z{C!&+)Q0i#TSBaNhb5$@SW}#f<`vzNeE05_f>j^YJd`;#hcGI zo;5tZcskvJ`T^o3R061Y=}bT~GnjF$dlij@8UN{TP@Rb8@+(AP*ioDR3v>k1uVsPO zl#;!19p*zymo&CJ>!8n`0x5!c%~+A44X#-%COeZEm+UnF!<5cn@MQhPDu6w6fVh?B zW3t)$?xXaZ*T|I7)a&*pA;tatAH}P@S#r~lB2F2a3opz` zPA^|TeEqtc%tr58GHPVb^&efOG?(=7B)%c>U#57F03H#ZL+{s%obnY|l*@F@XM*TzyCck8egc>MdSH3H)I&0LoPv|P zGXm1ZTHGV1c-?^PGj#&O!%%YL4ChrG1rAKmszz=cuupXSx)OJ>WxB+jbtE>l7P!jD(a{ zj2e!~2|ix!xrGPnN;CU6*nc9a^eRIHnSwA=01cXKAV?4ke*KT{0V*%(4GY(QePZjc z$SSrW=n2hgIU*hz#3Ja*9OyigZ!P1l1**cDqN!R^Wbt#hLEnN~A5v@j@eIRDY|>Ak zfTM<|&sY(aU!(1QP@23Cwy(z08z!hqonz?Y)tD*y>EYVJi$k5suqQ$jF>9*KxBA<% zAI~yfGCx0JR=tcqv&czYcxYi&ZlJN9r-Jt@IrW+T2mOksixwks;Hpt|oP9UeT@=ztB5xp6P@0bNnanq2D;YwiM^>#7p2<$tF%zFv~|mF1}D ztB50X0)945R)9{M5ZjTaVS=D5<$QLyek#v1JfN2+UxNhv2O4Bdk`wNz1X#S6uF1yM zoxG{$+k0QZEIUMZ=p_2qaId#pHs+khyRVH7Xcl`4{(BUR(&F&1jL0yO!sj%xV_TNG zZIr)09`N_gCkYZFTo(qgQz)!*DPA5Kn`NozfaS5@s;EVw-NkXsq1@_atO~MrqIVL= znaI3cn^eD9_E24z4}((72qC^qFb2)Zi1OG1VPX0dfY8WJyO+Jp>bDtgcKlx9hS6XP z)R6%FnW?4htus=0vE49B{a|7}j00=5mlcbG{Ab_@>RynE@PO_t?)i9MRi95tZ{<=C z23>;uWua6T4m=Z@-J^kMGABp?-gI=Wj@rHHZT{Mte`V#RT0s9lT^Kj=J|~Oo!DHn{IXQ;^-)Fez%*vcY*OS7 zM)0ffa}rfD9R$gheMZ`;=0Vb^s*R*!lDn_ORS3Y>n7U~$&M_#%4b2~{DR^uaN_Lxz zsB*~o@8e-w^xNZSto~sSWQy58MF?m^Lqz5n4hjMCRWk$N;M4s0TF4Rz`x>7- z0GcGxLEU#+@c8o)ju|oLu%-CyKY)e%W3buG3mk>EusI^$2N#3eV9+sJ!u})}(v*Qktd+{3QZ=K z0Ub}JGT$4l{P1&zms*pq;!QmG7+-jMD;b`XdRAgz&%sxvw+klI? zQ5z@XcQRrc5ORFv*Wq+6(y^qJK_igUkMjNS`vwwXu5V7-^vkrBTZJY$OqECfloR5K zK48haVqMQCiM-o-TE-|KuuMvK_4QA3YO z+s`OR?#}RdoLHd*lIGKX+jXczKK`U%eNH!VQg|B?A^KUb0QOt0PqRjstP?aj0wH;u z-%$jmamko>Y+xZVgH@f6F$z6d!d;v@?^|hZMo)YC5@tb&Om=q7&u!Qk0gbTL$02-f zh1~~KFSvPGf9aK8x1on~W4t*ia3h*Uv)l~|<=n-T8o8hv4?VET0~Dq+-|gJRi{Bmpxm>CUcPrA!XUpo{Cid}bBN`zD#}d7M?F5=#^DnY5d>8!3%%_EAz{aXm5AX zSq2>I6}NcD%siy|>v+8-7F`;~)v|xt8dkqvMhLISUVHWT7vFpClw^HMfiC>Sg>%0R z-k>P5KD>iChM{@CVy@z>Wp3ltNg>@AG%c0SDjPtD0MjVlN{1S*MxCpq$Rtp%LF5`r z9)u0K?u`zgVzMYdAwG`Sx0YWQ5f5bZdzi96D*i;WiQg~Xy+G3#_Z0?T4Mr;GiG80t z-0LbKAAdL`J%{5OK%k)5SG49PB3pIn@IifYLqTVYXX=beL`8WrBez%Pmn9^ zmlJ9`7C^RJ|MPCJy)I~Zkzlc+yDUFCt8)<_IB;};IT>tp;`t^`zCevDXx@0aj+dOu z-C7FEif_;!{IjbYfx!3?B&bu}Ywuzy7=J6iq&?>at|7={sjnqIahNWi3ly{BWf7{c z#6e^JPV#L|x%X^oP%uc?&}wT8T=fh0NtAIpCaB3Bn;kHu=L^0cQIknWH+;`aU*?v1 z@iR`=VBfa$VtQ_{lyieW{yk}nhm1R^QXbKIJ}#y*Z4{YQ)u|0c{DEP zf4J)#0wE^c{r{5q*rXP(^)LUO?5y9>C*ZJxutIkA-!JdV58zGGF zfVE|->N1^kwm`kyP#pG!u}{6s;edamuqvwci%oBFKAC))ulRYXdAs=crNrNUa2mDT z)5qik_N@b*gfyd3fc!V*77CITjE5&=aTN<^Z83ZH{y!b{vB?ykhrh8bSjq~YPoDNT zB?=TQ8e1^dyB85syvT}IN(e2RF*I?F*jRFSu`UoTSMyH8-#ufs+9a5KkR!`@YawLMR`1!B}fUW`SLB38={&^SN zD8hjQ>9oMO6&g zRd3&7&t844KIetB?3`htO&+L^pI~L=tbXJuPo43#;iuD}S&k|y9tj>GFdtrj65E39 z#2Kz_T;~qPZfwNBiJ9Y;mrFv~J8=D23OfZtAjwnel}__2dQ-mM9N~Ix8{xx)a~n95 zoZ^d?p8i;jxT0xm&tt?TcgVi6y5smrqD(=MO4-mJEpgo1jIaA!beUJ2M;UPlx_gZ_ zrZHw2&P5%W!AhLaX1GO1z`r=cK&&@;=DkzrYNriX^5Ps8;aNHXg5jM%lwJVhOsN1f zFDR#+J4GLrMmOLK*PPNOCsW1_o&Ri%+=tJ(E91R$*f&H!KQ|M-Y}9HQ#Ff2q6R1V! zO34~z*f^uv@lnKr3XfWX$Nn(pKt|^@zjqSmx2(98_HG?_hSPEg(uCapJ7UNb?-`=mz=0(4g~`r{;v|faYwNIT<*3nWGJ~v)UcPdG>Qk2%w7<6Dy}*^dFbiBX zKIJDrk7ME|tzy6$ko@rpWDe*JQ}k$BRXGPEG=kr(!yn{)g8bGlkL(}yn5Y0nRBm3a zrKX@QVnNx%H ze#`X8(mFlpq=r)Lg3H!>2JG1nnMGUw@>ecrILQ4YSmSdn2=8^Afz#Pc-u*dP>nlJj zn)m*=od6teNWH#HPX4#6CV*-qSazel$S*1Tc@zTW@}^vPw=bVu0Q-OuPLqSZo@BfX_=O9B?xqpmowK;eoyyTsHx^o6cWqW6f3T%=Z6N53- z?JL2ldHwB}J=<@emhdxO?YsWCI42;rnSk3wm)M}Kh!(R3lE=$zwcV|q>TBDhB-k7ocO|9}h$gQ}SwGIZy`f6Y&Ro{czuGeyNWTWWyd8K(n z&`pY3_X0Brk}v8b1Su@I{RkTGMkXlUaZyeYASmH{=U%rG{Xg(1(*F_J0lsf7U* zF%1W#&~Z>S365U03G(g>7+2_2o-wBZ0sEB8OCo-|>>6E+siKorK1hli5705w%SjfU zW`Q*-&PY0Vf?6ib4~^I+Jr*Q1B?O&uaKMk^tG|%Ga|N4czqhdG5RfBWKf*@UV?z+? zI{}w(znCG-_Jo2y0)ky{WBVbX&#Qk)HS~5|5Bto6JMUkzk~W^lFCOal7$IA%`RtLb*q`$37tOjMmGeXu%KT(D z39qFb1Dw{k+M{B>%RJ9W0U4 zU!2ibFaI~|qqomC3*Cp-WA5n@`kOpSIfuDC^Y{K<6N&j+TR^IGAI=E*rL=|-`{ zAJ*c(A1-}Y>n?;EE2o4b#uut@ul3+!<+#ptAw(?rJ~cZabTbos_s!`c0oM22Po6mY zPl-LeUs2%P_EWxj(y7ohRgG~P6zf6eaG;8R5gSk-#4&i4;=i(?;6sUNekx<9G?g;z z1;NxRuUMfLquyGXx{Yf|u|S3TtnVb#+_MAPB4V^L;G^Y4`dCi)svOHQGgaN5*g!e77cApl6)%FzR1K{W5a7k^- z++gZ{vu^q=JmS#ywk5Cc4+E*h)~ety2oF#w9k90}Pav9^8qDL7 zi>E?=8Fiy>{WI9M2Keg0NI1n#U#6s+E7*}blVJWsPrQkYNwF6GV5x}z!oH(pQZV%< z)F|k-U0~n>h z3s*0O7l*&nTIjMhkl@jWM;ZS7FH-+59kOGExnIOi&;Q=Kn+$L6@aLP2O)kn?Db3&V*KG`o5})YKTN?HY&2Cc zUNG^sNYy&iYR{scEmw*WL`bL>OOoWz{-|R`dPx?hkg$UT@w$5)dQ0)Ze?_=f^#0K0 z3>odvxQXFTA11GS1kr_?OY*=aEca&{QKzjXfT?_JaSj2nLkkxrW zD`y%+*nZuK?@N^QR`SnJ5h;&HT_;bLhP}&0(hswPUrmDim|9Nmy_Qc|kKdxVTPoaX zP_kX5X?xpqk&6TkHcpkER+r|TPF^jK0rOaq5jI5Ym*qL|ulY1E_6px{eF|M;Ce2uy zZVrJ~yfN3SELs0BRj6gchj@P?7lup@pQ%Sk+7S>EO@(Z2S>~K&{*}7F{X8N@rps9t zXRgMy*S_s*u{>kU`WzMnRFPi#=%S_b%I&7U{AqYi2y)V_fBxC_|v} z!H~q;pY+o^JM>8bg6ru>>wH%AvA(6Pq5i&GC^^zT9G)80@!AZUQYYO{C_0~}VSoze z=12F=BFBvoP*zW&xuayK>g3jD&==mU-gN@wQYS z(nx02SMvD21x-$>ah)N|F<%o>+8CStT-_DR(OIV|MvV);721}M%sLA8^aR}xDuv5Z z8R#GsHB43l(esbDF(8CWj$ zB&B}Gu+JRloRwSkPiNmxq@AbQ5T=ij2IXri1B^do-?bz zrPfZCEN11t|C4kD9xZRCi!~9M%50Eiw7ET7e*)!0=%ZO9NR=4CRzZvO0IL~tIDr;1 z_a1lt#ey|kgFn8SYmhjg5XvNXr)GiW>9D|#59(svIMu=meq2O=wrTXy7yxSk{P31( zelzGfuiEdGUd;|EoWf z=I!6Cy0A6t9Q}%*vzH7q!ytx*+Iz7Jm2X5szr5pEDVDGc7*UeKzSfYq)4Z`5ETc>% z1p%2HYKM#%TLV>TVEtytd_+4Eb#S~0q&cVlrA}j|JtMPP>}Ph|~3OA+#} zqaDPWxA+y_K52ynGrYO7*m$2bp)z|uk>vxOmJRhd360Q9-*LBWW6Grd-z)$W>%Wf# zB#@T?_Rp$-5}F6-+)*A*$Fmy~Gf2*b0mb6`qn(Sk$E?tndO(G2%(?Ka@d8Cu$t~$c zFLbqfrR}4lv5z)o$mR43nyLc|tG>t+@u6n$DX1g4&-g9*L$eZ}dxYd#dST*u7E!b% z>*eYpOKI5w8=C^<36%Y8{Xz(4qoq(bWNfdnPm-Gjh+cCxmBe|q2WZG{27Y!RTSTAd z4@I!(%h&r_#}|}r{ZSA`9KDiZbf5W${wv*gx=J@1TMJYq0&VP)SYN3B;47hx?_UzJ zY%%n*vd2;{IV9x&2pN(RYDJiwEu>%md*umh!*dq0MKKFI=2AdDo2`4C+qMw?s;cEf zSc8oDb6zS+2$=V|zfm1u6p6e`Gd7rIN?V!`myv|BE{DUg{t#8l@=@vC2J8Eo`^!cJ zdAm%@BIto67?{J={)@A0u$1)`;mJv5Q-tL+qE&At9FY%-K3FWS%sj(K@u1BLcGx{w z$QSnyl77d)`XK9>m0GyopS~5Z-g?Yp304X`O$apW88(jO`rB~0P4sL(vQUle14-_; zh~!OpK+{n4gMxEytQe^!L$_Uq3TOW3tYqx%d{ldLkgiN6bT_MArEIRmZ%=l@DieOG z6bvSVfhVP2`@B*-R#T9W|4k?vyk4JC%Zu;{VnWkBxO8LA6=03VoWuXfCDu9@@D^BC z&YJ4*KwzRf6;IMs_hPqyFKUioe&19@iirq#WNTd;a8PVxe@K2Vn4o>&|9zD)?as$PjkS)A;FbdNrB`=5!X+U3`nxY^Rs;oiXPUl z!9n(8wmC2sLPN?O$)Xw1nJ`}!^f~VP4JKEYRbt`~-+YH_1;%)~BaU}1K!5*q-@j#T z+7Y&}Je!*|dt8y=@n z_FT>i6Et{CR~)HvpV6wOqQeTz`xIHH?ya6Mu&`iS9@UoOAIs8}3*iFVZLnBeU0@ zw#xhrt($^5v00S)-5y3RD zj`N3nr|JCO2hh(zO#$ieCuZn)grhnMd|GuJzjOkOoEg*8EoHXcqpaVcLk(J^SFNj` zj?BxWf+OTCaC;K+e*Uc5df$%47*{`>r}54Q22S$@PRT?{G5Y7+rWgWOI+pBOE9i(f z@F8Hlw62F0Apon6tX|oF`@DI8&gSUxukqrKg)wnBD7JQjS>O16yJ;WlC#@;k?N}Ts zte7tY4c>@?{6C0}{?gl6IfMuN+jz|<(eRxEuUy*L3j!MDRZAc5a*$s}i!8r0mhvuSN17 z1#edVh>JX;qGFRI1BcPK^Y$NSV>smoW=Mzs-_=;dMd|RDZRj&RMIN8~!_G&mrRwdA zEYU6a0mS5RM!jgk#Zj}Ifzf5s#sdCd7cf7Pj-P;J`i(03TTde)5E>;=^ zc1C!l&p`|EY_}gSL;yXc49DDxT6RR43nBG4GnWN~@+j&%vhlUltUZ$hU2gu)$fT2_ zlL&31Tw9y<`LwGagC5Io>u~_#)+oWxbUCgU@PW zA&t2fYeJ!0)oImdMuE{cHf6fvyoTkmv@}5(4Oqr+QI7$Mg!c9;0TeD13gV*(kbarV zb|@<8Z_b`i7DBD{Mgn@)B1GuU!sLvTvUqFCazjMS!`lVeAd7Cpe#4K*r-#kBIpp@? zrPa6WiWF~Nh=WB0hQc(r&LtMLTUtu{^O;m#j$~mr8mVYKCAE zuv1++v6oluDZN`hG372r}ctv?<+wyc+4DW&b;AS3tUggaP8E z{|;oc_*@rBOp02=n@qvh+kJO!I$1fXR6um8FHgU@Vyf*Mh(&xYrZkK2=X_RUY$u!g zJ(Ay3a{hZ@<&7MR#p1B*cB?!LiFJK0BOkc@yO^-5@XHkVuChT3P}uVIq(^=HlqxhY z_Q$!|cDh3B8V4_Sr@Gpmo~7%A#FbPwrC_>ld!)M4%DmzQ&b!Tjn-&3!#4G6V<`@*w z7Q_AFLD6z%CnwZP=F*KNJPdm`x%y0^W&(*si_Hb?3-=M=$&1+y?oE;6v8dA}ohFu< zz*(6amqbHfI5;%yXQ^ZmmAeF?3NdEpcf4bl9IY@{z;? zK&x13(T%k{h(Zm9-lse zu;4*-w)1f@=h?BuUo8U^ajU2?2VV;AufOJke|=FO_lb49mLC2aCeS7R(^2^9-CviP z!B=)hj|4kbw=tVzcU^ zBi!PcUHMQygNY*e;t>}3q4~d+lMz!hCl9lJ%Kx#o@Wk<;2LDa|%DQoU zU}ZY}efZeGyXi|8ug6neJ^`^4Gbd|qtHt1KEYTKT3i$i)f?ldh_&S;-YfRsKq8;S! zSKI>Z+~)58id|_6b|jxoKjr&Ua`9S?|Ap8^e-<(@NON zgXJpI#1ebhb40MUh4q~3c~MYjsf_$9tN%lsU9R&NaMlDS^^~|$GhISo?ieI90pNuN{gl} z&+YNzyj;lr1@jU`ppZ0$=ezj$FYKBtR*Li7&!|c1Zk3PqlhLK_Z)k;$m>f?r@Jw7* z8E`0ZAa&M++2?RTpB0I~3B7nM;p!!*$t=UdPx=62L1OFqgLP4R9=}=V zhY;A@>}ox!wnu(vaWC=P<0`)FICqg=TO0j<)2DWT`2Pw}6v5>Nof`gRB z-w)F_D zEwAk%a1{pp@p=m059|2gKM35IyCkJ+bi5b33WJ?l=op8sS6 z%OMUt&cbUtXqp3g{t#wnc29Hso#LsL4EVHX66y(}>BHixHRh_VI!y854#P+6$g@%g zRtcB1C<=!@%MBVeWDt$r(Iba2xlcVFCzRvbYVf}gW;9UDM>$q zSv>ZESDE8$6ZC8K{dZu6PEmM&8 zEckPM#T?a3+tkbJVCuu9A$dQN$OBMmD6(&)8}q%1vH3iGeq@*aoakiSuNa@TOX`nw zH%~*!Hrh1!$MrdLA&Qo?^}~M z!*Qk{C@QF*$KBZIbO6jA+7<&_ZccCKTI8PdpVKkv@#AtkjT`=q^{K?RVdms{&C|cR z!j6bnZ!nHgqur?c$s_U?K6nTjGgy-8ryWuOngc!HV=JOHiZxMDw`=(^$?!zg3wZ^H zeW$Ez^|6#6^9{Zy20`ltDH7?YrVcI9WwA0b|91XBa&UtlBsML}V{datEGWRepAh&? zk3pZKfYcJH^Lo&2W{xjkE2plC{l#s=rb--XCvBX zWVte~A3JWv6+Ky*)XaO2Olx~{l+kW|=YOl+7z9n-^F{kjU#8Rn<3?tHE4!Em`dWKC ze!`c#^DX4{NcF2{T))+(E^)iNoEBJBL=)zk&RwKF3^3=Z_^k`?S=3Bt_PZwYxi=6i zjeCf?ekz4*n~bb5%J68h9J1!5z(iE|2PnLS&0UUNgzq6NXvYdLe46xIwIZRsMUI+v zB2q!&+4w;RygQc5>g$|}@A-ZvyEE7jEB$%D_u1=$k+}W%@c0=3< z7D@~A!k&l0RYu*5(7xlVn(MV}zm+waUOO%A63iLygi@IU3t%?WakXiEz#=!+gu|=b z8q^|bjGxxZY}{AJd)Gj_;h4@5J=0xN{U*3eYUz=n?M|iWWQm|}bv1wbR*Y+$^^{Qp zW;Wn%M-mIcj#QRRu6w;psSv-oQ}j8Ty9EbPf&1kvu6J>Az7iwGp=Z^6Kf(44a#|`z z+SIl?^^H{s2?Iegrc|zrzQwXCm3xk2SIWCo*LV)OHOkTc8Htpt^Gfuo#M?EyxG|Q* zfJhdHj8?(5T8&b&pQ#SOi$-yoz-vksQmXGhtz%N=fvA2Ry0O_1PEUvYTI1|%`?r*r z7ad;mWYW{ZbFuOF3>OkONDz%rsIwb>6&VYRU7F>wy;|2Bzo#F_SQZNU40Jhov51WT9#ITsjtaBYsq%y7H$J*b?j_`28_b2h$xb zLE$ARnE#=O5U~|F^_&3t82;yEu;plkoUJxAMLUHLGwEna8r6qenzh6oYi;GF zp;qeYD|go=NH%-mA=7xw^|DbxO*UxiM!80|8idyqRk4vwP9A`z!V@8D8w-|D|+o}JXS6VCj2E+_J68X%mZ6yaoQo%>+u%W0O(2d@7 zWY8!$h$sjF61Kd(6z0btq;K}Na!?ADW&B-61j|$5Pbg6u>#ky=S^q8wS?v}<{13@M zHoy2_^ZMWfA*_;wutGH2SzvL@1b-0Y8x63AlO%fGjx68=d}bCd!}>7v`7l6P6U^}k zC+0L_Faa#V?JlqSOUM?07yJlVY})R2Eb^{1s@i?y5t3r5)v&vvc@4)CMk*(Vd zco!GI3<02km$}s24ZO_zR{$p4T6QNwoQd-XTM{ox7HorT7O6L4c9& zo^{gPGz=V>mpz*y%ms-Tz&vTaP%z%bqyiv>Q~-t+d%pe7ft+K8w{P30@0;3S#^7mf zMTjAMYVK?n`ij0gWwW(;F4WK?axE7_=ta98+{@-QQVp^NsyI61Fls}34d;hA0D2$* zdZb1sPX)p!y&jaSYkIE(p5}GYS0NgQRGsQUtpab15YmBMEm`0f%#ayRoP>j7;~no0 z{=NC%?1ppKk>6*1sxT%e90$AaeS|>(D1Zx?0xeK*TMCoT#ZZ`M@K_2!&sqryKA5(6 z*%|V)X*+1sMoMN_u2yKw1u^;PJoowo_+#XFa?&G+2n7|SLi5q@%XH=<7}y26>%C+m zu15eWeP|C3G$AN`U zDl9PkXXx{_KjV?)O>+M*t|pgnAKKM!Xx3*B9(pHP*z-qlckhD(w=D>m1dT}&wJFU` zOy;VD@H}?)>rVNR#{=s*27twHu>ew7L0)#Q^FE;m8)Cv)2)Iw1O?_wfr(YI&!0U)c zwSIBNA+9s(IzX^-BwJF-q6lGFVKx9X&~uCX;#V$U+!|+R8 zYFlg15~9&IZNGn3gQ&XSw!3w+kPt|Shi2kWZN9^t&AFcv66Aw?jFze^O`{n-5%E2X z;{yWp^b&jOqqX?P`imnS>KW1Tj7hy1{ki;RpgYl`a;Ca$5bnZ=72z>8_YrF8C&fSjP}>AlCYEYeFE zJf4{uykL1Dfj}XJRa! zi{48;0P<{lx@WNiAoQNfOLR;ng@bPC8{6#*h$_WA~kPe=T8v7hgbf z5vA6;RtKD84&GJN*nqz9l%K+CkP(g}bi+7~onX8z?!@3lF0;_qTLTP`f(HSZ4C?{` z=oQd=dhZ2$m~Y=Y(b~T6{Cc-G`IXmNfk0;FFbVf3$9I8ecLnNN8gK5TENfj&ZL}0E zK@5j`k#!;Z7`^+k(ws_UQ7&- zgC0MIB}0$_|g z!BF`Cq1@F_mhSVy$kirq`uY=X8XEfa_1RxY;z>+6nfhn-(XtC(!1a!WO=oCRUDd`+ zD>)39Jks)U*S%L3Qm)Lpn(pXd@y`>_K*1T`-< zJ85>~xwAj9G?-v^umfHK3p%H#3+1{Cgn$l+HbcQZ|Eoucj7~cUbs_3{B4&-l@%`OX z*PPcRNi1KNK|aja-0S5CTw#D^Olr^c?0tK{;kxep$raD4imD(D!0$idQ<~1=0>+rh zY$*kxrB7=L!=)JNRTcI+1raZ^$J39d+(cA>rqkIF$M(C+)754*HN+&B=KlP@03HF} z7xC!j0F8003<=rH7|yR4Ip-Lmy4bsW-s|qlmfiIN5X5j#M*`^ufR3vP=l}vBK$OTH zS(b#R16!DFw4`<8BpM8T*4O9HbSOZskLJ3J)U5i!2p0f#ll;|#Po=0d*dwzz!g#lo z(kH!#2>|Ut07Ib^Zwt_QF?b1(*C$zL+{Rz~S@`GZxwwSbw%>NWK30ktk}JgfpG6li zLy)mXlaWIpz>#1?a=u+Mq>E>J{tb#q5lJdg&|C~AiJrb~o2O*)hl%mHAo1|z+5WqLT!*}9NN^ZyOmGKa z0&(Hk$iCL2+WLq-s;$4P>phkCzvob&PZHMkFn2C64|JjkrB9#N+5OXyeva^%<5L@1 zsrB5Mbk(O_yC7h$_$=o_0qY3k*v!fg8rr!_U7#+8+1a_&R05O_asgAh0MM)61N0*D zQ){9bFz8QhV}D*ttA09SawUFp{}sICnDystV+DpV?r{NzAeR$cC?RIBr9Z~l`wayk zFVQ1CJ`Vbfw7tZg+0r&P0`Teuh)!_sc6?p!{S(cQu4i-j^5&YPv355-dycnplPVev zWMC zZ1~8tCtUP{i-aWcG}K=sxvuLP7*y;h7;umKmVr2&{~uQfu4Zei)6&oM!cg~~F*PAU zM|UZQ_WU!1(Cg*3gm^TvnJc-!7HfeK)~hLNDGIFD>*lBSiXm72uU-HWP0}=H?hcUP zc0n`Zs;w10pL#F~OK2uz(+!g&U6{ad!4%gm6NW(D=NrH<3kIM}z@;jus_?PEDijaP zh77LBE_Simdx%K;@@!TsNQhTV!V&I&RsaEFt^}L$=TCo{PLnoFY-|(75pn6V#WXyF zjxBnfWgWFJJ%|n{7tK&Zuj7(hbD~k;53)5k!+&7d%69HAbj;sdG7fnQu;8b<>_^c9 zd?c`pHanl-_ykC?dl#Hw<59oT!Fv|*)m!&xY@B-#XnS!BxKqoDoZEK)rQlM{l zDzK=)C%tSNKff{I-a9mPgNfrl?e3fMhI%KGbM8q3g?|gVfFLG`i8c6M6fC&UX>y9V zgyJ0X{5F``f@bpEJ7gfCSJ#k-Nk|>a4qea*I-&j6U|Yt^fC*Z04O*U@9GMUU+GqT^ zq+kElgE!2Ofo9$L6K0*lwY!gZ8=D!@s#0ShV?+1Y0B~e{H@HYBhC(qzz!<=CPV4fy|ZMbAPV+5EqaGfsKsDSS`H4 z4OKKiz?dX)BC0@bTBg(f5tLGpWofW5H?4xhR?PO(#5iI2+{@F}52cXi3J`$Ti(Dio zHf^_O?|TB|C$($T{!+h+b=L$&nDq!ftbhyVNtaSSGIQ$!;2KkRmI=tdeio_Tj*CimccBP)K z2}2G*L%YKj(OQ1vr_u$4K7j^C#&ZGlc1!0{z<@D487M6iigBNVF`dlr0$5gj*n#1h z`tcC)FUF~c&gPmV>Fd*$vS^ICNRo^Bo^5^_kVA5b>bqjootwe#RT?dFF%-|8*T3nFT4Y2Ahyc|cZD1r5QKe7VnURH8UT#3=8 z>vWy>|JjLWxTpd$VxqOGQWTP&OnRL4u4jdb7lT`1F6M2ZPznyh#!d?mJ2H^v2gufq+#Kja^ExS1vcFdt6P9CuW6XdwgLjM{y^iyUqC*+ z8b8$Y+@CO}o1S<(ij-%4lOhEOH2pFhp}P$fTo-C^0VV)0b)N$UW&tn&eOt>2pxldk zFlEYkzH>f-aEFGbxc;w5Y`<+ESGz;69&HdX73L(vQfm zbT+y+twyI|cpI-Op2XCL} zYrp0hxCUryJ-d7Mc8o&dZPhe?w)3ifeEz50Dd~$A2d(8U`%HXbAgH~350UF zheBICeg3NviL=d+>N_MhPTxIay%ux#;G@@X&wxCi=>-Y1-gqY!fKK&t!!#~1c8IDf zqoC}S_78xstru5`*kVx!0_g_8;HFs?k?a>j@MtLX_jZ(v*$NqcmKxM zT6v%Hi&le^u_q(I2y|Zwpyf5-rO;1l3NM`7VqnM%Jq6gj2MBm$FFW4|kWKMtz8hk@ zPrC*XAc;9SNy70DAl@Is%PVYxrHQqjY-nh9*?|TFr$`u;j8`;lEzaTYuwEyF0oI4G zp1KIe0P7w6LG4Hqz5!OyVTD2w`t3AMs)oUf@pFTM*}hJSp)NZxDEJG<05-8Azk0ru zYCs0Bnx^5Tn~8A&CQK-lS7uTu%w@Ju`9SXi2Dc#u0DAC6_|jrepMGXNrNOoT0BkO{ z?e(m;tuAUl_?*W-;FJGQ3k7#*Y??l%kLiUT&Jowel`7fHmieb_Qi}M)-J6M6u&%Zc z0*+=Luh-WT?cL`r_D{5xrp62M{s{k=XkG1>h`kFasHx_XXMO*QTEMPjGmhOOFH$IN zF|FGcm{4Fs@$zIZ4}t=v@?Lt?djdVa9D}EfpP8@3T!39P?4hy!_VHR-KVc7Twv5s6YfOV{#pm*!sa0Icz`_Sy_!`$bGqpIoVHE(pDH zh!}r2joDB;Xan#gDTofE(aom%@e(_wLUCmMQxIsi{=B>vUa;Y6lE;JbNIjIH(0!sGh1tS~kvESZ zpbl#5*}G?A>|#V`?>%Y{wDM5J6*6F7L(>hD`$J(M?n`S7-i3MuV*tY}n9l~cm?FELZPLzr3U6QF|P?d6?lCJg|@vj_Gcgl zE@+Cv6|k}Uw5v~6MTq%}`v?5M55VhyjcMw{0^PkdT@CFGA=s`wcYx_M_X`cc8v9N+ z0H=WU3!M;^bQ^3hpmj=8T}5{DoEnuOaG&wN+lSH@0DK1mL0LBa58=1|G5};E%X(Jn z$6Ru)bl=-uoC^TP#qc=*)a?g?7kGYwmSPI27N%FREUU+5ddD;NR|5CCs9l9?yu@#x z%~L8M;l4k}r9~jX5gJAq&q{+|`^Hxi0|sOI1SkgJ^-x3rNh+{nfoY4!Pq!R<)I<6L za2=yQuTN{O0T1r{`s(5G7uMtoBdpZk?ljFV-MjR%0}vial%&g(PFJ5a=N`MWczO#M zunWDgt3!T%$a8S_-SaX2xsuI8^Y}{C9ngQ{*6z2zZgdNwgoFqsCy0 zJqBPSJIed4OA0|IV^0`?hH>^5pwHChBLgsjeqwQn&J>un*`dm|6PH893e< z6xEF5@onEdhz4f(tINvDv+wz7gN9O5S8FxwA3o|+Y))X4B-9mmYGy(Dw+euL*4At6 zd(6Vm3#rCewXV0?O|I(({hFESu_;gS?eCviTD=VU-!Lf}UGCPqzd#C#vG?})XyprG z0|4FQtmBdHJ40QU0vJ;!ysCjxFfeNXg8@TW9l@vfs!E}~_H>11dCc%Lu9##$ZM)h` zn7_U(s7GJ;dCA{{SUawEyPnE(oF-v34j+UuLB`4 zsR7*A%(mX8v^6io0xMJj3sM<8_~|qA6>~7DVcWlEsX{ZkSi^wZdEY*M`eOtI=Gbukr%MbCm zG6CMUV7}gXm(r`AK$UWOIhZo#@%VEj=OE$^G*m$cun~RQ*Hwy=aFQQi`XOFke~eN_ zNNQUf8oIC9Wm!1i*u;;LyJx&*3!BcKOgcZRM;B`7xKMVXY`d~u4_&XXg7ODh#sUKb z63V%n&0!hNSWAHa-h7CAEqNzqV7biMth4tygV2Yj2;dVrvfo#+3KfL2i;N=x zSGcA4S+pB8G@Q$Bm5}8Ai#Feb}vzTBSC>Rmj&J}mP5*WPw6;Arj0A_+|pr1J_Rn>ObON#E1MoNpK~) z9KU)v_iod_r=iE~Kj&j7sLg=sVzAXx6MztHmvZG&jsWP&L3r3Y$>4X3OwllS;xL_kGx3n z(oYR-3lpFe`gUGsDH9A#9)H@j_gsOoH_VV&+nuruUHzEd*wBt3zCEe+ix%`6l! z#r+ig5C#{#(Be`k1((@TAXpn6fI|GAVf^7EMI%Bs?BWklxJ*Pk(2ihYem$JPwt>!~ ze$ZFd5P%-&0D6S*tl;@!$#o@H)HF?Z?ipz6O~04kKFyASFn3qL;eK2DD_Pc4j^4qE z7D>Vu&uJ-#B)OZH-Z)`({-0@(rCtUPgaA!Uv$NXs-naVwi?3|7jUwm$tV=Xp@7O&V zn{F6;)(>&RXY+&|7%d2Xq(5s%RDiqt}nUR*Qf!j3QvqK=&P;g@bf51h!aMH^uYVsogj`UXl&*GtC>*lu>@Rg} z%a)?&TB;#*500D_=vOfCp*0vUw55gOLZM|?ireB&=0cy{17KCXSHZL`(`B02O(>e8 zQ-;ak%seypgKZ4lfBhHvhj(HxG3%$Fm#|*S^#HsC6m|Ta)`i}o>#y!Uf(DonlJZj- z88%~Jo-yVzH);7Fwe>M5q^r?%F%Hqvd>7S^6N@ueFcdJiY{ji=jVhz5PJETcGBNEyeI*y-L;7 zWA(!ReP)(lM-DL?ie1$y@>6W=!C$~AJw5btxmTQGT^-PjnB_#fXby;-Ia=CWSEU-Jf z%bUIrdWZ`fNvVgBM*82+&|&}8Cp~a3|ML||9|#uke`p@g6~dQVQ&d2@$DS~`>v4E*!N}#A zxB9TcT#A`M0q+8odgoPyqyoU;GB3;HW!swoO*K%L8$|N`%=aZ)^J9*;Er>z2tc12s|Po!P0J4TM8cPUEVCT8<)%2AMx`Xwru%# z+j?mj?9YE)`8B%qUR@xd4M1HVNT7OEtK<^NAHh%Hcax_@pFg5;>>mr^%^~CvwXt=z z>#zMGXcq-#jtTk_m6rs@KD#U3bOX$V0tO2GR7Xmgl;Rqm>v|XZb{7B(tWX6k@CEE) zrZe(Ua;G#$j7jed;xmU?fRH9>2(93900w54gxTGFn9#HI9?wi zhf&SWPTSCP-uvI2*Yu7%g|SH`$yTk}GJSW{tgEf*%gT(Iy)-o&Gt8z{A9Hu2{5;zq9;&c4!y^81+V6DWD?S$`%>&88k+~!77g+p+Xpt<;@SOCbLlWrE%vBnw*dm z$@wC>f^aejBa;g)0Wft7v;~ZzZ;b)qty=z2uM!}TDxn912R|Nv*Prx*^ZB(f|?hkdQPbA;2})ai~+w{vv*Wf8kzU5QL{d zX1(q0*?Z8*#U;kRYWXSE5MVaY%nGyNX6dJf7I;tro@N3DFSC>hhBtawn^r}>f?g=L ze+0`$9iVBd@5SIa`J0bt=F2KBuMv5zT_8QQ(}~S=C#-*PzaJ|>lI&1-QyW;C+x9VM z!X$C3B-Hd(|IWC-Htw&Kq9FYlEbN-CP)K_tgq3;x-8eZF`laCyi11>#2#*9TP1D?I z&-)gMVMs#kAmoJ(1aCc^ znU%?oH$d$w8VoV=->k8xJWwv6030B|QIqcK=u(FiAV5ffJXLo`4+w$Y#RbRf1rTzP zU>#)3hF+?>cXyWRO>Ky=i62oP#%43duxh5c%XDBivt_U78nz;LuC+^#B#8zB^an{o zcwgB2rRo3dLbZN9^E8gn`6KR5`uS04AcHgmuZIxGh<2x4{cGR4?YtF_C=zNOa82YxLn3@C8A`rSJTE8=Cy1& zHe=IQUBmOR(VGbnsO!!_01;Bbe#Wp_NjW>^DA_Rn>YAp9>4pD}!qycqPB; zuJaQNouX)W3_-V4r6>fXo8vecxjErg-)t~UC}kGF#eErzF%)+)x0H~S*P*J4Vfq8V zw(_mJZv!0&aWbFzdY;9KcevtYM|XZILqllU}M6tA3YWzTJ$g$0&2QTN!wit^~{Xd=$tuN!umOG z00hVbJ#qo$2VCvhyEQR}ebolzFSV@FC~QVJySwW+_BhUQkKWN!yx!DFV#3cGr{A+w*IVW42C4DDd>)fU9)W)>zT?AMgjIjZ1XrPud zT6%(#U0TwW0?}OOa$?pX_{u-j&As1&5FnGZaZS2K!k2(eAn`4J@+TP50DT0Sk=f1c zivjx68z|-(0{}HZ3-tA-l?6Zo!HSP*c}bBh8ykQ>sd;aV(EQDepH7EY1_2;W^@<&8 zlJd(PK-a5#a%Ww+fc%do3C2Y0&1x9;xoCDd<8p<>@h?}dz%UKz^IZ2h+;g0Jn&+tg z2(hdISc9GrdX(3Kz1hGOmy~YR*8w~A3io;Z0i{R!^BG{0O*7^EMvXWo=GX7|RH2d{ zn;w}k0UAb^Vp=d>_|*X}Q1DWWp#Wf@rHVlBA&?44q0Q8O=E-?IP?629rd>d=ZGHY` z`j71e2Y{2;$pPW-D6kK+AI+QV@S_*Jg@&3mU#i~O^-l`tvQr89*k)$Bw9CxiU7ADs z(xjhB_8f*Ia1uHCFr|CwLc=2_q$GrH>TxcAJ$Q9QVZGLmgcr^R0E9PO__(jPTAOyA zcPB9Pp&2LkwwISj%^x)6c-E0C&1O8(tua8KV_YVNkNBL@FEp4BqRQ)LzY2prjGx~| zcHav{-OKgWj`f+DnQv=nc#RNndH@^(CK@+V^o(RYvB*ypxubNWYU0SHF_bW%o^Yv-}p)hq` zfsi8ruN0$od#2~Q#~r+{puS9l)42s)1MXy&PY1k@ z3aTtl0AH{@_NSvf_Q?QfXbQ|WBAU;PKlLzlTR8g!)HA);u>5M%qdS1^HHP(}eIM^D zTr*xc!XA?6n!dWRIiIL1^Rd=H2SHRMNk{_0s#m)SNtFP5nt3{cp-61jDSsF|uZz5& zF{rWDbLZ@U!JT5?fo zzMbeJnRO3b(>-p-V;2`6PC#(=LU6jDTMaH{evDx;7uc(_X0gxX^?7{+2TT*&;7#>e zL-nH}WRy4=@mkjXb1n*P5wobNZbG33%sT~W`N#{SYPUNl5VL-_9a#<` z7gtei*qtO!zVlhlVB-ql>Hr6>R?xoH11Owk0q~Iyz_MO9ui*WpTmjW2+C~@(s(N7u z7{esC?Ie6?8v4%tQfX=KIO()Qz9I`47B4zbUof?)FRgTw!dms3@j7Knh_CRU?Z;)w zNS-&>(+dzNVc9yc{@O{rG1QGAv6uf-1eo;gyL%SinWg27dc-Xn0BL;jaII%~0yZvM zxDFuKb%1~g$%IY0s2!l1T9|BzT}fp9%(G1cEz`do=TD%=M;60ibpH)29EYMf&3KKf zSqOb=_7BAd$n^;F=<$jsaSdwkJqa_qx+IAAlDu96%m(@hFpI$FyDu!S%-ex6VDQpX zCKxlJRX~VUVf7y98_#s)BP(NJnje5f*5}XjOgqetfdjmZ1F#E!ftZU004Laqrw3S$ z8IVUHmw7s0?(95jc3{V~DHoB6P+qq?wx-cYlTLGKxXZrekmgjwUUIDsW<6iYqp=3| zRX#Bkstd=Ne9+k_$nNt~EH?#m@EQORgBxqdoxPo$xI#hE86&o3zk`Y@tPE?@Jsumn zfl1#}176<7ySo5jO2G>NrBDhkKo3CZqURNc=~A8%-hmXO0A?LMpP6qxttkWnhtvNb z+RwsR?qKc!3kX02Sk^W!DNjsf?V97|1%Mm@3GuZ_uWbzzcH97qfs99vEnAQc>&dh~ zPxo9%)|G=5L)jEc_XhCgHBRb;ap*paKK~g9;B|r5_iq3KNv?+FYWF~50^yPwo-+NL zR?^V)*iBEMN0?AE@lxZZ^lb|mN+;!qm<0@!7N7#Cz*kl13V3EZIY-O(bOv*p6YKf- zQ;%JjUWEhv-+}uo46uu=?IKQqBmOM}f}zRZan|R&s=^(@-;rZEBTn|QEMxi?&80u$ zr(PlVQG@k;1U=@T5gxp)1$%p47b{eCJvojIN4b`KE&ii^h{yNC4`^tj{Q-yI-`$|i z2{!UArG;FlkIgt40cZdW@X3>h&}Rt6_4Z{f02H^>eftzqg{rESwe_c?yv~q7cG0)z zBtq+NW;z{gQ;r1(-2(^h0AOJt1!i6O_mD%xBs805h+!vvT6`#*S7g<2SEJJyjTsMv zY-ajowwl_s%szbCyU-aRbsc@%QdzQv(PBH7?OrKc%=Gl&RZI2biTm&qr2&=z%PZu9 z9FohB#vgRXCb+%p3U6=ZT=-}VNYg;WtlXT1^3kjTDEQFg1z-Zy0C)ik6!QvDS@a~m zz?AWL9_6ufjDT#afePM6cKSRso|?e`I@JMPv1RZ_z0Ww>huoj#!tlY*^MVj`)OI3x z!R<|9JWe8BvaC2y_FnxkHp8&R)|QP{y0+M23SA1vnAr&c zg^6jwP%xdm2oPS)kD*Y;^-O2^vE{^I=wWn>ZP~NFyLW;>C_a#4x_}^#99bFJ+M=Ic*DvBNTd&xBm@y2X?gaw$dZ{~r zQiQQRSZreea_7Ff$rmnEI1TvkdIiD}2;>NmXAn)&4D`Gk4~jqeMs6M}Hv&L6Ky$~Q zOTqYCSY7YG%8n?IeE*UL$~&4q%xLxoWKS-HiAo~6U#fH*yH z`QM)v6#VMTMMrlDojXS+a)d*9LEv};k4V5s9Tdm}vmv-AF+z?a>l@O~(GM~0Z(yEh znw}1Te8xI~s5%!I3#Yti%BVd#J(wH%8R+ zG7ji)br1)Rj|1TNiEabfkG(YuM*#QAcwczIBM_3H1F;WblUD$KglQlnz>5Q3T!@L8i1>mqe=#KQYiLxJR?6N?0;|Sb%i*I*57pec!~=g z4v7C7mIN5fAFU%cK!=VFM{okhcsWNq!P6X&gZCvMuL&08h&d$ZB93F(ill6Y4ZUcr zV{5|}eKmu5sxw=!jp@b#)H?cbpaG&tmIvDi8HLT(in5LI=y)i@ZrgkRSi)<(>?iZC zD~{Lgy4&-P5V$w&qSL{~Xn97Z@IsHX4x91#DyV5O0Jw9Z)FXX?X_cZ)S;18&Q3Z-Sttf#D2 z<{w`8PNzSZ`jP^LbgqdvAg{&@viGntW}K!&$J-$PomCDiw!De>u=f|5O9NA(+m1I=H6VAQ2># ze>Q^qX)oiR!Qo(U2he+|GX!dSb>}$POnww-h@lc*k(Q#hw77mk1Sk7(Zx0$F4FY5V z>DBvXTm$tp4xxU<-2esxJ!;3?X=}S(tE^&uhgV{P5(K#n>7UC-1Hv0}1aQ(o292Nk zTaVbg6La*X{*xc_BHaz$zz8iA%uAsF7=tmbYd+RId#RTKzFKw>U_lBD-c1$~Y8rd@ z>9=)^U`~Ig)BT4UWk)CoffUa#FkM|u+8-i~RAX+#OVRo#uPj!yP!vM=!xI9O*`CFR zVGCgNUh2^UV0_Tyn_7dE_5ko|X6@p!uC{h)%+(Oykmj0iOgyPq^ZKa~-Iv3C>m-*p z>?@2iT%{kQga#OUa#orKFopsWih0@F1BJISNLtF|i4#f%Sb++w957|@_^$(*65EXS z+c%9xVXo}DlLS`^1OSL9C~G!W)hc8@*Y zpGi%Dn%0Y9Qt)m8@B-BEQK9tH#0S9YqHmSyGXvKj`3HS`dbc%d&Kb|QQ)~=`tKAX{ z&f}n-KkP|+VVwxqbTg!`LmdK(zU;wU5a0_G= z*)a*w3jpas=#|SWlk4>IQAPtgM1!B2YGrN9Bc&CiPCOf44U_o)c_IsvNw>K@UhC)eG^tX&Y7L`N^Z4(lR#ULoK(p!;5|T2?7GlN`~>0J5(4TL$rw zTobuIG;p^>+?*zDY>?$#b)kZN#6!Th`EnW(^rDhSIUQvaf zs(?LrI`cC6OZ&8KY=VdJ+tb0W3IRzIBm~j`xQg_-#CFsP>A;XsQ+2(QDK58IbM$2h?r2Mni{l|DH+ zyFg|I!C**Ml`96VEd?E+4N$;sC?%krK{pU!r-8wk%U&^q6RtI`0L(H1m>+(C9wibS zG-pdk55pa~7=n;3Kz+x6mjM9}!5Q5)ADkloWj;D}koW&1Li(0t&#ukLvFFId7%0Y= zSu;D~rMRYj{(H^a81M-|00=%xBa$FX(U`T!`Q|J&{-s5Aw(4NYU)>` z-TB*jh0%Ma2wHqd5+rma?q>=;Lt7+>X9?-U-lnh(7S0RBKeXz!lF96amWVEm(OKvs(TaFuA0Ae0Tlz_!7MrjkBa8U&!o0)V`72p}i)fB^JJ4G;hV-L61i zlK=`*`BY*vN^4{wh#(&Ze~S8!gIwegdd$##(DRHP$Qg?weL`$owjQhe6fqz-$5|X3 z0Okmo8o<;5r3JwK^ta$XCE$I^*Y_1rSx_+3AG-cQdOvONIu=Wq@w6_c0)^`eO2`)F zN}Rkrvv_Mo`Q$hT#$gs;=WpvnBHy$d%(2g4oM`!`aimqSF-KK+rFDeDp!s zFfukH%}*8#KmqTT3HYO@EIrg%Luq?08OelQkr;+wrHi=Qcb zT5r5lZ!n`1n?(%}P0%11z^1=OjSqtX$PswetEAS}b5O>e?7}c3vLvUXDuHfhGuY#~ zWk^l?dAM_zf)@%vP0K8GC#A(@*6>jkEa(+L%+|()9DCk)x8FRiZGvNt?J34GAv#Nm zf`lH;(~&;WpXpjJW5KX~X%<*=@E*|+ye{D?6;c6M#@oh528@_ASIvLUQ-8w%u-M$! zkx~oukpK!+paN(@42p!n2g}!SR*_CFV3L8Td*bdoPwfN`irr%o^RH&)N%ZMJ?v=AL z*w7OU|K{V3+ex7x4#mYl0cu<@KqPy4i~4I`$W`cH(bk**3w zMma^cK=YjidYT11G=RaS7tW8u`vfE;4Tf6?Z9#hC1Kp-IWys}~P+nJ>g$+1z-U8 z7{dlBfB66GY`rt(X)gUy9xy15E&+Pz(CHva24`i~JEq}+yo3Z;mH=dcmb?A72ZmrN z+4CQFo-qLVh#~w)fZj)hfJko>jhH=+>d;VRFg8I1@H)O0*?JnnBLRHHsNLzE{U;2c zx7t%2qcy_%4N;IE>~83$ISVa3m0JTCpbs*pbA(q0;~EMSLQkL~`-0w=`j37@ZQA;L zn|db_z|(1sX)2QF8bwDBEYx^(_mLW7VbAI`KG=Yb>#GA`?Ge}?03{Fz0w4yAi|w}k zZcM3265u>{VB7A16DOzmSsWT0*UjlG+X*8EY@|d9#GCnSpaz;6G?;KT?SEv{7cpLg z7Xr-iXa?D~UFUtpgaZNFwru6I%F-AJ4K$OtzD66a$?L7yu?-{LF+t+q|b# zNeI@iEKKnmXAhFp`fYo+mR^GR>)P)alP0W0_X~OCl8+45vphpjC;ZIPfeV1k3+{bF z0|=PA&(+o0tjt5 zX&loYT)S?KS`(5o1QBF=nE|fuF(L;e%m(2+61lK_90h(O_%gDcpau|M({euKfscvxeX@$YJvEK0(iT{ zv+Ze)9;Z#ffc$7IEV#(Rf(?c>1_KyQ0Zupq4Y6O+u&0BkhaPQ^BCYEuLOj#*vDliG_5q!H& zEbmf^q#yxmpiJHfkSah002`QLn2tXq&|J@H+P3%IG$>?u>egUDNXm+$MIzP?m67K^ z?pd5n`y<$ZAa@}A@fBLy_KKbyDN&T!A|Doga^m{G0T=+*z_m_S3u~64aOmSx!r2VO zs0KpQpfO3Bh)@RLdeqkjp8|orhQwOWd}?eAz^($*v3+DY?<@Tg?u}#5uFc4ixjSM^ zDd1gZVYUD;!S%h+&IJtc)+807f~p4$uKoNl5|jLyBkUVYmh7>o7{j(M*C!W=5*{Ka z>GZ2{&wHzeSHUa*>zB$|>>m~+M}TwtHn3e|57XAe;lhx!kM#HVkOXbAZN0nBGl{)Bw2J})M?{hR@enSA z2F7kiu0K*RFnN7k1F{Bc3b?bg00m#?-Foqg-m4!A46o3~k25Gu?OUIwjR{vaoz|sb zg2IZlluuZMH6qWQtzm2P8~)JMAy8nJlK|<4K5O?`@^bU9^b$Zgg5A*j#w}CE_6)CZ zdq(lSB3xczRN`UO^;Fn0_-#_rr z2xYl*rn_hVy?lutoM1BcE03+HH(nfPaclrHN1)&ZOuay90la-XFW`b}I`3+sr%Ea> zv%oNA>SqSX324*w{aX!h0M<+yOb^_1D|e!(Dz22Yv=98k_5gYx#sV0Zv0q^W@FQ~H zIEEg4t8S*9v=|H!SlRWt|7jQ?J)k=}1JDB~J)i?(3`sDU)QI`)K?8;WcKuo$ zGq2&0Jn{y@-(;NIw!3%FFLb(Ht%@y3F04bZ?if}vpe$V+Qp>f(A_N+|$% zYYbrMvu7C4GTEW_(DPL3l;n18LiP_q20G!M;@XH$EB#p_|#vde-w2Qq$tT zeCI9&FAppLZ|xeOF0>!)dwP7i&DY2KI(XE6Ivhki?pJ z26v@iooP7m(Kuq4K8wv12D?i*tS1f2A_PdEG6&zw2fNs={q}S`%+V+4S)*6qCnhyu zF%Ci!2+tgPya)gtFnHa$NX8Nf@-0J%fdql10oj%BW$Vi%N3L%ju=GRyH%)L-X&Qid zCk%b1T%j85`_jOWh6W~h+ix3hC*_;NY$cSBT(@2@r9j26eX3r{l*dm$LorkBH@#~B z-#{S0)hk00yu&2kD?PO-Z2Rw9i=fC2mwO<5y7nTYRLN5Y$1?O&nx_c*d(cKSI?eK453pr z2QV>-B7fHU)Pr7fY#3zLreRjRJ6JCm+)luF7g`FgahZStV3r@Mf`P-2!DJYw+ei*J zN$osQ$yuyle31$QR}(F1z6Pz zQP&@uu)%EV3S*nd^0WL<#a;7*bRX%y5^bU2vGt)8*L;te%g2YpT))d z)ACrhYx%?XV9ycg0rcp92}mLfP!dQ&Bu0bA^bXOalchjS z1L4DbBg)7sjv%}U$pvcDxIBAzopA`+qb@qc`;Pa0KGwT#8fYeyv(hwBcPu;C}uLna~UZAZ(g)s0?Pnc5iyI>BKR5)TaYslLahtGEbx3hp{XdHn1$NxO1W} zI}2lyeCk{^61*_pa|i*1GQGWouTWGMoSz^BOcGYpw7vIP8v)+UjO-yJK9*MT-*^op zG~Li6z~oH@*Dzro3V63n+{vfqE$NR2d;sz)xEIPS^$Fmh^o@^?t(u$#wB8O(J-Z()+LijMNfE~|m zVIYuKJZ62z1HjK90-B2th$Ey4X^c_8aEJ)@hyRsnfW1WCS7rzj7S($1^zL1hKly7$ z*)cZBgB0mW-U85Y0s#F=FP%^T%xnz|nP7m*@~TjV08p9)%Su)ms0`EIzx&TUV*F`i z`!qHQ0NaC&F%UiK73swaS5ZPm{E}%&WLd+-Nk}&=7|c510u~oxkO7X|pF#$-A(6oM0JiJQ@H>O! zG@K!hLDiv7r?ub_=O0F=~C{W}U-&F(c z+tJJi%b9e@PFGuHvy1-SHj05FFCfWye- zAQ6u)T6H|`lqt;Frh+0kL1{<{gw12{xYkN>Il*ASaChAR)ZPEk-h>FAX4^y7pvYAc z*q+_0^p9C#ktV$c!R56BT9^yt##rPO`! zfF8Xbb$}i~-?~40L+q#x8eG(h^AO$;2#t{Kl52i0fp;KBAcxEaS=mYBnMpe#-hIZL zBVXjHQlo&-4U<`WJT`!LYvx@BS1vz1Ex_wB2I%akhRRA$Ho1ZrhG9DX92m>Qq_%#? zMgbOWi_1;Oy68%zPmscokf<%6Y#HlXuNhr;x+Ekr5!+F&_sDAKQH~eS&G5!SWR+{J z6*E)bonn{Xd;T#I$|iRLx++6~UkjT;!$Cm38++m25eeeuWtM7zEM-0=@L|F-Sk`@dH23tWljj z1KYP@*Wv9M-nDC73YfrQfk+FvT>}W*e<58TvS6RVA)u@vK#^iO5JN}^mI9upx4_rt zm)vtM9zj91*=f4lvn2^3yP+=7EuU3ZaRoUxaO_!j3A2KiQt&Q7C-g^P@`7ao27p<9 zs0u#5r+QT{?5A%$B8jzao8Q>m_8baEB3ZdypG1#bk^Z6JWYeU-O(379NBGBZK7cB$ zvJUr957qWCrT+sZhLDYpNFL4O<_#IvT29vBQEP6uOpw;pDp2=5A}FWKtVbAdpCZWkp(&6j7>_3c;0qS%>JUpL^Yp z>U{`n0M=8(Pa_CRd;2=<%F}6W+YA%{vO$;d>e;-x?C}w90}$xFO#e%0egz`%7EywU zd_@X^=~D!3uHkD4cmx@E`3D0w8PytCGY)PjpyO{uie-g>Cp6FivnyA0-MLVHs&f}U zntX792?YvJ%>GGFQANNPri`aE=Qrd|le^!fG2nvFyY9m`*(jD1-pH%t(49m(! z(rObSqTy>1B4S?BA zq!sflp7(DE-)#Vrr}EKSA2B~`5GSQGtB#A^v)@kpJ%hWA!6yJh3P`-afP_IlW&Dbc zaspZQF^b4ABn1m#5TuwDt^&S```$=z;C%&Nae$R3z0=-3lb8VKn~)@09#K&ZAoK+K z1V(^nE-j^eEM~R_Z<%0#((8h)FZsAsH$ESQ33G}Jo8h_9h1Ik8}A%**nFmS z514Zlq?cB-vJxpFqOKAOq`C7q5dIN*%=sNB=Qx>G$5wS&P3OV?HZ~hT_qw7ejv;_N zAd^`Xj;@!KL%SY@JuhH3ZeBDhtYF%pAq1g9pi1a0;5z{}K-do;NQj9xJ8eId$=(BR zZ}&UpaVkYjj-1@<$ZyhP~r=s|j)wg*5+dh|Zj>p|gV8P?RqiaJkt zUjJ>~7K{PTtrrQBU_fLAkgon;aZ0fvT~QaBt=vt!p~O52Q%nWYjfl>YgZQ| zPA4pI!RTZ;9ebN-AKyXv`r}&LYpeXW|Ng;t0ke07P__~j9#sgiAtOJ9CM#GH>&5D* zYAee`f&voY5Y9>eTz)KfM!!D?ttrJ`_?WSbXHcfvd~HtQc6nH zzi~BY%l^{tcaeo<{mP6N+Bo_vlR{6h`or?u+V8d)+yfyXw7h~6#Jz%tPtyS1pGpUP z*y{$6KbsD=u?W?JYAg+io~DGr_Pkd8Si(pEFkGLS2@{(S-K}HtA9X-X{P+^Z3)~z} z8fe;e=ZLSx0Fob}xZr+D3a(E8nn2Zi0@lhh#lv`Jhcj!PWQOdq#zk{GOaK46ODV}b zmdO6g?-0!pf$7*G1Eg162g*_F5`d)JFzH1w4i1e?{K4n$WaGIyo1Px^aV6-&_kqZx z#IbuqGtr@4I{YX(Z4B!fNw{GM)H-Vmmnc>Y5CX_Gd>6k1267PIFKL?CZP(emw#^Cs z@BZ^aJn_e}EHvb#C-jxM8%8LG0>)cIy>-C=Ug~RELB8Y6<3*AHEg;}1N3U37hRx7{dnmCy+98+Ad_B?Uh0Cs zzn@IZ*K`hbE#6a4+X5p4NQ5XXl!V-wsQ~BWTwU{BO5JA=?b_{wp_W)g#4!EA1lCpX z!}x{0!(T@r0KR^xNm|>p=fq!psZVAdtw^b;hP8oim<-G2*Z|(Gna=`OF7S3h0q_DC z19aBqRb{0oAG1hya24F9H%6=aJqf{v!~4XLgfiDkXIgQ#z{Ba3Hk90F0ah&gxR{L<(2E!F!w4SliX(I}FD70O{(25Bh{hfnvJlwk(jb0j#H@1Mr_&1Av0~ zQl34RR)tZ$K+OlKe7Hz|X96L|&vJzP3hBJ_7RsbEF($rv%FjKdp8>fr)=-}~`eK`w2frJZe|K%qb}%(`=VJ42x^7y?;< zo_(p%mOd}xA%Ap`yLY4J%7*Q4sVM*=((Arf_z?UEKQ1y(ft7W48389p!*bnOW5Z}1 zvIZ`US&ru7;)q(~JkRup*!3~>^saH)295|xkQVE4as^EuLH~qgfnF_3xv=7@!x*ec zFaf~;gloPr2syqoR%1Z`peW}&oKaW8i%2o5F*(=QC3cC+cyD7KuK}|J?tNiNkd@SZ!PPoK>=flXD*qX zt;59GC`zudcU|Ti!5@Pw5XfQ3^$EIad)~XY-5GT=j=jmOt*1&Y0z&u5*jE9Jvrt-7 zV~SzI>uPw%odrGt11=K^fDg+8fG=*#eCrR(Nldxh*4rjHYTmVR+07LnZNe)=O4OA+ zw1KTvGab!ybbv!TxM&+}V{DiRP8OUj>s37(1`vh(6!%d_-q%r#V{U~PT4*KFaOJDv z(w!`!PE3v)VJj10{*CR_l_D(vGn}O)71ttfg?0PcXM`k@pdxt?j8%w#qjaSeh`ycpdKjz zR8&2^@)bQ5rfqpV-T{iHN&Eg`EReIYJG5ZV5s#afl<>O2LnT03mTKqxyXgj<5!Ew~ zt&UHBsDp=M_AZ2f2n%W5`QW)yKat;!3s5>JB++7GnwZi=H8n&igWwj(;#&i(Kmv0; zoJCA*n$`B~9sB&&-+~NACqIAqVj-l@BI5|%3_=&$B7wKNBTxYPdACg5kENZwovPA% zs44*Hg|>Lc|LCVy`zAwcLx6=l+yEfaSaC$7@xSSAdn43q*@cy0VC0a*MY0Z1TZNUd$xUpeEL zFYLi^M@uX5i(UfoiuO1JVAgn-VqWvgFw3g~6F!>#Py?$XSU@09U|Pn{mWML5@3?7_ ztSg(gtqX>1^zbCfR;cF;<#jSIS(Y{HrOkDn=tE8cn6*py5_{(OoP!`N7DYV-SHRc+ z;^^sGN)~zOUIdWT8)3b~te;OT&{M|M9657%6*VDE$SLRiSY7~xq^}tuxn9f&%cg@) z+c#97Y=Vt!%deDrs8&GkFn04=04DhS*Fay|&+6PtC_oM7WgdZb->dvs(Bl5xr;kel z7OidCZ){9huB*eebYnPDbp1Q!YBQ8%WEitGd$n8|0Bajux{F?Qce=>w$&tmwT{+EV z0Qwymbp%rA!>$9_t_wCP3s96u>jDo~t_n=^29{wxgPjJa&B6jvh@`f4)Whi1yyAoy zln_b;t{~lCFm3>XTvLLe8tufodnPf)yKgloGH)h+!-Ehei~!88$NS?B#1!B?k{_YC zynVb-aG?``BtUwPRV7qjhNn+Ij5;*fw0>XjMiYSLw`&(;0UxyPlpr3aN~Fs#xnC5$ zUzd!(o9r4^Y!&`bC7Zn}Yn=+KUi>rwXt<+UrK z*co)3a<MB4{`d^5I%v7y>W3(;>Y4^NKX?Yh}{ibM4sm8($W7$uaNX;p1HkjITrk z&4>Y@fbrI}-nx8bnDq$dhrFGbr>5!wfV|EB1CPg#C3(WwUof$4Y302t9w3$^EmnAd zd3LT!)^8lW(1D4rj;>fRr^myI>!H(imtK0k1OcqsgjP)D)b%vuG)>3zJUko^Z$OAs zqb*fU5rfx-6<7c=41m2$c6!x_=N`Z_DrsVdFsWg}bQ%&M+XmpPxL-8^`~*buHZe_F z&z^ThY=8s&oZyZ5t4BOlDO3Uz=$^IV9&PaM*34(&tz3Y*Kq&xT0JlJK-SSaLPnJ?q z@ZiU@ab%&4Zftgl9G&w_2iK*`;b(z>>5C?d%NMIuK^MYe?UJM`!waPL(RitA66 z0|-RJB=iIY3=eejX?iin<2g7UAC7>8joR#?HChQ)CrBOH{5#I#MV^~MA1lq%_dtqb zOd^?`bjXq|)OX-Z2zde!;8jfCI?xVslK%)iW7)D~JwXHO2`@5spS2q(w1t+|ZK1q9 zP~L-=*BM&sQbQmtRsof@RDJ|UA_-&EwKuXANwvq_k40GGx)l_nC|C8mvQ8QY5&vcc zwUKFOs*d9c)qg!aJa8Saf-yAdPTHi=%On^?2na{U*&U#RUgUQthA7C<;fEBC^cW&& zA~B3;K!Kcn@$>kF9AUi@2=6}(gw?BQ|GW`G4(E;&kZn1VWkoGOIF7f2*%e>{3>W$a zDA2hJuiPI5n6y9vW-UmSg!HO{Lh;mNf5x28#+3qWL?lUmcd!Qv+1XK8VQnNmxS#^k znTGTqzg{BsPJ!14Zr1kKJ>n^n7Wi8n+HqICN3@*ljO&6ivbi#K}v!+DvEklnE_q)GOf^HaK(wZ z$Z`Z=0kF+MU|DebF=!o`L2ZuGvC-lGn)>80v({JBS#RWiA_^iZBvOi6Ht)F z$=S^?9H7IggT|2vQ1=)a0)d9J^5X2S6pWd8cQMZlc?Nic0SXf)lX|3hfj|YlN&p~kncDMT4YBPQ zbGZZaTUPXpr(ay(D`6B>)$HU{3D~zmVRnMLJhkw2ft^hJJ-V%BMiktiCd6B!F;*`(3g9QF&|4m zw(qTcMb#^Uq5NlKTNrKJrU9Q!g6s1}i42S>=yJ=aLBOIN;Vw*)N2+*e@ z$d0elYNO&hP2~HCPubZEnSN$VgypWk*8f-G_efQRm&4@X&$qY;KlN1lH z`UvCLS0^LD1aC1I0OPZsWawO6D3s260mEEAhx7`c9ZdX`>FlvA5b^#ABCWM%Jnqo# zhAJTs59i~eUR$>O!w~Soh<232d0nsl9st3R7^`R6`bl|`V1HiD*c+glm2-FR%jX067LBuMO4u32R3N?_F1YjK7G&=NnWIXl~CqX`lfFh$#S+ z;^hq=@NxrC<6W4$D5!eX)rTxAUp#&*O78CjLX8?nj`VphF2E6zh)}WvdC3L;Fv)^$ ziPZKxaKd znE=KhF>mO-h@>Lh%!8kQkqzPcAG5adr1NcUyN!X%f{sEEna|3pR(&;la1mFo;6#Is zll7D}cNP|40TwWKSKzffSvY9vQ&z}v0KnV8qH(33J0sTeV}&w7L&!gN79XHz*r7p8 z3AV9wTfFv_=$Jr~<`S~Liu;FLfdEX$!cKVJyLTcCX`nfn?QNnpL}k6}J9oomE~5Y4VQk1xz|013r8{0xQGF;U7|U47l`>bWN9HWCrGLUBZy~(R4@H#(lUIR_y=FZKe ze+W755fdDH*?RnbQ&b3GHvo(@FzFFP0T-Zr)B-KW1>Cv2lvj1>TmY+rR6qqQ!xTUM z@X=#AvOPBc&JTFyo!|2IU>i0Np@fhCa#61;<2XqFO~!)Z{$Ng60IzcsODU{ShY1Jc z0U(EBvDs-nceC!a`X@yt=JH{0*;kMI~5nh=fp|~9T zo!;H~R8QiST14QUI1Ct%bpq$PU#93&_R{Bifjk)|d6QTNY1r4opUck-NNic@csgw{jsrT2a2D6fK0<=>PopOU5aV?mh>4-Np3hFMm^60ptbXoE>I%gx zB5WojJ@9&rPkKcl{*1GRnr9w9f2^H1lQ<}%kX-`b%cdLF@L6!O#wN{~uCr%sXXD+o zCJsyB;o9o5} zBqT?2f9i34VOb=g2SJE{lD-Vs()A%ij{pe?KzjL5php^)BzrYE93r29*#^ra+8yA4PV9n$Qi*4czcLJ zo7i}!cl(!OLrBA}5m=R1_A9NbR9Ye9*ms0xWW4u6y%^rcFyV&^xc$Ka11^&vCF@u8 z0-iGegdZ_v*9HEokR(UxTzT9AfJD#*5V(@z3N`)D2?b*=tfe3=PnNP*z_03+xB{}&MGk$?_;gwP^i5gD=SRPI5$BOAc^ zz$?730l_cY^z2>RfefLT5u?a@Jfhk__|Y(7gb9G8fD6SGFP$~sEd?<21Kw9U_XI1D zgp}PFitU%y5R)57Upio7N8@;E+h&&&)+UdOqYT9npP;d=#;R`Su;6({B zv9@XNv_0pLGDTfE>eBx9<)^m<9yu%Q($_0)hY` z5KL%xSe|1T5B$5h@JKnj+C z8vqQ&3txU0C;-KPq)aHK2HIJCy9z3*3V>ePGWB0)O-W*J0O~?8mOY}=!8RCe1PZ!M z^Uww2)zjIlU!}d?bMykx9i#_900^C*qxaE-AQ*3Sa^iU3H+Th;ls2y0_H4&m6-z4= zUKZ@JXL;4-k{S>nC@SrM&U&r=->vYPB=aWB8Dn4X8+=_P_x_p-GG$ZhZQHY_NRIZP zJ8-fSB6+?qpW?0q%zbAahd`MH?`{DmFu_bFOrR7BOaR_7UU(HM*a``zcv?U6NYR>L zE`0&Ai7j5uPv_!ohJYa1A)td4WMszQiN!yLuShR2pdJ~4gAL?EP1Aqh=gsKH|K|Mz zLeJV~IJ)oAo!mhwqTsWc$GE2x`~6^i#fhgeQ0{yezW{pFW>+RVyNkTg8 zJ^%(r6?eaiqs*(4xPwh*s<8M8H@FMV)yhHjW%XAn+J-3vA7kaf`xZKs_8`VsIp zUI^hrYqRk2dJGPYzkXL&J@dIvUSIap{0$2r04(5H0g|2zjFPw=R=ZV)MejJ85F(VE z^92FOxmyTeE?%UM+UQQ}nX{*PlMP|h0AxES@`YuEz!C;W0A@EwZh8lS@_R=+-zPoIJ zL`MW*U9=rFBs?m15a5+Oqv5^!BP3VZj|BurxkZ9GiyO00p_2zQ@4i^#xu6UI5y6V)!9~ zPe|p8eVl63rENU12=?>fC29MhDi3o(fWbQSj+xRrT*Yz~XhpOvrSQG}j{QhbBi} zOMus0Ax9t~SXR<}>e?m-Qh#p{+m@%~1=8Io4fF^Alcoj$N&CLi4l#gvMz%HYD!ATV zJS7CE2o(@anReUE;i&uYv!j@dvL)bpbI|8^C9WW^B$`hQK^T`wnRFL>oserdU{%g)BuErZ{K${$E{ml67Xdw9A=s_<)_S5L`sOVAVC4dk}pGcNr`xby)B%#>UrsLM_ z*`}(Jda%%7cm)Rf^{xP#g&aL=^glcV9?j@jt=2y5^HCFZ5(cKh3x00E`v=Jw2uKi# zYPGd(&y{!r?EfM&{8$8>^&S8io3rw^DHB@S*+L8SbD7Y-!59pMN~j2go`6+RnYPPj zlp{HbNe8G4xN_sjdc@j)Sm6kTY@o9DQMq*O)s~j7zT-NJ>)dfN(G{3AccvWLB^nmn zJx2FYwqfZ8&mAEM;ho@P3-6ucLxZ7af`eH1>NmjU@(+_YIoYbyLY>9+vka|TZBlO zk?sS-xIp(DkYYgx{Mj>Vc$%rhx~%K2qD&`mCQQ;q2yE*t_~AH$uu8yJUcY5hQXRv& zdq=Ylu#1!b6sw90yVzqx->+d_GAU4iVwmu_K9zAPv%njQL6#AFDtfQz6(-(cMk~r# zfPq~Nm>c9oGvo2tH3pEn2q1BCpUo}Sw=Ye`b> zjDURy=(&Uyt2+P|K`1imEFa-wcls{D|CnUnn1oaKF!jUdj|I66LLnri*e0LQwUZD` zrw-(14c-e6!b;QE4ksfQ3bRo6bsx>efJ*^rP1}ABMgmj-JygCYRMp1z%-1Hhpr&|i^W(qf^6KM)?a&kys#d&%lO2jL)j4)uwXOwQolKHMN&{d6WP?A90ak+KQh5{JU@+RG@y>4V5lz6AVtZpU z{y<8d;E573c8cXZ86!aha73t?7hqZ>;%Brw%5R7fCY~Hn0pnxy743;dc9I8&`S?K z-c6H!WcbytrIn>fl8$tA`@Jf&TmrJBPq(m^eIyxnsYm5h3;;Exr=G*<*h&JumG=R$Pea) z2@0~I@97~)Op9mu^cfsG1U%_%ylq?l?b|;c2GjpRL7QA!8#1yguTQ2=8q%2^d&((1 zF3Z9Q>rq(@0BbzvfC1J^qNhCv=y^T~L^MuywcY)m*2+pEg$O}5lo$hUgG2y+g!aZw zn@~Ud+{xFlW0f(-8F>YXAMOP|k{2?9{t|-=ab!E-zL%yU+nC7u{Z6OD zlx-XY3PK^og}QhWUHS@}zRM&5k}@o(Fvdm9Jv4{Np|~gJZijZ|gSyXE2B>>p0lY+K zoWV2ebZ}OdR;0DXBAfhy7VybjX9?{-!EuN>oI!$>_1J0^g}#nI7z{c675|I?vdK|Efsj{2#s{{TEdXi&&_T@y1n2?u z03ZPL2>mS6R}VzpGdl4G#b6VyZAV;FUrS5ZiGm1Q1qucif&$tE3xOb7t{DZTsiU1@ z?Zc{`OdX>MqL3A?sV^8aA70)dVXRliV4BvRtrHPrI(JD5q@GqwFRet09v;UO3Udg0^*eyq3rx^Sg)hO{6i7a1=Xn$Tg=W{_+Lo0Hubj1iUdZ*DH13I<6k@IUh`?GNDq_|k zJPlEYogcv?kB~?bAY6vZPkRXO#d{7Y1~Zz?SaR+z+s5QiCK)XIl~kz;7Z|(w$&tnw z3ee}g0a}1!43y5@g^y||ps*?k0KI}j*No@y_3Own=I^g0Ae@lG2E&?lP!qwhP8S_DwLaqTY#=2CKsY_nT*0wsr}-1UYghE| zl2(WU1UOZp$GCtV_Nvb4Sd+5XDJrptp%A)vDoc@7p^$NN0HAJj5 z%}xj1vW!hOp`J z&#oMZ4|rA-@nlNKgdOvlw%+Oe$3J*N2!sPr3^k>QUcJaSM)-8%OIIsat1Qo)G6^3H zALeJq7ew?&OF>E!V@qAN>)ugf#PJ0tNunti9)t|L__8CM%?W@DvzQjO9;{mM28p2K)v zY5Ag1!bo$Zfd(eC7MK8?3zPD$3qvM+RMVH?kqIpTU7666ssc=zGJfWB^m;iV?f`Wg z*qfUqdEdYH!tMbjun4)kP}C6rV03vZkk@Abt{9|zkbdLdJKf3RrAQG0mVq7&Hf}qx zK*1ddxUqLakdCu07wZz$tVe{`O+)4CfAU^n{juPXgz!&-Ms4a&yN8KLPF%+o&=gA^ z@h8=lhQK&>bE6rV0DY4eW58f2KSTjKi-9*7n5BA^2~`gjzC737Ig%A`?ahX!ny|TX z63zJiw%<=FoPU*T^thh3W0Jtn*sUjAE=7?~`GOBw#ygWF`ay8H1>lD6*<7vI1F2$erPj}tOV1!7K5L1NLg`dThA<84)OF8@8KTuN>$MmkO@73;~k)z z2^5SwnTzX%f?HE?0cHz*87+V@RoO+=15gEn|1)j>I(e5P8@o+k=;CHW97i+Xds^TK z=|~A;kxgAfI&-gbwuW_gWiQZ!Uato|U7pEN2k1S|?oxy9X;SEJ?;r7kx_j$yF!XX{ z8{0N@wed=qgdm171=)Xz1+sFX zQbw1UvaGdj>k&bH0)+Wy%sOfyz+`s4kHBmIFo3rJ7%yHvp_mVxrIZ@z&#t0~SJPwc z;pxoyJYGh`Y#O>RTykR%`cvCBJpv)+>Q^?QGF+YFWTvGrwmO}?i!Ss!Yo~1nK;Xi4 z)^#|#6n9)wr~FKZyFs^s3x~NtlZ08PY0jkGu~(La6yTh5fYQR0>pEKr1;HR**N9G2 zYWhi&^q`Yg%ZqFqfFGD2xGqT>l28)NmrR=R_m77*Ul{K3#(jnK<(d2TNFM@a7R+Y= z3NR_mLMfEuy~I45Km~*fwvw0@dntNsITLpA2f*MDMq#3xq?CJYmuw6oLNsmUKQ5O0i&Ycs?Zg&0EZSA~bbNu`Mo z#$!~YgDFn~XOs0q(=S}Al0tDjgHaosrnS94P9ksOy}>Q)zxw7!9VWwuBeV8(W5BfU zburYuMO|LiR6_d>AJL1T_dpeTpcg#m@iQZTuxagDF|1h(tYKkw0Brkw&PBkI(AXr_n{_8EjkF|PI^yxR zYs%0X&aq_(#C_mU&NngH5Si<(5LTGeK~5?M@IwGLpaFF&WX=)u!F(g+9cn{1jEPVb zDW7%K)}41(+LbR zWmqlMRhv2~D?z+KKpF$?&ZhwNt{fN9K?j5OcD z&?MRk@0_n9BjU|iCgHUsYf0-%75^&8tWCqni%ruHp+IXoX=!n(F#v}0Sszi%WcR?k zBn5_fS&sZ$!Q6~}r>^T0&(FPzfl3l9NIEOzsHo=w1$z$Fge(}=#;!O5?lJl}H^#u_ z1lu?gIT6;52&^BDd_=E^QpP&UKlm^!xm^%o8;Xtpwr#UwumbxR4!xJ7zt0H0LBw{`hoctC-E!h|1#We)L$GW|!}79w^NsG?@XNbCLMv4sI;eI2 zu?QS-9k>=8frJo~P;FS&WgBa>f*w48f$Qd7hN)8(M#xeSMPTq3J~QzUMDuZK0`l%G zD&I(&TM#MUn~p+_DK57oY|mGgJ)SGr*k_^SRX!S0CGXfE5Lh93~sew|!o&D#$ z*3WpgfkHkeqv`mRI%eC9r2N)%z?de9JVj*{QNqXw-O!WnhS>!u#o&VZ{&=JSP?#9k z3z$No1p>VSl2qvl27mGV2+>Wr-cY;B1;$RK_l(Cb1uw!~)WaQwS$_^= zGk4)tnNZvz1wQ@LGNEs%0nGClQ4t6|K(8pY4CB9!BriL}bQ+qPk-_}7!(cX>uyQ>` zO2YY3dM)d~hulFpKOD^RoB|->hic^R!VkH|0DT!0MNb7(V1>M7FXcRr96~lw)wo-?;MmNtf zq%>iLD}c;ly9Lj~C%YU*2VaknSkvZh@cDOhNOJT?b7W~Kr2>!zK;>r!@In&mwxQXW zF(vc;5X;G^y>aZsk*s{yh(rl+9LFOg%sMi`7*o^P0(H&fW(^b!nBg)@pB9*ioH>GC`51xQG@ZAS<^6>Zy`^ne}! z(E+;dpd6s<0Z@nNx_h3l3t|vI*RXVSNk}%S*gjC&(qZiRwxgO#)gnV)+j+~EbP^Pf zGJIs-fQM37&(9jXV{t7>3LT}c&r0KHZB~t>Br-O?ejklmZz`AMI7rV5aDAWwz`K~) zdZ7krDRkJ+2_ON$40pi*kbR@{ka%nQcqwv-`-Y-E+~lm~nJ=CmKqN=6B`tlD#kzAv z31NQGT^V$dBQE74z==+?#yD}ccA+o;xj;t0wz=a3CnxE4g~16ICzK-r2f*(*s+hT@uVWXtcVYXA~fvb4046(vfN2^F&C-9DVV1K=VYjSnm= z01K>H)(LAco;Z3&0~`S^Fb2$kn@Q$E#S+bIWqCP*Yz)}NzM3mfS6Ab#s~$R*FJw6W z&hS{LA*aFA`Dx^jNkA|ZfhCaj<5-}WB*B_eH#@kd*>o0Zeng|sb@k66*W0OYq8bop zH{C~|Ie}&_Ed?(C#>{8UEyXo1-f;(u3(Tz-15{P$6=1Q{;^%Gh5TGyo0lW#4ed?U< zh5{SK%Zi5MYcRg9fUiq)HY2kal5XxJ(}h|ams;2B)yOhHcR@!8HN~2>OX%ikuyN%A zzz~suCL|OUK9|*;XO1)Hl_Z(F*HS2@HLf;`RD=OXh8Y;aG%{G~v~P??YX~jn52#Q; z76To?5Ag?xLDs;si4LuarD-x`SEj(Po0wcY zJgAaORaIy~W`(h5bCpNng0~YxDX&~QfdXD$umG43NOAF1LK5NwJ`mI5AC@0*bwh(O zjv}2uIZaWoFj20Y6umpg*reJ0P zYHBd=!8~P4O-LXW5PDB~fw{wUzM}ym1SqJ@W{*%#pRPlLAFkcgO0sOlc0w+MmH%tB zoC|5hRj%Z9ll$e&kz{&;j;_|-T0LT}f-mXt{2+l~NQev$;g7!i*r*ewqx909cs>0_ zZ^($Mb^4QPGfQ{UzmuIb-3{#5F-azl!S|JOh@}rgMvi@KXgD&N)PSTd(3i{|>z29H zV4$+4&}X~GKoWXFswxBulquusGt?ZyH4W5mgOR=Re4VZ?9v*C4(bjc1wiN2RlAjCx zA3}bkd?>%v0LW7T1mxE0^z{?eTg5fdtV&{Y}Af=19(r91QGGYwQ2ut?M(M0i0!9W8;vdHdG)aNqp{!m;)Y2#o`tkU{=PFS-}+Q0)=+cQrvX$T_tvs#D(^mUQ^YDq3=h^92I^bgNyas7ndDIjcf zNp*1lxrCh5)4sxS1fV&d07uLOcot9$1z8H80&hR`HH8{VMYaM^1x$-Q9)Hf`C`m9I zie2muL6-HL!=V9WDOvGcPBaobilzu?P5>Ai=mwzM0X5JApa*qcF@c00fjR_2NRQ~c z>%9hn&_jm|77z%4fdt8#5Yc--l6z7>al5r;_2t&8$C9bjG<^6Y5W@i`;D8u3N+}Qt z%IUR!JtPTlE!AbS)09qIiyhCp)20J^P@nfaT=pi{Qj-%H`>Z2lGkN)0Fpn<))GZhQ zYFhWh-=Y))6Kj_VR0N1I-g^9DIPB`X0cCrDILeNR{NYM;=M@+aK`zO02sKU(~3xl zP!W_N==Ia+R|-muJF&4g%hg!_yzjD7tSvy0Vd5kSCYQSdu`U1t2fLZTWIUcVHBbNy z#!TkYx&^o9rCUrt3{0ViYIU!+GB9oHr=KIqA~C>_O^3v?q&mf~1z5H;KVPDup%Jw( z2$J#O@jo|h{3ZMASaU=`UYUs3!wYAUlY|gJDm-@H+K*m!Jd%n`<1oBq_j#3J2t?4r zKs693f@iWG(EDNh_`zUl(&(y#QyZI|Xp@FDJd`j!xyOXyzLum?JcOKG8%{=Eq#G~> z12F3XUH~w(V4yXH**AVZq*uZ6J%Ln!>C5_&Bqy==C)jX}og=AF_uH?qiIXH#Tl0>J zMR8fe%8MLG17bL`hBbGW0>ea?$cg-z!*T@Hj9{~_0D}X8Yi+|~IL~+_CkP?|l^{}A z?&C`0oeNS`%IfEK*IjH@2?3&mFAL-XgP1*p5Uzztghnl30KK2a2go8ciD|QA|I9y7 znjIQTt*0P|5WTOLJnhb@s%Q-9k!FMmW1j%$lor4fyFd4g-;^&5`&Zm0=#2fYMR2k3Ut1JZls zKo5YP|Ca#>0KEXvgM3HtoqHs=Nw{*Zpac{M zND!f?1iS{l?so>Au&Eu|e8@GY=%Q)<#48S$QyjwtI+mL>h8(#D-UZSC!=C@VI zWc1n7u>v>(;MYTnGqmweI-cD&X>5a4b=f|(2_#7-Xs+OGk@5;TD*z2N$MN*~7cV7%p77gK|`6JuKQ3RD3q(hFtE)2AN|L=4;? zCH5Im1-6OT54n%I5+$~@P-R`%^dScpa{eaF>97E-=P@|_+*()zVBZJUtPjrs9O0fl zHUR+Nm3KDEWfC`0L&*+N4;sgC+yn&Kv znQPtN*Q)KG_LEqqG?99PkV$e&Jn5a@WocYl?sJ3_U~GmknTy0!VhotMJj)9;-kMHY zfPyJ5y~^9XPoQ{szMlCp#_bHHH~E}(azl2nfahAR$9dX9$3Jnhz+yb~ z3N|d*0N4-f#Be`!8ek0zHkc1c!|r_=(jdIL^2yI;5+;l_!;aN zUhBGMwr4K$Nz?+79D##_J?k-b;cB|m^#bUqqmzS%dm3YYt-7b{Hm6sYD=?=f0HnJV z(??!Jzy=Ui^u# z-TSs%yJwA%hM)e+j3ZFEgky&@1SAd5U8qxP-P7ln=7Jg2oo3Ds%x`U6RA+YAE(s(t zCJDhUu#xyD6yfd~n6&{IdCdT`6JX*pc?$sVf&rj&0WU32(~91EDj$FZFlF%g`EB94 zrg)R&EJ;*x*Iv#}=G;3wAET?1#I08#XIcI!Ek3cZ_{QR|c{Kp9f_>d^Gp}L=$bC#Q zjj$}A|Mu;B@44-|bv{-=9h~6+0#sIsgoY}^5>dqfh}>fb;?$ zyzTL*J!*H~0z-r(Jyk{dVG$+SJKrncYp;ylc3ISWWnus3S^Sb`Vp;#lvt9wSV6T9j zA6<_0L0%-lk%Y@!h{M;3)#vGR*S@>kx~_`P$$&F%0j@(hrSKolDL{$bXES%dZUS#E z)~J@%wc2#2t?f?i{*j|ADJVQ_jjGB2xF8j3fAbI(goZvcGWOZrYh42XZUH1r0AtLg zr3G-oH9#jWJw5xdfbcTg(^-?1-*FhH=u04p9_y_x+Q?RJ%-`2c=3E(3s-l%pAU~MX zj5NO@^zy0#prZ#NKp+5g2jqKn=Gi}g4}e$K{2-alkry>aQnCHu-R}syeb4P&KQTSJ z8E2qmhwLk%sX!XCa6nH8;PrU&n-}m%5_UeeBRjK$^Jg9%)uFXzU(Q^40s`sOm(oje za_RA z7mVV>b7#&y_g*{MSstYoACi#w2Fyw~^a#C&n*opk2!t9P)X*LD0FZ&_)q@%WfG#Aj zBcyWHVbgtJVeJFE0FE5yHhO27YPXAL>~Ej`bKAFDZB`|b`0~$aLvJC=UQz)-pz6G7 zFR~yy;i%WkFBM2~6>CQOZ$F=(Dt3p)q}Z+vK=8f(ArDn|5W)y>GHHMxGj5?21CwIr zcJ^t&3$(MiEkI`hUM`?YML92H%5?lW6K!v}+@`qLM0xXyYTAz_ZI8J#zq7wRcXl$8 zl%+{>53hC7eLTx`V9i7p>_Fg-S#U|pMdRuo!gW%tqa29_C!B5@PM^j^;YXyIgx4kP@US4_MYU)A6PBP~F&hI<--_8|^!Xl(6a5m>vvlhQ({J>r{J7F;{vc~VQ zPB5M{G~-F1JDmGX=;pdij2AX6>j&$Z-M;;E_UW?S$793(ec~Vd4*@v#rqUDw4ak;r ziWorTlo!9$D=cgV#@cjx*NoaE?&NB0XvlRY-15@lKq~qYm<`Q~-6xd3mI;M=0qO!k zq5aInybBDJssITUd$QD)$B&;#@*v=%C|n`3l=slkLYC&zoOAw?@64TRR{$YfGq(8j|}SQWB+zcM3>$1{H|+MX&S95O%hho7hgCA6T+5IIaPivuDTnb z@A@p)9AILA*|&xX;MS!8ZA%T9LR)zwBndrv{puB%{tDxc(~~QXq(|KVCRVaD_x#@Z z&YWBGL(0Si3DD30O!z_agCK5`Yi@U5{74>%Ej7pbO~IcX&LvJ9MAh9{@Zr zOhDz&?n7^fzHe~r`g#)1aDK-bfo!s{xhB1F%Qa|pJoz4f71PAb)_c$%(SCANYvSnw zc0h+GZx9GYc=&@Bq(^Qx(2U*J2$LZ|!Q0YFDFCK*DVVzSDT*;(R0uzc{Y>%P@${pA z@!`5|(RhPmN&3~*FPA6TYw!L0f9B42_R3tJbp;Ki$FXTR>jdb%x*kBF7xEee=nkL< z<$wS^@{tk9Ymfq90nDZk!2J%u$^SP1v#*69Bb9DfyWaNswD(^2u4^3=0(6G?kq=V< zvgP9x0(IeK1VHaMpIqdTh1Pw2S692Y?YEixp0=Uh>ikVtc2+Ff06!190ivKsb){tf%XFO2mu3GV{xx^E*T63MFr*g*nw1?Q z5KlVxiuu(*@|X}CZ3cE5&)qa5uw1e%Blf1>lmylM%clPD#UkXaO~c?IjKB$g4ihjP zSd1~?(qf>@(&7=kr7pDh5PT2BvH(n1;insm*!u$1tYbNP^>zbB$!|&K{@!zb@0~e! zGN!+&O4M6U&XV)O0ywh3vMjbaWdmTixM0Bm%X;3YxhKHUOvH6yy%s$X0CUH)^kH&_ zSr}&5`yhZ9EIar4``>+^yZ65B+wHhExk&XFXPEz-tV-4*4OvUz|9A-u$*-1QSn5jaoozcqCYy$;u0*Q17Lzarv#*D}_x4GO zD6EWd1ZZBI3!l>MbHJs5fmxSHJ(l9)rE>WMpm*(9kY07!9Z!E@bHUX#H#m{<>RmtU z^K(_vl;%2<3j-wMB`nO-gO@2Uyztp!01OKTjNf6w_>nzZ>%(9{-90TyxJ|r0B*xps zggB%BWt@g(tha7=&+eac%3V-LXd&#mg3} ze6AoTX#snidaw`#7=gZhkI2Si5= z1bXypF(HVo(b>P$?GVe$Ztt(9w zB@gclZ;lsu$pMT3yU04C!NAd{d2eeLFw1%_Yhdk}?df;=`JUt*G?9=v>HH#^NmZv^ zd*6FYPP+@;Y|(*P(+|d;nXT#aJ7l9nDE=5w>v@IzE=FQVY0{nAJ8f!*Y0}Twuo4T3 z?SFc&enkllSNAImW!Q9{Agal}_nthE28`Uh}HRwGq z>-qo6yl$#ZTJL=A9(lmBbPj0>5zQ@34y4(sFQqYy-OW|Yi_N^)+gXYkxZo#24KND@ zOkHXW-qKM*)zd?{2dW-p+mHYFoFU^5ty={0;aNXxty-H-M<&lWIzhR+##jRK|EKG) zbWV#&(2%PpD`-Mw9GWvk=3*aqFL!fD(q7ksySZ5}e>7w-of)uKAFo+#A5n+Ji{5Vs zWpvrusmn8Mt#@J_Lu@kI6z4Qy|6^fr3*?;oa>M=s0NJv=i0%|2NQAOa?BD z<`RrvV2BQL1|XtdduzA%`llsHx>;55GBR`3;~8U~A_iLnU8v{KUxIVZeCbzI%L-S*yTn$>i(0WB>d%NqGT_oSr{cU%Tr zaNq|NRI-HR&JzvDWqJ%G@2^;;JA{e(z;owj3V57zKf`ff4BOt|^^c$}7|7 zemsW4Q+F1ag<_1M%7$4ESf)&w7mhx`z0}?1Avt;k*(w#%8z+z)&VY!SzDHorTBL zODRkMS{Dkb2owbpDq`@qex?X##4Y+7Bd_Rro{#lY>#PPy^2&_!;?W4w+G>O5KjQ-O z)9U@Ge25-BfZkKRPvxa_P7e)eLUL)0fe4PNXN?Z%G_YJ>yVh;p+kKY9IzYB!jD<(O z8J({SJeJ|rT0jqw3-i+9yG-(&)v|;{-lelBRleV|9)B-}o z$SZ<04V_RVxU>Z*cwu%}%8Q^A2^g4tJUu`~66gVX7rx`CpCOUAffP+M@vHSb>tlT` zR>1{xgOf02$hlLCgIb3$B%w1Tb?6a#1W0*h zfrJ?NAT>4;lQT_BBqjT$-M#mJltaS$E!7HGfNc*mo_Q@425P2VeB)@ZfnF)_%ONkK zvb0I{9I&>2BFmL%6J2j$PT~aBgzZW1Q02$MKxQ{I4g4N~QrrTQy06_9N@&=C?$OmpFE01<|tpQVsKd^)au>h81qr!66&un}up5}y4Y zk3Jh8qZW9+=NRsnv9`VLmu99ScA)7$|r#q_XJBSiI!n`FiGunm}q7bq$u6r1$+f<5^<(KkPECOUY``o4%b~MQ19ukzGXgdM9AN>VL1HAi zYE07`g;9|Hq7I3!=o^2UPefJ#MGv@}N2JVNz3NOCwvf?@R|Z7mUKu}|50ZdQVh69< zrm@b_@%QXPL28>Yi9-x#d%&{FKglHmXG7of$Yl27{QyAuRK;MRl2VVn-b*Ro8lZx% zoeDy^Wy()HE-)NJl)PH+yMETH>QfMN;bhc7k=|*V@%T@}lP6ahFaQg{h|_ocj}w4b ziq4e~f@#LM!@yV^&Zt1V?^@l*_D{EIO9}TFG1y~y#^W`%pjzfBkhVAh>2?$t3UeoS>6m@4mL=P*o{3qK6tW=A{a$^^}hXo>u*(`29wO|HLpy}9JkVLPewIx z{lN9$!3l>5#sD@KBIXcrvNo{XOOjq45Lj?x)?V60GYEJYFJd5S5O)Nc<;YHRCOBH; zdSLDA-usfnwP3-*7+W4j4-qpy@Z9h6QN1X**QfvGm|*N~?!+_w!O>+CU8=RANMpEC zlO%*W2X^4egX%4uU7?$6ozP+o;9FoM%$i9%3xF*2@yi77_$&Ze$16cI_`^T?LB_4V zTzk*@(XWrSKK{Q7IKj+3GmeuaB&TgnlLUd69Pqv~y!?_78ClFa4I{3vfujuoM~(*L z1dJ;u=6^*NDA5>=0dSBg@ z2OqY)c&htdOnEzu&h^JrJLf5B#*?l1IJpb7Wap52un6p8_xoNt&O!^|&RygJxKO-1 zK9d&j0^nVcod8r7Nf8#Qdco5>V}B$qi;R6J`VxpNJ$Zk9eyr8&T{C&U^Gq_Apm$ai zoAAni<5I4G1z-V$7xbPcABF(X`!MwQq=0A=4Uw>oXhYSeK|hZ0`NLYPUEN#%kR%kc zVGE;m+4AS`*j`9G?qyzf?)P>FK(D9Y7)%J8bj+!BHGZYZj?-}_r$ErRWMT-CYt^S- zLTF~Cx!HFI1_K5P6E9FY0lav3X~BiMEeMN&^Z*rAMS2CMW$qu3Kj-m`|0)}rDfV*S z^Zr^NYgKo1!7DT4^UV{Zc)D84N(}fx{w45u9Tp}XACPFk27txCi^wY8(HUtF=7*)G zI8Aycsid{8Ywgb7?XD#JaXe$`hBf|>{!(08FwYC)c?UpP?;U!-GKhv~v6;MVQmswW z#B@wefJ4COct40akW)T|<#s21*MAHUt6%%#`u7f*i*XXgY;KwxoB^pVbuz6Tj!>jE*sZo{iOF z0p2%HuH${l@gHJ2S%H4Ph)bPbH&ZyGt0PR(OT2~RreXvOUkeuz3LxD0Ks1G!j-fvU3NO1 zl?|&jwQvrIPW&@EXtwDqB$iqYyBnI*nK?xjBt$IH}qhNbbdYSr`KxwK$1N7;<;=?+h(iAPk8)F9=Jq%RnKCDSx?`C z9)ZUT^Z;}+JyI^v3()KJAiV;$nqV+HhNem#u_(YxNApNrPo27TpKl?L3}eaie!pJw z+!I@GzfbL5Ndv|Q0#3Zp&jtj^-^ju-49ZTL(zm9wu&mmi21!mXTXS90+bzUDSO@}) zboZ>2=B8ob$h_>?3}G%vya47&>xF{xE+!QKA*2E@wAl0Qch0~j+|Xlfu0FhLt<|dm zG?V9f<{2kZk)EzL2@Bzc_l0oe`K{6Gz=&=qKIrv&0Q5-GU7c6dLoiOy?lBS2(RgbD zsQNKbw<0`Mk}e9m|AwErfAQHilJO_@`~=Lq=brZ}9NbwiQ9hst`ptMHLDHD`-C{=? z+9Zu>nwAGblDy)?Xi#$S)c#aqOinlscHjF5g8)zf7cd1{py0L?CY_6+Fwfwz6o8(! z5)yncZSk@n$%bOr4am{s^Zu_(-JAoyC5f># zFaIR|;4Up@K$`V^MvP1JdtKx(7^216M4Ltj{9q^65x^Ygk`MDP*s1+Z)BM6HI3TYT#*F07@Cw{W!4jNreT5{|tS;Uf3VVreN2%exCKNwN`ca#w5yuoXyI6d?>N%m#o4dTw!F{K^H4TLZ1j+=aFt!3zMTX4O6Ey@wuBZENk> zTDGy-bc!O|UR&>a*86v@S_^=fdCiPpnK%sDwskd*`Saf#e2xw%jG8{fo}lw*shP5i zHWPZmPL9ggU2)TA=n+J2HUb8y}v%zs&%?y=N~W* z53`jSbkTrExUTDXf%jKYcK{#j&w=**A<+P=$E<}lfbjuiykHhR^-;~-d{6&L=X7eHtAuVZV8F8Eu}AX&^~{EJbYPGL z`^v5W0|LNDO9qcHtp66NXrxq(MNnU=vUVdMYguJaL z34xa%#{nJ#2&g~=KmkE7L}2~$>iv~c&_KpCgsRqR?Y49XDX&jfM=RN49jRkV^Q;guAxnnV3KiOncR&5PkT!Nj$=2>3ddvj2uyhC+{L?qN5J)Np-i9{ zF96246AYCP5XxN*W$8W(PpE;Z0eVOoD3ady z*T-7jiw^C?neSKTaWVr!v~(o4&sAfDh);OuXJINGP{JaC#5#E zpAaP^WE=0qi6zVLv#O#hNCWWuPxzFkv$%jUW-?n!0ch#dn!<1?hI&I%j|hu zh?b}CFZX3&^I0Ejv3hyie!ph&^-s8%!a~HcId`4~`gCf^3Mha!1hn;l!ihPlsRcOQ ztZ_ucku?V~1|US>8E1Kv&O=dl{MURZ3a!>@zV~}(nwh7gotRMYW%6tXnWkV~5td6{ zgW=Do-wn)P5Y%W)j3$Of8k5F;q{=Hhx;mytQRMftK9!=CIktOF7X%)B3rfHyQ zICe8JE;XhU0{}JN#X#{g!6#AUUEZ*zhX7PP_;Ny_eEAoP-fi1iYv5w7z1HgfEJzQ| z%(wH*E2@7ae!lrws#*EL*~|bN+`w!=1R)4c#1R3Sr)ig%OZN74Enqt z^GS}CW$x5!q1KJXZfWZ;?333x!_<&r?Jpt2>)+MhbJ>#S2a3h+b=E(b7Xk^Gpw}rh z`P4Bs*6z60`ASZlix85?R^*S83k9qrjAJt^KWJ#@E_H#r7-nbZQd0>~KF9@3~0 zdSrMNfa%BI*k`}}%Iu~Sh~erIqA_7ut=65Le!`f6bWBV{URla#Re4LgX?R&+>?3{V zl>uh^WD3S@Da`HMx)k`*Ers|BNCG7In6~A48yZvZ`)TjTb_9$4S!=E80#N7XNyaEr z^^~QbpyZ^x8F(#+(?SjjvW)X`z^hHtOQKzRouiFy*Eyj(G@QWeP)7#f2&`cB+(Sg6 zqhQqZ`!;3G=GQcidL7qA6nzQtfxC2=f$XCZ0C|q|RZ{cw2o2aFFH<3-a7-BeXj}u1 zk{m&RJNRRs2cxirW->P2FgenN2@DrZaosXu2-JPP0SvQX0Llbhs&c9d9}BEP@vy@n z(YAToeqXELwfL-mDL9##XJ(uWw|VkSi`lNRIwjh9;%GnadoIB&3n1_- zz3ax?8a5ht|C;ZzdfJazVg2f@ z4G%N^>he1N@a#hcebZjC^-wkS?7bcX=tUN=SNSX9{WA3$5@d;vE;MwE+j?$KMbXX_ z@W#j}vX&(Os4pDqr>!19wqKRn$nm%6OAS~MfhCxe2qO$?<&r?Pz z2=75(W!tr>q|N#>&ti%cYi;Xm=QPnUV4f0CU@QGxUUGo##FIK27UY-82n4)U)G<)d zUXdm?-m@OxB!-m1_y{?=#JXz&Bg}e)9#+5w^Q22DADOvz0dS3}JIe%QUq1^~1rRKt zs{RdMf8LbT=lM3Z2=L*v*5~T(8+_(29g`5sKV|;=y^zC@$pKCy1WG$Xis%q5pPlw^ zc$O&8e@N9l=AR)~+5B0|ay+Y5H?_=6^E9Os(~-k5P4+7da@iFp?fslqE z!PhZ_MJP!!s;0BHoFrsyPFlpatz3L6T|np)XkcVK7cg(PbS?!97{il+(lVhK_c<8T z$?PtGWyOab7@q0O6dG&WKHsz{;rfxastQ69=X)kI*Y#3WC6yuu;65Cn5BFb6C~NMC zcAH*H01=P~NA5W7w5P_v1q&Ray#o3y0O)8Do9?5kU~Qq5LNkYqg4$7dc{ModfkUv5 z`+wrgn2rxPnnhlfu&n3%oymB|+l1sYn2-=mqOpTl@2w-BjDWFBY~Co+<5iWSko08I zw{9T+*#2M&l5#Zm11av_C}93UU> zWv~M993)SFf})O-3iM{|bBg_jPec7As!(T9w|Y%pPFcq6Q|^;JwFT)kr+nf(`yL1` zy}s`I%>c*=A|c`a7?R7NrqSh@ju3g&O{hQ!?_W$FKevEzcGvFa#gQ^gOM$u+Gx-?6 zHKml+7-$QIVn#`NDgqXy!Z1whzYf{6{*gZQRwa9}KWnY-MH9m0PVPJBUC)JIp_zp~ zvmi#Gm>7x@7zm<|L}QmE;z&p@njxg8(~)%CbLDX>CMwGqqj@{Za@N1Pme0Ckxr3?xZ{I`FU{5F(h%mgr$0;0bcH& zW{rUfw8a2^I@}*LPr6`CXAN_KiYf_&a=C{>TgLvZVv^x+zqQfJ?7i0Rk6P7TTf)4q z_A6JwW&7tH90A5Y0M`#@vrNhtkabpH7eTO(DE!DQKG8rC(~!cQI)43qRCMQ2x`BxbK;$m{)6zo)Ru4jF(|I{`hTIE71OUn!uYeMp|_0VJt=sYx+%Ez_N@P>M#7x2HPC z*3R9t^696qCj5Gv+>Yp#jKvG6GYLCqx z4cU;BB$k%nFA1JYFfC&={<&~Kf3Uit5Q$EnUfWd7D0e~KS5x%qx^Dol7 zKj$?P7JGlzTB|OFOfuhjW|9e-LzUlHF%;P2I14Zw4)Bi>)*dQ`La>Og`?>}UT#KJL z@gt&Z=V_FVM)#4|d)|UF>!wIE_fJWC?ZevWOB>d!P@Yj{76C8AM+(#ew%)VY&%y=> zU;t6VTS%@T8nw257nCbH8@vb698dgc0lSXPIChV`NTIaFv~F8qLV*dz%agr42nv+S zd+Am03H11K44(3g|9TO~)YhkMtpQkk)>^9;eL4px^Lo8Z1UF9D{hSyRD&?n04Ih~JnU31mCwepDqjs$aKG*2sH*@iFn5j*LJKFYz^ z>!XeFJb$IX84^eb$%XIiz-XiG&g!}ABr$W-0b_poF4eAVprN~=;W*N_F_ePgBg!j- z3%JbU((K;&5FL)@r{2O!OztSFsLs7@M(*_pbVK3w)L^{OSr_nbq0rLVQUi0DnAe1!3cNmq zLf0(g5}IU0zXL@!d(f*I@FW?(yzH0+_LX8DLiKB#91a6#wj{>v2al<6Hi}CKJrk_n z%kWY3USQ$Cp^ z00Olv_O!nmFR%eHBSIhF5P}2~n~Zn2r)=Ws1+GbyOUjSAgb{*6QCG?*FzBjB&ooP1*R>Y zna;(4a<`c`Ne;kgt+iHFHK*m)FI?ZiHlMPpI!^}#I62S<=5V?vQai@iJQNn9h+0qp ziw_3C0E=%d=qLy#Cx|FE57g>esdcytV4Bez*q<$qjfieo!ul>-k5PTumyz{?ytc4j z&9C(1hh5Rm_R?V zxKP)4G1T=IEJD}^^c2kSpBev^>sR8F&NErp+Ml0Zb=hsst?_Y!?rp59SV@AU4=m%r z+2LTdk2oivgPyTKg;yeeV8BzqIRHe_tf6U2SGHE&!*+M=Nb63kGENAD*_(xi6+yf* z=l>0JKI4k`B$4%T)BUW!8;})V$wkN^qS|uqv|Z<&B>sK(0_<&@kF8g-Dk;JS0J_In z$0OZ$hPo~VFs4j+RRg79VAcQz1BS3Vf=};Nl|p;xXP`9Z{&{bbeYx46wbtrOK=O*; zxx^5Vs#GO~5xF_Q3=CXh3>U+cbCd@P4OIF{ixFH0)&Q5&90885C$85$L^U)((7*L( zuicZCLn|~@jc5!;Q1k$iAj@d)O?&g2VuRQ9F~EnRN5AjC8$j+}An?lj8i+I2)phr7 z5@PT!8Xy}ZTT?22e8?g&?5=dv0B{1}1xZjLJl55S)lN*VOJ z>k&EwuZA8F(DizNu24z`P{{X>YqOrT{_yx&F>)bMZ#ABM79rSfga5k|_$7yI*BpKDcj@upn)=+*#LeiJVS_9dLz z$dP@bLi%2?6@F5#TILGp{c^$vHM3RBHgDCg@-E!GJ{Y z3Iu%UY13-_HXY0nz%TdD6B>|Qb0QZ)Xkzu;8Ds<@du(fRBI~QDAe>!f909n(Eyd5G zeR-dm3m5}X@V3Ak!QfQ_1hQZcY^%rfkS+8l-aPegg1}zu^HXbe7kz=RJTt08u3P>V z?`HNjF%O}sI>VKYHWkD78Uc^=o9_4(K@{4-Y4S0-V%O=r)?q$HAVAPuctL@RBoqjA z%b{KR?j_kY)t~o?F4)x|XJSJ(w2M9lV%w2Cqf)E{25*0b zlfE;6nP6Hd7#Cw+&@zj8S<8plHCJE(z9L2Cx@9~o;IG_$^Yw1WJbbSGS!=CgQUA~z zC#2j}&*f4`0Qvv}GglO~%xUuJIMS@5rK8kh{G&t>07RDcQZK(TKhLIrR6q_HHPxm$yW9Rxktxtn28>NU zzx5?nI>%YZzHg7bNb%B74Q&e(pcMLcUS=s13``z>+O+pxrK)@Z>}LnK1k0PW={LP? zxMZ!xXRXzj-2lNrKEH@@#>r^JwD_rtR+h)BzF8(PYWxiV z;FUMP`wDs0QQfvZ?`?+@jvJcJ{^izhAn6J8YiZ~nX=b5-DekA>hcLL{g%+1WDY(pz z0>Rqo02Jc?OzTe{7&WD7I!=n0>so95*Tou&Wtmi>N`iqdliXORI>t+RoB}|jgav5XDAKDIVw^>VE?$h8F z{)M~iiv3oK$ z-7xm7ALvdf@3;m-=^Xjk!0d;XSJh6TS3Ol#DE4$bGa@)}VAU%dK5MVltJk$K$xQNn z9KzN^rJh7ps)2jGi|I3%rQ_4nnJ3FZMGpz|54IK-=%JD6m5+MUwcQqLORZTGy0I!`j6ov6-uv_M z$4SDtXL+CYy-WAPp8d)vEJA?uXlUuaZh>r~&U`?HCkdzU+tb#=8wytHYU%1r+m09K zje{?y^}KQ^iq=9@13^c@dR_u>0Dio!age4jLse*iHS0^_gFMf#^MCeBlI_Gy9uFh% z25PK<5ZlojH>D4P{aX9T&ErcjxET7A*4q!ny9H{V*isB1)~i%KJytJE{>Qc`>YUzp z#SGR*lH$Z|w)*{tM@v&x|B1wWviR$Wxs`ewAz+z+4yDv8Q+CqwMm- zy?)NVmdyH=zZ88VB@r=R;NP&Z&F>ja&H5jRu6R-!g^cuZcGq$2act%;P#18$#htA& zeJwyS)XXv$yaix5Pys*)unSN7?eraD?E8P(_I*PMD1E9;jY6IthF;$j1T4Fmz_ z(5V7A{?$uHtxuXX&_|#d$JvbZ6RF{qG0?Y$2>{dpvy}39Q!fHYQUxnMg)-&wGq1v! zxyew>VXw&-WkPo7_x8KHyZ=S^2G%E^M3E8@8!!eJp^eJ@$mjU5~?i3q~%_yw!&l=2FZA3V0Ww z)H|;tBozP#mtkHCIf+)=`$;XyzF2GRD^Cbb{q^4WZuio=E?6ro;Ux({U>izh+XcXs z@*K0s;E#7US^15=%$C`7^;7ADR10l)ZD~tAvmC|*Ou%hGN{XO>C=YAZjKUYfSOA@qSCk746+HSQPdu7PIkan|ujQ)7U+ zb!!Y0e;7&)l=6WF1Gs<+s{^XuD~MtK2eUBQk~1RX-zJ&tz2sk4p_cA`@4olMG_JLx zC9UjxRcwQ|xyGDkrR5(S>r5z|7$}=8vI^2G+XW0;3=Uc8yKF5Q3}~8;C$Fum?M`VX z@wk;qBZ7dZm;V<$s{()q06NVYGmyFldg6c@aUH<61jq{g;pR(b%!ibZB}w@e*>U<+ zRMC3`*>tM=+=9NupS&b6_Ss$OrW;@`6fjWer#e!~q!iciT-UqMx4QsXV1+7RfiGYW zvzj?Zoxg8_u-Kpd(bthfpn6a8o2HlQA+MDcEhMoj0L*r2!80k%q60fSL~qfrBuwXu zInPyY*;$pon%P?Q8K*fc8^S0%i&{JU*42?sG(m;gQo?LOdg`Ez(u<(?X#SF3c&sJt zfRKd%&;WcD|Hk=!RQmb|bEbO}b45dg%V?vEveW|B2>^8SVgofm0cd|vTmyCa4>C-E zxeXOPfeLfzJ*GSS_?RSf`Xm8i@6Uhz(o2rQ1e*8u-ObJhv~qcnKj0oRPx0!P$QH={(7|`|($-tQBzXrSn0HnF|z_o{CZn7n+`v)Hph zUo#g&G1Ryi(+9Lna4|sPp{5=zz+$r$nKIpW1}9-`e7xJ?*?iWPWJSab^lrcTtLcUX z_k%}4=gt&Ndt4XwDRXUO6`RO>^pIedAMd6y@o%{jnZ%6hE{ByC4i_Hc+^1>@W4_ zk`Q1v(98<6;b!Tlh8B2G0iI?81~0Re35GX%SDRKvzJgvTws*)5Cy~a!ws(sH?6p7o zm6yH;1AEln)eAt@QWi_+g|dn1Ibd9DTR1}XB+s6wcxO1GK=_S0glA*)tM+b?0^Qo} zhE|70h9kr@2%yW((x3wbbf=GO9Dqnnp{Bd?5x@zuAhOCn_|WjReU-2GlJv1(l2J%t z!}hd?GDfuvn3!3zaS3lvuDqIY?7P5Si|3{VA> z3zsXqve=p}vt?^=r#>D-W~HX8EEdbMiZFVFXfUMDm^y0;&{IzXi*(nMqo>K!1QLyM z8i0-@l0~XYXhLt1okFjAtY6k=KM}QdO#1@^NvCk9diOWo@1cRJ%_q4! zA&Hn6eC?q%XEGnf!yHrMuZQWAu_E((tQR2!a0eiL?Ux78whxJKx)V^wiUp7~fK_h6l{3i# z_ys|v&)2VyC4Km1iNt1RfbNHmcl9aykPY_V;v$72>2Bz5`n*0zehAm_$^f+9TLhR3 z!1HOL80e{>R~9{MvGw%v=Pb#&bdKSwgT+UZzLrr3=+i9S051O(X@%DnEC38Pd;TzV zWYb!kd(N4CG)UiEFH0(`%3U@zs{+!TD=&)JdiuSSd{`V)(+Z0}h7E&BP_E+YfC|Y+ zmy~Zhwx@LBg#bFrlK_IJt7z@>o_y7}vUYIR-Pjrf^|A>uYKhHY1$f-E|y$ z9OpRlS-9R}CIth9V*19K33C^30bC#ceG0|H^ZikT$=lWr;Nr7Bza%MV0Je9RUKW7K zN*1pqD3FI6)0QdZYuJ7FWQ3_k45mph0bmONz59^odDP2LtF&Au0i%+Vj&^4#!x>_b zaMn<=1&|9Liyk}*`b_I*BYNm*2k8&mW>*NTaLw=Y`C5{UOy-F0_2l~PfIJwbuUXtFPlE zZf5Vv!T?6EXt6E_hyfUk+ZvW{v1;88+k1!%n@LilMM+@WY~1!4g#AeKTvXS<#3YzO z0jfZ^!p<)hua+#iMxLZjN-d}3#0zxVX+T}ba|8dPR~iCg8`dGReSjZQDWhOa!?GQp zc*E$Z1H}CLh-Fa<@I@n zkMsJLG2Q{*bV9N>6xHn}9edl$%gX0fhaAs3a;4dfN4hlz=yQzA#PAWHQ~HGl^FdU3 z-RxIku-)O*VZOEu-Nk0&`#I{^ zJSCbC0;GEj-QD!|@HJhKA)PHsUbTTca9_jL)UntwE)qpBAbd`H@++oevtVO9AKG-( z5kM*E1O>ST3JF~T*xP=PuNB$Gq}omICLx{OP~B-DgvhdF=@&H+VC=JwbkhwC7YZ1_ z)KET{&Mn{?a3`~TI^ca&P-Srf_%3<;^m8ER{K}iLh#+e%J|E>{$#xhw-Agz4uSpT2 zl_Yn_e$?2wuKoPOf7s0`JCbHFhXl@JWl@z?P}scMGBS^!&ZJ*QE@EOJpvn$a5n_Vj zPtu?eR@ee$6+N*Y1TlW3%mU~jg+kyDJpsZ7YF3%10fDAY{B0uXYx|hm^stU5r-_Z0+0p8e@vKHMJO^* zeUju8LmI_~I$GmlNej9qmlR~9@dJgE1&)B803d>Hf&%;j1jGOVB;Am1)^l-QQWS@f zS~uMr2lq))r`Zi0;Un3vtW=6Z$T*%10x(E3cZ7GD0{wIo3N>KfDL~6dUKmxo-8q4n z;^D18&?Nr`HlMXVlD;`G!_KlauoDjSL5rZZ;hfuC%Cy!e`a{3HY&LFLZ+t``WXVq^ zTX;u9p@ie`PzW61Z4vE&cjRkrS1R>fUMS!C)v1Z)T&C;db$$H6WdcIP0#E{fVyf{?tT=Sz9L2AB=> z5nvX9&v#!~UYWN8W5D30rA#npLaTrftHSC%&=-FC^aCJhs7<}=Z34h&Eqx?KG9skA z+4T9RiS)XOI0E2to56#WudnMqk7Y%|ict(g*++XsS=k@Uf;HnNidA@WYM;k6W>p_uunUJ1`Nsc#+KMi1F+j6Am z&n?2rur}S}v7sB7^gT7;Hr~0>k8)AZo3G(B~hCHKZT9m?(D~V@9G{&m| zWPqcgG;l~l_bSS5H-Cq)pg&sY<1lG&DVS(-Y_sCe%#4)Oaa<+X9BtN%2U*DF>K(4qA@(zF3GsNnGVk(+C*FsrxF>dXEC~iZ4hUqEU0KS1Y*X!;tMqXT4;-$FtOPBk0H<3j9lYK0zdKA=?kdL)gZc zO)vX{DRwoxI49U>AU!E8ogk17Ltpo;-v;LnyAdFJl3qxTWsfr-&+4Rkf^b zr=J64h|&Iu$$@pP>+||0J(e-hf83qeNYWn`0t$Dw2WQeTYrCt~y1sxh2^ui`$NZ?h z8byUD!I2~LIGYd+-@cI{RD@94{V7?b8?3wG*R7vVdv`zl(6I@1`fP+E zyWl7asAMzaT%i;taZ#>nk0btDt|Y{hIY%y;ngITy9VvYiABHTKOA+di+NR}ZDdjd47?>&VElks}kR zi*Y?-W+wm?CZ+{L!F2K>KzKDjhC-S6d4kDalE; zuw=_uV*%PTOZqW{P*I~o5r!b(9v~}M_WL}nM{zM;H@zJbeEq8dE?M@gr>xuv0Nnu1 z9eXYX<746iFfmZ*n-_l^T0;RZCfi;hRCwFiPuD)c9h2DJZ8Gb%t}XqNK8_-U7j}-H z1e1vSK#CEYZHn7sJ0Hll-AAnIHLBA`5z0M_a%E9u1Gu&ZukA`n2|tun?jy;O{69<* z69^Zei9sX*ue99R2iqNhodBHT$Qlgbd5IJdib_!t5>iJ)NU*O0xrRsN<0B7ot(!M% z5(vASZr9)>;?=UA@?*6U7`uBsiz76Ew}9ycV`{*_Gq^y(OEHF@DwN&c13(32VP5tl zlsh(ee`^(C91sr1%Su1+VFBix-8=8^k#RiNQC=(vYgdZ~01t@r_@e>SgD9A2D3dQbp z{5gMPplR~WUuLk@(*HeUU9IVK;PhH|BgEQ33_aztGGb)0bJuF!<0|Qi2XhGW^GO$> zL?}O#_z2GAKFG;Q!u@$MWE0Ty4ut**7QZ9~B!D8JAw_EX2P7dP!4fGCX}TZeV;R{% zsHS^|oZ~uFF~k^0k>6)krSL+Jvksf__$sJrF#x!8q0}RNfoYk5J1G>GmLIBqaL5bS z9#20%k>vVMeGw>>f3Y4hNG(7^)qX*FK@>CD)K(Cs7Qi!=4 zG=HcDOkg+`Ap|Z<;u<;g|yy)#(9=M?8+D5fK}!8)%WwjVmG${Qx%tXU7U$pljvZKQ z7pP&VshX50dF{4+qM8-Se@_)E8nqa30<3pA{YA*dXd)R>LTpx8cQymeORq@%2MPuL z!8ZBm2}!^t4PX>CUPw(~AY3mWV(Pc!hj^GyH+$?nP0gCP-zZvOrwJfABODl* z{~tJqQur`XEU^BGKnyT?nxOH%=JVfELog;7Bv9s*%aDF1jzfkCz3lJTgv}K|$NQ=+ zJyrQ3FVfx64UEu2!Mqd-fH4@;y5?ievzK});Hza90T!gd;Ep%OgX#~hDqgVowAk7Z z(9+6ZpRCu?e?(e|_7%Ksz@{nghMMWc+q`bG-5u-gv(LUz5Ed7~hC47%nEo@1F>FjQ zTVN0Z4#3&F<1mOqt-ex1$Axt6QB$yH?LrV>?G?C*$%SDj258JmHEDv%Y%d|rHP6NK za*Ax~f&@5Frx+98yi#sRXn?UNXQgQXV<;e@n3ughPGfCE(poE8Qj}!>XE+ep4D4-&nJPFYD_gCqYh^s%N7!dV z5WhkIa~K@N3YsM3Y80*!`s_F`%M1vFPS5n^dti|s(Cd8;0Wf&pNs|zaoXcz@3Ji}1 z6VjIvAS>&s*s@J9JuKTtWOSLa|35rvAk3@m9(%k$lbQlGtrx?j;N1e?1*qYpLg}Z8 z4}jH0-zw9mAGod&88P{}XD{G==*fn#vhIq%q7_Lp2??f=^%@j)?HNci`qNUMZ~h>u zs8Id_3Atcj0Syf$p90176fZV&fHR&50ipxQE5M|VU_5gRu=u188Dg08@)wtSI}j2u zO94s%9yCs{sZH+#v;Ij@><%WeGO_f6(Bo^R;W)WgGx1XJQfdGS7z&eq$fq{uEecfZ zjqj@92rK|I6jfEXC}Qngn^OTWX<-CL`szUQ1Db7*)gu4;0$&(HN@NalINROP3{J|8H9%MIeavEYaSXXk^=Ly z^43s3qQcrGJxT8yPd^8cAG~Y7Rz(*X?++ko>9tmtR%PWPn1Ajjo1(^BZY^MkR!_v9(WDB60v{u>9zc-26o)0^mbm?pdzG% zYys*KWGS*eCak;Jjb}~M4b(w=HFtFUAM!Y=xthV_6Lb)61FIL1#)+FWSuSKO8sG6Zlp4g7D zt`+OsOtwg(6jEN=M?BYnpqOCH#!Z@N5fcoO4h`_S3-ozU-&yiGbmYeo3cX?s(SU}U zg3S`@O~RlI1QF!J;P1x|5z-9HkD&Mg`UH|#mOobf6fqz-$5|X30Okmo8o<;5r3JwK z^ta$XCE$I^*Y_1rSx_+3{{y9ToKXj0FHdO!KvA@$*V0PzA<30vSd+rJV`doY9wr^B zCn5NBgn!)+2+ha<{i9<5$mnIPr}i=fu%5Ee z^XwhszXuG?Hl>W&h;PC)5`n7gcqD#FGB0C754*E5zcGdC0QeF=e#(zN2pdMmW~BMa zf&nPt-7*1x^wb3?KRU@9ss;5zmG4<*PyY%3#J*FLA{Q*$`{a-vR<4*8Nl`Fpi>{|r#y}+olSUo1Q`{-+&^RGtLdYRaKWDy?Unm%}ZhHGmJ)jNPOg@$sRS9%6o53E> zEkkPB&%>R&6ueLXYFcKgJ1H$LvxbkVU_q|{VzxYc!l?EB*CKFv_L|xl3?XPmdSxZL zJ`o89LI9{8XPBLt&51O#W3g87af8&-m5xOGf;UI63xe~>$}bno6vnWHO`56M%t9kx zCv?LCD7#Q=j9q~4-|)lF@V-B_Bmve!1&Sq8c{Xb)<9*?>bLYsu1Yh=TlJcSASLS!m&@+#0|DeULGoBfK&g*HEAkdIA;M z7xcc=ZRCXUQt$g|s!5jXy6mYb6wo8CM7j8J4XXiM0GNfMimDlM^7z*5=bJo}!yk%7 z;h7&mLazpL%{^D9lwyrLUlf&?BxD7#Ne{mPx`=-iQD_X@LaHc*#imkW=bz)tfJyUt z)f0T|9Jn?IC;5wUe`r_k+VcCXvNQ%l1I=V|R+P3;6HdoJM+yq232CZA-O{byp{j=qhH~KH_+v$ncn5gT z52g=Pb>JJz?^FIsUy=sKzGUo?o0Coo)G+ZbOeWwh1-uKLd&Bc61ydyec@?O~wAd>E zmjp}SGnsm_WDVoiVBjc`o(l<~-1QrKH$^c6!V|Ng*t4Eqng&WATaf-b0SuBss!fx| zHkC>&th-8p06Am;h}f$JNDo~(?dXxDPA@e*fav=41Pp{fC<5(PSD|hVV`4}M3Q*_q zoIweMP4k}Luf2iO2Y#SWHX&EMdbs5d4HMvQo7pWCCX&Lt3_x3q3zM2c-=FKJ;gTdzZcMr)>ep+D{QWj0_b9(`ig)jHi^hc`!9YpMg2&S zdm%{(X@FdemXZuDXVNr&>c9V8Btan%u%TP8HJ5*wXwNL`tEtpNTWM1moFpOQLAd5Q zY`ZWI6XQ!pUD;Pe@~c!TZ3xUt!+1Q-?h0-x1_J<{VDPqH1~M^T3{a>?02d5Bq^M~3 zfr5u+8#A15Z2N5*)tr4Xooj4>2rU*@P7rcWHrJ_>q4;8#8Xte4o2@#ug6MjS&~+fBREG3y+n zr+j!k#5G}3o2GY@OZ-3Gzy@MsMaxp^!BhhQ7=dOG8YX>C-^RF~`>vZUn9x`;hmp>tjpU76y zI@)gk)L#sPDMPBfpq?W+XxzKAAz@s06>U0q%0dB_W@g3gz*jVNy8gIFK!)8ZW;d}Txhjwb$i2p2*FV>ct$A1N4^ygsf0Spzi%+}T-x zg0J&#y?90M)sF>+SLox%Uu>Gb^=aCex#$cX9uZwvP@;g+$mX$Az`~;&`osC@Eq(qu zK~aVegT@E!g5Q3M_sLb1hN1eJ#tO})@E@!L9LIi4$#_d z%be8-bI4%=_%}c%jl14YoU5K+Ydq$FF3g^!HYo^;q#S{a11VS*xjAU(-PO1Oi?kNCYt2$h+j(NkTECjjr}`kP_#Q{VEKI<>y3F04bZ?if}vpe$V+Qp>f(A_ zN+|$%YYbrMdyv9G~D{{-l{NoUyF@@~g$ zw>oALF|kbpb)LU3Pod0#n?2Yw`j>IM!-bS9RD*qA8W_^hzyxpmZR72vd~=wsgz}N= z)(fT-sQ9%{)k~T3_~~aT#>6-6H@%-UYR1A-e+vUXA}Hv(1K9!lv0xp5do!~&jgQD- z0Vy<``2j{qg<9wYfQ9u@AOtA`Wh}M1M^*WzQg@U}Cj>wGEbkDiFDD5aYV6ZzJ&BzO-f`2rA(vJ)^a;d_+Ml&P^`Ms=8wQ!RX_yu74%Q0> zw-Yelg_eSATqa-unB|A6VBqj$Fd2sFHj+aVYx|5US`_&0Fm{UpE`Y zPOysrEG#Ic>^p!qwQ0L4k56qWqj)pHhzgWv{FI685El!(^U$pOOtG2qEI(9n*Zd&e zN4l>>TPS#JeJI5>-(%+T@u4smFqD-76#**1w|MS!euO0PPJ8!h-`K<}OTVXA4K{gH zx8G!i6#|Q9&T|{X<^WXD2K|Wu>XxHPt_5`MLfl7AE8pNCUbE zaDUOdoEYrW7%_l8O@QIE3hT{7+tqgH9GNdvj1AZ435g`xaWF-*%ZB8FD%u_IJKp#C zSns-NpqWh0O4C5yxlBNoVxV(Nc{MSB0VEUyPd6b{NeI@iEYlWG=R1dgNcEdOZEIDB z%!9e0b0Babz3go%Bxs zh|Ujv%>I)ZA4{wFZ@h*Pnr`S3VDhGdYnU((1-x4(?&Q<*mh?vhJ^*GJ~XKl6AukIKN3owJN%Lyil4AU zt*fo;bbZUJ%BQSKObkkHx%bcwc!+-v720t9Q9rBOmZvRieNCJUsu#J^CrqTLnJn&Q z_vAl<%AWEdMS7CA05qHcK)=#UClmlPTLVKT7@)GeDwH7rlqSKll2ryO!?gGB{&No; zJ2wFABG}{;9{X?qZNs)em**(l__?d=PWt7|bC((hoZvCh7?L!W*Xa+NpLP9BF8Zn0 zPC5VWKey_g?o@3;5gi~`Rd)Ej_2C&SAL?`7i0 z{g{bu*SI!UVg}U>^a&%o{zU{)H&<8gM^xnn8bT}pXq3;^0|koQ;=5{~oxB}D zssMdm)z&cf_;Y61H!(oFzy#TA`RgA~TNhUrEOKoT0;i}~|IBu)nciomOgcw3Xc$5y z*oPAJhxQ{T*M*2?z`EVG-EBQr+ikm(MlA+G0hIsf%4M_NuCQkn0bKxkFOg6{s16{K zMDMZ>t1a6&lLLchdrCn)YcLDEdEi{q0sdr=_kF&Us$^uOIcpE0898L`E(NH0D{yha z6bgI*kGp`cRTVMn!Gfy78$W(#&Wt#GV4TFsk$(H0`iqCX4TAGRs74UJNE8%26PoP^Z7^FBmn6iPomBJH2b~c7$qe#$gBnfGi+8n+pFul`AKh z>7|>+umI8VXHXxWWm(;m+ghyRMfjZ91(^v2BKhi0DK@k$S0tPTVk z7#m>1$T$R342FVh@KPv+&aLEQ3ck)e?$RrIuhPSw0@%aT@sj~^2!_7%;aJY7>vsp! zgCMXt3fctJ)Zoes4gYnl1d@LU28YC82ui4zrI20(uoEy~D%5-yV{** zGY!G%B&^B@lMT2FKfKi?}e ziAmB4;J)5NV%eE^4Ht-ccGtDANwl0-N zfQlc}Q<)Y|y(LFRcwd12)OO_bJ)WsuQ-Gj=P&Vl5hag+?>dhYQaf*C+C^BFuL4Z22 z2+uP>kC4aHQiM<@g&c((hqUT4}&(=0VW7?6lW z5<;DkPILefzr}zVKhf3Hww^!U6l-+YOAwv_?f{gmvvSX(DzJnTzoUTKLjcmGV%4}uTG|4qDSW9&M(sHSk;5iLLKPt=D%nim(6v1MeB^gD_TTU(k+ptj`u4kR+4b6FgG3;zsJ$YL+Ojom`e}3k zscFREDGEaVVNjrRL>^5~v#zHD$VDznlGi3p)7JJJ?ON@~wXEp_2~Unxj^2i=2AhI3 zD_r`D_$Kr*9ve8brw0zZ_ZEf!Vlb)iAfGZ3(GojG}fj@o{4A(;nfB@tki8!6MLze&qO4yi2>*(69+p~A->8i~}8w~jwvg9Dm zE`b2x4lsU6_l$L#hG0F@iCtYI)}fOmk^D#eltjob!lrkpV@TS&`g8+slUwwBDNO2!n)}jdqbUussqQ2SRPSP z4IuOc`UFORW-cwId@N?R25*^QfYS1+P&${_CJC1B2^9$xy4G|?(iitwR6#be9eHLt zU-Q1!O(8@eptfoYSNkls`d&-FbSSe#7zlQN0DYAJ5J-CDGni~>QfgDrv|T;#tP#_l z48M?lm`POv$QhOmAcW?_ke4CPTu=}KW;qMW@2pzyFq2Gt6D2_c;ChC2QhIA^$4#js;XB-R6zU# zzk-Me1o~1C3^|UzGo5kgd=FHJKwyD35FW*tPD^uGXZERgH-V6Y2B|ZQfYcE{cRlLv z1PsF)ged9^)3tYcd)9TQjZI7p?;^na2{bt?LPH>{Jbz?ab4ciEMix*+u@NPYc6k1t zs3QJNhEX*n0@7K)BS?xyHUX-a-I#c@i=x%-#YqNUpCk_J%UFeM8K*2e*@_>nPuyB zBV5u4B?b_3%Bul%pT3t6KD8!)^Pbo=wVu1(ZEw$Xk9ufB0`k5&;EL1v|I^@>3U$_G z(O1ZRXzum(@xu!CtZiLxxsTcDeFw#yDJS(*JW9$1%}#HQFwi4+jfl-_t-MO9F_0r8 zFl!H?XT^2BO95)$3O>ga3QYLMm-^bOBEF{wi&RzImOg&`Ir>4i>HLHk_3v~#Edv;l zN(kLpI^@}>tJAOcXtF&C;6H$r0RmNiR1pU4v^jF1m0PNe<3xvC2I;%$C*p6ANq~jkPR#M9 zpsEiX;%(cOB2}VAK#p^1!|ck)#0#bvCOqL~g;MC;N+>`l_;F?~bn&ZL>?ybmkH;T9 zUjA7Imz!j4e!rcLThqJFgNf`7MHsT@MYDiFI#4AET(?l?j;x-5y#`kREZ|jgp`oV9 z(DlvhuI*0KMANUz``NI;^1>@Uqm-TM)ZN^J^g1Z{Urf$xA`k2Bu9Yj^iKBytngH3J z*Q$pE*+p3Q9viZuVXVOr^RF!V@g<5ExH+CQ(6sB$5nqb|BtJrN!TppJT%Q0mfvWce ztd(Vohw+R(<4fId*hJRvjAz=mP+~pSk!~XyaCfyYEjIfS2uS++lmxPMuS||kFgC!6 z#vp)*zD-Q3wXNsB!{_GeQiCF12pk82^1~+|l57FGj$aTJ0ieTrU{&68dJB5G7oSy#a`u^eX-Hgt7wVp5?G)$DRHo*b=6si=mvfo_-#%jVbs z-mRI>0#`2Zc0d8}0vH2y*5y@Yr6(cKEBIx5oN=~c7fol5$m?gOO*;8=cRI6mz~KDA(*z{glq5h2cp4qQ zOY0V**Z(xfSgrMB1&hf=%@v zApDUuq}`HD01$x1t~>2C=qm)A5Ay}~F;?)JM8_~lvZOxP^si${woN9rX%6xi*SA>Ru;SgPz>78jNI+&I@7!9 zT<4O6Tz@m~3R1a#zyLK(m2lF*UiB3V0Kp$XpAs{TwXW;2CQHZDm^oZ&7 zvXJ0Sr>Gj63K=tso~nln?0xUYYX!Nqg_d@ng8xTNUi<2YkLmdLtCnj0(bXl?JgqKHj6kUN_ z`>FVA+o`bQBNNi0&xpgp#Omt zYQJne_>bx5d_$EfHNv3e=%??u-``>v*d!o6Rsf-pr_b2>NYM_ef&dVJG}&@}i+=)f z3?VDp>}=~<&y2TfW8!H0OKr_*3_6{nDDw9-f?GvPr!i7 zgaY8hvH;+V+cMw!qsNhqN4_RpB%}BXh>;db=|RRwVq9#eL{l_x`5}hk>taj;5q{WL@OrZM+7PzWFR^7P@mBF zlX#=zNwxs>`#j@$7#4OhC)xD5)}&&LkkUY@TxnX6G^Isqe(@27rx^ei zOFoJfC9FxJ!(r2bG=S?Fkrc%yE;`LF|$TLY{u(_O`N9U*`;ZfpCvX0;@4uh6qpbnqKV0A_A;2!C9PbND zT7URrA*9bD;|SdhLKoU1fw#LOPyqUQw@loRrJcN;s?vL?Dgfw(ws^)f`Y;0Ss4w;= ziacM>)Ps%b3xtBu-QN8RqRWeCRtrdPk-q)1xklg>^9;Zp)&My1ya~aO$dcB^lXIta z%`kF_!NUvQ_vL_4FC<9^gCaRMf(9f77z4|%J}Njr%SnOK%6Lp<-V75t%xtN`YvU6p zvOOU^M{jXdCot;~J81AY@rzyp@QU_01Yp*9mttP?$}r2T0uw%({ZIp|B3M8mP+(fd z&&<)vH%#%DPYm=s9*_|R7SfU_kF0qU{6aTS)Cj|8FQoF`2%IcVC1 zL)b-E!#{<;Mp6&e3dkMCZe9z(1fTyJ=u7)qom&Y7sKLC2xZ?*d<*Tcr!LaF+-J#IavnSbzyihwSg-MdxyUsujoFEH z{_SdPlZGbv3BdF6GzODvP0MgfmLTW=5RR-Xm%7ioA16Q>^y*CU6(%ugg+GD7K7({W z!PmA4W^<4PSJ>Tjp95c5mR9)<4?>tQ0x-KC?~gkWQ-JqKeuU!k_VGf&g-!sH0O>te zl~8#Zo_;#YYvp$`=sUS49?W|>9$ZsF_I)poM7GRB7dBhqH%6L|BfaG}Cy+2jZDN|H zw%z&jXWQ4355WP5hT+UL!H_@*X^;i*pQjW4lWjFcqK*?3`~RfwSLmUrKjiJiJT+Ah z0OW1{ANbYCE8}eLsA{?`TQk#6-Sz+^Cqa*sq+d&Qb&bC2dujSMULf~11_PMO{*k}3 zUbBT)QL*Z=vb1v1S0W+lF%(QR%--Znj&#g0!!`P=c}k}=`sR29 zA=?JvnfQUZW~X;WAW)~_=Zu;V$eIh!TYDM#RfIao9Y50n?iFUS znFwGGKt?VXlVBzBzOI$UYekV35qd28C@_GS20sYoBBVfHR}T_&J%IpZg*f4GE@yfg zMjadg$v`&0<{+d3S3}lgF|xtzMYv*oDct#5tNe0H`lNv#0btU!0gR+jfWnW~%ublC zYYOlN7sI3>K*jz93}wnQ{Vnq08nF3Hzo)J-YzPTT2niQbkZ)ywX`z0_So{t7X*{$d z;R2OVv66an`PU~Ov~I3!;=u0X{9~8~LDFC#QzFn_59{;n5F&<{IKq*fMz3=*;Z-V< zG}xEr0rd4T<{5>WyY63T^47u++>%hbn)zZIe&p>Rp4SC_r&YAn1qv-pvo z+|w``46MN}HPP#09Z9FT0CkmKC-tyaq?Hen!r};k7<#IPoz&0~8*~=&CJ3Iv04x{l z84Nx0@Vy*P)YL(SMA3i(Is4+NIO1h;RHt{&Nv97@73UmZB7dx^s09ee@pdq~0!)D6 zLf-%dI(Olf`-1?J7AU~11*wvdUR6*io_eP9tv}J(ABdG9etR(9=4MfneI!JQXK}TG ztp;1unODY#KCN&_x|z_U*Mk)6w4IIy0vIqsW0L!nm6er9>u8~bcx}f32BSs+5cc>u zNRvK$!9~xP=P#5Jt}I4$)R}T#EjLMH0CzoPevXN&fa~qOq1n})0&J42zA%72HY2w% zE0gzNY5)uqURPrblXe!~mST|Yggw^Yy<7en)(1nNFJK^YB7Hsm+tcC$M?z8(^00U< zX_=O09n)za&|P;Cb3bG27sef60gwjLh$vSRN-KA#rK}_g>mLwg8(Yg(#Q}jFEx&^b3Tc3z zzzHw`fVs3lp`Vtv22%<^i`%}ZFk!+Eh06DYu4Rht8P94yc!U33E|?HSS~H&7e;~=d zZXA>=febbare7wqo_(O#lRI2%vly6e1Lj0vIUilq*AF2fm|WJPe7A}eh0mqK{chpd zb*U+)L4v^>ga%N{wdV3dh%nHl!@)dvhdG^~24VI=1Gt_tGBU>HejsGCM^FdIpL~xz z1Og3b<;B@uDHt>H?qZ%9@(l0>0~97qCiO`10)Yy8l>k88GPVDH1Q8p^pA@bbPI5-v zw*k;uLDE&A8$7EQY3Qw2K(AwL{M%TFdieM=JnRYxoh$JB{7Zicm zIa=wv(;An(Hxl<>C?SYagFMy8SuX^n7O;O;u$$M6VQ<7MCM(hkuOv5t^uR4Y9jLk$ zhd?w&bo9B700bc7dB_omIM%V9%Bqma{6hc*s?w14U~HSD9>SPxpnCLQLw=>_M{W1< zUS{n{ch4>p<6VkjUi-4S1p^qEd>Yxg@Rxi~4+&HTPisFjYeqhc-M|J!Bug`GJrt`# ziE@FUWap8+%{>2R@v_w7H|o-jjAv_#HiV*s_ox*;GxcDb z9)c9A?}`k;sak5Cw_VJTLd((p0Y7$}Hd z#7`7J&*Q$(qC*pN9L8W;l`{K~aLw<_53zz>^#F<4>|K4D=76tQmgJ`j6$F~wGfo<4 z00CkO0Ht_&!w0_~%z;4OUcNs_Fvh#r`8=L3Z=y-I2|t5ktr z%o&7Q0)Yisz^vzus0}X7=m>+U83#P_hFlQ^XOL=`Iy&sm$-*^FLagMePifLRU%F~EW=r&+_Ywq1GKkfTYPbWs$pgcnK>i$L~n47e>u z;ImPn+i?L6-O~cS0NsfbuNC2akPaS$p1m^vaLJY8&YlHiJtJS+8FTh5Z$Sv`qNxVR zj*;bexF272zXpylj^lYA2EfZZla?9-bbzYBfi_-PuM0ZBAWqWxiXmo)p^Sk5LVB0La}xc>#$#YPGO4heqB{*i*m6dl zpMfI{H1y=GOqftQgvlp(p>yPesVQKJM<$eyDuUIMYFkQM#xvh}CkLSl^NeW^_uxGg zfs#Z^S}TcINR`T>Dro(ee}8T!21HP~_UjFH9ylBoVKga1Fm6{|IsodyL(jFaf-` zDzEHUS{1)(g^Xk05t@?ma40%+!d?UpLvJY-n} z$K9yUCfeypIU+t!S>g$Y<1<*iu2MpY0B)PCXUXITHOcXYhCW^AOhJ+Lct#9_9}N>m zm;gu$xKK>-(plr(QUF6g;C-cYPp|?>NZE~{*q)_XD>jA{a6^(v(&P7o$4IQKWaX8W zt5HQ=?kYO3zP-$A0EnKj{(S)gf~Mhv*{fk8?jGG87)px=YBQT!>xg_zh!CoO4(SO< z5qvxr>Vf{{KyNqQU;wfO>cKd2LP-4>W7xHerg0e~N739oq&g=j6F5QxbT?<8WoFA< zTvH0OH8sW{x28WBfOo0sE~=hh`HG%G+jjVLBrQj_jW40N!6tcpo}Aep_BJ52vZ8f^ z_0K&Kt}>?c`qr{^^aMSUnedC*40_IaOdimC#j_l182B?-pO&4$Ei9L6mM zAP@4oeDu1UC%E65>V@%>SyD=#C|q=IbL1Jk!r*QFB?cWAsjiT^xSg8 z;!WGKNFgYir95#Icy>^=+{FeY|1sETTU zj5J4PZMg0PXu(?yh5{7KTh`Pdp_q3710I6j1HDQG6{cnC`Tmd-#Fr4+%A;pmZ14$T zC9hBZgSDiUNS`V9lP)qCYdzPkJwV;*wdwZs769X38SaU3+AJIaKD&6A5)i7nLbzgh zY!Ct8b&EYL?H>Iab1jsbUNsaEA*h9Q>6J0RS^|(Lh+-K=EC~jLK!Bp;oTo&#FP?^% z?D6ZS&$u~}FDxqrmM}O1FuOT&(>n;1ACiEV0uu^DFouGuVJ<)d5GzR)C~tdaBt^2F z`#brdO%&xlZ*7+z2-(;D$fker)lF+H#K^)VU;ZBmE<2jx7aj{uS5gg1_R~eOeYlg1HcO)gz^!^od8uu z^(qM@X6o8AlXqpt6#-J$*p{P5YFi2b3%#_~(v=cPOGSl3>8ox_KLh;=DFZ+S1id3_=){MxlIw1rYJNX(Ok^+8hgB_;faa&H8Zq+sGeB zcE+g(nuKGh)2E?v+1R|YUdd0XN{%pr1~@hivjGZnF@2AL$?FTe1iS#W@5Jy!1fP(~ z7g~PVz#=zrQ#WX5InUDJa(aZ&Cl^^+T3S&QRTA|X_cLEl7lB@P`tQ(^gRl}HVBklY zy8v{=V;R?Nzp14>Bk$5OI17RNq0o+>5zkNp0_?LSlx1!F2$lp00uVl|tVc|QJn{K+ z^(P~C(QwAb@|3(ly8EPo9syv|)Bqr9-&fip1~AXaw&q<0*Sm|Sga8$x0)i>i`}q0W zMNT3zvN1PVwxs7727C$W6a7cl4cG1UT=P2CBkHDCqt6=DbLct3_YrIQ84vKLxU_O~bfeI3zDi!e3 zzu+W^F>D|#J5T1u6gWZA(tlj0^^sPtCodz5*6TGv7(oqJB^rn8(<)rn?bE&;f`VepkLi z2D4_O0nfKN;t4?RNWhj=I6)A&Go_TlQ>IzvvGv)z+tu3bRuC;M2;lK7t~>3i^W0yu z2oY@-wIo~Q6j|vN0E+YzMn+DNgFY5lX!70V-mKVW#s^BAfYK#!g-zJx|?gP>&YL`mC(0%!;)5d1NKvp0RG* zp0lHf*PsWrfF9H@9cYKH2XqJB4&Zp-7g|6FVI=`Usz-+%oA*Q3&bUU}Q>h~IaN9#J z!$|~K#RdA{hTug(koXvoZrnpRxCw0QEco@wjf4N_n!#q*X?E4|u8@2YKUG}V#U2~_ zehu@INr3_s!-U86sfR5$vW(bM(R)R&F!A8oVf=qyTA$h^;D%3qHBcCgk~lZ5 z5nXwKVrc{0m~Ar$8{c7cwRnDgr>~3?0FOvVFS^vSn4f}~87|;p*DTfnd%JJIB+(d; za&7mi&aor!O`{6b6Nq2X>i|L@0?`79&Xt>2lV&q}KA6A#9t-;irA6Ub=`(W@hMY9N3B_=xKW^5^xfP^@Fx%SX%8Z2kQ!k|NtKyeanhn9VMl zq5({ZmUT&Cga902UOl`F9~o~yd*T^{F9k*S3NwM7VJ_e9TbS@ktE#-FwsHKfm05RUFYsJwo8X!YtPnsUc1Ex z*yrB?A|97c$g*qqoWssaN);?Zg8q^eLtJh(wb64gbH-eRMxIeuVY8}4datp9DP^E ztKO@n`9JpJ8bcT|jG?FwyFaWC&J!R-Ac)*69ErA-R|}9rY9v5BKk(A(OVer8^q<*} zSPxUs>_P&DI#fdeF{6&8_ZEdT&AA=3LU%X7+{Lu@^41@9Sb*0uJd>KB)cbbZYvOHpKHAru~gf_ujYMX$Sb<7Y0RGrAD8qdRTK z&sgIefa`%Vz=D0A0GBZ7=;ZiJr)r<5SOGOa`IibrgwRX3OWjwy6N3(G0(h=G|Ma0Z z?O2)DUHpNOm-IFA1J%u%kWF)T6_j`7xBePWC<2}UV>6BovnxO3E#}i0FNM+qbb@gU zP}hqwbYua9P~iiW!M4XU7Rao$uWkF%AlVZr4A_d3k$L?rTlyfRKi9bKxlW9N1R|{k zprc0;00Qh|>@z&dPDk(kYMu+&^Y4OQ^wsw%qQ1k+=o?>m?DMhE@B|bk>6KpjFIg3v8wo7VKa{O%X6GG_l)b7AG{QA z3%G_d0cI%}YP`G5-Lk5v@_`Ua`O@*c@CnA)w0W#WVO?u|JcCj0WqWK#QEVk4+$GQ+ z?BX)q1c?Yr5I^G{^!mTko5e*}2CfsJPV|a7o)~tqoV^RSiw~2-gf}xC#r92~<&6x^ z*!IL9fVw6C^gy!!dVoj-K!JR0fz`5DT&)-Lhh!UL_G$!Brx}vJm`F#0n{a`#o1YwMjG+L1&KsZwD8@kP++Fynh5`z!f&kDfD73}npBlHe@0&(1vpIXw zO}PZNo#pZASzajD2-4T?CHtl}rRqSB0uY=A8(g3V2La80xl;#V&NGtXsa?PpV2fZF ze3=P#jI~+2z6D7Fs-uEul6-XZC|K0dfM@{dl@kh{BaKd9Hq*0Z{Qa@~FcZwC*@Xm1 zrzolbOpxVe$?;kO2o1M6!Z^DNOo}mP@;Q^1dKaJt1Mb%Wom+m~K;fjPD&WC0eqr)6 zzIpwo+=gs6n=Wq3QhZ%Ao=drcSOj(5gq9lD#l=XJA`p;(Fx2mu?mkX>0n%N$a*%+< zX39r$Apq-&*d+i+FbQLh+dg|^*D+#|f9@A;=8T|eK5nISSu$%&KpmsOAIA_YTm1mV-3MGs*M;d5gGHZbe(77-v@47H# z!bdfI86KI?0??HSJ*g_dlqut9>B>Qql)FuDt2p=+Re*VnqLH1IF~*q7zUqat1p#`% z!`0dhMeQgB@iTsff!>J=I{pSjAiUu6TyR;I_zyUpL>=zj4{dj`Bi`uQ@@JsEhK>M% z0zGO0K!>%@A?`y5R<-P_|1(39U_Z$N;(4lLu;jq%G)8Oxpf7WEey4h1;V0Y8d97Bu-&-x~X z1$e>h>4poo zll7Aj$I8ux9vNDEKYXWG99j7o&-nQc2rwMz0fZjE!*Y6q;QH#Idkc`pFh}69Vq2~A zX6%3C7pEsi1zA0QpobXLd4@d%)c-02^os3rPjS+iKNG*CXr9J5PRQ=;+SN3!6I8P7 zyn3plDIgPi0>?W*HxnorcQO~(3kA2P-~!AR`Z8JoW2&-?st2G72LET;{x+j^MiT;O ztyLFZkUlW7Zzx*k--QI?#4*LaTDy1-e<R0M_oOY`7d{J8c#_UAF@) z%=2DV9Hv8cr_(Aa8v0(2eFS%nai=h^)n?b5G)>ko~* zkjG@hiOGoOG}JEOOTDyKSy2N4CbR2(1ZD$(0lWpkc=7TH#eCo_rPM%wb`?dunjT{h zPyew&FiHF-{l?}pz&az`xPll-lChJKF(M5`K?-DV3YfpIrdK+BZUlmEyH|h-Y4A0YvH06p08f^ByLy959+2RbUAy8J;Pf#@iw>p6MV7(Y`T0QZUyfO0_Z;bsUueqe|H8bcTo56(QE^$B{iY?hNq z2qN(-%8On*PEY{!S~1INyyEPu{3EfX$T4BE>18)LNoCg=w}%*^$nUeR+Pd?R!Fk2C z8$a=GCs4{q67X&@6M!KYF9lQc38AWDB}VwdV2@w_fVrAK@mpUdo3&O~0f0=b%#~ac zYebHOgkn(+WlmehZLx*;mpW(!mcNDOH zYvr^4P{qFrGHcT?@?z8ULnzRiPFh-AY7Bs(eAY)4Gub`xE=hr5c>HYa88OKBO~ZYe z&Eiw%g%;Q-N@kMV9LLeoA`rtRyKQ~fNG%8r@xkf8LNIU~yBZh=?EaZ=y$*T{&6bbE zoMcDW+TL6@p1|PgEuBE5S1#I4yY2+^#0vpkPjwLa?|Vhdo_-nk(fp|)^D-GzJV4-N zSDl99oG_lH=u?(PA%k#`rkms46kvi}Obg(>(c8LwFg&0@KVia;!7_*VLYZ#;hMF?A zy;Zuo*0uSyfD%Y{lD(2K<^?$k`t0y{z5cgM89b-&UVu1i0L;OK#|1k81N=6zp0%tC zf_;`%vdfR=jfZ*bBiE;)Iv!JLK&Xh`k7hufl1B_3&mo{d{?|@0&9s?jrL%u>M9K>V z4>M_g&&DJb>QL1#4#BZ`l~+$yEEI&3KH)bfPy-lm`y;dx0E~gkwx;DXt#|2F07yls zpvP|U)2APntd}gC_ud9!tFa*QkH|1a305Y-SYSNuFD@H@@Md|Ou(3z zdufK?pSr!Y#{>qiWRFR+rMFicgg>{0K2gPfOhi1v@CQT@&=V%Qq!&N{iF#H61gP+A z)$4QUn}yD_Z2sr-sy{G3mXXb*I!zzgn}(*@1;>zN$g|2SqJ)tVx}hiC4YLbSiopf* z{qaZvpfEA67chlF3j}%vB&pI94F2Nr^D00yWo)!u!sb&&0br!)YBIAu5-C!Y5ICwV z7kju;Yy8MN&`X$}1INLEcY%A#34moW7!J`Z1;B*J8h|6cDWSWUKsxC&jt;>-Mw_({ z*B(3y@=7Qmz4X!+PiA~i$?#6SRNVU#=Z2$t^}yvMSZ1N4eQ%P{`CPkxcxzT?IQ%x3SV z0YH!C+;K-U8qsoC=&TJ8(^964YkMwoe?ahhxaZz8J%c&o0Oo)0wYNh9Hefpqzyb?* z`!vlt+XmBziSf;t6ql}5QFfH?@duu*7>;-}plJi>^@J#=!iNj$t8Pnr54Eqr-rsLN zmSf|zH#bIjQ?91z!@-;+ik7s>Z~Krt2B>Yf~++Fw~*BGELgQDoEfC{XT zm+bNE5lZ}xUiY|zqIe2{h?VJ?o$aZ6kRlNT&{K+sH{;f}i^?lR)(n_~19OMLzyZbt zumBhXNAR+ig`>TCM)xk+p?A)PAQ|Er^_1lce$NyN@HV&jNns(7S?o!V4U7}0Dd1wD0L5UKyUct0n@!WwuW0K}jIX664ovnD+Zzs06ny~fJ@7kfty@N*p=p?m z%%&7vsB7N30Q34;K1EI2QkQ~xnN{&(oKX2~&v(w0Uq<~z!>AW^SHf?+;+^bdWLiT* z(&GmM#lGmY{7@J1zjzg$0|y5-<~a;!9dJCK=@>2+rekA|G<7d}wKTxaDjWD9YLYhw zWlzFAyc|#4uSKYrM0EcFcM?DKTSuh4LEa15|ZlSkO zAtbF#%+biTLq+wbGzf@NG=8S@E9(g~1f>*#iU6@Rt=Y8A!WNkQ`(sIoJu%g3x_?lI zDvCVHHL&!+pMCdA2HKkT9vD?&oR?R)B8%N<-1NuZZ7U~}+a9QZK&S1>%! z1K`;K?!yTfxG-Q~;Wn^vyKOE{n9eb#kFi*Fj7*{7{E7;K@?%)wwL+gKjgWdOEl}(} zhkn|;dVip~h~i*o#=Sdx;?RMf)ev&kdQ-V1$3c2lfa?Pd0N%yS)(bU2OQFMlP5=o2 zX1EImfb1Kkhs0ac$DbjqL2cT;nTs4)>~0!bnDuyRTzfK|D7F#>1TmPl%%lDT;HhF6 z{FrCB$9)&>z&+T_0AK{x*nolcNUhV!vUss%c{YVe$YGe6y6h3IG9dvPL6ivO?v*+S z0HW?~N>7~-MJUp1?bB#xW%gP8k!MM^O(30Ky5r&h#gJ&ps-zM^ntM3*tYgDCso|Bk zd@vYHq4Xsa%xuBT#S0kHivU8XNWc^is- zI*(x3j5f4Dv|)H1^!SP(e(7bl06O8*!nZ^RmPZo7?LTqt2)5Wg+F<| ziE2QY-E<#;<^-C#v=qDm7&D(Ww-nd7c*h+qE-<%V3{X{}SAfM*i=UT8vnIg>7{|%8 zq+h40w++U2oPYg3m!oB*#SIr)%+tD0?P)n@hQsW=yn><$*Q2iC+Lq8Skb}|dM>t|U zPm5@i{Q~ey}zq|it>R~2N@+L6f-!tl7nnE z#lK9d^3ybGAtG)VC$TN-(OXSXfQ%exCOhj|B4t0s3C7rN?dca!+ba);Ap7+h*I|thPCR1&IaQ_7f8$ejvT2_5ayn01dPWqmz#4f6r-I(y5DZY5B3N6U2F!pS&@(5h;c48>yl}jg3 zz{?930P_JUF1|`gLVUmnVp{xvWaC}1&5&0VUoX!C#N^`4MGuAl8%ZE!SgPG=ho`mA zVK@gSC*u+J@&*-^gb+m7?2iZ=ak}WU7`!%c0>G%;rEn>U}%tcTWNP`I?X+IRC*)~u-XGT8iT%m7u0UbhS=vn0#V^|z}WCVcYkqPj@ z5&-I&f|&)VslmJl^OP+$A%Rpt=soEL<_^>Ojz%4s2=Bi!)ya8uUJlg&!j?YYbfWoO zuEPQD1)JBlpL)$O3=9AWm|&8ui3nB`Ns}Y#A6SQIV<%vaPPmsuC#PKW90PiyL@lby zpVFy=I+M;JEs9cvK3dqv0~GFf5(6HMYOaPf;leC)+9qUGddc;C#5nO}!n*0basLYx zKZo{L$@?mnJ_s2(_OYSi$YfFjlD0r!GIy+7=2C-!%9cW(?HU6~=n1K+5GYWljHk~~ zCF6sEHr}?E_2{W8s`Wh2m6b79K4>`yodYOTCLX4($NT;-hT(92>}0Q}i9th9f*@?2 zmn?u~3OKr?)-wZ(F>6@cEPx;cLMney=K#~O^g8~;gi1vqAl=ov)Ez(&goMjnU}ARA zAO*N3b}@-Vheeas`bNo!=cZV&W+{IT2(3Xs)5-+!)yTf+~S&-%%Ff|+p z#jDp(nM?}k!x7Uv24*uK*9+lIfDoW?3-G|dCUQ(%Px#ow5BuluH|toDKg&;|MIgX9 zE7uuzWzvb4g7*#>4A25|OEDA|yx*LH9?5EA4W?&Gmg1|`JATn*07Mhy_70dw{O(vQh=*)cQOM{LZjyMe(a zex+0_ZlM8YWgM9mOrb7NXeTY@O%nj)1%OU4g}(g{(<=b*75EkpkH;$?EhA#mp}-`O z&#UM3Q}xvQ3fqpyzQb~)Sm$s+0KK%uQ|D6;gU{)62B3QcC_=6!=BjIoEfO-aTR&CdP!Ru*BirW0>D_-5#5~nh2k^d-^`@To6^o~P=Go18CKCwun#Na^e3X(S#O zXdIIxR|3Ht+ccCydU>s5aASul?;0MsoQ z0BTzI!{4G50~2eP2~-4#G2VLoSUHgq?~!}1r!)t(Tt|&a-vw*E)D>gmag8@ z!R|SnVR$hZ609UxNy0TD3c=pjz^ip4umE730CyZDVgRqAZlOdf{j)lvqfS%ld4*Cf zjUHlb7BA>Wd|fEv>U=6V=2$NhArK@hAC14xOOi((yLMpzDZbIErpY&1kz!o{1P*pH zfysD0YighX7>t?BrF9E#%}ckKei)cS57p{kZDnBE)=xi28X$uCGW7AQ`jhJW%P31@ zB-2T(Fb+DP0|tuiMHo+4Kf?>$OME@!i`PWLhMYPVHpk=Q=QR$&*Z@c4GzQzz0lZ=~ z{_GVEFO-hy^<~r17AV&1;>3p`2|*&Jp{b!GWyOS`gc3oZvw*AzO=`TUrnlp{VGr?c zY~Nv}Qaps5T^mkDUZfi^1_Lnb0$ui>ww*J52{{~J1z6@nnIjxrsa1NxKfS4qv(CbKr1ao;p09Y1a zkB%d?fSoKhj5aLG8h#ahmal>%=j-5jgU2nW1L8*tWpoy%QBuR!tIDVl4bup=XWRf; z4@rbPA;q%nPoRo|{u1)a`&30^NRKolOc?tFfR~$z0RshmUuz1y2ns-v{3we;)vHw2 z3S}7k@lq7+FHq(twj`;mx+(4&O;0D$bbe9;0xqSvb^Y|q)3%)9Kp)sZT0$jJEn_9b zBxIF<;0UBSmNj0P#pwi_3pf#+tP`97x@TC?{twpjDt(w78lEs_$1)M^_zeQo6Jju+ zSJf<38h-J;2#}R6^6Ss64zZh(GrYz-3^;4VceUVITRhDGi9hRf1l4(Vz9tO= zLy)Hg3@os)1bt16y;X$~1jcOS$RVe>gsk*$BVUsV=lz58_Kc>WzSqmoHxCw)K2B~s z&W64eFJQdO#9N9>nPA?kbYk!Vr4#QxBm{seRj-1fYjqaRk%chV?1E8ijOWy$x&dT# zVJXQXAxP&0PPNryPwnY$4(G?7qjalk;Q_@ZBvfx=4 z|1S#sfwq{{kvUKdCFfCS?^oUkiRe8^!4z03R6_f#5HG_n0eDJ8#NWZyZn}5YBf6Pq zhUHgEd4-%6fCif5czc7lbEz>BjF}@~`hLJQFacU7;9{Txe5e4b%Cx2b*h?8_8+t5F zVkwX6RCn_<_wd0eQiKQ6eJ#T#e~Cg6=o6Ap#k|Z=zxNlK!mAwHaj$26ErmhMDPRD6Xp?PLi>W; zbvK(0-nrys#cz1PB>-cOG|(eJ!Ia|N0<_+m0tMqO&$^fzyqy@+npdC-P?26JQ=UHk zXksV$l7bHQjw9*xq0U`%2PaD6$hOV_T>(IGY3;RZw+z$wSp(j$Oe&T|vmNno?KnM_jhWbB*daNU5p~tU}h`!S33S)pZihyX0L$CF9QWP`z zCK$|0z%3ufr;H7*g(EX5nxez@CR6fRWocYl?sJ3_U~GmknTy0!VhotMJj)9;-kMHY zfPyJ5y~^9XPoQ{szMeT!Bqs?07Zn(_l{fF{s-{{kp$i((wj{-%1Bc6xg0VZrQ#>4a z?Z;dwD)Ij28by;32!gK*+slm8tUYVsw2Q{W@8x-^6qRDf!ojpELNR>Z+5laT=+NM~ z|N9PsFqEBYQ!6zcbr?(<41{ZV%osViSU2x^Xb3;RrgPW+L|PRToY!FpjCWyN3Z`Zr zQlL;=T%b@>sFyNa%3D~W2nbYAVM^`C|KKqadjRad;flyds>3PjwxH;;ZHK%uLWpAk zGL*&a4mSU_44lk{fLp<9OUlwG78P>sfh>lb3tYk4#$4d>EiA?f7;`kRdgQ+W1b--8 zV6KS?)ePl4pecZ?0bm)utRBhS5u_@GS_ScqOsE$jU9+eUN7nDkk0!=&;-AomraBw; z#LD~lNz^1q;09MU>&S!xlTIj13g#Ivcy|}z-+W}~W1&?AR3!AZ?y@&lWR&ptj)gZi zQ6!zNx}r-E`?AEbB^e2Ec|}@wQ`f&OCs2+4TK!Z~iOFlICL01QIj;f>IN_S;1Ovte z&0<(iU!#MFmZ&&5muqmsC=3h|A&`4zSOY&F6n(UzH=k{MsG&)ClhiCR!0GE56G;lP zYs~(Me>D80iavpfykx~cp$K=^z^o0x$ZH0eod6S;$y)$;7YqQM3wUXHnpX7QQ~3ZS zfGLB=&&!mU1Qng?VB&j}qrM&m>dqfh}>fb;?$yzOzM#3qIhghU>3I8QYVLUQh65u2D-B&5sk%6stPz-$`WYOFi^ z=W4FPRD#i9AcO|+01Rsu09aUX8UVAfI9Yyf%KvOoP{Bk7E%e|avepGbM=$#M4XBu+ zsY<1`YPX`A1C%5H+39DRpFv1%uEBu=R5yJXu}2*}>zjwDAT;!mk+IL_Uh5hFa0?(| z0vKZ^EiHfxt^qo6>FL>r1%#K`p3a&q<(?1>yI{kOZTU%`s;WP^`Gs#X zBmZmn@{&N%j;Qzeu!YiDK^2okQ7-f0dgNJ>;}91+@SY9H2B`5#1w$sEJYPyL$;rJp zj3e{}FEBe7z;u>UsG$XLJAvXNF{R$6%!SailE`i_v<#2OpW(7S=?i<)Nj{@aS62h@ z%DUfr6dOsPQvs0f(jJCs@$wf#LSZVYyRS0V6^#j+{tVb?GOk> zaWO%Tw9e_O(@ zp{R$K=rDf1jub`Vw>EC>Z6KJ1a&-Eu4%H3#xnO%pv5i>^`Em??#f`9=b7unHyMC-n zl~tu>8U2L92xh!xUNf6zSy(4WrxRG#u)t#A2td%6D9bR`Sztl9u6$Z^$M?&!2s&o2D@rLgbiy2ym7C zjCUOBpEyT(-%45KH}&|b@(E=H6%Ap%w|nLhz+>>NPlH)pjrO?92_R7f5n8ZB+YEwy~2pIG&HFKl3($ezCw@eH}iJ#@y;~&h(lL=JQ-ADW}qKZD*n2cD89{!*O z>5-caG-LNQ!ej_g@V0bP3V>-{3Z^c7ieiix6~d2VKT|w+JpD+L|7R+gM9zE3xq*>w z{~^WF9Z!x0{7|touME6`P-w27s(h--Kd~y7-U!|$Eaar_tihfgV1x@e;>nDFS)CRdfYds6=wAX%H0T#8iyw=Czn8XVSf&gUw{{KO?;qPnyJ$uPj5AnWa z<>QAx)L#VH907WyX#nuTM-(PL8(Q9s`M~xCp>^N70$yzI6c}cOmm*@^fxZRa-f`s9 z|LxON9C%6)a*Z+L`o~wi24nnc&4cN~00t6nSXcObQ&m3WcaABC@$bCiB0`V+%1X7!p_{9KZS^S9T5FHgN-AcP@?TijLI9x@tZ2D38#wT{I zd)bE$bo&RI@Fld?s*0wLkOqJw!wTGck;`k^dKW6em{P+8CYT{$z%>{M&_hDi165h! zThD(rWp3Cs4M31B>zqI9bTtgT!%`42j<6wbaYF|mzfpPabUv(G+U~7uwYBaz z4!%N;t3MbXkjL}4OfZ|KcjG^~qG7W^B#Kt_{Nam5$XT0)!9f^-6Z{+|U^=iEW5A`w zK$)e*BX~<)XzwBT9*AWDn6AQ4Hx^0w?ar==_YnEd{yJ4%O|>w#O>D_X=)eIuhTdbh ztkv=o2O%V(l2@qwNqws7iDe~GO#*Acv#bMfI&sxEAGh!4zG^qUzhD3P*w7S}j&Y*peEj^O zR6}SQnz^@Ter&Uy_?E5#z)bLB%%lbYFQ&Zm5~xxEJ{5!&TE^qgnUYU5^o9;jlDso> z#TJ0IuTg@ez;TQNh!B)N=poVicz_&Yt|%)z_D>v5o7SdOjmaw_nP*xNaY+=z#BfEk8*Sg_RMG0L_bY;ZwSO4!9IBFzYg@$5LFpR4$(Y^sXHX z(yK1JAc>!eWKnf_s3qXH50zi;xgcc-{a-&E~Usj=!6l z+UN{U0K7psj}!}dHP%BX%Ot{&j1!-JP@w-aKvaO}wLnL&C*al2dZhq;P8}Lkg5J1Q z(NSLNsELFK_yK%CUb1ah*nvl!4K8+31+XVk-e-ODa0%h0$8lDe&}Uya?R)?Q+%oY( zDS&s2OKYeXTEGQ>P!TMk>ZMG1{Je2u8{pCuV21e2jK>}d8_*qDC;{!@cu_=ApG$}w z02gmausFVFdhhgf+U%K)_^H7|d_GDZ2UPvxp}7QA1> zWCTV-Vb;)kcPUV4q4e|P^8AmGlmelLo?c;9P?@%P+4&(z2m1bvF>E`!RtMJrM+)mo z5y{R0?m=JYtAAL;yr4vz{K=oY^XJbYX3nq=$&rH>=I9EX_~$4vS zc+u-=2fdJ90Tpou^h~lSud7b+sl5+0gj_L2Js^=3*(NUbVQk3W)ULW2vAm+E{8A{` z-1`Y9uX<81pF<6$1?Ui5<7LurX?EIa=&f$JJWFb(lE3#Az(AxcGhZgOXsv zx_Qs~#1QC$+J*Zf(#rFtG-k28xoUZ_nHPIIOECi%{3NIWW}$$oOO3%>I!dT|dMNim z)njb?@gJWvWZVH%XO}VB%le(^bc#((EJ?|cbS*d-?f^Ozq5Ln@g5bI)MYPmCmvh&% ze&(!M8vwgNM8BjLfY*_SF@B=6*Z_>Z9 z1X0@&#O6*^b`QOa@pAIUS1|H!;CztvMEvpBqf9Uh&8~+)(R81=F@wDC^W~Bi$B~id z#pa}?0HyGO7w9}SnBv{-ECx#7p|lWqH9&x17^e38cYdfLKsD{UnAnNtr&CW|pxH>hYRBbv=FHXJ($VqZR`U zMePE-8Nc_BFO1ptBXIo$fiXHlo;E@%Eu{e0@tyxegKnFkx<%NJ@{cP%gp~Ala5Lm~Dj%(dcY%<4p;`^VV zBt9-ughI$a{fT|veMhy6GefqlR}Wu|g233o2=sW@l+G>XmFaUo9z)@&I}6N0F~(43 z!z>3ZQ>M%dN1xzc7gYe5B+~DDJkz=qKthp-LJ$T{4xj;|<$3V50EWz z#@g=oPVenm+wSbdSO#(kIX+q(X}G5RGbEr{e77(2v=EIC2texh4S*iK4v>`jn9I8M z{^ZCs36Xp-Jb|p2{Lqen5T>C|L4h%`ZTYhtOD!NYjJzU9)6fY;f=gR~f){3orMw6_ zk${2O$I}B;B!M2Fci}sJ`WX^=8%RM@bO2|JpXs+A-cU|%3qi{wn1H)O&=pDxqEU}0 z042oOl+_=%&Snh>%Z;pn$mcFpj_8%`ng)K4Kq+p4N!{0O z3#GJ7e0{+ScuQv?zK6v309HaUW$5E)1uG(fd!cRteM4+V^Zx0#V+I2V1t}=u2=|=V z2#x4_3J|=3Ac@(y2F#lk#w&TL|Q#OoxBpjkW=E}3mk9SR)ZeC=< zNDl$1M-0L;tZ_Z!1>+qHKrt97crm21=*n2UGU(*r;f zl&vEj1;zox0tAI3gapNd_ce(7(#Cdke&9K0cc=|97}~}(3NMxtLs6cL5Bqv`z#4B5Gp07U!UgF$NtPiP8<(=kVQ`aNGvI@*m%Oad3*zP z`ZP5j$-s}F@=tP!z}e9EJTjTRcs~G8K2ka|HK^we|j-oI4PQ97cTE0FFUWEsuUX1J<>388vrnFnRN}OHBe?J2A5Jk`W!E~Wnw5- zkX}Iry($d$cy?HEY~Z^3HsgNy&U`(!ZNMT#*+>Bij_`@-{Q(uxOCi@q5Ti|O>l)fS zU!*&iCGr|_$62J!P-xxv#LJ`f`%s zAP1+^QzGYKHoYt)WK*17P2DxGWkq`Opn3~uSLo(iC$ty?_!bxmvu4uH0w4>0{4&8i zJ_`WW@k-DP{_s-t!9~+-b_K__erBfQ)}?R>CHqo<`9l;yrQ;7!;AK)!SM<(K@62_z z-8PLyjYx9507tF^5I|4#f_RdEE{IF7*9*{HNO!${FQ_|4VK}m&$M4aA3bBTMITP{B z>C~wevG^Z{#4rQ{VE1|U@5dj@wvDMx(~F7O&`?DIgc*^d)PqG}7rWp0(s34A0C(;p z7r=$$-SL^UcozWgg6ssKsz{2kNYx9T-WmHNMax(5h7^69&Mspc>HT{F*QNwejxN`2 z?0)$CSqBou9616BVTI*R)0~}m@15?{s!ozu-~tXvPfz>obpW;gk)eaSY>@7MQ?Pi_ zBLpC!2i?8Y6QmEzE1NB4>(hSXqT`qx1ad91viyA{#mN|N_(vB6b~m*fTrqZJEAR8E zmk^p+X>Ru2fx&=*!o&-dP5>|7U0QIVZVSR3Dxpo{_cXz#0mn%(BMGy}zIC$<+)dD)k z3pu(Z+I8S)jH`O@D-HXIPJ(-lCa{P#FO+R^-|hquHG<0Q%i zQc^_;Mb<-Rl$2rp)CoZMDJVGkhalOnmLEQ<0ULlGUk!9m04AmrCNBlbqz`}6q!=)z zFk4_)0Lvm4l@C}w!&4s5%#g@ab~U5k5Kq3HX|H+%C@4e_a%q=*dPJ>Ko_y5OL|aF< z?mc$vYHTu09wD>kI-sLKbOPwBLYC8=ID|n5y(B3oenR7VJrGzHe@O>I`7`(|Y~@e- z1&Y2hYIqags|4Hv*}u>0rO5GQTvXG$$@w>(hNjz%E5z}#UrFVsr~r=4A~cg9Qf5C8 zU=}dYxdjY>>jC>%+KGYE0)Y*IKmjvl{QRR?hm5)?=85fS-aj6{-In`{weON}%K>^~ z4@DG;UKb*o#L>0g{dIE>H5lH&>vaGRAOQ#q5c)U+Ko1~5uO^*IfIyIei18z#uJt(6 zqxbN&uGV%E0?Ao}kPou1tJbxW_?LqZMGI7V3B@B4*)bC~&C)pDb+U`zMFTeWtmRm0 zHSBI^Uc>Q(kxB}tfH4m<-o*tlLjWk?WiIvh0||j%^{Sjum16g0gBgG26JVS~^Xqxr zQ&RxMS^I$l2f*$*p0B**5-vhup*p^2+V*zcbyd&VtuRBb1FrcC2neD8^wR5(@jhaU z-_UWo;-Jl%|I7eAx+A3fC;%b&Lq{eih%Bz#_OaL#NBBw-Vh92VfDf3Lq{McOk6GT@ z!L+HSDF74OvNhrl7J>jH-9781xoH?UGB0~JLzoK^FMxT{dZA#vi%A7Q2&n)JE%tmn zqZ~zc0@qEm=P*ff<~uWem-&Mt1Pg&UHuK~a@n=xrxdI`7lO&rqJ8kZCog?3|mL(Ip z;02x+p0|TY@J#yJ-Am8#ck}@00g$BDfBiWi;_rFIo&RM3n)nwVa~^X%%D5MY-!!9dafd+0+dBlH{dU`$Rp4tC%B2!jAn02eR?TA<*z6egXEp)k+j zu@r!wwGtA1Fm3U_Sd44P9A@zT&UogHTPWu!A)9s61nX1jfGFyqo3n@}*zAnxIoC5I zH{&o~0f5JY2LytDAwWQ#C}JD`Mj{sndgLV%adHCm1pg`m6!o#k!}`W{Y+jS&D~CJD z_DP(OWA>N?+$s3Kv-=9m6Eae-XkFHG=WN#P zxl@}O)sT=w;5vAGu7i^Nf$sVAYI^#OEU;b{3#<=e!CnFT7!0hRMlXs`9)Cz>(W6+` zbv;JL(K*Z;krGNEoBCz*u(ACgm~3_)IPOsweQ^EO-@~E^VOU`{05s5Zi~HhNE@0dm zXkF$mwDkyH04O!9?n&=G^pI*>>ur&hT)DUxx`9hbZ0r5&@o&rEJBX0GML589JL+ga z2NC538ywbj7Nfn>JN^EmCIA8)aBw`MpbmTplkIUnm87A)*l@tNo0uPXvB-?)Y+6(Uu1>Mxal~G5t zu4ugLrkfWT8DZ8G*CR|^LtQhA7cYPp(}GLs+#LZqLDkcHk7Ze;moj+#*A8!+rD z*loCq<@xpWZU61>IaFtXf)LW(a`fO5)I-lh1N1PGV8+?B@$}4E>rO|AnIQOh;K9Rn zFh~*Ne}DoYh60{`61I;7l2t~>J9;5E^YDFL%jmP z_o|{wX|W$a8_St;Q+;9Y&DCpXw6gmdmFImG0l?rN}l0U%j<+xT4q>vE?a#3addzIF8T_<2ZJL@wT`V zgBQ8XLR)VQFhB|(1Yk0(3k0B7K=0|j7wqBr?!uO^G0=Z)5NvzdKb`5jEd~BCkGyvP zyY${61KNQF13|+IjkP;_duO%V)zNBv#fby{_44qb!XGH2ph0Kp#D6*|^l5&U&n6jH zu9atkQGF%KG~y*I&%}~sWQ>n#-idLAX7{dwgT0aEOsYr$j$=2>3ddvj2uyhC+{L?q zN5J)Np-i9{F96246AYCP5XxN*<)!uWOu`LNf9*r;yz{q2db=`crJ56a+ML__r^&o~%N zb^rvjc!UUDXbNpgpODnudB%-YRQmRYDv4Rlhu#pRV3??_wkb~0%TE@qPW zsv=+oDllfsGt#wF zn4CNl>{)f7MF_9FnP@}<;)j^uM}A-u4tAMz>hx(S7a{0km8B|31MvG#_>`uzxPUQc zGFwUkXzA0M!f+{udR2wJPC>-m+VO0i#E5Zv*TsPBX#IRWQ-2F@ASnA1LJtq5tBb8^ zR@&C|8OTL~^ldC1*sgXMNm@Zd0d0ElgEE`Wb6p@r=e2=b80-Wa&%&}CjR8Bsz=$KwcJ#;jC?%+(9>e024d1 z=BT35V2{k=2;<#SN}u!|CIGYp0Stvwye&ZI#o#4CUY}&0ahs{f^GM5z$iMm{7ZPHR z`5t>}Y;Hmlf(Sw3$}ibVgIqu`!FkJRsB@ZmO;kXRu+pQ}rs>NNJ1;LU{u8jMk!&a`b_S&FnsK%8@s4?R6D11g4s z;ilIC_*oH~b*VKj(YB3kC)^nw(5p$Eq+E1R_tIV2$qD6%+|A;ZMdJB}E9W`D__5nkjEG{|M(xUyJ>ch@EFUFW%&mSSVtJgW>$XC(9T`z0(CLW&d#N# z5}vd}_DLU3Z@9$H-EfI}3BuYblbV?DzSzyh#77URY9w)kc+#y8!d&sErA zPdP95Iyy%F4N*)Q2|(y=x_>>6q@WPYA6#X3sMB=2;oNn`{JbRHG`uV@_K`mG$^f%{ zG6mzd6y|nrT?%~ZmO^|5Bmok9OxxDW@{Vx)-`=}EkX*^0F+(5WEP_N5vdLsn{VFqk z&uI3Z%3+vsGmyqnmbIi;qOdmEKnh@N?|0EoB%&a!kpI)CC(vVWBV%4jC$GsS#+XT) zpoB6zkd4425}{nMv#cShw5z_vj?qn(MqvrfWNf-&a-<6r7%rINx@E!;sQY{a7-qo$ zlnJ<0^lAc$E~$ZXx*m0}7l2*>VO{8@rsD`T zga`yhOFULwR^xb{Wn59?U=9Zq|bRR;*MEzde-wL+L>g~`j( zoB((M^P^0`&_1A(md>^{P%|mew>uSBRN#|dwtee)qHmzOH)G+Bkz=JZ?zG1E2&5nu zMT<&MEl{@V!+6LC z->91Nfp&xR_A!agIs3@Wy4X!oZenaNTcfTR0~s5-#|D5S7-r?4Ww64#quhA+jiNHkQf5xVgs>lMKjm(KmimHRyKMNCGEV+)g~4rGnot?~w~aekf}8)-M-(1*;h-gxN6Jwx<8XY51Vkvx$0Xtv@-spz zyH2NSx9f^ErQ%0#VT4(a(8CJ2V4id-XECLw*Uvz7XF zhE4NY~*dmEe2O(iKH^a(UDGM)>Vw_7@w0tSrX$v|nDP>lN=jOk={7r?UO z!w$^StPw)qcr!O(&W`f=ddJ5wskz|2SnCOv5j#ZEySD?YI48~iK55L^5cV~CzBp$z3W+F;>F+=n2UKE zD3rnk0N2z7FF?)gi$kDS04$7$dFe>`En*DNjBeXVT65J*?;s@pl@t;JNf+T`ABTpY z&IJJqs!854e}YSjP!K18Q(TJOVSE%;nAk?Tzu={dF6njFg{0OI(yK#42+(bZoDM_i zr7m+w4Ys9J4CRXhgLe7I27%=bF_Eg7@HBl^i0SE?QJ@XTc zos78X84fJheZ`F3GaXni7VH&oz%2T#=~&@l9?!v{j_#_{LBM}j07BLSu_W7>9PBJ@ zj_6Pas%TsxPOQPBpA_Ej?5^F-iz8*0mI8GtX7VwBYf34tG0+wa#f*~lR0J$Yg<+U> zrq5sb)HZOT@P;I^eEc5USHL1WVWC_1xj(p9=6sWDBzQH+WhhP3k#wPjkRU(-o8m_^ zOqN^}vsnfRc)NMQ_?dk~00S8Bme1beiNy!epyjoeR(nvJ&fy=6CTN15Pyzw)0a0X| zOdj!D9PK`5lnn(Yw$}_lmU^QBUhbY|je!ZY#Q=Uf+#fVgx?oIa4Re8tDhY&gxrajA zAL03uF9Dm#!~4Zk-1y;=M5JqlSFijYfzKR_iJxbaNRmK`^#|eo@Gnyg^I8gm$mV}d zkKfYcNuUQk{s{z#LOU=-HLiO0Y%K;gyfCMnHk|RV^TbgK=!=ZH&)$89zll|e)!=08 z$p|n4-B$u=c@20e^i!I`3+J{N81h0-0XFXe0)F9dr;nr$38bKJ#YfkC5vc6JZP)NR16EC}D%Bd~QB;T2CFkN<$e09Y3xOh~V$;y+LjnkT9=vXST^+o*P@_2ilD|8%KJ4~v z$AGb~vwPD^!wK^ttvH^BAs8r;bQYn>{_Ph@U&rRZ#00Z<(bOJJkk?#1@uLOoIyU3j zJ@O)j(iYRYZGi~|CKNAE_VOSoP%7`GSG_0D6i)&HrgL z*s#EQMuqZ>mxqPQ7*3d2Fh`9EX~=1^B;607BSZeg50edj1(3llpR(GO4K#E&G#p3z zHil9#d_;L=Z~>QDTv}e$+Y*Sc2;c)yfGOjj_B)Bafd+!T<>hC}7aPOHKUYeS!fj-n zK>F!k5dspzXAb=v$G9;P3TOlP<_u#G@2O+QY7JWSs_FLQcCy%qa1x@IEQ>1)u)zJu zIpOZn9bmo8dVPgUr2G6sM`aAUJTxT#Ab4dJpyaphLy>)O%|eWUX7?Yn9z^3l#T7DO zUqjOkljde&Anr?R4Bmx$1Y-chESS#&6jiT)YWY3lvqfs6}1b+2RPGfL(0YW4}92PF6Bs))L$sV4OJZk`x@0 z$Ov$E>2cenxQoh@L8E`j?go*Il7I_m=7EfiWhTWVk~6Z4wTQ-RlqQ0SU%%Mx;k8K;8L zjx5RJDQ_?v&{>j{B)N0s*^sUQdzURUn`uKXhvW(+6md<$ZS|5 zzMbC0MzXVf){vxftF$lsTQVJu`H{{U2&$PSr0OB zflcH*N;~!S@exTblcXzB<$hYl%fqJ);Aa%4OJWil&g;=Z4=rt5cRC(VuQm8=hG6ap zmT+s<)di;)UAaV#POfWR-EA9|WwHBBY=JdLvtVP-y8ml7AV*{ZhZr*W(j}0Pt&Knh zeqR(RI`PqRV6yuF)$GD;a%6esowX_;Ju zZf?0(w#R?kPMRL8ebxvYu;3$R9|MbDGS~f~8VszflVUj$PznUpCaN8Jge~$VK+tr9 zAdnsE0rM2uP<;*A9jYm47anrOV`&ixaD;{t#0I^ zlukKl7}4${e|dI9bDp<_Wdd|NK%~^NL9iXmC_HuqidP;CB~Y&hq#rOZDH_>@H`F7> zbb3UCJ7$DmNq(b+Ad|5tj6lOUdkfHK>hh5Rm_R?VxKP)4G1T=IEJD}^^c2kC@$*+L zMRGhAo!xMA6DyMR?VSx3EVPt`Bn2rmb;ZvX<+pfwMG$mS63lEAj)3@3!1W!*^Ywgt z)eWjixD0?k5YY9YrU&VD*F$saKzER6_bm$xE_~zEsmp*4x;wN)i6RvJAF4Uz#K2jn zf7@7+ZDX@xXL%>Vo82_Kb^{?cA6u{Fp9^6F0NvxP*FgVV>q^0X6LGhaN*wtl=jrPhw01*kI z!4lT^Jm!&c?QiSfcBV&c4yxzsREGSP2>=sSKKK(9`3_-^a z2;3(}SOXFUN-RZk84@61hbGN4$aXM+Itm_jQS9nt+Cw5)U+R^>;O(z)(su?h6HE&Q z<6_JUT4pgXYx(fH<_avpSEQ(1xAgrZ*-k>>x~{S9C#_UV1WIc$2>MEJ%4vwtam$@9DQ8JB$$Y&)8fYKgpPixhcLL{g%+1WDY(pz0>Rqo z02Jc?4C7B@mywr8S?z52Y`c2uSXDMt@Xv|HZbDQQi4H~ z?otp!fbszoNy>={Yj$_s??fy@xyt& zemqD3XXAqFJ=Zy%uYY>QW*jHep=7yi^Ebvazz*1BT`&Phu77HJ&klm zAR}FfONgrql`F}4naFLxeN(r!zc`n*3RR;w$wmJ5TRgk>;wWG@5ONS;ar}WkiyO)& zfM7{T%Xub{V7&-lH5a81g8f?i$j#$RFt`}{ zlh)f0#JdG*p4d_hAJ(f>Jv~-0?B8eOgQ(u`_;qXq-0ZQ7*(Dq4@+{VMFG{_}JtU2E zrnwKJh(VQ%x>CZC(>qBtR|5@;(sujo^14ckg@zFaeqZ>s1c+CBY;Z$VI-pZ8J| z0G0=P+xJS&Uy+tpu7~^x$+NHLcb6@rUsk|H5t)CFXOkp3NhGF*+N^dnX|>x@D@_f2 ze#n^=9@p5j7pGyJIJpn3@7xW91`v=m5I`DVAt!KviBQ=H1SEh45b94zK*b7gAb>4d z;Q=ElicMT>nm)#R(`VGXIL9Qntn!Obnl#Wypc%*6jPw(!;gvDaw}uG-)Bv-T@_17( z0!UH?D?WuX<>?FO%&2YCyG@bU0!wVST~0u43B*E-J?R6x4No-n!Vad>aR$mN;0`mn-W zikUzG?*f#1=T(HH0>I!hOdo%Sj3~8v{Mu5y-0n5yOW6jFl9dOPB%vw^r4%(j*}JRf zRYPr2P!Z28N$!&v#v)~89{PSiYYf99AtBzM+5-1^N4W4Pw`aV7@ao7t6cDgk2{+C0 zy~6?77lIH7S3(ffG$tG%*Z~OX-!@+>LPv{xSx88QI(3?XjmK4<_3?{!*FZD&IO}+% zsWHIZx;2K0KMbV?O8G#80bD?Z)d5xS6~r+AgQ>?KvhmQN@Bhi&_RSlD8+PluKm%gs z6aM0L2c*a|joRXB%ih;Lj8Q}O^^1Dy)yDBORcgEK>l$g6R*^^6?xsgg z(1<*L^-BU{pWT&ix&h`w0Rx48sw1ULN^uR(b-fFHy9mjMH*uJ#kHD3W+ZB1&9QTUVWZ{dw80L9B970(tG+iQY!NmeoP)@tJkYU>%+` z9wagU;>`jA4X~ugoPZF3PlKQhyK*=CvJ4FLbqLskyq6SG%t?p@@r)|~<*y@O9X#Sq zOn{=;)!;JPXohoz0@eutbn{{ZH9!Gqe^6Wlb@>l6On|u!6+M9pbLc&$D|qz;5=@%3 zZMDJ6b+J697;EpVzPqJd4^^cy%9Z-?9kVXaK+FcO{6b8gibqcf<4T9^YS()EsVa4R z=f2LEzvDtfLnf~kUxpwETO-I4kbeEmX_pOf*$M?_5{+0%nTw$qYFv!z16n4y7@+V_Qx6tku~~{tnKGUoWYn=~ zeQZ=+?#0DRF9m(_N!ACgn?(2#UiTek#Y$&3rt7Km^FNi3@w6U>Xh5iR%j(Os`?*cG zQoR<&i% z8@;Pdt0G@PFBIG3>4)qYR|h`cw`v$Qeq;JSx3g|=;{?4N<$k(aZQ1f-%a#v{@+>Lj z%Ej%0F-=owW&J{)5#F>)LxaY6=gJj&Pm>;%ztF5c_p_a%BgV7vo24zAEN)owT@CW`z%PDNwD9@eINJT~18 zOj^oEUI0_$T>vn3!3zaS3lvRL5JdQ^= zIY2>G5WsYMkaa$D@rIy{ToND;m}q3fWQSvX;@^5~spH+AVy(PS-E|=JWbCFVO&=K> zj4{-BDg6vEp>&>u0bsUZpkJV!La%zPU)JY^!HLb?TJ;K?y=-6cYzrw`($YsCB#Atu z66K}yOO8vY>m}(cT-K2*Bx6kx#%J~MnYL|d_g%e;dIu6eo8^8q&w4N6LwW?rgq1)7 z-arFEY%&FDdIYY_HR(!|CG`dj*``TL#1N5E(g@`Pa#v)VVAg$MylJRY6nKM?J>!W* zAt2ox$H~ae39tHQgJD7`vj8sc%UFz|xRbf1grvLS|md8@JSIsgSPvV(` zvRT#@Ob-Zk$G9Bsh7qWdbUJ{F!S$}ay(6pu2WF9O0BRZnNvFwvflU(9%4|hKz*G7O zBgwX1-WfOD2e`AVPtk`=W=N?Niln=tyXo`#9Qh$!!z%;OdT$Y6E&$J`g<_zmf?iql zti{&T$Dgwtbu#rH5&93>LSqopiuC#@>slujRaBG=GSkd25`Bmn>APn;U7m1>XunjT3A022ZLft&(Kqfi)v7zEP@*vPRtoR?n$S<|Gk zMKBQ1pdraNffA{QBzj3fF}T*f%V{vwT;sxc)=Oh*6gDHA-Q9H@dmQID@>#gvVkQLx zg<|@~nhA3kZvk8%{(TC?!}IO;T{yI-ciWU=U@zPOg8^kn`j15G3XAZTD&j9w`LFT{ zW$$86;%zjrm0EddpFRA;YHi&L@~Q7%1h4?u5Ai0yDsr#F`tmRiE_ZpB zpybRTHi+hoLMqouI13+$<$0ORA060(>$eL6CXu|X*GdIL8laCrGcvoGeKA0PdIQBg zV*sEAXo0@ow6Xw5AXxD+EyLp-a=@6xdbjUuGGVuM5A1tIOH0yXFZ1R@P-E zO?7dv)q^p7V!O-SI?h#EtxiWU$(2BQ^wOC?5*_q(0GTu_-gn&mML;nW!6YD0Bjgl- zlO7LDvnqg)E%nDVN?It%)zyT6B2d$S50OzYreWC*i8qXnIzR}CEWhvbu?m&+*!0MR z3D7XQ6w`w7!mkc+fr6J}32XI0wn>EHP)t;`FWB<5c`>ov%%;4LJC zBzIU%E6Pd&Y#`@VUIsw|B1u39AgM%^(|w(1H9>ss8Ce5n{<9-B0Y82 zA;+_hTxmArk#3Cv`W)jjF?_`5lzySXd=OP$H~Uo>YtFPMb(BO) zd1diRf=*RQ6bWiJTU|@`Vy|Yim(ex0yil;k!HEg@xyoyIx6f|hI&3N1RMVuh;lAg( z2O%9Mb+1Pa_3JK-rW+V86fl6Pp?ol%TfjBoPG1NeN1h7*-bET4n;u&?j%vPtf%V9B{)u?fo@)Gpz|)ktpVD8 zD(dpLygVIqCsgzVDttokrNti4%$bY7|FIZyb0e2);DWagN%&+X(kIbnQA(9i!q({O zyBK|$*_zGx6?wirJn=Rce(Tm+p1!Wvr?foQrV1HVJbES<9b+4Ynr@tqVv>>*$cRl& zL}K6xYD6O{-Y-BJaySc|1dw1IBGUv=kHU};(!mB1{QaGm6vZK=)=l@ugmLOLyMQq* zD<3PBq7X8UCxZYC(###QHk*wPymMhBHKkDc%UgfuG0*^Lh`Gr9 zgL?c52@t>p9>R4myNs|1WUGcqgdLrFm^@pSHWLtF=2+ zxrSbvB;H3abwZ%CX39a2?w&7gLqH4>DeAAZrU-SNYeLe2d+P&073QC1z|tT=3GZew zyiiQe1k!@f#Bv<$qG5M7#50=OSC}c$^QF9A1Iz~c2r!Gl=esW~ugu$lF<|i0QYIKP zp;bVLRbllW=nFr6`T=kR<(^WF4A#`RrE)frR;0C%vyB z2GUR+-qzKJ_GuZy7TH0)gGmx%?KyV(O==hc!pe&GW-d|`|1z2c3QQBY-vPoF=|C_I zDjE_hXkw0@Y0UYTfrmuqWkPzcF`3d(4V`a9dj8xZtPE?@Jsumnfl1#}176<7ySo5j zO2G>NrBDhkKo3CZqURL`kH?<_*QlKv+xtIN1+GPF7gL##RGOM5co}nq{2e_^ci$Eyh!NEoN@EOq_sPBE$pvW$r!#~EQ`5Zr zj3fTh1Y1G?J0SRsiCr!>P45O(_~w-k!j@&dPgN?dq@n4to1Q?AFrjARrN&F?+ZHgC zPRb843m7OZKm|~Nud2`$UYZlH|1>s3$IF!s+k42andu{)u6EMdODATMYSy1J2cGh@pS@C5yn1_IWZD3PzhVQh)!^Sji^2-`5tGg_ z4FJOcAcXRW!<$eq!ay`Zlc0h^Ae6suevoa9+4Qm-b4NF{0g@4x^rWzm>-4c1CnEq2 zfB`;v@(}tAp}5|@j0J$=mb!1BBC1eT)v~soehv`O7;U}#jTSGsSoSa!*c-&sWl|Ow zP)cP~_R4*a`yQA64Ra1+5gYH4{LZP$FVz>%T}cRttq_~a#e9|r-F5h+5FYqX+z zn_LYT1bjtG2!Q83)a2|;2op@y?3dV=MRrAMd^BqS3O=-W0hjMk7ClKXFs0AbkN+Ut-tU|HuH&4;hPQhKEP^Dx zvcfuANT-Sl6_GB6zMARGX6(7UXjGHE+UhIQm+?;I4jO=tC=YFS+ww@OwP`?O^!~v{ z?_-efP*`ouUj*I4GSNyBRq6^TvUk11?CTH=qK9EZ&ch_i9}R|sbO|L7n3tT3+F{vF zJl`&UfC?BVc@@2SC@pS`k%_M0iZB3Ef@->lNSNPtNAe$%EZqr zTrN!<;`2JW0*lVEuK^UalEq3QR>)LPiKmD8IIRm?1Liq~c}!auCc%-Ktyapr-Sx4r zWsRkw`4t`H2N!8hXQdW2RSfT28M7X8dMG!CReK=oFbC`ZFyLa z;$pmRdi$I78TAQAB(nVKDJwSuKsP{h$DT{U7^rapm>4MZ&5J({t)YMylWi{$D!gs% zr)!@j_pdxYaVWqZJd`;Aoa=h!gFYld>gpo#s%K_T_D;=g7<+24S+&A!Ev1uid_D?G zd9|hEw(ZW7CCz{#Bw^yO3z$wYrUnc=g9{YA6l3_Q zLfP#-08~I0=4C%Zxy#+QR-3V4PwQ){U9m2cB&~p?N@S}hGPA|_HG2iNJi0LhHc8UN z2;hj&+LqOpRZ5|z28KE9!NN6qTaXx+`a;S1;gk+Mfi8^4wdrNoSM;H|@r)Hc<(CU&oDI!L^I`+W3zP{DWWo;_>H-wJ)c6So zHxy)-A%$XhI{q9+B~_cYO|8Kz8|pc2!NAdnMEZmk7U5JyCX_hk@22mB6N2fD;?`O} zrfsbiisKuOCY~|>`psiQNZTlyB+*z`viQV8-3sW6BjbT{-c2~|@FqqRG)X)(=Ad3# zA&nsXe*CeFY#>zAy|+|qS9kgZ8%L4fXH})}LXWc!oALN6sA(|(xO1V@BYlBsnSeVf z6qlACs(x_D3)db`Ka69N>u%CHVlJ=ji+ZqKfDMYYSWzCGln~_#hjSk8E*fBQa)-qU zEO+i{0}!6gvFp7Ze>LOvJ7>zC7<|B2{35KU2B()SFxRZ!5yDh$qSe*JSej&PGZHx9 z6Zx2F8ij@@8K9w%svZPl!e!#`fE3xm?m(Xvjz|2~caV6*<5(IIfswN^*w7OI(^;VJ zdm^Qus=VYQW55_n@t&ljJ7A?3@ZhJ@WgeX0=l`^Q(?q!fpYfY1c#n1nD@j(6Lc(*Z zXDwSx_0?Xq!*ZP(Qj3embu;OaHs~4RdM)Qf&G@S+z07k6)^JV|ak^Jz=mF5vJ(D~M zguK2M=hdA}b-9Nt8JhxizD z1kbwgv~5ohyK7%r(n43GL`Hdzf_c_mY(DA(@~lJZ?npoa3}w(sr)PAJAapGyLQ1Op7v)MRPFhBn7JVhSUOFd;)1@2Rj*tQb#c^>t zrE~aoye4&esC6usv{|dYL%<2A*TEPZ#SuP)*BpL28f;kATK$+LCJ8~p>yhVu_z0sT zDv!r$Vp5^(AgD?2m;{px??>W!IYl;gK?0n?9QfvyazjD`j6FFkO#>K10SU#t?CpWV z+ZZG*W%9%cr2?!#g;friGI;#Qhvh*M%I%o1HIYjeQ`e>+JktouV9VBC zG4C`$=ph620;Fbn3X2oxq?gw?^E7#>!-PW^1g8ah0DYASJ$gMLAb{{{B4&1J($sEN zTw0ps`aA%5UL0o_b#%xHn-t_Hs9R-69rTM}@;k_~O)xzy+eZYTQ~L+n{~sPS5av~O zk3HU>Nlk&8){9|M@NNO{0@UzPq4d+l2f*s0ZMn*d_*Hg>gNUOFOxo zS6CZ`SEDjp<&UrogntZ&iOZ?U8Rxhs9UQcXWgnpr5F$)S4;?+o%he5#i!gm0d3N1t z8tV|%{7rHp6C5*+&hQYVnxf4ankTQRqG6`Qkm&Jyf)i|N)BC_&{QTBKFo~6kr5A)A zUn>pA$+en^mx7m415m(FnDj$FwJ~o|pki-)PqozlvE(OYapazwr*UeSm@1Sd1>oIXcQcUG$hyt}2xxnS zT!92bKdEUxu6`cHB>0Js2geWNI5+?Vc7~PCLJF-4e*h3aWWw*j$B`Z5`U%cpS5vUT z+xU{_n^#Tl2D%x9hVeOkGwn1H4 z_NSqN4#vui zp?1f)p&RH?gG?aNb^#qdAY2F`mxhf+>#*N6s4*H0zLJL*4n91MkP{D@z|s!ZqGk;W z;nV&uWK5Pc?^zQMsz=>{T(Y94{FA;z1Cws%^+)hhm;ltc08D&c0oP?x^BlK8DFzjK z_&Gi?EyMWf1EUVcrf=FdY9ZUxFCJWDfTItIf)t1-F84fYaMEgKxmsg08e&Jjegws+Pauh9`D4XT5d(5_oW-#LV2*&P z0Za{0S^(Tne+%wY0^X;5eP02U1qCyGD+k2Mcve;5Vg|pw3T5?s<3i@o0g;Y%i$0JVFcxkR2m}#K7!h-=|94Dq@j&(GZ-11#x4M z3iwaF^>h;Ir@CTcY$Mgq7o@|EppI4Cksi*{(SLE{MFDdejStWv#`}6mC)e$rzowY5 ztqMg`wP=fIRrrA&QZf@0mTGa*NlVDquq2|`NB5LfAfxt(SH*gUl0~a{;bpG4 z0tGB7X%h)Wp8_QTY?<2-8TZs#(m&1%36E>LlMM*XdvGsXBxG7sb_&U{1LmJT0!|2) zLzv2`AAv~SDB3bke`aDW~rqn*u97a#v$RMFjl)I!TK4aZwjbzmGde0S85` zAjoC=sw7>MnA^a8^(EN?cKbl-?@iMa03nfP3|DXtv5{(>10!at#)mm;xLkybUw&v2 zge(zIEZXXPXPq^GLqvge1E~M)z`}d$$XCeFjDg0*>j790=QPg;9wPip!C{#lSAO|v zS$1&Z>raspWghCb!8EdU9|dt2S!xI*f4jAEB-h&QNCP{_*yE}OpTx}6*42gtv@}DGIxVe3>c5pZ< zhysVgF$U%GJ7f5S#5Pi3!|N6MT+(PxN=V#2DS2XBL)O!M@c3a}USN%Gs^ro3bhid==awJFnN- z_HemcnbN3p0>X zNk%2@UdylDK2i(}L3qL=Oyq}Fo+NWWDohmmb|28X~Mb~S{ubDMo z36j!$Qj7W#V`j9V`xD0sqDk}i4m|5?4d&_2jBl(ekJ&K#_Hv#wD?RGOKWCBd&kIs~ zfLz;(JDSwarkSz8AQ2$Mh|qXGc8H57d~5MvfTpL&?+;pD^tr2x+Q?`1xbulDsIZzE zPTisD*F9OgSmXTLhF++}8h#S@EIEmMRFv&211b)0?ff&g!74#Ur0bB+UGwiyMN`G4 z)vCk8+<*FD({5H$Y~P*7^fFrCYiG{q!(CX=S6!tChRY}3x>=LOyNest5Bky-p;^Xb zRcQ#3DHuSl0NX)m=1=?*J#-Ane8GiBWPodbs)l?Cd<>XvCGD6LPvzRzE4yISJ*M7S zs3iyi){6^PaUg2MMr7{X@-1*6_Tag4OHw!e$H4hQlm-dS)@GpTPyGv^1g9G z5(|2XGhF=6AtQG^!?MfD)Jgj*0ZXgU#M4(L*BL>q$qDvMYJ@EUPy3YDmvYI7)~kLv zO*C*G3EWW~ey|-u4fQ5B$lK`fuUI%(*8xP@&d{U7c%;YETy%wD-w8-jcbElP8q#3r z;5HF`vxRQ_Dyly6m_P5}&u>MinF0KK!&06erAc~hlG=aXf%fM}%P2Z3tb`M@M)alK zbN8J`FnWG3y8qrbC-(f4vy^%$HJvI%MW4MebJ}}$l!Wwa4_{+re`o&`FM;RYpO8TX z*H)TyhMk`=t632RG{Kd``!i>P3@iWl2JQdsXetpe$}elUv5GsQTjEUg13pk8ukJ|~ z!Em&K)SOeE>U}msiBG9?%}Tnn?znZq z1Tw2FLfU5JHwL~Z$Y1|$}q+-IN~&7e=yxK*@|@)vv@2h{B~*Zs$Zn>)xKV&d`Ot zCKC(y)YZ7R!GMG@ve~q&(GNG&O%_4sLRqH>;cY0+7{-C+WdHc|2_ao(X2R07MCg}(^p`ru+Q_-?x|FvfB)Mi zhZ^X~JmPru9bn|Kxm>b=bc!-SDzCkt*m2o0o zlT~gL2aVNwBg5L!Y6Kju>n&EdZxS76aA)#@uII;10jzfMAt6t+z5Y%{=t?)K4PMG- z-u^y%Cqb+tUH$Q_Y@55NxGU&t*n$`iHU=!sOTsLilx8n5T&|YN$7Te%p8$@0fi_Po#M20hj<#KfB05HI@7>f7j&d`ijF9 za(jTG?Psl@3x|FQVd{}L*Jx0YoW1xO%0Wh^b6mG9wWQZC9X+ST$KLP;ZKV|&YkBh$ zoyLDIzKrLOueMO*$*OjTDiM-`QW8Fb^{UB*d-q1^I-d8#NkN2MuhbP53?wR7PrcmZr9Pd~Yff0FevX#DV<2#DNXCFtra`Gs=* zb^a|#arDgewY`ATG3;Mc?=a}7es?iR`v>zi$VTm8#55l(dPd>ktc;068$d_2%@q}Cw{W7WUKBin;a$>?>;|X4lx_XO=N7OuS*ijqo_sLt?6* ziUsoyu3U)R%3lpc^VOjAxa+dpM% zhd5RB{)GJSiG!zK3iZKBt~e>s_(i` zKT6pf1zRy_EHHR|1#Mp*?U{+R0^uh|P!0HWeqfHIjFz3>d;85F8rPO` zG<%6WcogU7c^Wk>1}!Wo1})T?xfpQq`LZj-&tYw zHski@v*`W#k{&nTrhj!u`-ZPwBk>7>wPP?6sa@#5dAI5YbB5p|4gFJkWE2fx#|W_- zfn(+1YSjzEeVJhtDF#B0a~Z#`>WA59`9_}Ly>VLTkcBp^r4NyH2=IZdD&xr9h*vru zBJA(@coF^BUzFJ?X$1B2%b6dl8a21yTt(u1Mt!9w_v~mpmiVw&3eHP9NE?9TRa1m%Os$&=SaQa5y0{T%cAf`XL zDZlOvTK22O0h(UicN>Um+9mXKPEDd*@n_Gggi^^rR?b_r>W(^p<*_DxZELy9CcFzIN-laXGmB_b1)&xP9E+~*BBbD>m6b_9`3-ibzCWqtAemj=4m8vKiaEF6NCD_7t3D2hL4rz4eD?DIJ8U#n%WxfM!xWfPlB136h`kB@@4|?Md&Jdo z5k4xOY`{a0y~%k!)?SMhvM7+d4GR=H5%}xk*u=d|^!e!*H6vT5Hu}(vePe;2sp)T4 zV#nN>LlWUHB*a90Mp?we*|P(@dIX^FD&;7htlW@9oa>Z2qKw3-Htj-MxnC)X{Fib^ z_1fh-Xf29BVykk;@~mfs&az7L=A&=ipgReY1#u3NruDQFM5>D1NG7#N}I6BO6Hk_c9{O_ZmLb+pwyKwb?ch-rI z(?(y;L8ej|MYE59CMn6H){B9$+I+!QMsF%__pV-ItjUzH1_?3Ax1BRKq|_^9D`6nq z`W5Ca3$mAJ-YKb;c=C0iVdh?1j?{JyElz7?2ZW>5rI7)>nnnURJiB~?ZV~g*2Z4|U zw3KOKfCzuOrz7W{Dh-pPxP)H6CZImRN8A#71=I4-i{88swnC<~q^yQ09Fm`Skv-{6 zI)Od4l;g|_()*v*W@%KLb`Q#v*{vw?1rUnC4LG|2WMqEgdaWM)RMS!`GzOCwH9rnEL*A2C5W5tz) z%8|#-3asnN5yEX`O=<9xsiHtjh@e_Zw{U!j|>CPHm&pU0%rq@G8?* z5z7Qh&#(%gv(mRX=69^&p^Y*!IY#j1DACQaVDA>u1%Ew3604C27&Yt6bBTl8r95|2 zqk$^TcLM|-kVI~ADw~aGW!yE4>+d3GFMI@V-3u(XfIp& zO502_N_0n+)ok?<3ADn_fWi`wzQLzR0{g|og3#up6I|S{kOw)HM6<2KLc;`rPgi90 z72C6!aJp#$hjPxHIa~ya5D~VM4%pqTCYc<)QNB_Z`KOig!eZ!-X$JH9Q`VrcdC$Mk zRDKZ#kj2C%d9Iun-&^V1GlT+z3~!e^1Esn>3M{6UIZcD7^Ghj0C4|L%N9M_NoJjPQ z_>Xs80Uc#nW;~W}jx0>VgR4F(d~#pM*75q>f!n>|)oW=hvG)iyKn@gOCU|abeM?P} zbrv4_fkFeg^M3dt2CRo$RkKb@F|b zovezo{>OB#Bh=<6xzMojI?&$Kex2Qig9~X>!qj0&-YfgExX;xsRQwrqIC-Nm+(DH2 zn9sJ#)wf}bOQ+K|tRa*SCVImQeMSeg%o2MtVpV5k^>xwjB{5zd#>>WzaE0kePBlXh zBkJL|vjM;$M^jZ(hBc2?%?G&d2#Ev1#}drQf@*-jMZse9Se`SE_p}Zq;D9qc>_}|= zD{5p9n{HX`eY?9nvu&uIQPB_|QRMT6JNk!1sCA9oP|T45*Rx)s_F}&h+g@YLuE20$ zT%Pb(O^EG3)vUArwCTyLHT(8`;uSGZN1$RGav^}_IP`IOm&I#21$Zf(VWK7{0v9Be zQBFgnI2h%AB#5d6$lO2K`SNrfBZdL_fJP!tuZyCs7G?$Ge$dEbyloP4jyapVpO?(< zee`iybY7H~LX}3Tptd)I{2lD(s0nwXmb!wLr_~s>r zd!ub!W2Z5(E`UPbQC<-oiMP)Do3^6WlKulA+%#E{qC)u z>;8C&yIZ}h>-^WbjDk$iO8CI2YGuy2e612r?~S(u@AFswCA(Y0?8q=4Y8ptL)y!GmrMgim2n^2s5;s*QacaP_Zlp0^|zOpp3@14JNC5=_h z9St;|D~RkBkpU4&kXYSq(5t7&5h6`8(aJTbfC$?hSp5_< zbh|$;`}drIT$lJMNkwmjDrNidqwOUIjAFMr=d2J0(5VbE?;&S`pw~=|<0<&`RS{Ie zJAyM~Qb>R#$0T5MKgdVnBVn5*EsL4{@YPjpTQ9&`*9VDOhO zz`|YPfpYt&->b$`DR=0ye%F%MxDazV7cP*TmkB76M@XOrjA|`j(LKUl^nDnH&rD$H zu8EV9))>$5EktBVUrYRmW8k|95F1fbo;KWRyaX`XLy5O=^`mA80rw|;4AFUk0%Vs9c2$a z1?ni$I$RY#zP!vM2J{ohqnSxR{iM}89RvmIhG`K>e0s?G8Sap4j`|cTSH6sEQ5w0q zeN-4%HbJCHAn$HUclZ*YX=m`QYtvy4ZV4QAj?Z4bf&hd`qLMwm6fjQw|%Nei`+L*M3c`A_hF?=DvPYYd+3z&rnav0fWy zKChxJzn~JT5^9s>vwi9trD7ohsscc7UKBpjvET$Qi2g`2aA}>LecvWlPvskQZ#T1_ z04};{#w}01b&?~1D1B^{2Xqphzeqex!B9V9eUYi{_@a!=stGf$x?+$DW=L!xjDKRx zyd`yFQbP4i(XY89P(pjKeIqnv-sj?ntZvnd5(kzzYp%qtBRFV#6ly*ZdSVm!TEAOxD zp`b%L#Oh{StNGc*03mvC;y<`K%b>!6_7hgT8#})r^SQnU4=pETYy>dU>%C3U&3Dy( z-0c(~TMquMEILFep~GnHm8*SIxA|p`x!FDpsAUG=OB>#-)eK8tLT6f+$Ej=7PU94O zN`J)FITfo+NoMQtFiEw>EN8%vnI)9ZncBp8xs&ytCi*zL%yY!)~y@?H~Kct8c{8 z3rZLTEDp^rb}jUEHU$cbFm&{A-YDxhgd&Qt_3sSRZ-jYy8M!zd_IR3$cHY=)RNshH*fYRR($v~(Q^CNVhPhPJn_WIBhVe_%z4>@ zmJ!0$Uu(j+&sH=G^ z-8#bvkLR7lO(Fj4XB9|TL2KG+O$JDf#L&_3*xrVVNd*vkaGzt&JN=*CU3%sHc>JT*lWMKvN7PM02k(_D+; z&4Ig!#3arsuET%`6-8dk2Z_IY2f zdFPQO8+qAW`wzMGF&3+cd7tTSLHs~6&RN@b!7ZEwz1FYOMC2(p*6#8slH+93PCqP` znekIa*z+*zr9=e(D7{DOR^Gj}TcCs3eH>d}@XFRJhbr`X9f{uBZIUl%je96jK4Qfg%M&o zI*balIILPm**RVZO)}^iNt+14kexsqySJoG-t{)``2RHQlT5*`i$cLbt8s6Nopcfq z2aBGxunAU$uKyPjx!l}F{4Ep8~Cs!F}w-u&kV zrDvr)*u*5ocnAN$#N)83AN44nZA{KYswy?H|I|%NPe@={d7>x}03AmJydIr=1HmT) z3lHd1cOEM4cBCkN0**8?3{{~#cBl^?=`8N!?ZH1Jtcj`fXhP6hA|8nHRxw}EiPxSD zKNqUhK+K)yf&)4&jh9;qE%vuG@e~!8j&ql0zUmRks1-9lbePkj)S{Id53aa)mHMpP zTj?ArcfEf%eX>KV9`%`#H4^c^xfAYf*8^gH5q>j((H)R2ab|E|@vBBM^l`9C5ukn} zIq`7?^Ni_*0LB0hW_ciKD_%Vy(-yv7cfq~uAy45xz)U>%-qGiGc4B7Kj=DSU{zqe_ z;C)rnV4al!8Jq$J?3sbLBl>YFf+wXa^4{Y~k?rm`Yjv>;+E5-nC9D9j-WHCPF(6vC zoDmj7GgpnTHRs_Kj-uMt-S?O7C!)fsU*ynl^#I?Ux5j+!u53-{>7DO6Yc6>!uopJN zJrw4>e8&eXCk2?q`QDYfdqJEdsT=@4G!_n1L{Zw|z>YfbkcYv92&6AoMmU530?53N zx|Acx`Y{NS<+j3Wt~Jzq*TC+SW|N9pxb|*Pt-}i!nXC+ zx4Ka}=77Lv^aavohxCKn=E0y3t_HU>qr*9 zZg26~{_7DLhu5NJi#i&1djLv=Q!o_4<(&zJz987yJ>kuAcHZJz{McYgk&+KKq4G`j+|T;ziwe_9wITLY7X%x}UlpCz^>e zA10mI6-hvjP{e!3w^-rVNZjtkXlAuW%dai;o* z9&mF-rxrUo;lw;Ix8JM`)9k>JmDSVJ!#A!sW$?@%&=a=Yk1#|H+8gs)@me8m521?q zS4)AUX(Kmmh=db;o1l0g{excF_H5$zZ{icw#&071 z5;A43&|~Sz1x_=D7ttyETKdDXO2fO(DJeL74#y%P)pwK&Qr2KG9F0W05Xb30flWjH zSDp71KhX~WGadKlo~RdvU+E>RnS+Y@7Lp<*+^pK7@TS!rts4eyL@wm_#Wf$b%Ap_Q z+cNXr1SvaRo291;oQpm_Zw zzNbg*O4mMm3u%JwoZwqFN~m3ys}%TCMO=1P=hY@XG1N!OQF?t=L>r+ZEY{V#>l?E# zL^=9C&PtDr!^>}!Oo)!_65dtPvv*L*)R-?(>yWM`jZb6a6~y?g4m365=}e+W+L}z| zX2eh-h|2zQuAVk=IPs+}@`#J?^ajZc3$VuFhx6*C@Lqf^EM0q6`}{$><^e{Eg)?L+9s zqrTIcv%$5rhksQ|PB?9_Fy;7P+(mfm!4=zIlNG4LuvEnqR=we8E%|X2L}z=d)xU{` z$z@Bo*b+r|$XV)i9|a61rWYjPehPQ=vquhoWieJjI7Ik_HSnruxPDOmR68-n7C%>N z6d5>fn`Y&pjAmL!o!pIx}_UReHOA2*8~J5C(%DAJtQMy=^c?~&u%~oNUbt$ zV=(6Zea_BS_AFd(feyij!3H^wI{);-Jb|}^AAZpc^#71f*Y>(yKx6p>E%AXZiNd~> z16k!PFHI<^g-#h50`mUl7vJ&z`P2j;P6CYE&8WTA zO6R4T^LWC-g9}UOFgLHzBb5=wo_iGD?FdkYIhwJx6}q)#EAzW`_vFKcV`+9a)kTSj z=!K=<kTuisv10m1_swE_7$V95Ld4sn) zOg$Ga#~O2puCaEJPD%}a6$;sSkp{qj{dXojs7c>ha8BiHPl)S^WK%+us1x$8XZiDv z5`9!f$9Nsl+vgIzNu9&Cnm=AJ6IVoIDk&(*|KhAbz#lbV)Ny9V`HW7i^n1t&Mx_qF zI@(NIH1P=a8y>*&aW+Tps!!6j?b9+metjgCk z8L3)gq3g}h6EV#HS593oM#ei7utsUyv^`oDE=McKKmZ$_FDEAig2Mdu1@LAmH7^EgZJ*; z2&OXj!CH3}dX&EHB#%frop_f*|1Qrui6?>6@f^WgHZ$Ok;m zZgIsfp!`5Ld4y|Y*n4-A6gy{YuZ;&v@ibJ3sQzUcr+Iag;*UP@GL5F}A%`Ehi(i|P z8k^wbapnY`$_ystL~?`}Ci z_-S368Tf|9xX+SIrIo}DkjUHFSBulC?nwFaw)TZMO*t$uHp6f z&^7XGt`-jz+;i%l?}2~^+Jv*eNOR1saY#f2DB4xc?zkb(5VS@J zb-*F(a$vG>NoHWV-~{*YUn26N&s>lc&51b*;zr;34qdXInC<#bf@C!{C^U4pBSvv| z&ft&GNU1;j^$`HMA#ZiN#tC3j!J?~A)BmjS2c<+_DM{d@>|tkSF9;{HwU`K!l&OCF z=8^@mB+f80{?)=%4{^O-8C>LiUy<)LcY0$6>0f?N1nanwe7`>qWO{3oxcu_v_r6(I?Y9*jwdD9|&(BQD({mxv&B>{>^vWFdhxS=-sawOfy~|xw^vw}?+OmA1 zgG7TF$4ZT!V|_p6pNfNn+JAHBoiXWb(+rkz_;9_!yA)Xa7Z|si#Lq1AX|@> zw7#H?F%col4$W^;d-z3urPMA2ZwFh3S8#?Ot!q(_Jnehk$mjXB=qpDtgKT@d=IVI# zmqBLp8g1#7eg`1^beXneC&z#dHirB?a6vDJk=Hdot^%NgNahsGp%n^}=`RZnDgqJ$ zoFPF21DqS?NiAQYoSF`n8oiRdvfDW!7dfsEwDCWamB1pWnIItUP$?0a42}=n`H?IF}e?&REoNd_&Q2&PN4Jlm866u*G16aW?pXZzv!x3qY45L zju-|3klQ)?t*!$9a>2Yohu?U^x_B#!K+j;u$cF#~3<6OtCnyMqC+frfhuQ^}{)>zn zs{d47J`k-m<1a|j9rvtBJ7ps0ZT{VLezEkVlk?p9JCa_p)mI{_Z`W4HEP3=kZ=@^s z_fYUa22thY{y)dg6x9eL;G<_d=tN8yihKtNswh3C8x_Dpa%MN$B$+jI!})mng3Q61 zd5YnW;WoCnChfwzcZS70w;h7AI1%fM?ydhGGu)7qH=Xx|28>)nDl0s%I^e&V}F7b9Y1ijLZ7CDx7VtG74Jm zJ|KV)p3{c}jW4DiCKGWk_K6=PJXQCGdFNWv6?r)6@0NZG#3~KJouDw$Ck}-8w-*IK z%0cYMcyaapeK6aYd%7jtI)D}ZsE`z??COe%OB9?}>4@9BOguzBCxE>;Bd{T_8XeNu5exF?M z+x+C{M=#Bzel9z^B1QviZ__~SN@~Hx80KNo&-Mb7yeXEaUZVhGNDQ$s_6Z=-sTfu%Gn;j;#RlY z@NWmkPjd<%4n2#>iR??l6(9fkp!&CFe=OXzq$4Z>u1p2!woi4iAJdCmQV z^j1gvyx3%O4M|p1L~HA|J@%Z$$Ks<>2`i!`Niu<`z*SLKpqt)m#Qty>KdYPx>g{;- zF4c9#%3+Qb%@L|IJJ$t74{lq?{z5p z_2l#LlL{|XS$F>6G8GUMWnRCU3Cf1;$we5=S?K!N5F`yhEhexpVbjO$9VPJyJ;u4H zrEu@A>gHgq4;+bB=e&ySv~B0;yBd3o5aQ+%C{<%}OLPeSBr91qi>QOrtaW}oab1(i zuF%D0P2d1Z>GrvS@nDHqk*SfTTlD- znQ0SCeMZA`?tR~@@DwBtEu~aYpijl9Ca5a4rBUJtG%!i~uAeA20!*Uf_oT^qn(E+D z8I6ow8@|Zwdv|$@&%lIkIxAcHX>}H^UVZ0bf@=Er}KFl)%u~Ls6JS@xRzu51m@&u}= zY#>Q@ebI0P-T)fzvS;ABfMRKa#dHhR*3FRZlGn&?B0(S4d092sg6*cA6#`luyTctV z;>c=hxGZ^jTec!-ioT zj~9B;jJ$O~dUM%Ta;(D|IZn3G z0QDEKJ4WK==ObHc`6aV46TY*%Glj+SY|HHecOnW|lQQ>puv3Rah%$MaKocB+3HxJV zfxEGP0SQ_P?5{!r1~r#|38~^gg@oKM2x*|Qw9~!2mTjBA>o!l+Nh|y0c=FJI$yA*7 z5M;lZimarc?TKRL<+3AdlR$D3si*-da{zv;d6}aaA|&eb3$1(7bb5}Lv4Mwd43``) z4Jf)oI0v%>y|>CoXU_%y3-2#pbkCkB&q>Xx`*i>9M@5S!;N>40lWjuLd%4WdYZ>xm zG&T_XiT@?O0mhRHtN&h>4T(XtdWK7{yI@{2~9g=K-U@#=HW6Ty9DmI zBQx?M^6=;o*YqL|QC}kXIAXPC{&QlVx6;2;?P$MCFT0Z{Yhk__#Sh$LXF}QEgFm25 z$5l>8@pWCdc@#TDKt_y7x04w)ouk({ZS^-PbjN~s>3-M}snd+kpwA8+N ze~XqmKWs9djMtJ0Xb1$jLvI1m=7lgsYuVM*Fk}`9sI^> zxKj8=s17RLGN3IZcBxdJI*eR)%;Aw9yEtM*+nua*x!eynS-49OGh~AvWxuO6;V(nNX5*pRCrqiM5=@ezB5i$8O>%;QSh*;M z6#eYTAX4+$krTKm3-Ttm@=~2o6?gj!?`Q|zfT-(&ujl%ow-zFvJ^0QOJJlk zh5PnoKrH{G

)iia*MeiV$az9*uCLGwgF&;x@=XhrP$kXnuWsj^an(&a_Mpy>(= zF(v4Zr&HL%MRTgWtE|{l^S0b3_h}Kr zl8&8DSV1Obp$+MfnUH7ickhmm7zM z?`h18(4xQ-S{G7Q-_I`_6;d73)aJ_>*};N}GAHlxjIB<98C`z70207{2d)*6UP)9@ z!T6oW8VyNB>l&_L+>suDUR*rCs^`>-qtnLXX8OAEh<4)J6KAr2Y%8QYS~c!k{?3_~vI2O$aNVoSLj-{6IgzGdtP zg{J-R=Vr)f?G|RlwPL56{t*~jTmB}T;^fCevPc{SW4xsZcK79Rnb8G~tK}j-`Z1IhBC=v{me(!e%o--aJ6Lzj`BBUL#H4w_YZTaG*-(7x+#$2>ELDQ<XP=b$EGxo{&PBQ?udekqQah?PQI~hzc^OlQ(+vB7q`Oyj13u-OjjrteW1;8S?q% znM>e6E)pW)SS=^n%_K^p(8$Vzv7Mt|gTb~n-xmH&(mxj>N%r7t@}2scq!+oYnr)=! zTKJ7ui+ykNYV}g)bBsz*{F5DW4bL6uKA6kL(E>M)9z+mb)P#i9zB%?)K6^b2l zM1($Klr3p(G;kWKu{Yd^K>|h>#ZjTi1P}tGK@BNy>=|^G__FGL1I%=SjR%dFViL`8qrqNB1~FjH_8MzDdG^}L*bGF@BezS7l_7+ zXTnLtAa5)Uq=XF^nrBJL@n}9YhWdD5Q9a2B!ObFWR_%g-5@HZOerPx(muP1PPeWfG z2Zo@^9K~%=_Z#7Y<-+`c8Y+J1MgmDq;mz@V<${?XP5Wm!yE-s+VHjeb3NRj59|7)# zHU{zl_dtz-LkbcZA3lf*zy`WFzM{gZ+EcI_u{Ed8l5Vixm@m$}LsW>ZM)zPU$Tl|^{C?3=kxUpjfb%tHkaldX&NXdKjW0ijK%0D&IvS+H?9*eOlf+rY5X6?zB;I_=<7BK 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

}kO@&W!U(_D=AjuAo@lz$?TegMV=Q%BE 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�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�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 void } @@ -43,14 +57,7 @@ export function JoinRequest({setScreenState}: Props) { hasSession: false, }) - const isDarkMode = t.name !== 'light' - const background = gtMobile - ? isDarkMode - ? desktopDarkBg - : desktopLightBg - : isDarkMode - ? mobileDarkBg - : mobileLightBg + const background = getBackgroundImage(t.name, gtMobile) const joinLinkPreview = data?.joinLinkPreviews[0] From 8720d052421d17f2327b233e84222111b1c95c02 Mon Sep 17 00:00:00 2001 From: DS Boyce <260543580+ds-boyce@users.noreply.github.com> Date: Tue, 9 Jun 2026 23:47:13 -0700 Subject: [PATCH 141/149] Clear search term after adding chat member (#10831) --- src/components/dms/AddMembersFlow.tsx | 29 ++++++++++++---- src/components/dms/InitiateChatFlow.tsx | 44 +++++++++++++++++-------- 2 files changed, 53 insertions(+), 20 deletions(-) diff --git a/src/components/dms/AddMembersFlow.tsx b/src/components/dms/AddMembersFlow.tsx index 0c0b171e02..e7e831f9a9 100644 --- a/src/components/dms/AddMembersFlow.tsx +++ b/src/components/dms/AddMembersFlow.tsx @@ -67,6 +67,7 @@ type Item = LabelItem | ProfileItem | EmptyItem | PlaceholderItem | LoadingItem export type State = { groupChatDids: string[] groupChatProfiles: bsky.profile.AnyProfileView[] + searchText: string } export type Action = @@ -80,6 +81,10 @@ export type Action = groupChatDids: string[] groupChatProfiles: bsky.profile.AnyProfileView[] } + | { + type: 'setSearchText' + searchText: string + } function reducer(state: State, action: Action): State { switch (action.type) { @@ -88,6 +93,7 @@ function reducer(state: State, action: Action): State { ...state, groupChatDids: action.groupChatDids, groupChatProfiles: action.groupChatProfiles, + searchText: '', } } case 'removeDids': { @@ -97,6 +103,12 @@ function reducer(state: State, action: Action): State { groupChatProfiles: action.groupChatProfiles, } } + case 'setSearchText': { + return { + ...state, + searchText: action.searchText, + } + } } } @@ -121,11 +133,19 @@ export function AddMembersFlow({ const [headerHeight, setHeaderHeight] = useState(0) const [footerHeight, setFooterHeight] = useState(0) - const [searchText, setSearchText] = useState('') const listRef = useRef(null) const inputRef = useRef(null) + const [{groupChatDids, groupChatProfiles, searchText}, dispatch] = useReducer( + reducer, + { + groupChatDids: [], + groupChatProfiles: [], + searchText: '', + }, + ) + const { data: autocompleteResults, isError, @@ -151,11 +171,6 @@ export function AddMembersFlow({ ? Math.max(0, groupMemberLimit - memberListData.length) : undefined - const [{groupChatDids, groupChatProfiles}, dispatch] = useReducer(reducer, { - groupChatDids: [], - groupChatProfiles: [], - }) - const onRemoveDid = useCallback( (did: string) => { LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut) @@ -405,7 +420,7 @@ export function AddMembersFlow({ inputRef={inputRef} value={searchText} onChangeText={text => { - setSearchText(text) + dispatch({type: 'setSearchText', searchText: text}) listRef.current?.scrollToOffset({offset: 0, animated: false}) }} onEscape={control.close} diff --git a/src/components/dms/InitiateChatFlow.tsx b/src/components/dms/InitiateChatFlow.tsx index 5eb2ec3705..0c3adc450b 100644 --- a/src/components/dms/InitiateChatFlow.tsx +++ b/src/components/dms/InitiateChatFlow.tsx @@ -99,6 +99,7 @@ export type State = { groupChatDids: string[] groupChatProfiles: bsky.profile.AnyProfileView[] groupName: string + searchText: string } export type Action = @@ -132,6 +133,10 @@ export type Action = type: 'goBackFromGroupName' screenTitle: string } + | { + type: 'setSearchText' + searchText: string + } function reducer(state: State, action: Action): State { switch (action.type) { @@ -150,6 +155,7 @@ function reducer(state: State, action: Action): State { ...state, groupChatDids: action.groupChatDids, groupChatProfiles: action.groupChatProfiles, + searchText: '', } } case 'removeDids': { @@ -164,6 +170,7 @@ function reducer(state: State, action: Action): State { ...state, chatState: ChatState.GROUP_NAME, screenTitle: action.screenTitle, + searchText: '', } } case 'nameGroup': { @@ -180,6 +187,7 @@ function reducer(state: State, action: Action): State { groupChatDids: [], groupChatProfiles: [], groupName: '', + searchText: '', } } case 'goBackFromGroupName': { @@ -190,6 +198,12 @@ function reducer(state: State, action: Action): State { groupName: '', } } + case 'setSearchText': { + return { + ...state, + searchText: action.searchText, + } + } } } @@ -218,17 +232,15 @@ export function InitiateChatFlow({ const canCreateGroups = chatStatus?.canCreateGroups ?? true const groupMemberLimit = chatStatus?.groupMemberLimit - const [searchText, setSearchText] = useState('') - - const { - data: results, - isError, - isFetching, - } = useActorAutocompleteQuery(searchText, true, 12) - const {data: follows} = useProfileFollowsQuery(currentAccount?.did) - const [ - {chatState, screenTitle, groupChatDids, groupChatProfiles, groupName}, + { + chatState, + screenTitle, + groupChatDids, + groupChatProfiles, + groupName, + searchText, + }, dispatch, ] = useReducer(reducer, { chatState: ChatState.NEW_CHAT, @@ -236,8 +248,16 @@ export function InitiateChatFlow({ groupChatDids: [], groupChatProfiles: [], groupName: '', + searchText: '', }) + const { + data: results, + isError, + isFetching, + } = useActorAutocompleteQuery(searchText, true, 12) + const {data: follows} = useProfileFollowsQuery(currentAccount?.did) + const newGroupChatTitle = l`New group chat` const groupNameTitle = l`Group name` @@ -362,7 +382,6 @@ export function InitiateChatFlow({ case ChatState.NEW_GROUP_CHAT: LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut) dispatch({type: 'goBackFromNewGroupChat', screenTitle: title}) - setSearchText('') break case ChatState.GROUP_NAME: LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut) @@ -383,7 +402,6 @@ export function InitiateChatFlow({ const handlePressNext = useCallback(() => { LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut) dispatch({type: 'startNameGroup', screenTitle: groupNameTitle}) - setSearchText('') }, [groupNameTitle]) const handlePressConfirm = useCallback(() => { @@ -617,7 +635,7 @@ export function InitiateChatFlow({ inputRef={inputRef} value={searchText} onChangeText={text => { - setSearchText(text) + dispatch({type: 'setSearchText', searchText: text}) listRef.current?.scrollToOffset({offset: 0, animated: false}) }} onEscape={control.close} From d6a14ade543db26a0c16293f0627c8ae820b1889 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Wed, 10 Jun 2026 11:33:21 +0300 Subject: [PATCH 142/149] [Chat] revalidate join links on leave (#10833) --- .../intents/GroupChatJoinDialog.tsx | 8 ++++- src/state/queries/join-links.ts | 29 +++++++++++++++++++ .../queries/messages/leave-conversation.ts | 4 +++ .../queries/messages/list-conversations.tsx | 6 ++++ 4 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/components/intents/GroupChatJoinDialog.tsx b/src/components/intents/GroupChatJoinDialog.tsx index dd3d8cb6e8..e8b28e6abd 100644 --- a/src/components/intents/GroupChatJoinDialog.tsx +++ b/src/components/intents/GroupChatJoinDialog.tsx @@ -7,6 +7,7 @@ import { } from '@atproto/api' import {Trans, useLingui} from '@lingui/react/macro' import {useNavigation} from '@react-navigation/native' +import {useQueryClient} from '@tanstack/react-query' import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name' import {makeProfileLink} from '#/lib/routes/links' @@ -15,7 +16,10 @@ import {isNetworkError} from '#/lib/strings/errors' import {sanitizeHandle} from '#/lib/strings/handles' import {logger} from '#/logger' import {useModerationOpts} from '#/state/preferences/moderation-opts' -import {useJoinLinkPreviewsQuery} from '#/state/queries/join-links' +import { + invalidateJoinLinkPreviewsForCode, + useJoinLinkPreviewsQuery, +} from '#/state/queries/join-links' import {useRequestJoinGroupChat} from '#/state/queries/messages/request-join-group-chat' import {useWithdrawJoinGroupChatRequest} from '#/state/queries/messages/withdraw-join-group-chat' import {useSession} from '#/state/session' @@ -78,6 +82,7 @@ function GroupChatJoinDialogContent({code}: {code?: string}) { const {hasSession} = useSession() const moderationOpts = useModerationOpts() const navigation = useNavigation() + const queryClient = useQueryClient() const {data, error, isLoading} = useJoinLinkPreviewsQuery({ codes: code ? [code] : undefined, @@ -88,6 +93,7 @@ function GroupChatJoinDialogContent({code}: {code?: string}) { const {mutate: joinGroupChat, isPending: isJoinPending} = useRequestJoinGroupChat({ onSuccess: data => { + if (code) void invalidateJoinLinkPreviewsForCode(queryClient, code) switch (data.status) { case 'pending': control.close(() => { diff --git a/src/state/queries/join-links.ts b/src/state/queries/join-links.ts index 01e2d3fdf6..2381f467f4 100644 --- a/src/state/queries/join-links.ts +++ b/src/state/queries/join-links.ts @@ -76,6 +76,35 @@ export function invalidateJoinLinkPreviewsForCode( }) } +/** + * Invalidate any join link preview queries that resolved to the given convo. + * The code isn't always known to the viewer (e.g. when they're a regular + * member), so we match on the convoId carried by the resolved preview instead. + * Use this when the viewer's membership changes (e.g. they leave or are removed) + * so cached previews refetch and reflect their new viewer state. + */ +export function invalidateJoinLinkPreviewsForConvo( + queryClient: QueryClient, + convoId: string, +) { + return queryClient.invalidateQueries({ + predicate: query => { + const [root] = query.queryKey + if (root !== joinLinkPreviewQueryKeyRoot) return false + const data = query.state.data as + | ChatBskyGroupGetJoinLinkPreviews.OutputSchema + | undefined + return ( + data?.joinLinkPreviews.some( + preview => + ChatBskyGroupDefs.isJoinLinkPreviewView(preview) && + preview.convoId === convoId, + ) ?? false + ) + }, + }) +} + async function fetchJoinLinkPreviews({ agent, codes, diff --git a/src/state/queries/messages/leave-conversation.ts b/src/state/queries/messages/leave-conversation.ts index 620ce7ee2c..a9614981e5 100644 --- a/src/state/queries/messages/leave-conversation.ts +++ b/src/state/queries/messages/leave-conversation.ts @@ -11,6 +11,7 @@ import { import {DM_SERVICE_HEADERS} from '#/lib/constants' import {logger} from '#/logger' +import {invalidateJoinLinkPreviewsForConvo} from '#/state/queries/join-links' import {useAgent} from '#/state/session' import {RQKEY_ROOT as CONVO_LIST_KEY} from './list-conversations' @@ -72,6 +73,9 @@ export function useLeaveConvo( }, onSuccess: data => { void queryClient.invalidateQueries({queryKey: [CONVO_LIST_KEY]}) + if (convoId) { + void invalidateJoinLinkPreviewsForConvo(queryClient, convoId) + } onSuccess?.(data) }, onError: (error, _, context) => { diff --git a/src/state/queries/messages/list-conversations.tsx b/src/state/queries/messages/list-conversations.tsx index f7ad22fbae..9cb4e59603 100644 --- a/src/state/queries/messages/list-conversations.tsx +++ b/src/state/queries/messages/list-conversations.tsx @@ -18,6 +18,7 @@ import {DM_SERVICE_HEADERS} from '#/lib/constants' import {useCurrentConvoId} from '#/state/messages/current-convo-id' import {useMessagesEventBus} from '#/state/messages/events' import {useModerationOpts} from '#/state/preferences/moderation-opts' +import {invalidateJoinLinkPreviewsForConvo} from '#/state/queries/join-links' import {useAgent, useSession} from '#/state/session' import {parseConvoView} from '#/components/dms/util' import {useAgeAssurance} from '#/ageAssurance' @@ -257,6 +258,11 @@ export function ListConvosProviderInner({ debouncedRefetch() } else if (ChatBskyConvoDefs.isLogLeaveConvo(log)) { deleteConvoFromAllLists(log.convoId) + // The viewer is no longer in this convo (they left on another + // device, or were removed - removed members receive a + // logLeaveConvo, not a logRemoveMember). Refetch any cached join + // link preview so its viewer state reflects the lost membership. + void invalidateJoinLinkPreviewsForConvo(queryClient, log.convoId) } else if (ChatBskyConvoDefs.isLogDeleteMessage(log)) { updateConvoInAllLists(log.convoId, convo => { if ( From f321122656cfc37e859392b8cce4e5f4bd47d807 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Wed, 10 Jun 2026 11:55:03 +0300 Subject: [PATCH 143/149] use opus 4.8 in github claude (#10837) --- .github/workflows/claude.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml index df0d269666..7e4f9ca1bc 100644 --- a/.github/workflows/claude.yml +++ b/.github/workflows/claude.yml @@ -51,4 +51,4 @@ jobs: # NOTE(sfn): we can add a custom system prompt here claude_args: | - --model claude-opus-4-7 + --model claude-opus-4-8 From 9a2e636c174172f8d545951403f664bad4f50a0d Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Wed, 10 Jun 2026 11:58:16 +0300 Subject: [PATCH 144/149] Remove leave-convo suppression, use real optimistic update (#10834) Co-authored-by: Claude Fable 5 --- src/screens/Messages/ChatList.tsx | 12 +-- src/screens/Messages/Inbox.tsx | 7 +- .../queries/messages/leave-conversation.ts | 97 ++++++++----------- .../queries/messages/list-conversations.tsx | 9 +- 4 files changed, 48 insertions(+), 77 deletions(-) diff --git a/src/screens/Messages/ChatList.tsx b/src/screens/Messages/ChatList.tsx index f08d155e06..f2dff0c6d6 100644 --- a/src/screens/Messages/ChatList.tsx +++ b/src/screens/Messages/ChatList.tsx @@ -16,7 +16,6 @@ import {listenSoftReset} from '#/state/events' import {MESSAGE_SCREEN_POLL_INTERVAL} from '#/state/messages/convo/const' import {useMessagesEventBus} from '#/state/messages/events' import {useChatActorStatusQuery} from '#/state/queries/messages/get-status' -import {useLeftConvos} from '#/state/queries/messages/leave-conversation' import {useListConvosQuery} from '#/state/queries/messages/list-conversations' import {EmptyState} from '#/view/com/util/EmptyState' import {List, type ListRef} from '#/view/com/util/List' @@ -237,14 +236,9 @@ export function ChatList({ useRefreshOnFocus(refetch) useRefreshOnFocus(refetchInbox) - const leftConvos = useLeftConvos() - const conversations = useMemo(() => { if (data?.pages) { - const conversations = data.pages - .flatMap(page => page.convos) - // filter out convos that are actively being left - .filter(convo => !leftConvos.includes(convo.id)) + const conversations = data.pages.flatMap(page => page.convos) return conversations.map( convo => @@ -256,7 +250,7 @@ export function ChatList({ ) satisfies ListItem[] } return [] - }, [data, leftConvos, selectedChat]) + }, [data, selectedChat]) const onRefresh = useCallback(async () => { setIsPTRing(true) @@ -453,7 +447,6 @@ export function Header({ const {gtMobile} = useBreakpoints() const aa = useAgeAssurance() const requireEmailVerification = useRequireEmailVerification() - const leftConvos = useLeftConvos() const {isWithinSplitView} = useIsWithinSplitView() // In split view, the left column (and this header) stays mounted while the @@ -473,7 +466,6 @@ export function Header({ .flatMap(page => page.convos) .filter( convo => - !leftConvos.includes(convo.id) && !convo.muted && convo.members.every(member => member.handle !== 'missing.invalid') && (ChatBskyConvoDefs.isGroupConvo(convo.kind) diff --git a/src/screens/Messages/Inbox.tsx b/src/screens/Messages/Inbox.tsx index 60891c3c11..2fb58253a5 100644 --- a/src/screens/Messages/Inbox.tsx +++ b/src/screens/Messages/Inbox.tsx @@ -23,7 +23,6 @@ import {cleanError} from '#/lib/strings/errors' import {logger} from '#/logger' import {MESSAGE_SCREEN_POLL_INTERVAL} from '#/state/messages/convo/const' import {useMessagesEventBus} from '#/state/messages/events' -import {useLeftConvos} from '#/state/queries/messages/leave-conversation' import {useListConvoRequests} from '#/state/queries/messages/list-conversation-requests' import {useUpdateAllRead} from '#/state/queries/messages/update-all-read' import {EmptyState} from '#/view/com/util/EmptyState' @@ -70,16 +69,12 @@ export function MessagesInboxScreenInner({}: Props) { const listConvosQuery = useListConvoRequests() const {data} = listConvosQuery - const leftConvos = useLeftConvos() - const conversations = useMemo(() => { if (!data?.pages) return [] const items: RequestItem[] = [] for (const page of data.pages) { for (const item of page.requests) { if (ChatBskyConvoDefs.isConvoView(item)) { - // filter out convos that are actively being left - if (leftConvos.includes(item.id)) continue items.push({type: 'incoming', view: item}) } else if (ChatBskyGroupDefs.isJoinRequestConvoView(item)) { items.push({type: 'outgoing', view: item}) @@ -87,7 +82,7 @@ export function MessagesInboxScreenInner({}: Props) { } } return items - }, [data, leftConvos]) + }, [data]) const hasUnreadConvos = useMemo(() => { return conversations.some( diff --git a/src/state/queries/messages/leave-conversation.ts b/src/state/queries/messages/leave-conversation.ts index a9614981e5..51b51bde80 100644 --- a/src/state/queries/messages/leave-conversation.ts +++ b/src/state/queries/messages/leave-conversation.ts @@ -1,18 +1,18 @@ -import {useMemo} from 'react' import { type ChatBskyConvoLeaveConvo, type ChatBskyConvoListConvos, } from '@atproto/api' -import { - useMutation, - useMutationState, - useQueryClient, -} from '@tanstack/react-query' +import {useMutation, useQueryClient} from '@tanstack/react-query' import {DM_SERVICE_HEADERS} from '#/lib/constants' import {logger} from '#/logger' import {invalidateJoinLinkPreviewsForConvo} from '#/state/queries/join-links' import {useAgent} from '#/state/session' +import { + type ConvoRequestListQueryData, + optimisticDelete as optimisticDeleteRequest, + RQKEY_ROOT as REQUESTS_RQKEY_ROOT, +} from './list-conversation-requests' import {RQKEY_ROOT as CONVO_LIST_KEY} from './list-conversations' const RQKEY_ROOT = 'leave-convo' @@ -20,6 +20,11 @@ export function RQKEY(convoId: string | undefined) { return [RQKEY_ROOT, convoId] } +type ConvoListQueryData = { + pageParams: Array + pages: Array +} + export function useLeaveConvo( convoId: string | undefined, { @@ -48,31 +53,37 @@ export function useLeaveConvo( return data }, onMutate: () => { - let prevPages: ChatBskyConvoListConvos.OutputSchema[] = [] - queryClient.setQueryData( - [CONVO_LIST_KEY], - (old?: { - pageParams: Array - pages: Array - }) => { + const prevConvoListQueries = + queryClient.getQueriesData({ + queryKey: [CONVO_LIST_KEY], + }) + queryClient.setQueriesData( + {queryKey: [CONVO_LIST_KEY]}, + old => { if (!old) return old - prevPages = old.pages return { ...old, - pages: old.pages.map(page => { - return { - ...page, - convos: page.convos.filter(convo => convo.id !== convoId), - } - }), + pages: old.pages.map(page => ({ + ...page, + convos: page.convos.filter(convo => convo.id !== convoId), + })), } }, ) + const prevRequestsQueries = + queryClient.getQueriesData({ + queryKey: [REQUESTS_RQKEY_ROOT], + }) + queryClient.setQueriesData( + {queryKey: [REQUESTS_RQKEY_ROOT]}, + old => (convoId ? optimisticDeleteRequest(convoId, old) : old), + ) onMutate?.() - return {prevPages} + return {prevConvoListQueries, prevRequestsQueries} }, onSuccess: data => { void queryClient.invalidateQueries({queryKey: [CONVO_LIST_KEY]}) + void queryClient.invalidateQueries({queryKey: [REQUESTS_RQKEY_ROOT]}) if (convoId) { void invalidateJoinLinkPreviewsForConvo(queryClient, convoId) } @@ -80,41 +91,19 @@ export function useLeaveConvo( }, onError: (error, _, context) => { logger.error(error) - queryClient.setQueryData( - [CONVO_LIST_KEY], - (old?: { - pageParams: Array - pages: Array - }) => { - if (!old) return old - return { - ...old, - pages: context?.prevPages || old.pages, - } - }, - ) + if (context?.prevConvoListQueries) { + for (const [queryKey, prevData] of context.prevConvoListQueries) { + queryClient.setQueryData(queryKey, prevData) + } + } + if (context?.prevRequestsQueries) { + for (const [queryKey, prevData] of context.prevRequestsQueries) { + queryClient.setQueryData(queryKey, prevData) + } + } void queryClient.invalidateQueries({queryKey: [CONVO_LIST_KEY]}) + void queryClient.invalidateQueries({queryKey: [REQUESTS_RQKEY_ROOT]}) onError?.(error) }, }) } - -/** - * Gets currently pending and successful leave convo mutations - * - * @returns Array of `convoId` - */ -export function useLeftConvos() { - const pending = useMutationState({ - filters: {mutationKey: [RQKEY_ROOT], status: 'pending'}, - select: mutation => mutation.options.mutationKey?.[1] as string | undefined, - }) - const success = useMutationState({ - filters: {mutationKey: [RQKEY_ROOT], status: 'success'}, - select: mutation => mutation.options.mutationKey?.[1] as string | undefined, - }) - return useMemo( - () => [...pending, ...success].filter(id => id !== undefined), - [pending, success], - ) -} diff --git a/src/state/queries/messages/list-conversations.tsx b/src/state/queries/messages/list-conversations.tsx index 9cb4e59603..8072a4eaf6 100644 --- a/src/state/queries/messages/list-conversations.tsx +++ b/src/state/queries/messages/list-conversations.tsx @@ -25,7 +25,6 @@ import {useAgeAssurance} from '#/ageAssurance' import {type AgeAssuranceFlags} from '#/ageAssurance/types' import * as bsky from '#/types/bsky' import {RQKEY as CONVO_KEY} from './conversation' -import {useLeftConvos} from './leave-conversation' import { type ConvoRequestListQueryData, optimisticDelete as optimisticDeleteRequest, @@ -136,7 +135,6 @@ export function ListConvosProviderInner({ const queryClient = useQueryClient() const {currentConvoId} = useCurrentConvoId() const {currentAccount} = useSession() - const leftConvos = useLeftConvos() const debouncedRefetch = useMemo(() => { const refetchAndInvalidate = () => { @@ -664,15 +662,12 @@ export function ListConvosProviderInner({ ]) const ctx = useMemo(() => { - const convos = - data?.pages - .flatMap(page => page.convos) - .filter(convo => !leftConvos.includes(convo.id)) ?? [] + const convos = data?.pages.flatMap(page => page.convos) ?? [] return { accepted: convos.filter(conv => conv.status === 'accepted'), request: convos.filter(conv => conv.status === 'request'), } - }, [data, leftConvos]) + }, [data]) return ( From 7379ad3c3bd12f1d94ed805a65478b84d57c0a9b Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Wed, 10 Jun 2026 13:56:54 +0300 Subject: [PATCH 145/149] [Chat] Fix optimistic updates by using partial keys (#10838) Co-authored-by: Claude Fable 5 --- .../queries/messages/accept-conversation.ts | 137 +++++++----------- .../queries/messages/list-conversations.tsx | 128 +++++++++++++--- src/state/queries/messages/update-all-read.ts | 69 ++++----- 3 files changed, 191 insertions(+), 143 deletions(-) diff --git a/src/state/queries/messages/accept-conversation.ts b/src/state/queries/messages/accept-conversation.ts index 6f1b3d272b..668c7decc3 100644 --- a/src/state/queries/messages/accept-conversation.ts +++ b/src/state/queries/messages/accept-conversation.ts @@ -1,6 +1,6 @@ import { type ChatBskyConvoAcceptConvo, - type ChatBskyConvoListConvos, + type ChatBskyConvoDefs, } from '@atproto/api' import {useMutation, useQueryClient} from '@tanstack/react-query' @@ -13,7 +13,11 @@ import { RQKEY_ROOT as REQUESTS_RQKEY_ROOT, } from './list-conversation-requests' import { - RQKEY as CONVO_LIST_KEY, + type ConvoListQueryData, + convoListQueryPredicate, + getConvoFromQueryData, + optimisticDelete, + RQKEY_PARTIAL as CONVO_LIST_PARTIAL_KEY, RQKEY_ROOT as CONVO_LIST_ROOT_KEY, } from './list-conversations' @@ -42,65 +46,49 @@ export function useAcceptConversation( return data }, onMutate: () => { - let prevAcceptedPages: ChatBskyConvoListConvos.OutputSchema[] = [] - let prevInboxPages: ChatBskyConvoListConvos.OutputSchema[] = [] - let convoBeingAccepted: - | ChatBskyConvoListConvos.OutputSchema['convos'][number] - | undefined - queryClient.setQueryData( - CONVO_LIST_KEY('request'), - (old?: { - pageParams: Array - pages: Array - }) => { - if (!old) return old - prevInboxPages = old.pages - return { - ...old, - pages: old.pages.map(page => { - const found = page.convos.find(convo => convo.id === convoId) - if (found) { - convoBeingAccepted = found - return { - ...page, - convos: page.convos.filter(convo => convo.id !== convoId), - } - } - return page - }), - } - }, + // snapshot every convo-list cache up front so onError can restore them + // all by their exact keys + const prevConvoListQueries = + queryClient.getQueriesData({ + queryKey: [CONVO_LIST_ROOT_KEY], + }) + let convoBeingAccepted: ChatBskyConvoDefs.ConvoView | null = null + for (const [_key, data] of queryClient.getQueriesData( + {queryKey: CONVO_LIST_PARTIAL_KEY('request')}, + )) { + if (!data) continue + convoBeingAccepted = getConvoFromQueryData(convoId, data) + if (convoBeingAccepted) break + } + queryClient.setQueriesData( + {queryKey: CONVO_LIST_PARTIAL_KEY('request')}, + (old?: ConvoListQueryData) => optimisticDelete(convoId, old), ) - queryClient.setQueryData( - CONVO_LIST_KEY('accepted'), - (old?: { - pageParams: Array - pages: Array - }) => { - if (!old) return old - prevAcceptedPages = old.pages - if (convoBeingAccepted) { + if (convoBeingAccepted) { + const acceptedConvo: ChatBskyConvoDefs.ConvoView = { + ...convoBeingAccepted, + status: 'accepted', + } + queryClient.setQueriesData( + { + queryKey: CONVO_LIST_PARTIAL_KEY('accepted'), + predicate: convoListQueryPredicate(acceptedConvo), + }, + (old?: ConvoListQueryData) => { + if (!old) return old return { ...old, - pages: [ - { - ...old.pages[0], - convos: [ - { - ...convoBeingAccepted, - status: 'accepted', - }, - ...old.pages[0].convos, - ], - }, - ...old.pages.slice(1), - ], + pages: old.pages.map((page, i) => { + const convos = page.convos.filter(c => c.id !== convoId) + if (i === 0) { + return {...page, convos: [acceptedConvo, ...convos]} + } + return {...page, convos} + }), } - } else { - return old - } - }, - ) + }, + ) + } const prevRequestsQueries = queryClient.getQueriesData({ queryKey: [REQUESTS_RQKEY_ROOT], @@ -110,41 +98,20 @@ export function useAcceptConversation( old => optimisticDeleteRequest(convoId, old), ) onMutate?.() - return {prevAcceptedPages, prevInboxPages, prevRequestsQueries} + return {prevConvoListQueries, prevRequestsQueries} }, onSuccess: data => { - void queryClient.invalidateQueries({queryKey: [CONVO_LIST_KEY]}) + void queryClient.invalidateQueries({queryKey: [CONVO_LIST_ROOT_KEY]}) void queryClient.invalidateQueries({queryKey: [REQUESTS_RQKEY_ROOT]}) onSuccess?.(data) }, onError: (error, _, context) => { logger.error(error) - queryClient.setQueryData( - CONVO_LIST_KEY('accepted'), - (old?: { - pageParams: Array - pages: Array - }) => { - if (!old) return old - return { - ...old, - pages: context?.prevAcceptedPages || old.pages, - } - }, - ) - queryClient.setQueryData( - CONVO_LIST_KEY('request'), - (old?: { - pageParams: Array - pages: Array - }) => { - if (!old) return old - return { - ...old, - pages: context?.prevInboxPages || old.pages, - } - }, - ) + if (context?.prevConvoListQueries) { + for (const [queryKey, prevData] of context.prevConvoListQueries) { + queryClient.setQueryData(queryKey, prevData) + } + } if (context?.prevRequestsQueries) { for (const [queryKey, prevData] of context.prevRequestsQueries) { queryClient.setQueryData(queryKey, prevData) diff --git a/src/state/queries/messages/list-conversations.tsx b/src/state/queries/messages/list-conversations.tsx index 8072a4eaf6..3f3dfdb9c4 100644 --- a/src/state/queries/messages/list-conversations.tsx +++ b/src/state/queries/messages/list-conversations.tsx @@ -8,7 +8,9 @@ import { } from '@atproto/api' import { type InfiniteData, + type Query, type QueryClient, + type QueryKey, useInfiniteQuery, useQueryClient, } from '@tanstack/react-query' @@ -48,7 +50,60 @@ export const RQKEY = ( | 'locked-permanently' | undefined = undefined, limit?: number, -) => [RQKEY_ROOT, status, readState, kind, lockStatus, limit] +) => [RQKEY_ROOT, status, readState, kind, lockStatus, limit] as const + +/** + * Prefix key matching every convo-list query with the given status (and + * optionally readState), regardless of the remaining params (kind, + * lockStatus, limit). Only valid with prefix-matching APIs (setQueriesData, + * getQueriesData, invalidateQueries) - exact-match APIs (getQueryData, + * setQueryData) hash the full key and will never match a prefix. + */ +export const RQKEY_PARTIAL = ( + status: 'accepted' | 'request' | 'all', + readState?: 'all' | 'unread', +) => (readState ? [RQKEY_ROOT, status, readState] : [RQKEY_ROOT, status]) + +/** + * Whether a convo satisfies the filters encoded in a convo-list query key. + * Caches are server-filtered, so optimistic inserts must apply the same + * filters client-side or convos leak into lists that should exclude them. + */ +export function convoMatchesQueryKey( + convo: ChatBskyConvoDefs.ConvoView, + queryKey: QueryKey, +): boolean { + const [, status, readState, kind, lockStatus] = queryKey as ReturnType< + typeof RQKEY + > + if (status !== 'all' && status !== convo.status) return false + if (readState === 'unread' && convo.unreadCount === 0) return false + if (ChatBskyConvoDefs.isGroupConvo(convo.kind)) { + if (kind === 'direct') return false + if (lockStatus && convo.kind.lockStatus !== lockStatus) return false + } else { + if (kind === 'group') return false + // direct convos are never locked + if (lockStatus && lockStatus !== 'unlocked') return false + } + return true +} + +/** + * Query predicate for optimistically upserting a convo into convo-list + * caches. Targets caches whose filters the convo satisfies, plus caches the + * convo is already in - those get updated in place even if the convo no + * longer matches (e.g. unreadCount dropped to 0), mirroring how read/mute + * log events update convos in place everywhere. + */ +export function convoListQueryPredicate(convo: ChatBskyConvoDefs.ConvoView) { + return (query: Query): boolean => { + const data = query.state.data as ConvoListQueryData | undefined + if (data && getConvoFromQueryData(convo.id, data)) return true + return convoMatchesQueryKey(convo, query.queryKey) + } +} + type RQPageParam = string | undefined export function useListConvosQuery({ @@ -347,9 +402,12 @@ export function ListConvosProviderInner({ }), } } - // always update the unread one + // always update the unread ones, where the convo qualifies queryClient.setQueriesData( - {queryKey: RQKEY('all', 'unread')}, + { + queryKey: RQKEY_PARTIAL('all', 'unread'), + predicate: convoListQueryPredicate(updatedConvo), + }, (old?: ConvoListQueryData) => old ? updateFn(old) @@ -361,11 +419,20 @@ export function ListConvosProviderInner({ // update the other ones based on status of the incoming message if (updatedConvo.status === 'accepted') { queryClient.setQueriesData( - {queryKey: RQKEY('accepted')}, + { + queryKey: RQKEY_PARTIAL('accepted'), + predicate: convoListQueryPredicate(updatedConvo), + }, updateFn, ) } else if (updatedConvo.status === 'request') { - queryClient.setQueriesData({queryKey: RQKEY('request')}, updateFn) + queryClient.setQueriesData( + { + queryKey: RQKEY_PARTIAL('request'), + predicate: convoListQueryPredicate(updatedConvo), + }, + updateFn, + ) // also move-to-top in the new requests cache queryClient.setQueriesData( {queryKey: [REQUESTS_RQKEY_ROOT]}, @@ -385,20 +452,26 @@ export function ListConvosProviderInner({ rev: log.rev, })) } else if (ChatBskyConvoDefs.isLogAcceptConvo(log)) { - const requests = queryClient.getQueryData( - RQKEY('request'), - ) - if (!requests) { + const requestQueries = + queryClient.getQueriesData({ + queryKey: RQKEY_PARTIAL('request'), + }) + let foundConvo: ChatBskyConvoDefs.ConvoView | null = null + for (const [_key, data] of requestQueries) { + if (!data) continue + foundConvo = getConvoFromQueryData(log.convoId, data) + if (foundConvo) break + } + if (!foundConvo) { debouncedRefetch() return } - const acceptedConvo = getConvoFromQueryData(log.convoId, requests) - if (!acceptedConvo) { - debouncedRefetch() - return + const acceptedConvo: ChatBskyConvoDefs.ConvoView = { + ...foundConvo, + status: 'accepted', } - queryClient.setQueryData( - RQKEY('request'), + queryClient.setQueriesData( + {queryKey: RQKEY_PARTIAL('request')}, (old?: ConvoListQueryData) => optimisticDelete(log.convoId, old), ) // also remove from the new requests cache @@ -407,7 +480,10 @@ export function ListConvosProviderInner({ old => optimisticDeleteRequest(log.convoId, old), ) queryClient.setQueriesData( - {queryKey: RQKEY('accepted')}, + { + queryKey: RQKEY_PARTIAL('accepted'), + predicate: convoListQueryPredicate(acceptedConvo), + }, (old?: ConvoListQueryData) => { if (!old) { debouncedRefetch() @@ -420,12 +496,15 @@ export function ListConvosProviderInner({ return { ...page, convos: [ - {...acceptedConvo, status: 'accepted'}, - ...page.convos, + acceptedConvo, + ...page.convos.filter(c => c.id !== log.convoId), ], } } - return page + return { + ...page, + convos: page.convos.filter(c => c.id !== log.convoId), + } }), } }, @@ -723,7 +802,14 @@ export function useUnreadMessageCount() { hasNew: false, } } - }, [accepted, request, currentAccount?.did, currentConvoId, moderationOpts]) + }, [ + accepted, + request, + currentAccount?.did, + currentConvoId, + moderationOpts, + aa.flags, + ]) } function calculateCount( @@ -911,7 +997,7 @@ function addMemberToConvoView( } } -function optimisticDelete(chatId: string, old?: ConvoListQueryData) { +export function optimisticDelete(chatId: string, old?: ConvoListQueryData) { if (!old) return old return { diff --git a/src/state/queries/messages/update-all-read.ts b/src/state/queries/messages/update-all-read.ts index 79173362dc..a6a7f45741 100644 --- a/src/state/queries/messages/update-all-read.ts +++ b/src/state/queries/messages/update-all-read.ts @@ -1,4 +1,3 @@ -import {type ChatBskyConvoListConvos} from '@atproto/api' import {useMutation, useQueryClient} from '@tanstack/react-query' import {DM_SERVICE_HEADERS} from '#/lib/constants' @@ -9,7 +8,11 @@ import { markAllRead as markAllRequestsRead, RQKEY_ROOT as REQUESTS_RQKEY_ROOT, } from './list-conversation-requests' -import {RQKEY as CONVO_LIST_KEY} from './list-conversations' +import { + type ConvoListQueryData, + RQKEY_PARTIAL as CONVO_LIST_PARTIAL_KEY, + RQKEY_ROOT as CONVO_LIST_ROOT_KEY, +} from './list-conversations' export function useUpdateAllRead( status: 'accepted' | 'request', @@ -36,18 +39,19 @@ export function useUpdateAllRead( return data }, onMutate: () => { - let prevPages: ChatBskyConvoListConvos.OutputSchema[] = [] + // snapshot every convo-list cache up front so onError can restore them + // all by their exact keys + const prevConvoListQueries = + queryClient.getQueriesData({ + queryKey: [CONVO_LIST_ROOT_KEY], + }) let prevRequestsQueries: Array< [readonly unknown[], ConvoRequestListQueryData | undefined] > = [] - queryClient.setQueryData( - CONVO_LIST_KEY(status), - (old?: { - pageParams: Array - pages: Array - }) => { + queryClient.setQueriesData( + {queryKey: CONVO_LIST_PARTIAL_KEY(status)}, + (old?: ConvoListQueryData) => { if (!old) return old - prevPages = old.pages return { ...old, pages: old.pages.map(page => { @@ -64,13 +68,10 @@ export function useUpdateAllRead( } }, ) - // remove unread convos from the badge query - queryClient.setQueryData( - CONVO_LIST_KEY('all', 'unread'), - (old?: { - pageParams: Array - pages: Array - }) => { + // remove unread convos from the badge queries + queryClient.setQueriesData( + {queryKey: CONVO_LIST_PARTIAL_KEY('all', 'unread')}, + (old?: ConvoListQueryData) => { if (!old) return old return { ...old, @@ -94,10 +95,15 @@ export function useUpdateAllRead( ) } onMutate?.() - return {prevPages, prevRequestsQueries} + return {prevConvoListQueries, prevRequestsQueries} }, onSuccess: () => { - void queryClient.invalidateQueries({queryKey: CONVO_LIST_KEY(status)}) + void queryClient.invalidateQueries({ + queryKey: CONVO_LIST_PARTIAL_KEY(status), + }) + void queryClient.invalidateQueries({ + queryKey: CONVO_LIST_PARTIAL_KEY('all', 'unread'), + }) if (status === 'request') { void queryClient.invalidateQueries({queryKey: [REQUESTS_RQKEY_ROOT]}) } @@ -105,28 +111,17 @@ export function useUpdateAllRead( }, onError: (error, _, context) => { logger.error(error) - queryClient.setQueryData( - CONVO_LIST_KEY(status), - (old?: { - pageParams: Array - pages: Array - }) => { - if (!old) return old - return { - ...old, - pages: context?.prevPages || old.pages, - } - }, - ) - if (status === 'request' && context?.prevRequestsQueries) { + if (context?.prevConvoListQueries) { + for (const [queryKey, prevData] of context.prevConvoListQueries) { + queryClient.setQueryData(queryKey, prevData) + } + } + if (context?.prevRequestsQueries) { for (const [queryKey, prevData] of context.prevRequestsQueries) { queryClient.setQueryData(queryKey, prevData) } } - void queryClient.invalidateQueries({queryKey: CONVO_LIST_KEY(status)}) - void queryClient.invalidateQueries({ - queryKey: CONVO_LIST_KEY('all', 'unread'), - }) + void queryClient.invalidateQueries({queryKey: [CONVO_LIST_ROOT_KEY]}) if (status === 'request') { void queryClient.invalidateQueries({queryKey: [REQUESTS_RQKEY_ROOT]}) } From 17ff9af200ccb8816d9de45c6c73cdd2c30091de Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Wed, 10 Jun 2026 16:38:31 +0300 Subject: [PATCH 146/149] [Chat] Some tweaks (#10840) --- src/components/dms/MessageItem.tsx | 28 +++++++------------ .../Messages/components/MessagesList.tsx | 8 +++++- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/src/components/dms/MessageItem.tsx b/src/components/dms/MessageItem.tsx index 6cfec62df0..490bab0e89 100644 --- a/src/components/dms/MessageItem.tsx +++ b/src/components/dms/MessageItem.tsx @@ -21,6 +21,7 @@ import { type ChatBskyActorDefs, ChatBskyConvoDefs, ChatBskyEmbedJoinLink, + moderateProfile, RichText as RichTextAPI, } from '@atproto/api' import {plural} from '@lingui/core/macro' @@ -29,7 +30,6 @@ import {useQueryClient} from '@tanstack/react-query' import {isBlockedOrBlocking} from '#/lib/moderation/blocked-and-muted' import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name' -import {makeProfileLink} from '#/lib/routes/links' import {sanitizeHandle} from '#/lib/strings/handles' import {useMaybeProfileShadow} from '#/state/cache/profile-shadow' import {type Shadow} from '#/state/cache/types' @@ -38,12 +38,13 @@ import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useProfileBlockMutationQueue} from '#/state/queries/profile' import {unstableCacheProfileView} from '#/state/queries/unstable-profile-cache' import {useSession} from '#/state/session' +import {PreviewableUserAvatar} from '#/view/com/util/UserAvatar' import {atoms as a, native, platform, useTheme} from '#/alf' import {isOnlyEmoji} from '#/alf/typography' import {Button} from '#/components/Button' import {ActionsWrapper} from '#/components/dms/ActionsWrapper' import {useMessageDialogs} from '#/components/dms/MessageOverlays' -import {InlineLinkText, Link} from '#/components/Link' +import {InlineLinkText} from '#/components/Link' import * as ProfileCard from '#/components/ProfileCard' import * as Prompt from '#/components/Prompt' import {RichText} from '#/components/RichText' @@ -227,22 +228,13 @@ let MessageItem = ({ const avatar = profile && moderationOpts ? ( - unstableCacheProfileView(queryClient, profile)}> - - + unstableCacheProfileView(queryClient, profile)} + moderation={moderateProfile(profile, moderationOpts).ui('avatar')} + /> ) : ( ) diff --git a/src/screens/Messages/components/MessagesList.tsx b/src/screens/Messages/components/MessagesList.tsx index 599b928337..8c3e2981aa 100644 --- a/src/screens/Messages/components/MessagesList.tsx +++ b/src/screens/Messages/components/MessagesList.tsx @@ -308,7 +308,13 @@ export function MessagesList({ } else { flatListRef.current?.scrollToOffset({ offset: height, - animated: hasScrolled && height > prevContentHeight.current, + // only animate when new items were appended - pure layout growth + // (e.g. the composer spacer getting its height on web) should + // snap instantly rather than visibly scrolling + animated: + hasScrolled && + height > prevContentHeight.current && + renderItems.length > prevItemCount.current, }) } } From 8b4a5238bed7e9282386846069a298cdf2483a1d Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Wed, 10 Jun 2026 10:16:58 -0500 Subject: [PATCH 147/149] [Chat] Sync convo agent with shadow cache (#10827) Co-authored-by: Claude Opus 4.8 (1M context) Co-authored-by: DS Boyce <260543580+ds-boyce@users.noreply.github.com> Co-authored-by: Samuel Newman --- src/components/AvatarBubbles.tsx | 31 ++--- .../PostControls/ShareMenu/RecentChats.tsx | 6 +- .../dialogs/SearchablePeopleList.tsx | 6 +- src/components/dms/MessagesListHeader.tsx | 10 +- .../Messages/ConversationSettings/index.tsx | 5 +- .../Messages/components/ChatListItem.tsx | 1 - .../components/MessagesListGroupInfoPanel.tsx | 6 +- .../components/OutgoingRequestListItem.tsx | 4 - src/state/cache/profile-shadow.ts | 54 +++++++- src/state/messages/convo/agent.ts | 122 +++++++++++++++++- src/state/queries/messages/get-status.ts | 4 +- src/state/queries/profile.ts | 4 + 12 files changed, 195 insertions(+), 58 deletions(-) diff --git a/src/components/AvatarBubbles.tsx b/src/components/AvatarBubbles.tsx index 2f3fb8b15d..894e1f34f5 100644 --- a/src/components/AvatarBubbles.tsx +++ b/src/components/AvatarBubbles.tsx @@ -1,4 +1,4 @@ -import {useEffect, useMemo} from 'react' +import {useEffect} from 'react' import {View} from 'react-native' import Animated, { Easing, @@ -8,12 +8,10 @@ import Animated, { withDelay, withTiming, } from 'react-native-reanimated' -import { - moderateProfile, - type ModerationOpts, - type ModerationUI, -} from '@atproto/api' +import {moderateProfile} from '@atproto/api' +import {useMaybeProfileShadow} from '#/state/cache/profile-shadow' +import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useSession} from '#/state/session' import {UserAvatar} from '#/view/com/util/UserAvatar' import {atoms as a, useTheme} from '#/alf' @@ -33,7 +31,6 @@ export function AvatarBubbles({ profiles: allProfiles, self = false, size = 120, - moderationOpts, }: { animate?: boolean profiles: (bsky.profile.AnyProfileView | undefined)[] @@ -45,19 +42,12 @@ export function AvatarBubbles({ */ self?: boolean size?: number - moderationOpts?: ModerationOpts }) { const {currentAccount} = useSession() const profiles = !self && allProfiles.length > 2 ? allProfiles.filter(p => !p || p.did !== currentAccount?.did) : allProfiles - const moderations = useMemo(() => { - if (!moderationOpts) return [] - return profiles.map(p => { - return p && moderateProfile(p, moderationOpts) - }) - }, [profiles, moderationOpts]) const scale = size / 120 const marginOffset = size < 120 ? -2 : 0 @@ -110,7 +100,6 @@ export function AvatarBubbles({ y={layout.y} zIndex={layout.zIndex} includeProfileBorder={layout.border} - moderation={moderations[i]?.ui('avatar')} /> ))} @@ -119,14 +108,13 @@ export function AvatarBubbles({ } function AvatarBubble({ - profile, + profile: profileUnshadowed, scale, size, x, y, zIndex, includeProfileBorder, - moderation, }: { profile?: bsky.profile.AnyProfileView scale: SharedValue @@ -135,14 +123,15 @@ function AvatarBubble({ y: number zIndex?: number includeProfileBorder?: boolean - moderation?: ModerationUI }) { const t = useTheme() - const animatedStyle = useAnimatedStyle(() => ({ transform: [{translateX: x}, {translateY: y}, {scale: scale.get()}], })) + const profile = useMaybeProfileShadow(profileUnshadowed) + const moderationOpts = useModerationOpts() + return ( - {profile ? ( + {profile && moderationOpts ? ( ) : ( diff --git a/src/components/PostControls/ShareMenu/RecentChats.tsx b/src/components/PostControls/ShareMenu/RecentChats.tsx index 6107fa5755..bab3cbfded 100644 --- a/src/components/PostControls/ShareMenu/RecentChats.tsx +++ b/src/components/PostControls/ShareMenu/RecentChats.tsx @@ -152,11 +152,7 @@ function RecentChatItem({ a.align_center, ]}> {convo.kind === 'group' ? ( - + ) : ( {convo.kind === 'group' ? ( - + ) : ( ) : ( - + ) ) : ( <> @@ -152,10 +152,8 @@ function ProfileHeaderReady({ function GroupHeaderReady({ convo, - moderationOpts, }: { convo: Extract - moderationOpts: ModerationOpts }) { const {t: l} = useLingui() @@ -178,11 +176,7 @@ function GroupHeaderReady({ }, } }> - + - + {isOwner ? ( } title={chatName} diff --git a/src/screens/Messages/components/MessagesListGroupInfoPanel.tsx b/src/screens/Messages/components/MessagesListGroupInfoPanel.tsx index 8428b1a4b2..b1bb4ad976 100644 --- a/src/screens/Messages/components/MessagesListGroupInfoPanel.tsx +++ b/src/screens/Messages/components/MessagesListGroupInfoPanel.tsx @@ -87,11 +87,7 @@ export function MessagesListGroupInfoPanel({ return ( <> - + {convo.details.name ? ( { @@ -73,7 +70,6 @@ export function OutgoingRequestListItem({ ).fill(undefined), ]} size={48} - moderationOpts={moderationOpts} /> = new WeakMap() const emitter = new EventEmitter() +type ShadowUpdateEventPayload = {did: string; shadow: Partial} + +/** + * Subscribe to all profile shadow updates, regardless of did. Useful for + * non-React consumers like the Convo agent. Returns an unlisten function. + */ +export function listenProfileShadowUpdate( + listener: (payload: ShadowUpdateEventPayload) => void, +): () => void { + emitter.addListener('shadow-update', listener) + return () => { + emitter.removeListener('shadow-update', listener) + } +} + export function useProfileShadow< TProfileView extends bsky.profile.AnyProfileView, >(profile: TProfileView): Shadow { @@ -206,10 +221,47 @@ export function updateProfileShadow( } batchedUpdates(() => { emitter.emit(did, value) + emitter.emit('shadow-update', { + did, + shadow: value, + } satisfies ShadowUpdateEventPayload) }) } -function mergeShadow( +/** + * Returns true if merging `shadow` into `profile` would change nothing, i.e. + * `mergeShadow` would be a no-op. Object-valued fields are compared by + * reference, so this can return false negatives - callers may do redundant + * merges, but never skip a real change. + */ +export function isProfileShadowApplied< + TProfileView extends bsky.profile.AnyProfileView, +>(profile: TProfileView, shadow: Partial): boolean { + if ('followingUri' in shadow) { + if (profile.viewer?.following !== shadow.followingUri) return false + } + if ('muted' in shadow) { + if (profile.viewer?.muted !== shadow.muted) return false + } + if ('blockingUri' in shadow) { + if (profile.viewer?.blocking !== shadow.blockingUri) return false + } + if ('activitySubscription' in shadow) { + if (profile.viewer?.activitySubscription !== shadow.activitySubscription) { + return false + } + } + if ('verification' in shadow) { + if (profile.verification !== shadow.verification) return false + } + if ('status' in shadow) { + const current = 'status' in profile ? profile.status : undefined + if (current !== shadow.status) return false + } + return true +} + +export function mergeShadow( profile: TProfileView, shadow: Partial, ): Shadow { diff --git a/src/state/messages/convo/agent.ts b/src/state/messages/convo/agent.ts index e89965eb45..5e5cf3111e 100644 --- a/src/state/messages/convo/agent.ts +++ b/src/state/messages/convo/agent.ts @@ -20,6 +20,12 @@ import { isNetworkError, } from '#/lib/strings/errors' import {Logger} from '#/logger' +import { + isProfileShadowApplied, + listenProfileShadowUpdate, + mergeShadow, + type ProfileShadow, +} from '#/state/cache/profile-shadow' import { ACTIVE_POLL_INTERVAL, BACKGROUND_POLL_INTERVAL, @@ -118,6 +124,15 @@ export class Convo { private deletedMessages: Set = new Set() private relatedProfiles: Map = new Map() + /** + * Accumulated profile shadow state, keyed by did. The profiles this agent + * holds come from direct service fetches, so they are invisible to the + * shadow cache's react-query scan. We keep our own overlay and re-apply it + * whenever server data overwrites `relatedProfiles` or `convo.members`, + * otherwise refreshes would revert optimistic state (e.g. a block) until + * the server catches up. + */ + private profileShadows: Map> = new Map() private isProcessingPendingMessages = false @@ -168,16 +183,29 @@ export class Convo { private subscribers: (() => void)[] = [] subscribe(subscriber: () => void) { - if (this.subscribers.length === 0) this.init() + if (this.subscribers.length === 0) { + this.cleanupProfileShadowListener = listenProfileShadowUpdate( + ({did, shadow}) => { + this.mergeProfileShadow(did, shadow) + }, + ) + this.init() + } this.subscribers.push(subscriber) return () => { this.subscribers = this.subscribers.filter(s => s !== subscriber) - if (this.subscribers.length === 0) this.suspend() + if (this.subscribers.length === 0) { + this.cleanupProfileShadowListener?.() + this.cleanupProfileShadowListener = undefined + this.suspend() + } } } + private cleanupProfileShadowListener: (() => void) | undefined + getSnapshot(): ConvoState { if (!this.snapshot) this.snapshot = this.generateSnapshot() // logger.debug('snapshotted', {}) @@ -496,6 +524,9 @@ export class Convo { this.pendingMessages = new Map() this.deletedMessages = new Set() this.relatedProfiles = new Map() + // Shadow updates fired while suspended are missed, so the overlay may be + // stale - drop it and trust the from-scratch refetch. + this.profileShadows = new Map() this.pendingMessageFailure = null this.fetchMessageHistoryError = undefined @@ -527,6 +558,7 @@ export class Convo { this.relatedProfiles.set(member.did, member) } } + this.applyProfileShadows() } private updateConvo(convo: Partial) { @@ -537,6 +569,7 @@ export class Convo { for (const member of this.convo.members) { this.relatedProfiles.set(member.did, member) } + this.applyProfileShadows() } } @@ -707,6 +740,7 @@ export class Convo { this.relatedProfiles.set(member.did, member) } } while (cursor) + this.applyProfileShadows() } private fetchMessageHistoryError: {retry: () => void} | undefined @@ -753,6 +787,7 @@ export class Convo { for (const profile of relatedProfiles) { this.relatedProfiles.set(profile.did, profile) } + this.applyProfileShadows() } /* @@ -875,6 +910,7 @@ export class Convo { for (const profile of ev.relatedProfiles) { this.relatedProfiles.set(profile.did, profile) } + this.applyProfileShadows() } if ( @@ -1485,4 +1521,86 @@ export class Convo { throw error } } + + mergeProfileShadow(did: string, shadow: Partial) { + // Accumulate even if the did isn't held yet - the profile may arrive + // later via message history or the member list, and must get the shadow. + this.profileShadows.set(did, { + ...this.profileShadows.get(did), + ...shadow, + }) + if (this.applyProfileShadow(did, shadow)) { + this.commit() + } + } + + /** + * Re-applies all accumulated shadows. Must be called after any server data + * lands in `relatedProfiles` or `this.convo`, since raw server profiles + * would otherwise clobber optimistic state. + */ + private applyProfileShadows() { + for (const [did, shadow] of this.profileShadows) { + this.applyProfileShadow(did, shadow) + } + } + + private applyProfileShadow( + did: string, + shadow: Partial, + ): boolean { + let changed = false + + const related = this.relatedProfiles.get(did) + if (related && !isProfileShadowApplied(related, shadow)) { + this.relatedProfiles.set(did, mergeShadow(related, shadow)) + changed = true + } + + if (this.convo) { + const next = applyShadowToConvo(this.convo, did, shadow) + if (next) { + this.convo = next + changed = true + } + } + + return changed + } +} + +/** + * Returns a new convo with the shadow merged into the matching member (and + * `primaryMember`, if it's the same profile), or null if nothing changed. + */ +function applyShadowToConvo( + convo: ConvoWithDetails, + did: string, + shadow: Partial, +): ConvoWithDetails | null { + const i = convo.members.findIndex(m => m.did === did) + if (i === -1) return null + if (isProfileShadowApplied(convo.members[i], shadow)) return null + + // The branches are identical, but narrowing the union is what lets the + // member arrays keep their per-kind types. + if (convo.kind === 'group') { + const members = convo.members.slice() + members[i] = mergeShadow(members[i], shadow) + return { + ...convo, + members, + primaryMember: + convo.primaryMember?.did === did ? members[i] : convo.primaryMember, + } + } else { + const members = convo.members.slice() + members[i] = mergeShadow(members[i], shadow) + return { + ...convo, + members, + primaryMember: + convo.primaryMember.did === did ? members[i] : convo.primaryMember, + } + } } diff --git a/src/state/queries/messages/get-status.ts b/src/state/queries/messages/get-status.ts index 2bfb12550a..89625dca24 100644 --- a/src/state/queries/messages/get-status.ts +++ b/src/state/queries/messages/get-status.ts @@ -12,6 +12,8 @@ export function useChatActorStatusQuery() { const agent = useAgent() return useQuery({ + gcTime: STALE.INFINITY, + staleTime: STALE.SECONDS.FIFTEEN, queryKey: chatActorStatusQueryKey(), queryFn: async () => { const {data} = await agent.chat.bsky.actor.getStatus( @@ -21,7 +23,5 @@ export function useChatActorStatusQuery() { return data }, - staleTime: STALE.INFINITY, - gcTime: STALE.INFINITY, }) } diff --git a/src/state/queries/profile.ts b/src/state/queries/profile.ts index 7db15d0bc3..526a9df8f3 100644 --- a/src/state/queries/profile.ts +++ b/src/state/queries/profile.ts @@ -528,6 +528,10 @@ export function useProfileBlockMutationQueue( updateProfileShadow(queryClient, did, { blockingUri: finalBlockingUri, }) + // The shadow only reaches components that read profiles through shadow + // hooks. The convo list is also read raw (e.g. the unread badge's + // calculateCount, getMessageInfo), and blocks emit no chat log event, + // so without a refetch that data stays stale indefinitely. void queryClient.invalidateQueries({queryKey: [RQKEY_LIST_CONVOS]}) }, }) From 8fcf25b290cd34422cd8be400824ca48b4d6dfb3 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Wed, 10 Jun 2026 18:17:18 +0300 Subject: [PATCH 148/149] [Chat] Fix source of truth for group size limit (#10845) --- src/components/dms/AddMembersFlow.tsx | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/components/dms/AddMembersFlow.tsx b/src/components/dms/AddMembersFlow.tsx index e7e831f9a9..bb591fb8c6 100644 --- a/src/components/dms/AddMembersFlow.tsx +++ b/src/components/dms/AddMembersFlow.tsx @@ -11,7 +11,6 @@ import {Trans, useLingui} from '@lingui/react/macro' import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useActorAutocompleteQuery} from '#/state/queries/actor-autocomplete' -import {useChatActorStatusQuery} from '#/state/queries/messages/get-status' import {useListConvoMembersQuery} from '#/state/queries/messages/list-convo-members' import {useProfileFollowsQuery} from '#/state/queries/profile-follows' import {useSession} from '#/state/session' @@ -162,14 +161,12 @@ export function AddMembersFlow({ [memberListData], ) - const {data: chatStatus} = useChatActorStatusQuery() - const groupMemberLimit = chatStatus?.groupMemberLimit // The existing members (including the viewer) already occupy slots, so the // number of people that can still be added is whatever's left. - const remainingSlots = - groupMemberLimit !== undefined - ? Math.max(0, groupMemberLimit - memberListData.length) - : undefined + const remainingSlots = Math.max( + 0, + convo.details.memberLimit - memberListData.length, + ) const onRemoveDid = useCallback( (did: string) => { From a69836216cd669dd426fa84df9fb7f19f499e8df Mon Sep 17 00:00:00 2001 From: DS Boyce <260543580+ds-boyce@users.noreply.github.com> Date: Wed, 10 Jun 2026 09:09:19 -0700 Subject: [PATCH 149/149] Tweak spacing in invite link dialog (#10829) --- .../Messages/components/InviteLinkDialog.tsx | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/screens/Messages/components/InviteLinkDialog.tsx b/src/screens/Messages/components/InviteLinkDialog.tsx index 89bf8678a1..79f727ca35 100644 --- a/src/screens/Messages/components/InviteLinkDialog.tsx +++ b/src/screens/Messages/components/InviteLinkDialog.tsx @@ -212,11 +212,9 @@ export function InviteLinkDialog({ header = linkEnabled ? l`Update invite link` : l`Generate invite link` content = ( <> - - - Choose who can join this group chat and how. - - + + Choose who can join this group chat and how. + {linkEnabled ? ( - - {isOwner ? ( + isOwner ? ( + - ) : ( - {memberValue} - )} - + + ) : ( + {memberValue} + ) ) : null} {linkEnabled ? (

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̕HxN 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