@aztec/foundation 0.46.7 → 0.47.1
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/dest/collection/object.d.ts +4 -0
- package/dest/collection/object.d.ts.map +1 -1
- package/dest/collection/object.js +11 -1
- package/dest/crypto/keccak/index.d.ts +6 -0
- package/dest/crypto/keccak/index.d.ts.map +1 -1
- package/dest/crypto/keccak/index.js +223 -1
- package/dest/fields/point.d.ts +3 -0
- package/dest/fields/point.d.ts.map +1 -1
- package/dest/fields/point.js +22 -9
- package/dest/log/log_fn.d.ts +1 -1
- package/dest/log/log_fn.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/collection/object.ts +11 -0
- package/src/crypto/keccak/index.ts +245 -0
- package/src/fields/point.ts +23 -8
- package/src/log/log_fn.ts +1 -1
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
/** Returns a new object with the same keys and where each value has been passed through the mapping function. */
|
|
2
2
|
export declare function mapValues<K extends string | number | symbol, T, U>(obj: Record<K, T>, fn: (value: T) => U): Record<K, U>;
|
|
3
3
|
export declare function mapValues<K extends string | number | symbol, T, U>(obj: Partial<Record<K, T>>, fn: (value: T) => U): Partial<Record<K, U>>;
|
|
4
|
+
/** Returns a new object where all keys with undefined values have been removed. */
|
|
5
|
+
export declare function compact<T extends object>(obj: T): {
|
|
6
|
+
[P in keyof T]+?: Exclude<T[P], undefined>;
|
|
7
|
+
};
|
|
4
8
|
//# sourceMappingURL=object.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../src/collection/object.ts"],"names":[],"mappings":"AAAA,iHAAiH;AACjH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,EAChE,GAAG,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EACjB,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAClB,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAChB,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,EAChE,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAC1B,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAClB,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../src/collection/object.ts"],"names":[],"mappings":"AAAA,iHAAiH;AACjH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,EAChE,GAAG,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EACjB,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAClB,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAChB,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,EAChE,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAC1B,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAClB,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAYzB,mFAAmF;AACnF,wBAAgB,OAAO,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG;KAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC;CAAE,CAQhG"}
|
|
@@ -5,4 +5,14 @@ export function mapValues(obj, fn) {
|
|
|
5
5
|
}
|
|
6
6
|
return result;
|
|
7
7
|
}
|
|
8
|
-
|
|
8
|
+
/** Returns a new object where all keys with undefined values have been removed. */
|
|
9
|
+
export function compact(obj) {
|
|
10
|
+
const result = {};
|
|
11
|
+
for (const key in obj) {
|
|
12
|
+
if (obj[key] !== undefined) {
|
|
13
|
+
result[key] = obj[key];
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return result;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbGxlY3Rpb24vb2JqZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVNBLE1BQU0sVUFBVSxTQUFTLENBQ3ZCLEdBQWlCLEVBQ2pCLEVBQW1CO0lBRW5CLE1BQU0sTUFBTSxHQUFpQixFQUFrQixDQUFDO0lBQ2hELEtBQUssTUFBTSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDdEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELG1GQUFtRjtBQUNuRixNQUFNLFVBQVUsT0FBTyxDQUFtQixHQUFNO0lBQzlDLE1BQU0sTUFBTSxHQUFRLEVBQUUsQ0FBQztJQUN2QixLQUFLLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzNCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIn0=
|
|
@@ -17,4 +17,10 @@ export declare function keccak256String(input: string): string;
|
|
|
17
17
|
* @returns The computed Keccak-224 hash as a Buffer.
|
|
18
18
|
*/
|
|
19
19
|
export declare function keccak224(input: Buffer): Buffer;
|
|
20
|
+
/**
|
|
21
|
+
* Computes the Keccak-f1600 permutation of the input.
|
|
22
|
+
* @param state 25 64-bit words.
|
|
23
|
+
* @returns The permuted state.
|
|
24
|
+
*/
|
|
25
|
+
export declare function keccakf1600(state: bigint[]): bigint[];
|
|
20
26
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/crypto/keccak/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,UAGtC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,UAK5C;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,UAGtC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/crypto/keccak/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,UAGtC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,UAK5C;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,UAGtC;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CA+MrD"}
|
|
@@ -28,4 +28,226 @@ export function keccak224(input) {
|
|
|
28
28
|
const hash = new Keccak(224);
|
|
29
29
|
return hash.update(input).digest();
|
|
30
30
|
}
|
|
31
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Computes the Keccak-f1600 permutation of the input.
|
|
33
|
+
* @param state 25 64-bit words.
|
|
34
|
+
* @returns The permuted state.
|
|
35
|
+
*/
|
|
36
|
+
export function keccakf1600(state) {
|
|
37
|
+
// Ideally we'd assert the size of the state and its constituent elements here.
|
|
38
|
+
// But since this gets included in the browser bundle, we can't use Node's assert module.
|
|
39
|
+
/* The implementation based on the "simple" implementation by Ronny Van Keer. */
|
|
40
|
+
/* Adapted from Barretenberg's CPP implementation. */
|
|
41
|
+
let Eba, Ebe, Ebi, Ebo, Ebu;
|
|
42
|
+
let Ega, Ege, Egi, Ego, Egu;
|
|
43
|
+
let Eka, Eke, Eki, Eko, Eku;
|
|
44
|
+
let Ema, Eme, Emi, Emo, Emu;
|
|
45
|
+
let Esa, Ese, Esi, Eso, Esu;
|
|
46
|
+
let Ba, Be, Bi, Bo, Bu;
|
|
47
|
+
let Da, De, Di, Do, Du;
|
|
48
|
+
let Aba = state[0];
|
|
49
|
+
let Abe = state[1];
|
|
50
|
+
let Abi = state[2];
|
|
51
|
+
let Abo = state[3];
|
|
52
|
+
let Abu = state[4];
|
|
53
|
+
let Aga = state[5];
|
|
54
|
+
let Age = state[6];
|
|
55
|
+
let Agi = state[7];
|
|
56
|
+
let Ago = state[8];
|
|
57
|
+
let Agu = state[9];
|
|
58
|
+
let Aka = state[10];
|
|
59
|
+
let Ake = state[11];
|
|
60
|
+
let Aki = state[12];
|
|
61
|
+
let Ako = state[13];
|
|
62
|
+
let Aku = state[14];
|
|
63
|
+
let Ama = state[15];
|
|
64
|
+
let Ame = state[16];
|
|
65
|
+
let Ami = state[17];
|
|
66
|
+
let Amo = state[18];
|
|
67
|
+
let Amu = state[19];
|
|
68
|
+
let Asa = state[20];
|
|
69
|
+
let Ase = state[21];
|
|
70
|
+
let Asi = state[22];
|
|
71
|
+
let Aso = state[23];
|
|
72
|
+
let Asu = state[24];
|
|
73
|
+
for (let round = 0; round < 24; round += 2) {
|
|
74
|
+
/* Round (round + 0): Axx -> Exx */
|
|
75
|
+
Ba = Aba ^ Aga ^ Aka ^ Ama ^ Asa;
|
|
76
|
+
Be = Abe ^ Age ^ Ake ^ Ame ^ Ase;
|
|
77
|
+
Bi = Abi ^ Agi ^ Aki ^ Ami ^ Asi;
|
|
78
|
+
Bo = Abo ^ Ago ^ Ako ^ Amo ^ Aso;
|
|
79
|
+
Bu = Abu ^ Agu ^ Aku ^ Amu ^ Asu;
|
|
80
|
+
Da = Bu ^ rol(Be, 1n);
|
|
81
|
+
De = Ba ^ rol(Bi, 1n);
|
|
82
|
+
Di = Be ^ rol(Bo, 1n);
|
|
83
|
+
Do = Bi ^ rol(Bu, 1n);
|
|
84
|
+
Du = Bo ^ rol(Ba, 1n);
|
|
85
|
+
Ba = Aba ^ Da;
|
|
86
|
+
Be = rol(Age ^ De, 44n);
|
|
87
|
+
Bi = rol(Aki ^ Di, 43n);
|
|
88
|
+
Bo = rol(Amo ^ Do, 21n);
|
|
89
|
+
Bu = rol(Asu ^ Du, 14n);
|
|
90
|
+
Eba = Ba ^ (~Be & Bi) ^ roundConstants[round];
|
|
91
|
+
Ebe = Be ^ (~Bi & Bo);
|
|
92
|
+
Ebi = Bi ^ (~Bo & Bu);
|
|
93
|
+
Ebo = Bo ^ (~Bu & Ba);
|
|
94
|
+
Ebu = Bu ^ (~Ba & Be);
|
|
95
|
+
Ba = rol(Abo ^ Do, 28n);
|
|
96
|
+
Be = rol(Agu ^ Du, 20n);
|
|
97
|
+
Bi = rol(Aka ^ Da, 3n);
|
|
98
|
+
Bo = rol(Ame ^ De, 45n);
|
|
99
|
+
Bu = rol(Asi ^ Di, 61n);
|
|
100
|
+
Ega = Ba ^ (~Be & Bi);
|
|
101
|
+
Ege = Be ^ (~Bi & Bo);
|
|
102
|
+
Egi = Bi ^ (~Bo & Bu);
|
|
103
|
+
Ego = Bo ^ (~Bu & Ba);
|
|
104
|
+
Egu = Bu ^ (~Ba & Be);
|
|
105
|
+
Ba = rol(Abe ^ De, 1n);
|
|
106
|
+
Be = rol(Agi ^ Di, 6n);
|
|
107
|
+
Bi = rol(Ako ^ Do, 25n);
|
|
108
|
+
Bo = rol(Amu ^ Du, 8n);
|
|
109
|
+
Bu = rol(Asa ^ Da, 18n);
|
|
110
|
+
Eka = Ba ^ (~Be & Bi);
|
|
111
|
+
Eke = Be ^ (~Bi & Bo);
|
|
112
|
+
Eki = Bi ^ (~Bo & Bu);
|
|
113
|
+
Eko = Bo ^ (~Bu & Ba);
|
|
114
|
+
Eku = Bu ^ (~Ba & Be);
|
|
115
|
+
Ba = rol(Abu ^ Du, 27n);
|
|
116
|
+
Be = rol(Aga ^ Da, 36n);
|
|
117
|
+
Bi = rol(Ake ^ De, 10n);
|
|
118
|
+
Bo = rol(Ami ^ Di, 15n);
|
|
119
|
+
Bu = rol(Aso ^ Do, 56n);
|
|
120
|
+
Ema = Ba ^ (~Be & Bi);
|
|
121
|
+
Eme = Be ^ (~Bi & Bo);
|
|
122
|
+
Emi = Bi ^ (~Bo & Bu);
|
|
123
|
+
Emo = Bo ^ (~Bu & Ba);
|
|
124
|
+
Emu = Bu ^ (~Ba & Be);
|
|
125
|
+
Ba = rol(Abi ^ Di, 62n);
|
|
126
|
+
Be = rol(Ago ^ Do, 55n);
|
|
127
|
+
Bi = rol(Aku ^ Du, 39n);
|
|
128
|
+
Bo = rol(Ama ^ Da, 41n);
|
|
129
|
+
Bu = rol(Ase ^ De, 2n);
|
|
130
|
+
Esa = Ba ^ (~Be & Bi);
|
|
131
|
+
Ese = Be ^ (~Bi & Bo);
|
|
132
|
+
Esi = Bi ^ (~Bo & Bu);
|
|
133
|
+
Eso = Bo ^ (~Bu & Ba);
|
|
134
|
+
Esu = Bu ^ (~Ba & Be);
|
|
135
|
+
/* Round (round + 1): Exx -> Axx */
|
|
136
|
+
Ba = Eba ^ Ega ^ Eka ^ Ema ^ Esa;
|
|
137
|
+
Be = Ebe ^ Ege ^ Eke ^ Eme ^ Ese;
|
|
138
|
+
Bi = Ebi ^ Egi ^ Eki ^ Emi ^ Esi;
|
|
139
|
+
Bo = Ebo ^ Ego ^ Eko ^ Emo ^ Eso;
|
|
140
|
+
Bu = Ebu ^ Egu ^ Eku ^ Emu ^ Esu;
|
|
141
|
+
Da = Bu ^ rol(Be, 1n);
|
|
142
|
+
De = Ba ^ rol(Bi, 1n);
|
|
143
|
+
Di = Be ^ rol(Bo, 1n);
|
|
144
|
+
Do = Bi ^ rol(Bu, 1n);
|
|
145
|
+
Du = Bo ^ rol(Ba, 1n);
|
|
146
|
+
Ba = Eba ^ Da;
|
|
147
|
+
Be = rol(Ege ^ De, 44n);
|
|
148
|
+
Bi = rol(Eki ^ Di, 43n);
|
|
149
|
+
Bo = rol(Emo ^ Do, 21n);
|
|
150
|
+
Bu = rol(Esu ^ Du, 14n);
|
|
151
|
+
Aba = Ba ^ (~Be & Bi) ^ roundConstants[round + 1];
|
|
152
|
+
Abe = Be ^ (~Bi & Bo);
|
|
153
|
+
Abi = Bi ^ (~Bo & Bu);
|
|
154
|
+
Abo = Bo ^ (~Bu & Ba);
|
|
155
|
+
Abu = Bu ^ (~Ba & Be);
|
|
156
|
+
Ba = rol(Ebo ^ Do, 28n);
|
|
157
|
+
Be = rol(Egu ^ Du, 20n);
|
|
158
|
+
Bi = rol(Eka ^ Da, 3n);
|
|
159
|
+
Bo = rol(Eme ^ De, 45n);
|
|
160
|
+
Bu = rol(Esi ^ Di, 61n);
|
|
161
|
+
Aga = Ba ^ (~Be & Bi);
|
|
162
|
+
Age = Be ^ (~Bi & Bo);
|
|
163
|
+
Agi = Bi ^ (~Bo & Bu);
|
|
164
|
+
Ago = Bo ^ (~Bu & Ba);
|
|
165
|
+
Agu = Bu ^ (~Ba & Be);
|
|
166
|
+
Ba = rol(Ebe ^ De, 1n);
|
|
167
|
+
Be = rol(Egi ^ Di, 6n);
|
|
168
|
+
Bi = rol(Eko ^ Do, 25n);
|
|
169
|
+
Bo = rol(Emu ^ Du, 8n);
|
|
170
|
+
Bu = rol(Esa ^ Da, 18n);
|
|
171
|
+
Aka = Ba ^ (~Be & Bi);
|
|
172
|
+
Ake = Be ^ (~Bi & Bo);
|
|
173
|
+
Aki = Bi ^ (~Bo & Bu);
|
|
174
|
+
Ako = Bo ^ (~Bu & Ba);
|
|
175
|
+
Aku = Bu ^ (~Ba & Be);
|
|
176
|
+
Ba = rol(Ebu ^ Du, 27n);
|
|
177
|
+
Be = rol(Ega ^ Da, 36n);
|
|
178
|
+
Bi = rol(Eke ^ De, 10n);
|
|
179
|
+
Bo = rol(Emi ^ Di, 15n);
|
|
180
|
+
Bu = rol(Eso ^ Do, 56n);
|
|
181
|
+
Ama = Ba ^ (~Be & Bi);
|
|
182
|
+
Ame = Be ^ (~Bi & Bo);
|
|
183
|
+
Ami = Bi ^ (~Bo & Bu);
|
|
184
|
+
Amo = Bo ^ (~Bu & Ba);
|
|
185
|
+
Amu = Bu ^ (~Ba & Be);
|
|
186
|
+
Ba = rol(Ebi ^ Di, 62n);
|
|
187
|
+
Be = rol(Ego ^ Do, 55n);
|
|
188
|
+
Bi = rol(Eku ^ Du, 39n);
|
|
189
|
+
Bo = rol(Ema ^ Da, 41n);
|
|
190
|
+
Bu = rol(Ese ^ De, 2n);
|
|
191
|
+
Asa = Ba ^ (~Be & Bi);
|
|
192
|
+
Ase = Be ^ (~Bi & Bo);
|
|
193
|
+
Asi = Bi ^ (~Bo & Bu);
|
|
194
|
+
Aso = Bo ^ (~Bu & Ba);
|
|
195
|
+
Asu = Bu ^ (~Ba & Be);
|
|
196
|
+
}
|
|
197
|
+
state[0] = Aba;
|
|
198
|
+
state[1] = Abe;
|
|
199
|
+
state[2] = Abi;
|
|
200
|
+
state[3] = Abo;
|
|
201
|
+
state[4] = Abu;
|
|
202
|
+
state[5] = Aga;
|
|
203
|
+
state[6] = Age;
|
|
204
|
+
state[7] = Agi;
|
|
205
|
+
state[8] = Ago;
|
|
206
|
+
state[9] = Agu;
|
|
207
|
+
state[10] = Aka;
|
|
208
|
+
state[11] = Ake;
|
|
209
|
+
state[12] = Aki;
|
|
210
|
+
state[13] = Ako;
|
|
211
|
+
state[14] = Aku;
|
|
212
|
+
state[15] = Ama;
|
|
213
|
+
state[16] = Ame;
|
|
214
|
+
state[17] = Ami;
|
|
215
|
+
state[18] = Amo;
|
|
216
|
+
state[19] = Amu;
|
|
217
|
+
state[20] = Asa;
|
|
218
|
+
state[21] = Ase;
|
|
219
|
+
state[22] = Asi;
|
|
220
|
+
state[23] = Aso;
|
|
221
|
+
state[24] = Asu;
|
|
222
|
+
return state;
|
|
223
|
+
}
|
|
224
|
+
function rol(x, s) {
|
|
225
|
+
return BigInt.asUintN(64, x << s) | (x >> (64n - s));
|
|
226
|
+
}
|
|
227
|
+
const roundConstants = [
|
|
228
|
+
0x0000000000000001n,
|
|
229
|
+
0x0000000000008082n,
|
|
230
|
+
0x800000000000808an,
|
|
231
|
+
0x8000000080008000n,
|
|
232
|
+
0x000000000000808bn,
|
|
233
|
+
0x0000000080000001n,
|
|
234
|
+
0x8000000080008081n,
|
|
235
|
+
0x8000000000008009n,
|
|
236
|
+
0x000000000000008an,
|
|
237
|
+
0x0000000000000088n,
|
|
238
|
+
0x0000000080008009n,
|
|
239
|
+
0x000000008000000an,
|
|
240
|
+
0x000000008000808bn,
|
|
241
|
+
0x800000000000008bn,
|
|
242
|
+
0x8000000000008089n,
|
|
243
|
+
0x8000000000008003n,
|
|
244
|
+
0x8000000000008002n,
|
|
245
|
+
0x8000000000000080n,
|
|
246
|
+
0x000000000000800an,
|
|
247
|
+
0x800000008000000an,
|
|
248
|
+
0x8000000080008081n,
|
|
249
|
+
0x8000000000008080n,
|
|
250
|
+
0x0000000080000001n,
|
|
251
|
+
0x8000000080008008n,
|
|
252
|
+
];
|
|
253
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY3J5cHRvL2tlY2Nhay9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTlCOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxLQUFhO0lBQ3JDLE1BQU0sSUFBSSxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUNyQyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLEtBQWE7SUFDM0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0IsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDNUIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxLQUFhO0lBQ3JDLE1BQU0sSUFBSSxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUNyQyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBZTtJQUN6QywrRUFBK0U7SUFDL0UseUZBQXlGO0lBQ3pGLGdGQUFnRjtJQUNoRixxREFBcUQ7SUFDckQsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQzVCLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztJQUM1QixJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDNUIsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQzVCLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztJQUU1QixJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFFdkIsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBRXZCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQixJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkIsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25CLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQixJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkIsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25CLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQixJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkIsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25CLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQixJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDcEIsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3BCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNwQixJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDcEIsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3BCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNwQixJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDcEIsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3BCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNwQixJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDcEIsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3BCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNwQixJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDcEIsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3BCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUVwQixLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsRUFBRSxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUMzQyxtQ0FBbUM7UUFDbkMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDakMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDakMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDakMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDakMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFFakMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN0QixFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdEIsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUV0QixFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNkLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN0QixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdEIsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUV0QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN2QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN0QixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdEIsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN0QixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFFdEIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN2QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdEIsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN0QixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdEIsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBRXRCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEIsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN0QixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdEIsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUV0QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN0QixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdEIsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN0QixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFFdEIsbUNBQW1DO1FBRW5DLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2pDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2pDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2pDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2pDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBRWpDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN0QixFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdEIsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN0QixFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFdEIsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDZCxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEIsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbEQsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN0QixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdEIsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBRXRCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEIsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN0QixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdEIsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUV0QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdkIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdkIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN0QixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdEIsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN0QixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFFdEIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdEIsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN0QixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdEIsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBRXRCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdkIsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN0QixHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdEIsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNmLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDZixLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2YsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNmLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDZixLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2YsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNmLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDZixLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2YsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNmLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDaEIsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNoQixLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2hCLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDaEIsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNoQixLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2hCLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDaEIsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNoQixLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2hCLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDaEIsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNoQixLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2hCLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDaEIsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNoQixLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBRWhCLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMsR0FBRyxDQUFDLENBQVMsRUFBRSxDQUFTO0lBQy9CLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkQsQ0FBQztBQUVELE1BQU0sY0FBYyxHQUFhO0lBQy9CLG1CQUFtQjtJQUNuQixtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLG1CQUFtQjtJQUNuQixtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLG1CQUFtQjtJQUNuQixtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLG1CQUFtQjtJQUNuQixtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLG1CQUFtQjtJQUNuQixtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLG1CQUFtQjtJQUNuQixtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLG1CQUFtQjtJQUNuQixtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLG1CQUFtQjtJQUNuQixtQkFBbUI7SUFDbkIsbUJBQW1CO0NBQ3BCLENBQUMifQ==
|
package/dest/fields/point.d.ts
CHANGED
|
@@ -160,4 +160,7 @@ export declare class Point {
|
|
|
160
160
|
* @returns Whether it looks like a point.
|
|
161
161
|
*/
|
|
162
162
|
export declare function isPoint(obj: object): obj is Point;
|
|
163
|
+
export declare class NotOnCurveError extends Error {
|
|
164
|
+
constructor(x: Fr);
|
|
165
|
+
}
|
|
163
166
|
//# sourceMappingURL=point.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"point.d.ts","sourceRoot":"","sources":["../../src/fields/point.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"point.d.ts","sourceRoot":"","sources":["../../src/fields/point.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAqB,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEjC;;;;GAIG;AACH,qBAAa,KAAK;IASd;;OAEG;aACa,CAAC,EAAE,EAAE;IACrB;;OAEG;aACa,CAAC,EAAE,EAAE;IACrB;;OAEG;aACa,UAAU,EAAE,OAAO;IAnBrC,MAAM,CAAC,IAAI,QAAsC;IACjD,MAAM,CAAC,aAAa,SAAwB;IAC5C,MAAM,CAAC,wBAAwB,SAAoB;IAEnD,yDAAyD;IACzD,SAAgB,IAAI,WAAW;;IAG7B;;OAEG;IACa,CAAC,EAAE,EAAE;IACrB;;OAEG;IACa,CAAC,EAAE,EAAE;IACrB;;OAEG;IACa,UAAU,EAAE,OAAO;IAKrC;;;;OAIG;IACH,MAAM,CAAC,MAAM;IAcb;;;;;;OAMG;IACH,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY;IAK/C;;;;;;OAMG;IACH,MAAM,CAAC,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY;IAUzD;;;;;;;OAOG;IACH,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM;IAIjC;;;OAGG;IACH,QAAQ;IAIR,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,WAAW;IAK5C;;;;;;;;OAQG;IACH,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO;IAsBxC;;;;OAIG;IACH,UAAU,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC;IAI3B;;;OAGG;IACH,SAAS;;;;;IAQT;;;;;;;;;OASG;IACH,QAAQ;IAWR;;;OAGG;IACH,kBAAkB;IAalB;;;;;;OAMG;IACH,QAAQ;IAIR;;;;;;;OAOG;IACH,aAAa;IAKb,YAAY;;;;;IAMZ;;;;;;OAMG;IACH,MAAM,CAAC,GAAG,EAAE,KAAK;IAIjB,MAAM;IAIN,IAAI;IAIJ;;;OAGG;IACH,IAAW,GAAG,YAEb;IAED,YAAY;CAYb;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,IAAI,KAAK,CAMjD;AAED,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,CAAC,EAAE,EAAE;CAIlB"}
|
package/dest/fields/point.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { toBigIntBE } from '../bigint-buffer/index.js';
|
|
1
2
|
import { poseidon2Hash, randomBoolean } from '../crypto/index.js';
|
|
2
3
|
import { BufferReader, FieldReader, serializeToBuffer } from '../serialize/index.js';
|
|
3
4
|
import { Fr } from './fields.js';
|
|
@@ -66,7 +67,10 @@ export class Point {
|
|
|
66
67
|
*/
|
|
67
68
|
static fromCompressedBuffer(buffer) {
|
|
68
69
|
const reader = BufferReader.asReader(buffer);
|
|
69
|
-
|
|
70
|
+
const value = toBigIntBE(reader.readBytes(Point.COMPRESSED_SIZE_IN_BYTES));
|
|
71
|
+
const x = new Fr(value & ((1n << 255n) - 1n));
|
|
72
|
+
const sign = (value & (1n << 255n)) !== 0n;
|
|
73
|
+
return this.fromXAndSign(x, sign);
|
|
70
74
|
}
|
|
71
75
|
/**
|
|
72
76
|
* Create a Point instance from a hex-encoded string.
|
|
@@ -106,9 +110,9 @@ export class Point {
|
|
|
106
110
|
const y = ySquared.sqrt();
|
|
107
111
|
// If y is null, the x-coordinate is not on the curve
|
|
108
112
|
if (y === null) {
|
|
109
|
-
throw new NotOnCurveError();
|
|
113
|
+
throw new NotOnCurveError(x);
|
|
110
114
|
}
|
|
111
|
-
const yPositiveBigInt = y.toBigInt()
|
|
115
|
+
const yPositiveBigInt = y.toBigInt() <= (Fr.MODULUS - 1n) / 2n ? y.toBigInt() : Fr.MODULUS - y.toBigInt();
|
|
112
116
|
const yNegativeBigInt = Fr.MODULUS - yPositiveBigInt;
|
|
113
117
|
// Choose the positive or negative root based on isPositive
|
|
114
118
|
const finalY = sign ? new Fr(yPositiveBigInt) : new Fr(yNegativeBigInt);
|
|
@@ -159,7 +163,16 @@ export class Point {
|
|
|
159
163
|
* @returns A Buffer representation of the Point instance
|
|
160
164
|
*/
|
|
161
165
|
toCompressedBuffer() {
|
|
162
|
-
|
|
166
|
+
const [x, sign] = this.toXAndSign();
|
|
167
|
+
// Here we leverage that Fr fits into 254 bits (log2(Fr.MODULUS) < 254) and given that we serialize Fr to 32 bytes
|
|
168
|
+
// and we use big-endian the 2 most significant bits are never populated. Hence we can use one of the bits as
|
|
169
|
+
// a sign bit.
|
|
170
|
+
const compressedValue = x.toBigInt() + (sign ? 2n ** 255n : 0n);
|
|
171
|
+
const buf = serializeToBuffer(compressedValue);
|
|
172
|
+
if (buf.length !== Point.COMPRESSED_SIZE_IN_BYTES) {
|
|
173
|
+
throw new Error(`Invalid buffer length for compressed Point: ${buf.length}`);
|
|
174
|
+
}
|
|
175
|
+
return buf;
|
|
163
176
|
}
|
|
164
177
|
/**
|
|
165
178
|
* Convert the Point instance to a hexadecimal string representation.
|
|
@@ -225,7 +238,7 @@ export class Point {
|
|
|
225
238
|
}
|
|
226
239
|
Point.ZERO = new Point(Fr.ZERO, Fr.ZERO, false);
|
|
227
240
|
Point.SIZE_IN_BYTES = Fr.SIZE_IN_BYTES * 2;
|
|
228
|
-
Point.COMPRESSED_SIZE_IN_BYTES = Fr.SIZE_IN_BYTES
|
|
241
|
+
Point.COMPRESSED_SIZE_IN_BYTES = Fr.SIZE_IN_BYTES;
|
|
229
242
|
/**
|
|
230
243
|
* Does this object look like a point?
|
|
231
244
|
* @param obj - Object to test if it is a point.
|
|
@@ -238,10 +251,10 @@ export function isPoint(obj) {
|
|
|
238
251
|
const point = obj;
|
|
239
252
|
return point.kind === 'point' && point.x !== undefined && point.y !== undefined;
|
|
240
253
|
}
|
|
241
|
-
class NotOnCurveError extends Error {
|
|
242
|
-
constructor() {
|
|
243
|
-
super('The given x-coordinate is not on the Grumpkin curve');
|
|
254
|
+
export class NotOnCurveError extends Error {
|
|
255
|
+
constructor(x) {
|
|
256
|
+
super('The given x-coordinate is not on the Grumpkin curve: ' + x.toString());
|
|
244
257
|
this.name = 'NotOnCurveError';
|
|
245
258
|
}
|
|
246
259
|
}
|
|
247
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
260
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9pbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZmllbGRzL3BvaW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckYsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVqQzs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLEtBQUs7SUFRaEI7SUFDRTs7T0FFRztJQUNhLENBQUs7SUFDckI7O09BRUc7SUFDYSxDQUFLO0lBQ3JCOztPQUVHO0lBQ2EsVUFBbUI7UUFSbkIsTUFBQyxHQUFELENBQUMsQ0FBSTtRQUlMLE1BQUMsR0FBRCxDQUFDLENBQUk7UUFJTCxlQUFVLEdBQVYsVUFBVSxDQUFTO1FBZnJDLHlEQUF5RDtRQUN6QyxTQUFJLEdBQUcsT0FBTyxDQUFDO1FBZ0I3QixpQ0FBaUM7SUFDbkMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsTUFBTTtRQUNYLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDWixJQUFJLENBQUM7Z0JBQ0gsT0FBTyxLQUFLLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO1lBQzFELENBQUM7WUFBQyxPQUFPLENBQU0sRUFBRSxDQUFDO2dCQUNoQixJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksZUFBZSxDQUFDLEVBQUUsQ0FBQztvQkFDcEMsTUFBTSxDQUFDLENBQUM7Z0JBQ1YsQ0FBQztnQkFDRCxzREFBc0Q7Z0JBQ3RELFNBQVM7WUFDWCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFD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
|
package/dest/log/log_fn.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/** Structured log data to include with the message. */
|
|
2
2
|
export type LogData = Record<string, string | number | bigint | boolean | {
|
|
3
3
|
toString(): string;
|
|
4
|
-
}>;
|
|
4
|
+
} | undefined>;
|
|
5
5
|
/** A callable logger instance. */
|
|
6
6
|
export type LogFn = (msg: string, data?: LogData) => void;
|
|
7
7
|
//# sourceMappingURL=log_fn.d.ts.map
|
package/dest/log/log_fn.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log_fn.d.ts","sourceRoot":"","sources":["../../src/log/log_fn.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG;IAAE,QAAQ,IAAI,MAAM,CAAA;CAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"log_fn.d.ts","sourceRoot":"","sources":["../../src/log/log_fn.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG;IAAE,QAAQ,IAAI,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC,CAAC;AAE9G,kCAAkC;AAClC,MAAM,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/foundation",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.47.1",
|
|
4
4
|
"packageManager": "yarn@3.4.1",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dest/index.js",
|
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
]
|
|
89
89
|
},
|
|
90
90
|
"dependencies": {
|
|
91
|
-
"@aztec/bb.js": "0.
|
|
91
|
+
"@aztec/bb.js": "0.47.1",
|
|
92
92
|
"@koa/cors": "^5.0.0",
|
|
93
93
|
"@noble/curves": "^1.2.0",
|
|
94
94
|
"bn.js": "^5.2.1",
|
package/src/collection/object.ts
CHANGED
|
@@ -17,3 +17,14 @@ export function mapValues<K extends string | number | symbol, T, U>(
|
|
|
17
17
|
}
|
|
18
18
|
return result;
|
|
19
19
|
}
|
|
20
|
+
|
|
21
|
+
/** Returns a new object where all keys with undefined values have been removed. */
|
|
22
|
+
export function compact<T extends object>(obj: T): { [P in keyof T]+?: Exclude<T[P], undefined> } {
|
|
23
|
+
const result: any = {};
|
|
24
|
+
for (const key in obj) {
|
|
25
|
+
if (obj[key] !== undefined) {
|
|
26
|
+
result[key] = obj[key];
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
@@ -31,3 +31,248 @@ export function keccak224(input: Buffer) {
|
|
|
31
31
|
const hash = new Keccak(224);
|
|
32
32
|
return hash.update(input).digest();
|
|
33
33
|
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Computes the Keccak-f1600 permutation of the input.
|
|
37
|
+
* @param state 25 64-bit words.
|
|
38
|
+
* @returns The permuted state.
|
|
39
|
+
*/
|
|
40
|
+
export function keccakf1600(state: bigint[]): bigint[] {
|
|
41
|
+
// Ideally we'd assert the size of the state and its constituent elements here.
|
|
42
|
+
// But since this gets included in the browser bundle, we can't use Node's assert module.
|
|
43
|
+
/* The implementation based on the "simple" implementation by Ronny Van Keer. */
|
|
44
|
+
/* Adapted from Barretenberg's CPP implementation. */
|
|
45
|
+
let Eba, Ebe, Ebi, Ebo, Ebu;
|
|
46
|
+
let Ega, Ege, Egi, Ego, Egu;
|
|
47
|
+
let Eka, Eke, Eki, Eko, Eku;
|
|
48
|
+
let Ema, Eme, Emi, Emo, Emu;
|
|
49
|
+
let Esa, Ese, Esi, Eso, Esu;
|
|
50
|
+
|
|
51
|
+
let Ba, Be, Bi, Bo, Bu;
|
|
52
|
+
|
|
53
|
+
let Da, De, Di, Do, Du;
|
|
54
|
+
|
|
55
|
+
let Aba = state[0];
|
|
56
|
+
let Abe = state[1];
|
|
57
|
+
let Abi = state[2];
|
|
58
|
+
let Abo = state[3];
|
|
59
|
+
let Abu = state[4];
|
|
60
|
+
let Aga = state[5];
|
|
61
|
+
let Age = state[6];
|
|
62
|
+
let Agi = state[7];
|
|
63
|
+
let Ago = state[8];
|
|
64
|
+
let Agu = state[9];
|
|
65
|
+
let Aka = state[10];
|
|
66
|
+
let Ake = state[11];
|
|
67
|
+
let Aki = state[12];
|
|
68
|
+
let Ako = state[13];
|
|
69
|
+
let Aku = state[14];
|
|
70
|
+
let Ama = state[15];
|
|
71
|
+
let Ame = state[16];
|
|
72
|
+
let Ami = state[17];
|
|
73
|
+
let Amo = state[18];
|
|
74
|
+
let Amu = state[19];
|
|
75
|
+
let Asa = state[20];
|
|
76
|
+
let Ase = state[21];
|
|
77
|
+
let Asi = state[22];
|
|
78
|
+
let Aso = state[23];
|
|
79
|
+
let Asu = state[24];
|
|
80
|
+
|
|
81
|
+
for (let round = 0; round < 24; round += 2) {
|
|
82
|
+
/* Round (round + 0): Axx -> Exx */
|
|
83
|
+
Ba = Aba ^ Aga ^ Aka ^ Ama ^ Asa;
|
|
84
|
+
Be = Abe ^ Age ^ Ake ^ Ame ^ Ase;
|
|
85
|
+
Bi = Abi ^ Agi ^ Aki ^ Ami ^ Asi;
|
|
86
|
+
Bo = Abo ^ Ago ^ Ako ^ Amo ^ Aso;
|
|
87
|
+
Bu = Abu ^ Agu ^ Aku ^ Amu ^ Asu;
|
|
88
|
+
|
|
89
|
+
Da = Bu ^ rol(Be, 1n);
|
|
90
|
+
De = Ba ^ rol(Bi, 1n);
|
|
91
|
+
Di = Be ^ rol(Bo, 1n);
|
|
92
|
+
Do = Bi ^ rol(Bu, 1n);
|
|
93
|
+
Du = Bo ^ rol(Ba, 1n);
|
|
94
|
+
|
|
95
|
+
Ba = Aba ^ Da;
|
|
96
|
+
Be = rol(Age ^ De, 44n);
|
|
97
|
+
Bi = rol(Aki ^ Di, 43n);
|
|
98
|
+
Bo = rol(Amo ^ Do, 21n);
|
|
99
|
+
Bu = rol(Asu ^ Du, 14n);
|
|
100
|
+
Eba = Ba ^ (~Be & Bi) ^ roundConstants[round];
|
|
101
|
+
Ebe = Be ^ (~Bi & Bo);
|
|
102
|
+
Ebi = Bi ^ (~Bo & Bu);
|
|
103
|
+
Ebo = Bo ^ (~Bu & Ba);
|
|
104
|
+
Ebu = Bu ^ (~Ba & Be);
|
|
105
|
+
|
|
106
|
+
Ba = rol(Abo ^ Do, 28n);
|
|
107
|
+
Be = rol(Agu ^ Du, 20n);
|
|
108
|
+
Bi = rol(Aka ^ Da, 3n);
|
|
109
|
+
Bo = rol(Ame ^ De, 45n);
|
|
110
|
+
Bu = rol(Asi ^ Di, 61n);
|
|
111
|
+
Ega = Ba ^ (~Be & Bi);
|
|
112
|
+
Ege = Be ^ (~Bi & Bo);
|
|
113
|
+
Egi = Bi ^ (~Bo & Bu);
|
|
114
|
+
Ego = Bo ^ (~Bu & Ba);
|
|
115
|
+
Egu = Bu ^ (~Ba & Be);
|
|
116
|
+
|
|
117
|
+
Ba = rol(Abe ^ De, 1n);
|
|
118
|
+
Be = rol(Agi ^ Di, 6n);
|
|
119
|
+
Bi = rol(Ako ^ Do, 25n);
|
|
120
|
+
Bo = rol(Amu ^ Du, 8n);
|
|
121
|
+
Bu = rol(Asa ^ Da, 18n);
|
|
122
|
+
Eka = Ba ^ (~Be & Bi);
|
|
123
|
+
Eke = Be ^ (~Bi & Bo);
|
|
124
|
+
Eki = Bi ^ (~Bo & Bu);
|
|
125
|
+
Eko = Bo ^ (~Bu & Ba);
|
|
126
|
+
Eku = Bu ^ (~Ba & Be);
|
|
127
|
+
|
|
128
|
+
Ba = rol(Abu ^ Du, 27n);
|
|
129
|
+
Be = rol(Aga ^ Da, 36n);
|
|
130
|
+
Bi = rol(Ake ^ De, 10n);
|
|
131
|
+
Bo = rol(Ami ^ Di, 15n);
|
|
132
|
+
Bu = rol(Aso ^ Do, 56n);
|
|
133
|
+
Ema = Ba ^ (~Be & Bi);
|
|
134
|
+
Eme = Be ^ (~Bi & Bo);
|
|
135
|
+
Emi = Bi ^ (~Bo & Bu);
|
|
136
|
+
Emo = Bo ^ (~Bu & Ba);
|
|
137
|
+
Emu = Bu ^ (~Ba & Be);
|
|
138
|
+
|
|
139
|
+
Ba = rol(Abi ^ Di, 62n);
|
|
140
|
+
Be = rol(Ago ^ Do, 55n);
|
|
141
|
+
Bi = rol(Aku ^ Du, 39n);
|
|
142
|
+
Bo = rol(Ama ^ Da, 41n);
|
|
143
|
+
Bu = rol(Ase ^ De, 2n);
|
|
144
|
+
Esa = Ba ^ (~Be & Bi);
|
|
145
|
+
Ese = Be ^ (~Bi & Bo);
|
|
146
|
+
Esi = Bi ^ (~Bo & Bu);
|
|
147
|
+
Eso = Bo ^ (~Bu & Ba);
|
|
148
|
+
Esu = Bu ^ (~Ba & Be);
|
|
149
|
+
|
|
150
|
+
/* Round (round + 1): Exx -> Axx */
|
|
151
|
+
|
|
152
|
+
Ba = Eba ^ Ega ^ Eka ^ Ema ^ Esa;
|
|
153
|
+
Be = Ebe ^ Ege ^ Eke ^ Eme ^ Ese;
|
|
154
|
+
Bi = Ebi ^ Egi ^ Eki ^ Emi ^ Esi;
|
|
155
|
+
Bo = Ebo ^ Ego ^ Eko ^ Emo ^ Eso;
|
|
156
|
+
Bu = Ebu ^ Egu ^ Eku ^ Emu ^ Esu;
|
|
157
|
+
|
|
158
|
+
Da = Bu ^ rol(Be, 1n);
|
|
159
|
+
De = Ba ^ rol(Bi, 1n);
|
|
160
|
+
Di = Be ^ rol(Bo, 1n);
|
|
161
|
+
Do = Bi ^ rol(Bu, 1n);
|
|
162
|
+
Du = Bo ^ rol(Ba, 1n);
|
|
163
|
+
|
|
164
|
+
Ba = Eba ^ Da;
|
|
165
|
+
Be = rol(Ege ^ De, 44n);
|
|
166
|
+
Bi = rol(Eki ^ Di, 43n);
|
|
167
|
+
Bo = rol(Emo ^ Do, 21n);
|
|
168
|
+
Bu = rol(Esu ^ Du, 14n);
|
|
169
|
+
Aba = Ba ^ (~Be & Bi) ^ roundConstants[round + 1];
|
|
170
|
+
Abe = Be ^ (~Bi & Bo);
|
|
171
|
+
Abi = Bi ^ (~Bo & Bu);
|
|
172
|
+
Abo = Bo ^ (~Bu & Ba);
|
|
173
|
+
Abu = Bu ^ (~Ba & Be);
|
|
174
|
+
|
|
175
|
+
Ba = rol(Ebo ^ Do, 28n);
|
|
176
|
+
Be = rol(Egu ^ Du, 20n);
|
|
177
|
+
Bi = rol(Eka ^ Da, 3n);
|
|
178
|
+
Bo = rol(Eme ^ De, 45n);
|
|
179
|
+
Bu = rol(Esi ^ Di, 61n);
|
|
180
|
+
Aga = Ba ^ (~Be & Bi);
|
|
181
|
+
Age = Be ^ (~Bi & Bo);
|
|
182
|
+
Agi = Bi ^ (~Bo & Bu);
|
|
183
|
+
Ago = Bo ^ (~Bu & Ba);
|
|
184
|
+
Agu = Bu ^ (~Ba & Be);
|
|
185
|
+
|
|
186
|
+
Ba = rol(Ebe ^ De, 1n);
|
|
187
|
+
Be = rol(Egi ^ Di, 6n);
|
|
188
|
+
Bi = rol(Eko ^ Do, 25n);
|
|
189
|
+
Bo = rol(Emu ^ Du, 8n);
|
|
190
|
+
Bu = rol(Esa ^ Da, 18n);
|
|
191
|
+
Aka = Ba ^ (~Be & Bi);
|
|
192
|
+
Ake = Be ^ (~Bi & Bo);
|
|
193
|
+
Aki = Bi ^ (~Bo & Bu);
|
|
194
|
+
Ako = Bo ^ (~Bu & Ba);
|
|
195
|
+
Aku = Bu ^ (~Ba & Be);
|
|
196
|
+
|
|
197
|
+
Ba = rol(Ebu ^ Du, 27n);
|
|
198
|
+
Be = rol(Ega ^ Da, 36n);
|
|
199
|
+
Bi = rol(Eke ^ De, 10n);
|
|
200
|
+
Bo = rol(Emi ^ Di, 15n);
|
|
201
|
+
Bu = rol(Eso ^ Do, 56n);
|
|
202
|
+
Ama = Ba ^ (~Be & Bi);
|
|
203
|
+
Ame = Be ^ (~Bi & Bo);
|
|
204
|
+
Ami = Bi ^ (~Bo & Bu);
|
|
205
|
+
Amo = Bo ^ (~Bu & Ba);
|
|
206
|
+
Amu = Bu ^ (~Ba & Be);
|
|
207
|
+
|
|
208
|
+
Ba = rol(Ebi ^ Di, 62n);
|
|
209
|
+
Be = rol(Ego ^ Do, 55n);
|
|
210
|
+
Bi = rol(Eku ^ Du, 39n);
|
|
211
|
+
Bo = rol(Ema ^ Da, 41n);
|
|
212
|
+
Bu = rol(Ese ^ De, 2n);
|
|
213
|
+
Asa = Ba ^ (~Be & Bi);
|
|
214
|
+
Ase = Be ^ (~Bi & Bo);
|
|
215
|
+
Asi = Bi ^ (~Bo & Bu);
|
|
216
|
+
Aso = Bo ^ (~Bu & Ba);
|
|
217
|
+
Asu = Bu ^ (~Ba & Be);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
state[0] = Aba;
|
|
221
|
+
state[1] = Abe;
|
|
222
|
+
state[2] = Abi;
|
|
223
|
+
state[3] = Abo;
|
|
224
|
+
state[4] = Abu;
|
|
225
|
+
state[5] = Aga;
|
|
226
|
+
state[6] = Age;
|
|
227
|
+
state[7] = Agi;
|
|
228
|
+
state[8] = Ago;
|
|
229
|
+
state[9] = Agu;
|
|
230
|
+
state[10] = Aka;
|
|
231
|
+
state[11] = Ake;
|
|
232
|
+
state[12] = Aki;
|
|
233
|
+
state[13] = Ako;
|
|
234
|
+
state[14] = Aku;
|
|
235
|
+
state[15] = Ama;
|
|
236
|
+
state[16] = Ame;
|
|
237
|
+
state[17] = Ami;
|
|
238
|
+
state[18] = Amo;
|
|
239
|
+
state[19] = Amu;
|
|
240
|
+
state[20] = Asa;
|
|
241
|
+
state[21] = Ase;
|
|
242
|
+
state[22] = Asi;
|
|
243
|
+
state[23] = Aso;
|
|
244
|
+
state[24] = Asu;
|
|
245
|
+
|
|
246
|
+
return state;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
function rol(x: bigint, s: bigint) {
|
|
250
|
+
return BigInt.asUintN(64, x << s) | (x >> (64n - s));
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
const roundConstants: bigint[] = [
|
|
254
|
+
0x0000000000000001n,
|
|
255
|
+
0x0000000000008082n,
|
|
256
|
+
0x800000000000808an,
|
|
257
|
+
0x8000000080008000n,
|
|
258
|
+
0x000000000000808bn,
|
|
259
|
+
0x0000000080000001n,
|
|
260
|
+
0x8000000080008081n,
|
|
261
|
+
0x8000000000008009n,
|
|
262
|
+
0x000000000000008an,
|
|
263
|
+
0x0000000000000088n,
|
|
264
|
+
0x0000000080008009n,
|
|
265
|
+
0x000000008000000an,
|
|
266
|
+
0x000000008000808bn,
|
|
267
|
+
0x800000000000008bn,
|
|
268
|
+
0x8000000000008089n,
|
|
269
|
+
0x8000000000008003n,
|
|
270
|
+
0x8000000000008002n,
|
|
271
|
+
0x8000000000000080n,
|
|
272
|
+
0x000000000000800an,
|
|
273
|
+
0x800000008000000an,
|
|
274
|
+
0x8000000080008081n,
|
|
275
|
+
0x8000000000008080n,
|
|
276
|
+
0x0000000080000001n,
|
|
277
|
+
0x8000000080008008n,
|
|
278
|
+
];
|
package/src/fields/point.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { toBigIntBE } from '../bigint-buffer/index.js';
|
|
1
2
|
import { poseidon2Hash, randomBoolean } from '../crypto/index.js';
|
|
2
3
|
import { BufferReader, FieldReader, serializeToBuffer } from '../serialize/index.js';
|
|
3
4
|
import { Fr } from './fields.js';
|
|
@@ -10,7 +11,7 @@ import { Fr } from './fields.js';
|
|
|
10
11
|
export class Point {
|
|
11
12
|
static ZERO = new Point(Fr.ZERO, Fr.ZERO, false);
|
|
12
13
|
static SIZE_IN_BYTES = Fr.SIZE_IN_BYTES * 2;
|
|
13
|
-
static COMPRESSED_SIZE_IN_BYTES = Fr.SIZE_IN_BYTES
|
|
14
|
+
static COMPRESSED_SIZE_IN_BYTES = Fr.SIZE_IN_BYTES;
|
|
14
15
|
|
|
15
16
|
/** Used to differentiate this class from AztecAddress */
|
|
16
17
|
public readonly kind = 'point';
|
|
@@ -72,7 +73,12 @@ export class Point {
|
|
|
72
73
|
*/
|
|
73
74
|
static fromCompressedBuffer(buffer: Buffer | BufferReader) {
|
|
74
75
|
const reader = BufferReader.asReader(buffer);
|
|
75
|
-
|
|
76
|
+
const value = toBigIntBE(reader.readBytes(Point.COMPRESSED_SIZE_IN_BYTES));
|
|
77
|
+
|
|
78
|
+
const x = new Fr(value & ((1n << 255n) - 1n));
|
|
79
|
+
const sign = (value & (1n << 255n)) !== 0n;
|
|
80
|
+
|
|
81
|
+
return this.fromXAndSign(x, sign);
|
|
76
82
|
}
|
|
77
83
|
|
|
78
84
|
/**
|
|
@@ -118,10 +124,10 @@ export class Point {
|
|
|
118
124
|
|
|
119
125
|
// If y is null, the x-coordinate is not on the curve
|
|
120
126
|
if (y === null) {
|
|
121
|
-
throw new NotOnCurveError();
|
|
127
|
+
throw new NotOnCurveError(x);
|
|
122
128
|
}
|
|
123
129
|
|
|
124
|
-
const yPositiveBigInt = y.toBigInt()
|
|
130
|
+
const yPositiveBigInt = y.toBigInt() <= (Fr.MODULUS - 1n) / 2n ? y.toBigInt() : Fr.MODULUS - y.toBigInt();
|
|
125
131
|
const yNegativeBigInt = Fr.MODULUS - yPositiveBigInt;
|
|
126
132
|
|
|
127
133
|
// Choose the positive or negative root based on isPositive
|
|
@@ -178,7 +184,16 @@ export class Point {
|
|
|
178
184
|
* @returns A Buffer representation of the Point instance
|
|
179
185
|
*/
|
|
180
186
|
toCompressedBuffer() {
|
|
181
|
-
|
|
187
|
+
const [x, sign] = this.toXAndSign();
|
|
188
|
+
// Here we leverage that Fr fits into 254 bits (log2(Fr.MODULUS) < 254) and given that we serialize Fr to 32 bytes
|
|
189
|
+
// and we use big-endian the 2 most significant bits are never populated. Hence we can use one of the bits as
|
|
190
|
+
// a sign bit.
|
|
191
|
+
const compressedValue = x.toBigInt() + (sign ? 2n ** 255n : 0n);
|
|
192
|
+
const buf = serializeToBuffer(compressedValue);
|
|
193
|
+
if (buf.length !== Point.COMPRESSED_SIZE_IN_BYTES) {
|
|
194
|
+
throw new Error(`Invalid buffer length for compressed Point: ${buf.length}`);
|
|
195
|
+
}
|
|
196
|
+
return buf;
|
|
182
197
|
}
|
|
183
198
|
|
|
184
199
|
/**
|
|
@@ -265,9 +280,9 @@ export function isPoint(obj: object): obj is Point {
|
|
|
265
280
|
return point.kind === 'point' && point.x !== undefined && point.y !== undefined;
|
|
266
281
|
}
|
|
267
282
|
|
|
268
|
-
class NotOnCurveError extends Error {
|
|
269
|
-
constructor() {
|
|
270
|
-
super('The given x-coordinate is not on the Grumpkin curve');
|
|
283
|
+
export class NotOnCurveError extends Error {
|
|
284
|
+
constructor(x: Fr) {
|
|
285
|
+
super('The given x-coordinate is not on the Grumpkin curve: ' + x.toString());
|
|
271
286
|
this.name = 'NotOnCurveError';
|
|
272
287
|
}
|
|
273
288
|
}
|
package/src/log/log_fn.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** Structured log data to include with the message. */
|
|
2
|
-
export type LogData = Record<string, string | number | bigint | boolean | { toString(): string }>;
|
|
2
|
+
export type LogData = Record<string, string | number | bigint | boolean | { toString(): string } | undefined>;
|
|
3
3
|
|
|
4
4
|
/** A callable logger instance. */
|
|
5
5
|
export type LogFn = (msg: string, data?: LogData) => void;
|