@openvtc/trust-tasks 0.19.18 → 0.19.19

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 (73) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/dist/_shared/components.d.ts +38 -0
  3. package/dist/_shared/components.d.ts.map +1 -1
  4. package/dist/index.d.ts +3 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +3 -0
  7. package/dist/index.js.map +1 -1
  8. package/dist/persona/_shared/0.1/persona-record.d.ts +1 -1
  9. package/dist/persona/_shared/0.1/persona-record.d.ts.map +1 -1
  10. package/dist/persona/attribute/list/1.0/payload.d.ts +124 -4
  11. package/dist/persona/attribute/list/1.0/payload.d.ts.map +1 -1
  12. package/dist/persona/attribute/list/1.0/payload.js +72 -2
  13. package/dist/persona/attribute/list/1.0/payload.js.map +1 -1
  14. package/dist/persona/attribute/put/1.0/payload.d.ts +110 -4
  15. package/dist/persona/attribute/put/1.0/payload.d.ts.map +1 -1
  16. package/dist/persona/attribute/put/1.0/payload.js +62 -2
  17. package/dist/persona/attribute/put/1.0/payload.js.map +1 -1
  18. package/dist/persona/contact/get/1.0/payload.d.ts +84 -4
  19. package/dist/persona/contact/get/1.0/payload.d.ts.map +1 -1
  20. package/dist/persona/contact/get/1.0/payload.js +52 -2
  21. package/dist/persona/contact/get/1.0/payload.js.map +1 -1
  22. package/dist/persona/contact/put/1.0/payload.d.ts +84 -4
  23. package/dist/persona/contact/put/1.0/payload.d.ts.map +1 -1
  24. package/dist/persona/contact/put/1.0/payload.js +52 -2
  25. package/dist/persona/contact/put/1.0/payload.js.map +1 -1
  26. package/dist/persona/disclosure/preview/1.0/payload.d.ts +5 -5
  27. package/dist/persona/disclosure/preview/1.0/payload.d.ts.map +1 -1
  28. package/dist/persona/disclosure/preview/1.0/payload.js +4 -2
  29. package/dist/persona/disclosure/preview/1.0/payload.js.map +1 -1
  30. package/dist/persona/profile/compose/1.0/payload.d.ts +14 -0
  31. package/dist/persona/profile/compose/1.0/payload.d.ts.map +1 -1
  32. package/dist/persona/profile/compose/1.0/payload.js +5 -0
  33. package/dist/persona/profile/compose/1.0/payload.js.map +1 -1
  34. package/dist/persona/profile/get/1.0/payload.d.ts +230 -6
  35. package/dist/persona/profile/get/1.0/payload.d.ts.map +1 -1
  36. package/dist/persona/profile/get/1.0/payload.js +140 -2
  37. package/dist/persona/profile/get/1.0/payload.js.map +1 -1
  38. package/dist/persona/profile/list/1.0/payload.d.ts +230 -6
  39. package/dist/persona/profile/list/1.0/payload.d.ts.map +1 -1
  40. package/dist/persona/profile/list/1.0/payload.js +140 -2
  41. package/dist/persona/profile/list/1.0/payload.js.map +1 -1
  42. package/dist/persona/profile/put/1.0/payload.d.ts +230 -6
  43. package/dist/persona/profile/put/1.0/payload.d.ts.map +1 -1
  44. package/dist/persona/profile/put/1.0/payload.js +138 -2
  45. package/dist/persona/profile/put/1.0/payload.js.map +1 -1
  46. package/dist/persona/profile/timeline/1.0/payload.d.ts +588 -0
  47. package/dist/persona/profile/timeline/1.0/payload.d.ts.map +1 -0
  48. package/dist/persona/profile/timeline/1.0/payload.js +322 -0
  49. package/dist/persona/profile/timeline/1.0/payload.js.map +1 -0
  50. package/dist/persona/profile/usage/1.0/payload.d.ts +533 -0
  51. package/dist/persona/profile/usage/1.0/payload.d.ts.map +1 -0
  52. package/dist/persona/profile/usage/1.0/payload.js +302 -0
  53. package/dist/persona/profile/usage/1.0/payload.js.map +1 -0
  54. package/dist/vtc/invitations/deliver/0.1/payload.d.ts +318 -0
  55. package/dist/vtc/invitations/deliver/0.1/payload.d.ts.map +1 -0
  56. package/dist/vtc/invitations/deliver/0.1/payload.js +183 -0
  57. package/dist/vtc/invitations/deliver/0.1/payload.js.map +1 -0
  58. package/package.json +1 -1
  59. package/src/_shared/components.ts +41 -0
  60. package/src/index.ts +3 -0
  61. package/src/persona/_shared/0.1/persona-record.ts +1 -1
  62. package/src/persona/attribute/list/1.0/payload.ts +72 -2
  63. package/src/persona/attribute/put/1.0/payload.ts +68 -2
  64. package/src/persona/contact/get/1.0/payload.ts +52 -2
  65. package/src/persona/contact/put/1.0/payload.ts +52 -2
  66. package/src/persona/disclosure/preview/1.0/payload.ts +5 -3
  67. package/src/persona/profile/compose/1.0/payload.ts +9 -0
  68. package/src/persona/profile/get/1.0/payload.ts +142 -4
  69. package/src/persona/profile/list/1.0/payload.ts +142 -4
  70. package/src/persona/profile/put/1.0/payload.ts +144 -4
  71. package/src/persona/profile/timeline/1.0/payload.ts +402 -0
  72. package/src/persona/profile/usage/1.0/payload.ts +354 -0
  73. package/src/vtc/invitations/deliver/0.1/payload.ts +234 -0
