@aztec/accounts 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/README.md +38 -0
  2. package/dest/artifacts/EcdsaAccount.json +1090 -0
  3. package/dest/artifacts/SchnorrAccount.json +1078 -0
  4. package/dest/artifacts/SchnorrSingleKeyAccount.json +951 -0
  5. package/dest/defaults/account_contract.d.ts +16 -0
  6. package/dest/defaults/account_contract.d.ts.map +1 -0
  7. package/dest/defaults/account_contract.js +17 -0
  8. package/dest/defaults/account_entrypoint.d.ts +17 -0
  9. package/dest/defaults/account_entrypoint.d.ts.map +1 -0
  10. package/dest/defaults/account_entrypoint.js +117 -0
  11. package/dest/defaults/account_interface.d.ts +17 -0
  12. package/dest/defaults/account_interface.d.ts.map +1 -0
  13. package/dest/defaults/account_interface.js +22 -0
  14. package/dest/defaults/constants.d.ts +5 -0
  15. package/dest/defaults/constants.d.ts.map +1 -0
  16. package/dest/defaults/constants.js +5 -0
  17. package/dest/defaults/entrypoint_payload.d.ts +32 -0
  18. package/dest/defaults/entrypoint_payload.d.ts.map +1 -0
  19. package/dest/defaults/entrypoint_payload.js +50 -0
  20. package/dest/defaults/index.d.ts +13 -0
  21. package/dest/defaults/index.d.ts.map +1 -0
  22. package/dest/defaults/index.js +13 -0
  23. package/dest/ecdsa/account_contract.d.ts +15 -0
  24. package/dest/ecdsa/account_contract.d.ts.map +1 -0
  25. package/dest/ecdsa/account_contract.js +33 -0
  26. package/dest/ecdsa/artifact.d.ts +3 -0
  27. package/dest/ecdsa/artifact.d.ts.map +1 -0
  28. package/dest/ecdsa/artifact.js +3 -0
  29. package/dest/ecdsa/index.d.ts +31 -0
  30. package/dest/ecdsa/index.d.ts.map +1 -0
  31. package/dest/ecdsa/index.js +32 -0
  32. package/dest/schnorr/account_contract.d.ts +15 -0
  33. package/dest/schnorr/account_contract.d.ts.map +1 -0
  34. package/dest/schnorr/account_contract.js +33 -0
  35. package/dest/schnorr/artifact.d.ts +3 -0
  36. package/dest/schnorr/artifact.d.ts.map +1 -0
  37. package/dest/schnorr/artifact.js +3 -0
  38. package/dest/schnorr/index.d.ts +30 -0
  39. package/dest/schnorr/index.d.ts.map +1 -0
  40. package/dest/schnorr/index.js +32 -0
  41. package/dest/single_key/account_contract.d.ts +14 -0
  42. package/dest/single_key/account_contract.d.ts.map +1 -0
  43. package/dest/single_key/account_contract.js +40 -0
  44. package/dest/single_key/artifact.d.ts +3 -0
  45. package/dest/single_key/artifact.d.ts.map +1 -0
  46. package/dest/single_key/artifact.js +3 -0
  47. package/dest/single_key/index.d.ts +31 -0
  48. package/dest/single_key/index.d.ts.map +1 -0
  49. package/dest/single_key/index.js +33 -0
  50. package/dest/testing/create_account.d.ts +16 -0
  51. package/dest/testing/create_account.d.ts.map +1 -0
  52. package/dest/testing/create_account.js +30 -0
  53. package/dest/testing/index.d.ts +11 -0
  54. package/dest/testing/index.d.ts.map +1 -0
  55. package/dest/testing/index.js +11 -0
  56. package/dest/testing/sandbox.d.ts +22 -0
  57. package/dest/testing/sandbox.d.ts.map +1 -0
  58. package/dest/testing/sandbox.js +48 -0
  59. package/package.json +74 -0
