@bscotch/gcdata 0.24.1 → 0.26.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 (60) hide show
  1. package/dist/GameChanger.d.ts +29 -123
  2. package/dist/GameChanger.d.ts.map +1 -1
  3. package/dist/cl2.character.pointers.d.ts +1 -1
  4. package/dist/cl2.character.pointers.d.ts.map +1 -1
  5. package/dist/cl2.credits.d.ts +4 -0
  6. package/dist/cl2.credits.d.ts.map +1 -0
  7. package/dist/cl2.credits.js +4 -0
  8. package/dist/cl2.credits.js.map +1 -0
  9. package/dist/cl2.credits.parse.d.ts +5 -0
  10. package/dist/cl2.credits.parse.d.ts.map +1 -0
  11. package/dist/cl2.credits.parse.js +334 -0
  12. package/dist/cl2.credits.parse.js.map +1 -0
  13. package/dist/cl2.credits.pointers.d.ts +3 -0
  14. package/dist/cl2.credits.pointers.d.ts.map +1 -0
  15. package/dist/cl2.credits.pointers.js +2 -0
  16. package/dist/cl2.credits.pointers.js.map +1 -0
  17. package/dist/cl2.credits.stringify.d.ts +4 -0
  18. package/dist/cl2.credits.stringify.d.ts.map +1 -0
  19. package/dist/cl2.credits.stringify.js +42 -0
  20. package/dist/cl2.credits.stringify.js.map +1 -0
  21. package/dist/cl2.credits.types.d.ts +29 -0
  22. package/dist/cl2.credits.types.d.ts.map +1 -0
  23. package/dist/cl2.credits.types.js +28 -0
  24. package/dist/cl2.credits.types.js.map +1 -0
  25. package/dist/cl2.quest.pointers.d.ts +1 -1
  26. package/dist/cl2.quest.pointers.d.ts.map +1 -1
  27. package/dist/cl2.quest.utils.d.ts +1 -1
  28. package/dist/cl2.shared.types.d.ts +4 -29
  29. package/dist/cl2.shared.types.d.ts.map +1 -1
  30. package/dist/cl2.shared.types.js +4 -0
  31. package/dist/cl2.shared.types.js.map +1 -1
  32. package/dist/cl2.storyline.pointers.d.ts +1 -1
  33. package/dist/cl2.storyline.pointers.d.ts.map +1 -1
  34. package/dist/cl2.types.auto.d.ts +23192 -17509
  35. package/dist/cl2.types.auto.d.ts.map +1 -1
  36. package/dist/index.d.ts +1 -0
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +1 -0
  39. package/dist/index.js.map +1 -1
  40. package/dist/types.cl2.rumpus.d.ts +6 -174
  41. package/dist/types.cl2.rumpus.d.ts.map +1 -1
  42. package/dist/types.cl2.rumpus.js +5 -9
  43. package/dist/types.cl2.rumpus.js.map +1 -1
  44. package/dist/types.d.ts +16 -392
  45. package/dist/types.d.ts.map +1 -1
  46. package/dist/types.js +11 -17
  47. package/dist/types.js.map +1 -1
  48. package/package.json +7 -7
  49. package/dist/cl2.chats.d.ts +0 -1
  50. package/dist/cl2.chats.d.ts.map +0 -1
  51. package/dist/cl2.chats.js +0 -2
  52. package/dist/cl2.chats.js.map +0 -1
  53. package/dist/cl3.quest.stringify.d.ts +0 -5
  54. package/dist/cl3.quest.stringify.d.ts.map +0 -1
  55. package/dist/cl3.quest.stringify.js +0 -154
  56. package/dist/cl3.quest.stringify.js.map +0 -1
  57. package/dist/cl3.quest.types.d.ts +0 -84
  58. package/dist/cl3.quest.types.d.ts.map +0 -1
  59. package/dist/cl3.quest.types.js +0 -33
  60. package/dist/cl3.quest.types.js.map +0 -1