@@ -0,0 +1,183 @@
1
+ /**
2
+ * Generated by scripts/build-ts-bindings.mjs — DO NOT EDIT BY HAND.
3
+ * Source: specs/vtc/invitations/deliver/0.1/payload.schema.json
4
+ */
5
+ /** Trust Task type URI. */
6
+ export const TYPE_URI = "https://trusttasks.org/spec/vtc/invitations/deliver/0.1";
7
+ /** Trust Task response type URI (request type URI + "#response"). */
8
+ export const RESPONSE_TYPE_URI = "https://trusttasks.org/spec/vtc/invitations/deliver/0.1#response";
9
+ /**
10
+ * This specification's payload schema, as a value.
11
+ *
12
+ * SPEC.md §7.2 item 2 is performed against this. It is shipped as data
13
+ * rather than only as a `.json` file because TypeScript types are erased
14
+ * at runtime: without a schema a consumer has nothing to validate, and
15
+ * every REQUIRED payload member is optional in practice. Cross-file
16
+ * `$ref`s are already inlined, so it needs no resolver.
17
+ */
18
+ export const PAYLOAD_SCHEMA = {
19
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
20
+ "$id": "https://trusttasks.org/spec/vtc/invitations/deliver/0.1",
21
+ "title": "VTC Invitations Deliver — payload",
22
+ "description": "Deliver an issued invitation to the DID it admits: push an offer to that DID, or return the offer for a QR code. The outer document members (id, type, issuer, recipient, issuedAt, expiresAt, proof) are owned by the framework — SPEC §6.3.",
23
+ "type": "object",
24
+ "additionalProperties": false,
25
+ "required": [
26
+ "id",
27
+ "channel"
28
+ ],
29
+ "properties": {
30
+ "id": {
31
+ "type": "string",
32
+ "minLength": 1,
33
+ "maxLength": 256,
34
+ "description": "Identifier of the invitation to deliver, as `vtc/invitations/list` reports it."
35
+ },
36
+ "channel": {
37
+ "type": "string",
38
+ "enum": [
39
+ "message",
40
+ "offer"
41
+ ],
42
+ "description": "`message`: the community sends a `credential-exchange/offer` to the invited DID over a transport that DID advertises. `offer`: the community returns the offer, for the inviter to hand over out of band — typically as a QR code."
43
+ },
44
+ "ext": {
45
+ "$ref": "#/$defs/Ext"
46
+ }
47
+ },
48
+ "$defs": {
49
+ "Response": {
50
+ "$anchor": "response",
51
+ "title": "VTC Invitations Deliver — response payload",
52
+ "type": "object",
53
+ "additionalProperties": false,
54
+ "required": [
55
+ "id",
56
+ "channel",
57
+ "expiresAt"
58
+ ],
59
+ "properties": {
60
+ "id": {
61
+ "type": "string",
62
+ "minLength": 1,
63
+ "maxLength": 256,
64
+ "description": "The invitation's identifier, echoed."
65
+ },
66
+ "channel": {
67
+ "type": "string",
68
+ "enum": [
69
+ "message",
70
+ "offer"
71
+ ],
72
+ "description": "The channel used, echoed."
73
+ },
74
+ "offer": {
75
+ "type": "object",
76
+ "description": "Present exactly when `channel` is `offer`: an OID4VCI Credential Offer object, carried verbatim, whose pre-authorized code redeems only for the invited DID. Its members are OID4VCI's and are deliberately not re-specified here."
77
+ },
78
+ "expiresAt": {
79
+ "type": "string",
80
+ "format": "date-time",
81
+ "description": "When this delivery's offer lapses. Never later than the invitation's own expiry."
82
+ },
83
+ "ext": {
84
+ "$ref": "#/$defs/Ext"
85
+ }
86
+ }
87
+ },
88
+ "Ext": {
89
+ "title": "Ext",
90
+ "description": "Vendor-namespaced extension object per SPEC.md §4.5.1. Each immediate key MUST be a reverse-DNS namespace; structure under each namespace is opaque to the framework.",
91
+ "type": "object",
92
+ "minProperties": 1,
93
+ "additionalProperties": true,
94
+ "propertyNames": {
95
+ "pattern": "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$"
96
+ }
97
+ }
98
+ }
99
+ };
100
+ /** As {@link PAYLOAD_SCHEMA}, for the success-response variant. */
101
+ export const RESPONSE_PAYLOAD_SCHEMA = {
102
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
103
+ "$ref": "#/$defs/Response",
104
+ "$defs": {
105
+ "Response": {
106
+ "$anchor": "response",
107
+ "title": "VTC Invitations Deliver — response payload",
108
+ "type": "object",
109
+ "additionalProperties": false,
110
+ "required": [
111
+ "id",
112
+ "channel",
113
+ "expiresAt"
114
+ ],
115
+ "properties": {
116
+ "id": {
117
+ "type": "string",
118
+ "minLength": 1,
119
+ "maxLength": 256,
120
+ "description": "The invitation's identifier, echoed."
121
+ },
122
+ "channel": {
123
+ "type": "string",
124
+ "enum": [
125
+ "message",
126
+ "offer"
127
+ ],
128
+ "description": "The channel used, echoed."
129
+ },
130
+ "offer": {
131
+ "type": "object",
132
+ "description": "Present exactly when `channel` is `offer`: an OID4VCI Credential Offer object, carried verbatim, whose pre-authorized code redeems only for the invited DID. Its members are OID4VCI's and are deliberately not re-specified here."
133
+ },
134
+ "expiresAt": {
135
+ "type": "string",
136
+ "format": "date-time",
137
+ "description": "When this delivery's offer lapses. Never later than the invitation's own expiry."
138
+ },
139
+ "ext": {
140
+ "$ref": "#/$defs/Ext"
141
+ }
142
+ }
143
+ },
144
+ "Ext": {
145
+ "title": "Ext",
146
+ "description": "Vendor-namespaced extension object per SPEC.md §4.5.1. Each immediate key MUST be a reverse-DNS namespace; structure under each namespace is opaque to the framework.",
147
+ "type": "object",
148
+ "minProperties": 1,
149
+ "additionalProperties": true,
150
+ "propertyNames": {
151
+ "pattern": "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$"
152
+ }
153
+ }
154
+ }
155
+ };
156
+ /**
157
+ * SPEC.md §7.2 policy for the request variant, from this specification's
158
+ * front matter. Pass to `consumeInbound` — items 5b, 7 and 8 are
159
+ * per-specification and cannot be derived from the document alone, and
160
+ * item 2 needs the schema this carries.
161
+ */
162
+ export const SPEC = {
163
+ typeUri: TYPE_URI,
164
+ isBearer: false,
165
+ isProofRequired: true,
166
+ isRecipientRequired: true,
167
+ isIssuedAtRequired: true,
168
+ payloadSchema: PAYLOAD_SCHEMA,
169
+ };
170
+ /**
171
+ * SPEC.md §7.2 policy for the success-response variant. `isRecipientRequired`
172
+ * tracks the *issuer* party's requirement because a response swaps the
173
+ * parties (§7.3 item 5).
174
+ */
175
+ export const RESPONSE_SPEC = {
176
+ typeUri: RESPONSE_TYPE_URI,
177
+ isBearer: false,
178
+ isProofRequired: true,
179
+ isRecipientRequired: true,
180
+ isIssuedAtRequired: true,
181
+ payloadSchema: RESPONSE_PAYLOAD_SCHEMA,
182
+ };
183
+ //# sourceMappingURL=payload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payload.js","sourceRoot":"","sources":["../../../../../src/vtc/invitations/deliver/0.1/payload.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openvtc/trust-tasks",
3
- "version": "0.19.18",
3
+ "version": "0.19.19",
4
4
  "description": "Generated TypeScript bindings for the Trust Tasks framework registry.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -213,6 +213,25 @@ export type ExpectedVersion_VtaV0_1 = number;
