feat: Reinitialize frontend with SvelteKit and TypeScript

- Delete old Vite+Svelte frontend
- Initialize new SvelteKit project with TypeScript
- Configure Tailwind CSS v4 + DaisyUI
- Implement JWT authentication with auto-refresh
- Create login page with form validation (Zod)
- Add protected route guards
- Update Docker configuration for single-stage build
- Add E2E tests with Playwright (6/11 passing)
- Fix Svelte 5 reactivity with $state() runes

Known issues:
- 5 E2E tests failing (timing/async issues)
- Token refresh implementation needs debugging
- Validation error display timing
This commit is contained in:
2026-02-17 16:19:59 -05:00
parent 54df6018f5
commit de2d83092e
28274 changed files with 3816354 additions and 90 deletions

View File

@@ -0,0 +1,137 @@
import Node from '../node/Node.js';
import * as PropertySymbol from '../../PropertySymbol.js';
import Element from '../element/Element.js';
import IChildNode from '../child-node/IChildNode.js';
import INonDocumentTypeChildNode from '../child-node/INonDocumentTypeChildNode.js';
/**
* Character data base class.
*
* Reference:
* https://developer.mozilla.org/en-US/docs/Web/API/CharacterData.
*/
export default abstract class CharacterData extends Node implements IChildNode, INonDocumentTypeChildNode {
[PropertySymbol.data]: string;
cloneNode: (deep?: boolean) => CharacterData;
/**
* Constructor.
*
* @param [data] Data.
*/
constructor(data?: string);
/**
* Returns text content.
*
* @returns Text content.
*/
get length(): number;
/**
* Returns text content.
*
* @returns Text content.
*/
get data(): string;
/**
* Sets text content.
*
* @param textContent Text content.
*/
set data(data: string);
/**
* Returns text content.
*
* @returns Text content.
*/
get textContent(): string;
/**
* Sets text content.
*
* @param textContent Text content.
*/
set textContent(textContent: string);
/**
* Returns node value.
*
* @returns Node value.
*/
get nodeValue(): string;
/**
* Sets node value.
*
* @param nodeValue Node value.
*/
set nodeValue(nodeValue: string);
/**
* Previous element sibling.
*
* @returns Element.
*/
get previousElementSibling(): Element;
/**
* Next element sibling.
*
* @returns Element.
*/
get nextElementSibling(): Element;
/**
* Appends the given DOMString to the CharacterData.data string; when this method returns, data contains the concatenated DOMString.
*
* @param data Data.
*/
appendData(data: string): void;
/**
* Removes the specified amount of characters, starting at the specified offset, from the CharacterData.data string; when this method returns, data contains the shortened DOMString.
*
* @param offset Offset.
* @param count Count.
*/
deleteData(offset: number, count: number): void;
/**
* Inserts the specified characters, at the specified offset, in the CharacterData.data string; when this method returns, data contains the modified DOMString.
*
* @param offset Offset.
* @param data Data.
*/
insertData(offset: number, data: string): void;
/**
* Replaces the specified amount of characters, starting at the specified offset, with the specified DOMString; when this method returns, data contains the modified DOMString.
*
* @param offset Offset.
* @param count Count.
* @param data Data.
*/
replaceData(offset: number, count: number, data: string): void;
/**
* Returns a DOMString containing the part of CharacterData.data of the specified length and starting at the specified offset.
*
* @param offset Offset.
* @param count Count.
*/
substringData(offset: number, count: number): string;
/**
* Removes the object from its parent children list.
*/
remove(): void;
/**
* The Node.replaceWith() method replaces this Node in the children list of its parent with a set of Node or DOMString objects.
*
* @param nodes List of Node or DOMString.
*/
replaceWith(...nodes: (Node | string)[]): void;
/**
* Inserts a set of Node or DOMString objects in the children list of this ChildNode's parent, just before this ChildNode. DOMString objects are inserted as equivalent Text nodes.
*
* @param nodes List of Node or DOMString.
*/
before(...nodes: (string | Node)[]): void;
/**
* Inserts a set of Node or DOMString objects in the children list of this ChildNode's parent, just after this ChildNode. DOMString objects are inserted as equivalent Text nodes.
*
* @param nodes List of Node or DOMString.
*/
after(...nodes: (string | Node)[]): void;
/**
* @override
*/
[PropertySymbol.cloneNode](deep?: boolean): CharacterData;
}
//# sourceMappingURL=CharacterData.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"CharacterData.d.ts","sourceRoot":"","sources":["../../../src/nodes/character-data/CharacterData.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,iBAAiB,CAAC;AACnC,OAAO,KAAK,cAAc,MAAM,yBAAyB,CAAC;AAE1D,OAAO,OAAO,MAAM,uBAAuB,CAAC;AAK5C,OAAO,UAAU,MAAM,6BAA6B,CAAC;AACrD,OAAO,yBAAyB,MAAM,4CAA4C,CAAC;AAEnF;;;;;GAKG;AACH,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,aAC7B,SAAQ,IACR,YAAW,UAAU,EAAE,yBAAyB;IAEzC,CAAC,cAAc,CAAC,IAAI,CAAC,SAAM;IACnB,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,aAAa,CAAC;IAE5D;;;;OAIG;gBACS,IAAI,CAAC,EAAE,MAAM;IAMzB;;;;OAIG;IACH,IAAW,MAAM,IAAI,MAAM,CAE1B;IAED;;;;OAIG;IACH,IAAW,IAAI,IAAI,MAAM,CAExB;IAED;;;;OAIG;IACH,IAAW,IAAI,CAAC,IAAI,EAAE,MAAM,EAW3B;IAED;;;;OAIG;IACH,IAAW,WAAW,IAAI,MAAM,CAE/B;IAED;;;;OAIG;IACH,IAAW,WAAW,CAAC,WAAW,EAAE,MAAM,EAEzC;IAED;;;;OAIG;IACH,IAAW,SAAS,IAAI,MAAM,CAE7B;IAED;;;;OAIG;IACH,IAAW,SAAS,CAAC,SAAS,EAAE,MAAM,EAErC;IAED;;;;OAIG;IACH,IAAW,sBAAsB,IAAI,OAAO,CAE3C;IAED;;;;OAIG;IACH,IAAW,kBAAkB,IAAI,OAAO,CAEvC;IAED;;;;OAIG;IACI,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIrC;;;;;OAKG;IACI,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAItD;;;;;OAKG;IACI,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAIrD;;;;;;OAMG;IACI,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAIrE;;;;;OAKG;IACI,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAI3D;;OAEG;IACI,MAAM,IAAI,IAAI;IAIrB;;;;OAIG;IACI,WAAW,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,GAAG,MAAM,CAAC,EAAE,GAAG,IAAI;IAIrD;;;;OAIG;IACI,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI;IAIhD;;;;OAIG;IACI,KAAK,CAAC,GAAG,KAAK,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI;IAI/C;;OAEG;IACa,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,IAAI,UAAQ,GAAG,aAAa;CAKvE"}

