@idle-screens/saver-metaquarium 0.2.0 → 0.4.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.
@@ -0,0 +1,1066 @@
1
+ // src/environments.ts
2
+ var FLOOR_KINDS = ["flat", "dunes", "ridges", "basin"];
3
+ var ENVIRONMENTS = [
4
+ { name: "void", label: "Void", water: null, floor: "flat", rays: null },
5
+ {
6
+ name: "abyss",
7
+ label: "Abyss",
8
+ water: null,
9
+ floor: "basin",
10
+ rays: { strength: 0.35, color: "#0e4a6e", y: -620 }
11
+ },
12
+ {
13
+ name: "reef",
14
+ label: "Reef",
15
+ water: { y: 150, color: "#2ad4ff", opacity: 0.18 },
16
+ floor: "dunes",
17
+ rays: { strength: 0.5, color: "#bfefff", y: 900 }
18
+ },
19
+ {
20
+ name: "kelp",
21
+ label: "Kelp forest",
22
+ water: { y: 170, color: "#1e6f5c", opacity: 0.2 },
23
+ floor: "ridges",
24
+ rays: { strength: 0.4, color: "#9ef5d0", y: 820 }
25
+ },
26
+ {
27
+ name: "ice",
28
+ label: "Under ice",
29
+ water: { y: 132, color: "#cfefff", opacity: 0.32 },
30
+ floor: "flat",
31
+ rays: { strength: 0.6, color: "#eaf8ff", y: 1e3 }
32
+ },
33
+ {
34
+ name: "vent",
35
+ label: "Hydrothermal vent",
36
+ water: null,
37
+ floor: "ridges",
38
+ rays: { strength: 0.45, color: "#ff7a3c", y: -520 }
39
+ },
40
+ {
41
+ name: "lagoon",
42
+ label: "Lagoon",
43
+ water: { y: 118, color: "#7ff3d0", opacity: 0.22 },
44
+ floor: "dunes",
45
+ rays: { strength: 0.55, color: "#fff3b0", y: 950 }
46
+ },
47
+ {
48
+ name: "universe",
49
+ label: "Universe",
50
+ water: null,
51
+ floor: "ridges",
52
+ rays: { strength: 0.3, color: "#c39bff", y: 1200 }
53
+ }
54
+ ];
55
+ var ENVIRONMENT_NAMES = ENVIRONMENTS.map((e) => e.name);
56
+ function environmentOf(name) {
57
+ return ENVIRONMENTS.find((e) => e.name === name) ?? ENVIRONMENTS[0];
58
+ }
59
+ var LAYER_COST = { floor: 0, water: 1, rays: 2 };
60
+ var RAY_COUNT = { full: 5, reduced: 2 };
61
+ function affordableLayers(budget, preset) {
62
+ let left = budget;
63
+ const water = preset.water !== null && left >= LAYER_COST.water;
64
+ if (water) left -= LAYER_COST.water;
65
+ let rayCount = 0;
66
+ if (preset.rays !== null && left > 0) {
67
+ rayCount = left >= LAYER_COST.rays ? RAY_COUNT.full : RAY_COUNT.reduced;
68
+ }
69
+ return { floor: true, water, rayCount };
70
+ }
71
+
72
+ // src/swim.ts
73
+ var SWIM_STYLES = [
74
+ { name: "loop", label: "Loop", speedMul: 1, band: "free", bobAmp: 0, bobHz: 0, formation: false, travel: 1 },
75
+ { name: "school", label: "School", speedMul: 1, band: "free", bobAmp: 1.5, bobHz: 0.5, formation: true, travel: 1 },
76
+ { name: "drift", label: "Drift", speedMul: 0.35, band: "mid", bobAmp: 5, bobHz: 0.13, formation: false, travel: 0.6 },
77
+ { name: "hover", label: "Hover", speedMul: 0.2, band: "free", bobAmp: 7, bobHz: 0.3, formation: false, travel: 0.12 },
78
+ { name: "patrol", label: "Patrol", speedMul: 0.55, band: "mid", bobAmp: 1, bobHz: 0.09, formation: false, travel: 1 },
79
+ { name: "bottom", label: "Bottom-hugger", speedMul: 0.7, band: "floor", bobAmp: 2, bobHz: 0.4, formation: false, travel: 1 },
80
+ { name: "surface", label: "Surface-skimmer", speedMul: 0.9, band: "ceiling", bobAmp: 3, bobHz: 0.55, formation: false, travel: 1 }
81
+ ];
82
+ var SWIM_STYLE_NAMES = SWIM_STYLES.map((s) => s.name);
83
+ function swimStyleOf(name) {
84
+ return SWIM_STYLES.find((s) => s.name === name) ?? SWIM_STYLES[0];
85
+ }
86
+ function fishHash(index, salt) {
87
+ const x = Math.sin((index + 1) * 127.1 + salt * 311.7) * 43758.5453;
88
+ return x - Math.floor(x);
89
+ }
90
+ function fishVariation(index, variance) {
91
+ const v = Math.max(0, Math.min(1, variance));
92
+ return {
93
+ // ±40% speed and ±25% size at full variance — enough to read as a mixed
94
+ // population, not so much that one fish looks broken.
95
+ speedMul: 1 + (fishHash(index, 1) - 0.5) * 0.8 * v,
96
+ scaleMul: 1 + (fishHash(index, 2) - 0.5) * 0.5 * v,
97
+ // Independent of `variance` — see the note above; synchronised bobbing is
98
+ // a machine, not a shoal.
99
+ phase: fishHash(index, 3) * Math.PI * 2,
100
+ // Where along its own route a fish holds station, 0..1. Styles that only
101
+ // work a patch of water (hover, drift) start every fish at distance 0
102
+ // without this, so the whole shoal knots up in one corner — which is
103
+ // exactly what it did the first time I looked at `hover` on screen.
104
+ // Independent of `variance`: spreading is correctness, not flavour.
105
+ anchor: fishHash(index, 7)
106
+ };
107
+ }
108
+ var FISH_LENGTH = 18;
109
+ var FORMATION_HALF_WIDTH = 62;
110
+ function formationSlot(index, count, variance, halfWidth = FORMATION_HALF_WIDTH) {
111
+ const cols = Math.max(1, Math.ceil(Math.sqrt(Math.max(1, count))));
112
+ const col = index % cols;
113
+ const row = Math.floor(index / cols);
114
+ const j = 0.35 + 0.65 * Math.max(0, Math.min(1, variance));
115
+ const span = Math.max(1, cols - 1);
116
+ const pitch = Math.min(FISH_LENGTH * 1.9, halfWidth * 2 / span);
117
+ const jit = pitch * 0.35;
118
+ return {
119
+ side: (col - (cols - 1) / 2) * pitch + (fishHash(index, 4) - 0.5) * jit * j,
120
+ up: (fishHash(index, 5) - 0.5) * FISH_LENGTH * j,
121
+ back: row * FISH_LENGTH * 1.6 + fishHash(index, 6) * FISH_LENGTH * 0.4 * j
122
+ };
123
+ }
124
+ function formationExtent(count, variance) {
125
+ let side = 0, up = 0, back = 0;
126
+ for (let i = 0; i < count; i += 1) {
127
+ const s = formationSlot(i, count, variance);
128
+ side = Math.max(side, Math.abs(s.side));
129
+ up = Math.max(up, Math.abs(s.up));
130
+ back = Math.max(back, Math.abs(s.back));
131
+ }
132
+ return { side, up, back };
133
+ }
134
+ function bandRange(band) {
135
+ switch (band) {
136
+ // Tight, because 0..0.3 of a 57-unit volume is nearly two body lengths of
137
+ // headroom — measured on screen it read as hovering in the lower third
138
+ // rather than hugging anything.
139
+ case "floor":
140
+ return { lo: 0, hi: 0.14 };
141
+ case "ceiling":
142
+ return { lo: 0.7, hi: 1 };
143
+ case "mid":
144
+ return { lo: 0.3, hi: 0.7 };
145
+ default:
146
+ return null;
147
+ }
148
+ }
149
+
150
+ // src/asset-cids.ts
151
+ var ASSET_CIDS = [
152
+ "QmZCzKVLJ1MYRzaZEFyuMCVmrPR3urQYMFR9RWerJYpCEr",
153
+ "Qma79eBTFDb2i1CtF96R6coxtnEnTu8qgW8xTTt9wdKdsW",
154
+ "QmZrjPzPrkHWNfYJWCKadGxqrhwVJu3zsovCAuYRw8EzAt",
155
+ "QmRzCWYvpRMuGX7MUrXFDQ6SEzxvfiJy2XCc2KFT9nZRwH",
156
+ "QmYz6VAVyJb4XdhNkcByQsTMedyLUPuy13q835XBqBvFnN",
157
+ "QmNadqTMC59SV41Ljqs3wftQRMnKzP5HfHhJhNUGaop187",
158
+ "QmVo9GNRMZRhdykEfsasiKCkSxJ3NZMnJW2teu3ydM3j3C",
159
+ "QmNY8rACjywo9MCnq5ZRLqDovCeD3rThQkquVhBNZpDx5G",
160
+ "QmYSmYXaGe9sjyccj3BDfaWpjrRHfQut2KUj4PPqfNP2JQ",
161
+ "QmeXJpHtuo2xdyLLHVjYn4DnkmAmYQChfwYMNgH738342g",
162
+ "QmXQ8sWSv8wVzpizPy7XAEg4fkGULegqhYmmmNxQxFhURF",
163
+ "QmSGLEWtsJfzRDtyg6qirHjVAWmojFu4DTNMjgkgGYhaQX",
164
+ "QmQz6mraCUgznbC2gAhv4xfN94baioDXvSwjxUY9HFdcUc",
165
+ "QmRNkt5myZfwJ4ja9s6mxkSvcAUaFmmKQT6EpVVU9EpxXJ",
166
+ "QmUNQ4m28QSNadjS78XjufrY6tXBsdoAJXV3wP25Mw8ECE",
167
+ "QmYy8J3L34p6db2qpqsxC8fMS635KretGDoGTh7Ro8t36N",
168
+ "QmZPL8gWr26b2CNNo6LGFJ8dn1sQMcpb1bnrmjJN3mRBPP",
169
+ "Qmbsuivz8SHZS89ss8PeCuaeZBv1m5Vwe6b841YkSt57Gr",
170
+ "QmYcF95XchfmViqJsHgzKTP33gVxCUHzq7dmxnWuh4JbbE",
171
+ "QmVuzAQutncvQBCGY43tapphaCNNoawVydEfHo48nuQG53",
172
+ "QmWL4zmX8QnSwcEhrxb6Ek9FWnodT75fK5jQE9G3nhrTHT",
173
+ "QmWdgysw3gxrJ3Hy129Ej7NcGW5D2utvWTMie2CA4tXjf5",
174
+ "QmW84KhqabL5niFwknUvU2dx5KCgkW9gEU4513m82fguSK",
175
+ "QmYtfYGfPRQdd2v2e2mVezgiY9qZGXmLUn4TLnhBUMfsk3",
176
+ "QmTgu5xQ7a2ZDnSbSeDZwVWYJpoi2LHSEA7Q172ykHgEcn",
177
+ "QmbUSdfjzd8EVsJtzt8iXmCwLPeDC84ScriwtEau6W5WUz",
178
+ "Qmd3y3u9kzHtKPvrsBraQX9VYfWKHzRgTE2Wchhrm9ub8M",
179
+ "QmbxDsnC14zmzKShpRTscTaKJayTSaCaSxW2gKRc7g8Xfq",
180
+ "QmeKFPkwPTUU8GFVpNfFjsBKr3nfsRMo138EiDBYyoi5iB",
181
+ "QmUT7B543xj7TYkgbSspBDrHsJHG2yJTvWPy6iVEcP54HM",
182
+ "QmNzFPTar1xFa5QJVAuksyDpJTwK9mARRbNWGZ456Ja3sE",
183
+ "QmPiYEDAJPUA7pjqjBz3xTCFcVEFa57DJoZnFaoU49FGZ2",
184
+ "QmTsngNyu277DGD3qg1u89nTSBHp6QpeyNjoQPNEaNaqtU",
185
+ "QmSK68pRT68B4oBxP2LjVCNJBYmwsSpkykGmgW5Fgc9HAz",
186
+ "QmTVjYdCrexSTbMkmzBC6rNbYQF8AddQi3gPbGQqwz8iqU",
187
+ "QmdFFcK9hHWKyShCX8gHLUdrWf4aKMtJonfmKGDac3BdrX",
188
+ "QmeYJm1xn5hnkpZSfrYcMbpmT4u8XmaSmehhnyoDttLdFB",
189
+ "QmNbydhwhNHemQwebQvhDihnc3n1QiNFPueR46ZWZSsxYa",
190
+ "QmYy1uXan36v31H4znXmL855XrStjxtyjsxEaeUngdRzRt",
191
+ "QmW7yf2JMmpM3bAauiomXhWm75ur4Lu5GASywFanSS7yp4",
192
+ "QmPJYvY9bEpEhDoyH5CfGkpMGgk9cppPe22vD2yechR2Pv",
193
+ "QmYEbrDdFnfqvnkfnUwDC6tXoC1zwFmaAfsJmjM3bUd8ST",
194
+ "QmSBQYv4Gbd3SykKyieHcNwT4uaRE6GPsaJkB4RH7Z5QMT",
195
+ "QmTcsXsMTqfgad6VgQxqgR5htFPhRovdB4CrNoF8RjVR9v",
196
+ "QmdK65oNZpQibD2TP9QurwtuHMjfQTQBEgTx3v8ywy1q6q",
197
+ "Qma23MMRv6Jv95QKg1SuSgUcmKiBbrgLQYcTGonT3FVmLP",
198
+ "QmU38DaWwsKvxh69YrrKpLwnYBuNd5RMxE4MLVUjZDj5ov",
199
+ "QmNRASdujvSTCJYHNUVfqSDWeR8DPqdbXsz9PmNTAkzZVR",
200
+ "QmfAMeBwHY4RXqSNwiqmv85nKNcfMxn6gg5gouhfjeqsnF",
201
+ "QmbcpM2J9kCJ8kEaN7avcum6BpcebHSML9f4iEUmwDQkGf",
202
+ "QmTrmBe8r7F6mEaUscVuzDg7WS2iP6rmDLhEx5BprrSMRT",
203
+ "QmdRWCzJuza5Eq6n8f8YPcFPxbbDBUxn9CF5NASTQrkzzv",
204
+ "QmSRCQUAE4L8aUTB3kxp7SLjKwk5WkCocRJc6GEUjtMqVg",
205
+ "QmdvomiXzh97Jx7MHhbb2b2y8Fr5UrUMybdiWcGCJ8gCKM",
206
+ "QmNpRThE4ors6zBb68gz98pJUneDzNN3hdVo43hLzQaSCf",
207
+ "QmfSGJm4RqUVvYsrbS5txWypPb3rRoQQS8kpcZnbf5drqm",
208
+ "QmUH8DBSDSev99CpiYNxd4wc7xPfFYZ2SQ1gb5zdcry3gX",
209
+ "QmZc5WQo9vvMHhUNwLg9nXCrynXMPu2L9KYAV6LD3NDm4y",
210
+ "QmYtDyPEd2BcgJLgZjj6JfpVhy3ZYA23GEGRGB4zRqrP2R",
211
+ "QmZeG9tvLDPRbBVJMZs76caJBWfHcCY599vA7PeY9yWk3n",
212
+ "QmdpQFyGFRgdK5FH8tQZFWcCb5YS27BG2nYH2jkfrP9c6x",
213
+ "QmaWVfUWr41XpGrhzU8EZA6khTeMVgSZ5FU1sQACRGzw6v",
214
+ "QmW8Nanwbwoe5ZWaSAN5w6SbHGYAzE1Uje5wNJySkULWZF",
215
+ "QmThgMpfZXYxrneAzYeUJwBa5gAjG3rGYXKLyx6kJSEi8D",
216
+ "QmQbdofeVFNqsMfYrJxoQbobyz8PXX3ghdtTKK2NtTv6kQ",
217
+ "QmbmNr5NUKCfxxPrkCwQhpYMyvYCWsMEfFmYJLUf8MWVzM",
218
+ "QmWtDac1r2sNyUUx2LcN7VeJwcdxno6x4iRp2VD7zHRhyo",
219
+ "QmTDxjfns7kPpQVWzDbhJfdczUb4RZ5jiu7KetmhhjNo2Z",
220
+ "QmcMVUXcDjQgEm9YJsAQykmnnyYDFowqiLaEkUyuD43rKr",
221
+ "QmWQudrmXa9TvPe4jC6JYCyUuogCmficYDytbis1dQTK8A",
222
+ "QmazJBD9H1dJeM6SjxpKAEoJqL9QY7ie2v8p3Qk5sHc77M",
223
+ "QmexHy2WQbF2w2bToTa8V2JTZZxG1f8C7TjfxVFjvvLCY9",
224
+ "QmXq23WvtUdbNGRAzHJen2JLGGsTkMQx5CcyJjw6BAoscS",
225
+ "QmRRgSeYAwBBhTMBCUTEVPRMH3B9if16oiuntaQBjNSser",
226
+ "QmTB273BcmsW4Gkm3MyUEkK4zH8QFkQvnTnDdapyGzYXMv",
227
+ "QmZok97rbnUDoEKiwJ1gvwBzKhhFeqWbmw92KfppvmcwJA",
228
+ "QmUDPUMg946iVUZM7iA7xENaP7VYp7KHfXBM9EkiWLcZU5",
229
+ "QmZXqUUaRDDFwG2HVZWvXSoa4j3eVBHLWdtTEMe9meD1c5",
230
+ "QmRTiH27NJzrRnsQw8kNTSc9iUG813HweZN4HznQCgkqry",
231
+ "Qmc3K2yyS5tG7yhDVaFVUjPRnuP7MahjA8LQJDqv9ZhN1s",
232
+ "QmYVdyMo7izizLFMk4FEb9WUqRuL39Wi6Xw8h6aaPqe65f",
233
+ "QmVwt4bK9Ycj7VL4hLnbHojLYuGvm4FXbGeduwk5hWwFzX",
234
+ "QmcQhyTqt6cGj6UJx1dEGqPHjdncY6Jpy5DXE9ZuNJ9uY7",
235
+ "QmV6gJiqNJpk6JuTYuA2y78TMRKrGRWD4wmVyriqocgyvn",
236
+ "QmUxej92evQZ5GPX8Uk9tRDnDEAPuPaXL6Sym1Yyo2jjRP",
237
+ "QmXqxKWJ98KQHB5Awze5Jye7oj6Axy5o9DxfMiXuNWu2VX",
238
+ "QmQkwjEDJy28EmU7mmpTCTY2hddZMy4NWvpFcRLAhqCr6n",
239
+ "QmYyLKD2FNxBUgHYnCStcfLEjphsi6ih6h9SiMtZp7wpHW",
240
+ "QmS4V15bkLER8ewFD1Q4FtmbneXTyGBmmCMQGxiXKes4vC",
241
+ "QmTFbhX5V7QrJANzPQEG9JViYBZXSoFB2ADHX4dSecRgv3",
242
+ "QmQEz3G568uXLwdVMQ8coYrWC4RefJk2c62oMmcBHr8dnV",
243
+ "QmSgJhpyvrjpWHH941JXtmTXC3pMkraMpm5s8PTUPkYPcg",
244
+ "QmeToFndkRpgGyApV3R9Vq9KLNnhLv9Qxw78suGA7vpZ1T",
245
+ "QmX2PU9gusQtiaKJqfbmPmDQQAgm24T8gromYuApo8tBTj",
246
+ "Qmcg8NCsqR3YwU1PCqwMXW81f4CXRKnXjEMBesgTJTEKgQ",
247
+ "QmVeYwMzpmr73zeU35UifpjkKGFT1BZ3DPz1F1rMfCxLrz",
248
+ "QmaN7WkmRZsMtygd2pJkedYdpYsRAAYRD78Q8Wi3VbXeqz",
249
+ "QmNUfD91TkPwdo5eakkSmTZYyymdce74XAfK5BjLNbGs4T",
250
+ "QmVgupkRbxhFvy4QJySzaZrrkQLiTTNYKPod8zDbWnMqre",
251
+ "Qmb5Uu8u154QTzoGpB6ypwVfPZ8NUsU519tQmrgE8yQrWV",
252
+ "QmYZkLdy6tF6gwcfUZeqoHPBjCYuA1cYfxwRnxaXciEJTM",
253
+ "QmVpfmBfjCwqEtPf6pbva9eTohrVHafsFd7toVpjFLqE99",
254
+ "Qmf8RFSgbSdoYCSqkJqFHZy8hktR1LsoPvVg8DZHe9m7f4",
255
+ "QmepjQCNSbbEoVGrQMbQdtsrwhELikDpieaY1DvSjUhGWD",
256
+ "QmZDDPcyzGVuMSB3ys6kpvvqKEFnWPrsFW8k58sieBaczS",
257
+ "QmbfFcEEeKLkeFtH32N2DSi6UaHJdRhTwLxXx3RkN1Ds2q",
258
+ "QmaZ1ha9dbtr3Dq76sDHS5UGyb6BXAGeVfbDriQjZCt3MX",
259
+ "QmWDPX4dKPi17AwzBua723Ui3kKj6KY8SKcSiajhQNNzb2",
260
+ "Qmdq5ncejjNb8uUN8658A7wtDCwpN2KCrmzvsYSDhVDLQK",
261
+ "QmTu8KgApeJEt2H8heoT9t39GR1wChQgKXQ6EQLrLuYhy3",
262
+ "Qmd2C7Xpf8mMJt8TfbGzq1UyjdBrkKyTviP7k1LCmdGY4y",
263
+ "QmVmakJTh7jMEfwzxy8jBQAeLqqhM2ujHo4K6PVtWGs68S",
264
+ "QmaPCMjMXeHrwU99M9bsqmTstXfVunytEjLzX9HXHq2sQm",
265
+ "QmS4VYuTajrsp2DJjVFvnKqPjUvfC1k2hA7BM7raSDpNah",
266
+ "QmNwcJ5GaXG669jNs4pdnkEHunKJX6DF1dQCaBhobZJWVK",
267
+ "QmZG9d2rygrkSiPnJVCLBsjyAD2JakTcDh8bSZbau9UXGd",
268
+ "QmdLsuo5siCvG5KduhizhPVQmSyK3jGVmAXkZdkxLxiypv",
269
+ "Qmed2hoAfDto8cRd1XL5C91ZeDCWSVd3K55u574tstx2sr",
270
+ "Qme2K2z3nNQ1MDPY2ejbcWczetGrwv6WVyLBtDdRCBBx4R",
271
+ "QmatpBQ8KwYUtHpEYdd67Vd5Q4WDuFs5ooNSG1C8eiSyAB",
272
+ "QmZ6cPQGycdfrwTwxfdSkE43cQBDjSoCZfGETtie9L2JKN",
273
+ "QmaVSjydLiF9Bno1FRyUj4KQvpHPmwEuBitpdCHMmLDYSQ",
274
+ "QmdqCKe5ANxPxQAsbMLW4JKxFndh1Rx7W653qQVVhh2R52",
275
+ "QmVPwhrB17kgB99iUPMbCT8sqadxrctX3WG4bg5twtQzUy",
276
+ "QmWYpdLh4mqBZC4wBBzrQLZyM3mfehzyx8jd5vU5KjK7ZD",
277
+ "QmUtWPrCifM4FM3Wbd4u1JMjfqQ8AsRzgUEF2L7vaC2bpv",
278
+ "QmYuBEuU8cpdg7Udb9wN7ChHcimqqG9F2BogjxX8NM48BF",
279
+ "QmVHFng7aLG2zAHeqnKUVoJdTohwZnBMsSeFUPsPbx586b",
280
+ "QmVRdRQuHZLwe1T9EzKdTt5ZFfv8vcr1kjiJ17scnwzXv7",
281
+ "Qma29scmx6K4NkMDXnRSuBGUwctShHhMdMaz9CFkz1Bj15",
282
+ "QmRC6oC1MV4tJ3WKBpTW3vvWi8Lw1VnjWQthjXrqgifdYd",
283
+ "QmX3BTbCb4snjaKH1apuopkY3ZBvCqnyh2682zTPrqCAsV",
284
+ "QmdQy5FVneE6kqgA2LCS3k3FMsPLCyKauWhCnuFyyZxa6E",
285
+ "QmfCoMLjGJvDE6v5M45LU3zLbXtoYWXRzqzFFvrQ3QU41A",
286
+ "QmVidfqfiJuRimwk5V2XUi1cQHR4hBMThXQZ2SME5S3Wrc",
287
+ "QmVbg3iagkRapLoctTZonA5rLfbo2m4w5m4RUaNtbtuwmB",
288
+ "QmerFeVE5Z6ThcgxRrDSPRtawnZo6a7QPPQbT4pG91AwsX",
289
+ "Qmc3vudn5pZkbD1ALfLgtU5UQQfaY1AucuwMWFa38yN9LH",
290
+ "QmU2mnSibwokwZSp6aXoAf1htdWvrBSzvpMwnTmnkyRTah",
291
+ "QmeqML1nzTEBAHzEXxyY6EB6mQpm1MTTSS349XfpW4A2Lx",
292
+ "Qmd99kaKTB2sCqQhaBVF62KjvXtz7rpR1sNJQ2bDBP1zCC",
293
+ "QmV3Jr4bKhQLmHZDeZu5xfD8JJKxvpnr3nnom27McRfCSe",
294
+ "Qmc4Vqnmy8aeMdgdGMNT8PH7zkbF5arvFxn6DxZdFYhiPm",
295
+ "QmRRkLXR53fkbrkwtpxJLvjsaxi89FNUSokLphezLwTfaS",
296
+ "QmNN7c1SzYAi2gMfbQq7BZdUgKbwcF8kLxQCuXo1ax5a6m",
297
+ "QmWZGWfTZWAA8iQK8XKSsRBe2ZzGFySu84Dawy2Mp9SZsG",
298
+ "QmXT6UzMd6JNMrAJBMpPesXiL3cXrAo8cF7uXAr8n6UFbk",
299
+ "QmfUXVC95xRcrVK3TNDubMM6VbvQ9TXoVJUAc6bKdi7RY9",
300
+ "QmaodAiK9cSVrouFiNS6Mp5tukUs7BHekc1NCH2FQV9RAc",
301
+ "QmPgdA4MnCtDUE21aZBV6Djvwrw4DxhbkY899TwAxCQ8q6",
302
+ "QmWZkMRH3iGpaPwJknobWreN69wzLojDCQZDSpxZP3VFGa",
303
+ "QmahGxWxRG4qhzUvD7b87efTYFDWKugJDuwkHDezcmCz2M",
304
+ "QmRd22d8hvns8H7rMhD4Xy8w8cCZgRbBar6gSWxqh9ZR59",
305
+ "Qmayv6CkimPPn3ZWTZFQEvTNh4FTRyk2HEvp1rXgaYwKpG",
306
+ "QmcPBk58JNwU293Der8QewpDDtQExSgRCXWQRYCwJ66SzL",
307
+ "QmR2NLzG5orqxMXXwAu7Z77vkqGSeHwBdsR91FVjzdsNdC",
308
+ "QmRTfSCzSKofkLLmoYae4Q92wpGmWjuEJniyZbHkMH7bbP",
309
+ "QmemaoPwdn2HcQ8h7A2QRgHPj3ADjfdvFFk9NyS1yQBQQi",
310
+ "QmYcNg1nTVdtVNqg1KSGTWwruUT4NgrjDH8hyJnxbND67i",
311
+ "QmXL4drp3Gz9XjDvhGPtMGNhasrHFMY5bNhqZuvJny1si3",
312
+ "QmRcRCYgbPwfXn7Po9Ve1GqsfYtSLHLfBnve8SvxTUPkHv",
313
+ "QmTMrkwMcMzytnPWLFCZ8r8RLStYWw96EjKmDHLc4UQ5dm",
314
+ "QmWyqnRMYgZbhJ99eyg49PgJo34eNkWWnY5U7CfNgZmPvG",
315
+ "Qmer4aFfhMMTD5mEY7sfWKzwdao8hj7qvCTVHbBacF35Zr",
316
+ "QmTaxfrktGTf3AfZaPZdBiTfPMBBamshM6o2qterQAhny7",
317
+ "QmUsdqReKyfnFQi7p6cQZWh2khq1QVR136JJ7717N7aUGy",
318
+ "QmfPYW9neLP8PnmbN28RkWHBX9THiEf74LrL12Epu1vG3v",
319
+ "QmQQSJFdRv2qEzmCbYDjUFxTnKgGr5PB4EQjVpyYXGD7yq",
320
+ "QmRjSVLsAFPnZpKS2RhCUo9fbCrniyr6NyRNUHWkoFd1C3",
321
+ "QmZ7N3xFgNUk6jzhEvPFwaUw6No9sgTxKcCyMeUSQQ3LFy",
322
+ "QmQfrqNdEyYDpzqncKBUMFVX315HjNtWt1B6qCx5tHkq1T",
323
+ "QmeAMQ2L89NkjzWpfTvCJ8pL8ik9iZGYu2nVWsnKwcxhU6",
324
+ "QmZEeDCLDT1bTKwma5CRVGA1n5aN9c6hD1KPKV6jAGsiKC",
325
+ "QmVkaXTC16mSLP3cNc1Kcd4cfjeb2DSHevf6FBcPs3ck3Y",
326
+ "QmdmQhqoGUwvrdMvcshpa88UWUSMWf26NJactVxun3rFvv",
327
+ "QmPhGekoLzQyYjh6dcFVNVtQdJJgtx5HncdW7YYMMnQkYi",
328
+ "Qmafd51KbHsTC8rHZTuHHD5FCUgj7swgDLQ3gexxCJev1H",
329
+ "QmNfjQLmNpGDBejVJTo8DZFjQpdjQyhE2ooe2DTzXig8Cs",
330
+ "Qmc54nYmDWddHahn1y9aFbxpZMJ19mN1iT7S3W5NvYJKat",
331
+ "QmNnNN5am3rajEqYAzND7EaXbn7hQPtDGrEo4hnoapFpuf",
332
+ "QmZMnjzmNBkNBMVcjJoFNfn2Aj932P8UQ39hH33y3VyeUp",
333
+ "QmbNiSMfRQ2HZ7nsi95EJdjLth2mdGbHwB2c6Jjiwv9jQm",
334
+ "QmQ2PpMuQSTWKxxeonx1xdsgCVRNnUsBrqqFLMCR8Ki8G9",
335
+ "QmVrUe4YQra5ywChr3LW8n26mmuH3ff98p7DPqzJtxdYYa",
336
+ "Qmbq4LqYwbgY8w3oWug7EYuUTeNGzQU6BwprtPe4rVSxhh",
337
+ "QmbcJnZsgBFyZLgF1CoN4BpAYXzgv5fxeCPhyTokJLqwov",
338
+ "QmPe5SeU1eK7qh9VuCKeWx9v8tdC4XguMeQ1Ep4VmG2uSh",
339
+ "QmQzVJzJowHoMpq3wuUQATJ2Vh3ketQSeJ6u1wvU8zXbzF",
340
+ "QmegVuYAB4eFLUeE7rYmFXWudMrZMM7oJ5WhuKfZhwsMfp",
341
+ "QmYQshiPnL7CmyJJEuyRSMLTS41mkFnPnAbbGfwtSuJY4d",
342
+ "QmPJbq1oFrTQrQDs5iUc9egwzxdiYRZ1PFfxemK993pjqe",
343
+ "QmWZKsea1nQ1yxCJXq3CAn6Zv9gT5MiHn5xepxyPdkbjRr",
344
+ "QmPFzAe3VzxX7MnpCmHjtGapR9PaPkTaGFU9fR8NG9Vofv",
345
+ "QmW9p5NyXUoU3ASKizFf9VkGsGjTyKC889AFeJRp9hQRxv",
346
+ "QmWQob2X7mL3t5xcF1GDnN9hZ6U27khYoDMf8k44QZ3Asu",
347
+ "QmeQoqz1v258i3YqjD94ji3abY7svB5WoV8qnBDR15Znzu",
348
+ "QmW9LzFyD9sEtw4QPQ1NfiSUksXDB7w2EJbbtjYkENcPx7",
349
+ "QmUvFmCDXpSYjDQRuUZ1cQejiGd3nR2qNuPdxCSA2R54Fx",
350
+ "QmPgYampLSWCmaqiZnGaf2sa9WpjbGrTUiz8mEBR9nLmxW",
351
+ "QmPcjfQkv7heSQ7g3ivfuzNorFRMJhk6tGtSAVGEwsKtqU",
352
+ "QmZPLWj97VidVYocCpyjco86FvF9ihxMDzm1269bXB2mXg",
353
+ "QmVru99h1EaLvQhdhnfZBGsH366fm7MsK8ukqio7cTLKQE",
354
+ "QmYcbGS1NZgfDQZE5Uz2u3qp2ypxJF8bknuKRxFU1FZLHG",
355
+ "QmYdhTFHpZB1Fgc4WEg3Ku6SGzVwxgDku3ngqJBuCiPtxT",
356
+ "QmS4QYGY89HvTYeNA9uMPPctXw1xC4L6ZoggDuKCqGtzjx",
357
+ "QmXnwXhkf9z5XFdTxqaCK5gLQE7RLSZ7W9GvB4gGwWyiQX",
358
+ "QmVpZ2jKCtJRhfapuRTy1JsGrkj4PKJHUMs2AAAjPhBu1J",
359
+ "QmZdqfWkT1JCefp5KmMiTokuaq5zYQ289ienRAa1V6Ekhq",
360
+ "QmV4nkJz6o1SyhnyfjNYdksR2T6WcaQuVJGpiaJGkv6isr",
361
+ "QmeKDp5F2g5qziF91FvP7utftj2vYAjtJTHpDYZ2mFCEDs",
362
+ "QmaPow2mt4tf37JeG15TjLbJSZJ2yngtugK8nrAjPZaaJj",
363
+ "QmNx96iE8gjP4F4HwzkFN55faUetx9ZVj5ETYWY4SrkNjT",
364
+ "QmVE8U8Nq1kpGKheEk2wW8MQhohY5kuvzu3eP3bnmdjuP2",
365
+ "Qme4h3KizSaqthbXRevpC6VVj77cpfHLYAFYVq44Ugd5z5",
366
+ "QmZDxCPGDuYSN2HnEcjVF1FUgx29brci1s6AYnmxfbTtc5",
367
+ "QmfYKPSuAiNyXDkE3NQ7J3ADV93j81mVbAVCpf1xF6wo5f",
368
+ "QmTyrAkEup6TZuYihiZCDfYjtnEdDSrcNzZ77uvmha4mR8",
369
+ "Qmcdt69vR8kSap9gZUtdTT91JUo5ePD5H9FwRhTRZjeZhU",
370
+ "QmWt6dUfMs3qMPYJgSCyjLUjSzJHj2pAdQDriPP1eDkfuZ",
371
+ "QmUA9AJR9gfBqXUSV2z3CXk1DGjDtorvLV8CwPGw1SZCvo",
372
+ "QmPHoQuKDqh2c5uW8utNrbERTXg3jUdoMXpHcrjmWtdoVk",
373
+ "QmYsGmRm92LHxRK2kcXep5kLdruiCjsXzra5boRy4nAUs4",
374
+ "QmebzhY566vN8n9h1P6jdrMQPoKcnFdm9UxC6BbWc3puWV",
375
+ "QmRst9PxEpfXTadfSGbTE2zxBQdVA676VmSVBPs5b3kDjU",
376
+ "QmdxEMY7vm5Ga4DBCL4eCttBsZLLQXyaUga583H243KFJ4",
377
+ "QmPMYtjAesq8aGDQfwPCgvDeLrMbh8mNZvqweuhZvtqomT",
378
+ "QmWkxMNGdTuvgdgFgY9KkkiADBJ466sCXfwr6Z67vxeFbj",
379
+ "QmQPZntLdCCT5PdYRqgqdfDe2mrWqpRYTXRL5rGKQFSHF2",
380
+ "QmSoQR2AbwtXXpp9qwJwTt4ywkXBt339RU5FUWWHt7NJcN",
381
+ "QmdAoQqgkENgHXAas3bCvDyYCJf247uTj8WjEqHc21JXST",
382
+ "QmbJueSqMWqV7xKXukXSxyHj5TPXxjBK6oYMJdBNJaGSFh",
383
+ "QmUjvGyGssPE3r6Mjuz3xNKPevC4Nq9tTrbzdjDrUCBtoh",
384
+ "QmUwomacb9wepczydDRuKWc8Pwf7cKPF8q7NbmkXXmkyec",
385
+ "QmcAwhhDMNEnq2GXmR5ZiHPniTCYEfikVCW8oaA7qJ79Ww",
386
+ "QmdkEUeuRfQJjBWbvvKgNFRNzjSJq1s5tofNrrUmAqnV6a",
387
+ "QmWUzo5o9ki26XC4dicECwvNKvKpMsQ7wr2fz4bcGp4w4Q",
388
+ "QmNnbd2F4WLRuAKPEEi4trTxiNVeYn7z2ZctroUcirSszf",
389
+ "QmTxUZJoJktDCkg5mdU7qA27sJo1gs2kWyhxA4xZED3aVj",
390
+ "Qmew6YW3ttjCDMfpvZz4WjCTJTx86hBxZvV1NB6MHNENtA",
391
+ "QmShVcWV9eR2zkBriASQWfcd6Ue35SU4TSvLAF2Cz7caKA",
392
+ "QmYY6cixMbkYv64jssd2sSbq9vzXwAXFJwjYXw6J4X8pn9",
393
+ "QmYE1sBR8FbzGz8BWx72sV3c9wq4Mm276nYBXAiASBGGDj",
394
+ "QmVzPtCUZt9TtNu7e4P7g6FfxMr5Z3CCb5DXQ3KpiRUCCZ",
395
+ "QmYqkhEm1XXp2WqKpejvC7BjNXM1FMc2uGH2pVucacaxtg",
396
+ "QmTwdq6xAaeJ62i9Vr4AvJsmhoNpq6AiF5tHwTpo5zCqNC",
397
+ "QmXjTMRXXpqRYcf3qm8NbNFUKN9yEGEvDjy8McLaGcRfHT",
398
+ "QmdjfULZ9vMwxd8kQrTNjWQ43h1NZ5KCHCEmau5KguTcid",
399
+ "QmfDTne3NS2hgnJZjwEpMPfcWns4TcGrVsJck3JJcwrDdZ",
400
+ "QmfGuMepibrSLCztNy4TNGPXj34wWv5zWFFDxSh1E2LzqL",
401
+ "QmQ45eU49MEzvikt1iX4YzSa7NvyPV8qhz8Cp3cPbtp98g",
402
+ "QmTkMujFKq2s1qFXvQPG7gUnV7UxRr83Y4ARQRu2oTL3xw",
403
+ "QmW647YTF5b4FvTzM4vGYmU1dQYNfiwFgPFmHHApfe6YP7",
404
+ "Qmd4Awoyx9DAvDWNyYPYnH8cZy79KDHBQCd2Uvgs2jXv3P",
405
+ "QmYK7UQHrXLF6kd7LrX8YZcvR8V6W9fCYYPPW6YwJv1zVL",
406
+ "QmXtu363znTk86aVuKBL3414s2eMvTjdnhhSbdRWgJPg6D",
407
+ "QmWtxrWBwwdzLgVDPCT37hao6p9tDUyYHcq2wD8289prjp",
408
+ "QmaHbEQAP6k2zopJHJBzyaK62zNX5yH8yASDjkaG4DY9Dp",
409
+ "QmUZGF3ge3d9rzrtxrD6V4qx2gLtGeeNLuCb8fQeNyUkwJ",
410
+ "QmfBBnNrVrkffMKoESvq3cB6nAWGpfMPjduTgw1unahvPf",
411
+ "QmXsFMnKWaXJ7r4tnunZrehsTcdXeesbkz4Ck7ynZzCTDj",
412
+ "QmbB8wwtq1w76YrMueifMuvUymzzC7chgcu4Zp76HSZpRw",
413
+ "QmW3UwAySQQEGeXY7TNKcmSaGWWpDsNhrSySVRdYnBnfgE",
414
+ "Qmf5FYbchHe2gCHFsmVKmDPSKDfR3RWruu1Kwy7gUX5Jhd",
415
+ "QmdwubNVvqAUQV5Rft616cox4HP1bAe99hchJ4n9gKZ2vA",
416
+ "QmUF2n8omGU5ko3XjsWZMt5dwS1ZoPnCf3RJyXXobYCJJW",
417
+ "QmdDogp7wJMLwHG2JYV3YTCFtLagceR5ANkeC4caf8CAMR",
418
+ "QmRpnJN76aw2E8rbBxEQsDccW7KDT9wLBQF7ogDgtScgg7",
419
+ "QmSomBzNykXFfZaHcAed6gxgs4HcNkjyMGbk8LMXWLsh8i",
420
+ "Qmf8cGMJGFBiws7nSJ4yrF9yHtxWeJJEzCvpehLomNxzgm",
421
+ "QmY7UjDL2qz3JvgVwpoWkmtTNQzV6YAdkGDe6Ammt8f5tQ",
422
+ "QmWbrqL55LSfjXRewWBf37yKToJRBdrmCrRnc8PeBr2bae",
423
+ "QmYxjjBtYW3ppcCAai5t8UekS6nuknRgwH2xKUhFK8Tnrj",
424
+ "QmTVo65272gTQvTrYY2ECidpW6yHAMFMkZngzsu3y4pYhY",
425
+ "QmcNxGZBV3BXQEgPFa2FgoYCkWcGeakB41ysMXQoKtG3qe",
426
+ "QmQJ2y13JEmSA6nDDLWbGnibP5Mzuwdb5G6PfRdkYgT9DT",
427
+ "QmTqVinHaSUWBZTJ3fUpSTisWWn9n11Go4AtN3nMc3T3Um",
428
+ "QmaSV69r69MtNyXUSgzrdxQpbFtcw6KBLCb8WCHXypkX9D",
429
+ "QmbjEQ1QpUAYcYZhyZWNHqjHa25e6a7kwrAZVYbfYtkQ3u",
430
+ "QmW6r3iPj4b1mqGDRB13LiKEFaGn7e7MZpUgjAv2RG27WY",
431
+ "Qmaa6DgT6CYQEMnzaA12yhgssV6WERGcztsqWQCJTCPtm3",
432
+ "QmYfgJvNM9LZPkSxMbhGjGgSoFXtU8z8r3t8omg8Kaau2d",
433
+ "QmVV3omLAKReiKEF69pXhZgTdsoPbyVR2ugoevv1x9CAgo",
434
+ "QmX9o8vNPFV54LETBYdnAwWLTfjw4cminZtnXcK9jm7zPU",
435
+ "QmPNhKGc1sb3PydoGxUaxQUrHELp1AwStCJ4WVYkJkfJAP",
436
+ "QmXX2ANymzA8d3pzghY5Z9aBJZVHqN4xpchhywFNUAf21w",
437
+ "QmVEuGnPZE1PAwcZeXqcoJuoc2P1A2nytxag59o9GauDTm",
438
+ "Qmc96xroeXHSYf1S5bBDjY3S1PAB4kXwCBQgLRsgyp8VZt",
439
+ "QmRoYGay8SnJWVwqzJ43vYtVJd6q7GD773kXmsLbdhmLZD",
440
+ "QmR1BHc59QoeCnEjjLrynnAH5wpu9nRWX2e6diArvp5Cse",
441
+ "QmbRDNBHtZA6Bqs7mpLAzdQd1HrNkZw2TujFNjEUZ16dUU",
442
+ "QmTTHRx4KLEDa2W4skQPhARjSfKPQpopAJUhqubn3azyKS",
443
+ "QmbFeX3MjvZituGhnTq1jQTCWnGqtNyVs5TGpKt3vBucpb",
444
+ "Qmd4CbU4aeSbBzq5mk3533GhbwVV3C5oVNp15B6saVEDCZ",
445
+ "QmWTDFP9CrdByzLoqzr4Pn3QcxCyKnyhFnfWHLX2JxQ2kf",
446
+ "QmXW1ou24MdJq9BHCi1T45TaAbhHouWGNpsmL2XzYkY5if",
447
+ "Qmami4ifqxEDmDFSK6hPJX6FQ7bJ9b38Nz2aMg8tkAPRvc",
448
+ "QmRnf5bkjXSQmWPTLBDXRyCPj1SxL5QDZq5LGR1zL1fShP",
449
+ "QmRyQZAhTomP4ir9b1sFuZRivoone2ukwHtV48DXwA32ko",
450
+ "QmbDsXyUiBzMA52vmHhfY6qCGk2NSbHRAyGBCXN5bMm5Yx",
451
+ "QmZwhZyzjrc7mgMHLQH98xBbqn2CgSMt9yJ6cH2ZKjJ5yy",
452
+ "QmduL2hm9bV5GN9U2oxLByqjiEQ5rXEARLNnGvf9sbmRdn",
453
+ "QmcxLTpyAknVj5QZgsxdgrg7NSqChD93ut2RPBFT1uUTdr",
454
+ "QmdvaG9MiBm85djwjYrPJg3wmh38dne72YDcSzXaPgBNDE",
455
+ "QmXF9A1poQfKR1mkfwv6wUNk42S3v4a7K4AtCaVmoJcHHZ",
456
+ "QmVebS69oAGwJJMRHUtTxbNgCjW4RZg8CgMbW67bndqP2z",
457
+ "Qmbz2ADm3f3asYgKwUArUBWTB2Grtbe2fuaQxGF7pfjDJY",
458
+ "QmYr5qFAnmTKSeVegzjn3Nt6SUAyMLJ8hpZhK5qKwFe3bt",
459
+ "QmdsAdwp8xaJF2Qc6shZPwd4P4kiT5qK5H1awxZU6MdiyS",
460
+ "QmRkqCuvbnyqzKSjY5ozN2oEGT2E59Zw8iHhd3pETfemiS",
461
+ "QmVhXYiLs5AMSnqGLrYC7kUAzVTTiyu9qDphb8TFH7biqk",
462
+ "QmNycssFwkGPSsukKwA34GjFoKWbef1e1guVkWHUdvTgWd",
463
+ "QmTmuRdadBzwCsdHDMXAqXvDcGkCQDfvoMBsqonJNRpSiB",
464
+ "QmRoZV32mXZmFwwqvX5ykMoyNjyjZvjVT3NkLVJcLCj1Rn",
465
+ "QmeiLPe3djTfMmAKdNCnMQBdes4vFaxbzPH5k26rnjkTCs",
466
+ "QmY3FVhPNBxjgKZYi9mSiqAB1GXaKDMpRPoFLoHaW9UFBc",
467
+ "QmWyhhKhuB9zwURUCaF5RssuKT2uZi4gPcXLwHRPkfs6zN",
468
+ "QmW7DzVmvSKYLWXzoSvF5UFoy9z8ATGUcs49VyvH8EsBZn",
469
+ "QmTv4wHn3pjs23pt1ESBpK533TwDmepSBse2ULvf5DzBiC",
470
+ "QmTnbkeTsXAruaPkSrmGVBTyeBcztWRTAfmQJa1FDDu5Zo",
471
+ "QmR4Kw7wjEuC6j7XgwWKSJYUb8fqq4CPnUBNC4ojaS2Eib",
472
+ "QmRLVSNbfXdCJ83i4L6d52A4XoSqteb4UEF5qNXb1A5YBf",
473
+ "QmejCD17oPmHGhnLxohaToQqUnThGE1qy7fu9XoHT8JkXR",
474
+ "QmQn5eTB4VSNBY4PPhBx1qqULMdEdnBDkmU7ZRVsQPupPK",
475
+ "QmYwSY81XmqvToA5nHWnCZYTzS3eShnrEV7XmrVXFRqLfb",
476
+ "QmRmYSraWyDCuXtBgitfPgZj5wpGr11dfrDg8QzdfEevpM",
477
+ "QmYhLgHZFQxGyPegdKn3TYoEYRuhYzrmfhRh4nHH2m1VL6",
478
+ "QmX1cN8i2chRMsLxJxbLs1u72gZoSEdPLensxFN6WaeGp7",
479
+ "QmTv6mimaoDKCPNBhyQZTzwT719K18S63FkU8oMKbtsSgc",
480
+ "QmQmfsRBNXHidS3oUnpxkkTwWKnZ6z8vreaujAfY2W1P9L",
481
+ "QmZLF9SyRjgPtcnixyiEUGQFyVRtKaTzjR477bKBTDmvLp",
482
+ "QmeKWJuHuynrbYsBmjrcu9N4Kmd1xi93X8AfNEbVN2vvHk",
483
+ "QmWLDLsXWUetW24eXrbfPrWVdXhzoADKZi9hKvcLPQvnZA",
484
+ "QmZfhbN1UELRfmQtGRxFJPtUhJpsF2wwBnacw7EdC12kvg",
485
+ "Qmf75aHP7UuHkA9QU49dqzU1iVBHq9kryQVYwaBPGkM9WF",
486
+ "QmTvHegn544abqaYaxDhhv7pZ8DEo6nZVyEQ3XmPrtXamD",
487
+ "QmbSE9wMdyLtqSpJcp5WHHQAzMJjWDyZqBGMxx1hCBFTTt",
488
+ "QmcJurMQ5LmRT8P2g92i7dLmMp7h28P8kkPJ3pvLsUGUuT",
489
+ "QmPdDu9c5i4A9XhRXMWZaWw1uBPdPGU4FmSXRRRzBrcvCH",
490
+ "QmaGhZoJhufXUb26RFy8VNXfSnrTFd9PVkzSL2ENtYETFB",
491
+ "QmPseR1x9WKsocnXqbacTvEZyQwVcdYLbLsFd78U44TT7x",
492
+ "QmSZmmipeHyH9E1oCyZ7XMB5q6L8t3iCo7em5VS12tqrME",
493
+ "QmdUs3DUxrJBtKc2QU7Uu1hcw4cZsKDifDb43NsMsmMWYU",
494
+ "QmXsxzWCc3bEtytUgGHx9eorMUAeCGsudFhsR6v1TbqvfB",
495
+ "QmQ5AAH23EUGpShhnsmWhQt44DnTAzZ5rCy5ZXNwM7ys7w",
496
+ "QmPjk1HGXEvhzmJBED9CL5TC4QzBju8rGc33EeKdBNbBFZ",
497
+ "QmXfhKkGZSKU2a8Zb1z3JsaykCLeGCaeMA2ipydq6KdWCw",
498
+ "QmNy8pmg5hE9m9rHCZtmZgNDeYwpDpNk6GEYGjjCjHkHZJ",
499
+ "QmUFxK9QdQbRMbQfUxv3nv66XRdoEePaKazVjXuzwCdrMV",
500
+ "QmUMJkRPkQoFt3dAHPVAu2ogGFvswUQAXH38bzXLDFkc7Z",
501
+ "QmWrhGtxZUXKDSJsuoCkBLFfSNNy6pHD5gRnHLGNKhZGi8",
502
+ "Qmb7YAP3xcytesVbvezovg48R9E5nJ8XgAPzATf8sFQNkf",
503
+ "QmRdWrcxmqdsyZTnpRzBt3fPDnYycArqv1jJM87FEqJeay",
504
+ "QmSvMoy3SeAREVFTcr3LRzw2vHAq159nTjCrcXNLRSmAyk",
505
+ "QmSvof6bsEDAuMvvQgeCXFLhATfewz6uA9QwcUhEYy2AvY",
506
+ "QmYgqwNStNFuQBeXsjybtrgCswdzApm5Rm1s23JyEU9WfW",
507
+ "QmPvQCbgwBsgzagm7w13G4rxai1DXJhKrh14HKd5PQw72F",
508
+ "Qmb9QQCRuoRnu2YieCGM8H5Zf9XKdLGEmSJM8oCdvPqqrN",
509
+ "QmcTXbXZrwwt5KSVYHb9ffsJfc5D1LQb7KzLvHoatQy7tj",
510
+ "QmRWspnUxueYQqAEvSVb9JWPorGiMHKFB8aXGKLQJepjnM",
511
+ "QmeXdubuRVN3T4kh5QjjDWXDPegrChgS2DCXNLaxUYndsH",
512
+ "QmQtLz5n14mz2vHncQxQgtYFBjZR27vy3GtARaXRphuW2u",
513
+ "QmeBmXdDQpqwJaJhN7B4RYoQ5fJwC6mtQDK6hj4yghyVm1",
514
+ "Qmchuv1DxrQ1byEx1s2isumNnQoe1uDoq5RVRKPyFbRqMh",
515
+ "QmRWKEjcQQo73De2nHqJfz6hTkixaeiTcUkkCvxNoziTpv",
516
+ "QmcNhE5LGJ3okZKpsmbWHRsMrwooEGoTD5j3UCq592ep9N",
517
+ "QmezYGsfsN8UE98PPAafQHdRbVtAd5bMW8xHGmR9XeWXDC",
518
+ "QmYVzAikao1frNNH9yphk3w43p8yeo3vVyEEmYReeFYM2J",
519
+ "QmUqVej93jpSMDMAnEH6SVSZ6uTWzVn8uE3zZe2besb7g5",
520
+ "QmVrkEL7jTsnJVhSjHgpXQqf1tVZNBWhXqVHgKeGsP9nMC",
521
+ "Qmabyk6rg9YiaZor7XSAWy288H6Zmkj9m4crE6wQqo1XSJ",
522
+ "QmcMrXvn2VJQjh2HbKxeswDv6bXX4F1PKDRkbZ2xAzvpjv",
523
+ "QmaJ1SBMs9WW3Xfzcq8hgs5MY8NvSQGtGU8jGLGK2uMnAE",
524
+ "QmTqVH42fgCKHg6Fe3jq7WyT4A2hFTqmbucoqXeRviRGVH",
525
+ "QmZTenfCMdDDFZKDx4kDrgWQ7ZQjQ6oQkzSp6U4dfH3x7V",
526
+ "QmRFE81ssXNF5oFfFMhb2cZu27ZrSuSokzduWy4XEFzyZ4",
527
+ "QmVpqFAddYg7D1LxvJeW7rMhV9pTDc5WXZEmRUkmkfobe1",
528
+ "QmVnC6KpkunQKyUwJNgUzpE2F7sqhA6bV7jSkEBStGcz6p",
529
+ "QmTjd8GAaafuwybbwTRECkuhc6rM3WLg4qrodLdqc8RWAz",
530
+ "QmZPjBexGowyGDYLAFF7LjQuwYfTSi25XAY6rPeTDUvhDE",
531
+ "QmeCuEHVfYMr8ChxydaTnAQhPP21SfRNmhbrrnrmFujNP1",
532
+ "QmeQk3tUaABArcy4BF6LidJccKSUPsanSq1C5BUmKxwGSi",
533
+ "QmVGseX7vWj6HH3vybSSWLbUY2yeKgNwgnUYwriFHpZGsx",
534
+ "Qmeoc99jqk7TdazUBvP7VxZL6EP5AjjWxk3Ug8oJHapxhZ",
535
+ "QmZpVWbcMi78uSHLmwwdKmje35CkQ9sTWhUssEF5qR91LR",
536
+ "QmWUzizz8BdqphbYQtwTz9ah5RD3m3GqoALDHqc21SuCgt",
537
+ "QmXohnh1V9Bp5vDBwrjLZoHcfEdkqfR6CwXZDnfmwZ32mb",
538
+ "QmPbRi5FhBtsQa1xPAixKdpw3PeFeszYyUDvqw7W6kFmqL",
539
+ "QmS33cEacDz6iLr3JAqQXNHoPz21sdvWShxfWKJUtVJFuY",
540
+ "QmXjbU7kKPFeQHvMNwAr2D5DTaUJ1WVeELgqM3ATSZ4Ksr",
541
+ "QmRrDSDwrryprbm71xKAxTtP6iWH6aFf9KTDRRGRPiuAx2",
542
+ "QmWuZzVQULPWbPMgnc2uvoNicW2tA8YQ4Z9s1RXH2xmPPX",
543
+ "QmVDmCvVZ9me6bwVs9C329ibY9JgmBzZFnrkSyy2E4xtpd",
544
+ "QmahqoEozVJF62G6vYihJLEa1AMEbmfve9k2d7TWoErdcy",
545
+ "QmZLWPy49X96iHZSfg3peGC3CmP7s8c9CMC6mTJ3wmmdQA",
546
+ "Qmcfi34hZ2avTeB3rVPCpC5X1eayvYyiVv7m2TAijMBmb9",
547
+ "QmNtiB3EqUf1379cD6NVBv3J4VxeRsUWs2482ZyZxjY9gK",
548
+ "QmNdoAVYna3P8Mej5tQj7bo5CWQRUXwxAQgmnEwFHTqSV2",
549
+ "QmPsepvYGHSqR4oZoD5tjQgGRWcc1HE2kDBJgMhwxCSFdW",
550
+ "QmbmRRWKoV11bayoaRXCGgK16vTEd4KVnRSZqcyuoARCxW",
551
+ "QmbQg3RiG36gKxqDX64qveewm9iSo1RvL8p2CK9WbupWhX",
552
+ "QmcF2EBQrW9HUpYQ8i7mZ6bSGzSTxRgznjQpyPpo5U2T2m",
553
+ "QmUhu79Q9Gv3bMEtvqmyrC2R3eRHfVfg32zLTjrgqkqv6B",
554
+ "QmP8ij2oqUKZbVm1zvUiGYfd6tatgSz74Y63vuWtAWhksa",
555
+ "QmcrKzdYMReMDoAX2v69U2yPRYN1VSJyTqYLNVicQtcJkV",
556
+ "QmdQkSp8woSGtDEJx6xmfCpQc4dmpmC9ogxRggctfiusyu",
557
+ "QmZzchmmu9n6L7K59yTLvFnjU5LTyPF4BwgxjT2HYquNXW",
558
+ "QmdzuRTgi5bnGXaTmb3RYGcThA1qNR8Whx1tmtqrQDR3KK",
559
+ "QmPG37vSFgCmUcEbxdQDhdExb8JgZBXdUu7wuWH76gt3mX",
560
+ "QmQjHzyms2nvVissqcQdJ1h1NVJbqJcWWvMccEecxhqdTN",
561
+ "QmSPCZnFqQtPuu2wgHGqPqDP5M49TLEtL6x7atTadsGifx",
562
+ "QmTM1BwXakX9YkYxSaLdtyxdGYfc5mDYYERGphURZqHsuL",
563
+ "QmbYBQaxcv1yDnszX2RcZtLRK4rW2vJLeoyC7NY5hv9dcf",
564
+ "QmWg5TrRuvZeougTbNvcw8CGzvFUTBTVZbVr1mAFnpUoqs",
565
+ "QmcSyeHikrbSi4bje2JU79FepKS9mrTGHyfdgQNLrNcR9x",
566
+ "QmSycpuBiHdXaLmYRT6srCZcW8mcCHHevjyK36nY6q5jGm",
567
+ "QmaDXEGRGqQ6AiD61s4e56qcveaWHRobK447aNYd6Fciru",
568
+ "Qmd8h9crMyMwxheB8aZnbsCx9FQkVaV7Psd1NDvLCMRGWT",
569
+ "QmXRbBgvXhK7qNPZsmNsBnMpzwZTi5PFvHxZbPuR79hkrb",
570
+ "QmT4tMC1rDNHJY3h2fXhrPM6zb2MHWrhpWrusKP76p6KSQ",
571
+ "QmPxDqqghekjUxCbo3mz2KdxHk9z3BsyJKMcJFxpikNCk3",
572
+ "QmfSJiWBj1JVWYqi59USbJJwBZ9SAahvqu1iXSF7Pr2JVR",
573
+ "QmcDEJorb2v5JAFjpDVyM8twgFXdh9qBZFJ3uHKUZ2eMqK",
574
+ "QmbHqJWd5GPLiCA7UJedGzLzzkjMNm4WG7RVY7im911SAQ",
575
+ "QmarmJnvsaBnXqyS2piyY57VyYXjDYbhMHVomjeBzRV2K3",
576
+ "QmbYCnSCyokDrm82MVSmfZe6bumJ9PaNZWpPioX7uxKmbo",
577
+ "QmPgFMCk6EgKqEc3Hbcrmef9dHyk4fBe6uX3Sh6of67GZV",
578
+ "QmeZPLoLqAta24hnhfBxMSTTUzd6mxgEmHGBVJqZMxmsVr",
579
+ "QmTJSKFa22b5ecUXEkcgrXnKSEA6WtjpfDafWtpTQFAGGF",
580
+ "QmeHUBJZ3xJDPpDLJ7PMGubnuR9Fh5M3N1JMmnL22RUY42",
581
+ "QmYbk4GneMQHqftuDXvKh3xBL6qZiorpLeTrNsb3rbD9XR",
582
+ "QmbButr18q9TRDXkm3mcq1iRL2fYgvB8dimx6jCcZv9Pjq",
583
+ "QmbiVK9BKuVuEYQzJpuD1a1bBU9c6C7CgmJsTrjXbwgsWR",
584
+ "QmT6veKQdJdP8QjvqRFhAeuqr3aMgkkuWzRn81THxyMydW",
585
+ "QmPwE7CZDQ52ofjcGuMqP74VWNXWRbY2havDRUFd49LCnV",
586
+ "QmWqsrtgeSPY6jmxPNiuZ3589odmpR9omXZJ1cGWeLxFd5",
587
+ "QmUXMSfzLncfosqrwx5P7m8UDE4nqQ5RciZf9YXrcdoJvs",
588
+ "QmWHr8JZcBytZYHyhP123pTFUPyaK5ZwEAA64uj2y2WLzF",
589
+ "QmXrLBqEkTUH5K8zpp6z96tL8tC3uQvkYzSpWHawJDWyat",
590
+ "QmbbCEUjF3iQJDRyfireVh9bUq4EACveM67tJAwpr8MU3v",
591
+ "QmcKbbrrJSRh7QNzdg1y8GVZNNotr1ZgeMY6EmhwS4v1pC",
592
+ "QmdDqBiN3z626Qu5jA4St3vpbLScobEYhuQG4RCtXHzyif",
593
+ "QmRxab77NQPzSgLFLFE6BeaN36zPDgeL8gPSe2VdfkA6P6",
594
+ "Qma7TTNV7B8udte8YY1H4WD6nTBiiw1SAzMktWDEkkjDWu",
595
+ "QmVEz4JWsDWpQrvtZnVbyPVWfHaudCkXZwC1zcs1vQKWGC",
596
+ "QmWpJWo9QZkCr1i5BJvqSfrwemjaNeZ8hAR8oQ5WvNh5Cu",
597
+ "QmfPoCoNeXdEuknusGvEhvYSL5wUmsmFP19b1xQBqRjecf",
598
+ "QmPRL9h9m8EZDRn6QzMpP97CRHEnyuToHYyBa9Br7nrH18",
599
+ "QmVEAsxcZ1h2fqsXLCWNui2CJEAwkSb8LoerCLGN7wFQ8y",
600
+ "QmPDPFoeLzbPHamsVAPtSPy1wcBHggxj48iFbobAUp4gme",
601
+ "Qmckvd9arXsXxDRTarHu2KUBnNJqHmh4tnW3S1RZ1VT89t",
602
+ "QmPVJEh2LeJyF3PUJxmYAC3YLNDNQJ1CQ32fEzkxRsdiko",
603
+ "QmaqVzchifsjNx6Hy1RD6wb2Z36BiJNPzgSyisEBzh8T6Y",
604
+ "QmaBx9PXB2nRkDmKhFz1QJjRsuZshgcpzMMmhLt5T4qSyK",
605
+ "QmNPoTBjpm7UQkUWxyqb6B131qQkvCMqGyh3FU8rTyytk8",
606
+ "QmX8zsBdjvjNHXTXmNdSLBjMLceiQgA7xKn5HKUTdR1HRw",
607
+ "QmZxTrZPtwryMoZSUByFoLxMJ1hnAfLeXwesLsqQzUZzyV",
608
+ "QmVvEaCa6zRp8Z9YkkZVYBn2owSdwZxupEQacjfd1b2HA2",
609
+ "QmdjQEZzEhigLyfij6ZtJPPHUQR1TdsMRnGPgbxBRmw8op",
610
+ "QmYF7w26Fjufgr1DC85dM2bycqckSFdMENHnZMmPhQDtVi",
611
+ "QmVnxHS4rty2k9esBVjM54iBKj5EhroE62TBpFCQ7ZfSMB",
612
+ "QmbBUkh7bQdmH92NmaycDakjb6jU5mYJooU8nTDCwNEJzu",
613
+ "QmfJYmwnagstpwJWTc33AZsLoFVsy64TjXAhdaWjwys9Eu",
614
+ "QmSL23H5bR3JiqYzAYiXfbN6Yu7TH8QhE2dsggbeef4VBR",
615
+ "Qmbgzd2gfdpgBTEEHUjJdcJAtHzuuQxSVC13fDZPwQ3knx",
616
+ "QmeQBNX3PQvQMrj3VnbeELzbdWc5wGfQSAF8fXSNYoWrAg",
617
+ "Qmcm1bx64SHmiECXYs5TGTEp1gHeyEsBzp12y5Wr9Tduee",
618
+ "QmSzgefWsFPS3qwDvmyTLZV8P6ZBSEnW7yEejaooDKXXUi",
619
+ "QmaELnqmjdMPZ8HqsfW3tDuz4uGHUn9txJtJkkJHYSR9Lq",
620
+ "QmXwR5VjTSrKzjHzo2FrXnWS3GSo76oPVrd5WhV32sLvub",
621
+ "QmZVP8g8tSNDriRH32jKFrD34RfGro2xY29zwqtNkTqVz5",
622
+ "QmP211gF8mXzCGExNTNPr4a3Jn4MH7iZ5rr5oavpsYhx6Y",
623
+ "QmWE4zzqoXS9yRWFYokMb3pRdTeehRqBgEuqwMgRYka51R",
624
+ "QmUSyyUqCZnTQmFYwNUhWGYm4CSJCuGgxFCbnD1T8mRZrM",
625
+ "Qmb7jwtvCbPxfUZAhhqE5ng6et2ViYspQiArLqf6bUX1Nq",
626
+ "QmfSyDYeshn4Y5JyP3EzDEgsgL5Z8o4AouZWDfToJRJSmH",
627
+ "QmPobNHxbr6w2nmdTxFfoVH8FP6QTbgp8wUb6UtxAv8S1R",
628
+ "QmPXF8ffhF3zdS1Tng3rVN6FZfq3hxMch5BZcWWfnfEhSN",
629
+ "Qmc581Phidr2Jx2AYwtgjaYeDUrC2fWx7bowfq5hN8QRyz",
630
+ "QmZcMEbiiaTaHizVzJMEFhBHmwVpBt7RFcy4r62BAuJiga",
631
+ "Qmek8PjkwBA8x9zBLsrJPY1quKobbNLRXgkXN8F3iaHMx6",
632
+ "QmaCGKbEog5LmnVrNGj1QqauAqmYmtHLPdCgaw793JgvTv",
633
+ "QmQ6XBjWGQpep3NFhWeHn3p4KVvQxE4wG9vVRka8HNbnQr",
634
+ "Qme8RgJ2sp7qWNqTHbFHgbRejLqugjcbzG2LPjMVaEF5dD",
635
+ "QmeE6VgtuYCsMAmkoKzeeTpcDuhJnzBpL8yf4pKRGJB81g",
636
+ "QmPoREZCTBDWa8c14fyLTB2S8hVoZq2a7V7gH4cte4ES9D",
637
+ "QmfQuoGraszAniiXM3CF4ut78w6u73bowUZJDeT4ukrsZb",
638
+ "QmeMyKGcYLq7XLrQes42rSiWufA49x6DsWh8SMk8QZCXR6",
639
+ "QmcF7MsVaTtrGfeM9ZSq9PUSCoTT67k5B7J46L7CH6EhZR",
640
+ "QmZaqVVqLKD4SGFEDMYHCrPTcSVuduAwHN6Yjs6CMQhous",
641
+ "QmUwBcPAkyw2arFBD8Mqj6pJe1wgpSHE9NLSXFiEVQqcu9",
642
+ "QmaN7ky7s6zBdqWodEEqD4844ajqpobXCChwxccqS8rjWx",
643
+ "QmZECsRwqvdjbz7DYrZcZ9wno9RoBuNXX1GDWQNaC4icYq",
644
+ "QmY3xWVqdSm6XoHMvPYLamkHLC6VVRnupcp7FmZGqFwCL4",
645
+ "QmbGFhAS7YFp2ir2VXQBmcagB5nYfcbempcrj7U3ZS5ySx",
646
+ "QmczBQnqVcBs4tnY6nw8H6T2JNGMuCCtezWjbCY99Wokz7",
647
+ "QmadwMSsweUH26bAbrWvDPQGQHDy31ds2GCAU2KsasMZgQ",
648
+ "QmTBNvoUiwPw9HSUmy1qKCWPBKkBRAensgooYVqMmsviaE",
649
+ "QmRR7sPfkzuhYATFjGiLBVyo9QkBF35V9i8vk8exthuUoa",
650
+ "QmedEbGk9ZMD3pecvy5mc5S41cXxQb83cfkE7JQjNbJUb3",
651
+ "QmZaHP72PQ6UQ4BqW8rjLDN6BFmPX4U8S3P3PtMCjVDudP",
652
+ "Qmam4H1YnqinKNpwVMqFtVmtjCVm4YTvHNA1gucUoonrz5",
653
+ "Qmdgg92V3KbEuiJ1PLG7Huyph8SoYZNgonTCdbvvteERyF",
654
+ "Qmezb3CHKTtcxc7qxrFKkgsQKypC2pEiBw1M5jgD657tah",
655
+ "QmW6ZHWgtFpeY6P6BGvmQRNLbV5oCYBsK8z3pQju8L8AMQ",
656
+ "QmRj9wPp9dPxbDuUjStKArQB26X56qpXuUS2vAwLTMGTR1",
657
+ "QmNPJotqYDKtNG8XgHkbHamxm2QMdMn2FtFRrKy8t3fBhd",
658
+ "QmSXV1k82avNPDXYHRufH6RzBfyUSjnDmQoQ9idjx9bGHX",
659
+ "QmPGq6baCU7n5oq6c1wKfP4Scqg23Dfs7fwS3T8SDPpGTW",
660
+ "QmTeNQtppRWfQB2PQNohdx2PP9DAos1rKBqg7ypCrs6rXs",
661
+ "QmW9iAGca5Nst3Ck78RWs7PePgSB35mMvRKhFDdHM6CaZ6",
662
+ "QmcoEw3jgjT18PT6E4Jhf6AF2jWaqFK14T7cSZmbE5imTi",
663
+ "QmRgprite9rBeUfFCiCta42BvcjfqdpkAsXpguG5huz6RR"
664
+ ];
665
+
666
+ // src/farm.ts
667
+ var TOTAL_SUPPLY = 512;
668
+ function isMintedId(id) {
669
+ return Number.isInteger(id) && id >= 1 && id <= TOTAL_SUPPLY;
670
+ }
671
+ var CONTRACT = "0x680cCc4fE7aa62172D20899Ab87C5304545431CB";
672
+ var BREEDS = [
673
+ {
674
+ breed: "betafish",
675
+ minted: true,
676
+ range: [1, 256],
677
+ count: 256,
678
+ metadataCid: "QmZSs1ZHsW4B4ZLip8N8EqdUaXCv5ra5M5bWz1RsFSkKb4",
679
+ model: "beta-fish"
680
+ },
681
+ {
682
+ breed: "angelfish",
683
+ minted: true,
684
+ range: [257, 456],
685
+ count: 200,
686
+ metadataCid: "QmaQXcFof5qb6cigk4eo59zyMUdP4CV6pVAupPZys4jquT",
687
+ model: "angel-fish"
688
+ },
689
+ {
690
+ breed: "seahorse",
691
+ minted: true,
692
+ range: [457, 496],
693
+ count: 40,
694
+ metadataCid: "Qme8G5eXaAkk1dzVr5VDt8sgauVez9kmxxDNaYbSQLyggx",
695
+ model: "sea-horse"
696
+ },
697
+ {
698
+ breed: "seaturtle",
699
+ minted: true,
700
+ range: [497, 512],
701
+ count: 16,
702
+ metadataCid: "QmZTntNpvwxe8Mii7s1XTpTrbaci4ZgYUXs9sEbsBodtaF",
703
+ model: "sea-turtle"
704
+ },
705
+ { breed: "blowfish", minted: false, count: 0, model: "blow-fish" },
706
+ { breed: "hackerfish", minted: false, count: 0, model: "hacker-fish" },
707
+ { breed: "glowfish", minted: false, count: 0, model: "glow-fish" },
708
+ { breed: "babyfish", minted: false, count: 0, model: "baby-fish" },
709
+ { breed: "shark", minted: false, count: 0, model: "shark" },
710
+ { breed: "crab", minted: false, count: 0, model: "crab" },
711
+ { breed: "jellyfish", minted: false, count: 0, model: "jellyfish" },
712
+ { breed: "dori", minted: false, count: 0, model: "dori" }
713
+ ];
714
+ function breedOf(id) {
715
+ if (!isMintedId(id)) return null;
716
+ for (const b of BREEDS) {
717
+ if (b.range && id >= b.range[0] && id <= b.range[1]) return b.breed;
718
+ }
719
+ return null;
720
+ }
721
+ var TRAIT_TYPES = [
722
+ "breed",
723
+ "track",
724
+ "primary color",
725
+ "secondary color",
726
+ "eyes",
727
+ "voice",
728
+ "credit score",
729
+ "astrological sign",
730
+ "mystery digit",
731
+ "attack power",
732
+ "birthday",
733
+ "left finned"
734
+ ];
735
+ function idFromName(name) {
736
+ const m = /Fish\s+(\d+)\s+of the Metaquarium/i.exec(name);
737
+ return m ? Number(m[1]) : null;
738
+ }
739
+ var SUFFIX = {
740
+ "3d": "_3d.glb",
741
+ image: "_image.jpg",
742
+ transparent_icon: "_transparent_icon.png",
743
+ favicon: "_favicon.png",
744
+ video: "_video.mp4"
745
+ };
746
+ function assetCid(id) {
747
+ return isMintedId(id) ? ASSET_CIDS[id - 1] ?? null : null;
748
+ }
749
+ function fishAsset(id, kind = "3d") {
750
+ const cid = assetCid(id);
751
+ return cid ? `ipfs://${cid}/fish_${id}_of_the_metaquarium${SUFFIX[kind]}` : null;
752
+ }
753
+ function fishAssets(id) {
754
+ const cid = assetCid(id);
755
+ const breed = breedOf(id);
756
+ if (!cid || !breed) return null;
757
+ return {
758
+ id,
759
+ breed,
760
+ cid,
761
+ model: fishAsset(id, "3d"),
762
+ image: fishAsset(id, "image"),
763
+ icon: fishAsset(id, "transparent_icon"),
764
+ favicon: fishAsset(id, "favicon"),
765
+ video: fishAsset(id, "video")
766
+ };
767
+ }
768
+ function fishMetadataUrl(id) {
769
+ const b = BREEDS.find((x) => x.breed === breedOf(id));
770
+ return b?.metadataCid ? `ipfs://${b.metadataCid}/fish_${id}_of_the_metaquarium.json` : null;
771
+ }
772
+ function idsOfBreed(breed) {
773
+ const b = BREEDS.find((x) => x.breed === breed);
774
+ if (!b?.range) return [];
775
+ const out = [];
776
+ for (let i = b.range[0]; i <= b.range[1]; i++) out.push(i);
777
+ return out;
778
+ }
779
+
780
+ // src/ipfs.ts
781
+ var IPFS_GATEWAYS = [
782
+ "https://dweb.link/ipfs/",
783
+ "https://hermosaai.com/ipfs/",
784
+ "https://ipfs.io/ipfs/"
785
+ ];
786
+ function resolveIpfsUrl(url) {
787
+ return resolveIpfsUrls(url)[0];
788
+ }
789
+ function resolveIpfsUrls(url) {
790
+ if (!url.startsWith("ipfs://")) return [url];
791
+ const stripped = url.slice("ipfs://".length);
792
+ return IPFS_GATEWAYS.map((g) => `${g}${stripped}`);
793
+ }
794
+ var FISH_CATALOG = [
795
+ { id: 257, name: "Fish 257", breed: "angelfish", ipfs3d: "ipfs://QmaHbEQAP6k2zopJHJBzyaK62zNX5yH8yASDjkaG4DY9Dp/fish_257_of_the_metaquarium_3d.glb", localGlb: "/assets/metaquarium/fish-257-angelfish.glb" },
796
+ { id: 258, name: "Fish 258", breed: "angelfish", ipfs3d: "ipfs://QmUZGF3ge3d9rzrtxrD6V4qx2gLtGeeNLuCb8fQeNyUkwJ/fish_258_of_the_metaquarium_3d.glb", localGlb: "" },
797
+ { id: 259, name: "Fish 259", breed: "angelfish", ipfs3d: "ipfs://QmfBBnNrVrkffMKoESvq3cB6nAWGpfMPjduTgw1unahvPf/fish_259_of_the_metaquarium_3d.glb", localGlb: "" },
798
+ { id: 100, name: "Fish 100", breed: "betafish", ipfs3d: "ipfs://Qmb5Uu8u154QTzoGpB6ypwVfPZ8NUsU519tQmrgE8yQrWV/fish_100_of_the_metaquarium_3d.glb", localGlb: "/assets/metaquarium/fish-100-betafish.glb" },
799
+ { id: 457, name: "Fish 457", breed: "seahorse", ipfs3d: "ipfs://QmVvEaCa6zRp8Z9YkkZVYBn2owSdwZxupEQacjfd1b2HA2/fish_457_of_the_metaquarium_3d.glb", localGlb: "" },
800
+ { id: 497, name: "Fish 497", breed: "seaturtle", ipfs3d: "ipfs://QmTBNvoUiwPw9HSUmy1qKCWPBKkBRAensgooYVqMmsviaE/fish_497_of_the_metaquarium_3d.glb", localGlb: "" }
801
+ ];
802
+ var DEFAULT_FISH = FISH_CATALOG[0];
803
+ function parseFishMix(mix, catalog = FISH_CATALOG) {
804
+ const entries = [];
805
+ const problems = [];
806
+ for (const rawToken of mix.split(",")) {
807
+ const token = rawToken.trim();
808
+ if (token === "") continue;
809
+ const [idRaw, countRaw, ...extra] = token.split(":");
810
+ if (extra.length > 0) {
811
+ problems.push(`"${token}": too many ':' \u2014 expected id[:count]`);
812
+ continue;
813
+ }
814
+ const key = (idRaw ?? "").trim().toLowerCase();
815
+ let fish = /^\d+$/.test(key) ? catalog.find((f) => f.id === Number(key)) : catalog.find((f) => f.breed.toLowerCase() === key);
816
+ if (!fish && catalog === FISH_CATALOG && /^\d+$/.test(key)) {
817
+ const n = Number(key);
818
+ const url = fishAsset(n, "3d");
819
+ const breed = breedOf(n);
820
+ if (url && breed) fish = { id: n, name: `Fish ${n}`, breed, ipfs3d: url, localGlb: "" };
821
+ }
822
+ if (!fish) {
823
+ problems.push(
824
+ /^\d+$/.test(key) ? catalog === FISH_CATALOG ? `"${key}": not a minted token id (1-${TOTAL_SUPPLY})` : `"${key}": not a catalog id` : `"${key}": not a breed (${BREEDS.filter((b) => b.minted).map((b) => b.breed).join(", ")})`
825
+ );
826
+ continue;
827
+ }
828
+ let count = 1;
829
+ if (countRaw !== void 0) {
830
+ const n = Number(countRaw.trim());
831
+ if (!Number.isInteger(n) || n < 1 || n > 24) {
832
+ problems.push(`"${token}": count must be an integer 1-24`);
833
+ continue;
834
+ }
835
+ count = n;
836
+ }
837
+ entries.push({ id: fish.id, url: fish.ipfs3d, count });
838
+ }
839
+ return { entries, problems };
840
+ }
841
+ function expandFishMix(entries, cap) {
842
+ const urls = [];
843
+ for (const e of entries) {
844
+ for (let i = 0; i < e.count && urls.length < cap; i++) urls.push(e.url);
845
+ }
846
+ return urls;
847
+ }
848
+
849
+ // src/manifest.ts
850
+ var METAQUARIUM_PARAMS = {
851
+ /** Camera orbit angle, degrees. */
852
+ cameraAzimuth: { type: "number", default: 35, min: 0, max: 360, ease: "smooth" },
853
+ /** Camera height angle, degrees above the waterline plane. */
854
+ cameraElevation: { type: "number", default: 15, min: -5, max: 60, ease: "smooth" },
855
+ /** Camera distance from tank center, world units. */
856
+ cameraDistance: { type: "number", default: 110, min: 80, max: 400, ease: "smooth" },
857
+ /** Continuous orbit speed, degrees/second. Zero by default: the tank is
858
+ * still, letting the fish movement carry the scene. Steer up for an orbit. */
859
+ autoRotate: { type: "number", default: 0, min: 0, max: 12, ease: "smooth" },
860
+ /** Visible fish. Default 1 = hero mode: one fish center-stage in its own
861
+ * tank; the pool grows on demand when steered up (never shrinks). */
862
+ fishCount: { type: "number", default: 1, min: 1, max: 24, ease: "step" },
863
+ /** Swim time-scale multiplier. */
864
+ swimSpeed: { type: "number", default: 1, min: 0.2, max: 3, ease: "smooth" },
865
+ /** Water/atmosphere color (background + fog). */
866
+ fogColor: { type: "color", default: "#030009", ease: "smooth" },
867
+ /** GLB model URL for the fish (supports ipfs:// scheme). Package default
868
+ * is the IPFS hero fish so npm / channel hosts work without playground
869
+ * static assets; the playground overrides this to a local GLB. */
870
+ fishUrl: { type: "string", default: "ipfs://QmaHbEQAP6k2zopJHJBzyaK62zNX5yH8yASDjkaG4DY9Dp/fish_257_of_the_metaquarium_3d.glb" },
871
+ /** Mixed population DSL: comma-separated `id[:count]` of a minted token id
872
+ * (1-512, default catalog) or breed name — e.g. "257:3,100:2,seaturtle:1".
873
+ * A custom catalog is a closed world (no farm/IPFS fallback). Counts are
874
+ * absolute; the expanded total clamps to the device tier's fish cap.
875
+ * Non-empty mix OVERRIDES fishUrl and fishCount; empty string = single-
876
+ * breed mode. Unknown ids/bad counts degrade (good tokens still parse);
877
+ * raw URLs are not accepted here — use fishUrl for a custom single-breed GLB. */
878
+ fishMix: { type: "string", default: "", ease: "step" },
879
+ /** Fog start distance, world units. Default matches the tank's original
880
+ * hardcoded Fog(60, 500) — steering below pulls the murk close. */
881
+ fogNear: { type: "number", default: 60, min: 20, max: 200, ease: "smooth" },
882
+ /** Fog full-opacity distance. Kept under the camera far plane (1200);
883
+ * the tank enforces far > near + 20. */
884
+ fogFar: { type: "number", default: 500, min: 120, max: 1100, ease: "smooth" },
885
+ /** Plankton mote density, 0-1 of the device tier's mote budget. Default 0
886
+ * = off, so the baseline look is untouched until steered. */
887
+ moteDensity: { type: "number", default: 0, min: 0, max: 1, ease: "smooth" },
888
+ /** Mote tint. */
889
+ moteColor: { type: "color", default: "#7fd6ff", ease: "smooth" },
890
+ /** Floor disc color. Default is the original hardcoded navy. */
891
+ floorColor: { type: "color", default: "#0a1d33", ease: "smooth" },
892
+ /** Where the Draco decoder lives, for the many Metaquarium models that are
893
+ * Draco-compressed. Empty = the copy shipped beside this package (no CDN,
894
+ * no network beyond your own host). Override when a host serves the
895
+ * decoder from its own static path. */
896
+ dracoPath: { type: "string", default: "", ease: "step" },
897
+ /** The ROOM: a named place rather than thirty numbers. `void` is exactly
898
+ * the pre-environment scene, so the default changes nothing. Each other
899
+ * value adds a water ceiling, a terrain silhouette and light shafts,
900
+ * tier-budgeted. Palette params (fog, floor colour, motes) stay yours —
901
+ * an environment never overrides them. */
902
+ environment: { type: "enum", default: "void", options: [...ENVIRONMENT_NAMES], ease: "step" },
903
+ /** Override the environment's terrain. `auto` follows the environment. */
904
+ floorKind: { type: "enum", default: "auto", options: ["auto", "flat", "dunes", "ridges", "basin"], ease: "step" },
905
+ /** Water-ceiling height. -1 = follow the environment; fish swim to y=72.
906
+ * STEP, not smooth: -1 is a sentinel, so a ramp from -1 to a real height
907
+ * passes through negatives that read as "auto" — the ceiling would jump
908
+ * rather than glide. A value you cannot interpolate through must not
909
+ * advertise that it can. */
910
+ waterY: { type: "number", default: -1, min: -1, max: 220, ease: "step" },
911
+ /** Light-shaft strength. -1 = follow the environment, 0 = off. Step for the
912
+ * same sentinel reason: ramping -1 → 0 would read as FULL strength until it
913
+ * snapped off. */
914
+ rayStrength: { type: "number", default: -1, min: -1, max: 1, ease: "step" },
915
+ /** How the fish move. `loop` is exactly the pre-style behaviour, so the
916
+ * default changes nothing. A small named set on purpose: a silhouette of
917
+ * movement you can name is one you can choose from. */
918
+ swimStyle: { type: "enum", default: "loop", options: [...SWIM_STYLE_NAMES], ease: "step" },
919
+ /** Per-fish spread: 0 a uniform shoal, 1 every fish visibly its own animal
920
+ * (±40% speed, ±25% size, own phase). The uniqueness dial — one number
921
+ * instead of per-fish values nobody wants to author. */
922
+ swimVariance: { type: "number", default: 0, min: 0, max: 1, ease: "smooth" },
923
+ /** Procedural body yaw for models that carry NO animation clip — most of
924
+ * the breed library. Distance-driven like the tail beat, so it speeds up
925
+ * with the fish and stays frame-addressable. Clipped models ignore it:
926
+ * their own clip is the better animation.
927
+ *
928
+ * Defaults to 0, off, even though a rigidly gliding fish is the worse
929
+ * look. Every param this saver has added defaults to the previous
930
+ * behaviour, and a scene already on someone's wall should not start moving
931
+ * differently because a dependency was bumped. 0.3–0.4 is the recommended
932
+ * value for a clip-less cast — the studio swim variants all set it. */
933
+ bodyWiggle: { type: "number", default: 0, min: 0, max: 1, ease: "smooth" }
934
+ };
935
+ var MIAMI_VICE_COLORS = [
936
+ "#ff6ad5",
937
+ // Hot Pink
938
+ "#c774e8",
939
+ // Light Purple
940
+ "#ad8cff",
941
+ // Lavender
942
+ "#8795e8",
943
+ // Periwinkle Blue
944
+ "#94d0ff",
945
+ // Light Sky Blue
946
+ "#4fb4f4",
947
+ // Azure
948
+ "#00a6fb",
949
+ // Bright Blue
950
+ "#0085a1",
951
+ // Cerulean
952
+ "#0b3d91",
953
+ // Yale Blue
954
+ "#1c1c1c"
955
+ // Off Black
956
+ ];
957
+ var BLOOM_COLORS = [
958
+ "#FF69B4",
959
+ // Hot Pink
960
+ "#FFFF00",
961
+ // Yellow
962
+ "#00FFFF",
963
+ // Cyan
964
+ "#00FF00",
965
+ // Lime
966
+ "#FF4500",
967
+ // OrangeRed
968
+ "#7FFF00"
969
+ // Chartreuse
970
+ ];
971
+ var metaquariumManifest = {
972
+ id: "metaquarium",
973
+ label: "Metaquarium",
974
+ description: "A living fish tank: skinned GLB fish swim seeded Catmull-Rom paths through a dark, fogged aquarium.",
975
+ minBackend: "webgl2",
976
+ costTier: "medium",
977
+ motionIntensity: "calm",
978
+ reducedMotionFallback: "static",
979
+ timeModel: "closed-form",
980
+ palette: ["#030009", "#ff6ad5", "#94d0ff", "#00a6fb", "#00FFFF"],
981
+ paramSpace: METAQUARIUM_PARAMS,
982
+ attribution: {
983
+ source: "Metaquarium (metaquarium.xyz) \u2014 original artwork and fish models by Shawn Partridge",
984
+ license: "MIT port of first-party artwork",
985
+ url: "https://metaquarium.xyz"
986
+ },
987
+ a11y: {
988
+ flashSafe: true,
989
+ notes: "Slow ambient swim in a dark fogged tank; no strobing."
990
+ }
991
+ };
992
+ function withDefaults(space, overrides) {
993
+ if (!overrides) return space;
994
+ const out = {};
995
+ for (const [k, def] of Object.entries(space)) {
996
+ const o = overrides[k];
997
+ out[k] = o === void 0 ? def : { ...def, default: o };
998
+ }
999
+ return out;
1000
+ }
1001
+ function paramSpaceWith(overrides) {
1002
+ return withDefaults(METAQUARIUM_PARAMS, overrides);
1003
+ }
1004
+ function coerceNum(def, v) {
1005
+ let n = null;
1006
+ if (typeof v === "number" && Number.isFinite(v)) n = v;
1007
+ else if (typeof v === "string" && v.trim() !== "") {
1008
+ const parsed = Number(v);
1009
+ if (Number.isFinite(parsed)) n = parsed;
1010
+ }
1011
+ if (n === null) {
1012
+ const d = def?.default;
1013
+ if (typeof d === "number" && Number.isFinite(d)) n = d;
1014
+ else if (typeof d === "string" && d.trim() !== "" && Number.isFinite(Number(d))) n = Number(d);
1015
+ else n = 0;
1016
+ }
1017
+ if (def?.min !== void 0 && n < def.min) n = def.min;
1018
+ if (def?.max !== void 0 && n > def.max) n = def.max;
1019
+ return n;
1020
+ }
1021
+
1022
+ export {
1023
+ FLOOR_KINDS,
1024
+ ENVIRONMENTS,
1025
+ ENVIRONMENT_NAMES,
1026
+ environmentOf,
1027
+ LAYER_COST,
1028
+ RAY_COUNT,
1029
+ affordableLayers,
1030
+ SWIM_STYLES,
1031
+ SWIM_STYLE_NAMES,
1032
+ swimStyleOf,
1033
+ fishHash,
1034
+ fishVariation,
1035
+ FISH_LENGTH,
1036
+ formationSlot,
1037
+ formationExtent,
1038
+ bandRange,
1039
+ ASSET_CIDS,
1040
+ TOTAL_SUPPLY,
1041
+ isMintedId,
1042
+ CONTRACT,
1043
+ BREEDS,
1044
+ breedOf,
1045
+ TRAIT_TYPES,
1046
+ idFromName,
1047
+ assetCid,
1048
+ fishAsset,
1049
+ fishAssets,
1050
+ fishMetadataUrl,
1051
+ idsOfBreed,
1052
+ resolveIpfsUrl,
1053
+ resolveIpfsUrls,
1054
+ FISH_CATALOG,
1055
+ DEFAULT_FISH,
1056
+ parseFishMix,
1057
+ expandFishMix,
1058
+ METAQUARIUM_PARAMS,
1059
+ MIAMI_VICE_COLORS,
1060
+ BLOOM_COLORS,
1061
+ metaquariumManifest,
1062
+ withDefaults,
1063
+ paramSpaceWith,
1064
+ coerceNum
1065
+ };
1066
+ //# sourceMappingURL=chunk-BWIJDJPQ.js.map