213
213
  * After which the bundle is collected: staged bytes discarded, tokens and chunk requests refused. Short by design. For a chunked transfer a recipient may move it later as chunks are exchanged, never past its own ceiling — each chunk response reports the current value.
214
214
  */
215
215
  export type ExpiresAt = string;
216
+ /**
217
+ * Where a pool face may be worn. `anywhere` is the default and what an absent member means. `only` names the contexts it may be worn in, and a maintainer MUST refuse to wear it in any other (persona/binding/set `outsideReach`).
218
+ *
219
+ * A tagged object rather than a bare list of contexts, deliberately: an empty list has been read as both 'unrestricted' and 'nowhere' in this family's neighbours, and a shape where the two cannot be confused is worth more than one where they must be remembered. So `only` requires at least one context, and 'nowhere' is not a reach — it is a retired face.
220
+ *
221
+ * A context-local face has no reach: it lives in its context and is worn there by construction.
222
+ */
223
+ export type FaceReach =
224
+ | {
225
+ kind: "anywhere";
226
+ }
227
+ | {
228
+ kind: "only";
229
+ /**
230
+ * @minItems 1
231
+ * @maxItems 256
232
+ */
233
+ contextIds: [string, ...string[]];
234
+ };
216
235
  /**
217
236
  * A colour **name**, resolved by each consumer against its own palette — never a hex value or any other literal. Two reasons, and both are about the consumer rather than the holder. A literal cannot be legible in a terminal, in a light theme and in a dark one at once, so a stored `#8B0000` is a colour that is wrong somewhere and the holder has no way to know where. And a consumer that reserves colours to mean something — an error, a warning, an irreversible act — must be able to keep a holder's decorative choice out of that channel; it cannot do that with an arbitrary value, and it can do it trivially with a closed set it maps itself. The eight members are chosen to be distinguishable from one another and deliberately carry no status connotation: none is named for success, warning or danger.
218
237
  */
@@ -329,6 +348,10 @@ export type ProofRung = "predicate" | "derived" | "selectiveDisclosure" | "whole
329
348
  * `credentialBacked` — the value is derived from a credential in the vault at `claimPath`. The stored value is a CACHE FOR DISPLAY; the credential is the truth. A maintainer MUST re-derive it on read and MUST fail closed (never presenting a stale value) when the credential has been revoked, has expired, or has been archived or deleted.
330
349
  *
331
350
  * `generated` — the value is minted per verifier at disclosure time and recorded against that verifier, so every relying party receives a different one that routes back to the holder. This is the shape of the most widely adopted consumer privacy feature in this space; a maintainer need not operate a relay to conform, but the shape must exist, because retrofitting per-verifier values into a pool-of-values model is a migration rather than an addition.
351
+ *
352
+ * `derived` — the value was taken from a source the holder connected or supplied — a code-hosting profile, an uploaded CV — rather than typed by them or attested by an issuer. Nobody signed it: it is the holder's claim that the source said so, and a consumer MUST NOT present it as attested. It exists as its own kind because a derived value is neither of the others — the holder did not author it, and no one vouches for it — and a holder deciding whether to disclose deserves to know which of their values they typed.
353
+ *
354
+ * For how strongly a disclosed value identifies the holder, the kinds rank `credentialBacked` above `derived` above `selfAsserted`; `generated` values are per-verifier and do not correlate.
332
355
  */
333
356
  export type Provenance =
334
357
  | {
@@ -363,6 +386,17 @@ export type Provenance =
363
386
  * When true (the default and the only useful setting), a distinct value is minted for each verifier.
364
387
  */
365
388
  perVerifier?: boolean;
389
+ }
390
+ | {
391
+ kind: "derived";
392
+ /**
393
+ * The KIND of source the value was taken from — `github`, `cvUpload`, `linkedIn` — never an account, handle or URL. Provenance survives to the verifier, so this member is disclosed with the claim; a handle here would disclose an identifier the holder never chose to share.
394
+ */
395
+ source: string;
396
+ /**
397
+ * When the value was taken from the source. A derived value is a snapshot: the source may have changed since, and nothing re-derives it.
398
+ */
399
+ derivedAt: string;
366
400
  };
367
401
  /**
368
402
  * A device's platform push channel — the body the device registers with its push GATEWAY (push wake-up binding, https://trusttasks.org/binding/push/0.1; modeled on Aries RFC 0699/0734). The gateway holds this token and returns an opaque WakeHandle in exchange; the token is held by the gateway ONLY, never by the mediator or the maintainer/VTA. The gateway uses it to send a contentless wake-up when an authorized trigger asks — the push payload never carries Trust Task content. Tagged union over the discriminator `platform`.
@@ -1087,6 +1121,12 @@ export interface Attribute {
1087
1121
  * Set only where the holder decided it explicitly. Absent resolves from the claim-type registry.
1088
1122
  */
1089
1123
  release?: ReleaseRequirement;
