nostr-core 0.3.0 → 0.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.
- package/dist/index.d.ts +88 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +93 -3
- package/dist/index.js.map +1 -1
- package/dist/lnurl.d.ts +161 -0
- package/dist/lnurl.d.ts.map +1 -0
- package/dist/lnurl.js +343 -0
- package/dist/lnurl.js.map +1 -0
- package/dist/nip02.d.ts +27 -0
- package/dist/nip02.d.ts.map +1 -0
- package/dist/nip02.js +55 -0
- package/dist/nip02.js.map +1 -0
- package/dist/nip05.d.ts +24 -0
- package/dist/nip05.d.ts.map +1 -0
- package/dist/nip05.js +57 -0
- package/dist/nip05.js.map +1 -0
- package/dist/nip06.d.ts +26 -0
- package/dist/nip06.d.ts.map +1 -0
- package/dist/nip06.js +49 -0
- package/dist/nip06.js.map +1 -0
- package/dist/nip07.d.ts +8 -0
- package/dist/nip07.d.ts.map +1 -1
- package/dist/nip07.js +24 -0
- package/dist/nip07.js.map +1 -1
- package/dist/nip09.d.ts +34 -0
- package/dist/nip09.d.ts.map +1 -0
- package/dist/nip09.js +66 -0
- package/dist/nip09.js.map +1 -0
- package/dist/nip10.d.ts +40 -0
- package/dist/nip10.d.ts.map +1 -0
- package/dist/nip10.js +69 -0
- package/dist/nip10.js.map +1 -0
- package/dist/nip11.d.ts +41 -0
- package/dist/nip11.d.ts.map +1 -0
- package/dist/nip11.js +38 -0
- package/dist/nip11.js.map +1 -0
- package/dist/nip13.d.ts +26 -0
- package/dist/nip13.d.ts.map +1 -0
- package/dist/nip13.js +75 -0
- package/dist/nip13.js.map +1 -0
- package/dist/nip18.d.ts +28 -0
- package/dist/nip18.d.ts.map +1 -0
- package/dist/nip18.js +66 -0
- package/dist/nip18.js.map +1 -0
- package/dist/nip21.d.ts +14 -0
- package/dist/nip21.d.ts.map +1 -0
- package/dist/nip21.js +24 -0
- package/dist/nip21.js.map +1 -0
- package/dist/nip22.d.ts +26 -0
- package/dist/nip22.d.ts.map +1 -0
- package/dist/nip22.js +109 -0
- package/dist/nip22.js.map +1 -0
- package/dist/nip23.d.ts +24 -0
- package/dist/nip23.d.ts.map +1 -0
- package/dist/nip23.js +70 -0
- package/dist/nip23.js.map +1 -0
- package/dist/nip24.d.ts +31 -0
- package/dist/nip24.d.ts.map +1 -0
- package/dist/nip24.js +75 -0
- package/dist/nip24.js.map +1 -0
- package/dist/nip25.d.ts +32 -0
- package/dist/nip25.d.ts.map +1 -0
- package/dist/nip25.js +54 -0
- package/dist/nip25.js.map +1 -0
- package/dist/nip27.d.ts +16 -0
- package/dist/nip27.d.ts.map +1 -0
- package/dist/nip27.js +44 -0
- package/dist/nip27.js.map +1 -0
- package/dist/nip28.d.ts +52 -0
- package/dist/nip28.d.ts.map +1 -0
- package/dist/nip28.js +118 -0
- package/dist/nip28.js.map +1 -0
- package/dist/nip29.d.ts +60 -0
- package/dist/nip29.d.ts.map +1 -0
- package/dist/nip29.js +122 -0
- package/dist/nip29.js.map +1 -0
- package/dist/nip30.d.ts +18 -0
- package/dist/nip30.d.ts.map +1 -0
- package/dist/nip30.js +24 -0
- package/dist/nip30.js.map +1 -0
- package/dist/nip31.d.ts +11 -0
- package/dist/nip31.d.ts.map +1 -0
- package/dist/nip31.js +15 -0
- package/dist/nip31.js.map +1 -0
- package/dist/nip36.d.ts +14 -0
- package/dist/nip36.d.ts.map +1 -0
- package/dist/nip36.js +24 -0
- package/dist/nip36.js.map +1 -0
- package/dist/nip40.d.ts +14 -0
- package/dist/nip40.d.ts.map +1 -0
- package/dist/nip40.js +26 -0
- package/dist/nip40.js.map +1 -0
- package/dist/nip42.d.ts +20 -0
- package/dist/nip42.d.ts.map +1 -0
- package/dist/nip42.js +38 -0
- package/dist/nip42.js.map +1 -0
- package/dist/nip46.d.ts +17 -4
- package/dist/nip46.d.ts.map +1 -1
- package/dist/nip46.js +78 -38
- package/dist/nip46.js.map +1 -1
- package/dist/nip48.d.ts +23 -0
- package/dist/nip48.d.ts.map +1 -0
- package/dist/nip48.js +30 -0
- package/dist/nip48.js.map +1 -0
- package/dist/nip50.d.ts +23 -0
- package/dist/nip50.d.ts.map +1 -0
- package/dist/nip50.js +47 -0
- package/dist/nip50.js.map +1 -0
- package/dist/nip51.d.ts +57 -0
- package/dist/nip51.d.ts.map +1 -0
- package/dist/nip51.js +118 -0
- package/dist/nip51.js.map +1 -0
- package/dist/nip56.d.ts +28 -0
- package/dist/nip56.d.ts.map +1 -0
- package/dist/nip56.js +60 -0
- package/dist/nip56.js.map +1 -0
- package/dist/nip57.d.ts +48 -0
- package/dist/nip57.d.ts.map +1 -0
- package/dist/nip57.js +140 -0
- package/dist/nip57.js.map +1 -0
- package/dist/nip58.d.ts +82 -0
- package/dist/nip58.d.ts.map +1 -0
- package/dist/nip58.js +195 -0
- package/dist/nip58.js.map +1 -0
- package/dist/nip59.js +1 -1
- package/dist/nip65.d.ts +28 -0
- package/dist/nip65.d.ts.map +1 -0
- package/dist/nip65.js +83 -0
- package/dist/nip65.js.map +1 -0
- package/dist/nip98.d.ts +24 -0
- package/dist/nip98.d.ts.map +1 -0
- package/dist/nip98.js +68 -0
- package/dist/nip98.js.map +1 -0
- package/dist/relay.d.ts +2 -0
- package/dist/relay.d.ts.map +1 -1
- package/dist/relay.js +20 -0
- package/dist/relay.js.map +1 -1
- package/dist/signer.d.ts +4 -0
- package/dist/signer.d.ts.map +1 -1
- package/dist/signer.js +11 -0
- package/dist/signer.js.map +1 -1
- package/package.json +33 -4
package/dist/nip57.d.ts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { type NostrEvent, type EventTemplate } from './event.js';
|
|
2
|
+
export type ZapRequest = {
|
|
3
|
+
recipientPubkey: string;
|
|
4
|
+
eventId?: string;
|
|
5
|
+
address?: string;
|
|
6
|
+
amount: number;
|
|
7
|
+
relays: string[];
|
|
8
|
+
content?: string;
|
|
9
|
+
lnurl?: string;
|
|
10
|
+
};
|
|
11
|
+
export type ZapReceipt = {
|
|
12
|
+
recipientPubkey: string;
|
|
13
|
+
senderPubkey?: string;
|
|
14
|
+
eventId?: string;
|
|
15
|
+
amount: number;
|
|
16
|
+
bolt11: string;
|
|
17
|
+
description: string;
|
|
18
|
+
preimage?: string;
|
|
19
|
+
};
|
|
20
|
+
export declare class ZapError extends Error {
|
|
21
|
+
code: string;
|
|
22
|
+
constructor(message: string, code?: string);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Create a kind 9734 zap request event template (unsigned).
|
|
26
|
+
*/
|
|
27
|
+
export declare function createZapRequestEventTemplate(request: ZapRequest): EventTemplate;
|
|
28
|
+
/**
|
|
29
|
+
* Create and sign a kind 9734 zap request event.
|
|
30
|
+
*/
|
|
31
|
+
export declare function createZapRequestEvent(request: ZapRequest, secretKey: Uint8Array): NostrEvent;
|
|
32
|
+
/**
|
|
33
|
+
* Parse a kind 9735 zap receipt event.
|
|
34
|
+
*/
|
|
35
|
+
export declare function parseZapReceipt(event: NostrEvent): ZapReceipt;
|
|
36
|
+
/**
|
|
37
|
+
* Validate a kind 9735 zap receipt event.
|
|
38
|
+
*/
|
|
39
|
+
export declare function validateZapReceipt(receipt: NostrEvent, request?: NostrEvent): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Fetch a zap invoice from an LNURL callback.
|
|
42
|
+
*/
|
|
43
|
+
export declare function fetchZapInvoice(opts: {
|
|
44
|
+
lnurl: string;
|
|
45
|
+
zapRequest: NostrEvent;
|
|
46
|
+
amount: number;
|
|
47
|
+
}): Promise<string>;
|
|
48
|
+
//# sourceMappingURL=nip57.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip57.d.ts","sourceRoot":"","sources":["../src/nip57.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAA;AAE5F,MAAM,MAAM,UAAU,GAAG;IACvB,eAAe,EAAE,MAAM,CAAA;IACvB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,eAAe,EAAE,MAAM,CAAA;IACvB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,qBAAa,QAAS,SAAQ,KAAK;IACjC,IAAI,EAAE,MAAM,CAAA;gBACA,OAAO,EAAE,MAAM,EAAE,IAAI,SAAc;CAKhD;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,UAAU,GAAG,aAAa,CAiBhF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,GAAG,UAAU,CAE5F;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CA4C7D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAuBrF;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,UAAU,CAAA;IACtB,MAAM,EAAE,MAAM,CAAA;CACf,GAAG,OAAO,CAAC,MAAM,CAAC,CAsBlB"}
|
package/dist/nip57.js
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { finalizeEvent, verifyEvent } from './event.js';
|
|
2
|
+
export class ZapError extends Error {
|
|
3
|
+
code;
|
|
4
|
+
constructor(message, code = 'ZAP_ERROR') {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = 'ZapError';
|
|
7
|
+
this.code = code;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Create a kind 9734 zap request event template (unsigned).
|
|
12
|
+
*/
|
|
13
|
+
export function createZapRequestEventTemplate(request) {
|
|
14
|
+
const tags = [
|
|
15
|
+
['p', request.recipientPubkey],
|
|
16
|
+
['amount', String(request.amount)],
|
|
17
|
+
['relays', ...request.relays],
|
|
18
|
+
];
|
|
19
|
+
if (request.eventId)
|
|
20
|
+
tags.push(['e', request.eventId]);
|
|
21
|
+
if (request.address)
|
|
22
|
+
tags.push(['a', request.address]);
|
|
23
|
+
if (request.lnurl)
|
|
24
|
+
tags.push(['lnurl', request.lnurl]);
|
|
25
|
+
return {
|
|
26
|
+
kind: 9734,
|
|
27
|
+
tags,
|
|
28
|
+
content: request.content ?? '',
|
|
29
|
+
created_at: Math.floor(Date.now() / 1000),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Create and sign a kind 9734 zap request event.
|
|
34
|
+
*/
|
|
35
|
+
export function createZapRequestEvent(request, secretKey) {
|
|
36
|
+
return finalizeEvent(createZapRequestEventTemplate(request), secretKey);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Parse a kind 9735 zap receipt event.
|
|
40
|
+
*/
|
|
41
|
+
export function parseZapReceipt(event) {
|
|
42
|
+
if (event.kind !== 9735)
|
|
43
|
+
throw new ZapError('Expected kind 9735 zap receipt', 'INVALID_KIND');
|
|
44
|
+
let recipientPubkey = '';
|
|
45
|
+
let senderPubkey;
|
|
46
|
+
let eventId;
|
|
47
|
+
let bolt11 = '';
|
|
48
|
+
let description = '';
|
|
49
|
+
let preimage;
|
|
50
|
+
let amount = 0;
|
|
51
|
+
for (const tag of event.tags) {
|
|
52
|
+
switch (tag[0]) {
|
|
53
|
+
case 'p':
|
|
54
|
+
recipientPubkey = tag[1];
|
|
55
|
+
break;
|
|
56
|
+
case 'bolt11':
|
|
57
|
+
bolt11 = tag[1];
|
|
58
|
+
break;
|
|
59
|
+
case 'description':
|
|
60
|
+
description = tag[1];
|
|
61
|
+
break;
|
|
62
|
+
case 'preimage':
|
|
63
|
+
preimage = tag[1];
|
|
64
|
+
break;
|
|
65
|
+
case 'e':
|
|
66
|
+
eventId = tag[1];
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Extract sender pubkey from the description (zap request)
|
|
71
|
+
if (description) {
|
|
72
|
+
try {
|
|
73
|
+
const zapRequest = JSON.parse(description);
|
|
74
|
+
senderPubkey = zapRequest.pubkey;
|
|
75
|
+
const amountTag = zapRequest.tags.find(t => t[0] === 'amount');
|
|
76
|
+
if (amountTag)
|
|
77
|
+
amount = parseInt(amountTag[1], 10);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Invalid description JSON
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return { recipientPubkey, senderPubkey, eventId, amount, bolt11, description, preimage };
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Validate a kind 9735 zap receipt event.
|
|
87
|
+
*/
|
|
88
|
+
export function validateZapReceipt(receipt, request) {
|
|
89
|
+
if (receipt.kind !== 9735)
|
|
90
|
+
return false;
|
|
91
|
+
if (!verifyEvent(receipt))
|
|
92
|
+
return false;
|
|
93
|
+
const descriptionTag = receipt.tags.find(t => t[0] === 'description');
|
|
94
|
+
if (!descriptionTag?.[1])
|
|
95
|
+
return false;
|
|
96
|
+
let zapRequest;
|
|
97
|
+
try {
|
|
98
|
+
zapRequest = JSON.parse(descriptionTag[1]);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
if (!verifyEvent(zapRequest))
|
|
104
|
+
return false;
|
|
105
|
+
if (zapRequest.kind !== 9734)
|
|
106
|
+
return false;
|
|
107
|
+
// If a specific request was provided, verify it matches
|
|
108
|
+
if (request) {
|
|
109
|
+
if (zapRequest.id !== request.id)
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Fetch a zap invoice from an LNURL callback.
|
|
116
|
+
*/
|
|
117
|
+
export async function fetchZapInvoice(opts) {
|
|
118
|
+
const separator = opts.lnurl.includes('?') ? '&' : '?';
|
|
119
|
+
const url = `${opts.lnurl}${separator}amount=${opts.amount}&nostr=${encodeURIComponent(JSON.stringify(opts.zapRequest))}`;
|
|
120
|
+
let json;
|
|
121
|
+
try {
|
|
122
|
+
const res = await fetch(url);
|
|
123
|
+
if (!res.ok)
|
|
124
|
+
throw new ZapError(`HTTP ${res.status} from LNURL callback`, 'FETCH_ERROR');
|
|
125
|
+
json = (await res.json());
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
if (err instanceof ZapError)
|
|
129
|
+
throw err;
|
|
130
|
+
throw new ZapError(`Failed to fetch zap invoice: ${err.message}`, 'FETCH_ERROR');
|
|
131
|
+
}
|
|
132
|
+
if (json.status === 'ERROR') {
|
|
133
|
+
throw new ZapError(`LNURL error: ${json.reason || 'Unknown'}`, 'LNURL_ERROR');
|
|
134
|
+
}
|
|
135
|
+
const pr = json.pr;
|
|
136
|
+
if (!pr)
|
|
137
|
+
throw new ZapError('Missing invoice in LNURL response', 'MISSING_INVOICE');
|
|
138
|
+
return pr;
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=nip57.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip57.js","sourceRoot":"","sources":["../src/nip57.ts"],"names":[],"mappings":"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"}
|
package/dist/nip58.d.ts
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { type NostrEvent, type EventTemplate } from './event.js';
|
|
2
|
+
export type BadgeDefinition = {
|
|
3
|
+
identifier: string;
|
|
4
|
+
name?: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
image?: string;
|
|
7
|
+
thumbs?: string[];
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Create a kind 30009 badge definition event template.
|
|
11
|
+
*/
|
|
12
|
+
export declare function createBadgeDefinitionTemplate(badge: BadgeDefinition): EventTemplate;
|
|
13
|
+
/**
|
|
14
|
+
* Create and sign a badge definition event.
|
|
15
|
+
*/
|
|
16
|
+
export declare function createBadgeDefinitionEvent(badge: BadgeDefinition, secretKey: Uint8Array): NostrEvent;
|
|
17
|
+
/**
|
|
18
|
+
* Parse a kind 30009 badge definition event.
|
|
19
|
+
*/
|
|
20
|
+
export declare function parseBadgeDefinition(event: NostrEvent): BadgeDefinition;
|
|
21
|
+
export type BadgeAward = {
|
|
22
|
+
badgeAddress: string;
|
|
23
|
+
recipients: string[];
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Create a kind 8 badge award event template.
|
|
27
|
+
*/
|
|
28
|
+
export declare function createBadgeAwardTemplate(award: BadgeAward): EventTemplate;
|
|
29
|
+
/**
|
|
30
|
+
* Create and sign a badge award event.
|
|
31
|
+
*/
|
|
32
|
+
export declare function createBadgeAwardEvent(award: BadgeAward, secretKey: Uint8Array): NostrEvent;
|
|
33
|
+
/**
|
|
34
|
+
* Parse a kind 8 badge award event.
|
|
35
|
+
*/
|
|
36
|
+
export declare function parseBadgeAward(event: NostrEvent): BadgeAward;
|
|
37
|
+
export type ProfileBadge = {
|
|
38
|
+
badgeAddress: string;
|
|
39
|
+
awardEventId: string;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Create a kind 30008 profile badges event template.
|
|
43
|
+
*/
|
|
44
|
+
export declare function createProfileBadgesTemplate(badges: ProfileBadge[]): EventTemplate;
|
|
45
|
+
/**
|
|
46
|
+
* Create and sign a profile badges event.
|
|
47
|
+
*/
|
|
48
|
+
export declare function createProfileBadgesEvent(badges: ProfileBadge[], secretKey: Uint8Array): NostrEvent;
|
|
49
|
+
/**
|
|
50
|
+
* Parse a kind 30008 profile badges event.
|
|
51
|
+
*/
|
|
52
|
+
export declare function parseProfileBadges(event: NostrEvent): ProfileBadge[];
|
|
53
|
+
export type BadgeProof = {
|
|
54
|
+
type: 'pow';
|
|
55
|
+
difficulty: number;
|
|
56
|
+
nonce: string;
|
|
57
|
+
} | {
|
|
58
|
+
type: 'payment';
|
|
59
|
+
preimage: string;
|
|
60
|
+
invoice: string;
|
|
61
|
+
} | {
|
|
62
|
+
type: 'membership';
|
|
63
|
+
groupId: string;
|
|
64
|
+
membershipEventId: string;
|
|
65
|
+
};
|
|
66
|
+
export type BadgeRequest = {
|
|
67
|
+
badgeAddress: string;
|
|
68
|
+
proof?: BadgeProof;
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Create a badge request event template with optional proof.
|
|
72
|
+
*/
|
|
73
|
+
export declare function createBadgeRequestTemplate(request: BadgeRequest): EventTemplate;
|
|
74
|
+
/**
|
|
75
|
+
* Verify a badge proof from event tags.
|
|
76
|
+
*/
|
|
77
|
+
export declare function verifyBadgeProof(event: NostrEvent): BadgeProof | undefined;
|
|
78
|
+
/**
|
|
79
|
+
* Validate that a badge award event references the correct badge definition.
|
|
80
|
+
*/
|
|
81
|
+
export declare function validateBadgeAward(award: NostrEvent, definition: NostrEvent): boolean;
|
|
82
|
+
//# sourceMappingURL=nip58.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip58.d.ts","sourceRoot":"","sources":["../src/nip58.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAA;AAI/E,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAClB,CAAA;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,eAAe,GAAG,aAAa,CAgBnF;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,UAAU,GAAG,UAAU,CAEpG;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,UAAU,GAAG,eAAe,CA2BvE;AAID,MAAM,MAAM,UAAU,GAAG;IACvB,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,EAAE,CAAA;CACrB,CAAA;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,UAAU,GAAG,aAAa,CAazE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,GAAG,UAAU,CAE1F;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAU7D;AAID,MAAM,MAAM,YAAY,GAAG;IACzB,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;CACrB,CAAA;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,aAAa,CAcjF;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,SAAS,EAAE,UAAU,GAAG,UAAU,CAElG;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY,EAAE,CAiBpE;AAID,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE,CAAA;AAEtE,MAAM,MAAM,YAAY,GAAG;IACzB,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,UAAU,CAAA;CACnB,CAAA;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,YAAY,GAAG,aAAa,CAuB/E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CAc1E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAYrF"}
|
package/dist/nip58.js
ADDED
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { finalizeEvent } from './event.js';
|
|
2
|
+
/**
|
|
3
|
+
* Create a kind 30009 badge definition event template.
|
|
4
|
+
*/
|
|
5
|
+
export function createBadgeDefinitionTemplate(badge) {
|
|
6
|
+
const tags = [['d', badge.identifier]];
|
|
7
|
+
if (badge.name)
|
|
8
|
+
tags.push(['name', badge.name]);
|
|
9
|
+
if (badge.description)
|
|
10
|
+
tags.push(['description', badge.description]);
|
|
11
|
+
if (badge.image)
|
|
12
|
+
tags.push(['image', badge.image]);
|
|
13
|
+
if (badge.thumbs) {
|
|
14
|
+
for (const thumb of badge.thumbs)
|
|
15
|
+
tags.push(['thumb', thumb]);
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
kind: 30009,
|
|
19
|
+
tags,
|
|
20
|
+
content: '',
|
|
21
|
+
created_at: Math.floor(Date.now() / 1000),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Create and sign a badge definition event.
|
|
26
|
+
*/
|
|
27
|
+
export function createBadgeDefinitionEvent(badge, secretKey) {
|
|
28
|
+
return finalizeEvent(createBadgeDefinitionTemplate(badge), secretKey);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Parse a kind 30009 badge definition event.
|
|
32
|
+
*/
|
|
33
|
+
export function parseBadgeDefinition(event) {
|
|
34
|
+
const result = { identifier: '' };
|
|
35
|
+
const thumbs = [];
|
|
36
|
+
for (const tag of event.tags) {
|
|
37
|
+
switch (tag[0]) {
|
|
38
|
+
case 'd':
|
|
39
|
+
result.identifier = tag[1] ?? '';
|
|
40
|
+
break;
|
|
41
|
+
case 'name':
|
|
42
|
+
result.name = tag[1];
|
|
43
|
+
break;
|
|
44
|
+
case 'description':
|
|
45
|
+
result.description = tag[1];
|
|
46
|
+
break;
|
|
47
|
+
case 'image':
|
|
48
|
+
result.image = tag[1];
|
|
49
|
+
break;
|
|
50
|
+
case 'thumb':
|
|
51
|
+
if (tag[1])
|
|
52
|
+
thumbs.push(tag[1]);
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (thumbs.length > 0)
|
|
57
|
+
result.thumbs = thumbs;
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Create a kind 8 badge award event template.
|
|
62
|
+
*/
|
|
63
|
+
export function createBadgeAwardTemplate(award) {
|
|
64
|
+
const tags = [['a', award.badgeAddress]];
|
|
65
|
+
for (const recipient of award.recipients) {
|
|
66
|
+
tags.push(['p', recipient]);
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
kind: 8,
|
|
70
|
+
tags,
|
|
71
|
+
content: '',
|
|
72
|
+
created_at: Math.floor(Date.now() / 1000),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Create and sign a badge award event.
|
|
77
|
+
*/
|
|
78
|
+
export function createBadgeAwardEvent(award, secretKey) {
|
|
79
|
+
return finalizeEvent(createBadgeAwardTemplate(award), secretKey);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Parse a kind 8 badge award event.
|
|
83
|
+
*/
|
|
84
|
+
export function parseBadgeAward(event) {
|
|
85
|
+
let badgeAddress = '';
|
|
86
|
+
const recipients = [];
|
|
87
|
+
for (const tag of event.tags) {
|
|
88
|
+
if (tag[0] === 'a')
|
|
89
|
+
badgeAddress = tag[1];
|
|
90
|
+
else if (tag[0] === 'p')
|
|
91
|
+
recipients.push(tag[1]);
|
|
92
|
+
}
|
|
93
|
+
return { badgeAddress, recipients };
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Create a kind 30008 profile badges event template.
|
|
97
|
+
*/
|
|
98
|
+
export function createProfileBadgesTemplate(badges) {
|
|
99
|
+
const tags = [['d', 'profile_badges']];
|
|
100
|
+
for (const badge of badges) {
|
|
101
|
+
tags.push(['a', badge.badgeAddress]);
|
|
102
|
+
tags.push(['e', badge.awardEventId]);
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
kind: 30008,
|
|
106
|
+
tags,
|
|
107
|
+
content: '',
|
|
108
|
+
created_at: Math.floor(Date.now() / 1000),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Create and sign a profile badges event.
|
|
113
|
+
*/
|
|
114
|
+
export function createProfileBadgesEvent(badges, secretKey) {
|
|
115
|
+
return finalizeEvent(createProfileBadgesTemplate(badges), secretKey);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Parse a kind 30008 profile badges event.
|
|
119
|
+
*/
|
|
120
|
+
export function parseProfileBadges(event) {
|
|
121
|
+
const badges = [];
|
|
122
|
+
// Tags come in pairs: ['a', address], ['e', awardId]
|
|
123
|
+
const tags = event.tags.filter(t => t[0] === 'a' || t[0] === 'e');
|
|
124
|
+
let currentAddress;
|
|
125
|
+
for (const tag of tags) {
|
|
126
|
+
if (tag[0] === 'a') {
|
|
127
|
+
currentAddress = tag[1];
|
|
128
|
+
}
|
|
129
|
+
else if (tag[0] === 'e' && currentAddress) {
|
|
130
|
+
badges.push({ badgeAddress: currentAddress, awardEventId: tag[1] });
|
|
131
|
+
currentAddress = undefined;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return badges;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Create a badge request event template with optional proof.
|
|
138
|
+
*/
|
|
139
|
+
export function createBadgeRequestTemplate(request) {
|
|
140
|
+
const tags = [['a', request.badgeAddress]];
|
|
141
|
+
if (request.proof) {
|
|
142
|
+
switch (request.proof.type) {
|
|
143
|
+
case 'pow':
|
|
144
|
+
tags.push(['proof', 'pow', String(request.proof.difficulty), request.proof.nonce]);
|
|
145
|
+
break;
|
|
146
|
+
case 'payment':
|
|
147
|
+
tags.push(['proof', 'payment', request.proof.preimage, request.proof.invoice]);
|
|
148
|
+
break;
|
|
149
|
+
case 'membership':
|
|
150
|
+
tags.push(['proof', 'membership', request.proof.groupId, request.proof.membershipEventId]);
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
kind: 8,
|
|
156
|
+
tags,
|
|
157
|
+
content: '',
|
|
158
|
+
created_at: Math.floor(Date.now() / 1000),
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Verify a badge proof from event tags.
|
|
163
|
+
*/
|
|
164
|
+
export function verifyBadgeProof(event) {
|
|
165
|
+
const proofTag = event.tags.find(t => t[0] === 'proof');
|
|
166
|
+
if (!proofTag)
|
|
167
|
+
return undefined;
|
|
168
|
+
switch (proofTag[1]) {
|
|
169
|
+
case 'pow':
|
|
170
|
+
return { type: 'pow', difficulty: parseInt(proofTag[2], 10), nonce: proofTag[3] };
|
|
171
|
+
case 'payment':
|
|
172
|
+
return { type: 'payment', preimage: proofTag[2], invoice: proofTag[3] };
|
|
173
|
+
case 'membership':
|
|
174
|
+
return { type: 'membership', groupId: proofTag[2], membershipEventId: proofTag[3] };
|
|
175
|
+
default:
|
|
176
|
+
return undefined;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Validate that a badge award event references the correct badge definition.
|
|
181
|
+
*/
|
|
182
|
+
export function validateBadgeAward(award, definition) {
|
|
183
|
+
if (award.kind !== 8 || definition.kind !== 30009)
|
|
184
|
+
return false;
|
|
185
|
+
const awardAddress = award.tags.find(t => t[0] === 'a')?.[1];
|
|
186
|
+
if (!awardAddress)
|
|
187
|
+
return false;
|
|
188
|
+
const defIdentifier = definition.tags.find(t => t[0] === 'd')?.[1];
|
|
189
|
+
if (!defIdentifier)
|
|
190
|
+
return false;
|
|
191
|
+
// Address format: kind:pubkey:identifier
|
|
192
|
+
const expectedAddress = `30009:${definition.pubkey}:${defIdentifier}`;
|
|
193
|
+
return awardAddress === expectedAddress;
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=nip58.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip58.js","sourceRoot":"","sources":["../src/nip58.ts"],"names":[],"mappings":"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"}
|
package/dist/nip59.js
CHANGED
|
@@ -62,7 +62,7 @@ export function unwrap(wrap, recipientSecretKey) {
|
|
|
62
62
|
const rumor = JSON.parse(rumorJson);
|
|
63
63
|
// Verify pubkey consistency: seal.pubkey must match rumor.pubkey
|
|
64
64
|
if (seal.pubkey !== rumor.pubkey) {
|
|
65
|
-
throw new Error('Seal pubkey does not match rumor pubkey
|
|
65
|
+
throw new Error('Seal pubkey does not match rumor pubkey - possible impersonation');
|
|
66
66
|
}
|
|
67
67
|
return rumor;
|
|
68
68
|
}
|
package/dist/nip65.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type NostrEvent, type EventTemplate } from './event.js';
|
|
2
|
+
export type RelayReadWrite = {
|
|
3
|
+
url: string;
|
|
4
|
+
read: boolean;
|
|
5
|
+
write: boolean;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Parse a kind 10002 relay list event into structured relay entries.
|
|
9
|
+
*/
|
|
10
|
+
export declare function parseRelayList(event: NostrEvent): RelayReadWrite[];
|
|
11
|
+
/**
|
|
12
|
+
* Create a kind 10002 relay list event template (unsigned).
|
|
13
|
+
* Sign with `finalizeEvent()` or pass to a Signer.
|
|
14
|
+
*/
|
|
15
|
+
export declare function createRelayListEventTemplate(relays: RelayReadWrite[]): EventTemplate;
|
|
16
|
+
/**
|
|
17
|
+
* Create and sign a kind 10002 relay list event.
|
|
18
|
+
*/
|
|
19
|
+
export declare function createRelayListEvent(relays: RelayReadWrite[], secretKey: Uint8Array): NostrEvent;
|
|
20
|
+
/**
|
|
21
|
+
* Get only read relays from a parsed relay list.
|
|
22
|
+
*/
|
|
23
|
+
export declare function getReadRelays(relays: RelayReadWrite[]): string[];
|
|
24
|
+
/**
|
|
25
|
+
* Get only write relays from a parsed relay list.
|
|
26
|
+
*/
|
|
27
|
+
export declare function getWriteRelays(relays: RelayReadWrite[]): string[];
|
|
28
|
+
//# sourceMappingURL=nip65.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip65.d.ts","sourceRoot":"","sources":["../src/nip65.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAA;AAQ/E,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,OAAO,CAAA;IACb,KAAK,EAAE,OAAO,CAAA;CACf,CAAA;AAID;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,cAAc,EAAE,CA4BlE;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,aAAa,CAwBpF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,SAAS,EAAE,UAAU,GAAG,UAAU,CAEhG;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,EAAE,CAEhE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,EAAE,CAEjE"}
|
package/dist/nip65.js
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { finalizeEvent } from './event.js';
|
|
2
|
+
import { normalizeURL } from './utils.js';
|
|
3
|
+
// Kind constant
|
|
4
|
+
const RELAY_LIST_KIND = 10002;
|
|
5
|
+
// Public API
|
|
6
|
+
/**
|
|
7
|
+
* Parse a kind 10002 relay list event into structured relay entries.
|
|
8
|
+
*/
|
|
9
|
+
export function parseRelayList(event) {
|
|
10
|
+
if (event.kind !== RELAY_LIST_KIND) {
|
|
11
|
+
throw new Error(`Expected kind ${RELAY_LIST_KIND} relay list event, got kind ${event.kind}`);
|
|
12
|
+
}
|
|
13
|
+
const relays = [];
|
|
14
|
+
const seen = new Set();
|
|
15
|
+
for (const tag of event.tags) {
|
|
16
|
+
if (tag[0] !== 'r')
|
|
17
|
+
continue;
|
|
18
|
+
const url = normalizeURL(tag[1]);
|
|
19
|
+
if (seen.has(url))
|
|
20
|
+
continue;
|
|
21
|
+
seen.add(url);
|
|
22
|
+
const marker = tag[2];
|
|
23
|
+
if (marker === 'read') {
|
|
24
|
+
relays.push({ url, read: true, write: false });
|
|
25
|
+
}
|
|
26
|
+
else if (marker === 'write') {
|
|
27
|
+
relays.push({ url, read: false, write: true });
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
// No marker = bidirectional
|
|
31
|
+
relays.push({ url, read: true, write: true });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return relays;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Create a kind 10002 relay list event template (unsigned).
|
|
38
|
+
* Sign with `finalizeEvent()` or pass to a Signer.
|
|
39
|
+
*/
|
|
40
|
+
export function createRelayListEventTemplate(relays) {
|
|
41
|
+
const tags = [];
|
|
42
|
+
const seen = new Set();
|
|
43
|
+
for (const relay of relays) {
|
|
44
|
+
const url = normalizeURL(relay.url);
|
|
45
|
+
if (seen.has(url))
|
|
46
|
+
continue;
|
|
47
|
+
seen.add(url);
|
|
48
|
+
if (relay.read && relay.write) {
|
|
49
|
+
tags.push(['r', url]);
|
|
50
|
+
}
|
|
51
|
+
else if (relay.read) {
|
|
52
|
+
tags.push(['r', url, 'read']);
|
|
53
|
+
}
|
|
54
|
+
else if (relay.write) {
|
|
55
|
+
tags.push(['r', url, 'write']);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
kind: RELAY_LIST_KIND,
|
|
60
|
+
tags,
|
|
61
|
+
content: '',
|
|
62
|
+
created_at: Math.floor(Date.now() / 1000),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Create and sign a kind 10002 relay list event.
|
|
67
|
+
*/
|
|
68
|
+
export function createRelayListEvent(relays, secretKey) {
|
|
69
|
+
return finalizeEvent(createRelayListEventTemplate(relays), secretKey);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Get only read relays from a parsed relay list.
|
|
73
|
+
*/
|
|
74
|
+
export function getReadRelays(relays) {
|
|
75
|
+
return relays.filter(r => r.read).map(r => r.url);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get only write relays from a parsed relay list.
|
|
79
|
+
*/
|
|
80
|
+
export function getWriteRelays(relays) {
|
|
81
|
+
return relays.filter(r => r.write).map(r => r.url);
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=nip65.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip65.js","sourceRoot":"","sources":["../src/nip65.ts"],"names":[],"mappings":"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"}
|
package/dist/nip98.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type NostrEvent, type EventTemplate } from './event.js';
|
|
2
|
+
export type HttpAuthOptions = {
|
|
3
|
+
url: string;
|
|
4
|
+
method: string;
|
|
5
|
+
body?: Uint8Array | string;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Create a kind 27235 HTTP auth event template (unsigned).
|
|
9
|
+
*/
|
|
10
|
+
export declare function createHttpAuthEventTemplate(opts: HttpAuthOptions): EventTemplate;
|
|
11
|
+
/**
|
|
12
|
+
* Create and sign a kind 27235 HTTP auth event.
|
|
13
|
+
*/
|
|
14
|
+
export declare function createHttpAuthEvent(opts: HttpAuthOptions, secretKey: Uint8Array): NostrEvent;
|
|
15
|
+
/**
|
|
16
|
+
* Get the Authorization header value from a signed HTTP auth event.
|
|
17
|
+
* Returns "Nostr <base64>" format.
|
|
18
|
+
*/
|
|
19
|
+
export declare function getAuthorizationHeader(event: NostrEvent): string;
|
|
20
|
+
/**
|
|
21
|
+
* Verify an HTTP auth event against expected request parameters.
|
|
22
|
+
*/
|
|
23
|
+
export declare function verifyHttpAuthEvent(event: NostrEvent, opts: HttpAuthOptions): boolean;
|
|
24
|
+
//# sourceMappingURL=nip98.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip98.d.ts","sourceRoot":"","sources":["../src/nip98.ts"],"names":[],"mappings":"AAIA,OAAO,EAA8B,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAA;AAG5F,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,UAAU,GAAG,MAAM,CAAA;CAC3B,CAAA;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,eAAe,GAAG,aAAa,CAkBhF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,UAAU,GAAG,UAAU,CAE5F;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAIhE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAsBrF"}
|