xonecode 0.31.0 → 0.34.2

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 (133) hide show
  1. package/apps/web/dist/assets/{EditorDeFichero-ChyJtiiz.js → EditorDeFichero-Cj0knNmP.js} +1 -1
  2. package/apps/web/dist/assets/index-Ga8fTlWp.js +499 -0
  3. package/apps/web/dist/assets/{index-IptObD2z.css → index-R3kXj69E.css} +1 -1
  4. package/apps/web/dist/assets/{php-B91ZcS-9.js → php-MVUx_K96.js} +1 -1
  5. package/apps/web/dist/assets/{ruby-DrxrTSz0.js → ruby-n-r-AXdi.js} +1 -1
  6. package/apps/web/dist/index.html +2 -2
  7. package/dist/agent/config/fuentesEnRed.js +80 -0
  8. package/dist/agent/config/fuentesEnRed.js.map +1 -0
  9. package/dist/agent/config/modelosDeMotor.js +4 -2
  10. package/dist/agent/config/modelosDeMotor.js.map +1 -1
  11. package/dist/agent/config/settingsEnDisco.js +26 -0
  12. package/dist/agent/config/settingsEnDisco.js.map +1 -1
  13. package/dist/agent/dispositivos/cajasDeMaqueta.js +218 -0
  14. package/dist/agent/dispositivos/cajasDeMaqueta.js.map +1 -0
  15. package/dist/agent/dispositivos/geometriaEnDisco.js +107 -0
  16. package/dist/agent/dispositivos/geometriaEnDisco.js.map +1 -0
  17. package/dist/agent/dispositivos/juezVisual.js +84 -3
  18. package/dist/agent/dispositivos/juezVisual.js.map +1 -1
  19. package/dist/agent/grafo/criticaVisual.js +246 -11
  20. package/dist/agent/grafo/criticaVisual.js.map +1 -1
  21. package/dist/agent/grafo/fuentesDeGoogle.js +133 -0
  22. package/dist/agent/grafo/fuentesDeGoogle.js.map +1 -0
  23. package/dist/agent/grafo/incorporarAdjunto.js +52 -42
  24. package/dist/agent/grafo/incorporarAdjunto.js.map +1 -1
  25. package/dist/agent/grafo/lectorDeReferencias.js +21 -0
  26. package/dist/agent/grafo/lectorDeReferencias.js.map +1 -1
  27. package/dist/agent/grafo/perfiles.js +2 -0
  28. package/dist/agent/grafo/perfiles.js.map +1 -1
  29. package/dist/agent/motores/motoresLocales.js +429 -0
  30. package/dist/agent/motores/motoresLocales.js.map +1 -0
  31. package/dist/agent/motores/trueforge/capacidades.js +9 -6
  32. package/dist/agent/motores/trueforge/capacidades.js.map +1 -1
  33. package/dist/agent/motores/trueforge/informesDeHijos.js +39 -7
  34. package/dist/agent/motores/trueforge/informesDeHijos.js.map +1 -1
  35. package/dist/agent/motores/trueforge/memoriaDeEspecialistas.js +75 -37
  36. package/dist/agent/motores/trueforge/memoriaDeEspecialistas.js.map +1 -1
  37. package/dist/agent/motores/trueforge/memoriaTrueforge.js +24 -4
  38. package/dist/agent/motores/trueforge/memoriaTrueforge.js.map +1 -1
  39. package/dist/agent/motores/trueforge/modeloLangchain.js +28 -4
  40. package/dist/agent/motores/trueforge/modeloLangchain.js.map +1 -1
  41. package/dist/agent/motores/trueforge/proponerTareas.js +67 -0
  42. package/dist/agent/motores/trueforge/proponerTareas.js.map +1 -0
  43. package/dist/agent/motores/trueforge/sesionTrueforge.js +133 -13
  44. package/dist/agent/motores/trueforge/sesionTrueforge.js.map +1 -1
  45. package/dist/agent/motores/trueforge/toolsDeFichero.js +24 -6
  46. package/dist/agent/motores/trueforge/toolsDeFichero.js.map +1 -1
  47. package/dist/agent/sesiones/adjuntosDeSesion.js +192 -5
  48. package/dist/agent/sesiones/adjuntosDeSesion.js.map +1 -1
  49. package/dist/agent/subagentes/agentesEnDisco.js +12 -4
  50. package/dist/agent/subagentes/agentesEnDisco.js.map +1 -1
  51. package/dist/agent/subagentes/ejecutableEnWindows.js +139 -0
  52. package/dist/agent/subagentes/ejecutableEnWindows.js.map +1 -0
  53. package/dist/agent/subagentes/subagenteCodex.js +7 -2
  54. package/dist/agent/subagentes/subagenteCodex.js.map +1 -1
  55. package/dist/agent/subagentes/subagenteOpencode.js +12 -5
  56. package/dist/agent/subagentes/subagenteOpencode.js.map +1 -1
  57. package/dist/agent/tareas/aumentador.js +4 -3
  58. package/dist/agent/tareas/aumentador.js.map +1 -1
  59. package/dist/agent/turno/informeDeTraza.js +2 -1
  60. package/dist/agent/turno/informeDeTraza.js.map +1 -1
  61. package/dist/agent/turno/interrupts.js +12 -0
  62. package/dist/agent/turno/interrupts.js.map +1 -1
  63. package/dist/agent/turno/resumenDeTool.js +4 -0
  64. package/dist/agent/turno/resumenDeTool.js.map +1 -1
  65. package/dist/agent/turno/turnoReal.js +3 -0
  66. package/dist/agent/turno/turnoReal.js.map +1 -1
  67. package/dist/cli/consola.js.map +1 -1
  68. package/dist/cli/main.js +2 -0
  69. package/dist/cli/main.js.map +1 -1
  70. package/dist/cli/tui/transcript.js +5 -0
  71. package/dist/cli/tui/transcript.js.map +1 -1
  72. package/dist/core/actos.js.map +1 -1
  73. package/dist/core/adjuntos.js +10 -2
  74. package/dist/core/adjuntos.js.map +1 -1
  75. package/dist/core/agentes.js +10 -0
  76. package/dist/core/agentes.js.map +1 -1
  77. package/dist/core/analisisDeSesion.js +1 -1
  78. package/dist/core/analisisDeSesion.js.map +1 -1
  79. package/dist/core/descripcionDePantalla.js +367 -0
  80. package/dist/core/descripcionDePantalla.js.map +1 -0
  81. package/dist/core/estiloMedido.js +352 -0
  82. package/dist/core/estiloMedido.js.map +1 -0
  83. package/dist/core/fuentes.js +174 -0
  84. package/dist/core/fuentes.js.map +1 -0
  85. package/dist/core/geometriaDePantalla.js +537 -0
  86. package/dist/core/geometriaDePantalla.js.map +1 -0
  87. package/dist/core/motoresLocales.js +128 -0
  88. package/dist/core/motoresLocales.js.map +1 -0
  89. package/dist/core/notify.js +4 -0
  90. package/dist/core/notify.js.map +1 -1
  91. package/dist/core/nucleoXone.js +6 -6
  92. package/dist/core/nucleoXone.js.map +1 -1
  93. package/dist/core/ports.js +35 -0
  94. package/dist/core/ports.js.map +1 -1
  95. package/dist/core/repartoDeEncargo.js +87 -0
  96. package/dist/core/repartoDeEncargo.js.map +1 -0
  97. package/dist/core/settings.js +5 -0
  98. package/dist/core/settings.js.map +1 -1
  99. package/dist/core/shellDeAgente.js +36 -0
  100. package/dist/core/shellDeAgente.js.map +1 -1
  101. package/dist/core/tareas.js +7 -0
  102. package/dist/core/tareas.js.map +1 -1
  103. package/dist/core/turno.js +15 -0
  104. package/dist/core/turno.js.map +1 -1
  105. package/dist/core/zipDeAdjunto.js +79 -0
  106. package/dist/core/zipDeAdjunto.js.map +1 -0
  107. package/dist/web/servidor/arranque.js +201 -13
  108. package/dist/web/servidor/arranque.js.map +1 -1
  109. package/dist/web/servidor/consolaWeb.js +5 -0
  110. package/dist/web/servidor/consolaWeb.js.map +1 -1
  111. package/dist/web/servidor/interrupcion.js +52 -0
  112. package/dist/web/servidor/interrupcion.js.map +1 -0
  113. package/dist/web/servidor/pielWeb.js +36 -0
  114. package/dist/web/servidor/pielWeb.js.map +1 -1
  115. package/dist/web/servidor/transporte.js +1 -0
  116. package/dist/web/servidor/transporte.js.map +1 -1
  117. package/dist/web/servidor/vestibulo.js +30 -2
  118. package/dist/web/servidor/vestibulo.js.map +1 -1
  119. package/package.json +1 -1
  120. package/skills/xone-development/SKILL.md +2 -1
  121. package/skills/xone-development/references/css/buenas-practicas-y-parser.md +2 -1
  122. package/skills/xone-development/references/css/de-una-maqueta-a-xone.md +83 -0
  123. package/skills/xone-development/references/css/patrones-material-y-temas.md +15 -13
  124. package/skills/xone-development/references/css/propiedades-y-herencia.md +2 -2
  125. package/skills/xone-development/references/css/selectores-unidades-colores.md +8 -3
  126. package/skills/xone-development/references/indice-completo.md +1 -0
  127. package/skills/xone-development/references/xml-ui/atributos-coll-group-frame.md +4 -4
  128. package/skills/xone-development/references/xml-ui/nodos-group-y-frame.md +4 -4
  129. package/skills/xone-hotswap/lib/geometria.mjs +147 -0
  130. package/skills/xone-hotswap/scripts/xone-captura-android +6 -0
  131. package/skills/xone-hotswap/scripts/xone-hotswap +8 -0
  132. package/skills/xone-hotswap/scripts/xone-recargar-android +15 -0
  133. package/apps/web/dist/assets/index-CFIrUOmW.js +0 -499