1124
+ /**
1125
+ * Vault identifiers of credentials in which a third party endorses this value — a colleague vouching for a skill, an employer confirming a title. INVENTORY, not evidence: the value remains whatever its `provenance` says, and a vouched self-assertion is still self-asserted. Folding a vouch into `provenance` would make it render as attested, which is the one thing provenance exists to prevent. Not disclosed with the value; a holder who wants a counterparty to see an endorsement presents the credential itself. Absent when there are none.
1126
+ *
1127
+ * @maxItems 64
1128
+ */
1129
+ endorsements?: string[];
1090
1130
  version: Version_PersonaV0_1;
1091
1131
  /**
1092
1132
  * Earlier versions of this attribute the maintainer still holds, and why. A maintainer that keeps a replaced value to serve `pinVersion` MUST list it here: a holder who overwrote a value may reasonably believe it gone, and this is how they learn otherwise. Values are not included — the holder reads one through the profile that pins it, or removes it with persona/attribute/purge-version. Absent when none are held.
@@ -3348,6 +3388,7 @@ export interface Profile {
3348
3388
  * @maxItems 256
3349
3389
  */
3350
3390
  entries: ProfileEntry[];
3391
+ reach?: FaceReach;
3351
3392
  /**
3352
3393
  * `retired`: the face is worn nowhere, is left out of pickers and default listings, and cannot be worn until reinstated (persona/profile/retire, persona/profile/reinstate). Its disclosure history and every value it carries are kept — retiring is 'stop being this', not 'forget this'. Absent reads as `active`.
3353
3394
  */
package/src/index.ts CHANGED
@@ -215,6 +215,8 @@ export * as PersonaProfileList_v1_0 from "./persona/profile/list/1.0/payload.js"
215
215
  export * as PersonaProfilePut_v1_0 from "./persona/profile/put/1.0/payload.js";
216
216
  export * as PersonaProfileReinstate_v1_0 from "./persona/profile/reinstate/1.0/payload.js";
217
217
  export * as PersonaProfileRetire_v1_0 from "./persona/profile/retire/1.0/payload.js";
218
+ export * as PersonaProfileTimeline_v1_0 from "./persona/profile/timeline/1.0/payload.js";
219
+ export * as PersonaProfileUsage_v1_0 from "./persona/profile/usage/1.0/payload.js";
218
220
  export * as PersonaRenderersList_v1_0 from "./persona/renderers/list/1.0/payload.js";
219
221
  export * as PolicyShared_v0_1 from "./policy/_shared/0.1/policy.js";
220
222
  export * as PolicyShared_v0_2 from "./policy/_shared/0.2/policy.js";
@@ -483,6 +485,7 @@ export * as VtcInstallClaimFinish_v0_1 from "./vtc/install/claim/finish/0.1/payl
483
485
  export * as VtcInstallClaimFinish_v0_2 from "./vtc/install/claim/finish/0.2/payload.js";
484
486
  export * as VtcInstallClaimStart_v0_1 from "./vtc/install/claim/start/0.1/payload.js";
485
487
  export * as VtcInstallClaimStart_v0_2 from "./vtc/install/claim/start/0.2/payload.js";
488
+ export * as VtcInvitationsDeliver_v0_1 from "./vtc/invitations/deliver/0.1/payload.js";
486
489
  export * as VtcInvitationsIssue_v0_1 from "./vtc/invitations/issue/0.1/payload.js";
487
490
  export * as VtcInvitationsList_v0_1 from "./vtc/invitations/list/0.1/payload.js";
488
491
  export * as VtcInvitationsRevoke_v0_1 from "./vtc/invitations/revoke/0.1/payload.js";
