@proappstore/sdk 1.16.6 → 1.16.8
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.
- package/dist/auth.d.ts +10 -4
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +33 -9
- package/dist/auth.js.map +1 -1
- package/package.json +1 -1
package/dist/auth.d.ts
CHANGED
|
@@ -6,9 +6,15 @@ export declare class Auth {
|
|
|
6
6
|
private readonly apiBase;
|
|
7
7
|
private session;
|
|
8
8
|
private listeners;
|
|
9
|
+
private lastAuthError;
|
|
9
10
|
constructor(appId: string, apiBase: string);
|
|
10
11
|
/** Current signed-in user, or null if not authenticated. */
|
|
11
12
|
get user(): User | null;
|
|
13
|
+
/**
|
|
14
|
+
* Reason the last sign-in failed (e.g. 'access_denied', 'profile_fetch_failed'),
|
|
15
|
+
* captured from the `#auth_error=` callback hash by init(); null if none.
|
|
16
|
+
*/
|
|
17
|
+
get authError(): string | null;
|
|
12
18
|
/** Current session token, or null if not authenticated. */
|
|
13
19
|
get token(): string | null;
|
|
14
20
|
/** Subscribe to auth state changes. Fires immediately with current user, then on every change. */
|
|
@@ -18,13 +24,13 @@ export declare class Auth {
|
|
|
18
24
|
* which redirects back to the current page with a session token in the hash.
|
|
19
25
|
*
|
|
20
26
|
* The current page's `location.hash` is dropped from `return_to` because
|
|
21
|
-
* the OAuth callback writes its own
|
|
27
|
+
* the OAuth callback writes its own session hash and would clobber any
|
|
22
28
|
* hash-based router state otherwise.
|
|
23
29
|
*/
|
|
24
30
|
signIn(provider?: AuthProvider): void;
|
|
25
31
|
/**
|
|
26
32
|
* Email magic-link sign-in. Sends the user an email with a one-time link
|
|
27
|
-
* that completes auth and redirects back here with
|
|
33
|
+
* that completes auth and redirects back here with the session hash.
|
|
28
34
|
*
|
|
29
35
|
* Resolves once the email has been queued. The caller should show a
|
|
30
36
|
* "check your inbox" message — the actual sign-in happens later when
|
|
@@ -52,8 +58,8 @@ export declare class Auth {
|
|
|
52
58
|
* session from localStorage.
|
|
53
59
|
*
|
|
54
60
|
* @example
|
|
55
|
-
* const
|
|
56
|
-
* await
|
|
61
|
+
* const app = initPro({ appId: 'my-app' });
|
|
62
|
+
* await app.auth.init();
|
|
57
63
|
* render();
|
|
58
64
|
*/
|
|
59
65
|
init(): Promise<void>;
|
package/dist/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAEzD,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAEzD,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAkBzD,oEAAoE;AACpE,qBAAa,IAAI;IAMb,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAN1B,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,SAAS,CAA0C;IAC3D,OAAO,CAAC,aAAa,CAAuB;gBAGzB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM;IAMlC,4DAA4D;IAC5D,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,CAEtB;IAED;;;OAGG;IACH,IAAI,SAAS,IAAI,MAAM,GAAG,IAAI,CAE7B;IAED,2DAA2D;IAC3D,IAAI,KAAK,IAAI,MAAM,GAAG,IAAI,CAEzB;IAED,kGAAkG;IAClG,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG,WAAW;IAM5D;;;;;;;OAOG;IACH,MAAM,CAAC,QAAQ,GAAE,YAAuB,GAAG,IAAI;IAa/C;;;;;;;;;;;OAWG;IACG,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAenD,8CAA8C;IAC9C,OAAO,IAAI,IAAI;IAQf;;;;OAIG;IACH,kBAAkB,IAAI,IAAI;IAI1B;;;;;;;;;;;;OAYG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAwC3B;;;;;;OAMG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YA4B1C,SAAS;IAQvB,+EAA+E;IAC/E,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,IAAI;CAGb"}
|
package/dist/auth.js
CHANGED
|
@@ -1,14 +1,19 @@
|
|
|
1
|
+
/** PAS-owned localStorage key for the cached session (per-origin). */
|
|
2
|
+
const STORAGE_KEY = 'pas:session';
|
|
1
3
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
+
* Hash param the platform auth service returns the session in. This is the one
|
|
5
|
+
* remaining brand leak: PAS does not yet run its own auth worker, so the shared
|
|
6
|
+
* platform auth service issues the callback as `#fas_session=`. When PAS owns
|
|
7
|
+
* auth (see the de-FAS plan) this becomes `#pas_session=`.
|
|
4
8
|
*/
|
|
5
|
-
const
|
|
9
|
+
const SESSION_HASH = '#fas_session=';
|
|
6
10
|
/** OAuth authentication — sign in, sign out, session management. */
|
|
7
11
|
export class Auth {
|
|
8
12
|
appId;
|
|
9
13
|
apiBase;
|
|
10
14
|
session = null;
|
|
11
15
|
listeners = new Set();
|
|
16
|
+
lastAuthError = null;
|
|
12
17
|
constructor(appId, apiBase) {
|
|
13
18
|
this.appId = appId;
|
|
14
19
|
this.apiBase = apiBase;
|
|
@@ -20,6 +25,13 @@ export class Auth {
|
|
|
20
25
|
get user() {
|
|
21
26
|
return this.session?.user ?? null;
|
|
22
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Reason the last sign-in failed (e.g. 'access_denied', 'profile_fetch_failed'),
|
|
30
|
+
* captured from the `#auth_error=` callback hash by init(); null if none.
|
|
31
|
+
*/
|
|
32
|
+
get authError() {
|
|
33
|
+
return this.lastAuthError;
|
|
34
|
+
}
|
|
23
35
|
/** Current session token, or null if not authenticated. */
|
|
24
36
|
get token() {
|
|
25
37
|
return this.session?.token ?? null;
|
|
@@ -35,7 +47,7 @@ export class Auth {
|
|
|
35
47
|
* which redirects back to the current page with a session token in the hash.
|
|
36
48
|
*
|
|
37
49
|
* The current page's `location.hash` is dropped from `return_to` because
|
|
38
|
-
* the OAuth callback writes its own
|
|
50
|
+
* the OAuth callback writes its own session hash and would clobber any
|
|
39
51
|
* hash-based router state otherwise.
|
|
40
52
|
*/
|
|
41
53
|
signIn(provider = 'github') {
|
|
@@ -53,7 +65,7 @@ export class Auth {
|
|
|
53
65
|
}
|
|
54
66
|
/**
|
|
55
67
|
* Email magic-link sign-in. Sends the user an email with a one-time link
|
|
56
|
-
* that completes auth and redirects back here with
|
|
68
|
+
* that completes auth and redirects back here with the session hash.
|
|
57
69
|
*
|
|
58
70
|
* Resolves once the email has been queued. The caller should show a
|
|
59
71
|
* "check your inbox" message — the actual sign-in happens later when
|
|
@@ -104,15 +116,27 @@ export class Auth {
|
|
|
104
116
|
* session from localStorage.
|
|
105
117
|
*
|
|
106
118
|
* @example
|
|
107
|
-
* const
|
|
108
|
-
* await
|
|
119
|
+
* const app = initPro({ appId: 'my-app' });
|
|
120
|
+
* await app.auth.init();
|
|
109
121
|
* render();
|
|
110
122
|
*/
|
|
111
123
|
async init() {
|
|
112
124
|
if (typeof window === 'undefined')
|
|
113
125
|
return;
|
|
114
126
|
const hash = window.location.hash;
|
|
115
|
-
|
|
127
|
+
// A failed sign-in bounces back with `#auth_error=<reason>` — record it and
|
|
128
|
+
// clear the hash so the user isn't stuck on a broken URL or stuck retrying.
|
|
129
|
+
if (hash.startsWith('#auth_error=')) {
|
|
130
|
+
try {
|
|
131
|
+
this.lastAuthError = decodeURIComponent(hash.slice('#auth_error='.length)) || 'unknown';
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
this.lastAuthError = 'unknown';
|
|
135
|
+
}
|
|
136
|
+
history.replaceState(null, '', window.location.pathname + window.location.search);
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
if (!hash.startsWith(SESSION_HASH))
|
|
116
140
|
return;
|
|
117
141
|
// Always clear the hash before doing anything else — even on failure.
|
|
118
142
|
// Otherwise a bad token gets re-tried on every reload and the user is
|
|
@@ -120,7 +144,7 @@ export class Auth {
|
|
|
120
144
|
history.replaceState(null, '', window.location.pathname + window.location.search);
|
|
121
145
|
let token;
|
|
122
146
|
try {
|
|
123
|
-
token = decodeURIComponent(hash.slice(
|
|
147
|
+
token = decodeURIComponent(hash.slice(SESSION_HASH.length));
|
|
124
148
|
}
|
|
125
149
|
catch {
|
|
126
150
|
// Malformed hash (% with nothing after, etc.). Hash already cleared.
|
package/dist/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAIA
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAIA,sEAAsE;AACtE,MAAM,WAAW,GAAG,aAAa,CAAC;AAElC;;;;;GAKG;AACH,MAAM,YAAY,GAAG,eAAe,CAAC;AAOrC,oEAAoE;AACpE,MAAM,OAAO,IAAI;IAMI;IACA;IANX,OAAO,GAAmB,IAAI,CAAC;IAC/B,SAAS,GAAG,IAAI,GAAG,EAA+B,CAAC;IACnD,aAAa,GAAkB,IAAI,CAAC;IAE5C,YACmB,KAAa,EACb,OAAe;QADf,UAAK,GAAL,KAAK,CAAQ;QACb,YAAO,GAAP,OAAO,CAAQ;QAEhC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,YAAY,EAAE,CAAC;IACxC,CAAC;IAED,4DAA4D;IAC5D,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,IAAI,CAAC;IACpC,CAAC;IAED;;;OAGG;IACH,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,2DAA2D;IAC3D,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC;IACrC,CAAC;IAED,kGAAkG;IAClG,QAAQ,CAAC,QAAqC;QAC5C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,WAAyB,QAAQ;QACtC,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO;QAC1C,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC9E,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,YAAY,QAAQ,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAChE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;IACzC,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,eAAe,CAAC,KAAa;QACjC,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO;QAC1C,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,sBAAsB,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE;YACrE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;SAC9E,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,OAAO;QACL,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED;;;;OAIG;IACH,kBAAkB;QAChB,IAAI,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,EAAE,CAAC;IACnC,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO;QAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAElC,4EAA4E;QAC5E,4EAA4E;QAC5E,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC;gBAAC,IAAI,CAAC,aAAa,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,SAAS,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;YAAC,CAAC;YAC1I,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAClF,OAAO;QACT,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;YAAE,OAAO;QAE3C,sEAAsE;QACtE,sEAAsE;QACtE,uCAAuC;QACvC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAElF,IAAI,KAAa,CAAC;QAClB,IAAI,CAAC;YACH,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9D,CAAC;QAAC,MAAM,CAAC;YACP,qEAAqE;YACrE,OAAO;QACT,CAAC;QACD,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACzC,IAAI,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YAC/B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAChC,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC;QAAC,MAAM,CAAC;YACP,wEAAwE;YACxE,+DAA+D;QACjE,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,cAAc,CAAC,WAAmB;QACtC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,2BAA2B,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE;YAC/E,MAAM,EAAE,OAAO;YACf,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;gBAC7C,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC;SACtC,CAAC,CAAC;QACH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAS,CAAC;QAC7C,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;QACzC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,KAAa;QACnC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE;YACjE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;SAC9C,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACrE,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAS,CAAC;IACzC,CAAC;IAED,+EAA+E;IACvE,YAAY;QAClB,IAAI,OAAO,KAAK,KAAK,WAAW;YAAE,OAAO,CAAC,iBAAiB;QAC3D,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC;QAC9B,IAAI,CAAC,CAAC;YAAE,OAAO;QACf,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,YAAY,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,sBAAsB,EAAE;YACrF,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,CAAC,EAAE,EAAE;SAC1C,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,wBAAwB;IAC9C,CAAC;IAEO,WAAW;QACjB,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO,IAAI,CAAC;QAC/C,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACrD,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,OAAgB;QACnC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IACpE,CAAC;IAEO,IAAI;QACV,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS;YAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC;CACF"}
|