@@ -0,0 +1,334 @@
1
+ import { assert } from './assert.js';
2
+ import { linePatterns, } from './cl2.credits.types.js';
3
+ import { prepareParserHelpers } from './cl2.shared.parse.js';
4
+ import { creditsSchemaId } from './cl2.shared.types.js';
5
+ import { bsArrayToArray, createBsArrayKey, updateBsArrayOrder, } from './helpers.js';
6
+ export function parseStringifiedCredits(text, packed) {
7
+ const result = {
8
+ diagnostics: [],
9
+ hovers: [],
10
+ edits: [],
11
+ completions: [],
12
+ words: [],
13
+ parsed: {
14
+ sections: [],
15
+ comments: [], // Don't really need this, but here for consistency
16
+ },
17
+ };
18
+ const helpers = prepareParserHelpers(text, packed, { schemaId: creditsSchemaId }, result);
19
+ let currentSection = undefined;
20
+ let currentRole = undefined;
21
+ for (const line of helpers.lines) {
22
+ const trace = [];
23
+ try {
24
+ // Is this just a blank line?
25
+ if (!line) {
26
+ continue;
27
+ }
28
+ const parsedLine = helpers.parseCurrentLine(linePatterns);
29
+ if (!parsedLine)
30
+ continue;
31
+ const indicator = parsedLine.indicator?.value;
32
+ if (indicator === '===') {
33
+ // Then this is a Gap entry
34
+ assert(currentSection, 'Gaps are not supported');
35
+ }
36
+ else if (indicator?.startsWith('\t-')) {
37
+ // Then this is a specific person and they need to be added
38
+ // to the current role
39
+ assert(currentRole, 'Cannot add a person without being in a Role');
40
+ const name = parsedLine.text?.value;
41
+ // Detect if it's a CJK name
42
+ const cjk = name && /^[\u4E00-\u9FFF]+$/.test(name);
43
+ currentRole.names.push({
44
+ name: name ?? '',
45
+ cjk: !!cjk,
46
+ });
47
+ }
48
+ else if (indicator?.startsWith('\t') && line.trim()) {
49
+ // Then this is a Role line
50
+ currentRole = {
51
+ id: parsedLine.arrayTag?.value || '',
52
+ type: 'role',
53
+ role: parsedLine.text?.value || '',
54
+ names: [],
55
+ };
56
+ if (!currentRole.id) {
57
+ currentRole.id = createBsArrayKey();
58
+ result.edits.push({
59
+ newText: `#${currentRole.id} `,
60
+ start: parsedLine.indicator.end,
61
+ end: parsedLine.indicator.end,
62
+ });
63
+ }
64
+ assert(currentSection, 'Cannot add a Role without being in a Section');
65
+ currentSection.roles.push(currentRole);
66
+ }
67
+ else if (!line.match(/^\s+/)) {
68
+ // Then this is a Section line
69
+ currentSection = {
70
+ id: parsedLine.arrayTag?.value || '',
71
+ title: parsedLine.text?.value || '',
72
+ roles: [],
73
+ };
74
+ if (!currentSection.id) {
75
+ currentSection.id = createBsArrayKey();
76
+ result.edits.push({
77
+ newText: `#${currentSection.id} `,
78
+ start: parsedLine.indicator.end,
79
+ end: parsedLine.indicator.end,
80
+ });
81
+ }
82
+ result.parsed.sections.push(currentSection);
83
+ }
84
+ }
85
+ catch (err) {
86
+ if (err instanceof Error) {
87
+ err.cause = trace;
88
+ }
89
+ throw err;
90
+ }
91
+ helpers.index += line.length;
92
+ }
93
+ return result;
94
+ }
95
+ export async function updateChangesFromParsedCredits(parsed, moteId, packed) {
96
+ const _traceLogs = [];
97
+ const trace = (log) => _traceLogs.push(log);
98
+ trace(`Updating mote ${moteId}`);
99
+ try {
100
+ // We're always going to be computing ALL changes, so clear whatever
101
+ // we previously had.
102
+ packed.clearMoteChanges(moteId, ['data/sections/*']);
103
+ const moteWorking = packed.working.getMote(moteId);
104
+ const moteBase = packed.base.getMote(moteId);
105
+ assert(moteWorking, `Mote ${moteId} not found in working copy`);
106
+ const schema = packed.working.getSchema(moteWorking.schema_id);
107
+ assert(schema, `${moteWorking.schema_id} schema not found in working copy`);
108
+ assert(schema.name, 'Chat mote must have a name pointer');
109
+ const updateMote = (path, value) => {
110
+ packed.updateMoteData(moteId, path, value);
111
+ };
112
+ trace('Finding existing Credits identifiers');
113
+ // Collect what's currently in the mote so we can do some
114
+ // lookups to minimize ID changes and identify stuff to delete
115
+ /** SectionID:RoleID:PersonID:Name */
116
+ const existingSectionsNameLookup = new Map();
117
+ /** SectionID:RoleID:Name:PersonId */
118
+ const existingSectionsPersonIdLookup = new Map();
119
+ /** SectiondId:RoleIds for single entry roles */
120
+ const singleEntryRoleIdLookup = new Map();
121
+ for (const section of bsArrayToArray(moteBase.data.sections)) {
122
+ const sectionId = section.id;
123
+ existingSectionsNameLookup.set(sectionId, new Map());
124
+ existingSectionsPersonIdLookup.set(sectionId, new Map());
125
+ singleEntryRoleIdLookup.set(sectionId, new Set());
126
+ const singleEntryRoleIds = singleEntryRoleIdLookup.get(sectionId);
127
+ for (const role of bsArrayToArray(section.element.entries)) {
128
+ const element = role.element;
129
+ if (element.type === 'Gap') {
130
+ // Gaps are not supported
131
+ continue;
132
+ }
133
+ if (element.type === 'Single Entry') {
134
+ singleEntryRoleIds.add(role.id);
135
+ }
136
+ const roleId = role.id;
137
+ existingSectionsNameLookup
138
+ .get(sectionId)
139
+ .set(roleId, existingSectionsNameLookup.get(sectionId).get(roleId) || new Map());
140
+ existingSectionsPersonIdLookup
141
+ .get(sectionId)
142
+ .set(roleId, existingSectionsPersonIdLookup.get(sectionId).get(roleId) ||
143
+ new Map());
144
+ const nameLookup = existingSectionsNameLookup
145
+ .get(sectionId)
146
+ .get(roleId);
147
+ const personIdLookup = existingSectionsPersonIdLookup
148
+ .get(sectionId)
149
+ .get(roleId);
150
+ if (element.type === 'Single Entry') {
151
+ const name = element.name.name;
152
+ assert(name, 'Entry must have a name');
153
+ nameLookup.set(roleId, name);
154
+ personIdLookup.set(name, roleId);
155
+ }
156
+ else {
157
+ for (const person of bsArrayToArray(element.names)) {
158
+ const name = person.element?.name;
159
+ assert(name, 'Entry must have a name');
160
+ nameLookup.set(person.id, name);
161
+ personIdLookup.set(name, person.id);
162
+ }
163
+ }
164
+ }
165
+ }
166
+ trace('Updating sections');
167
+ // Track the section IDs so we can remove any that are no longer present
168
+ /** Map of sectionId:roleId:personId */
169
+ const parsedIds = new Map();
170
+ for (const section of parsed.sections) {
171
+ parsedIds.set(section.id, parsedIds.get(section.id) || new Map());
172
+ const roleIds = parsedIds.get(section.id);
173
+ updateMote(`data/sections/${section.id}/element/name/text`, section.title);
174
+ const sectionExistedAlready = existingSectionsNameLookup.get(section.id);
175
+ for (const role of section.roles) {
176
+ const roleExistedAlready = sectionExistedAlready?.get(role.id);
177
+ roleIds.set(role.id, roleIds.get(role.id) || new Set());
178
+ const personIds = roleIds.get(role.id);
179
+ // If this role was a single entry but is now a group,
180
+ // then we need to do some work to convert it. (If it was a group but has a single entry just let it be.)
181
+ const wasSingleEntry = !!singleEntryRoleIdLookup
182
+ .get(section.id)
183
+ ?.has(role.id);
184
+ if (wasSingleEntry && role.names.length > 1) {
185
+ trace(`Converting single entry role ${role.id} (${role.role}) to group`);
186
+ // Delete the entire role and replace it with a Group role
187
+ updateMote(`data/sections/${section.id}/element/entries/${role.id}`, null);
188
+ updateMote(`data/sections/${section.id}/element/entries/${role.id}/element/type`, 'Group');
189
+ // Add each name to the names field
190
+ for (const person of role.names) {
191
+ // Will need a new ID for each person
192
+ const personId = createBsArrayKey();
193
+ person.id = personId;
194
+ personIds.add(personId);
195
+ updateMote(`data/sections/${section.id}/element/entries/${role.id}/element/names/${personId}/element/name`, person.name);
196
+ // Ensure CJK is set
197
+ updateMote(`data/sections/${section.id}/element/entries/${role.id}/element/names/${personId}/element/use_cjk`, person.cjk);
198
+ }
199
+ }
200
+ else if (wasSingleEntry ||
201
+ (role.names.length === 1 && !roleExistedAlready)) {
202
+ trace(`Updating single-entry role ${role.id} (${role.role})`);
203
+ // Then WAS a single entry OR the role didn't exist
204
+ // but is being added as a single entry. So keep it
205
+ // single-entry!
206
+ personIds.add(role.id);
207
+ role.names[0].id = role.id;
208
+ updateMote(`data/sections/${section.id}/element/entries/${role.id}/element/type`, 'Single Entry');
209
+ // Add the name to the name field
210
+ updateMote(`data/sections/${section.id}/element/entries/${role.id}/element/name/name`, role.names[0].name);
211
+ // Ensure CJK is set
212
+ updateMote(`data/sections/${section.id}/element/entries/${role.id}/element/name/use_cjk`, role.names[0].cjk);
213
+ }
214
+ else {
215
+ trace(`Updating group role ${role.id} (${role.role})`);
216
+ // Group entry! Either we're adding a new group or
217
+ // updating an existing one, but we do the same thing
218
+ // either way.
219
+ updateMote(`data/sections/${section.id}/element/entries/${role.id}/element/type`, 'Group');
220
+ // Add each name to the names field
221
+ for (const person of role.names) {
222
+ // See if we already have an id matching this name
223
+ const personId = existingSectionsPersonIdLookup
224
+ .get(section.id)
225
+ ?.get(role.id)
226
+ ?.get(person.name) || createBsArrayKey();
227
+ personIds.add(personId);
228
+ person.id = personId;
229
+ updateMote(`data/sections/${section.id}/element/entries/${role.id}/element/names/${personId}/element/name`, person.name);
230
+ // Ensure CJK is set
231
+ updateMote(`data/sections/${section.id}/element/entries/${role.id}/element/names/${personId}/element/use_cjk`, person.cjk);
232
+ }
233
+ }
234
+ // Upsert the role name. If it's one of a few special roles
235
+ // that indicate NO role, then we want to ensure it's not set
236
+ // instead. (Do this after the prior logic in case we first converted a single-entry group, otherwise we'd lose the change)
237
+ const isUntitledRole = !role.role || role.role.match(/^(\?\?\?|none|na|undefined)$/i);
238
+ trace(`Updating role name ${role.id} with text "${role.role}"`);
239
+ updateMote(`data/sections/${section.id}/element/entries/${role.id}/element/role/text`, isUntitledRole ? null : role.role);
240
+ }
241
+ }
242
+ // Remove any content that is no longer present
243
+ for (const [sectionId, existingRoles,] of existingSectionsNameLookup.entries()) {
244
+ const parsedRoles = parsedIds.get(sectionId);
245
+ if (!parsedRoles) {
246
+ updateMote(`data/sections/${sectionId}`, null);
247
+ }
248
+ else {
249
+ // Delete any leftover roles
250
+ for (const [existingRoleId, existingPeople,] of existingRoles.entries()) {
251
+ if (!parsedRoles.has(existingRoleId)) {
252
+ updateMote(`data/sections/${sectionId}/element/entries/${existingRoleId}`, null);
253
+ }
254
+ else {
255
+ // Delete any leftover people
256
+ for (const existingPersonId of existingPeople.keys()) {
257
+ if (!parsedRoles.get(existingRoleId).has(existingPersonId)) {
258
+ packed.updateMoteData(moteId, `data/sections/${sectionId}/element/entries/${existingRoleId}/element/names/${existingPersonId}`, null);
259
+ }
260
+ }
261
+ }
262
+ }
263
+ }
264
+ }
265
+ // Fix the sort order of sections, roles, and people
266
+ const orderedSections = parsed.sections.map((s) => {
267
+ assert(s.id, `Section ID required`);
268
+ let section = moteBase?.data.sections?.[s.id];
269
+ if (!section) {
270
+ section = moteWorking.data.sections?.[s.id];
271
+ assert(section, `Section ${s.id} not found in base or working mote`);
272
+ // @ts-expect-error - order is a required field, but it'll be re-added
273
+ delete section.order;
274
+ }
275
+ const orderedRoles = s.roles.map((r) => {
276
+ assert(r.id, `Role ID required`);
277
+ let role = section.element?.entries?.[r.id];
278
+ if (!role) {
279
+ role = moteWorking.data.sections?.[s.id]?.element?.entries?.[r.id];
280
+ assert(role, `Role ${r.id} not found in section ${s.id}`);
281
+ // @ts-expect-error - order is a required field, but it'll be re-added
282
+ delete role.order;
283
+ }
284
+ // Update the order of the people if it's a group
285
+ if (r.names.length > 1) {
286
+ const orderedPeople = r.names.map((p) => {
287
+ assert(p.name, `Person name required`);
288
+ assert(p.id, `Person ID required`);
289
+ // Get the ID we found/set earlier
290
+ // @ts-expect-error - Should be a group type by this point, but could be single entry in the base data
291
+ let person = role.element?.names?.[p.id];
292
+ if (!person) {
293
+ const workingRole = moteWorking.data.sections?.[s.id]?.element?.entries?.[r.id]
294
+ ?.element;
295
+ assert(workingRole?.type === 'Group', 'Base data element must be a group');
296
+ person = workingRole.names?.[p.id];
297
+ assert(person, `Person ${p.name} not found in section ${s.id}`);
298
+ delete person.order;
299
+ }
300
+ return { ...person, id: p.id };
301
+ });
302
+ updateBsArrayOrder(orderedPeople);
303
+ return { ...role, people: orderedPeople, id: r.id };
304
+ }
305
+ return { ...role, people: [], id: r.id };
306
+ });
307
+ updateBsArrayOrder(orderedRoles);
308
+ return { ...section, roles: orderedRoles, id: s.id };
309
+ });
310
+ updateBsArrayOrder(orderedSections);
311
+ // Turn those updates into actual changes
312
+ for (const section of orderedSections) {
313
+ trace(`Updating section ${section.id}`);
314
+ updateMote(`data/sections/${section.id}/order`, section.order);
315
+ for (const role of section.roles) {
316
+ updateMote(`data/sections/${section.id}/element/entries/${role.id}/order`, role.order);
317
+ for (const person of role.people) {
318
+ updateMote(`data/sections/${section.id}/element/entries/${role.id}/element/names/${person.id}/order`, person.order);
319
+ }
320
+ }
321
+ }
322
+ trace(`Writing changes`);
323
+ await packed.writeChanges();
324
+ }
325
+ catch (err) {
326
+ console.error(err);
327
+ console.error(_traceLogs);
328
+ if (err instanceof Error) {
329
+ err.cause = _traceLogs;
330
+ }
331
+ throw err;
332
+ }
333
+ }
334
+ //# sourceMappingURL=cl2.credits.parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cl2.credits.parse.js","sourceRoot":"","sources":["../src/cl2.credits.parse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EACL,YAAY,GAIb,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAe,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAErE,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AAEtB,MAAM,UAAU,uBAAuB,CACrC,IAAY,EACZ,MAAmB;IAEnB,MAAM,MAAM,GAAwB;QAClC,WAAW,EAAE,EAAE;QACf,MAAM,EAAE,EAAE;QACV,KAAK,EAAE,EAAE;QACT,WAAW,EAAE,EAAE;QACf,KAAK,EAAE,EAAE;QACT,MAAM,EAAE;YACN,QAAQ,EAAE,EAAE;YACZ,QAAQ,EAAE,EAAE,EAAE,mDAAmD;SAClE;KACF,CAAC;IAEF,MAAM,OAAO,GAAG,oBAAoB,CAClC,IAAI,EACJ,MAAM,EACN,EAAE,QAAQ,EAAE,eAAe,EAAE,EAC7B,MAAM,CACP,CAAC;IAEF,IAAI,cAAc,GAA2C,SAAS,CAAC;IACvE,IAAI,WAAW,GAAwC,SAAS,CAAC;IAEjE,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACjC,MAAM,KAAK,GAAU,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,6BAA6B;YAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,SAAS;YACX,CAAC;YACD,MAAM,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;YAC1D,IAAI,CAAC,UAAU;gBAAE,SAAS;YAE1B,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC;YAC9C,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;gBACxB,2BAA2B;gBAC3B,MAAM,CAAC,cAAc,EAAE,wBAAwB,CAAC,CAAC;YACnD,CAAC;iBAAM,IAAI,SAAS,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxC,2DAA2D;gBAC3D,sBAAsB;gBACtB,MAAM,CAAC,WAAW,EAAE,6CAA6C,CAAC,CAAC;gBACnE,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC;gBACpC,4BAA4B;gBAC5B,MAAM,GAAG,GAAG,IAAI,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpD,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC;oBACrB,IAAI,EAAE,IAAI,IAAI,EAAE;oBAChB,GAAG,EAAE,CAAC,CAAC,GAAG;iBACX,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,SAAS,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBACtD,2BAA2B;gBAC3B,WAAW,GAAG;oBACZ,EAAE,EAAE,UAAU,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;oBACpC,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;oBAClC,KAAK,EAAE,EAAE;iBACV,CAAC;gBACF,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;oBACpB,WAAW,CAAC,EAAE,GAAG,gBAAgB,EAAE,CAAC;oBACpC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;wBAChB,OAAO,EAAE,IAAI,WAAW,CAAC,EAAE,GAAG;wBAC9B,KAAK,EAAE,UAAU,CAAC,SAAU,CAAC,GAAG;wBAChC,GAAG,EAAE,UAAU,CAAC,SAAU,CAAC,GAAG;qBAC/B,CAAC,CAAC;gBACL,CAAC;gBACD,MAAM,CAAC,cAAc,EAAE,8CAA8C,CAAC,CAAC;gBACvE,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACzC,CAAC;iBAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC/B,8BAA8B;gBAC9B,cAAc,GAAG;oBACf,EAAE,EAAE,UAAU,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;oBACpC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;oBACnC,KAAK,EAAE,EAAE;iBACV,CAAC;gBACF,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC;oBACvB,cAAc,CAAC,EAAE,GAAG,gBAAgB,EAAE,CAAC;oBACvC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;wBAChB,OAAO,EAAE,IAAI,cAAc,CAAC,EAAE,GAAG;wBACjC,KAAK,EAAE,UAAU,CAAC,SAAU,CAAC,GAAG;wBAChC,GAAG,EAAE,UAAU,CAAC,SAAU,CAAC,GAAG;qBAC/B,CAAC,CAAC;gBACL,CAAC;gBACD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;gBACzB,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC;YACpB,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;QACD,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC;IAC/B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,MAAqC,EACrC,MAAc,EACd,MAAmB;IAEnB,MAAM,UAAU,GAAU,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,CAAC,GAAQ,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjD,KAAK,CAAC,iBAAiB,MAAM,EAAE,CAAC,CAAC;IACjC,IAAI,CAAC;QACH,oEAAoE;QACpE,qBAAqB;QACrB,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;QACrD,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAgB,CAAC;QAClE,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAgB,CAAC;QAC5D,MAAM,CAAC,WAAW,EAAE,QAAQ,MAAM,4BAA4B,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,EAAE,GAAG,WAAW,CAAC,SAAS,mCAAmC,CAAC,CAAC;QAC5E,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,oCAAoC,CAAC,CAAC;QAE1D,MAAM,UAAU,GAAG,CAAC,IAA4B,EAAE,KAAU,EAAE,EAAE;YAC9D,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAC7C,CAAC,CAAC;QAEF,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC9C,yDAAyD;QACzD,8DAA8D;QAC9D,qCAAqC;QACrC,MAAM,0BAA0B,GAAG,IAAI,GAAG,EAGvC,CAAC;QACJ,qCAAqC;QACrC,MAAM,8BAA8B,GAAG,IAAI,GAAG,EAG3C,CAAC;QACJ,gDAAgD;QAChD,MAAM,uBAAuB,GAAG,IAAI,GAAG,EAAuB,CAAC;QAC/D,KAAK,MAAM,OAAO,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAS,CAAC,EAAE,CAAC;YAC9D,MAAM,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC;YAC7B,0BAA0B,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;YACrD,8BAA8B,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;YACzD,uBAAuB,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;YAClD,MAAM,kBAAkB,GAAG,uBAAuB,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;YACnE,KAAK,MAAM,IAAI,IAAI,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;gBAC7B,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;oBAC3B,yBAAyB;oBACzB,SAAS;gBACX,CAAC;gBACD,IAAI,OAAO,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;oBACpC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAClC,CAAC;gBACD,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;gBACvB,0BAA0B;qBACvB,GAAG,CAAC,SAAS,CAAE;qBACf,GAAG,CACF,MAAM,EACN,0BAA0B,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,GAAG,EAAE,CACpE,CAAC;gBACJ,8BAA8B;qBAC3B,GAAG,CAAC,SAAS,CAAE;qBACf,GAAG,CACF,MAAM,EACN,8BAA8B,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC,GAAG,CAAC,MAAM,CAAC;oBACxD,IAAI,GAAG,EAAE,CACZ,CAAC;gBACJ,MAAM,UAAU,GAAG,0BAA0B;qBAC1C,GAAG,CAAC,SAAS,CAAE;qBACf,GAAG,CAAC,MAAM,CAAE,CAAC;gBAChB,MAAM,cAAc,GAAG,8BAA8B;qBAClD,GAAG,CAAC,SAAS,CAAE;qBACf,GAAG,CAAC,MAAM,CAAE,CAAC;gBAChB,IAAI,OAAO,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;oBACpC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;oBAC/B,MAAM,CAAC,IAAI,EAAE,wBAAwB,CAAC,CAAC;oBACvC,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;oBAC7B,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBACnC,CAAC;qBAAM,CAAC;oBACN,KAAK,MAAM,MAAM,IAAI,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;wBACnD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC;wBAClC,MAAM,CAAC,IAAI,EAAE,wBAAwB,CAAC,CAAC;wBACvC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;wBAChC,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;oBACtC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAC3B,wEAAwE;QACxE,uCAAuC;QACvC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAoC,CAAC;QAC9D,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACtC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;YAClE,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAE,CAAC;YAC3C,UAAU,CACR,iBAAiB,OAAO,CAAC,EAAE,oBAAoB,EAC/C,OAAO,CAAC,KAAK,CACd,CAAC;YACF,MAAM,qBAAqB,GAAG,0BAA0B,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAEzE,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBACjC,MAAM,kBAAkB,GAAG,qBAAqB,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAE/D,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;gBACxD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAE,CAAC;gBAExC,sDAAsD;gBACtD,yGAAyG;gBACzG,MAAM,cAAc,GAAG,CAAC,CAAC,uBAAuB;qBAC7C,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;oBAChB,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACjB,IAAI,cAAc,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC5C,KAAK,CACH,gCAAgC,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,YAAY,CAClE,CAAC;oBACF,0DAA0D;oBAC1D,UAAU,CACR,iBAAiB,OAAO,CAAC,EAAE,oBAAoB,IAAI,CAAC,EAAE,EAAE,EACxD,IAAI,CACL,CAAC;oBACF,UAAU,CACR,iBAAiB,OAAO,CAAC,EAAE,oBAAoB,IAAI,CAAC,EAAE,eAAe,EACrE,OAAO,CACR,CAAC;oBACF,mCAAmC;oBACnC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;wBAChC,qCAAqC;wBACrC,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;wBACpC,MAAM,CAAC,EAAE,GAAG,QAAQ,CAAC;wBACrB,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;wBACxB,UAAU,CACR,iBAAiB,OAAO,CAAC,EAAE,oBAAoB,IAAI,CAAC,EAAE,kBAAkB,QAAQ,eAAe,EAC/F,MAAM,CAAC,IAAI,CACZ,CAAC;wBACF,oBAAoB;wBACpB,UAAU,CACR,iBAAiB,OAAO,CAAC,EAAE,oBAAoB,IAAI,CAAC,EAAE,kBAAkB,QAAQ,kBAAkB,EAClG,MAAM,CAAC,GAAG,CACX,CAAC;oBACJ,CAAC;gBACH,CAAC;qBAAM,IACL,cAAc;oBACd,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAChD,CAAC;oBACD,KAAK,CAAC,8BAA8B,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;oBAC9D,mDAAmD;oBACnD,mDAAmD;oBACnD,gBAAgB;oBAChB,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACvB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;oBAC3B,UAAU,CACR,iBAAiB,OAAO,CAAC,EAAE,oBAAoB,IAAI,CAAC,EAAE,eAAe,EACrE,cAAc,CACf,CAAC;oBACF,iCAAiC;oBACjC,UAAU,CACR,iBAAiB,OAAO,CAAC,EAAE,oBAAoB,IAAI,CAAC,EAAE,oBAAoB,EAC1E,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CACnB,CAAC;oBACF,oBAAoB;oBACpB,UAAU,CACR,iBAAiB,OAAO,CAAC,EAAE,oBAAoB,IAAI,CAAC,EAAE,uBAAuB,EAC7E,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAClB,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,uBAAuB,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;oBACvD,kDAAkD;oBAClD,qDAAqD;oBACrD,cAAc;oBACd,UAAU,CACR,iBAAiB,OAAO,CAAC,EAAE,oBAAoB,IAAI,CAAC,EAAE,eAAe,EACrE,OAAO,CACR,CAAC;oBACF,mCAAmC;oBACnC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;wBAChC,kDAAkD;wBAClD,MAAM,QAAQ,GACZ,8BAA8B;6BAC3B,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;4BAChB,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;4BACd,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,gBAAgB,EAAE,CAAC;wBAC7C,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;wBACxB,MAAM,CAAC,EAAE,GAAG,QAAQ,CAAC;wBACrB,UAAU,CACR,iBAAiB,OAAO,CAAC,EAAE,oBAAoB,IAAI,CAAC,EAAE,kBAAkB,QAAQ,eAAe,EAC/F,MAAM,CAAC,IAAI,CACZ,CAAC;wBACF,oBAAoB;wBACpB,UAAU,CACR,iBAAiB,OAAO,CAAC,EAAE,oBAAoB,IAAI,CAAC,EAAE,kBAAkB,QAAQ,kBAAkB,EAClG,MAAM,CAAC,GAAG,CACX,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAED,2DAA2D;gBAC3D,6DAA6D;gBAC7D,2HAA2H;gBAC3H,MAAM,cAAc,GAClB,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;gBACjE,KAAK,CAAC,sBAAsB,IAAI,CAAC,EAAE,eAAe,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;gBAChE,UAAU,CACR,iBAAiB,OAAO,CAAC,EAAE,oBAAoB,IAAI,CAAC,EAAE,oBAAoB,EAC1E,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAClC,CAAC;YACJ,CAAC;QACH,CAAC;QACD,+CAA+C;QAC/C,KAAK,MAAM,CACT,SAAS,EACT,aAAa,EACd,IAAI,0BAA0B,CAAC,OAAO,EAAE,EAAE,CAAC;YAC1C,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC7C,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,UAAU,CAAC,iBAAiB,SAAS,EAAE,EAAE,IAAI,CAAC,CAAC;YACjD,CAAC;iBAAM,CAAC;gBACN,4BAA4B;gBAC5B,KAAK,MAAM,CACT,cAAc,EACd,cAAc,EACf,IAAI,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC;oBAC7B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;wBACrC,UAAU,CACR,iBAAiB,SAAS,oBAAoB,cAAc,EAAE,EAC9D,IAAI,CACL,CAAC;oBACJ,CAAC;yBAAM,CAAC;wBACN,6BAA6B;wBAC7B,KAAK,MAAM,gBAAgB,IAAI,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC;4BACrD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAE,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;gCAC5D,MAAM,CAAC,cAAc,CACnB,MAAM,EACN,iBAAiB,SAAS,oBAAoB,cAAc,kBAAkB,gBAAgB,EAAE,EAChG,IAAI,CACL,CAAC;4BACJ,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,oDAAoD;QACpD,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAChD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,qBAAqB,CAAC,CAAC;YACpC,IAAI,OAAO,GAAG,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC5C,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,EAAE,oCAAoC,CAAC,CAAC;gBACrE,sEAAsE;gBACtE,OAAO,OAAO,CAAC,KAAK,CAAC;YACvB,CAAC;YACD,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACrC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,kBAAkB,CAAC,CAAC;gBACjC,IAAI,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC5C,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAG,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAG,CAAE,CAAC;oBACtE,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,EAAE,yBAAyB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC1D,sEAAsE;oBACtE,OAAO,IAAI,CAAC,KAAK,CAAC;gBACpB,CAAC;gBACD,iDAAiD;gBACjD,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;wBACtC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;wBACvC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,oBAAoB,CAAC,CAAC;wBACnC,kCAAkC;wBAClC,sGAAsG;wBACtG,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;wBACzC,IAAI,CAAC,MAAM,EAAE,CAAC;4BACZ,MAAM,WAAW,GACf,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAG,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAG,CAAC;gCAC3D,EAAE,OAAO,CAAC;4BACd,MAAM,CACJ,WAAW,EAAE,IAAI,KAAK,OAAO,EAC7B,mCAAmC,CACpC,CAAC;4BACF,MAAM,GAAG,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;4BACnC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,IAAI,yBAAyB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;4BAChE,OAAO,MAAM,CAAC,KAAK,CAAC;wBACtB,CAAC;wBACD,OAAO,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;oBACjC,CAAC,CAAC,CAAC;oBACH,kBAAkB,CAAC,aAAa,CAAC,CAAC;oBAClC,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;gBACtD,CAAC;gBACD,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YAC3C,CAAC,CAAC,CAAC;YACH,kBAAkB,CAAC,YAAY,CAAC,CAAC;YAEjC,OAAO,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QACvD,CAAC,CAAC,CAAC;QACH,kBAAkB,CAAC,eAAe,CAAC,CAAC;QACpC,yCAAyC;QACzC,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;YACtC,KAAK,CAAC,oBAAoB,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;YACxC,UAAU,CAAC,iBAAiB,OAAO,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;YAC/D,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBACjC,UAAU,CACR,iBAAiB,OAAO,CAAC,EAAE,oBAAoB,IAAI,CAAC,EAAE,QAAQ,EAC9D,IAAI,CAAC,KAAK,CACX,CAAC;gBACF,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;oBACjC,UAAU,CACR,iBAAiB,OAAO,CAAC,EAAE,oBAAoB,IAAI,CAAC,EAAE,kBAAkB,MAAM,CAAC,EAAE,QAAQ,EACzF,MAAM,CAAC,KAAK,CACb,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QACD,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACzB,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC;IAC9B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC1B,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;YACzB,GAAG,CAAC,KAAK,GAAG,UAAU,CAAC;QACzB,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ export type CreditsMoteDataPointer = `data/${CreditsMotePointer}`;
2
+ export type CreditsMotePointer = `` | `name` | `sections/${string}/element/entries/${string}/element/name/name` | `sections/${string}/element/entries/${string}/element/name/use_cjk` | `sections/${string}/element/entries/${string}/element/name` | `sections/${string}/element/entries/${string}/element/names/${string}/element/name` | `sections/${string}/element/entries/${string}/element/names/${string}/element/use_cjk` | `sections/${string}/element/entries/${string}/element/names/${string}/element` | `sections/${string}/element/entries/${string}/element/names/${string}/order` | `sections/${string}/element/entries/${string}/element/names/${string}` | `sections/${string}/element/entries/${string}/element/names` | `sections/${string}/element/entries/${string}/element/role/skip` | `sections/${string}/element/entries/${string}/element/role/text` | `sections/${string}/element/entries/${string}/element/role` | `sections/${string}/element/entries/${string}/element/type` | `sections/${string}/element/entries/${string}/element` | `sections/${string}/element/entries/${string}/order` | `sections/${string}/element/entries/${string}` | `sections/${string}/element/entries` | `sections/${string}/element/group_color/b` | `sections/${string}/element/group_color/g` | `sections/${string}/element/group_color/r` | `sections/${string}/element/group_color` | `sections/${string}/element/name/skip` | `sections/${string}/element/name/text` | `sections/${string}/element/name` | `sections/${string}/element/subtext/skip` | `sections/${string}/element/subtext/text` | `sections/${string}/element/subtext` | `sections/${string}/element` | `sections/${string}/order` | `sections/${string}` | `sections` | `wip/notes/${string}/element/author` | `wip/notes/${string}/element/text` | `wip/notes/${string}/element/timestamp` | `wip/notes/${string}/element` | `wip/notes/${string}/order` | `wip/notes/${string}` | `wip/notes` | `wip/staging` | `wip`;
3
+ //# sourceMappingURL=cl2.credits.pointers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cl2.credits.pointers.d.ts","sourceRoot":"","sources":["../src/cl2.credits.pointers.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,sBAAsB,GAAG,QAAQ,kBAAkB,EAAE,CAAC;AAClE,MAAM,MAAM,kBAAkB,GAAG,EAAE,GAC/B,MAAM,GACN,YAAY,MAAM,oBAAoB,MAAM,oBAAoB,GAChE,YAAY,MAAM,oBAAoB,MAAM,uBAAuB,GACnE,YAAY,MAAM,oBAAoB,MAAM,eAAe,GAC3D,YAAY,MAAM,oBAAoB,MAAM,kBAAkB,MAAM,eAAe,GACnF,YAAY,MAAM,oBAAoB,MAAM,kBAAkB,MAAM,kBAAkB,GACtF,YAAY,MAAM,oBAAoB,MAAM,kBAAkB,MAAM,UAAU,GAC9E,YAAY,MAAM,oBAAoB,MAAM,kBAAkB,MAAM,QAAQ,GAC5E,YAAY,MAAM,oBAAoB,MAAM,kBAAkB,MAAM,EAAE,GACtE,YAAY,MAAM,oBAAoB,MAAM,gBAAgB,GAC5D,YAAY,MAAM,oBAAoB,MAAM,oBAAoB,GAChE,YAAY,MAAM,oBAAoB,MAAM,oBAAoB,GAChE,YAAY,MAAM,oBAAoB,MAAM,eAAe,GAC3D,YAAY,MAAM,oBAAoB,MAAM,eAAe,GAC3D,YAAY,MAAM,oBAAoB,MAAM,UAAU,GACtD,YAAY,MAAM,oBAAoB,MAAM,QAAQ,GACpD,YAAY,MAAM,oBAAoB,MAAM,EAAE,GAC9C,YAAY,MAAM,kBAAkB,GACpC,YAAY,MAAM,wBAAwB,GAC1C,YAAY,MAAM,wBAAwB,GAC1C,YAAY,MAAM,wBAAwB,GAC1C,YAAY,MAAM,sBAAsB,GACxC,YAAY,MAAM,oBAAoB,GACtC,YAAY,MAAM,oBAAoB,GACtC,YAAY,MAAM,eAAe,GACjC,YAAY,MAAM,uBAAuB,GACzC,YAAY,MAAM,uBAAuB,GACzC,YAAY,MAAM,kBAAkB,GACpC,YAAY,MAAM,UAAU,GAC5B,YAAY,MAAM,QAAQ,GAC1B,YAAY,MAAM,EAAE,GACpB,UAAU,GACV,aAAa,MAAM,iBAAiB,GACpC,aAAa,MAAM,eAAe,GAClC,aAAa,MAAM,oBAAoB,GACvC,aAAa,MAAM,UAAU,GAC7B,aAAa,MAAM,QAAQ,GAC3B,aAAa,MAAM,EAAE,GACrB,WAAW,GACX,aAAa,GACb,KAAK,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cl2.credits.pointers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cl2.credits.pointers.js","sourceRoot":"","sources":["../src/cl2.credits.pointers.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import { CreditsMote } from './cl2.shared.types.js';
2
+ import type { GameChanger } from './GameChanger.js';
3
+ export declare function stringifyCredits(mote: CreditsMote, packed: GameChanger): string;
4
+ //# sourceMappingURL=cl2.credits.stringify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cl2.credits.stringify.d.ts","sourceRoot":"","sources":["../src/cl2.credits.stringify.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGpD,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,WAAW,GAClB,MAAM,CA0CR"}
@@ -0,0 +1,42 @@
1
+ import { assert } from './assert.js';
2
+ import { bsArrayToArray } from './helpers.js';
3
+ export function stringifyCredits(mote, packed) {
4
+ const blocks = [];
5
+ // Have each section appear as a Markdown-style # header,
6
+ // with its elementId as a prefix
7
+ if (mote.data.sections) {
8
+ for (const section of bsArrayToArray(mote.data.sections)) {
9
+ const sectionId = section.id;
10
+ const sectionName = section.element.name.text;
11
+ blocks.push(`#${sectionId} ${sectionName}`);
12
+ // Each entry could either be a single credit or a credits group, but lets represent them the same in either case:
13
+ // For each *role*, tab in once and have `\t#<roleId> <roleName>`, followed by a newline, followed by `\t-<Credit Name>`
14
+ // When we parse this we can then use singletons for entries
15
+ // with only one person
16
+ for (const entry of bsArrayToArray(section.element.entries)) {
17
+ const entryId = entry.id;
18
+ const element = entry.element;
19
+ if (element.type === 'Gap') {
20
+ // Gaps are not supported
21
+ continue;
22
+ }
23
+ // Roles aren't strictly required (e.g. in cases where the section and role are the same)
24
+ blocks.push(`\t#${entryId} ${element.role?.text ?? '???'}`);
25
+ if (element.type === 'Single Entry') {
26
+ assert(element.name.name, `Entry must have a name`);
27
+ blocks.push(`\t- ${element.name.name}`);
28
+ }
29
+ else {
30
+ for (const person of bsArrayToArray(element.names)) {
31
+ assert(person.element?.name, `Entry must have a name`);
32
+ blocks.push(`\t- ${person.element.name}`);
33
+ }
34
+ }
35
+ blocks.push('');
36
+ }
37
+ blocks.push('');
38
+ }
39
+ }
40
+ return blocks.join('\n');
41
+ }
42
+ //# sourceMappingURL=cl2.credits.stringify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cl2.credits.stringify.js","sourceRoot":"","sources":["../src/cl2.credits.stringify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,UAAU,gBAAgB,CAC9B,IAAiB,EACjB,MAAmB;IAEnB,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,yDAAyD;IACzD,iCAAiC;IACjC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACvB,KAAK,MAAM,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzD,MAAM,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC;YAC7B,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAC9C,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,IAAI,WAAW,EAAE,CAAC,CAAC;YAE5C,kHAAkH;YAClH,wHAAwH;YACxH,4DAA4D;YAC5D,uBAAuB;YAEvB,KAAK,MAAM,KAAK,IAAI,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5D,MAAM,OAAO,GAAG,KAAK,CAAC,EAAE,CAAC;gBACzB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;gBAC9B,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;oBAC3B,yBAAyB;oBACzB,SAAS;gBACX,CAAC;gBACD,yFAAyF;gBACzF,MAAM,CAAC,IAAI,CAAC,MAAM,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC;gBAC5D,IAAI,OAAO,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;oBACpC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,wBAAwB,CAAC,CAAC;oBACpD,MAAM,CAAC,IAAI,CAAC,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC1C,CAAC;qBAAM,CAAC;oBACN,KAAK,MAAM,MAAM,IAAI,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;wBACnD,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,wBAAwB,CAAC,CAAC;wBACvD,MAAM,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;oBAC5C,CAAC;gBACH,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { Gcdata } from './GameChanger.js';
2
+ import { CreditsMote, ParserResult } from './cl2.shared.types.js';
3
+ import type { BschemaRoot } from './types.js';
4
+ export interface CreditsUpdateResult extends ParserResult<{
5
+ sections: CreditsUpdateResultSection[];
6
+ }> {
7
+ }
8
+ export interface CreditsUpdateResultSection {
9
+ id: string;
10
+ title: string;
11
+ roles: CreditsUpdateResultRole[];
12
+ }
13
+ export interface CreditsUpdateResultRole {
14
+ type: 'role';
15
+ id: string;
16
+ role?: string;
17
+ names: {
18
+ /** ID added when converting to Mote data */
19
+ id?: string;
20
+ name: string;
21
+ cjk?: boolean;
22
+ }[];
23
+ }
24
+ export declare function listCredits(gcData: Gcdata): [CreditsMote];
25
+ export declare function isCreditsMote(mote: any): mote is CreditsMote;
26
+ export declare function getCreditsMote(gcData: Gcdata, moteId: string): CreditsMote | undefined;
27
+ export declare function getCreditsSchema(gcData: Gcdata): BschemaRoot | undefined;
28
+ export declare const linePatterns: string[];
29
+ //# sourceMappingURL=cl2.credits.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cl2.credits.types.d.ts","sourceRoot":"","sources":["../src/cl2.credits.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAIL,WAAW,EAEX,YAAY,EACb,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,mBACf,SAAQ,YAAY,CAAC;IACnB,QAAQ,EAAE,0BAA0B,EAAE,CAAC;CACxC,CAAC;CAAG;AAEP,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,uBAAuB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE;QACL,4CAA4C;QAC5C,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,OAAO,CAAC;KACf,EAAE,CAAC;CACL;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,WAAW,CAAC,CAIzD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI,IAAI,WAAW,CAE5D;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,WAAW,GAAG,SAAS,CAIzB;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAExE;AAED,eAAO,MAAM,YAAY,UAUxB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { assert } from './assert.js';
2
+ import { arrayTagPattern, commentLinePattern, creditsSchemaId, } from './cl2.shared.types.js';
3
+ export function listCredits(gcData) {
4
+ return gcData.listMotesBySchema(creditsSchemaId);
5
+ }
6
+ export function isCreditsMote(mote) {
7
+ return mote.schema_id === creditsSchemaId;
8
+ }
9
+ export function getCreditsMote(gcData, moteId) {
10
+ const mote = gcData.getMote(moteId);
11
+ assert(!mote || isCreditsMote(mote), `Mote ${moteId} is not a storyline`);
12
+ return mote;
13
+ }
14
+ export function getCreditsSchema(gcData) {
15
+ return gcData.getSchema(creditsSchemaId);
16
+ }
17
+ export const linePatterns = [
18
+ // Gap Line (===)
19
+ `^(?<indicator>===)\\s*$`,
20
+ // Name Line (\t- <name>)
21
+ `^(?<indicator>\\t-\\s*)(?<text>.*?)\\s*$`,
22
+ // Role Line (\t#<roleId> <roleName>)
23
+ `^(?<indicator>\\t)${arrayTagPattern}?\\s*(?<text>.*?)\\s*$`,
24
+ // Section Line (#<sectionId> <sectionName>)
25
+ `^(${arrayTagPattern}\\s+)?(?<text>[^\t]+)$`,
26
+ commentLinePattern,
27
+ ];
28
+ //# sourceMappingURL=cl2.credits.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cl2.credits.types.js","sourceRoot":"","sources":["../src/cl2.credits.types.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EACL,eAAe,EACf,kBAAkB,EAGlB,eAAe,GAEhB,MAAM,uBAAuB,CAAC;AA0B/B,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,OAAO,MAAM,CAAC,iBAAiB,CAAc,eAAe,CAE3D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAS;IACrC,OAAO,IAAI,CAAC,SAAS,KAAK,eAAe,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,MAAc,EACd,MAAc;IAEd,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAc,MAAM,CAAC,CAAC;IACjD,MAAM,CAAC,CAAC,IAAI,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,QAAQ,MAAM,qBAAqB,CAAC,CAAC;IAC1E,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,OAAO,MAAM,CAAC,SAAS,CAAC,eAAe,CAAgB,CAAC;AAC1D,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,iBAAiB;IACjB,yBAAyB;IACzB,yBAAyB;IACzB,0CAA0C;IAC1C,qCAAqC;IACrC,qBAAqB,eAAe,wBAAwB;IAC5D,4CAA4C;IAC5C,KAAK,eAAe,wBAAwB;IAC5C,kBAAkB;CACnB,CAAC"}