@agent-score/commerce 2.5.0 → 2.6.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 (80) hide show
  1. package/README.md +19 -17
  2. package/dist/challenge/index.d.mts +26 -2
  3. package/dist/challenge/index.d.ts +26 -2
  4. package/dist/challenge/index.js +14 -5
  5. package/dist/challenge/index.js.map +1 -1
  6. package/dist/challenge/index.mjs +14 -5
  7. package/dist/challenge/index.mjs.map +1 -1
  8. package/dist/{checkout-McfNpZJf.d.ts → checkout-C4RD7M0Z.d.ts} +46 -13
  9. package/dist/{checkout-o17dIxHi.d.mts → checkout-CzB9f_jf.d.mts} +46 -13
  10. package/dist/core.d.mts +20 -9
  11. package/dist/core.d.ts +20 -9
  12. package/dist/core.js +35 -24
  13. package/dist/core.js.map +1 -1
  14. package/dist/core.mjs +35 -24
  15. package/dist/core.mjs.map +1 -1
  16. package/dist/discovery/index.d.mts +17 -2
  17. package/dist/discovery/index.d.ts +17 -2
  18. package/dist/discovery/index.js +36 -12
  19. package/dist/discovery/index.js.map +1 -1
  20. package/dist/discovery/index.mjs +35 -12
  21. package/dist/discovery/index.mjs.map +1 -1
  22. package/dist/{gate-CWP10xPQ.d.mts → gate-D2RP6bZg.d.ts} +109 -141
  23. package/dist/{gate-CWP10xPQ.d.ts → gate-GCXy4FHI.d.mts} +109 -141
  24. package/dist/identity/express.d.mts +3 -1
  25. package/dist/identity/express.d.ts +3 -1
  26. package/dist/identity/express.js +164 -55
  27. package/dist/identity/express.js.map +1 -1
  28. package/dist/identity/express.mjs +164 -55
  29. package/dist/identity/express.mjs.map +1 -1
  30. package/dist/identity/fastify.d.mts +3 -1
  31. package/dist/identity/fastify.d.ts +3 -1
  32. package/dist/identity/fastify.js +171 -57
  33. package/dist/identity/fastify.js.map +1 -1
  34. package/dist/identity/fastify.mjs +171 -57
  35. package/dist/identity/fastify.mjs.map +1 -1
  36. package/dist/identity/hono.d.mts +3 -1
  37. package/dist/identity/hono.d.ts +3 -1
  38. package/dist/identity/hono.js +159 -59
  39. package/dist/identity/hono.js.map +1 -1
  40. package/dist/identity/hono.mjs +159 -59
  41. package/dist/identity/hono.mjs.map +1 -1
  42. package/dist/identity/nextjs.d.mts +3 -1
  43. package/dist/identity/nextjs.d.ts +3 -1
  44. package/dist/identity/nextjs.js +153 -56
  45. package/dist/identity/nextjs.js.map +1 -1
  46. package/dist/identity/nextjs.mjs +153 -56
  47. package/dist/identity/nextjs.mjs.map +1 -1
  48. package/dist/identity/policy.d.mts +21 -2
  49. package/dist/identity/policy.d.ts +21 -2
  50. package/dist/identity/policy.js +22 -1
  51. package/dist/identity/policy.js.map +1 -1
  52. package/dist/identity/policy.mjs +21 -1
  53. package/dist/identity/policy.mjs.map +1 -1
  54. package/dist/identity/web.d.mts +3 -1
  55. package/dist/identity/web.d.ts +3 -1
  56. package/dist/identity/web.js +153 -56
  57. package/dist/identity/web.js.map +1 -1
  58. package/dist/identity/web.mjs +153 -56
  59. package/dist/identity/web.mjs.map +1 -1
  60. package/dist/index.d.mts +55 -10
  61. package/dist/index.d.ts +55 -10
  62. package/dist/index.js +2211 -500
  63. package/dist/index.js.map +1 -1
  64. package/dist/index.mjs +2203 -500
  65. package/dist/index.mjs.map +1 -1
  66. package/dist/payment/index.d.mts +1 -1
  67. package/dist/payment/index.d.ts +1 -1
  68. package/dist/payment/index.js +10 -2
  69. package/dist/payment/index.js.map +1 -1
  70. package/dist/payment/index.mjs +10 -2
  71. package/dist/payment/index.mjs.map +1 -1
  72. package/dist/stripe-multichain/index.js +1614 -266
  73. package/dist/stripe-multichain/index.js.map +1 -1
  74. package/dist/stripe-multichain/index.mjs +1614 -266
  75. package/dist/stripe-multichain/index.mjs.map +1 -1
  76. package/dist/types-D1slMt0H.d.mts +137 -0
  77. package/dist/types-D1slMt0H.d.ts +137 -0
  78. package/dist/{wwwauthenticate-CVaGUMjU.d.mts → wwwauthenticate-Dgm-_af9.d.mts} +11 -1
  79. package/dist/{wwwauthenticate-CVaGUMjU.d.ts → wwwauthenticate-Dgm-_af9.d.ts} +11 -1
  80. package/package.json +23 -18