@@ -20,4 +20,4 @@ export interface PersonaRecordSharedDefinitionsForThePersonaSpecFamily {
20
20
  * The definitions this shared schema publishes, hoisted to one declaration each.
21
21
  * See "../../../_shared/components.js".
22
22
  */
23
- export type { Attribute, ClaimType, ContactDocument, ContactRevision, ExpectedVersion_PersonaV0_1 as ExpectedVersion, FacetColour, Profile, ProfileEntry, ProofRung, Provenance, ReleaseRequirement, ResolvedClaim, Sensitivity, Slot, Ulid, ValueType, Version_PersonaV0_1 as Version } from "../../../_shared/components.js";
23
+ export type { Attribute, ClaimType, ContactDocument, ContactRevision, ExpectedVersion_PersonaV0_1 as ExpectedVersion, FaceReach, FacetColour, Profile, ProfileEntry, ProofRung, Provenance, ReleaseRequirement, ResolvedClaim, Sensitivity, Slot, Ulid, ValueType, Version_PersonaV0_1 as Version } from "../../../_shared/components.js";
@@ -220,6 +220,16 @@ export const PAYLOAD_SCHEMA = {
220
220
  "$ref": "#/$defs/ReleaseRequirement",
221
221
  "description": "Set only where the holder decided it explicitly. Absent resolves from the claim-type registry."
222
222
  },
223
+ "endorsements": {
224
+ "type": "array",
225
+ "maxItems": 64,
226
+ "uniqueItems": true,
227
+ "items": {
228
+ "type": "string",
229
+ "minLength": 1
230
+ },
231
+ "description": "Vault identifiers of credentials in which a third party endorses this value — a colleague vouching for a skill, an employer confirming a title. INVENTORY, not evidence: the value remains whatever its `provenance` says, and a vouched self-assertion is still self-asserted. Folding a vouch into `provenance` would make it render as attested, which is the one thing provenance exists to prevent. Not disclosed with the value; a holder who wants a counterparty to see an endorsement presents the credential itself. Absent when there are none."
232
+ },
223
233
  "version": {
224
234
  "$ref": "#/$defs/Version"
225
235
  },
@@ -297,7 +307,7 @@ export const PAYLOAD_SCHEMA = {
297
307
  },
298
308
  "Provenance": {
299
309
  "title": "Provenance",
300
- "description": "Where a value comes from, and the member that makes this family worth building on a trust stack rather than in an address book. It survives to the verifier, so a recipient can tell — per field — what the holder typed from what an issuer attested.\n\n`selfAsserted` — the holder supplied it.\n\n`credentialBacked` — the value is derived from a credential in the vault at `claimPath`. The stored value is a CACHE FOR DISPLAY; the credential is the truth. A maintainer MUST re-derive it on read and MUST fail closed (never presenting a stale value) when the credential has been revoked, has expired, or has been archived or deleted.\n\n`generated` — the value is minted per verifier at disclosure time and recorded against that verifier, so every relying party receives a different one that routes back to the holder. This is the shape of the most widely adopted consumer privacy feature in this space; a maintainer need not operate a relay to conform, but the shape must exist, because retrofitting per-verifier values into a pool-of-values model is a migration rather than an addition.",
310
+ "description": "Where a value comes from, and the member that makes this family worth building on a trust stack rather than in an address book. It survives to the verifier, so a recipient can tell — per field — what the holder typed from what an issuer attested.\n\n`selfAsserted` — the holder supplied it.\n\n`credentialBacked` — the value is derived from a credential in the vault at `claimPath`. The stored value is a CACHE FOR DISPLAY; the credential is the truth. A maintainer MUST re-derive it on read and MUST fail closed (never presenting a stale value) when the credential has been revoked, has expired, or has been archived or deleted.\n\n`generated` — the value is minted per verifier at disclosure time and recorded against that verifier, so every relying party receives a different one that routes back to the holder. This is the shape of the most widely adopted consumer privacy feature in this space; a maintainer need not operate a relay to conform, but the shape must exist, because retrofitting per-verifier values into a pool-of-values model is a migration rather than an addition.\n\n`derived` — the value was taken from a source the holder connected or supplied — a code-hosting profile, an uploaded CV — rather than typed by them or attested by an issuer. Nobody signed it: it is the holder's claim that the source said so, and a consumer MUST NOT present it as attested. It exists as its own kind because a derived value is neither of the others — the holder did not author it, and no one vouches for it — and a holder deciding whether to disclose deserves to know which of their values they typed.\n\nFor how strongly a disclosed value identifies the holder, the kinds rank `credentialBacked` above `derived` above `selfAsserted`; `generated` values are per-verifier and do not correlate.",
301
311
  "type": "object",
302
312
  "required": [
303
313
  "kind"
@@ -368,6 +378,31 @@ export const PAYLOAD_SCHEMA = {
368
378
  "description": "When true (the default and the only useful setting), a distinct value is minted for each verifier."
369
379
  }
370
380
  }
381
+ },
382
+ {
383
+ "additionalProperties": false,
384
+ "required": [
385
+ "kind",
386
+ "source",
387
+ "derivedAt"
388
+ ],
389
+ "properties": {
390
+ "kind": {
391
+ "const": "derived"
392
+ },
393
+ "source": {
394
+ "type": "string",
395
+ "minLength": 1,
396
+ "maxLength": 64,
397
+ "pattern": "^[a-z][A-Za-z0-9.-]*$",
398
+ "description": "The KIND of source the value was taken from — `github`, `cvUpload`, `linkedIn` — never an account, handle or URL. Provenance survives to the verifier, so this member is disclosed with the claim; a handle here would disclose an identifier the holder never chose to share."
399
+ },
400
+ "derivedAt": {
401
+ "type": "string",
402
+ "format": "date-time",
403
+ "description": "When the value was taken from the source. A derived value is a snapshot: the source may have changed since, and nothing re-derives it."
404
+ }
405
+ }
371
406
  }
372
407
  ]
373
408
  },
@@ -504,6 +539,16 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
504
539
  "$ref": "#/$defs/ReleaseRequirement",
505
540
  "description": "Set only where the holder decided it explicitly. Absent resolves from the claim-type registry."
506
541
  },
542
+ "endorsements": {
543
+ "type": "array",
544
+ "maxItems": 64,
545
+ "uniqueItems": true,
546
+ "items": {
547
+ "type": "string",
548
+ "minLength": 1
549
+ },
550
+ "description": "Vault identifiers of credentials in which a third party endorses this value — a colleague vouching for a skill, an employer confirming a title. INVENTORY, not evidence: the value remains whatever its `provenance` says, and a vouched self-assertion is still self-asserted. Folding a vouch into `provenance` would make it render as attested, which is the one thing provenance exists to prevent. Not disclosed with the value; a holder who wants a counterparty to see an endorsement presents the credential itself. Absent when there are none."
551
+ },
507
552
  "version": {
508
553
  "$ref": "#/$defs/Version"
509
554
  },
@@ -581,7 +626,7 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
581
626
  },
582
627
  "Provenance": {
583
628
  "title": "Provenance",
584
- "description": "Where a value comes from, and the member that makes this family worth building on a trust stack rather than in an address book. It survives to the verifier, so a recipient can tell — per field — what the holder typed from what an issuer attested.\n\n`selfAsserted` — the holder supplied it.\n\n`credentialBacked` — the value is derived from a credential in the vault at `claimPath`. The stored value is a CACHE FOR DISPLAY; the credential is the truth. A maintainer MUST re-derive it on read and MUST fail closed (never presenting a stale value) when the credential has been revoked, has expired, or has been archived or deleted.\n\n`generated` — the value is minted per verifier at disclosure time and recorded against that verifier, so every relying party receives a different one that routes back to the holder. This is the shape of the most widely adopted consumer privacy feature in this space; a maintainer need not operate a relay to conform, but the shape must exist, because retrofitting per-verifier values into a pool-of-values model is a migration rather than an addition.",
629
+ "description": "Where a value comes from, and the member that makes this family worth building on a trust stack rather than in an address book. It survives to the verifier, so a recipient can tell — per field — what the holder typed from what an issuer attested.\n\n`selfAsserted` — the holder supplied it.\n\n`credentialBacked` — the value is derived from a credential in the vault at `claimPath`. The stored value is a CACHE FOR DISPLAY; the credential is the truth. A maintainer MUST re-derive it on read and MUST fail closed (never presenting a stale value) when the credential has been revoked, has expired, or has been archived or deleted.\n\n`generated` — the value is minted per verifier at disclosure time and recorded against that verifier, so every relying party receives a different one that routes back to the holder. This is the shape of the most widely adopted consumer privacy feature in this space; a maintainer need not operate a relay to conform, but the shape must exist, because retrofitting per-verifier values into a pool-of-values model is a migration rather than an addition.\n\n`derived` — the value was taken from a source the holder connected or supplied — a code-hosting profile, an uploaded CV — rather than typed by them or attested by an issuer. Nobody signed it: it is the holder's claim that the source said so, and a consumer MUST NOT present it as attested. It exists as its own kind because a derived value is neither of the others — the holder did not author it, and no one vouches for it — and a holder deciding whether to disclose deserves to know which of their values they typed.\n\nFor how strongly a disclosed value identifies the holder, the kinds rank `credentialBacked` above `derived` above `selfAsserted`; `generated` values are per-verifier and do not correlate.",
585
630
  "type": "object",
586
631
  "required": [
587
632
  "kind"
@@ -652,6 +697,31 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
652
697
  "description": "When true (the default and the only useful setting), a distinct value is minted for each verifier."
653
698
  }
654
699
  }
