@modelprofile.com/authswitch 6.5.0 → 7.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.
Files changed (98) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/authority-contract.d.ts +302 -6
  3. package/dist_ts/authority-contract.js +1 -1
  4. package/dist_ts/authority-runtime-contract.d.ts +13 -0
  5. package/dist_ts/authorityrehearsal.child.d.ts +1 -0
  6. package/dist_ts/authorityrehearsal.child.js +395 -0
  7. package/dist_ts/classes.accountlist.js +4 -3
  8. package/dist_ts/classes.authoritybackup.d.ts +134 -0
  9. package/dist_ts/classes.authoritybackup.js +769 -0
  10. package/dist_ts/classes.authoritybroker.d.ts +25 -5
  11. package/dist_ts/classes.authoritybroker.js +392 -123
  12. package/dist_ts/classes.authoritycli.d.ts +24 -0
  13. package/dist_ts/classes.authoritycli.js +675 -0
  14. package/dist_ts/classes.authorityclient.d.ts +19 -7
  15. package/dist_ts/classes.authorityclient.js +51 -14
  16. package/dist_ts/classes.authoritydaemon.d.ts +28 -1
  17. package/dist_ts/classes.authoritydaemon.js +482 -36
  18. package/dist_ts/classes.authoritydatabase.d.ts +175 -10
  19. package/dist_ts/classes.authoritydatabase.js +1100 -52
  20. package/dist_ts/classes.authoritymodels.d.ts +223 -1
  21. package/dist_ts/classes.authoritymodels.js +798 -9
  22. package/dist_ts/classes.authoritypreuse.d.ts +47 -0
  23. package/dist_ts/classes.authoritypreuse.js +278 -0
  24. package/dist_ts/classes.authorityregistry.d.ts +24 -0
  25. package/dist_ts/classes.authorityregistry.js +88 -0
  26. package/dist_ts/classes.authorityrehearsal.d.ts +127 -0
  27. package/dist_ts/classes.authorityrehearsal.js +632 -0
  28. package/dist_ts/classes.authorityusage.d.ts +160 -0
  29. package/dist_ts/classes.authorityusage.js +429 -0
  30. package/dist_ts/classes.claudeauthority.d.ts +66 -0
  31. package/dist_ts/classes.claudeauthority.js +532 -0
  32. package/dist_ts/classes.claudecodeharness.js +3 -2
  33. package/dist_ts/classes.claudecodelocks.d.ts +13 -0
  34. package/dist_ts/classes.claudecodelocks.js +75 -3
  35. package/dist_ts/classes.claudenative.d.ts +137 -0
  36. package/dist_ts/classes.claudenative.js +731 -0
  37. package/dist_ts/classes.claudestatus.d.ts +9 -0
  38. package/dist_ts/classes.claudestatus.js +26 -9
  39. package/dist_ts/classes.claudetokenrefresh.d.ts +15 -1
  40. package/dist_ts/classes.claudetokenrefresh.js +74 -21
  41. package/dist_ts/classes.codexharness.js +4 -2
  42. package/dist_ts/classes.codexmanaged.d.ts +11 -0
  43. package/dist_ts/classes.codexmanaged.js +75 -14
  44. package/dist_ts/classes.codexpreuse.d.ts +8 -0
  45. package/dist_ts/classes.codexpreuse.js +24 -6
  46. package/dist_ts/classes.fileharness.d.ts +2 -0
  47. package/dist_ts/classes.fileharness.js +6 -4
  48. package/dist_ts/classes.limits.js +12 -7
  49. package/dist_ts/classes.opencodeharness.js +2 -2
  50. package/dist_ts/claudehttp.d.ts +10 -0
  51. package/dist_ts/claudehttp.js +29 -3
  52. package/dist_ts/index.d.ts +1 -0
  53. package/dist_ts/index.js +7 -1
  54. package/dist_ts/interfaces.harness.d.ts +6 -0
  55. package/dist_ts/interfaces.list.d.ts +9 -3
  56. package/dist_ts/plugins.d.ts +5 -2
  57. package/dist_ts/plugins.js +7 -3
  58. package/dist_ts/ts_migration/0001_authority_meta.d.ts +3 -0
  59. package/dist_ts/ts_migration/0001_authority_meta.js +32 -0
  60. package/dist_ts/ts_migration/index.d.ts +3 -0
  61. package/dist_ts/ts_migration/index.js +6 -0
  62. package/package.json +4 -1
  63. package/readme.md +181 -14
  64. package/ts/00_commitinfo_data.ts +1 -1
  65. package/ts/authority-contract.ts +264 -9
  66. package/ts/authority-runtime-contract.ts +14 -0
  67. package/ts/authorityrehearsal.child.ts +330 -0
  68. package/ts/classes.accountlist.ts +3 -2
  69. package/ts/classes.authoritybackup.ts +780 -0
  70. package/ts/classes.authoritybroker.ts +389 -121
  71. package/ts/classes.authoritycli.ts +719 -0
  72. package/ts/classes.authorityclient.ts +75 -18
  73. package/ts/classes.authoritydaemon.ts +449 -36
  74. package/ts/classes.authoritydatabase.ts +1147 -55
  75. package/ts/classes.authoritymodels.ts +541 -6
  76. package/ts/classes.authoritypreuse.ts +297 -0
  77. package/ts/classes.authorityregistry.ts +118 -0
  78. package/ts/classes.authorityrehearsal.ts +625 -0
  79. package/ts/classes.authorityusage.ts +527 -0
  80. package/ts/classes.claudeauthority.ts +541 -0
  81. package/ts/classes.claudecodeharness.ts +2 -1
  82. package/ts/classes.claudecodelocks.ts +70 -1
  83. package/ts/classes.claudenative.ts +816 -0
  84. package/ts/classes.claudestatus.ts +38 -9
  85. package/ts/classes.claudetokenrefresh.ts +82 -19
  86. package/ts/classes.codexharness.ts +3 -1
  87. package/ts/classes.codexmanaged.ts +75 -12
  88. package/ts/classes.codexpreuse.ts +33 -5
  89. package/ts/classes.fileharness.ts +7 -3
  90. package/ts/classes.limits.ts +11 -6
  91. package/ts/classes.opencodeharness.ts +1 -1
  92. package/ts/claudehttp.ts +31 -2
  93. package/ts/index.ts +6 -0
  94. package/ts/interfaces.harness.ts +6 -0
  95. package/ts/interfaces.list.ts +9 -3
  96. package/ts/plugins.ts +7 -2
  97. package/ts/ts_migration/0001_authority_meta.ts +33 -0
  98. package/ts/ts_migration/index.ts +7 -0
