@cloudware-de/gatekeeper-widget 0.0.0-stage → 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 (111) hide show
  1. package/LICENSE +17 -0
  2. package/dist/client/instance.d.ts +35 -0
  3. package/dist/client/instance.d.ts.map +1 -0
  4. package/dist/client/instance.js +93 -0
  5. package/dist/client/instance.js.map +1 -0
  6. package/dist/client/transport.d.ts +19 -0
  7. package/dist/client/transport.d.ts.map +1 -0
  8. package/dist/client/transport.js +41 -0
  9. package/dist/client/transport.js.map +1 -0
  10. package/dist/client/urls.d.ts +12 -0
  11. package/dist/client/urls.d.ts.map +1 -0
  12. package/dist/client/urls.js +27 -0
  13. package/dist/client/urls.js.map +1 -0
  14. package/dist/copy/load-notice.d.ts +8 -0
  15. package/dist/copy/load-notice.d.ts.map +1 -0
  16. package/dist/copy/load-notice.js +8 -0
  17. package/dist/copy/load-notice.js.map +1 -0
  18. package/dist/element/honeypot.d.ts +5 -0
  19. package/dist/element/honeypot.d.ts.map +1 -0
  20. package/dist/element/honeypot.js +5 -0
  21. package/dist/element/honeypot.js.map +1 -0
  22. package/dist/element/session.d.ts +32 -0
  23. package/dist/element/session.d.ts.map +1 -0
  24. package/dist/element/session.js +90 -0
  25. package/dist/element/session.js.map +1 -0
  26. package/dist/element/start.d.ts +25 -0
  27. package/dist/element/start.d.ts.map +1 -0
  28. package/dist/element/start.js +85 -0
  29. package/dist/element/start.js.map +1 -0
  30. package/dist/element/states.d.ts +26 -0
  31. package/dist/element/states.d.ts.map +1 -0
  32. package/dist/element/states.js +58 -0
  33. package/dist/element/states.js.map +1 -0
  34. package/dist/element/templates/host.d.ts +7 -0
  35. package/dist/element/templates/host.d.ts.map +1 -0
  36. package/dist/element/templates/host.js +11 -0
  37. package/dist/element/templates/host.js.map +1 -0
  38. package/dist/element/templates/names.d.ts +11 -0
  39. package/dist/element/templates/names.d.ts.map +1 -0
  40. package/dist/element/templates/names.js +20 -0
  41. package/dist/element/templates/names.js.map +1 -0
  42. package/dist/element/templates/sheets.d.ts +10 -0
  43. package/dist/element/templates/sheets.d.ts.map +1 -0
  44. package/dist/element/templates/sheets.js +26 -0
  45. package/dist/element/templates/sheets.js.map +1 -0
  46. package/dist/element/widget.d.ts +75 -0
  47. package/dist/element/widget.d.ts.map +1 -0
  48. package/dist/element/widget.js +852 -0
  49. package/dist/element/widget.js.map +1 -0
  50. package/dist/envelope/run.d.ts +20 -0
  51. package/dist/envelope/run.d.ts.map +1 -0
  52. package/dist/envelope/run.js +104 -0
  53. package/dist/envelope/run.js.map +1 -0
  54. package/dist/index.d.ts +12 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +18 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/pow/messages.d.ts +24 -0
  59. package/dist/pow/messages.d.ts.map +1 -0
  60. package/dist/pow/messages.js +2 -0
  61. package/dist/pow/messages.js.map +1 -0
  62. package/dist/pow/oom.d.ts +7 -0
  63. package/dist/pow/oom.d.ts.map +1 -0
  64. package/dist/pow/oom.js +19 -0
  65. package/dist/pow/oom.js.map +1 -0
  66. package/dist/pow/run.d.ts +13 -0
  67. package/dist/pow/run.d.ts.map +1 -0
  68. package/dist/pow/run.js +73 -0
  69. package/dist/pow/run.js.map +1 -0
  70. package/dist/pow/solve.d.ts +32 -0
  71. package/dist/pow/solve.d.ts.map +1 -0
  72. package/dist/pow/solve.js +114 -0
  73. package/dist/pow/solve.js.map +1 -0
  74. package/dist/pow/wasm-url.d.ts +13 -0
  75. package/dist/pow/wasm-url.d.ts.map +1 -0
  76. package/dist/pow/wasm-url.js +16 -0
  77. package/dist/pow/wasm-url.js.map +1 -0
  78. package/dist/pow/worker.d.ts +2 -0
  79. package/dist/pow/worker.d.ts.map +1 -0
  80. package/dist/pow/worker.js +43 -0
  81. package/dist/pow/worker.js.map +1 -0
  82. package/dist/runtime/workers.d.ts +11 -0
  83. package/dist/runtime/workers.d.ts.map +1 -0
  84. package/dist/runtime/workers.js +36 -0
  85. package/dist/runtime/workers.js.map +1 -0
  86. package/package.json +33 -3
  87. package/src/client/instance.ts +140 -0
  88. package/src/client/transport.ts +55 -0
  89. package/src/client/urls.ts +38 -0
  90. package/src/copy/load-notice.ts +8 -0
  91. package/src/element/honeypot.ts +4 -0
  92. package/src/element/session.ts +131 -0
  93. package/src/element/start.ts +99 -0
  94. package/src/element/states.ts +73 -0
  95. package/src/element/templates/compact.css +4 -0
  96. package/src/element/templates/contrast.css +5 -0
  97. package/src/element/templates/host.ts +11 -0
  98. package/src/element/templates/names.ts +23 -0
  99. package/src/element/templates/sheets.ts +28 -0
  100. package/src/element/templates/standard.css +5 -0
  101. package/src/element/widget.ts +982 -0
  102. package/src/envelope/run.ts +126 -0
  103. package/src/index.ts +77 -0
  104. package/src/pow/messages.ts +21 -0
  105. package/src/pow/oom.ts +20 -0
  106. package/src/pow/run.ts +78 -0
  107. package/src/pow/solve.ts +136 -0
  108. package/src/pow/wasm-url.ts +27 -0
  109. package/src/pow/worker.ts +46 -0
  110. package/src/runtime/workers.ts +40 -0
  111. package/README.md +0 -3