View File

@@ -0,0 +1,187 @@
import Node from '../node/Node.js';
import * as PropertySymbol from '../../PropertySymbol.js';
import CharacterDataUtility from './CharacterDataUtility.js';
import NonDocumentChildNodeUtility from '../child-node/NonDocumentChildNodeUtility.js';
import ChildNodeUtility from '../child-node/ChildNodeUtility.js';
import MutationRecord from '../../mutation-observer/MutationRecord.js';
import MutationTypeEnum from '../../mutation-observer/MutationTypeEnum.js';
/**
* Character data base class.
*
* Reference:
* https://developer.mozilla.org/en-US/docs/Web/API/CharacterData.
*/
export default class CharacterData extends Node {
[PropertySymbol.data] = '';
/**
* Constructor.
*
* @param [data] Data.
*/
constructor(data) {
super();
this[PropertySymbol.data] = data !== undefined ? String(data) : '';
}
/**
* Returns text content.
*
* @returns Text content.
*/
get length() {
return this[PropertySymbol.data].length;
}
/**
* Returns text content.
*
* @returns Text content.
*/
get data() {
return this[PropertySymbol.data];
}
/**
* Sets text content.
*
* @param textContent Text content.
*/
set data(data) {
const oldValue = this[PropertySymbol.data];
this[PropertySymbol.data] = String(data);
this[PropertySymbol.reportMutation](new MutationRecord({
target: this,
type: MutationTypeEnum.characterData,
oldValue
}));
}
/**
* Returns text content.
*
* @returns Text content.
*/
get textContent() {
return this[PropertySymbol.data];
}
/**
* Sets text content.
*
* @param textContent Text content.
*/
set textContent(textContent) {
this.data = textContent;
}
/**
* Returns node value.
*
* @returns Node value.
*/
get nodeValue() {
return this[PropertySymbol.data];
}
/**
* Sets node value.
*
* @param nodeValue Node value.
*/
set nodeValue(nodeValue) {
this.textContent = nodeValue;
}
/**
* Previous element sibling.
*
* @returns Element.
*/
get previousElementSibling() {
return NonDocumentChildNodeUtility.previousElementSibling(this);
}
/**
* Next element sibling.
*
* @returns Element.
*/
get nextElementSibling() {
return NonDocumentChildNodeUtility.nextElementSibling(this);
}
/**
* Appends the given DOMString to the CharacterData.data string; when this method returns, data contains the concatenated DOMString.
*
* @param data Data.
*/
appendData(data) {
CharacterDataUtility.appendData(this, data);
}
/**
* Removes the specified amount of characters, starting at the specified offset, from the CharacterData.data string; when this method returns, data contains the shortened DOMString.
*
* @param offset Offset.
* @param count Count.
*/
deleteData(offset, count) {
CharacterDataUtility.deleteData(this, offset, count);
}
/**
* Inserts the specified characters, at the specified offset, in the CharacterData.data string; when this method returns, data contains the modified DOMString.
*
* @param offset Offset.
* @param data Data.
*/
insertData(offset, data) {
CharacterDataUtility.insertData(this, offset, data);
}
/**
* Replaces the specified amount of characters, starting at the specified offset, with the specified DOMString; when this method returns, data contains the modified DOMString.
*
* @param offset Offset.
* @param count Count.
* @param data Data.
*/
replaceData(offset, count, data) {
CharacterDataUtility.replaceData(this, offset, count, data);
}
/**
* Returns a DOMString containing the part of CharacterData.data of the specified length and starting at the specified offset.
*
* @param offset Offset.
* @param count Count.
*/
substringData(offset, count) {
return CharacterDataUtility.substringData(this, offset, count);
}
/**
* Removes the object from its parent children list.
*/
remove() {
ChildNodeUtility.remove(this);
}
/**
* The Node.replaceWith() method replaces this Node in the children list of its parent with a set of Node or DOMString objects.
*
* @param nodes List of Node or DOMString.
*/
replaceWith(...nodes) {
ChildNodeUtility.replaceWith(this, ...nodes);
}
/**
* Inserts a set of Node or DOMString objects in the children list of this ChildNode's parent, just before this ChildNode. DOMString objects are inserted as equivalent Text nodes.
*
* @param nodes List of Node or DOMString.
*/
before(...nodes) {
ChildNodeUtility.before(this, ...nodes);
}
/**
* Inserts a set of Node or DOMString objects in the children list of this ChildNode's parent, just after this ChildNode. DOMString objects are inserted as equivalent Text nodes.
*
* @param nodes List of Node or DOMString.
*/
after(...nodes) {
ChildNodeUtility.after(this, ...nodes);
}
/**
* @override
*/
[PropertySymbol.cloneNode](deep = false) {
const clone = super[PropertySymbol.cloneNode](deep);
clone[PropertySymbol.data] = this[PropertySymbol.data];
return clone;
}
}
//# sourceMappingURL=CharacterData.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"CharacterData.js","sourceRoot":"","sources":["../../../src/nodes/character-data/CharacterData.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,iBAAiB,CAAC;AACnC,OAAO,KAAK,cAAc,MAAM,yBAAyB,CAAC;AAC1D,OAAO,oBAAoB,MAAM,2BAA2B,CAAC;AAE7D,OAAO,2BAA2B,MAAM,8CAA8C,CAAC;AACvF,OAAO,gBAAgB,MAAM,mCAAmC,CAAC;AACjE,OAAO,cAAc,MAAM,2CAA2C,CAAC;AACvE,OAAO,gBAAgB,MAAM,6CAA6C,CAAC;AAI3E;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAgB,aAC7B,SAAQ,IAAI;IAGL,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IAGlC;;;;OAIG;IACH,YAAY,IAAa;QACxB,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACpE,CAAC;IAED;;;;OAIG;IACH,IAAW,MAAM;QAChB,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IACzC,CAAC;IAED;;;;OAIG;IACH,IAAW,IAAI;QACd,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACH,IAAW,IAAI,CAAC,IAAY;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAEzC,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAClC,IAAI,cAAc,CAAC;YAClB,MAAM,EAAE,IAAI;YACZ,IAAI,EAAE,gBAAgB,CAAC,aAAa;YACpC,QAAQ;SACR,CAAC,CACF,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,IAAW,WAAW;QACrB,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACH,IAAW,WAAW,CAAC,WAAmB;QACzC,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACH,IAAW,SAAS;QACnB,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACH,IAAW,SAAS,CAAC,SAAiB;QACrC,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACH,IAAW,sBAAsB;QAChC,OAAO,2BAA2B,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC;IAED;;;;OAIG;IACH,IAAW,kBAAkB;QAC5B,OAAO,2BAA2B,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC;IAED;;;;OAIG;IACI,UAAU,CAAC,IAAY;QAC7B,oBAAoB,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED;;;;;OAKG;IACI,UAAU,CAAC,MAAc,EAAE,KAAa;QAC9C,oBAAoB,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACtD,CAAC;IAED;;;;;OAKG;IACI,UAAU,CAAC,MAAc,EAAE,IAAY;QAC7C,oBAAoB,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IACrD,CAAC;IAED;;;;;;OAMG;IACI,WAAW,CAAC,MAAc,EAAE,KAAa,EAAE,IAAY;QAC7D,oBAAoB,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAC7D,CAAC;IAED;;;;;OAKG;IACI,aAAa,CAAC,MAAc,EAAE,KAAa;QACjD,OAAO,oBAAoB,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IAChE,CAAC;IAED;;OAEG;IACI,MAAM;QACZ,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED;;;;OAIG;IACI,WAAW,CAAC,GAAG,KAAwB;QAC7C,gBAAgB,CAAC,WAAW,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC;IAC9C,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,GAAG,KAAwB;QACxC,gBAAgB,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC;IACzC,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,GAAG,KAAwB;QACvC,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACa,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,IAAI,GAAG,KAAK;QACtD,MAAM,KAAK,GAAkB,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC;QACnE,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QACvD,OAAO,KAAK,CAAC;IACd,CAAC;CACD"}