700
+ },
701
+ {
702
+ "additionalProperties": false,
703
+ "required": [
704
+ "kind",
705
+ "source",
706
+ "derivedAt"
707
+ ],
708
+ "properties": {
709
+ "kind": {
710
+ "const": "derived"
711
+ },
712
+ "source": {
713
+ "type": "string",
714
+ "minLength": 1,
715
+ "maxLength": 64,
716
+ "pattern": "^[a-z][A-Za-z0-9.-]*$",
717
+ "description": "The KIND of source the value was taken from — `github`, `cvUpload`, `linkedIn` — never an account, handle or URL. Provenance survives to the verifier, so this member is disclosed with the claim; a handle here would disclose an identifier the holder never chose to share."
718
+ },
719
+ "derivedAt": {
720
+ "type": "string",
721
+ "format": "date-time",
722
+ "description": "When the value was taken from the source. A derived value is a snapshot: the source may have changed since, and nothing re-derives it."
723
+ }
724
+ }
655
725
  }
656
726
  ]
657
727
  },
@@ -27,6 +27,12 @@ export interface PersonaAttributePutPayload {
27
27
  */
28
28
  label?: string;
29
29
  provenance: Provenance;
30
+ /**
31
+ * Vault identifiers of credentials in which a third party endorses this value. Inventory, not evidence — see the `endorsements` member of the shared Attribute. Replaced whole by each put; omit or send empty for none.
32
+ *
33
+ * @maxItems 64
34
+ */
35
+ endorsements?: string[];
30
36
  /**
31
37
  * How carefully this value is shown to the holder. OPTIONAL, and its absence is meaningful: it records that the holder made no explicit decision, so a consumer resolves it from the claim-type registry. Sending the resolved value back would freeze it — a later tightening of the registry would then protect new attributes and leave this one exposed.
32
38
  */
@@ -147,6 +153,16 @@ export const PAYLOAD_SCHEMA = {
147
153
  "provenance": {
148
154
  "$ref": "#/$defs/Provenance"
149
155
  },
156
+ "endorsements": {
157
+ "type": "array",
158
+ "maxItems": 64,
159
+ "uniqueItems": true,
160
+ "items": {
161
+ "type": "string",
162
+ "minLength": 1
163
+ },
164
+ "description": "Vault identifiers of credentials in which a third party endorses this value. Inventory, not evidence — see the `endorsements` member of the shared Attribute. Replaced whole by each put; omit or send empty for none."
165
+ },
150
166
  "sensitivity": {
151
167
  "$ref": "#/$defs/Sensitivity",
152
168
  "description": "How carefully this value is shown to the holder. OPTIONAL, and its absence is meaningful: it records that the holder made no explicit decision, so a consumer resolves it from the claim-type registry. Sending the resolved value back would freeze it — a later tightening of the registry would then protect new attributes and leave this one exposed."
@@ -320,7 +336,7 @@ export const PAYLOAD_SCHEMA = {
320
336
  },
321
337
  "Provenance": {
322
338
  "title": "Provenance",
323
- "description": "Where a value comes from, and the member that makes this family worth building on a trust stack rather than in an address book. It survives to the verifier, so a recipient can tell — per field — what the holder typed from what an issuer attested.\n\n`selfAsserted` — the holder supplied it.\n\n`credentialBacked` — the value is derived from a credential in the vault at `claimPath`. The stored value is a CACHE FOR DISPLAY; the credential is the truth. A maintainer MUST re-derive it on read and MUST fail closed (never presenting a stale value) when the credential has been revoked, has expired, or has been archived or deleted.\n\n`generated` — the value is minted per verifier at disclosure time and recorded against that verifier, so every relying party receives a different one that routes back to the holder. This is the shape of the most widely adopted consumer privacy feature in this space; a maintainer need not operate a relay to conform, but the shape must exist, because retrofitting per-verifier values into a pool-of-values model is a migration rather than an addition.",
339
+ "description": "Where a value comes from, and the member that makes this family worth building on a trust stack rather than in an address book. It survives to the verifier, so a recipient can tell — per field — what the holder typed from what an issuer attested.\n\n`selfAsserted` — the holder supplied it.\n\n`credentialBacked` — the value is derived from a credential in the vault at `claimPath`. The stored value is a CACHE FOR DISPLAY; the credential is the truth. A maintainer MUST re-derive it on read and MUST fail closed (never presenting a stale value) when the credential has been revoked, has expired, or has been archived or deleted.\n\n`generated` — the value is minted per verifier at disclosure time and recorded against that verifier, so every relying party receives a different one that routes back to the holder. This is the shape of the most widely adopted consumer privacy feature in this space; a maintainer need not operate a relay to conform, but the shape must exist, because retrofitting per-verifier values into a pool-of-values model is a migration rather than an addition.\n\n`derived` — the value was taken from a source the holder connected or supplied — a code-hosting profile, an uploaded CV — rather than typed by them or attested by an issuer. Nobody signed it: it is the holder's claim that the source said so, and a consumer MUST NOT present it as attested. It exists as its own kind because a derived value is neither of the others — the holder did not author it, and no one vouches for it — and a holder deciding whether to disclose deserves to know which of their values they typed.\n\nFor how strongly a disclosed value identifies the holder, the kinds rank `credentialBacked` above `derived` above `selfAsserted`; `generated` values are per-verifier and do not correlate.",
324
340
  "type": "object",
325
341
  "required": [
326
342
  "kind"
@@ -391,6 +407,31 @@ export const PAYLOAD_SCHEMA = {
391
407
  "description": "When true (the default and the only useful setting), a distinct value is minted for each verifier."
392
408
  }
393
409
  }
410
+ },
411
+ {
412
+ "additionalProperties": false,
413
+ "required": [
414
+ "kind",
415
+ "source",
416
+ "derivedAt"
417
+ ],
418
+ "properties": {
419
+ "kind": {
420
+ "const": "derived"
421
+ },
422
+ "source": {
423
+ "type": "string",
424
+ "minLength": 1,
425
+ "maxLength": 64,
426
+ "pattern": "^[a-z][A-Za-z0-9.-]*$",
427
+ "description": "The KIND of source the value was taken from — `github`, `cvUpload`, `linkedIn` — never an account, handle or URL. Provenance survives to the verifier, so this member is disclosed with the claim; a handle here would disclose an identifier the holder never chose to share."
428
+ },
429
+ "derivedAt": {
430
+ "type": "string",
431
+ "format": "date-time",
432
+ "description": "When the value was taken from the source. A derived value is a snapshot: the source may have changed since, and nothing re-derives it."
433
+ }
434
+ }
394
435
  }
395
436
  ]
396
437
  },
@@ -588,7 +629,7 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
588
629
  },
