From 9b1e4db3b49e2f9681efb7a709dd6ed63b997723 Mon Sep 17 00:00:00 2001 From: RiskyMH <56214343+RiskyMH@users.noreply.github.com> Date: Wed, 8 May 2024 11:55:11 +1000 Subject: [PATCH] Revert "passkeys!" This reverts commit a3030b20836569dd2a386f7ade2fadad5868a7c3. --- app/(auth)/login/action.ts | 77 +--------------- app/(auth)/login/form.client.tsx | 27 ++---- app/(auth)/login/passkeys.client.tsx | 84 ------------------ app/(auth)/login/reset/form.client.tsx | 5 +- .../onboarding/welcome/components.client.tsx | 5 +- app/(auth)/register/form.client.tsx | 5 +- app/(auth)/settings/actions.ts | 39 +------- app/(auth)/settings/page.tsx | 45 +--------- app/(auth)/settings/passkeys.client.tsx | 80 ----------------- app/db/user.ts | 22 +---- app/utils/passkeys.ts | 78 ---------------- bun.lockb | Bin 250628 -> 242284 bytes package.json | 4 +- 13 files changed, 21 insertions(+), 450 deletions(-) delete mode 100644 app/(auth)/login/passkeys.client.tsx delete mode 100644 app/(auth)/settings/passkeys.client.tsx delete mode 100644 app/utils/passkeys.ts diff --git a/app/(auth)/login/action.ts b/app/(auth)/login/action.ts index 56329ef..280a06e 100644 --- a/app/(auth)/login/action.ts +++ b/app/(auth)/login/action.ts @@ -1,8 +1,7 @@ "use server"; -import { db, MailboxForUser, User, ResetPasswordToken, PasskeyCredentials } from "@/db"; +import { db, MailboxForUser, User, ResetPasswordToken } from "@/db"; import { env } from "@/utils/env"; import { addUserTokenToCookie } from "@/utils/jwt" -import { verifyCredentials, verifyCredentialss } from "@/utils/passkeys"; import { createPasswordHash, verifyPassword } from "@/utils/password"; import { userAuthSchema } from "@/validations/auth" import { createId } from "@paralleldrive/cuid2"; @@ -85,80 +84,6 @@ export default async function signIn(data: FormData, callback?: string | null): } } -export async function signInPasskey(credential: Credential, callback?: string | null): Promise<{ error?: string | null }> { - console.log(credential) - if (!callback) { - const referer = headers().get("referer") - if (referer) { - callback = new URL(referer).searchParams?.get("from") - } else { - const mailboxId = cookies().get("mailboxId") - if (mailboxId) { - callback = `/mail/${mailboxId.value}` - } - } - } - - const cred = await db.query.PasskeyCredentials.findFirst({ - where: eq(PasskeyCredentials.credentialId, credential.id) - }); - if (cred == null) { - return { error: "Passkey not found" }; - } - - let verification; - - try { - verification = await verifyCredentialss("login", credential, cred); - } catch (error) { - console.error(error); - return { error: "Failed to verify passkey :(" } - } - - console.log(verification) - if (!verification.userVerified) { - return { error: "Failed to verify passkey" } - } - - // find user - const user = await db.query.User.findFirst({ - where: eq(User.id, cred.userId), - columns: { - id: true, - password: true, - } - }) - - if (!user) { - return { error: "Can't find user" } - } - - await addUserTokenToCookie(user) - - if (callback) { - redirect(callback) - } - - // get the user's mailbox then redirect to it - const mailboxes = await db.query.MailboxForUser.findMany({ - where: eq(MailboxForUser.userId, user.id), - columns: { - mailboxId: true, - } - }) - - const possibleMailbox = cookies().get("mailboxId")?.value - if (possibleMailbox && mailboxes.some(({ mailboxId }) => mailboxId === possibleMailbox)) { - redirect(`/mail/${possibleMailbox}`) - } else { - cookies().set("mailboxId", mailboxes[0].mailboxId, { - path: "/", - expires: new Date("2038-01-19 04:14:07") - }); - redirect(`/mail/${mailboxes[0].mailboxId}`) - } -} - export async function resetPassword(username: string) { const user = await db.query.User.findFirst({ where: eq(User.username, username), diff --git a/app/(auth)/login/form.client.tsx b/app/(auth)/login/form.client.tsx index 5eb5212..fb80fbe 100644 --- a/app/(auth)/login/form.client.tsx +++ b/app/(auth)/login/form.client.tsx @@ -5,12 +5,11 @@ import { Button, buttonVariants } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { toast } from "sonner" -import { KeyRoundIcon, Loader2, Loader2Icon } from "lucide-react" +import { Loader2 } from "lucide-react" import signIn, { resetPassword } from "./action" import { FormEvent, useState, useTransition } from "react" import Link from "next/link" import { SmartDrawer, SmartDrawerClose, SmartDrawerContent, SmartDrawerDescription, SmartDrawerFooter, SmartDrawerHeader, SmartDrawerTitle, SmartDrawerTrigger } from "@/components/ui/smart-drawer" -import PasskeysLogin from "./passkeys.client" interface UserAuthFormProps extends React.HTMLAttributes { } @@ -18,23 +17,21 @@ interface UserAuthFormProps extends React.HTMLAttributes { } export function UserAuthForm({ className, ...props }: UserAuthFormProps) { const [isPending, startTransition] = useTransition(); const [hadAnError, setHadAnError] = useState(false) - const [loading, setLoading] = useState(false) async function onSubmit(event: FormEvent) { event.preventDefault() - setLoading(true) + // @ts-ignore - the types seem to be wrong with async startTransition(async () => { const formData = new FormData(event.target as HTMLFormElement) const signInResult = await signIn(formData) - setLoading(false) if (signInResult?.error) { // @ts-expect-error yay types setHadAnError(event.target?.username?.value ?? "unknown") - return void toast.error(signInResult.error) + return toast.error(signInResult.error) } - return void toast.success("Welcome back!") + return toast.success("Welcome back!") }); } @@ -76,25 +73,15 @@ export function UserAuthForm({ className, ...props }: UserAuthFormProps) { + -
-
- -
-
- - Or continue with - -
-
-

- Close + Close - - ) - -} \ No newline at end of file diff --git a/app/(auth)/login/reset/form.client.tsx b/app/(auth)/login/reset/form.client.tsx index 2fa2d9c..4999321 100644 --- a/app/(auth)/login/reset/form.client.tsx +++ b/app/(auth)/login/reset/form.client.tsx @@ -19,14 +19,15 @@ export function UserAuthForm({ className, username, token, ...props }: UserAuthF const [isPending, startTransition] = useTransition(); async function onSubmit(data: FormData) { + // @ts-ignore - the types seem to be wrong with async startTransition(async () => { const signInResult = await resetPasswordWithToken(token, data.get("password") as string) if (signInResult?.error) { - return void toast.error(signInResult.error) + return toast.error(signInResult.error) } - return void toast.success("Now login with your new password!") + return toast.success("Now login with your new password!") }); } diff --git a/app/(auth)/onboarding/welcome/components.client.tsx b/app/(auth)/onboarding/welcome/components.client.tsx index 3eb5fe8..6075c16 100644 --- a/app/(auth)/onboarding/welcome/components.client.tsx +++ b/app/(auth)/onboarding/welcome/components.client.tsx @@ -19,14 +19,15 @@ export function Page({ githubStars, action }: any) { }, []) async function actionn(data: FormData) { + // @ts-ignore - the types seem to be wrong with async startTransition(async () => { const res = await action(data.get("email") as string, true) if (res?.error) { - return void toast.error(res.error) + return toast.error(res.error) } - return void toast.success("Your backup email has been saved.") + return toast.success("Your backup email has been saved.") }) } diff --git a/app/(auth)/register/form.client.tsx b/app/(auth)/register/form.client.tsx index a4988d6..b15e5fe 100644 --- a/app/(auth)/register/form.client.tsx +++ b/app/(auth)/register/form.client.tsx @@ -17,15 +17,16 @@ export function UserAuthForm({ className, ...props }: UserAuthFormProps) { async function onSubmit(event: FormEvent) { event.preventDefault() + // @ts-ignore - the types seem to be wrong with async startTransition(async () => { const formData = new FormData(event.target as HTMLFormElement) const signUpResult = await signUp(formData) if (signUpResult?.error) { - return void toast.error(signUpResult.error) + return toast.error(signUpResult.error) } - return void toast.success("Welcome!") + return toast.success("Welcome!") }); } diff --git a/app/(auth)/settings/actions.ts b/app/(auth)/settings/actions.ts index 8beeba2..49091b7 100644 --- a/app/(auth)/settings/actions.ts +++ b/app/(auth)/settings/actions.ts @@ -2,7 +2,7 @@ import { getCurrentUser } from "@/utils/jwt" import { createPasswordHash, verifyPassword } from "@/utils/password" -import { db, PasskeyCredentials, User, UserNotification } from "@/db"; +import { db, User, UserNotification } from "@/db"; import { and, eq, not } from "drizzle-orm"; import { revalidatePath, revalidateTag } from "next/cache" import { cookies } from "next/headers" @@ -10,7 +10,6 @@ import { redirect } from "next/navigation" import { sendNotification } from "@/utils/web-push"; import { userAuthSchema } from "@/validations/auth" import { env } from "@/utils/env"; -import { verifyCredentials } from "@/utils/passkeys"; export async function changeUsername(username: string) { @@ -195,39 +194,3 @@ If you did not expect this email or have any questions, please contact us at con if (redirectHome) redirect("/mail") } - - -export async function addPasskey(creds: Credential, name: string) { - const userId = await getCurrentUser() - if (!userId) return - try { - const { credentialID, publicKey } = await verifyCredentials(userId, creds); - - await db.insert(PasskeyCredentials) - .values({ - userId, - name, - publicKey: publicKey, - credentialId: credentialID - }) - } catch (err) { - console.error(err) - return { error: "Failed to verify passkey" } - } - - revalidatePath("/settings") -} - -export async function deletePasskey(passkeyId: string) { - const userId = await getCurrentUser() - if (!userId) return - - await db.delete(PasskeyCredentials) - .where(and( - eq(PasskeyCredentials.id, passkeyId), - eq(PasskeyCredentials.userId, userId) - )) - .execute() - - revalidatePath("/settings") -} diff --git a/app/(auth)/settings/page.tsx b/app/(auth)/settings/page.tsx index 7fee5f0..e863f2f 100644 --- a/app/(auth)/settings/page.tsx +++ b/app/(auth)/settings/page.tsx @@ -7,16 +7,12 @@ import { Metadata } from "next"; import Link from "next/link"; import { notFound, redirect } from "next/navigation"; import { ChangePassword, ChangeSetting, SignOut } from "./components.client"; -import { changeUsername, changeBackupEmail, deletePasskey } from "./actions"; +import { changeUsername, changeBackupEmail } from "./actions"; import { ReactNode } from "react"; import NotificationsButton from "./notifications.client"; import { eq } from "drizzle-orm"; import { db, User } from "@/db"; import { cookies } from "next/headers"; -import PasskeysSetup from "./passkeys.client"; -import { createId } from "@paralleldrive/cuid2"; -import LocalTime from "@/components/localtime"; -import { DeleteButton } from "@/(email)/mail/[mailbox]/config/components.client"; export const metadata = { title: "User Settings", @@ -34,9 +30,6 @@ export default async function UserSettingsPage() { username: true, email: true, backupEmail: true, - }, - with: { - passkeys: true } }) if (!user) return notFound(); @@ -89,42 +82,6 @@ export default async function UserSettingsPage() { - - {user.passkeys.length ? ( -

-

Passkeys

- {user.passkeys.map(e => ( -
- {e.name} - () - - - X - - - - - Delete Passkey - - Are you sure you want to delete the passkey {e.name}. - - - - Cancel - - - - - -
- ))} -
- ) : ( - null - )} diff --git a/app/(auth)/settings/passkeys.client.tsx b/app/(auth)/settings/passkeys.client.tsx deleted file mode 100644 index c7ae235..0000000 --- a/app/(auth)/settings/passkeys.client.tsx +++ /dev/null @@ -1,80 +0,0 @@ -'use client' - -import { useEffect, useState, useTransition, type TransitionStartFunction } from "react"; -import { buttonVariants } from "@/components/ui/button"; -import { cn } from "@/utils/tw"; -import { Loader2Icon, KeyRoundIcon } from "lucide-react"; -import { addPasskey } from "./actions"; -import { toast } from "sonner"; -import { create, parseCreationOptionsFromJSON, supported } from "@github/webauthn-json/browser-ponyfill"; - - -export default function PasskeysSetup({ userId, username }: { userId: string, username: string }) { - const [isPending, startTransition] = useTransition() - - const [support, setSupport] = useState(false); - useEffect(() => { - setSupport(supported()); - }, []); - - const handleCreate = ( ) => { - startTransition(async () => { - try { - const cred = await create(parseCreationOptionsFromJSON({ - publicKey: { - challenge: Buffer.from(userId).toString("base64"), - rp: { - // These are seen by the authenticator when selecting which key to use - name: "EmailThing", - id: window.location.hostname, - }, - user: { - id: Buffer.from(userId).toString("base64"), - name: username, - displayName: username - }, - pubKeyCredParams: [{ alg: -7, type: "public-key" }], - timeout: 60000, - attestation: "direct", - authenticatorSelection: { - residentKey: "required", - userVerification: "required", - }, - } - })); - - if (!cred) { - return void toast.error("Failed to create Passkey") - } - - console.log({ cred }) - const res = await addPasskey(cred, `${navigator.platform}`) - if (res?.error) { - return void toast.error(res.error) - } - toast("Successfully set up passkey!") - } catch (err) { - console.error(err) - toast.error("Failed to create Passkey") - } - }) - } - - return ( - - - ) - -} \ No newline at end of file diff --git a/app/db/user.ts b/app/db/user.ts index dd75726..5374bd5 100644 --- a/app/db/user.ts +++ b/app/db/user.ts @@ -13,7 +13,7 @@ export const User = sqliteTable("users", { password: text("password", { length: 200 }).notNull(), admin: int("admin", { mode: "boolean" }).default(false), email: text("email").notNull(), - onboardingStatus: text("onboarding_status", { mode: "json" }).$type<{ initial: boolean }>().default({ initial: false }), + onboardingStatus: text("onboarding_status", { mode: "json" }).$type<{initial: boolean}>().default("{ initial: false }" as any), backupEmail: text("backup_email"), }, (table) => ({ usernameIdx: index("user_username").on(table.username), @@ -23,26 +23,6 @@ export const UserRelations = relations(User, ({ many, one }) => ({ notifications: many(UserNotification), mailboxes: many(MailboxForUser), passwordResets: many(ResetPasswordToken), - passkeys: many(PasskeyCredentials) -})); - - -// passkeys -export const PasskeyCredentials = sqliteTable("passkey_credentials", { - id: text("id", { length: 24 }).unique().$defaultFn(() => createId()).primaryKey(), - userId: text("user_id", { length: 24 }).notNull() - .references(() => User.id, { onDelete: 'cascade' }), - credentialId: text("credential_id").notNull().notNull(), - createdAt: int('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()), - name: text("name"), - publicKey: text("public_key").notNull(), -}); - -export const PasskeyCredentialsSchemaRelations = relations(PasskeyCredentials, ({ many, one }) => ({ - user: one(User, { - fields: [PasskeyCredentials.userId], - references: [User.id], - }) })); diff --git a/app/utils/passkeys.ts b/app/utils/passkeys.ts deleted file mode 100644 index 45d08c6..0000000 --- a/app/utils/passkeys.ts +++ /dev/null @@ -1,78 +0,0 @@ -import type { PublicKeyCredentialWithAttestationJSON } from "@github/webauthn-json"; -import { verifyAuthenticationResponse, verifyRegistrationResponse } from "@simplewebauthn/server"; - - -const HOST_SETTINGS = { - expectedOrigin: [process.env.VERCEL_URL ?? "http://localhost:3000", "https://emailthing.xyz"], - expectedRPID: [process.env.RPID ?? "localhost", "emailthing.xyz"], -}; - -export async function verifyCredentials(challenge: string, credential: Credential & any) { - console.log(credential) - - if (credential == null) { - throw new Error("Invalid Credentials"); - } - - const verification = await verifyRegistrationResponse({ - response: credential, - expectedChallenge: Buffer.from(challenge) - .toString('base64') - .replace("==", ''), - requireUserVerification: true, - ...HOST_SETTINGS, - }); - - if (!verification.verified) { - throw new Error("Invalid Credentials - Registration verification failed."); - } - - const { credentialID, credentialPublicKey } = verification.registrationInfo ?? {}; - - if (credentialID == null || credentialPublicKey == null) { - throw new Error("Registration failed"); - } - - return { - ...verification.registrationInfo, - credentialID: credentialID, - publicKey: Buffer.from(credentialPublicKey).toString("base64"), - }; -} - -export async function verifyCredentialss(challenge: string, credential: Credential & any, existing: { id: string, publicKey: string }) { - console.log(credential) - - if (credential == null) { - throw new Error("Invalid Credentials"); - } - - const verification = await verifyAuthenticationResponse({ - response: credential, - expectedChallenge: Buffer.from(challenge) - .toString('base64') - .replaceAll("=", ''), - requireUserVerification: true, - authenticator: { - credentialID: existing.id, - credentialPublicKey: Buffer.from(existing.publicKey, 'base64'), - counter: 0 - }, - ...HOST_SETTINGS, - }); - - if (!verification.verified) { - throw new Error("Invalid Credentials - Registration verification failed."); - } - - const { credentialID } = verification.authenticationInfo ?? {}; - - if (credentialID == null) { - throw new Error("Registration failed"); - } - - return { - ...verification.authenticationInfo, - credentialID: credentialID, - }; -} \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index 29b7cd5dd62e1bde1cd7beec246e075998d7585a..825fc7e528502433118399f90b96f3953b46362a 100644 GIT binary patch delta 43426 zcmeIbcU)CR_dR^?fva4NiX8-d1qB5ZQ1oK&y>~=J0a2ugVgc0H68lj{WA9=o7VIUa zXe`mh#GYtkj2KO#iHRCD?^uU?#xsiXC zuUD(`Uw2Qo-5!)=AAhyM>!(UyZCom(^*8tYrxed>^+mm%m#$x)yIW~(Vbj?o z%Xp<~7K`0tNl%Cjk4Qq)Xjr@ky|A<7Cqrj^!`Vklr!CKAu@r<-5VA1juG|(&UdW`x z*y#R9?CD~$@E8+cae5WK+(Ek^BOlD-`}y|Em!F#bzli&oMgad<>Rcw(fbrhd;_JgqP) zM>Z)ca%l9x6w9y3lX@=js9Ab>==9s5*tq`4z;Y5!Vf>Kjq0z&_6BCP}&h*bw@RT>9 zv-l9yiGJ9t_;b+d*AF0>?_snZ_G#%l0`Oh>U^s=cA9U9H33RsW9wZB_pybyjWCk_i z9NMdlUYU=XJ{C@7h0J_5pkl7bIemIbS-^O`pi}X*BBf;gzky^uhlM9a`3#OsDFHvQ zeNK?9RylMwYLuQElHK$MB>DTL<+w?ROpJ?7j28oc&@I6QtXcin3ofOTCqZ56M!L!3#+80sz=Y^#GkjR8Vk^U&0d}9#f ztIDA=Fg!6S9vLJ=4o_qy8nboP-Wq&*~uT7t445Sz^MELJ_+xwL(fudG&cy`ZhQ z{T{|Jhu<9C&sIF`K@I7P$!g9dDmgTABo`9PFQ^XZ=I4;?cbdIc|_31#UVM^`wvg-ABS$(79{m&eo_VnOZfo0 z;j8e3!I9|fL8vg(#Uu`h8-fZCtRokV5$G3wdP8Ty)pWmH#e1}YMn^f6oK#oFUV&sT z9^m1h^a7C757v{VxjLkqG)VUF+u#{LEHTz7#aUmGtGM>4w!Sx4Df`9RasfQ1U(Z!M ztwjS_#BQ+k`zlCGxb(Lm*^o00W&DunA(1`<`df}bXBFo*l0}6lrVNc39Gx@^_H4*x zl@2o?F)1ZBGA0fy7#pg3?lXj0MJ(ot@v#`jZJNn02vV{fBrA{yl3n{_Q`v>rAqzo2 z1<9^^2a-Lr6Oz+q1SBgQq2d>}lofggNuT|s^mVOd`uUIrIgP$V1T&rt$%4OaEi>wh znzDfKHqx1Kh-Zbmp#VA;3X8Cv?CR^~C8zc3BvEfNcSeND?8_wd$#NkQNs83{K z{P4(x6w7;qWww!t!xADC|g+<>@E11MxO8 zVnp#VvY=_oZs-2}o9CKP2OSnJO!~0Xi!-50Vv0S8^C6^9>yf|8sCv2EiI9Mh;1iOyG7! z?);t&mjxNGCz$>BptGVkl>8Wy1-uJM&txfn{0!OGHz7H;DysOokkl{Dl<9(J!If<3 z%2|@AH(SRk}bDD7KBu@EOHDAVuSiavP)V) z(k?*pmM~fFsda{9#ZM z@&xpmZ)i-4Uw_%lo7qi!yw8}v<(6(DacmFdkcRxdqy zu-T4{MMW(~^$ge2J$Emc^=|~pv7dzGWgx?lJssE#lG&Q8Dn^=NXImxHHHYK~K}U^< z3P-L*CI4il?p?4_TF2E=9kE8b?*Js-6`5Geha1<(M7+Ua(N0PkhBek=NnR_nGgc7j z!O-b;waK*%MtZt+NaT>X=uwf8ZtG=!`5|eiK{7rnZfG2mr&*%HhsH!B)I38P)Q04g zG23I-_s&Y`-pIuM!=qydSVnG=12htn{ni1Jt68Yxt18`1#phD|{f*M@3S=>^cE=Qv z2}y@8G9oPLQy`gfl8WyS$*I*=>A{ekDHS1U=L!kmra#%BrWz#UKUVrzXaGHHzVsQ7 z9n3b%B^B`jBs1Ct$*Hppk`M?_UfAG)li%HV_DvI2FWb42&wBU@4fdLHPxw~s4a-9@kO`NQ_$ zl0W3yUZcWptNug9ht?1E>`I~9BTe_N?6B6?qbrBnW;t0b0s4^2A=aaMcI8mb(^>cK z<*;_uqpO5kXX_dGSwYXP5^5Wm%VMcx7-s6xUZL7Ix%3TQ4r?_%8_MUob#HHnwV596 z9coR{Gw}0(o{gV2-K%P-JsSQ*Wz#kNUO=#(0p=>0t_Bky8|;EgJD^zg_^Ls+cxW;D z=BgpKUlHodkhO=NT`knQLHF`O_4Dd6J`P(bT-H_h8CKUBf%dx3DkIR=NZ1)}>t`g~ zp=bDp+MYpgXvEaV($rbs>>FaAix6voLfZ#BLqUQnA+}hI>Hhj%pAg$=gc=)(3c<;( z8M609h&6T6GrfbXNA&C(q4wMu0}a6C(fxV_S)1$8excUwdIo-;)U)xkx$fm3YF(&D z(v;9NuQRvb@Bd_?%LH4E4qz~>@3DT|<(KiG*?4>YHTgp0C4YH2Zy=sPP z=ZoqwH68Za#W1H4mD{LEyq;Y%)V>KE-E7x0eS_=|pf!c2>6!3q3yjdl`Vh2hIzn~y zyH!K98^v|+K!?2&mL(>0(c|9?c2P=hw#Hr^3u9eGTt3%HS4z-WMf?db3hd=E*ps_TgP4*v@Cd;noX|dEt zoK5$GkVAV5+ z2fI|1?nXs0aQo}g4MOen!L@~fGo7K`sHop=;IJ2|BzsBvvMn_B5_}0i3uw&I7-ja0 z(3(IiVEDOiZj!Wf)ZXFa=FC{|Ff=ApK!)sU_3Q@yU9 z(LB`d>LUj+JdQ?(L2HUsSb>6q>}#Nf$}-W+8_;}ZoL8_5LadIJqut&X8fU(fe$PM1 zI#-Ww8EQY7le0Tlmn}#2G2VJWYiVQ*zuQ(p3)Y8th1f46#3F1)v+U>^u3~5cs@4)3 zeP{HQb%q|@I@ER)oWFjza)?dyvsh{~WDh}z4YwF8LW&;UCe;2eIQ*ZU-)NR!fW^}3 zx%N7=F3+`#(7HX>YM>)uSWbY};d$ISXfG_Q*29&OZVy!Y8w-T(WKw?53%h>sJ_10JH-A3p%7$Y(eHT$ z*&D&}Qj3R{3Jv9{mL68xYsS=h5Uk(s=&*OLZLy%0>2Ah?I1(eUwNW3=xOer8PN8-? z@~dZL!X>6DG+M}EItLoO&Q3wxJJ8ti#?ZGthSpT~=@nwHk0x>)8Pn4`OONgnYQF`J z%cW*4IaN>qhk(o{0UF~lfrEprAL!9tL+vHu7`ZU8q%df*`!N`7tDx1_ed>hRze0#Z z2ICi#uONmi2$UO->DCS!mr*Rg$YC5bSyv9HJ<1YJ^bfNC0*#XvZNvBGk&@nxh3BjL<@a+8Lo+2sJT6J}oSk77W>w5u)RbCzfpowA#8)Y+Y*$eM3Ko zy)yhpS4d~Cg~nQ7wScn==+WV!_MVt7l4IxWgVx@#h;JEW&x_GV$KwexDA)xGN26To zSEwjV_U3pPLSrvt*U&Y{T1EGY2(=E;qa#A?TiVDBEyjcR88qcmELVZL*MLy_n{CZC z6eGa?9yEGSuC@=Lb%%yhFjm@NGRruOD(hH1Ix-ZG`;5p?yFcp8B>}5)c#wT6G&!c@ zy@PDWp|#hC_=nitv4+qY*n(6JvWDx~14FIv=w5@cCqzsG{qDdJduT_C1+$zbV%wxc z<7`3-Y@04Zt7&Wu^I>gj&4;pm2131I0T(R~c7Y=Og%v?t(ple7)nPl|8BbAtGxnxk zi~#nsi3m04zEa!QMc**gp%v9eG3h~E!|VL)X;3> zprI7s5ZiefY9319;kH$)rVOW)w@u)ha_PYFC1Y6jT~!wVtCbD%9kXduTN-2Wjo zxXLHQUaXI7NM7TK90v`9Jv}e?UD}~O`t2l#{V_-k5xIzJQ^WL_;SQTeI7TR!9Iacp zetWpXei(#m2WsxpUycfk9^Wj;9t^FnEF6BV~w!>V>TU9mM9h4Q)u*?+(fsF$~p1hgvJ_S{YGsM zLE}uz&BwMaPc(-sU&1;fRKs}ek4Fe|VR~H`1XQCjVZKuuT#T-%6eBBYtf$(582xst z!@f+Bs3H2~Dl}PNdZO@P_5wE~JrE*~!G-$FR2nut-Gl5OL1S;&jLl=-SXpzs9v>HE zYYq*w4Ks5-LhMLbc?W4f#_BQS@Om>uE)Cf2WB0^w%xGe~lh`t#;oT7r(MJfeO>)oa zH&i~%u)4#E@z5G04i79m4tGKeW*Y78P(5aX!`?DZ)&^TgjK)-GSbos!)J{XgY~c7n zM&85Z?gY+3Mk&y`(8t>8VfyXY9rloTx#uw)piPVCRIncb$(0Q`1P9s6B%rO(hy7EKSlZ;eXm6NgvGg>wc$j>a zq~D(G(Ap;J-cuZQ#|T-5?A~e6n!pmh;s~;zh1Sr};xR`&M{>0C)ww4^7~NO^<}zeh z__YdlHfS!PJ}I&p#*Wsu4qA6(z4#3wJXerC7rs`bIP^FOM zmd-Y|&|1o9{q~y<`zeq#kt;yCG3J28KEc)xT0>(MUx^Ucc{xyTjnTcQJG3rodJM!? z2p@<2L7E&B=*pHsnoqj!J;PxeoX%C2jkt&q`&Q;qYn+j0(KzW?JRCX(JCCOyxTf|r zLP%wsi%@f>w_QP~C12!hl_r>W{Sa~(u2_nYbOoo?ZD`W(e*QtW>aTOH#sX`bXoTpZ z%LvIuxAH`@UfkeJfY#lpCAG`Y*zc%w53FjFj1>_1Bq9_{2irCxWYo(303kUaGcmfV zPL_R*b+37lZ3r~Hq9SDmLY@`)tJw--9>^=C+9%)q)qw)xQ7>vz$kj}U5W^kcJ`&z}hkgS0ni>fVbSwmTqO zv+M0`XTb?Zo7v4fps@^$XRjbzo7u)t!8FQ1sIK7wzg595&lOIAvU6m^@D!gK?DAaU z5;_$cwkOOjJjiwhnlWhX{<=AbxK$qmE!fDLOVkc%a=5Stug%3!GKOdrLS5N3`$2@1 zMVlb4*gQREnZv$qp6RsAp+Q=n`TA{;5%ZtVatyspXpK=0R#-d)9zd&Ul**cV30VgW zE_fjv8ZEJ#K)N;1*mh&-*RBhF!wQGCet~{_g~P5bls#vx+P1pTg7v%2LTpJ0`P2Q{ z+J*YE5dycHc!f5d;Y@ zwh6M&f)-;Wz@tYiwphOnlYxun$d@a@mc@F^8i(x{ka+dS3hc8)?t6^qhy8nK>=mgs zTq-BF)Fwm2en`dr0FBE#R!L028q1`|@En7W20-JOH8upcrO;3oo@3_}kCQR@HUDz? zhKl_c`nD}J)mZdAxyu1tu-P_nKucY}WDLqBMA3`+71(#EaP zV>UZ%?~~;Fyk=Re-`?!7H(YBDKkP`f32XJ3Ee_jukPY>_bwg|q5b`#rZ|QY%^ubGb z{Pu$8i_EdQqYtJ+V^ih2bR1f3S*d!Mmg{9T!Pg0{Ee1!dQU(5T(aM zvcgFK`QZRRl(bI)7(WKc1&jw+k*NUrX)K=+a{wm5Bgf(bECpz=0>}ew1Q?GIYZQdB zX~big7%koj$qywff<87R`jg)rT228h_#D8`bIJCzpz{C|UQqHPBtI{c^w8%3U40GU z=bG_TO6GGNp!`ztl(fI0bV@cn?KXa}0(Su>_zvKQlKed?_~ewdyAM$Q2=GHm`=0^w zzX1GDl7CDEpFhYngJ8{`7|~KP!EXRFl0T%RZZ*i4OQv&1JoC$?>|Q2mXE);Ee;JUH zTps+O%xf4($qe%;J*OmJ06a4+q~c#DId+Pv_?%K>|GTLON*a1Xk}9eAzmlv#X=O*r zU>POLDp`&sJ};ALj4Q7UC>gAP9~@*}il=1I8$VcJHKqHI#D|i6b;Z|E{9j4VvS8lC z;|BqwfZ9sdQ5jG&+{DeWKr;4RQwAm%YR9Pk1N+wKJa-`xZ8B9@nPDyH%iXW}wDH$At z9~^6K(h*?B1!dzf3ZpIm%8~c93bjs$OY`|ei7IDNHAzOG<75FmA zn!l$KyszX3%08zgbxiTUlltcOOQ&&$o<=NlJEN>#CRx2tR6Hf^KUMNPB%?0yhmr*$ zv!V0x@I7P!$Y+o=`3*nVY$pwVW*|3mqhUTs7UT-a0t)eml1x|_dI?A$NZQpi}<2l&B^epV5GC29AIO7}?F=ah_ptoZ*V z(`dj1zp4b33_evlCF7qd`J0l4|G`r--U`VsaaOtwk}b_kQc2pqrgSCK41#6lR}qvn zETHtilC*PGc9aYjRyrl)izuCv0={Y59?x*7YA-Q300?E_+-UXGMIuN%x@H=FXVbi7PwjQTa?`D zq@LUe7zwsP@b=$$d)hhool?D*X^7Ka_0Pdy0Qw=_etX-&sifZ#n0L z{%7F4A}&F);LnwQ9g+onrTA|k`JtrUw~%b<9VPFocuMl$K{EXhO5TUW|CR^%!Ss*P z6!8R-37#sQu?Sk6l+2~19g>@#f{@IZzlO*UCGCqT>8^N6@}5eThGbNErKeR=gtwBu zkgP~`NV>2VBv;5rkaS&hNWO!#gXG}r1&RMHVfeucg;RNjWWN0oPZ=R)nq`0@A|Y8o z3?%-y3{^4#k`);V$%o2RNM`T`BtJPN`8O5+GRgR9h%W@W6w;aFZ>36*Q_^si;wkCE zwUFf3DY;(7Q!;)dBrBQ;$$7pPlJ@%``JtqT4k(>67s|IBRT1y02uk+xDM)5;TFH-; zJOjxOCF9RRvf%TIrzC$t={Y4Ua7po$#?J9F0(AW~NV@nQBr~|Ll>vgrky0%N@S$Wz|J!3F z^nYh$$`-!lTnVgkzGM{KA7NH{5WosY0sK(X6aUq*66gP`&z0o7{=Ym{;_uMC`dkTd zbou|`u@c)a&zIQuHw;Zmu4w=F$4V%lE&RiI((iOu?Emao$$WFqdA`I7+EJytUM;h!8kajyP*tRx?x{~jy-)o~Js7UMbD z|2i|sSn1zmrGJl={ykRu_gE?CaS~TZ>fEILd#uFcC7uxcd#v>T z_pwr;KOZY?ul@Cy9^&i9)>c-V@M~i2Ch+TE`NX^?AaaZABwXr)XwnpfUCeF@VmFBg zB=U*|%|Jvo0I{YSh4I;QHh~ce4c!(n;Zjq?i21H2_-v-2j zW*|N#QCgI33!-^*5EI*iC@apAct~P;I}qi?#daXpw*XPEJ&1~8YI_jfTY|VtqOz#n z0fY;ixugRKFOf}RH;FbKK~xnBJA#O64dN*YAJL){2)8yMHg^J1T|6Rjj6|Q#ApAr| zXAmRXg2>keM1bhg1w@s0AP$hICG1^6Tp%%|D~KSmhs2cjAWC)vQCmcJ0}RX z!o53)TO`JI2T@NPC$XR-2%jDxLPbgs5Y0P*xJsgd@ahTTA&KcdK{OHzVt;E7UAfmc~cuJy;XweshTXztf z`+{gE9+5akqE8rz4k9BA#K;~X^7RAJN%ZIkqDoH?2S{`g_HYmvNDK)F(M{|jF{KxX zlKnyS5YhcX1osAUibOBr9s%MOiLntN`iSEs7W4t(GXO-GNEra4d0!A$NrVfpNDvQ6 zOpgQ+Auf_w9|oe{KoF5)>Oc_P`+>MiVvwjk2!u;Gh$VwSM2l<^yGgW(0x?)Di~p0(C^-Z~iijQpB6tvpQzS+U_n{zekr+D^#8`2h#DXXgK5-z@L`ocp z=FuRok{BnvhJkoUV)`%;6U0Rl>tjIFiw7}LOpOQ8eK3f-Bqod62_RfzK`coCF;!%f z*iE8MB8WG|!bA{JLqI$wF*7!G1&9Eg0$Aav0q z8AO#~AP$h2C+s6YTp%%I1PCGakeCt=qU1;r3q|xu5Wxu`PLWt7+*3f@A~7}v#1e6w z#DYW+KBGV^6DgxWG*1F?mBb3+H5$ajBx`;#V>FhqRpKIv^}}INZwxHfh^b>hbWa9x zm&7_zdn^c-5g?X~1(6}LN$e)kCKbd+u`m@x)JPCdNo*D^(m=SSfY_V{Vyk#W;uwiO z=^!#iMmmU*qd?>v2V%SEF%CqP(I5_x*eUGeL0lj)WITv0v4_NzF(67#0I^3zPXG}- z7Q`tM`-J=JAa0Qu`#OjN;y8%~sUUnNf;c2nCW2_52I4A-Bf@JEh=(MmPXcjNTqLnR z9Ynp!Al?&GCxhrd4#Zs&ABfshK)8$tv1AH}<06~HZW3*#f;b@-P6ZJ)0mM@hr$mc4 zK)AgQV)GjyJ`#^e93#=^O%P{A#+x8UP6Ux}8i-Fsk7*#POagI$#HYeO9mE9^L#Bf` zFZPg_G8sh486Yl-=ouh_r+_#`;<9j`3E~!su`@wj6~{>|mmXdFgIJ=2$QIcoc9Uo` z7sR(>;am_=GeA5Aq20BLmh-G#h1*Opo9BV~-YOoGIYy?>d@%Q{V#9neBWHohC&2t@ z6+H!*Dzm{HAoIW~@+<&zfy|HvV1BWRy=11$0aJ1zm`7F-vk*+M4(1e@U#+6VTVQU1 zX|rHwqgGSTFSuLpaF@uFF<0L%y3TTF?t>e-@-9BReSN2()%9ZbyShgP_DvpsXQnma zUEi4RwFaIe{7=twICrhkCHk&$iu$YoZ$mw`iVvCZg1IQkXAw&J%_>GM0@HjRm|BbB z3ac2m7_N9o;%gF4!fy$P_47f@TLQu+u9N64Kr~qjBDa{m6oktH5D!S$MT2D^c9U4M z3`AaWk3`f$5M7po$R}1T2jTV>Lbeqk3WyFXKpZ2nlSDybT?u03A`p=)K@=95B&sY1 zQFIlEq9S}1hzlg%BT-xwTn%E%5)i{zgK!r|NCYnhQE?3j4-vlx#4Qq^k|-(4uC;cv zmJ%rxrNvo_GQw*eL|HM8qMW!$QC|41ho~T?QdAVzDJqHD84#7lY>Fx(o5D*p*Z|=z z7E)9d_b94~78@aa#0m;u@ra_j=&%W*hRC4s6V}ZT{-Os(fXJk%DePMyYKd@)K(U7+ zNJMXi2o^^uY76&m5OqX6MTj^~QCF1Bgs3M{C>-J}MX2z48=}4#N6|oBq-ZGownH=$ zQz;sY>l95y?Hv$J#cYaZA{#=uY=PU_?1bA|h=n^r>?ZM)L@Uu^7l^2>AU5x^ZnTch z>XBu=>|~3=R}HRNN8YstX!wm8=X~W$8JE-3eIQ+h-%;xc(xUZ2tBdXRvbexSZl=NA zA?I2F_T)MlT>C@dI#LmA z$Ytbm_#|?f*b%v89r@C_RTHy5vbtzv!m@miTJu|GE`lQO$of&uAB|%RAA~ZvGo^8CeIeS_fIR zplJdHe`#b=ZJ*V}8YPNevko@u@nofOy(8Uawen+L=|}V5A)C2DHCq_G81^-qc5bI~ zE`LkO+1>n?xFTYsePa^k>$CB%a%J_&vN~C_j@`6QAC~7@Q`XsH8PHM;=%v+9vpoAv zen?hF9M36v(}W-DG$+uL#>Y?D@cgojq%8awU6~Fq?UpKvvn10@FQE^LK*UAX*qCgc}vCddpsV5u$8=h$_)7x`ys=H_`Np8@%AY% z4zcBJ6z7KUc4gOAalC~*3mm+WW@)ELUV#;ow6s^82e^sg=%EgZ^F%lV6{LqcDy}5L z9|3G-C&h8R>_wQL&WbCIuoDLkK3xnB{x1XN3su9e%CIarUX5byyD6?5!n_E|Ou8$s zJi=cB{PY0FY$^aQu%mq+WrwBY`8|NXimL?fYxX}g2?L4$EtP?riVIhU9MQJ`e)=mr zFNCuJrX8R-EKQb201F$a(pE+I0l+*4DXtpA-vZ2|P?REPv9s~1*;&MdX_ds>Fzrkl z=MC?+bOpKrypfIdjK98U;a!^MKntKH&6u) za0j>xd69>25ti10NKE8;9D&MwL^dt`v7nd;DkO5a1wLQa*nO8v%`hCO}i570?>saZCO<3j7e@ zH{oGoNq?=hEegSCaiqUixoCX^8vqS~#z0e`nRwJ+E1wpEoNEK2pteKy!Z4VCa63r; z5rz%`?`Aawcp1$bs0vgAd;nj7f25%X;0O2v0YFWl77z#o0l`3RpbiiM)CKDCx}5_7 zo>P_s$^#VvUXv>W@Lt~o;Aen${dn<^cLA$7p%OqDfWN&{74Ss3Bv1k2v~UCmKV&Q0K9n4J06c9e*}I4z5~7o?gRW)GG3892ypd03}gUr z16(C}k8?UO1DFZS1r`7cfwzFgKngGh7z?BVX=(V84vYgP0Ivg+fB@9477z$Hfciiq zfOkUtfB+y62m*Kkr7}R*f6QC%US$>Vb7uXMM z12TnAq*gjD3Gr!&UJDru@LpOMpc~K~_yMN(fM0+|0DtR(zxgr^m<~(C*F3Ky0q>vkN+>U` z`vAVks2Xq&aV4Nz5dMt zpCin8?r6S7_$KfTz|BW(8gs|-9qt89S3(9cK~t(ZTfK|hR-<>9fs!yX>L23 z15E)ABknQn0H0D%Q1>bT7p5q1+_-QwmjkXM%pT-$=b}{-Z~<2W(jDLxzv2Mf?*X0* z7<=0aa7o87%?gdtKFwvffnlz>L}t9^fm4MQiCS^Z#VQUaYQB~7BPJiSey&(Azr~z;x1h5LATV4lN0(9MSU@5Q!SPU!z-U1c^ z3xN5+3}6aiR`?BsS&69ty~;wT18mGZfZR-AE|8|<#~gr_m<2GB2?-{kWFm&mjM*|) zn3=w;U^D(@X~@ybOpkDyF@We!MsP6Y40B+aIup@lv@|EpCT$3i&r>nGNX z(h8*Q%8`WaHLGK`{bf4i4g&iDj+QJSXR!yMn^n%4p3Pxr=devPoWb#IPB4z+oMV{d z_b|ZW$jnT~A3>NCDo19@v2rfFgE-C)`tL)4emxEx1K63XfEDZnj>n?_htmhZ`@nm^ zy8tscJAq+l)=}|h%jjgbIA=xvlg>2s;sH)VKGH8h(xqG+&jX(U=YUUuHi$n2Ntbes zJPY^(dx1Sb72spwQw8R817P?MGiehyp( zt^k*n%-Kq2{3Spcj?DT3Ipd$V67hU$+=65U#v^?`91I*paDMs_ka+@{Q~&_VBvKjCqVvW#R2HgP?#w*!*^N- z$6_lMoThoEd1~1E0q#ICpeSGkEC5S+3gCa^SNMNJfTiR@oHL*SPJj*In~@zb-wtvs z-9>TvA@cy#P21Oae3cgj6PhG-h6?~@nDNZOv?+ox5*z<4Kp{wGY8GhPup&(31{4R{ zpz^JORzL~pEsVy%q4YVu;1Bo#HGt}XFW>`I1F8bvfEQ2&s0{F2s3K4SC=Zka$^vD8 z(m*MoBw%n1M#B)umJ}3Awz)}gn1^w?L7G=;2HxwkZPpjnTD?d z%^;6Kwt#E}van?Q?p)VqZ;jD_X_X$P6XnNi4!(T8q!T z;xNek@$!VNH*XD9c?HRb4&F-AeOzky*w@f{Ma3Y~{bDncdT=>lMMsal{L!EyA8b$t zsOU{`9R?b{WPLJTbHmQR`UDikVa}o+T((5r&3|<)>}&Ye^2I+O&#uP{Rl0rD`N@@6 z?%k(y@(Z?vh_Ms20Nl{YL=M*8;=}~4jdc+24nQP|L9Zh&RV;cPag)VPkREf875%y; zQsjR+{o}I8%HKDDj$JNFPDHJ@!{9X-{IF$~&ujN99A#NG;Jq4_L!!e(WNSFDYI!dw zS=&@qx6y7PkE17d9_VT{V@8X(Nk+lBC!rcr^C*n>DK_QS`Zo%E_F1lBn$-ymR)BPA zpj~zr?cdbgv}|Y5`yI$9&LaIFoa83L44F*s@4SG4`qxJU-9c3TJhg!_`DA;=b1lS za}(EQY9&PbIa;ASrYF!z*Y<0TE10_Z_kLg7aOO-M=fzPd1k<=CN-?`rb)#_GtyTMD zHaT_nz3h#!=efVc?`rV^H6oQ-R$bcV(=V{vW-H_(E{?!#}}1_ zF}m&*6zAq>t#K!$td4kOek0a;~_wiVn)L-0#0d67WoeR-QTwR2uj=5TiTIS#Jtr7Rp!r8^g*5atf zQi%a){>5L9jI=Mde6tf<5Fui{@`r>OQKY?`TL@S6|{qTTekxyf-+lG~EdGpn7ID_B$HDMX zRzX-7pbq_n2ZV?D$E!=0yI%gVz1$wbq_a&L9lF$ z`S-0i#rf@s{VrlDVz3T!Rno;0=579=>;CZ->ebI%AQ%SzFhDQW6lYn73gTPZz0?ne zoosEO`IohOS{Gk#`pYsraLn#D|0Z^i_X9iLZu#gAVzB*S9qzf$e}qn!IatSw6>u9a zM($gP@lZs3zffzVeN##}-ojqP{EOGupPkxLrDnbb$OOH>dgd1KZy{MZ@g{`F8)al4 z^lK53x7^e&?5_Z0yh^*`PBks>i?Y9J#Y@$&oGWXbp{7sR7Wt8P?RNAl#{l*mpO+Q+ z7is=@7&cghX?C!@?8%h@pS4}K=24I`#2_$+vb$Kn2-8f?8;|2SnPjh4{d85r*}-r3 zRy9R)ON)YwwL#W5M9N|`u$0)m81?oSA1v0!)iVF?b(em3etSGC{AZ-%egW+>{{nWs z9}j1K=vs?wK1VoW62;ghXtMbyvAwG|fAX+bk^9O31?~`;OHh6DPglP=U~cCAOUJ)3 z@OsTFg^le36$Uy4dq5p5_MiE&FY856`uOHqLNr?4mI_FCFz)!XZk-VZ*l zjk7x8v8H?_~!K9eJ0*x~N6!+G&v|EMj-!FJ!Fj^de0dD4Ark(kxyl4He{$$hS zljUF7y(k54#ksXw&06MPDSvXlrPieL z=_#nHTGY(HYrZrvqFv^@gOU*Aht~^at%-W;P;FPyZ5`%E3$bP$R)ZEI-+DB{Xjy>A zk%q?IrSx_qyqDEFyY-ooxQ1^qz7!BMVdpWokz9(3j7;^Yu>9I$&6=v7TRENLt{m)! z>xNY`kbM^smVx2+8QPcgZLf&c8w@|uP2{^=ivpH8?JH%*7qL3(8H;lUFdv}_Oa zkC|7mni<*V`_zd>9~dvM5#pnbup1#lHe)BFZPH5MZg|N}XvRDE27r&ss7GVcokMpv z)2w{lVPslP;p!*Wq3caW>?Tyg{L}3t%CB_&V%nHkXS^6=J;qqiBbLFiR=H;KVLrra z|7`Nyh~+N~%)bU-J^9)!`)6f0zldog?y?f*Ut`~XccI(j^$(7#!2@4T7G+UmRdG-A z&%n?6dCl^@C7s5@j@vub_RE%H*k;Ww(EP*jp=-0B_?H^`z_38S;Gm|ZoP+s%Yc{<8 zpm7JpaIT^OKeZGGk=8^05qV2`Ld!khRlDG`5f*AFtrPb)YXRD~twp6RSV_%4B5#kY z`~K|?Z{f8#6^myeN>L7;wnZ!9p|zL&y6|ZD_p`dqc;6_{SegroBU{j@O5!rb4DnzK zR;u};>{hHfuYRg zvidu0jjAGZ&*jyp{j{CB%3ObN3AE zET``NU)DTIxzq#4FziM?$3}D(HL~zXoY`5l%+mV)y|*FrZNzAjQN*9$xMYU@e|lN{ zXKv8CijI3Uf6qTZ?H%>}0)4S0wCO6A@4+zd+f^<;7jsYlrrYG{>oK;}YWwOKbHD_4 z!(HYa2OUkji7iL}bl{=&>n5In{)Y!2e`BP{J~K}~-*P+54`Z=L{Xg~%9-@vOqJh_r2o)L>1%a-sm883d;d$v zsv}m9|JZ-OUn~C0(w?7=se|3$dD(2q^94vfF?f7f;vXFE8N*u@@RDbgJSlXTM_Yeh z@6DK8z2&Yk@SQ`RmvcYnhKFyOIHFqBTWtFfPlDaB;5Ia2>h7_R+*e@#YiwGuCF<8l zZk^-n?R+hJ*c=CAqDL=8;ICZxADjg^ANhTcjf_ zSZ>#(?^1gFRuo?kc!i0_Cp7;GgAr2@F$W<_K_>3+vT=)6;2!eeODZ;~SHeX5lPLcI zEV$E-OwAsV(BnGa+i_yT&7rNIeETV8>rt|8$qCqi2K&~+D;hl5Pb@`R4{um7_d0&9 zI+qyt#U`Xxy9(pXz+G$JPuw|)lSt##rkH4VN(%}MLn1bK#)`MQJRSQ{7o$qX`(Ywt zc#O7aVTFTj^mRWWCJ2>9x25$H`%h^DJ?Frp04&^(&9+~ixQ)9}9^9Y{R`e5&(|CO| zjx+35q9YhRklT4Gxv>}IaHn-8N1Tl z;nD|Xl3Q*|DAMvU3asHOc5S%mcLw{LZLnZJjNJ1e$X2HXo2FK3m67LKRaEeNpSfj^ z7D9id;(IjqhqBOcZuta7dcOMH@|y@z<19+sg?YgG94Qp?AguMA6SCTT$JsGZq@Kkt zwM;7&ZT6EnWLQO02g#wZ_RRd|6C<{jpY3 zdmJU4KhXwib7Ms8C&=u*!D7-UC^j@!7Q0|>{ddpp?(T+S@zSe$_}nL&cZD;s;1TS= zA<{DZowDyWTj0)jmYT3cvB<0LIhiMVWNxpA zp7UsV<``b&45uQOz&LUL9Nrj8$BX)(A{V3fMa1M!waFTev|K+kId?5zg6R7hX3CZX zx$bN%+kNHZiN94qW^(DU>_ZF(?wyDIuZ9(NscBT!7}6~g#U`ZHFo56xO!IbBPEzYZ zVr=wKg!gn#AHCIe{Xma7fnBii~dAMQjaIp<3YP~mDj^e@f=1z(Kq4^)+tScz$_X*7gXeCm_w9AMdogzMewV7<^%oI`T8f?uh z&D!3C1KC%1w$@uwWM`Ku%H>##OiNX`c;^b-^@pOgqN7EPZ;`E;eMa*9J5bGTP-$P~ zO+0mw;TCjQ;LH^Hgj|__!JgsM_tjU(sNSrjfg6L`nk z_C(Q^FH+7MJD&sS51ugxR^SFCEQEyl>(9UKF}hQCB;=TZFZUyckC?jyZe;&FWpryJ zOXE9)6Jy2V9D`E(a;!K*{oz<~`wPrA)3Jp|iq;&Ta%fbyVIZ1AR!bGj(Y2lhQ>CNw zUi@iZ_g#78RUw!?o~hytyQNC1`0g4q4MvK)T2UKn);3kty^g4EsiMp`kddik81%qb zkK$MNM_j6K{Q=q5LOs+p8iP7<%P`WX>bGOOOWZQ*WGpAsQ^jjvqSlLHL2s|WKXP*S zg=Mo;t#OWVEotv*`llJoSsFD%Lw;D`ZQFPg~5%n zca0XK$H~64)cz@XWwSR&zo@5~*Q9acho8`*yRhU#_ICIdTfL;UpDIgCho2F{`sV#I zmbkDF?jF-=(2 z=lbYzqV?C%)%1~0Fo&rcPJyp(`K!EJ^X11|AU8D*5CD*OCFVy2Si7qwx?$fmlP3w+>97Z+nk|I1YQyz^{2F8S64t@Mil zDF@Z>29xOlHCe>KjY5=|ilNYKc_~r#Tl4U#ckU-~Mjb4Hus*^%=E9yx8iVd<$Ej!<7dcMrkJQ^4@X=J*=sbM+Z2mj$6vV}!xAYy zYCh+GH(+kg5Z9h+Ma8-wjGq0^^)!cs`6T*dyt0JYM~zHNH1@H%GSTLp*r- zWt;zRyGpjTy&)TEJd$7jV12$347@Z`J|7zRYEiL+e(^NiBR9fWMY+!Y`I%;RnK^Rc zOLO@So+Ui7LH&!J(5u`1eCPN#nzeG4xWjTzpy9<)$-Zr`b;|BgrGctGmU^|W2U=#! zW{m#jzR!`cwb-SbuQ9Kf(MVfxwit?skXB{3nDP_W6t!Cr=YGOMrk+rq^^mbEivDEn ziq7o=M2>xJ<1|s>0bc*+!GgWA{KG-6clSDnsiN`ZTsB)w!`}S)q%a4E`7kmEp3+67 zpI^R$s`-uk1sF23enyURT$)q&uZAv{KeHU!qc0oa%IfdGbr|!)P2Dzd3yhg3eb9W( z&@C5A=gJKqsMn`gzpSa3G%abKSnv?;A3sl=xb=Ut>e&*jYqj%Nsj%~U`D>au{RkHX%{Q+5^Th2( zTI;}9*Vcc5yyKXsZoP3^t+O(W{EfQ|<7bH2$LJH)9IKR_$)SJbLy=F?`>uTWP(YYr|P9R5LL5?hO~Ke}$WdEf5!e#mizUEb*;#`rQTM zwI{p^ut4;DBA<*e>qha}6Ro3K*G2uO@Z77X=u6%*jsEuce7s1`hN$m%eBZHVk{7Cn z%N{(;L9=|H;YIotSLx7zJd5QKK+*gydPYQ@uY9i4d-1Pgx_pQnceNnczl(JGX~>pdS#)> z6#nztI@Pouoj1WLK)bPY-fky)@TL zu3uj4`#_%S)}|9aKnzgxp9$NEN;+QisHQmy2wJ2tD+Mx|zBkJ3o+{6u=QweRvn)$h${5=n>ky%-;E(#bj zECLGvMvw7P)>`md5d}-_z#4JT1*v!Ba;m8%uNA|fWNEpboUJr*adB$xsjZiz?$omj zUI%9G;^j2;8msIB^TUGcx6_6X`uo2g6{Bj7_1g_GY3x@(d`sl<6xvWbL%ukF^kdMwV`?Syej$bwW144(8E`|6 zlfnn~7lTMN%;QweF=>OW&Bu^D9X^)3y=Z!C$UD3ifm>bvH7qv~Qw%X39cQX~mMpmL zMa+{8VpASW0N0K3{dB2EjlG{_NA!GQQE{WV28+O8STK)##T#cY-IDyl3yZdhVY%;E zzH3$~TdV&frvFCan-^)5l*Q!<1DpEIzjWk<#T3MF@U6^9jrq={;>Ryy7Ht$`kk&I3 z7JS5?UEx~t-74AbURWI4D7G>8E3jbAV*9Q9?X%f?8oaQ$ugdLT?1{ZV=^{VBh{?4{ zJY!n7O|twc&YPmb3f39Mr^V zi^xqP9TwWiP2#QBFxDpRkZovt@a@p#v}ar$)jg9ui-ndCL;EHy_?|xBHN8PVpDj&{ z5rs=2ewHRXMf-eCZfWgz%F%P<&fXG-%RH51&bW+Y{$p2h3qC54I;FKRMvp(wDF1v# z&wrPE8iqpVMS0B*_Z6dyR!uO{1n>;9C1QApGuGd?^gD%}xSC=Z`8s3R%Uf@_SZT}e z6cG65%u8j-%&S7ub>D`BhadNEYeyEm$`lwF9GWGD=7(ciXNf8Kv9ib3~uGTDM z!5JnTxcZ`fuv_FQfN9--k8l)la>GBr*R23%0q)OCgIe*`_h*hh(2VtA%FmiOUcf1| zD7B>U=-3g_LkBeL^>L-|s%BQs5bmx{rSVT_)`lp%2Hilj4Dt&`S~`Je6PzdwLa8U8B__~fZOJlIjjPyCREGuU5T zoi1eEDCiVm&GISi)S-RW<|wBh?II-I$s?;=qLW`!+z{-&$0<~7+~ZVLe6h#rhH%~H zWE0<4b}E=vc%Rd$0$F8GIPJ)lCraf$GE;nU)~Rf1qbS$%^%{-H{bN=)$Ep%L3fMnh UuZ*r_iqF&V3-k3qc6#^!18YN!%K!iX delta 48193 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 Zzt8R-ooj+sR8oyh_;cR@R9GTc{1;Jd9R~ma diff --git a/package.json b/package.json index 7e4f04f..662cb7b 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,6 @@ }, "dependencies": { "@block65/webcrypto-web-push": "^0.3.2", - "@github/webauthn-json": "^2.1.1", "@libsql/client": "0.6.0", "@paralleldrive/cuid2": "^2.2.2", "@radix-ui/react-avatar": "^1.0.4", @@ -27,7 +26,6 @@ "@radix-ui/react-slot": "^1.0.2", "@radix-ui/react-tooltip": "^1.0.7", "@riskymh/aws": "^0.0.4", - "@simplewebauthn/server": "^10.0.0", "@t3-oss/env-nextjs": "^0.10.1", "@tailwindcss/typography": "^0.5.13", "aws4fetch": "^1.0.18", @@ -62,7 +60,7 @@ "@types/react": "^18.3.1", "@types/react-dom": "^18.3.0", "autoprefixer": "^10.4.19", - "drizzle-kit": "^0.20.18-d190692", + "drizzle-kit": "^0.20.17", "eslint": "8.57.0", "eslint-config-next": "^14.2.3", "postcss": "^8.4.38",