oidc-spa 6.1.13 → 6.1.15
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/mock/oidc.js +31 -41
- package/mock/oidc.js.map +1 -1
- package/oidc/createOidc.js +93 -31
- package/oidc/createOidc.js.map +1 -1
- package/oidc/handleOidcCallback.js +9 -21
- package/oidc/handleOidcCallback.js.map +1 -1
- package/oidc/loginSilent.d.ts +6 -2
- package/oidc/loginSilent.js +15 -13
- package/oidc/loginSilent.js.map +1 -1
- package/oidc/oidcClientTsUserToTokens.js +4 -2
- package/oidc/oidcClientTsUserToTokens.js.map +1 -1
- package/oidc/persistedLogoutState.d.ts +9 -0
- package/oidc/persistedLogoutState.js +25 -0
- package/oidc/persistedLogoutState.js.map +1 -0
- package/package.json +6 -6
- package/src/mock/oidc.ts +22 -24
- package/src/oidc/createOidc.ts +93 -32
- package/src/oidc/handleOidcCallback.ts +10 -21
- package/src/oidc/loginSilent.ts +40 -28
- package/src/oidc/oidcClientTsUserToTokens.ts +5 -3
- package/src/oidc/persistedLogoutState.ts +29 -0
- package/src/tools/urlQueryParams.ts +0 -113
- package/tools/urlQueryParams.d.ts +0 -31
- package/tools/urlQueryParams.js +0 -112
- package/tools/urlQueryParams.js.map +0 -1
package/src/oidc/loginSilent.ts
CHANGED
|
@@ -2,9 +2,9 @@ import type { UserManager as OidcClientTsUserManager } from "../vendor/frontend/
|
|
|
2
2
|
import { Deferred } from "../tools/Deferred";
|
|
3
3
|
import { id, assert } from "../vendor/frontend/tsafe";
|
|
4
4
|
import { getStateData, clearStateStore, type StateData } from "./StateData";
|
|
5
|
-
import { addQueryParamToUrl } from "../tools/urlQueryParams";
|
|
6
5
|
import { getDownlinkAndRtt } from "../tools/getDownlinkAndRtt";
|
|
7
6
|
import { getIsDev } from "../tools/isDev";
|
|
7
|
+
import type { User as OidcClientTsUser } from "../vendor/frontend/oidc-client-ts-and-jwt-decode";
|
|
8
8
|
|
|
9
9
|
export type AuthResponse = {
|
|
10
10
|
state: string;
|
|
@@ -16,27 +16,27 @@ function getIsAuthResponse(data: any): data is AuthResponse {
|
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
export function authResponseToUrl(authResponse: AuthResponse): string {
|
|
19
|
-
|
|
19
|
+
const authResponseUrl = new URL("https://dummy.com");
|
|
20
20
|
|
|
21
21
|
for (const [name, value] of Object.entries(authResponse)) {
|
|
22
|
-
authResponseUrl
|
|
23
|
-
url: authResponseUrl,
|
|
24
|
-
name,
|
|
25
|
-
value
|
|
26
|
-
}).newUrl;
|
|
22
|
+
authResponseUrl.searchParams.set(name, value);
|
|
27
23
|
}
|
|
28
24
|
|
|
29
|
-
return authResponseUrl;
|
|
25
|
+
return authResponseUrl.href;
|
|
30
26
|
}
|
|
31
27
|
|
|
32
28
|
type ResultOfLoginSilent =
|
|
33
29
|
| {
|
|
34
|
-
|
|
30
|
+
outcome: "success iframe";
|
|
35
31
|
authResponse: AuthResponse;
|
|
36
32
|
}
|
|
37
33
|
| {
|
|
38
|
-
|
|
34
|
+
outcome: "failure";
|
|
39
35
|
cause: "timeout" | "can't reach well-known oidc endpoint";
|
|
36
|
+
}
|
|
37
|
+
| {
|
|
38
|
+
outcome: "refresh token used";
|
|
39
|
+
oidcClientTsUser: OidcClientTsUser;
|
|
40
40
|
};
|
|
41
41
|
|
|
42
42
|
export async function loginSilent(params: {
|
|
@@ -73,7 +73,7 @@ export async function loginSilent(params: {
|
|
|
73
73
|
|
|
74
74
|
const timeout = setTimeout(async () => {
|
|
75
75
|
dResult.resolve({
|
|
76
|
-
|
|
76
|
+
outcome: "failure",
|
|
77
77
|
cause: "timeout"
|
|
78
78
|
});
|
|
79
79
|
}, timeoutDelayMs);
|
|
@@ -99,7 +99,7 @@ export async function loginSilent(params: {
|
|
|
99
99
|
window.removeEventListener("message", listener);
|
|
100
100
|
|
|
101
101
|
dResult.resolve({
|
|
102
|
-
|
|
102
|
+
outcome: "success iframe",
|
|
103
103
|
authResponse
|
|
104
104
|
});
|
|
105
105
|
};
|
|
@@ -115,30 +115,42 @@ export async function loginSilent(params: {
|
|
|
115
115
|
silentRequestTimeoutInSeconds: timeoutDelayMs / 1000,
|
|
116
116
|
extraTokenParams: getExtraTokenParams?.()
|
|
117
117
|
})
|
|
118
|
-
.
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
// well-known oidc endpoint failed.
|
|
122
|
-
// This usually means that the server is down or that the issuerUri
|
|
123
|
-
// is not pointing to a valid oidc server.
|
|
124
|
-
// It could be a CORS error on the well-known endpoint but it's unlikely.
|
|
118
|
+
.then(
|
|
119
|
+
oidcClientTsUser => {
|
|
120
|
+
assert(oidcClientTsUser !== null);
|
|
125
121
|
|
|
126
122
|
clearTimeout(timeout);
|
|
127
123
|
|
|
128
124
|
dResult.resolve({
|
|
129
|
-
|
|
130
|
-
|
|
125
|
+
outcome: "refresh token used",
|
|
126
|
+
oidcClientTsUser
|
|
131
127
|
});
|
|
132
|
-
|
|
133
|
-
|
|
128
|
+
},
|
|
129
|
+
(error: Error) => {
|
|
130
|
+
if (error.message === "Failed to fetch") {
|
|
131
|
+
// NOTE: If we got an error here it means that the fetch to the
|
|
132
|
+
// well-known oidc endpoint failed.
|
|
133
|
+
// This usually means that the server is down or that the issuerUri
|
|
134
|
+
// is not pointing to a valid oidc server.
|
|
135
|
+
// It could be a CORS error on the well-known endpoint but it's unlikely.
|
|
136
|
+
|
|
137
|
+
clearTimeout(timeout);
|
|
138
|
+
|
|
139
|
+
dResult.resolve({
|
|
140
|
+
outcome: "failure",
|
|
141
|
+
cause: "can't reach well-known oidc endpoint"
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// NOTE: Here, except error on our understanding there can't be any other
|
|
148
|
+
// error than timeout so we fail silently and let the timeout expire.
|
|
134
149
|
}
|
|
135
|
-
|
|
136
|
-
// NOTE: Here, except error on our understanding there can't be any other
|
|
137
|
-
// error than timeout so we fail silently and let the timeout expire.
|
|
138
|
-
});
|
|
150
|
+
);
|
|
139
151
|
|
|
140
152
|
dResult.pr.then(result => {
|
|
141
|
-
if (
|
|
153
|
+
if (result.outcome === "failure") {
|
|
142
154
|
clearStateStore({ stateQueryParamValue: stateQueryParamValue_instance });
|
|
143
155
|
}
|
|
144
156
|
});
|
|
@@ -39,9 +39,11 @@ export function oidcClientTsUserToTokens<DecodedIdToken extends Record<string, u
|
|
|
39
39
|
|
|
40
40
|
const refreshToken = oidcClientTsUser.refresh_token;
|
|
41
41
|
|
|
42
|
-
assert(refreshToken !== undefined, "No refresh token provided by the oidc server");
|
|
43
|
-
|
|
44
42
|
const refreshTokenExpirationTime = (() => {
|
|
43
|
+
if (refreshToken === undefined) {
|
|
44
|
+
return Number.POSITIVE_INFINITY;
|
|
45
|
+
}
|
|
46
|
+
|
|
45
47
|
read_from_jwt: {
|
|
46
48
|
const expirationTime = readExpirationTimeInJwt(refreshToken);
|
|
47
49
|
|
|
@@ -71,7 +73,7 @@ export function oidcClientTsUserToTokens<DecodedIdToken extends Record<string, u
|
|
|
71
73
|
const tokens: Oidc.Tokens<DecodedIdToken> = {
|
|
72
74
|
accessToken,
|
|
73
75
|
accessTokenExpirationTime,
|
|
74
|
-
refreshToken,
|
|
76
|
+
refreshToken: refreshToken ?? "",
|
|
75
77
|
refreshTokenExpirationTime,
|
|
76
78
|
idToken,
|
|
77
79
|
decodedIdToken: null as any
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
function getKey(params: { configId: string }) {
|
|
2
|
+
const { configId } = params;
|
|
3
|
+
|
|
4
|
+
return `oidc-spa:is-logged-out:${configId}`;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function persistLogoutState(params: { configId: string }) {
|
|
8
|
+
const { configId } = params;
|
|
9
|
+
|
|
10
|
+
const key = getKey({ configId });
|
|
11
|
+
|
|
12
|
+
localStorage.setItem(key, "true");
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function clearPersistedLogoutState(params: { configId: string }) {
|
|
16
|
+
const { configId } = params;
|
|
17
|
+
|
|
18
|
+
const key = getKey({ configId });
|
|
19
|
+
|
|
20
|
+
localStorage.removeItem(key);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function getIsPersistedLogoutState(params: { configId: string }) {
|
|
24
|
+
const { configId } = params;
|
|
25
|
+
|
|
26
|
+
const key = getKey({ configId });
|
|
27
|
+
|
|
28
|
+
return localStorage.getItem(key) === "true";
|
|
29
|
+
}
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
export function addQueryParamToUrl(params: { url: string; name: string; value: string }): {
|
|
2
|
-
newUrl: string;
|
|
3
|
-
} {
|
|
4
|
-
const { url, name, value } = params;
|
|
5
|
-
|
|
6
|
-
let newUrl = url;
|
|
7
|
-
|
|
8
|
-
const result = retrieveQueryParamFromUrl({
|
|
9
|
-
url,
|
|
10
|
-
name
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
if (result.wasPresent) {
|
|
14
|
-
newUrl = result.newUrl;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
newUrl += `${
|
|
18
|
-
newUrl.includes("?") ? "&" : newUrl.endsWith("?") ? "" : "?"
|
|
19
|
-
}${name}=${encodeURIComponent(value)}`;
|
|
20
|
-
|
|
21
|
-
return { newUrl };
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export function retrieveAllQueryParamStartingWithPrefixFromUrl<
|
|
25
|
-
Prefix extends string,
|
|
26
|
-
DoLeave extends boolean
|
|
27
|
-
>(params: {
|
|
28
|
-
url: string;
|
|
29
|
-
prefix: Prefix;
|
|
30
|
-
doLeavePrefixInResults: DoLeave;
|
|
31
|
-
}): { newUrl: string; values: Record<DoLeave extends true ? `${Prefix}${string}` : string, string> } {
|
|
32
|
-
const { url, prefix, doLeavePrefixInResults } = params;
|
|
33
|
-
|
|
34
|
-
const { baseUrl, locationSearch } = (() => {
|
|
35
|
-
const [baseUrl, ...rest] = url.split("?");
|
|
36
|
-
|
|
37
|
-
return {
|
|
38
|
-
baseUrl,
|
|
39
|
-
locationSearch: rest.join("?").trim()
|
|
40
|
-
};
|
|
41
|
-
})();
|
|
42
|
-
|
|
43
|
-
const values: Record<string, string> = {};
|
|
44
|
-
|
|
45
|
-
const { newLocationSearch } = (() => {
|
|
46
|
-
let newLocationSearch = locationSearch
|
|
47
|
-
.split("&")
|
|
48
|
-
.filter(part => part !== "")
|
|
49
|
-
.map(part => part.split("=") as [string, string])
|
|
50
|
-
.filter(([key, value_i]) =>
|
|
51
|
-
!key.startsWith(prefix)
|
|
52
|
-
? true
|
|
53
|
-
: ((values[doLeavePrefixInResults ? key : key.substring(prefix.length)] =
|
|
54
|
-
decodeURIComponent(value_i)),
|
|
55
|
-
false)
|
|
56
|
-
)
|
|
57
|
-
.map(entry => entry.join("="))
|
|
58
|
-
.join("&");
|
|
59
|
-
newLocationSearch = newLocationSearch === "" ? "" : `?${newLocationSearch}`;
|
|
60
|
-
|
|
61
|
-
return { newLocationSearch };
|
|
62
|
-
})();
|
|
63
|
-
|
|
64
|
-
return {
|
|
65
|
-
newUrl: `${baseUrl}${newLocationSearch}`,
|
|
66
|
-
values
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
export function retrieveAllQueryParamFromUrl(params: { url: string }): {
|
|
71
|
-
newUrl: string;
|
|
72
|
-
values: Record<string, string>;
|
|
73
|
-
} {
|
|
74
|
-
return retrieveAllQueryParamStartingWithPrefixFromUrl({
|
|
75
|
-
url: params.url,
|
|
76
|
-
prefix: "",
|
|
77
|
-
doLeavePrefixInResults: true
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
export function retrieveQueryParamFromUrl(params: {
|
|
82
|
-
url: string;
|
|
83
|
-
name: string;
|
|
84
|
-
}): { wasPresent: false } | { wasPresent: true; newUrl: string; value: string } {
|
|
85
|
-
const { url, name } = params;
|
|
86
|
-
|
|
87
|
-
let { newUrl, values } = retrieveAllQueryParamStartingWithPrefixFromUrl({
|
|
88
|
-
url,
|
|
89
|
-
prefix: name,
|
|
90
|
-
doLeavePrefixInResults: true
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
if (!(name in values)) {
|
|
94
|
-
return { wasPresent: false };
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
const { [name]: value, ...rest } = values;
|
|
98
|
-
|
|
99
|
-
Object.entries(rest).forEach(
|
|
100
|
-
([name, value]) =>
|
|
101
|
-
(newUrl = addQueryParamToUrl({
|
|
102
|
-
name,
|
|
103
|
-
url: newUrl,
|
|
104
|
-
value
|
|
105
|
-
}).newUrl)
|
|
106
|
-
);
|
|
107
|
-
|
|
108
|
-
return {
|
|
109
|
-
wasPresent: true,
|
|
110
|
-
newUrl,
|
|
111
|
-
value: values[name]
|
|
112
|
-
};
|
|
113
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
export declare function addQueryParamToUrl(params: {
|
|
2
|
-
url: string;
|
|
3
|
-
name: string;
|
|
4
|
-
value: string;
|
|
5
|
-
}): {
|
|
6
|
-
newUrl: string;
|
|
7
|
-
};
|
|
8
|
-
export declare function retrieveAllQueryParamStartingWithPrefixFromUrl<Prefix extends string, DoLeave extends boolean>(params: {
|
|
9
|
-
url: string;
|
|
10
|
-
prefix: Prefix;
|
|
11
|
-
doLeavePrefixInResults: DoLeave;
|
|
12
|
-
}): {
|
|
13
|
-
newUrl: string;
|
|
14
|
-
values: Record<DoLeave extends true ? `${Prefix}${string}` : string, string>;
|
|
15
|
-
};
|
|
16
|
-
export declare function retrieveAllQueryParamFromUrl(params: {
|
|
17
|
-
url: string;
|
|
18
|
-
}): {
|
|
19
|
-
newUrl: string;
|
|
20
|
-
values: Record<string, string>;
|
|
21
|
-
};
|
|
22
|
-
export declare function retrieveQueryParamFromUrl(params: {
|
|
23
|
-
url: string;
|
|
24
|
-
name: string;
|
|
25
|
-
}): {
|
|
26
|
-
wasPresent: false;
|
|
27
|
-
} | {
|
|
28
|
-
wasPresent: true;
|
|
29
|
-
newUrl: string;
|
|
30
|
-
value: string;
|
|
31
|
-
};
|
package/tools/urlQueryParams.js
DELETED
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __rest = (this && this.__rest) || function (s, e) {
|
|
3
|
-
var t = {};
|
|
4
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
5
|
-
t[p] = s[p];
|
|
6
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
7
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
8
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
9
|
-
t[p[i]] = s[p[i]];
|
|
10
|
-
}
|
|
11
|
-
return t;
|
|
12
|
-
};
|
|
13
|
-
var __read = (this && this.__read) || function (o, n) {
|
|
14
|
-
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
15
|
-
if (!m) return o;
|
|
16
|
-
var i = m.call(o), r, ar = [], e;
|
|
17
|
-
try {
|
|
18
|
-
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
19
|
-
}
|
|
20
|
-
catch (error) { e = { error: error }; }
|
|
21
|
-
finally {
|
|
22
|
-
try {
|
|
23
|
-
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
24
|
-
}
|
|
25
|
-
finally { if (e) throw e.error; }
|
|
26
|
-
}
|
|
27
|
-
return ar;
|
|
28
|
-
};
|
|
29
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
-
exports.addQueryParamToUrl = addQueryParamToUrl;
|
|
31
|
-
exports.retrieveAllQueryParamStartingWithPrefixFromUrl = retrieveAllQueryParamStartingWithPrefixFromUrl;
|
|
32
|
-
exports.retrieveAllQueryParamFromUrl = retrieveAllQueryParamFromUrl;
|
|
33
|
-
exports.retrieveQueryParamFromUrl = retrieveQueryParamFromUrl;
|
|
34
|
-
function addQueryParamToUrl(params) {
|
|
35
|
-
var url = params.url, name = params.name, value = params.value;
|
|
36
|
-
var newUrl = url;
|
|
37
|
-
var result = retrieveQueryParamFromUrl({
|
|
38
|
-
url: url,
|
|
39
|
-
name: name
|
|
40
|
-
});
|
|
41
|
-
if (result.wasPresent) {
|
|
42
|
-
newUrl = result.newUrl;
|
|
43
|
-
}
|
|
44
|
-
newUrl += "".concat(newUrl.includes("?") ? "&" : newUrl.endsWith("?") ? "" : "?").concat(name, "=").concat(encodeURIComponent(value));
|
|
45
|
-
return { newUrl: newUrl };
|
|
46
|
-
}
|
|
47
|
-
function retrieveAllQueryParamStartingWithPrefixFromUrl(params) {
|
|
48
|
-
var url = params.url, prefix = params.prefix, doLeavePrefixInResults = params.doLeavePrefixInResults;
|
|
49
|
-
var _a = (function () {
|
|
50
|
-
var _a = __read(url.split("?")), baseUrl = _a[0], rest = _a.slice(1);
|
|
51
|
-
return {
|
|
52
|
-
baseUrl: baseUrl,
|
|
53
|
-
locationSearch: rest.join("?").trim()
|
|
54
|
-
};
|
|
55
|
-
})(), baseUrl = _a.baseUrl, locationSearch = _a.locationSearch;
|
|
56
|
-
var values = {};
|
|
57
|
-
var newLocationSearch = (function () {
|
|
58
|
-
var newLocationSearch = locationSearch
|
|
59
|
-
.split("&")
|
|
60
|
-
.filter(function (part) { return part !== ""; })
|
|
61
|
-
.map(function (part) { return part.split("="); })
|
|
62
|
-
.filter(function (_a) {
|
|
63
|
-
var _b = __read(_a, 2), key = _b[0], value_i = _b[1];
|
|
64
|
-
return !key.startsWith(prefix)
|
|
65
|
-
? true
|
|
66
|
-
: ((values[doLeavePrefixInResults ? key : key.substring(prefix.length)] =
|
|
67
|
-
decodeURIComponent(value_i)),
|
|
68
|
-
false);
|
|
69
|
-
})
|
|
70
|
-
.map(function (entry) { return entry.join("="); })
|
|
71
|
-
.join("&");
|
|
72
|
-
newLocationSearch = newLocationSearch === "" ? "" : "?".concat(newLocationSearch);
|
|
73
|
-
return { newLocationSearch: newLocationSearch };
|
|
74
|
-
})().newLocationSearch;
|
|
75
|
-
return {
|
|
76
|
-
newUrl: "".concat(baseUrl).concat(newLocationSearch),
|
|
77
|
-
values: values
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
function retrieveAllQueryParamFromUrl(params) {
|
|
81
|
-
return retrieveAllQueryParamStartingWithPrefixFromUrl({
|
|
82
|
-
url: params.url,
|
|
83
|
-
prefix: "",
|
|
84
|
-
doLeavePrefixInResults: true
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
function retrieveQueryParamFromUrl(params) {
|
|
88
|
-
var url = params.url, name = params.name;
|
|
89
|
-
var _a = retrieveAllQueryParamStartingWithPrefixFromUrl({
|
|
90
|
-
url: url,
|
|
91
|
-
prefix: name,
|
|
92
|
-
doLeavePrefixInResults: true
|
|
93
|
-
}), newUrl = _a.newUrl, values = _a.values;
|
|
94
|
-
if (!(name in values)) {
|
|
95
|
-
return { wasPresent: false };
|
|
96
|
-
}
|
|
97
|
-
var _b = values, _c = name, value = _b[_c], rest = __rest(_b, [typeof _c === "symbol" ? _c : _c + ""]);
|
|
98
|
-
Object.entries(rest).forEach(function (_a) {
|
|
99
|
-
var _b = __read(_a, 2), name = _b[0], value = _b[1];
|
|
100
|
-
return (newUrl = addQueryParamToUrl({
|
|
101
|
-
name: name,
|
|
102
|
-
url: newUrl,
|
|
103
|
-
value: value
|
|
104
|
-
}).newUrl);
|
|
105
|
-
});
|
|
106
|
-
return {
|
|
107
|
-
wasPresent: true,
|
|
108
|
-
newUrl: newUrl,
|
|
109
|
-
value: values[name]
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
//# sourceMappingURL=urlQueryParams.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"urlQueryParams.js","sourceRoot":"","sources":["../src/tools/urlQueryParams.ts"],"names":[],"mappings":"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"}
|