View File

@@ -0,0 +1,47 @@
import CharacterData from './CharacterData.js';
/**
* Child node utility.
*/
export default class CharacterDataUtility {
/**
* Appends the given DOMString to the CharacterData.data string; when this method returns, data contains the concatenated DOMString.
*
* @param characterData Character data.
* @param data Data.
*/
static appendData(characterData: CharacterData, data: string): void;
/**
* Removes the specified amount of characters, starting at the specified offset, from the CharacterData.data string; when this method returns, data contains the shortened DOMString.
*
* @param characterData Character data.
* @param offset Offset.
* @param count Count.
*/
static deleteData(characterData: CharacterData, offset: number, count: number): void;
/**
* Inserts the specified characters, at the specified offset, in the CharacterData.data string; when this method returns, data contains the modified DOMString.
*
* @param characterData Character data.
* @param offset Offset.
* @param data Data.
*/
static insertData(characterData: CharacterData, offset: number, data: string): void;
/**
* Replaces the specified amount of characters, starting at the specified offset, with the specified DOMString; when this method returns, data contains the modified DOMString.
*
* @param characterData Character data.
* @param offset Offset.
* @param count Count.
* @param data Data.
*/
static replaceData(characterData: CharacterData, offset: number, count: number, data: string): void;
/**
* Returns a DOMString containing the part of CharacterData.data of the specified length and starting at the specified offset.
*
* @param characterData Character data.
* @param offset Offset.
* @param count Count.
*/
static substringData(characterData: CharacterData, offset: number, count: number): string;
}
//# sourceMappingURL=CharacterDataUtility.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"CharacterDataUtility.d.ts","sourceRoot":"","sources":["../../../src/nodes/character-data/CharacterDataUtility.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAE/C;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,oBAAoB;IACxC;;;;;OAKG;WACW,UAAU,CAAC,aAAa,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAI1E;;;;;;OAMG;WACW,UAAU,CAAC,aAAa,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAK3F;;;;;;OAMG;WACW,UAAU,CAAC,aAAa,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAI1F;;;;;;;OAOG;WACW,WAAW,CACxB,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GACV,IAAI;IAKP;;;;;;OAMG;WACW,aAAa,CAAC,aAAa,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;CAGhG"}

