@oyna360/lobby-sdk 0.1.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 (211) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +123 -0
  3. package/dist/avatar-accessories.d.ts +16 -0
  4. package/dist/avatar-accessories.d.ts.map +1 -0
  5. package/dist/avatar-accessories.js +214 -0
  6. package/dist/avatar-accessories.js.map +1 -0
  7. package/dist/avatar-asset-manager.d.ts +54 -0
  8. package/dist/avatar-asset-manager.d.ts.map +1 -0
  9. package/dist/avatar-asset-manager.js +215 -0
  10. package/dist/avatar-asset-manager.js.map +1 -0
  11. package/dist/avatar-clips.d.ts +17 -0
  12. package/dist/avatar-clips.d.ts.map +1 -0
  13. package/dist/avatar-clips.js +47 -0
  14. package/dist/avatar-clips.js.map +1 -0
  15. package/dist/avatar-config.d.ts +4 -0
  16. package/dist/avatar-config.d.ts.map +1 -0
  17. package/dist/avatar-config.js +9 -0
  18. package/dist/avatar-config.js.map +1 -0
  19. package/dist/avatar-factory.d.ts +64 -0
  20. package/dist/avatar-factory.d.ts.map +1 -0
  21. package/dist/avatar-factory.js +464 -0
  22. package/dist/avatar-factory.js.map +1 -0
  23. package/dist/avatar-instance.d.ts +31 -0
  24. package/dist/avatar-instance.d.ts.map +1 -0
  25. package/dist/avatar-instance.js +56 -0
  26. package/dist/avatar-instance.js.map +1 -0
  27. package/dist/avatar-material-pipeline.d.ts +34 -0
  28. package/dist/avatar-material-pipeline.d.ts.map +1 -0
  29. package/dist/avatar-material-pipeline.js +580 -0
  30. package/dist/avatar-material-pipeline.js.map +1 -0
  31. package/dist/avatar-rig-builder.d.ts +74 -0
  32. package/dist/avatar-rig-builder.d.ts.map +1 -0
  33. package/dist/avatar-rig-builder.js +347 -0
  34. package/dist/avatar-rig-builder.js.map +1 -0
  35. package/dist/draco.d.ts +7 -0
  36. package/dist/draco.d.ts.map +1 -0
  37. package/dist/draco.js +82 -0
  38. package/dist/draco.js.map +1 -0
  39. package/dist/humanoid-animator.d.ts +35 -0
  40. package/dist/humanoid-animator.d.ts.map +1 -0
  41. package/dist/humanoid-animator.js +191 -0
  42. package/dist/humanoid-animator.js.map +1 -0
  43. package/dist/humanoid-bone-names.d.ts +35 -0
  44. package/dist/humanoid-bone-names.d.ts.map +1 -0
  45. package/dist/humanoid-bone-names.js +126 -0
  46. package/dist/humanoid-bone-names.js.map +1 -0
  47. package/dist/humanoid-locomotion.d.ts +101 -0
  48. package/dist/humanoid-locomotion.d.ts.map +1 -0
  49. package/dist/humanoid-locomotion.js +300 -0
  50. package/dist/humanoid-locomotion.js.map +1 -0
  51. package/dist/humanoid-rig.d.ts +51 -0
  52. package/dist/humanoid-rig.d.ts.map +1 -0
  53. package/dist/humanoid-rig.js +304 -0
  54. package/dist/humanoid-rig.js.map +1 -0
  55. package/dist/index.d.ts +60 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +42 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/lobby-chat-ui.d.ts +3 -0
  60. package/dist/lobby-chat-ui.d.ts.map +1 -0
  61. package/dist/lobby-chat-ui.js +258 -0
  62. package/dist/lobby-chat-ui.js.map +1 -0
  63. package/dist/lobby-colliders.d.ts +10 -0
  64. package/dist/lobby-colliders.d.ts.map +1 -0
  65. package/dist/lobby-colliders.js +225 -0
  66. package/dist/lobby-colliders.js.map +1 -0
  67. package/dist/lobby-connection-ui.d.ts +8 -0
  68. package/dist/lobby-connection-ui.d.ts.map +1 -0
  69. package/dist/lobby-connection-ui.js +68 -0
  70. package/dist/lobby-connection-ui.js.map +1 -0
  71. package/dist/lobby-debug.d.ts +50 -0
  72. package/dist/lobby-debug.d.ts.map +1 -0
  73. package/dist/lobby-debug.js +132 -0
  74. package/dist/lobby-debug.js.map +1 -0
  75. package/dist/lobby-font.d.ts +5 -0
  76. package/dist/lobby-font.d.ts.map +1 -0
  77. package/dist/lobby-font.js +35 -0
  78. package/dist/lobby-font.js.map +1 -0
  79. package/dist/lobby-music.d.ts +40 -0
  80. package/dist/lobby-music.d.ts.map +1 -0
  81. package/dist/lobby-music.js +250 -0
  82. package/dist/lobby-music.js.map +1 -0
  83. package/dist/lobby-orientation-ui.d.ts +10 -0
  84. package/dist/lobby-orientation-ui.d.ts.map +1 -0
  85. package/dist/lobby-orientation-ui.js +64 -0
  86. package/dist/lobby-orientation-ui.js.map +1 -0
  87. package/dist/lobby-perf-diag.d.ts +254 -0
  88. package/dist/lobby-perf-diag.d.ts.map +1 -0
  89. package/dist/lobby-perf-diag.js +775 -0
  90. package/dist/lobby-perf-diag.js.map +1 -0
  91. package/dist/lobby-plaza-diag.d.ts +103 -0
  92. package/dist/lobby-plaza-diag.d.ts.map +1 -0
  93. package/dist/lobby-plaza-diag.js +534 -0
  94. package/dist/lobby-plaza-diag.js.map +1 -0
  95. package/dist/lobby-presence-ui.d.ts +4 -0
  96. package/dist/lobby-presence-ui.d.ts.map +1 -0
  97. package/dist/lobby-presence-ui.js +89 -0
  98. package/dist/lobby-presence-ui.js.map +1 -0
  99. package/dist/lobby-real-device-diag.d.ts +119 -0
  100. package/dist/lobby-real-device-diag.d.ts.map +1 -0
  101. package/dist/lobby-real-device-diag.js +468 -0
  102. package/dist/lobby-real-device-diag.js.map +1 -0
  103. package/dist/lobby-spawn.d.ts +15 -0
  104. package/dist/lobby-spawn.d.ts.map +1 -0
  105. package/dist/lobby-spawn.js +18 -0
  106. package/dist/lobby-spawn.js.map +1 -0
  107. package/dist/lobby-ui-i18n.d.ts +11 -0
  108. package/dist/lobby-ui-i18n.d.ts.map +1 -0
  109. package/dist/lobby-ui-i18n.js +21 -0
  110. package/dist/lobby-ui-i18n.js.map +1 -0
  111. package/dist/lobby-voice-ui.d.ts +3 -0
  112. package/dist/lobby-voice-ui.d.ts.map +1 -0
  113. package/dist/lobby-voice-ui.js +105 -0
  114. package/dist/lobby-voice-ui.js.map +1 -0
  115. package/dist/local-player-controller.d.ts +80 -0
  116. package/dist/local-player-controller.d.ts.map +1 -0
  117. package/dist/local-player-controller.js +422 -0
  118. package/dist/local-player-controller.js.map +1 -0
  119. package/dist/name-tag.d.ts +3 -0
  120. package/dist/name-tag.d.ts.map +1 -0
  121. package/dist/name-tag.js +59 -0
  122. package/dist/name-tag.js.map +1 -0
  123. package/dist/network-client.d.ts +87 -0
  124. package/dist/network-client.d.ts.map +1 -0
  125. package/dist/network-client.js +182 -0
  126. package/dist/network-client.js.map +1 -0
  127. package/dist/platform-bridge.d.ts +17 -0
  128. package/dist/platform-bridge.d.ts.map +1 -0
  129. package/dist/platform-bridge.js +90 -0
  130. package/dist/platform-bridge.js.map +1 -0
  131. package/dist/platform-lobby.d.ts +176 -0
  132. package/dist/platform-lobby.d.ts.map +1 -0
  133. package/dist/platform-lobby.js +679 -0
  134. package/dist/platform-lobby.js.map +1 -0
  135. package/dist/platform-types.d.ts +56 -0
  136. package/dist/platform-types.d.ts.map +1 -0
  137. package/dist/platform-types.js +3 -0
  138. package/dist/platform-types.js.map +1 -0
  139. package/dist/player-label.d.ts +9 -0
  140. package/dist/player-label.d.ts.map +1 -0
  141. package/dist/player-label.js +14 -0
  142. package/dist/player-label.js.map +1 -0
  143. package/dist/playground/playground-layout.d.ts +14 -0
  144. package/dist/playground/playground-layout.d.ts.map +1 -0
  145. package/dist/playground/playground-layout.js +320 -0
  146. package/dist/playground/playground-layout.js.map +1 -0
  147. package/dist/playground/playground-system.d.ts +30 -0
  148. package/dist/playground/playground-system.d.ts.map +1 -0
  149. package/dist/playground/playground-system.js +202 -0
  150. package/dist/playground/playground-system.js.map +1 -0
  151. package/dist/plaza-layout.d.ts +30 -0
  152. package/dist/plaza-layout.d.ts.map +1 -0
  153. package/dist/plaza-layout.js +527 -0
  154. package/dist/plaza-layout.js.map +1 -0
  155. package/dist/plugins.d.ts +5 -0
  156. package/dist/plugins.d.ts.map +1 -0
  157. package/dist/plugins.js +26 -0
  158. package/dist/plugins.js.map +1 -0
  159. package/dist/protocol.d.ts +276 -0
  160. package/dist/protocol.d.ts.map +1 -0
  161. package/dist/protocol.js +107 -0
  162. package/dist/protocol.js.map +1 -0
  163. package/dist/quality.d.ts +39 -0
  164. package/dist/quality.d.ts.map +1 -0
  165. package/dist/quality.js +95 -0
  166. package/dist/quality.js.map +1 -0
  167. package/dist/remote-player-manager.d.ts +48 -0
  168. package/dist/remote-player-manager.d.ts.map +1 -0
  169. package/dist/remote-player-manager.js +339 -0
  170. package/dist/remote-player-manager.js.map +1 -0
  171. package/dist/scene-manager.d.ts +26 -0
  172. package/dist/scene-manager.d.ts.map +1 -0
  173. package/dist/scene-manager.js +169 -0
  174. package/dist/scene-manager.js.map +1 -0
  175. package/dist/spawn-utils.d.ts +8 -0
  176. package/dist/spawn-utils.d.ts.map +1 -0
  177. package/dist/spawn-utils.js +29 -0
  178. package/dist/spawn-utils.js.map +1 -0
  179. package/dist/starter-layout.d.ts +17 -0
  180. package/dist/starter-layout.d.ts.map +1 -0
  181. package/dist/starter-layout.js +102 -0
  182. package/dist/starter-layout.js.map +1 -0
  183. package/dist/third-person-camera.d.ts +35 -0
  184. package/dist/third-person-camera.d.ts.map +1 -0
  185. package/dist/third-person-camera.js +181 -0
  186. package/dist/third-person-camera.js.map +1 -0
  187. package/dist/types.d.ts +164 -0
  188. package/dist/types.d.ts.map +1 -0
  189. package/dist/types.js +2 -0
  190. package/dist/types.js.map +1 -0
  191. package/dist/voice-chat.d.ts +78 -0
  192. package/dist/voice-chat.d.ts.map +1 -0
  193. package/dist/voice-chat.js +321 -0
  194. package/dist/voice-chat.js.map +1 -0
  195. package/dist/yield-to-render.d.ts +3 -0
  196. package/dist/yield-to-render.d.ts.map +1 -0
  197. package/dist/yield-to-render.js +11 -0
  198. package/dist/yield-to-render.js.map +1 -0
  199. package/dist/zones.d.ts +36 -0
  200. package/dist/zones.d.ts.map +1 -0
  201. package/dist/zones.js +68 -0
  202. package/dist/zones.js.map +1 -0
  203. package/docs/00-overview.md +47 -0
  204. package/docs/01-connect.md +85 -0
  205. package/docs/02-github.md +43 -0
  206. package/docs/03-modes.md +70 -0
  207. package/docs/04-api.md +106 -0
  208. package/docs/05-features.md +55 -0
  209. package/docs/06-controls.md +34 -0
  210. package/docs/07-troubleshooting.md +39 -0
  211. package/package.json +65 -0