@@ -0,0 +1,352 @@
1
+ /** Dos colores «iguales» a efectos de qué es fondo: compresión JPEG y antialias incluidos. */
2
+ const MISMO_COLOR = 28;
3
+ /**
4
+ * Un fondo PROPIO se distingue de lo de fuera con poco: una tecla #26292E sobre un panel #1C1E22 (medido en la
5
+ * calculadora) se separa unos 17 puntos, y con el umbral de «mismo color» la tecla pasaba por etiqueta sin fondo.
6
+ */
7
+ const FONDO_PROPIO = 10;
8
+ /** Lo que se aparta del fondo lo bastante para ser tinta (texto, icono). */
9
+ const TINTA = 70;
10
+ const distancia = (a, b) => Math.sqrt((a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2 + (a[2] - b[2]) ** 2);
11
+ const hex = (c) => `#${c.map((v) => Math.round(v).toString(16).padStart(2, "0")).join("").toUpperCase()}`;
12
+ function pixel(img, x, y) {
13
+ const i = (Math.min(img.alto - 1, Math.max(0, y)) * img.ancho + Math.min(img.ancho - 1, Math.max(0, x))) * 4;
14
+ return [img.datos[i], img.datos[i + 1], img.datos[i + 2]];
15
+ }
16
+ /** El color más repetido de una lista, contando en cubos de 16 niveles y devolviendo la media del cubo ganador. */
17
+ function moda(colores) {
18
+ if (colores.length === 0)
19
+ return undefined;
20
+ const cubos = new Map();
21
+ for (const c of colores) {
22
+ const k = ((c[0] >> 4) << 8) | ((c[1] >> 4) << 4) | (c[2] >> 4);
23
+ const cubo = cubos.get(k) ?? { n: 0, suma: [0, 0, 0] };
24
+ cubo.n += 1;
25
+ cubo.suma = [cubo.suma[0] + c[0], cubo.suma[1] + c[1], cubo.suma[2] + c[2]];
26
+ cubos.set(k, cubo);
27
+ }
28
+ const mejor = [...cubos.values()].sort((a, b) => b.n - a.n)[0];
29
+ return [mejor.suma[0] / mejor.n, mejor.suma[1] / mejor.n, mejor.suma[2] / mejor.n];
30
+ }
31
+ /** Las categorías de forma a partir de las cifras. Pura y exportada para el test. */
32
+ export function formaDe(radio, proporcion) {
33
+ if (radio < 0.12)
34
+ return "recta";
35
+ if (radio < 0.38)
36
+ return "redondeada";
37
+ // Extremos redondos: círculo si es tan ancho como alto, píldora si es claramente más ancho (o alto). En medio
38
+ // —las teclas de la maqueta: 1,2:1 con radio 0,48— es un cuadrado muy redondeado, no una píldora.
39
+ if (Math.abs(proporcion - 1) <= 0.08)
40
+ return "circulo";
41
+ return proporcion >= 1.3 || proporcion <= 0.77 ? "pildora" : "redondeada";
42
+ }
43
+ /** El tamaño de letra a partir de su altura (fracción del ancho de pantalla). */
44
+ export function letraDe(altura) {
45
+ if (altura < 0.03)
46
+ return "pequena";
47
+ if (altura < 0.045)
48
+ return "normal";
49
+ if (altura < 0.08)
50
+ return "grande";
51
+ return "enorme";
52
+ }
53
+ /** Mide un control. `img` es la imagen entera; `caja`, en sus píxeles. Lo que no se puede medir no se pone. */
54
+ export function medirControl(img, caja) {
55
+ const x0 = Math.max(0, Math.round(caja.x));
56
+ const y0 = Math.max(0, Math.round(caja.y));
57
+ const x1 = Math.min(img.ancho - 1, Math.round(caja.x + caja.ancho) - 1);
58
+ const y1 = Math.min(img.alto - 1, Math.round(caja.y + caja.alto) - 1);
59
+ if (x1 - x0 < 4 || y1 - y0 < 4)
60
+ return {};
61
+ // Lo de FUERA: un anillo a 3 px de la caja.
62
+ const anillo = [];
63
+ for (let x = x0; x <= x1; x += 2)
64
+ anillo.push(pixel(img, x, y0 - 3), pixel(img, x, y1 + 3));
65
+ for (let y = y0; y <= y1; y += 2)
66
+ anillo.push(pixel(img, x0 - 3, y), pixel(img, x1 + 3, y));
67
+ const fuera = moda(anillo);
68
+ const dentro = [];
69
+ for (let y = y0; y <= y1; y += 1)
70
+ for (let x = x0; x <= x1; x += 1)
71
+ dentro.push(pixel(img, x, y));
72
+ const medido = {};
73
+ // El FONDO propio: el color más repetido, si no es lo de fuera.
74
+ const masRepetido = moda(dentro);
75
+ const conFondo = distancia(masRepetido, fuera) > FONDO_PROPIO;
76
+ const fondo = conFondo ? masRepetido : fuera;
77
+ if (conFondo)
78
+ medido.fondo = hex(fondo);
79
+ // El rectángulo del FONDO y su forma.
80
+ let fx0 = x0;
81
+ let fy0 = y0;
82
+ let fx1 = x1;
83
+ let fy1 = y1;
84
+ /**
85
+ * Qué es «del fondo» al buscar su forma: la mitad del contraste entre el fondo y lo de fuera. Con un umbral fijo,
86
+ * una tecla #282A2E sobre un panel #1F2125 (medido en la maqueta de la calculadora) se confundía con él y su esquina
87
+ * redondeada salía recta.
88
+ */
89
+ const delFondo = Math.max(6, Math.min(MISMO_COLOR, distancia(fondo, fuera) / 2));
90
+ if (conFondo) {
91
+ [fx0, fy0, fx1, fy1] = [x1, y1, x0, y0];
92
+ for (let y = y0; y <= y1; y += 1)
93
+ for (let x = x0; x <= x1; x += 1)
94
+ if (distancia(pixel(img, x, y), fondo) <= delFondo) {
95
+ fx0 = Math.min(fx0, x);
96
+ fx1 = Math.max(fx1, x);
97
+ fy0 = Math.min(fy0, y);
98
+ fy1 = Math.max(fy1, y);
99
+ }
100
+ const ancho = fx1 - fx0 + 1;
101
+ const alto = fy1 - fy0 + 1;
102
+ // Cuánto se come la esquina: por la diagonal desde cada esquina, hasta el primer píxel de fondo. En un arco de
103
+ // radio r, la diagonal llega a d = r·(1 − 1/√2).
104
+ const esquinas = [
105
+ [fx0, fy0, 1, 1],
106
+ [fx1, fy0, -1, 1],
107
+ [fx0, fy1, 1, -1],
108
+ [fx1, fy1, -1, -1],
109
+ ];
110
+ const radios = esquinas.map(([ex, ey, dx, dy]) => {
111
+ let d = 0;
112
+ while (d < Math.min(ancho, alto) / 2 && distancia(pixel(img, ex + dx * d, ey + dy * d), fondo) > delFondo)
113
+ d += 1;
114
+ return d / (1 - Math.SQRT1_2);
115
+ });
116
+ const radio = radios.sort((a, b) => a - b)[1] / Math.min(ancho, alto);
117
+ medido.radio = Math.round(Math.min(radio, 0.5) * 100) / 100;
118
+ medido.proporcion = Math.round((ancho / alto) * 100) / 100;
119
+ medido.forma = formaDe(medido.radio, medido.proporcion);
120
+ }
121
+ // El BORDE: los lados de la caja son una línea de otro color que lo de dentro, en tres de los cuatro lados.
122
+ /** Un lado es una LÍNEA si, en alguna de las tres primeras filas hacia dentro, casi todo es de un color distinto. */
123
+ /**
124
+ * Un lado es una LÍNEA FINA: casi todo de un color distinto del fondo y de lo de fuera, y tres píxeles más afuera
125
+ * (`afuera`: hacia dónde es fuera, en x e y) vuelve a verse lo de fuera. Sin esto último, el halo de un botón con
126
+ * resplandor contaba como borde (medido: la «=» de la maqueta).
127
+ */
128
+ const lado = (puntos, afuera) => {
129
+ const colores = puntos.map(([x, y]) => pixel(img, x, y));
130
+ const linea = moda(colores);
131
+ const iguales = colores.filter((c) => distancia(c, linea) <= MISMO_COLOR).length / colores.length;
132
+ if (iguales <= 0.7 || distancia(linea, fondo) <= MISMO_COLOR || distancia(linea, fuera) <= MISMO_COLOR)
133
+ return false;
134
+ const masAfuera = puntos.filter(([x, y]) => distancia(pixel(img, x + 3 * afuera[0], y + 3 * afuera[1]), fuera) <= MISMO_COLOR).length;
135
+ return masAfuera / puntos.length > 0.7;
136
+ };
137
+ const tramo = (a, b) => Array.from({ length: Math.max(1, Math.floor((b - a) * 0.6)) }, (_, i) => Math.round(a + (b - a) * 0.2 + i));
138
+ const [bx0, by0, bx1, by1] = conFondo ? [fx0, fy0, fx1, fy1] : [x0, y0, x1, y1];
139
+ const lados = [0, 1, 2, 3].filter((cual) =>
140
+ // La línea puede caer justo FUERA del rectángulo del relleno (este se mide por el color del fondo, y el contorno es
141
+ // de otro color) o justo dentro: se busca a los dos lados.
142
+ [-3, -2, -1, 0, 1, 2].some((hacia) => {
143
+ if (cual === 0)
144
+ return lado(tramo(bx0, bx1).map((x) => [x, by0 + hacia]), [0, -1]);
145
+ if (cual === 1)
146
+ return lado(tramo(bx0, bx1).map((x) => [x, by1 - hacia]), [0, 1]);
147
+ if (cual === 2)
148
+ return lado(tramo(by0, by1).map((y) => [bx0 + hacia, y]), [-1, 0]);
149
+ return lado(tramo(by0, by1).map((y) => [bx1 - hacia, y]), [1, 0]);
150
+ })).length;
151
+ // En una píldora los lados cortos son arcos enteros: basta con los dos largos.
152
+ medido.borde = lados >= ((medido.radio ?? 0) >= 0.38 ? 2 : 3);
153
+ // La TINTA: lejos del fondo y de lo de fuera. Con borde, su franja no es tinta.
154
+ /**
155
+ * Con borde, su franja no es tinta; y si las esquinas son redondeadas, tampoco su ARCO: los píxeles suavizados de
156
+ * una línea curva no se parecen al color de la línea y entraban como texto que medía todo el alto (medido en las
157
+ * teclas de la calculadora). Todo punto del arco cae a menos de r·(1 − 1/√2) ≈ 0,3·r de algún lado.
158
+ */
159
+ const arco = medido.radio === undefined ? 0 : Math.ceil(0.3 * medido.radio * Math.min(x1 - x0, y1 - y0));
160
+ // En un control con fondo, 6 px más el arco: la compresión JPEG deja un halo junto a una línea fina y brillante. En
161
+ // una etiqueta sin fondo —donde se mide el recorte— basta la línea: un texto cortado justo encima de su borde
162
+ // inferior tiene que seguir llegando al límite (medido: el «12 + 3» del visor).
163
+ const margen = !medido.borde ? 0 : conFondo ? 6 + arco : 1;
164
+ // Desde el rectángulo del FONDO si lo hay: la caja del árbol puede ser mayor que lo dibujado.
165
+ const [ix0, iy0, ix1, iy1] = [bx0 + margen, by0 + margen, bx1 - margen, by1 - margen];
166
+ // La tinta, como máscara.
167
+ const anchoI = Math.max(0, ix1 - ix0 + 1);
168
+ const altoI = Math.max(0, iy1 - iy0 + 1);
169
+ const esTinta = new Uint8Array(anchoI * altoI);
170
+ const porColumna = new Uint32Array(anchoI);
171
+ const porFilaN = new Uint32Array(altoI);
172
+ for (let y = iy0; y <= iy1; y += 1)
173
+ for (let x = ix0; x <= ix1; x += 1) {
174
+ const p = pixel(img, x, y);
175
+ if (distancia(p, fondo) <= TINTA || distancia(p, fuera) <= TINTA)
176
+ continue;
177
+ esTinta[(y - iy0) * anchoI + (x - ix0)] = 1;
178
+ porColumna[x - ix0] += 1;
179
+ porFilaN[y - iy0] += 1;
180
+ }
181
+ /**
182
+ * Una LÍNEA no es texto: una columna con tinta en casi todo el alto (el lado de un contorno) o una fila con tinta en
183
+ * casi todo el ancho (su tapa) se quita. Hace falta aunque no se haya detectado el borde: medido, un contorno tenue
184
+ * sobre una tecla poco contrastada no se detectaba y sus lados hacían medir a la letra todo el alto de la tecla.
185
+ */
186
+ const lineaVertical = (cx) => porColumna[cx] > altoI * 0.8;
187
+ const lineaHorizontal = (cy) => porFilaN[cy] > anchoI * 0.8;
188
+ const porFila = new Map();
189
+ for (let cy = 0; cy < altoI; cy += 1) {
190
+ if (lineaHorizontal(cy))
191
+ continue;
192
+ for (let cx = 0; cx < anchoI; cx += 1) {
193
+ if (esTinta[cy * anchoI + cx] !== 1 || lineaVertical(cx))
194
+ continue;
195
+ const [x, y] = [ix0 + cx, iy0 + cy];
196
+ const fila = porFila.get(y) ?? { colores: [], x0: x, x1: x };
197
+ fila.colores.push(pixel(img, x, y));
198
+ fila.x1 = x;
199
+ porFila.set(y, fila);
200
+ }
201
+ }
202
+ /**
203
+ * El TEXTO es el bloque continuo de filas con más tinta (huecos de hasta 3 filas: la «i», el «=»). Lo que sobra de un
204
+ * contorno, unos pocos píxeles sueltos lejos del texto, forma bloques aparte y no estira la altura de la letra
205
+ * (medido: una tecla «8» con borde redondeado medía cuatro veces su letra).
206
+ */
207
+ const bloques = [];
208
+ // Una fila con solo un par de píxeles de tinta (lo que deja un contorno tenue en cada lado) no es texto, y no puede
209
+ // unir el texto con la tapa y el pie de la caja.
210
+ const minimo = Math.max(4, Math.round(anchoI * 0.02));
211
+ for (const y of [...porFila.keys()].sort((a, b) => a - b)) {
212
+ const ultimo = bloques[bloques.length - 1];
213
+ const n = porFila.get(y).colores.length;
214
+ if (n <= minimo)
215
+ continue;
216
+ if (ultimo !== undefined && y - ultimo.y1 <= 4) {
217
+ ultimo.y1 = y;
218
+ ultimo.n += n;
219
+ }
220
+ else
221
+ bloques.push({ y0: y, y1: y, n });
222
+ }
223
+ const texto = bloques.sort((a, b) => b.n - a.n)[0];
224
+ const tinta = [];
225
+ let [tx0, ty0, tx1, ty1] = [ix1, iy1, ix0, iy0];
226
+ if (texto !== undefined)
227
+ for (let y = texto.y0; y <= texto.y1; y += 1) {
228
+ const fila = porFila.get(y);
229
+ if (fila === undefined)
230
+ continue;
231
+ tinta.push(...fila.colores);
232
+ [tx0, tx1, ty0, ty1] = [Math.min(tx0, fila.x0), Math.max(tx1, fila.x1), Math.min(ty0, y), Math.max(ty1, y)];
233
+ }
234
+ const tocaArriba = texto !== undefined && texto.y0 <= iy0 + 1;
235
+ const tocaAbajo = texto !== undefined && texto.y1 >= iy1 - 1;
236
+ if (tinta.length >= 6) {
237
+ /**
238
+ * El color del texto es el de la tinta MÁS lejana del fondo: en un botón con degradado, el propio degradado se
239
+ * aparta del color más repetido y entra como «tinta» (medido: la «=» de la maqueta daba el coral del degradado y
240
+ * no el granate de su signo).
241
+ */
242
+ const lejos = Math.max(...tinta.map((p) => distancia(p, fondo)));
243
+ medido.colorTexto = hex(moda(tinta.filter((p) => distancia(p, fondo) >= Math.max(TINTA, lejos * 0.6))));
244
+ medido.alturaDeLetra = Math.round(((ty1 - ty0 + 1) / img.ancho) * 1000) / 1000;
245
+ medido.letra = letraDe(medido.alturaDeLetra);
246
+ const centro = (tx0 + tx1) / 2;
247
+ const tercio = (ix1 - ix0) / 3;
248
+ medido.alineacion = (centro < ix0 + tercio ? "izquierda" : centro > ix1 - tercio ? "derecha" : "centro");
249
+ /**
250
+ * Recortado solo en lo que NO pinta fondo propio (una etiqueta de texto): en un botón, un degradado del fondo es
251
+ * «tinta» que llega al borde (medido: la «=» de la calculadora) y el texto de un botón no es lo que se corta.
252
+ */
253
+ if (!conFondo)
254
+ medido.recortado = tocaArriba || tocaAbajo;
255
+ }
256
+ return medido;
257
+ }
258
+ /**
259
+ * Una pantalla entera MEDIDA, en el mismo esquema que `compararDescripciones` entiende: las filas que se le dan, y
260
+ * cada control con su estilo medido y su centro en fracción de la pantalla (con eso se empareja).
261
+ */
262
+ const sinAlineacionSi = (quitar, medido) => {
263
+ if (!quitar)
264
+ return medido;
265
+ const { alineacion: _a, ...resto } = medido;
266
+ return resto;
267
+ };
268
+ /** Lo de la CAJA (forma, fondo, borde) del envoltorio, y lo de la LETRA de la etiqueta. */
269
+ const DE_LA_CAJA = ["forma", "radio", "proporcion", "fondo", "borde"];
270
+ const conEnvoltorio = (propio, delMarco) => {
271
+ if (delMarco === undefined)
272
+ return propio;
273
+ const salida = { ...propio };
274
+ for (const k of DE_LA_CAJA) {
275
+ if (delMarco[k] === undefined)
276
+ delete salida[k];
277
+ else
278
+ salida[k] = delMarco[k];
279
+ }
280
+ return salida;
281
+ };
282
+ export function pantallaMedida(img, filas) {
283
+ return {
284
+ filas: filas.map((fila) => ({
285
+ controles: fila.map((c) => ({
286
+ texto: c.texto,
287
+ centro: { x: (c.caja.x + c.caja.ancho / 2) / img.ancho, y: (c.caja.y + c.caja.alto / 2) / img.alto },
288
+ ...sinAlineacionSi(c.ajustado === true, conEnvoltorio(medirControl(img, c.caja), c.envoltorio === undefined ? undefined : medirControl(img, c.envoltorio))),
289
+ })),
290
+ })),
291
+ extras: [],
292
+ };
293
+ }
294
+ // ---------------------------------------------------------------- los bloques anchos (cabecera, visor, panel)
295
+ /** Los bloques que no están dentro de otro: la cabecera y no su título, el visor y no sus filas. Pura. */
296
+ export function bloquesDeFuera(cajas) {
297
+ const dentro = (a, b) => a !== b && a.x >= b.x - 2 && a.y >= b.y - 2 && a.x + a.ancho <= b.x + b.ancho + 2 && a.y + a.alto <= b.y + b.alto + 2;
298
+ return cajas.filter((a) => !cajas.some((b) => dentro(a, b) && !(dentro(b, a) && cajas.indexOf(b) > cajas.indexOf(a))));
299
+ }
300
+ const porciento = (x) => `${Math.round(x * 100)} %`;
301
+ /** El color más repetido dentro de una caja: el del fondo del bloque, sea propio o el de lo que tiene detrás. */
302
+ function colorDominante(img, caja) {
303
+ const colores = [];
304
+ const paso = Math.max(1, Math.floor(Math.sqrt((caja.ancho * caja.alto) / 4000)));
305
+ for (let y = Math.round(caja.y); y < caja.y + caja.alto; y += paso)
306
+ for (let x = Math.round(caja.x); x < caja.x + caja.ancho; x += paso)
307
+ colores.push(pixel(img, x, y));
308
+ return moda(colores);
309
+ }
310
+ /**
311
+ * Compara el COLOR y la FORMA de los bloques anchos, emparejados por su altura relativa dentro de la franja útil de
312
+ * cada pantalla (la maqueta y el aparato no tienen la misma proporción). Pura. Existe por la calculadora: una cabecera
313
+ * amarilla donde la maqueta tiene la del fondo oscuro no la veía nadie, porque solo se comparaban los botones.
314
+ *
315
+ * Solo dice DIFERENCIAS de lo emparejado: un bloque sin pareja no es noticia, porque los dos lados no parten igual
316
+ * (el aparato puede tener un bloque por fila de teclas donde la maqueta tiene un solo panel).
317
+ */
318
+ export function compararBloques(maqueta, aparato) {
319
+ const situar = (b) => bloquesDeFuera(b.bloques)
320
+ .slice()
321
+ .sort((x, y) => x.y - y.y)
322
+ .map((caja) => {
323
+ const alto = Math.max(1, b.util.abajo - b.util.arriba);
324
+ return { caja, y0: (caja.y - b.util.arriba) / alto, y1: (caja.y + caja.alto - b.util.arriba) / alto, color: colorDominante(b.img, caja), forma: medirControl(b.img, caja).forma };
325
+ });
326
+ const ms = situar(maqueta);
327
+ const as = situar(aparato);
328
+ const usados = new Set();
329
+ const salida = [];
330
+ for (const a of as) {
331
+ let mejor;
332
+ ms.forEach((m, i) => {
333
+ const solape = Math.min(a.y1, m.y1) - Math.max(a.y0, m.y0);
334
+ if (!usados.has(i) && solape > 0 && (mejor === undefined || solape > mejor.solape))
335
+ mejor = { i, solape };
336
+ });
337
+ if (mejor === undefined || mejor.solape < (a.y1 - a.y0) * 0.4)
338
+ continue;
339
+ usados.add(mejor.i);
340
+ const m = ms[mejor.i];
341
+ const donde = a.y0 < 0.12 ? "de arriba del todo" : `que va del ${porciento(Math.max(0, a.y0))} al ${porciento(Math.min(1, a.y1))} del alto`;
342
+ if (a.color !== undefined && m.color !== undefined && Math.hypot(a.color[0] - m.color[0], a.color[1] - m.color[1], a.color[2] - m.color[2]) > 90) {
343
+ salida.push(`El bloque ${donde} es de color ${hex(a.color)}; en la maqueta, ${hex(m.color)}.`);
344
+ }
345
+ const proporcion = (a.y1 - a.y0) / Math.max(0.001, m.y1 - m.y0);
346
+ if (a.forma !== undefined && m.forma !== undefined && a.forma !== m.forma && proporcion > 0.6 && proporcion < 1.6) {
347
+ salida.push(`El bloque ${donde} tiene forma ${a.forma}; en la maqueta, ${m.forma}.`);
348
+ }
349
+ }
350
+ return salida;
351
+ }
352
+ //# sourceMappingURL=estiloMedido.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"estiloMedido.js","sourceRoot":"","sources":["../../src/core/estiloMedido.ts"],"names":[],"mappings":"AA4BA,8FAA8F;AAC9F,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB;;;GAGG;AACH,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,4EAA4E;AAC5E,MAAM,KAAK,GAAG,EAAE,CAAC;AAEjB,MAAM,SAAS,GAAG,CAAC,CAAM,EAAE,CAAM,EAAU,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACtH,MAAM,GAAG,GAAG,CAAC,CAAM,EAAU,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;AAEvH,SAAS,KAAK,CAAC,GAAe,EAAE,CAAS,EAAE,CAAS;IAClD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7G,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC;AAC/D,CAAC;AAED,mHAAmH;AACnH,SAAS,IAAI,CAAC,OAAuB;IACnC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAoC,CAAC;IAC1D,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAChE,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QACZ,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACrB,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC;IAChE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AACrF,CAAC;AAKD,qFAAqF;AACrF,MAAM,UAAU,OAAO,CAAC,KAAa,EAAE,UAAkB;IACvD,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,OAAO,CAAC;IACjC,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,YAAY,CAAC;IACtC,8GAA8G;IAC9G,kGAAkG;IAClG,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IACvD,OAAO,UAAU,IAAI,GAAG,IAAI,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;AAC5E,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,OAAO,CAAC,MAAc;IACpC,IAAI,MAAM,GAAG,IAAI;QAAE,OAAO,SAAS,CAAC;IACpC,IAAI,MAAM,GAAG,KAAK;QAAE,OAAO,QAAQ,CAAC;IACpC,IAAI,MAAM,GAAG,IAAI;QAAE,OAAO,QAAQ,CAAC;IACnC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,+GAA+G;AAC/G,MAAM,UAAU,YAAY,CAAC,GAAe,EAAE,IAAU;IACtD,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACxE,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACtE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAE1C,4CAA4C;IAC5C,MAAM,MAAM,GAAU,EAAE,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5F,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5F,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAE,CAAC;IAE5B,MAAM,MAAM,GAAU,EAAE,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC;QAAE,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClG,MAAM,MAAM,GAAiB,EAAE,CAAC;IAEhC,gEAAgE;IAChE,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAE,CAAC;IAClC,MAAM,QAAQ,GAAG,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,YAAY,CAAC;IAC9D,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7C,IAAI,QAAQ;QAAE,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IAExC,sCAAsC;IACtC,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,GAAG,GAAG,EAAE,CAAC;IACb;;;;OAIG;IACH,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACjF,IAAI,QAAQ,EAAE,CAAC;QACb,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QACxC,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC;YAC9B,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC;gBAC9B,IAAI,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,QAAQ,EAAE,CAAC;oBACnD,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;oBACvB,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;oBACvB,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;oBACvB,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBACzB,CAAC;QACL,MAAM,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;QAC5B,MAAM,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;QAC3B,+GAA+G;QAC/G,iDAAiD;QACjD,MAAM,QAAQ,GAAuC;YACnD,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAChB,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACjB,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACjB,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;SACnB,CAAC;QACF,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE;YAC/C,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,QAAQ;gBAAE,CAAC,IAAI,CAAC,CAAC;YAClH,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACvE,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;QAC5D,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;QAC3D,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAC1D,CAAC;IAED,4GAA4G;IAC5G,qHAAqH;IACrH;;;;OAIG;IACH,MAAM,IAAI,GAAG,CAAC,MAA0B,EAAE,MAAwB,EAAW,EAAE;QAC7E,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,WAAW,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAClG,IAAI,OAAO,IAAI,GAAG,IAAI,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,WAAW,IAAI,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,WAAW;YAAE,OAAO,KAAK,CAAC;QACrH,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,WAAW,CAAC,CAAC,MAAM,CAAC;QACtI,OAAO,SAAS,GAAG,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC;IACzC,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACpJ,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAChF,MAAM,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;IACzC,oHAAoH;IACpH,2DAA2D;IAC3D,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;QACnC,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAoB,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACrG,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAoB,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACpG,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAoB,EAAE,CAAC,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACrG,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAoB,EAAE,CAAC,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACtF,CAAC,CAAC,CACH,CAAC,MAAM,CAAC;IACT,+EAA+E;IAC/E,MAAM,CAAC,KAAK,GAAG,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9D,gFAAgF;IAChF;;;;OAIG;IACH,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACzG,oHAAoH;IACpH,8GAA8G;IAC9G,gFAAgF;IAChF,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,8FAA8F;IAC9F,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,MAAM,EAAE,GAAG,GAAG,MAAM,EAAE,GAAG,GAAG,MAAM,EAAE,GAAG,GAAG,MAAM,CAAC,CAAC;IACtF,0BAA0B;IAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC;IACxC,KAAK,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC;QAChC,KAAK,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3B,IAAI,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,KAAK,IAAI,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,KAAK;gBAAE,SAAS;YAC3E,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YAC5C,UAAU,CAAC,CAAC,GAAG,GAAG,CAAE,IAAI,CAAC,CAAC;YAC1B,QAAQ,CAAC,CAAC,GAAG,GAAG,CAAE,IAAI,CAAC,CAAC;QAC1B,CAAC;IACH;;;;OAIG;IACH,MAAM,aAAa,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,CAAE,GAAG,KAAK,GAAG,GAAG,CAAC;IACpE,MAAM,eAAe,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAE,GAAG,MAAM,GAAG,GAAG,CAAC;IACrE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAsD,CAAC;IAC9E,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC;QACrC,IAAI,eAAe,CAAC,EAAE,CAAC;YAAE,SAAS;QAClC,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC;YACtC,IAAI,OAAO,CAAC,EAAE,GAAG,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,EAAE,CAAC;gBAAE,SAAS;YACnE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;YAC7D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACpC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD;;;;OAIG;IACH,MAAM,OAAO,GAA4C,EAAE,CAAC;IAC5D,oHAAoH;IACpH,iDAAiD;IACjD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IACtD,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,MAAM,CAAC;QACzC,IAAI,CAAC,IAAI,MAAM;YAAE,SAAS;QAC1B,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,GAAG,MAAM,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;YAC/C,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;YACd,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC;;YAAM,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,MAAM,KAAK,GAAU,EAAE,CAAC;IACxB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAChD,IAAI,KAAK,KAAK,SAAS;QACrB,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,IAAI,KAAK,SAAS;gBAAE,SAAS;YACjC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5B,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9G,CAAC;IACH,MAAM,UAAU,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;IAC7D,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACtB;;;;WAIG;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QACjE,MAAM,CAAC,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC,CAAC;QACzG,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;QAC/E,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,CAAC,UAAU,GAAG,CAAC,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAe,CAAC;QACvH;;;WAGG;QACH,IAAI,CAAC,QAAQ;YAAE,MAAM,CAAC,SAAS,GAAG,UAAU,IAAI,SAAS,CAAC;IAC5D,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAmBD;;;GAGG;AACH,MAAM,eAAe,GAAG,CAAqC,MAAe,EAAE,MAAS,EAAK,EAAE;IAC5F,IAAI,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC;IAC3B,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,CAAC;IAC5C,OAAO,KAAU,CAAC;AACpB,CAAC,CAAC;AAEF,2FAA2F;AAC3F,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,CAAU,CAAC;AAC/E,MAAM,aAAa,GAAG,CAAC,MAAoB,EAAE,QAAkC,EAAgB,EAAE;IAC/F,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IAC1C,MAAM,MAAM,GAA4B,EAAE,GAAG,MAAM,EAAE,CAAC;IACtD,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;;YAC3C,MAAM,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,MAAsB,CAAC;AAChC,CAAC,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,GAAe,EAAE,KAA4C;IAC1F,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC1B,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC1B,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE;gBACpG,GAAG,eAAe,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,EAAE,aAAa,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;aAC5J,CAAC,CAAC;SACJ,CAAC,CAAC;QACH,MAAM,EAAE,EAAE;KACX,CAAC;AACJ,CAAC;AAED,+GAA+G;AAE/G,0GAA0G;AAC1G,MAAM,UAAU,cAAc,CAAC,KAAsB;IACnD,MAAM,MAAM,GAAG,CAAC,CAAO,EAAE,CAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;IAC3J,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzH,CAAC;AASD,MAAM,SAAS,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;AAE5D,iHAAiH;AACjH,SAAS,cAAc,CAAC,GAAe,EAAE,IAAU;IACjD,MAAM,OAAO,GAAU,EAAE,CAAC;IAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACjF,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,IAAI;QAAE,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,IAAI;YAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxK,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;AACvB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,OAAsB,EAAE,OAAsB;IAC5E,MAAM,MAAM,GAAG,CAAC,CAAgB,EAAE,EAAE,CAClC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC;SACtB,KAAK,EAAE;SACP,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SACzB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvD,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;IACpL,CAAC,CAAC,CAAC;IACP,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3B,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QACnB,IAAI,KAAgD,CAAC;QACrD,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAClB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;gBAAE,KAAK,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;QAC5G,CAAC,CAAC,CAAC;QACH,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG;YAAE,SAAS;QACxE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC;QACvB,MAAM,KAAK,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,cAAc,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC;QAC5I,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;YACjJ,MAAM,CAAC,IAAI,CAAC,aAAa,KAAK,gBAAgB,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,oBAAoB,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjG,CAAC;QACD,MAAM,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,IAAI,UAAU,GAAG,GAAG,IAAI,UAAU,GAAG,GAAG,EAAE,CAAC;YAClH,MAAM,CAAC,IAAI,CAAC,aAAa,KAAK,gBAAgB,CAAC,CAAC,KAAK,oBAAoB,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Las reglas PURAS de traer una fuente de Google Fonts al proyecto: qué familia y peso valen,
3
+ * cómo se llama el fichero, de qué URLs se aceptan respuestas y qué bytes son un `.ttf`. La red
4
+ * es `FuentesPort` (`core/ports.ts`) y la hace `agent/config/fuentesEnRed.ts`; las tools son
5
+ * `agent/grafo/fuentesDeGoogle.ts`.
6
+ *
7
+ * ## Lo medido contra la red, sin clave
8
+ *
9
+ * - El CATÁLOGO es `fonts.google.com/metadata/fonts`: un JSON de unos 2,7 MB con ~1.950
10
+ * familias, cada una con sus pesos como claves de `fonts` (`"400"`, `"700i"` es la cursiva).
11
+ * - El FICHERO sale de la API `css2`: pedida sin cabeceras de navegador moderno, su `@font-face`
12
+ * apunta a un `.ttf` ESTÁTICO de ese peso en `fonts.gstatic.com` (`font/ttf`). Un peso que la
13
+ * familia no tiene contesta 400. Estático y por peso es justo la convención de la skill
14
+ * (`fontname: Roboto-Bold.ttf`); el `.ttf` variable del repo de GitHub sale con su peso por
15
+ * omisión y su nombre no se deduce sin listar la carpeta.
16
+ * - Tamaños: Inter 700 son 326 KB; Noto Sans JP 400, 5,7 MB (de ahí el tope).
17
+ */
18
+ export const NOMBRE_BUSCAR_FUENTE = "buscar_fuente";
19
+ export const NOMBRE_TRAER_FUENTE = "traer_fuente";
20
+ /** La carpeta de una app XOne de donde `fontname` toma el `.ttf`. */
21
+ export const CARPETA_DE_FUENTES = "fonts";
22
+ /**
23
+ * Quién las recibe: quien puede dejar el `.ttf` en `fonts/`. Sin `escribeEn` escribe el proyecto
24
+ * entero (el desarrollador); con él, solo si una de sus carpetas cubre `fonts/` (el diseñador, que
25
+ * hace los RECURSOS: una fuente lo es, como un icono). La forma de `recibeBuscarIcono`, con otra
26
+ * carpeta. Regla de DATO, no un nombre. Solo llega a `motor: "modelo"` (un externo no recibe tools
27
+ * propias), y eso lo comprueba quien monta.
28
+ */
29
+ export function recibeFuentes(a) {
30
+ if (a.soloLectura || a.ejecucion === true)
31
+ return false;
32
+ const objetivo = `/${CARPETA_DE_FUENTES}/`;
33
+ const carpetas = a.escribeEn ?? [];
34
+ return carpetas.length === 0 || carpetas.some((c) => objetivo.startsWith(c.endsWith("/") ? c : `${c}/`));
35
+ }
36
+ /** Tope de UNA llamada de red. El catálogo son 2,7 MB y una fuente CJK pasa de 5 MB. */
37
+ export const TOPE_DE_FUENTES_MS = 30_000;
38
+ /** Lo que se acepta como `.ttf`. Medido: Noto Sans JP 400 son 5,7 MB; esto es holgura. */
39
+ export const TOPE_DE_FUENTE_BYTES = 10 * 1024 * 1024;
40
+ /** Lo que se acepta como catálogo (2,7 MB medidos) o como hoja `css2` (unos cientos de bytes). */
41
+ export const TOPE_DE_CATALOGO_BYTES = 16 * 1024 * 1024;
42
+ export const TOPE_DE_CSS_BYTES = 64 * 1024;
43
+ export const LIMITES_DE_BUSQUEDA_DE_FUENTES = { porOmision: 8, maximo: 20 };
44
+ /** Los hosts son CONSTANTES: uno distinto es una decisión, no un parámetro. */
45
+ export const URL_DEL_CATALOGO = "https://fonts.google.com/metadata/fonts";
46
+ export const BASE_DE_CSS = "https://fonts.googleapis.com/css2";
47
+ export const HOST_DE_FICHEROS = "fonts.gstatic.com";
48
+ /** Los pesos que se traen. El catálogo trae también 1 y 1000 en alguna familia variable: fuera. */
49
+ export const PESOS = [100, 200, 300, 400, 500, 600, 700, 800, 900];
50
+ /** El sufijo de Google para cada peso, el de sus propios ficheros estáticos (`Roboto-SemiBold.ttf`). */
51
+ const NOMBRE_DE_PESO = {
52
+ 100: "Thin",
53
+ 200: "ExtraLight",
54
+ 300: "Light",
55
+ 400: "Regular",
56
+ 500: "Medium",
57
+ 600: "SemiBold",
58
+ 700: "Bold",
59
+ 800: "ExtraBold",
60
+ 900: "Black",
61
+ };
62
+ /** Medido: ninguna de las ~1.950 familias lleva otra cosa que letras, cifras y espacios, y la más larga 32. */
63
+ const FAMILIA = /^[A-Za-z0-9](?:[A-Za-z0-9 ]{0,62}[A-Za-z0-9])?$/;
64
+ export function motivoDeFamiliaInaceptable(familia) {
65
+ return FAMILIA.test(familia) && !familia.includes(" ")
66
+ ? undefined
67
+ : `«${familia}» no es un nombre de familia de Google Fonts (letras, cifras y espacios, como «Roboto Mono»)`;
68
+ }
69
+ export function motivoDePesoInaceptable(peso) {
70
+ return PESOS.includes(peso) ? undefined : `«${peso}» no es un peso: va de 100 a 900, de cien en cien`;
71
+ }
72
+ /** La clave del catálogo para un peso y estilo: `700` → `"700"`, cursiva → `"700i"`. */
73
+ export function claveDeEstilo(peso, cursiva) {
74
+ return `${peso}${cursiva ? "i" : ""}`;
75
+ }
76
+ /**
77
+ * El nombre del fichero, por la convención de los estáticos de Google: la familia SIN espacios,
78
+ * un guion y el estilo (`Roboto Mono`, 700 cursiva → `RobotoMono-BoldItalic.ttf`; 400 cursiva →
79
+ * `RobotoMono-Italic.ttf`). Es también lo que va en `fontname`, a secas: XOne lo busca en `fonts/`.
80
+ * Medido sobre el catálogo: quitar los espacios no junta dos familias en un mismo nombre.
81
+ */
82
+ export function nombreDeFicheroDeFuente(familia, peso, cursiva) {
83
+ const base = familia.replace(/ /g, "");
84
+ const estilo = cursiva ? (peso === 400 ? "Italic" : `${NOMBRE_DE_PESO[peso]}Italic`) : NOMBRE_DE_PESO[peso];
85
+ return `${base}-${estilo}.ttf`;
86
+ }
87
+ /** Dónde se escribe (ruta virtual): `/fonts/Inter-Bold.ttf`. */
88
+ export function rutaDeFuente(familia, peso, cursiva) {
89
+ return `/${CARPETA_DE_FUENTES}/${nombreDeFicheroDeFuente(familia, peso, cursiva)}`;
90
+ }
91
+ /** La hoja `css2` de UN estilo. La familia ya viene validada: solo letras, cifras y espacios. */
92
+ export function urlDeCss(familia, peso, cursiva) {
93
+ const eje = cursiva ? `ital,wght@1,${peso}` : `wght@${peso}`;
94
+ // `URLSearchParams` codificaría la coma y la arroba; la API los quiere tal cual y el `+` por espacio.
95
+ return `${BASE_DE_CSS}?family=${familia.replace(/ /g, "+")}:${eje}`;
96
+ }
97
+ /**
98
+ * De la hoja `css2`, la URL del `.ttf`, o `undefined`. Solo si es HTTPS a `fonts.gstatic.com` y
99
+ * declara `truetype`: otro host u otro formato (un `woff2`, si Google cambiara lo que sirve a un
100
+ * cliente sin navegador) no es lo medido.
101
+ */
102
+ export function urlDeTtfEnCss(css) {
103
+ const m = /src:\s*url\((https:\/\/[^)\s]+)\)\s*format\(['"]truetype['"]\)/.exec(css);
104
+ if (m === null)
105
+ return undefined;
106
+ try {
107
+ const url = new URL(m[1]);
108
+ return url.protocol === "https:" && url.hostname === HOST_DE_FICHEROS ? url.toString() : undefined;
109
+ }
110
+ catch {
111
+ return undefined;
112
+ }
113
+ }
114
+ /**
115
+ * ¿Son estos bytes un TrueType? Por su FIRMA, no por la cabecera HTTP: `00 01 00 00` (lo medido
116
+ * en todo lo que sirve gstatic) o `true` (el de Apple). Un OpenType con CFF (`OTTO`) no se acepta:
117
+ * lo que XOne dice cargar es `.ttf`.
118
+ */
119
+ export function esTrueType(bytes) {
120
+ if (bytes.length < 12)
121
+ return false;
122
+ const firma = ((bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3]) >>> 0;
123
+ return firma === 0x00010000 || firma === 0x74727565;
124
+ }
125
+ /** Del catálogo, las familias con forma conocida. Lo que no encaja no es del contrato y se salta. */
126
+ export function familiasDelCatalogo(cuerpo) {
127
+ const lista = cuerpo?.familyMetadataList;
128
+ if (!Array.isArray(lista))
129
+ return [];
130
+ const salida = [];
131
+ for (const f of lista) {
132
+ const familia = f.family;
133
+ const fonts = f.fonts;
134
+ if (typeof familia !== "string" || motivoDeFamiliaInaceptable(familia) !== undefined)
135
+ continue;
136
+ if (typeof fonts !== "object" || fonts === null)
137
+ continue;
138
+ const estilos = Object.keys(fonts).filter((k) => /^[1-9]00i?$/.test(k));
139
+ if (estilos.length === 0)
140
+ continue;
141
+ const categoria = f.category;
142
+ const popularidad = f.popularity;
143
+ salida.push({
144
+ familia,
145
+ categoria: typeof categoria === "string" ? categoria : "",
146
+ estilos,
147
+ popularidad: typeof popularidad === "number" ? popularidad : Number.MAX_SAFE_INTEGER,
148
+ });
149
+ }
150
+ return salida;
151
+ }
152
+ /**
153
+ * Buscar en el catálogo: la coincidencia EXACTA primero (sin mayúsculas ni espacios: «robotomono»
154
+ * es «Roboto Mono», que es como lo escribe una maqueta en su `fontFamily`), luego las que la
155
+ * contienen, por popularidad (en el catálogo, menor es más popular).
156
+ */
157
+ export function buscarEnCatalogo(catalogo, consulta, limite) {
158
+ const compacta = (s) => s.toLowerCase().replace(/[\s_-]+/g, "");
159
+ const q = compacta(consulta);
160
+ if (q === "")
161
+ return [];
162
+ const exactas = catalogo.filter((f) => compacta(f.familia) === q);
163
+ const contienen = catalogo
164
+ .filter((f) => compacta(f.familia) !== q && compacta(f.familia).includes(q))
165
+ .sort((a, b) => a.popularidad - b.popularidad);
166
+ return [...exactas, ...contienen].slice(0, limite).map(({ familia, categoria, estilos }) => ({ familia, categoria, estilos }));
167
+ }
168
+ /** Los estilos de una familia, legibles: `400, 700, 400 cursiva`. */
169
+ export function estilosLegibles(estilos) {
170
+ const rectos = estilos.filter((e) => !e.endsWith("i")).sort();
171
+ const cursivas = estilos.filter((e) => e.endsWith("i")).map((e) => `${e.slice(0, -1)} cursiva`).sort();
172
+ return [...rectos, ...cursivas].join(", ");
173
+ }
174
+ //# sourceMappingURL=fuentes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fuentes.js","sourceRoot":"","sources":["../../src/core/fuentes.ts"],"names":[],"mappings":"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"}