package/LICENSE ADDED
@@ -0,0 +1,17 @@
1
+ Gatekeep
2
+ Copyright (C) 2026 Gatekeep contributors
3
+
4
+ This program is free software; you can redistribute it and/or modify
5
+ it under the terms of the GNU General Public License as published by
6
+ the Free Software Foundation; either version 2 of the License, or
7
+ (at your option) any later version.
8
+
9
+ This program is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ GNU General Public License for more details.
13
+
14
+ You should have received a copy of the GNU General Public License
15
+ along with this program; if not, see <https://www.gnu.org/licenses/>.
16
+
17
+ SPDX-License-Identifier: GPL-2.0-or-later
@@ -0,0 +1,35 @@
1
+ /**
2
+ * POST challenge und redeem gegen die gesetzte Instanz-URL.
3
+ * Spec: specs/001-protocol-core/contracts/protocol-v1.md
4
+ * Spec: specs/002-widget/tasks.md T-206
5
+ * Redeem-Body (Option A): challenge + solution + hostname.
6
+ */
7
+ import { type Transport } from "./transport.js";
8
+ export interface ChallengeIssueRequest {
9
+ readonly hostname: string;
10
+ readonly action?: string;
11
+ readonly cdata?: string;
12
+ }
13
+ export interface RedeemSuccess {
14
+ readonly token: string;
15
+ readonly expires_in: number;
16
+ }
17
+ export declare class InstanceClientError extends Error {
18
+ readonly status: number;
19
+ readonly errorCodes: readonly string[];
20
+ readonly retryAfter: number | undefined;
21
+ constructor(message: string, status: number, errorCodes: readonly string[], retryAfter?: number);
22
+ }
23
+ export interface InstanceClient {
24
+ readonly challengeUrl: string;
25
+ readonly redeemUrl: string;
26
+ requestChallenge(body: ChallengeIssueRequest): Promise<unknown>;
27
+ redeem(body: unknown): Promise<RedeemSuccess>;
28
+ }
29
+ export interface InstanceClientOptions {
30
+ readonly baseUrl: string;
31
+ readonly siteKey: string;
32
+ readonly transport?: Transport;
33
+ }
34
+ export declare function createInstanceClient(options: InstanceClientOptions): InstanceClient;
35
+ //# sourceMappingURL=instance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instance.d.ts","sourceRoot":"","sources":["../../src/client/instance.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAkB,KAAK,SAAS,EAA0B,MAAM,gBAAgB,CAAC;AAGxF,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;gBAGtC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,SAAS,MAAM,EAAE,EAC7B,UAAU,CAAC,EAAE,MAAM;CAQtB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChE,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;CAChC;AAyCD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,cAAc,CAgDnF"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * POST challenge und redeem gegen die gesetzte Instanz-URL.
3
+ * Spec: specs/001-protocol-core/contracts/protocol-v1.md
4
+ * Spec: specs/002-widget/tasks.md T-206
5
+ * Redeem-Body (Option A): challenge + solution + hostname.
6
+ */
7
+ import { fetchTransport } from "./transport.js";
8
+ import { instanceRouteUrl } from "./urls.js";
9
+ export class InstanceClientError extends Error {
10
+ status;
11
+ errorCodes;
12
+ retryAfter;
13
+ constructor(message, status, errorCodes, retryAfter) {
14
+ super(message);
15
+ this.name = "InstanceClientError";
16
+ this.status = status;
17
+ this.errorCodes = errorCodes;
18
+ this.retryAfter = retryAfter;
19
+ }
20
+ }
21
+ function readErrorCodes(body) {
22
+ if (body === null || typeof body !== "object" || !("error-codes" in body)) {
23
+ return [];
24
+ }
25
+ const codes = body["error-codes"];
26
+ if (!Array.isArray(codes)) {
27
+ return [];
28
+ }
29
+ return codes.filter((item) => typeof item === "string");
30
+ }
31
+ function readRetryAfter(body) {
32
+ if (body === null || typeof body !== "object" || !("retry-after" in body)) {
33
+ return undefined;
34
+ }
35
+ const value = body["retry-after"];
36
+ return typeof value === "number" && Number.isFinite(value) ? value : undefined;
37
+ }
38
+ function requireHostname(body) {
39
+ if (typeof body.hostname !== "string" || body.hostname.trim() === "") {
40
+ throw new InstanceClientError("hostname is required", 0, ["malformed_encoding"]);
41
+ }
42
+ }
43
+ function requireRedeemSuccess(body) {
44
+ if (body === null || typeof body !== "object") {
45
+ throw new InstanceClientError("redeem response is not an object", 200, ["malformed_encoding"]);
46
+ }
47
+ const record = body;
48
+ if (typeof record.token !== "string" || record.token.length === 0) {
49
+ throw new InstanceClientError("redeem response missing token", 200, ["malformed_encoding"]);
50
+ }
51
+ if (typeof record.expires_in !== "number" || !Number.isFinite(record.expires_in)) {
52
+ throw new InstanceClientError("redeem response missing expires_in", 200, ["malformed_encoding"]);
53
+ }
54
+ return { token: record.token, expires_in: record.expires_in };
55
+ }
56
+ export function createInstanceClient(options) {
57
+ const challengeUrl = instanceRouteUrl(options.baseUrl, options.siteKey, "challenge");
58
+ const redeemUrl = instanceRouteUrl(options.baseUrl, options.siteKey, "redeem");
59
+ const transport = options.transport ?? fetchTransport;
60
+ async function post(url, body) {
61
+ return transport({
62
+ url,
63
+ method: "POST",
64
+ body,
65
+ headers: {},
66
+ });
67
+ }
68
+ return {
69
+ challengeUrl,
70
+ redeemUrl,
71
+ async requestChallenge(body) {
72
+ requireHostname(body);
73
+ const payload = {
74
+ hostname: body.hostname,
75
+ ...(body.action !== undefined ? { action: body.action } : {}),
76
+ ...(body.cdata !== undefined ? { cdata: body.cdata } : {}),
77
+ };
78
+ const response = await post(challengeUrl, payload);
79
+ if (response.status === 200) {
80
+ return response.body;
81
+ }
82
+ throw new InstanceClientError("challenge request failed", response.status, readErrorCodes(response.body), readRetryAfter(response.body));
83
+ },
84
+ async redeem(body) {
85
+ const response = await post(redeemUrl, body);
86
+ if (response.status === 200) {
87
+ return requireRedeemSuccess(response.body);
88
+ }
89
+ throw new InstanceClientError("redeem request failed", response.status, readErrorCodes(response.body), readRetryAfter(response.body));
90
+ },
91
+ };
92
+ }
93
+ //# sourceMappingURL=instance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instance.js","sourceRoot":"","sources":["../../src/client/instance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Injizierbarer Transport. Default: fetch. Verify-Route nicht genutzt.
3
+ * Spec: specs/002-widget/tasks.md T-206
4
+ * Spec: specs/002-widget/spec.md §Adressierung
5
+ * Kein @cloudware-de/gatekeeper-protocol-Import — Fixture lädt dist/ ohne Import-Map.
6
+ */
7
+ export interface TransportRequest {
8
+ readonly url: string;
9
+ readonly method: "POST";
10
+ readonly body: unknown;
11
+ readonly headers: Readonly<Record<string, string>>;
12
+ }
13
+ export interface TransportResponse {
14
+ readonly status: number;
15
+ readonly body: unknown;
16
+ }
17
+ export type Transport = (request: TransportRequest) => Promise<TransportResponse>;
18
+ export declare function fetchTransport(request: TransportRequest): Promise<TransportResponse>;
19
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/client/transport.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAkBH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAElF,wBAAsB,cAAc,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAiB1F"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Injizierbarer Transport. Default: fetch. Verify-Route nicht genutzt.
3
+ * Spec: specs/002-widget/tasks.md T-206
4
+ * Spec: specs/002-widget/spec.md §Adressierung
5
+ * Kein @cloudware-de/gatekeeper-protocol-Import — Fixture lädt dist/ ohne Import-Map.
6
+ */
7
+ function encodeBase64Url(bytes) {
8
+ let bin = "";
9
+ for (const byte of bytes) {
10
+ bin += String.fromCharCode(byte);
11
+ }
12
+ return btoa(bin).replaceAll("+", "-").replaceAll("/", "_").replace(/=+$/u, "");
13
+ }
14
+ function jsonBody(body) {
15
+ return JSON.stringify(body, (_key, value) => {
16
+ if (value instanceof Uint8Array) {
17
+ return encodeBase64Url(value);
18
+ }
19
+ return value;
20
+ });
21
+ }
22
+ export async function fetchTransport(request) {
23
+ const response = await fetch(request.url, {
24
+ method: request.method,
25
+ headers: {
26
+ accept: "application/json",
27
+ "content-type": "application/json",
28
+ ...request.headers,
29
+ },
30
+ body: jsonBody(request.body),
31
+ });
32
+ let body = null;
33
+ try {
34
+ body = await response.json();
35
+ }
36
+ catch {
37
+ body = null;
38
+ }
39
+ return { status: response.status, body };
40
+ }
41
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/client/transport.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,SAAS,eAAe,CAAC,KAAiB;IACxC,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,QAAQ,CAAC,IAAa;IAC7B,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC1C,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;YAChC,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAeD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAyB;IAC5D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QACxC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE;YACP,MAAM,EAAE,kBAAkB;YAC1B,cAAc,EAAE,kBAAkB;YAClC,GAAG,OAAO,CAAC,OAAO;SACnB;QACD,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;KAC7B,CAAC,CAAC;IACH,IAAI,IAAI,GAAY,IAAI,CAAC;IACzB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,GAAG,IAAI,CAAC;IACd,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Modul-1-Adressierung: {base}/{siteKey}/challenge|redeem.
3
+ * Spec: specs/001-protocol-core/spec.md §Adressierung
4
+ * Spec: specs/002-widget/spec.md §Adressierung
5
+ * Spec: specs/002-widget/tasks.md T-206
6
+ */
7
+ export type InstanceRoute = "challenge" | "redeem";
8
+ export declare class InstanceUrlError extends Error {
9
+ constructor(message: string);
10
+ }
11
+ export declare function instanceRouteUrl(baseUrl: string, siteKey: string, route: InstanceRoute): string;
12
+ //# sourceMappingURL=urls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"urls.d.ts","sourceRoot":"","sources":["../../src/client/urls.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,QAAQ,CAAC;AAEnD,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,aAAa,GACnB,MAAM,CAkBR"}
@@ -0,0 +1,27 @@
1
+ export class InstanceUrlError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = "InstanceUrlError";
5
+ }
6
+ }
7
+ export function instanceRouteUrl(baseUrl, siteKey, route) {
8
+ if (siteKey.trim() === "") {
9
+ throw new InstanceUrlError("site-key is required");
10
+ }
11
+ let url;
12
+ try {
13
+ url = new URL(baseUrl);
14
+ }
15
+ catch {
16
+ throw new InstanceUrlError("base-url is not a valid URL");
17
+ }
18
+ if (url.protocol !== "http:" && url.protocol !== "https:") {
19
+ throw new InstanceUrlError("base-url must be http: or https:");
20
+ }
21
+ const basePath = url.pathname.replace(/\/+$/, "");
22
+ url.pathname = `${basePath}/${encodeURIComponent(siteKey)}/${route}`;
23
+ url.search = "";
24
+ url.hash = "";
25
+ return url.href;
26
+ }
27
+ //# sourceMappingURL=urls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"urls.js","sourceRoot":"","sources":["../../src/client/urls.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED,MAAM,UAAU,gBAAgB,CAC9B,OAAe,EACf,OAAe,EACf,KAAoB;IAEpB,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC1B,MAAM,IAAI,gBAAgB,CAAC,sBAAsB,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,gBAAgB,CAAC,6BAA6B,CAAC,CAAC;IAC5D,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1D,MAAM,IAAI,gBAAgB,CAAC,kCAAkC,CAAC,CAAC;IACjE,CAAC;IACD,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAClD,GAAG,CAAC,QAAQ,GAAG,GAAG,QAAQ,IAAI,kBAAkB,CAAC,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC;IACrE,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;IAChB,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;IACd,OAAO,GAAG,CAAC,IAAI,CAAC;AAClB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Sichtbarer Rechenlast-Hinweis (Artikel 5).
3
+ * Spec: specs/002-widget/tasks.md T-205
4
+ * Spec: specs/002-widget/spec.md §Pflichtumfang
5
+ * Gleicher Zweck wie README.md §Rechenlast.
6
+ */
7
+ export declare const LOAD_NOTICE = "Ihr Browser l\u00F6st eine speicher- bzw. iterationsgebundene Aufgabe. Das ist Absicht (Kosten pro Angriffsversuch), kein Mining.";
8
+ //# sourceMappingURL=load-notice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-notice.d.ts","sourceRoot":"","sources":["../../src/copy/load-notice.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,WAAW,sIACwG,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Sichtbarer Rechenlast-Hinweis (Artikel 5).
3
+ * Spec: specs/002-widget/tasks.md T-205
4
+ * Spec: specs/002-widget/spec.md §Pflichtumfang
5
+ * Gleicher Zweck wie README.md §Rechenlast.
6
+ */
7
+ export const LOAD_NOTICE = "Ihr Browser löst eine speicher- bzw. iterationsgebundene Aufgabe. Das ist Absicht (Kosten pro Angriffsversuch), kein Mining.";
8
+ //# sourceMappingURL=load-notice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-notice.js","sourceRoot":"","sources":["../../src/copy/load-notice.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GACtB,8HAA8H,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Adapter honeypot field. Not part of the instrumentation envelope.
3
+ */
4
+ export declare const HONEYPOT_FIELD = "gatekeep-hp";
5
+ //# sourceMappingURL=honeypot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"honeypot.d.ts","sourceRoot":"","sources":["../../src/element/honeypot.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Adapter honeypot field. Not part of the instrumentation envelope.
3
+ */
4
+ export const HONEYPOT_FIELD = "gatekeep-hp";
5
+ //# sourceMappingURL=honeypot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"honeypot.js","sourceRoot":"","sources":["../../src/element/honeypot.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * CE-Session: Attribute → Client, WASM-URL, Envelope.
3
+ * Spec: specs/002-widget/spec.md §Adressierung §WASM §Pflichtumfang
4
+ * T-212 Drift D1 D2 D3. Kein @cloudware-de/gatekeeper-protocol-Import.
5
+ */
6
+ import { type InstanceClient } from "../client/instance.js";
7
+ import type { Transport } from "../client/transport.js";
8
+ import { type DeliveredProgram, type IsolatedRunner } from "../envelope/run.js";
9
+ export interface AttributeHost {
10
+ getAttribute(name: string): string | null;
11
+ }
12
+ export declare function readSiteKey(host: AttributeHost): string;
13
+ export declare function readBaseUrl(host: AttributeHost): string;
14
+ export declare function readWasmUrl(host: AttributeHost, moduleUrl?: string): string;
15
+ export declare function createBoundClient(host: AttributeHost, transport?: Transport): InstanceClient | null;
16
+ export declare function programFromChallenge(challenge: unknown): DeliveredProgram | null;
17
+ export declare function attestChallenge(challenge: unknown, runner?: IsolatedRunner): Promise<Uint8Array | null>;
18
+ /**
19
+ * Option A: Redeem sendet Challenge + Solution + hostname (stateless MAC).
20
+ * Spec: specs/001-protocol-core/contracts/protocol-v1.md
21
+ * Spec: packages/server/src/handler.ts redeem
22
+ */
23
+ export interface RedeemIssueContext {
24
+ readonly challenge: unknown;
25
+ readonly hostname: string;
26
+ readonly action?: string;
27
+ readonly cdata?: string;
28
+ /** Widget KDF wall time. Not PII. Server logs it only when GATEKEEP_POW_LOG=1. */
29
+ readonly solveMs?: number;
30
+ }
31
+ export declare function mergeRedeemBody(solution: unknown, attestation: Uint8Array | null, context: RedeemIssueContext): unknown;
32
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/element/session.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAClF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAG5B,MAAM,WAAW,aAAa;IAC5B,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CAC3C;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAEvD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAEvD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,aAAa,EAAE,SAAS,GAAE,MAAwB,GAAG,MAAM,CAE5F;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,aAAa,EACnB,SAAS,CAAC,EAAE,SAAS,GACpB,cAAc,GAAG,IAAI,CAWvB;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,OAAO,GAAG,gBAAgB,GAAG,IAAI,CAwBhF;AAED,wBAAsB,eAAe,CACnC,SAAS,EAAE,OAAO,EAClB,MAAM,CAAC,EAAE,cAAc,GACtB,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAM5B;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,kFAAkF;IAClF,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,OAAO,EACjB,WAAW,EAAE,UAAU,GAAG,IAAI,EAC9B,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CA6BT"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * CE-Session: Attribute → Client, WASM-URL, Envelope.
3
+ * Spec: specs/002-widget/spec.md §Adressierung §WASM §Pflichtumfang
4
+ * T-212 Drift D1 D2 D3. Kein @cloudware-de/gatekeeper-protocol-Import.
5
+ */
6
+ import { createInstanceClient } from "../client/instance.js";
7
+ import { runDeliveredProgram, } from "../envelope/run.js";
8
+ import { resolveWasmUrl } from "../pow/wasm-url.js";
9
+ export function readSiteKey(host) {
10
+ return host.getAttribute("site-key")?.trim() ?? "";
11
+ }
12
+ export function readBaseUrl(host) {
13
+ return host.getAttribute("base-url")?.trim() ?? "";
14
+ }
15
+ export function readWasmUrl(host, moduleUrl = import.meta.url) {
16
+ return resolveWasmUrl(host.getAttribute("wasm-url") ?? "", moduleUrl);
17
+ }
18
+ export function createBoundClient(host, transport) {
19
+ const siteKey = readSiteKey(host);
20
+ const baseUrl = readBaseUrl(host);
21
+ if (siteKey.length < 1 || baseUrl.length < 1) {
22
+ return null;
23
+ }
24
+ return createInstanceClient({
25
+ baseUrl,
26
+ siteKey,
27
+ ...(transport !== undefined ? { transport } : {}),
28
+ });
29
+ }
30
+ export function programFromChallenge(challenge) {
31
+ if (challenge === null || typeof challenge !== "object") {
32
+ return null;
33
+ }
34
+ const record = challenge;
35
+ const nested = record.instrumentationProgram ?? record.program;
36
+ if (nested !== null && typeof nested === "object") {
37
+ const program = nested;
38
+ if (typeof program.source === "string" && program.source.length > 0) {
39
+ return {
40
+ programId: String(program.programId ?? record.instrumentationProgramId ?? ""),
41
+ programVersion: String(program.programVersion ?? "v1"),
42
+ source: program.source,
43
+ };
44
+ }
45
+ }
46
+ if (typeof record.instrumentationSource === "string" && record.instrumentationSource.length > 0) {
47
+ return {
48
+ programId: String(record.instrumentationProgramId ?? ""),
49
+ programVersion: String(record.instrumentationProgramVersion ?? "v1"),
50
+ source: record.instrumentationSource,
51
+ };
52
+ }
53
+ return null;
54
+ }
55
+ export async function attestChallenge(challenge, runner) {
56
+ const program = programFromChallenge(challenge);
57
+ if (program === null) {
58
+ return null;
59
+ }
60
+ return runDeliveredProgram(program, runner !== undefined ? { runner } : {});
61
+ }
62
+ export function mergeRedeemBody(solution, attestation, context) {
63
+ if (typeof context.hostname !== "string" || context.hostname.trim() === "") {
64
+ throw new Error("hostname is required");
65
+ }
66
+ const extra = {
67
+ challenge: context.challenge,
68
+ hostname: context.hostname,
69
+ };
70
+ if (typeof context.action === "string" && context.action.length > 0) {
71
+ extra.action = context.action;
72
+ }
73
+ if (typeof context.cdata === "string" && context.cdata.length > 0) {
74
+ extra.cdata = context.cdata;
75
+ }
76
+ if (attestation !== null) {
77
+ extra.instrumentationEnvelope = { attestation };
78
+ }
79
+ if (typeof context.solveMs === "number" &&
80
+ Number.isInteger(context.solveMs) &&
81
+ context.solveMs >= 0 &&
82
+ context.solveMs <= 120_000) {
83
+ extra.solveMs = context.solveMs;
84
+ }
85
+ if (solution !== null && typeof solution === "object" && !Array.isArray(solution)) {
86
+ return { ...solution, ...extra };
87
+ }
88
+ return { solution, ...extra };
89
+ }
90
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/element/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Startzeitpunkt und Hard-Timeout (ADR-008, 10 s).
3
+ * Spec: specs/002-widget/tasks.md T-210
4
+ * Spec: specs/002-widget/spec.md Pflichtumfang Start / Timeout
5
+ * Nicht aus @cloudware-de/gatekeeper-protocol importieren (T-204-Fixture).
6
+ */
7
+ export declare const HARD_TIMEOUT_MS = 10000;
8
+ /** Artikel 6; nicht aus @cloudware-de/gatekeeper-protocol importieren (T-204-Fixture). */
9
+ export declare const TOKEN_TTL_MS = 300000;
10
+ export type StartMode = "interaction" | "auto" | "click";
11
+ export declare function parseStartMode(value: string | null): StartMode;
12
+ /**
13
+ * T-212 Submit-Hold: Attribut → window.GATEKEEP_SUBMIT_HOLD → true.
14
+ * Aus = kein requestSubmit nach Erfolg; Validity blockiert leeren Submit weiter.
15
+ */
16
+ export declare function parseBoolFlag(value: string | boolean | null | undefined): boolean | undefined;
17
+ export declare function parseSubmitHold(attribute: string | null, env: string | boolean | undefined): boolean;
18
+ export declare function readSubmitHold(host: {
19
+ getAttribute(name: string): string | null;
20
+ }): boolean;
21
+ export declare function expiresAtOf(value: unknown): number | null;
22
+ export declare function isChallengeExpired(value: unknown, nowMs: number): boolean;
23
+ export declare function issuedAtOf(challenge: unknown, fallbackMs: number): number;
24
+ export declare function isAbortError(err: unknown): boolean;
25
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/element/start.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,eAAe,QAAS,CAAC;AACtC,0FAA0F;AAC1F,eAAO,MAAM,YAAY,SAAU,CAAC;AAEpC,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,MAAM,GAAG,OAAO,CAAC;AAEzD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAQ9D;AAID;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAY7F;AAED,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,GAChC,OAAO,CAUT;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE;IAAE,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,OAAO,CAG3F;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAczD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAGzE;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAQzE;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAIlD"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Startzeitpunkt und Hard-Timeout (ADR-008, 10 s).
3
+ * Spec: specs/002-widget/tasks.md T-210
4
+ * Spec: specs/002-widget/spec.md Pflichtumfang Start / Timeout
5
+ * Nicht aus @cloudware-de/gatekeeper-protocol importieren (T-204-Fixture).
6
+ */
7
+ export const HARD_TIMEOUT_MS = 10_000;
8
+ /** Artikel 6; nicht aus @cloudware-de/gatekeeper-protocol importieren (T-204-Fixture). */
9
+ export const TOKEN_TTL_MS = 300_000;
10
+ export function parseStartMode(value) {
11
+ if (value === "auto") {
12
+ return "auto";
13
+ }
14
+ if (value === "click") {
15
+ return "click";
16
+ }
17
+ return "interaction";
18
+ }
19
+ const FALSEY_FLAG = /^(0|false|off|no)$/i;
20
+ /**
21
+ * T-212 Submit-Hold: Attribut → window.GATEKEEP_SUBMIT_HOLD → true.
22
+ * Aus = kein requestSubmit nach Erfolg; Validity blockiert leeren Submit weiter.
23
+ */
24
+ export function parseBoolFlag(value) {
25
+ if (value === undefined || value === null) {
26
+ return undefined;
27
+ }
28
+ if (typeof value === "boolean") {
29
+ return value;
30
+ }
31
+ const trimmed = value.trim();
32
+ if (trimmed.length === 0) {
33
+ return true;
34
+ }
35
+ return !FALSEY_FLAG.test(trimmed);
36
+ }
37
+ export function parseSubmitHold(attribute, env) {
38
+ const fromAttr = parseBoolFlag(attribute);
39
+ if (fromAttr !== undefined) {
40
+ return fromAttr;
41
+ }
42
+ const fromEnv = parseBoolFlag(env);
43
+ if (fromEnv !== undefined) {
44
+ return fromEnv;
45
+ }
46
+ return true;
47
+ }
48
+ export function readSubmitHold(host) {
49
+ const env = typeof window !== "undefined" ? window.GATEKEEP_SUBMIT_HOLD : undefined;
50
+ return parseSubmitHold(host.getAttribute("submit-hold"), env);
51
+ }
52
+ export function expiresAtOf(value) {
53
+ if (value === null || typeof value !== "object") {
54
+ return null;
55
+ }
56
+ if ("expiresAt" in value) {
57
+ const raw = value.expiresAt;
58
+ if (typeof raw === "number" && Number.isInteger(raw) && raw >= 0) {
59
+ return raw;
60
+ }
61
+ }
62
+ if ("challenge" in value) {
63
+ return expiresAtOf(value.challenge);
64
+ }
65
+ return null;
66
+ }
67
+ export function isChallengeExpired(value, nowMs) {
68
+ const expiresAt = expiresAtOf(value);
69
+ return expiresAt !== null && nowMs >= expiresAt;
70
+ }
71
+ export function issuedAtOf(challenge, fallbackMs) {
72
+ if (challenge !== null && typeof challenge === "object" && "issuedAt" in challenge) {
73
+ const value = challenge.issuedAt;
74
+ if (typeof value === "number" && Number.isInteger(value) && value >= 0) {
75
+ return value;
76
+ }
77
+ }
78
+ return fallbackMs;
79
+ }
80
+ export function isAbortError(err) {
81
+ return err instanceof DOMException
82
+ ? err.name === "AbortError"
83
+ : err instanceof Error && err.name === "AbortError";
84
+ }
85
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/element/start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * T-204 UI-Zustände und getrennte ARIA-Labels (Artikel 10).
3
+ * Spec: specs/002-widget/tasks.md T-204
4
+ * Spec: specs/002-widget/spec.md §Öffentliches Custom-Element-API
5
+ */
6
+ export declare const WIDGET_UI_STATES: readonly ["idle", "working", "success", "error", "timeout"];
7
+ export type WidgetUiState = (typeof WIDGET_UI_STATES)[number];
8
+ export declare const ARIA_LABELS: Readonly<Record<WidgetUiState, string>>;
9
+ export declare function isWidgetUiState(value: string): value is WidgetUiState;
10
+ export declare function labelForState(state: WidgetUiState): string;
11
+ /** T-204-Default. Attribut `missing-token` überschreibt (leer = Default). */
12
+ export declare const TOKEN_MISSING_MESSAGE = "Cloudware Gatekeeper: Bitte zuerst die Pr\u00FCfung abschlie\u00DFen.";
13
+ export interface CopyHost {
14
+ getAttribute(name: string): string | null;
15
+ }
16
+ /**
17
+ * Idle/success dürfen per Attribut überschrieben werden.
18
+ * working / error / timeout bleiben T-204.
19
+ * Spec: specs/002-widget/spec.md §Öffentliches Custom-Element-API
20
+ */
21
+ export declare function labelForHost(host: CopyHost, state: WidgetUiState): string;
22
+ export declare function missingTokenMessage(host: CopyHost): string;
23
+ /** Challenge-TTL (300 s), nicht T-210 Hard-Timeout. Attribut `expired-challenge`. */
24
+ export declare const CHALLENGE_EXPIRED_MESSAGE = "Cloudware Gatekeeper: Challenge abgelaufen \u2014 bitte erneut versuchen";
25
+ export declare function challengeExpiredMessage(host: CopyHost): string;
26
+ //# sourceMappingURL=states.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"states.d.ts","sourceRoot":"","sources":["../../src/element/states.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,6DAMnB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9D,eAAO,MAAM,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAM/D,CAAC;AAEF,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,aAAa,CAErE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAE1D;AAED,6EAA6E;AAC7E,eAAO,MAAM,qBAAqB,0EAC6B,CAAC;AAEhE,MAAM,WAAW,QAAQ;IACvB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CAC3C;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,GAAG,MAAM,CAczE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAG1D;AAED,qFAAqF;AACrF,eAAO,MAAM,yBAAyB,6EACiC,CAAC;AAExE,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAG9D"}