589
630
  "Provenance": {
590
631
  "title": "Provenance",
591
- "description": "Where a value comes from, and the member that makes this family worth building on a trust stack rather than in an address book. It survives to the verifier, so a recipient can tell — per field — what the holder typed from what an issuer attested.\n\n`selfAsserted` — the holder supplied it.\n\n`credentialBacked` — the value is derived from a credential in the vault at `claimPath`. The stored value is a CACHE FOR DISPLAY; the credential is the truth. A maintainer MUST re-derive it on read and MUST fail closed (never presenting a stale value) when the credential has been revoked, has expired, or has been archived or deleted.\n\n`generated` — the value is minted per verifier at disclosure time and recorded against that verifier, so every relying party receives a different one that routes back to the holder. This is the shape of the most widely adopted consumer privacy feature in this space; a maintainer need not operate a relay to conform, but the shape must exist, because retrofitting per-verifier values into a pool-of-values model is a migration rather than an addition.",
632
+ "description": "Where a value comes from, and the member that makes this family worth building on a trust stack rather than in an address book. It survives to the verifier, so a recipient can tell — per field — what the holder typed from what an issuer attested.\n\n`selfAsserted` — the holder supplied it.\n\n`credentialBacked` — the value is derived from a credential in the vault at `claimPath`. The stored value is a CACHE FOR DISPLAY; the credential is the truth. A maintainer MUST re-derive it on read and MUST fail closed (never presenting a stale value) when the credential has been revoked, has expired, or has been archived or deleted.\n\n`generated` — the value is minted per verifier at disclosure time and recorded against that verifier, so every relying party receives a different one that routes back to the holder. This is the shape of the most widely adopted consumer privacy feature in this space; a maintainer need not operate a relay to conform, but the shape must exist, because retrofitting per-verifier values into a pool-of-values model is a migration rather than an addition.\n\n`derived` — the value was taken from a source the holder connected or supplied — a code-hosting profile, an uploaded CV — rather than typed by them or attested by an issuer. Nobody signed it: it is the holder's claim that the source said so, and a consumer MUST NOT present it as attested. It exists as its own kind because a derived value is neither of the others — the holder did not author it, and no one vouches for it — and a holder deciding whether to disclose deserves to know which of their values they typed.\n\nFor how strongly a disclosed value identifies the holder, the kinds rank `credentialBacked` above `derived` above `selfAsserted`; `generated` values are per-verifier and do not correlate.",
592
633
  "type": "object",
593
634
  "required": [
594
635
  "kind"
@@ -659,6 +700,31 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
659
700
  "description": "When true (the default and the only useful setting), a distinct value is minted for each verifier."
660
701
  }
661
702
  }
703
+ },
704
+ {
705
+ "additionalProperties": false,
706
+ "required": [
707
+ "kind",
708
+ "source",
709
+ "derivedAt"
710
+ ],
711
+ "properties": {
712
+ "kind": {
713
+ "const": "derived"
714
+ },
715
+ "source": {
716
+ "type": "string",
717
+ "minLength": 1,
718
+ "maxLength": 64,
719
+ "pattern": "^[a-z][A-Za-z0-9.-]*$",
720
+ "description": "The KIND of source the value was taken from — `github`, `cvUpload`, `linkedIn` — never an account, handle or URL. Provenance survives to the verifier, so this member is disclosed with the claim; a handle here would disclose an identifier the holder never chose to share."
721
+ },
722
+ "derivedAt": {
723
+ "type": "string",
724
+ "format": "date-time",
725
+ "description": "When the value was taken from the source. A derived value is a snapshot: the source may have changed since, and nothing re-derives it."
726
+ }
727
+ }
662
728
  }
663
729
  ]
664
730
  },
@@ -251,7 +251,7 @@ export const PAYLOAD_SCHEMA = {
251
251
  },