@@ -0,0 +1,534 @@
1
+ import { captureRealDeviceInfo, } from './lobby-real-device-diag';
2
+ import { sampleAvatarRender, } from './lobby-perf-diag';
3
+ /** Subsystems measured via mesh visibility leave-one-out. */
4
+ export const PLAZA_MESH_SUBSYSTEMS = [
5
+ 'plaza_ground',
6
+ 'fountain',
7
+ 'shops',
8
+ 'nature',
9
+ 'rooms',
10
+ 'playground',
11
+ 'npcs',
12
+ 'colliders',
13
+ 'avatars',
14
+ 'base_ground',
15
+ 'other',
16
+ ];
17
+ function rootOf(node) {
18
+ let n = node;
19
+ while (n.parent && typeof n.parent === 'object') {
20
+ n = n.parent;
21
+ }
22
+ return n;
23
+ }
24
+ function ancestorNames(node) {
25
+ const names = [];
26
+ let n = node;
27
+ while (n) {
28
+ if (n.name)
29
+ names.push(n.name);
30
+ n =
31
+ n.parent && typeof n.parent === 'object'
32
+ ? n.parent
33
+ : null;
34
+ }
35
+ return names;
36
+ }
37
+ /** Classify a mesh into a Plaza diagnostic bucket (name/metadata + ancestry). */
38
+ export function classifyPlazaMesh(mesh) {
39
+ const name = mesh.name || '';
40
+ const lower = name.toLowerCase();
41
+ const ancestors = ancestorNames(mesh);
42
+ const rootName = rootOf(mesh).name || name;
43
+ if (lower.includes('-phys') ||
44
+ lower.includes('-rail-') ||
45
+ lower.endsWith('-charcol') ||
46
+ lower.endsWith('-bodycol') ||
47
+ name === 'fountain-blocker' ||
48
+ ancestors.some((a) => a.includes('-phys') ||
49
+ a.includes('-rail-') ||
50
+ a.endsWith('-charcol') ||
51
+ a.endsWith('-bodycol') ||
52
+ a === 'fountain-blocker')) {
53
+ return 'colliders';
54
+ }
55
+ const underNpc = ancestors.some((a) => a.startsWith('plaza-npc-') || a.startsWith('npc-'));
56
+ const underAvatar = ancestors.some((a) => a === 'local-player' || a.startsWith('remote-')) ||
57
+ !!mesh.metadata?.isLobbyAvatar ||
58
+ !!mesh.metadata?.isLobbyAvatarRoot;
59
+ if (underNpc)
60
+ return 'npcs';
61
+ if (underAvatar)
62
+ return 'avatars';
63
+ if (ancestors.some((a) => a.startsWith('shop-') || a.startsWith('shop-root-')))
64
+ return 'shops';
65
+ if (ancestors.some((a) => a.startsWith('room-') || a.startsWith('room-root-')))
66
+ return 'rooms';
67
+ if (ancestors.some((a) => a.startsWith('playground-')))
68
+ return 'playground';
69
+ if (ancestors.some((a) => a.startsWith('tree-') ||
70
+ a.startsWith('bush-') ||
71
+ a.startsWith('rock-') ||
72
+ a.startsWith('lamp-') ||
73
+ a.startsWith('bench-'))) {
74
+ return 'nature';
75
+ }
76
+ if (ancestors.some((a) => a.startsWith('fountain-') || a === 'plaza-center'))
77
+ return 'fountain';
78
+ if (name === 'ground')
79
+ return 'base_ground';
80
+ if (name === 'grass-ground' ||
81
+ name === 'plaza-pavement' ||
82
+ name === 'plaza-ring' ||
83
+ name.startsWith('path-') ||
84
+ name.startsWith('edge-tile-')) {
85
+ return 'plaza_ground';
86
+ }
87
+ if (name.startsWith('fountain-') || name === 'plaza-center')
88
+ return 'fountain';
89
+ if (name.startsWith('shop-') || name.startsWith('shop-root-'))
90
+ return 'shops';
91
+ if (name.startsWith('tree-') ||
92
+ name.startsWith('bush-') ||
93
+ name.startsWith('rock-') ||
94
+ name.startsWith('lamp-') ||
95
+ name.startsWith('bench-')) {
96
+ return 'nature';
97
+ }
98
+ if (name.startsWith('room-') || name.startsWith('room-root-'))
99
+ return 'rooms';
100
+ if (name.startsWith('playground-'))
101
+ return 'playground';
102
+ // Catch-all for unlabeled avatar/npc debris by root name
103
+ if (rootName.startsWith('plaza-npc-') || rootName.startsWith('npc-'))
104
+ return 'npcs';
105
+ if (rootName === 'local-player' || rootName.startsWith('remote-'))
106
+ return 'avatars';
107
+ return 'other';
108
+ }
109
+ function meshActive(mesh) {
110
+ if (mesh.isDisposed())
111
+ return false;
112
+ if (!mesh.isEnabled() || mesh.isVisible === false || (mesh.visibility ?? 1) <= 0)
113
+ return false;
114
+ const v = typeof mesh.getTotalVertices === 'function' ? mesh.getTotalVertices() : 0;
115
+ return v > 0;
116
+ }
117
+ function meshTris(mesh) {
118
+ const v = typeof mesh.getTotalVertices === 'function' ? mesh.getTotalVertices() : 0;
119
+ const idx = typeof mesh.getIndices === 'function' ? mesh.getIndices() : null;
120
+ if (idx?.length)
121
+ return Math.floor(idx.length / 3);
122
+ return Math.floor(v / 3);
123
+ }
124
+ export function inventoryPlazaSubsystems(scene) {
125
+ const buckets = new Map();
126
+ const ensure = (id) => {
127
+ let b = buckets.get(id);
128
+ if (!b) {
129
+ b = {
130
+ id,
131
+ meshCount: 0,
132
+ activeMeshCount: 0,
133
+ triangleApprox: 0,
134
+ vertexApprox: 0,
135
+ materialIds: 0,
136
+ sampleNames: [],
137
+ };
138
+ buckets.set(id, b);
139
+ }
140
+ return b;
141
+ };
142
+ for (const id of PLAZA_MESH_SUBSYSTEMS)
143
+ ensure(id);
144
+ const matsBySys = new Map();
145
+ for (const mesh of scene.meshes) {
146
+ if (mesh.isDisposed())
147
+ continue;
148
+ const id = classifyPlazaMesh(mesh);
149
+ const b = ensure(id);
150
+ b.meshCount += 1;
151
+ if (b.sampleNames.length < 8)
152
+ b.sampleNames.push(mesh.name);
153
+ const v = typeof mesh.getTotalVertices === 'function' ? mesh.getTotalVertices() : 0;
154
+ if (v <= 0)
155
+ continue;
156
+ if (meshActive(mesh)) {
157
+ b.activeMeshCount += 1;
158
+ b.triangleApprox += meshTris(mesh);
159
+ b.vertexApprox += v;
160
+ const mid = mesh.material?.uniqueId != null ? String(mesh.material.uniqueId) : mesh.material?.name;
161
+ if (mid) {
162
+ let set = matsBySys.get(id);
163
+ if (!set) {
164
+ set = new Set();
165
+ matsBySys.set(id, set);
166
+ }
167
+ set.add(mid);
168
+ }
169
+ }
170
+ }
171
+ for (const [id, set] of matsBySys) {
172
+ ensure(id).materialIds = set.size;
173
+ }
174
+ return PLAZA_MESH_SUBSYSTEMS.map((id) => ensure(id));
175
+ }
176
+ function isPlazaPointLight(name) {
177
+ return (name.startsWith('lamp-light-') ||
178
+ name.startsWith('room-light-') ||
179
+ name === 'fountain-light' ||
180
+ name.startsWith('playground-trampoline-light'));
181
+ }
182
+ function setSubsystemMeshesVisible(scene, id, visible) {
183
+ const saved = [];
184
+ for (const mesh of scene.meshes) {
185
+ if (mesh.isDisposed())
186
+ continue;
187
+ if (classifyPlazaMesh(mesh) !== id)
188
+ continue;
189
+ saved.push({
190
+ mesh,
191
+ enabled: mesh.isEnabled(),
192
+ visible: mesh.isVisible !== false,
193
+ visibility: mesh.visibility ?? 1,
194
+ });
195
+ mesh.setEnabled(visible);
196
+ mesh.isVisible = visible;
197
+ if (!visible)
198
+ mesh.visibility = 0;
199
+ }
200
+ return () => {
201
+ for (const s of saved) {
202
+ if (s.mesh.isDisposed())
203
+ continue;
204
+ s.mesh.setEnabled(s.enabled);
205
+ s.mesh.isVisible = s.visible;
206
+ s.mesh.visibility = s.visibility;
207
+ }
208
+ };
209
+ }
210
+ function setPlazaPointLightsEnabled(scene, enabled) {
211
+ const saved = [];
212
+ for (const light of scene.lights) {
213
+ if (!isPlazaPointLight(light.name || ''))
214
+ continue;
215
+ saved.push({ light, enabled: light.isEnabled() });
216
+ light.setEnabled(enabled);
217
+ }
218
+ return () => {
219
+ for (const s of saved) {
220
+ try {
221
+ s.light.setEnabled(s.enabled);
222
+ }
223
+ catch {
224
+ /* ignore */
225
+ }
226
+ }
227
+ };
228
+ }
229
+ function setPlazaPostProcessEnabled(scene, enabled) {
230
+ const meta = (scene.metadata ?? {});
231
+ const glow = meta.plazaGlow;
232
+ const fx = meta.plazaFx ?? null;
233
+ const save = {
234
+ glowIntensity: glow ? glow.intensity : null,
235
+ bloomEnabled: fx && typeof fx.bloomEnabled === 'boolean' ? fx.bloomEnabled : null,
236
+ fxaaEnabled: fx && typeof fx.fxaaEnabled === 'boolean' ? fx.fxaaEnabled : null,
237
+ };
238
+ if (glow)
239
+ glow.intensity = enabled ? (save.glowIntensity ?? 0.28) : 0;
240
+ if (fx && save.bloomEnabled != null)
241
+ fx.bloomEnabled = enabled ? save.bloomEnabled : false;
242
+ if (fx && save.fxaaEnabled != null && !enabled)
243
+ fx.fxaaEnabled = false;
244
+ return () => {
245
+ if (glow && save.glowIntensity != null)
246
+ glow.intensity = save.glowIntensity;
247
+ if (fx && save.bloomEnabled != null)
248
+ fx.bloomEnabled = save.bloomEnabled;
249
+ if (fx && save.fxaaEnabled != null)
250
+ fx.fxaaEnabled = save.fxaaEnabled;
251
+ };
252
+ }
253
+ function sleep(ms) {
254
+ return new Promise((r) => setTimeout(r, ms));
255
+ }
256
+ function compactSample(s) {
257
+ if (!s)
258
+ return null;
259
+ return {
260
+ label: s.label,
261
+ fpsAvg: s.series.avgFps,
262
+ frameAvg: s.series.avgFrameTimeMs,
263
+ frameP95: s.series.p95FrameTimeMs,
264
+ frameP99: s.series.p99FrameTimeMs,
265
+ frameMax: s.series.maxFrameTimeMs,
266
+ sceneRenderAvg: s.phases.scene_render?.avgMs ?? null,
267
+ sceneRenderP95: s.phases.scene_render?.p95Ms ?? null,
268
+ sceneRenderMax: s.phases.scene_render?.maxMs ?? null,
269
+ activeMeshes: s.avatarCosts.sceneActiveMeshCount,
270
+ triangles: s.avatarCosts.sceneTriangleApprox,
271
+ vertices: s.avatarCosts.sceneVertexApprox,
272
+ materials: s.avatarCosts.sceneMaterialCount,
273
+ textures: s.avatarCosts.sceneTextureCount,
274
+ skeletons: s.avatarCosts.sceneSkeletonCount,
275
+ bones: s.avatarCosts.sceneBoneCount,
276
+ drawCallsApprox: s.avatarCosts.sceneDrawCallsApprox,
277
+ };
278
+ }
279
+ function delta(full, other) {
280
+ if (!full || !other)
281
+ return null;
282
+ const sub = (a, b) => a == null || b == null ? null : a - b;
283
+ return {
284
+ activeMeshes: sub(full.activeMeshes, other.activeMeshes),
285
+ triangles: sub(full.triangles, other.triangles),
286
+ sceneRenderAvg: sub(full.sceneRenderAvg, other.sceneRenderAvg),
287
+ frameAvg: sub(full.frameAvg, other.frameAvg),
288
+ };
289
+ }
290
+ function buildAssessment(inventory, leaveOneOut, post, lights) {
291
+ const evidence = [];
292
+ const byActive = [...inventory]
293
+ .filter((i) => i.activeMeshCount > 0)
294
+ .sort((a, b) => b.activeMeshCount - a.activeMeshCount);
295
+ const totalActive = byActive.reduce((s, i) => s + i.activeMeshCount, 0) || 1;
296
+ const topMesh = byActive[0];
297
+ if (topMesh) {
298
+ evidence.push(`Inventory: ${topMesh.id} owns ${topMesh.activeMeshCount}/${totalActive} active meshes (${((100 * topMesh.activeMeshCount) / totalActive).toFixed(1)}%), ~${topMesh.triangleApprox} tris.`);
299
+ }
300
+ const top2 = byActive[1];
301
+ if (top2) {
302
+ evidence.push(`Inventory #2: ${top2.id} owns ${top2.activeMeshCount} active meshes (~${((100 * top2.activeMeshCount) / totalActive).toFixed(1)}%).`);
303
+ }
304
+ const byRender = [...leaveOneOut]
305
+ .filter((s) => s.deltaFromFull?.sceneRenderAvg != null)
306
+ .sort((a, b) => (b.deltaFromFull.sceneRenderAvg ?? 0) - (a.deltaFromFull.sceneRenderAvg ?? 0));
307
+ const topCost = byRender[0];
308
+ if (topCost?.deltaFromFull?.sceneRenderAvg != null) {
309
+ evidence.push(`Leave-one-out scene_render Δ: hiding ${topCost.id} reduced scene_render by ${topCost.deltaFromFull.sceneRenderAvg.toFixed(2)}ms (frame Δ ${topCost.deltaFromFull.frameAvg?.toFixed(2) ?? 'n/a'}ms).`);
310
+ }
311
+ const topCost2 = byRender[1];
312
+ if (topCost2?.deltaFromFull?.sceneRenderAvg != null) {
313
+ evidence.push(`Leave-one-out #2: ${topCost2.id} scene_render Δ ${topCost2.deltaFromFull.sceneRenderAvg.toFixed(2)}ms.`);
314
+ }
315
+ if (post?.deltaFromFull?.sceneRenderAvg != null) {
316
+ evidence.push(`Post-process off scene_render Δ ${post.deltaFromFull.sceneRenderAvg.toFixed(2)}ms.`);
317
+ }
318
+ if (lights?.deltaFromFull?.sceneRenderAvg != null) {
319
+ evidence.push(`Plaza point-lights off scene_render Δ ${lights.deltaFromFull.sceneRenderAvg.toFixed(2)}ms.`);
320
+ }
321
+ const primary = topCost && (topCost.deltaFromFull?.sceneRenderAvg ?? 0) > 0.15
322
+ ? topCost.id
323
+ : topMesh?.id ?? 'unknown';
324
+ let secondary = topCost2?.id ?? top2?.id ?? 'unknown';
325
+ if (post?.deltaFromFull?.sceneRenderAvg != null &&
326
+ (post.deltaFromFull.sceneRenderAvg ?? 0) >
327
+ (topCost2?.deltaFromFull?.sceneRenderAvg ?? -Infinity)) {
328
+ secondary = 'post_process_glow_bloom';
329
+ }
330
+ if (lights?.deltaFromFull?.sceneRenderAvg != null &&
331
+ (lights.deltaFromFull.sceneRenderAvg ?? 0) >
332
+ (topCost2?.deltaFromFull?.sceneRenderAvg ?? -Infinity) &&
333
+ secondary !== 'post_process_glow_bloom') {
334
+ // Prefer larger of post vs lights for secondary if bigger than mesh #2
335
+ if (!post ||
336
+ (lights.deltaFromFull.sceneRenderAvg ?? 0) >= (post.deltaFromFull?.sceneRenderAvg ?? 0)) {
337
+ secondary = 'plaza_point_lights';
338
+ }
339
+ }
340
+ const meshDominant = topMesh && topMesh.activeMeshCount / totalActive >= 0.25;
341
+ const renderAligned = topCost && topMesh && (topCost.id === topMesh.id || topCost.id === top2?.id);
342
+ const confidence = meshDominant && renderAligned ? 'high' : meshDominant || topCost ? 'medium' : 'low';
343
+ return {
344
+ primarySuspectedBottleneck: primary,
345
+ secondarySuspectedBottleneck: secondary,
346
+ evidence,
347
+ confidence,
348
+ };
349
+ }
350
+ /**
351
+ * Full Plaza diagnostic suite. Restores all toggles before return.
352
+ */
353
+ export async function runPlazaDiagSuite(scene, engine, options = {}) {
354
+ const sampleMs = options.sampleMs ?? 2200;
355
+ const notes = [
356
+ 'Isolation uses temporary mesh visibility / light / post-FX toggles; production defaults restored.',
357
+ 'No ShadowGenerator is present in SceneManager; plaza meshes mostly receiveShadows=false.',
358
+ 'Stages 8–9 often used npcCount:0; this suite expects a full applyPlazaLayout (default NPCs) + playground.',
359
+ ];
360
+ const inventory = inventoryPlazaSubsystems(scene);
361
+ const inventoryTotals = {
362
+ activeMeshes: inventory.reduce((s, i) => s + i.activeMeshCount, 0),
363
+ triangles: inventory.reduce((s, i) => s + i.triangleApprox, 0),
364
+ meshCount: inventory.reduce((s, i) => s + i.meshCount, 0),
365
+ };
366
+ const otherInv = inventory.find((i) => i.id === 'other');
367
+ if (otherInv && otherInv.activeMeshCount > 20) {
368
+ notes.push(`Unclassified "other" still has ${otherInv.activeMeshCount} active meshes (samples: ${otherInv.sampleNames.join(', ')}).`);
369
+ }
370
+ const avatarBasesAvailable = [
371
+ {
372
+ id: 'demo-hoodie',
373
+ glbUrl: '/avatars/demo/demo-hoodie.glb',
374
+ note: 'Only public GLB base shipped under apps/web/public/avatars',
375
+ },
376
+ ];
377
+ await sleep(400);
378
+ const fullSample = await sampleAvatarRender(scene, engine, 'plaza_full', sampleMs);
379
+ const baseline = compactSample(fullSample);
380
+ const leaveOneOut = [];
381
+ let postProcessOff = null;
382
+ let plazaLightsOff = null;
383
+ let emptyish = null;
384
+ if (!options.inventoryOnly) {
385
+ const hideOrder = [
386
+ 'nature',
387
+ 'shops',
388
+ 'rooms',
389
+ 'playground',
390
+ 'fountain',
391
+ 'plaza_ground',
392
+ 'npcs',
393
+ 'colliders',
394
+ 'avatars',
395
+ ];
396
+ for (const id of hideOrder) {
397
+ const inv = inventory.find((i) => i.id === id) ?? null;
398
+ if (inv && inv.activeMeshCount === 0 && inv.meshCount === 0) {
399
+ leaveOneOut.push({
400
+ id,
401
+ note: 'no meshes classified — skipped sample',
402
+ inventory: inv,
403
+ metrics: null,
404
+ deltaFromFull: null,
405
+ });
406
+ continue;
407
+ }
408
+ const restore = setSubsystemMeshesVisible(scene, id, false);
409
+ try {
410
+ await sleep(250);
411
+ const sample = compactSample(await sampleAvatarRender(scene, engine, `plaza_hide_${id}`, sampleMs));
412
+ leaveOneOut.push({
413
+ id,
414
+ note: `leave-one-out: hide ${id} only`,
415
+ inventory: inv,
416
+ metrics: sample,
417
+ deltaFromFull: delta(baseline, sample),
418
+ });
419
+ }
420
+ finally {
421
+ restore();
422
+ await sleep(150);
423
+ }
424
+ }
425
+ {
426
+ const restore = setPlazaPostProcessEnabled(scene, false);
427
+ try {
428
+ await sleep(250);
429
+ const sample = compactSample(await sampleAvatarRender(scene, engine, 'plaza_post_off', sampleMs));
430
+ postProcessOff = {
431
+ id: 'post_process_glow_bloom',
432
+ note: 'Glow intensity 0 + bloom/FXAA off (restored after)',
433
+ metrics: sample,
434
+ deltaFromFull: delta(baseline, sample),
435
+ };
436
+ }
437
+ finally {
438
+ restore();
439
+ await sleep(150);
440
+ }
441
+ }
442
+ {
443
+ const restore = setPlazaPointLightsEnabled(scene, false);
444
+ try {
445
+ await sleep(250);
446
+ const sample = compactSample(await sampleAvatarRender(scene, engine, 'plaza_lights_off', sampleMs));
447
+ plazaLightsOff = {
448
+ id: 'plaza_point_lights',
449
+ note: 'Disable plaza PointLights (lamp/room/fountain/playground); keep hemi+moon',
450
+ metrics: sample,
451
+ deltaFromFull: delta(baseline, sample),
452
+ };
453
+ }
454
+ finally {
455
+ restore();
456
+ await sleep(150);
457
+ }
458
+ }
459
+ {
460
+ const restores = [
461
+ 'nature',
462
+ 'shops',
463
+ 'rooms',
464
+ 'playground',
465
+ 'fountain',
466
+ 'plaza_ground',
467
+ 'npcs',
468
+ 'colliders',
469
+ 'avatars',
470
+ ].map((id) => setSubsystemMeshesVisible(scene, id, false));
471
+ const restoreLights = setPlazaPointLightsEnabled(scene, false);
472
+ const restorePost = setPlazaPostProcessEnabled(scene, false);
473
+ try {
474
+ await sleep(250);
475
+ const sample = compactSample(await sampleAvatarRender(scene, engine, 'plaza_emptyish', sampleMs));
476
+ emptyish = {
477
+ id: 'emptyish_base_only',
478
+ note: 'Hide plaza content + NPCs + avatars + plaza lights + post; leave base ground/hemi/moon',
479
+ metrics: sample,
480
+ deltaFromFull: delta(baseline, sample),
481
+ };
482
+ }
483
+ finally {
484
+ restorePost();
485
+ restoreLights();
486
+ for (const r of restores)
487
+ r();
488
+ await sleep(150);
489
+ }
490
+ }
491
+ }
492
+ const assessment = buildAssessment(inventory, leaveOneOut, postProcessOff, plazaLightsOff);
493
+ return {
494
+ meta: {
495
+ at: new Date().toISOString(),
496
+ purpose: options.purpose ?? 'phase-10-plaza-performance-diagnostic',
497
+ stage: 10,
498
+ sampleMs,
499
+ method: 'inventory + leave-one-out visibility + post/lights isolation',
500
+ },
501
+ device: captureRealDeviceInfo(engine),
502
+ inventory,
503
+ inventoryTotals,
504
+ baseline,
505
+ leaveOneOut,
506
+ postProcessOff,
507
+ plazaLightsOff,
508
+ emptyish,
509
+ avatarBasesAvailable,
510
+ avatarVariation: {
511
+ limitation: 'Only one public GLB base exists (demo-hoodie). Harness aliases a.glb/b.glb are the same file. No additional registered bases to spawn for Plaza consistency checks without inventing assets.',
512
+ testedBases: ['demo-hoodie'],
513
+ samples: [
514
+ {
515
+ id: 'avatar_base_demo_hoodie_only',
516
+ note: 'Local player uses demo-hoodie; multi-base variation skipped due to single shipped GLB.',
517
+ metrics: baseline,
518
+ deltaFromFull: null,
519
+ },
520
+ ],
521
+ },
522
+ assessment,
523
+ notes,
524
+ };
525
+ }
526
+ /** Attach plaza suite onto `__OYNA360_LOBBY_PERF__` (additive). */
527
+ export function attachPlazaDiag(getScene, getEngine, handle, win = window) {
528
+ const extended = handle;
529
+ extended.plazaInventory = () => inventoryPlazaSubsystems(getScene());
530
+ extended.runPlazaSuite = (options) => runPlazaDiagSuite(getScene(), getEngine(), options);
531
+ win.__OYNA360_LOBBY_PERF__ = extended;
532
+ return extended;
533
+ }
534
+ //# sourceMappingURL=lobby-plaza-diag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lobby-plaza-diag.js","sourceRoot":"","sources":["../src/lobby-plaza-diag.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,qBAAqB,GAEtB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,kBAAkB,GAGnB,MAAM,mBAAmB,CAAC;AAe3B,6DAA6D;AAC7D,MAAM,CAAC,MAAM,qBAAqB,GAAgC;IAChE,cAAc;IACd,UAAU;IACV,OAAO;IACP,QAAQ;IACR,OAAO;IACP,YAAY;IACZ,MAAM;IACN,WAAW;IACX,SAAS;IACT,aAAa;IACb,OAAO;CACC,CAAC;AAYX,SAAS,MAAM,CAAC,IAAyC;IACvD,IAAI,CAAC,GAAwC,IAAI,CAAC;IAClD,OAAO,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAChD,CAAC,GAAG,CAAC,CAAC,MAA6C,CAAC;IACtD,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,aAAa,CAAC,IAAyC;IAC9D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,CAAC,GAA+C,IAAI,CAAC;IACzD,OAAO,CAAC,EAAE,CAAC;QACT,IAAI,CAAC,CAAC,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;YACC,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ;gBACtC,CAAC,CAAE,CAAC,CAAC,MAA8C;gBACnD,CAAC,CAAC,IAAI,CAAC;IACb,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,iBAAiB,CAAC,IAAkB;IAClD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC;IAE3C,IACE,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;QACvB,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACxB,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;QAC1B,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;QAC1B,IAAI,KAAK,kBAAkB;QAC3B,SAAS,CAAC,IAAI,CACZ,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;YACnB,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACpB,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;YACtB,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;YACtB,CAAC,KAAK,kBAAkB,CAC3B,EACD,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3F,MAAM,WAAW,GACf,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,cAAc,IAAI,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACtE,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa;QAC9B,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IAErC,IAAI,QAAQ;QAAE,OAAO,MAAM,CAAC;IAC5B,IAAI,WAAW;QAAE,OAAO,SAAS,CAAC;IAElC,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAAE,OAAO,OAAO,CAAC;IAC/F,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAAE,OAAO,OAAO,CAAC;IAC/F,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QAAE,OAAO,YAAY,CAAC;IAC5E,IACE,SAAS,CAAC,IAAI,CACZ,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC;QACrB,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC;QACrB,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC;QACrB,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC;QACrB,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CACzB,EACD,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,cAAc,CAAC;QAAE,OAAO,UAAU,CAAC;IAEhG,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,aAAa,CAAC;IAE5C,IACE,IAAI,KAAK,cAAc;QACvB,IAAI,KAAK,gBAAgB;QACzB,IAAI,KAAK,YAAY;QACrB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QACxB,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAC7B,CAAC;QACD,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,IAAI,KAAK,cAAc;QAAE,OAAO,UAAU,CAAC;IAC/E,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,OAAO,CAAC;IAC9E,IACE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QACxB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QACxB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QACxB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QACxB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EACzB,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,OAAO,CAAC;IAC9E,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,YAAY,CAAC;IAExD,yDAAyD;IACzD,IAAI,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IACpF,IAAI,QAAQ,KAAK,cAAc,IAAI,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAEpF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,UAAU,CAAC,IAAkB;IACpC,IAAI,IAAI,CAAC,UAAU,EAAE;QAAE,OAAO,KAAK,CAAC;IACpC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/F,MAAM,CAAC,GAAG,OAAO,IAAI,CAAC,gBAAgB,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,IAAkB;IAClC,MAAM,CAAC,GAAG,OAAO,IAAI,CAAC,gBAAgB,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACpF,MAAM,GAAG,GAAG,OAAO,IAAI,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7E,IAAI,GAAG,EAAE,MAAM;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACnD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAY;IACnD,MAAM,OAAO,GAAG,IAAI,GAAG,EAA6C,CAAC;IACrE,MAAM,MAAM,GAAG,CAAC,EAAoB,EAAE,EAAE;QACtC,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,CAAC,GAAG;gBACF,EAAE;gBACF,SAAS,EAAE,CAAC;gBACZ,eAAe,EAAE,CAAC;gBAClB,cAAc,EAAE,CAAC;gBACjB,YAAY,EAAE,CAAC;gBACf,WAAW,EAAE,CAAC;gBACd,WAAW,EAAE,EAAE;aAChB,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACrB,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;IAEF,KAAK,MAAM,EAAE,IAAI,qBAAqB;QAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IAEnD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAiC,CAAC;IAE3D,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,UAAU,EAAE;YAAE,SAAS;QAChC,MAAM,EAAE,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;QACrB,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;YAAE,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5D,MAAM,CAAC,GAAG,OAAO,IAAI,CAAC,gBAAgB,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACpF,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QACrB,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC;YACvB,CAAC,CAAC,cAAc,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;YACnC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC;YACpB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC;YACnG,IAAI,GAAG,EAAE,CAAC;gBACR,IAAI,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC5B,IAAI,CAAC,GAAG,EAAE,CAAC;oBACT,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;oBAChB,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;gBACzB,CAAC;gBACD,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,SAAS,EAAE,CAAC;QAClC,MAAM,CAAC,EAAE,CAAC,CAAC,WAAW,GAAG,GAAG,CAAC,IAAI,CAAC;IACpC,CAAC;IAED,OAAO,qBAAqB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AACvD,CAAC;AAiBD,SAAS,iBAAiB,CAAC,IAAY;IACrC,OAAO,CACL,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAC9B,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAC9B,IAAI,KAAK,gBAAgB;QACzB,IAAI,CAAC,UAAU,CAAC,6BAA6B,CAAC,CAC/C,CAAC;AACJ,CAAC;AAED,SAAS,yBAAyB,CAAC,KAAY,EAAE,EAAoB,EAAE,OAAgB;IACrF,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,UAAU,EAAE;YAAE,SAAS;QAChC,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE;YAAE,SAAS;QAC7C,KAAK,CAAC,IAAI,CAAC;YACT,IAAI;YACJ,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE;YACzB,OAAO,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK;YACjC,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,CAAC;SACjC,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;QACzB,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,GAAG,EAAE;QACV,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE;gBAAE,SAAS;YAClC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,OAAO,CAAC;YAC7B,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;QACnC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,0BAA0B,CAAC,KAAY,EAAE,OAAgB;IAChE,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;YAAE,SAAS;QACnD,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAClD,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,GAAG,EAAE;QACV,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC;gBACH,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAChC,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY;YACd,CAAC;QACH,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,0BAA0B,CAAC,KAAY,EAAE,OAAgB;IAChE,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAGjC,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;IAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;IAEhC,MAAM,IAAI,GAAa;QACrB,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;QAC3C,YAAY,EAAE,EAAE,IAAI,OAAO,EAAE,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI;QACjF,WAAW,EAAE,EAAE,IAAI,OAAO,EAAE,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI;KAC/E,CAAC;IAEF,IAAI,IAAI;QAAE,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,IAAI,EAAE,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI;QAAE,EAAE,CAAC,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC;IAC3F,IAAI,EAAE,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,IAAI,CAAC,OAAO;QAAE,EAAE,CAAC,WAAW,GAAG,KAAK,CAAC;IAEvE,OAAO,GAAG,EAAE;QACV,IAAI,IAAI,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI;YAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC;QAC5E,IAAI,EAAE,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI;YAAE,EAAE,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACzE,IAAI,EAAE,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI;YAAE,EAAE,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;IACxE,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,aAAa,CAAC,CAA4B;IACjD,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,OAAO;QACL,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM;QACvB,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,cAAc;QACjC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,cAAc;QACjC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,cAAc;QACjC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,cAAc;QACjC,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,IAAI,IAAI;QACpD,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,IAAI,IAAI;QACpD,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,IAAI,IAAI;QACpD,YAAY,EAAE,CAAC,CAAC,WAAW,CAAC,oBAAoB;QAChD,SAAS,EAAE,CAAC,CAAC,WAAW,CAAC,mBAAmB;QAC5C,QAAQ,EAAE,CAAC,CAAC,WAAW,CAAC,iBAAiB;QACzC,SAAS,EAAE,CAAC,CAAC,WAAW,CAAC,kBAAkB;QAC3C,QAAQ,EAAE,CAAC,CAAC,WAAW,CAAC,iBAAiB;QACzC,SAAS,EAAE,CAAC,CAAC,WAAW,CAAC,kBAAkB;QAC3C,KAAK,EAAE,CAAC,CAAC,WAAW,CAAC,cAAc;QACnC,eAAe,EAAE,CAAC,CAAC,WAAW,CAAC,oBAAoB;KACpD,CAAC;AACJ,CAAC;AA4CD,SAAS,KAAK,CACZ,IAAsC,EACtC,KAAuC;IAEvC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACjC,MAAM,GAAG,GAAG,CAAC,CAA4B,EAAE,CAA4B,EAAE,EAAE,CACzE,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACxC,OAAO;QACL,YAAY,EAAE,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,YAAY,CAAC;QACxD,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC;QAC/C,cAAc,EAAE,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,cAAc,CAAC;QAC9D,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC;KAC7C,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CACtB,SAAoC,EACpC,WAA8B,EAC9B,IAA4B,EAC5B,MAA8B;IAE9B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,QAAQ,GAAG,CAAC,GAAG,SAAS,CAAC;SAC5B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC;SACpC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC7E,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,OAAO,EAAE,CAAC;QACZ,QAAQ,CAAC,IAAI,CACX,cAAc,OAAO,CAAC,EAAE,SAAS,OAAO,CAAC,eAAe,IAAI,WAAW,mBAAmB,CAAC,CAAC,GAAG,GAAG,OAAO,CAAC,eAAe,CAAC,GAAG,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,OAAO,CAAC,cAAc,QAAQ,CAC3L,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,IAAI,EAAE,CAAC;QACT,QAAQ,CAAC,IAAI,CACX,iBAAiB,IAAI,CAAC,EAAE,SAAS,IAAI,CAAC,eAAe,oBAAoB,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CACtI,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,GAAG,WAAW,CAAC;SAC9B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,cAAc,IAAI,IAAI,CAAC;SACtD,IAAI,CACH,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,aAAc,CAAC,cAAc,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,aAAc,CAAC,cAAc,IAAI,CAAC,CAAC,CAC1F,CAAC;IACJ,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,OAAO,EAAE,aAAa,EAAE,cAAc,IAAI,IAAI,EAAE,CAAC;QACnD,QAAQ,CAAC,IAAI,CACX,wCAAwC,OAAO,CAAC,EAAE,4BAA4B,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,OAAO,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CACtM,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,QAAQ,EAAE,aAAa,EAAE,cAAc,IAAI,IAAI,EAAE,CAAC;QACpD,QAAQ,CAAC,IAAI,CACX,qBAAqB,QAAQ,CAAC,EAAE,mBAAmB,QAAQ,CAAC,aAAa,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CACzG,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,EAAE,aAAa,EAAE,cAAc,IAAI,IAAI,EAAE,CAAC;QAChD,QAAQ,CAAC,IAAI,CACX,mCAAmC,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CACrF,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,EAAE,aAAa,EAAE,cAAc,IAAI,IAAI,EAAE,CAAC;QAClD,QAAQ,CAAC,IAAI,CACX,yCAAyC,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC7F,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GACX,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,cAAc,IAAI,CAAC,CAAC,GAAG,IAAI;QAC5D,CAAC,CAAC,OAAO,CAAC,EAAE;QACZ,CAAC,CAAC,OAAO,EAAE,EAAE,IAAI,SAAS,CAAC;IAC/B,IAAI,SAAS,GAAG,QAAQ,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,IAAI,SAAS,CAAC;IACtD,IACE,IAAI,EAAE,aAAa,EAAE,cAAc,IAAI,IAAI;QAC3C,CAAC,IAAI,CAAC,aAAa,CAAC,cAAc,IAAI,CAAC,CAAC;YACtC,CAAC,QAAQ,EAAE,aAAa,EAAE,cAAc,IAAI,CAAC,QAAQ,CAAC,EACxD,CAAC;QACD,SAAS,GAAG,yBAAyB,CAAC;IACxC,CAAC;IACD,IACE,MAAM,EAAE,aAAa,EAAE,cAAc,IAAI,IAAI;QAC7C,CAAC,MAAM,CAAC,aAAa,CAAC,cAAc,IAAI,CAAC,CAAC;YACxC,CAAC,QAAQ,EAAE,aAAa,EAAE,cAAc,IAAI,CAAC,QAAQ,CAAC;QACxD,SAAS,KAAK,yBAAyB,EACvC,CAAC;QACD,uEAAuE;QACvE,IACE,CAAC,IAAI;YACL,CAAC,MAAM,CAAC,aAAa,CAAC,cAAc,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,IAAI,CAAC,CAAC,EACvF,CAAC;YACD,SAAS,GAAG,oBAAoB,CAAC;QACnC,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,IAAI,OAAO,CAAC,eAAe,GAAG,WAAW,IAAI,IAAI,CAAC;IAC9E,MAAM,aAAa,GACjB,OAAO,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC;IAC/E,MAAM,UAAU,GACd,YAAY,IAAI,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,IAAI,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;IAEtF,OAAO;QACL,0BAA0B,EAAE,OAAO;QACnC,4BAA4B,EAAE,SAAS;QACvC,QAAQ;QACR,UAAU;KACX,CAAC;AACJ,CAAC;AASD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAAY,EACZ,MAAc,EACd,UAAiC,EAAE;IAEnC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC;IAC1C,MAAM,KAAK,GAAa;QACtB,mGAAmG;QACnG,0FAA0F;QAC1F,2GAA2G;KAC5G,CAAC;IAEF,MAAM,SAAS,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,eAAe,GAAG;QACtB,YAAY,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QAClE,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;QAC9D,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;KAC1D,CAAC;IACF,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;IACzD,IAAI,QAAQ,IAAI,QAAQ,CAAC,eAAe,GAAG,EAAE,EAAE,CAAC;QAC9C,KAAK,CAAC,IAAI,CACR,kCAAkC,QAAQ,CAAC,eAAe,4BAA4B,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAC1H,CAAC;IACJ,CAAC;IAED,MAAM,oBAAoB,GAAG;QAC3B;YACE,EAAE,EAAE,aAAa;YACjB,MAAM,EAAE,+BAA+B;YACvC,IAAI,EAAE,4DAA4D;SACnE;KACF,CAAC;IAEF,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IACjB,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;IACnF,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;IAE3C,MAAM,WAAW,GAAsB,EAAE,CAAC;IAC1C,IAAI,cAAc,GAA2B,IAAI,CAAC;IAClD,IAAI,cAAc,GAA2B,IAAI,CAAC;IAClD,IAAI,QAAQ,GAA2B,IAAI,CAAC;IAE5C,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAuB;YACpC,QAAQ;YACR,OAAO;YACP,OAAO;YACP,YAAY;YACZ,UAAU;YACV,cAAc;YACd,MAAM;YACN,WAAW;YACX,SAAS;SACV,CAAC;QAEF,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC;YACvD,IAAI,GAAG,IAAI,GAAG,CAAC,eAAe,KAAK,CAAC,IAAI,GAAG,CAAC,SAAS,KAAK,CAAC,EAAE,CAAC;gBAC5D,WAAW,CAAC,IAAI,CAAC;oBACf,EAAE;oBACF,IAAI,EAAE,uCAAuC;oBAC7C,SAAS,EAAE,GAAG;oBACd,OAAO,EAAE,IAAI;oBACb,aAAa,EAAE,IAAI;iBACpB,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YACD,MAAM,OAAO,GAAG,yBAAyB,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;YAC5D,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;gBACjB,MAAM,MAAM,GAAG,aAAa,CAC1B,MAAM,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,EAAE,QAAQ,CAAC,CACtE,CAAC;gBACF,WAAW,CAAC,IAAI,CAAC;oBACf,EAAE;oBACF,IAAI,EAAE,uBAAuB,EAAE,OAAO;oBACtC,SAAS,EAAE,GAAG;oBACd,OAAO,EAAE,MAAM;oBACf,aAAa,EAAE,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC;iBACvC,CAAC,CAAC;YACL,CAAC;oBAAS,CAAC;gBACT,OAAO,EAAE,CAAC;gBACV,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;QAED,CAAC;YACC,MAAM,OAAO,GAAG,0BAA0B,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACzD,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;gBACjB,MAAM,MAAM,GAAG,aAAa,CAC1B,MAAM,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,QAAQ,CAAC,CACpE,CAAC;gBACF,cAAc,GAAG;oBACf,EAAE,EAAE,yBAAyB;oBAC7B,IAAI,EAAE,oDAAoD;oBAC1D,OAAO,EAAE,MAAM;oBACf,aAAa,EAAE,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC;iBACvC,CAAC;YACJ,CAAC;oBAAS,CAAC;gBACT,OAAO,EAAE,CAAC;gBACV,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;QAED,CAAC;YACC,MAAM,OAAO,GAAG,0BAA0B,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACzD,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;gBACjB,MAAM,MAAM,GAAG,aAAa,CAC1B,MAAM,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,QAAQ,CAAC,CACtE,CAAC;gBACF,cAAc,GAAG;oBACf,EAAE,EAAE,oBAAoB;oBACxB,IAAI,EAAE,2EAA2E;oBACjF,OAAO,EAAE,MAAM;oBACf,aAAa,EAAE,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC;iBACvC,CAAC;YACJ,CAAC;oBAAS,CAAC;gBACT,OAAO,EAAE,CAAC;gBACV,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;QAED,CAAC;YACC,MAAM,QAAQ,GACZ;gBACE,QAAQ;gBACR,OAAO;gBACP,OAAO;gBACP,YAAY;gBACZ,UAAU;gBACV,cAAc;gBACd,MAAM;gBACN,WAAW;gBACX,SAAS;aAEZ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,yBAAyB,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;YAC3D,MAAM,aAAa,GAAG,0BAA0B,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC/D,MAAM,WAAW,GAAG,0BAA0B,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC7D,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;gBACjB,MAAM,MAAM,GAAG,aAAa,CAC1B,MAAM,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,QAAQ,CAAC,CACpE,CAAC;gBACF,QAAQ,GAAG;oBACT,EAAE,EAAE,oBAAoB;oBACxB,IAAI,EAAE,wFAAwF;oBAC9F,OAAO,EAAE,MAAM;oBACf,aAAa,EAAE,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC;iBACvC,CAAC;YACJ,CAAC;oBAAS,CAAC;gBACT,WAAW,EAAE,CAAC;gBACd,aAAa,EAAE,CAAC;gBAChB,KAAK,MAAM,CAAC,IAAI,QAAQ;oBAAE,CAAC,EAAE,CAAC;gBAC9B,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,eAAe,CAAC,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;IAE3F,OAAO;QACL,IAAI,EAAE;YACJ,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,uCAAuC;YACnE,KAAK,EAAE,EAAE;YACT,QAAQ;YACR,MAAM,EAAE,8DAA8D;SACvE;QACD,MAAM,EAAE,qBAAqB,CAAC,MAAM,CAAC;QACrC,SAAS;QACT,eAAe;QACf,QAAQ;QACR,WAAW;QACX,cAAc;QACd,cAAc;QACd,QAAQ;QACR,oBAAoB;QACpB,eAAe,EAAE;YACf,UAAU,EACR,8LAA8L;YAChM,WAAW,EAAE,CAAC,aAAa,CAAC;YAC5B,OAAO,EAAE;gBACP;oBACE,EAAE,EAAE,8BAA8B;oBAClC,IAAI,EAAE,wFAAwF;oBAC9F,OAAO,EAAE,QAAQ;oBACjB,aAAa,EAAE,IAAI;iBACpB;aACF;SACF;QACD,UAAU;QACV,KAAK;KACN,CAAC;AACJ,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,eAAe,CAC7B,QAAqB,EACrB,SAAuB,EACvB,MAA2B,EAC3B,MAAc,MAAM;IAEpB,MAAM,QAAQ,GAAG,MAGhB,CAAC;IACF,QAAQ,CAAC,cAAc,GAAG,GAAG,EAAE,CAAC,wBAAwB,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrE,QAAQ,CAAC,aAAa,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;IACzF,GAA6D,CAAC,sBAAsB,GAAG,QAAQ,CAAC;IACjG,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { PlatformLobby } from './platform-lobby';
2
+ import { type LobbyUiMessages } from './lobby-ui-i18n';
3
+ export declare function attachLobbyPresenceUi(lobby: PlatformLobby, messages?: Partial<LobbyUiMessages>): () => void;
4
+ //# sourceMappingURL=lobby-presence-ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lobby-presence-ui.d.ts","sourceRoot":"","sources":["../src/lobby-presence-ui.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGtD,OAAO,EAA0B,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAK/E,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,aAAa,EACpB,QAAQ,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAClC,MAAM,IAAI,CA6CZ"}
@@ -0,0 +1,89 @@
1
+ import { LOBBY_UI_FONT } from './lobby-font';
2
+ import { formatPlayerHandle } from './player-label';
3
+ import { resolveLobbyUiMessages } from './lobby-ui-i18n';
4
+ const MAX_ITEMS = 5;
5
+ const ITEM_MS = 4500;
6
+ export function attachLobbyPresenceUi(lobby, messages) {
7
+ const copy = resolveLobbyUiMessages(lobby.getUiLocale(), messages);
8
+ const root = ensurePresenceRoot(lobby);
9
+ const timers = new Set();
10
+ const push = (text, kind) => {
11
+ const item = document.createElement('div');
12
+ item.dataset.kind = kind;
13
+ item.textContent = text;
14
+ item.style.cssText = [
15
+ 'padding:7px 11px',
16
+ 'border-radius:10px',
17
+ `font:12px/1.45 ${LOBBY_UI_FONT}`,
18
+ 'color:#fff',
19
+ 'background:rgba(8,8,20,.82)',
20
+ 'border:1px solid',
21
+ kind === 'join' ? 'border-color:rgba(74,222,128,.45)' : 'border-color:rgba(248,113,113,.45)',
22
+ 'box-shadow:0 8px 18px rgba(0,0,0,.28)',
23
+ 'animation:oynaLobbyPresenceIn .22s ease-out',
24
+ ].join(';');
25
+ root.prepend(item);
26
+ while (root.childElementCount > MAX_ITEMS)
27
+ root.lastElementChild?.remove();
28
+ const timer = window.setTimeout(() => {
29
+ item.remove();
30
+ timers.delete(timer);
31
+ }, ITEM_MS);
32
+ timers.add(timer);
33
+ };
34
+ const offJoin = lobby.on('playerJoined', ({ displayName, username }) => {
35
+ push(`${formatPlayerHandle(displayName, username)} ${copy.presenceJoined}`, 'join');
36
+ });
37
+ const offLeave = lobby.on('playerLeft', ({ displayName, username }) => {
38
+ push(`${formatPlayerHandle(displayName, username)} ${copy.presenceLeft}`, 'leave');
39
+ });
40
+ return () => {
41
+ for (const timer of timers)
42
+ window.clearTimeout(timer);
43
+ timers.clear();
44
+ offJoin();
45
+ offLeave();
46
+ if (root.dataset.lobbyPresenceDynamic === '1')
47
+ root.remove();
48
+ else
49
+ root.replaceChildren();
50
+ };
51
+ }
52
+ function ensurePresenceRoot(lobby) {
53
+ const existing = document.getElementById('oyna-lobby-presence');
54
+ if (existing)
55
+ return existing;
56
+ const root = document.createElement('div');
57
+ root.id = 'oyna-lobby-presence';
58
+ root.dataset.lobbyPresenceDynamic = '1';
59
+ root.setAttribute('aria-live', 'polite');
60
+ root.style.cssText = [
61
+ 'position:absolute',
62
+ 'top:72px',
63
+ 'right:14px',
64
+ 'left:auto',
65
+ 'z-index:19',
66
+ 'display:flex',
67
+ 'flex-direction:column',
68
+ 'align-items:flex-end',
69
+ 'gap:6px',
70
+ 'max-width:min(260px,42vw)',
71
+ 'pointer-events:none',
72
+ 'direction:rtl',
73
+ ].join(';');
74
+ const mount = document.getElementById('oyna-lobby-hud') ??
75
+ lobby.getEngine().getRenderingCanvas()?.parentElement ??
76
+ document.body;
77
+ mount.append(root);
78
+ injectPresenceKeyframes();
79
+ return root;
80
+ }
81
+ function injectPresenceKeyframes() {
82
+ if (document.getElementById('oyna-lobby-presence-style'))
83
+ return;
84
+ const style = document.createElement('style');
85
+ style.id = 'oyna-lobby-presence-style';
86
+ style.textContent = `@keyframes oynaLobbyPresenceIn{from{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}`;
87
+ document.head.append(style);
88
+ }
89
+ //# sourceMappingURL=lobby-presence-ui.js.map