@@ -0,0 +1,137 @@
1
+ import { JWK } from 'jose';
2
+
3
+ /**
4
+ * AIP (Agentic Identity Protocol) token types and the claim contract.
5
+ *
6
+ * An Agent Identity Token (AIT) is a JWT signed by an Identity Provider (IdP). It binds a
7
+ * verified human's identity to the specific agent presenting it (via `cnf`, RFC 7800) and
8
+ * carries the trust level, authentication method, optional intent, and optional identity
9
+ * claims the IdP attests to.
10
+ *
11
+ * This module is the single source of truth for the claim shape on the verifier side. It
12
+ * encodes the spec's required / recommended / optional claims plus the AgentScore extension
13
+ * claims (sanctions, jurisdiction, structured id-verification, cross-merchant graph, payment
14
+ * signer) we carry when we act as a compliance IdP.
15
+ *
16
+ * Extensibility contract (per spec): the `identity` object is open. If a claim is present,
17
+ * the IdP attests to it; verifiers ignore claims they don't recognize. Absence is the
18
+ * "unknown" signal — IdPs do not ship `null` for "not checked".
19
+ */
20
+
21
+ /** Degree of human involvement in issuing this specific AIT. */
22
+ type TrustLevel = 'autonomous' | 'human_present' | 'human_confirmed';
23
+ /**
24
+ * Authentication Method Reference values (RFC 8176 / IANA AMR registry). Open set — these
25
+ * are the values relevant to agent identity; others are valid and pass through.
26
+ */
27
+ type AmrValue = 'face' | 'fpt' | 'hwk' | 'otp' | 'pin' | 'pwd' | 'sms' | 'swk' | 'user' | 'mfa';
28
+ /** RFC 7800 confirmation claim: binds the AIT to the agent's signing key. */
29
+ interface CnfClaim {
30
+ jwk: JWK;
31
+ }
32
+ /** Agent metadata. `provider` is required; `instance` is recommended. */
33
+ interface AgentClaim {
34
+ provider: string;
35
+ instance?: string;
36
+ }
37
+ /** How the user authorized THIS AIT (not prior authentication history). */
38
+ interface AuthClaim {
39
+ amr?: AmrValue[] | string[];
40
+ /** When the user authenticated for this token (Unix seconds). Mirrors OIDC `auth_time`. */
41
+ time?: number;
42
+ }
43
+ /** What the agent intends to do. Optional; verifiers may require it for non-read actions. */
44
+ interface IntentClaim {
45
+ actions?: string[];
46
+ description?: string;
47
+ }
48
+ /** AgentScore wallet-binding extension (orthogonal to `cnf`, which binds the agent key). */
49
+ interface PaymentSignerClaim {
50
+ address: string;
51
+ network: 'evm' | 'solana';
52
+ /** Relationship the IdP attests between signer and the operator graph. */
53
+ match?: 'linked_operator' | 'claimed_operator';
54
+ }
55
+ interface PaymentClaim {
56
+ signer?: PaymentSignerClaim;
57
+ }
58
+ /**
59
+ * Identity claims (presence == IdP attestation). Spec-defined fields plus AgentScore
60
+ * compliance extension claims. Open by contract — unknown fields are allowed and ignored.
61
+ */
62
+ interface IdentityClaim {
63
+ email?: string;
64
+ email_verified?: boolean;
65
+ name?: string;
66
+ phone?: string;
67
+ phone_verified?: boolean;
68
+ age_over_18?: boolean;
69
+ age_over_21?: boolean;
70
+ id_verified?: boolean;
71
+ id_verification?: {
72
+ provider?: string;
73
+ method?: string;
74
+ document_type?: string;
75
+ verified_at?: number;
76
+ };
77
+ /** ISO 3166-1 alpha-2, optionally with ISO 3166-2 subdivision (e.g. "US-CA"). */
78
+ jurisdiction?: string;
79
+ sanctions_clear?: boolean;
80
+ sanctions_checked_at?: number;
81
+ sanctions_providers?: string[];
82
+ linked_wallets?: Array<{
83
+ address: string;
84
+ network: 'evm' | 'solana';
85
+ }>;
86
+ merchants_paid?: number;
87
+ first_seen?: number;
88
+ [claim: string]: unknown;
89
+ }
90
+ /** The decoded AIT JWT payload. */
91
+ interface AitPayload {
92
+ aip_version: string;
93
+ iss: string;
94
+ sub: string;
95
+ iat: number;
96
+ exp: number;
97
+ cnf: CnfClaim;
98
+ agent: AgentClaim;
99
+ trust_level?: TrustLevel;
100
+ auth?: AuthClaim;
101
+ intent?: IntentClaim;
102
+ identity?: IdentityClaim;
103
+ payment?: PaymentClaim;
104
+ [claim: string]: unknown;
105
+ }
106
+ /** The decoded AIT JWT header. */
107
+ interface AitHeader {
108
+ alg: string;
109
+ typ?: string;
110
+ kid?: string;
111
+ [param: string]: unknown;
112
+ }
113
+ /**
114
+ * Structural validation of a decoded AIT payload. Confirms the required claims are present
115
+ * and well-typed, and enforces the one normative conditional in the spec: a
116
+ * `human_confirmed` token MUST carry at least one `auth.amr` value.
117
+ *
118
+ * This is shape/contract validation only — it does NOT verify signatures (that's the
119
+ * verifier pipeline) and does NOT apply trust policy (that's the gate / `/v1/assess`).
120
+ */
121
+ type AitValidationResult = {
122
+ ok: true;
123
+ payload: AitPayload;
124
+ } | {
125
+ ok: false;
126
+ reason: AitValidationFailure;
127
+ };
128
+ type AitValidationFailure = 'not_an_object' | 'missing_aip_version' | 'missing_iss' | 'missing_sub' | 'missing_iat' | 'missing_exp' | 'missing_cnf' | 'missing_agent_provider' | 'human_confirmed_without_amr';
129
+ /**
130
+ * Detect whether a decoded JWT payload is an AIT: per spec, an AIT is discriminated by the
131
+ * presence of `cnf` + `agent` claims (not the `typ` header).
132
+ */
133
+ declare const isAitShape: (payload: unknown) => boolean;
134
+ /** Validate the structural contract of a decoded AIT payload. */
135
+ declare const validateAitPayload: (payload: unknown) => AitValidationResult;
136
+
137
+ export { type AitHeader as A, type IdentityClaim as I, type TrustLevel as T, type AitPayload as a, type AitValidationResult as b, type AmrValue as c, type IntentClaim as d, isAitShape as i, validateAitPayload as v };
@@ -0,0 +1,137 @@
1
+ import { JWK } from 'jose';
2
+
3
+ /**
4
+ * AIP (Agentic Identity Protocol) token types and the claim contract.
5
+ *
6
+ * An Agent Identity Token (AIT) is a JWT signed by an Identity Provider (IdP). It binds a
7
+ * verified human's identity to the specific agent presenting it (via `cnf`, RFC 7800) and
8
+ * carries the trust level, authentication method, optional intent, and optional identity
9
+ * claims the IdP attests to.
10
+ *
11
+ * This module is the single source of truth for the claim shape on the verifier side. It
12
+ * encodes the spec's required / recommended / optional claims plus the AgentScore extension
13
+ * claims (sanctions, jurisdiction, structured id-verification, cross-merchant graph, payment
14
+ * signer) we carry when we act as a compliance IdP.
15
+ *
16
+ * Extensibility contract (per spec): the `identity` object is open. If a claim is present,
17
+ * the IdP attests to it; verifiers ignore claims they don't recognize. Absence is the
18
+ * "unknown" signal — IdPs do not ship `null` for "not checked".
19
+ */
20
+
21
+ /** Degree of human involvement in issuing this specific AIT. */
22
+ type TrustLevel = 'autonomous' | 'human_present' | 'human_confirmed';
23
+ /**
24
+ * Authentication Method Reference values (RFC 8176 / IANA AMR registry). Open set — these
25
+ * are the values relevant to agent identity; others are valid and pass through.
26
+ */
27
+ type AmrValue = 'face' | 'fpt' | 'hwk' | 'otp' | 'pin' | 'pwd' | 'sms' | 'swk' | 'user' | 'mfa';
28
+ /** RFC 7800 confirmation claim: binds the AIT to the agent's signing key. */
29
+ interface CnfClaim {
30
+ jwk: JWK;
31
+ }
32
+ /** Agent metadata. `provider` is required; `instance` is recommended. */
33
+ interface AgentClaim {
34
+ provider: string;
35
+ instance?: string;
36
+ }
37
+ /** How the user authorized THIS AIT (not prior authentication history). */
38
+ interface AuthClaim {
39
+ amr?: AmrValue[] | string[];
40
+ /** When the user authenticated for this token (Unix seconds). Mirrors OIDC `auth_time`. */
41
+ time?: number;
42
+ }
43
+ /** What the agent intends to do. Optional; verifiers may require it for non-read actions. */
44
+ interface IntentClaim {
45
+ actions?: string[];
46
+ description?: string;
47
+ }
48
+ /** AgentScore wallet-binding extension (orthogonal to `cnf`, which binds the agent key). */
49
+ interface PaymentSignerClaim {
50
+ address: string;
51
+ network: 'evm' | 'solana';
52
+ /** Relationship the IdP attests between signer and the operator graph. */
53
+ match?: 'linked_operator' | 'claimed_operator';
54
+ }
55
+ interface PaymentClaim {
56
+ signer?: PaymentSignerClaim;
57
+ }
58
+ /**
59
+ * Identity claims (presence == IdP attestation). Spec-defined fields plus AgentScore
60
+ * compliance extension claims. Open by contract — unknown fields are allowed and ignored.
61
+ */
62
+ interface IdentityClaim {
63
+ email?: string;
64
+ email_verified?: boolean;
65
+ name?: string;
66
+ phone?: string;
67
+ phone_verified?: boolean;
68
+ age_over_18?: boolean;
69
+ age_over_21?: boolean;
70
+ id_verified?: boolean;
71
+ id_verification?: {
72
+ provider?: string;
73
+ method?: string;
74
+ document_type?: string;
75
+ verified_at?: number;
76
+ };
77
+ /** ISO 3166-1 alpha-2, optionally with ISO 3166-2 subdivision (e.g. "US-CA"). */
78
+ jurisdiction?: string;
79
+ sanctions_clear?: boolean;
80
+ sanctions_checked_at?: number;
81
+ sanctions_providers?: string[];
82
+ linked_wallets?: Array<{
83
+ address: string;
84
+ network: 'evm' | 'solana';
85
+ }>;
86
+ merchants_paid?: number;
87
+ first_seen?: number;
88
+ [claim: string]: unknown;
89
+ }
90
+ /** The decoded AIT JWT payload. */
91
+ interface AitPayload {
92
+ aip_version: string;
93
+ iss: string;
94
+ sub: string;
95
+ iat: number;
96
+ exp: number;
97
+ cnf: CnfClaim;
98
+ agent: AgentClaim;
99
+ trust_level?: TrustLevel;
100
+ auth?: AuthClaim;
101
+ intent?: IntentClaim;
102
+ identity?: IdentityClaim;
103
+ payment?: PaymentClaim;
104
+ [claim: string]: unknown;
105
+ }
106
+ /** The decoded AIT JWT header. */
107
+ interface AitHeader {
108
+ alg: string;
109
+ typ?: string;
110
+ kid?: string;
111
+ [param: string]: unknown;
112
+ }
113
+ /**
114
+ * Structural validation of a decoded AIT payload. Confirms the required claims are present
115
+ * and well-typed, and enforces the one normative conditional in the spec: a
116
+ * `human_confirmed` token MUST carry at least one `auth.amr` value.
117
+ *
118
+ * This is shape/contract validation only — it does NOT verify signatures (that's the
119
+ * verifier pipeline) and does NOT apply trust policy (that's the gate / `/v1/assess`).
120
+ */
121
+ type AitValidationResult = {
122
+ ok: true;
123
+ payload: AitPayload;
124
+ } | {
125
+ ok: false;
126
+ reason: AitValidationFailure;
127
+ };
128
+ type AitValidationFailure = 'not_an_object' | 'missing_aip_version' | 'missing_iss' | 'missing_sub' | 'missing_iat' | 'missing_exp' | 'missing_cnf' | 'missing_agent_provider' | 'human_confirmed_without_amr';
129
+ /**
130
+ * Detect whether a decoded JWT payload is an AIT: per spec, an AIT is discriminated by the
131
+ * presence of `cnf` + `agent` claims (not the `typ` header).
132
+ */
133
+ declare const isAitShape: (payload: unknown) => boolean;
134
+ /** Validate the structural contract of a decoded AIT payload. */
135
+ declare const validateAitPayload: (payload: unknown) => AitValidationResult;
136
+
137
+ export { type AitHeader as A, type IdentityClaim as I, type TrustLevel as T, type AitPayload as a, type AitValidationResult as b, type AmrValue as c, type IntentClaim as d, isAitShape as i, validateAitPayload as v };
@@ -26,13 +26,23 @@ declare function aliasAmountFields(accepts: unknown[]): unknown[];
26
26
  * output) makes the match silently fail at settle time. Keep `accepts` shape