@@ -0,0 +1,731 @@
1
+ import * as plugins from './plugins.js';
2
+ import { ClaudeCodeLockOutcomeUnknownError, ClaudeCodeLocks } from './classes.claudecodelocks.js';
3
+ import { claudeRequest } from './claudehttp.js';
4
+ import { writeSecretFileAtomically } from './helpers.js';
5
+ import { HarnessProcesses } from './classes.harnessprocesses.js';
6
+ /** The private file and lock contract verified for this Claude Code release. */
7
+ export const CLAUDE_NATIVE_HANDOFF_VERSION = '2.1.273';
8
+ const MAX_NATIVE_FILE_BYTES = 4 * 1024 * 1024;
9
+ const MAX_PROCESS_CONTEXT_BYTES = 1024 * 1024;
10
+ const PROFILE_TIMEOUT_MS = 10_000;
11
+ const ACCOUNT_CACHES = [
12
+ 'additionalModelOptionsCache', 'additionalModelOptionsAnsweredAt', 'additionalModelCostsCache',
13
+ 'modelAccessCache', 'orgModelDefaultCache', 'lastSeenOrgDefaultUpdatedAt', 'clientDataCache',
14
+ 'clientDataCacheSlots', 'autoCompactWindowsCache', 'cachedUsageUtilization',
15
+ ];
16
+ const CREDENTIAL_OVERRIDES = [
17
+ 'CLAUDE_CODE_OAUTH_TOKEN', 'CLAUDE_CODE_OAUTH_TOKEN_FILE_DESCRIPTOR', 'ANTHROPIC_API_KEY',
18
+ 'ANTHROPIC_AUTH_TOKEN', 'ANTHROPIC_PROFILE', 'CLAUDE_CODE_USE_BEDROCK',
19
+ 'CLAUDE_CODE_USE_VERTEX', 'CLAUDE_CODE_USE_FOUNDRY', 'ANTHROPIC_BASE_URL',
20
+ 'ANTHROPIC_FEDERATION_RULE_ID', 'ANTHROPIC_ORGANIZATION_ID',
21
+ 'ANTHROPIC_IDENTITY_TOKEN_FILE', 'ANTHROPIC_IDENTITY_TOKEN', 'ANTHROPIC_WORKSPACE_ID',
22
+ 'ANTHROPIC_UNIX_SOCKET', 'CLAUDE_CODE_REMOTE', 'CLAUDE_CODE_SIMPLE',
23
+ 'CLAUDE_CODE_PROVIDER_MANAGED_BY_HOST', 'CLAUDE_CODE_HOST_AUTH_ENV_VAR',
24
+ 'CLAUDE_CODE_HOST_CREDS_FILE', 'CLAUDE_CODE_SESSION_ACCESS_TOKEN',
25
+ 'CLAUDE_CODE_OAUTH_REFRESH_TOKEN', 'CLAUDE_CODE_API_KEY_FILE_DESCRIPTOR',
26
+ 'CLAUDE_CODE_USE_GATEWAY',
27
+ 'CLAUDE_CODE_GATEWAY_TOKEN_FILE_DESCRIPTOR', 'CLAUDE_CODE_HFI_BEARER_TOKEN',
28
+ 'CLAUDE_BG_AUTH_SNAPSHOT_PATH',
29
+ ];
30
+ /** Refusal is distinct from a malformed login: Claude may use a different auth source. */
31
+ export class ClaudeNativeEffectiveAuthUnsupportedError extends Error {
32
+ reason;
33
+ code = 'unsupported_effective_auth';
34
+ constructor(reason) {
35
+ super(`Cannot prove that Claude Code ${CLAUDE_NATIVE_HANDOFF_VERSION} uses its native claude.ai login (${reason}).`);
36
+ this.reason = reason;
37
+ }
38
+ }
39
+ const hash = (value) => plugins.crypto.createHash('sha256').update(value).digest('hex');
40
+ const isRecord = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
41
+ const text = (value) => typeof value === 'string' && value.length > 0;
42
+ const sameDigests = (left, right) => left.credentialDigest === right.credentialDigest && left.configDigest === right.configDigest;
43
+ const onlyDigests = (value) => ({
44
+ credentialDigest: value.credentialDigest, configDigest: value.configDigest,
45
+ });
46
+ const preparedWrites = new WeakMap();
47
+ const sameIdentity = (left, right) => left.accountUuid === right.accountUuid && left.organizationUuid === right.organizationUuid;
48
+ const pathEnvironment = ['HOME', 'XDG_CONFIG_HOME', 'ANTHROPIC_CONFIG_DIR', 'CLAUDE_CONFIG_DIR'];
49
+ const contextKeys = new Set([...CREDENTIAL_OVERRIDES, ...pathEnvironment]);
50
+ const readProcessContext = (file) => {
51
+ const descriptor = plugins.fs.openSync(file, plugins.fs.constants.O_RDONLY | plugins.fs.constants.O_NOFOLLOW | plugins.fs.constants.O_NONBLOCK);
52
+ try {
53
+ const buffer = Buffer.alloc(MAX_PROCESS_CONTEXT_BYTES + 1);
54
+ let length = 0;
55
+ while (length < buffer.length) {
56
+ const count = plugins.fs.readSync(descriptor, buffer, length, buffer.length - length, null);
57
+ if (count === 0)
58
+ break;
59
+ length += count;
60
+ }
61
+ if (length === buffer.length)
62
+ throw new Error('Claude process context is too large to verify.');
63
+ return new TextDecoder('utf-8', { fatal: true }).decode(buffer.subarray(0, length));
64
+ }
65
+ finally {
66
+ plugins.fs.closeSync(descriptor);
67
+ }
68
+ };
69
+ const selectorEnvironment = (raw) => {
70
+ const selected = {};
71
+ for (const entry of raw.split('\0')) {
72
+ const separator = entry.indexOf('=');
73
+ if (separator < 1)
74
+ continue;
75
+ const key = entry.slice(0, separator);
76
+ if (!contextKeys.has(key))
77
+ continue;
78
+ if (Object.hasOwn(selected, key))
79
+ throw new Error('Claude process environment selector is ambiguous.');
80
+ // Presence is enough for credential selectors. Never retain their secret value.
81
+ selected[key] = pathEnvironment.includes(key)
82
+ ? entry.slice(separator + 1) : entry.length > separator + 1 ? 'present' : '';
83
+ }
84
+ return selected;
85
+ };
86
+ const processViewPath = (absolutePath, processRoot) => {
87
+ if (!plugins.path.isAbsolute(absolutePath)
88
+ || plugins.path.normalize(absolutePath) !== absolutePath) {
89
+ throw new ClaudeNativeEffectiveAuthUnsupportedError('running_session');
90
+ }
91
+ return processRoot ? plugins.path.join(processRoot, absolutePath.slice(1)) : absolutePath;
92
+ };
93
+ /** 2.1.273's `le` / `dse` / `H` selector in the installed bundle, offset 190076222. */
94
+ const assertNoKnownNativeLoginOverride = (env, processRoot) => {
95
+ for (const key of CREDENTIAL_OVERRIDES) {
96
+ if (env[key])
97
+ throw new ClaudeNativeEffectiveAuthUnsupportedError('override');
98
+ }
99
+ const configDir = env.ANTHROPIC_CONFIG_DIR?.trim()
100
+ || (env.XDG_CONFIG_HOME?.trim()
101
+ ? plugins.path.join(env.XDG_CONFIG_HOME.trim(), 'anthropic')
102
+ : env.HOME?.trim() ? plugins.path.join(env.HOME.trim(), '.config', 'anthropic') : null);
103
+ if (configDir === null)
104
+ return;
105
+ if (!plugins.path.isAbsolute(configDir) || plugins.path.normalize(configDir) !== configDir) {
106
+ throw new ClaudeNativeEffectiveAuthUnsupportedError('profile_unreadable');
107
+ }
108
+ let selected = 'default';
109
+ try {
110
+ selected = readNativeRaw(processViewPath(plugins.path.join(configDir, 'active_config'), processRoot))?.trim() || 'default';
111
+ // The vendor's profile resolver otherwise forms `configs/${selected}.json` directly.
112
+ if (!/^[A-Za-z0-9._-]+$/.test(selected) || selected === '.' || selected === '..') {
113
+ throw new ClaudeNativeEffectiveAuthUnsupportedError('profile_unreadable');
114
+ }
115
+ plugins.fs.lstatSync(processViewPath(plugins.path.join(configDir, 'configs', `${selected}.json`), processRoot));
116
+ }
117
+ catch (error) {
118
+ if (error instanceof ClaudeNativeEffectiveAuthUnsupportedError)
119
+ throw error;
120
+ if (error.code === 'ENOENT')
121
+ return;
122
+ throw new ClaudeNativeEffectiveAuthUnsupportedError('profile_unreadable');
123
+ }
124
+ // Even an implicit user_oauth profile is refused: its credential source is outside this journal.
125
+ throw new ClaudeNativeEffectiveAuthUnsupportedError('profile');
126
+ };
127
+ const assertNativeHome = (env, configDir) => {
128
+ const selected = env.CLAUDE_CONFIG_DIR?.trim()
129
+ || (env.HOME?.trim() ? plugins.path.join(env.HOME.trim(), '.claude') : null);
130
+ if (!selected || !plugins.path.isAbsolute(selected) || plugins.path.normalize(selected) !== configDir) {
131
+ throw new ClaudeNativeEffectiveAuthUnsupportedError('override');
132
+ }
133
+ };
134
+ const selectedNativeConfigParent = (env) => env.CLAUDE_CONFIG_DIR?.trim() || env.HOME?.trim() || null;
135
+ const assertSettingsSelectNative = (file) => {
136
+ let raw;
137
+ try {
138
+ raw = readNativeRaw(file);
139
+ }
140
+ catch {
141
+ throw new ClaudeNativeEffectiveAuthUnsupportedError('settings');
142
+ }
143
+ if (raw === null)
144
+ return;
145
+ let settings;
146
+ try {
147
+ settings = document(raw);
148
+ }
149
+ catch {
150
+ throw new ClaudeNativeEffectiveAuthUnsupportedError('settings');
151
+ }
152
+ if (text(settings.apiKeyHelper) || settings.forceLoginMethod || settings.forceLoginGatewayUrl) {
153
+ throw new ClaudeNativeEffectiveAuthUnsupportedError('settings');
154
+ }
155
+ if (settings.env !== undefined) {
156
+ if (!isRecord(settings.env))
157
+ throw new ClaudeNativeEffectiveAuthUnsupportedError('settings');
158
+ for (const key of contextKeys) {
159
+ if (settings.env[key])
160
+ throw new ClaudeNativeEffectiveAuthUnsupportedError('settings');
161
+ }
162
+ }
163
+ };
164
+ const assertNoManagedAuthSource = (root) => {
165
+ try {
166
+ plugins.fs.lstatSync(plugins.path.join(root, 'managed-settings.json'));
167
+ throw new ClaudeNativeEffectiveAuthUnsupportedError('settings');
168
+ }
169
+ catch (error) {
170
+ if (error instanceof ClaudeNativeEffectiveAuthUnsupportedError)
171
+ throw error;
172
+ if (error.code !== 'ENOENT') {
173
+ throw new ClaudeNativeEffectiveAuthUnsupportedError('settings');
174
+ }
175
+ }
176
+ try {
177
+ if (plugins.fs.readdirSync(plugins.path.join(root, 'managed-settings.d'))
178
+ .some(name => !name.startsWith('.') && name.endsWith('.json'))) {
179
+ throw new ClaudeNativeEffectiveAuthUnsupportedError('settings');
180
+ }
181
+ }
182
+ catch (error) {
183
+ if (error instanceof ClaudeNativeEffectiveAuthUnsupportedError)
184
+ throw error;
185
+ if (error.code !== 'ENOENT') {
186
+ throw new ClaudeNativeEffectiveAuthUnsupportedError('settings');
187
+ }
188
+ }
189
+ };
190
+ const assertProjectSettingsSelectNative = (cwd, processRoot) => {
191
+ for (let directory = cwd;; directory = plugins.path.dirname(directory)) {
192
+ for (const name of ['settings.json', 'settings.local.json']) {
193
+ assertSettingsSelectNative(processViewPath(plugins.path.join(directory, '.claude', name), processRoot));
194
+ }
195
+ if (plugins.path.dirname(directory) === directory)
196
+ break;
197
+ }
198
+ };
199
+ /** Read native files without following a replacement symlink or accepting an unbounded/partial file. */
200
+ const readNativeBytes = (file) => {
201
+ let descriptor;
202
+ try {
203
+ descriptor = plugins.fs.openSync(file, plugins.fs.constants.O_RDONLY | plugins.fs.constants.O_NONBLOCK | plugins.fs.constants.O_NOFOLLOW);
204
+ const stat = plugins.fs.fstatSync(descriptor);
205
+ if (!stat.isFile() || stat.size > MAX_NATIVE_FILE_BYTES || stat.uid !== process.getuid?.()) {
206
+ throw new Error('Native Claude credential file is not a bounded owner-only regular file.');
207
+ }
208
+ const buffer = Buffer.alloc(MAX_NATIVE_FILE_BYTES + 1);
209
+ let length = 0;
210
+ while (length < buffer.length) {
211
+ const count = plugins.fs.readSync(descriptor, buffer, length, buffer.length - length, null);
212
+ if (count === 0)
213
+ break;
214
+ length += count;
215
+ }
216
+ if (length === buffer.length)
217
+ throw new Error('Native Claude credential file exceeds the supported size.');
218
+ // Keep the original bytes: TextDecoder accepts a BOM but strips it from text.
219
+ const bytes = buffer.subarray(0, length);
220
+ new TextDecoder('utf-8', { fatal: true }).decode(bytes);
221
+ return bytes;
222
+ }
223
+ catch (error) {
224
+ if (error.code === 'ENOENT')
225
+ return null;
226
+ throw new Error('Native Claude credential file is unreadable or changed; no new credential was written.');
227
+ }
228
+ finally {
229
+ if (descriptor !== undefined)
230
+ plugins.fs.closeSync(descriptor);
231
+ }
232
+ };
233
+ const decodeNativeRaw = (bytes) => bytes === null ? null
234
+ : new TextDecoder('utf-8', { fatal: true }).decode(bytes);
235
+ const readNativeRaw = (file) => decodeNativeRaw(readNativeBytes(file));
236
+ const document = (raw) => {
237
+ if (raw === null)
238
+ return {};
239
+ try {
240
+ const value = JSON.parse(typeof raw === 'string' ? raw : decodeNativeRaw(raw));
241
+ if (isRecord(value))
242
+ return value;
243
+ }
244
+ catch { /* Report one fixed, secret-free error. */ }
245
+ throw new Error('Native Claude credential file is incomplete or malformed.');
246
+ };
247
+ const validatedLogin = (credential, config) => {
248
+ if (text(config.primaryApiKey)) {
249
+ // 2.1.273 `qh` / `lge` reads this /login-managed API key before subscriber OAuth.
250
+ throw new ClaudeNativeEffectiveAuthUnsupportedError('override');
251
+ }
252
+ const oauthValue = credential.claudeAiOauth;
253
+ const accountValue = config.oauthAccount;
254
+ if (oauthValue === undefined && accountValue === undefined)
255
+ return { login: null, identity: null };
256
+ if (!isRecord(oauthValue) || !isRecord(accountValue)
257
+ || !text(oauthValue.accessToken) || !text(oauthValue.refreshToken)
258
+ || typeof oauthValue.expiresAt !== 'number' || !Number.isFinite(oauthValue.expiresAt)
259
+ || !Array.isArray(oauthValue.scopes) || !oauthValue.scopes.every(scope => typeof scope === 'string')
260
+ || !text(accountValue.accountUuid) || !text(accountValue.organizationUuid)) {
261
+ throw new Error('Native Claude login or account metadata is incomplete.');
262
+ }
263
+ // `Sc` / `CO` and the full native subscription gate in 2.1.273 require these fields.
264
+ if (!oauthValue.scopes.includes('user:inference')
265
+ || (oauthValue.subscriptionType !== 'pro' && oauthValue.subscriptionType !== 'max')) {
266
+ throw new ClaudeNativeEffectiveAuthUnsupportedError('subscription');
267
+ }
268
+ return {
269
+ login: { claudeAiOauth: structuredClone(oauthValue), oauthAccount: structuredClone(accountValue) },
270
+ identity: { accountUuid: accountValue.accountUuid, organizationUuid: accountValue.organizationUuid },
271
+ };
272
+ };
273
+ const readPair = (credentialFile, configFile) => ({ credentialRaw: readNativeBytes(credentialFile), configRaw: readNativeBytes(configFile) });
274
+ const sameRaw = (left, right) => left === null ? right === null : right !== null && left.equals(right);
275
+ const samePair = (left, right) => sameRaw(left.credentialRaw, right.credentialRaw) && sameRaw(left.configRaw, right.configRaw);
276
+ const digests = (pair) => ({
277
+ credentialDigest: pair.credentialRaw === null ? null : hash(pair.credentialRaw),
278
+ configDigest: pair.configRaw === null ? null : hash(pair.configRaw),
279
+ });
280
+ const directoryIdentity = (directory) => {
281
+ const stat = plugins.fs.statSync(directory, { bigint: true });
282
+ if (!stat.isDirectory())
283
+ throw new Error('Claude native home is not a directory.');
284
+ return { device: stat.dev, inode: stat.ino };
285
+ };
286
+ const sameDirectory = (left, right) => left.device === right.device && left.inode === right.inode;
287
+ const processHasExited = (pid) => {
288
+ try {
289
+ process.kill(pid, 0);
290
+ return false;
291
+ }
292
+ catch (error) {
293
+ return error.code === 'ESRCH';
294
+ }
295
+ };
296
+ /** Default probe is conservative: every same-user Claude executable must prove the pinned release. */
297
+ class ClaudeNativeVersionProbe {
298
+ executable;
299
+ constructor(executable) {
300
+ this.executable = executable;
301
+ }
302
+ installedVersion() {
303
+ try {
304
+ const output = plugins.childProcess.execFileSync(this.executable, ['--version'], {
305
+ encoding: 'utf8', timeout: 5_000, maxBuffer: 1024, windowsHide: true,
306
+ }).trim();
307
+ const matched = /^(\d+\.\d+\.\d+) \(Claude Code\)$/.exec(output);
308
+ return matched?.[1] ?? 'unknown';
309
+ }
310
+ catch {
311
+ return 'unknown';
312
+ }
313
+ }
314
+ runningContexts() {
315
+ const contexts = [];
316
+ // Keep candidates from every mount namespace: a bind mount can expose the same inode.
317
+ const candidates = new HarnessProcesses('claude').list();
318
+ for (const running of candidates) {
319
+ let version = null;
320
+ let env = null;
321
+ let cwd = null;
322
+ let hasSettingsOverride = null;
323
+ let nativeHomeIdentity = null;
324
+ let configParentIdentity = null;
325
+ let mountNamespace = null;
326
+ let processRoot = null;
327
+ try {
328
+ const executable = plugins.fs.readlinkSync(`/proc/${running.pid}/exe`);
329
+ version = /(?:\/claude\/versions\/|\/remote\/ccd-cli\/)(\d+\.\d+\.\d+)$/.exec(executable)?.[1] ?? null;
330
+ mountNamespace = plugins.fs.readlinkSync(`/proc/${running.pid}/ns/mnt`);
331
+ env = selectorEnvironment(readProcessContext(`/proc/${running.pid}/environ`));
332
+ cwd = plugins.fs.readlinkSync(`/proc/${running.pid}/cwd`);
333
+ processRoot = `/proc/${running.pid}/root`;
334
+ if (!plugins.path.isAbsolute(cwd) || !sameDirectory(directoryIdentity(`/proc/${running.pid}/cwd`), directoryIdentity(processViewPath(cwd, processRoot)))) {
335
+ throw new Error('Claude process working directory cannot be resolved in its mount namespace.');
336
+ }
337
+ const selectedHome = env.CLAUDE_CONFIG_DIR?.trim()
338
+ || (env.HOME?.trim() ? plugins.path.join(env.HOME.trim(), '.claude') : null);
339
+ if (!selectedHome)
340
+ throw new Error('Claude process native home is unknown.');
341
+ if (plugins.path.isAbsolute(selectedHome)
342
+ && plugins.path.normalize(selectedHome) !== selectedHome) {
343
+ throw new Error('Claude process native home path is ambiguous.');
344
+ }
345
+ const processHome = plugins.path.isAbsolute(selectedHome)
346
+ ? processViewPath(selectedHome, processRoot)
347
+ // Preserve the proc magic symlink before `..` is resolved by the target's VFS.
348
+ : `/proc/${running.pid}/cwd/${selectedHome}`;
349
+ nativeHomeIdentity = directoryIdentity(processHome);
350
+ const selectedConfigParent = selectedNativeConfigParent(env);
351
+ if (!selectedConfigParent)
352
+ throw new Error('Claude process config parent is unknown.');
353
+ const processConfigParent = plugins.path.isAbsolute(selectedConfigParent)
354
+ ? processViewPath(selectedConfigParent, processRoot)
355
+ : `/proc/${running.pid}/cwd/${selectedConfigParent}`;
356
+ configParentIdentity = directoryIdentity(processConfigParent);
357
+ const argv = readProcessContext(`/proc/${running.pid}/cmdline`).split('\0').filter(Boolean);
358
+ hasSettingsOverride = argv.some(arg => ['--settings', '--managed-settings', '--setting-sources', '--bare'].some(flag => arg === flag || arg.startsWith(`${flag}=`)));
359
+ }
360
+ catch {
361
+ // A vanished process no longer owns a grant; an unreadable live candidate is ambiguous.
362
+ if (processHasExited(running.pid))
363
+ continue;
364
+ }
365
+ contexts.push({ version, env, cwd, hasSettingsOverride, nativeHomeIdentity,
366
+ configParentIdentity, mountNamespace, processRoot });
367
+ }
368
+ return contexts;
369
+ }
370
+ }
371
+ /** Explicitly limited to Claude Code's installed 2.1.273 Linux native-file contract. */
372
+ export class ClaudeNativeAdapter {
373
+ options;
374
+ credentialFile;
375
+ locks;
376
+ versionProbe;
377
+ fetcher;
378
+ env;
379
+ settingsFiles;
380
+ platform;
381
+ constructor(options) {
382
+ this.options = options;
383
+ if (!plugins.path.isAbsolute(options.configDir) || !plugins.path.isAbsolute(options.configFile)
384
+ || plugins.path.normalize(options.configDir) !== options.configDir
385
+ || plugins.path.normalize(options.configFile) !== options.configFile) {
386
+ throw new Error('Native Claude paths must be normalized absolute paths.');
387
+ }
388
+ if (![plugins.path.join(options.configDir, '.claude.json'),
389
+ plugins.path.join(plugins.os.homedir(), '.claude.json')].includes(options.configFile)) {
390
+ throw new Error('Native Claude account metadata must use its vendor config file.');
391
+ }
392
+ this.credentialFile = plugins.path.join(options.configDir, '.credentials.json');
393
+ this.locks = new ClaudeCodeLocks(options.configDir, options.configFile, { timeoutMs: options.lockTimeoutMs });
394
+ this.versionProbe = options.versionProbe ?? new ClaudeNativeVersionProbe(options.executable ?? 'claude');
395
+ this.fetcher = options.fetch ?? globalThis.fetch;
396
+ this.env = options.env ?? process.env;
397
+ this.settingsFiles = options.settingsFiles ?? [plugins.path.join(options.configDir, 'settings.json'),
398
+ plugins.path.join(process.cwd(), '.claude/settings.json'),
399
+ plugins.path.join(process.cwd(), '.claude/settings.local.json')];
400
+ this.platform = options.platform ?? process.platform;
401
+ }
402
+ assertSupported() {
403
+ if (this.platform !== 'linux')
404
+ throw new Error('Native Claude handoff requires the verified Linux file backend.');
405
+ const home = plugins.fs.lstatSync(this.options.configDir);
406
+ if (!home.isDirectory() || home.isSymbolicLink() || home.uid !== process.getuid?.()
407
+ || plugins.fs.realpathSync(this.options.configDir) !== this.options.configDir) {
408
+ throw new Error('Native Claude home must be a real directory owned by this user.');
409
+ }
410
+ const configParent = plugins.path.dirname(this.options.configFile);
411
+ const parent = plugins.fs.lstatSync(configParent);
412
+ if (!parent.isDirectory() || parent.isSymbolicLink() || parent.uid !== process.getuid?.()
413
+ || plugins.fs.realpathSync(configParent) !== configParent) {
414
+ throw new Error('Native Claude account metadata parent must be a real directory owned by this user.');
415
+ }
416
+ assertNoKnownNativeLoginOverride(this.env);
417
+ assertNativeHome(this.env, this.options.configDir);
418
+ const daemonConfigParent = selectedNativeConfigParent(this.env);
419
+ if (!daemonConfigParent || !plugins.path.isAbsolute(daemonConfigParent)
420
+ || plugins.path.join(daemonConfigParent, '.claude.json') !== this.options.configFile) {
421
+ throw new ClaudeNativeEffectiveAuthUnsupportedError('override');
422
+ }
423
+ assertNoManagedAuthSource(this.options.managedSettingsDirectory ?? '/etc/claude-code');
424
+ for (const file of this.settingsFiles) {
425
+ assertSettingsSelectNative(file);
426
+ }
427
+ if (this.versionProbe.installedVersion() !== CLAUDE_NATIVE_HANDOFF_VERSION) {
428
+ throw new Error(`Native Claude handoff requires Claude Code ${CLAUDE_NATIVE_HANDOFF_VERSION} for every active session.`);
429
+ }
430
+ let runningSessions = 0;
431
+ const nativeHomeIdentity = directoryIdentity(this.options.configDir);
432
+ const configParentIdentity = directoryIdentity(configParent);
433
+ for (const running of this.versionProbe.runningContexts()) {
434
+ if (!running.nativeHomeIdentity) {
435
+ throw new ClaudeNativeEffectiveAuthUnsupportedError('running_session');
436
+ }
437
+ if (!sameDirectory(running.nativeHomeIdentity, nativeHomeIdentity))
438
+ continue;
439
+ if (!running.configParentIdentity
440
+ || !sameDirectory(running.configParentIdentity, configParentIdentity)) {
441
+ throw new ClaudeNativeEffectiveAuthUnsupportedError('running_session');
442
+ }
443
+ if (running.version !== CLAUDE_NATIVE_HANDOFF_VERSION) {
444
+ throw new Error(`Native Claude handoff requires Claude Code ${CLAUDE_NATIVE_HANDOFF_VERSION} for every active session.`);
445
+ }
446
+ if (!running.env || !running.cwd || running.hasSettingsOverride === null
447
+ || !running.mountNamespace || !running.processRoot) {
448
+ throw new ClaudeNativeEffectiveAuthUnsupportedError('running_session');
449
+ }
450
+ if (running.hasSettingsOverride)
451
+ throw new ClaudeNativeEffectiveAuthUnsupportedError('override');
452
+ assertNoKnownNativeLoginOverride(running.env, running.processRoot);
453
+ assertNoManagedAuthSource(processViewPath(this.options.managedSettingsDirectory ?? '/etc/claude-code', running.processRoot));
454
+ assertProjectSettingsSelectNative(running.cwd, running.processRoot);
455
+ runningSessions++;
456
+ }
457
+ return runningSessions;
458
+ }
459
+ /** The caller keeps its SmartData journal and both ownership transactions inside this callback. */
460
+ async withExclusiveHome(action) {
461
+ this.assertSupported();
462
+ return this.locks.holdAsync(async (lease) => {
463
+ this.assertSupported();
464
+ const session = new ClaudeNativeLockedSession(this.credentialFile, this.options.configFile, this.fetcher, lease, () => this.assertSupported());
465
+ const firstSnapshot = session.readStable();
466
+ const result = await action(session);
467
+ try {
468
+ lease.assertHeld();
469
+ const afterRunningSessions = this.assertSupported();
470
+ if (firstSnapshot.runningEffectiveAuth === 'no_scoped_sessions' && afterRunningSessions > 0) {
471
+ throw new ClaudeNativeEffectiveAuthUnsupportedError('running_session');
472
+ }
473
+ }
474
+ catch {
475
+ // The caller may already have committed a journal or changed one native file.
476
+ throw new ClaudeCodeLockOutcomeUnknownError(true);
477
+ }
478
+ return result;
479
+ });
480
+ }
481
+ }
482
+ class ClaudeNativeLockedSession {
483
+ credentialFile;
484
+ configFile;
485
+ fetcher;
486
+ lease;
487
+ assertSupported;
488
+ constructor(credentialFile, configFile, fetcher, lease, assertSupported) {
489
+ this.credentialFile = credentialFile;
490
+ this.configFile = configFile;
491
+ this.fetcher = fetcher;
492
+ this.lease = lease;
493
+ this.assertSupported = assertSupported;
494
+ }
495
+ observation() {
496
+ try {
497
+ return digests(readPair(this.credentialFile, this.configFile));
498
+ }
499
+ catch {
500
+ return null;
501
+ }
502
+ }
503
+ readStable() {
504
+ this.lease.assertHeld();
505
+ const runningSessions = this.assertSupported();
506
+ let lastError;
507
+ for (let attempt = 0; attempt < 5; attempt++) {
508
+ try {
509
+ const before = readPair(this.credentialFile, this.configFile);
510
+ const credential = document(before.credentialRaw);
511
+ const config = document(before.configRaw);
512
+ const observed = validatedLogin(credential, config);
513
+ const after = readPair(this.credentialFile, this.configFile);
514
+ if (samePair(before, after)) {
515
+ this.lease.assertHeld();
516
+ return { ...digests(after), ...observed,
517
+ runningEffectiveAuth: runningSessions === 0 ? 'no_scoped_sessions' : 'unsupported_effective_auth' };
518
+ }
519
+ }
520
+ catch (error) {
521
+ if (error instanceof ClaudeCodeLockOutcomeUnknownError)
522
+ throw error;
523
+ lastError = error;
524
+ }
525
+ if (attempt < 4) {
526
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 20);
527
+ }
528
+ }
529
+ if (lastError instanceof ClaudeNativeEffectiveAuthUnsupportedError)
530
+ throw lastError;
531
+ throw new Error(lastError instanceof Error ? lastError.message
532
+ : 'Native Claude files changed while being read; no credential was written.');
533
+ }
534
+ async verifyProfileIdentity(snapshot, expected) {
535
+ this.lease.assertHeld();
536
+ this.assertSupported();
537
+ const token = snapshot.login?.claudeAiOauth.accessToken;
538
+ if (!text(token) || !snapshot.identity || !sameIdentity(snapshot.identity, expected)) {
539
+ throw new Error('Native Claude login identity differs from the selected account.');
540
+ }
541
+ const response = await claudeRequest(this.fetcher, {
542
+ url: 'https://api.anthropic.com/api/oauth/profile', method: 'GET',
543
+ headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json', 'Cache-Control': 'no-cache' },
544
+ subject: 'Claude account', timeoutMs: PROFILE_TIMEOUT_MS, now: Date.now,
545
+ });
546
+ this.lease.assertHeld();
547
+ const current = this.observation();
548
+ if (!current || !sameDigests(current, snapshot)) {
549
+ throw new Error('Native Claude login changed during provider identity verification.');
550
+ }
551
+ if (response.status !== 200 || !isRecord(response.body)
552
+ || !isRecord(response.body.account) || !isRecord(response.body.organization)
553
+ || response.body.account.uuid !== expected.accountUuid
554
+ || response.body.organization.uuid !== expected.organizationUuid) {
555
+ throw new Error('Claude account profile did not verify the selected immutable identity.');
556
+ }
557
+ return { ...expected, accessTokenDigest: hash(token) };
558
+ }
559
+ async prepareWrite(input) {
560
+ this.lease.assertHeld();
561
+ this.assertSupported();
562
+ let before;
563
+ try {
564
+ before = this.readStable();
565
+ }
566
+ catch {
567
+ return { kind: 'not_written', reason: 'source_unreadable', observed: this.observation() };
568
+ }
569
+ if (!sameDigests(before, input.expected)) {
570
+ return { kind: 'not_written', reason: 'source_changed', observed: onlyDigests(before) };
571
+ }
572
+ if (input.expectedSourceIdentity === null ? before.identity !== null
573
+ : before.identity === null || !sameIdentity(before.identity, input.expectedSourceIdentity)) {
574
+ return { kind: 'not_written', reason: 'source_identity_mismatch', observed: onlyDigests(before) };
575
+ }
576
+ let target;
577
+ try {
578
+ target = validatedLogin({ claudeAiOauth: input.targetLogin.claudeAiOauth }, { oauthAccount: input.targetLogin.oauthAccount });
579
+ }
580
+ catch {
581
+ return { kind: 'not_written', reason: 'target_unverified', observed: onlyDigests(before) };
582
+ }
583
+ if (!target.login || !target.identity || !sameIdentity(target.identity, input.expectedIdentity)) {
584
+ return { kind: 'not_written', reason: 'target_unverified', observed: onlyDigests(before) };
585
+ }
586
+ let profile;
587
+ try {
588
+ profile = await this.verifyProfileIdentity({ ...before, ...target }, input.expectedIdentity);
589
+ }
590
+ catch {
591
+ this.lease.assertHeld();
592
+ this.assertSupported();
593
+ const observed = this.observation();
594
+ if (!observed)
595
+ return { kind: 'not_written', reason: 'source_unreadable', observed: null };
596
+ if (!sameDigests(observed, input.expected)) {
597
+ return { kind: 'not_written', reason: 'source_changed', observed };
598
+ }
599
+ return { kind: 'not_written', reason: 'target_unverified', observed: onlyDigests(before) };
600
+ }
601
+ const current = this.observation();
602
+ if (!current || !sameDigests(current, input.expected)) {
603
+ return { kind: 'not_written', reason: 'source_changed', observed: current };
604
+ }
605
+ this.lease.assertHeld();
606
+ this.assertSupported();
607
+ let original;
608
+ try {
609
+ original = readPair(this.credentialFile, this.configFile);
610
+ }
611
+ catch {
612
+ return { kind: 'not_written', reason: 'source_unreadable', observed: this.observation() };
613
+ }
614
+ if (!sameDigests(digests(original), input.expected)) {
615
+ return { kind: 'not_written', reason: 'source_changed', observed: digests(original) };
616
+ }
617
+ const credential = document(original.credentialRaw);
618
+ const config = document(original.configRaw);
619
+ const nextCredential = { ...credential, claudeAiOauth: target.login.claudeAiOauth };
620
+ const nextConfig = { ...config, oauthAccount: target.login.oauthAccount };
621
+ for (const key of ACCOUNT_CACHES)
622
+ delete nextConfig[key];
623
+ const credentialRaw = JSON.stringify(nextCredential, null, 2) + '\n';
624
+ const configRaw = JSON.stringify(nextConfig, null, 2) + '\n';
625
+ if (Buffer.byteLength(credentialRaw) > MAX_NATIVE_FILE_BYTES
626
+ || Buffer.byteLength(configRaw) > MAX_NATIVE_FILE_BYTES) {
627
+ return { kind: 'not_written', reason: 'target_oversized', observed: onlyDigests(before) };
628
+ }
629
+ const plan = Object.freeze({
630
+ before: Object.freeze(onlyDigests(input.expected)),
631
+ after: Object.freeze(digests({ credentialRaw: Buffer.from(credentialRaw), configRaw: Buffer.from(configRaw) })),
632
+ sourceIdentity: input.expectedSourceIdentity === null ? null : Object.freeze({ ...input.expectedSourceIdentity }),
633
+ targetIdentity: Object.freeze({ ...input.expectedIdentity }),
634
+ profile: Object.freeze({ ...profile }),
635
+ });
636
+ preparedWrites.set(plan, { session: this, credentialRaw, configRaw,
637
+ originalConfigRaw: original.configRaw, targetAccessToken: String(target.login.claudeAiOauth.accessToken) });
638
+ return { kind: 'prepared', plan };
639
+ }
640
+ exportPreparedSource(plan) {
641
+ this.lease.assertHeld();
642
+ this.assertSupported();
643
+ const prepared = preparedWrites.get(plan);
644
+ if (!prepared || prepared.session !== this)
645
+ throw new Error('Claude native write plan is not held by this lease.');
646
+ const stable = this.readStable();
647
+ if (!sameDigests(stable, plan.before)
648
+ || (plan.sourceIdentity === null ? stable.identity !== null
649
+ : stable.identity === null || !sameIdentity(stable.identity, plan.sourceIdentity))) {
650
+ throw new Error('Claude native source changed before backup export.');
651
+ }
652
+ const original = readPair(this.credentialFile, this.configFile);
653
+ if (!sameDigests(digests(original), plan.before)
654
+ || !sameRaw(original.configRaw, prepared.originalConfigRaw)) {
655
+ throw new Error('Claude native source changed before backup export.');
656
+ }
657
+ this.lease.assertHeld();
658
+ this.assertSupported();
659
+ return { before: Object.freeze({ ...plan.before }),
660
+ credentialBytes: original.credentialRaw === null ? null : Buffer.from(original.credentialRaw),
661
+ configBytes: original.configRaw === null ? null : Buffer.from(original.configRaw) };
662
+ }
663
+ writePreparedIfCurrent(plan) {
664
+ this.lease.assertHeld();
665
+ this.assertSupported();
666
+ const prepared = preparedWrites.get(plan);
667
+ if (!prepared || prepared.session !== this)
668
+ throw new Error('Claude native write plan is not held by this lease.');
669
+ preparedWrites.delete(plan);
670
+ let before;
671
+ try {
672
+ before = this.readStable();
673
+ }
674
+ catch {
675
+ return { kind: 'not_written', reason: 'source_unreadable', observed: this.observation() };
676
+ }
677
+ if (!sameDigests(before, plan.before)) {
678
+ return { kind: 'not_written', reason: 'source_changed', observed: onlyDigests(before) };
679
+ }
680
+ if (plan.sourceIdentity === null ? before.identity !== null
681
+ : before.identity === null || !sameIdentity(before.identity, plan.sourceIdentity)) {
682
+ return { kind: 'not_written', reason: 'source_identity_mismatch', observed: onlyDigests(before) };
683
+ }
684
+ let original;
685
+ try {
686
+ original = readPair(this.credentialFile, this.configFile);
687
+ }
688
+ catch {
689
+ return { kind: 'not_written', reason: 'source_unreadable', observed: this.observation() };
690
+ }
691
+ if (!sameDigests(digests(original), plan.before)
692
+ || !sameRaw(original.configRaw, prepared.originalConfigRaw)) {
693
+ return { kind: 'not_written', reason: 'source_changed', observed: digests(original) };
694
+ }
695
+ // The first write is the uncertainty boundary; no automatic rollback can prove ownership after it.
696
+ try {
697
+ this.lease.assertHeld();
698
+ writeSecretFileAtomically(this.credentialFile, prepared.credentialRaw);
699
+ this.lease.assertHeld();
700
+ const middle = readPair(this.credentialFile, this.configFile);
701
+ if (!sameRaw(middle.credentialRaw, Buffer.from(prepared.credentialRaw))
702
+ || !sameRaw(middle.configRaw, original.configRaw)) {
703
+ return { kind: 'uncertain', reason: 'native_write_or_readback_failed', observed: digests(middle) };
704
+ }
705
+ writeSecretFileAtomically(this.configFile, prepared.configRaw);
706
+ this.lease.assertHeld();
707
+ const after = readPair(this.credentialFile, this.configFile);
708
+ if (!sameRaw(after.credentialRaw, Buffer.from(prepared.credentialRaw))
709
+ || !sameRaw(after.configRaw, Buffer.from(prepared.configRaw))
710
+ || !sameDigests(digests(after), plan.after)) {
711
+ return { kind: 'uncertain', reason: 'native_write_or_readback_failed', observed: digests(after) };
712
+ }
713
+ const snapshot = this.readStable();
714
+ if (!snapshot.login || !snapshot.identity || !sameIdentity(snapshot.identity, plan.targetIdentity)
715
+ || !sameDigests(snapshot, plan.after)
716
+ || snapshot.login.claudeAiOauth.accessToken !== prepared.targetAccessToken
717
+ || plan.profile.accessTokenDigest !== hash(String(snapshot.login.claudeAiOauth.accessToken))) {
718
+ return { kind: 'uncertain', reason: 'native_write_or_readback_failed', observed: onlyDigests(snapshot) };
719
+ }
720
+ return { kind: 'written', snapshot, profile: plan.profile };
721
+ }
722
+ catch {
723
+ return { kind: 'uncertain', reason: 'native_write_or_readback_failed', observed: this.observation() };
724
+ }
725
+ }
726
+ async writeIfCurrent(input) {
727
+ const prepared = await this.prepareWrite(input);
728
+ return prepared.kind === 'prepared' ? this.writePreparedIfCurrent(prepared.plan) : prepared;
729
+ }
730
+ }
731
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jbGF1ZGVuYXRpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmNsYXVkZW5hdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsZUFBZSxFQUM5QixNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFakUsZ0ZBQWdGO0FBQ2hGLE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHLFNBQVMsQ0FBQztBQUN2RCxNQUFNLHFCQUFxQixHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQzlDLE1BQU0seUJBQXlCLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUM5QyxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQztBQUNsQyxNQUFNLGNBQWMsR0FBRztJQUNyQiw2QkFBNkIsRUFBRSxrQ0FBa0MsRUFBRSwyQkFBMkI7SUFDOUYsa0JBQWtCLEVBQUUsc0JBQXNCLEVBQUUsNkJBQTZCLEVBQUUsaUJBQWlCO0lBQzVGLHNCQUFzQixFQUFFLHlCQUF5QixFQUFFLHdCQUF3QjtDQUNuRSxDQUFDO0FBQ1gsTUFBTSxvQkFBb0IsR0FBRztJQUMzQix5QkFBeUIsRUFBRSx5Q0FBeUMsRUFBRSxtQkFBbUI7SUFDekYsc0JBQXNCLEVBQUUsbUJBQW1CLEVBQUUseUJBQXlCO0lBQ3RFLHdCQUF3QixFQUFFLHlCQUF5QixFQUFFLG9CQUFvQjtJQUN6RSw4QkFBOEIsRUFBRSwyQkFBMkI7SUFDM0QsK0JBQStCLEVBQUUsMEJBQTBCLEVBQUUsd0JBQXdCO0lBQ3JGLHVCQUF1QixF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