252
252
  "Provenance": {
253
253
  "title": "Provenance",
254
- "description": "Where a value comes from, and the member that makes this family worth building on a trust stack rather than in an address book. It survives to the verifier, so a recipient can tell — per field — what the holder typed from what an issuer attested.\n\n`selfAsserted` — the holder supplied it.\n\n`credentialBacked` — the value is derived from a credential in the vault at `claimPath`. The stored value is a CACHE FOR DISPLAY; the credential is the truth. A maintainer MUST re-derive it on read and MUST fail closed (never presenting a stale value) when the credential has been revoked, has expired, or has been archived or deleted.\n\n`generated` — the value is minted per verifier at disclosure time and recorded against that verifier, so every relying party receives a different one that routes back to the holder. This is the shape of the most widely adopted consumer privacy feature in this space; a maintainer need not operate a relay to conform, but the shape must exist, because retrofitting per-verifier values into a pool-of-values model is a migration rather than an addition.",
254
+ "description": "Where a value comes from, and the member that makes this family worth building on a trust stack rather than in an address book. It survives to the verifier, so a recipient can tell — per field — what the holder typed from what an issuer attested.\n\n`selfAsserted` — the holder supplied it.\n\n`credentialBacked` — the value is derived from a credential in the vault at `claimPath`. The stored value is a CACHE FOR DISPLAY; the credential is the truth. A maintainer MUST re-derive it on read and MUST fail closed (never presenting a stale value) when the credential has been revoked, has expired, or has been archived or deleted.\n\n`generated` — the value is minted per verifier at disclosure time and recorded against that verifier, so every relying party receives a different one that routes back to the holder. This is the shape of the most widely adopted consumer privacy feature in this space; a maintainer need not operate a relay to conform, but the shape must exist, because retrofitting per-verifier values into a pool-of-values model is a migration rather than an addition.\n\n`derived` — the value was taken from a source the holder connected or supplied — a code-hosting profile, an uploaded CV — rather than typed by them or attested by an issuer. Nobody signed it: it is the holder's claim that the source said so, and a consumer MUST NOT present it as attested. It exists as its own kind because a derived value is neither of the others — the holder did not author it, and no one vouches for it — and a holder deciding whether to disclose deserves to know which of their values they typed.\n\nFor how strongly a disclosed value identifies the holder, the kinds rank `credentialBacked` above `derived` above `selfAsserted`; `generated` values are per-verifier and do not correlate.",
255
255
  "type": "object",
256
256
  "required": [
257
257
  "kind"
@@ -322,6 +322,31 @@ export const PAYLOAD_SCHEMA = {
322
322
  "description": "When true (the default and the only useful setting), a distinct value is minted for each verifier."
323
323
  }
324
324
  }
325
+ },
326
+ {
327
+ "additionalProperties": false,
328
+ "required": [
329
+ "kind",
330
+ "source",
331
+ "derivedAt"
332
+ ],
333
+ "properties": {
334
+ "kind": {
335
+ "const": "derived"
336
+ },
337
+ "source": {
338
+ "type": "string",
339
+ "minLength": 1,
340
+ "maxLength": 64,
341
+ "pattern": "^[a-z][A-Za-z0-9.-]*$",
342
+ "description": "The KIND of source the value was taken from — `github`, `cvUpload`, `linkedIn` — never an account, handle or URL. Provenance survives to the verifier, so this member is disclosed with the claim; a handle here would disclose an identifier the holder never chose to share."
343
+ },
344
+ "derivedAt": {
345
+ "type": "string",
346
+ "format": "date-time",
347
+ "description": "When the value was taken from the source. A derived value is a snapshot: the source may have changed since, and nothing re-derives it."
348
+ }
349
+ }
325
350
  }
326
351
  ]
327
352
  },
@@ -518,7 +543,7 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
518
543
  },
519
544
  "Provenance": {
520
545
  "title": "Provenance",
521
- "description": "Where a value comes from, and the member that makes this family worth building on a trust stack rather than in an address book. It survives to the verifier, so a recipient can tell — per field — what the holder typed from what an issuer attested.\n\n`selfAsserted` — the holder supplied it.\n\n`credentialBacked` — the value is derived from a credential in the vault at `claimPath`. The stored value is a CACHE FOR DISPLAY; the credential is the truth. A maintainer MUST re-derive it on read and MUST fail closed (never presenting a stale value) when the credential has been revoked, has expired, or has been archived or deleted.\n\n`generated` — the value is minted per verifier at disclosure time and recorded against that verifier, so every relying party receives a different one that routes back to the holder. This is the shape of the most widely adopted consumer privacy feature in this space; a maintainer need not operate a relay to conform, but the shape must exist, because retrofitting per-verifier values into a pool-of-values model is a migration rather than an addition.",
546
+ "description": "Where a value comes from, and the member that makes this family worth building on a trust stack rather than in an address book. It survives to the verifier, so a recipient can tell — per field — what the holder typed from what an issuer attested.\n\n`selfAsserted` — the holder supplied it.\n\n`credentialBacked` — the value is derived from a credential in the vault at `claimPath`. The stored value is a CACHE FOR DISPLAY; the credential is the truth. A maintainer MUST re-derive it on read and MUST fail closed (never presenting a stale value) when the credential has been revoked, has expired, or has been archived or deleted.\n\n`generated` — the value is minted per verifier at disclosure time and recorded against that verifier, so every relying party receives a different one that routes back to the holder. This is the shape of the most widely adopted consumer privacy feature in this space; a maintainer need not operate a relay to conform, but the shape must exist, because retrofitting per-verifier values into a pool-of-values model is a migration rather than an addition.\n\n`derived` — the value was taken from a source the holder connected or supplied — a code-hosting profile, an uploaded CV — rather than typed by them or attested by an issuer. Nobody signed it: it is the holder's claim that the source said so, and a consumer MUST NOT present it as attested. It exists as its own kind because a derived value is neither of the others — the holder did not author it, and no one vouches for it — and a holder deciding whether to disclose deserves to know which of their values they typed.\n\nFor how strongly a disclosed value identifies the holder, the kinds rank `credentialBacked` above `derived` above `selfAsserted`; `generated` values are per-verifier and do not correlate.",
522
547
  "type": "object",
523
548
  "required": [
524
549
  "kind"
@@ -589,6 +614,31 @@ export const RESPONSE_PAYLOAD_SCHEMA = {
589
614
  "description": "When true (the default and the only useful setting), a distinct value is minted for each verifier."
590
615
  }
591
616
  }
617
+ },
618
+ {
619
+ "additionalProperties": false,
620
+ "required": [
621
+ "kind",
622
+ "source",
623
+ "derivedAt"
624
+ ],
625
+ "properties": {
626
+ "kind": {
627
+ "const": "derived"
628
+ },
629
+ "source": {
630
+ "type": "string",
631
+ "minLength": 1,
632
+ "maxLength": 64,
633
+ "pattern": "^[a-z][A-Za-z0-9.-]*$",
634
+ "description": "The KIND of source the value was taken from — `github`, `cvUpload`, `linkedIn` — never an account, handle or URL. Provenance survives to the verifier, so this member is disclosed with the claim; a handle here would disclose an identifier the holder never chose to share."
635
+ },
636
+ "derivedAt": {
637
+ "type": "string",
638
+ "format": "date-time",
639
+ "description": "When the value was taken from the source. A derived value is a snapshot: the source may have changed since, and nothing re-derives it."
640
+ }
641
+ }
592
642
  }
593
643
  ]
594
644
  },