View File

@@ -0,0 +1,59 @@
/**
* Child node utility.
*/
export default class CharacterDataUtility {
/**
* Appends the given DOMString to the CharacterData.data string; when this method returns, data contains the concatenated DOMString.
*
* @param characterData Character data.
* @param data Data.
*/
static appendData(characterData, data) {
characterData.data += data;
}
/**
* Removes the specified amount of characters, starting at the specified offset, from the CharacterData.data string; when this method returns, data contains the shortened DOMString.
*
* @param characterData Character data.
* @param offset Offset.
* @param count Count.
*/
static deleteData(characterData, offset, count) {
characterData.data =
characterData.data.substring(0, offset) + characterData.data.substring(offset + count);
}
/**
* Inserts the specified characters, at the specified offset, in the CharacterData.data string; when this method returns, data contains the modified DOMString.
*
* @param characterData Character data.
* @param offset Offset.
* @param data Data.
*/
static insertData(characterData, offset, data) {
characterData.data =
characterData.data.substring(0, offset) + data + characterData.data.substring(offset);
}
/**
* Replaces the specified amount of characters, starting at the specified offset, with the specified DOMString; when this method returns, data contains the modified DOMString.
*
* @param characterData Character data.
* @param offset Offset.
* @param count Count.
* @param data Data.
*/
static replaceData(characterData, offset, count, data) {
characterData.data =
characterData.data.substring(0, offset) + data + characterData.data.substring(offset + count);
}
/**
* Returns a DOMString containing the part of CharacterData.data of the specified length and starting at the specified offset.
*
* @param characterData Character data.
* @param offset Offset.
* @param count Count.
*/
static substringData(characterData, offset, count) {
return characterData.data.substring(offset, offset + count);
}
}
//# sourceMappingURL=CharacterDataUtility.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"CharacterDataUtility.js","sourceRoot":"","sources":["../../../src/nodes/character-data/CharacterDataUtility.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,oBAAoB;IACxC;;;;;OAKG;IACI,MAAM,CAAC,UAAU,CAAC,aAA4B,EAAE,IAAY;QAClE,aAAa,CAAC,IAAI,IAAI,IAAI,CAAC;IAC5B,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,UAAU,CAAC,aAA4B,EAAE,MAAc,EAAE,KAAa;QACnF,aAAa,CAAC,IAAI;YACjB,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;IACzF,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,UAAU,CAAC,aAA4B,EAAE,MAAc,EAAE,IAAY;QAClF,aAAa,CAAC,IAAI;YACjB,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACxF,CAAC;IACD;;;;;;;OAOG;IACI,MAAM,CAAC,WAAW,CACxB,aAA4B,EAC5B,MAAc,EACd,KAAa,EACb,IAAY;QAEZ,aAAa,CAAC,IAAI;YACjB,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;IAChG,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,aAAa,CAAC,aAA4B,EAAE,MAAc,EAAE,KAAa;QACtF,OAAO,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC;IAC7D,CAAC;CACD"}