27
27
  * identical to whatever `buildPaymentRequirements` produces server-side.
28
28
  */
29
- declare function paymentRequiredHeader({ x402Version, accepts, resource, }: {
29
+ declare function paymentRequiredHeader({ x402Version, accepts, resource, extensions, }: {
30
30
  x402Version: 1 | 2;
31
31
  accepts: unknown[];
32
+ /** x402 v2 ResourceInfo. Per spec the full resource (incl. serviceName / tags /
33
+ * iconUrl, used by Bazaar search/filtering) rides in the header, not just url. */
32
34
  resource?: {
33
35
  url: string;
36
+ description?: string;
34
37
  mimeType?: string;
38
+ serviceName?: string;
39
+ tags?: string[];
40
+ iconUrl?: string;
35
41
  };
42
+ /** x402 v2 `extensions`. Per the v2 HTTP transport spec the PaymentRequired
43
+ * object, INCLUDING extensions, must travel in the base64 PAYMENT-REQUIRED
44
+ * header (where Bazaar validators read it), not only in the response body. */
45
+ extensions?: Record<string, unknown>;
36
46
  }): string;
37
47
 
38
48
  export { aliasAmountFields as a, paymentRequiredHeader as p, wwwAuthenticateHeader as w };
@@ -26,13 +26,23 @@ declare function aliasAmountFields(accepts: unknown[]): unknown[];
26
26
  * output) makes the match silently fail at settle time. Keep `accepts` shape
27
27
  * identical to whatever `buildPaymentRequirements` produces server-side.
28
28
  */
29
- declare function paymentRequiredHeader({ x402Version, accepts, resource, }: {
29
+ declare function paymentRequiredHeader({ x402Version, accepts, resource, extensions, }: {
30
30
  x402Version: 1 | 2;
31
31
  accepts: unknown[];
32
+ /** x402 v2 ResourceInfo. Per spec the full resource (incl. serviceName / tags /
33
+ * iconUrl, used by Bazaar search/filtering) rides in the header, not just url. */
32
34
  resource?: {
33
35
  url: string;
36
+ description?: string;
34
37
  mimeType?: string;
38
+ serviceName?: string;
39
+ tags?: string[];
40
+ iconUrl?: string;
35
41
  };
42
+ /** x402 v2 `extensions`. Per the v2 HTTP transport spec the PaymentRequired
43
+ * object, INCLUDING extensions, must travel in the base64 PAYMENT-REQUIRED
44
+ * header (where Bazaar validators read it), not only in the response body. */
45
+ extensions?: Record<string, unknown>;
36
46
  }): string;
37
47
 
38
48
  export { aliasAmountFields as a, paymentRequiredHeader as p, wwwAuthenticateHeader as w };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-score/commerce",
3
- "version": "2.5.0",
3
+ "version": "2.6.0",
4
4
  "description": "Agent commerce SDK — identity middleware (Hono, Express, Fastify, Next.js, Web Fetch) + payment helpers + 402 builders + discovery + Stripe multichain. The full merchant-side toolkit for AgentScore-powered agent commerce.",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -139,7 +139,7 @@
139
139
  "type": "git",
140
140
  "url": "https://github.com/agentscore/node-commerce"
141
141
  },
142
- "homepage": "https://agentscore.sh",
142
+ "homepage": "https://www.agentscore.com",
143
143
  "bugs": {
144
144
  "url": "https://github.com/agentscore/node-commerce/issues"
145
145
  },
@@ -148,7 +148,7 @@
148
148
  "bun": ">=1.3.0 <2"
149
149
  },
150
150
  "dependencies": {
151
- "@agent-score/sdk": "^2.5.0"
151
+ "@agent-score/sdk": "^2.6.0"
152
152
  },
153
153
  "overrides": {
154
154
  "axios": "^1.15.0",
@@ -159,10 +159,14 @@
159
159
  "minimatch@^10.0.0": {
160
160
  "brace-expansion": "5.0.6"
161
161
  },
162
- "ws": "^8.20.1"
162
+ "ws": "^8.21.0",
163
+ "vite": "^8.0.16",
164
+ "esbuild": "^0.28.1",
165
+ "js-yaml": "^4.2.0",
166
+ "form-data": "^4.0.6"
163
167
  },
164
168
  "peerDependencies": {
165
- "@solana/kit": ">=6.5.0",
169
+ "@solana/kit": ">=6.5.0 <7.0.0",
166
170
  "@solana/mpp": ">=0.5.0",
167
171
  "express": ">=4.0.0",
168
172
  "fastify": ">=4.0.0",
@@ -201,30 +205,31 @@
201
205
  "@a2a-js/sdk": "^0.3.13",
202
206
  "@coinbase/x402": "^2.1.0",
203
207
  "@eslint/js": "^9.39.4",
204
- "@solana/kit": "^6.9.0",
208
+ "@solana/kit": "^6.10.0",
205
209
  "@solana/mpp": "^0.6.0",
206
210
  "@types/express": "^5.0.6",
207
- "@types/node": "^25.9.1",
208
- "@vitest/coverage-v8": "^4.1.7",
209
- "@x402/core": "^2.14.0",
210
- "@x402/evm": "^2.14.0",
211
- "@x402/extensions": "^2.14.0",
211
+ "@types/node": "^26.1.0",
212
+ "@vitest/coverage-v8": "^4.1.9",
213
+ "@x402/core": "^2.17.0",
214
+ "@x402/evm": "^2.17.0",
215
+ "@x402/extensions": "^2.17.0",
212
216
  "dotenv": "^17.4.2",
213
217
  "eslint": "^9.39.4",
214
218
  "eslint-plugin-import": "^2.32.0",
215
219
  "eslint-plugin-unused-imports": "^4.4.1",
216
220
  "express": "^5.2.1",
217
- "fastify": "^5.8.5",
218
- "hono": "^4.12.23",
219
- "ioredis": "^5.11.0",
221
+ "fastify": "^5.10.0",
222
+ "hono": "^4.12.27",
223
+ "ioredis": "^5.11.1",
220
224
  "jose": "^6.2.3",
221
- "knip": "^6.15.0",
225
+ "knip": "^6.24.0",
222
226
  "lefthook": "^2.1.9",
223
- "mppx": "0.6.26",
227
+ "mppx": "0.8.5",
224
228
  "tsup": "^8.5.1",
225
229
  "typescript": "^6.0.3",
226
- "typescript-eslint": "^8.60.0",
227
- "vitest": "^4.1.7"
230
+ "typescript-eslint": "^8.62.1",
231
+ "viem": "2.54.4",
232
+ "vitest": "^4.1.9"
228
233
  },
229
234
  "packageManager": "bun@1.3.13"
230
235
  }