@@ -0,0 +1,1078 @@
1
+ {
2
+ "name": "SchnorrAccount",
3
+ "functions": [
4
+ {
5
+ "name": "compute_note_hash_and_nullifier",
6
+ "functionType": "unconstrained",
7
+ "isInternal": false,
8
+ "parameters": [
9
+ {
10
+ "name": "contract_address",
11
+ "type": {
12
+ "kind": "struct",
13
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
14
+ "fields": [
15
+ {
16
+ "name": "inner",
17
+ "type": {
18
+ "kind": "field"
19
+ }
20
+ }
21
+ ]
22
+ },
23
+ "visibility": "private"
24
+ },
25
+ {
26
+ "name": "nonce",
27
+ "type": {
28
+ "kind": "field"
29
+ },
30
+ "visibility": "private"
31
+ },
32
+ {
33
+ "name": "storage_slot",
34
+ "type": {
35
+ "kind": "field"
36
+ },
37
+ "visibility": "private"
38
+ },
39
+ {
40
+ "name": "serialized_note",
41
+ "type": {
42
+ "kind": "array",
43
+ "length": 3,
44
+ "type": {
45
+ "kind": "field"
46
+ }
47
+ },
48
+ "visibility": "private"
49
+ }
50
+ ],
51
+ "returnTypes": [
52
+ {
53
+ "kind": "array",
54
+ "length": 4,
55
+ "type": {
56
+ "kind": "field"
57
+ }
58
+ }
59
+ ],
60
+ "bytecode": "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",
61
+ "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f"
62
+ },
63
+ {
64
+ "name": "constructor",
65
+ "functionType": "secret",
66
+ "isInternal": false,
67
+ "parameters": [
68
+ {
69
+ "name": "signing_pub_key_x",
70
+ "type": {
71
+ "kind": "field"
72
+ },
73
+ "visibility": "public"
74
+ },
75
+ {
76
+ "name": "signing_pub_key_y",
77
+ "type": {
78
+ "kind": "field"
79
+ },
80
+ "visibility": "public"
81
+ }
82
+ ],
83
+ "returnTypes": [],
84
+ "bytecode": "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",
85
+ "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f"
86
+ },
87
+ {
88
+ "name": "entrypoint",
89
+ "functionType": "secret",
90
+ "isInternal": false,
91
+ "parameters": [
92
+ {
93
+ "name": "payload",
94
+ "type": {
95
+ "kind": "struct",
96
+ "path": "authwit::entrypoint::EntrypointPayload",
97
+ "fields": [
98
+ {
99
+ "name": "function_calls",
100
+ "type": {
101
+ "kind": "array",
102
+ "length": 4,
103
+ "type": {
104
+ "kind": "struct",
105
+ "path": "authwit::entrypoint::FunctionCall",
106
+ "fields": [
107
+ {
108
+ "name": "args_hash",
109
+ "type": {
110
+ "kind": "field"
111
+ }
112
+ },
113
+ {
114
+ "name": "function_selector",
115
+ "type": {
116
+ "kind": "struct",
117
+ "path": "authwit::aztec::protocol_types::abis::function_selector::FunctionSelector",
118
+ "fields": [
119
+ {
120
+ "name": "inner",
121
+ "type": {
122
+ "kind": "integer",
123
+ "sign": "unsigned",
124
+ "width": 32
125
+ }
126
+ }
127
+ ]
128
+ }
129
+ },
130
+ {
131
+ "name": "target_address",
132
+ "type": {
133
+ "kind": "struct",
134
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
135
+ "fields": [
136
+ {
137
+ "name": "inner",
138
+ "type": {
139
+ "kind": "field"
140
+ }
141
+ }
142
+ ]
143
+ }
144
+ },
145
+ {
146
+ "name": "is_public",
147
+ "type": {
148
+ "kind": "boolean"
149
+ }
150
+ }
151
+ ]
152
+ }
153
+ }
154
+ },
155
+ {
156
+ "name": "nonce",
157
+ "type": {
158
+ "kind": "field"
159
+ }
160
+ }
161
+ ]
162
+ },
163
+ "visibility": "public"
164
+ }
165
+ ],
166
+ "returnTypes": [],
167
+ "bytecode": "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",
168
+ "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f"
169
+ },
170
+ {
171
+ "name": "is_valid",
172
+ "functionType": "secret",
173
+ "isInternal": false,
174
+ "parameters": [
175
+ {
176
+ "name": "message_hash",
177
+ "type": {
178
+ "kind": "field"
179
+ },
180
+ "visibility": "private"
181
+ }
182
+ ],
183
+ "returnTypes": [],
184
+ "bytecode": "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",
185
+ "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f"
186
+ },
187
+ {
188
+ "name": "is_valid_public",
189
+ "functionType": "open",
190
+ "isInternal": false,
191
+ "parameters": [
192
+ {
193
+ "name": "message_hash",
194
+ "type": {
195
+ "kind": "field"
196
+ },
197
+ "visibility": "private"
198
+ }
199
+ ],
200
+ "returnTypes": [
201
+ {
202
+ "kind": "struct",
203
+ "path": "authwit::aztec::protocol_types::abis::public_circuit_public_inputs::PublicCircuitPublicInputs",
204
+ "fields": [
205
+ {
206
+ "name": "call_context",
207
+ "type": {
208
+ "kind": "struct",
209
+ "path": "authwit::aztec::protocol_types::abis::call_context::CallContext",
210
+ "fields": [
211
+ {
212
+ "name": "msg_sender",
213
+ "type": {
214
+ "kind": "struct",
215
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
216
+ "fields": [
217
+ {
218
+ "name": "inner",
219
+ "type": {
220
+ "kind": "field"
221
+ }
222
+ }
223
+ ]
224
+ }
225
+ },
226
+ {
227
+ "name": "storage_contract_address",
228
+ "type": {
229
+ "kind": "struct",
230
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
231
+ "fields": [
232
+ {
233
+ "name": "inner",
234
+ "type": {
235
+ "kind": "field"
236
+ }
237
+ }
238
+ ]
239
+ }
240
+ },
241
+ {
242
+ "name": "portal_contract_address",
243
+ "type": {
244
+ "kind": "struct",
245
+ "path": "authwit::aztec::protocol_types::address::EthAddress",
246
+ "fields": [
247
+ {
248
+ "name": "inner",
249
+ "type": {
250
+ "kind": "field"
251
+ }
252
+ }
253
+ ]
254
+ }
255
+ },
256
+ {
257
+ "name": "function_selector",
258
+ "type": {
259
+ "kind": "struct",
260
+ "path": "authwit::aztec::protocol_types::abis::function_selector::FunctionSelector",
261
+ "fields": [
262
+ {
263
+ "name": "inner",
264
+ "type": {
265
+ "kind": "integer",
266
+ "sign": "unsigned",
267
+ "width": 32
268
+ }
269
+ }
270
+ ]
271
+ }
272
+ },
273
+ {
274
+ "name": "is_delegate_call",
275
+ "type": {
276
+ "kind": "boolean"
277
+ }
278
+ },
279
+ {
280
+ "name": "is_static_call",
281
+ "type": {
282
+ "kind": "boolean"
283
+ }
284
+ },
285
+ {
286
+ "name": "is_contract_deployment",
287
+ "type": {
288
+ "kind": "boolean"
289
+ }
290
+ },
291
+ {
292
+ "name": "start_side_effect_counter",
293
+ "type": {
294
+ "kind": "field"
295
+ }
296
+ }
297
+ ]
298
+ }
299
+ },
300
+ {
301
+ "name": "args_hash",
302
+ "type": {
303
+ "kind": "field"
304
+ }
305
+ },
306
+ {
307
+ "name": "return_values",
308
+ "type": {
309
+ "kind": "array",
310
+ "length": 4,
311
+ "type": {
312
+ "kind": "field"
313
+ }
314
+ }
315
+ },
316
+ {
317
+ "name": "contract_storage_update_requests",
318
+ "type": {
319
+ "kind": "array",
320
+ "length": 16,
321
+ "type": {
322
+ "kind": "struct",
323
+ "path": "authwit::aztec::protocol_types::contrakt::storage_update_request::StorageUpdateRequest",
324
+ "fields": [
325
+ {
326
+ "name": "storage_slot",
327
+ "type": {
328
+ "kind": "field"
329
+ }
330
+ },
331
+ {
332
+ "name": "old_value",
333
+ "type": {
334
+ "kind": "field"
335
+ }
336
+ },
337
+ {
338
+ "name": "new_value",
339
+ "type": {
340
+ "kind": "field"
341
+ }
342
+ }
343
+ ]
344
+ }
345
+ }
346
+ },
347
+ {
348
+ "name": "contract_storage_reads",
349
+ "type": {
350
+ "kind": "array",
351
+ "length": 16,
352
+ "type": {
353
+ "kind": "struct",
354
+ "path": "authwit::aztec::protocol_types::contrakt::storage_read::StorageRead",
355
+ "fields": [
356
+ {
357
+ "name": "storage_slot",
358
+ "type": {
359
+ "kind": "field"
360
+ }
361
+ },
362
+ {
363
+ "name": "current_value",
364
+ "type": {
365
+ "kind": "field"
366
+ }
367
+ }
368
+ ]
369
+ }
370
+ }
371
+ },
372
+ {
373
+ "name": "public_call_stack_hashes",
374
+ "type": {
375
+ "kind": "array",
376
+ "length": 4,
377
+ "type": {
378
+ "kind": "field"
379
+ }
380
+ }
381
+ },
382
+ {
383
+ "name": "new_commitments",
384
+ "type": {
385
+ "kind": "array",
386
+ "length": 16,
387
+ "type": {
388
+ "kind": "struct",
389
+ "path": "authwit::aztec::protocol_types::abis::side_effect::SideEffect",
390
+ "fields": [
391
+ {
392
+ "name": "value",
393
+ "type": {
394
+ "kind": "field"
395
+ }
396
+ },
397
+ {
398
+ "name": "counter",
399
+ "type": {
400
+ "kind": "field"
401
+ }
402
+ }
403
+ ]
404
+ }
405
+ }
406
+ },
407
+ {
408
+ "name": "new_nullifiers",
409
+ "type": {
410
+ "kind": "array",
411
+ "length": 16,
412
+ "type": {
413
+ "kind": "struct",
414
+ "path": "authwit::aztec::protocol_types::abis::side_effect::SideEffectLinkedToNoteHash",
415
+ "fields": [
416
+ {
417
+ "name": "value",
418
+ "type": {
419
+ "kind": "field"
420
+ }
421
+ },
422
+ {
423
+ "name": "note_hash",
424
+ "type": {
425
+ "kind": "field"
426
+ }
427
+ },
428
+ {
429
+ "name": "counter",
430
+ "type": {
431
+ "kind": "field"
432
+ }
433
+ }
434
+ ]
435
+ }
436
+ }
437
+ },
438
+ {
439
+ "name": "new_l2_to_l1_msgs",
440
+ "type": {
441
+ "kind": "array",
442
+ "length": 2,
443
+ "type": {
444
+ "kind": "field"
445
+ }
446
+ }
447
+ },
448
+ {
449
+ "name": "unencrypted_logs_hash",
450
+ "type": {
451
+ "kind": "array",
452
+ "length": 2,
453
+ "type": {
454
+ "kind": "field"
455
+ }
456
+ }
457
+ },
458
+ {
459
+ "name": "unencrypted_log_preimages_length",
460
+ "type": {
461
+ "kind": "field"
462
+ }
463
+ },
464
+ {
465
+ "name": "block_header",
466
+ "type": {
467
+ "kind": "struct",
468
+ "path": "authwit::aztec::protocol_types::abis::block_header::BlockHeader",
469
+ "fields": [
470
+ {
471
+ "name": "note_hash_tree_root",
472
+ "type": {
473
+ "kind": "field"
474
+ }
475
+ },
476
+ {
477
+ "name": "nullifier_tree_root",
478
+ "type": {
479
+ "kind": "field"
480
+ }
481
+ },
482
+ {
483
+ "name": "contract_tree_root",
484
+ "type": {
485
+ "kind": "field"
486
+ }
487
+ },
488
+ {
489
+ "name": "l1_to_l2_message_tree_root",
490
+ "type": {
491
+ "kind": "field"
492
+ }
493
+ },
494
+ {
495
+ "name": "archive_root",
496
+ "type": {
497
+ "kind": "field"
498
+ }
499
+ },
500
+ {
501
+ "name": "public_data_tree_root",
502
+ "type": {
503
+ "kind": "field"
504
+ }
505
+ },
506
+ {
507
+ "name": "global_variables_hash",
508
+ "type": {
509
+ "kind": "field"
510
+ }
511
+ }
512
+ ]
513
+ }
514
+ },
515
+ {
516
+ "name": "prover_address",
517
+ "type": {
518
+ "kind": "struct",
519
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
520
+ "fields": [
521
+ {
522
+ "name": "inner",
523
+ "type": {
524
+ "kind": "field"
525
+ }
526
+ }
527
+ ]
528
+ }
529
+ }
530
+ ]
531
+ }
532
+ ],
533
+ "bytecode": "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",
534
+ "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f"
535
+ },
536
+ {
537
+ "name": "set_is_valid_storage",
538
+ "functionType": "open",
539
+ "isInternal": true,
540
+ "parameters": [
541
+ {
542
+ "name": "message_hash",
543
+ "type": {
544
+ "kind": "field"
545
+ },
546
+ "visibility": "private"
547
+ },
548
+ {
549
+ "name": "value",
550
+ "type": {
551
+ "kind": "boolean"
552
+ },
553
+ "visibility": "private"
554
+ }
555
+ ],
556
+ "returnTypes": [
557
+ {
558
+ "kind": "struct",
559
+ "path": "authwit::aztec::protocol_types::abis::public_circuit_public_inputs::PublicCircuitPublicInputs",
560
+ "fields": [
561
+ {
562
+ "name": "call_context",
563
+ "type": {
564
+ "kind": "struct",
565
+ "path": "authwit::aztec::protocol_types::abis::call_context::CallContext",
566
+ "fields": [
567
+ {
568
+ "name": "msg_sender",
569
+ "type": {
570
+ "kind": "struct",
571
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
572
+ "fields": [
573
+ {
574
+ "name": "inner",
575
+ "type": {
576
+ "kind": "field"
577
+ }
578
+ }
579
+ ]
580
+ }
581
+ },
582
+ {
583
+ "name": "storage_contract_address",
584
+ "type": {
585
+ "kind": "struct",
586
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
587
+ "fields": [
588
+ {
589
+ "name": "inner",
590
+ "type": {
591
+ "kind": "field"
592
+ }
593
+ }
594
+ ]
595
+ }
596
+ },
597
+ {
598
+ "name": "portal_contract_address",
599
+ "type": {
600
+ "kind": "struct",
601
+ "path": "authwit::aztec::protocol_types::address::EthAddress",
602
+ "fields": [
603
+ {
604
+ "name": "inner",
605
+ "type": {
606
+ "kind": "field"
607
+ }
608
+ }
609
+ ]
610
+ }
611
+ },
612
+ {
613
+ "name": "function_selector",
614
+ "type": {
615
+ "kind": "struct",
616
+ "path": "authwit::aztec::protocol_types::abis::function_selector::FunctionSelector",
617
+ "fields": [
618
+ {
619
+ "name": "inner",
620
+ "type": {
621
+ "kind": "integer",
622
+ "sign": "unsigned",
623
+ "width": 32
624
+ }
625
+ }
626
+ ]
627
+ }
628
+ },
629
+ {
630
+ "name": "is_delegate_call",
631
+ "type": {
632
+ "kind": "boolean"
633
+ }
634
+ },
635
+ {
636
+ "name": "is_static_call",
637
+ "type": {
638
+ "kind": "boolean"
639
+ }
640
+ },
641
+ {
642
+ "name": "is_contract_deployment",
643
+ "type": {
644
+ "kind": "boolean"
645
+ }
646
+ },
647
+ {
648
+ "name": "start_side_effect_counter",
649
+ "type": {
650
+ "kind": "field"
651
+ }
652
+ }
653
+ ]
654
+ }
655
+ },
656
+ {
657
+ "name": "args_hash",
658
+ "type": {
659
+ "kind": "field"
660
+ }
661
+ },
662
+ {
663
+ "name": "return_values",
664
+ "type": {
665
+ "kind": "array",
666
+ "length": 4,
667
+ "type": {
668
+ "kind": "field"
669
+ }
670
+ }
671
+ },
672
+ {
673
+ "name": "contract_storage_update_requests",
674
+ "type": {
675
+ "kind": "array",
676
+ "length": 16,
677
+ "type": {
678
+ "kind": "struct",
679
+ "path": "authwit::aztec::protocol_types::contrakt::storage_update_request::StorageUpdateRequest",
680
+ "fields": [
681
+ {
682
+ "name": "storage_slot",
683
+ "type": {
684
+ "kind": "field"
685
+ }
686
+ },
687
+ {
688
+ "name": "old_value",
689
+ "type": {
690
+ "kind": "field"
691
+ }
692
+ },
693
+ {
694
+ "name": "new_value",
695
+ "type": {
696
+ "kind": "field"
697
+ }
698
+ }
699
+ ]
700
+ }
701
+ }
702
+ },
703
+ {
704
+ "name": "contract_storage_reads",
705
+ "type": {
706
+ "kind": "array",
707
+ "length": 16,
708
+ "type": {
709
+ "kind": "struct",
710
+ "path": "authwit::aztec::protocol_types::contrakt::storage_read::StorageRead",
711
+ "fields": [
712
+ {
713
+ "name": "storage_slot",
714
+ "type": {
715
+ "kind": "field"
716
+ }
717
+ },
718
+ {
719
+ "name": "current_value",
720
+ "type": {
721
+ "kind": "field"
722
+ }
723
+ }
724
+ ]
725
+ }
726
+ }
727
+ },
728
+ {
729
+ "name": "public_call_stack_hashes",
730
+ "type": {
731
+ "kind": "array",
732
+ "length": 4,
733
+ "type": {
734
+ "kind": "field"
735
+ }
736
+ }
737
+ },
738
+ {
739
+ "name": "new_commitments",
740
+ "type": {
741
+ "kind": "array",
742
+ "length": 16,
743
+ "type": {
744
+ "kind": "struct",
745
+ "path": "authwit::aztec::protocol_types::abis::side_effect::SideEffect",
746
+ "fields": [
747
+ {
748
+ "name": "value",
749
+ "type": {
750
+ "kind": "field"
751
+ }
752
+ },
753
+ {
754
+ "name": "counter",
755
+ "type": {
756
+ "kind": "field"
757
+ }
758
+ }
759
+ ]
760
+ }
761
+ }
762
+ },
763
+ {
764
+ "name": "new_nullifiers",
765
+ "type": {
766
+ "kind": "array",
767
+ "length": 16,
768
+ "type": {
769
+ "kind": "struct",
770
+ "path": "authwit::aztec::protocol_types::abis::side_effect::SideEffectLinkedToNoteHash",
771
+ "fields": [
772
+ {
773
+ "name": "value",
774
+ "type": {
775
+ "kind": "field"
776
+ }
777
+ },
778
+ {
779
+ "name": "note_hash",
780
+ "type": {
781
+ "kind": "field"
782
+ }
783
+ },
784
+ {
785
+ "name": "counter",
786
+ "type": {
787
+ "kind": "field"
788
+ }
789
+ }
790
+ ]
791
+ }
792
+ }
793
+ },
794
+ {
795
+ "name": "new_l2_to_l1_msgs",
796
+ "type": {
797
+ "kind": "array",
798
+ "length": 2,
799
+ "type": {
800
+ "kind": "field"
801
+ }
802
+ }
803
+ },
804
+ {
805
+ "name": "unencrypted_logs_hash",
806
+ "type": {
807
+ "kind": "array",
808
+ "length": 2,
809
+ "type": {
810
+ "kind": "field"
811
+ }
812
+ }
813
+ },
814
+ {
815
+ "name": "unencrypted_log_preimages_length",
816
+ "type": {
817
+ "kind": "field"
818
+ }
819
+ },
820
+ {
821
+ "name": "block_header",
822
+ "type": {
823
+ "kind": "struct",
824
+ "path": "authwit::aztec::protocol_types::abis::block_header::BlockHeader",
825
+ "fields": [
826
+ {
827
+ "name": "note_hash_tree_root",
828
+ "type": {
829
+ "kind": "field"
830
+ }
831
+ },
832
+ {
833
+ "name": "nullifier_tree_root",
834
+ "type": {
835
+ "kind": "field"
836
+ }
837
+ },
838
+ {
839
+ "name": "contract_tree_root",
840
+ "type": {
841
+ "kind": "field"
842
+ }
843
+ },
844
+ {
845
+ "name": "l1_to_l2_message_tree_root",
846
+ "type": {
847
+ "kind": "field"
848
+ }
849
+ },
850
+ {
851
+ "name": "archive_root",
852
+ "type": {
853
+ "kind": "field"
854
+ }
855
+ },
856
+ {
857
+ "name": "public_data_tree_root",
858
+ "type": {
859
+ "kind": "field"
860
+ }
861
+ },
862
+ {
863
+ "name": "global_variables_hash",
864
+ "type": {
865
+ "kind": "field"
866
+ }
867
+ }
868
+ ]
869
+ }
870
+ },
871
+ {
872
+ "name": "prover_address",
873
+ "type": {
874
+ "kind": "struct",
875
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
876
+ "fields": [
877
+ {
878
+ "name": "inner",
879
+ "type": {
880
+ "kind": "field"
881
+ }
882
+ }
883
+ ]
884
+ }
885
+ }
886
+ ]
887
+ }
888
+ ],
889
+ "bytecode": "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",
890
+ "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f"
891
+ }
892
+ ],
893
+ "events": [],
894
+ "debug": {
895
+ "debugSymbols": [
896
+ "eJzt3d3O29h1h/F78fGg4PrenFspehC0KRAgmBRNzoK59yjoSHYw26ZdLYnPS/Iog0Ay1160/lyb1k/8+6c//+U///C3P/3ll79++vnvn5Z/k/j087///dNf/+cPv/zz//jr3/7wv3/79PPy06c//vJft//99adP//2nP//x08+62K8//e51mlb222tv/z3q8fr0ycul6v7i5Ys/un79j5/+WUpySilOKYNTyoopRRdOKcIpRTmlGKcU55TCSVvlpK1y0lY5aauctDVO2honbY2TtsZJW+OkrXHS1jhpa5y0NU7aGidtnZO2zklb56Stc9LWOWnrnLR1Tto6J22dk7bOSdvgpG1w0jY4aRuctA1O2gYnbYOTtsFJ2+CkbXDSNjlpm5y0TU7aJidtk5O2yUnb5KRtctI2OWmbnLQtTtoWJ22Lk7bFSdvipG1x0rY4aVuctC1O2hYnbQcnbQcnbQcnbQcnbQcnbQcnbQcnbQcnbQcnbQcnbVdO2q6ctF05abty0nblpO3KSduVk7YrJ21XTtqunLSVhRO3snDyVhZO4MrCSVxZOJErCydzZeGEriyc1JWFE7uygHJXQLkroNwVUO4KKHcFlLskW0bCZSRdRuJlIF8mIGAmIGEmIGImIGMmIGQmIGUmIGYmIGcmIGgmIGkmIGomIGsmIGwmIG0mIG4mIG8mIHAmIHEmIHImIHMmIHQmIHUmIHYmIHcmIHgmIHkmIHomIHsmIHwmIH0mIH4mIH8mIIAmIIEmIIImIIMmIIQmIIUmIIYmIIcmIIgmIIkmIIomIIsmIIwmII0mII4mII8mIJAmIJEmIJImIJMmIJQmIJUmIJYmIJcmIJgmIJkmIJomIJsmIJwmIJ0mIJ4mIJ8mIKAmIKEmIKImIKMmIKQmIKUmIKYmIKcmIKgmIKkmIKomIKsmIKwmIK0mIK4mIK+mIK+mIK+mIK+mIK+mCyd3FeTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVFOTVDOTVDOTVDOTVDOTVbOHkroG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moG8moO8moO8moO8moO8mi+c3HWQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQV3OQVwuQVwuQVwuQVwuQV4uFk7sB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moB8moJ8moJ8moJ8moJ8mq5cHI3QV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV4tQV6tQF6tQF6tQF6tQF6tFk7uFsirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirFcirDZBXGyCvNkBebYC82lg4uTtAXm2AvNoAebUB8moD5NUGyKsNkFcbIK82QF5tgLzaAHm1AfJqA+TVBsirDZBXGyCvNkBebYC82gB5tQHyagPk1QbIqw2QVxsgrzZAXm2AvNoAebUB8moD5NUGyKsNkFcbIK82QF5tgLzaAHm1AfJqA+TVBsirDZBXGyCvNkBebYC82gB5tQHyagPk1QbIqw2QVxsgrzZAXm2AvNoAebUB8moD5NUGyKsNkFcbIK82QF5tgLzaAHm1AfJqA+TVBsirDZBXGyCvNkBebYC82gB5tQHyagPk1QbIqw2QVxsgrzZAXm2AvNoAebUB8moD5NUGyKsNkFcbIK82QF5tgLzaAHm1AfJqA+TVBsirDZBXGyCvNkBebYC82gB5tQHyagPk1QbIqw2QV1tBXm0FebUV5NVWkFdbF07uriCvtoK82gryaivIq60gr7aCvNoK8moryKutIK+2grzaCvJqK8irrSCvtoK82gryaivIq60gr7aCvNoK8moryKutIK+2grzaCvJqK8irrSCvtoK82gryaivIq60gr7aCvNoK8moryKutIK+2grzaCvJqK8irrSCvtoK82gryaivIq60gr7aCvNoK8moryKutIK+2grzaCvJqK8irrSCvtoK82gryaivIq60gr7aCvNoK8moryKutIK+2PuvVXJZHLa7+XC1P5m5rLU/mbmstT+Zuay1P5m5rLU/mbmstT+Zuay1P5m5nLc96tdZanszd1lpAufusV2utBZS7z3q11lpAufusV2utBZS7z3q1zlqe9WqttYBy91mv1loLKHef9WqttYBy91mv1loLKHef9WqttYBy91mv1loLKHef9WqttYBy91mv1loLKHef9WqttYBy91mv1loLJ3dleRas9RbDSd5bMZzovRXDyd5bMZzwvRXDSd9bMZz4vRXDyd9bMZwAvhVDSuBn6VpvMaQEfhav9RZDSuBn+VpvMaQEfhaw9RZDSuBnCVtvMaQEfhax9RZDSuBnGVtvMaQEfhay9RZDSuBnKVtvMaQEfhaz9RZDSuBnOVtvMaQEfha09RZDSuBnSVtvMaQEfha19RZDSuBnWVtvMaQEfha29RZDSuBnaVtvMaQEfha39RZDSuBneVtvMaQEfha49RZDSuBniVtvMaQEfha59RZDSuBnmVtvMaQEfha69RZDSuBnqVtvMaQEfha79RZDSmAQd7sVQ0pgEHi7FUNKYBB5uxVDSmAQersVQ0pgEHu7FUNKYBB8uxVDSmAQfbsVQ0pgEH67FUNKYBB/uxVDSmAQgLsVQ0pgEIG7FUNKYBCCuxVDSmAQg7sVQ0pgEIS7FUNKYBCFuxVDSmAQhrsVQ0pgEIe7FUNKYBCIuxVDSmAQibsVA0pgIZk4IZk4IZk4IZk4WUAJLCQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTJyQTpyQTpyQTpyQTpyQTpwsogZVk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4pRk4oxk4oxk4oxk4oxk4mwBJbCRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyRTJyTTJyTTJyTTJyTTJwvoAR2kolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkolzkokLkokLkokLkokLkomLBZTAQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxQTJxSTJxSTJxSTJxSTJxuYASOEkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmLkkmrkgmrkgmrkgmrkgmrhZQAhfJxBXJxBXJxBXJxBXJxBXJ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Pb5oGp97s8bsbuRyf2nE50c9r/roC3yjsltf4PuO3foC30bs1ZeWB5sfsS/wIX+3vsBn9t36Ah/Bd+sLfKLerS/wAXm3vlzz7rwv17w778s17877cs27077UNe/O+3LNu/O+XPPuvC/XvDvvyzXvzvtyzbvzvlzz7rwv17w778s17877cs27076Ma96d9+Wad+d9uebdeV+ueXfel2venfflmnfnfbnm3Xlfrnl33pdr3p335Zp3p31Zr3l33pdr3p335Zp353255t15X655d96Xa96d9+Wad+d9uebdeV+ueXfel2venfVFlmvenfflmnfnfbnm3Xlfrnl33pdr3p335Zp353255t15X655d96Xa96d9+Wad6d9oT8kfre+XPPuvC/XvDvvyzXvzvtyzbvzvlzz7rwv17w778s17877cs27875c8+60L/RnG+/Wl7POu6veX7rIrC9nnXe3+nLWeXerLyedd3O5l5yis76cdN7d7MtJ593Nvpx03s28/7lZNevLSefdzb6cdN7d6gv96aGv6kvJ8ttLK/6lL79/6RiPX6Nc9HMvRGZ/7nf8xqTQHx56yJ6fdE7ftecn3QPs2vOT7i927flJ9y679vyk+6Jde37SPdeuPT/pfm7Xnp90r7hnz+nPDD1kz6996Pt7fu1D39/zax/6/p5f+9D39/zah76/59c+9P09v/ah7+/5tQ99f8+vfejbe05/auvLel73no9l+bLn976cda+41Zez7ue2+nKoPVfd+1LyL325L/ZQm52txR5ql7G12EON91uLPdRcvbXYQw20W4s91CS5sdhjPWJza7GHmsu2FnuoYWtrsWeaoI712MqtxZ5pgjrWAya3FnumCepYj4LcWuyZJqhjPbRxa7FnmqCO9XjFrcWeaYI61oMQtxZ7pgnqWI8s3FrsmSaoYz1ccGuxZ5qgjvUYwK3FnmmCOtYD+7YWe6YJ6liP1tta7JkmqGM9BG9rsWeaoI71uLqtxZ5pgjrWg+W2FnumCepYj4DbWuyZJqhjPaxta7FnmqCO9Vi1rcWeaYI61gPQthZ7oglKj/Wosq3FnmiC0mM9VGxrsSeaoG5vOtNiTzRB6bEe1LW12BNNUHqsR2ptLfZME9SxHn61tdgzTVDHekzV1mLPNEEd64FSW4s90wR1rEc/bS32TBPUsR7StLXYM01Qx3qc0tZizzRBHevBR1uLPdMEdahHFK2+3l+8LPXlamd1xL3m5fNvw0g9GnOkaau1MUeazFobc6QprrUxR5r4WhtzpOnw6435bbWHevrQ9mqPNB/K4vpYbvpsuUeaEL9juUeaEb9juUeaEmXRZWO5R5r9vmO5R5rovmO5R5rT5Hb5ub9adLbDO9RDRb5juUeaqbaXe6hHachSY2O5x5qqNpd7rKlqc7nwqcr1/moJ33z19g8QK/3BCf0Lhk9W/QuGz1b9C4ZPV/0Lhs9X/QuGT1jtC6b/THz/guFTVv+C4XNW/4LPNmnRf7W9f8Fnm7Tov97ev+CzTVr0X3HvX/DZJi36r7n3L/hskxb9V93bF9zyOy6W939tNhf59oJl8UdJ9nhp3h/Woy2/tdJaUMdnoLWgjr+jrQV1TOutBXVM0z9UkD0e/eZjVlDHtNtaUMc0+kMFfb4V/8Wz8b4oqGNabC2oY5prLejtSf3tgqzlNx1aC3p7Um8V9Pak3iro7Um9VdDbk3qroLcn9VZBsKS2Fk/fWhAsqa3FpXcW1GLHWwuiJXWLwW4tiJbULZa5tSBaUreY4NaCaEndYmtbC6IldYtRbS2IltQt1rO1IFpSt5jJ1oJoSd1iBFsLoiX1HENZ3u8+u3y+r71+ftc0LDbfNf1Eb75r+rHbfNf0s7H1rq98i/nx2PlYPvfw8XVR+8qXgbfeNc+3rXfNQ2jrXfOk2HrX/OO89a75Z27rXfMPhtzhYnzxTyZT4+gPO+Tx+TNxO8v3A8xHksYDzEeMvgN85etfP3CAuOeG55gdYP73uPEA87/yHQf49dd/APkiwdw=",
897
+ "eJzllt1qAkEMhd9lrkWSTDKZ+CrFC2ktFIqW6p3su9etO7OLDQ6tYCu9UuFLPJz8TA7hdfu42r9sN7uwOAQOi4dD2L2tNv2v3X71vg8LmIX15un42c3C88vrOiwIYjf7whGADCgBaaWjeXDkVGDu0w2weTAiGA40IopM8eUsyH3KTreTzbnkJWG4TrZ6sjFpLjEqqSEeTbWKj+Mf9NK+wNniwFqaoG7ehvR8v9LteukEVpuXmC9LVyqsKlU0eQ0jVXjCMat6WYkrS0IyEcw/8ATh75qSqJqieNmUSDagcZK1//p9R/DGjmQtrHGcOtKLoV8Uk8/FxBuLQVAbK5UvdwsZ1rkwhtZcqNXUuTlFAiW1yOTFok9X3Bf/P7iiWF5EFZ264rRVLlscgayyx/H7yYS6x8q/cFyL4xngvA/dW+hOXclxvMyAG3RMBWYZ2ZhP23zury2xcoMkHOUIlCB3qltBbmNylro8xtZXPa3UuXsLxlTqwJjOCx3n7hHWiHGvn0aMfx20gtwH9GJQmqNrA6fS72z5vLLHINeHVpBrhNQipckBYdwtu+4DSiYHaw==",
898
+ "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",
899
+ "eJztndGOK7mxZf+lnw1DESQzSf/KYB6MmTvABS58B2O/Gf730bFLqjo+wRPUrizl6lY/NRrQPqSUwajUYi7q77/813//rz//7T//+y9//eVPf/+l/vKn//H3X/76f//8l2//99e//fn//e2XP13+8Mt//OV/X//7jz/88n/+87/+45c/+aX84w8/vM4vl/b2Ur/4fn91GdGLS91uL67f/rm3F4/oxWaXYW+vNrPWPr78f/7hl/brnPb2vGnXfvt3vdXL56a9R9P2YvfplNqSyVsffhthfHi1dQ9eXWy/zb74Zc8+mFr9folGvb/629v+cSKj1/unWOz+4r19e6f9N/ROr/9Ev73YLt+90x9f3OttGr3Xf/tQxst+KOP22lHKv30odvktfSpWb+vfr23m55+KF7+voNI/fITRv9zujWWz+vOXXqd5n0Tzj59dFXqW2e/XZ+H6bH6/Pnvy0uLj9vZ2f39p9FGkF8d/vzjci1Ne9+KM/f4vf9+uvn0u4b3y75+LhTfjv38u9lu6bX7sc2l2b3LtYzuK/uVh5XaTtV9+/tLzbiZ+U98LCJfypD9tv6mvMl93HfdbW7Pr16VkTZbb1Wlj+9zV8de9ZR/jPo/Lh88l/MTN++1rqZW6HbYkT+uu/rrfBgjX/ZxW7K/7LePrLvpJfft1vxg9dClLu61Jq5ekw+5++/D2/tmV9sLfz/CwxcMtod8vDuPivO43+F/BxXn+d/Jyub26lOLf/dvfJvT8L5e13P6ilFrHv0+oPH+LKpnQ87/gJRN6/jePZELPvytOJvT8e7tkQs+/m0km9Py/4MmEnv9XK5nQ8zt1MiFap660Tl1pnbrSOnWldepK69SV1qkrrVNXWqeutE5daZ260Tp1o3XqRuvUjdapG61TN1qnbrRO3WidutE6daN16o3WqTdap95onXqjdeqN1qk3WqfeaJ16o3XqjdapN1qn3mmdeqd16p3WqXdap95pnXqndeqd1ql3WqfeaZ16p3XqTuvUndapO61Td1qn7rRO3WmdutM6dad16k7r1J3WqQetUw9apx60Tj1onXrQOvWgdepB69SD1qkHrVMPWqe2C61V24XWq+1Ca9Z2oXVru9DatV1o/doutIZtF1rHtgutZdsF17NPOP0nmxGuZ59wyEs2I1zPPuFMkWxGuJ5tuJ59wske2YxwPfuEoxaSGTmuZ59w4EE2I1zPPsETz2aE69knGL7ZjHA9+wSXM5sRrmfjDEbDKYyGcxgNJzEazmI0nMZoOI/RcCKj4UxGw6mMhnMZDSczGs5mNJzOaDif0XBCo+GMRsMpjYZzGg0nNRrOajSc1mg4r9FwYqPhzEbDqY2GcxsNJzcazm40nN5oOL/RcIKj4QxHwymOhnMcDSc5Gs5yNJzmaDjP0XCio+FMR8OpjoZzHQ0nOxrOdjSc7mg439FwwqPhjEfDKY+Gcx4NJz0azno0nPZoOO/RcOKj4cxHw6mPhnMfDSc/Gs5+NJz+aDj/0XACpOEMSMMpkIZzIA0nQRrOgjScBmk4D9JxHqTjPEjHeZCO8yD9QuvZjvMgHedBOs6DdJwH6TgP0nEepOM8SMd5kI7zIB3nQTrOg3ScB+k4D9JxHqTjPEjHeZCO8yAd50E6zoN0nAfpOA/ScR6k4zxIx3mQjvMgHedBOs6DdJwH6TgP0nEepOM8SMd5kI7zIB3nQTrOg3ScB+k4D9JxHqTjPEjHeZCO8yAd50E6zoN0nAfpOA/ScR6k4zxIx3mQjvMgHedBOs6DdJwH6TgP0nEepOM8SMd5kI7zIB3nQTrOg3ScB+k4D9JxHqTjPEjHeZCO8yAd50E6zoN0nAfpOA/ScR6k4zxIx3mQjvMgHedBOs6DdJwH6TgP0nEepOM8SMd5kI7zIB3nQTrOg3ScB+k4D9JxHqTjPEjHeZCO8yAd50E6zoN0nAfpOA/ScR6k4zzIgvMgC86DLDgPsuA8yHKh9eyC8yALzoMsOA+y4DzIgvMgC86DLDgPsuA8yILzIAvOgyw4D7LgPMiC8yALzoMsOA+y4DzIgvMgC86DLDgPsuA8yILzIAvOgyw4D7LgPMiC8yALzoMsOA+y4DzIgvMgC86DLDgPsuA8yILzIAvOgyw4D7LgPMiC8yALzoMsOA+y4DzIgvMgC86DLDgPsuA8yILzIAvOgyw4D7LgPMiC8yALzoMsOA+y4DzIgvMgC86DLDgPsuA8yILzIAvOgyw4D7LgPMiC8yALzoMsOA+y4DzIgvMgC86DLDgPsuA8yILzIAvOgyw4D7LgPMiC8yALzoMsOA+y4DzIgvMgC86DLDgPsuA8yILzIAvOgyw4D7LgPMiC8yALzoMsOA+y4DzIgvMgC86DLDgPsuA8yILzIAvOgyw4D7LiPMiK8yArzoOsOA+yXmg9u+I8yIrzICvOg6w4D7LiPMiK8yArzoOsOA+y4jzIivMgK86DrDgPsuI8yIrzICvOg6w4D7LiPMiK8yArzoOsOA+y4jzIivMgK86DrDgPsuI8yIrzICvOg6w4D7LiPMiK8yArzoOsOA+y4jzIivMgK86DrDgPsuI8yIrzICvOg6w4D7LiPMiK8yArzoOsOA+y4jzIivMgK86DrDgPsuI8yIrzICvOg6w4D7LiPMiK8yArzoOsOA+y4jzIivMgK86DrDgPsuI8yIrzICvOg6w4D7LiPMiK8yArzoOsOA+y4jzIivMgK86DrDgPsuI8yIrzICvOg6w4D7LiPMiK8yArzoOsOA+y4jzIivMgK86DrDgPsuI8yIrzICvOg6w4D7LiPMiK8yArzoOsOA+y4jzIivMgK86DbDgPsuE8yIbzIBvOg2wXWs9uOA+y4TzIhvMgG86DbDgPsuE8yIbzIBvOg2w4D7LhPMiG8yAbzoNsOA+y4TzIhvMgG86DbDgPsuE8yIbzIBvOg2w4D7LhPMiG8yAbzoNsOA+y4TzIhvMgG86DbDgPsuE8yIbzIBvOg2w4D7LhPMiG8yAbzoNsOA+y4TzIhvMgG86DbDgPsuE8yIbzIBvOg2w4D7LhPMiG8yAbzoNsOA+y4TzIhvMgG86DbDgPsuE8yIbzIBvOg2w4D7LhPMiG8yAbzoNsOA+y4TzIhvMgG86DbDgPsuE8yIbzIBvOg2w4D7LhPMiG8yAbzoNsOA+y4TzIhvMgG86DbDgPsuE8yIbzIBvOg2w4D7LhPMiG8yAbzoNsOA+y4TzIhvMgG86DbDgPsuE8yIbzIBvOg2w4D7LhPMiG8yA3nAe54TzIDedBbjgPcrvQevaG8yA3nAe54TzIDedBbjgPcsN5kBvOg9xwHuSG8yA3nAe54TzIDedBbjgPcsN5kBvOg9xwHuSG8yA3nAe54TzIDedBbjgPcsN5kBvOg9xwHuSG8yA3nAe54TzIDedBbjgPcsN5kBvOg9xwHuSG8yA3nAe54TzIDedBbjgPcsN5kBvOg9xwHuSG8yA3nAe54TzIDedBbjgPcsN5kBvOg9xwHuSG8yA3nAe54TzIDedBbjgPcsN5kBvOg9xwHuSG8yA3nAe54TzIDedBbjgPcsN5kBvOg9xwHuR2ggd5/Vt6m9HWs3/72gzeXryND/9yi6Zx2cdtGmbbxxd/e6cn+JVnvdPn/405650+/2/XWe/0+X8Tz3qnz/9be9Y7ff7f8LPe6fPvDc56p8+/5zjrnT7/Xuasd/oy90gn+MxnvdOXuUc6wb8+652+zD3SCb74We/0Ze6RTvDbz3qnL3OPdIKPf9Y7fZl7pBPODzjrnb7MPdIJ5x2c9U5f5h7phPMZznqnL3OPdMJ5Eme905e5Rzrh/Iuz3umr3CPtJ5zXcdY7fZV7pP2E80XOeqevco+0X17lHmk/4ZyVs97pq9wj7SecC3PWO32Ve6T9hHNsTnqnJ5yPc9Y7fZl7pBPO8znrnb7MPdIJ5w+d9U5f5h7phPOSznqnL3OPdML5Tme905e5RzrhPKqz3unL3COdcH7WWe/0Ze6RTjjv66x3+jL3SCecT3bWO32Ze6QTzlM7652+zD3SCee/nfVOX+Ye6YTz6s56p8+/R2ql39/p+P7f/ueMnn8vs9vt1eV66X+c0fPvOWy/3Gbklz35t73W27/tddT7q+slmsjo9fbiS7H7i/e3enj+XcfXvdfrP3ErNbfLd+/1xxf3eptG7/WHj+X5tyiUj2XcXjtK+eFjef79zBd+LFbt9mK/XH7+sXjx+zIq/cNnGP3Lbdz+4c3qz196neZ9Es0/fnY1+uzscn/5tbu399eP8a8L9PzbsF/jBdr8foH25KXFb39Oy/7+p2KPPor06pxwDCXm6oz9/i9/vyb++cE8/07zV/LBPP/G9FfywTz/rpHywTS7N7r2sSVF//Kw2xeHsV9+/tLz/midcIbpb/xanvX37Tf1ZeLrLuR+62x2vTNPVmW5XZ42ts9ente9ex/jPo/Lhw8m/MjN++0rkJW6HbYoT2ywr/utgHDhT+rGJxyg/Nu/6ie17hOOnv5VXsvSbqvS6iVpsrvfPry9f3qtvfD3ND53OeFQ8t+vzvrVed2v8r+Gq/P8L+flct+eK8H2HO6w+h13WP2OO6x+xx1Wv+MOq99xh9XvuMPqd9xh9TvusPodd1j9jjusfscdVr/jDqvfTzisPpnRCYfKZzPC9ewTDmnPZoTr2Sccep7NCNezTzhEPJsRrmefcCh3NiNczz7hkOtsRriefcKh0dmMcD37hEOYsxnhevYJhxpnM8L17BMOCc5mhOvZJxy6m80I17NPOMQ2mxGuZ59wKGw2I1zPPuGQ1WxGuJ59wqGl2YxoPbufcAhoNiNaz+4nHKqZzYjWs/uF1rP7CYdJZjOi9ex+wuGM2YxoPbufcNhhMqMTDiXMZoTr2Scc8pfNCNezTzg0L5sRrmefcAhdNiNczz7hULdsRriefcIhadmMcD37hEPHshnhevYJh3hlM8L17BMOxcpmhOvZJxwylc0I17NPOLQpmxGuZ59wCFI2I1zPPuGwomxGuJ59wpFC2YxwPfuEg3SyGeF69gmnpWQzwvXsE84HyWaE69knHBWSzQjXs084uSGbEa5nn3B8QjYjXM8+wTnPZoTr2Se4wtmMcD37BCc0mxGuZ+M8yI7zIDvOg+w4D7LjPMiO8yA7zoPsOA+y4zzIjvMgO86D7DgPsuM8yI7zIDvOg+w4D7LjPMiO8yA7zoPsOA+y4zzIjvMgO86D7DgPsuM8yI7zIDvOg+w4D7LjPMiO8yA7zoPsOA+y4zzIjvMgO86D7DgPsuM8yI7zIDvOg+w4D7LjPMiO8yA7zoPsOA9y4DzIgfMgB86DHDgPclxoPXvgPMiB8yAHzoMcOA9y4DzIgfMgB86DHDgPcuA8yIHzIAfOgxw4D3LgPMiB8yAHzoMcOA9y4DzIgfMgB86DHDgPcuA8yIHzIAfOgxw4D3LgPMiB8yAHzoMcOA9y4DzIgfMgB86DHDgPcuA8yIHzIAfOgxw4D3LgPMiB8yAHzoMcOA9y4DzIgfMgB86DHDgPcuA8yIHzIAfOgxw4D3LgPMiB8yAHzoMcOA9y4DzIgfMgB86DHDgPcuA8yIHzIAfOgxw4D3LgPMiB8yAHzoMcOA9y4DzIgfMgB86DHDgPcuA8yIHzIAfOgxw4D3LgPMiB8yAHzoMcOA9y4DzIgfMgB86DHDgPcuA8yIHzIAfOgxw4D3LgPMiB8yAHzoMcOA9y4DzIgfMgB86DHDgPcuA8yIHzIAfOg7QLToS8TonWta9TorXt65Roffs6JVrjvk6J1rmvU6K17uuUaL37OiVa875Oide9cUrkdUq87o2TIq9T4nVvnBZ5nRKve+PEyOuUeN0bp0Zep8Tr3jg58jolXvfG6ZHXKfG6N06QvE6J171xiuR1SrzujZMkr1PidW+cJnmdEq9740TJ65R43RunSl6nxOveOFnyOiVe98bpktcp8bo3Tpi8TonXvXHK5HVKvO6NkyavU+J1b5w2eZ0Sr3vjxMnrlHjdG6dOXqfE6944efI6JV73xumT1ynxujdOoLxOide9cQrldUq87o2TKK9T4nVvnEZ5nRKve+NEyuuUeN0bp1Jep8Tr3jiZ8jolXvfG6ZTXKfG6N06ovE6J171xSuV1SrzujZMqr1PidW+cVnmdEq9748TK65R43RunVl6nxOveOLnyOiVe98bpldcp8bo3TrC8TonXvXGK5XVKvO6NkyyvU+J1b5xmeZ0Sr3vjRMvrlHjdG6daXqeE697Gcy2N51oaz7U0nmtpF1z3Np5raTzX0niupfFcS+O5lsZzLY3nWhrPtTSea2k819J4rqXxXEvjuZbGcy2N51oaz7U0nmtpPNfSeK6l8VxL47mWxnMtjedaGs+1NJ5raTzX0niupfFcS+O5lsZzLY3nWhrPtTSea2k819J4rqXxXEvjuZbGcy2N51oaz7U0nmtpPNfSeK6l8VxL47mWxnMtjedaGs+1NJ5raTzX0niupfFcS+O5lsZzLY3nWhrPtTSea2k819J4rqXxXEvjuZbGcy2N51oaz7U0nmtpPNfSeK6l8VxL47mWxnMtjedaGs+1NJ5raTzX0niupfFcS+O5lsZzLY3nWhrPtTSea2k819J4rqXxXEvjuZbGcy2N51oaz7U0nmtpPNfSeK6l8VxL47mWxnMtjedaOs+1dJ5r6TzX0nmupV9w3dt5rqXzXEvnuZbOcy2d51o6z7V0nmvpPNfSea6l81xL57mWznMtnedaOs+1dJ5r6TzX0nmupfNcS+e5ls5zLZ3nWjrPtXSea+k819J5rqXzXEvnuZbOcy2d51o6z7V0nmvpPNfSea6l81xL57mWznMtnedaOs+1dJ5r6TzX0nmupfNcS+e5ls5zLZ3nWjrPtXSea+k819J5rqXzXEvnuZbOcy2d51o6z7V0nmvpPNfSea6l81xL57mWznMtnedaOs+1dJ5r6TzX0nmupfNcS+e5ls5zLZ3nWjrPtXSea+k819J5rqXzXEvnuZbOcy2d51o6z7V0nmvpPNfSea6l81xL57mWznMtnedaOs+1dJ5r6TzX0nmupfNcS+e5ls5zLZ3nWjrPtXSea1l4rmXhuZaF51oWnmtZLrjuXXiuZeG5loXnWhaea1l4rmXhuZaF51oWnmtZeK5l4bmWhedaFp5rWXiuZeG5loXnWhaea1l4rmXhuZaF51oWnmtZeK5l4bmWhedaFp5rWXiuZeG5loXnWhaea1l4rmXhuZaF51oWnmtZeK5l4bmWhedaFp5rWXiuZeG5loXnWhaea1l4rmXhuZaF51oWnmtZeK5l4bmWhedaFp5rWXiuZeG5loXnWhaea1l4rmXhuZaF51oWnmtZeK5l4bmWhedaFp5rWXiuZeG5loXnWhaea1l4rmXhuZaF51oWnmtZeK5l4bmWhedaFp5rWXiuZeG5loXnWhaea1l4rmXhuZaF51oWnmtZeK5l4bmWhedaFp5rWXiuZeG5loXnWhaea1l4rmXhuZaF51qWE1zLVvptSttowZSe3713u736+i3S/31K+x/jhxiv17O+xar1eo/t7S0V9vw0FbblLBU/rZemwuaWpsL+k6bCFpGmwlWcpsKFlqbCtZCmpNqIn2JKU1JtxM8CpSmpNuInatKUVBvxcylpSqqN+OmONCXVRvyMRJqSaiN+0iBNSbUR79enKak24l3vNCXVRrx3nKak2oh3YNOUVBvxPmaakmoj3g1MU1JtxHtqaUqqjXhnKk1JtRHv76QpqTbiXZI0JdVGvNeQpqTaiIl9mpJqI+beaUqqjZgepympNmIGm6ak2ohJZpqSaiPmgWlKqo2YqqUpqTZiNpWmpNqICU+akmoj5iRpSqqNmDakKak24u/saUqqjfiUoTQl1YbFh/XkMak6LD70Jo9J9WEXqUAsPuAlj0klYvFBKXlMKhKLDxxJY/GhIHlMq5L4cI08plVJfEhFHtOqJD7sIY9pVRIfmpDHtCqJDx/IY1qVxBJ/HtOqJJbh85hWJbFUnse0KtGgqWnU1DRsaho3NQ2cmkZOTUOnprFT0+CpafTUNHxqGj81DaCaRlBNQ6imMVTTIKppFNU0jGoaRzUNpJpGUk1DqaaxVNNgqmk01TScahpPNQ2omkZUTUOqpjFV06CqaVTVNKxqGlc1DayaRlZNQ6umsVXT4KppdNU0vGoaXzUNsJpGWE1DrKYxVtMgq2mU1TTMahpnNQ20mkZaTUOtprFW02CrabTVNNxqGm81DbiaRlxNQ66mMVfToKtp1NU07GoadzUNvJpGXk1Dr6axV9fYq2vs1TX26hp7dY29usZeXWOvrrFX19ira+zVNfbqGnt1jb26xl5dY6+usVfX2Ktr7NU19uoae3WNvbrGXl1jr66xV9fYq2vs1TX26uLzquIDqxp7dY29usZeXWOvrrFX19ira+zVNfbqGnt1jb26xl5dY6+usVfX2Ktr7NU19uoae3WNvbrGXl1jr66xV9fYq2vs1TX26hp7dY29usZeXWOvrrFX19ira+zVNfbqGnt1jb26xl5dY6+usdfJj9vnMa1KNPY6+SH3NKax18kPoucxrUo09jr58e88plWJxl4nP3Sdx7Qq0djr5Eed85hWJRp7nfyAcR7TqkRjr5Mf681jopOnVYnGXic/HpvHtCrR2Ovkh1K/j+1BbKFKothClUSxhSqJYgtVEsUWqiSKLVTJj7HJj1TmsYUqiWILVRLFpCqZ/GhiHpOqZPLjg3lMqpLJj/jlMa1KVthrFNOqZIW9RjGtSlbYaxTTqmSFvUaxvErG9jH2o2m+bTfRfNs/OOz7bYS8oD47Ql57nxxhAf5+coQF3PX9CG+xRy/fW+zRa/IWe/SD/ldsAXeFsXyRh7F8kYexfJGHsXyRh7F8kYcxrUoWcFcY06pkAXdFsQXcFca0KlnAXWFMq5LJeeXXL8pvMa+9vMduTWFypngai88/SWPxGSVpLD4FKo3FJzVlsck51GksPvEojcWnEqWx+OSgNKZVyeTs4jSmVcnkDOA0plXJ5CzdLDY57zaNaVUyOTc2jWlVMjl/NY1pVTI5xzSNaVUyOQ80jWlVMjlXM41pVTI5nzKNaVUyOecxjWlVMjkvMY1pVTI5dzCNaVUyOb8vjWlVMjkHL41pVTI5Ty6NaVUyOZctjWlVEuOuPCZVSY1xVx6TqqTGuCuPSVVSY9yVx6QqqTHuymNSldQYd+UxrUpi3JXHtCqJcVce06okxl15TKuSGHflMa1KYoaVx7QqmfzGfBrTqmTyW+1pTKuSyW+epzGtSia/HZ7GtCqZ/AZ3GtOqZPJb1mlMq5LJb0KnMa1KJr+tnMa0Kpn8RnEa06pk8lu/aUyrkslv5qYxrUomvz2bxrQqmfyGaxrTqmTyW6hpTKuSyW+KpjGtSia/zZnGtCqZ/MZlGtOqRGOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvVWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvTWOvbcJer/eZt9j1HiSIxVWSxuIqSWNxlXyMuQWxuErSWFwlbX+P9WiScZVksQl7TWNxlewXu8V270EsrpI0Fl+3NBZftzQWP2de+62US1jKExU6jcXPmaex+DnzNBY/Z57G4uLa63117+3yY2wC49LYpLg+xDYPYmFTKJdyub23yxast4mJm8ZiZeJy2X8ei5WJNBYrE5d+j9llC2JxKWexiYlrdbvHoklOTNw0FpeylfEeCy73xMRNY3GVfIztQU1OTNw0FldJeS+uj7/P+h6LqySNxVWSxuIq8THeY99VSfTbuT/vINtE2z12jLj+jh0jLtZjx4gr+9gx4mVw7Bjxmjl2jHiBHTtGvBqPHSNeuseO8YR1PhGvjx3jCet8onQfO8YT1vlEFj92jCes84mGfuwYT1jnE2v92DGesM4n5vqxYzxhnU8ORD12jCes88lRq8eO8fn1YZeb0Gz2PsL1Pv1thM+vjmSEyYmoD43g/TaCj2CEz1dUNsLn6ykb4fPVlI3w+b8Z2QiP/sV4iz1a5G+xRyv3LfZoq/5XbHLyRblTu1Iv5eefnpvfIIDbh2+Ffqm3QeKlcvAg8Wo5eJB4wTw2SOv3QfYtGiReMwcPEi+bgweZQItHBnG7D+IlHGSCOI4dZAJEjh0kXsPzQf4Vm5xLksYeXZVvsUfX2Vvs0ZXzFnt0LbzFHq3ut9ij9foWe7QC32KP1tRbTKuSyTG8aUyrkskxvGlMq5LJMbxpTKuSyTG8aUyrkskxvGlMq5LZ3pPdOX/N7qa+bcXct1f29zG+9bnHXv02pcm+1plTmuyZnTmlyX7cmVOKV+WpU4pX/KlTirvJqVOKO9V8Sm+xuFOlsckueRKbHAWdxh7tJm8xaZd8mxwFncYmKyeLTao7i00qMItNqiSLTaoki0nPUmyTDeg0Jj1LsU02oNOYViWTDeg0plXJZAM6jWlVMtmATmNSleyTPeU0JlXJPtn5TWNSlewXqUr2yZZrGpOqZJ9sjKYxqUr2yfZlFpvsSKYxrUom+4ZpTKuSye5eGtOqZLIHl8a0KpnslKUxrUom+1lpTKuSya5TGtOqZLI3lMa0Kpn8DF8a06pksmOUxrQqmfwMXxrTqmSyk5TGtCqZ7PmkMa1KJrszaUyrksnuTBrTqmSyO5PGtCqZ7KCkMa1KJrscaUyrkslORBrTqmSyW5DGtCqZ8P80plXJhP+nMa1KJvw/jWlVMuH/aUyrkgn/T2NalUz4fxrTqmTC/9OYViUT/p/GtCqZ8P80plXJhP+nMa1KNPdk19yTXXNPds092Wc8OotpVTLjullMq5IZe81iWpXM2GsW06pEY6+7xl53jb3uGnvdNfa6a+x119jrrrHXXWOvu8Zed4297hp73TX2umvsddfY666x111jr7vGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrvGXrsGUbsGUccBhwn9XHcfBxwllI0QX9YjRzhAFU9G+PzhItkIBxydUG6ug9U9GOGAoxNKuY/QgxE+f6xIMsIBhwf9/FCAccDRQdkIX338wzjg2KBshAPWdDLCVx//MA44MCgb4YA1nYxwwJpORjhgTf98hAMOCspG+PI1fcAhQdkIX76mDzggKBvhy9f0ZHvjyBG+fE0fccRRMsKXr+nJVsyRI3z5mv7yY5rGlx/TNL78mKbx5cc0jYePaXp8hC9f0w8f/vT4CF++picbZ0eO8OVrOt4gy0JhiWehsGqvX8zu32/a5cdj80e8OZbHwvrKY2HRpLF4cyyPhZc3j4V9OI+FzTWPxRWSxuIaSWNxlTS7neRge4licZWksbhK0lhcJVks3hzLY3GV/DTm/Y/xJ7K/H2T2fuyb9fYWij+PJBR/GkkoBhdpKv4sfpbaS/vj5B71WttvuWoff7LjPRf/lcpz8d+eNDe5S8xz8d+JPBff0eW5+D4tz8V3X3kuvqfKc/GdUp4T62VyV5PnxHqZ3IHkObFeJg/v5DmxXiaP7+Q5sV4mD/DkObFeJo/w5DmxXiYP8eQ5sV4mj/HkObFeJg/y5DmxXiaP8uQ5sV4mD/PkObFeJo/z5DmxXiYP9OQ5sV4mj/TkObFeJg/15DmxXiaP9eQ5sV4mD/bkObFeJo/25DmxXiYP9+Q5sV4mj/fkObFeJg/45DmxXiaP+OQ5sV4mD/nkObFeJo/55DmxXiYP+uQ5sV4mj/rkObFeJg/75DmxXiaP++Q5sV4mD/zkObFeJo/85DmxXibPCuU5sV5s4lwuBMWKsckDSgtBsWbsIhaNTZ4SWgiKZWOTZ3oWgmLh2OQJnDw4ebBmIahWzuQxmIWgWjmTh1YWgmrlTB4xWQiqlTN5IGQhqFbO5PGNhaBaOZOHLRaCauVMHo1YCKqVM3mQYSGoVo4Kf02lv6biX1P5r6kA2FQCbCoCNpUBmwqBTaXApmJgUzmwqSDYVBJsKgo2lQWbCoNNpcGm4mBTebCpQNhUImwqEjaVCZsKhU2lwqZiYVO5sKlg2FQybCoaNpUNmwqHTaXDpuJhU/mwqYDYVEJsKiI2lRGbColNpcSmYmJTObGpoNhUUmwqKjaVFZsKi02lxabiYlN5sanA2FRibCoyNpUZmwqNTaXGpmJjU7mxqeDYVHJsKjo2lR2bCo9Npcem4mNT+bGpANlUgmwqQjaVIbvKkF1lyK4yZFcZsqsM2VWG7CpDdpUhu8qQXWXIrjJkVxmyqwzZVYbsKkN2lSG7ypBdZciuMmRXGbKrDNlVhuwqQ3aVIbvKkF1lyK4yZJefH5YfIFYZsqsM2VWG7CpDdpUhu8qQXWXIrjJkVxmyqwzZVYbsKkN2lSG7ypBdZciuMmRXGbKrDNlVhuwqQ3aVIbvKkF1lyK4yZFcZsqsM2VWG7CpDdpUhu8qQXWXIrjJkVxmyqwzZVYbsKkN2lSG7ypBdZciuMmRXGbKrDNlVhuwqQ3aVIbvKkF1lyK4yZFcZsqsM2VWG7CpDdpUhu8qQXWXIrjJkVxmyqwzZVYbsKkN2lSG7ypBdZciuMmRfYch7GFyonDi4UDlxcKFy4uBC5cTBhcqJgwuVEwXLCkOOgwuVEwcXKicOipVTVhhyHBQrp6ww5DgoVk5ZYchxUK2cFYYcB9XKWWHIcVCtnBWGHAfVyllhyHEwr5yxfQz+eCLLtt2OON3299MKfH8fIy+yz4+R1+Onx1iA2J8eYwHMfT/GPfjohbwHH7069+CjH/ktuADmJsG8BUyCeQuYBPMWMAnmLWASzFvAJKhWzgKYmwTVylkAc3FwAcxNgmrlLIC5SVCtnBjM+fXr+lvQg4Ok/xkMK2clGFbOSjCsnJVgWDkrwbByFoIxmFsJhpWzEgwrZyUYVs5KUK2cGMytBNXKicHcSlCtnBjMLQRjMLcSVCsnBnMrQbVyYjC3ElQrJwZzK0G1cmIwtxJUKycGcytBtXJiMLcSVCsnBnMrQbVyYjC3ElQrJwZzK0G1cmIwtxJUKycGcytBtXJiMLcSVCsnBnMrQbVyYjC3EhQrp8ZgbiUoVk6NwdxKUKycGoO5laBYOTUGcytBsXJqDOZWgmrlxGBuJahWTgzmVoJq5cRgbiWoVk4M5laCauXEtG0lqFZOzMVWgmrlxA93rgTVyokf7lwJqpUTP9y5ElQrJ364cyWoVk78cOdKUK2c+OHOlaBaOfHDnStBtXJihrwSVCsnZsgrQbVyYoa8ElQrJ2bIK0G1cmKGvBJUKydmyCtBtXJihrwSVCsnZsgrQbVyYoa8ElQrR2XIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXIVWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXITWXIbcKQr/ext+D1jiYMxpWzEIwrZyEYV87HoFsYjCtnIRhXTtvfgz2ealw5eXDCkBeCceXsF7sFd+9hMK6chWB8HReC8XVcCMZeQO23Ii+TIp/I8wvB2AtYCMZewEIw9gIWgnHJ7fXeAfZ2iYIThLgQnJTch+DmYTBsHeVSbr/wWy5buB4ntvZCMJZfLpc9C8byy0Iwll8u/R60yxYG4yLPgxNb2+p2D8ZTndjaC8G4yK2M92BYABNbeyEYV87H4B7W6sTWXgjGlVPeS67UFgbjylkIxpWzEIwrx8d4D35XOT/6h3mf2SZq99GjxDV59ChxAR89SlztR48SL42jR4nX0dGjxIvu6FHiFXr0KPFyPnqUp6z9iZx/9ChPWfsT7f/oUZ6y9icHChw9ylPW/uSogqNHecran5xscPQoT1n7k9MNjh7lKWt/cvjv0aM8Ze1PjhU+epTPrxe73NR2s/cxrvf59zE+v1rSMSan/j40hvfbGD7CMT5fXfkYn6+tfIzPV1Y+xuf/puRjPPoX5R58tOjvwUcr+R58tJXfgpMzU8qdG5Z6KT//HN38hhjcPnzD9Et9HyZePocPE6+gw4eJF9Fjw7R+H2bf4mHidXT4MPFSOnyYCRB5ZBi3+zBeJsNM8MnRw0xgy9HDxOt6PswtODnRZiH46Eq9Bx9de/fgo6vpHnx0fdyDj1b8PfhoDd+Dj1blPfhond2DauVMjppeCKqVMzlqeiGoVs7kqOmFoFo5k6OmF4Jq5UyOml4IqpUz2y2z+w5Eze7Jvm0Z3TeB9vdRvvXEx159n9RkJ+7cSU12+c6d1GQH8dxJxSv15EnFXeDkScUd5uRJxd1rPql7MO5eC8HJXn8anBx3vhB8tMPcg+Je/zY57nwhOFlNeXBS8XlwUpV5cFI5eXBSOXlQfEpkm2ygLwTFp0S2yQb6QlCtnMkG+kJQrZzJBvpCUK2cyQb6QlCsnH2yJ74QFCtnn+xcLwTFytkvYuXsky3jhaBYOftkY3chKFbOPtl+zYOTHdWFoFo5k33PhaBaOZPdyYWgWjmTPcSFoFo5k52+haBaOZP9uIWgWjmTXbOFoFo5k72thaBaOZOfzFwIqpUz2fVaCKqVM/nJzIWgWjmTHbGFoFo5k72rhaBaOZNdpoWgWjmTXaaFoFo5k12mhaBaOZOdoIWgWjmT3ZqFoFo5kx2VhaBaOZNdj4WgWjmTfYyFoFo5k32MhaBaOZN9jIWgWjmTfYyFoFo5k32MhaBaOZN9jIWgWjmTfYyFoFo5k32MhaBaOZN9jIWgWjmTfYyFoFo5qvWzq9bPrlo/u2r97DOungfVypnx6TyoVs6MIedBtXJmDDkPqpWjMuRdZci7ypB3lSHvKkPeVYa8qwx5VxnyrjLkXWXIu8qQd5Uh7ypD3lWGvKsMeVcZ8q4y5F1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1lyF1FwV1FweOAY6mygxDGAYdS5WPEF/nYMQ44QCAd4/NH0uRjHHDARrmZKlb3cIwDDtgo5T5GD8f4/GE06RgHHEOVHRoxDjiEKh/j6w8KGQccQJWPccA6T8f4+oNCxgFHT+VjHLDO0zEOWOfpGAes82yMA46cysd4wjo/4LipfIwnrPMDjprKx3jCOp9s0Bw7xhPW+REHZqVjPGGdTzaTjh3jCev8CQd/jScc/DWecPDXeMLBX+Phg7+UMZ6wzh8+TkwZ4wnrfLL1d+wYT1jn8fZeHgtLPo+FVXz9inf/ltQu0U9CjHhrbyUY1ttKMCyihWC8tbcSDC/3SjDs1SvBsAGvBOOqWQjGdbMQjCun2e28D9tLHIwrZyEYV85CMK6cPBhv7a0E48r5ebC1P8Yfzf5+bt77WYPW2y0Vfy5ZKv5QslSMR/JY/IHMY//4x/8HNPX7fw==",
900
+ "eJzVnd2uI8mVnd+lrxsGI/Zv6FUMXwj2GBhgoDEs3Ql690kZPKfa6KSyVjMzudZVFw4Y2TsqDvfOWszv499/+Y///J9//tu//+df/vrLn/7+y+O/1eOXP/33v//y1//z57/88wd//duf/+/ffvnT49df/u0v/2v77z9+/eV///t//Nsvf5oP+8f/+PWfCwa6YKILDF3g6IJAF+TPL/j1d68blfl86ajl36+29bx6XXr1vvTq68qrN/Db+QeuDvwq/4GrA7/3f+DqwJvkD1wdeEf9gasDb78/cPVL36t96Xu1L32v9qXv1XXpe3Vd+l5dl75X16Xv1XXpe3Vd+l5db71X5+MRz5fOx6zfXn2vFI/vUjy/X7y+SnnrjX1uKW91gXNLeatlnFrKeLzVYE6u5a12dHItbzWvk2t5q9WdXMtbjfHkWt5qoyfXwtN0x4On644HT9sdD6K+O4j67iDqu4Oo7w6ivjuI+u4g6ruDqO8Oor47iPruIOq7k6jvTqK+O4n67iTqu5Oo706ivjuJ+u4k6ruTqO9Oor5rRH3XiPquEfVdI+q7RtR3jajvGlHfNaK+a0R914j6rhP1XSfqu07Ud52o7zpR33WivutEfdeJ+q4T9V0n6rtB1HeDqO8GUd8Nor4bRH03iPpuEPXdIOq7QdR3g6jvJlHfTaK+m0R9N4n6bhL13STqu0nUd5Oo7yZR302ivosgD5fXQtR3EVDj8lqI+u57eAZYy5pftfSwnVrufE8f1PIePgHVMv37jLY/7pzRe7DFybXc97t7XMt99wzHtdx3z3Bcy333DP3or+tuf5w/asmvWu7rL8e13Ndfpn/XMsMfvz0j6MXPwu+7wTi38PewmesKH+Oxxlf/HyNip/Q7B8DJpd85L04uHYVXB0LZPFcALem5AmgczxXAO/b/rZgIAPJcgcLKE4EpnitQXHk+gKH8XIGe+UQe8n+uQM98Ig/MP1fAZ448fP5cAZ858iD3cwV85shD0c8V8JkjDxg/V8Bnjjys+1wBnzny4OtzBXzmyEOkzxXwmSMPZD5XwGeOPNz4XAGfOfKg4HMFfObIQ3fPFfCZIw+wPVfAZ448DPZcAZ858mDVcwV85shDSs8V8JkjD/w8V8Bnjjw881wBnznyIMpzBXzmyEMdzxXwmSMPSDxXwGeOPGzwXAGfOfLB/XMFfObIh+DPFfCZIx8oP1fAZ458OPtcAZ858kHncwV85siHhs8V8JkjH8A9V8BnjnyY9VwBnznywdBzBXzmsFdqwmKpCZulJqyWmrBbasJyqYnYpZ4r4DNHPjh4roDPHLE1PVfAZ44E/c8V8JkjoflzBXzmSAD9XAGfORLmPlfAZ47El88V8JkjYd1zBXzmiEXnuQI+cziHm3AON+EcbsI5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nME5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5nMM5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMA5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XMI5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XME5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5XMM5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P77T38QU+xWNmV/XHmb225p+/2ILe77Wlv9oM4/v8s++V7i5/LPvFG4u/+z7hJvLP/su4ebyz75HuLn8s+8Qbi7/7LF/c/lnz/Kbyz97QN9b/gvnl0z52lP3he9LpnztqfvC9SVTvvbUfeH5kilfe+q+cHzJlK89dV/4vWTK1566L9xeMuVrT90XXi+Z8rWn7gunl0z52lP3hc9LpnztqfvC5SVTvvbUfeHxkilfe+q+cHjJlK89dV/4u2TK1566L9xdMuVrT90X3i6Z8rWn7gtnl0z52lP3ha9LpnztqfvC1SVTvvbUfeHpkilfe+q+cHTJlK89dV/4uWTK1566L9xcMuVrT90XXi6Z8rWn7gsnl0z52lP3hY9LpnztqfvCxSVTvvbUfeHhkilfe+q+cHDJlK89dV/4t2TK1566L9xbMuVrT90X3i2Z8rWn7gvnlkz52lP3hW9LpnztqfvCtSVTvvLUtcfpnq2by1eeulv5ylN3K1956m7lK0/drXzlqbuVrzx1t/KVp+5WvvLU3crXnrqnO7VuLl976p7u07q5fO2pe7pL6+bytafu6R6tm8vXnrqnG69uLl976kq7qbbytaeutJtqK1976kq7qbbytaeutJtqK1976kq7qbbytaeutJtqK1976kq7qbbytaeutJtqK1976kq7qbbytaeutJtqK1976kq7qbbytaeutJtqK1976kq7qbbytaeutJtqK1976kq7qbbytaeutJtqK1976kq7qbbytaeutJtqK1976kq7qbbytaeutJtqK1976kq7qbbytaeutJtqK1976kq7qbbytaeutJtqK1976kq7qbbytaeutJtqK1976kq7qbbytaeutJtqK1976kq7qbbytaeutJtqK1976kq7qbbytaeutJtqK5976vrj8Xytj/Xb8neuW19FjK4fV+3vnXIP6DN3yj3Lz9wp99j/YztdsbdT7juEE3d6unplxsFOO9fzxWs8flS0+5cyHuvr2+7HGPHj0mt9b+Dso7p9A2ffzt2+gbNv6G7ewDhdwXL7Bs6+qbt9A2ff1t2+gbNv7G7fwNn3a7dv4OzbsNs3ID6Jx+lClts3ID6Jx+lSlrs3cLqW5fYNqE/i09Ust2/g9km8Or5qevj81zvo8O/NjqO/GPvaa2//XvvNPwi/dnr7yP7YTm+f7R/b6e03AR/b6e13Cx/b6e23FR/bqfRHO0NbTzO09TRDW08ztPU0Q1tPM7T1NENbTzO09TRDW08ztPU0Q1tPM7T1NENbTzO09TRDW08ztPU0Q1tPM7T1NENbTzO09TRDW08ztPU0Q1tPM7T1NENbTzO09TRDW08ztPU0Q1tPM7T1NENbTzO09TRDW08ztPU0Q1tPM7T1NENbTzO09TRDW08ztPU0Q1tPM7T1NENbTzO09TRDW08ztPU0Q1tPM7T1NENbTzO09TRDW08ztPU0Q1tPM7T1NENbTzO09TRDW08ztPU0Q1tPM7T1NENbTzO09TRDW08zyPU0h+VrT11ykcxh+dpTl1z5cli+9tRt7am7tKfu0p66S3vqLu2pu7Sn7tKeuqf7u24uX3vqnu7uurl86ak7T/d23Vy+9NSdpzu7bi5feurOh/TUnafbum4uX3rqztNNXTeXLz115+mWrnvLP93RdXP52lP3dD/XzeVrT93TlVs3l689dU+XY91cvvbUPV1jdXP52lNX2001td1UU9tNNbXdVFPbTTW13VRT2001td1UU9tNNbXdVFPbTTW13VRT2001td1UU9tNNbXdVFPbTTW13VRT2001td1UU9tNNbXdVFPbTTW13VRT2001td1UU9tNNbXdVFPbTTW13VRT2001td1UU9tNNbXdVFPbTTW13VRT2001td1UU9tNNbXdVFPbTTW13VRT2001td1UU9tNNbXdVFPbTTW13VRT2001td1UU9tNNbXdVFPbTTW13VRT2001td1UU9tNNbXdVFPbTTW13VRT2001td1UU9tNNbXdVFPbTTW13VRT2001td1UU9tNNbXdVFPbTTW13VRT2001td1UU9tNNbXdVFPbTTW13VRT2001td1URu6m8sfj+Vof67fl71y3vooYXT+u2t875R7QZ+6Ue5afuVPusf/Hdrpib6fcdwgn7nRfvfJ1+cfBHmPV85U5frw2vvvdvhnltKvv3giddvXd+5TTrr57G3Ha1Xen/GlX3x3CZ11932lx2tV359JpV9+dBadd/dL36r5P4bSrX/pe3bcRnHb1S9+r+yz/aVe/9L26T8KfdvVL36v7HPlpV7/0vbpPYZ929Uvfq/sM82lXv/S9uk8An3b1S9+r+/zsaVe/8L3q472/mfl4xNed+GP++JeNrb0b5vb1/a+g+HHptb6Kee8v8uxi3vp7P7uYt1rq2cW81YHPLuathg0W0z/+yTd8r5i3+vvZxbw1Ds4u5q3pcXYxbw2bs4u5swMfFbMPpV5TzLLxXUztvbX3EdNPFXNfn5mPMb5fPOZeMff1mZ8o5r4+8xPF3NdnfqKY+/rMTxRzX585LmYfw/tUMff1mZ8o5r47vZ8o5r47vZ8ohqkD78NonyqGqQPvg2KfKoapA+9DXB8qZh/J+lQxTB14H5f6VDFMHXgfZfpUMUwdeB8z+lQxTB14HwH6VDFMHXgfz/lUMUwdeB+d+VQxTB14H2v5VDFMHXgfOflUMUwdeB8H+VQxTB14H9X4VDFMHXgfo/hUMUwdeB9x+FQxTB14Hz/4VDFMHXgfDfhUMUQd+MVXSn+qGKIO/OLrnj9VDFEHfvFVzJ8qhqgDv/ia5E8VQ9SBX3yF8aeKYerA+18v/KlimDrw/lf/fqoYpg78HnxydjFMHfg9tOXsYpg68HvgzNnFMHXg97Ccs4th6sDvQT9nF8PUgd9Dis4uhqkDvwcsnV0MUwd+D4c6uximDvwebHV2MUwd+D2U6+ximDrwe6DY2cUwdeD3MLSzi2HqwO9BbmcXw9SBbyS/fqIYpg58I/n1E8UwdeAbya+fKIapA99Ifv1EMUwd+Eby6yeKYerAN5JfP1EMUwfe/6rATxXD1IGZmLgXX8r3qWKYOjATE/fi6+8+VQxTB2Zi4l580dynimHqwExM3IuvdPtUMUwdmImJe/HlaZ8qhqkDMzFxL76m7FPFMHVgJibuxReCfaoYpg7MxMS9+OqtTxXD1IGZmLgXX3L1oWKYmLgXX0D1qWKYOjATE/fiq54+VQxTB2Zi4l58qdKnimHqwExM3IuvL/pUMUwdmImJe/FFQZ8qhqkDMzFxL75V5aJisr5f3Ov3xbz4jpRPFXPjL/AM/3rxjNgr5sZf4ONibvwFPi7mxluI42JuvIU4Lua+W4h+9Nd1tz/+ps/kdzH39ZnjYu5Eiszz68X+z8v9OKbfv3iMx/rq12OM3VO9k0A6vfYbb1BOr/3GcXB67TdOj9Nrv3HYvK79q5gb+/txMTf+E/G4mBvvIw+LuRNYOi6GomF/FUPRgb+KubGlun+/2D33irmxRx4Xc2PTOy7mxjvs42Ju7MDHxdzYgY+LubEDHxZzJ7B0XMyNHfi4mBs78HExTB34TmDpuBimDnwnsHRcDFMHvhNYOi6GqQPfCSwdF8PUge8Elo6LYerAdwJLx8UwdeA7gaXjYpg68J3A0nExTB34TmDpuBimDnwnsHRcDFMHvhNYOi7mxj4z5tfXKM79HPhOLOe4mBv7zGExd2I5x8Xc2GeOi7mxzxwXc2Of+f+K2Xu44U4s57iYG+/0jou58U7vuJhPdeDdYu7swP3j4YaxN5vuxHIOi7kTPjku5s4+c1jMnX3msJg7+8xhMXf2mcNibn1u6bvPzNoblHfCJ8fF3NhnDou5Ez45LubGO73jYm7swMfF3Prk6FExN3bg42JufXL0qJhbnxw9KoapA98JnxwXw9SB74RPjoth6sB3wieHjz7fCZ8cF3NrBz4qhunZ/Tu/kOm4GKZn9+/8QqbjYm7twP+6GL+TETou5tYOfFQMUQd2JnrKH0Qd2JnoKWeip5yJnvI7v5DpuBimDnwnPXVcDFMHvpNvOi6GqQPfSSAdF8PUge/8QqbjYpg68J1803ExTB34Tr7puBimDnwnUnRcDFPT2wdn5uPbguD+Y9Xje9Xue/Bw1e6b5WjVPjNyuGr31+9w1e6kfr3qH//4L/k7cVA=",
901
+ "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h2uYwzXM4RrmcA1zuIY5XMMcrmEO1zCHa5jDNczhGuZwDXO4hjlcwxyuYQ7XMIdrmMM1zOEa5nANc7iGOVzDHK5hDtcwh2uYwzXM4RrmcA1zuIY5XMMcrmEO1zCHa5jDNczhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhFszhxgsGcdsR9K5vR9Dbvh1B7/t2BL3x2xH0zm9H0Fu/HUHv/XYEvfnbEfzuw0huO4LffRjKbUfwuw9jue0IfvdhMLcdwe8+jOa2I/jdh+HcdgS/+zCe247gdx8GdNsR/O7DiG47gt99GNJtR/C7D2O67Qh+92FQtx3B7z6M6rYj+N2HYd12BL/7MK7bjuB3HwZ22xH87sPIbjuC330Y2m1H8LsPY7vtCH73YXC3HcHvPozutiP43Yfh3XYEv/swvtuO4HcfBnjbEfzuwwhvO4LffRjibUfwuw9jvO0IfvdhkLcdwe8+jPK2I/jdh2HedgS/+zDO247gdx8GetsR/O7DSG87gt99GOptR/C7D2O97Qh+92Gwtx3B7z6M9rYj+N2H4d52BL/7MN7bjuB3HwZ82xH87sOIbzuC330Y8m1H8LsPY77tCH73YdC3HcHvPoz6tiPw3R846xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xs46xsI6/vDv3zczFnz/bHb/+78/vj0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"
902
+ ],
903
+ "fileMap": {
904
+ "15": {
905
+ "source": "impl Field {\n pub fn to_le_bits(self: Self, bit_size: u32) -> [u1] {\n crate::assert_constant(bit_size);\n self.__to_le_bits(bit_size)\n }\n \n pub fn to_be_bits(self: Self, bit_size: u32) -> [u1] {\n crate::assert_constant(bit_size);\n self.__to_be_bits(bit_size)\n }\n\n #[builtin(to_le_bits)]\n fn __to_le_bits(_self: Self, _bit_size: u32) -> [u1] {}\n \n #[builtin(to_be_bits)]\n fn __to_be_bits(_self: Self, _bit_size: u32) -> [u1] {}\n\n pub fn to_le_bytes(self: Self, byte_size: u32) -> [u8] {\n self.to_le_radix(256, byte_size)\n }\n\n pub fn to_be_bytes(self: Self, byte_size: u32) -> [u8] {\n self.to_be_radix(256, byte_size)\n }\n\n\n pub fn to_le_radix(self: Self, radix: u32, result_len: u32) -> [u8] {\n crate::assert_constant(radix);\n crate::assert_constant(result_len);\n self.__to_le_radix(radix, result_len)\n }\n\n pub fn to_be_radix(self: Self, radix: u32, result_len: u32) -> [u8] {\n crate::assert_constant(radix);\n crate::assert_constant(result_len);\n self.__to_be_radix(radix, result_len)\n }\n\n\n\n // decompose `_self` into a `_result_len` vector over the `_radix` basis\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(_self: Self, _radix: u32, _result_len: u32) -> [u8] {}\n \n #[builtin(to_be_radix)]\n fn __to_be_radix(_self: Self, _radix: u32, _result_len: u32) -> [u8] {}\n\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b = exponent.to_le_bits(32);\n\n for i in 1..33 {\n r *= r;\n r = (b[32-i] as Field) * (r * self) + (1 - b[32-i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x ∈ {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n}\n\n#[builtin(modulus_num_bits)]\npub fn modulus_num_bits() -> Field {}\n\n#[builtin(modulus_be_bits)]\npub fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub fn modulus_le_bytes() -> [u8] {}\n// Convert a 32 byte array to a field element\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n",
906
+ "path": "std/field.nr"
907
+ },
908
+ "16": {
909
+ "source": "struct GrumpkinScalar {\n low: Field,\n high: Field,\n}\n\nimpl GrumpkinScalar {\n pub fn new(low: Field, high: Field) -> Self {\n // TODO: check that the low and high value fit within the grumpkin modulus\n GrumpkinScalar { low, high }\n }\n}\n\nglobal GRUMPKIN_SCALAR_SERIALIZED_LEN: Field = 2;\n\npub fn deserialize_grumpkin_scalar(fields: [Field; GRUMPKIN_SCALAR_SERIALIZED_LEN]) -> GrumpkinScalar {\n GrumpkinScalar { low: fields[0], high: fields[1] }\n}\n\npub fn serialize_grumpkin_scalar(scalar: GrumpkinScalar) -> [Field; GRUMPKIN_SCALAR_SERIALIZED_LEN] {\n [scalar.low, scalar.high]\n}\n",
910
+ "path": "std/grumpkin_scalar.nr"
911
+ },
912
+ "17": {
913
+ "source": "use crate::grumpkin_scalar::GrumpkinScalar;\nuse crate::scalar_mul::fixed_base_embedded_curve;\n\npub fn grumpkin_fixed_base(scalar: GrumpkinScalar) -> [Field; 2] {\n // TODO: this should use both the low and high limbs to do the scalar multiplication\n fixed_base_embedded_curve(scalar.low, scalar.high)\n}\n",
914
+ "path": "std/grumpkin_scalar_mul.nr"
915
+ },
916
+ "27": {
917
+ "source": "struct Option<T> {\n _is_some: bool,\n _value: T,\n}\n\nimpl<T> Option<T> {\n /// Constructs a None value\n pub fn none() -> Self {\n Self { _is_some: false, _value: crate::unsafe::zeroed() }\n }\n\n /// Constructs a Some wrapper around the given value\n pub fn some(_value: T) -> Self {\n Self { _is_some: true, _value }\n }\n\n /// True if this Option is None\n pub fn is_none(self) -> bool {\n !self._is_some\n }\n\n /// True if this Option is Some\n pub fn is_some(self) -> bool {\n self._is_some\n }\n\n /// Asserts `self.is_some()` and returns the wrapped value.\n pub fn unwrap(self) -> T {\n assert(self._is_some);\n self._value\n }\n\n /// Returns the inner value without asserting `self.is_some()`\n /// Note that if `self` is `None`, there is no guarantee what value will be returned,\n /// only that it will be of type `T`.\n pub fn unwrap_unchecked(self) -> T {\n self._value\n }\n\n /// Returns the wrapped value if `self.is_some()`. Otherwise, returns the given default value.\n pub fn unwrap_or(self, default: T) -> T {\n if self._is_some {\n self._value\n } else {\n default\n }\n }\n\n /// Returns the wrapped value if `self.is_some()`. Otherwise, calls the given function to return\n /// a default value.\n pub fn unwrap_or_else<Env>(self, default: fn[Env]() -> T) -> T {\n if self._is_some {\n self._value\n } else {\n default()\n }\n }\n\n /// If self is `Some(x)`, this returns `Some(f(x))`. Otherwise, this returns `None`.\n pub fn map<U, Env>(self, f: fn[Env](T) -> U) -> Option<U> {\n if self._is_some {\n Option::some(f(self._value))\n } else {\n Option::none()\n }\n }\n\n /// If self is `Some(x)`, this returns `f(x)`. Otherwise, this returns the given default value.\n pub fn map_or<U, Env>(self, default: U, f: fn[Env](T) -> U) -> U {\n if self._is_some {\n f(self._value)\n } else {\n default\n }\n }\n\n /// If self is `Some(x)`, this returns `f(x)`. Otherwise, this returns `default()`.\n pub fn map_or_else<U, Env1, Env2>(self, default: fn[Env1]() -> U, f: fn[Env2](T) -> U) -> U {\n if self._is_some {\n f(self._value)\n } else {\n default()\n }\n }\n\n /// Returns None if self is None. Otherwise, this returns `other`.\n pub fn and(self, other: Self) -> Self {\n if self.is_none() {\n Option::none()\n } else {\n other\n }\n }\n\n /// If self is None, this returns None. Otherwise, this calls the given function\n /// with the Some value contained within self, and returns the result of that call.\n ///\n /// In some languages this function is called `flat_map` or `bind`.\n pub fn and_then<U, Env>(self, f: fn[Env](T) -> Option<U>) -> Option<U> {\n if self._is_some {\n f(self._value)\n } else {\n Option::none()\n }\n }\n\n /// If self is Some, return self. Otherwise, return `other`.\n pub fn or(self, other: Self) -> Self {\n if self._is_some {\n self\n } else {\n other\n }\n }\n\n /// If self is Some, return self. Otherwise, return `default()`.\n pub fn or_else<U, Env>(self, default: fn[Env]() -> Self) -> Self {\n if self._is_some {\n self\n } else {\n default()\n }\n }\n\n // If only one of the two Options is Some, return that option.\n // Otherwise, if both options are Some or both are None, None is returned.\n pub fn xor(self, other: Self) -> Self {\n if self._is_some {\n if other._is_some {\n Option::none()\n } else {\n self\n }\n } else if other._is_some {\n other\n } else {\n Option::none()\n }\n }\n\n /// Returns `Some(x)` if self is `Some(x)` and `predicate(x)` is true.\n /// Otherwise, this returns `None`\n pub fn filter<Env>(self, predicate: fn[Env](T) -> bool) -> Self {\n if self._is_some {\n if predicate(self._value) {\n self\n } else {\n Option::none()\n }\n } else {\n Option::none()\n }\n }\n\n /// Flattens an Option<Option<T>> into a Option<T>.\n /// This returns None if the outer Option is None. Otherwise, this returns the inner Option.\n pub fn flatten(option: Option<Option<T>>) -> Option<T> {\n if option._is_some {\n option._value\n } else {\n Option::none()\n }\n }\n}\n",
918
+ "path": "std/option.nr"
919
+ },
920
+ "38": {
921
+ "source": "use crate::context::{PrivateContext, PublicContext};\nuse crate::oracle;\nuse dep::protocol_types::{\n address::AztecAddress,\n grumpkin_point::GrumpkinPoint,\n};\n\npub fn emit_encrypted_log<N>(\n context: &mut PrivateContext,\n contract_address: AztecAddress,\n storage_slot: Field,\n encryption_pub_key: GrumpkinPoint,\n log: [Field; N]\n) {\n let _ = oracle::logs::emit_encrypted_log(contract_address, storage_slot, encryption_pub_key, log);\n context.accumulate_encrypted_logs(log);\n}\n\npub fn emit_unencrypted_log<T>(context: &mut PublicContext, log: T) {\n let contract_address = context.this_address();\n let event_selector = 5; // TODO: compute actual event selector.\n let _ = oracle::logs::emit_unencrypted_log(contract_address, event_selector, log);\n // context.accumulate_unencrypted_logs(log);\n}\n\n// TODO: We might want to remove this since emitting unencrypted logs from private functions is violating privacy.\n// --> might be a better approach to force devs to make a public function call that emits the log if needed then\n// it would be less easy to accidentally leak information.\n// If we decide to keep this function around would make sense to wait for traits and then merge it with emit_unencrypted_log.\npub fn emit_unencrypted_log_from_private<T>(context: &mut PrivateContext, log: T) {\n let contract_address = context.this_address();\n let event_selector = 5; // TODO: compute actual event selector.\n let _ = oracle::logs::emit_unencrypted_log(contract_address, event_selector, log);\n // context.accumulate_unencrypted_logs(log);\n}\n",
922
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/log.nr"
923
+ },
924
+ "39": {
925
+ "source": "use dep::protocol_types::{\n abis::{\n block_header::BlockHeader,\n call_context::CallContext,\n private_circuit_public_inputs::PrivateCircuitPublicInputs,\n public_circuit_public_inputs::PublicCircuitPublicInputs,\n },\n contrakt::deployment_data::ContractDeploymentData,\n hash::hash_args,\n};\n\n// docs:start:private-global-variables\nstruct PrivateGlobalVariables {\n chain_id: Field,\n version: Field,\n}\n// docs:end:private-global-variables\n\nimpl PrivateGlobalVariables {\n fn serialize(self) -> [Field; 2] {\n [self.chain_id, self.version]\n }\n}\n\n// docs:start:public-global-variables\nstruct PublicGlobalVariables {\n chain_id: Field,\n version: Field,\n block_number: Field,\n timestamp: Field,\n}\n// docs:end:public-global-variables\n\nimpl PublicGlobalVariables {\n fn serialize(self) -> [Field; 4] {\n [self.chain_id, self.version, self.block_number, self.timestamp]\n }\n}\n\n// PrivateContextInputs are expected to be provided to each private function\n// docs:start:private-context-inputs\nstruct PrivateContextInputs {\n call_context : CallContext,\n block_header: BlockHeader,\n contract_deployment_data: ContractDeploymentData,\n private_global_variables: PrivateGlobalVariables,\n}\n// docs:end:private-context-inputs\n\n// PublicContextInputs are expected to be provided to each public function\n// docs:start:public-context-inputs\nstruct PublicContextInputs {\n call_context: CallContext,\n block_header: BlockHeader,\n\n public_global_variables: PublicGlobalVariables,\n}\n// docs:end:public-context-inputs\n\nstruct Hasher {\n fields: [Field],\n}\n\nimpl Hasher {\n pub fn new()-> Self {\n Self { fields: [] }\n }\n\n pub fn add(&mut self, field: Field) {\n self.fields = self.fields.push_back(field);\n }\n\n pub fn add_multiple<N>(&mut self, fields: [Field; N]) {\n for i in 0..N {\n self.fields = self.fields.push_back(fields[i]);\n }\n }\n\n pub fn hash(self) -> Field {\n hash_args(self.fields)\n }\n}\n",
926
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/abi.nr"
927
+ },
928
+ "40": {
929
+ "source": "use dep::std::option::Option;\nuse dep::protocol_types::{\n address::AztecAddress,\n};\n\nuse crate::context::{PrivateContext, Context};\nuse crate::note::{\n lifecycle::create_note,\n note_getter::{get_note, view_notes},\n note_interface::NoteInterface,\n note_viewer_options::NoteViewerOptions,\n};\nuse crate::oracle::notes::check_nullifier_exists;\nuse crate::state_vars::singleton::compute_singleton_initialization_nullifier;\n\n// docs:start:struct\nstruct ImmutableSingleton<Note, N> {\n context: Option<&mut PrivateContext>,\n storage_slot: Field,\n note_interface: NoteInterface<Note, N>,\n compute_initialization_nullifier: fn (Field, Option<AztecAddress>) -> Field,\n}\n// docs:end:struct\n\nimpl<Note, N> ImmutableSingleton<Note, N> {\n // docs:start:new\n pub fn new(\n context: Context,\n storage_slot: Field,\n note_interface: NoteInterface<Note, N>,\n ) -> Self {\n assert(storage_slot != 0, \"Storage slot 0 not allowed. Storage slots must start from 1.\");\n ImmutableSingleton {\n context: context.private,\n storage_slot,\n note_interface,\n compute_initialization_nullifier: compute_singleton_initialization_nullifier,\n }\n }\n // docs:end:new\n\n // docs:start:is_initialized\n unconstrained pub fn is_initialized(self, owner: Option<AztecAddress>) -> bool {\n let compute_initialization_nullifier = self.compute_initialization_nullifier;\n let nullifier = compute_initialization_nullifier(self.storage_slot, owner);\n check_nullifier_exists(nullifier)\n }\n // docs:end:is_initialized\n\n // docs:start:initialize\n pub fn initialize(\n self,\n note: &mut Note, \n owner: Option<AztecAddress>,\n broadcast: bool,\n ) {\n let context = self.context.unwrap();\n\n // Nullify the storage slot.\n let compute_initialization_nullifier = self.compute_initialization_nullifier;\n let nullifier = compute_initialization_nullifier(self.storage_slot, owner);\n context.push_new_nullifier(nullifier, 0);\n\n create_note(\n context,\n self.storage_slot,\n note,\n self.note_interface,\n broadcast,\n );\n }\n // docs:end:initialize\n\n // docs:start:get_note\n pub fn get_note(self) -> Note {\n let context = self.context.unwrap();\n let storage_slot = self.storage_slot;\n get_note(context, storage_slot, self.note_interface)\n }\n // docs:end:get_note\n\n // docs:start:view_note\n unconstrained pub fn view_note(self) -> Note {\n let options = NoteViewerOptions::new().set_limit(1);\n view_notes(self.storage_slot, self.note_interface, options)[0].unwrap()\n }\n // docs:end:view_note\n}\n",
930
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/state_vars/immutable_singleton.nr"
931
+ },
932
+ "41": {
933
+ "source": "use crate::context::{Context};\nuse crate::oracle::storage::storage_read;\nuse crate::oracle::storage::storage_write;\nuse crate::types::type_serialization::TypeSerializationInterface;\nuse dep::std::option::Option;\n\n// docs:start:public_state_struct\nstruct PublicState<T, T_SERIALIZED_LEN> {\n context: Context,\n storage_slot: Field,\n serialization_methods: TypeSerializationInterface<T, T_SERIALIZED_LEN>,\n}\n// docs:end:public_state_struct\n\nimpl<T, T_SERIALIZED_LEN> PublicState<T, T_SERIALIZED_LEN> {\n // docs:start:public_state_struct_new\n pub fn new(\n // Note: Passing the contexts to new(...) just to have an interface compatible with a Map.\n context: Context,\n storage_slot: Field,\n serialization_methods: TypeSerializationInterface<T, T_SERIALIZED_LEN>,\n ) -> Self {\n assert(storage_slot != 0, \"Storage slot 0 not allowed. Storage slots must start from 1.\");\n PublicState {\n context,\n storage_slot,\n serialization_methods,\n }\n }\n // docs:end:public_state_struct_new\n\n // docs:start:public_state_struct_read\n pub fn read(self) -> T {\n assert(self.context.private.is_none(), \"Public state writes only supported in public functions\");\n storage_read(self.storage_slot, self.serialization_methods.deserialize)\n }\n // docs:end:public_state_struct_read\n\n // docs:start:public_state_struct_write\n pub fn write(self, value: T) {\n assert(self.context.private.is_none(), \"Public state writes only supported in public functions\");\n let serialize = self.serialization_methods.serialize;\n let fields = serialize(value);\n storage_write(self.storage_slot, fields);\n }\n // docs:end:public_state_struct_write\n}\n",
934
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/state_vars/public_state.nr"
935
+ },
936
+ "42": {
937
+ "source": "use crate::context::{PrivateContext, PublicContext, Context};\nuse dep::std::option::Option;\nuse dep::protocol_types::hash::pedersen_hash;\n\n// docs:start:map\nstruct Map<V> {\n context: Context,\n storage_slot: Field,\n state_var_constructor: fn(Context, Field) -> V,\n}\n// docs:end:map\n\nimpl<V> Map<V> {\n // docs:start:new\n pub fn new(\n context: Context,\n storage_slot: Field,\n state_var_constructor: fn(Context, Field) -> V,\n ) -> Map<V> {\n assert(storage_slot != 0, \"Storage slot 0 not allowed. Storage slots must start from 1.\");\n Map {\n context,\n storage_slot,\n state_var_constructor,\n }\n }\n // docs:end:new\n\n // docs:start:at\n pub fn at(self, key: Field) -> V {\n // TODO(#1204): use a generator index for the storage slot\n let derived_storage_slot = pedersen_hash([self.storage_slot, key],0);\n\n let state_var_constructor = self.state_var_constructor;\n state_var_constructor(self.context, derived_storage_slot)\n }\n // docs:end:at\n}\n",
938
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/state_vars/map.nr"
939
+ },
940
+ "43": {
941
+ "source": "use dep::std::option::Option;\n\nuse dep::protocol_types::{\n address::AztecAddress,\n constants::{\n GENERATOR_INDEX__INITIALIZATION_NULLIFIER,\n },\n hash::pedersen_hash,\n};\n\nuse crate::context::{PrivateContext, PublicContext, Context};\nuse crate::note::{\n lifecycle::{create_note, destroy_note},\n note_getter::{get_note, view_notes},\n note_interface::NoteInterface,\n note_viewer_options::NoteViewerOptions,\n};\nuse crate::oracle::{\n get_secret_key::get_secret_key,\n notes::check_nullifier_exists,\n};\n\npub fn compute_singleton_initialization_nullifier(storage_slot: Field, owner: Option<AztecAddress>) -> Field {\n if owner.is_some() {\n let secret = get_secret_key(owner.unwrap_unchecked());\n pedersen_hash(\n [storage_slot, secret.low, secret.high],\n GENERATOR_INDEX__INITIALIZATION_NULLIFIER\n )\n } else {\n pedersen_hash([storage_slot], GENERATOR_INDEX__INITIALIZATION_NULLIFIER)\n }\n}\n\n// docs:start:struct\nstruct Singleton<Note, N> {\n context: Option<&mut PrivateContext>,\n storage_slot: Field,\n note_interface: NoteInterface<Note, N>,\n compute_initialization_nullifier: fn (Field, Option<AztecAddress>) -> Field,\n}\n// docs:end:struct\n\nimpl<Note, N> Singleton<Note, N> {\n // docs:start:new\n pub fn new(\n context: Context,\n storage_slot: Field,\n note_interface: NoteInterface<Note, N>,\n ) -> Self {\n assert(storage_slot != 0, \"Storage slot 0 not allowed. Storage slots must start from 1.\");\n Singleton {\n context: context.private,\n storage_slot,\n note_interface,\n compute_initialization_nullifier: compute_singleton_initialization_nullifier,\n }\n }\n // docs:end:new\n\n // docs:start:is_initialized\n unconstrained pub fn is_initialized(self, owner: Option<AztecAddress>) -> bool {\n let compute_initialization_nullifier = self.compute_initialization_nullifier;\n let nullifier = compute_initialization_nullifier(self.storage_slot, owner);\n check_nullifier_exists(nullifier)\n }\n // docs:end:is_initialized\n\n // docs:start:initialize\n pub fn initialize(\n self,\n note: &mut Note,\n owner: Option<AztecAddress>,\n broadcast: bool,\n ) {\n let context = self.context.unwrap();\n\n // Nullify the storage slot.\n let compute_initialization_nullifier = self.compute_initialization_nullifier;\n let nullifier = compute_initialization_nullifier(self.storage_slot, owner);\n context.push_new_nullifier(nullifier, 0);\n\n create_note(context, self.storage_slot, note, self.note_interface, broadcast);\n }\n // docs:end:initialize\n\n // docs:start:replace\n pub fn replace(\n self,\n new_note: &mut Note,\n broadcast: bool,\n ) {\n let context = self.context.unwrap();\n let prev_note = get_note(context, self.storage_slot, self.note_interface);\n\n // Nullify previous note.\n destroy_note(context, prev_note, self.note_interface);\n\n // Add replacement note.\n create_note(context, self.storage_slot, new_note, self.note_interface, broadcast);\n }\n // docs:end:replace\n\n // docs:start:get_note\n pub fn get_note(self, broadcast: bool) -> Note {\n let context = self.context.unwrap();\n let mut note = get_note(context, self.storage_slot, self.note_interface);\n\n // Nullify current note to make sure it's reading the latest note.\n destroy_note(context, note, self.note_interface);\n\n // Add the same note again.\n // Because a nonce is added to every note in the kernel, its nullifier will be different.\n create_note(context, self.storage_slot, &mut note, self.note_interface, broadcast);\n\n note\n }\n // docs:end:get_note\n\n // docs:start:view_note\n unconstrained pub fn view_note(self) -> Note {\n let options = NoteViewerOptions::new().set_limit(1);\n view_notes(self.storage_slot, self.note_interface, options)[0].unwrap()\n }\n // docs:end:view_note\n}\n",
942
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/state_vars/singleton.nr"
943
+ },
944
+ "48": {
945
+ "source": "use crate::types::type_serialization::TypeSerializationInterface;\n\nglobal BOOL_SERIALIZED_LEN: Field = 1;\n\nfn deserializeBool(fields: [Field; BOOL_SERIALIZED_LEN]) -> bool {\n fields[0] as bool\n}\n\nfn serializeBool(value: bool) -> [Field; BOOL_SERIALIZED_LEN] {\n [value as Field]\n}\n\nglobal BoolSerializationMethods = TypeSerializationInterface {\n deserialize: deserializeBool,\n serialize: serializeBool,\n};\n",
946
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/types/type_serialization/bool_serialization.nr"
947
+ },
948
+ "50": {
949
+ "source": "struct BoundedVec<T, MaxLen> {\n storage: [T; MaxLen],\n len: Field,\n}\n\nimpl<T, MaxLen> BoundedVec<T, MaxLen> {\n pub fn new(initial_value: T) -> Self {\n BoundedVec { storage: [initial_value; MaxLen], len: 0 }\n }\n\n pub fn get(mut self: Self, index: Field) -> T {\n assert(index as u64 < self.len as u64);\n self.storage[index]\n }\n\n pub fn get_unchecked(mut self: Self, index: Field) -> T {\n self.storage[index]\n }\n\n pub fn push(&mut self, elem: T) {\n assert(self.len as u64 < MaxLen as u64);\n\n self.storage[self.len] = elem;\n self.len += 1;\n }\n\n pub fn push_array<Len>(&mut self, array: [T; Len]) {\n let newLen = self.len + array.len();\n assert(newLen as u64 <= MaxLen as u64);\n for i in 0..array.len() {\n self.storage[self.len + i] = array[i];\n }\n self.len = newLen;\n }\n\n pub fn pop(&mut self) -> T {\n assert(self.len as u64 > 0);\n\n let elem = self.storage[self.len - 1];\n self.len -= 1;\n elem\n }\n\n pub fn any<Env>(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n let mut exceeded_len = false;\n for i in 0..MaxLen {\n exceeded_len |= i == self.len;\n if (!exceeded_len) {\n ret |= predicate(self.storage[i]);\n }\n }\n ret\n }\n}\n\n#[test]\nfn test_vec_push_pop() {\n let mut vec: BoundedVec<Field, 3> = BoundedVec::new(0);\n assert(vec.len == 0);\n vec.push(2);\n assert(vec.len == 1);\n vec.push(4);\n assert(vec.len == 2);\n vec.push(6);\n assert(vec.len == 3);\n let x = vec.pop();\n assert(x == 6);\n assert(vec.len == 2);\n assert(vec.get(0) == 2);\n assert(vec.get(1) == 4);\n}\n\n#[test]\nfn test_vec_push_array() {\n let mut vec: BoundedVec<Field, 3> = BoundedVec::new(0);\n vec.push_array([2, 4]);\n assert(vec.len == 2);\n assert(vec.get(0) == 2);\n assert(vec.get(1) == 4);\n}\n\n#[test(should_fail)]\nfn test_vec_get_out_of_bound() {\n let mut vec: BoundedVec<Field, 2> = BoundedVec::new(0);\n vec.push_array([2, 4]);\n let _x = vec.get(2);\n}\n\n#[test(should_fail)]\nfn test_vec_get_not_declared() {\n let mut vec: BoundedVec<Field, 2> = BoundedVec::new(0);\n vec.push_array([2]);\n let _x = vec.get(1);\n}\n\n#[test(should_fail)]\nfn test_vec_get_uninitialized() {\n let mut vec: BoundedVec<Field, 2> = BoundedVec::new(0);\n let _x = vec.get(0);\n}\n\n#[test(should_fail)]\nfn test_vec_push_overflow() {\n let mut vec: BoundedVec<Field, 1> = BoundedVec::new(0);\n vec.push(1);\n vec.push(2);\n}\n\n#[test]\nfn test_vec_any() {\n let mut vec: BoundedVec<Field, 3> = BoundedVec::new(0);\n vec.push_array([2, 4, 6]);\n assert(vec.any(|v| v == 2) == true);\n assert(vec.any(|v| v == 4) == true);\n assert(vec.any(|v| v == 6) == true);\n assert(vec.any(|v| v == 3) == false);\n}\n\n#[test]\nfn test_vec_any_not_default() {\n let default_value = 1;\n let mut vec: BoundedVec<Field, 3> = BoundedVec::new(default_value);\n vec.push_array([2, 4]);\n assert(vec.any(|v| v == default_value) == false);\n}\n",
950
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/types/vec.nr"
951
+ },
952
+ "62": {
953
+ "source": "pub fn arr_copy_slice<T, N, M>(src: [T; N], mut dst: [T; M], offset: Field) -> [T; M] {\n for i in 0..dst.len() {\n dst[i] = src[i + offset];\n }\n dst\n}\n\n// TODO(#3470): Copied over from https://github.com/AztecProtocol/aztec-packages/blob/a07c4bd47313be6aa604a63f37857eb0136b41ba/yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/base/base_rollup_inputs.nr#L599\n// move to a shared place?\n\n// TODO to radix returns u8, so we cannot use bigger radixes. It'd be ideal to use a radix of the maximum range-constrained integer noir supports\npub fn full_field_less_than(lhs: Field, rhs: Field) -> bool {\n dep::std::eddsa::lt_bytes32(lhs, rhs)\n}\n\npub fn full_field_greater_than(lhs: Field, rhs: Field) -> bool {\n dep::std::eddsa::lt_bytes32(rhs, lhs)\n}\n\nstruct Reader<N> {\n data: [Field; N],\n offset: Field,\n}\n\nimpl<N> Reader<N> {\n pub fn new(data: [Field; N]) -> Self {\n Self { data, offset: 0 }\n }\n\n pub fn read(&mut self) -> Field {\n let result = self.data[self.offset];\n self.offset += 1;\n result\n }\n\n pub fn read_array<K>(&mut self, mut result: [Field; K]) -> [Field; K] {\n for i in 0..K {\n result[i] = self.data[self.offset + i];\n }\n self.offset += K;\n result\n }\n\n pub fn read_struct<T, K>(&mut self, deserialise: fn([Field; K]) -> T) -> T {\n let result = deserialise(self.read_array([0; K]));\n result\n }\n\n pub fn read_struct_array<T, K, C>(&mut self, deserialise: fn([Field; K]) -> T, mut result: [T; C]) -> [T; C] {\n for i in 0..C {\n result[i] = self.read_struct(deserialise);\n }\n result\n }\n\n pub fn finish(self) {\n assert(self.offset == self.data.len(), \"Reader did not read all data\");\n } \n}\n",
954
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/utils.nr"
955
+ },
956
+ "64": {
957
+ "source": "use dep::protocol_types::{\n abis::{\n block_header::BlockHeader,\n call_context::CallContext,\n function_data::FunctionData,\n function_selector::FunctionSelector,\n private_circuit_public_inputs::PrivateCircuitPublicInputs,\n public_circuit_public_inputs::PublicCircuitPublicInputs,\n call_stack_item::PrivateCallStackItem,\n call_stack_item::PublicCallStackItem,\n side_effect::{SideEffect, SideEffectLinkedToNoteHash},\n },\n address::{\n AztecAddress,\n EthAddress,\n },\n constants::{\n MAX_NEW_COMMITMENTS_PER_CALL,\n MAX_NEW_L2_TO_L1_MSGS_PER_CALL,\n MAX_NEW_NULLIFIERS_PER_CALL,\n MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL,\n MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL,\n MAX_PUBLIC_DATA_READS_PER_CALL,\n MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL,\n MAX_READ_REQUESTS_PER_CALL,\n NUM_FIELDS_PER_SHA256,\n RETURN_VALUES_LENGTH,\n },\n contrakt::{\n deployment_data::ContractDeploymentData,\n storage_read::StorageRead,\n storage_update_request::StorageUpdateRequest,\n },\n hash::hash_args,\n grumpkin_point::GrumpkinPoint,\n};\n\n// TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n// use dep::std::collections::vec::Vec;\n\nuse crate::abi::{\n PrivateContextInputs,\n PublicContextInputs,\n};\n\n// l1 to l2 messaging\nuse crate::messaging::process_l1_to_l2_message;\n\nuse crate::types::{\n vec::BoundedVec,\n};\n\nuse crate::utils::Reader;\n\nuse crate::oracle::{\n arguments,\n call_private_function::call_private_function_internal,\n public_call::call_public_function_internal,\n enqueue_public_function_call::enqueue_public_function_call_internal,\n context::get_portal_address,\n get_block_header::get_block_header,\n};\n\nuse dep::std::option::Option;\n\n// When finished, one can call .finish() to convert back to the abi\nstruct PrivateContext {\n // docs:start:private-context\n inputs: PrivateContextInputs,\n side_effect_counter: Field,\n\n args_hash : Field,\n return_values : BoundedVec<Field, RETURN_VALUES_LENGTH>,\n\n read_requests: BoundedVec<SideEffect, MAX_READ_REQUESTS_PER_CALL>,\n\n new_commitments: BoundedVec<SideEffect, MAX_NEW_COMMITMENTS_PER_CALL>,\n new_nullifiers: BoundedVec<SideEffectLinkedToNoteHash, MAX_NEW_NULLIFIERS_PER_CALL>,\n\n private_call_stack_hashes : BoundedVec<Field, MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL>,\n public_call_stack_hashes : BoundedVec<Field, MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL>,\n new_l2_to_l1_msgs : BoundedVec<Field, MAX_NEW_L2_TO_L1_MSGS_PER_CALL>,\n // docs:end:private-context\n\n block_header: BlockHeader,\n\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n // encrypted_logs_preimages: Vec<Field>,\n // unencrypted_logs_preimages: Vec<Field>,\n}\n\nimpl PrivateContext {\n pub fn new(inputs: PrivateContextInputs, args_hash: Field) -> PrivateContext {\n PrivateContext {\n inputs: inputs,\n // starts at 1 because all private calls have txhash nullifier as 0th nullifier\n // and therefore 0th sideeffect. increment this for each side effect in this context\n side_effect_counter: 1,\n\n args_hash: args_hash,\n return_values: BoundedVec::new(0),\n\n read_requests: BoundedVec::new(SideEffect::empty()),\n\n new_commitments: BoundedVec::new(SideEffect::empty()),\n new_nullifiers: BoundedVec::new(SideEffectLinkedToNoteHash::empty()),\n\n block_header: inputs.block_header,\n\n private_call_stack_hashes: BoundedVec::new(0),\n public_call_stack_hashes: BoundedVec::new(0),\n new_l2_to_l1_msgs: BoundedVec::new(0),\n\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n // encrypted_logs_preimages: Vec::new(),\n // unencrypted_logs_preimages: Vec::new(),\n }\n }\n\n pub fn msg_sender(self) -> AztecAddress {\n self.inputs.call_context.msg_sender\n }\n\n pub fn this_address(self) -> AztecAddress {\n self.inputs.call_context.storage_contract_address\n }\n\n pub fn this_portal_address(self) -> EthAddress {\n self.inputs.call_context.portal_contract_address\n }\n\n pub fn chain_id(self) -> Field {\n self.inputs.private_global_variables.chain_id\n }\n\n pub fn version(self) -> Field {\n self.inputs.private_global_variables.version\n }\n\n pub fn selector(self) -> FunctionSelector {\n self.inputs.call_context.function_selector\n }\n\n pub fn get_block_header(self, block_number: u32) -> BlockHeader {\n get_block_header(block_number, self)\n }\n\n pub fn finish(self) -> PrivateCircuitPublicInputs {\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n let encrypted_logs_hash = [0; NUM_FIELDS_PER_SHA256];\n let unencrypted_logs_hash = [0; NUM_FIELDS_PER_SHA256];\n let encrypted_log_preimages_length = 0;\n let unencrypted_log_preimages_length = 0;\n\n let priv_circuit_pub_inputs = PrivateCircuitPublicInputs {\n call_context: self.inputs.call_context,\n args_hash: self.args_hash,\n return_values: self.return_values.storage,\n read_requests: self.read_requests.storage,\n new_commitments: self.new_commitments.storage,\n new_nullifiers: self.new_nullifiers.storage,\n private_call_stack_hashes: self.private_call_stack_hashes.storage,\n public_call_stack_hashes: self.public_call_stack_hashes.storage,\n new_l2_to_l1_msgs: self.new_l2_to_l1_msgs.storage,\n end_side_effect_counter: self.side_effect_counter,\n encrypted_logs_hash: encrypted_logs_hash,\n unencrypted_logs_hash: unencrypted_logs_hash,\n encrypted_log_preimages_length: encrypted_log_preimages_length,\n unencrypted_log_preimages_length: unencrypted_log_preimages_length,\n block_header: self.block_header,\n contract_deployment_data: self.inputs.contract_deployment_data,\n chain_id: self.inputs.private_global_variables.chain_id,\n version: self.inputs.private_global_variables.version,\n };\n priv_circuit_pub_inputs\n }\n\n pub fn push_read_request(&mut self, read_request: Field) {\n let side_effect = SideEffect {\n value: read_request,\n counter: self.side_effect_counter,\n };\n self.read_requests.push(side_effect);\n self.side_effect_counter = self.side_effect_counter + 1;\n }\n\n pub fn push_new_note_hash(&mut self, note_hash: Field) {\n let side_effect = SideEffect {\n value: note_hash,\n counter: self.side_effect_counter,\n };\n self.new_commitments.push(side_effect);\n self.side_effect_counter = self.side_effect_counter + 1;\n }\n\n pub fn push_new_nullifier(&mut self, nullifier: Field, nullified_commitment: Field) {\n let side_effect = SideEffectLinkedToNoteHash {\n value: nullifier,\n note_hash: nullified_commitment,\n counter: self.side_effect_counter,\n };\n self.new_nullifiers.push(side_effect);\n self.side_effect_counter = self.side_effect_counter + 1;\n }\n\n // docs:start:context_message_portal\n pub fn message_portal(&mut self, content: Field) \n // docs:end:context_message_portal\n {\n self.new_l2_to_l1_msgs.push(content);\n }\n\n // PrivateContextInputs must be temporarily passed in to prevent too many unknowns\n // Note this returns self to get around an issue where mutable structs do not maintain mutations unless reassigned\n // docs:start:context_consume_l1_to_l2_message\n // docs:start:consume_l1_to_l2_message\n pub fn consume_l1_to_l2_message(\n &mut self,\n msg_key: Field,\n content: Field,\n secret: Field\n ) \n // docs:end:context_consume_l1_to_l2_message\n {\n let nullifier = process_l1_to_l2_message(self.block_header.l1_to_l2_message_tree_root, self.this_address(), self.this_portal_address(), self.chain_id(), self.version(), msg_key, content, secret);\n\n // Push nullifier (and the \"commitment\" corresponding to this can be \"empty\")\n self.push_new_nullifier(nullifier, 0)\n }\n // docs:end:consume_l1_to_l2_message\n\n pub fn accumulate_encrypted_logs<N>(&mut self, log: [Field; N]) {\n let _void1 = self.inputs;\n let _void2 = log;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n }\n\n pub fn accumulate_unencrypted_logs<T>(&mut self, log: T) {\n let _void1 = self.inputs;\n let _void2 = log;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n }\n\n pub fn call_private_function<ARGS_COUNT>(\n &mut self,\n contract_address: AztecAddress, \n function_selector: FunctionSelector, \n args: [Field; ARGS_COUNT]\n ) -> [Field; RETURN_VALUES_LENGTH] {\n let args_hash = hash_args(args);\n assert(args_hash == arguments::pack_arguments(args));\n self.call_private_function_with_packed_args(contract_address, function_selector, args_hash)\n }\n\n pub fn call_private_function_no_args(\n &mut self,\n contract_address: AztecAddress, \n function_selector: FunctionSelector, \n ) -> [Field; RETURN_VALUES_LENGTH] {\n self.call_private_function_with_packed_args(contract_address, function_selector, 0)\n }\n\n pub fn call_private_function_with_packed_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field\n ) -> [Field; RETURN_VALUES_LENGTH] {\n let fields = call_private_function_internal(\n contract_address,\n function_selector, \n args_hash,\n );\n let mut reader = Reader::new(fields);\n\n let item = PrivateCallStackItem {\n contract_address: AztecAddress::from_field(reader.read()),\n function_data: FunctionData {\n selector: FunctionSelector::from_field(reader.read()),\n is_internal: reader.read() as bool,\n is_private: reader.read() as bool,\n is_constructor: reader.read() as bool,\n },\n public_inputs: PrivateCircuitPublicInputs {\n call_context: CallContext {\n msg_sender : AztecAddress::from_field(reader.read()),\n storage_contract_address : AztecAddress::from_field(reader.read()),\n portal_contract_address : EthAddress::from_field(reader.read()),\n function_selector: FunctionSelector::from_field(reader.read()), // practically same as fields[1]\n is_delegate_call : reader.read() as bool,\n is_static_call : reader.read() as bool,\n is_contract_deployment: reader.read() as bool,\n start_side_effect_counter: reader.read(),\n },\n args_hash: reader.read(),\n return_values: reader.read_array([0; RETURN_VALUES_LENGTH]), // +1\n read_requests: reader.read_struct_array(SideEffect::deserialise, [SideEffect::empty(); MAX_READ_REQUESTS_PER_CALL]),\n new_commitments: reader.read_struct_array(SideEffect::deserialise, [SideEffect::empty(); MAX_NEW_COMMITMENTS_PER_CALL]),\n new_nullifiers: reader.read_struct_array(SideEffectLinkedToNoteHash::deserialise, [SideEffectLinkedToNoteHash::empty(); MAX_NEW_NULLIFIERS_PER_CALL]),\n private_call_stack_hashes: reader.read_array([0; MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL]),\n public_call_stack_hashes: reader.read_array([0; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL]),\n new_l2_to_l1_msgs: reader.read_array([0; MAX_NEW_L2_TO_L1_MSGS_PER_CALL]),\n end_side_effect_counter: reader.read(),\n encrypted_logs_hash: reader.read_array([0; NUM_FIELDS_PER_SHA256]),\n unencrypted_logs_hash: reader.read_array([0; NUM_FIELDS_PER_SHA256]),\n encrypted_log_preimages_length: reader.read(),\n unencrypted_log_preimages_length: reader.read(),\n block_header: BlockHeader{\n // Must match order in `private_circuit_public_inputs.hpp`\n note_hash_tree_root : reader.read(),\n nullifier_tree_root : reader.read(),\n contract_tree_root : reader.read(),\n l1_to_l2_message_tree_root : reader.read(),\n archive_root : reader.read(),\n public_data_tree_root: reader.read(),\n global_variables_hash: reader.read(),\n },\n contract_deployment_data: ContractDeploymentData {\n deployer_public_key: GrumpkinPoint {\n x: reader.read(), \n y: reader.read()\n },\n constructor_vk_hash : reader.read(),\n function_tree_root : reader.read(),\n contract_address_salt : reader.read(),\n portal_contract_address : EthAddress::from_field(reader.read()),\n },\n chain_id: reader.read(),\n version: reader.read(),\n },\n is_execution_request: reader.read() as bool,\n };\n\n reader.finish();\n \n assert(contract_address.eq(item.contract_address));\n assert(function_selector.eq(item.function_data.selector));\n\n assert(args_hash == item.public_inputs.args_hash);\n\n assert(item.is_execution_request == false);\n\n // Assert that the call context of the enqueued call generated by the oracle matches our request.\n // We are issuing a regular call which is not delegate, static, or deployment. We also constrain\n // the msg_sender in the nested call to be equal to our address, and the execution context address\n // for the nested call to be equal to the address we actually called.\n assert(item.public_inputs.call_context.is_delegate_call == false);\n assert(item.public_inputs.call_context.is_static_call == false);\n assert(item.public_inputs.call_context.is_contract_deployment == false);\n assert(item.public_inputs.call_context.msg_sender.eq(self.inputs.call_context.storage_contract_address));\n assert(item.public_inputs.call_context.storage_contract_address.eq(contract_address));\n\n self.private_call_stack_hashes.push(item.hash());\n\n item.public_inputs.return_values\n }\n\n pub fn call_public_function<ARGS_COUNT>(\n &mut self,\n contract_address: AztecAddress, \n function_selector: FunctionSelector, \n args: [Field; ARGS_COUNT]\n ) {\n let args_hash = hash_args(args);\n assert(args_hash == arguments::pack_arguments(args));\n self.call_public_function_with_packed_args(contract_address, function_selector, args_hash)\n }\n\n pub fn call_public_function_no_args(\n &mut self,\n contract_address: AztecAddress, \n function_selector: FunctionSelector,\n ) {\n self.call_public_function_with_packed_args(contract_address, function_selector, 0)\n }\n\n pub fn call_public_function_with_packed_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field\n ) {\n let fields = enqueue_public_function_call_internal(\n contract_address, \n function_selector, \n args_hash\n );\n let item = PublicCallStackItem {\n contract_address: AztecAddress::from_field(fields[0]),\n function_data: FunctionData {\n selector: FunctionSelector::from_field(fields[1]),\n is_internal: fields[2] as bool,\n is_private: fields[3] as bool,\n is_constructor: fields[4] as bool,\n },\n public_inputs: PublicCircuitPublicInputs {\n call_context: CallContext {\n msg_sender : AztecAddress::from_field(fields[5]),\n storage_contract_address : AztecAddress::from_field(fields[6]),\n portal_contract_address : EthAddress::from_field(fields[7]),\n function_selector: FunctionSelector::from_field(fields[8]), // practically same as fields[1]\n is_delegate_call : fields[9] as bool,\n is_static_call : fields[10] as bool,\n is_contract_deployment: fields[11] as bool,\n start_side_effect_counter: fields[12],\n },\n args_hash: fields[13],\n return_values: [0; RETURN_VALUES_LENGTH],\n contract_storage_update_requests: [StorageUpdateRequest::empty(); MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL],\n contract_storage_reads: [StorageRead::empty(); MAX_PUBLIC_DATA_READS_PER_CALL],\n public_call_stack_hashes: [0; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL],\n new_commitments: [SideEffect::empty(); MAX_NEW_COMMITMENTS_PER_CALL],\n new_nullifiers: [SideEffectLinkedToNoteHash::empty(); MAX_NEW_NULLIFIERS_PER_CALL],\n new_l2_to_l1_msgs:[0; MAX_NEW_L2_TO_L1_MSGS_PER_CALL],\n unencrypted_logs_hash:[0; NUM_FIELDS_PER_SHA256],\n unencrypted_log_preimages_length: 0,\n block_header: BlockHeader::empty(),\n prover_address: AztecAddress::zero(),\n },\n is_execution_request: true,\n };\n\n assert(contract_address.eq(item.contract_address));\n assert(function_selector.eq(item.function_data.selector));\n \n assert(args_hash == item.public_inputs.args_hash);\n\n // Assert that the call context of the enqueued call generated by the oracle matches our request.\n // We are issuing a regular call which is not delegate, static, or deployment. We also constrain\n // the msg_sender in the nested call to be equal to our address, and the execution context address\n // for the nested call to be equal to the address we actually called.\n assert(item.public_inputs.call_context.is_delegate_call == false);\n assert(item.public_inputs.call_context.is_static_call == false);\n assert(item.public_inputs.call_context.is_contract_deployment == false);\n assert(item.public_inputs.call_context.msg_sender.eq(self.inputs.call_context.storage_contract_address));\n assert(item.public_inputs.call_context.storage_contract_address.eq(contract_address));\n\n self.public_call_stack_hashes.push(item.hash());\n }\n}\n\nstruct PublicContext {\n inputs: PublicContextInputs,\n side_effect_counter: Field,\n\n args_hash : Field,\n return_values : BoundedVec<Field, RETURN_VALUES_LENGTH>,\n\n contract_storage_update_requests: BoundedVec<StorageUpdateRequest, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL>,\n contract_storage_reads: BoundedVec<StorageRead, MAX_PUBLIC_DATA_READS_PER_CALL>,\n public_call_stack_hashes: BoundedVec<Field, MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL>,\n\n new_commitments: BoundedVec<SideEffect, MAX_NEW_COMMITMENTS_PER_CALL>,\n new_nullifiers: BoundedVec<SideEffectLinkedToNoteHash, MAX_NEW_NULLIFIERS_PER_CALL>,\n\n new_l2_to_l1_msgs: BoundedVec<Field, MAX_NEW_L2_TO_L1_MSGS_PER_CALL>,\n\n unencrypted_logs_hash: BoundedVec<Field, NUM_FIELDS_PER_SHA256>,\n unencrypted_logs_preimages_length: Field,\n\n block_header: BlockHeader,\n prover_address: AztecAddress,\n}\n\nimpl PublicContext {\n pub fn new(inputs: PublicContextInputs, args_hash: Field) -> PublicContext {\n let empty_storage_read = StorageRead::empty();\n let empty_storage_update = StorageUpdateRequest::empty();\n PublicContext {\n inputs: inputs,\n side_effect_counter: 0, // no initial nullifier in new public context. increment on every side effect\n\n args_hash: args_hash,\n return_values: BoundedVec::new(0),\n\n contract_storage_update_requests: BoundedVec::new(empty_storage_update),\n contract_storage_reads: BoundedVec::new(empty_storage_read),\n public_call_stack_hashes: BoundedVec::new(0),\n\n new_commitments: BoundedVec::new(SideEffect::empty()),\n new_nullifiers: BoundedVec::new(SideEffectLinkedToNoteHash::empty()),\n\n new_l2_to_l1_msgs: BoundedVec::new(0),\n\n \n unencrypted_logs_hash: BoundedVec::new(0),\n unencrypted_logs_preimages_length: 0,\n\n block_header: inputs.block_header,\n prover_address: AztecAddress::zero(),\n\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n // encrypted_logs_preimages: Vec::new(),\n // unencrypted_logs_preimages: Vec::new(),\n }\n }\n\n pub fn msg_sender(self) -> AztecAddress {\n self.inputs.call_context.msg_sender\n }\n\n pub fn this_address(self) -> AztecAddress {\n self.inputs.call_context.storage_contract_address\n }\n\n pub fn this_portal_address(self) -> EthAddress {\n self.inputs.call_context.portal_contract_address\n }\n\n pub fn chain_id(self) -> Field {\n self.inputs.public_global_variables.chain_id\n }\n\n pub fn version(self) -> Field {\n self.inputs.public_global_variables.version\n }\n\n pub fn selector(self) -> FunctionSelector {\n self.inputs.call_context.function_selector\n }\n\n pub fn block_number(self) -> Field {\n self.inputs.public_global_variables.block_number\n }\n\n pub fn timestamp(self) -> Field {\n self.inputs.public_global_variables.timestamp\n }\n\n pub fn finish(self) -> PublicCircuitPublicInputs {\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n let unencrypted_logs_hash = [0; NUM_FIELDS_PER_SHA256];\n let unencrypted_log_preimages_length = 0;\n\n\n // Compute the public call stack hashes\n let pub_circuit_pub_inputs = PublicCircuitPublicInputs {\n call_context: self.inputs.call_context, // Done\n args_hash: self.args_hash, // Done\n contract_storage_update_requests: self.contract_storage_update_requests.storage,\n contract_storage_reads: self.contract_storage_reads.storage,\n return_values: self.return_values.storage,\n new_commitments: self.new_commitments.storage,\n new_nullifiers: self.new_nullifiers.storage,\n public_call_stack_hashes: self.public_call_stack_hashes.storage,\n new_l2_to_l1_msgs: self.new_l2_to_l1_msgs.storage,\n unencrypted_logs_hash: unencrypted_logs_hash,\n unencrypted_log_preimages_length: unencrypted_log_preimages_length,\n block_header: self.inputs.block_header,\n prover_address: self.prover_address,\n };\n pub_circuit_pub_inputs\n }\n\n pub fn push_new_note_hash(&mut self, note_hash: Field) {\n let side_effect = SideEffect {\n value: note_hash,\n counter: self.side_effect_counter\n };\n self.new_commitments.push(side_effect);\n self.side_effect_counter = self.side_effect_counter + 1;\n }\n\n pub fn push_new_nullifier(&mut self, nullifier: Field, _nullified_commitment: Field) {\n let side_effect = SideEffectLinkedToNoteHash {\n value: nullifier,\n note_hash: 0, // cannot nullify pending notes in public context\n counter: self.side_effect_counter\n };\n self.new_nullifiers.push(side_effect);\n self.side_effect_counter = self.side_effect_counter + 1;\n }\n\n pub fn message_portal(&mut self, content: Field) {\n self.new_l2_to_l1_msgs.push(content);\n }\n\n // PrivateContextInputs must be temporarily passed in to prevent too many unknowns\n // Note this returns self to get around an issue where mutable structs do not maintain mutations unless reassigned\n pub fn consume_l1_to_l2_message(&mut self, msg_key: Field, content: Field, secret: Field) {\n let this = (*self).this_address();\n let nullifier = process_l1_to_l2_message(self.block_header.l1_to_l2_message_tree_root, this, self.this_portal_address(), self.chain_id(), self.version(), msg_key, content, secret);\n\n // Push nullifier (and the \"commitment\" corresponding to this can be \"empty\")\n self.push_new_nullifier(nullifier, 0)\n }\n\n pub fn accumulate_encrypted_logs<N>(&mut self, log: [Field; N]) {\n let _void1 = self;\n let _void2 = log;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n }\n\n pub fn accumulate_unencrypted_logs<T>(&mut self, log: T) {\n let _void1 = self;\n let _void2 = log;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n }\n\n pub fn call_public_function<ARGS_COUNT>(\n _self: Self,\n contract_address: AztecAddress, \n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT],\n ) -> [Field; RETURN_VALUES_LENGTH] {\n let args_hash = hash_args(args);\n assert(args_hash == arguments::pack_arguments(args));\n call_public_function_internal(\n contract_address, \n function_selector, \n args_hash,\n )\n }\n\n pub fn call_public_function_no_args(\n _self: Self,\n contract_address: AztecAddress, \n function_selector: FunctionSelector,\n ) -> [Field; RETURN_VALUES_LENGTH] {\n call_public_function_internal(\n contract_address, \n function_selector, \n 0,\n )\n }\n\n}\n\nstruct Context {\n private: Option<&mut PrivateContext>,\n public: Option<&mut PublicContext>,\n}\n\nimpl Context {\n pub fn private(context: &mut PrivateContext) -> Context {\n Context {\n private: Option::some(context),\n public: Option::none()\n }\n }\n\n pub fn public(context: &mut PublicContext) -> Context {\n Context {\n public: Option::some(context),\n private: Option::none()\n }\n }\n\n pub fn none() -> Context {\n Context {\n public: Option::none(),\n private: Option::none()\n }\n }\n}\n",
958
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/context.nr"
959
+ },
960
+ "69": {
961
+ "source": "use crate::abi::PublicContextInputs;\nuse crate::context::{\n PrivateContext,\n PublicContext,\n};\nuse crate::note::{\n note_header::NoteHeader,\n note_interface::NoteInterface,\n utils::compute_inner_note_hash,\n};\nuse crate::oracle::notes::{notify_created_note, notify_nullified_note};\n\npub fn create_note<Note, N>(\n context: &mut PrivateContext,\n storage_slot: Field,\n note: &mut Note,\n note_interface: NoteInterface<Note, N>,\n broadcast: bool\n) {\n let contract_address = (*context).this_address();\n\n let header = NoteHeader { contract_address, storage_slot, nonce: 0, is_transient: true };\n let set_header = note_interface.set_header;\n set_header(note, header);\n let inner_note_hash = compute_inner_note_hash(note_interface, *note);\n\n let serialize = note_interface.serialize;\n let serialized_note = serialize(*note);\n assert(notify_created_note(storage_slot, serialized_note, inner_note_hash) == 0);\n\n context.push_new_note_hash(inner_note_hash);\n\n if broadcast {\n let broadcast = note_interface.broadcast;\n broadcast(context, storage_slot, *note);\n }\n}\n\npub fn create_note_hash_from_public<Note, N>(\n context: &mut PublicContext,\n storage_slot: Field,\n note: &mut Note,\n note_interface: NoteInterface<Note, N>\n) {\n let contract_address = (*context).this_address();\n\n let header = NoteHeader { contract_address, storage_slot, nonce: 0, is_transient: true };\n let set_header = note_interface.set_header;\n set_header(note, header);\n let inner_note_hash = compute_inner_note_hash(note_interface, *note);\n\n context.push_new_note_hash(inner_note_hash);\n}\n\npub fn destroy_note<Note, N>(\n context: &mut PrivateContext,\n note: Note,\n note_interface: NoteInterface<Note, N>\n) {\n let mut nullifier = 0;\n let mut nullified_commitment: Field = 0;\n let compute_nullifier = note_interface.compute_nullifier;\n nullifier = compute_nullifier(note);\n\n // We also need the note commitment corresponding to the \"nullifier\"\n let get_header = note_interface.get_header;\n let header = get_header(note);\n // `nullified_commitment` is used to inform the kernel which pending commitment\n // the nullifier corresponds to so they can be matched and both squashed/deleted.\n // nonzero nonce implies \"persistable\" nullifier (nullifies a persistent/in-tree\n // commitment) in which case `nullified_commitment` is not used since the kernel\n // just siloes and forwards the nullifier to its output.\n if (header.is_transient) {\n // TODO(1718): Can we reuse the note commitment computed in `compute_nullifier`?\n nullified_commitment = compute_inner_note_hash(note_interface, note);\n }\n assert(notify_nullified_note(nullifier, nullified_commitment) == 0);\n\n context.push_new_nullifier(nullifier, nullified_commitment)\n}\n",
962
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/note/lifecycle.nr"
963
+ },
964
+ "70": {
965
+ "source": "use dep::protocol_types::{\n constants::GENERATOR_INDEX__OUTER_NULLIFIER,\n hash::pedersen_hash,\n};\nuse crate::{\n note::{\n note_hash::{compute_inner_hash, compute_siloed_hash, compute_unique_hash},\n note_header::NoteHeader,\n note_interface::NoteInterface,\n },\n utils::arr_copy_slice,\n};\n\npub fn compute_inner_note_hash<Note, N>(note_interface: NoteInterface<Note, N>, note: Note) -> Field {\n let get_header = note_interface.get_header;\n let header = get_header(note);\n\n let compute_note_hash = note_interface.compute_note_hash;\n let note_hash = compute_note_hash(note);\n\n compute_inner_hash(header.storage_slot, note_hash)\n}\n\npub fn compute_siloed_note_hash<Note, N>(note_interface: NoteInterface<Note, N>, note_with_header: Note) -> Field {\n let get_header = note_interface.get_header;\n let header = get_header(note_with_header);\n\n let inner_note_hash = compute_inner_note_hash(note_interface, note_with_header);\n\n compute_siloed_hash(header.contract_address, inner_note_hash)\n}\n\npub fn compute_unique_siloed_note_hash<Note, N>(note_interface: NoteInterface<Note, N>, note_with_header: Note) -> Field {\n let get_header = note_interface.get_header;\n let header = get_header(note_with_header);\n\n let siloed_note_hash = compute_siloed_note_hash(note_interface, note_with_header);\n\n compute_unique_hash(header.nonce, siloed_note_hash)\n}\n\npub fn compute_siloed_nullifier<Note, N>(note_interface: NoteInterface<Note, N>, note_with_header: Note) -> Field {\n let get_header = note_interface.get_header;\n let header = get_header(note_with_header);\n\n let compute_nullifier = note_interface.compute_nullifier;\n let inner_nullifier = compute_nullifier(note_with_header);\n\n let input = [header.contract_address.to_field(), inner_nullifier];\n pedersen_hash(input, GENERATOR_INDEX__OUTER_NULLIFIER)\n}\n\npub fn compute_note_hash_for_read_or_nullify<Note, N>(note_interface: NoteInterface<Note, N>, note_with_header: Note) -> Field {\n let get_header = note_interface.get_header;\n let header = get_header(note_with_header);\n\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1386)\n if (header.is_transient) {\n // If a note is transient, we just read the inner_note_hash (kernel will silo by contract address).\n compute_inner_note_hash(note_interface, note_with_header)\n } else if (header.nonce == 0) {\n // If not transient and nonce is zero, that means we are reading a public note.\n compute_siloed_note_hash(note_interface, note_with_header)\n } else {\n // When nonce is nonzero, that means we are reading a settled note (from tree) created in a\n // previous TX. So we need the unique_siloed_note_hash which has already been hashed with\n // contract address and then nonce. This hash will match the existing leaf in the private\n // data tree, so the kernel can just perform a membership check directly on this hash/leaf.\n compute_unique_siloed_note_hash(note_interface, note_with_header)\n }\n}\n\npub fn compute_note_hash_and_nullifier<Note, N, S>(\n note_interface: NoteInterface<Note, N>,\n note_header: NoteHeader,\n serialized_note: [Field; S]\n) -> [Field; 4] {\n let deserialize = note_interface.deserialize;\n let set_header = note_interface.set_header;\n let mut note = deserialize(arr_copy_slice(serialized_note, [0; N], 0));\n set_header(&mut note, note_header);\n\n let compute_note_hash = note_interface.compute_note_hash;\n let note_hash = compute_note_hash(note);\n let inner_note_hash = compute_inner_hash(note_header.storage_slot, note_hash);\n\n let siloed_note_hash = compute_siloed_hash(note_header.contract_address, inner_note_hash);\n\n let unique_siloed_note_hash = compute_unique_hash(note_header.nonce, siloed_note_hash);\n\n let compute_nullifier = note_interface.compute_nullifier;\n let inner_nullifier = compute_nullifier(note);\n\n [inner_note_hash, siloed_note_hash, unique_siloed_note_hash, inner_nullifier]\n}\n",
966
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/note/utils.nr"
967
+ },
968
+ "72": {
969
+ "source": "use dep::protocol_types::{\n address::AztecAddress,\n constants::{\n GENERATOR_INDEX__UNIQUE_COMMITMENT,\n GENERATOR_INDEX__SILOED_COMMITMENT,\n },\n hash::pedersen_hash,\n};\n\npub fn compute_inner_hash(storage_slot: Field, note_hash: Field) -> Field {\n // TODO(#1205) Do we need a generator index here?\n pedersen_hash([storage_slot, note_hash], 0)\n}\n\npub fn compute_siloed_hash(contract_address: AztecAddress, inner_note_hash: Field) -> Field {\n let inputs = [contract_address.to_field(), inner_note_hash];\n pedersen_hash(inputs, GENERATOR_INDEX__SILOED_COMMITMENT)\n}\n\npub fn compute_unique_hash(nonce: Field, siloed_note_hash: Field) -> Field {\n let inputs = [nonce, siloed_note_hash];\n pedersen_hash(inputs, GENERATOR_INDEX__UNIQUE_COMMITMENT)\n}\n",
970
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/note/note_hash.nr"
971
+ },
972
+ "75": {
973
+ "source": "use dep::std::option::Option;\nuse dep::protocol_types::constants::{\n MAX_READ_REQUESTS_PER_CALL,\n GET_NOTE_ORACLE_RETURN_LENGTH,\n GET_NOTES_ORACLE_RETURN_LENGTH,\n MAX_NOTES_PER_PAGE,\n VIEW_NOTE_ORACLE_RETURN_LENGTH,\n};\nuse crate::context::PrivateContext;\nuse crate::note::{\n note_getter_options::{NoteGetterOptions, Select, Sort, SortOrder},\n note_interface::NoteInterface,\n note_viewer_options::NoteViewerOptions,\n utils::compute_note_hash_for_read_or_nullify,\n};\nuse crate::oracle;\nuse crate::types::vec::BoundedVec;\n\nfn check_note_header<Note, N>(\n context: PrivateContext,\n storage_slot: Field,\n note_interface: NoteInterface<Note, N>,\n note: Note\n) {\n let get_header = note_interface.get_header;\n let header = get_header(note);\n let contract_address = context.this_address();\n assert(header.contract_address.eq(contract_address));\n assert(header.storage_slot == storage_slot);\n}\n\nfn check_note_fields<N>(fields: [Field; N], selects: BoundedVec<Option<Select>, N>) {\n for i in 0..selects.len {\n let select = selects.get_unchecked(i).unwrap_unchecked();\n assert(fields[select.field_index] == select.value, \"Mismatch return note field.\");\n }\n}\n\nfn check_notes_order<N>(\n fields_0: [Field; N],\n fields_1: [Field; N],\n sorts: BoundedVec<Option<Sort>, N>\n) {\n for i in 0..sorts.len {\n let sort = sorts.get_unchecked(i).unwrap_unchecked();\n let eq = fields_0[sort.field_index] == fields_1[sort.field_index];\n let lt = fields_0[sort.field_index] as u120 < fields_1[sort.field_index] as u120;\n if sort.order == SortOrder.ASC {\n assert(eq | lt, \"Return notes not sorted in ascending order.\");\n } else if !eq {\n assert(!lt, \"Return notes not sorted in descending order.\");\n }\n }\n}\n\npub fn get_note<Note, N>(\n context: &mut PrivateContext,\n storage_slot: Field,\n note_interface: NoteInterface<Note, N>\n) -> Note {\n let note = get_note_internal(storage_slot, note_interface);\n\n check_note_header(*context, storage_slot, note_interface, note);\n\n let note_hash_for_read_request = compute_note_hash_for_read_or_nullify(note_interface, note);\n\n context.push_read_request(note_hash_for_read_request);\n note\n}\n\npub fn get_notes<Note, N, FILTER_ARGS>(\n context: &mut PrivateContext,\n storage_slot: Field,\n note_interface: NoteInterface<Note, N>,\n options: NoteGetterOptions<Note, N, FILTER_ARGS>\n) -> [Option<Note>; MAX_READ_REQUESTS_PER_CALL] {\n let opt_notes = get_notes_internal(storage_slot, note_interface, options);\n let mut num_notes = 0;\n let mut prev_fields = [0; N];\n for i in 0..opt_notes.len() {\n let opt_note = opt_notes[i];\n if opt_note.is_some() {\n let note = opt_note.unwrap_unchecked();\n let serialize = note_interface.serialize;\n let fields = serialize(note);\n check_note_header(*context, storage_slot, note_interface, note);\n check_note_fields(fields, options.selects);\n if i != 0 {\n check_notes_order(prev_fields, fields, options.sorts);\n }\n prev_fields = fields;\n\n let note_hash_for_read_request = compute_note_hash_for_read_or_nullify(note_interface, note);\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1410): test to ensure\n // failure if malicious oracle injects 0 nonce here for a \"pre-existing\" note.\n context.push_read_request(note_hash_for_read_request);\n\n num_notes += 1;\n };\n }\n if options.limit != 0 {\n assert(num_notes <= options.limit, \"Invalid number of return notes.\");\n }\n opt_notes\n}\n\nunconstrained fn get_note_internal<Note, N>(storage_slot: Field, note_interface: NoteInterface<Note, N>) -> Note {\n let placeholder_note = [Option::none()];\n let placeholder_fields = [0; GET_NOTE_ORACLE_RETURN_LENGTH];\n oracle::notes::get_notes(\n storage_slot,\n note_interface,\n 0,\n [],\n [],\n [],\n [],\n 1, // limit\n 0, // offset\n placeholder_note,\n placeholder_fields\n )[0].unwrap() // Notice: we don't allow dummies to be returned from get_note (singular).\n}\n\nunconstrained fn get_notes_internal<Note, N, FILTER_ARGS>(\n storage_slot: Field,\n note_interface: NoteInterface<Note, N>,\n options: NoteGetterOptions<Note, N, FILTER_ARGS>\n) -> [Option<Note>; MAX_READ_REQUESTS_PER_CALL] {\n let (num_selects, select_by, select_values, sort_by, sort_order) = flatten_options(options.selects, options.sorts);\n let placeholder_opt_notes = [Option::none(); MAX_READ_REQUESTS_PER_CALL];\n let placeholder_fields = [0; GET_NOTES_ORACLE_RETURN_LENGTH];\n let opt_notes = oracle::notes::get_notes(\n storage_slot,\n note_interface,\n num_selects,\n select_by,\n select_values,\n sort_by,\n sort_order,\n options.limit,\n options.offset,\n placeholder_opt_notes,\n placeholder_fields\n );\n\n let filter = options.filter;\n let filter_args = options.filter_args;\n filter(opt_notes, filter_args)\n}\n\nunconstrained pub fn view_notes<Note, N>(\n storage_slot: Field,\n note_interface: NoteInterface<Note, N>,\n options: NoteViewerOptions<Note, N>\n) -> [Option<Note>; MAX_NOTES_PER_PAGE] {\n let (num_selects, select_by, select_values, sort_by, sort_order) = flatten_options(options.selects, options.sorts);\n let placeholder_opt_notes = [Option::none(); MAX_NOTES_PER_PAGE];\n let placeholder_fields = [0; VIEW_NOTE_ORACLE_RETURN_LENGTH];\n oracle::notes::get_notes(\n storage_slot,\n note_interface,\n num_selects,\n select_by,\n select_values,\n sort_by,\n sort_order,\n options.limit,\n options.offset,\n placeholder_opt_notes,\n placeholder_fields\n )\n}\n\nunconstrained fn flatten_options<Note, N>(\n selects: BoundedVec<Option<Select>, N>,\n sorts: BoundedVec<Option<Sort>, N>\n) -> (u8, [u8; N], [Field; N], [u8; N], [u2; N]) {\n let mut num_selects = 0;\n let mut select_by = [0; N];\n let mut select_values = [0; N];\n for i in 0..selects.len {\n let select = selects.get(i);\n if select.is_some() {\n select_by[num_selects] = select.unwrap_unchecked().field_index;\n select_values[num_selects] = select.unwrap_unchecked().value;\n num_selects += 1;\n };\n }\n\n let mut sort_by = [0; N];\n let mut sort_order = [0; N];\n for i in 0..sorts.len {\n let sort = sorts.get(i);\n if sort.is_some() {\n sort_by[i] = sort.unwrap_unchecked().field_index;\n sort_order[i] = sort.unwrap_unchecked().order;\n };\n }\n\n (num_selects, select_by, select_values, sort_by, sort_order)\n}\n",
974
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/note/note_getter.nr"
975
+ },
976
+ "77": {
977
+ "source": "use dep::std::option::Option;\nuse crate::note::{\n note_header::NoteHeader,\n note_interface::NoteInterface,\n};\nuse crate::utils::arr_copy_slice;\n\nuse dep::protocol_types::address::AztecAddress;\n\n#[oracle(notifyCreatedNote)]\nfn notify_created_note_oracle<N>(_storage_slot: Field, _serialized_note: [Field; N], _inner_note_hash: Field) -> Field {}\n\nunconstrained pub fn notify_created_note<N>(storage_slot: Field, serialized_note: [Field; N], inner_note_hash: Field) -> Field {\n notify_created_note_oracle(storage_slot, serialized_note, inner_note_hash)\n}\n\n#[oracle(notifyNullifiedNote)]\nfn notify_nullified_note_oracle<N>(_nullifier: Field, _inner_note_hash: Field) -> Field {}\n\nunconstrained pub fn notify_nullified_note<N>(nullifier: Field, inner_note_hash: Field) -> Field {\n notify_nullified_note_oracle(nullifier, inner_note_hash)\n}\n\n#[oracle(getNotes)]\nfn get_notes_oracle<N, S>(\n _storage_slot: Field,\n _num_selects: u8,\n _select_by: [u8; N],\n _select_values: [Field; N],\n _sort_by: [u8; N],\n _sort_order: [u2; N],\n _limit: u32,\n _offset: u32,\n _return_size: u32,\n _placeholder_fields: [Field; S]\n) -> [Field; S] {}\n\nunconstrained fn get_notes_oracle_wrapper<N, S>(\n storage_slot: Field,\n num_selects: u8,\n select_by: [u8; N],\n select_values: [Field; N],\n sort_by: [u8; N],\n sort_order: [u2; N],\n limit: u32,\n offset: u32,\n mut placeholder_fields: [Field; S]\n) -> [Field; S] {\n let return_size = placeholder_fields.len() as u32;\n get_notes_oracle(\n storage_slot,\n num_selects,\n select_by,\n select_values,\n sort_by,\n sort_order,\n limit,\n offset,\n return_size,\n placeholder_fields\n )\n}\n\nunconstrained pub fn get_notes<Note, N, M, S, NS>(\n storage_slot: Field,\n note_interface: NoteInterface<Note, N>,\n num_selects: u8,\n select_by: [u8; M],\n select_values: [Field; M],\n sort_by: [u8; M],\n sort_order: [u2; M],\n limit: u32,\n offset: u32,\n mut placeholder_opt_notes: [Option<Note>; S], // TODO: Remove it and use `limit` to initialize the note array.\n placeholder_fields: [Field; NS] // TODO: Remove it and use `limit` to initialize the note array.\n) -> [Option<Note>; S] {\n let fields = get_notes_oracle_wrapper(\n storage_slot,\n num_selects,\n select_by,\n select_values,\n sort_by,\n sort_order,\n limit,\n offset,\n placeholder_fields\n );\n let num_notes = fields[0] as u32;\n let contract_address = AztecAddress::from_field(fields[1]);\n let deserialize = note_interface.deserialize;\n let set_header = note_interface.set_header;\n for i in 0..placeholder_opt_notes.len() {\n if i as u32 < num_notes {\n // lengths named as per typescript.\n let return_header_length: Field = 2; // num_notes & contract_address.\n let extra_preimage_length: Field = 2; // nonce & is_transient.\n let read_offset: Field = return_header_length + i * (N + extra_preimage_length);\n let nonce = fields[read_offset];\n let is_transient = fields[read_offset + 1] as bool;\n let header = NoteHeader { contract_address, nonce, storage_slot, is_transient };\n let serialized_note = arr_copy_slice(fields, [0; N], read_offset + 2);\n let mut note = deserialize(serialized_note);\n set_header(&mut note, header);\n placeholder_opt_notes[i] = Option::some(note);\n };\n }\n placeholder_opt_notes\n}\n\n#[oracle(checkNullifierExists)]\nfn check_nullifier_exists_oracle(_inner_nullifier: Field) -> Field {}\n\nunconstrained pub fn check_nullifier_exists(inner_nullifier: Field) -> bool {\n check_nullifier_exists_oracle(inner_nullifier) == 1\n}\n",
978
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/oracle/notes.nr"
979
+ },
980
+ "78": {
981
+ "source": "use dep::protocol_types::{\n abis::function_selector::FunctionSelector,\n address::AztecAddress,\n};\n\n// contract_address + \n// args_hash +\n// crate::abi::FUNCTION_DATA_SIZE +\n// crate::abi::CALL_CONTEXT_SIZE + side_effect_counter\n// = 2 + 4 + 7 + 1\nglobal ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_SIZE: Field = 14;\n\n#[oracle(enqueuePublicFunctionCall)]\nfn enqueue_public_function_call_oracle(\n _contract_address: AztecAddress,\n _function_selector: FunctionSelector,\n _args_hash: Field\n) -> [Field; ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_SIZE] {}\n\nunconstrained pub fn enqueue_public_function_call_internal(\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field\n) -> [Field; ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_SIZE] {\n enqueue_public_function_call_oracle(contract_address, function_selector, args_hash)\n}\n",
982
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/oracle/enqueue_public_function_call.nr"
983
+ },
984
+ "83": {
985
+ "source": "use dep::protocol_types::{\n abis::function_selector::FunctionSelector,\n address::AztecAddress,\n constants::CALL_PRIVATE_FUNCTION_RETURN_SIZE,\n};\n\n#[oracle(callPrivateFunction)]\nfn call_private_function_oracle(\n _contract_address: AztecAddress,\n _function_selector: FunctionSelector,\n _args_hash: Field\n) -> [Field; CALL_PRIVATE_FUNCTION_RETURN_SIZE] {}\n\nunconstrained pub fn call_private_function_internal(\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field\n) -> [Field; CALL_PRIVATE_FUNCTION_RETURN_SIZE] {\n call_private_function_oracle(contract_address, function_selector, args_hash)\n}\n",
986
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/oracle/call_private_function.nr"
987
+ },
988
+ "90": {
989
+ "source": "#[oracle(storageRead)]\nfn storage_read_oracle<N>(_storage_slot: Field, _number_of_elements: Field) -> [Field; N] {}\n\nunconstrained fn storage_read_oracle_wrapper<N>(_storage_slot: Field) -> [Field; N] {\n storage_read_oracle(_storage_slot, N)\n}\n\npub fn storage_read<T, N>(storage_slot: Field, deserialize: fn([Field; N]) -> T) -> T {\n let fields = storage_read_oracle_wrapper(storage_slot);\n deserialize(fields)\n}\n\n#[oracle(storageWrite)]\nfn storage_write_oracle<N>(_storage_slot: Field, _values: [Field; N]) -> [Field; N] {}\n\n// TODO: Remove return value.\nunconstrained pub fn storage_write<N>(storage_slot: Field, fields: [Field; N]) {\n let _hash = storage_write_oracle(storage_slot, fields);\n}\n",
990
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/oracle/storage.nr"
991
+ },
992
+ "92": {
993
+ "source": "use dep::protocol_types::{\n address::{\n AztecAddress,\n PartialAddress,\n },\n grumpkin_point::GrumpkinPoint,\n};\n\n#[oracle(getPublicKeyAndPartialAddress)]\nfn get_public_key_and_partial_address_oracle(_address: AztecAddress) -> [Field; 3] {}\n\nunconstrained fn get_public_key_and_partial_address_internal(address: AztecAddress) -> [Field; 3] {\n get_public_key_and_partial_address_oracle(address)\n}\n\npub fn get_public_key(address: AztecAddress) -> GrumpkinPoint {\n let result = get_public_key_and_partial_address_internal(address);\n let pub_key = GrumpkinPoint::new(result[0], result[1]);\n let partial_address = PartialAddress::from_field(result[2]);\n\n let calculated_address = AztecAddress::compute(pub_key, partial_address);\n assert(calculated_address.eq(address));\n\n pub_key\n}\n",
994
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/oracle/get_public_key.nr"
995
+ },
996
+ "94": {
997
+ "source": "use dep::protocol_types::{\n address::AztecAddress,\n constants::NUM_FIELDS_PER_SHA256,\n grumpkin_point::GrumpkinPoint,\n};\n\n// TODO: Should take encrypted data.\n#[oracle(emitEncryptedLog)]\nfn emit_encrypted_log_oracle<N>(\n _contract_address: AztecAddress,\n _storage_slot: Field,\n _encryption_pub_key: GrumpkinPoint,\n _preimage: [Field; N]\n) -> Field {}\n\nunconstrained pub fn emit_encrypted_log<N>(\n contract_address: AztecAddress,\n storage_slot: Field,\n encryption_pub_key: GrumpkinPoint,\n preimage: [Field; N]\n) -> [Field; NUM_FIELDS_PER_SHA256] {\n [emit_encrypted_log_oracle(contract_address, storage_slot, encryption_pub_key, preimage), 0]\n}\n\n#[oracle(emitUnencryptedLog)]\nfn emit_unencrypted_log_oracle<T>(_contract_address: AztecAddress, _event_selector: Field, _message: T) -> Field {}\n\nunconstrained pub fn emit_unencrypted_log<T>(\n contract_address: AztecAddress,\n event_selector: Field,\n message: T\n) -> [Field; NUM_FIELDS_PER_SHA256] {\n // https://github.com/AztecProtocol/aztec-packages/issues/885\n [emit_unencrypted_log_oracle(contract_address, event_selector, message), 0]\n}\n",
998
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/oracle/logs.nr"
999
+ },
1000
+ "95": {
1001
+ "source": "use crate::oracle::get_public_key::get_public_key;\nuse dep::protocol_types::{\n address::AztecAddress,\n grumpkin_point::GrumpkinPoint,\n};\n\n#[oracle(getSecretKey)]\nfn get_secret_key_oracle(_owner: GrumpkinPoint) -> [Field; dep::std::grumpkin_scalar::GRUMPKIN_SCALAR_SERIALIZED_LEN] {}\n\nunconstrained fn get_secret_key_internal(owner_public_key: GrumpkinPoint) -> dep::std::grumpkin_scalar::GrumpkinScalar {\n dep::std::grumpkin_scalar::deserialize_grumpkin_scalar(get_secret_key_oracle(owner_public_key))\n}\n\npub fn get_secret_key(owner: AztecAddress) -> dep::std::grumpkin_scalar::GrumpkinScalar {\n let owner_public_key = get_public_key(owner);\n let secret = get_secret_key_internal(owner_public_key);\n\n // Constrain the owner - Nullifier secret key is currently just the encryption private key so we can constrain\n // the owner by deriving the public key from the secret key and checking the result.\n let computed_public_key = dep::std::grumpkin_scalar_mul::grumpkin_fixed_base(secret);\n assert(owner_public_key.x == computed_public_key[0]);\n assert(owner_public_key.y == computed_public_key[1]);\n\n secret\n}\n",
1002
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/oracle/get_secret_key.nr"
1003
+ },
1004
+ "96": {
1005
+ "source": "global ARGS_LENGTH: Field = 16;\nglobal RETURN_VALUES_LENGTH: Field = 4;\n\n/**\n * Convention for constant array lengths are mainly divided in 2 classes:\n * - FUNCTION CALL\n * - TRANSACTION\n *\n * Agreed convention is to use MAX_XXX_PER_CALL resp. MAX_XXX_PER_TX, where XXX denotes a type of element such as\n * commitment, or nullifier, e.g.,:\n * - MAX_NEW_NULLIFIERS_PER_CALL\n * - MAX_NEW_COMMITMENTS_PER_TX\n *\n * In the kernel circuits, we accumulate elements such as commitments and the nullifiers from all functions calls in a\n * transaction. Therefore, we always must have:\n * MAX_XXX_PER_TX ≥ MAX_XXX_PER_CALL\n *\n * For instance:\n * MAX_NEW_COMMITMENTS_PER_TX ≥ MAX_NEW_COMMITMENTS_PER_CALL\n * MAX_NEW_NULLIFIERS_PER_TX ≥ MAX_NEW_NULLIFIERS_PER_CALL\n *\n */\n\n// docs:start:constants\n// \"PER CALL\" CONSTANTS\nglobal MAX_NEW_COMMITMENTS_PER_CALL: Field = 16;\nglobal MAX_NEW_NULLIFIERS_PER_CALL: Field = 16;\nglobal MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL: Field = 4;\nglobal MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL: Field = 4;\nglobal MAX_NEW_L2_TO_L1_MSGS_PER_CALL: Field = 2;\nglobal MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL: Field = 16;\nglobal MAX_PUBLIC_DATA_READS_PER_CALL: Field = 16;\nglobal MAX_READ_REQUESTS_PER_CALL: Field = 32;\n\n// \"PER TRANSACTION\" CONSTANTS\nglobal MAX_NEW_COMMITMENTS_PER_TX: Field = 64;\nglobal MAX_NEW_NULLIFIERS_PER_TX: Field = 64;\nglobal MAX_PRIVATE_CALL_STACK_LENGTH_PER_TX: Field = 8;\nglobal MAX_PUBLIC_CALL_STACK_LENGTH_PER_TX: Field = 8;\nglobal MAX_NEW_L2_TO_L1_MSGS_PER_TX: Field = 2;\nglobal MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX: Field = 16;\nglobal MAX_PUBLIC_DATA_READS_PER_TX: Field = 16;\nglobal MAX_NEW_CONTRACTS_PER_TX: Field = 1;\nglobal MAX_OPTIONALLY_REVEALED_DATA_LENGTH_PER_TX: Field = 4;\nglobal MAX_READ_REQUESTS_PER_TX: Field = 128;\nglobal NUM_ENCRYPTED_LOGS_HASHES_PER_TX: Field = 1;\nglobal NUM_UNENCRYPTED_LOGS_HASHES_PER_TX: Field = 1;\n// docs:end:constants\n\n// ROLLUP CONTRACT CONSTANTS - constants used only in l1-contracts\nglobal NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP: Field = 16;\n\n// TREES RELATED CONSTANTS\nglobal VK_TREE_HEIGHT: Field = 3;\nglobal FUNCTION_TREE_HEIGHT: Field = 5;\nglobal CONTRACT_TREE_HEIGHT: Field = 16;\nglobal NOTE_HASH_TREE_HEIGHT: Field = 32;\nglobal PUBLIC_DATA_TREE_HEIGHT: Field = 40;\nglobal NULLIFIER_TREE_HEIGHT: Field = 20;\nglobal L1_TO_L2_MSG_TREE_HEIGHT: Field = 16;\nglobal ROLLUP_VK_TREE_HEIGHT: Field = 8;\n\n// SUB-TREES RELATED CONSTANTS\nglobal CONTRACT_SUBTREE_HEIGHT: Field = 0;\nglobal CONTRACT_SUBTREE_SIBLING_PATH_LENGTH: Field = 16;\nglobal NOTE_HASH_SUBTREE_HEIGHT: Field = 6;\nglobal NOTE_HASH_SUBTREE_SIBLING_PATH_LENGTH: Field = 26;\nglobal NULLIFIER_SUBTREE_HEIGHT: Field = 6;\nglobal PUBLIC_DATA_SUBTREE_HEIGHT: Field = 4;\nglobal ARCHIVE_HEIGHT: Field = 16;\nglobal NULLIFIER_SUBTREE_SIBLING_PATH_LENGTH: Field = 14;\nglobal PUBLIC_DATA_SUBTREE_SIBLING_PATH_LENGTH: Field = 36;\nglobal L1_TO_L2_MSG_SUBTREE_HEIGHT: Field = 4;\nglobal L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH: Field = 12;\n\n// MISC CONSTANTS\nglobal FUNCTION_SELECTOR_NUM_BYTES: Field = 4;\nglobal MAPPING_SLOT_PEDERSEN_SEPARATOR: Field = 4;\nglobal NUM_FIELDS_PER_SHA256: Field = 2;\nglobal ARGS_HASH_CHUNK_LENGTH: u32 = 32;\nglobal ARGS_HASH_CHUNK_COUNT: u32 = 16;\n\n// NOIR CONSTANTS - constants used only in yarn-packages/noir-contracts\n// Some are defined here because Noir doesn't yet support globals referencing other globals yet.\n// Move these constants to a noir file once the issue bellow is resolved:\n// https://github.com/noir-lang/noir/issues/1734\nglobal L1_TO_L2_MESSAGE_LENGTH: Field = 8;\nglobal L1_TO_L2_MESSAGE_ORACLE_CALL_LENGTH: Field = 26;\nglobal MAX_NOTE_FIELDS_LENGTH: Field = 20;\n// GET_NOTE_ORACLE_RETURN_LENGT = MAX_NOTE_FIELDS_LENGTH + 1 + 2\n// The plus 1 is 1 extra field for nonce.\n// + 2 for EXTRA_DATA: [number_of_return_notes, contract_address]\nglobal GET_NOTE_ORACLE_RETURN_LENGTH: Field = 23;\nglobal MAX_NOTES_PER_PAGE: Field = 10;\n// VIEW_NOTE_ORACLE_RETURN_LENGTH = MAX_NOTES_PER_PAGE * (MAX_NOTE_FIELDS_LENGTH + 1) + 2;\nglobal VIEW_NOTE_ORACLE_RETURN_LENGTH: Field = 212;\nglobal CALL_CONTEXT_LENGTH: Field = 8;\nglobal BLOCK_HEADER_LENGTH: Field = 7;\nglobal FUNCTION_DATA_LENGTH: Field = 4;\nglobal CONTRACT_DEPLOYMENT_DATA_LENGTH: Field = 6;\n// Change this ONLY if you have changed the PrivateCircuitPublicInputs structure.\n// In other words, if the structure/size of the public inputs of a function call changes then we\n// should change this constant as well as the offsets in private_call_stack_item.nr\nglobal PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH: Field = 189;\nglobal CONTRACT_STORAGE_UPDATE_REQUEST_LENGTH: Field = 3;\nglobal CONTRACT_STORAGE_READ_LENGTH: Field = 2;\n// Change this ONLY if you have changed the PublicCircuitPublicInputs structure.\nglobal PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH: Field = 190;\nglobal GET_NOTES_ORACLE_RETURN_LENGTH: Field = 674;\nglobal CALL_PRIVATE_FUNCTION_RETURN_SIZE: Field = 195;\nglobal PUBLIC_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH: Field = 87;\nglobal PRIVATE_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH: Field = 177;\nglobal COMMITMENTS_NUM_BYTES_PER_BASE_ROLLUP: Field = 2048;\nglobal NULLIFIERS_NUM_BYTES_PER_BASE_ROLLUP: Field = 2048;\nglobal PUBLIC_DATA_WRITES_NUM_BYTES_PER_BASE_ROLLUP: Field = 1024;\nglobal CONTRACTS_NUM_BYTES_PER_BASE_ROLLUP: Field = 32;\nglobal CONTRACT_DATA_NUM_BYTES_PER_BASE_ROLLUP: Field = 64;\nglobal CONTRACT_DATA_NUM_BYTES_PER_BASE_ROLLUP_UNPADDED: Field = 52;\nglobal L2_TO_L1_MSGS_NUM_BYTES_PER_BASE_ROLLUP: Field = 64;\nglobal LOGS_HASHES_NUM_BYTES_PER_BASE_ROLLUP: Field = 64;\n\n/**\n * Enumerate the hash_indices which are used for pedersen hashing.\n * We start from 1 to avoid the default generators. The generator indices are listed\n * based on the number of elements each index hashes. The following conditions must be met:\n *\n * +-----------+-------------------------------+----------------------+\n * | Hash size | Number of elements hashed (n) | Condition to use |\n * |-----------+-------------------------------+----------------------|\n * | LOW | n ≤ 8 | 0 < hash_index ≤ 32 |\n * | MID | 8 < n ≤ 16 | 32 < hash_index ≤ 40 |\n * | HIGH | 16 < n ≤ 48 | 40 < hash_index ≤ 48 |\n * +-----------+-------------------------------+----------------------+\n *\n * Note: When modifying, modify `GeneratorIndexPacker` in packer.hpp accordingly.\n */\n// Indices with size ≤ 8\nglobal GENERATOR_INDEX__COMMITMENT = 1;\nglobal GENERATOR_INDEX__COMMITMENT_NONCE = 2;\nglobal GENERATOR_INDEX__UNIQUE_COMMITMENT = 3;\nglobal GENERATOR_INDEX__SILOED_COMMITMENT = 4;\nglobal GENERATOR_INDEX__NULLIFIER = 5;\nglobal GENERATOR_INDEX__INITIALIZATION_NULLIFIER = 6;\nglobal GENERATOR_INDEX__OUTER_NULLIFIER = 7;\nglobal GENERATOR_INDEX__PUBLIC_DATA_READ = 8;\nglobal GENERATOR_INDEX__PUBLIC_DATA_UPDATE_REQUEST = 9;\nglobal GENERATOR_INDEX__FUNCTION_DATA = 10;\nglobal GENERATOR_INDEX__FUNCTION_LEAF = 11;\nglobal GENERATOR_INDEX__CONTRACT_DEPLOYMENT_DATA = 12;\nglobal GENERATOR_INDEX__CONSTRUCTOR = 13;\nglobal GENERATOR_INDEX__CONSTRUCTOR_ARGS = 14;\nglobal GENERATOR_INDEX__CONTRACT_ADDRESS = 15;\nglobal GENERATOR_INDEX__CONTRACT_LEAF = 16;\nglobal GENERATOR_INDEX__CALL_CONTEXT = 17;\nglobal GENERATOR_INDEX__CALL_STACK_ITEM = 18;\nglobal GENERATOR_INDEX__CALL_STACK_ITEM_2 = 19;\nglobal GENERATOR_INDEX__L1_TO_L2_MESSAGE_SECRET = 20;\nglobal GENERATOR_INDEX__L2_TO_L1_MSG = 21;\nglobal GENERATOR_INDEX__TX_CONTEXT = 22;\nglobal GENERATOR_INDEX__PUBLIC_LEAF_INDEX = 23;\nglobal GENERATOR_INDEX__PUBLIC_DATA_LEAF = 24;\nglobal GENERATOR_INDEX__SIGNED_TX_REQUEST = 25;\nglobal GENERATOR_INDEX__GLOBAL_VARIABLES = 26;\nglobal GENERATOR_INDEX__PARTIAL_ADDRESS = 27;\nglobal GENERATOR_INDEX__BLOCK_HASH = 28;\nglobal GENERATOR_INDEX__SIDE_EFFECT = 29;\n// Indices with size ≤ 16\nglobal GENERATOR_INDEX__TX_REQUEST = 33;\nglobal GENERATOR_INDEX__SIGNATURE_PAYLOAD = 34;\n// Indices with size ≤ 44\nglobal GENERATOR_INDEX__VK = 41;\nglobal GENERATOR_INDEX__PRIVATE_CIRCUIT_PUBLIC_INPUTS = 42;\nglobal GENERATOR_INDEX__PUBLIC_CIRCUIT_PUBLIC_INPUTS = 43;\nglobal GENERATOR_INDEX__FUNCTION_ARGS = 44;\n",
1006
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/constants.nr"
1007
+ },
1008
+ "99": {
1009
+ "source": "use crate::address::{AztecAddress, EthAddress};\nuse crate::mocked::VerificationKey;\nuse crate::abis::function_selector::FunctionSelector;\nuse crate::abis::function_leaf_preimage::FunctionLeafPreimage;\nuse crate::abis::new_contract_data::NewContractData as ContractLeafPreimage;\nuse crate::abis::function_data::FunctionData;\nuse crate::abis::side_effect::{SideEffect};\nuse crate::utils::uint128::U128;\nuse crate::utils::uint256::U256;\nuse crate::utils::bounded_vec::BoundedVec;\nuse crate::constants::{\n ARGS_HASH_CHUNK_COUNT,\n ARGS_HASH_CHUNK_LENGTH,\n CONTRACT_TREE_HEIGHT, \n FUNCTION_TREE_HEIGHT, \n NOTE_HASH_TREE_HEIGHT,\n GENERATOR_INDEX__SILOED_COMMITMENT,\n GENERATOR_INDEX__OUTER_NULLIFIER,\n GENERATOR_INDEX__VK,\n GENERATOR_INDEX__CONSTRUCTOR,\n GENERATOR_INDEX__PARTIAL_ADDRESS,\n GENERATOR_INDEX__CONTRACT_ADDRESS,\n GENERATOR_INDEX__COMMITMENT_NONCE,\n GENERATOR_INDEX__UNIQUE_COMMITMENT,\n GENERATOR_INDEX__FUNCTION_ARGS,\n};\n\nuse dep::std::hash::{pedersen_hash_with_separator, sha256};\n\npub fn sha256_to_field<N>(bytes_to_hash: [u8; N]) -> Field {\n let sha256_hashed = sha256(bytes_to_hash);\n\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (sha256_hashed[15 - i] as Field) * v;\n low = low + (sha256_hashed[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n let hash_in_a_field = low + high * v;\n\n hash_in_a_field\n}\n\npub fn hash_args<N>(args: [Field; N]) -> Field {\n if args.len() == 0 {\n 0\n } else {\n let mut chunks_hashes = [0; ARGS_HASH_CHUNK_COUNT];\n for i in 0..ARGS_HASH_CHUNK_COUNT {\n let mut chunk_hash = 0;\n let start_chunk_index = i * ARGS_HASH_CHUNK_LENGTH;\n if start_chunk_index < (args.len() as u32) {\n let mut chunk_args = [0; ARGS_HASH_CHUNK_LENGTH];\n for j in 0..ARGS_HASH_CHUNK_LENGTH {\n let item_index = i * ARGS_HASH_CHUNK_LENGTH + j;\n if item_index < (args.len() as u32) {\n chunk_args[j] = args[item_index];\n }\n }\n chunk_hash = pedersen_hash(chunk_args, GENERATOR_INDEX__FUNCTION_ARGS);\n }\n chunks_hashes[i] = chunk_hash;\n }\n pedersen_hash(chunks_hashes, GENERATOR_INDEX__FUNCTION_ARGS)\n }\n}\n\n// Checks that `value` is a member of a merkle tree with root `root` at position `index`\n// The witness being the `sibling_path`\npub fn assert_check_membership<N>(value: Field, index: Field, sibling_path: [Field; N], root: Field) {\n let calculated_root = root_from_sibling_path(value, index, sibling_path);\n assert(calculated_root == root, \"membership check failed\");\n}\n\n// Calculate the Merkle tree root from the sibling path and leaf.\n//\n// The leaf is hashed with its sibling, and then the result is hashed\n// with the next sibling etc in the path. The last hash is the root.\n//\n// TODO(David/Someone): The cpp code is using a uint256, whereas its\n// TODO a bit simpler in Noir to just have a bit array.\n// TODO: I'd generally like to avoid u256 for algorithms like \n// this because it means we never even need to consider cases where \n// the index is greater than p.\npub fn root_from_sibling_path<N>(leaf: Field, leaf_index: Field, sibling_path: [Field; N]) -> Field {\n let mut node = leaf;\n let indices = leaf_index.to_le_bits(N);\n\n for i in 0..N {\n let (hash_left, hash_right) = if indices[i] == 1 {\n (sibling_path[i], node)\n } else {\n (node, sibling_path[i])\n };\n node = merkle_hash(hash_left, hash_right);\n }\n node\n}\n\n// Calculate the function tree root from the sibling path and leaf preimage.\n//\n// TODO: The cpp code passes in components of the FunctionLeafPreimage and then \n// builds it up. We should build it up and then pass the leaf preimage as a parameter.\n// We can then choose to have a general method that takes in anything hashable\n// and deduplicate the logic in `contract_tree_root_from_siblings`\npub fn function_tree_root_from_siblings(\n selector: FunctionSelector,\n is_internal: bool,\n is_private: bool,\n vk_hash: Field,\n acir_hash: Field,\n function_leaf_index: Field,\n function_leaf_sibling_path: [Field; FUNCTION_TREE_HEIGHT]\n) -> Field {\n let function_leaf_preimage = FunctionLeafPreimage { selector, is_internal, is_private, vk_hash, acir_hash };\n\n let function_leaf = function_leaf_preimage.hash();\n\n let function_tree_root = root_from_sibling_path(function_leaf, function_leaf_index, function_leaf_sibling_path);\n\n function_tree_root\n}\n\n// Calculate the contract tree root from the sibling path and leaf preimage.\npub fn contract_tree_root_from_siblings(\n function_tree_root: Field,\n storage_contract_address: AztecAddress,\n portal_contract_address: EthAddress,\n contract_leaf_index: Field,\n contract_leaf_sibling_path: [Field; CONTRACT_TREE_HEIGHT]\n) -> Field {\n //TODO(Kev): if we use shorthand syntax here, we get an error as expected,\n // since variable name is `storage_contract_address` but the span is incorrect.\n let contract_leaf_preimage = ContractLeafPreimage { contract_address: storage_contract_address, portal_contract_address, function_tree_root };\n\n let contract_leaf = contract_leaf_preimage.hash();\n\n let computed_contract_tree_root = root_from_sibling_path(contract_leaf, contract_leaf_index, contract_leaf_sibling_path);\n\n computed_contract_tree_root\n}\n\npub fn read_request_root_from_siblings(\n read_request: Field,\n leaf_index: Field,\n sibling_path: [Field; NOTE_HASH_TREE_HEIGHT]\n) -> Field {\n root_from_sibling_path(read_request, leaf_index, sibling_path)\n}\n\npub fn silo_commitment(address: AztecAddress, inner_commitment: Field) -> Field {\n pedersen_hash(\n [\n address.to_field(),\n inner_commitment\n ],\n GENERATOR_INDEX__SILOED_COMMITMENT\n )\n}\n\npub fn silo_nullifier(address: AztecAddress, nullifier: Field) -> Field {\n pedersen_hash(\n [\n address.to_field(),\n nullifier\n ],\n GENERATOR_INDEX__OUTER_NULLIFIER\n )\n}\n\nfn merkle_hash(left: Field, right: Field) -> Field {\n pedersen_hash([left, right], 0)\n}\n\npub fn stdlib_recursion_verification_key_compress_native_vk(_vk: VerificationKey) -> Field {\n // Original cpp code\n // stdlib::recursion::verification_key<CT::bn254>::compress_native(private_call.vk, GeneratorIndex::VK);\n // The above cpp method is only ever called on verification key, so it has been special cased here\n let _hash_index = GENERATOR_INDEX__VK;\n 0\n}\n\n// TODO CPP uses blake2s for this\npub fn compute_new_contract_address_hash(new_contract_address: AztecAddress) -> Field {\n dep::std::hash::pedersen_hash([new_contract_address.to_field()])\n}\n\npub fn compute_l2_to_l1_hash(\n contract_address: AztecAddress,\n rollup_version_id: Field,\n portal_contract_address: EthAddress,\n chain_id: Field,\n content: Field\n) -> Field {\n let mut bytes: BoundedVec<u8, 160> = BoundedVec::new(0);\n\n let inputs = [\n contract_address.to_field(), rollup_version_id, portal_contract_address.to_field(), chain_id, content\n ];\n for i in 0..inputs.len() {\n // TODO are bytes be in fr.to_buffer() ?\n let item_bytes = inputs[i].to_be_bytes(32);\n for j in 0..32 {\n bytes.push(item_bytes[j]);\n }\n }\n\n sha256_to_field(bytes.storage)\n}\n\npub fn compute_constructor_hash(\n function_data: FunctionData,\n args_hash: Field,\n constructor_vk_hash: Field\n) -> Field {\n let function_data_hash = function_data.hash();\n\n pedersen_hash(\n [\n function_data_hash,\n args_hash,\n constructor_vk_hash\n ],\n GENERATOR_INDEX__CONSTRUCTOR\n )\n}\n\n// sha256 hash is stored in two fields to accommodate all 256-bits of the hash\nglobal NUM_FIELDS_PER_SHA256 : Field = 2;\n\n// Computes sha256 hash of 2 input hashes stored in 4 fields.\n// \n// This method is bn254 specific. Two fields is needed in order to \n// encode the sha256 output. It can be abstracted away with any 4-2 hash function.\n//\n// TODO(Jan and David): This is used for the encrypted_log hashes.\n// Can we check to see if we can just use hash_to_field or pedersen_compress here?\n//\n// Returning a Field would be desirable because then this can be replaced with \n// poseidon without changing the rest of the code\n//\npub fn accumulate_sha256(input: [U128; 4]) -> [Field; NUM_FIELDS_PER_SHA256] {\n // This is a note about the cpp code, since it takes an array of Fields\n // instead of a U128.\n // 4 Field elements when converted to bytes will usually \n // occupy 4 * 32 = 128 bytes.\n // However, this function is making the assumption that each Field \n // only occupies 128 bits.\n //\n // TODO(David): This does not seem to be getting guaranteed anywhere in the code?\n //\n // Concatenate 4 u128 bit integers into a byte array.\n let mut hash_input_flattened = [0; 64];\n for offset in 0..4 {\n let input_as_bytes = input[offset].to_be_bytes();\n for byte_index in 0..16 {\n hash_input_flattened[offset * 16 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n let sha_digest = dep::std::hash::sha256(hash_input_flattened);\n\n U256::from_bytes32(sha_digest).to_u128_limbs()\n}\n\npub fn compute_logs_hash(\n previous_log_hash: [Field; 2],\n current_log_hash: [Field; 2]\n) -> [Field; NUM_FIELDS_PER_SHA256] {\n accumulate_sha256(\n [\n U128::from_field(previous_log_hash[0]),\n U128::from_field(previous_log_hash[1]),\n U128::from_field(current_log_hash[0]),\n U128::from_field(current_log_hash[1])\n ]\n )\n}\n\npub fn compute_commitment_nonce(first_nullifier: Field, commitment_index: Field) -> Field {\n pedersen_hash(\n [\n first_nullifier,\n commitment_index\n ],\n GENERATOR_INDEX__COMMITMENT_NONCE\n )\n}\n\npub fn compute_unique_siloed_commitment(nonce: Field, siloed_commitment: Field) -> Field {\n pedersen_hash(\n [\n nonce,\n siloed_commitment\n ],\n GENERATOR_INDEX__UNIQUE_COMMITMENT\n )\n}\n\npub fn compute_unique_siloed_commitments<N>(\n first_nullifier: Field,\n siloed_commitments: [SideEffect; N]\n) -> [SideEffect; N] {\n let mut unique_siloed_commitments = [SideEffect::empty(); N];\n for i in 0..N {\n let siloed_commitment = siloed_commitments[i];\n if siloed_commitment.value != 0 {\n let nonce = compute_commitment_nonce(first_nullifier, i);\n unique_siloed_commitments[i] = SideEffect {\n value: compute_unique_siloed_commitment(nonce, siloed_commitment.value),\n counter: siloed_commitment.counter\n };\n }\n }\n unique_siloed_commitments\n}\n\npub fn pedersen_hash<N>(inputs: [Field; N], hash_index: u32) -> Field {\n dep::std::hash::pedersen_hash_with_separator(inputs, hash_index)\n}\n",
1010
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/hash.nr"
1011
+ },
1012
+ "115": {
1013
+ "source": "use crate::{\n constants::{\n GENERATOR_INDEX__CONTRACT_ADDRESS,\n GENERATOR_INDEX__PARTIAL_ADDRESS,\n },\n hash::pedersen_hash,\n utils,\n grumpkin_point::GrumpkinPoint,\n};\nuse dep::std::cmp::Eq;\nuse crate::traits::Empty;\n\n// Aztec address\nstruct AztecAddress {\n inner : Field\n}\n\nimpl Eq for AztecAddress {\n fn eq(self, other : Self) -> bool {\n self.to_field() == other.to_field()\n }\n}\n\nimpl Empty for AztecAddress {\n fn empty() -> Self {\n Self {\n inner : 0\n }\n }\n}\n\nimpl AztecAddress {\n pub fn zero() -> Self {\n Self {\n inner: 0\n }\n }\n\n pub fn from_field(field : Field) -> Self {\n Self {\n inner : field\n }\n }\n\n pub fn compute(pub_key: GrumpkinPoint, partial_address: PartialAddress) -> AztecAddress {\n AztecAddress::from_field(\n pedersen_hash(\n [pub_key.x, pub_key.y, partial_address.to_field()],\n GENERATOR_INDEX__CONTRACT_ADDRESS\n )\n )\n }\n\n pub fn to_field(self) -> Field {\n self.inner\n }\n\n pub fn is_zero(self) -> bool {\n self.inner == 0\n }\n \n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n\n pub fn conditional_assign(predicate: bool, lhs : Self, rhs : Self) -> Self{\n let result = utils::conditional_assign(predicate, rhs.to_field(), lhs.to_field());\n Self {\n inner : result\n }\n }\n\n pub fn serialize(self: Self) -> [Field; 1] {\n [self.inner]\n }\n\n pub fn deserialize(fields: [Field; 1]) -> Self {\n Self {\n inner: fields[0]\n }\n }\n}\n\nstruct EthAddress{\n inner : Field\n}\n\nimpl Eq for EthAddress {\n fn eq(self, other : Self) -> bool {\n self.to_field() == other.to_field()\n }\n}\n\nimpl Empty for EthAddress {\n fn empty() -> Self {\n Self {\n inner : 0\n }\n }\n}\n\nimpl EthAddress{\n pub fn zero() -> Self {\n Self {\n inner: 0\n }\n }\n\n pub fn from_field(field : Field) -> Self {\n Self {\n inner : field\n }\n }\n\n pub fn to_field(self) -> Field{\n self.inner\n }\n\n pub fn is_zero(self) -> bool {\n self.inner == 0\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n\n pub fn conditional_assign(predicate: bool, lhs : Self, rhs : Self) -> Self{\n let result = utils::conditional_assign(predicate, rhs.to_field(), lhs.to_field());\n Self {\n inner : result\n }\n }\n\n pub fn serialize(self: Self) -> [Field; 1] {\n [self.inner]\n }\n\n pub fn deserialize(fields: [Field; 1]) -> Self {\n Self {\n inner: fields[0]\n }\n }\n}\n\n// Partial address\nstruct PartialAddress {\n inner : Field\n}\n\nimpl PartialAddress {\n pub fn from_field(field : Field) -> Self {\n Self {\n inner : field\n }\n }\n\n pub fn compute(contract_address_salt : Field, function_tree_root : Field, constructor_hash : Field) -> Self {\n PartialAddress::from_field(\n pedersen_hash([\n // TODO why the zeroes?\n 0,\n 0,\n contract_address_salt,\n function_tree_root,\n constructor_hash\n ], GENERATOR_INDEX__PARTIAL_ADDRESS)\n )\n }\n\n pub fn to_field(self) -> Field {\n self.inner\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n}\n",
1014
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/address.nr"
1015
+ },
1016
+ "120": {
1017
+ "source": "use crate::address::EthAddress;\nuse crate::constants::{\n CONTRACT_DEPLOYMENT_DATA_LENGTH,\n GENERATOR_INDEX__CONTRACT_DEPLOYMENT_DATA,\n};\nuse crate::hash::pedersen_hash;\nuse crate::grumpkin_point::GrumpkinPoint;\nuse crate::traits::Hash;\n\n// docs:start:contract-deployment-data\nstruct ContractDeploymentData {\n deployer_public_key : GrumpkinPoint,\n constructor_vk_hash : Field,\n function_tree_root : Field,\n contract_address_salt : Field,\n portal_contract_address : EthAddress,\n}\n// docs:end:contract-deployment-data\n\nimpl Hash for ContractDeploymentData {\n fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__CONTRACT_DEPLOYMENT_DATA)\n }\n}\n\nimpl ContractDeploymentData {\n fn serialize(self) -> [Field; CONTRACT_DEPLOYMENT_DATA_LENGTH] {\n [\n self.deployer_public_key.x,\n self.deployer_public_key.y,\n self.constructor_vk_hash,\n self.function_tree_root,\n self.contract_address_salt,\n self.portal_contract_address.to_field(),\n ]\n }\n\n fn assert_is_zero(self) {\n self.deployer_public_key.assert_is_zero();\n assert(self.constructor_vk_hash == 0);\n assert(self.function_tree_root == 0);\n assert(self.contract_address_salt == 0);\n self.portal_contract_address.assert_is_zero();\n }\n\n}\n",
1018
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/contrakt/deployment_data.nr"
1019
+ },
1020
+ "121": {
1021
+ "source": "use crate::{\n constants::{\n CONTRACT_STORAGE_UPDATE_REQUEST_LENGTH,\n GENERATOR_INDEX__PUBLIC_DATA_UPDATE_REQUEST,\n },\n hash::pedersen_hash,\n};\nuse dep::std::cmp::Eq;\nuse crate::traits::{Hash, Empty};\n\nstruct StorageUpdateRequest{\n storage_slot : Field,\n old_value : Field,\n new_value : Field,\n}\n\nimpl Eq for StorageUpdateRequest {\n fn eq(self, request: Self) -> bool {\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/3595)\n (request.storage_slot == self.storage_slot)\n & (request.old_value == self.old_value)\n & (request.new_value == self.new_value)\n }\n}\n\nimpl Empty for StorageUpdateRequest {\n fn empty() -> Self {\n StorageUpdateRequest {\n storage_slot: 0,\n old_value: 0,\n new_value: 0,\n }\n }\n}\n\nimpl Hash for StorageUpdateRequest {\n fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__PUBLIC_DATA_UPDATE_REQUEST)\n }\n}\n\nimpl StorageUpdateRequest {\n pub fn serialize(self) -> [Field; CONTRACT_STORAGE_UPDATE_REQUEST_LENGTH] {\n [self.storage_slot, self.old_value, self.new_value]\n }\n\n pub fn is_empty(self) -> bool {\n self.storage_slot == 0\n }\n}\n",
1022
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/contrakt/storage_update_request.nr"
1023
+ },
1024
+ "122": {
1025
+ "source": "use crate::{\n constants::{\n CONTRACT_STORAGE_READ_LENGTH,\n GENERATOR_INDEX__PUBLIC_DATA_READ,\n },\n hash::pedersen_hash,\n};\nuse crate::traits::Empty;\n\nstruct StorageRead {\n storage_slot: Field,\n current_value: Field,\n}\n\nimpl Empty for StorageRead { \n fn empty() -> Self {\n Self {\n storage_slot: 0,\n current_value: 0,\n }\n }\n}\n\nimpl StorageRead {\n\n pub fn serialize(self) -> [Field; CONTRACT_STORAGE_READ_LENGTH] {\n [self.storage_slot, self.current_value]\n }\n\n pub fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__PUBLIC_DATA_READ)\n }\n\n pub fn is_empty(self) -> bool {\n self.storage_slot == 0\n }\n}\n",
1026
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/contrakt/storage_read.nr"
1027
+ },
1028
+ "131": {
1029
+ "source": "use crate::abis::{\n function_data::FunctionData,\n private_circuit_public_inputs::PrivateCircuitPublicInputs,\n public_circuit_public_inputs::PublicCircuitPublicInputs,\n};\nuse crate::address::AztecAddress;\nuse crate::constants::{\n GENERATOR_INDEX__CALL_STACK_ITEM,\n};\nuse crate::traits::Hash;\n\nstruct PrivateCallStackItem {\n // This is the _actual_ contract address relating to where this function's code resides in the\n // contract tree. Regardless of whether this is a call or delegatecall, this\n // `contract_address` _does not change_. Amongst other things, it's used as a lookup for\n // getting the correct code from the tree. There is a separate `storage_contract_address`\n // within a CallStackItem which varies depending on whether this is a call or delegatecall.\n contract_address: AztecAddress,\n public_inputs: PrivateCircuitPublicInputs,\n function_data: FunctionData,\n // Not really needed for PrivateCallStackItem.\n is_execution_request: bool,\n}\n\nimpl Hash for PrivateCallStackItem {\n fn hash(self) -> Field {\n dep::std::hash::pedersen_hash_with_separator([\n self.contract_address.to_field(),\n self.function_data.hash(),\n self.public_inputs.hash(),\n ], GENERATOR_INDEX__CALL_STACK_ITEM)\n }\n}\n\nstruct PublicCallStackItem {\n contract_address: AztecAddress,\n public_inputs: PublicCircuitPublicInputs,\n function_data: FunctionData,\n // True if this call stack item represents a request to execute a function rather than a\n // fulfilled execution. Used when enqueuing calls from private to public functions.\n is_execution_request: bool,\n}\n\nimpl Hash for PublicCallStackItem {\n fn hash(self) -> Field {\n let item = if self.is_execution_request {\n self.as_execution_request()\n } else {\n self\n };\n\n dep::std::hash::pedersen_hash_with_separator([\n item.contract_address.to_field(),\n item.function_data.hash(),\n item.public_inputs.hash(),\n ], GENERATOR_INDEX__CALL_STACK_ITEM)\n }\n}\n\nimpl PublicCallStackItem {\n fn as_execution_request(self) -> Self {\n let public_inputs = self.public_inputs;\n let mut request_public_inputs: PublicCircuitPublicInputs = dep::std::unsafe::zeroed();\n request_public_inputs.call_context = public_inputs.call_context;\n request_public_inputs.args_hash = public_inputs.args_hash;\n\n let call_stack_item = PublicCallStackItem {\n contract_address: self.contract_address,\n function_data: self.function_data,\n is_execution_request: true,\n public_inputs: request_public_inputs,\n };\n call_stack_item\n }\n}\n",
1030
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/call_stack_item.nr"
1031
+ },
1032
+ "136": {
1033
+ "source": "use crate::constants::{GENERATOR_INDEX__SIDE_EFFECT};\nuse dep::std::cmp::Eq;\nuse crate::traits::{Empty, Hash};\n\nstruct SideEffect{\n value: Field,\n counter: Field,\n}\n\nimpl Eq for SideEffect {\n fn eq(self, side_effect: SideEffect) -> bool {\n (self.value == side_effect.value)\n & (self.counter == side_effect.counter)\n }\n}\n\nimpl Empty for SideEffect {\n fn empty() -> Self {\n SideEffect {\n value: 0,\n counter: 0,\n }\n }\n}\n\nimpl Hash for SideEffect {\n fn hash(self) -> Field {\n dep::std::hash::pedersen_hash_with_separator(\n self.serialize() , GENERATOR_INDEX__SIDE_EFFECT)\n }\n}\n\nimpl SideEffect {\n pub fn serialize(self) -> [Field; 2] {\n [self.value, self.counter]\n }\n\n pub fn deserialise(values: [Field; 2]) -> Self {\n Self {\n value: values[0],\n counter: values[1],\n }\n }\n\n pub fn is_empty(self) -> bool {\n (self.value == 0)\n & (self.counter == 0)\n }\n}\n\nstruct SideEffectLinkedToNoteHash{\n value: Field,\n note_hash: Field,\n counter: Field,\n}\n\nimpl Eq for SideEffectLinkedToNoteHash {\n fn eq(self, side_effect: SideEffectLinkedToNoteHash) -> bool {\n (self.value == side_effect.value)\n & (self.note_hash == side_effect.note_hash) \n & (self.counter == side_effect.counter)\n }\n}\n\nimpl Empty for SideEffectLinkedToNoteHash {\n fn empty() -> Self {\n SideEffectLinkedToNoteHash {\n value: 0,\n note_hash: 0,\n counter: 0,\n }\n }\n}\n\nimpl Hash for SideEffectLinkedToNoteHash {\n fn hash(self) -> Field {\n dep::std::hash::pedersen_hash_with_separator(\n self.serialize(),\n GENERATOR_INDEX__SIDE_EFFECT)\n }\n}\n\nimpl SideEffectLinkedToNoteHash{\n pub fn serialize(self) -> [Field; 3] {\n [self.value, self.note_hash, self.counter]\n }\n\n pub fn deserialise(values: [Field; 3]) -> Self {\n Self {\n value: values[0],\n note_hash: values[1],\n counter: values[2],\n }\n }\n\n pub fn is_empty(self) -> bool {\n (self.value == 0)\n & (self.note_hash == 0)\n & (self.counter == 0)\n }\n}\n\n",
1034
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/side_effect.nr"
1035
+ },
1036
+ "139": {
1037
+ "source": "use crate::constants::{\n MAX_NEW_L2_TO_L1_MSGS_PER_CALL,\n MAX_NEW_NULLIFIERS_PER_CALL,\n MAX_NEW_COMMITMENTS_PER_CALL,\n MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL,\n MAX_PUBLIC_DATA_READS_PER_CALL,\n MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL,\n RETURN_VALUES_LENGTH,\n GENERATOR_INDEX__PUBLIC_CIRCUIT_PUBLIC_INPUTS,\n PUBLIC_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH,\n PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH,\n};\nuse crate::{\n abis::{\n call_context::CallContext,\n side_effect::{SideEffect, SideEffectLinkedToNoteHash},\n block_header::BlockHeader,\n },\n address::AztecAddress,\n contrakt::{\n storage_read::StorageRead,\n storage_update_request::StorageUpdateRequest,\n },\n hash::{NUM_FIELDS_PER_SHA256},\n utils::bounded_vec::BoundedVec,\n};\n\nstruct PublicCircuitPublicInputs{\n call_context: CallContext,\n\n args_hash: Field,\n return_values: [Field; RETURN_VALUES_LENGTH],\n\n contract_storage_update_requests: [StorageUpdateRequest; MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL],\n contract_storage_reads: [StorageRead; MAX_PUBLIC_DATA_READS_PER_CALL],\n\n // todo: add sideeffect ranges for the input to these hashes\n public_call_stack_hashes: [Field; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL],\n new_commitments: [SideEffect; MAX_NEW_COMMITMENTS_PER_CALL],\n new_nullifiers: [SideEffectLinkedToNoteHash; MAX_NEW_NULLIFIERS_PER_CALL],\n new_l2_to_l1_msgs: [Field; MAX_NEW_L2_TO_L1_MSGS_PER_CALL],\n\n unencrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n\n // Here so that the gas cost of this request can be measured by circuits, without actually needing to feed in the\n // variable-length data.\n unencrypted_log_preimages_length: Field,\n\n block_header: BlockHeader,\n\n prover_address: AztecAddress,\n}\n\nimpl PublicCircuitPublicInputs{\n fn hash(self) -> Field { \n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/3595) have mercy por favor \n let mut inputs: BoundedVec<Field, PUBLIC_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH> = BoundedVec::new(0);\n inputs.push(self.call_context.hash());\n inputs.push(self.args_hash);\n inputs.push_array(self.return_values);\n for i in 0..MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL {\n inputs.push(self.contract_storage_update_requests[i].hash());\n }\n for i in 0..MAX_PUBLIC_DATA_READS_PER_CALL {\n inputs.push(self.contract_storage_reads[i].hash());\n }\n inputs.push_array(self.public_call_stack_hashes);\n\n for i in 0..MAX_NEW_COMMITMENTS_PER_CALL{\n inputs.push(self.new_commitments[i].hash());\n }\n for i in 0..MAX_NEW_NULLIFIERS_PER_CALL{\n inputs.push(self.new_nullifiers[i].hash());\n }\n inputs.push_array(self.new_l2_to_l1_msgs);\n inputs.push_array(self.unencrypted_logs_hash);\n inputs.push(self.unencrypted_log_preimages_length);\n inputs.push_array(self.block_header.serialize());\n inputs.push(self.prover_address.to_field());\n\n assert_eq(inputs.len(), PUBLIC_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH, \"Incorrect number of input fields when hashing PublicCircuitPublicInputs\");\n\n dep::std::hash::pedersen_hash_with_separator(inputs.storage, GENERATOR_INDEX__PUBLIC_CIRCUIT_PUBLIC_INPUTS)\n }\n\n pub fn serialize(self) -> [Field; PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH] {\n let mut fields: BoundedVec<Field, PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH> = BoundedVec::new(0); \n fields.push_array(self.call_context.serialize()); \n fields.push(self.args_hash);\n fields.push_array(self.return_values);\n for i in 0..MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL {\n fields.push_array(self.contract_storage_update_requests[i].serialize());\n }\n for i in 0..MAX_PUBLIC_DATA_READS_PER_CALL {\n fields.push_array(self.contract_storage_reads[i].serialize());\n }\n fields.push_array(self.public_call_stack_hashes);\n\n for i in 0..MAX_NEW_COMMITMENTS_PER_CALL{\n fields.push_array(self.new_commitments[i].serialize());\n }\n for i in 0..MAX_NEW_NULLIFIERS_PER_CALL{\n fields.push_array(self.new_nullifiers[i].serialize());\n }\n fields.push_array(self.new_l2_to_l1_msgs);\n fields.push_array(self.unencrypted_logs_hash);\n fields.push(self.unencrypted_log_preimages_length);\n fields.push_array(self.block_header.serialize());\n fields.push(self.prover_address.to_field());\n fields.storage\n }\n}\n",
1038
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/public_circuit_public_inputs.nr"
1039
+ },
1040
+ "141": {
1041
+ "source": "use crate::{\n abis::{\n call_context::CallContext,\n block_header::BlockHeader,\n side_effect::{SideEffect, SideEffectLinkedToNoteHash},\n },\n contrakt::deployment_data::ContractDeploymentData,\n hash::{\n NUM_FIELDS_PER_SHA256,\n pedersen_hash,\n },\n utils::bounded_vec::BoundedVec,\n};\nuse crate::constants::{\n MAX_READ_REQUESTS_PER_CALL,\n MAX_NEW_COMMITMENTS_PER_CALL,\n MAX_NEW_NULLIFIERS_PER_CALL,\n MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL,\n MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL,\n MAX_NEW_L2_TO_L1_MSGS_PER_CALL,\n RETURN_VALUES_LENGTH,\n PRIVATE_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH,\n PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH,\n GENERATOR_INDEX__PRIVATE_CIRCUIT_PUBLIC_INPUTS,\n};\nuse crate::traits::Hash;\n\nstruct PrivateCircuitPublicInputs {\n call_context: CallContext,\n \n args_hash: Field,\n return_values: [Field; RETURN_VALUES_LENGTH],\n\n read_requests: [SideEffect; MAX_READ_REQUESTS_PER_CALL],\n\n new_commitments: [SideEffect; MAX_NEW_COMMITMENTS_PER_CALL],\n new_nullifiers: [SideEffectLinkedToNoteHash; MAX_NEW_NULLIFIERS_PER_CALL],\n private_call_stack_hashes: [Field; MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL],\n public_call_stack_hashes: [Field; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL],\n new_l2_to_l1_msgs: [Field; MAX_NEW_L2_TO_L1_MSGS_PER_CALL],\n end_side_effect_counter : Field,\n\n encrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n unencrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n\n // Here so that the gas cost of this request can be measured by circuits, without actually needing to feed in the\n // variable-length data.\n encrypted_log_preimages_length: Field,\n unencrypted_log_preimages_length: Field,\n\n block_header: BlockHeader,\n\n contract_deployment_data: ContractDeploymentData,\n\n chain_id: Field,\n version: Field,\n}\n\nimpl Hash for PrivateCircuitPublicInputs {\n fn hash(self) -> Field {\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/3595)\n let mut fields: BoundedVec<Field, PRIVATE_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH> = BoundedVec::new(0); \n fields.push(self.call_context.hash());\n fields.push(self.args_hash);\n fields.push_array(self.return_values);\n\n for i in 0..MAX_READ_REQUESTS_PER_CALL{\n fields.push_array(self.read_requests[i].serialize());\n }\n for i in 0..MAX_NEW_COMMITMENTS_PER_CALL{\n fields.push_array(self.new_commitments[i].serialize());\n }\n for i in 0..MAX_NEW_NULLIFIERS_PER_CALL{\n fields.push_array(self.new_nullifiers[i].serialize());\n }\n fields.push_array(self.private_call_stack_hashes);\n fields.push_array(self.public_call_stack_hashes);\n fields.push_array(self.new_l2_to_l1_msgs);\n fields.push(self.end_side_effect_counter);\n fields.push_array(self.encrypted_logs_hash);\n fields.push_array(self.unencrypted_logs_hash);\n fields.push(self.encrypted_log_preimages_length);\n fields.push(self.unencrypted_log_preimages_length);\n fields.push_array(self.block_header.serialize());\n fields.push(self.contract_deployment_data.hash());\n fields.push(self.chain_id);\n fields.push(self.version);\n\n assert_eq(fields.len(), PRIVATE_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH, \"Incorrect number of input fields when hashing PrivateCircuitPublicInputs\");\n\n pedersen_hash(fields.storage, GENERATOR_INDEX__PRIVATE_CIRCUIT_PUBLIC_INPUTS)\n }\n}\n\nimpl PrivateCircuitPublicInputs {\n fn serialize(self) -> [Field; PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH] {\n let mut fields: BoundedVec<Field, PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH> = BoundedVec::new(0); \n fields.push_array(self.call_context.serialize());\n fields.push(self.args_hash);\n fields.push_array(self.return_values);\n\n for i in 0..MAX_READ_REQUESTS_PER_CALL{\n fields.push_array(self.read_requests[i].serialize());\n }\n for i in 0..MAX_NEW_COMMITMENTS_PER_CALL{\n fields.push_array(self.new_commitments[i].serialize());\n }\n for i in 0..MAX_NEW_NULLIFIERS_PER_CALL{\n fields.push_array(self.new_nullifiers[i].serialize());\n }\n fields.push_array(self.private_call_stack_hashes);\n fields.push_array(self.public_call_stack_hashes);\n fields.push_array(self.new_l2_to_l1_msgs);\n fields.push(self.end_side_effect_counter);\n fields.push_array(self.encrypted_logs_hash);\n fields.push_array(self.unencrypted_logs_hash);\n fields.push(self.encrypted_log_preimages_length);\n fields.push(self.unencrypted_log_preimages_length);\n fields.push_array(self.block_header.serialize());\n fields.push_array(self.contract_deployment_data.serialize());\n fields.push(self.chain_id);\n fields.push(self.version);\n\n assert_eq(fields.len(), PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH);\n\n fields.storage\n }\n}\n\n#[test]\nfn serialization_smoke() {\n let pcpi: PrivateCircuitPublicInputs = dep::std::unsafe::zeroed();\n let _serialized = pcpi.serialize();\n}\n\n#[test]\nfn hash_smoke() {\n let pcpi: PrivateCircuitPublicInputs = dep::std::unsafe::zeroed();\n let _hashed = pcpi.hash();\n}\n",
1042
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/private_circuit_public_inputs.nr"
1043
+ },
1044
+ "144": {
1045
+ "source": "use crate::abis::function_selector::FunctionSelector;\nuse crate::constants::GENERATOR_INDEX__FUNCTION_DATA;\n\nstruct FunctionData {\n // First four bytes of the abi encoding \n // of a function. \n selector : FunctionSelector,\n is_internal : bool,\n is_private : bool,\n is_constructor : bool,\n}\n\nimpl FunctionData {\n // A field is ~256 bits\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/3057): Since, function data can fit into a Field,\n // This method will simply return a bit packed Field instead of hashing\n fn hash(self) -> Field {\n dep::std::hash::pedersen_hash_with_separator([\n self.selector.to_field(),\n self.is_internal as Field,\n self.is_private as Field,\n self.is_constructor as Field,\n ], GENERATOR_INDEX__FUNCTION_DATA)\n }\n}\n",
1046
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/function_data.nr"
1047
+ },
1048
+ "147": {
1049
+ "source": "use crate::{\n abis::function_selector::FunctionSelector,\n address::{EthAddress,AztecAddress},\n constants::{\n CALL_CONTEXT_LENGTH,\n GENERATOR_INDEX__CALL_CONTEXT,\n },\n hash::pedersen_hash,\n};\nuse dep::std::cmp::Eq;\nuse crate::traits::Hash;\n\n// docs:start:call-context\nstruct CallContext {\n msg_sender : AztecAddress,\n storage_contract_address : AztecAddress,\n portal_contract_address : EthAddress,\n\n function_selector : FunctionSelector,\n\n is_delegate_call : bool,\n is_static_call : bool,\n is_contract_deployment : bool,\n\n start_side_effect_counter : Field,\n}\n// docs:end:call-context\n\nimpl Eq for CallContext {\n fn eq(self, call_context: CallContext) -> bool {\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/3595)\n call_context.msg_sender.eq(self.msg_sender)\n & call_context.storage_contract_address.eq(self.storage_contract_address)\n & call_context.portal_contract_address.eq(self.portal_contract_address)\n & call_context.function_selector.eq(self.function_selector)\n & (call_context.is_delegate_call == self.is_delegate_call)\n & (call_context.is_static_call == self.is_static_call)\n & (call_context.is_contract_deployment == self.is_contract_deployment)\n & (call_context.start_side_effect_counter == self.start_side_effect_counter)\n }\n}\n\nimpl Hash for CallContext {\n fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__CALL_CONTEXT)\n }\n}\n\nimpl CallContext {\n fn serialize(self) -> [Field; CALL_CONTEXT_LENGTH] {\n [\n self.msg_sender.to_field(),\n self.storage_contract_address.to_field(),\n self.portal_contract_address.to_field(),\n self.function_selector.to_field(),\n self.is_delegate_call as Field,\n self.is_static_call as Field,\n self.is_contract_deployment as Field,\n self.start_side_effect_counter,\n ]\n }\n\n fn assert_is_zero(self) {\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/3595)\n assert(self.msg_sender.to_field() == 0);\n assert(self.storage_contract_address.to_field() == 0);\n assert(self.portal_contract_address.to_field() == 0);\n assert(self.function_selector.to_field() == 0);\n assert(self.is_delegate_call == false);\n assert(self.is_static_call == false);\n assert(self.is_contract_deployment == false);\n assert(self.start_side_effect_counter == 0);\n }\n}\n",
1050
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/call_context.nr"
1051
+ },
1052
+ "153": {
1053
+ "source": "use crate::utils::field::field_from_bytes;\nuse dep::std::cmp::Eq;\n\nglobal SELECTOR_SIZE = 4;\n\nstruct FunctionSelector {\n // 1st 4-bytes of abi-encoding of function.\n inner: u32,\n}\n\nimpl Eq for FunctionSelector {\n fn eq(self, function_selector: FunctionSelector) -> bool {\n function_selector.inner == self.inner\n }\n}\n\nimpl FunctionSelector {\n fn to_field(self) -> Field {\n self.inner as Field\n }\n\n pub fn from_u32(value: u32) -> Self {\n Self {\n inner : value,\n }\n }\n\n pub fn from_field(value : Field) -> Self {\n Self {\n inner : value as u32,\n }\n }\n\n pub fn from_signature<N>(signature: str<N>) -> Self {\n let bytes = signature.as_bytes();\n let hash = dep::std::hash::keccak256(bytes, bytes.len() as u32);\n\n let mut selector_be_bytes = [0; SELECTOR_SIZE];\n for i in 0..SELECTOR_SIZE {\n selector_be_bytes[i] = hash[i];\n }\n\n FunctionSelector::from_field(field_from_bytes(selector_be_bytes, true))\n }\n\n pub fn zero() -> Self {\n Self { inner: 0 }\n }\n\n pub fn serialize(self: Self) -> [Field; 1] {\n [self.inner as Field]\n }\n\n pub fn deserialize(fields: [Field; 1]) -> Self {\n Self {\n inner: fields[0] as u32\n }\n }\n}\n",
1054
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/function_selector.nr"
1055
+ },
1056
+ "181": {
1057
+ "source": "use dep::aztec::abi;\nuse dep::aztec::types::vec::BoundedVec;\nuse dep::aztec::context::PrivateContext;\nuse dep::protocol_types::{\n abis::{\n call_stack_item::{\n PrivateCallStackItem,\n PublicCallStackItem,\n },\n function_selector::FunctionSelector,\n },\n address::AztecAddress,\n constants::GENERATOR_INDEX__SIGNATURE_PAYLOAD,\n hash::pedersen_hash,\n};\n\nglobal ACCOUNT_MAX_CALLS: Field = 4;\n// 1 (ARGS_HASH) + 1 (FUNCTION_SELECTOR) + 1 (TARGET_ADDRESS) + 1 (IS_PUBLIC)\nglobal FUNCTION_CALL_SIZE: Field = 4;\n// 3 * 32 + 1\nglobal FUNCTION_CALL_SIZE_IN_BYTES: Field = 97;\n\nstruct FunctionCall {\n args_hash: Field,\n function_selector: FunctionSelector,\n target_address: AztecAddress,\n is_public: bool,\n}\n\nimpl FunctionCall {\n fn serialize(self) -> [Field; FUNCTION_CALL_SIZE] {\n [self.args_hash, self.function_selector.to_field(), self.target_address.to_field(), self.is_public as Field]\n }\n\n fn to_be_bytes(self) -> [u8; FUNCTION_CALL_SIZE_IN_BYTES] {\n let mut bytes: [u8; FUNCTION_CALL_SIZE_IN_BYTES] = [0; FUNCTION_CALL_SIZE_IN_BYTES];\n let args_hash_bytes = self.args_hash.to_be_bytes(32);\n for i in 0..32 { bytes[i] = args_hash_bytes[i]; }\n let function_selector_bytes = self.function_selector.to_field().to_be_bytes(32);\n for i in 0..32 { bytes[i + 32] = function_selector_bytes[i]; }\n let target_address_bytes = self.target_address.to_field().to_be_bytes(32);\n for i in 0..32 { bytes[i + 64] = target_address_bytes[i]; }\n bytes[96] = self.is_public as u8;\n bytes\n }\n}\n\n// FUNCTION_CALL_SIZE * ACCOUNT_MAX_CALLS + 1\nglobal ENTRYPOINT_PAYLOAD_SIZE: Field = 17;\n// FUNCTION_CALL_SIZE_IN_BYTES * ACCOUNT_MAX_CALLS + 32\nglobal ENTRYPOINT_PAYLOAD_SIZE_IN_BYTES: Field = 420;\n\n// Note: If you change the following struct you have to update default_entrypoint.ts\n// docs:start:entrypoint-struct\nstruct EntrypointPayload {\n function_calls: [FunctionCall; ACCOUNT_MAX_CALLS],\n nonce: Field,\n}\n// docs:end:entrypoint-struct\n\nimpl EntrypointPayload {\n fn hash(self) -> Field {\n pedersen_hash(\n self.serialize(), \n GENERATOR_INDEX__SIGNATURE_PAYLOAD\n )\n }\n\n // Serializes the entrypoint struct\n fn serialize(self) -> [Field; ENTRYPOINT_PAYLOAD_SIZE] {\n let mut fields: BoundedVec<Field, ENTRYPOINT_PAYLOAD_SIZE> = BoundedVec::new(0); \n for call in self.function_calls {\n fields.push_array(call.serialize());\n }\n fields.push(self.nonce);\n fields.storage\n }\n\n // Serializes the payload as an array of bytes. Useful for hashing with sha256.\n fn to_be_bytes(self) -> [u8; ENTRYPOINT_PAYLOAD_SIZE_IN_BYTES] {\n let mut bytes: [u8; ENTRYPOINT_PAYLOAD_SIZE_IN_BYTES] = [0; ENTRYPOINT_PAYLOAD_SIZE_IN_BYTES];\n\n for i in 0..ACCOUNT_MAX_CALLS {\n let item_bytes = self.function_calls[i].to_be_bytes();\n for j in 0..FUNCTION_CALL_SIZE_IN_BYTES { \n bytes[i * FUNCTION_CALL_SIZE_IN_BYTES + j] = item_bytes[j];\n }\n }\n\n let nonce_bytes = self.nonce.to_be_bytes(32);\n let nonce_offset = FUNCTION_CALL_SIZE_IN_BYTES * ACCOUNT_MAX_CALLS;\n for j in 0..32 {\n bytes[nonce_offset + j] = nonce_bytes[j];\n }\n \n bytes\n }\n\n // Executes all private and public calls \n // docs:start:entrypoint-execute-calls\n fn execute_calls(self, context: &mut PrivateContext) {\n for call in self.function_calls {\n if !call.target_address.is_zero() {\n if call.is_public {\n context.call_public_function_with_packed_args(\n call.target_address, call.function_selector, call.args_hash\n );\n } else {\n let _result = context.call_private_function_with_packed_args(\n call.target_address, call.function_selector, call.args_hash\n );\n }\n }\n }\n }\n // docs:end:entrypoint-execute-calls\n}\n",
1058
+ "path": "/usr/src/yarn-project/aztec-nr/authwit/src/entrypoint.nr"
1059
+ },
1060
+ "182": {
1061
+ "source": "use dep::aztec::context::{PrivateContext, PublicContext, Context};\nuse dep::aztec::state_vars::{map::Map, public_state::PublicState};\nuse dep::aztec::types::type_serialization::bool_serialization::{BoolSerializationMethods,BOOL_SERIALIZED_LEN};\n\nuse crate::entrypoint::EntrypointPayload;\nuse crate::auth::IS_VALID_SELECTOR;\n\nstruct AccountActions {\n context: Context,\n is_valid_impl: fn(&mut PrivateContext, Field) -> bool,\n approved_action: Map<PublicState<bool, BOOL_SERIALIZED_LEN>>,\n}\n\nimpl AccountActions {\n pub fn init(context: Context, approved_action_storage_slot: Field, is_valid_impl: fn(&mut PrivateContext, Field) -> bool) -> Self {\n AccountActions {\n context: context,\n is_valid_impl: is_valid_impl,\n approved_action: Map::new(\n context,\n approved_action_storage_slot,\n |context, slot| {\n PublicState::new(context, slot, BoolSerializationMethods)\n },\n ),\n }\n }\n\n pub fn private(context: &mut PrivateContext, approved_action_storage_slot: Field, is_valid_impl: fn(&mut PrivateContext, Field) -> bool) -> Self {\n AccountActions::init(Context::private(context), approved_action_storage_slot, is_valid_impl)\n }\n\n pub fn public(context: &mut PublicContext, approved_action_storage_slot: Field, is_valid_impl: fn(&mut PrivateContext, Field) -> bool) -> Self {\n AccountActions::init(Context::public(context), approved_action_storage_slot, is_valid_impl)\n }\n \n // docs:start:entrypoint\n pub fn entrypoint(self, payload: EntrypointPayload) {\n let message_hash = payload.hash();\n let valid_fn = self.is_valid_impl;\n let private_context = self.context.private.unwrap();\n assert(valid_fn(private_context, message_hash));\n payload.execute_calls(private_context);\n }\n // docs:end:entrypoint\n\n pub fn is_valid(self, message_hash: Field) -> Field {\n let valid_fn = self.is_valid_impl;\n if (valid_fn(self.context.private.unwrap(), message_hash)) {\n IS_VALID_SELECTOR\n } else {\n 0\n }\n }\n\n pub fn is_valid_public(self, message_hash: Field) -> Field {\n let value = self.approved_action.at(message_hash).read();\n if (value){\n IS_VALID_SELECTOR\n } else {\n 0\n }\n }\n\n pub fn internal_set_is_valid_storage(self, message_hash: Field, value: bool) {\n self.approved_action.at(message_hash).write(value);\n }\n}\n",
1062
+ "path": "/usr/src/yarn-project/aztec-nr/authwit/src/account.nr"
1063
+ },
1064
+ "185": {
1065
+ "source": "#[oracle(getAuthWitness)]\nfn get_auth_witness_oracle<N>(_message_hash: Field) -> [Field; N] {}\n\nunconstrained pub fn get_auth_witness<N>(message_hash: Field) -> [Field; N] {\n get_auth_witness_oracle(message_hash)\n}\n",
1066
+ "path": "/usr/src/yarn-project/aztec-nr/authwit/src/auth_witness.nr"
1067
+ },
1068
+ "203": {
1069
+ "source": "mod public_key_note;\n\n// Account contract that uses Schnorr signatures for authentication.\n// The signing key is stored in an immutable private note and should be different from the encryption/nullifying key.\ncontract SchnorrAccount {\n use dep::std;\n use dep::std::option::Option;\n\n use dep::protocol_types::address::AztecAddress;\n\n use dep::aztec::{\n context::{PrivateContext, Context},\n note::{ note_header::NoteHeader, utils as note_utils },\n oracle::get_public_key::get_public_key,\n state_vars::immutable_singleton::ImmutableSingleton,\n };\n use dep::authwit:: {\n entrypoint::{ EntrypointPayload, ENTRYPOINT_PAYLOAD_SIZE },\n account::AccountActions,\n auth_witness::get_auth_witness,\n };\n\n use crate::public_key_note::{PublicKeyNote, PublicKeyNoteMethods, PUBLIC_KEY_NOTE_LEN};\n\n struct Storage {\n // docs:start:storage\n signing_public_key: ImmutableSingleton<PublicKeyNote, PUBLIC_KEY_NOTE_LEN>,\n // docs:end:storage\n }\n\n impl Storage {\n fn init(context: Context) -> Self {\n Storage {\n // docs:start:storage_init\n signing_public_key: ImmutableSingleton::new(context, 1, PublicKeyNoteMethods),\n // docs:end:storage_init\n }\n }\n }\n\n global ACCOUNT_ACTIONS_STORAGE_SLOT = 2;\n\n // Constructs the contract\n #[aztec(private)]\n fn constructor(signing_pub_key_x: pub Field, signing_pub_key_y: pub Field) {\n let this = context.this_address();\n // docs:start:initialize\n let mut pub_key_note = PublicKeyNote::new(signing_pub_key_x, signing_pub_key_y, this);\n storage.signing_public_key.initialize(&mut pub_key_note, Option::none(), true);\n // docs:end:initialize\n }\n\n // Note: If you globally change the entrypoint signature don't forget to update default_entrypoint.ts file\n #[aztec(private)]\n fn entrypoint(payload: pub EntrypointPayload) {\n let actions = AccountActions::private(&mut context, ACCOUNT_ACTIONS_STORAGE_SLOT, is_valid_impl);\n actions.entrypoint(payload);\n }\n\n #[aztec(private)]\n fn is_valid(message_hash: Field) -> Field {\n let actions = AccountActions::private(&mut context, ACCOUNT_ACTIONS_STORAGE_SLOT, is_valid_impl);\n actions.is_valid(message_hash)\n }\n\n #[aztec(public)]\n fn is_valid_public(message_hash: Field) -> Field {\n let actions = AccountActions::public(&mut context, ACCOUNT_ACTIONS_STORAGE_SLOT, is_valid_impl);\n actions.is_valid_public(message_hash)\n }\n\n #[aztec(public)]\n internal fn set_is_valid_storage(message_hash: Field, value: bool) {\n let actions = AccountActions::public(&mut context, ACCOUNT_ACTIONS_STORAGE_SLOT, is_valid_impl);\n actions.internal_set_is_valid_storage(message_hash, value)\n }\n\n #[contract_library_method]\n fn is_valid_impl(context: &mut PrivateContext, message_hash: Field) -> pub bool {\n // docs:start:entrypoint\n // Load public key from storage\n let storage = Storage::init(Context::private(context));\n // docs:start:get_note\n let public_key = storage.signing_public_key.get_note();\n // docs:end:get_note\n // Load auth witness\n let witness: [Field; 64] = get_auth_witness(message_hash);\n let mut signature: [u8; 64] = [0; 64];\n for i in 0..64 {\n signature[i] = witness[i] as u8;\n }\n\n // Verify signature of the payload bytes\n let verification = std::schnorr::verify_signature(\n public_key.x,\n public_key.y,\n signature,\n message_hash.to_be_bytes(32)\n );\n assert(verification == true);\n // docs:end:entrypoint\n true\n }\n\n // Computes notes hash and nullifier.\n // Note 1: Needs to be defined by every contract producing logs.\n // Note 2: Having it in all the contracts gives us the ability to compute the note hash and nullifier differently for different kind of notes.\n unconstrained fn compute_note_hash_and_nullifier(\n contract_address: AztecAddress,\n nonce: Field,\n storage_slot: Field,\n serialized_note: [Field; PUBLIC_KEY_NOTE_LEN]\n ) -> pub [Field; 4] {\n assert(storage_slot == 1);\n let note_header = NoteHeader::new(contract_address, nonce, storage_slot);\n note_utils::compute_note_hash_and_nullifier(PublicKeyNoteMethods, note_header, serialized_note)\n }\n}\n",
1070
+ "path": "/usr/src/yarn-project/noir-contracts/contracts/schnorr_account_contract/src/main.nr"
1071
+ },
1072
+ "204": {
1073
+ "source": "use dep::aztec::{\n note::{\n note_header::NoteHeader,\n note_interface::NoteInterface,\n utils::compute_unique_siloed_note_hash,\n },\n hash::pedersen_hash,\n oracle::{\n get_secret_key::get_secret_key,\n get_public_key::get_public_key,\n },\n log::emit_encrypted_log,\n context::PrivateContext,\n};\nuse dep::protocol_types::address::AztecAddress;\n\nglobal PUBLIC_KEY_NOTE_LEN: Field = 3;\n\n// Stores a public key composed of two fields\n// TODO: Do we need to include a nonce, in case we want to read/nullify/recreate with the same pubkey value?\nstruct PublicKeyNote {\n x: Field,\n y: Field,\n owner: AztecAddress, // We store the owner address only to get the secret key to compute the nullifier and to broadcast\n header: NoteHeader,\n}\n\nimpl PublicKeyNote {\n pub fn new(x: Field, y: Field, owner: AztecAddress) -> Self {\n PublicKeyNote {\n x,\n y,\n owner,\n header: NoteHeader::empty(),\n }\n }\n\n // serialize the note as 3 fields\n pub fn serialize(self) -> [Field; PUBLIC_KEY_NOTE_LEN] {\n [self.x, self.y, self.owner.to_field()]\n }\n\n pub fn compute_nullifier(self) -> Field {\n let unique_siloed_note_hash = compute_unique_siloed_note_hash(PublicKeyNoteMethods, self);\n let secret = get_secret_key(self.owner);\n // TODO(#1205) Should use a non-zero generator index.\n pedersen_hash([\n unique_siloed_note_hash,\n secret.low,\n secret.high,\n ],0)\n }\n\n pub fn set_header(&mut self, header: NoteHeader) {\n self.header = header;\n }\n\n // Broadcasts the note as an encrypted log on L1.\n pub fn broadcast(self, context: &mut PrivateContext, slot: Field) {\n let encryption_pub_key = get_public_key(self.owner);\n emit_encrypted_log(\n context,\n (*context).this_address(),\n slot,\n encryption_pub_key,\n self.serialize(),\n );\n }\n}\n\nfn deserialize(serialized_note: [Field; PUBLIC_KEY_NOTE_LEN]) -> PublicKeyNote {\n PublicKeyNote {\n x: serialized_note[0],\n y: serialized_note[1],\n owner: AztecAddress::from_field(serialized_note[2]),\n header: NoteHeader::empty()\n }\n}\n\nfn serialize(note: PublicKeyNote) -> [Field; PUBLIC_KEY_NOTE_LEN] {\n note.serialize()\n}\n\nfn compute_note_hash(note: PublicKeyNote) -> Field {\n // TODO(#1205) Should use a non-zero generator index.\n pedersen_hash(note.serialize(), 0)\n}\n\nfn compute_nullifier(note: PublicKeyNote) -> Field {\n note.compute_nullifier()\n}\n\nfn get_header(note: PublicKeyNote) -> NoteHeader {\n note.header\n}\n\nfn set_header(note: &mut PublicKeyNote, header: NoteHeader) {\n note.set_header(header);\n}\n\n// Broadcasts the note as an encrypted log on L1.\nfn broadcast(context: &mut PrivateContext, slot: Field, note: PublicKeyNote) {\n note.broadcast(context, slot);\n}\n\nglobal PublicKeyNoteMethods = NoteInterface {\n deserialize,\n serialize,\n compute_note_hash,\n compute_nullifier,\n get_header,\n set_header,\n broadcast,\n};\n",
1074
+ "path": "/usr/src/yarn-project/noir-contracts/contracts/schnorr_account_contract/src/public_key_note.nr"
1075
+ }
1076
+ }
1077
+ }
1078
+ }