saros-proxy 0.11.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,6 +5,14 @@
5
5
  * Usage: GET /zen/go/v1/usage with Bearer = the key itself.
6
6
  */
7
7
  import { API_KEY_PREFIX, MIN_KEY_LENGTH, OPENCODE_GO_KEY_PREFIX, USAGE_PATH, } from '../constants.js';
8
+ /**
9
+ * Identity the zen upstream expects. Cloudflare in front of opencode.ai
10
+ * rejects browser-like signatures with `403 error code: 1010` (verified live
11
+ * 2026-11-05: no UA, `Python-urllib/3.14` and `node` all 403; `cli` reaches
12
+ * the API). Forwarding the client's UA therefore killed every request made
13
+ * with an opencode-go key, so the provider overrides it.
14
+ */
15
+ export const OPENCODE_GO_USER_AGENT = 'cli';
8
16
  /** Bare-name index of the live opencode-go catalog. */
9
17
  let catalogCache = null;
10
18
  /** Ensures the background refresh fires at most once per process. */
@@ -18,6 +26,7 @@ async function refreshCatalog(baseUrl, timeoutMs) {
18
26
  const timer = setTimeout(() => controller.abort(), timeoutMs);
19
27
  try {
20
28
  const res = await fetch(`${baseUrl.replace(/\/$/, '')}${USAGE_PATH.replace(/\/usage$/, '/models')}`, {
29
+ headers: { 'User-Agent': OPENCODE_GO_USER_AGENT },
21
30
  signal: controller.signal,
22
31
  });
23
32
  if (!res.ok)
@@ -47,10 +56,11 @@ async function refreshCatalog(baseUrl, timeoutMs) {
47
56
  clearTimeout(timer);
48
57
  }
49
58
  }
59
+ /** Percent from one window; null when the window carries no numeric percent. */
50
60
  function parsePercent(window) {
51
61
  const percent = window?.percent;
52
62
  if (typeof percent !== 'number' || !Number.isFinite(percent))
53
- return 0;
63
+ return null;
54
64
  return Math.min(100, Math.max(0, percent));
55
65
  }
56
66
  /** Parse opencode-go usage JSON (moved from usage-client.ts). */
@@ -68,11 +78,23 @@ export function parseOpencodeUsage(body) {
68
78
  const rolling = parsePercent(usage.rolling);
69
79
  const weekly = parsePercent(usage.weekly);
70
80
  const monthly = parsePercent(usage.monthly);
81
+ // A 200 whose `usage` object has no numeric window is not data: returning
82
+ // zeros would overwrite the previous percentage and hand the key max weight.
83
+ if (rolling === null && weekly === null && monthly === null)
84
+ return null;
85
+ const rollingPct = rolling ?? 0;
86
+ const weeklyPct = weekly ?? 0;
87
+ const monthlyPct = monthly ?? 0;
71
88
  return {
72
- rollingPercent: rolling,
73
- weeklyPercent: weekly,
74
- monthlyPercent: monthly,
75
- usedPercent: Math.max(rolling, weekly, monthly),
89
+ rollingPercent: rollingPct,
90
+ weeklyPercent: weeklyPct,
91
+ monthlyPercent: monthlyPct,
92
+ // The monthly window is the budget measure; any window at 100% pulls the
93
+ // key out of rotation before the upstream rejects it. A missing monthly
94
+ // stays null so the previous percentage is not overwritten with 0%.
95
+ usedPercent: monthly,
96
+ exhausted: rollingPct >= 100 || weeklyPct >= 100 || monthlyPct >= 100,
97
+ monthlyAvailable: monthly !== null,
76
98
  rollingResetsAt: typeof usage.rolling?.resetsAt === 'string' ? usage.rolling.resetsAt : undefined,
77
99
  weeklyResetsAt: typeof usage.weekly?.resetsAt === 'string' ? usage.weekly.resetsAt : undefined,
78
100
  monthlyResetsAt: typeof usage.monthly?.resetsAt === 'string' ? usage.monthly.resetsAt : undefined,
@@ -97,7 +119,7 @@ export const opencodeGoProvider = {
97
119
  const timer = setTimeout(() => controller.abort(), timeoutMs);
98
120
  try {
99
121
  const res = await fetch(`${this.baseUrl}${USAGE_PATH}`, {
100
- headers: { Authorization: `Bearer ${key}` },
122
+ headers: { Authorization: `Bearer ${key}`, 'User-Agent': OPENCODE_GO_USER_AGENT },
101
123
  signal: controller.signal,
102
124
  });
103
125
  if (res.ok) {
@@ -126,6 +148,10 @@ export const opencodeGoProvider = {
126
148
  usagePath() {
127
149
  return USAGE_PATH;
128
150
  },
151
+ /** Cloudflare rejects forwarded browser UAs; always identify as the CLI. */
152
+ extraUpstreamHeaders() {
153
+ return { 'User-Agent': OPENCODE_GO_USER_AGENT };
154
+ },
129
155
  parseUsageResponse(body) {
130
156
  return parseOpencodeUsage(body);
131
157
  },
@@ -174,7 +200,9 @@ export const opencodeGoProvider = {
174
200
  return null;
175
201
  // Re-fetch and return the raw list for catalog consumers (harness sync).
176
202
  try {
177
- const res = await fetch(`${this.baseUrl.replace(/\/$/, '')}${USAGE_PATH.replace(/\/usage$/, '/models')}`);
203
+ const res = await fetch(`${this.baseUrl.replace(/\/$/, '')}${USAGE_PATH.replace(/\/usage$/, '/models')}`, {
204
+ headers: { 'User-Agent': OPENCODE_GO_USER_AGENT },
205
+ });
178
206
  if (!res.ok)
179
207
  return null;
180
208
  const body = (await res.json());
@@ -1 +1 @@
1
- {"version":3,"file":"opencode-go.js","sourceRoot":"","sources":["../../src/providers/opencode-go.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"opencode-go.js","sourceRoot":"","sources":["../../src/providers/opencode-go.ts"],"names":[],"mappings":"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"}
@@ -123,9 +123,17 @@ export interface KeyProvider {
123
123
  * Used for request routing in mixed-provider key pools.
124
124
  */
125
125
  export type ModelAffinity = 'yes' | 'no' | 'maybe';
126
- /** Shared usage shape used across providers (mirrors usage-client KeyUsage). */
126
+ /**
127
+ * Shared usage shape used across providers (mirrors usage-client KeyUsage).
128
+ * `usedPercent` is the monthly percentage of the key's own provider budget;
129
+ * `exhausted` means any window is at 100% and the key must not serve traffic.
130
+ */
127
131
  export interface KeyUsage {
128
- usedPercent: number;
132
+ /** Monthly used percent, or null when it cannot be derived. */
133
+ usedPercent: number | null;
134
+ exhausted: boolean;
135
+ /** False when the payload carries no monthly percentage (CLI shows n/a). */
136
+ monthlyAvailable: boolean;
129
137
  rollingPercent: number;
130
138
  weeklyPercent: number;
131
139
  monthlyPercent: number;
@@ -18,8 +18,14 @@ interface ApiKey {
18
18
  consecutiveFailures: number;
19
19
  lastUsed: number | null;
20
20
  disabledAt: number | null;
21
- /** Worst-window used percent (0-100) reported by the upstream usage API. */
21
+ /** Monthly used percent (0-100) reported by the upstream usage API. */
22
22
  usagePercent: number | null;
23
+ /**
24
+ * True when any quota window (5h, weekly or monthly) is at 100%. Weight 0
25
+ * in rotation: a month with room does not help when the upstream already
26
+ * rejects the key for a spent shorter window.
27
+ */
28
+ exhausted: boolean;
23
29
  /**
24
30
  * False when the upstream rejected this key for lack of plan
25
31
  * (403 EntitlementError / upgrade_required): the account cannot use the
@@ -74,6 +80,7 @@ export interface KeyHealthReport {
74
80
  reason: KeyFailureReason;
75
81
  at: string;
76
82
  } | null;
83
+ /** Monthly used percent (0-100) of this key's provider budget. */
77
84
  usagePercent: number | null;
78
85
  }
79
86
  /** Fields needed to answer "can this key be used right now?". */
@@ -138,11 +145,27 @@ export declare function createProxyState(keys: Array<{
138
145
  circuitBreakerThreshold?: number;
139
146
  circuitBreakerCooldownMs?: number;
140
147
  }): ProxyState;
148
+ /** Usage snapshot applied to one key. */
149
+ export interface KeyUsageMetrics {
150
+ /**
151
+ * Monthly used percent, 0-100, of the key's own provider budget; null when
152
+ * the payload had no derivable monthly value and the previous one must stay.
153
+ */
154
+ usedPercent: number | null;
155
+ /** True when any quota window is at 100%. */
156
+ exhausted: boolean;
157
+ }
141
158
  /**
142
- * Update per-key usage data (worst-window used percent, 0-100).
143
- * Keys absent from the map keep their previous value.
159
+ * Update per-key usage data. `usedPercent` is the **monthly** percentage of
160
+ * the key's **own provider budget**, not absolute capacity: a mixed pool
161
+ * feeds every provider's number into `pickWeighted`, where only this
162
+ * normalized percent is comparable (opencode-go publishes percentages alone —
163
+ * no counts or caps). `exhausted` means a shorter window already hit its cap,
164
+ * so the key weighs 0 even when the month has room. A null `usedPercent` means
165
+ * the payload had no derivable monthly value and the previous percentage is
166
+ * kept. Keys absent from the map keep their previous values.
144
167
  */
145
- export declare function updateKeyUsage(state: ProxyState, usage: Map<string, number>): void;
168
+ export declare function updateKeyUsage(state: ProxyState, usage: Map<string, KeyUsageMetrics>): void;
146
169
  /**
147
170
  * Mark a key as (not) entitled to use its provider. Unentitled keys are
148
171
  * skipped by selection without touching the circuit breaker; the usage
@@ -25,6 +25,7 @@ export function createProxyState(keys, options) {
25
25
  lastUsed: null,
26
26
  disabledAt: null,
27
27
  usagePercent: null,
28
+ exhausted: false,
28
29
  entitled: true,
29
30
  currentWeight: 0,
30
31
  lastError: null,
@@ -103,13 +104,17 @@ function buildBookedLabels(state) {
103
104
  *
104
105
  * Selection strategy (smooth weighted round-robin, nginx-style):
105
106
  * - When usage data is known for the candidates, keys with more remaining
106
- * quota are proportionally preferred. E.g. key X at 30% used and key Y at
107
- * 70% used receive ~70%/30% of requests — exact proportions over a cycle,
108
- * not random sampling.
109
- * - Without usage data (or when every candidate is exhausted), falls back to
110
- * plain round-robin ordering.
107
+ * **monthly** budget are proportionally preferred. E.g. key X at 30% of its
108
+ * monthly allowance and key Y at 70% receive ~70%/30% of requests — exact
109
+ * proportions over a cycle, not random sampling.
110
+ * - A key with any exhausted window weighs 0, so it is not selected while
111
+ * another candidate still has room.
112
+ * - Keys without usage data take the median of the other candidates'
113
+ * non-exhausted weights (not plain round-robin). Round-robin only applies
114
+ * when no candidate has usage data at all; with `allowExhausted` (Tier 2+)
115
+ * it is also the last resort when every candidate is exhausted.
111
116
  */
112
- function findNextKey(state, excludeLabels, providerFilter) {
117
+ function findNextKey(state, excludeLabels, providerFilter, allowExhausted = true) {
113
118
  const n = state.keys.length;
114
119
  if (n === 0)
115
120
  return null;
@@ -126,50 +131,97 @@ function findNextKey(state, excludeLabels, providerFilter) {
126
131
  }
127
132
  if (candidates.length === 0)
128
133
  return null;
129
- const picked = pickWeighted(state, candidates);
134
+ const picked = pickWeighted(state, candidates, allowExhausted);
135
+ if (!picked)
136
+ return null;
130
137
  state.currentIndex = (state.keys.indexOf(picked) + 1) % n;
131
138
  picked.lastUsed = Date.now();
132
139
  return toSnapshot(picked);
133
140
  }
134
141
  /**
135
142
  * Internal: smooth weighted round-robin over the candidates.
136
- * Falls back to the first candidate (round-robin order) when usage data is
137
- * missing for any candidate or when no candidate has remaining capacity.
143
+ *
144
+ * Weight is the remaining **monthly** budget (`100 - usedPercent`), except
145
+ * that a key with any exhausted window weighs 0 — the upstream would reject it
146
+ * even while the month still has room.
147
+ *
148
+ * Keys without usage data get the median of the *non-exhausted* known weights.
149
+ * Including the zeros of exhausted keys here would silently drag the neutral
150
+ * weight to 0 (and starve the unknown keys); when no known key has room they
151
+ * get a positive weight instead, so an exhausted key is never preferred.
152
+ * Keys with weight 0 are skipped and their residual `currentWeight` cleared,
153
+ * so a key that just became exhausted cannot win on leftover momentum.
154
+ *
155
+ * Falls back to the first candidate (round-robin order) when no candidate has
156
+ * usage data at all, or — only when `allowExhausted` — when every candidate is
157
+ * out of capacity. Tier 1 passes `false`, so a zero-weight pool yields null
158
+ * and the next tier can share a healthy key instead of serving an exhausted
159
+ * one.
138
160
  */
139
- function pickWeighted(state, candidates) {
140
- const known = candidates.filter((k) => k.usagePercent !== null);
141
- if (known.length === 0)
142
- return candidates[0];
143
- let weights = candidates.map((k) => Math.max(0, 100 - (k.usagePercent ?? 0)));
144
- // Keys missing usage data get the median of the known weights — neutral,
145
- // so one flaky key no longer disables weighting for the whole pool.
146
- const sorted = known.map((k) => 100 - (k.usagePercent ?? 0)).sort((a, b) => a - b);
147
- const median = sorted[Math.floor(sorted.length / 2)] ?? 0;
148
- weights = weights.map((w, i) => (candidates[i].usagePercent === null ? median : w));
149
- const totalWeight = weights.reduce((sum, w) => sum + w, 0);
150
- if (totalWeight === 0)
161
+ function pickWeighted(state, candidates, allowExhausted) {
162
+ const known = candidates.map((k) => {
163
+ if (k.usagePercent === null)
164
+ return null;
165
+ return k.exhausted ? 0 : Math.max(0, 100 - k.usagePercent);
166
+ });
167
+ if (known.every((w) => w === null))
151
168
  return candidates[0];
152
- let best = candidates[0];
169
+ const roomWeights = candidates
170
+ .map((k, i) => (known[i] !== null && !k.exhausted ? known[i] : null))
171
+ .filter((w) => w !== null && w > 0)
172
+ .sort((a, b) => a - b);
173
+ // No known key has room: unknown keys must still be tried, so give them a
174
+ // full weight instead of the zero median.
175
+ const neutralWeight = roomWeights.length > 0
176
+ ? roomWeights[Math.floor(roomWeights.length / 2)]
177
+ : 100;
178
+ const finalWeights = known.map((w) => w ?? neutralWeight);
179
+ const totalWeight = finalWeights.reduce((sum, w) => sum + w, 0);
180
+ if (totalWeight === 0) {
181
+ // Nothing has room: keep the round-robin fallback momentum-free so a key
182
+ // that frees up later does not start with stale weight.
183
+ for (const key of candidates)
184
+ key.currentWeight = 0;
185
+ return allowExhausted ? candidates[0] : null;
186
+ }
187
+ let best = null;
153
188
  let bestWeight = -Infinity;
154
189
  for (let i = 0; i < candidates.length; i++) {
155
- candidates[i].currentWeight += weights[i];
190
+ if (finalWeights[i] === 0) {
191
+ candidates[i].currentWeight = 0;
192
+ continue;
193
+ }
194
+ candidates[i].currentWeight += finalWeights[i];
156
195
  if (candidates[i].currentWeight > bestWeight) {
157
196
  bestWeight = candidates[i].currentWeight;
158
197
  best = candidates[i];
159
198
  }
160
199
  }
200
+ if (best === null)
201
+ return candidates[0];
161
202
  best.currentWeight -= totalWeight;
162
203
  return best;
163
204
  }
164
205
  /**
165
- * Update per-key usage data (worst-window used percent, 0-100).
166
- * Keys absent from the map keep their previous value.
206
+ * Update per-key usage data. `usedPercent` is the **monthly** percentage of
207
+ * the key's **own provider budget**, not absolute capacity: a mixed pool
208
+ * feeds every provider's number into `pickWeighted`, where only this
209
+ * normalized percent is comparable (opencode-go publishes percentages alone —
210
+ * no counts or caps). `exhausted` means a shorter window already hit its cap,
211
+ * so the key weighs 0 even when the month has room. A null `usedPercent` means
212
+ * the payload had no derivable monthly value and the previous percentage is
213
+ * kept. Keys absent from the map keep their previous values.
167
214
  */
168
215
  export function updateKeyUsage(state, usage) {
169
216
  for (const key of state.keys) {
170
- const percent = usage.get(key.label);
171
- if (typeof percent === 'number')
172
- key.usagePercent = percent;
217
+ const metrics = usage.get(key.label);
218
+ if (!metrics)
219
+ continue;
220
+ // A null monthly metric is "no data", not 0%: keep the last known value
221
+ // so an underivable payload can never turn into maximum weight.
222
+ if (metrics.usedPercent !== null)
223
+ key.usagePercent = metrics.usedPercent;
224
+ key.exhausted = metrics.exhausted;
173
225
  }
174
226
  }
175
227
  /**
@@ -266,10 +318,11 @@ export function selectKeyForRequest(state, requestId, modelId) {
266
318
  for (const label of booked) {
267
319
  excludeLabels.add(label);
268
320
  }
269
- let snapshot = findNextKey(state, excludeLabels, providerFilter);
321
+ let snapshot = findNextKey(state, excludeLabels, providerFilter, false);
270
322
  // Tier 2: all healthy preferred keys are booked — share one via
271
323
  // round-robin. Better to share a key than return 503 when concurrent
272
- // requests outnumber the key pool.
324
+ // requests outnumber the key pool. This tier may fall back to an exhausted
325
+ // key when no healthy one exists at all.
273
326
  if (!snapshot) {
274
327
  snapshot = findNextKey(state, new Set(ctx.triedKeys), providerFilter);
275
328
  }
@@ -305,10 +358,11 @@ export function failoverRequest(state, requestId) {
305
358
  for (const label of booked) {
306
359
  excludeLabels.add(label);
307
360
  }
308
- let snapshot = findNextKey(state, excludeLabels, filter);
361
+ let snapshot = findNextKey(state, excludeLabels, filter, false);
309
362
  // Tier 2: all remaining healthy preferred keys are booked — share one.
310
363
  // Still respects per-request triedKeys (don't re-use a key this
311
- // request already failed on).
364
+ // request already failed on). May fall back to an exhausted key only when
365
+ // no healthy candidate exists.
312
366
  if (!snapshot) {
313
367
  snapshot = findNextKey(state, new Set(ctx.triedKeys), filter);
314
368
  }
@@ -1 +1 @@
1
- {"version":3,"file":"proxy-logic.js","sourceRoot":"","sources":["../src/proxy-logic.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"proxy-logic.js","sourceRoot":"","sources":["../src/proxy-logic.ts"],"names":[],"mappings":"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"}
package/dist/proxy.js CHANGED
@@ -842,21 +842,46 @@ async function handleStreamingRequest(opts) {
842
842
  });
843
843
  }
844
844
  /**
845
- * Pull token counts out of one SSE event. Chat completions carry `usage` at the
846
- * top level; the OpenAI Responses schema nests it under `response.usage` on
847
- * `response.completed`, so a top-level-only reader books zero for those streams.
845
+ * Pull token counts out of one SSE event, across every streaming surface saros
846
+ * relays: Chat Completions (top-level `usage`), OpenAI Responses
847
+ * (`response.usage` on `response.completed`) and Anthropic Messages
848
+ * (`message.usage` on `message_start`). A reader that only knew the first
849
+ * shape booked zero for the other two. `message` is only consulted on
850
+ * `message_start`: other event types may carry an unrelated business object
851
+ * under that key (e.g. streamed decision payloads).
848
852
  */
849
853
  function extractEventUsage(parsed) {
850
854
  if (parsed.usage)
851
855
  return parsed.usage;
852
- const response = parsed.response;
853
- if (response && typeof response === 'object' && !Array.isArray(response)) {
854
- const nested = response.usage;
856
+ const containers = [parsed.response];
857
+ if (parsed.type === 'message_start')
858
+ containers.push(parsed.message);
859
+ for (const container of containers) {
860
+ if (!container || typeof container !== 'object' || Array.isArray(container))
861
+ continue;
862
+ const nested = container.usage;
855
863
  if (nested)
856
864
  return nested;
857
865
  }
858
866
  return null;
859
867
  }
868
+ /**
869
+ * Merge one event's usage into the stream total. Anthropic splits the counts
870
+ * across events — `message_start` carries the prompt tokens, `message_delta`
871
+ * the cumulative output tokens — so last-one-wins would book zero prompt
872
+ * tokens for every Messages stream. Every documented surface reports
873
+ * cumulative per-field counts, so the largest value seen is the final one;
874
+ * identical repeats (CommandCode sends `usage` twice) are no-ops.
875
+ */
876
+ function mergeStreamUsage(target, next) {
877
+ if (!next || typeof next !== 'object' || Array.isArray(next))
878
+ return;
879
+ for (const [field, value] of Object.entries(next)) {
880
+ if (typeof value !== 'number' || !Number.isFinite(value))
881
+ continue;
882
+ target[field] = Math.max(target[field] ?? 0, value);
883
+ }
884
+ }
860
885
  /**
861
886
  * Wrap an upstream SSE stream with error detection.
862
887
  * Parses SSE events properly to avoid false positives on
@@ -869,20 +894,17 @@ function wrapStreamWithErrorDetection(upstreamStream, state, requestId, keyLabel
869
894
  const decoder = new TextDecoder();
870
895
  const encoder = new TextEncoder();
871
896
  let buffer = '';
872
- // Upstreams may report the same `usage` on more than one chunk: CommandCode
873
- // sends it on the finish chunk (`choices[0].finish_reason`) and again on the
874
- // trailing usage-only chunk (`choices: []`), so booking per chunk would
875
- // count every streamed request twice. Keep the canonical usage-only chunk
876
- // (last one wins, OpenAI's `include_usage` contract) and fall back to the
877
- // finish chunk's copy; book exactly once, when the stream ends.
878
- let lastUsage = null;
879
- let usageOnlyChunk = null;
897
+ // Usage is booked exactly once, when the stream ends. Upstreams may repeat
898
+ // the same counts on more than one chunk (CommandCode sends them on the
899
+ // finish chunk and on the trailing usage-only chunk) and Anthropic splits
900
+ // them across events, so counts are merged per field instead of replaced.
901
+ let streamUsage = null;
880
902
  let usageBooked = false;
881
903
  const bookUsage = () => {
882
904
  if (usageBooked)
883
905
  return;
884
906
  usageBooked = true;
885
- recordKeyTokens(keyLabel, usageOnlyChunk ?? lastUsage);
907
+ recordKeyTokens(keyLabel, streamUsage);
886
908
  };
887
909
  return new ReadableStream({
888
910
  async pull(controller) {
@@ -918,15 +940,12 @@ function wrapStreamWithErrorDetection(upstreamStream, state, requestId, keyLabel
918
940
  return;
919
941
  }
920
942
  // Intermediate chunks send `usage: null`; the counts arrive on the
921
- // finish chunk and/or the usage-only chunk (see bookUsage). The
922
- // OpenAI Responses schema nests them under `response.usage` on the
923
- // `response.completed` event instead of at the top level.
943
+ // finish chunk and/or a usage-only chunk (see bookUsage), or split
944
+ // across `response.completed` / `message_start` / `message_delta`.
924
945
  const eventUsage = extractEventUsage(parsed);
925
946
  if (eventUsage) {
926
- lastUsage = eventUsage;
927
- if (Array.isArray(parsed.choices) && parsed.choices.length === 0) {
928
- usageOnlyChunk = eventUsage;
929
- }
947
+ streamUsage ??= {};
948
+ mergeStreamUsage(streamUsage, eventUsage);
930
949
  }
931
950
  }
932
951
  catch {