From 633146285d4567ab611e9ca5f609811992b3a73d Mon Sep 17 00:00:00 2001 From: Atharva Deosthale Date: Sat, 11 Jul 2026 00:45:52 +0530 Subject: [PATCH 1/7] docs(partners): add OAuth server section and Sign in with your product guide --- .optimize-cache.json | 20 + src/routes/docs/Sidebar.svelte | 7 + .../docs/partners/oauth-server/+layout.svelte | 64 + .../docs/partners/oauth-server/+page.markdoc | 68 + .../oauth-server/authorization/+page.markdoc | 522 ++++++ .../oauth-server/clients/+page.markdoc | 1578 +++++++++++++++++ .../oauth-server/device-flow/+page.markdoc | 171 ++ .../oauth-server/quick-start/+page.markdoc | 468 +++++ .../oauth-server/scopes/+page.markdoc | 40 + .../sign-in-with-your-product/+layout.svelte | 10 + .../sign-in-with-your-product/+layout.ts | 11 + .../sign-in-with-your-product/+page.ts | 5 + .../step-1/+page.markdoc | 50 + .../step-2/+page.markdoc | 55 + .../step-3/+page.markdoc | 74 + .../step-4/+page.markdoc | 86 + .../step-5/+page.markdoc | 219 +++ .../step-6/+page.markdoc | 130 ++ .../step-7/+page.markdoc | 57 + .../oauth-server/tokens/+page.markdoc | 348 ++++ .../dark/oauth2-server-apps-empty.avif | Bin 0 -> 25267 bytes .../dark/oauth2-server-apps-list.avif | Bin 0 -> 26947 bytes .../dark/oauth2-server-create-app.avif | Bin 0 -> 24357 bytes .../dark/oauth2-server-discovery.avif | Bin 0 -> 38896 bytes .../dark/oauth2-server-secret-created.avif | Bin 0 -> 16069 bytes .../dark/oauth2-server-settings-disabled.avif | Bin 0 -> 22789 bytes .../dark/oauth2-server-settings.avif | Bin 0 -> 31883 bytes .../dark/oauth2-server-token-lifetimes.avif | Bin 0 -> 38664 bytes .../oauth-server/guide/taskflow-consent.avif | Bin 0 -> 15748 bytes .../oauth-server/guide/taskflow-login.avif | Bin 0 -> 9317 bytes .../oauth-server/guide/vantage-dashboard.avif | Bin 0 -> 16679 bytes .../oauth-server/guide/vantage-landing.avif | Bin 0 -> 27710 bytes .../oauth2-server-apps-empty.avif | Bin 0 -> 24515 bytes .../oauth-server/oauth2-server-apps-list.avif | Bin 0 -> 25399 bytes .../oauth2-server-create-app.avif | Bin 0 -> 22852 bytes .../oauth-server/oauth2-server-discovery.avif | Bin 0 -> 35800 bytes .../oauth2-server-secret-created.avif | Bin 0 -> 15143 bytes .../oauth2-server-settings-disabled.avif | Bin 0 -> 21061 bytes .../oauth-server/oauth2-server-settings.avif | Bin 0 -> 29507 bytes .../oauth2-server-token-lifetimes.avif | Bin 0 -> 35339 bytes 40 files changed, 3983 insertions(+) create mode 100644 src/routes/docs/partners/oauth-server/+layout.svelte create mode 100644 src/routes/docs/partners/oauth-server/+page.markdoc create mode 100644 src/routes/docs/partners/oauth-server/authorization/+page.markdoc create mode 100644 src/routes/docs/partners/oauth-server/clients/+page.markdoc create mode 100644 src/routes/docs/partners/oauth-server/device-flow/+page.markdoc create mode 100644 src/routes/docs/partners/oauth-server/quick-start/+page.markdoc create mode 100644 src/routes/docs/partners/oauth-server/scopes/+page.markdoc create mode 100644 src/routes/docs/partners/oauth-server/sign-in-with-your-product/+layout.svelte create mode 100644 src/routes/docs/partners/oauth-server/sign-in-with-your-product/+layout.ts create mode 100644 src/routes/docs/partners/oauth-server/sign-in-with-your-product/+page.ts create mode 100644 src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-1/+page.markdoc create mode 100644 src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-2/+page.markdoc create mode 100644 src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-3/+page.markdoc create mode 100644 src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-4/+page.markdoc create mode 100644 src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-5/+page.markdoc create mode 100644 src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-6/+page.markdoc create mode 100644 src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-7/+page.markdoc create mode 100644 src/routes/docs/partners/oauth-server/tokens/+page.markdoc create mode 100644 static/images/docs/oauth-server/dark/oauth2-server-apps-empty.avif create mode 100644 static/images/docs/oauth-server/dark/oauth2-server-apps-list.avif create mode 100644 static/images/docs/oauth-server/dark/oauth2-server-create-app.avif create mode 100644 static/images/docs/oauth-server/dark/oauth2-server-discovery.avif create mode 100644 static/images/docs/oauth-server/dark/oauth2-server-secret-created.avif create mode 100644 static/images/docs/oauth-server/dark/oauth2-server-settings-disabled.avif create mode 100644 static/images/docs/oauth-server/dark/oauth2-server-settings.avif create mode 100644 static/images/docs/oauth-server/dark/oauth2-server-token-lifetimes.avif create mode 100644 static/images/docs/oauth-server/guide/taskflow-consent.avif create mode 100644 static/images/docs/oauth-server/guide/taskflow-login.avif create mode 100644 static/images/docs/oauth-server/guide/vantage-dashboard.avif create mode 100644 static/images/docs/oauth-server/guide/vantage-landing.avif create mode 100644 static/images/docs/oauth-server/oauth2-server-apps-empty.avif create mode 100644 static/images/docs/oauth-server/oauth2-server-apps-list.avif create mode 100644 static/images/docs/oauth-server/oauth2-server-create-app.avif create mode 100644 static/images/docs/oauth-server/oauth2-server-discovery.avif create mode 100644 static/images/docs/oauth-server/oauth2-server-secret-created.avif create mode 100644 static/images/docs/oauth-server/oauth2-server-settings-disabled.avif create mode 100644 static/images/docs/oauth-server/oauth2-server-settings.avif create mode 100644 static/images/docs/oauth-server/oauth2-server-token-lifetimes.avif diff --git a/.optimize-cache.json b/.optimize-cache.json index 854da251a0..bfba95b3cc 100644 --- a/.optimize-cache.json +++ b/.optimize-cache.json @@ -1586,6 +1586,26 @@ "static/images/docs/network/edges-map.png": "12ecc1ea200905ba75eb7cfd17055a156fd51fccf746869a1058f923dfd7ac1b", "static/images/docs/network/pops-map.png": "205ead599703cf47d0df316db8fcc4f48d5eed01508109fc740d17914275e9ab", "static/images/docs/network/regions-map.png": "c65f1423ab19c3048bf8bf93117e8f2e1d13a2bc705c00307de7ee821e5668a1", + "static/images/docs/oauth-server/dark/oauth2-server-apps-empty.png": "b81617a77c6489bc93cfe3c118c2fd075eebda850fc5803cba4b1b62792269f1", + "static/images/docs/oauth-server/dark/oauth2-server-apps-list.png": "a0b1a9bcc5708bb48f7d4684d754cfc8af8e666f808e11d00fc42182ee7ccf6e", + "static/images/docs/oauth-server/dark/oauth2-server-create-app.png": "8237a7890f6246661086cf80b7eb6cdbf0b27b4bc1a5cbcf485209ef9a27dfcf", + "static/images/docs/oauth-server/dark/oauth2-server-discovery.png": "e688439f87c4ae73086b76ee094e036d5bddb14b9431aaad5901d281ab3ca413", + "static/images/docs/oauth-server/dark/oauth2-server-secret-created.png": "d675fe574706d58b224ce823c8904145482472f64ab940a8bb37b92fcc33008e", + "static/images/docs/oauth-server/dark/oauth2-server-settings-disabled.png": "ad51d531eaa3736839859097c024bca41a28d1339ceef773e376c06936e040ee", + "static/images/docs/oauth-server/dark/oauth2-server-settings.png": "18da0340416739f803b8c04d66c191e92e7eafa70cd301acb1e269d8dd5a0c81", + "static/images/docs/oauth-server/dark/oauth2-server-token-lifetimes.png": "46743e2f0a3e8c126d590809668a37c2beb1f1c5483002839d9a15eca9e110d4", + "static/images/docs/oauth-server/guide/taskflow-consent.png": "5c4f4cbc6b225c60d5d6e2f1616abe45f0e6b66a5014438961fca98db349bd18", + "static/images/docs/oauth-server/guide/taskflow-login.png": "5d0013b31b211efe4d3a2f6a9f224a5b547d3ef1370e507b9a183bb276fc90e1", + "static/images/docs/oauth-server/guide/vantage-dashboard.png": "b2e95c34ec9c19be090e5f3384e0c3278dd840059b3f015ccdb13a16c135dde1", + "static/images/docs/oauth-server/guide/vantage-landing.png": "dc597717bcc93de02b2e5336a0f05d743ea66e6d91cef40fbdc61f8380577bec", + "static/images/docs/oauth-server/oauth2-server-apps-empty.png": "6f7b5c2021df2db7a3a1c4da3dfcf9b2ff119e98450e755eb64f03263030da0a", + "static/images/docs/oauth-server/oauth2-server-apps-list.png": "e3f38509e45e502f742e7532ae1a19bdd35b0891821b6a81601b7960ff16b38c", + "static/images/docs/oauth-server/oauth2-server-create-app.png": "182c207475ebd8f386d3d1ec522058f23f59cb47d85f4b681889d0dd08eb8cd8", + "static/images/docs/oauth-server/oauth2-server-discovery.png": "5b75f8e780cac92a68fda24a9686ba89ce83d89ac66e5f651428b4c62bb81cbd", + "static/images/docs/oauth-server/oauth2-server-secret-created.png": "5a6d48595018a8faaa26aeafe099c3dda23613a35e49884decbecb0029449168", + "static/images/docs/oauth-server/oauth2-server-settings-disabled.png": "648091d9d81308ab93dd456f172fa1c1977c2fbce9b8aa03893398bdefe10595", + "static/images/docs/oauth-server/oauth2-server-settings.png": "914aa6511caedb568f199eacef837366c523f78125c551afa992e39098707431", + "static/images/docs/oauth-server/oauth2-server-token-lifetimes.png": "895bf62c7f5171c8f244fda37b516760266c47447f2c66c93c3c812139823b96", "static/images/docs/platform/add-platform.png": "5a05bb9d75a8d5270bfa5e67df7e6de20a9fad174476a112b5bdab72e7bdad30", "static/images/docs/platform/create-api-key.png": "7661b3845e13704643f8ff4f763faa8e61efb90878c3ffa7466ece0910b8ecab", "static/images/docs/platform/create-webhook.png": "77e08173da6ac534524e025433cf75e532d853a135944a7c6ba2278357d88b2d", diff --git a/src/routes/docs/Sidebar.svelte b/src/routes/docs/Sidebar.svelte index 1dd3ea69ec..b1c7a1edfa 100644 --- a/src/routes/docs/Sidebar.svelte +++ b/src/routes/docs/Sidebar.svelte @@ -101,6 +101,13 @@ href: '/docs/partners/project', icon: 'icon-briefcase', isParent: true + }, + { + label: 'OAuth server', + href: '/docs/partners/oauth-server', + icon: 'icon-key', + isParent: true, + new: isNewUntil('31 Aug 2026') } ] }, diff --git a/src/routes/docs/partners/oauth-server/+layout.svelte b/src/routes/docs/partners/oauth-server/+layout.svelte new file mode 100644 index 0000000000..409e8402dc --- /dev/null +++ b/src/routes/docs/partners/oauth-server/+layout.svelte @@ -0,0 +1,64 @@ + + + + + + diff --git a/src/routes/docs/partners/oauth-server/+page.markdoc b/src/routes/docs/partners/oauth-server/+page.markdoc new file mode 100644 index 0000000000..b3ec80274e --- /dev/null +++ b/src/routes/docs/partners/oauth-server/+page.markdoc @@ -0,0 +1,68 @@ +--- +layout: article +title: OAuth server +description: Turn your Appwrite project into an OAuth 2.1 and OpenID Connect provider so third-party apps can sign in with your product. +back: /docs +--- + +Appwrite can act as an **OAuth 2.1 and OpenID Connect provider**. When you enable the OAuth server on a project, third-party apps register as clients, send your users to a consent screen you host, and receive tokens your project issues. The users in your project become an identity provider that any standards-compliant OAuth or OIDC library can integrate with, the same way apps integrate with "Sign in with Google" or "Sign in with GitHub". + +{% only_dark %} +![OAuth2 server settings in the Appwrite Console](/images/docs/oauth-server/dark/oauth2-server-settings.avif) +{% /only_dark %} +{% only_light %} +![OAuth2 server settings in the Appwrite Console](/images/docs/oauth-server/oauth2-server-settings.avif) +{% /only_light %} + +This is the inverse of the [OAuth providers](/docs/partners/project/oauth) feature. OAuth providers let your users sign in to your project *with* an external service. The OAuth server lets external services sign their users in *with your project*. + +# How it works {% #how-it-works %} + +The OAuth server has three moving parts. + +1. **The authorization server.** Enabling the server on your project exposes a full set of OIDC endpoints: authorization, token, userinfo, discovery, JWKS, revocation, and introspection. A keypair is generated for your project on first enable and used to sign tokens. +2. **Clients.** Each third-party app registers as a [client](/docs/partners/oauth-server/clients), either confidential (it has a backend that can hold a secret) or public (a browser or mobile app that cannot). Clients declare the redirect URIs they are allowed to return to. +3. **The consent screen.** You host a consent screen at an authorization URL you configure. When a user authorizes a client, Appwrite redirects them to your screen, your screen confirms the grant, and Appwrite issues an authorization code the client exchanges for tokens. + +The flow follows the OAuth 2.1 authorization code grant with PKCE, plus the OpenID Connect layer for identity. Because the server is spec-compliant, integrators can point any OAuth or OIDC client library at your project's discovery URL and it works without Appwrite-specific code. + +# Standards support {% #standards %} + +The server implements the current OAuth 2.1 and OpenID Connect security practices: + +- **Authorization code grant with PKCE.** PKCE uses `S256` and is required for public clients. The password grant and the implicit access-token grant are not supported. +- **Refresh tokens with rotation.** Every refresh issues a new refresh token and invalidates the previous one. Reusing an old refresh token revokes the whole token family. +- **Exact redirect URI matching.** A returned redirect URI must exactly match a registered one, with a narrow loopback-port exception for public native clients (RFC 8252). +- **OpenID Connect.** The server issues `id_token` values, serves a discovery document at `/.well-known/openid-configuration`, and publishes signing keys at `/.well-known/jwks.json`. +- **Device authorization grant** (RFC 8628) for input-constrained devices like TVs and CLIs. + +# Concepts {% #concepts %} + +{% cards %} +{% cards_item href="/docs/partners/oauth-server/quick-start" title="Quick start" %} +Enable the server, register a client, and run your first sign-in end to end. +{% /cards_item %} +{% cards_item href="/docs/partners/oauth-server/clients" title="Clients" %} +Register confidential and public OAuth clients and manage their secrets. +{% /cards_item %} +{% cards_item href="/docs/partners/oauth-server/authorization" title="Authorization" %} +The authorization code flow, PKCE, and hosting your own consent screen. +{% /cards_item %} +{% cards_item href="/docs/partners/oauth-server/tokens" title="Tokens" %} +Access, refresh, and ID tokens, their lifetimes, introspection, and revocation. +{% /cards_item %} +{% cards_item href="/docs/partners/oauth-server/scopes" title="Scopes" %} +The built-in OpenID scopes and the custom scopes your clients can request. +{% /cards_item %} +{% cards_item href="/docs/partners/oauth-server/device-flow" title="Device flow" %} +Authorize TVs, CLIs, and other input-constrained devices. +{% /cards_item %} +{% /cards %} + +# Guide {% #guide %} + +{% cards %} +{% cards_item href="/docs/partners/oauth-server/sign-in-with-your-product/step-1" title="Sign in with your product" %} +Build a full sign-in with your product experience end to end, from the consent screen to the token exchange. +{% /cards_item %} +{% /cards %} diff --git a/src/routes/docs/partners/oauth-server/authorization/+page.markdoc b/src/routes/docs/partners/oauth-server/authorization/+page.markdoc new file mode 100644 index 0000000000..be7872d8d9 --- /dev/null +++ b/src/routes/docs/partners/oauth-server/authorization/+page.markdoc @@ -0,0 +1,522 @@ +--- +layout: article +title: Authorization +description: The OAuth 2.1 authorization code flow with PKCE, and how to host a consent screen for your Appwrite OAuth server. +back: /docs/partners/oauth-server +--- + +Authorization is the step where a user allows a client to act on their behalf. Appwrite's OAuth server uses the **authorization code flow with PKCE**, the flow the OAuth 2.1 draft recommends for every client type. This page covers the flow end to end and how to host the consent screen it depends on. + +# The authorization code flow {% #flow %} + +1. The client sends the user to the **authorization endpoint** with its client ID, a registered redirect URI, `response_type=code`, and the scopes it wants. +2. Appwrite checks for a user session on your project. With a session, it creates a grant and redirects to your **authorization URL** with a `grant_id`. Without one, it redirects to your authorization URL with the full request so you can sign the user in first. +3. Your **consent screen** loads the grant, shows the user what is being requested, and approves or rejects it. +4. On approval, Appwrite redirects back to the client's redirect URI with a short-lived authorization `code`. +5. The client exchanges the code for tokens at the token endpoint. See [Tokens](/docs/partners/oauth-server/tokens). + +# PKCE {% #pkce %} + +PKCE (Proof Key for Code Exchange) binds an authorization request to the client that started it, so an intercepted code cannot be redeemed by anyone else. The client generates a random `code_verifier`, hashes it with SHA-256 into a `code_challenge`, and sends the challenge on the authorize request. When it later redeems the code, it presents the original verifier, and the server checks that they match. + +The server supports the `S256` challenge method only. PKCE is **always required for public clients**. For confidential clients it is optional and controlled per project by the **Require PKCE** setting, since those clients already authenticate with a secret. + +# Start authorization {% #authorize %} + +Send the user to the authorization endpoint. A public client includes its `code_challenge`; a confidential client includes it when PKCE is enabled. + +{% multicode %} +```client-web +import { Client, Oauth2 } from 'appwrite'; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +const oauth2 = new Oauth2(client); + +const result = await oauth2.authorize({ + clientId: '', + redirectUri: 'https://example.com', + responseType: 'code', + scope: '', // optional + state: '', // optional + nonce: '', // optional + codeChallenge: '', // optional + codeChallengeMethod: 's256', // optional + prompt: '', // optional + maxAge: 0, // optional + authorizationDetails: '', // optional + resource: '' // optional +}); + +console.log(result); +``` +```client-flutter +import 'package:appwrite/appwrite.dart'; + +Client client = Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +Oauth2 oauth2 = Oauth2(client); + +Oauth2Authorize result = await oauth2.authorize( + clientId: '', + redirectUri: 'https://example.com', + responseType: 'code', + scope: '', // optional + state: '', // optional + nonce: '', // optional + codeChallenge: '', // optional + codeChallengeMethod: 's256', // optional + prompt: '', // optional + maxAge: 0, // optional + authorizationDetails: '', // optional + resource: '', // optional +); +``` +```client-apple +import Appwrite + +let client = Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + +let oauth2 = Oauth2(client) + +let oauth2Authorize = try await oauth2.authorize( + client_id: "", + redirect_uri: "https://example.com", + response_type: "code", + scope: "", // optional + state: "", // optional + nonce: "", // optional + code_challenge: "", // optional + code_challenge_method: "s256", // optional + prompt: "", // optional + max_age: 0, // optional + authorization_details: "", // optional + resource: "" // optional +) + +``` +```client-android-kotlin +import io.appwrite.Client +import io.appwrite.coroutines.CoroutineCallback +import io.appwrite.services.Oauth2 + +val client = Client(context) + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + +val oauth2 = Oauth2(client) + +val result = oauth2.authorize( + client_id = "", + redirect_uri = "https://example.com", + response_type = "code", + scope = "", // (optional) + state = "", // (optional) + nonce = "", // (optional) + code_challenge = "", // (optional) + code_challenge_method = "s256", // (optional) + prompt = "", // (optional) + max_age = 0, // (optional) + authorization_details = "", // (optional) + resource = "", // (optional) +) +``` +```client-android-java +import io.appwrite.Client; +import io.appwrite.coroutines.CoroutineCallback; +import io.appwrite.services.Oauth2; + +Client client = new Client(context) + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject(""); // Your project ID + +Oauth2 oauth2 = new Oauth2(client); + +oauth2.authorize( + "", // client_id + "https://example.com", // redirect_uri + "code", // response_type + "", // scope (optional) + "", // state (optional) + "", // nonce (optional) + "", // code_challenge (optional) + "s256", // code_challenge_method (optional) + "", // prompt (optional) + 0, // max_age (optional) + "", // authorization_details (optional) + "", // resource (optional) + new CoroutineCallback<>((result, error) -> { + if (error != null) { + error.printStackTrace(); + return; + } + + Log.d("Appwrite", result.toString()); + }) +); + +``` +```client-react-native +import { Client, Oauth2 } from "react-native-appwrite"; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +const oauth2 = new Oauth2(client); + +const result = await oauth2.authorize({ + clientId: '', + redirectUri: 'https://example.com', + responseType: 'code', + scope: '', // optional + state: '', // optional + nonce: '', // optional + codeChallenge: '', // optional + codeChallengeMethod: 's256', // optional + prompt: '', // optional + maxAge: 0, // optional + authorizationDetails: '', // optional + resource: '' // optional +}); + +console.log(result); +``` +{% /multicode %} + +Without a session on the project, Appwrite redirects to your authorization URL with the original request parameters attached. Sign the user in there (with your normal [Appwrite authentication](/docs/products/auth)), then send them back through the authorize endpoint so a grant can be created. + +# Host the consent screen {% #consent %} + +Your authorization URL is a page you host. When Appwrite redirects a signed-in user to it with a `grant_id`, the page reads the grant, presents it, and records the user's decision. The consent endpoints authenticate with the user's session on your project. + +**Load the grant** to see which client, scopes, and resources are being requested, then render your UI. + +{% info title="Required scope" %} +Reading a grant requires the `oauth2.read` scope. Approving or rejecting one requires `oauth2.write`. +{% /info %} + +{% multicode %} +```client-web +import { Client, Oauth2 } from 'appwrite'; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +const oauth2 = new Oauth2(client); + +const result = await oauth2.getGrant({ + grantId: '' +}); + +console.log(result); +``` +```client-flutter +import 'package:appwrite/appwrite.dart'; + +Client client = Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +Oauth2 oauth2 = Oauth2(client); + +Oauth2Grant result = await oauth2.getGrant( + grantId: '', +); +``` +```client-apple +import Appwrite + +let client = Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + +let oauth2 = Oauth2(client) + +let oauth2Grant = try await oauth2.getGrant( + grant_id: "" +) + +``` +```client-android-kotlin +import io.appwrite.Client +import io.appwrite.coroutines.CoroutineCallback +import io.appwrite.services.Oauth2 + +val client = Client(context) + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + +val oauth2 = Oauth2(client) + +val result = oauth2.getGrant( + grant_id = "", +) +``` +```client-android-java +import io.appwrite.Client; +import io.appwrite.coroutines.CoroutineCallback; +import io.appwrite.services.Oauth2; + +Client client = new Client(context) + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject(""); // Your project ID + +Oauth2 oauth2 = new Oauth2(client); + +oauth2.getGrant( + "", // grant_id + new CoroutineCallback<>((result, error) -> { + if (error != null) { + error.printStackTrace(); + return; + } + + Log.d("Appwrite", result.toString()); + }) +); + +``` +```client-react-native +import { Client, Oauth2 } from "react-native-appwrite"; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +const oauth2 = new Oauth2(client); + +const result = await oauth2.getGrant({ + grantId: '' +}); + +console.log(result); +``` +{% /multicode %} + +**Approve** the grant to continue. Appwrite responds with the redirect URL back to the client, carrying the authorization code. Send the user there. + +{% multicode %} +```client-web +import { Client, Oauth2 } from 'appwrite'; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +const oauth2 = new Oauth2(client); + +const result = await oauth2.approve({ + grantId: '', + authorizationDetails: '', // optional + scope: '' // optional +}); + +console.log(result); +``` +```client-flutter +import 'package:appwrite/appwrite.dart'; + +Client client = Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +Oauth2 oauth2 = Oauth2(client); + +Oauth2Approve result = await oauth2.approve( + grantId: '', + authorizationDetails: '', // optional + scope: '', // optional +); +``` +```client-apple +import Appwrite + +let client = Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + +let oauth2 = Oauth2(client) + +let oauth2Approve = try await oauth2.approve( + grant_id: "", + authorization_details: "", // optional + scope: "" // optional +) + +``` +```client-android-kotlin +import io.appwrite.Client +import io.appwrite.coroutines.CoroutineCallback +import io.appwrite.services.Oauth2 + +val client = Client(context) + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + +val oauth2 = Oauth2(client) + +val result = oauth2.approve( + grant_id = "", + authorization_details = "", // (optional) + scope = "", // (optional) +) +``` +```client-android-java +import io.appwrite.Client; +import io.appwrite.coroutines.CoroutineCallback; +import io.appwrite.services.Oauth2; + +Client client = new Client(context) + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject(""); // Your project ID + +Oauth2 oauth2 = new Oauth2(client); + +oauth2.approve( + "", // grant_id + "", // authorization_details (optional) + "", // scope (optional) + new CoroutineCallback<>((result, error) -> { + if (error != null) { + error.printStackTrace(); + return; + } + + Log.d("Appwrite", result.toString()); + }) +); + +``` +```client-react-native +import { Client, Oauth2 } from "react-native-appwrite"; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +const oauth2 = new Oauth2(client); + +const result = await oauth2.approve({ + grantId: '', + authorizationDetails: '', // optional + scope: '' // optional +}); + +console.log(result); +``` +{% /multicode %} + +**Reject** the grant if the user declines. Appwrite responds with the redirect URL carrying an error instead of a code. + +{% multicode %} +```client-web +import { Client, Oauth2 } from 'appwrite'; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +const oauth2 = new Oauth2(client); + +const result = await oauth2.reject({ + grantId: '' +}); + +console.log(result); +``` +```client-flutter +import 'package:appwrite/appwrite.dart'; + +Client client = Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +Oauth2 oauth2 = Oauth2(client); + +Oauth2Reject result = await oauth2.reject( + grantId: '', +); +``` +```client-apple +import Appwrite + +let client = Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + +let oauth2 = Oauth2(client) + +let oauth2Reject = try await oauth2.reject( + grant_id: "" +) + +``` +```client-android-kotlin +import io.appwrite.Client +import io.appwrite.coroutines.CoroutineCallback +import io.appwrite.services.Oauth2 + +val client = Client(context) + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + +val oauth2 = Oauth2(client) + +val result = oauth2.reject( + grant_id = "", +) +``` +```client-android-java +import io.appwrite.Client; +import io.appwrite.coroutines.CoroutineCallback; +import io.appwrite.services.Oauth2; + +Client client = new Client(context) + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject(""); // Your project ID + +Oauth2 oauth2 = new Oauth2(client); + +oauth2.reject( + "", // grant_id + new CoroutineCallback<>((result, error) -> { + if (error != null) { + error.printStackTrace(); + return; + } + + Log.d("Appwrite", result.toString()); + }) +); + +``` +```client-react-native +import { Client, Oauth2 } from "react-native-appwrite"; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +const oauth2 = new Oauth2(client); + +const result = await oauth2.reject({ + grantId: '' +}); + +console.log(result); +``` +{% /multicode %} + +# Redirect URI matching {% #redirect-uris %} + +The `redirect_uri` on an authorization request must exactly match one of the client's registered redirect URIs, character for character. This is what stops an attacker from redirecting a code to a URL they control. + +There is one narrow exception. For **public** clients, an `http` loopback address (`localhost`, `127.0.0.1`, or `[::1]`) matches on everything except the port. Native and CLI apps bind an unpredictable local port at runtime and cannot register it ahead of time (RFC 8252). Confidential clients get no such exception; their redirect URIs must match exactly, port included. diff --git a/src/routes/docs/partners/oauth-server/clients/+page.markdoc b/src/routes/docs/partners/oauth-server/clients/+page.markdoc new file mode 100644 index 0000000000..d5e364907f --- /dev/null +++ b/src/routes/docs/partners/oauth-server/clients/+page.markdoc @@ -0,0 +1,1578 @@ +--- +layout: article +title: Clients +description: Register confidential and public OAuth clients against your Appwrite project's OAuth server and manage their secrets. +back: /docs/partners/oauth-server +--- + +A **client** is a third-party app that authenticates users through your project's OAuth server. Each client registers the redirect URIs it is allowed to return to, and, depending on its type, receives a client secret. Clients are managed from the **Auth > OAuth2 server > Apps** tab in the Console, or with a [Server SDK](/docs/sdks#server). + +{% only_dark %} +![OAuth2 clients list in the Appwrite Console](/images/docs/oauth-server/dark/oauth2-server-apps-list.avif) +{% /only_dark %} +{% only_light %} +![OAuth2 clients list in the Appwrite Console](/images/docs/oauth-server/oauth2-server-apps-list.avif) +{% /only_light %} + +# Confidential and public clients {% #client-types %} + +Every client is one of two types, and the difference comes down to a single question: can the app keep a secret? + +A **confidential** client runs code on a server the developer controls, so it can store a `client_secret` that users never see. It authenticates to the token endpoint with that secret, which lets your server prove which client is calling. A **public** client runs entirely on the user's device (a single-page app, a native mobile app, a CLI), where any embedded secret would ship to the user and could be read. Public clients receive no secret and rely on PKCE instead. + +{% only_dark %} +![Token lifetimes for confidential and public clients](/images/docs/oauth-server/dark/oauth2-server-token-lifetimes.avif) +{% /only_dark %} +{% only_light %} +![Token lifetimes for confidential and public clients](/images/docs/oauth-server/oauth2-server-token-lifetimes.avif) +{% /only_light %} + +The type a client uses changes what it can do: + +| | Confidential | Public | +| --- | --- | --- | +| Client secret | Issued, sent on token requests | None issued | +| PKCE | Optional (configurable per project) | Always required | +| Token introspection | Allowed | Not allowed | +| Default access token lifetime | 8 hours | 1 hour | +| Default refresh token lifetime | 365 days | 30 days | + +Choose confidential whenever the app has a backend. It is the safer default: the token exchange is protected by a secret, tokens never touch the browser, and sessions can last longer. Reserve public for apps that genuinely have no server to hold a secret. + +# Register a client {% #register %} + +Create a client from the **Apps** tab, or with the `create` method of the `Apps` service. Registering a confidential client returns its secret once. Store it immediately, because the full value cannot be retrieved again. + +{% only_dark %} +![Create an OAuth2 client dialog](/images/docs/oauth-server/dark/oauth2-server-create-app.avif) +{% /only_dark %} +{% only_light %} +![Create an OAuth2 client dialog](/images/docs/oauth-server/oauth2-server-create-app.avif) +{% /only_light %} + +{% info title="Required scope" %} +The API key used for this call needs the `apps.write` scope. +{% /info %} + +{% multicode %} +```server-nodejs +import { Client, Apps } from 'node-appwrite'; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject('') // Your project ID + .setKey(''); // Your secret API key + +const apps = new Apps(client); + +const result = await apps.create({ + appId: '', + name: '', + redirectUris: [], + description: '', // optional + clientUri: 'https://example.com', // optional + logoUri: 'https://example.com', // optional + privacyPolicyUrl: 'https://example.com', // optional + termsUrl: 'https://example.com', // optional + contacts: [], // optional + tagline: '', // optional + tags: [], // optional + images: [], // optional + supportUrl: 'https://example.com', // optional + dataDeletionUrl: 'https://example.com', // optional + postLogoutRedirectUris: [], // optional + enabled: false, // optional + type: 'public', // optional + deviceFlow: false, // optional + teamId: '' // optional +}); +``` +```server-deno +import { Client, Apps } from "npm:node-appwrite"; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject('') // Your project ID + .setKey(''); // Your secret API key + +const apps = new Apps(client); + +const result = await apps.create({ + appId: '', + name: '', + redirectUris: [], + description: '', // optional + clientUri: 'https://example.com', // optional + logoUri: 'https://example.com', // optional + privacyPolicyUrl: 'https://example.com', // optional + termsUrl: 'https://example.com', // optional + contacts: [], // optional + tagline: '', // optional + tags: [], // optional + images: [], // optional + supportUrl: 'https://example.com', // optional + dataDeletionUrl: 'https://example.com', // optional + postLogoutRedirectUris: [], // optional + enabled: false, // optional + type: 'public', // optional + deviceFlow: false, // optional + teamId: '' // optional +}); +``` +```server-php +```php +setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + ->setProject('') // Your project ID + ->setKey(''); // Your secret API key + +$apps = new Apps($client); + +$result = $apps->create( + appId: '', + name: '', + redirectUris: [], + description: '', // optional + clientUri: 'https://example.com', // optional + logoUri: 'https://example.com', // optional + privacyPolicyUrl: 'https://example.com', // optional + termsUrl: 'https://example.com', // optional + contacts: [], // optional + tagline: '', // optional + tags: [], // optional + images: [], // optional + supportUrl: 'https://example.com', // optional + dataDeletionUrl: 'https://example.com', // optional + postLogoutRedirectUris: [], // optional + enabled: false, // optional + type: 'public', // optional + deviceFlow: false, // optional + teamId: '' // optional +);``` +``` +```server-python +from appwrite.client import Client +from appwrite.services.apps import Apps +from appwrite.models import App + +client = Client() +client.set_endpoint('https://.cloud.appwrite.io/v1') # Your API Endpoint +client.set_project('') # Your project ID +client.set_key('') # Your secret API key + +apps = Apps(client) + +result: App = apps.create( + app_id = '', + name = '', + redirect_uris = [], + description = '', # optional + client_uri = 'https://example.com', # optional + logo_uri = 'https://example.com', # optional + privacy_policy_url = 'https://example.com', # optional + terms_url = 'https://example.com', # optional + contacts = [], # optional + tagline = '', # optional + tags = [], # optional + images = [], # optional + support_url = 'https://example.com', # optional + data_deletion_url = 'https://example.com', # optional + post_logout_redirect_uris = [], # optional + enabled = False, # optional + type = 'public', # optional + device_flow = False, # optional + team_id = '' # optional +) + +print(result.model_dump()) +``` +```server-ruby +require 'appwrite' + +include Appwrite + +client = Client.new + .set_endpoint('https://.cloud.appwrite.io/v1') # Your API Endpoint + .set_project('') # Your project ID + .set_key('') # Your secret API key + +apps = Apps.new(client) + +result = apps.create( + app_id: '', + name: '', + redirect_uris: [], + description: '', # optional + client_uri: 'https://example.com', # optional + logo_uri: 'https://example.com', # optional + privacy_policy_url: 'https://example.com', # optional + terms_url: 'https://example.com', # optional + contacts: [], # optional + tagline: '', # optional + tags: [], # optional + images: [], # optional + support_url: 'https://example.com', # optional + data_deletion_url: 'https://example.com', # optional + post_logout_redirect_uris: [], # optional + enabled: false, # optional + type: 'public', # optional + device_flow: false, # optional + team_id: '' # optional +) +``` +```server-dart +import 'package:dart_appwrite/dart_appwrite.dart'; + +Client client = Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject('') // Your project ID + .setKey(''); // Your secret API key + +Apps apps = Apps(client); + +App result = await apps.create( + appId: '', + name: '', + redirectUris: [], + description: '', // (optional) + clientUri: 'https://example.com', // (optional) + logoUri: 'https://example.com', // (optional) + privacyPolicyUrl: 'https://example.com', // (optional) + termsUrl: 'https://example.com', // (optional) + contacts: [], // (optional) + tagline: '', // (optional) + tags: [], // (optional) + images: [], // (optional) + supportUrl: 'https://example.com', // (optional) + dataDeletionUrl: 'https://example.com', // (optional) + postLogoutRedirectUris: [], // (optional) + enabled: false, // (optional) + type: 'public', // (optional) + deviceFlow: false, // (optional) + teamId: '', // (optional) +); +``` +```server-dotnet +```csharp +using Appwrite; +using Appwrite.Models; +using Appwrite.Services; + +Client client = new Client() + .SetEndPoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .SetProject("") // Your project ID + .SetKey(""); // Your secret API key + +Apps apps = new Apps(client); + +App result = await apps.Create( + appId: "", + name: "", + redirectUris: new List(), + description: "", // optional + clientUri: "https://example.com", // optional + logoUri: "https://example.com", // optional + privacyPolicyUrl: "https://example.com", // optional + termsUrl: "https://example.com", // optional + contacts: new List(), // optional + tagline: "", // optional + tags: new List(), // optional + images: new List(), // optional + supportUrl: "https://example.com", // optional + dataDeletionUrl: "https://example.com", // optional + postLogoutRedirectUris: new List(), // optional + enabled: false, // optional + type: "public", // optional + deviceFlow: false, // optional + teamId: "" // optional +);``` +``` +```server-kotlin +import io.appwrite.Client +import io.appwrite.coroutines.CoroutineCallback +import io.appwrite.services.Apps + +val client = Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + .setKey("") // Your secret API key + +val apps = Apps(client) + +val response = apps.create( + appId = "", + name = "", + redirectUris = listOf(), + description = "", // optional + clientUri = "https://example.com", // optional + logoUri = "https://example.com", // optional + privacyPolicyUrl = "https://example.com", // optional + termsUrl = "https://example.com", // optional + contacts = listOf(), // optional + tagline = "", // optional + tags = listOf(), // optional + images = listOf(), // optional + supportUrl = "https://example.com", // optional + dataDeletionUrl = "https://example.com", // optional + postLogoutRedirectUris = listOf(), // optional + enabled = false, // optional + type = "public", // optional + deviceFlow = false, // optional + teamId = "" // optional +) +``` +```server-java +import io.appwrite.Client; +import io.appwrite.coroutines.CoroutineCallback; +import io.appwrite.services.Apps; + +Client client = new Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + .setKey(""); // Your secret API key + +Apps apps = new Apps(client); + +apps.create( + "", // appId + "", // name + List.of(), // redirectUris + "", // description (optional) + "https://example.com", // clientUri (optional) + "https://example.com", // logoUri (optional) + "https://example.com", // privacyPolicyUrl (optional) + "https://example.com", // termsUrl (optional) + List.of(), // contacts (optional) + "", // tagline (optional) + List.of(), // tags (optional) + List.of(), // images (optional) + "https://example.com", // supportUrl (optional) + "https://example.com", // dataDeletionUrl (optional) + List.of(), // postLogoutRedirectUris (optional) + false, // enabled (optional) + "public", // type (optional) + false, // deviceFlow (optional) + "", // teamId (optional) + new CoroutineCallback<>((result, error) -> { + if (error != null) { + error.printStackTrace(); + return; + } + + System.out.println(result); + }) +); + +``` +```server-swift +import Appwrite + +let client = Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + .setKey("") // Your secret API key + +let apps = Apps(client) + +let app = try await apps.create( + appId: "", + name: "", + redirectUris: [], + description: "", // optional + clientUri: "https://example.com", // optional + logoUri: "https://example.com", // optional + privacyPolicyUrl: "https://example.com", // optional + termsUrl: "https://example.com", // optional + contacts: [], // optional + tagline: "", // optional + tags: [], // optional + images: [], // optional + supportUrl: "https://example.com", // optional + dataDeletionUrl: "https://example.com", // optional + postLogoutRedirectUris: [], // optional + enabled: false, // optional + type: "public", // optional + deviceFlow: false, // optional + teamId: "" // optional +) + +``` +```server-go +package main + +import ( + "fmt" + "github.com/repoowner/reponame/client" + "github.com/repoowner/reponame/apps" +) + +client := client.New( + client.WithEndpoint("https://.cloud.appwrite.io/v1") + client.WithProject("") + appwrite.WithKey("") +) + +service := apps.New(client) + +response, error := service.Create( + "", + "", + []string{}, + apps.WithCreateDescription(""), + apps.WithCreateClientUri("https://example.com"), + apps.WithCreateLogoUri("https://example.com"), + apps.WithCreatePrivacyPolicyUrl("https://example.com"), + apps.WithCreateTermsUrl("https://example.com"), + apps.WithCreateContacts([]string{}), + apps.WithCreateTagline(""), + apps.WithCreateTags([]string{}), + apps.WithCreateImages([]string{}), + apps.WithCreateSupportUrl("https://example.com"), + apps.WithCreateDataDeletionUrl("https://example.com"), + apps.WithCreatePostLogoutRedirectUris([]string{}), + apps.WithCreateEnabled(false), + apps.WithCreateType("public"), + apps.WithCreateDeviceFlow(false), + apps.WithCreateTeamId(""), +) +``` +```server-rust +use appwrite::Client; +use appwrite::services::Apps; + +#[tokio::main] +async fn main() -> Result<(), Box> { + let client = Client::new(); + client.set_endpoint("https://.cloud.appwrite.io/v1"); // Your API Endpoint + client.set_project(""); // Your project ID + client.set_key(""); // Your secret API key + + let apps = Apps::new(&client); + + let result = apps.create( + "", + "", + vec![], + Some(""), // optional + Some("https://example.com"), // optional + Some("https://example.com"), // optional + Some("https://example.com"), // optional + Some("https://example.com"), // optional + Some(vec![]), // optional + Some(""), // optional + Some(vec![]), // optional + Some(vec![]), // optional + Some("https://example.com"), // optional + Some("https://example.com"), // optional + Some(vec![]), // optional + Some(false), // optional + Some("public"), // optional + Some(false), // optional + Some("") // optional + ).await?; + + let _ = result; + + Ok(()) +} +``` +{% /multicode %} + +The `type` parameter accepts `confidential` (the default) or `public`. Set `deviceFlow` to `true` to let the client use the [device authorization flow](/docs/partners/oauth-server/device-flow). The branding fields (`logoUri`, `tagline`, `privacyPolicyUrl`, `termsUrl`) appear on the consent screen your users see. + +# Manage client secrets {% #secrets %} + +A confidential client authenticates with a secret. Generate a new secret with the `createSecret` method. The plaintext value is returned only in this response. + +{% only_dark %} +![OAuth2 client secret shown once on creation](/images/docs/oauth-server/dark/oauth2-server-secret-created.avif) +{% /only_dark %} +{% only_light %} +![OAuth2 client secret shown once on creation](/images/docs/oauth-server/oauth2-server-secret-created.avif) +{% /only_light %} + +{% multicode %} +```server-nodejs +import { Client, Apps } from 'node-appwrite'; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject('') // Your project ID + .setKey(''); // Your secret API key + +const apps = new Apps(client); + +const result = await apps.createSecret({ + appId: '' +}); +``` +```server-deno +import { Client, Apps } from "npm:node-appwrite"; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject('') // Your project ID + .setKey(''); // Your secret API key + +const apps = new Apps(client); + +const result = await apps.createSecret({ + appId: '' +}); +``` +```server-php +```php +setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + ->setProject('') // Your project ID + ->setKey(''); // Your secret API key + +$apps = new Apps($client); + +$result = $apps->createSecret( + appId: '' +);``` +``` +```server-python +from appwrite.client import Client +from appwrite.services.apps import Apps +from appwrite.models import AppSecretPlaintext + +client = Client() +client.set_endpoint('https://.cloud.appwrite.io/v1') # Your API Endpoint +client.set_project('') # Your project ID +client.set_key('') # Your secret API key + +apps = Apps(client) + +result: AppSecretPlaintext = apps.create_secret( + app_id = '' +) + +print(result.model_dump()) +``` +```server-ruby +require 'appwrite' + +include Appwrite + +client = Client.new + .set_endpoint('https://.cloud.appwrite.io/v1') # Your API Endpoint + .set_project('') # Your project ID + .set_key('') # Your secret API key + +apps = Apps.new(client) + +result = apps.create_secret( + app_id: '' +) +``` +```server-dart +import 'package:dart_appwrite/dart_appwrite.dart'; + +Client client = Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject('') // Your project ID + .setKey(''); // Your secret API key + +Apps apps = Apps(client); + +AppSecretPlaintext result = await apps.createSecret( + appId: '', +); +``` +```server-dotnet +```csharp +using Appwrite; +using Appwrite.Models; +using Appwrite.Services; + +Client client = new Client() + .SetEndPoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .SetProject("") // Your project ID + .SetKey(""); // Your secret API key + +Apps apps = new Apps(client); + +AppSecretPlaintext result = await apps.CreateSecret( + appId: "" +);``` +``` +```server-kotlin +import io.appwrite.Client +import io.appwrite.coroutines.CoroutineCallback +import io.appwrite.services.Apps + +val client = Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + .setKey("") // Your secret API key + +val apps = Apps(client) + +val response = apps.createSecret( + appId = "" +) +``` +```server-java +import io.appwrite.Client; +import io.appwrite.coroutines.CoroutineCallback; +import io.appwrite.services.Apps; + +Client client = new Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + .setKey(""); // Your secret API key + +Apps apps = new Apps(client); + +apps.createSecret( + "", // appId + new CoroutineCallback<>((result, error) -> { + if (error != null) { + error.printStackTrace(); + return; + } + + System.out.println(result); + }) +); + +``` +```server-swift +import Appwrite + +let client = Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + .setKey("") // Your secret API key + +let apps = Apps(client) + +let appSecretPlaintext = try await apps.createSecret( + appId: "" +) + +``` +```server-go +package main + +import ( + "fmt" + "github.com/repoowner/reponame/client" + "github.com/repoowner/reponame/apps" +) + +client := client.New( + client.WithEndpoint("https://.cloud.appwrite.io/v1") + client.WithProject("") + appwrite.WithKey("") +) + +service := apps.New(client) + +response, error := service.CreateSecret( + "", +) +``` +```server-rust +use appwrite::Client; +use appwrite::services::Apps; + +#[tokio::main] +async fn main() -> Result<(), Box> { + let client = Client::new(); + client.set_endpoint("https://.cloud.appwrite.io/v1"); // Your API Endpoint + client.set_project(""); // Your project ID + client.set_key(""); // Your secret API key + + let apps = Apps::new(&client); + + let result = apps.create_secret( + "" + ).await?; + + let _ = result; + + Ok(()) +} +``` +{% /multicode %} + +A client can hold more than one secret at a time, which lets you rotate without downtime: create the new secret, deploy it, then delete the old one. Deleting a secret immediately breaks any client still using it, including token refreshes in flight. + +# List clients {% #list %} + +{% info title="Required scope" %} +The API key used for this call needs the `apps.read` scope. +{% /info %} + +{% multicode %} +```server-nodejs +import { Client, Apps } from 'node-appwrite'; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject('') // Your project ID + .setKey(''); // Your secret API key + +const apps = new Apps(client); + +const result = await apps.list({ + queries: [], // optional + total: false // optional +}); +``` +```server-deno +import { Client, Apps } from "npm:node-appwrite"; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject('') // Your project ID + .setKey(''); // Your secret API key + +const apps = new Apps(client); + +const result = await apps.list({ + queries: [], // optional + total: false // optional +}); +``` +```server-php +```php +setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + ->setProject('') // Your project ID + ->setKey(''); // Your secret API key + +$apps = new Apps($client); + +$result = $apps->list( + queries: [], // optional + total: false // optional +);``` +``` +```server-python +from appwrite.client import Client +from appwrite.services.apps import Apps +from appwrite.models import AppsList + +client = Client() +client.set_endpoint('https://.cloud.appwrite.io/v1') # Your API Endpoint +client.set_project('') # Your project ID +client.set_key('') # Your secret API key + +apps = Apps(client) + +result: AppsList = apps.list( + queries = [], # optional + total = False # optional +) + +print(result.model_dump()) +``` +```server-ruby +require 'appwrite' + +include Appwrite + +client = Client.new + .set_endpoint('https://.cloud.appwrite.io/v1') # Your API Endpoint + .set_project('') # Your project ID + .set_key('') # Your secret API key + +apps = Apps.new(client) + +result = apps.list( + queries: [], # optional + total: false # optional +) +``` +```server-dart +import 'package:dart_appwrite/dart_appwrite.dart'; + +Client client = Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject('') // Your project ID + .setKey(''); // Your secret API key + +Apps apps = Apps(client); + +AppsList result = await apps.list( + queries: [], // (optional) + total: false, // (optional) +); +``` +```server-dotnet +```csharp +using Appwrite; +using Appwrite.Models; +using Appwrite.Services; + +Client client = new Client() + .SetEndPoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .SetProject("") // Your project ID + .SetKey(""); // Your secret API key + +Apps apps = new Apps(client); + +AppsList result = await apps.List( + queries: new List(), // optional + total: false // optional +);``` +``` +```server-kotlin +import io.appwrite.Client +import io.appwrite.coroutines.CoroutineCallback +import io.appwrite.services.Apps + +val client = Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + .setKey("") // Your secret API key + +val apps = Apps(client) + +val response = apps.list( + queries = listOf(), // optional + total = false // optional +) +``` +```server-java +import io.appwrite.Client; +import io.appwrite.coroutines.CoroutineCallback; +import io.appwrite.services.Apps; + +Client client = new Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + .setKey(""); // Your secret API key + +Apps apps = new Apps(client); + +apps.list( + List.of(), // queries (optional) + false, // total (optional) + new CoroutineCallback<>((result, error) -> { + if (error != null) { + error.printStackTrace(); + return; + } + + System.out.println(result); + }) +); + +``` +```server-swift +import Appwrite + +let client = Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + .setKey("") // Your secret API key + +let apps = Apps(client) + +let appsList = try await apps.list( + queries: [], // optional + total: false // optional +) + +``` +```server-go +package main + +import ( + "fmt" + "github.com/repoowner/reponame/client" + "github.com/repoowner/reponame/apps" +) + +client := client.New( + client.WithEndpoint("https://.cloud.appwrite.io/v1") + client.WithProject("") + appwrite.WithKey("") +) + +service := apps.New(client) + +response, error := service.List( + apps.WithListQueries([]string{}), + apps.WithListTotal(false), +) +``` +```server-rust +use appwrite::Client; +use appwrite::services::Apps; + +#[tokio::main] +async fn main() -> Result<(), Box> { + let client = Client::new(); + client.set_endpoint("https://.cloud.appwrite.io/v1"); // Your API Endpoint + client.set_project(""); // Your project ID + client.set_key(""); // Your secret API key + + let apps = Apps::new(&client); + + let result = apps.list( + Some(vec![]), // optional + Some(false) // optional + ).await?; + + let _ = result; + + Ok(()) +} +``` +{% /multicode %} + +# Update a client {% #update %} + +Change a client's redirect URIs, branding, or type with the `update` method. + +{% multicode %} +```server-nodejs +import { Client, Apps } from 'node-appwrite'; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject('') // Your project ID + .setKey(''); // Your secret API key + +const apps = new Apps(client); + +const result = await apps.update({ + appId: '', + name: '', + description: '', // optional + clientUri: 'https://example.com', // optional + logoUri: 'https://example.com', // optional + privacyPolicyUrl: 'https://example.com', // optional + termsUrl: 'https://example.com', // optional + contacts: [], // optional + tagline: '', // optional + tags: [], // optional + images: [], // optional + supportUrl: 'https://example.com', // optional + dataDeletionUrl: 'https://example.com', // optional + enabled: false, // optional + redirectUris: [], // optional + postLogoutRedirectUris: [], // optional + type: 'public', // optional + deviceFlow: false // optional +}); +``` +```server-deno +import { Client, Apps } from "npm:node-appwrite"; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject('') // Your project ID + .setKey(''); // Your secret API key + +const apps = new Apps(client); + +const result = await apps.update({ + appId: '', + name: '', + description: '', // optional + clientUri: 'https://example.com', // optional + logoUri: 'https://example.com', // optional + privacyPolicyUrl: 'https://example.com', // optional + termsUrl: 'https://example.com', // optional + contacts: [], // optional + tagline: '', // optional + tags: [], // optional + images: [], // optional + supportUrl: 'https://example.com', // optional + dataDeletionUrl: 'https://example.com', // optional + enabled: false, // optional + redirectUris: [], // optional + postLogoutRedirectUris: [], // optional + type: 'public', // optional + deviceFlow: false // optional +}); +``` +```server-php +```php +setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + ->setProject('') // Your project ID + ->setKey(''); // Your secret API key + +$apps = new Apps($client); + +$result = $apps->update( + appId: '', + name: '', + description: '', // optional + clientUri: 'https://example.com', // optional + logoUri: 'https://example.com', // optional + privacyPolicyUrl: 'https://example.com', // optional + termsUrl: 'https://example.com', // optional + contacts: [], // optional + tagline: '', // optional + tags: [], // optional + images: [], // optional + supportUrl: 'https://example.com', // optional + dataDeletionUrl: 'https://example.com', // optional + enabled: false, // optional + redirectUris: [], // optional + postLogoutRedirectUris: [], // optional + type: 'public', // optional + deviceFlow: false // optional +);``` +``` +```server-python +from appwrite.client import Client +from appwrite.services.apps import Apps +from appwrite.models import App + +client = Client() +client.set_endpoint('https://.cloud.appwrite.io/v1') # Your API Endpoint +client.set_project('') # Your project ID +client.set_key('') # Your secret API key + +apps = Apps(client) + +result: App = apps.update( + app_id = '', + name = '', + description = '', # optional + client_uri = 'https://example.com', # optional + logo_uri = 'https://example.com', # optional + privacy_policy_url = 'https://example.com', # optional + terms_url = 'https://example.com', # optional + contacts = [], # optional + tagline = '', # optional + tags = [], # optional + images = [], # optional + support_url = 'https://example.com', # optional + data_deletion_url = 'https://example.com', # optional + enabled = False, # optional + redirect_uris = [], # optional + post_logout_redirect_uris = [], # optional + type = 'public', # optional + device_flow = False # optional +) + +print(result.model_dump()) +``` +```server-ruby +require 'appwrite' + +include Appwrite + +client = Client.new + .set_endpoint('https://.cloud.appwrite.io/v1') # Your API Endpoint + .set_project('') # Your project ID + .set_key('') # Your secret API key + +apps = Apps.new(client) + +result = apps.update( + app_id: '', + name: '', + description: '', # optional + client_uri: 'https://example.com', # optional + logo_uri: 'https://example.com', # optional + privacy_policy_url: 'https://example.com', # optional + terms_url: 'https://example.com', # optional + contacts: [], # optional + tagline: '', # optional + tags: [], # optional + images: [], # optional + support_url: 'https://example.com', # optional + data_deletion_url: 'https://example.com', # optional + enabled: false, # optional + redirect_uris: [], # optional + post_logout_redirect_uris: [], # optional + type: 'public', # optional + device_flow: false # optional +) +``` +```server-dart +import 'package:dart_appwrite/dart_appwrite.dart'; + +Client client = Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject('') // Your project ID + .setKey(''); // Your secret API key + +Apps apps = Apps(client); + +App result = await apps.update( + appId: '', + name: '', + description: '', // (optional) + clientUri: 'https://example.com', // (optional) + logoUri: 'https://example.com', // (optional) + privacyPolicyUrl: 'https://example.com', // (optional) + termsUrl: 'https://example.com', // (optional) + contacts: [], // (optional) + tagline: '', // (optional) + tags: [], // (optional) + images: [], // (optional) + supportUrl: 'https://example.com', // (optional) + dataDeletionUrl: 'https://example.com', // (optional) + enabled: false, // (optional) + redirectUris: [], // (optional) + postLogoutRedirectUris: [], // (optional) + type: 'public', // (optional) + deviceFlow: false, // (optional) +); +``` +```server-dotnet +```csharp +using Appwrite; +using Appwrite.Models; +using Appwrite.Services; + +Client client = new Client() + .SetEndPoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .SetProject("") // Your project ID + .SetKey(""); // Your secret API key + +Apps apps = new Apps(client); + +App result = await apps.Update( + appId: "", + name: "", + description: "", // optional + clientUri: "https://example.com", // optional + logoUri: "https://example.com", // optional + privacyPolicyUrl: "https://example.com", // optional + termsUrl: "https://example.com", // optional + contacts: new List(), // optional + tagline: "", // optional + tags: new List(), // optional + images: new List(), // optional + supportUrl: "https://example.com", // optional + dataDeletionUrl: "https://example.com", // optional + enabled: false, // optional + redirectUris: new List(), // optional + postLogoutRedirectUris: new List(), // optional + type: "public", // optional + deviceFlow: false // optional +);``` +``` +```server-kotlin +import io.appwrite.Client +import io.appwrite.coroutines.CoroutineCallback +import io.appwrite.services.Apps + +val client = Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + .setKey("") // Your secret API key + +val apps = Apps(client) + +val response = apps.update( + appId = "", + name = "", + description = "", // optional + clientUri = "https://example.com", // optional + logoUri = "https://example.com", // optional + privacyPolicyUrl = "https://example.com", // optional + termsUrl = "https://example.com", // optional + contacts = listOf(), // optional + tagline = "", // optional + tags = listOf(), // optional + images = listOf(), // optional + supportUrl = "https://example.com", // optional + dataDeletionUrl = "https://example.com", // optional + enabled = false, // optional + redirectUris = listOf(), // optional + postLogoutRedirectUris = listOf(), // optional + type = "public", // optional + deviceFlow = false // optional +) +``` +```server-java +import io.appwrite.Client; +import io.appwrite.coroutines.CoroutineCallback; +import io.appwrite.services.Apps; + +Client client = new Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + .setKey(""); // Your secret API key + +Apps apps = new Apps(client); + +apps.update( + "", // appId + "", // name + "", // description (optional) + "https://example.com", // clientUri (optional) + "https://example.com", // logoUri (optional) + "https://example.com", // privacyPolicyUrl (optional) + "https://example.com", // termsUrl (optional) + List.of(), // contacts (optional) + "", // tagline (optional) + List.of(), // tags (optional) + List.of(), // images (optional) + "https://example.com", // supportUrl (optional) + "https://example.com", // dataDeletionUrl (optional) + false, // enabled (optional) + List.of(), // redirectUris (optional) + List.of(), // postLogoutRedirectUris (optional) + "public", // type (optional) + false, // deviceFlow (optional) + new CoroutineCallback<>((result, error) -> { + if (error != null) { + error.printStackTrace(); + return; + } + + System.out.println(result); + }) +); + +``` +```server-swift +import Appwrite + +let client = Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + .setKey("") // Your secret API key + +let apps = Apps(client) + +let app = try await apps.update( + appId: "", + name: "", + description: "", // optional + clientUri: "https://example.com", // optional + logoUri: "https://example.com", // optional + privacyPolicyUrl: "https://example.com", // optional + termsUrl: "https://example.com", // optional + contacts: [], // optional + tagline: "", // optional + tags: [], // optional + images: [], // optional + supportUrl: "https://example.com", // optional + dataDeletionUrl: "https://example.com", // optional + enabled: false, // optional + redirectUris: [], // optional + postLogoutRedirectUris: [], // optional + type: "public", // optional + deviceFlow: false // optional +) + +``` +```server-go +package main + +import ( + "fmt" + "github.com/repoowner/reponame/client" + "github.com/repoowner/reponame/apps" +) + +client := client.New( + client.WithEndpoint("https://.cloud.appwrite.io/v1") + client.WithProject("") + appwrite.WithKey("") +) + +service := apps.New(client) + +response, error := service.Update( + "", + "", + apps.WithUpdateDescription(""), + apps.WithUpdateClientUri("https://example.com"), + apps.WithUpdateLogoUri("https://example.com"), + apps.WithUpdatePrivacyPolicyUrl("https://example.com"), + apps.WithUpdateTermsUrl("https://example.com"), + apps.WithUpdateContacts([]string{}), + apps.WithUpdateTagline(""), + apps.WithUpdateTags([]string{}), + apps.WithUpdateImages([]string{}), + apps.WithUpdateSupportUrl("https://example.com"), + apps.WithUpdateDataDeletionUrl("https://example.com"), + apps.WithUpdateEnabled(false), + apps.WithUpdateRedirectUris([]string{}), + apps.WithUpdatePostLogoutRedirectUris([]string{}), + apps.WithUpdateType("public"), + apps.WithUpdateDeviceFlow(false), +) +``` +```server-rust +use appwrite::Client; +use appwrite::services::Apps; + +#[tokio::main] +async fn main() -> Result<(), Box> { + let client = Client::new(); + client.set_endpoint("https://.cloud.appwrite.io/v1"); // Your API Endpoint + client.set_project(""); // Your project ID + client.set_key(""); // Your secret API key + + let apps = Apps::new(&client); + + let result = apps.update( + "", + "", + Some(""), // optional + Some("https://example.com"), // optional + Some("https://example.com"), // optional + Some("https://example.com"), // optional + Some("https://example.com"), // optional + Some(vec![]), // optional + Some(""), // optional + Some(vec![]), // optional + Some(vec![]), // optional + Some("https://example.com"), // optional + Some("https://example.com"), // optional + Some(false), // optional + Some(vec![]), // optional + Some(vec![]), // optional + Some("public"), // optional + Some(false) // optional + ).await?; + + let _ = result; + + Ok(()) +} +``` +{% /multicode %} + +# Delete a client {% #delete %} + +Deleting a client immediately invalidates every token issued to it. + +{% multicode %} +```server-nodejs +import { Client, Apps } from 'node-appwrite'; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject('') // Your project ID + .setKey(''); // Your secret API key + +const apps = new Apps(client); + +const result = await apps.delete({ + appId: '' +}); +``` +```server-deno +import { Client, Apps } from "npm:node-appwrite"; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject('') // Your project ID + .setKey(''); // Your secret API key + +const apps = new Apps(client); + +const result = await apps.delete({ + appId: '' +}); +``` +```server-php +```php +setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + ->setProject('') // Your project ID + ->setKey(''); // Your secret API key + +$apps = new Apps($client); + +$result = $apps->delete( + appId: '' +);``` +``` +```server-python +from appwrite.client import Client +from appwrite.services.apps import Apps + +client = Client() +client.set_endpoint('https://.cloud.appwrite.io/v1') # Your API Endpoint +client.set_project('') # Your project ID +client.set_key('') # Your secret API key + +apps = Apps(client) + +result = apps.delete( + app_id = '' +) +``` +```server-ruby +require 'appwrite' + +include Appwrite + +client = Client.new + .set_endpoint('https://.cloud.appwrite.io/v1') # Your API Endpoint + .set_project('') # Your project ID + .set_key('') # Your secret API key + +apps = Apps.new(client) + +result = apps.delete( + app_id: '' +) +``` +```server-dart +import 'package:dart_appwrite/dart_appwrite.dart'; + +Client client = Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject('') // Your project ID + .setKey(''); // Your secret API key + +Apps apps = Apps(client); + +await apps.delete( + appId: '', +); +``` +```server-dotnet +```csharp +using Appwrite; +using Appwrite.Models; +using Appwrite.Services; + +Client client = new Client() + .SetEndPoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .SetProject("") // Your project ID + .SetKey(""); // Your secret API key + +Apps apps = new Apps(client); + +await apps.Delete( + appId: "" +);``` +``` +```server-kotlin +import io.appwrite.Client +import io.appwrite.coroutines.CoroutineCallback +import io.appwrite.services.Apps + +val client = Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + .setKey("") // Your secret API key + +val apps = Apps(client) + +val response = apps.delete( + appId = "" +) +``` +```server-java +import io.appwrite.Client; +import io.appwrite.coroutines.CoroutineCallback; +import io.appwrite.services.Apps; + +Client client = new Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + .setKey(""); // Your secret API key + +Apps apps = new Apps(client); + +apps.delete( + "", // appId + new CoroutineCallback<>((result, error) -> { + if (error != null) { + error.printStackTrace(); + return; + } + + System.out.println(result); + }) +); + +``` +```server-swift +import Appwrite + +let client = Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + .setKey("") // Your secret API key + +let apps = Apps(client) + +let result = try await apps.delete( + appId: "" +) + +``` +```server-go +package main + +import ( + "fmt" + "github.com/repoowner/reponame/client" + "github.com/repoowner/reponame/apps" +) + +client := client.New( + client.WithEndpoint("https://.cloud.appwrite.io/v1") + client.WithProject("") + appwrite.WithKey("") +) + +service := apps.New(client) + +response, error := service.Delete( + "", +) +``` +```server-rust +use appwrite::Client; +use appwrite::services::Apps; + +#[tokio::main] +async fn main() -> Result<(), Box> { + let client = Client::new(); + client.set_endpoint("https://.cloud.appwrite.io/v1"); // Your API Endpoint + client.set_project(""); // Your project ID + client.set_key(""); // Your secret API key + + let apps = Apps::new(&client); + + let result = apps.delete( + "" + ).await?; + + let _ = result; + + Ok(()) +} +``` +{% /multicode %} diff --git a/src/routes/docs/partners/oauth-server/device-flow/+page.markdoc b/src/routes/docs/partners/oauth-server/device-flow/+page.markdoc new file mode 100644 index 0000000000..53e233e687 --- /dev/null +++ b/src/routes/docs/partners/oauth-server/device-flow/+page.markdoc @@ -0,0 +1,171 @@ +--- +layout: article +title: Device flow +description: Authorize TVs, CLIs, and other input-constrained devices against your Appwrite OAuth server with the device authorization grant. +back: /docs/partners/oauth-server +--- + +Some devices cannot show a browser or take typed input: a TV app, a CLI on a remote server, a hardware device. The **device authorization grant** (RFC 8628) lets these clients get tokens by having the user approve on a second device, like their phone or laptop. + +# How it works {% #how-it-works %} + +1. The device asks the OAuth server to start a device authorization. The server returns a **device code**, a short **user code**, and a **verification URL**. +2. The device shows the user code and verification URL to the user (for example, "Go to example.com/activate and enter WDJB-MJHT"). +3. The user opens the verification URL on another device, signs in, and approves. +4. Meanwhile the device polls the token endpoint. Once the user approves, the poll returns tokens. + +Device flow is available to a client only when both the project has a **verification URL** configured on the OAuth2 server settings and the client has **device flow** enabled. Device clients are public clients, so they authenticate with no secret. + +# Enable device flow on a client {% #enable %} + +Turn on **Device flow** when you create or update the client. In the Console, it is a toggle in the client dialog; with a Server SDK, set `deviceFlow: true` on the [client](/docs/partners/oauth-server/clients#register). + +# Start a device authorization {% #start %} + +The device requests a device authorization with its client ID and the scopes it wants. + +{% multicode %} +```client-web +import { Client, Oauth2 } from 'appwrite'; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +const oauth2 = new Oauth2(client); + +const result = await oauth2.createDeviceAuthorization({ + clientId: '', // optional + scope: '', // optional + authorizationDetails: '', // optional + resource: '' // optional +}); + +console.log(result); +``` +```client-flutter +import 'package:appwrite/appwrite.dart'; + +Client client = Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +Oauth2 oauth2 = Oauth2(client); + +Oauth2DeviceAuthorization result = await oauth2.createDeviceAuthorization( + clientId: '', // optional + scope: '', // optional + authorizationDetails: '', // optional + resource: '', // optional +); +``` +```client-apple +import Appwrite + +let client = Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + +let oauth2 = Oauth2(client) + +let oauth2DeviceAuthorization = try await oauth2.createDeviceAuthorization( + client_id: "", // optional + scope: "", // optional + authorization_details: "", // optional + resource: "" // optional +) + +``` +```client-android-kotlin +import io.appwrite.Client +import io.appwrite.coroutines.CoroutineCallback +import io.appwrite.services.Oauth2 + +val client = Client(context) + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + +val oauth2 = Oauth2(client) + +val result = oauth2.createDeviceAuthorization( + client_id = "", // (optional) + scope = "", // (optional) + authorization_details = "", // (optional) + resource = "", // (optional) +) +``` +```client-android-java +import io.appwrite.Client; +import io.appwrite.coroutines.CoroutineCallback; +import io.appwrite.services.Oauth2; + +Client client = new Client(context) + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject(""); // Your project ID + +Oauth2 oauth2 = new Oauth2(client); + +oauth2.createDeviceAuthorization( + "", // client_id (optional) + "", // scope (optional) + "", // authorization_details (optional) + "", // resource (optional) + new CoroutineCallback<>((result, error) -> { + if (error != null) { + error.printStackTrace(); + return; + } + + Log.d("Appwrite", result.toString()); + }) +); + +``` +```client-react-native +import { Client, Oauth2 } from "react-native-appwrite"; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +const oauth2 = new Oauth2(client); + +const result = await oauth2.createDeviceAuthorization({ + clientId: '', // optional + scope: '', // optional + authorizationDetails: '', // optional + resource: '' // optional +}); + +console.log(result); +``` +{% /multicode %} + +The response contains the codes and where to send the user: + +```json +{ + "device_code": "8575375669b9031cb5371b0ee39985c2...", + "user_code": "WDJB-MJHT", + "verification_uri": "https://example.com/activate", + "verification_uri_complete": "https://example.com/activate?user_code=WDJB-MJHT", + "expires_in": 600, + "interval": 1 +} +``` + +Show the `user_code` and `verification_uri` to the user. The `verification_uri_complete` embeds the code so a phone can open it directly, often as a QR code. + +# Poll for tokens {% #poll %} + +While the user approves on their other device, the client polls the token endpoint with the device code grant, waiting `interval` seconds between attempts. + +```http +POST /v1/oauth2//token HTTP/1.1 +Host: .cloud.appwrite.io +Content-Type: application/x-www-form-urlencoded + +grant_type=urn:ietf:params:oauth:grant-type:device_code&device_code=&client_id= +``` + +Until the user approves, the endpoint returns `authorization_pending`; keep polling. Once they approve, it returns an access token, refresh token, and ID token, exactly like the [authorization code flow](/docs/partners/oauth-server/tokens). If the user declines or the codes expire, the poll returns a terminal error and the device restarts the flow. diff --git a/src/routes/docs/partners/oauth-server/quick-start/+page.markdoc b/src/routes/docs/partners/oauth-server/quick-start/+page.markdoc new file mode 100644 index 0000000000..e91f61c9eb --- /dev/null +++ b/src/routes/docs/partners/oauth-server/quick-start/+page.markdoc @@ -0,0 +1,468 @@ +--- +layout: article +title: OAuth server quick start +description: Enable Appwrite's OAuth server, register a client, and run your first authorization code sign-in end to end. +back: /docs/partners/oauth-server +--- + +This guide turns a project into an OAuth provider and runs one sign-in through it. By the end you will have an enabled server, a registered client, and an access token issued by your project. + +# Enable the server {% #enable %} + +In the Console, open **Auth**, select the **OAuth2 server** tab, and turn on **Enable OAuth2 server**. + +{% only_dark %} +![Enabling the OAuth2 server in the Appwrite Console](/images/docs/oauth-server/dark/oauth2-server-settings.avif) +{% /only_dark %} +{% only_light %} +![Enabling the OAuth2 server in the Appwrite Console](/images/docs/oauth-server/oauth2-server-settings.avif) +{% /only_light %} + +Set the **Authorization URL** to the page you will host the consent screen on. This is where Appwrite redirects users during authorization. You can point it at a placeholder for now and change it later. The `openid`, `profile`, and `email` scopes are always included; add any custom scopes your clients will request. + +You can also enable and configure the server with a [Server SDK](/docs/sdks#server) using the `updateOAuth2Server` method. + +{% info title="Required scope" %} +The API key used for this call needs the `project.write` scope. +{% /info %} + +{% multicode %} +```server-nodejs +import { Client, Project } from 'node-appwrite'; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject('') // Your project ID + .setKey(''); // Your secret API key + +const project = new Project(client); + +const result = await project.updateOAuth2Server({ + enabled: false, + authorizationUrl: 'https://example.com', + scopes: [], // optional + authorizationDetailsTypes: [], // optional + accessTokenDuration: 60, // optional + refreshTokenDuration: 60, // optional + publicAccessTokenDuration: 60, // optional + publicRefreshTokenDuration: 60, // optional + confidentialPkce: false, // optional + verificationUrl: 'https://example.com', // optional + userCodeLength: 6, // optional + userCodeFormat: 'numeric', // optional + deviceCodeDuration: 60 // optional +}); +``` +```server-deno +import { Client, Project } from "npm:node-appwrite"; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject('') // Your project ID + .setKey(''); // Your secret API key + +const project = new Project(client); + +const result = await project.updateOAuth2Server({ + enabled: false, + authorizationUrl: 'https://example.com', + scopes: [], // optional + authorizationDetailsTypes: [], // optional + accessTokenDuration: 60, // optional + refreshTokenDuration: 60, // optional + publicAccessTokenDuration: 60, // optional + publicRefreshTokenDuration: 60, // optional + confidentialPkce: false, // optional + verificationUrl: 'https://example.com', // optional + userCodeLength: 6, // optional + userCodeFormat: 'numeric', // optional + deviceCodeDuration: 60 // optional +}); +``` +```server-php +```php +setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + ->setProject('') // Your project ID + ->setKey(''); // Your secret API key + +$project = new Project($client); + +$result = $project->updateOAuth2Server( + enabled: false, + authorizationUrl: 'https://example.com', + scopes: [], // optional + authorizationDetailsTypes: [], // optional + accessTokenDuration: 60, // optional + refreshTokenDuration: 60, // optional + publicAccessTokenDuration: 60, // optional + publicRefreshTokenDuration: 60, // optional + confidentialPkce: false, // optional + verificationUrl: 'https://example.com', // optional + userCodeLength: 6, // optional + userCodeFormat: 'numeric', // optional + deviceCodeDuration: 60 // optional +);``` +``` +```server-python +from appwrite.client import Client +from appwrite.services.project import Project +from appwrite.models import Project as ProjectModel + +client = Client() +client.set_endpoint('https://.cloud.appwrite.io/v1') # Your API Endpoint +client.set_project('') # Your project ID +client.set_key('') # Your secret API key + +project = Project(client) + +result: ProjectModel = project.update_o_auth2_server( + enabled = False, + authorization_url = 'https://example.com', + scopes = [], # optional + authorization_details_types = [], # optional + access_token_duration = 60, # optional + refresh_token_duration = 60, # optional + public_access_token_duration = 60, # optional + public_refresh_token_duration = 60, # optional + confidential_pkce = False, # optional + verification_url = 'https://example.com', # optional + user_code_length = 6, # optional + user_code_format = 'numeric', # optional + device_code_duration = 60 # optional +) + +print(result.model_dump()) +``` +```server-ruby +require 'appwrite' + +include Appwrite + +client = Client.new + .set_endpoint('https://.cloud.appwrite.io/v1') # Your API Endpoint + .set_project('') # Your project ID + .set_key('') # Your secret API key + +project = Project.new(client) + +result = project.update_o_auth2_server( + enabled: false, + authorization_url: 'https://example.com', + scopes: [], # optional + authorization_details_types: [], # optional + access_token_duration: 60, # optional + refresh_token_duration: 60, # optional + public_access_token_duration: 60, # optional + public_refresh_token_duration: 60, # optional + confidential_pkce: false, # optional + verification_url: 'https://example.com', # optional + user_code_length: 6, # optional + user_code_format: 'numeric', # optional + device_code_duration: 60 # optional +) +``` +```server-dart +import 'package:dart_appwrite/dart_appwrite.dart'; + +Client client = Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject('') // Your project ID + .setKey(''); // Your secret API key + +Project project = Project(client); + +Project result = await project.updateOAuth2Server( + enabled: false, + authorizationUrl: 'https://example.com', + scopes: [], // (optional) + authorizationDetailsTypes: [], // (optional) + accessTokenDuration: 60, // (optional) + refreshTokenDuration: 60, // (optional) + publicAccessTokenDuration: 60, // (optional) + publicRefreshTokenDuration: 60, // (optional) + confidentialPkce: false, // (optional) + verificationUrl: 'https://example.com', // (optional) + userCodeLength: 6, // (optional) + userCodeFormat: 'numeric', // (optional) + deviceCodeDuration: 60, // (optional) +); +``` +```server-dotnet +```csharp +using Appwrite; +using Appwrite.Models; +using Appwrite.Services; + +Client client = new Client() + .SetEndPoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .SetProject("") // Your project ID + .SetKey(""); // Your secret API key + +Project project = new Project(client); + +Project result = await project.UpdateOAuth2Server( + enabled: false, + authorizationUrl: "https://example.com", + scopes: new List(), // optional + authorizationDetailsTypes: new List(), // optional + accessTokenDuration: 60, // optional + refreshTokenDuration: 60, // optional + publicAccessTokenDuration: 60, // optional + publicRefreshTokenDuration: 60, // optional + confidentialPkce: false, // optional + verificationUrl: "https://example.com", // optional + userCodeLength: 6, // optional + userCodeFormat: "numeric", // optional + deviceCodeDuration: 60 // optional +);``` +``` +```server-kotlin +import io.appwrite.Client +import io.appwrite.coroutines.CoroutineCallback +import io.appwrite.services.Project + +val client = Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + .setKey("") // Your secret API key + +val project = Project(client) + +val response = project.updateOAuth2Server( + enabled = false, + authorizationUrl = "https://example.com", + scopes = listOf(), // optional + authorizationDetailsTypes = listOf(), // optional + accessTokenDuration = 60, // optional + refreshTokenDuration = 60, // optional + publicAccessTokenDuration = 60, // optional + publicRefreshTokenDuration = 60, // optional + confidentialPkce = false, // optional + verificationUrl = "https://example.com", // optional + userCodeLength = 6, // optional + userCodeFormat = "numeric", // optional + deviceCodeDuration = 60 // optional +) +``` +```server-java +import io.appwrite.Client; +import io.appwrite.coroutines.CoroutineCallback; +import io.appwrite.services.Project; + +Client client = new Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + .setKey(""); // Your secret API key + +Project project = new Project(client); + +project.updateOAuth2Server( + false, // enabled + "https://example.com", // authorizationUrl + List.of(), // scopes (optional) + List.of(), // authorizationDetailsTypes (optional) + 60, // accessTokenDuration (optional) + 60, // refreshTokenDuration (optional) + 60, // publicAccessTokenDuration (optional) + 60, // publicRefreshTokenDuration (optional) + false, // confidentialPkce (optional) + "https://example.com", // verificationUrl (optional) + 6, // userCodeLength (optional) + "numeric", // userCodeFormat (optional) + 60, // deviceCodeDuration (optional) + new CoroutineCallback<>((result, error) -> { + if (error != null) { + error.printStackTrace(); + return; + } + + System.out.println(result); + }) +); + +``` +```server-swift +import Appwrite + +let client = Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + .setKey("") // Your secret API key + +let project = Project(client) + +let project = try await project.updateOAuth2Server( + enabled: false, + authorizationUrl: "https://example.com", + scopes: [], // optional + authorizationDetailsTypes: [], // optional + accessTokenDuration: 60, // optional + refreshTokenDuration: 60, // optional + publicAccessTokenDuration: 60, // optional + publicRefreshTokenDuration: 60, // optional + confidentialPkce: false, // optional + verificationUrl: "https://example.com", // optional + userCodeLength: 6, // optional + userCodeFormat: "numeric", // optional + deviceCodeDuration: 60 // optional +) + +``` +```server-go +package main + +import ( + "fmt" + "github.com/repoowner/reponame/client" + "github.com/repoowner/reponame/project" +) + +client := client.New( + client.WithEndpoint("https://.cloud.appwrite.io/v1") + client.WithProject("") + client.WithKey("") +) + +service := project.New(client) + +response, error := service.UpdateOAuth2Server( + false, + "https://example.com", + project.WithUpdateOAuth2ServerScopes([]string{}), + project.WithUpdateOAuth2ServerAuthorizationDetailsTypes([]string{}), + project.WithUpdateOAuth2ServerAccessTokenDuration(60), + project.WithUpdateOAuth2ServerRefreshTokenDuration(60), + project.WithUpdateOAuth2ServerPublicAccessTokenDuration(60), + project.WithUpdateOAuth2ServerPublicRefreshTokenDuration(60), + project.WithUpdateOAuth2ServerConfidentialPkce(false), + project.WithUpdateOAuth2ServerVerificationUrl("https://example.com"), + project.WithUpdateOAuth2ServerUserCodeLength(6), + project.WithUpdateOAuth2ServerUserCodeFormat("numeric"), + project.WithUpdateOAuth2ServerDeviceCodeDuration(60), +) +``` +```server-rust +use appwrite::Client; +use appwrite::services::Project; + +#[tokio::main] +async fn main() -> Result<(), Box> { + let client = Client::new(); + client.set_endpoint("https://.cloud.appwrite.io/v1"); // Your API Endpoint + client.set_project(""); // Your project ID + client.set_key(""); // Your secret API key + + let project = Project::new(&client); + + let result = project.update_o_auth2_server( + false, + "https://example.com", + Some(vec![]), // optional + Some(vec![]), // optional + Some(60), // optional + Some(60), // optional + Some(60), // optional + Some(60), // optional + Some(false), // optional + Some("https://example.com"), // optional + Some(6), // optional + Some("numeric"), // optional + Some(60) // optional + ).await?; + + let _ = result; + + Ok(()) +} +``` +{% /multicode %} + +# Copy the discovery URL {% #discovery %} + +Once enabled, the server publishes an OpenID Connect discovery document. Integrators point their OAuth or OIDC library at this URL and it learns every endpoint automatically. + +{% only_dark %} +![The OIDC discovery URL in the Appwrite Console](/images/docs/oauth-server/dark/oauth2-server-discovery.avif) +{% /only_dark %} +{% only_light %} +![The OIDC discovery URL in the Appwrite Console](/images/docs/oauth-server/oauth2-server-discovery.avif) +{% /only_light %} + +Open it in a browser to confirm the server is live. It returns JSON describing the authorization, token, userinfo, and JWKS endpoints. + +```http +GET /v1/oauth2//.well-known/openid-configuration HTTP/1.1 +Host: .cloud.appwrite.io +``` + +# Register a client {% #register %} + +Open the **Apps** sub-tab and create a client. Give it a name, add at least one redirect URI, and choose a type. Pick **Confidential** for this walkthrough so you get a secret to authenticate the token exchange. Copy the secret when it is shown, because it appears only once. + +{% only_dark %} +![Creating an OAuth2 client](/images/docs/oauth-server/dark/oauth2-server-create-app.avif) +{% /only_dark %} +{% only_light %} +![Creating an OAuth2 client](/images/docs/oauth-server/oauth2-server-create-app.avif) +{% /only_light %} + +See [Clients](/docs/partners/oauth-server/clients) for the full set of options and the SDK equivalents. + +# Run the authorization code flow {% #flow %} + +With the server enabled and a client registered, you can run a sign-in. The flow has three steps: send the user to authorize, let them consent, then exchange the returned code for tokens. + +**1. Send the user to the authorization endpoint.** Include the client ID, a registered redirect URI, `response_type=code`, and the scopes you want. If the user has a session on your project, Appwrite redirects to your authorization URL with a `grant_id`. Otherwise it redirects there with the full request so your screen can sign the user in first. + +```http +GET /v1/oauth2//authorize?client_id=&redirect_uri=&response_type=code&scope=openid%20profile%20email&state= HTTP/1.1 +Host: .cloud.appwrite.io +``` + +**2. Approve the grant.** Your consent screen loads the grant, shows the user what the client is requesting, and approves it. Appwrite then redirects back to the client's redirect URI with an authorization `code`. Building this screen is covered in [Authorization](/docs/partners/oauth-server/authorization). + +**3. Exchange the code for tokens.** The client sends the code to the token endpoint. A confidential client authenticates with HTTP Basic auth using its client ID and secret. + +```http +POST /v1/oauth2//token HTTP/1.1 +Host: .cloud.appwrite.io +Authorization: Basic +Content-Type: application/x-www-form-urlencoded + +grant_type=authorization_code&code=&redirect_uri= +``` + +The response contains an access token, a refresh token, and an ID token: + +```json +{ + "access_token": "eyJ0eXAiOiJhdCtqd3Qi...", + "token_type": "Bearer", + "expires_in": 28800, + "refresh_token": "eyJ0eXAiOiJKV1Qi...", + "scope": "openid profile email", + "id_token": "eyJ0eXAiOiJKV1Qi..." +} +``` + +The client can now call the userinfo endpoint with the access token, or validate the ID token against the server's JWKS. See [Tokens](/docs/partners/oauth-server/tokens) for token structure, refresh, and revocation. + +# Next steps {% #next-steps %} + +{% cards %} +{% cards_item href="/docs/partners/oauth-server/authorization" title="Authorization" %} +Host your consent screen and drive the authorize, grant, and approve steps. +{% /cards_item %} +{% cards_item href="/docs/partners/oauth-server/clients" title="Clients" %} +Confidential vs public clients, secrets, and rotation. +{% /cards_item %} +{% cards_item href="/docs/partners/oauth-server/tokens" title="Tokens" %} +Token lifetimes, refresh with rotation, introspection, and revocation. +{% /cards_item %} +{% /cards %} diff --git a/src/routes/docs/partners/oauth-server/scopes/+page.markdoc b/src/routes/docs/partners/oauth-server/scopes/+page.markdoc new file mode 100644 index 0000000000..fc9474765d --- /dev/null +++ b/src/routes/docs/partners/oauth-server/scopes/+page.markdoc @@ -0,0 +1,40 @@ +--- +layout: article +title: Scopes +description: The built-in OpenID Connect scopes and the custom scopes clients can request from your Appwrite OAuth server. +back: /docs/partners/oauth-server +--- + +Scopes are the permissions a client asks for during authorization. The user sees the requested scopes on the consent screen and approves or declines them. The access token the server issues carries the scopes that were granted. + +# Built-in scopes {% #built-in %} + +Four OpenID Connect scopes are always available and cannot be removed: + +| Scope | Grants access to | +| --- | --- | +| `openid` | The user's subject identifier. Required for OpenID Connect and to receive an ID token. | +| `profile` | The user's profile claims, such as their name. | +| `email` | The user's email address. | +| `phone` | The user's phone number. | + +These appear as locked entries in the **Scopes** field on the OAuth2 server settings. A client requests them by listing them in the `scope` parameter on the authorization request, space-separated, for example `openid profile email`. + +# Custom scopes {% #custom %} + +Beyond the built-in scopes, you define your own to represent permissions in your product, such as `read:projects` or `write:billing`. Add them in the **Scopes** field on the OAuth2 server settings, or with the `scopes` array on the `updateOAuth2Server` method. The `openid`, `profile`, `email`, and `phone` scopes are always merged in, so you only list the custom ones. + +{% only_dark %} +![Configuring scopes on the OAuth2 server](/images/docs/oauth-server/dark/oauth2-server-settings.avif) +{% /only_dark %} +{% only_light %} +![Configuring scopes on the OAuth2 server](/images/docs/oauth-server/oauth2-server-settings.avif) +{% /only_light %} + +A project can define up to 100 scopes, each up to 128 characters. A client can only request scopes you have defined; requesting an unknown scope fails the authorization request. + +Custom scopes are labels the OAuth server carries through the flow and stamps onto the access token. Enforcing what each scope allows is your resource server's job: read the `scope` claim from the access token (or from an [introspection](/docs/partners/oauth-server/tokens#introspect) response) and allow or deny the request accordingly. + +# Requesting scopes {% #requesting %} + +A client lists the scopes it wants in the `scope` parameter, space-separated, when it starts [authorization](/docs/partners/oauth-server/authorization#authorize). The user is shown exactly these scopes on your consent screen. Whatever they approve is what the issued access token carries in its `scope` claim, so a client should request only what it needs. diff --git a/src/routes/docs/partners/oauth-server/sign-in-with-your-product/+layout.svelte b/src/routes/docs/partners/oauth-server/sign-in-with-your-product/+layout.svelte new file mode 100644 index 0000000000..c1c9c5a8cb --- /dev/null +++ b/src/routes/docs/partners/oauth-server/sign-in-with-your-product/+layout.svelte @@ -0,0 +1,10 @@ + + +{@render children()} diff --git a/src/routes/docs/partners/oauth-server/sign-in-with-your-product/+layout.ts b/src/routes/docs/partners/oauth-server/sign-in-with-your-product/+layout.ts new file mode 100644 index 0000000000..c8884f46b8 --- /dev/null +++ b/src/routes/docs/partners/oauth-server/sign-in-with-your-product/+layout.ts @@ -0,0 +1,11 @@ +import type { LayoutLoad } from './$types'; + +export const load: LayoutLoad = ({ url }) => { + const tutorials = import.meta.glob('./**/*.markdoc', { + eager: true + }); + return { + tutorials, + pathname: url.pathname + }; +}; diff --git a/src/routes/docs/partners/oauth-server/sign-in-with-your-product/+page.ts b/src/routes/docs/partners/oauth-server/sign-in-with-your-product/+page.ts new file mode 100644 index 0000000000..deeb96a18b --- /dev/null +++ b/src/routes/docs/partners/oauth-server/sign-in-with-your-product/+page.ts @@ -0,0 +1,5 @@ +import { redirect } from '@sveltejs/kit'; + +export function load() { + redirect(303, '/docs/partners/oauth-server/sign-in-with-your-product/step-1'); +} diff --git a/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-1/+page.markdoc b/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-1/+page.markdoc new file mode 100644 index 0000000000..56f071e9f6 --- /dev/null +++ b/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-1/+page.markdoc @@ -0,0 +1,50 @@ +--- +layout: tutorial +title: Sign in with your product +description: Build an end-to-end "Sign in with your product" experience against your Appwrite OAuth server, from the consent screen to the token exchange. +step: 1 +difficulty: intermediate +readtime: 25 +framework: TanStack Start +category: OAuth server +back: /docs/partners/oauth-server +--- + +Once your project's [OAuth server](/docs/partners/oauth-server) is enabled, other apps can offer "Sign in with your product". This tutorial builds that experience end to end with two small [TanStack Start](https://tanstack.com/start) apps, so you can see every moving part. + +# What you will build {% #what-you-will-build %} + +Two apps play the two sides of an OAuth integration: + +- **TaskFlow**, the provider. It owns the Appwrite project with the OAuth server enabled, and it hosts the **consent screen** where its users approve access. +- **Vantage**, the consumer. A separate product that adds a **Sign in with TaskFlow** button, exchanges the authorization code for tokens on its server, and reads the user's profile. + +TaskFlow is your product. Vantage stands in for any third party integrating with it. + +# The flow {% #the-flow %} + +When a Vantage user clicks **Sign in with TaskFlow**, this happens: + +1. Vantage redirects the user to TaskFlow's **authorize** endpoint. +2. The OAuth server sends the user to TaskFlow's **consent screen** to sign in and approve. +3. On approval, the server redirects back to Vantage with an **authorization code**. +4. Vantage's server **exchanges the code for tokens** using its client secret. +5. Vantage reads the user's profile from **userinfo** and signs them in. + +The authorization code flow is standard OAuth 2.1, so nothing here is Appwrite-specific on the wire. The two pieces you build are the consent screen TaskFlow hosts and the sign-in Vantage adds. + +# Why the token exchange runs on the server {% #server-side %} + +Vantage is a **confidential client**: it has a client secret. That secret authenticates the token exchange and must never reach the browser. TanStack Start makes this natural, the exchange runs inside a **server function**, so the secret stays on the server the whole time. + +# Prerequisites {% #prerequisites %} + +- An Appwrite Cloud project. +- [Node.js](https://nodejs.org/) 20 or newer and a package manager (this tutorial uses `pnpm`). +- Basic familiarity with React. + +{% info title="Get the finished code" %} +The complete apps from this tutorial are on GitHub at [appwrite-community/oauth-guide-taskflow](https://github.com/appwrite-community/oauth-guide-taskflow). Clone it to follow along or to compare against your own. +{% /info %} + +Continue to enable the OAuth server on your project. diff --git a/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-2/+page.markdoc b/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-2/+page.markdoc new file mode 100644 index 0000000000..97c5a91157 --- /dev/null +++ b/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-2/+page.markdoc @@ -0,0 +1,55 @@ +--- +layout: tutorial +title: Enable the OAuth server +description: Turn on the OAuth server on your Appwrite project and register the client app. +step: 2 +--- + +Before writing any code, turn TaskFlow's project into an OAuth provider and register Vantage as a client. + +# Enable the server {% #enable %} + +{% only_dark %} +![Enabling the OAuth2 server in the Appwrite Console](/images/docs/oauth-server/dark/oauth2-server-settings.avif) +{% /only_dark %} +{% only_light %} +![Enabling the OAuth2 server in the Appwrite Console](/images/docs/oauth-server/oauth2-server-settings.avif) +{% /only_light %} + +In the Console, open **Auth**, select the **OAuth2 server** tab, and turn on **Enable OAuth2 server**. + +Set the **Authorization URL** to where TaskFlow will host its consent screen. In this tutorial that is `http://localhost:4000/oauth/consent`. This is where the OAuth server sends users to sign in and approve. + +Leave the scopes at their defaults. `openid`, `profile`, and `email` are always included, which is all Vantage needs. See [Scopes](/docs/partners/oauth-server/scopes) to add your own later. + +# Register the client {% #register-client %} + +{% only_dark %} +![Creating the Vantage client in the Appwrite Console](/images/docs/oauth-server/dark/oauth2-server-create-app.avif) +{% /only_dark %} +{% only_light %} +![Creating the Vantage client in the Appwrite Console](/images/docs/oauth-server/oauth2-server-create-app.avif) +{% /only_light %} + +Open the **Apps** sub-tab and create a client for Vantage: + +- **Name**: `Vantage`. This appears on the consent screen. +- **Client type**: `Confidential`. Vantage has a server that can hold a secret. +- **Redirect URIs**: `http://localhost:4100/oauth/callback`. The OAuth server only returns codes to registered URIs. + +When you create the client, copy the **client secret**. It is shown once. You will also need the **client ID** from the clients list. + +{% only_dark %} +![The client secret shown once on creation](/images/docs/oauth-server/dark/oauth2-server-secret-created.avif) +{% /only_dark %} +{% only_light %} +![The client secret shown once on creation](/images/docs/oauth-server/oauth2-server-secret-created.avif) +{% /only_light %} + +{% info title="Keep these three values" %} +You now have everything the apps need to talk to the OAuth server: the **client ID**, the **client secret**, and your **project ID**. Keep them handy for the next step. +{% /info %} + +For the full set of client options and the SDK equivalents, see [Clients](/docs/partners/oauth-server/clients). + +Continue to scaffold the two apps. diff --git a/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-3/+page.markdoc b/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-3/+page.markdoc new file mode 100644 index 0000000000..6dc848baf8 --- /dev/null +++ b/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-3/+page.markdoc @@ -0,0 +1,74 @@ +--- +layout: tutorial +title: Create the apps +description: Scaffold the two TanStack Start apps and wire up their environment. +step: 3 +--- + +Both sides are TanStack Start apps. Scaffold them in a single folder. + +# Scaffold the projects {% #scaffold %} + +Create the consumer (Vantage) and the provider (TaskFlow): + +```sh +npx @tanstack/cli create consumer --framework React --package-manager pnpm --no-examples +npx @tanstack/cli create provider --framework React --package-manager pnpm --no-examples +``` + +This gives you two full TanStack Start apps with server functions, file-based routing, and Tailwind CSS already set up. + +Give each a fixed port so the redirect URIs stay stable. In each app's `package.json`, set the dev script: + +```json +// consumer/package.json +"scripts": { "dev": "vite dev --port 4100" } +``` + +```json +// provider/package.json +"scripts": { "dev": "vite dev --port 4000" } +``` + +# Configure the environment {% #env %} + +The apps read the OAuth values from environment variables. Add a `.env` to each. + +Vantage needs the client credentials and its redirect URI: + +```sh +# consumer/.env +OAUTH_ISSUER=https://.cloud.appwrite.io/v1/oauth2/ +OAUTH_CLIENT_ID= +OAUTH_CLIENT_SECRET= +OAUTH_REDIRECT_URI=http://localhost:4100/oauth/callback +SESSION_SECRET= +``` + +TaskFlow needs its project details and an API key (used only to read a client's display name for the consent card): + +```sh +# provider/.env +APPWRITE_ENDPOINT=https://.cloud.appwrite.io/v1 +APPWRITE_PROJECT= +OAUTH_ISSUER=https://.cloud.appwrite.io/v1/oauth2/ +APPWRITE_API_KEY= +SESSION_SECRET= +``` + +Vite only exposes variables prefixed with `VITE_` to the browser, and these are secrets, so load them into the server with `dotenv`. Install it in both apps: + +```sh +pnpm add dotenv +``` + +Then import it at the top of each `vite.config.ts`, before anything else, so `process.env` is populated when the server runs: + +```ts +// vite.config.ts +import 'dotenv/config' +import { defineConfig } from 'vite' +// ...rest of the config +``` + +With both apps scaffolded and configured, build Vantage's sign-in next. diff --git a/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-4/+page.markdoc b/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-4/+page.markdoc new file mode 100644 index 0000000000..cbed8da94f --- /dev/null +++ b/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-4/+page.markdoc @@ -0,0 +1,86 @@ +--- +layout: tutorial +title: Add Sign in with your product +description: Build the consumer's sign-in button and the redirect that starts the OAuth flow. +step: 4 +--- + +Start with Vantage, the consumer. It needs a helper for the OAuth values, a landing page with a **Sign in with TaskFlow** button, and a route that kicks off the flow. + +# The OAuth helper {% #helper %} + +Create `consumer/src/lib/oauth.ts`. It reads the config and builds the authorization URL. Import `@tanstack/react-start/server-only` at the top: it makes the build fail if this module is ever pulled into the browser bundle, which keeps the client secret server-side. + +```ts +// consumer/src/lib/oauth.ts +import '@tanstack/react-start/server-only' +import { useSession } from '@tanstack/react-start/server' + +const issuer = process.env.OAUTH_ISSUER! +const clientId = process.env.OAUTH_CLIENT_ID! +const redirectUri = process.env.OAUTH_REDIRECT_URI! + +export const SCOPES = 'openid profile email' + +/** Build the URL that starts the authorization code flow. */ +export function authorizeUrl(state: string) { + const params = new URLSearchParams({ + client_id: clientId, + redirect_uri: redirectUri, + response_type: 'code', + scope: SCOPES, + state, + }) + return `${issuer}/authorize?${params.toString()}` +} + +type SessionData = { accessToken?: string; user?: unknown; state?: string } + +/** A signed, httpOnly cookie session for Vantage. */ +export function vantageSession() { + return useSession({ + name: 'vantage_session', + password: process.env.SESSION_SECRET!, + }) +} +``` + +# The start route {% #start-route %} + +Clicking the button navigates to `/oauth/start`. Its loader mints a random `state` value, stores it in the session to protect against CSRF, and redirects to the OAuth server. Create `consumer/src/routes/oauth.start.tsx`: + +```tsx +// consumer/src/routes/oauth.start.tsx +import { createFileRoute, redirect } from '@tanstack/react-router' +import { createServerFn } from '@tanstack/react-start' +import { authorizeUrl, vantageSession } from '../lib/oauth' + +const start = createServerFn().handler(async () => { + const state = crypto.randomUUID() + const session = await vantageSession() + await session.update({ state }) + throw redirect({ href: authorizeUrl(state) }) +}) + +export const Route = createFileRoute('/oauth/start')({ + loader: async () => { + await start() + }, + component: () => null, +}) +``` + +# The sign-in button {% #button %} + +![Vantage landing page with a Sign in with TaskFlow button](/images/docs/oauth-server/guide/vantage-landing.avif) + +On the landing page, the button is a link to `/oauth/start`: + +```tsx +// consumer/src/routes/index.tsx (excerpt) + + Sign in with TaskFlow + +``` + +Start the app with `pnpm dev` and open `http://localhost:4100`. You have a landing page with a working sign-in button. Clicking it redirects to the OAuth server, which sends the user to TaskFlow's consent screen. That screen does not exist yet, so build it next. diff --git a/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-5/+page.markdoc b/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-5/+page.markdoc new file mode 100644 index 0000000000..0cdffe9d85 --- /dev/null +++ b/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-5/+page.markdoc @@ -0,0 +1,219 @@ +--- +layout: tutorial +title: Build the consent screen +description: Host the consent screen where your users sign in and approve access. +step: 5 +--- + +The consent screen is the page TaskFlow hosts at its authorization URL. When the OAuth server sends a user here, the screen signs them in, shows what the client is asking for, and records their decision. All of it runs on TaskFlow's server, carrying the user's Appwrite session. + +# Types for the consent card {% #types %} + +Create `provider/src/lib/consent-types.ts`. It holds only client-safe values, so the browser can import it: + +```ts +// provider/src/lib/consent-types.ts +export type Grant = { + $id: string + appId: string + scopes: string[] + redirectUri: string +} + +export type ClientApp = { $id: string; name: string; tagline?: string } + +// Human-readable labels for the scopes shown on the consent card. +export const SCOPE_LABELS: Record = { + openid: 'Confirm your identity', + profile: 'See your name and profile details', + email: 'See your email address', + phone: 'See your phone number', +} +``` + +# The server helpers {% #helpers %} + +Create `provider/src/lib/oauth-server.ts`. Every function here calls the OAuth server on behalf of the signed-in user. Appwrite returns the user's session token in a cookie on login, and that token is passed as the `X-Appwrite-Session` header on later calls. + +```ts +// provider/src/lib/oauth-server.ts +import '@tanstack/react-start/server-only' +import { useSession } from '@tanstack/react-start/server' +import type { ClientApp, Grant } from './consent-types' + +const endpoint = process.env.APPWRITE_ENDPOINT! +const project = process.env.APPWRITE_PROJECT! +const issuer = process.env.OAUTH_ISSUER! +const apiKey = process.env.APPWRITE_API_KEY! + +const projectHeaders = { 'X-Appwrite-Project': project } + +/** Log a TaskFlow user in and return their Appwrite session token. */ +export async function login(email: string, password: string): Promise { + const res = await fetch(`${endpoint}/account/sessions/email`, { + method: 'POST', + headers: { ...projectHeaders, 'Content-Type': 'application/json' }, + body: JSON.stringify({ email, password }), + redirect: 'manual', + }) + if (!res.ok) throw new Error('Invalid email or password') + const setCookie = res.headers.get('set-cookie') ?? '' + const match = setCookie.match(new RegExp(`a_session_${project}=([^;]+)`)) + if (!match) throw new Error('No session returned') + return match[1] +} + +type AuthorizeParams = Record + +/** Create a grant for the signed-in user, or get a redirect if the OAuth + * server auto-approved a request the user already consented to. */ +export async function authorize( + params: AuthorizeParams, + sessionToken: string, +): Promise<{ grantId?: string; redirect?: string }> { + const qs = new URLSearchParams(params).toString() + const res = await fetch(`${issuer}/authorize?${qs}`, { + headers: { ...projectHeaders, 'X-Appwrite-Session': sessionToken }, + redirect: 'manual', + }) + const location = res.headers.get('location') ?? '' + const grantId = new URL(location, endpoint).searchParams.get('grant_id') + return grantId ? { grantId } : { redirect: location } +} + +export async function getGrant(grantId: string, sessionToken: string): Promise { + const res = await fetch(`${issuer}/grants/${grantId}`, { + headers: { ...projectHeaders, 'X-Appwrite-Session': sessionToken }, + }) + if (!res.ok) throw new Error(`Grant not found: ${res.status}`) + return res.json() +} + +/** Read a client's display name for the consent card, using a server-side key. */ +export async function getClientApp(appId: string): Promise { + const res = await fetch(`${endpoint}/apps/${appId}`, { + headers: { ...projectHeaders, 'X-Appwrite-Key': apiKey }, + }) + if (!res.ok) throw new Error(`App not found: ${res.status}`) + return res.json() +} + +/** Approve or reject a grant. The OAuth server returns the URL to send the + * user back to, carrying the authorization code (approve) or an error (reject). */ +async function decide( + action: 'approve' | 'reject', + grantId: string, + sessionToken: string, +): Promise { + const res = await fetch(`${issuer}/${action}`, { + method: 'POST', + headers: { + ...projectHeaders, + 'X-Appwrite-Session': sessionToken, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ grant_id: grantId }), + redirect: 'manual', + }) + const location = res.headers.get('location') + if (!location) throw new Error(`${action} failed: ${res.status}`) + return location +} + +export const approve = (grantId: string, token: string) => decide('approve', grantId, token) +export const reject = (grantId: string, token: string) => decide('reject', grantId, token) + +type SessionData = { token?: string; email?: string; params?: AuthorizeParams } + +/** TaskFlow's own signed session cookie, holding the Appwrite session token. */ +export function taskflowSession() { + return useSession({ + name: 'taskflow_session', + password: process.env.SESSION_SECRET!, + }) +} +``` + +# The consent route {% #route %} + +Create `provider/src/routes/oauth.consent.tsx`. The loader decides what to show: the login form if the user is not signed in, or the consent card once they are. It captures the incoming authorize parameters so it can resume the request after login. + +```tsx +// provider/src/routes/oauth.consent.tsx (loader and server functions) +import { createFileRoute, redirect } from '@tanstack/react-router' +import { createServerFn } from '@tanstack/react-start' +import { getRequestUrl } from '@tanstack/react-start/server' +import { + approve, authorize, getClientApp, getGrant, login, reject, taskflowSession, +} from '../lib/oauth-server' +import type { ClientApp, Grant } from '../lib/consent-types' + +const AUTHORIZE_KEYS = ['client_id', 'redirect_uri', 'response_type', 'scope', 'state', 'nonce'] + +type ConsentView = + | { view: 'login' } + | { view: 'consent'; grant: Grant; app: ClientApp; email: string } + +const loadConsent = createServerFn().handler(async (): Promise => { + const url = getRequestUrl() + const session = await taskflowSession() + + // Capture the authorize request so we can resume it after login. + const incoming: Record = {} + for (const key of AUTHORIZE_KEYS) { + const value = url.searchParams.get(key) + if (value) incoming[key] = value + } + + if (!session.data.token) { + if (Object.keys(incoming).length) await session.update({ params: incoming }) + return { view: 'login' } + } + + let grantId = url.searchParams.get('grant_id') + if (!grantId) { + const params = { ...session.data.params, ...incoming } + const result = await authorize(params, session.data.token) + if (result.redirect) throw redirect({ href: result.redirect }) + grantId = result.grantId! + } + + const grant = await getGrant(grantId, session.data.token) + const app = await getClientApp(grant.appId) + return { view: 'consent', grant, app, email: session.data.email ?? '' } +}) + +const submitLogin = createServerFn({ method: 'POST' }) + .validator((d: { email: string; password: string }) => d) + .handler(async ({ data }) => { + const token = await login(data.email, data.password) + const session = await taskflowSession() + await session.update({ token, email: data.email }) + }) + +const decideGrant = createServerFn({ method: 'POST' }) + .validator((d: { grantId: string; action: 'approve' | 'reject' }) => d) + .handler(async ({ data }) => { + const session = await taskflowSession() + const act = data.action === 'approve' ? approve : reject + const location = await act(data.grantId, session.data.token!) + throw redirect({ href: location }) + }) + +export const Route = createFileRoute('/oauth/consent')({ + component: Consent, + loader: async () => loadConsent(), +}) +``` + +The component renders one of two cards from the loader data. The login form submits `submitLogin` and then calls `router.invalidate()` so the loader re-runs and moves to the consent view. The consent card reads `grant.scopes` and maps them through `SCOPE_LABELS`, and calls `decideGrant` on **Authorize** or **Cancel**. Only the styling is left out here. + +# Sign in and approve {% #sign-in %} + +![TaskFlow consent screen sign-in form](/images/docs/oauth-server/guide/taskflow-login.avif) + +When the OAuth server sends a user to the consent screen, they first sign in with their TaskFlow account. + +![TaskFlow consent screen showing the requested permissions](/images/docs/oauth-server/guide/taskflow-consent.avif) + +The consent card then shows the client's name and exactly what it is asking for. On **Authorize**, the OAuth server redirects back to Vantage with an authorization code. Vantage handles it next. diff --git a/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-6/+page.markdoc b/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-6/+page.markdoc new file mode 100644 index 0000000000..874fbedfdf --- /dev/null +++ b/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-6/+page.markdoc @@ -0,0 +1,130 @@ +--- +layout: tutorial +title: Exchange the code for tokens +description: Handle the callback, exchange the authorization code for tokens on the server, and sign the user in. +step: 6 +--- + +The OAuth server redirects back to Vantage's redirect URI with a `code` and the `state`. Vantage exchanges that code for tokens on its server, reads the user's profile, and signs them in. + +# Add the token functions {% #token-functions %} + +Extend `consumer/src/lib/oauth.ts` with the exchange and userinfo calls. The exchange authenticates with the client secret using HTTP Basic auth, which is why it must run on the server. + +```ts +// consumer/src/lib/oauth.ts (additions) +const clientSecret = process.env.OAUTH_CLIENT_SECRET! + +export type Tokens = { + access_token: string + refresh_token: string + id_token: string + expires_in: number + scope: string +} + +/** Exchange an authorization code for tokens. */ +export async function exchangeCode(code: string): Promise { + const basic = Buffer.from(`${clientId}:${clientSecret}`).toString('base64') + const res = await fetch(`${issuer}/token`, { + method: 'POST', + headers: { + Authorization: `Basic ${basic}`, + 'Content-Type': 'application/x-www-form-urlencoded', + }, + body: new URLSearchParams({ + grant_type: 'authorization_code', + code, + redirect_uri: redirectUri, + }), + }) + if (!res.ok) throw new Error(`Token exchange failed: ${res.status}`) + return res.json() +} + +export type UserInfo = { + sub: string + name?: string + email?: string + email_verified?: boolean +} + +/** Read the signed-in user's profile from the userinfo endpoint. */ +export async function fetchUserInfo(accessToken: string): Promise { + const res = await fetch(`${issuer}/userinfo`, { + headers: { Authorization: `Bearer ${accessToken}` }, + }) + if (!res.ok) throw new Error(`userinfo failed: ${res.status}`) + return res.json() +} +``` + +# Handle the callback {% #callback %} + +Create `consumer/src/routes/oauth.callback.tsx`. Its loader runs on the server: it checks the `state` against the session, exchanges the code, reads the profile, stores it in the session, and sends the user to the dashboard. + +```tsx +// consumer/src/routes/oauth.callback.tsx +import { createFileRoute, redirect } from '@tanstack/react-router' +import { createServerFn } from '@tanstack/react-start' +import { getRequestUrl } from '@tanstack/react-start/server' +import { exchangeCode, fetchUserInfo, vantageSession } from '../lib/oauth' + +const handleCallback = createServerFn().handler(async () => { + const url = getRequestUrl() + const code = url.searchParams.get('code') + const state = url.searchParams.get('state') + const session = await vantageSession() + + // The state must match the value we set in /oauth/start. + if (!code || !state || state !== session.data.state) { + throw redirect({ to: '/', search: { error: 'invalid_state' } }) + } + + const tokens = await exchangeCode(code) + const user = await fetchUserInfo(tokens.access_token) + + await session.update({ + accessToken: tokens.access_token, + user, + state: undefined, + }) + + throw redirect({ to: '/dashboard' }) +}) + +export const Route = createFileRoute('/oauth/callback')({ + loader: async () => { + await handleCallback() + }, + component: () => null, +}) +``` + +The client secret and the tokens live only inside these server functions. The browser only ever holds Vantage's own signed session cookie. + +# Show the signed-in user {% #dashboard %} + +![Vantage dashboard showing the signed-in user's TaskFlow identity](/images/docs/oauth-server/guide/vantage-dashboard.avif) + +The dashboard reads the user from the session and renders it. Create `consumer/src/routes/dashboard.tsx`: + +```tsx +// consumer/src/routes/dashboard.tsx (loader) +import { createFileRoute, redirect } from '@tanstack/react-router' +import { createServerFn } from '@tanstack/react-start' +import { vantageSession, type UserInfo } from '../lib/oauth' + +const loadUser = createServerFn().handler(async (): Promise => { + const session = await vantageSession() + if (!session.data.user) throw redirect({ to: '/' }) + return session.data.user as UserInfo +}) + +export const Route = createFileRoute('/dashboard')({ + component: Dashboard, + loader: async () => ({ user: await loadUser() }), +}) +``` + +The component renders `user.name`, `user.email`, and `user.sub` from the loader data. That profile came from TaskFlow, through the authorization code flow you built. Run the whole thing next. diff --git a/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-7/+page.markdoc b/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-7/+page.markdoc new file mode 100644 index 0000000000..4ffa7df73e --- /dev/null +++ b/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-7/+page.markdoc @@ -0,0 +1,57 @@ +--- +layout: tutorial +title: Run the flow +description: Start both apps and sign in with your product end to end. +step: 7 +--- + +Everything is in place. Run both apps and sign in. + +# Start both apps {% #start %} + +In two terminals: + +```sh +# in consumer/ +pnpm dev +``` + +```sh +# in provider/ +pnpm dev +``` + +Vantage is at `http://localhost:4100` and TaskFlow's consent screen at `http://localhost:4000`. + +# Sign in {% #sign-in %} + +Open `http://localhost:4100` and click **Sign in with TaskFlow**. You will: + +1. Land on TaskFlow's consent screen and sign in with a TaskFlow user. +2. See exactly what Vantage is requesting, and approve it. +3. Return to Vantage, signed in, with your TaskFlow name and email on the dashboard. + +That round trip is a complete OAuth 2.1 authorization code flow against your project's OAuth server. + +# What each side did {% #recap %} + +- **TaskFlow** enabled the OAuth server, registered Vantage as a confidential client, and hosted a consent screen that authenticates its users and approves grants. +- **Vantage** redirected to the authorize endpoint, exchanged the returned code for tokens on its server, and read the user's profile from userinfo. The client secret never left its server. + +Because the flow is standards-based, a real integrator does not have to use Appwrite or TanStack Start. Any OAuth or OpenID Connect client library pointed at your project's [discovery URL](/docs/partners/oauth-server/quick-start#discovery) works the same way. + +The full source for both apps is on GitHub at [appwrite-community/oauth-guide-taskflow](https://github.com/appwrite-community/oauth-guide-taskflow). + +# Next steps {% #next-steps %} + +{% cards %} +{% cards_item href="/docs/partners/oauth-server/tokens" title="Tokens" %} +Refresh access tokens, and revoke them on sign-out. +{% /cards_item %} +{% cards_item href="/docs/partners/oauth-server/scopes" title="Scopes" %} +Add custom scopes to represent permissions in your product. +{% /cards_item %} +{% cards_item href="/docs/partners/oauth-server/device-flow" title="Device flow" %} +Support TVs, CLIs, and other input-constrained devices. +{% /cards_item %} +{% /cards %} diff --git a/src/routes/docs/partners/oauth-server/tokens/+page.markdoc b/src/routes/docs/partners/oauth-server/tokens/+page.markdoc new file mode 100644 index 0000000000..91a8901fce --- /dev/null +++ b/src/routes/docs/partners/oauth-server/tokens/+page.markdoc @@ -0,0 +1,348 @@ +--- +layout: article +title: Tokens +description: Access, refresh, and ID tokens issued by Appwrite's OAuth server, their lifetimes, and how to refresh, introspect, and revoke them. +back: /docs/partners/oauth-server +--- + +When a client redeems an authorization code, the OAuth server issues three tokens: an access token, a refresh token, and an ID token. This page covers what each one is, how long it lives, and how to refresh, validate, and revoke them. + +# The three tokens {% #tokens %} + +- **Access token.** A JWT the client sends to call APIs on the user's behalf. It is signed with your project's key (`RS256`) and carries the granted scopes. Present it as a `Bearer` token to the userinfo endpoint or your own resource server. +- **Refresh token.** An opaque token the client exchanges for a new access token when the old one expires, without sending the user through authorization again. +- **ID token.** A JWT from the OpenID Connect layer that identifies the user (subject, and any profile claims the granted scopes allow). Clients validate it against the server's published keys. + +# Exchange a code for tokens {% #exchange %} + +The client exchanges its authorization code at the token endpoint with `grantType: 'authorization_code'`. A confidential client sends its `clientSecret`; a public client sends its `codeVerifier` instead. + +{% multicode %} +```client-web +import { Client, Oauth2 } from 'appwrite'; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +const oauth2 = new Oauth2(client); + +const result = await oauth2.createToken({ + grantType: '', + code: '', // optional + refreshToken: '', // optional + deviceCode: '', // optional + clientId: '', // optional + clientSecret: '', // optional + codeVerifier: '', // optional + redirectUri: 'https://example.com', // optional + resource: '' // optional +}); + +console.log(result); +``` +```client-flutter +import 'package:appwrite/appwrite.dart'; + +Client client = Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +Oauth2 oauth2 = Oauth2(client); + +Oauth2Token result = await oauth2.createToken( + grantType: '', + code: '', // optional + refreshToken: '', // optional + deviceCode: '', // optional + clientId: '', // optional + clientSecret: '', // optional + codeVerifier: '', // optional + redirectUri: 'https://example.com', // optional + resource: '', // optional +); +``` +```client-apple +import Appwrite + +let client = Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + +let oauth2 = Oauth2(client) + +let oauth2Token = try await oauth2.createToken( + grant_type: "", + code: "", // optional + refresh_token: "", // optional + device_code: "", // optional + client_id: "", // optional + client_secret: "", // optional + code_verifier: "", // optional + redirect_uri: "https://example.com", // optional + resource: "" // optional +) + +``` +```client-android-kotlin +import io.appwrite.Client +import io.appwrite.coroutines.CoroutineCallback +import io.appwrite.services.Oauth2 + +val client = Client(context) + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + +val oauth2 = Oauth2(client) + +val result = oauth2.createToken( + grant_type = "", + code = "", // (optional) + refresh_token = "", // (optional) + device_code = "", // (optional) + client_id = "", // (optional) + client_secret = "", // (optional) + code_verifier = "", // (optional) + redirect_uri = "https://example.com", // (optional) + resource = "", // (optional) +) +``` +```client-android-java +import io.appwrite.Client; +import io.appwrite.coroutines.CoroutineCallback; +import io.appwrite.services.Oauth2; + +Client client = new Client(context) + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject(""); // Your project ID + +Oauth2 oauth2 = new Oauth2(client); + +oauth2.createToken( + "", // grant_type + "", // code (optional) + "", // refresh_token (optional) + "", // device_code (optional) + "", // client_id (optional) + "", // client_secret (optional) + "", // code_verifier (optional) + "https://example.com", // redirect_uri (optional) + "", // resource (optional) + new CoroutineCallback<>((result, error) -> { + if (error != null) { + error.printStackTrace(); + return; + } + + Log.d("Appwrite", result.toString()); + }) +); + +``` +```client-react-native +import { Client, Oauth2 } from "react-native-appwrite"; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +const oauth2 = new Oauth2(client); + +const result = await oauth2.createToken({ + grantType: '', + code: '', // optional + refreshToken: '', // optional + deviceCode: '', // optional + clientId: '', // optional + clientSecret: '', // optional + codeVerifier: '', // optional + redirectUri: 'https://example.com', // optional + resource: '' // optional +}); + +console.log(result); +``` +{% /multicode %} + +The response contains the access token, refresh token, ID token, granted scope, and the access token's lifetime in seconds. + +# Token lifetimes {% #lifetimes %} + +Lifetimes default by client type and are configurable per project on the **OAuth2 server** settings. + +| | Confidential | Public | +| --- | --- | --- | +| Access token | 8 hours | 1 hour | +| Refresh token | 365 days | 30 days | + +Public clients get shorter lifetimes because their tokens live on user devices, where the risk of theft is higher, so the window of exposure is kept small. + +# Refresh with rotation {% #refresh %} + +To refresh, the client calls the token endpoint with `grantType: 'refresh_token'` and its current refresh token. The response includes a **new** access token and a **new** refresh token. + +Refresh tokens rotate: each refresh invalidates the token that was used. If an old refresh token is presented again, the server treats it as a compromise and revokes the entire token family, forcing the user to reauthorize. This means a client must always store the newest refresh token it received. + +To refresh, reuse the `createToken` call with the refresh grant: + +```http +POST /v1/oauth2//token HTTP/1.1 +Host: .cloud.appwrite.io +Authorization: Basic +Content-Type: application/x-www-form-urlencoded + +grant_type=refresh_token&refresh_token= +``` + +# Validate tokens {% #validate %} + +Access and ID tokens are `RS256` JWTs signed with your project's key. A client validates them offline by fetching the server's public keys once from the JWKS endpoint and checking the signature, issuer, and expiry. + +```http +GET /v1/oauth2//.well-known/jwks.json HTTP/1.1 +Host: .cloud.appwrite.io +``` + +To read the user's profile from an access token, call the userinfo endpoint: + +```http +GET /v1/oauth2//userinfo HTTP/1.1 +Host: .cloud.appwrite.io +Authorization: Bearer +``` + +# Introspect a token {% #introspect %} + +A resource server can ask the OAuth server whether a token is still valid with the introspection endpoint. Introspection requires client authentication, so only confidential clients (or an API key with the `oauth2.read` scope) can call it. A public client, having no secret, cannot introspect. + +```http +POST /v1/oauth2//introspect HTTP/1.1 +Host: .cloud.appwrite.io +Authorization: Basic +Content-Type: application/x-www-form-urlencoded + +token= +``` + +A valid token returns `"active": true` with its scope, subject, and expiry. A revoked or expired token returns `"active": false`. + +# Revoke a token {% #revoke %} + +A client revokes a token it no longer needs with the revocation endpoint. Confidential clients authenticate with their secret; public clients revoke without one. + +{% multicode %} +```client-web +import { Client, Oauth2 } from 'appwrite'; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +const oauth2 = new Oauth2(client); + +const result = await oauth2.revoke({ + token: '', + tokenTypeHint: 'access_token', // optional + clientId: '', // optional + clientSecret: '' // optional +}); + +console.log(result); +``` +```client-flutter +import 'package:appwrite/appwrite.dart'; + +Client client = Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +Oauth2 oauth2 = Oauth2(client); + + result = await oauth2.revoke( + token: '', + tokenTypeHint: 'access_token', // optional + clientId: '', // optional + clientSecret: '', // optional +); +``` +```client-apple +import Appwrite + +let client = Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + +let oauth2 = Oauth2(client) + +let result = try await oauth2.revoke( + token: "", + token_type_hint: "access_token", // optional + client_id: "", // optional + client_secret: "" // optional +) + +``` +```client-android-kotlin +import io.appwrite.Client +import io.appwrite.coroutines.CoroutineCallback +import io.appwrite.services.Oauth2 + +val client = Client(context) + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + +val oauth2 = Oauth2(client) + +val result = oauth2.revoke( + token = "", + token_type_hint = "access_token", // (optional) + client_id = "", // (optional) + client_secret = "", // (optional) +) +``` +```client-android-java +import io.appwrite.Client; +import io.appwrite.coroutines.CoroutineCallback; +import io.appwrite.services.Oauth2; + +Client client = new Client(context) + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject(""); // Your project ID + +Oauth2 oauth2 = new Oauth2(client); + +oauth2.revoke( + "", // token + "access_token", // token_type_hint (optional) + "", // client_id (optional) + "", // client_secret (optional) + new CoroutineCallback<>((result, error) -> { + if (error != null) { + error.printStackTrace(); + return; + } + + Log.d("Appwrite", result.toString()); + }) +); + +``` +```client-react-native +import { Client, Oauth2 } from "react-native-appwrite"; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +const oauth2 = new Oauth2(client); + +const result = await oauth2.revoke({ + token: '', + tokenTypeHint: 'access_token', // optional + clientId: '', // optional + clientSecret: '' // optional +}); + +console.log(result); +``` +{% /multicode %} diff --git a/static/images/docs/oauth-server/dark/oauth2-server-apps-empty.avif b/static/images/docs/oauth-server/dark/oauth2-server-apps-empty.avif new file mode 100644 index 0000000000000000000000000000000000000000..ccfb9ddc613453ea004aebafdb86a706e450e08d GIT binary patch literal 25267 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 literal 0 HcmV?d00001 diff --git a/static/images/docs/oauth-server/dark/oauth2-server-apps-list.avif b/static/images/docs/oauth-server/dark/oauth2-server-apps-list.avif new file mode 100644 index 0000000000000000000000000000000000000000..44aaed98789a69d2976a5c24941ad3bdc6ef1111 GIT binary patch literal 26947 zcmXu~W3VvH&NPfJ+qP}nwr$(CZQHijwQSqAZTq|TbIzNoNvBg?HL03^nG65`0FIf9 zr-PxJr5V6~W@~B2_`lfJ((r$L)z;L-@PGOLjL^cw#_9hT0suHz8oT_z`2QiCgQbh@ z{}I6dJdvf1z48B;hyVcKf9rqt`Ts`%3(5Z&v8AQm{~h{&S=9fCDbW8^|7i`~7#RN- zs#!WXIsAtlmJY`D{~?T_8>4U_>Ho=4ES()p|0eFad{x`RP(tGOoMmOZZ%k49QJyII={tu2p*V5>zePZ4wTmRp= z_O~BA#L_ZtS@$pY$}@qNa4~{bJGHZ)LlGXRr>lFRs27tLobOXAHTBL_!-Q(0H&y?# zcR^ru;?o<`^QTz_9neqn(^@+O+Ka<<@SIL9xfL;M->E_tp(wRS9vi zKIs#>okl83>*ujaRhQ*}Ny)`|t}&kI zm{MvK?QEbVtmFFkABIdclAa;^N-Gs6`c_SEDNn-`hHJvk6X2p)tXxnWe?Kv_fyBrs zoy7c>=Yda7@w84g;&vC@21lgyo)d-MnyO;VbgK8ccj==^L9pnGeBk5`rzhX99Kh?E zMK0E+|8G4;{(ZUAa5lS5z8yzZi%S;Inz$0ShE1t`>5}r6XCZ&AU zs=PG6Z9NR?+WXJMjK!OIKg~>(DkznpQ4$|TT|ceG!Pc}y z(!0QXiz%#Oo^60G>%FjFooJg>>^X7|kI_MdZI1KiQpH&0)OG4O)K>1- zv~7kxjLrxaOrj9?Q;FC`YC8omx0PNdoTqGWw3UIB&Cb@gcarJj3w{^Qr4>fgG^sLQ zOWqk8>fP}bL#)_z@%sg-BNm3?z;$|u3h-7@Fd>PRm7wJw@dTvb|#Pf;eC{d%vItC7)YdtUZjBT)h8 zx1gpKI=G>DJEeXkR-WJ6d_O@;i-imj@Q>E!hf=Sca*TBppKqnK0L zg-^3pgG;{&{%sa9bP19xXr%M=5_RB71{2k4{qSTe<%8gA*3$It{}r-eqP*p`Jxk}y zyQ%pfastItCDJ_Oz?oAZmW$M$+e>SLoZ3Lk=W^5Vqgrti(^GeSY83V8lypah#yrw1 z4ibPBc{=nKTE-Sks1lklZFInqtO=?^P259N?EdN5(sQ`=WeAqm2N+rje%K9yQ)g`! zWK&R2P3H|0Bl|p+()x-+v@R@5DI;W|=_KJxcH-J8u?f{WfS$3vEAc*C`A22CV77q_ zQsd!L>+i_6dJ0lA1|l)3F4Uzoz$wbdm}alNgy-~@!yefeS6aN1)snZD6X%dXRZy1u zz7j*L>^aXj)kCYYYi~`Ljv3ZJ-}Z@aMX3iUVTEvQ*eHD!#!r{dCJalj=Eys1JXiVghZm3ox{_=I& zxvuzvptqW(kaM|m$N^^kwv;lT>S+1(3HD1!E5xhw2Yu>q<9N)yrh(fHMpbc&nF;6f zs;bPRyT6`N2zi1at%UDW+qMS7*+&ZkvhfvFngcOsOke{GR_Pv`{1-yEcgJv4KGHlFELhoi`U z8W{MR4QNbRYHr|g%c}}6UJej8kvxom`hc4B{+?9)7_e!Qas>qDoJo|NWu=N~Kre_# z2kZcYIG4AceC&;5CDl8@A_!Ix6u6kgL1=bB27G54tvqts?~-Oze$>@3A~vN2e9ZU7 z5co+>VWY1enQTlTvxfbzv|C=aZ zfJf1!jivZXu?Co`|9m`r`9Zn$<*JSL?Vdss#)c3^*CIO* zztczz13Izh!A^O6oNC0BNcO*t;5xrP<$Dzn-RMMfK>AdgC63v1%1hBcD|iXS#aZndI2)b&_qq1w3B=A zftLjnR9Ao4F9+ht$P!H9PrN0uKN``g3U9)QdG0;+kCD8ETZrfW_$Ba6o7ldo@-rI3 z;lCbL4y~0&;6i1-XH`E5(m4C8g|L_RB7cx0br*#!C>27uIvP$MCg2}_^LE0 zT;c4|!U;0m|K}`)sXJD+R`WsgopVNUM~Z|{S$M^^;EHrwdANkrNBOYl-P`H~+}b`R zuEJ$C53FzcD@u{mFh;;ah>I?(9Df4YaFveJoeq@~M06t7(HoWm+fR&|6A$4Bl>$d# zwV8Wwp;K4oCp7|Y!?{HP_;S zIp|r0`6YL{;;>?Cn_MW0kX!wB*2S|LSQ$-Iqm$7uc8@;d3#h`Y4I%J7xN~8pHYlV( z!6$8h+kt}fwkwGQfeIBw0~S(-2KU(}_x6;kDWw9>+z>pn?%^mbrF4Lu;&6^X`Fk$j zO(ZmaDXR?ty?w!h1Up|}{D6ghqY<6^M|!BXsA;o@r*^|9eHYVqi?fZaAjj1wBYkp% zWYv#3wM8ncYC1k+@C}FaL%P4Jvm=!^E-z!uMK;gB-&pE&wS5D_#Z8Rt1{N~KPas`2 zZ2BjR7_AN#2oLCf)_`gMsUL8WiM_82ng(nBdh-GVF5ti*sa)}~oQ+J^No2Fy4MPCe zX)*Qc^s$!OrM~yoXE{LDdKSW8EK1jB6Ih3wIcxjl+bP`lW$mW;?^19|<2{p$zor|L z;mPdck7YL!(x|Yk+&l;i5o16KF>#bUWAZ8;i3S9Q9(iXijy~DUWqbx zXG*L47B0515@kA|=~Pe_S4nd|2p2M4`ycywyFTV5Qqw}yw0@7vG|dzqrjKU1e$pU_ zFJa&}h7EjiOM5|te^zi-pJBA^HGxd+TU!hDVYkb!aKA%IjGu3l&sCX+7Vq|k%IAip zsIaGK75~6iP9N?hM7FycsfCM&-i-nt)m63>9LATk>}elxsr_e!4;F5(TCQpy+0j4b z5?)=~(>xzde6N%_d_}Rn^(lfcEA4v1B zVwBi<#^>MdUxPxBveE{!7EhRW1WmIASTe-cN^k~DQctOa5W{2-AecdhG31F)QRAzh+Hj>J z5#t$fDv8n}KQ>Yo{!LW$N8rXUDVR`nZV9CYLhS$r#CBq0Qo$wy$F2vXF}d%SG+iKJ zp`cV}8D+3OAtZKpSZ;5gt*sQwm{}`1LbbyQmz$)oXPUK)_`1^s#h#AQJMLTabdG3v zD3B(9U1Doguz#t$TN;S0MHCqlv#@+*D_n7pD=r7k${9|^IDL2D(ozQ_u0wnME=9P@ z+|&X89xtUU-pPO5+%sj*h{t;0kF3KjK7+>)?P_`VJZ9$~k+PMAxp0q@CvUpV=7K*E zyw#LU(*U#kM}l$U9Mh4?pSnh2hB~C@>}TJNq#Y16MfK#?Jowd}1Wp(8umL^YVOr&7 zv^}kzv3x3U5i57lc1=))=HyU{g83W0AN0q9vsPhB=f1V@D417AHg{6k=B}*QqCV(p z6B;;KL9isOC43Z69+Z7}N#9?CUcbduNoR55f9EHvP<;YT{Wdy_AD?44G>GLHABg4J z6zytIWgi2J`;g}P^v}`qUk?wviuDxn5yD;csvNcbSxO7_B5U>cf9v=w;8U$=KZdT@ zyb^vN+5@8}hca+-ks{^bQmoig?rn#g;IfPk#yYPz3;fsKj+4m9zZzf@*e7R#m5@ou zM4PA*Ix#DjSidFOE*=!?uH$_N3UCj`WaNiG4f*TA8`4E&14r3?Fgzb z7gx!IGNd8ZAyO+{od}J|DeKiZL@5And(ttpDvYlq}`rd=;*17D43}OrB4LUj-b_h5*o( zTVyz618=em>yoRH*cTYAo*%tc{v)l4RHe|i*MGVv?i1O{si@H+qE~bJ2;(X(N@ChJ zmzY@OKtc`!Yhu*2@=zWvMRkeewmO6U6Pl1ZDj|1o{S9SRDwYmFrQ+f~GR41WsCq~i z?*bKJAYd@w;(n*EYW%hbpj$Lp>4r_VID}qESfa6tNW~BM$ar&dH!_1+1u?yzo;Rou%GNYs3MiT-WDM zp(w${4O9M}^>ai=?91XrO0v?WF%$q%tcZeIoNp0ctpP1{o4$z!~z$R+R=cdq3X^~*!vsxK==`S zvYcx5@k|q-&M-OQ^p9~_E#MU$W)(~dmJ6gn~KEoZtU-dCGkb;iK=KI%d zG!Dss(b)>6nh2)5X5X?>7O_k&HIiROik%oYeLWspgWBx|XvfwTY02PBg29;;%f z!TFNwL|AvD3{OWmHvNNB;)6`hlIIxf3hi!K0?#XBf4l2k`w(eNk!oJ8tf@0(Zt%r_ zf6_ek@vnXLta`GM&n(?b3kP!V;4VRY5Ey*q6RX^&z%9)!+f-cjbp+~;cENgOk>t+O zNTPPw&Ioj6F-n6411NgrA(l2-s{El^xc??pPG?=472P{c+Fa6o?64hJEZ}mJ?UC`e z7tEHksH!nZ2+ow^N-O9FHNyQ2uu?aw1prNZ-c1aITr;}q{=heR>POs@u_tdTqO=hu z5S35@63z*rcvYl%7E4c6^%LN6qh47<(P@G)EmU43@Odg_=Ziae{G zZetoS@1!n($U|mK{;Tindp`!UkY8+^zzlg4SNQTDC8ab!YPmF-!xQc)ZsQ1DkZ{Ra z3y!5ir#Ls85!@N5@^GlUD3j@h7oO}|TGEJq;Q5P4VXx1ZLMKm1iAmRB_{y@WNWu|p zLXTcB96;c*_#Ju5?f%YV68IL{XY3d@TkNnN2} z#iP#%8Wl+%>^MpD!TYHsWo12aUjc1ZRoJ817(Uy#N2jaMnr*KEP!>P4Z5IRm!IO$s z>K{A+U<>~aA(*l*4Wka`Lx-st08A$eQX6Q}BIwuzSx@y>4&0iD_eO&!l~ zrYX{&-drTr>Po<(8kf#4k0Myo`{{-jc%aF3-g9QoI2)$LlaMziqf=cF@w06 zZJp7Df4j>klpvWy>z|jH@s!(o*B~x)yEox!BWVsV4$lL%iD&~~7dc!xyZlu1{ws$I zcXHC^iH*kc^ZPVT;hk2-k<=#gkr?yf@4FMqhoFj3XnsuxWat^rP{JHg)GO*-OdBD$ z0`mLy#n4w8gdZwnsI-<|-z$DM8Uw?_msyewO}Pxz?T@gXT(Hb5;I)ZS(mi@S(7HWO z&*81A+WBHxozqIDz$?Paw(QhDR{FP*Pc=pT)EKLlt@CUGlL8Ls-)q|^FM zSVaib2ol{lX*$p)tz(RK)>AKqF#^Xqx^MJ#=PS$sy8uSSq=}Vp*dVPM?~em4kJLBN z$3PD3PNsDkC-abM=lYC>KwDH$1|;&NirchbjcdvGYMqa9Ud08VWjxJcT(hY={T0vo zUQ*g%K$A4z7jC4U><7-M=(U=|ba7Y=+0nd<92MNhrGA-;mb!?40U+JVk@3y=TQ@&! z`Mi5k7Wo~mnps$e4j*(@h2e-AZVs&c+`&!~SD^e>f#{TS=7DPWCL%vF=DB@VX{{c@ zl#c7#h}@k5%^<7Byr&C9_KmxS1Dxq~s@{D}M<6wDqyk(uRh)`G5o|+m<%Mu)X zF-rj5_rmTb3-%)Db6t@4Voh92r@V;*NAioL?u;I8WXpcY=>zhyKk}3ioXE(N!rVMf zyluqsk?U^-3#45QB*lzf#-Tc@5Q#0I%brSF*3G)y{acRivyX*&97e+OrTB17&*0KK z-;Twn2h5@$l5VoloHfn0<(s@4O!;Q!3FFus`j0@~84t@UUIytdz%?oN=WUPIV`ivuL! zd@f2nhI)h4Iq+OF&xd>BjUVSvd75cpm6cS?@@^M{d|k6^yl?HwvT{1xes3VF9rgj* z_Q`_j_X*rx&4GPvn&EEQ_pd$UurEy;s0hsi%=Qg( zya)qX7geVvduRlz!gZ0u6de+Q?ZSyMJZ1A6RN7SK2s}>HV-+VydGhyDt~jDqXvctY zWti+oGd+FdBqV7Fq1S5v=p9Xk{yNxOE#^UbR=VGvWS-{SB&m{ZTQ~i*Mx!bgKpF^Z zO0+mvSZ>Ya(6j7ZbVKc%AgB~e{lXiwG15#}7+yJQTBd!&k?-u@yB3KT0CewVai4XX z1&^jcO;vSUp{(ccL#>tHs_S2g;d35z+AxP73cns|t z!|L^VR(mH|^s4+wgyGE{u8fFG$=-__ryEHkLU)_2v}G5fNbw{2jZxR&EI?%nVW*NzbyWopPK_ zrK$Q=Xy<{q_iQSN~YDj`R;lsf4o@}XzVZBqQ(*=ETBRXLIquQPgNU6s>`$o?k3d1PoSWFLq<7!0Vn>o&umtC9 zNPf#QaVxuYO>g-0_vepjn!jPi@6=Vf|JPTO(CN005!nsAW0IFP(4Db;3;6LK;yU-& zM1IP1D?W$jGC)aGW{fj>>r^5T*<+I(aptBL0oRW%*q>8oh6Tj2w78xkTnT&-ZDp&< zhY+Uldd73R%OPE+;NB!aOT_MaKmMIt_01Y3{_?7Qy&0LE%R-!vdQ}B^rK+!Lj&E$! zNP6w~Y&pfwgoQ7GoB9dMR)cS6$SqB4YTc9&QGo{aCct1OYw|bRHA}AfsQd2}qEsW> zL#fZ@WC1dv&1W%l%ZJ$y%?tNMYvd%wx(y2i=OdS?yjH_zluXC!P^8=4q}0z7uaCQl z8#!i0d4B`!y_D8$g&7b1=vd{0hEI$jb&g#HaRmucE7O3*Q;F(ub!;1h3;#~v?1^^Q z1u#F~`I6HXpAaF>Z#I7eO;=0!9zTV6Q$D1mVuNC3gK!Og$c~z!TD>m?$?U-jJq3%P9;24`DI;2#43FI>x>UB!xBrpaZ|}*NC_JH~$Wt=8N~W z2N7`5DbYGFW{y-*gn1=*Yd|nO5bkcV@|Q$QL+)QoY9sAY_(v=7_ z;xUsJCmhLjhwBk@h72(4)B9;zcIk-G1c<`Hzsqyz>>0gA2Eh{*;lZ=jk2wvNM;Phe zDK8qwVD~vWj;~QtP*t-1)zfP?17i0aHX8r$=hue7*YW~ZXZPu)>+FLtJ$rQdWA=E^ zQ3_k-v&O*D8>%WimmNXN8YkQI=SaK$r~}EL`@g>%NcdJ&+c~aBYdh8Ou;Ju04uEpU zWl__NAUI$kisRqDKB9ugSmYgp&Fs$pU{5_^3yNv(m6GY1WtlSJ((dt?5+M1MD#)(` zW1R$7F%g~F=RV+W%(J{k$fO59^Egr6&8RAn$5@}=HS<#s1-JD`24%QA05y0JzJ@q_ z@nsCdLTYR;eQw)>fqoM8VZxC(%+Jfa{OY%abZ8gVH$0`oVWmZnb*oga@i-amf~wzj zj;~s;_rg2Yns#g3!d{xokR5WiJ@AFYEJhTNp!`(4huMh2&cOyX`o9BiFi?yCZb9jQ zn4*@9^ng=42?{xmFAa2(s&^dNmJ1~tn`Ma`Xnf&(V4WTfRkustE$Ix#_EDee++Q0{ zc;TV_7-5Q1d(C-<4~Hr~_G#94Pl_I0d1Q&-Nhic&?9TmR`_zBFptdQV;oT33Nedzq z=8p@g_VJJ8#5eMk0znf~emGrMG-;aUTQ!xo>V^<|PL z1gY{u)smrY?4ZJolXkFWm4i%46&PxJ85jC=%s>6~_On?$vp4Fb* z9tL+^!m8OYiz@$(e6f!UX1PM}{v$YLec4R+Q5ihA+^5)iI6cqHVpX4zC7GTdi0JPs z`vjKlKx!vZ;RX#dA^#hOPY3jE+!)7AuE}tK^3Mb{EswaYBf4qifmQh5ojp(r25}T# zT%Nyi?z*6Dgp_Fna~BkoBly3Z9@}KC-!^~AFJd+@vd$0#k(FCFz@6ArWJ#YCT}W&I zNbhe8UeHgb#v@aC#`aHo$YKM-%`nr*WE|1r$u2LyE#IBQ-RRH8Oa*~Ig1|@WWkQA$ zCN-aw5f|1oE+7bd?#nk{K-L|--IaqV4soy{T$DGbnJPHy(M|kMke54wl6M#Y_lsy; z>)56xkQ_U7IV>R-Rf(+!so^B}$_X+1h3iLbMsQ-HDdX%97kQ$*wbd@np!!?e2+diB z@w4Enf#tE`SpV77pm)@MdHP^BxzWjemYja-x1tr#ZLER|m&QR$pObH!1wH;Wt_ zq=3t~+PEaQSPsJfy16keFYL?sTOGtTx@2XC{eO++h!&;2T?SH;SGlgaHRbd$-|kN4 zOS;wv8wnEg4M&1^ssWb{LrN57ZY>&A3gE$f>&d;TGRaK-Gbtw91|*E7LF@Ze{7paJ zMI4ck-S-mn+5hl>bdCpnvNUs;MZwPaU6Eumx@70e{8ZB3US|f^n#!nPX_2 zPmJV%*9ikvaZ|(x2D(SRP@1?5`K5}k)uqt*Xrt~-x6H9bhfeLVO`;U@3jI>_NYf6C zAQH$68KwA}sSLEb)JKE=3Z5(pCUpgdu@yp9n?S$~3K2*&WuWHSA} z{u-Gv_s@I?jfHI}kD|sad(%;G9QTv?3_0OIli#iOV@(x=ccm*-uJBF~AAdls8Y8D$&}Yzji#?L);4mf2&!kf{FImC(H~rRtF9HydbFM z=3;uW(b0#@Y15kN1A4z`8oi~X#qiha5T~8XPl%M!h*7B;WjZbI^*DAVa3&^@Ik$5k z6^Om;eFyW0ir*l1v!xPrB*6;<+OHZbjOX*WX@>#-#Ti&C?f$^tJ2_q=aa}@rfMhxO z!g5y9QYw$)vkYioCz3BS32H#AtUaWGT={NHs;tjRJ6=Zget_Q38JRQcjm|Pe=0Y&P zxOPWy`gZwm@yJ>y$YA4Tw>+k^%!6Gm)PrT6X`%!}l0m^cqJCmTv#uxE!-#2ZT|Pyy zRGIUOPL>khK@VmVYRwR$PSgp+=1`uxR+-!wAL^H%EfZfLm^S`3v*Rh^1K8FA-Fgq0 z2gV&_LL}~P)~`2Opw89Ru{O{;6z?Ose7erC*3f3j!ftgzk1cz^NOg%^*XE@cB*Z2) zH8=mP$teKho(+FwD)~)au-i9#A@tB(qRqP&VvPn1}`=AzP$?wCHR z=TxxCgNIkArF{ii4*u#6)^G+O6c&OekH(d*df8lU0k}1u55;%v>#zC|$pnG@^(T?C3$o{81N7`uJY*pF zz+i;sw}SOY>P!ciSGd6Tn+(#(X^zJ4TRvHw$t%?fk1_aOG9)F~ zWV{x`numOlR!Kdvr=^=SVEI>MeZ>W~*aJC%6#=C0mF#|Wxa)l^L_+(QP@(%w_7r4xpGkj^UY}YOl2hjCqa*lq!1KPszXYh{w`k7<6ghs?+us{NQ*} zo+mDju6!*ctKFa(F*R($2JUSEnb}bJ#$pWkSJ>NsQLMDZyQwYXG|9gPRG6-jdVWh0 z!%2m}fzx%C$W-|?BAGqQDV~TAL>~puLmHAOd|)>mBYDL8@*h#}+A$Q3h~Jk9!L4s} z{6TfamlQU+2o%jSFYsd+v25>>V<|<(jl$;x<_-YFM*5U(oUPaD47&ha^NH30cp-}#OIDL*#`-LphNyo6*aLU1M&;6m{t3Z<( zN%mQwfNH`cKuTCqsKqC{R_`fC@N$J3(q-=q8ER@Ps{KB*h)55{S&ZuJt5K0!NIKGo zH0fMv8vrWq_lrZE*x^lFo!!HUH=HvCTTm0ca!RnCqZCk{G^UeEdYuUAFSbumMl~C6 zBwoJIN75=G4xx8Ae&8LVM7$|i7{CeIY|rHG{>|@*IS?g9IO!&7et~Ex#W}doFbIuL z(6*I-X(GDvh4Res_+y|U?wW0?XKO9j%ChR9=!U5m{Q+uX*w>1WhFwBQT|oOZ(Z-tp zCvxJ0jOE1BEcf`9z~%8%x;kR$+j(xL<;~1H$m@0|5dhI({$&Bn>*@mcmA3tH>2{eeQ1o?R?^%AO1Q&=IjZ6}{ zM=pf|3*kPWTe6J{S8wX=-9r2;?Uh6L90(j$7pB>v^g^(qnF_g{Wt=t<$enJ|zI^+O z<3OK-ydhKwn|c-DW`tbOP!`y8r|>yx3d2aovnFE=vkaf0EbBhpT!I~QuSHElLTy1m ztqwb~Nw9v85BrMO+Q6IZUc&)VXN(C{wc0JD^%HOO73Kj5XeDyCjykeCfmC&UmGWS! zivv?9`{!#yb);)QQ8xGh+<+9IIEhh^_t2c-2c7hLxk-B|F6V0(r1OiK8$y%23kvgf zp`Vzi+dLhL%~2Dt%6P1KD@hIxri$O(0-M?zZ(vgZ4ug^{T1!3+6P*!doWo~@7 z8aWb|S$0wH3=w0H@{xN5jB@TyM~D}qxi$?H0P6*fS3TZf*%yw!@Q?p0RcHhwUtOFPJ<8>uu;z)j4bG~Nz;ul!<91PdKgEd zM@Bi+#Ob-aX`vRvqlaR9=kTZ~FSZ|D7m!}$ZI*;coodmoGHQWuuK z!v#qp;PBT7_BhCH0UVk1sJ!2k$)VJ<8%kY{`F_2VCj9eWw8%cG!#FVc8 zp;Ur_G+g#x%@dhSw+(GR0@q8wztZRR105i{FNa8ou{wX1&x+1!>b}QLB^CsVPh=A5 zR@ux}m|ss8=9vJ&_!X1`U>d)o)O3m|22-2#u>{3Ho5yFz7e)9BAOTLm4befA1UIZ| zn~lMT`f-IwWkxOBv9jb8C1S6Gl9r*C$LFC6SWcih%qf%8ZraF4OXw$)(lw6i1folt zQpb=5P8g_-COW-^a_Jnwn{-267WJ1J!YSPmco)cjbKR}w#d+!vA$J3;^BIm&r&M>` zH6E`#hw|ppojOruj8~mWy(4n{j9Fy*eK<4u9?WR_T0;9O4cnSa-{AyqVC z2w5e_QaL*6(W7Arqa^0>%MGfHO8A|#kPmnuOEIysBuy**0(CgMN4(T zw+I84vlma3eXp0-LMY!)GMp>v%JfU+irTr(Ghsg%UxKvi%|J$zL)V(K2zzc9Q2-&) zAN2K1m0t@}cU~S;iZjLgpy@q(N(2}wcN2<<2kmuW*}E&D#v*?qoGeCVd%4);6Kb8ZP4(+DFDC%mmmtS9+itRc_504N*2_Hj$-oR;x^`1O9M)lJ&Kcc17YqpuOEy!P zgHA`$ufnr@`9EA%>OpeDSZj$Omo0bYTH3@aOk@8be|Z;eYP6}%A9CJvD&bL#F}D%l z+kfh+FSMM({a!UuT$HNYK!O}{I+nviS0a{bd8S(|VW(kXiTvuR1hN=q=SpuR=U(Q; z>D*X|cDNf};+LK>r1DqbF(!|G2k-l+54LZvBvExEG}4x>BSlB@@puuthb?DZHG%mn z0-fac*|1rBUw#m=?lCwKlksboRH=nt0aAM-c zwQ2a~$wn+&T~3$!OO_;JafS|Ix@;E(RAeb10okqf-RR;43pP+zo0)!4Uwhk1=(I)R zH@as57uRI1mpstH4pkNdLxQ1skMAmqU6)ZHpFlFwSZ`bpM9%9W3P2Re(8wR}HaCCV z+-@uLFCulotiyNnYSorO7S%XiB(&R-GS9TzA{XDt{PE8_51Q8SY9lq{Y?vyC z*FX9rYRzQOEFc@o07N+C`-f+JAGvw{o6zDM_yh2`ZQG?25G=kgl5ldWedhHNE zM^t0=?xluYhZf(-E8eCKRrQ!Mb|u}sufUcT?PSEn*5xqeQMb));DV`;Gv&9Ag&~ju zpeU6}YmGQPeT{ys6qz#w+_urJ(~UMRp38V8 zR3gAuj`Jpcjdj$%!uZK^Ea=5HR%i1bW4ccN4auXQ0G%gl*ns4S;o%99IE?XNa92Mz zu_k8nZ`dj^r;?%(yU9n#5{{PPiWzXtdzJPxFTUc~9>^mT9&hiUN!M%41rDNJSt%0b z|CBkrZ3$FF6Wg6V9tdU-F2)&1FmmVCD*hI=NCnu-(zL)0?(OA*mmPTn(on}^&*4Wj9{%hbPaiuL}v_jM{cS9_NU%Nu+I-0lWJi#{xvc zY|c5qA9aWRQ7Xg>O&mxd^I5XfL;Evcz2{Qols3EXt|XMIVEcP5*56e;^QA69><2Ny zOl+P1B8V;pX0K-mf>y$$85>5I9A7B~!6^%v7O;{E7w{pa5b!(di32HKu6Cz981i}g z33%Mq0tnhV6k{ZY>$1>ePAnN1mN5nXCm`9)_^ahiZIMcv>)`#z;K!2AQII2)070l# zf>Z-00iq|+tVXl%u)V^tXS1xseP2O#I!CdfjqcIn6X1(R+tOySuQ~b<1#u}z_eOs($JDeFiM+z#7oc25J z>Wl5m^>geSsdAzQtkRhBPRpLw6VG6o)dSIl22vjJS zFe}{R^4}~)eJ2WTDJHBhYNU_Yw{(5nx{{V_R%lnOHlq8iIC)HSltj}?cYj4)D!48= zh=XcdnDQf8`xLYGJBxByH!{4wE(m9Qqs{9(p@XC$@0*IO$V3IwIeY9e!UTvanF+81G{7bNwlZ-ZlXsqY`&qNu9l>pZ_FK)cSJa6 z|Fa&Sa(mk>AWAtF2Pm1#p}XPYyvmaEs@k($`MgbF>y)mLxHGh!Hf-S4|EF!d6n47}FbLpHv_#PChrSQIhTB2Pu3&R;WQyD|8=;wc3C_U5(U==2wQ%sFS z6g+By8AxGyXZDNZODJN_twI3+YL<`WMs1~gRCECxn@+#SPC#G`H>T06VM<|J@ z%JeC4|6W;H_3grm%t7L*AG1|2Dk$q5IKsIwEBa$JO5j8UWW*J2m5XeS4^Qu*F3~M^ zpJv*27IA=gRhuSFhq2_I5!R(u@%y6bv9-bEb6~6hOc!((@Yu(&Mo0~ zEkCvRXsMSwWNyF|?>1=q+G~LRh;P-hyi&d@&i~E&PR*F5t#f0gPnhl%dunEhh6V+x z@&7aLY~s&2iQ6+IFz_SQyY{}DvcE_33Uc!Bw!dMz;3OPtfz@Bgu6<&vT^Qd<7pIGe zPG->&4hYn>okc`Uivc_ir2wBoALm@n1WwIzHYnzR63bgU7l(DHDM zznskb=3s<;eiEojTB^&bl(XyuW8_yV)LiNALnNw^U)d)JD{7P~(dxNI5@}T7MC^CZ zEh8x73(OtX6{&WuE`yo)Gpw@$GiMY&(#^`_E^t2%(}TGUQpp<7*6KO!Ex6()gBD0v zS?Y6g|NjEbC^Fa3W2^J2Teo6kOr@L>PLRb<%oa5)p?zgMs!*F_4?ioP!j8lqDBzSd zZZQpVz?FuZ|H~nRq{QKhjVnrQH>4AK))zX%)L1Zv1vNE)QuODtJIE)`S-bDHKP9G3 z>5@O=LJ^#x{PZ*} zb9WcJqu}*_@!SUBMipg{L@`0awE(YU^Uf`f%Tk}uh8cL~zWc!nIvM3Vce?y1o;hd& zI%99LM41~AqSs@+%(xNVuhz6kx(Mqr#@4ANKZ*8LpPnt+uQ+5-hX)t9N#}n6kfhI= z;UDzOjtJVYLi=SJ{(YGzQS1q>c8Y7U`VDUpN>fiSWSCR{PBU9%tb;eG<*D-8ck(!0 zT$HL+J})SwDx_Uq5pK$ON&~FZLr2zmBFNXTnS>AD_|M-Hh~)vQ`=+B9N@06_kSjlDrVfhV7~2_@C_mjeA!`< zw3gzU#Iud|{F{<%pF18XoHh_@RM;d>{#2oM_eh&T%35g@T>>_U{91aD$ ziawKB_^|=o7NEQ{g|^9I^=3J2a-l?1)&`eJ69SoHA5fZqB~P+O~8Gf8~O zsb3}XX2|3UJ=||-8rOtT`SZ9eX^rE_C*T6%pYyXne$ht@4#N$#Oaca~T`J~AN_073 zt+D9FI+(TCf0}OiEXaCvww1|xSWhug>a)l@LdwmVwkTE#2Prgv10nf&oeT9F#Wn<$ zv!~7AhEj;XWbXFCy#Qdy{jkBe{{bB-4adNyr>M3!ZP=n8#FzS}(e#th*#$)NV(_Qu zFcz<`@*%)VA=8YF)BcKjI!G+C03z-U?^dygT@j2tva^w#`bcJa#NO&j3=RlJ#FZck zZpJlt9^*Qr-xU?J4;W7fwS_x+IPv&jwMyUy0Vq%qd=NNaZPJ1Sv^`=bw*^eCm0=g{yD|N(+=JG*Z=i8FN=Fk8gyI;J@h#dm^F;u^q63#+Meo%$FWSw@DSejyJ<6lc zn!h}MHfniXYZfRFRK8g$ZDw;3UOQunbnC$NLS;Mj^*fXrZBNxjNZt{Wn1Pj4oDgyb zw5FtZecu@Muk(pGEtKBaqfs zot_`NeiT0eQ_SRfy@i&@dS8q;l9@U2n67YFlua0yZOgFMV|$<~SLulnjXl*)lZo5B zVxrWE1<)X~^vt%Hdl16Y35N$Wa9xCNq3aV!?OCk}A?}IeT7I0@T0&4U)9JLsz)E z-o#jwKHyJ+1TRn*a20B@J(_&S*t^YBI6qPO6D3?OZnmB4V_UC|2Lms`hAqnW8e4?q z>tYSb{hK@E$Bl#IC;RiOb2z^~ek|ln8IQdP*!VwokQC)>f9K~;wVH^TKB+qSckl}F z`#K7E>eun;&Y1_j2DG3qj`@;S_-#-$GzNl;@*}t&@BpB5W>DScP}F_Cq2jTV3(ZfC zK+qE))}QoyKb@gGlcb1E<%|5V)}Tz|mJ@2AIA;}7mG5*W!qmVlB(#})_;lU*A@dNUV@zAiqZj2r10Rnf6FI>8to_Nh zk8nVC?eD5$DBUX+vF!`NO2yBN5G~ZBCfNW&j~uia@N`q}mA_;=Ivn|Wx?mVaX((vE z_q?8cN5!ER!B`oFc!LgSY-g8JyIeSgES>;*ljGApXNwJ14MGIZ3Z5G)N3(OqgOGr< zJBySCz9f+M`e>0x&NHB?U$OUYX#BI@SiWiJmo!7pVrptnEH1!5kZ4#xdE9$~hby8E zE8!_-K=BhKQOccE71t;Z90amh<~>ZI0Qlz*3N)%8a3NWKhq@-Ri0Nt-O@6n5CXnyP zOL7E#kP^G3ee1?7{iV=~WCU%zqSOW9^w|$c>ygdHf>q6Hi$nfqYt{5*S5WjjC*@Yp45(q_D=6J1~UYB*_Vd;jW6GW5O4@e6UYi)EI2jJ)k@fZA=a0 zs6k>b!d!g*Xd86QU@gd$ ze%iB~U{)$Ttay`!@Mt*FuC_paT}y+fwB%rI@b@_}0QDA8euHSm+GqI7<53M;aV*H7 zV1V59CF?0vVtwE@_rypV$GBWBI%wT} zq+o!m>F+;fU^rK1mdtB%q({~#9i2g1VY<)P(|?kv(fS*mCu@cdnMkkBEFJvN zp6;(`#97p1Og`}2sC_|8IPnaILWggkKl+P+b>ucCRU;0bbdq%Kh&D;rlX@qmlYu4n zeQMj^(DS@QEX`@zD`q=Luz87Aszk&6<5zt8@&}zLgwJfuQR{v+UgwdjU85P;t@rHD z&m#UsfRdEcav72MJ2du{N&|2$pE(Q_n3YPU>-OquCf!`qF8uG)3nJS~MJsbw`ADj) zwrjW{svRai_7t;igA}#k7=rHhOR(On3A zjyOk!zC1@Wm=+&qVbGpw;0g;=VtsXvK4srIBcBkq!Bcw&-Xv(c@_MRS^S)s0aRwUn z?Rc9G@Ji1%mJNONy~_&}qZ8cMytj~-PE}PFa)#fcQd{w ze+RF`EPh(` ze<9ABdk1aoZ?^2Kb%j0yepjMI&SS8Q0@2Bt$VuZ;5WUO>2q`1cIg3r`=oWH~%Mqsm z6kE!*?=E8KIb82Q(nenTBsj|7!eX#vr1GA)brQ3uLCs~yZ*&OXt$@D0-uK!RQS|DI z3;)>11gaCx>sSY%UeOjekl!LFi*3ZRa=N|>W+z%{=&$^bixiK5ztUVd+4vIem;dbs zv5=PvX)sO^EOaxUaRs8_&aeXY=!+&N6poWQKk}8Po_O0+Sa;Iu(kfKH$dNZ?b0arF z6CO}cqxjhezN>?&qf>V>`pIsCD(`JS-O6-Un6#}RT3ADSoyVF<3YB`UG9O!hx0>4K z2@?fuJuWt+qzDBh@ryQ(^L07F8UENV$rHJV=TYE22_IfbopljK?p5sNL$?D|obySR zo4iTcDe3-oXcI-gqSH2KQg^@!&XQxJO4F-LH5tF_VoY&ABa~dKjpY) zxTBu4Tqd2)u)?LkmT=msN}v_w*K&R8 zOCUyi{j5V&>Xu-TQy0JmCeWbf@V zXqJ|B*&m?wGa`YDSwFX)P|&m+dN+`jd^yM^N9+(qNGAd;Y~0z`fq!<3p&R*|P^Ts;dxKxqvmT+hyvco^ zPt%ld={T=pc0SPPHTUzUt1%nclIUHB24$IRgD~0H)ote_Fo7xpkG_*k{J4AhcUTCu zh%*FIzjf`ziVHwjWU0=}b@hOzBxiEqrDInWQuhk6na!*G0e1jYjhb*PcAS6vZ`f*LpKnw^<*smEmi%b?!BF@a>d6{bQmuRew0W~ zN?ILw&#;=FMP_A$o}q*KNIMKsdHk^^IUv@CFevbcP$5rY*@K^szOeLvfXwczCK%>Qj4j-LanU%^CIOZlI_-@8c0SokfF$n;^v>-(FB40h_`X@>xd|IdLGxVO zY7Iv;kbAii23Ws3&)H{_$`W#gh$!=|l(65q1tob03@^VV-9Gc&qeBg!{oif%O?(LqU0l;lxM2!)0IH))VPD>7of z{rXWx3na4QpnELk5bTPu-i`R`35s+^PcizHE54pesGa`8-h?z%DpEy*p`W`>9WwSo zLD8Adrhta*kEezxNvqZ zP@M@Jjgv+nwZ|jTF=Rwy8 z0nl5X8Ti*RLQJG_##L%muMjz_sEG&W=Ebt1Y3WsVCbZ$HIVy}&g3^U3dmA}Y?J!3B z7ARpCQbv4_Qlhe&3smb|8!GuzW1C=Xy#@IUHLg*mz-UU6>L^4I+TqnGGYkKG2dzad zc)`~qoiMOEZyu?bWZ*4dihU?aX)W?-46EWNaB)~_t|+fi7*D+{*y{s{4-Af4lBUpBHp`$W&4b%p$+&u%gljIYE1+QF2EnWB8 z_dW6y!VkArRba9UXx#C+V-sVYVh|OcL|+3GX&M{M(|&t@Q@vg+qB_gJ0B(+F55kdF zh_IokCjm&6ay{(W87QC*q>(s|-ntQHT5G`TW}lmeyJsJ7zm z11~j~z(gkE<5NEofVf>UDn4EmyRE}TWejHmC5oKsiO#d@#6#-RA!sVXD?y&qR^S66 z5BfjSM^1S$USv_^$3)Z77wQvkCM$ZN)sqglS*$H4u+phcb>kk^_PcX6e81XU%f7PK1DP$ z+sVPI4^!YhUxwZr07T6mv*X_PpB`Z)2$xr0Qv`Y1IJ|VePLGhiFtT~^$rsO1s&QA<6fM(Fd`NhS3W0(w zz^K&m5~IHF0%1}U@!XLFMrqnyRYPbpV#&g;VnOTTj-QQN5a@}oxg~dHasUV76`D4`Kb0nV{X>SzWI zDK(80lFZ<{((|%0-MH&e>fW|tEf_{>vjIcz;2xX(JQQ#W?n$HQ%$dL7x$9J|d_HM{e$h-DM;{O}dS>f9U9A4&Q z{O+de%Q=AkZ)+d9GiXdd-=b(eC-NX^$RnYcNF7+o7?3yJoTMws&oBvs=(9-?+bW(Z zg8Nmjj`O`rVf9^lTjxXNUMRckEjWME1^w}16^v4nxzj_ZthYi>c{Qd7pD3kK#c?@V zw#I3o7bH*V5EATF=W!m8B8GSByzh?^RO^$fQwo7+tXut}JhmVJTro`~@qw0T-!ZXy zq5$D_A&^xZZ_}$FSja)*gR2LH{!2(lm(v`snzRI0%M>pdgA*@Gw%udUX6X=6~m7`>^~@8k}6 zSlT(Rt>!XBc>s6)o;oZK@(wzZy+%>1n-bTi&&9TnC>iNfG9-M)t-CJ}>WG{7-Ecs! zy;FVC3j9B!^$!-`2uCQDv_=<#?jQaFyHPHZNp#dMA4j2QF_^MxwU^NE=*QS;AR1BK zr$Ub_VKU+@I|`t*z&Nc{IGRgMLCs$rS|`frc!9jL6WMYzSXekcNx@DBxzT=d1c-f* zT+=C$fWa+fGy6SFX0Lkmh&Y7rzhW8EnEA5KK9=?#v?VJctszS8roWSMyB#~T`CzZN zZ+wdPoZPhlyG9-QjhJEDd0*N(OzaxeygJo?`w=9CBe3%t*%ix$fU0EGSr%g=IQOUsjS%?^HLg*mz;#pC z=BGBaQ9!|2&bymQn6!jOkk~5Q1b&5>6zPOTq^H3Bq*W%WsLT})90Ss%x&7}PJ=|z8 z==V?SF7ttivT{wjZ&fCsamId6l2&0VMFIAyL(eLo-?C>C+nG9Hv)eY*2A7Eoq>xyT zey7G%bUhkdz|86c*?Lx~x$FuFRizb8B%7#7#uh8*+G8|k-quRo8wS|pjRy{{sRp7_ z{nH6~=BU8wO)lT;hrUH#fuE!NDHA+8eqt~|<r5 z91;?7nX>3M;P#LT=VASozY|5w{!KPSFe5$k-Dl?5CE8Ls&n3H(nXWM{8Oe1E#lh4VXy;)8`V;>H#>n+VRPNJLj~hxi@S)(2jXY8c>UV!`ma)*vBm*7H1f!?3u2jWgq4RhJe+L zqmfBx&=)vTwz%~zXKF;>rcYVGJuC%J>nqA733>UWE+>!-!5~1KTQTS=xl*t5v04!7 z1~dU3h4EToJRZxepZXUk!BD*M(M=_^vqzkp^^K*FRBV0TTFRII@`X^5!8C!+f2vz3 zSn3P7o@%SzWUenclXi6W3YT>jS#Kx5==`CexE=-RNSSB-|V;%gAMJ0--_J@&C^ZLw- znQp?#t_GxFrHoDyi=EgzlM}gA*1t+EI$n~1EhbyAgmX*f0H7BXe>-6gxYHMTltEAE zh-!d0KMOVYcYj%>F~O*|JBtlCFH3!=aAbQnqyzg-j8Xhsu5hC~5;DcFQV>i=Ag@lr zNX>Hcc-2p!HTmO-mIg{VZ0r)J0RCdkAak%~(?`q&a(>M&<;oS88#;w`#lB7k7}_Lm z@otwDh=!tKHQ>U5ujtew3(kq~Vcp3Hz$h3!JsWHqCp_u<#cYwiXx;+}NrM|%3VTJ^ z9zXXslQUdfqIWVpHq*t1dh+20`!C3hgvn$L3Y@`~6i-nf9J`B$_BT0udCyQ7tD6l{+{`RAtj)MY3RQ^y^(TcaIl)Yvt9{{SSw3_8c*z zB>-7IstlK*pZqc#sgZ>oO;_D`Wxt!x(f)`7YDtrWX)A?q;Dv^eXpE`}B2GUhyT&~5 zt*oH8wz<%4pBtDleDU}#Y%h{o~Q9vf-F+&;e?`Mg8w$e?3 zzPv#5^u8SN?88b$O{gG2-My%~8WM!5!fIh>XhHri+79NEv?otjC}ekGVck9zVW$HL zBJQn$JorSuh{ZNf@7kgELWeZb>a0A&&?hzHGjNSb)WOlBq?V~Fbw7hke;iGge>Ri_ z5?CRsuMn68b4^Hfi8ka3AIiYuxEW6|oZ`OL3=(HYv{65f6gY4(vdtO(Xni~e2PN>M zK%%N1;*9|_%g$D%;FFK`y#AZJf1Hmvy+6!*H>whl6g;7J;iY8N(>mN^%9y1?58PY7 zJX9G*qsEFp6v=j05hk7Qfv0WDVD_wOctQEB$YS9x?;{e?BE2*igpOH zT1M~jwNh57h@jaQMUT)T=6oG zZh!mJfR4z$==UTuL^_c@OC3+Gr0zoPE}y7k;R#G-O^pUzy9I_OuQ6PS_FmXP1lf1+ ziTOJ{%5b?tuov7sgnS$$41rjBx8;oYGZgp-T+~1+2Yiz=me}vRHSsy-YGTlp0=w~2x3F4p6W`f zP2l@ji5lBw#0fCl`eeEhqYeJs@k}1fhQ54Ug-08?EDg`FFbBHg`z{2N{n#1|@oNAV zIQdB^b#cDC1M5GPTRdBn&;v~FF|Azbgbd$JsGsK?phOnMAg42B*r876T(3hCMbNz1Pc8>2u-YSWc6NlB#Qtw-U`{H^60%j)< zZMi4?oqq(hr%g~ox@8e*AJOmdo7!*O+d;9x2gs6hrS4fZ1R0sDuI#yCd#n- za0t}co}c8$^ApSKvq_)>B3A^JM2nLLPcRb$9gQsMC@*AWE4e-H;LW!ScFrj40>I=E zeSwi7c0x+?LoNcp)yVoAdK7I=tm9W86#_w>O80=uolaK1yZo(Z0hkojDv8`V0QAYf%GiH>KG z!pY-Cn2n*Lo{g-q|6=_yy0>1AxxX2KvK&%3}Gy4D~N9%nT5x!6c#}t3H?MU&|uKQyUV) z@)iN}=xA!uMG9x8R%6LZgIY0~E;Uzno`A*(#COSSsRY@voqei*tsH-s0iogV6b@Dw z<$@Zw9SHQW`kC88v17By)stgvkpFqK+;eR%6^Wjms6$o)tu(!Ew$svpTiSWtD`)d> z_*Acs+)DJjzMgrb>|TFdyc}FP+=eCi{4&tw4-e953UTA7DPvnOE6uS z!CX}W)m7vtH5>}2WN-n2ca8abm19{xpxB!oz8tXJIgsins1&fA)m%;arj+sWww@4S zGXU;m`W@OULfmTrPup4gS;Ua5xVaemRswVXY~nb$4K@sk%qBgaE6+#DEmRhCi>`!k zjcq^f8ZD*#k-%OHa>-xSjw>KJHt85=EDoCmP680I)z=^SyKJYbZ=1Yb zYQTt*g1L-P)pAd0!>7;aSgUa6PNq%5!rZMJy6pXv&G5qjkQpnx;a;B+-?@{I161^U z`v&9Fg@TU%zY@9G87+_`my8Z+A=st`VfHs&iJk6Y(K5_o8NZaYRh)m)2c(Jkxo#Lh z65>zgxb7qKvw9u{JW!CR=iTd&Fcs*Z@<=2cq|~XBg;I90Tx}cdHWVJ6Qj>c4#N!@_ z_F8~TAOsbV32p=TiO-21TAlP@eY~4cD~bCJDVxy~E!b$iXr|ID%iti|zE6avwoS2m zqfAc_r`9{qoeZ0+>03tD&0ACJ0NIRiQVFL@M2K8$Sg#9^_-ag;Pk*=mQwvXxu=;V% znM}1sI??e=_Sk0PIu#5paboE6eJUKdXzqR^lI#A)T;8QnJjK1Q5@mOBS)oQGtQT%( zbHXyf)cX^aBEPe7W6_Wa4y((jOpVVUupX`$XFZiRKP3pE+8kC=d0QcI8~%v5*B`mS zzIfeA=EhSX?Bn*&Ci0@=*unmd+2iX*d#;(=bx-I8zetNAV%cVRoBWztRIg=8v;jC} zEdu34nIo}F93}^J6ID2&R{HghaNA)?J*VY%nFo&9`?h_q-aU4Ny9$8dNi6dmT1=N1 zg7%Nb73T*|-nLP?uub&)Cgw&A^R2jCyLY)b~q%H!jFQM?h!|631wLE)VcvTl9{G z<6y2CzD+jF2YDswwaz^c3M$7XMOdq_a9S=Z-(WK<+SPHP#d5ZZ=8F1JFvDQ_as~7y zDJJs5T?ONpPl$q|SNfAbd)*B%kl|}+H_h>}KdH9arOLSXGJKj4nF*r9$ZCsMB^>9Q zdM8sm7S&%z8b1(Cl%_#~CxD0Z&cBH6mMQd>2gs548LkPMQ_R+#KrzneK;xx^y|&vN zcG09(N3Oi4y7~PYn0*kg0y@=_+I6)EBM|3CX^BOp3*qHjbI#t@T#B-&7y_UpZHYwJ zX$RPG%C-xDCDdSVj24MUII^Lr=OEnsmYTU=_CUIc=k^}41*S<(iCKg&P(x?80_Ksn z>9ha|W>?&W)skH8!YOuDZT~JiU=kt{S3^@Zy-Q*1d+bz03oEiPrX2Z!L*G5q*5Hs* zTxvG3AKd{MPnu(zAU>aSxJml_`i$II5WJaK4HZwDjcK4kgeY?68rm4QHkvk<9k(w8)iZ2YT?H-f`? zPzz9C_cLe0GfgL|GSjs!#*V|lz}PDVO-$N9yZbIbVB^?7Fw1epya}MT9j$26Vciaf z?*-$QzO)Tu3ugF-BzvZQb1=7gufA35GX^w`qi^J!c*#cuU*+~4h!;Pq*VLk#0h`@R z*+KE{IpfJqHt{bdXafvVdNiPY5=m9VY$f6c$EJ%CgQtzv{bYen{>5ZLC>E|h`3#@Y zPJcc?xiW${W5_BaXC%$D(|`>C>(2az{%`Y1g`>NqS(e>((Ze!b%wP$kk7WlCot?9j zmovj8d5PUjXb?fKUC;$5uewGO#fhM#*Fn;nsW8?oHOf;M$WMZ*X$| z77!Dn=qven;|sk#;yc%{LR-)(isoZ4B%0u_eNYz?p@SXQjrvf=uLgkCBia;d=B;l+I$RSrN1YW2CuHK;;%-)9Gf2>nHVb`a zcQQ-)IctqXO}F&IicF$8I{@-n{u$5ExI^tZw`n!^Zm@+_v<#8TyWgZdSn2W4+qu?O`^SHbr{~?%2Al7%~sf$HjMtxZb`8;kK zIs7YvwuBt!ykPUVydnP~m`EVjcjc*zRueiJ#PpHvS)b=QOjm0k=yH=M;c)#mibSnI zfO_X*&V;o2F&VZXjJr25FbwOP38?u0=QEDsnnOmMfdcqIqe9l8jlG7sFaPMw8u|I$ H2QA!yHIw1j literal 0 HcmV?d00001 diff --git a/static/images/docs/oauth-server/dark/oauth2-server-create-app.avif b/static/images/docs/oauth-server/dark/oauth2-server-create-app.avif new file mode 100644 index 0000000000000000000000000000000000000000..a38ed59cfced29c781c521ab2c33dd606be79c58 GIT binary patch literal 24357 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

v0QBWxKO`Yr#E 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 literal 0 HcmV?d00001 diff --git a/static/images/docs/oauth-server/oauth2-server-discovery.avif b/static/images/docs/oauth-server/oauth2-server-discovery.avif new file mode 100644 index 0000000000000000000000000000000000000000..123e7ff34f08d99157cd96b8d80bee6c4b6a7568 GIT binary patch literal 35800 zcmXu~W2`Vt&ovBh+qP}n-uu|LZQHhO+qP}nwr#%Wb${Q}$#iu!P1kBJBX0RFfBC!ha+1c==Ij}co~*#2MA|MQ~$M@)eJ7xiDPfhz;! z|4da2dq?~Kki){>$nHOcF>qxR4j}!%Fcb?Xdz1eK0RVvhw}BS^Qwa7J?iT;^07F1P z{0C?j_BQ{o{{M;q4gdlM0Ej%bF*a~U0)T?zv^4uE7zDzCC19FP0TLIb0U+=PkOv^a z`ha1r>UueS@j~FI14xa-c)O`GKz0myWpZn4bf}*iX=+eDcB6KJEco+l=Hv7g2QKMx z=2{s@;{YeS^=>q7+LzIo$b<`R_T`6*n6*8S@!Koy_X)xOE7UQzHW=h}rd?rdB- zY`en);`x|`pQ#2b7k$+_*!D+NLE9W2;(f{EqPIReueTisa2_~^c~bt2Ck-Ig*{Y;D z;s=bjpPZd;O);PAiqK#-95BiI@>2BLo3um+b6uQx&8(knkD>bs)`VJ5T z%=~w|7k)QsVZ-y5xGyJF=+bB6t^!N;xVo<2Aacnt^+PBYYiAK_+!)L9efp4wO1L;A zvtbjEoj<6+t_O2glrbFO%R{#$wAkpf@<>qkp0hto)$D~hW50j673zcy`jvv^s1&mE97+1H#b8K1;luVHtz6l0-#;C)yo0 zcnEj?T$HyrqLCTCKZwmWSCdvkM2OhZi;X9HhWnKl{MyqBAO7`uGFe-+&r^6li0pQgwE|7y*R-pWCxTaa$Ykm8>5+@ zii!$$w-e@%a^X5g>N97Af2`+lSb$El*(*}$;<*zzxxep5ZN{j+_POPPXgI;mZGROF#a% zS}p;aaN~xqkXXVf@9FrfmDyQ$iZdCssFh?usUI`ex(OZGu3F;9YG0; zFlDEM;L=O28JNRp*w*E=8-w9?xsiV>c5E$LCLb2T*m7s*bn73h%@OC(>~Ys*<(hj4 z?p>M6q(as9$YS&QBK?@$AVY54sPM6OR zN5SZQwlMGwB7l&(P#KQH(2ShBw>vC}&NGTXYD(vPYjZ`4FPZd~?EU2OWHH7@=~E=u zzf^oQc@HInoI#2EUj>kd*P)xSg2tg~y|{EuLcZU0aQc8!&~MdA@!_CscRlv`?f{4t zAXT3sjT+Loh*ACU@qOJiPX72_%hOA9{N1CfWyvn;)XLqKNe@UG%ugB=`CMfPdU`BFT7tz!Q5(kM7%iMpDc)R{Agt`;mARr}bPlfVbaUZTD|;L|r-|NYTV#RX@WDW3<%gS;uk)otf4pjlzK) z2>e|b9yDpW%91q@in8@xv}k=l?wAVyNo<-ng<26KXjByjp4krO8~_4e!u>)Er@*xU zQXR`nSvK-+1@H{e1tgW1ap8P8;RWn({IKr= zPo2z>B#CoHlYCCwl$slbz+EciB=-L$h3c2)@TzmlqocgR1ySESY%-ii&I$$Sko8o#yxr&&i`b-AvB zZmKD>iTgd?V+Y1oHZDg&hIYLzzQeTVl!H0o zAd(!qO^Ad5l>ailBIWorz$<4-2EP5r^^rv-&t+JGB+W4<^P>9FABRdl3p(L8F_}PM zAJxbBmFAri;cNHz-C6}udxhCm4@_TKu{sHJO@Ba*q?~09DqoPnZhCL!9yQVJ}~rOEf|Q*xA)s-gIT6`p5-qk&L7pQxX)!)1z$A; z3LHG!<>1{Ha|#PT(F#9}K8Nf37Kbve;b3s@r%bl|N| zf;#uIx|=^k(xz!Yq0v=op)Y17p8ZevVu^znk9kI`PaR@t5u!J;j$M1 zdg-})aB9%UTyL9irsJWOd6Z<@Txe3FWfU(x@$K%QS|uENokR%9y;Zfkz(LvMPrn0gC}zCw1?PaTLY6c4MvTm zqrXTw;(XdbxY)W1JZcKv#4_EIwJ{pfSP=O^uLdjN`x`b%^-7g)Q zJ<F*|W!ix=P8mK-Gx9ak zVLGR?$uz%}mAu8-Dodl$93kTqbFw2xw4Q)LM{0dVSg>{t2k%K&R*7K@LoG+Udo^(= zdk^NPYQ8z#ap+@*`E?#L0QH?O(}sd;Ui4x!T8V6)(*G8Qc9>`Y-IA2gEpefmh8+w1 z_dq7woM)DDEDkSWWT6b2AK9)P6-obIi`FYM>7co7T~?&qP&9Yxu4u<3o-M1PNqt5` zm%Db-Mqcfrq>?i4aN{~Rv86LXH5DtO5xmm*1qJT{<7(dK@vvi9Jl2=|q?ipEt_4FP z1D_JTIbuZ4&rqg3V=c5hj&AN(y+~dmiH+GhKq44zu(lmx14{08v?+UuGN?)y(e;BURn-#1F@t zR{>|UHUMNoKqDMJY|wL8K9KxFtty@{s2&w>H8Ro)$bh@BOmE879A{fh2_B(C3YHWm zab8`lw{v>}pL|FW-w^@}y2q;5U|lvzNrDQjS7-a6e&^43RWst4En=QH^CCwGBQ@(j zLPZli5Vu*i2dtI}@ox?PI-+^^dv%h|S&2mZc6UzD{dgAXz=HBOI3&En0l@8~;57M# zr9_~l7s5ypf9jxK`l=qcBBOTrPHSX2IOC8u^@5wLOF92cqC5NP>Foq{6TCS3sb5_X zj88Jsz;H&wH#aZQ(cPavO!6j5_pYy8lHRUu3}&v6{l{$?M!lU2*xR}1=y&T#9JpVE zWIi<9O-)&8M96!PeD+3pOc}q#m^)#b(+28r*=jymi_CjFS9^S`Z2F5YdVqaepe^+9 zK?poiqg6ujNGEk5vL;`hjUtk5c_F+%p(0aM#^spaRx7kz^g5m%XgO>t#&`&R?jK@~ z*a{WBY(>aSN~v$iwXI+j|5mskd%$1@#!3Z?-xl$QP&s4J@j^EfrZ?z<0*POyH=S-s zZiKhsF0i2KX)0uc+JakXRFybEV%YIYX$m59Sm_yM0gJxkq0e$added>zI05mP%z%n@vvXkwJh(8~Pi8PvF@%?C z4JxNiLmMsFhj7hq`iFkyjfHx9e=r6(QS<_BA7cnk@|tpPKF%NCEi#Z9|-ia|xf@7CMW^6Xxv?XiadF0jr%nF)hX=X!2R!jOz5Np9QC{h_tsB#aXQq`wfUGjJ_#Fe@)Wp3QG0Xc zJS^;-{nmjnxDRAA2J@RH-3)+w6=lhn`wVf6oFxsu`%1vcD`!?66~k)RT)oE!1)>o~ zpi}g*=^V$A@80TBgc`fZ-kr9|PRaoBzI#2sYJjx%cy$NcI{uqK&Q<-`dOWL7q?%dP zE*yWWFCOB~E@1OY@oTLYs0+Y!ik?Fg^O}ql3>Po`z}Uq;^Yz48Mv#WmzJb|dr{ZX$ z$i*jJ=PtqSrIq{wWK!i=YLWqAstZ*vhE16}{QPy^OF>N4>c2YCG++{T^8_o?DQ7=; zl}c?7Wh!d^Q`Z%hCgcG(wjcLQic%LPNDd^R6~R}6P}@t|(CGERdKCCaNfBr1`=BOz zAz_fg=LsA1Kg&W;WAxo2)=B${k^}^+P)p|qw8jZr8QNil98Od|u*jBPs5ztqijUx# z0z!}1;n*BsPZ)ODaOQq)g_pvqd;n3!E7>#Vbt)Wz>&=)Vbqh?9eThGJxTc-nl~(=P zxG(1YNB$8}y}p-pD(G*NLSxB@ne|!xx8+=+hpUh9y(Jh#u4GgOuxpzVI~Xf>8g@Gd zL@Dy~BIhACKgK|ljQ-+L{IZSKrPdYP>bgF_!Ev1au|K*+*mKcz+f@nN@cX1R7_?Bj zK#7Kgv9%t16jnqF*%(7)6HEWVwO(idAIx~4+E}<*7gI~%JVbZi>b={WW%Q<; zHjX3It6{U$tl=)D8HUd0D z2I!NYsqI^(LN_(z2vb5}Oi~y{LjROIGN74gL0vEA!KvN)pWAvi3az=ds@DHR$+sMV z1#*Y@^H`D|t(kHD_}x#5MdV(l@{T1b@2yVUY^;)IGZHrfLsaJWDbHJ6UiunoG;L?< zh|rNkl{cc2iwUJ*_z1%(@src1;^Nia$XN9p&E|bPn`~Xtd|c~9fMUTf*1jjQx7=bw zJJSDMbL~sc)t4QqVQU5dGjz%?}DQJKvA4dIhL^`F)1YSPT;(wrV0Tru2 zIBmS-9mm!LG*bipI{L%VroGhJ9kNe89-B@c}`H2n@RAFG+;GA*pGR#!(Jp5V4| zNcgRxGKC||nvkt%7kO{XosNIAM!lnMYROLz5|&*`!7)FT(it!l0x{^DsSpjuGY|6aJH`aA_jSQlw+ zH!7Vzd3KW_krk};5T30KGEin)fX2;T?6xQ zP&fvh`TX~~Gx+OCTdm$5l59oo&q{1|e?z+|pk`s;<>9HWa>e-jJ`l2X% z=^HYG5UR;MK}NKCoKK}X$iR+3J{B>8h(^m_bIODZ>0ZCc>S6gLUMG@tVv7OY413`|78EV`#iAhNhll8F=m8On&ehkciC3sK6 z6eLEO<8eFX;!~7s?joy`H4)sHtI<*ac=&IaEKlC0!zZKdl9a6~amKU&^?s}R*0Z+# z!Ryq!;Zs*~4rZ{8)RwF?Q@$Jo{cQXk*CItP8(?zB#wHHkj4i!M%q~^`?#WE8pCSwE zS6SS%wMy^T8Vv&BZ?~hqSsbIMQp!VjAU3=SE~aN!?AHJJC0Dd|XU#U)Nsy zB*W_!%V%4xtlocaMT?_y(3kA=EnUGopa_mw=^g8usb&Dz=1=;A3H1g5U# zv#5Quns516(*@|UogN0SLkd5PH?ef-a?^PH#?Rc1W7;#t9HY@ zL*YfMBP_tn9$(V}ELp&Ky1G%SKsxt3cWXPVwG+VLWNL3l?NZ4!`B{c3%1j5TN zA=~!DT{kXrm!a$Ru?T>w8jnPM<4f#z-~SSLICy9!luO4m9^IR~ZUui%%sb&O&QF^o ztkN*hkFHy?GH)BpBo48rXhhOWB=qDf6>${|7UDjYz_8zd+7Sb!@vEd@I3^Z=!IJ5X zrSf}upe~~Gf@4}bR;*VQNTs^{y-QRZDD@wS>5kpegw#o7)VnRVOi$((nQBzME2=c- zS2=lZt7_Q;G>e7-quS{xZ+zK;*18*sAW(RnA1o}E9B>I;j81MB#}Hz)FI{Cme*bgz z+A1;jh;tCwjihpvC#ET_OJnVR+DhncCZu(oT}HO|4qD}Q-Oeh1;SRhSyVzR=m|uds zmn^O=&Dvx~ECnri(8*MF_W&ynCD}LejvZoH56+{Y1VTZ`r%{o-0p3RrGmfbn7s)L7 zSd@V6dtTgoVWL&uHYQ?==dR+~!a?GEeBQfIrsj|1r|6YF3w5?(VjPr0^=U!rr}jzV z!$pD4O&2h#lz|dDlQggQs7&^VmRms=P;{+ic}d)W^hQv>U`stZ!z#|ZMT=(k0#7W^ zYGYJpfgz8M;f>&mAvJs@!(Wx4d`2OOFhP$c>$wb;p5bK%uW%XE0^ zAW$}x>Ya0x1OVClRaN zsP>jQDwBB~?Zz0N%g?WBP61$2Z%tP3}8;WaAu!yq|u|o4GN1!MB8LgW35o4Ws+_3O61F<+rm;cqLa~2yQ2e4)sJt9 z>heWuA&jtdr3|7b)}ywjije}*Pno;&vcr2;HKp|t0=O@u6${NTdq6EI$j~SP6t+{N z4PJE<2hTKFKblRFETStt!CqqZm7DHgyV?>y?!FBQj%t(u9{?f})UO zEs)(Fw*BVgJ;&{i9{vTl!W?CKd230X8?r$^T-4H@hCB>uJS9w}Z-w^RdXO8KR3yT_P&E+GGOz+SDN``C};s6i06J-#)q zaTy;OBi#_yUdfA2RCb0+ZH~@(6Sw`hoF~l3!WsGUBdJw`l}MSvLC9R)dTcRV`D^io zx%LR;R?TS^HrFv-$EAMn+x@GPxNY!`$A3Wal?ZS*!b-)S@t^7d<9_WV`q+;Rc9?^Z zktC7XS*{;a8T?5nmw)lXk-b`p;YivFsCr_Rw6>EXWDwiwAF(#gV`Lk1CcW| z$aR(x1+d9J?uj!Ye%ZVFRcbB=d+mHnBOW*a6XGE(&c6B7Y(Euv-jeJ206(00k&P2c z&_Ct%aG;NFa9D>RmAVYDn2~Zx?7vcOqm&4>vD{cwB<;quYn;_`xFh7uOX_Z14RHvH zg9^wEkP-Pn?2_C5mSJlRLnG2$!GGeCP?Sl?_p;dg6)493^|IB^-zQpOV zuQ}G-P$aC#EPu62*{jjSHo|OqKNX0Yv0lc%!#kCelKL%8a3DHbL*NP{+TW>T#FP0a z_I7DtzG@`X%Wr*6S~+|)TZsvhICLy}c&r_G2NmwNr1ruMD38n)IFX_z&)fZ8k2?1t zOp&3(jk38Z9k);|@&g>=(hMHpkmU5`hD8vBKq`UshUar4hyS55*DHWktIvdB-4H3d zTeUfg^_U#eve2gUawGCo^1_6dN}mPg^WlZe4+vd^BO#f4kddlD8Y@`FL;lKjnWE0J z1Z&f5v)7f~^N^>>W35_nT*=2!zP@EGH0+p;7jb8sc1qdUaAlSfVF}TDe z&*qe@LUZKOI_n=tNEDpnWj$(25?vYjSQu18wiM%(`ZfTgPkd?d*H9aVSKV^D!zYGJ zS|M3T5)9~j1|x*vFOk3OP6>K7RB$u}cgM=|WVDMdkyeJD*l` z8w}#*eJjNhdeQltTEgj)*0gGLic$oN8{^PpLxiG=E^&FhNo2PD@Rz8hBINeWK{0VO z@zxV%t1CcBH3W1O_}TY#Cdc8sGb*liI&16!OldLTAyC zIBqp))*)aXr2LMHcvTDY7!QeiU*FmgblSiM+dO_1KIi3>(gIENJXqWU<)KVrqZ$4| zUY@|E!p!Cx_p~6~gt|U6cuqyN)JTJL^{kW4cAKi>>lC>VvA%>x6Jh0MHhIJVQfW81 z!r**vv8QRz<%=;;%Dy^HF!4=Mq*Sg}fP)4z`3SHY9qPe~p-yd&U)WBQ|8BlnW<{)t z5UivRbX1DM^7#`;kHfPenADhIo1se~ia4Ts1XvRGGM2awyjKBFsdXWh z0&;$J8^YOOrYt?R#!hCk zNE4HF@N^GNd>!eCHX*#m&aqQM%t<236;Axn+0;CZ44||Sl9!HX$FnMexfMz_N&>?P z5t~d>h#;D1p%fDQfM~DOA53JQ7 z#5cvvoZx=RO_4(}FZ{d$;pT5tB5N|=mu7#)-;0V}MsXDfH#W@a_Uv?q!E>kCbIa`o z{!t?rQ9NXqF>oE=(Iv(45SDLk3c7Z8K zOFb#02P<_mKT}5~_Rg>m@#7d*cS2jiLt&<;fT$cw&QcN6Zt5av`x{vr*Aip zCgdWr^V@eVAO{>vQ3DLXAol_zq#F_75kds9IxFsDL%ze{XU)IGI!z*w^B0t2cW$W6 zGD-&@Jc1l(#7Q=86XV5L&(#$8bp)>e=35YbGG%gto<|M#(WlV`q-5Cm=l4?hwyAyL zmQ+rJZ+h!$0r>XM+GPv(6QUM){TmlBAyecNKs zzaj7ijjVcp1_(<)4Z>ueJ}AKVO3- zieTAa#1Fuv6d3?8m%)&AyP7%COC1&bL0l+EInm zkeT}@;K*oytqJHmwvu^Ypd3_vSKuN~TY@+li+81On@zpe+8bL4bon6iIN*xEa`@60 z9{sf+VqzUwdUxaEf&(UdN(XBz;YQmAY57QJd+kX_F9JSzipMMV5q{*77{Y}8{BfUV z2~;h}p)n}|v@2TFf2*5?>Xc6+;B-eAB)r_4hMW{K!I(>mNmB58R|RBy&(gZ6X|u?E~?=*48GX#as`jRqCPqK zzF?<)J^&DFO~mrm)bozFWOPNAnv+p2dYS`gDT_#USP<>N6M9^{QFGSkVaN=I`#^Mv3fk|5gTf_Rh40f$QOCgzX0?#;e#2EzcJ~oI(gsunz0y; zBNx)0=TYk(|5DVTCPe=I*Ga{w2YB(;L^w0-om@Aw%{gmSl+0_mkR|D%ztyX;?}h|EO*dh(<{=u=jnpXdP}@O16S2H!PFZ3 z=h&V`!Yaiy+U+ZuQSQ%u1_g~f~h4X zTK>}z|Ek~bF6q<(j;t`3=Xrg|B>iX&ySZFb_LJyjSKu8~G)|{Kem47-q3RN)7I{1N zZ%efxMh?us1YoUM*r?Pf9)eAQc?x|>tmnUuHukRwYlKpc`l>YLJ^`lDHuQ^)?N=kR zH%JjPP_2#tg}H^(B%JA&?sm8ihIBEXQs6jc!}7uKXz)bGD!tox$dvk!CsqOXuT>4pBe_{HnxDRb4uWs_Ys5B?mEJh;)Oy|sOy9Af zE)rde^YX6~11_4$JZN}1=J`*%9S%cu5munckWA6Z;5boj9t^$lv(w|&E>)IJGQVGY zt+wt32F|&b0ZZc*?||1$GoY$cynHPZJ*ME%ty_{}Z?Vi!1weFzf($x!0`?Q~my^kK z;mJ2(XX!dTMq`)uN-Qmxy9C_e+R5CDixOUGl}Q6cMIg&xC?g?fgx)iD(w<5yg28oJkX-FY$U92=jmI?5C-%p9F&kHdL!HJ!}%zKpD-`fdU z#WuwxudfX{LV(9ZQtuMTM^*(mqaGFp;f-uvBaQS1VnDv&c!~`sVgv}pfwLVsov%>+ zofIkEfI;4@jzs!CzoRrR@4|_Jfoxj7Phs2wr*o>BKu~E^1YCMdGo;A0MYu;%X`)BE zI`z>=ZO$I>g3_@6Fk$=b{)9#Aqi~UXCLoJ%v~Jw^Ge$zyi{a$pXADI zb5}Yp@s(9pCGB$8!+IDA6fU=wFKmIY22Gr=hn!+j9D?eLQ5PyW&;O>Sbb4sLz4m0> zxw%UuiJwn(!f`RLGOF3Hs$;`JkAfsBx}_(qPd~51?j>R^Z-9)|g<`{)7!)^l0euQ7 z(L^ky(d=I|_83_=JIGG>*GD!@=a?a|<=*XgO18UP)ow<|d%y#R2x9Q#Wo>|PMRy|n$6vx)^zZ|Ui4s(_2 zOBb6W-sritNU;wv!(Wi7@%@}<_ND)sW4Do;Fl%jenzc1I!6OZk9y$l`og{k@;TJNy zF>+uEpLGy{$XJ0-;i|&K;U`FhaxoDyev$8o+? zY`b+W8Ta;s$>rXE@x=kUoVD#&C}|IBO2S{jA+~P2hx^-Lcrnb>c*rNe{d1_{-2d|+ z%A!h~LEbnVY;(4^u0pIa<$gMIx1-!+@5sn5oP-a8wgJOM z-LMcFd&gGMEH>J$^jTppGsH$4UG{`;$e8r~^Ms1EJ>#>XTqe3Xrax$>MeUo|ckilN z2+=3*v$|v(DVwf~#Lu(=b~8R|Bm{B}LD;;@Z%yTxF>O_Je!QUE=?AS&M|9S&B_WkR zXi}`NO)T(?RN4ZT4=)m~UP1ArVSOhXWo2BwM?rIXPi~ibWcf>s@ecvNX(fJQS8J9h zWW0#v3i6JFwoLR#-03h12Oy^s&%X*h=7Uct7qJc~dB;xYfvLK!=Wjh+L|n}+(c(xC$R((_oFCS8i;2 z08Kv78_@2ke4w>ky;gGpbnA-=xr^n}Dg|_&hDA|D3Uw%fP{I-R%es)hp1kL1cfd6k z72@Uoc+}SD8v9+z7c&9?Txeh7AB0dI$5`iJ)PG%yzTC;KKc(4m`U}uegjSU{slC6! z8K*nl=A8yB&!~VKvyj(NM4U&gpd(h{L`J6!6sdzF1sjQ!O~<#E#n2|eA%j#0a=IJ9{@?H z_xEM(e=7%W`MzLjQH208&^tD=H^1?6*?jhtLNy$E|Y14lI6RS zP0n8ROflORe?_z&$DVl1KoBuq@qxM zue#jQL!+_3F-Rv1thg+8XVSysV$%+iiEI42(<_ZC#=jv z1CxNgAm{-S+QW2$1vdcbTIA0<+b5{ZvBiREw3?qbNU)(7!|Q7*)y2bS#|P~tc8PSb zM@9)!c?>f`6Q!W~ps7~%ZYmssFdkJ&0K~ozpm;#t4L_77LD1l>aNnG@V$F%G3n8sw zH&^E*3Z{8ko#>l~u=cRzufx3A0V>|bQ8?1fQ>Wtcu@qty_ekRsHrI;SxB*(43q?{X z7#meeak?{0P+zoLcPtsU_d zT&0X1_v9V2?^BC_OrF51m4y&08ok{cKHOUr_uwA;1#>9+te6v01Q{~uZqEixCbxuG zGmY%0nr->oa^ywPh5we)QPuXNYfuK0h~nO63q!5Ux1eV+>hQiTqkko()kp?xi^mCD zA5%3PfYIwqcFUdbkLpH3>e4KyWgqaBrAiRA4KTMe_?=-UE5(;PPs>i+H`F8>fm6wO z<1ird_jGV4(H`|3YWwaCI1?UH=XW0-sOVdRE+T5LV|~pDGOqesPEC2}=`cu?V4JhkL_qR41PH<-AA>PRmcNI6>x1bc&ULzhK8g+GB(cv+2}+psXEa zQ1-u$r6l^qE?8D+cgQ!WvK+*6FFg^d7hN=&+1 zRp<=Y8`FVw7+&F69(yRQ$Oqa;i4I6i16mg8xSUw1&Y4ZOVj zX!9TN2I&RjUQP$)O^%$q3wmrt>|v#OK2cS+nagq>;TU&(=x(yra4yQd zx041CI@!R|5yxH>Rkh~RAfiEA=4#a9%rVeS!;beIbL-wncC}i)W1NVWLwbw0f1@{f zP!u>eh|@GUSVA9I!`?I(j+j-934^TWk78#h@}Bb$S%h zy$YetG#2HO+;Iq}2C3&Eh{^fvcxjjZeUD$}BC-$pd zIpJXz$q9nJ-{RG`)TPMZOP5ANny0dRJ6w<76{va;qi_EXWwlg0ichrtwSd4jc+9vB zEd_flq%D`^r$ri_IgEL!c^b4_lDvn%hZ{w~(4zB|j{B<#f87Yr&&7FjwoST<`9M9# z&BZ{~aO}&p>m7KAN6oa4b~E8rr}jj1xcua+Ja`}l+c{K%{!G~k*eIkVXzW7%8#<5d zP&p=Ls)0e2tZw-+g2wIx)hHk9V=vg6KI{bCF@KeGQ9`4ws(TwD<3y}TR9wew2mB22 zhz}ydiHz!CPH7|2Dz;$1nJy3(+9KfS+;_I}6U$F|%iy4&uZe{4O7jw$rAv0iKQlyU z*$tNMJi(^vSq4%h7F1ABBkSRY=JbDodT!5E+BZ95WV^Oya`KVq2>Lfw(y=~6O0EBK zE?DvJzs~|jxskq4VkN*>`)fI*TqR!j+6dmnn)x~V^`3Aucd6%f9|DFv{6j;VZcXZ( zV!=mi;V}1dm`1^DG|gc8Aa)3CxV;U@xPp7fp-)5mR}m4R$yN6#gM1DKPdV48q`=xg zfHD}CPWjHVup&Pu<*o$8c{#23%L=%9WS--;$uiWd1!oXTICLRyu(sthQM^JomB6$G zajpey0ulRU4q#n+U-mdRq*hYX0ep|=?>m(>bU+)NWLxl7PS2!P@@KZA&lg-MOWQXzDkMq)F0g+jvh+9!q(FC74i^^Mh4x(= zSOI(y3XCO7006Y)(pE>@IU9HCC72GkDLTdVcpii#bxNQ<*T<_l|<7J`~?&*uac$|9L}?69?M=Sue>;e?B4R4Uv= zFFZOR)sUomxqSx9cDT)r$*$}GDP(=n3s1eA;&l*;3x)<+=zz9hA~e?awd*9&)OXKO z0Ls8@&kkLX&J;2ZMY=VmASSZejWU}PDl)}*CzMzExt4#U;3;D?_Or0bT#M~7;`%-% zJB>0Auk0b#T8RGDlUJ-zty+`W-fPfd z)K-s`3Wh1sz?p`r7tg)-^j4{H^-uV?WUqdH)T%%UHSzfw=j`-^&{@NJEuJ9*RZ&2o zT|U(w&M_P&i2yDaxo5-}#x+_Vk&JD<-2j2DvLz8@|KS*vqkHQ!XRIO!lwzzZV7-$0L z-?Jx5Wh~*TP~x0gHouOCK7^`mi&Hu!(hJz6(4JvkOU>35(6TY?zfQGY;psaJt^V{#^+z9>s!b^`j7FCW{$=1lN5TLqI{i&p2`G0R0fup>gd2R6 zITR*&20AGg3}GGd-;vK$0X63K-iVJ85IwIXs?>4_v!An0-uW9GZoz{JOJ%h3 z2IEC0uWwb7Z|hu@9n!X34dH-W?8)_bHBY< zzO0xX<$%8RO%FWzfTz#FFB_3@sTB2mLR*b~Us?DOF>~e9O_imL8oJfsEpt{en&j-? za0EhKR#j<9e|t4`$ap<_vf~!5KCag@=~u%5ExVd~3T$hJ;aNfzyRG0C&75X<+XTkg zJ4IsEt_y?K$}CdPo7XYimM>1LdNy&Jx%_~}blBNNzcI{_re78ZOaO#jSKO}yhUMvh(@rlZp}JYA9^h&y2BmOAg|NWS6k*QQ(mnYa+P z72&2D3o-QpvHnUr5BvWBIzYw0KXkFo`T1fX)Mt}be0_Nm

|hS9UG9Te>CX>DyjV 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 aA}t4KMt_7we|6MAmw3B28av* literal 0 HcmV?d00001 diff --git a/static/images/docs/oauth-server/oauth2-server-secret-created.avif b/static/images/docs/oauth-server/oauth2-server-secret-created.avif new file mode 100644 index 0000000000000000000000000000000000000000..186bb07bc3e31eed197527f413cbf22249474cb8 GIT binary patch literal 15143 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 Cuq&ki literal 0 HcmV?d00001 diff --git a/static/images/docs/oauth-server/oauth2-server-settings-disabled.avif b/static/images/docs/oauth-server/oauth2-server-settings-disabled.avif new file mode 100644 index 0000000000000000000000000000000000000000..63783ca245803707b376a4368962e7b38d3a843c GIT binary patch literal 21061 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 OI}+%je9bxFFO%fI@)8*U literal 0 HcmV?d00001 diff --git a/static/images/docs/oauth-server/oauth2-server-token-lifetimes.avif b/static/images/docs/oauth-server/oauth2-server-token-lifetimes.avif new file mode 100644 index 0000000000000000000000000000000000000000..8266beb4b4dd02000ad0188e04488cf5a589e1c5 GIT binary patch literal 35339 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 gfaxA!<{ Date: Mon, 13 Jul 2026 20:27:17 +0530 Subject: [PATCH 2/7] Add custom scopes guide and expand the scopes reference - New 7-step tutorial: define scopes, per-scope consent, JWKS-validated resource server, and a consumer exercised against it end to end - Scopes page: authorize examples for requesting scopes, and a rich authorization requests (RFC 9396) section with configuration, request, consent, and enforcement - Trim the quick start discovery snippet and overview framing; split client types into bullets --- .optimize-cache.json | 7 + .../docs/partners/oauth-server/+layout.svelte | 4 + .../docs/partners/oauth-server/+page.markdoc | 7 +- .../oauth-server/clients/+page.markdoc | 3 +- .../oauth-server/custom-scopes/+layout.svelte | 10 + .../oauth-server/custom-scopes/+layout.ts | 11 + .../oauth-server/custom-scopes/+page.ts | 5 + .../custom-scopes/step-1/+page.markdoc | 45 ++ .../custom-scopes/step-2/+page.markdoc | 32 ++ .../custom-scopes/step-3/+page.markdoc | 119 +++++ .../custom-scopes/step-4/+page.markdoc | 74 +++ .../custom-scopes/step-5/+page.markdoc | 142 ++++++ .../custom-scopes/step-6/+page.markdoc | 136 +++++ .../custom-scopes/step-7/+page.markdoc | 62 +++ .../oauth-server/quick-start/+page.markdoc | 5 - .../oauth-server/scopes/+page.markdoc | 465 +++++++++++++++++- .../oauth-server/dark/scopes-defined.avif | Bin 0 -> 32796 bytes .../docs/oauth-server/scopes-defined.avif | Bin 0 -> 30500 bytes .../scopes-guide/taskflow-consent-choice.avif | Bin 0 -> 17601 bytes .../scopes-guide/taskflow-consent-scopes.avif | Bin 0 -> 18144 bytes .../scopes-guide/vantage-tasks-dashboard.avif | Bin 0 -> 27813 bytes .../scopes-guide/vantage-write-denied.avif | Bin 0 -> 33158 bytes .../scopes-guide/vantage-write-granted.avif | Bin 0 -> 30992 bytes 23 files changed, 1117 insertions(+), 10 deletions(-) create mode 100644 src/routes/docs/partners/oauth-server/custom-scopes/+layout.svelte create mode 100644 src/routes/docs/partners/oauth-server/custom-scopes/+layout.ts create mode 100644 src/routes/docs/partners/oauth-server/custom-scopes/+page.ts create mode 100644 src/routes/docs/partners/oauth-server/custom-scopes/step-1/+page.markdoc create mode 100644 src/routes/docs/partners/oauth-server/custom-scopes/step-2/+page.markdoc create mode 100644 src/routes/docs/partners/oauth-server/custom-scopes/step-3/+page.markdoc create mode 100644 src/routes/docs/partners/oauth-server/custom-scopes/step-4/+page.markdoc create mode 100644 src/routes/docs/partners/oauth-server/custom-scopes/step-5/+page.markdoc create mode 100644 src/routes/docs/partners/oauth-server/custom-scopes/step-6/+page.markdoc create mode 100644 src/routes/docs/partners/oauth-server/custom-scopes/step-7/+page.markdoc create mode 100644 static/images/docs/oauth-server/dark/scopes-defined.avif create mode 100644 static/images/docs/oauth-server/scopes-defined.avif create mode 100644 static/images/docs/oauth-server/scopes-guide/taskflow-consent-choice.avif create mode 100644 static/images/docs/oauth-server/scopes-guide/taskflow-consent-scopes.avif create mode 100644 static/images/docs/oauth-server/scopes-guide/vantage-tasks-dashboard.avif create mode 100644 static/images/docs/oauth-server/scopes-guide/vantage-write-denied.avif create mode 100644 static/images/docs/oauth-server/scopes-guide/vantage-write-granted.avif diff --git a/.optimize-cache.json b/.optimize-cache.json index ed5cd56343..f0a14ff0cd 100644 --- a/.optimize-cache.json +++ b/.optimize-cache.json @@ -1595,6 +1595,7 @@ "static/images/docs/oauth-server/dark/oauth2-server-settings-disabled.png": "ad51d531eaa3736839859097c024bca41a28d1339ceef773e376c06936e040ee", "static/images/docs/oauth-server/dark/oauth2-server-settings.png": "18da0340416739f803b8c04d66c191e92e7eafa70cd301acb1e269d8dd5a0c81", "static/images/docs/oauth-server/dark/oauth2-server-token-lifetimes.png": "46743e2f0a3e8c126d590809668a37c2beb1f1c5483002839d9a15eca9e110d4", + "static/images/docs/oauth-server/dark/scopes-defined.png": "71fe55ebcc533a83709394926d8cd8b3735d8f7bab3983590073357f467f7271", "static/images/docs/oauth-server/guide/taskflow-consent.png": "5c4f4cbc6b225c60d5d6e2f1616abe45f0e6b66a5014438961fca98db349bd18", "static/images/docs/oauth-server/guide/taskflow-login.png": "5d0013b31b211efe4d3a2f6a9f224a5b547d3ef1370e507b9a183bb276fc90e1", "static/images/docs/oauth-server/guide/vantage-dashboard.png": "b2e95c34ec9c19be090e5f3384e0c3278dd840059b3f015ccdb13a16c135dde1", @@ -1607,6 +1608,12 @@ "static/images/docs/oauth-server/oauth2-server-settings-disabled.png": "648091d9d81308ab93dd456f172fa1c1977c2fbce9b8aa03893398bdefe10595", "static/images/docs/oauth-server/oauth2-server-settings.png": "914aa6511caedb568f199eacef837366c523f78125c551afa992e39098707431", "static/images/docs/oauth-server/oauth2-server-token-lifetimes.png": "895bf62c7f5171c8f244fda37b516760266c47447f2c66c93c3c812139823b96", + "static/images/docs/oauth-server/scopes-defined.png": "63d9d4bd8bfa353fe8760a4840f396cee6efd8d79351966eadff9659972701cf", + "static/images/docs/oauth-server/scopes-guide/taskflow-consent-choice.png": "27a8ebf167728a50059bf315bc9676e3c5ec9f32f47eb70ea7c4e4715fadbf99", + "static/images/docs/oauth-server/scopes-guide/taskflow-consent-scopes.png": "ad7975be44e1840e85d994c3a12e19bcbe63e4eec5ba4bec9028c6683db3ae60", + "static/images/docs/oauth-server/scopes-guide/vantage-tasks-dashboard.png": "d8f81bd5e0dce05d66d286aa08c57710e383e37c026695c5d97621a4ccdaff07", + "static/images/docs/oauth-server/scopes-guide/vantage-write-denied.png": "d2f1fc73a56e88608109b35905d23a0a8ebfd35f13b21c207f11bab526aa30d6", + "static/images/docs/oauth-server/scopes-guide/vantage-write-granted.png": "6d82810a35789608f50cf27299f506551c5138ae8854b2dc8bfdb71d8f2ceb96", "static/images/docs/platform/add-platform.png": "5a05bb9d75a8d5270bfa5e67df7e6de20a9fad174476a112b5bdab72e7bdad30", "static/images/docs/platform/create-api-key.png": "7661b3845e13704643f8ff4f763faa8e61efb90878c3ffa7466ece0910b8ecab", "static/images/docs/platform/create-webhook.png": "77e08173da6ac534524e025433cf75e532d853a135944a7c6ba2278357d88b2d", diff --git a/src/routes/docs/partners/oauth-server/+layout.svelte b/src/routes/docs/partners/oauth-server/+layout.svelte index 409e8402dc..19949838e0 100644 --- a/src/routes/docs/partners/oauth-server/+layout.svelte +++ b/src/routes/docs/partners/oauth-server/+layout.svelte @@ -52,6 +52,10 @@ { label: 'Sign in with your product', href: '/docs/partners/oauth-server/sign-in-with-your-product/step-1' + }, + { + label: 'Custom scopes', + href: '/docs/partners/oauth-server/custom-scopes/step-1' } ] } diff --git a/src/routes/docs/partners/oauth-server/+page.markdoc b/src/routes/docs/partners/oauth-server/+page.markdoc index b3ec80274e..554ea1163e 100644 --- a/src/routes/docs/partners/oauth-server/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/+page.markdoc @@ -14,8 +14,6 @@ Appwrite can act as an **OAuth 2.1 and OpenID Connect provider**. When you enabl ![OAuth2 server settings in the Appwrite Console](/images/docs/oauth-server/oauth2-server-settings.avif) {% /only_light %} -This is the inverse of the [OAuth providers](/docs/partners/project/oauth) feature. OAuth providers let your users sign in to your project *with* an external service. The OAuth server lets external services sign their users in *with your project*. - # How it works {% #how-it-works %} The OAuth server has three moving parts. @@ -59,10 +57,13 @@ Authorize TVs, CLIs, and other input-constrained devices. {% /cards_item %} {% /cards %} -# Guide {% #guide %} +# Guides {% #guides %} {% cards %} {% cards_item href="/docs/partners/oauth-server/sign-in-with-your-product/step-1" title="Sign in with your product" %} Build a full sign-in with your product experience end to end, from the consent screen to the token exchange. {% /cards_item %} +{% cards_item href="/docs/partners/oauth-server/custom-scopes/step-1" title="Protect your API with custom scopes" %} +Define custom scopes, request them from a client, and enforce them on your own API. +{% /cards_item %} {% /cards %} diff --git a/src/routes/docs/partners/oauth-server/clients/+page.markdoc b/src/routes/docs/partners/oauth-server/clients/+page.markdoc index d5e364907f..9b11a8e2f5 100644 --- a/src/routes/docs/partners/oauth-server/clients/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/clients/+page.markdoc @@ -18,7 +18,8 @@ A **client** is a third-party app that authenticates users through your project' Every client is one of two types, and the difference comes down to a single question: can the app keep a secret? -A **confidential** client runs code on a server the developer controls, so it can store a `client_secret` that users never see. It authenticates to the token endpoint with that secret, which lets your server prove which client is calling. A **public** client runs entirely on the user's device (a single-page app, a native mobile app, a CLI), where any embedded secret would ship to the user and could be read. Public clients receive no secret and rely on PKCE instead. +- A **confidential** client runs code on a server the developer controls, so it can store a `client_secret` that users never see. It authenticates to the token endpoint with that secret, which lets your server prove which client is calling. +- A **public** client runs entirely on the user's device (a single-page app, a native mobile app, a CLI), where any embedded secret would ship to the user and could be read. Public clients receive no secret and rely on PKCE instead. {% only_dark %} ![Token lifetimes for confidential and public clients](/images/docs/oauth-server/dark/oauth2-server-token-lifetimes.avif) diff --git a/src/routes/docs/partners/oauth-server/custom-scopes/+layout.svelte b/src/routes/docs/partners/oauth-server/custom-scopes/+layout.svelte new file mode 100644 index 0000000000..c1c9c5a8cb --- /dev/null +++ b/src/routes/docs/partners/oauth-server/custom-scopes/+layout.svelte @@ -0,0 +1,10 @@ + + +{@render children()} diff --git a/src/routes/docs/partners/oauth-server/custom-scopes/+layout.ts b/src/routes/docs/partners/oauth-server/custom-scopes/+layout.ts new file mode 100644 index 0000000000..c8884f46b8 --- /dev/null +++ b/src/routes/docs/partners/oauth-server/custom-scopes/+layout.ts @@ -0,0 +1,11 @@ +import type { LayoutLoad } from './$types'; + +export const load: LayoutLoad = ({ url }) => { + const tutorials = import.meta.glob('./**/*.markdoc', { + eager: true + }); + return { + tutorials, + pathname: url.pathname + }; +}; diff --git a/src/routes/docs/partners/oauth-server/custom-scopes/+page.ts b/src/routes/docs/partners/oauth-server/custom-scopes/+page.ts new file mode 100644 index 0000000000..33146aab15 --- /dev/null +++ b/src/routes/docs/partners/oauth-server/custom-scopes/+page.ts @@ -0,0 +1,5 @@ +import { redirect } from '@sveltejs/kit'; + +export function load() { + redirect(303, '/docs/partners/oauth-server/custom-scopes/step-1'); +} diff --git a/src/routes/docs/partners/oauth-server/custom-scopes/step-1/+page.markdoc b/src/routes/docs/partners/oauth-server/custom-scopes/step-1/+page.markdoc new file mode 100644 index 0000000000..45505c5453 --- /dev/null +++ b/src/routes/docs/partners/oauth-server/custom-scopes/step-1/+page.markdoc @@ -0,0 +1,45 @@ +--- +layout: tutorial +title: Protect your API with custom scopes +description: Define custom scopes on your Appwrite OAuth server, request them from a client, and enforce them on your own API. +step: 1 +difficulty: intermediate +readtime: 20 +framework: TanStack Start +category: OAuth server +back: /docs/partners/oauth-server +--- + +The [Sign in with your product](/docs/partners/oauth-server/sign-in-with-your-product/step-1) guide gave Vantage the user's identity. Identity alone only answers who the user is. To let an integration read the user's data from your product, you need [custom scopes](/docs/partners/oauth-server/scopes): permissions you define, users approve, and your API enforces. + +This tutorial continues with the same two apps. TaskFlow gains a task API that checks scopes, and Vantage asks for permission to read the user's tasks and shows them on its dashboard. + +# What you will build {% #what-you-will-build %} + +- Two custom scopes on TaskFlow's OAuth server: `read:tasks` and `write:tasks`. +- A consent screen where the user grants or withholds **each permission individually**. +- A **resource server**: an API route on TaskFlow that validates access tokens and enforces the scopes they carry, operation by operation. +- A task composer on Vantage's dashboard that succeeds or gets refused depending on what the user granted. + +The resource server is the new idea. The OAuth server issues tokens and stamps the granted scopes onto them, but it does not know what `read:tasks` means in your product. Your API gives the scope its meaning by checking it on every request. + +# The flow {% #the-flow %} + +1. Vantage adds `read:tasks` and `write:tasks` to its authorization request. +2. TaskFlow's consent screen shows each permission, and the user decides which to grant. +3. The access token Vantage receives carries exactly the approved scopes in its `scope` claim. +4. Vantage calls TaskFlow's task API with the access token. +5. TaskFlow verifies the token's signature, checks the scope the operation needs, and allows or refuses. + +Everything up to step 3 is the authorization code flow from the first guide, with more scopes in the request. Steps 4 and 5 are what you build here. + +# Prerequisites {% #prerequisites %} + +- The two apps from [Sign in with your product](/docs/partners/oauth-server/sign-in-with-your-product/step-1), running against a project with the OAuth server enabled and Vantage registered as a confidential client. +- [Node.js](https://nodejs.org/) 20 or newer and `pnpm`. + +{% info title="Get the finished code" %} +The complete apps from this tutorial are on GitHub at [appwrite-community/oauth-guide-custom-scopes](https://github.com/appwrite-community/oauth-guide-custom-scopes). Clone it to follow along or to compare against your own. +{% /info %} + +Continue to define the scopes on your project. diff --git a/src/routes/docs/partners/oauth-server/custom-scopes/step-2/+page.markdoc b/src/routes/docs/partners/oauth-server/custom-scopes/step-2/+page.markdoc new file mode 100644 index 0000000000..6651e4977c --- /dev/null +++ b/src/routes/docs/partners/oauth-server/custom-scopes/step-2/+page.markdoc @@ -0,0 +1,32 @@ +--- +layout: tutorial +title: Define the scopes +description: Add read:tasks and write:tasks to your OAuth server's scopes. +step: 2 +--- + +Scopes have to be defined on the OAuth server before a client can request them. Requesting a scope you have not defined fails the authorization request with `invalid_scope`. + +# Add the scopes {% #add %} + +{% only_dark %} +![The read:tasks and write:tasks scopes on the OAuth2 server settings](/images/docs/oauth-server/dark/scopes-defined.avif) +{% /only_dark %} +{% only_light %} +![The read:tasks and write:tasks scopes on the OAuth2 server settings](/images/docs/oauth-server/scopes-defined.avif) +{% /only_light %} + +In the Console, open **Auth**, select the **OAuth2 server** tab, and find the **Scopes** field on the **Integration** card. Add two scopes and click **Update**: + +- `read:tasks` grants read access to the user's tasks. +- `write:tasks` grants permission to create and update tasks. + +The `openid`, `profile`, `email`, and `phone` scopes stay locked in place. They are always available, so you only define the ones specific to your product. + +# Naming scopes {% #naming %} + +The `verb:resource` shape is a convention, not a requirement. Any string up to 128 characters works. Splitting read and write per resource keeps grants small: an integration that only shows data never has to ask for permission to change it, which is an easier ask on the consent screen. + +Both scopes are now published in your project's [discovery document](/docs/partners/oauth-server/quick-start#discovery) under `scopes_supported`, so integrators can see them without asking you. + +Continue to request the new scopes from Vantage. diff --git a/src/routes/docs/partners/oauth-server/custom-scopes/step-3/+page.markdoc b/src/routes/docs/partners/oauth-server/custom-scopes/step-3/+page.markdoc new file mode 100644 index 0000000000..dc1db6c8a6 --- /dev/null +++ b/src/routes/docs/partners/oauth-server/custom-scopes/step-3/+page.markdoc @@ -0,0 +1,119 @@ +--- +layout: tutorial +title: Request the scopes +description: Ask for the task scopes during authorization and let the user grant each one individually. +step: 3 +--- + +A client receives a scope by asking for it during [authorization](/docs/partners/oauth-server/authorization). Vantage requests both task scopes, and TaskFlow's consent screen lets the user decide which of them to grant. + +# Add the scopes to the request {% #request %} + +In the consumer, extend the scope list in `consumer/src/lib/oauth.ts`: + +```ts +// consumer/src/lib/oauth.ts +// read:tasks and write:tasks are custom scopes defined on TaskFlow's +// OAuth server. They authorize Vantage against TaskFlow's task API. +export const SCOPES = 'openid profile email read:tasks write:tasks' +``` + +`authorizeUrl` already passes `SCOPES` as the `scope` parameter, so nothing else changes on the consumer. The OAuth server carries the requested scopes into the grant and shows them to the user. + +# Label the scopes on the consent screen {% #label %} + +TaskFlow's consent card maps scopes to human-readable lines through `SCOPE_LABELS`. Add labels for the new scopes in `provider/src/lib/consent-types.ts`: + +```ts +// provider/src/lib/consent-types.ts +// Human-readable labels for the scopes shown on the consent card. +// Custom scopes get labels too, so users understand what they grant. +export const SCOPE_LABELS: Record = { + openid: 'Confirm your identity', + profile: 'See your name and profile details', + email: 'See your email address', + phone: 'See your phone number', + 'read:tasks': 'See your tasks', + 'write:tasks': 'Create and update your tasks', +} +``` + +A raw scope string like `read:tasks` means something to you, not to your users. The label is what stands between them and approving a permission they do not understand. + +# Let the user choose {% #choose %} + +Consent is not all-or-nothing. When approving a grant, the consent screen can pass the subset of scopes the user agreed to, and the OAuth server narrows the grant to exactly that. It rejects any scope that was not requested, and `openid` is always retained because it is the sign-in itself. + +Update the `approve` helper in `provider/src/lib/oauth-server.ts` to pass the chosen scopes: + +```ts +// provider/src/lib/oauth-server.ts +/** Approve a grant. The OAuth server responds with the URL to send the + * user back to, carrying the authorization code. Passing scopes narrows + * the grant to that subset; the server rejects anything that was not + * requested and always retains openid. */ +export async function approve( + grantId: string, + sessionToken: string, + scopes?: string[], +): Promise { + const res = await fetch(`${issuer}/approve`, { + method: 'POST', + headers: { + ...projectHeaders, + 'X-Appwrite-Session': sessionToken, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + grant_id: grantId, + ...(scopes ? { scope: scopes.join(' ') } : {}), + }), + redirect: 'manual', + }) + const location = res.headers.get('location') + if (!location) throw new Error(`Approve failed: ${res.status}`) + return location +} +``` + +On the consent card in `provider/src/routes/oauth.consent.tsx`, track the user's selection and send it on approve. Each permission renders as a toggle, on by default, with `openid` locked: + +```tsx +// provider/src/routes/oauth.consent.tsx (selection state) +// The user decides scope by scope. openid is the sign-in itself, so it +// stays on; everything else starts granted and can be switched off. +const [selected, setSelected] = useState>( + () => new Set(grant.scopes), +) + +const toggle = (scope: string) => { + if (scope === 'openid') return + setSelected((prev) => { + const next = new Set(prev) + if (next.has(scope)) next.delete(scope) + else next.add(scope) + return next + }) +} +``` + +```tsx +// provider/src/routes/oauth.consent.tsx (approve with the selection) +const approveGrant = createServerFn({ method: 'POST' }) + .validator((d: { grantId: string; scopes: string[] }) => d) + .handler(async ({ data }) => { + const session = await taskflowSession() + const location = await approve(data.grantId, session.data.token!, data.scopes) + throw redirect({ href: location }) + }) +``` + +The card's list renders one row per scope in `grant.scopes`, calling `toggle` on click, and the **Authorize** button submits `Array.from(selected)`. The full component is in the [tutorial repository](https://github.com/appwrite-community/oauth-guide-custom-scopes). + +# What the user sees {% #consent %} + +![TaskFlow consent screen listing each requested permission as a toggle](/images/docs/oauth-server/scopes-guide/taskflow-consent-scopes.avif) + +When a user signs in to Vantage now, the consent card lists **See your tasks** and **Create and update your tasks** alongside the identity permissions, each one granted or withheld with a click. Users who approved Vantage before this change are asked again, because their earlier grant does not cover the new scopes. + +Continue to validate access tokens on TaskFlow's server. diff --git a/src/routes/docs/partners/oauth-server/custom-scopes/step-4/+page.markdoc b/src/routes/docs/partners/oauth-server/custom-scopes/step-4/+page.markdoc new file mode 100644 index 0000000000..6afee0dcf3 --- /dev/null +++ b/src/routes/docs/partners/oauth-server/custom-scopes/step-4/+page.markdoc @@ -0,0 +1,74 @@ +--- +layout: tutorial +title: Validate access tokens +description: Verify incoming access tokens against your project's JWKS and read their scopes. +step: 4 +--- + +TaskFlow's API is about to accept access tokens from the outside world, so it first needs a way to tell a token it issued from one somebody made up. Access tokens from your OAuth server are RS256-signed JWTs, and the matching public keys are published at your project's JWKS endpoint. That means TaskFlow can verify tokens locally, with no call back to the OAuth server on each request. + +# Install jose {% #install %} + +[jose](https://github.com/panva/jose) handles the JWT verification and the JWKS fetching. Install it in the provider: + +```sh +cd provider +pnpm add jose +``` + +# The token guard {% #guard %} + +Create `provider/src/lib/resource-server.ts`: + +```ts +// provider/src/lib/resource-server.ts +// TaskFlow's resource server: validates access tokens issued by the +// project's OAuth server and enforces the scopes they carry. +import '@tanstack/react-start/server-only' +import { createRemoteJWKSet, jwtVerify, type JWTPayload } from 'jose' + +const issuer = process.env.OAUTH_ISSUER! + +// The OAuth server publishes its signing keys as a JWK Set. jose caches +// the keys and refetches them when it sees an unknown key ID. +const jwks = createRemoteJWKSet(new URL(`${issuer}/.well-known/jwks.json`)) + +export type AccessToken = JWTPayload & { + scope?: string + client_id: string +} + +/** Verify a Bearer token's signature against the JWKS and return its + * claims. Throws if the token is missing, expired, not ours, or not an + * access token. Requiring the at+jwt type (RFC 9068) is what stops an + * ID token, which is signed with the same key, from being accepted here. */ +export async function verifyAccessToken( + authorization: string | null, +): Promise { + const token = authorization?.match(/^Bearer (.+)$/)?.[1] + if (!token) throw new Error('missing_token') + const { payload } = await jwtVerify(token, jwks, { typ: 'at+jwt' }) + return payload as AccessToken +} + +/** Check that the token was granted a scope. Scopes are a + * space-separated string in the token's scope claim. */ +export function hasScope(token: AccessToken, scope: string): boolean { + return (token.scope ?? '').split(' ').includes(scope) +} +``` + +`jwtVerify` checks the signature against the published keys and rejects expired tokens, so a forged or stale token never reaches your handlers. It also pins the algorithm to the RS256 keys in the JWKS, so `alg: none` and HMAC confusion attacks fail here too. + +The `{ typ: 'at+jwt' }` option matters more than it looks. Your OAuth server signs [ID tokens](/docs/partners/oauth-server/tokens) with the same key as access tokens, and an ID token has no `scope` claim. Without the type check, a client could present its ID token to your API; requiring `at+jwt` (the [access token type](/docs/partners/oauth-server/tokens)) rejects it before it reaches a handler. An ID token is meant for the client that received it, never as a credential for your API. + +Two claims in the verified payload matter for the API: + +- `scope` holds the granted scopes as a single space-separated string, such as `openid profile email read:tasks`. `hasScope` splits it and looks for an exact entry. +- `sub` is the ID of the user who approved the grant. The API uses it to load that user's tasks, so a token can never read anyone else's data. + +{% info title="Build the JWKS URL from your own configuration" %} +The guard builds the JWKS URL from the `OAUTH_ISSUER` value the provider already has, the same base it uses for every other OAuth server call. Since [tokens](/docs/partners/oauth-server/tokens) are standard JWTs, any JWT library with JWKS support in any language can do this job. The API route just happens to live next to the consent screen here. +{% /info %} + +Continue to put the guard in front of an API route. diff --git a/src/routes/docs/partners/oauth-server/custom-scopes/step-5/+page.markdoc b/src/routes/docs/partners/oauth-server/custom-scopes/step-5/+page.markdoc new file mode 100644 index 0000000000..2ba5f9a05b --- /dev/null +++ b/src/routes/docs/partners/oauth-server/custom-scopes/step-5/+page.markdoc @@ -0,0 +1,142 @@ +--- +layout: tutorial +title: Protect the API route +description: Serve tasks only to tokens that carry read:tasks. +step: 5 +--- + +With the guard in place, TaskFlow can expose its task API. This is where the scope stops being a label and becomes a rule. + +# The task data {% #data %} + +Create `provider/src/lib/tasks.ts` with an in-memory store, keyed by user ID. It stands in for your product's database so the tutorial stays focused on the OAuth side: + +```ts +// provider/src/lib/tasks.ts +// TaskFlow's task data, keyed by the owner's user ID. A stand-in for +// your product's database so the guide stays focused on OAuth. +import '@tanstack/react-start/server-only' + +export type Task = { + id: string + title: string + project: string + due: string + done: boolean +} + +const seed: Task[] = [ + { id: 'tsk_01', title: 'Finalize Q3 launch checklist', project: 'Launch', due: '2026-07-17', done: false }, + { id: 'tsk_02', title: 'Review onboarding copy', project: 'Growth', due: '2026-07-15', done: true }, + { id: 'tsk_03', title: 'Ship dark mode to beta', project: 'Product', due: '2026-07-21', done: false }, + { id: 'tsk_04', title: 'Prepare investor update', project: 'Ops', due: '2026-07-24', done: false }, +] + +const store = new Map() + +/** Every TaskFlow user gets the same starter tasks the first time + * their list is read. */ +export function tasksFor(userId: string): Task[] { + let tasks = store.get(userId) + if (!tasks) { + tasks = seed.map((t) => ({ ...t })) + store.set(userId, tasks) + } + return tasks +} + +export function addTaskFor(userId: string, title: string): Task { + const tasks = tasksFor(userId) + const task: Task = { + id: `tsk_${String(tasks.length + 1).padStart(2, '0')}`, + title, + project: 'Inbox', + due: '2026-07-31', + done: false, + } + tasks.push(task) + return task +} +``` + +# The guarded route {% #route %} + +Create `provider/src/routes/api.tasks.ts`. TanStack Start serves the `GET` and `POST` handlers at `/api/tasks`: + +```ts +// provider/src/routes/api.tasks.ts +import { createFileRoute } from '@tanstack/react-router' +import { + hasScope, + verifyAccessToken, + type AccessToken, +} from '../lib/resource-server' +import { addTaskFor, tasksFor } from '../lib/tasks' + +// Standard OAuth resource server errors (RFC 6750): 401 when the token +// itself is bad, 403 when it's valid but missing the required scope. +function unauthorized() { + return Response.json( + { error: 'invalid_token' }, + { status: 401, headers: { 'WWW-Authenticate': 'Bearer error="invalid_token"' } }, + ) +} + +function forbidden(scope: string) { + return Response.json( + { error: 'insufficient_scope', required_scope: scope }, + { + status: 403, + headers: { + 'WWW-Authenticate': `Bearer error="insufficient_scope", scope="${scope}"`, + }, + }, + ) +} + +async function authenticate(request: Request): Promise { + try { + return await verifyAccessToken(request.headers.get('authorization')) + } catch { + return null + } +} + +export const Route = createFileRoute('/api/tasks')({ + server: { + handlers: { + GET: async ({ request }) => { + const token = await authenticate(request) + if (!token) return unauthorized() + if (!hasScope(token, 'read:tasks')) return forbidden('read:tasks') + + // The token's subject is the TaskFlow user who approved access. + return Response.json({ tasks: tasksFor(token.sub!) }) + }, + + POST: async ({ request }) => { + const token = await authenticate(request) + if (!token) return unauthorized() + if (!hasScope(token, 'write:tasks')) return forbidden('write:tasks') + + const { title } = await request.json() + return Response.json( + { task: addTaskFor(token.sub!, title) }, + { status: 201 }, + ) + }, + }, + }, +}) +``` + +Each handler applies the same two checks, in order: + +1. **Authentication**: is the token real? A missing, forged, or expired token gets `401 invalid_token`. +2. **Authorization**: was this token granted the scope this operation needs? A valid token without it gets `403 insufficient_scope`. + +The two error shapes follow RFC 6750, including the `WWW-Authenticate` header, so standard OAuth client libraries understand the refusal. The distinction matters to callers: a 401 means get a new token, a 403 means ask the user for more scopes. + +Note what the `POST` handler implies: a client can hold a perfectly valid token and still be refused a write with it, whenever the user granted `read:tasks` but withheld `write:tasks` on the consent screen. + +Continue to call the API from Vantage. diff --git a/src/routes/docs/partners/oauth-server/custom-scopes/step-6/+page.markdoc b/src/routes/docs/partners/oauth-server/custom-scopes/step-6/+page.markdoc new file mode 100644 index 0000000000..d3e1d724f6 --- /dev/null +++ b/src/routes/docs/partners/oauth-server/custom-scopes/step-6/+page.markdoc @@ -0,0 +1,136 @@ +--- +layout: tutorial +title: Call the API from Vantage +description: Read tasks with the granted access token and add a task composer that lives or dies by its scope. +step: 6 +--- + +Vantage already holds the access token in its session after the [token exchange](/docs/partners/oauth-server/sign-in-with-your-product/step-6). Reading tasks is one authenticated fetch away, and a small composer will exercise the write path. + +# Point Vantage at the API {% #env %} + +Add TaskFlow's API base to `consumer/.env`: + +```sh +# consumer/.env +# TaskFlow's API, called with the granted access token. +TASKFLOW_API_URL=http://localhost:4000 +``` + +# The API client {% #client %} + +Create `consumer/src/lib/taskflow.ts`. Every request carries the access token as a Bearer header, and TaskFlow's guard does the rest: + +```ts +// consumer/src/lib/taskflow.ts +// Vantage's client for TaskFlow's API. Every request carries the access +// token the user granted, and TaskFlow enforces its scopes. +import '@tanstack/react-start/server-only' + +const taskflowApi = process.env.TASKFLOW_API_URL! + +export type TaskFlowTask = { + id: string + title: string + project: string + due: string + done: boolean +} + +/** Read the user's tasks. Requires the read:tasks scope. */ +export async function fetchTasks(accessToken: string): Promise { + const res = await fetch(`${taskflowApi}/api/tasks`, { + headers: { Authorization: `Bearer ${accessToken}` }, + }) + if (!res.ok) throw new Error(`tasks failed: ${res.status}`) + const { tasks } = await res.json() + return tasks +} + +export type WriteResult = + | { created: true; task: TaskFlowTask } + | { created: false; status: number; error: string } + +/** Create a task on TaskFlow. Succeeds only when the access token + * carries the write:tasks scope; otherwise TaskFlow answers with + * 403 insufficient_scope. */ +export async function createTask( + accessToken: string, + title: string, +): Promise { + const res = await fetch(`${taskflowApi}/api/tasks`, { + method: 'POST', + headers: { + Authorization: `Bearer ${accessToken}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ title }), + }) + if (res.ok) { + const { task } = await res.json() + return { created: true, task } + } + const body = await res.json().catch(() => ({ error: 'unknown' })) + return { created: false, status: res.status, error: body.error } +} +``` + +`createTask` does not check any scope itself. Vantage cannot know what the user granted until it tries; the refusal comes from TaskFlow, which is the only side that can be trusted to enforce it. + +# Keep the granted scope {% #granted-scope %} + +The token response reports which scopes were granted, which matters now that the user picks them individually on the consent screen. Store it in the session in `consumer/src/routes/oauth.callback.tsx`, next to the access token: + +```ts +// consumer/src/routes/oauth.callback.tsx +await session.update({ + accessToken: tokens.access_token, + grantedScope: tokens.scope, + user, + state: undefined, +}) +``` + +Add the matching `grantedScope?: string` field to `SessionData` in `consumer/src/lib/oauth.ts`. + +# Load tasks and add the composer {% #dashboard %} + +Replace the dashboard loader in `consumer/src/routes/dashboard.tsx` and add a server function for the write: + +```tsx +// consumer/src/routes/dashboard.tsx (loader and write) +const loadDashboard = createServerFn().handler( + async (): Promise => { + const session = await vantageSession() + const { user, accessToken, grantedScope } = session.data + if (!user || !accessToken) throw redirect({ to: '/' }) + + // Reads the user's tasks from TaskFlow's API with the granted + // access token. Works because the user granted read:tasks. + const tasks = await fetchTasks(accessToken) + + return { user, grantedScope: grantedScope ?? '', tasks } + }, +) + +const addTask = createServerFn({ method: 'POST' }) + .validator((d: { title: string }) => d) + .handler(async ({ data }): Promise => { + const session = await vantageSession() + const { accessToken } = session.data + if (!accessToken) throw redirect({ to: '/' }) + + // TaskFlow only accepts this if the token carries write:tasks. + return createTask(accessToken, data.title) + }) +``` + +The component renders the granted scopes as chips, the task list, and an **Add task** composer under it. On submit it calls `addTask`; when the result is `created` it refreshes the list with `router.invalidate()`, and when it is not, it shows TaskFlow's refusal next to the composer. The full component is in the [tutorial repository](https://github.com/appwrite-community/oauth-guide-custom-scopes). + +# The payoff {% #payoff %} + +![Vantage dashboard showing live TaskFlow tasks and the task composer](/images/docs/oauth-server/scopes-guide/vantage-tasks-dashboard.avif) + +The dashboard shows the user's tasks, fetched live from TaskFlow's API with the granted token, with the composer ready below them. What happens when you use it depends entirely on what the user granted on the consent screen, which is exactly what the final step walks through. + +Continue to run the whole flow. diff --git a/src/routes/docs/partners/oauth-server/custom-scopes/step-7/+page.markdoc b/src/routes/docs/partners/oauth-server/custom-scopes/step-7/+page.markdoc new file mode 100644 index 0000000000..e9bb0f9003 --- /dev/null +++ b/src/routes/docs/partners/oauth-server/custom-scopes/step-7/+page.markdoc @@ -0,0 +1,62 @@ +--- +layout: tutorial +title: Run the flow +description: Grant the read scope, watch a write get refused, then grant the write scope and watch it succeed. +step: 7 +--- + +Everything is wired up. Run the flow twice: once granting only read access, and once granting the write too. The same button on the dashboard behaves differently each time, and the only thing that changed is what the user agreed to. + +# Start both apps {% #start %} + +In two terminals: + +```sh +# in consumer/ +pnpm dev +``` + +```sh +# in provider/ +pnpm dev +``` + +# Grant read, withhold write {% #withhold %} + +![TaskFlow consent screen with the write permission switched off](/images/docs/oauth-server/scopes-guide/taskflow-consent-choice.avif) + +Open `http://localhost:4100` and click **Sign in with TaskFlow**. On the consent screen, switch **Create and update your tasks** off and authorize. The OAuth server narrows the grant to what was actually approved, so the access token comes back carrying `read:tasks` but not `write:tasks`. + +![Vantage dashboard with the write attempt refused as insufficient_scope](/images/docs/oauth-server/scopes-guide/vantage-write-denied.avif) + +On the dashboard, your tasks render live, so the read scope is doing its job. Now type a task and click **Add task**: TaskFlow refuses it with `403 insufficient_scope`. Vantage holds a perfectly valid token and still cannot write with it, because the user never agreed to that. + +# Grant the write {% #grant %} + +Sign out of Vantage and sign in again. This time leave every permission on and authorize. The previous grant did not cover `write:tasks`, so the consent screen asks again. + +![Vantage dashboard with write:tasks granted and the new task in the list](/images/docs/oauth-server/scopes-guide/vantage-write-granted.avif) + +Add the same task again. It lands in the list, and the `write:tasks` chip sits in the granted scopes. Nothing about TaskFlow's API changed between the two runs; the same guard that refused the write now lets it through, because the token finally carries the scope it checks for. + +# What each piece did {% #recap %} + +- **The OAuth server** published the scopes, put them in front of the user as individual choices, and stamped the approved subset onto a signed access token. +- **TaskFlow's API** verified each token against the project's JWKS and turned the `scope` claim into an allow-or-deny decision per operation. +- **Vantage** requested the scopes it can use, and its access ends exactly where the user's grant does. + +The full source for both apps is on GitHub at [appwrite-community/oauth-guide-custom-scopes](https://github.com/appwrite-community/oauth-guide-custom-scopes). + +# Next steps {% #next-steps %} + +{% cards %} +{% cards_item href="/docs/partners/oauth-server/tokens" title="Tokens" %} +Refresh access tokens, and revoke them on sign-out. +{% /cards_item %} +{% cards_item href="/docs/partners/oauth-server/scopes" title="Scopes" %} +The scope model in full, including limits and the built-in scopes. +{% /cards_item %} +{% cards_item href="/docs/partners/oauth-server/device-flow" title="Device flow" %} +Support TVs, CLIs, and other input-constrained devices. +{% /cards_item %} +{% /cards %} diff --git a/src/routes/docs/partners/oauth-server/quick-start/+page.markdoc b/src/routes/docs/partners/oauth-server/quick-start/+page.markdoc index e91f61c9eb..30842fb69d 100644 --- a/src/routes/docs/partners/oauth-server/quick-start/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/quick-start/+page.markdoc @@ -396,11 +396,6 @@ Once enabled, the server publishes an OpenID Connect discovery document. Integra Open it in a browser to confirm the server is live. It returns JSON describing the authorization, token, userinfo, and JWKS endpoints. -```http -GET /v1/oauth2//.well-known/openid-configuration HTTP/1.1 -Host: .cloud.appwrite.io -``` - # Register a client {% #register %} Open the **Apps** sub-tab and create a client. Give it a name, add at least one redirect URI, and choose a type. Pick **Confidential** for this walkthrough so you get a secret to authenticate the token exchange. Copy the secret when it is shown, because it appears only once. diff --git a/src/routes/docs/partners/oauth-server/scopes/+page.markdoc b/src/routes/docs/partners/oauth-server/scopes/+page.markdoc index fc9474765d..0d22ad96b6 100644 --- a/src/routes/docs/partners/oauth-server/scopes/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/scopes/+page.markdoc @@ -37,4 +37,467 @@ Custom scopes are labels the OAuth server carries through the flow and stamps on # Requesting scopes {% #requesting %} -A client lists the scopes it wants in the `scope` parameter, space-separated, when it starts [authorization](/docs/partners/oauth-server/authorization#authorize). The user is shown exactly these scopes on your consent screen. Whatever they approve is what the issued access token carries in its `scope` claim, so a client should request only what it needs. +A client asks for scopes when it starts [authorization](/docs/partners/oauth-server/authorization#authorize). The request is a redirect to your project's authorize URL, and the scopes ride along as the `scope` query parameter, space-separated: + +```text +https://.cloud.appwrite.io/v1/oauth2//authorize + ?client_id= + &redirect_uri=https://example.com/oauth/callback + &response_type=code + &scope=openid%20profile%20email%20read:tasks + &state= +``` + +Integrators building on the Appwrite SDKs make the same request with the `authorize` method: + +{% multicode %} +```client-web +import { Client, Oauth2 } from 'appwrite'; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +const oauth2 = new Oauth2(client); + +const result = await oauth2.authorize({ + clientId: '', + redirectUri: 'https://example.com/oauth/callback', + responseType: 'code', + scope: 'openid profile email read:tasks', + state: '', +}); +``` +```client-flutter +import 'package:appwrite/appwrite.dart'; + +Client client = Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +Oauth2 oauth2 = Oauth2(client); + +Oauth2Authorize result = await oauth2.authorize( + clientId: '', + redirectUri: 'https://example.com/oauth/callback', + responseType: 'code', + scope: 'openid profile email read:tasks', + state: '', +); +``` +```client-apple +import Appwrite + +let client = Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + +let oauth2 = Oauth2(client) + +let result = try await oauth2.authorize( + client_id: "", + redirect_uri: "https://example.com/oauth/callback", + response_type: "code", + scope: "openid profile email read:tasks", + state: "" +) +``` +```client-android-kotlin +import io.appwrite.Client +import io.appwrite.services.Oauth2 + +val client = Client(context) + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + +val oauth2 = Oauth2(client) + +val result = oauth2.authorize( + client_id = "", + redirect_uri = "https://example.com/oauth/callback", + response_type = "code", + scope = "openid profile email read:tasks", + state = "", +) +``` +```client-android-java +import io.appwrite.Client; +import io.appwrite.coroutines.CoroutineCallback; +import io.appwrite.services.Oauth2; + +Client client = new Client(context) + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject(""); // Your project ID + +Oauth2 oauth2 = new Oauth2(client); + +oauth2.authorize( + "", // client_id + "https://example.com/oauth/callback", // redirect_uri + "code", // response_type + "openid profile email read:tasks", // scope (optional) + "", // state (optional) + null, // nonce (optional) + null, // code_challenge (optional) + null, // code_challenge_method (optional) + null, // prompt (optional) + null, // max_age (optional) + null, // authorization_details (optional) + null, // resource (optional) + new CoroutineCallback<>((result, error) -> { + if (error != null) { + error.printStackTrace(); + return; + } + + Log.d("Appwrite", result.toString()); + }) +); +``` +```client-react-native +import { Client, Oauth2 } from "react-native-appwrite"; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +const oauth2 = new Oauth2(client); + +const result = await oauth2.authorize({ + clientId: '', + redirectUri: 'https://example.com/oauth/callback', + responseType: 'code', + scope: 'openid profile email read:tasks', + state: '', +}); +``` +{% /multicode %} + +The user is shown exactly these scopes on your consent screen, where they [approve or withhold each one](/docs/partners/oauth-server/authorization#consent). Whatever they grant is what the issued access token carries in its `scope` claim, and the token response reports the granted set in its `scope` field, so a client can tell when it received less than it asked for. Request only what the integration needs; smaller requests are easier to approve. + +# Rich authorization requests {% #rich-authorization-requests %} + +A scope is a flat string, which works well for broad capabilities like `read:tasks` but cannot express structured constraints like "read tasks, in these two projects only". For that, the OAuth server supports rich authorization requests (RAR, [RFC 9396](https://datatracker.ietf.org/doc/html/rfc9396)): the client sends an `authorization_details` parameter, a JSON array of objects that each describe one grant of access in your product's own vocabulary. + +Scopes and authorization details are not exclusive. Use scopes for broad capabilities, and add authorization details when an integration needs caveats a flat string cannot carry. + +## Define accepted types {% #define-authorization-details-types %} + +Think of an `authorization_details` entry as a small form the client fills in to ask for access. The `type` is the name printed at the top of the form. When your API sees `"type": "tasks"`, it knows it is reading the "access to tasks" form, so it knows what the other fields on it mean: which actions, which projects. + +For the task example, the two mechanisms cover the same resource at different granularities: + +- The `read:tasks` **scope** grants blanket read access to every task. +- A `tasks` **entry** describes task access with constraints attached, such as which actions and which projects. + +An integration that needs everything requests the scope. One that should only touch part of the data requests a `tasks` entry instead. + +The OAuth server only accepts types you have allowed on the project. Define them with the `authorizationDetailsTypes` parameter: + +{% multicode %} +```server-nodejs +import { Client, Project } from 'node-appwrite'; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject('') // Your project ID + .setKey(''); // Your secret API key + +const project = new Project(client); + +const result = await project.updateOAuth2Server({ + enabled: true, + authorizationUrl: 'https://your-product.com/oauth/consent', + scopes: ['read:tasks', 'write:tasks'], + authorizationDetailsTypes: ['tasks'], +}); +``` +```server-php +setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + ->setProject('') // Your project ID + ->setKey(''); // Your secret API key + +$project = new Project($client); + +$result = $project->updateOAuth2Server( + enabled: true, + authorizationUrl: 'https://your-product.com/oauth/consent', + scopes: ['read:tasks', 'write:tasks'], + authorizationDetailsTypes: ['tasks'] +); +``` +```server-python +from appwrite.client import Client +from appwrite.services.project import Project + +client = Client() +client.set_endpoint('https://.cloud.appwrite.io/v1') # Your API Endpoint +client.set_project('') # Your project ID +client.set_key('') # Your secret API key + +project = Project(client) + +result = project.update_o_auth2_server( + enabled = True, + authorization_url = 'https://your-product.com/oauth/consent', + scopes = ['read:tasks', 'write:tasks'], + authorization_details_types = ['tasks'] +) +``` +```server-ruby +require 'appwrite' + +include Appwrite + +client = Client.new + .set_endpoint('https://.cloud.appwrite.io/v1') # Your API Endpoint + .set_project('') # Your project ID + .set_key('') # Your secret API key + +project = Project.new(client) + +result = project.update_o_auth2_server( + enabled: true, + authorization_url: 'https://your-product.com/oauth/consent', + scopes: ['read:tasks', 'write:tasks'], + authorization_details_types: ['tasks'] +) +``` +```server-dart +import 'package:dart_appwrite/dart_appwrite.dart'; + +Client client = Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject('') // Your project ID + .setKey(''); // Your secret API key + +Project project = Project(client); + +Project result = await project.updateOAuth2Server( + enabled: true, + authorizationUrl: 'https://your-product.com/oauth/consent', + scopes: ['read:tasks', 'write:tasks'], + authorizationDetailsTypes: ['tasks'], +); +``` +```server-dotnet +using Appwrite; +using Appwrite.Models; +using Appwrite.Services; + +Client client = new Client() + .SetEndPoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .SetProject("") // Your project ID + .SetKey(""); // Your secret API key + +Project project = new Project(client); + +Project result = await project.UpdateOAuth2Server( + enabled: true, + authorizationUrl: "https://your-product.com/oauth/consent", + scopes: new List { "read:tasks", "write:tasks" }, + authorizationDetailsTypes: new List { "tasks" } +); +``` +```server-kotlin +import io.appwrite.Client +import io.appwrite.services.Project + +val client = Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + .setKey("") // Your secret API key + +val project = Project(client) + +val response = project.updateOAuth2Server( + enabled = true, + authorizationUrl = "https://your-product.com/oauth/consent", + scopes = listOf("read:tasks", "write:tasks"), + authorizationDetailsTypes = listOf("tasks") +) +``` +```server-java +import io.appwrite.Client; +import io.appwrite.coroutines.CoroutineCallback; +import io.appwrite.services.Project; + +Client client = new Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + .setKey(""); // Your secret API key + +Project project = new Project(client); + +project.updateOAuth2Server( + true, // enabled + "https://your-product.com/oauth/consent", // authorizationUrl + List.of("read:tasks", "write:tasks"), // scopes (optional) + List.of("tasks"), // authorizationDetailsTypes (optional) + null, // accessTokenDuration (optional) + null, // refreshTokenDuration (optional) + null, // publicAccessTokenDuration (optional) + null, // publicRefreshTokenDuration (optional) + null, // confidentialPkce (optional) + null, // verificationUrl (optional) + null, // userCodeLength (optional) + null, // userCodeFormat (optional) + null, // deviceCodeDuration (optional) + new CoroutineCallback<>((result, error) -> { + if (error != null) { + error.printStackTrace(); + return; + } + + System.out.println(result); + }) +); +``` +```server-swift +import Appwrite + +let client = Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + .setKey("") // Your secret API key + +let project = Project(client) + +let result = try await project.updateOAuth2Server( + enabled: true, + authorizationUrl: "https://your-product.com/oauth/consent", + scopes: ["read:tasks", "write:tasks"], + authorizationDetailsTypes: ["tasks"] +) +``` +```server-go +package main + +import ( + "fmt" + "github.com/appwrite/sdk-for-go/client" + "github.com/appwrite/sdk-for-go/project" +) + +func main() { + c := client.New( + client.WithEndpoint("https://.cloud.appwrite.io/v1"), + client.WithProject(""), + client.WithKey(""), + ) + + service := project.New(c) + + response, err := service.UpdateOAuth2Server( + true, + "https://your-product.com/oauth/consent", + project.WithUpdateOAuth2ServerScopes([]string{"read:tasks", "write:tasks"}), + project.WithUpdateOAuth2ServerAuthorizationDetailsTypes([]string{"tasks"}), + ) + if err != nil { + panic(err) + } + + fmt.Println(response) +} +``` +```server-rust +use appwrite::client::Client; +use appwrite::services::project::Project; + +#[tokio::main] +async fn main() -> Result<(), Box> { + let client = Client::new() + .set_endpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .set_project("") // Your project ID + .set_key(""); // Your secret API key + + let project = Project::new(&client); + + let result = project + .update_o_auth2_server( + true, + "https://your-product.com/oauth/consent", + Some(vec!["read:tasks".into(), "write:tasks".into()]), + Some(vec!["tasks".into()]), // authorization details types + None, + None, + None, + None, + None, + None, + None, + None, + None, + ) + .await?; + + let _ = result; + + Ok(()) +} +``` +{% /multicode %} + +{% info title="The call replaces the whole configuration" %} +`updateOAuth2Server` sets the full OAuth2 server configuration in one call. Include your existing scopes and settings when adding types, or they reset to their defaults. +{% /info %} + +Like scopes, a project can define up to 100 types, each up to 128 characters. The accepted types are published in the [discovery document](/docs/partners/oauth-server/quick-start#discovery) under `authorization_details_types_supported`, so integrators can see them without asking you. + +## Request authorization details {% #request-authorization-details %} + +A client sends its entries, JSON-encoded, as the `authorization_details` parameter on the same [authorize request](/docs/partners/oauth-server/authorization#authorize) that carries `scope`: + +```client-web +import { Client, Oauth2 } from 'appwrite'; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +const oauth2 = new Oauth2(client); + +const details = [ + { + type: 'tasks', + actions: ['read'], + projects: ['launch'], + }, +]; + +const result = await oauth2.authorize({ + clientId: '', + redirectUri: 'https://example.com/oauth/callback', + responseType: 'code', + scope: 'openid', + authorizationDetails: JSON.stringify(details), +}); +``` + +The server validates every entry before creating the grant: + +- `type` is required and must be one of the types you defined. An unknown type fails the request with `invalid_authorization_details`. +- `actions`, when present, must be an array of non-empty strings. +- Every other field, like `projects` above, is yours to design. The server carries them through untouched. + +## Consent and enforcement {% #authorization-details-consent %} + +Authorization details ride through the flow the same way scopes do: + +1. The requested details are stored on the grant, where your consent screen reads them to show the user exactly what is being asked. +2. When approving, the consent screen can pass a narrowed `authorization_details` back, the same way [consent](/docs/partners/oauth-server/authorization#consent) can grant a subset of the requested scopes. The user might approve `"actions": ["read"]` after the client asked for read and write. +3. The granted details are returned in the token response and stamped onto the access token as the `authorization_details` claim. + +Enforcement works exactly like scopes. Your API reads the `authorization_details` claim from the verified access token and applies the constraints it describes. The OAuth server only carries the details; your product gives them meaning. + +That includes deciding how the two mechanisms combine when a token carries both: + +- If the token holds a `tasks` entry, apply its constraints: only the listed actions, only the listed projects. +- If it holds only the blanket scope, allow the whole resource. diff --git a/static/images/docs/oauth-server/dark/scopes-defined.avif b/static/images/docs/oauth-server/dark/scopes-defined.avif new file mode 100644 index 0000000000000000000000000000000000000000..125cff62c454ef3357739e3e58840cb8b095c52a GIT binary patch literal 32796 zcmXuKV~{31(>8pLZSQEuwr6&BY}>YN+qP}nwr$(C-@WeddpeaIeRR4i{UgU z0LR$T%~sFZ%oy-btjvrV{?o0@^#0?^Rz{9`|JnZufvKUT{r{%|0JdfZj{m3sAHv(3 zIa>XX0R0;Y%`9yU{$ql?0HA;EKY9QE5#U4kj}e)fS^sa*|5?%g5hLLLy#D#>Iny)z zrz)G-+S~p^b~9T8n|}za=gc7BNAf>6R5J%#qyL-$0I+`@c<$eTXlv$b_MZg=5)$$s zpqtrR{a^h5f&lRY1_1zkD6I_j9FYOg&>ZF_UwQq&zu} zEY)&Fy|#>FL;2bpD94VVH9ly(S*bwrlXw1q^{-H=1{{7Q4-^VC3e$96Zy>Qsg`obL zog82b6uaMi5C!ArzVDF5oIE5S#=((A+oQIYttqfftG?+5D@9vRs4bt2A8?5jElfN;DJS~E2vV?r8v-N0q zR;V}6d=MTJnBIYWt5GyVg<7h~Vov(O{>_4;EYUY2V@dev^I#YV3C8|SB%cw_$1%Hk z-2UAj$Nc#8p3MnH6*l7|=fqUt@nT4ONNt>JQdBsTwo3PyzC{(Hz{pp~1%uGRHQ0Go z0$Km%0%Z?eL5(?TQZd9q6qsbDIi+seDTp{l=~^yw%EaUXM+*ila(sxCLjUUw>qbZ z@byD)%?A^~=ghdQSsVHxAi>=QD;`P{9ZdgNPl}1vB%xBc8u{Amp@qVB7f1j47zC#? z!QwsizSZv9<0N=vm`@o(JCDg4qmm<;L6+yK3Azb6fgX_f?2djgW4j%l$t3QRFX}>O zUmJM9X<@c|mW9?_{H8TC%gx4&mbU&yt?Y^5mdNbQA6AtZ2P$-`Eumg;?mGT}b^H1F zc3)QH&bd131!*u#E8xX1E@i1v*|u)fd^Fmv%={V&rthGQ#m0LeCS{jEg^Xm(+XW_qZR*2vCg3<<%=gdm|othSd~`zSMa zle(-WG>hxAkNJ^Yc z4(pn#^hfcagjDdX_?cl%W<{$RwmUhb3LV9A%Y`?VC!|$y5O5KNpL6w=U4BC#&d<5o zBP#IFXV`+;>iL@2Gx827B7yR=#QLX3Kyo2A{RiR6Z1fm-&G!X+B|3_!rJy}9)J=7A z5iJfwR({B&NcLT_Nk|mX)Gvyu{-;wq|H7hAjtMAXcWk5*JSR1+XkSF_S$x_W9 zS$_!k6l%JZ-_js8kO?1djQekPm#UGb@=qX>YSLm<+0_oYy(E~%ebASQ?eK`%T2Mv2 z%H?1>yJ9>1U6pmGz%t$7j?CR+ zlEW!nUyf&>>5(q_EbnL3QftKw)ptv>NYg&P_0)}Jl&XG_V`A#ZsaEy;gH8QX0){S! z+?%*gJu8R(wEr;-6!Z2$ST(x~ULeQTQ+6G+G3`a^t~H(*ty?E}&>9 zvI#DqkK%&pwV~OOo*6VfGWeeELhj2jh!5vgkN5p-m#M{Otx7g*U{>z{0)7PN+ZyLnpD&Ml1WMA#S}*h31E1I zxh|)osnM`$i+{O;yv7#ob0zCJf3YgW#w~w3D81_QnN-NK&MPXMa(4*>dyTZ&Hipk~ za#5%o&7}-x<`Vr1Fh3ey=#N_SZy@pMI6M{L-$@%#!(1ym!2}oRAZz!ytFkQor6!Tb zLnTAnzqASLDtmNM*Z34V;511nLR*+nGsgq4Xa$D?0a2gEdGFm4IcOW`(yH;jT}gPqjn zmxMMzdL0g$9W%Pe{77Z7nr3>(micy>iKq#s%zvf)6H#6BE1F<{Cj0P>Z#0<;`V{a2 z_2X>S5m@a!ngEjyaD5Ny)(aRyVDjQA8ET7#_%T$6kr z@|wghCO<6edytxAl|}m+EWg)A80soP&r#($nLNE-Uqs8)-UQEsGM1e}39dnkL`@Zc z_oY45Ji*icF(6DfdcGK42vprQo>st2m``0hCMrG(mCH2i&Aiu%)gwG5yP*!OI^R!E z!4~qO$sIok9KV<%&>C8U3=PrG6Sd3abRdG%{X@sjYmNagHf353yDZm3-eEZieZcLh z8U|o45--|x@q--A98KRo78Sf${wpdsGbjPe zt@}auI(7JL{58gwC9~Td!~kJdWEYkI};nKu9}rAm0{ zu?F<1+wmky^&VY;^5|ho6@d5$s|--#V1QFWjnK{-DjE7cfWUz!Vjn~R0aj>YOxj-1 zYt3&Ln&LwDDwx!CCTf0QV+GU2G|M^As%BSQ4mrs9=gR;7`aQ0gFL=XX1gAlR1C7sb zC=jnGoa>n)enKT^LJTzL57a_ef{j->hK?EbVQtEFqB-9Avsx|VvPKlX6>0Z~6AZ$y{B;Y)?EEnQ4I) z(A(ZW##^C@wb2-4dLi0oNylJZyVOa#^tNG6q$yhwc?TN0uLv)beatm}b)sx8%W|-& z-kiu9IY3Kpar>v_gH|$3-rEAzmAOLWSOJC0R1_zHDjp{qE>X3?n)~l4vh*lBLsiaQ zI%6P`P|y@2W}K`X(N`LnVa%!%3DL97)KFRr72CSMkOK6+dh*FERDkZ=&Uuw+3QVK< z(v8wS@?dm3^Az|@Rjfv65Yhc*Tvf~G?s#!Tv_9SyUU2nqo_}V)o~~@xGW|7?SAIH90E?3&`-3SoYFcNb1%FW33}dHqARArs6k+0Y}Un+?hzu&}f2Y zThyjHDI8g(di>iiF}?GiCM@nN3?2?rrx7bx2*?#AF1YQGjgC;WwY;vjV5Wt5HTgfzH-4lp~;V2S()z|_NRp3I0Qp=qFr2a z!3mi}hfg>xcwUU9zv1>p(U@*2n{V#ed+=^*gSq1={*e98HRh%SVDaA07 z2te?T{|u*kPxa!tX196hj1esz5AB>Mt*DtQ(plEwccuE3`q}r=``KMg=_jOBC}Di84&y>Flcp>Hc^t;uX__o7R&RkBs#3u4dcdRCc}X4`6cR)-qCXT z-e%CfkI2C}Ez#uP*Xf<;8(MSyx#`p~kDhl1rh09{i~Seoi(r;!V33PXPTDhEKHn|$ z06&8r1pt{IL|=6$UuQe3f@M~YYc|Nn95E+Be$LzPkw{MzF04(iRTLw#9hbrD=0xB2h7TVW z0BW7hYilPvr*jYBdrYsils46stW0&?ZCOzXyiFf9v*jk<)r+ga zplt$>oR~hL;+4R0{{B#{CkL^7v4)Slm-kxRQ8(SH7WaKmN(eVJ=tP&*j7-A?1&O2F zK;DiKaArGvRcH{_#*9zGN3avQy}gnH)cCVSC5WaP@xU}9f2IXmn3qkewT#S};APf)#=M~v<_@osN| z@Kw{qXr|rQ(OBNWL!@eH8{x0;`Fevk%c#|1(_0>bpMl%3EOd%BQ&URw0ZV2bye;{k zb0<|Wb04CatFR?VmcEOZW$l2ce9*R_p`cVP<@S+?tKqOeJ+X|lzYuXOa3>OYSK3u4 z35Z?eo3}G>>e&X)_(W3!^*wrIVtk}g?Cv|1Xk)=bn^i*+?!I=Bw)awK>~7>8iYxGw zU5k9n-$hqP#ty4GWKMiXjz_OchtEcARmM~ILl2>9i!7LWzebCxDn$zJNC~l;Lz|n$ z(cM@aPJZ`-OqQ+T$*6}6m~|r5&LeG>W%crbf=K;9{GxfX6mVE1F{G89%SFYuu*GJ= zBJ``qm~)Z2Ef^&Jrsf=Ty{B(xG@;nDAhJ5XRUDC|kYI6Df|M!ziz~i5VE)&&>-OL} zIa4_`Ys5ap^NwQtS|0MrUza4}HX^&p;X#5WT9yH?cGpWbSEV^zi3j{iWV+IG%gp6x z>yU1{H0u+I= z52C5CeXtBJH4fJAR;$`mW?M0mOw=uW;gW=-k*BSw>a|?3&~U4uNJc0HVF)3yA^gPi zoOp|E`dwo@AH=UdR-Jj|%h?Zbd}I>{EEBXPy_mCiTIdYoAHgJ4+`kp=?OfR@OacAM zChz$ZD*$g%$Z2ZT$bL?Sn8U;!j?2MsX3t7WDN<#|IH{^JNxNvqg@x|)lZ0oZlhd+S z7USTrwn28{tDueq!IVaL!bqTI5d(;6EJji9EJZq>P9%s7t)gF> zr!-F^bM{l0ZA%FHK%YQ(Pk-YZv5fmbzmw4|KVXBtGKOfFj()tPsKyV!%U52Z;5Xq) zfg?s{=E!Ip7a}+=V*HPgB<)sI^LJ!KzkVzEC)>!(I8qA-K2G!D|AN+OmR9|f?m7qZ@>6v-w0L&fxSbn$%GRARYtR8&?@|7HQQs z+7)?GE`--mUTYdB#4;3YgHh?4omU-qcOLsH5l4ICR!VjfF*6(-+xakXcEZhFTB#*A zpfo^;&|yF+VIC#Jz!-aGYWAI%wR{D2% zmG|~W5&a-2BPwnc$t{&hC@p6+VFOL0!1~6v8#&j&LYxy)5GCsG<#7kr)`PtPU zLpFP0JNU#~=F)2502r{?s2!$B>%SyO2OOZ?>|XjIXcd>2KG4ql;^7l7wF>#OR%RC7 zS8{!g5qD+3gmr!Hs}R^B8~e=v+|?$;hJcl#_eJ(F%GYgC>^4>~dCv?P(G`sIGC`5< zj{o7nGEHogp%jElj{w-*i7QnKOkzc~Zcp$%nKU~2e3Nz^O@Q7Tf_}JcB;N?=JqBUx> zuDR=Wu?wE1;SF%{I|c7NprKa+AW%W{C2`Otc4oRFf?jjvf_wWUOK{yw>l(FRW)JGW zXRcrAZti$JK)Z!p0K@YdWk0kK=mvG1%8m9ORh&)7^NHJNHvGJ42E78Wf$-0hJjE6e z7dPS8h#X&B8@jw5lF+KJFHX}}&IN%8wqoi8p@}Us|9VjDrj?u;mdL7=H=xOYdFZGf z@{hrM>%-QEKFeUiJi;|-NtOM0p@gIi=?so6m-C8$aE154;_ZU&&KGy&-8>7*bd4`y z&M}XDGaWjW#f3WwXE-jljO(z@PZrbC*S={Ux6p< z$pM;Y@NL7IA?VW!%5NLyodpKE5RAwYODbwd@bAg1lA*!P9D*qNTL3EceTsht8ZvkU zi)jEX&j3>e_k(st>JNWfI_ootDqMHEN^fMya0=4oY~OHp(U|Qc@0(D7WMHLJe|~(? zf0m4lY#|i+a&a0mP^&Lz#VQhva}BLTWC5fvPjxvMV`xOWN+^EQ?1L8TZI9{Xp%jL> zMTwP`djrJappZpr53Is++;l~0M9}N~Db`1F#5&ZB8ot5LlhOcW+6vkia>;BK)uNv6 zQ=Io=Y;3B{qSRuI;+8q7S={Q0hgBCI6bpq5mv1btNXKLiI5}ZI_oMY79BaeNzsC8^ zY}N%O^^EsZMA;q~V2};bKyWFhUBB^t23{6K6BtFvp0AJE58O3So?_d>sEW>eNuAVS z7Ylq@ho*HGz;oaHVOIp*!$tAz`PA}(?n##yvXmP(gfvAjh$piSyXOkIA4G6OpR_|Q znSJn1D@Kl$=c?6@02V1VY|p$K`!j@)tkuD+WWZRG^0$fVcI|Xy&0SGi22TYra4j`( z=&XQpQoM7dg(LI`=LlT!*-LqCB=qiI^~FL@xz;Vgdg#zisYiEuj@GJnq{QQA^y5IZ zhJ?_~Kaaq9h{(AcO~XhH`DEX;;|Mdd52^!#6@P(S|0PdhY|e#6M0t34u*xYZJg7lMu7HAByip|tSS#&l6!JI|2)gH{)bRrTxt#WuXx04solTxrL8}z!#mMc zhw#oyOj@6&3nEc*-Jt?P^|A#&CT}GMj>;F6$;uP{x$~s%8?-?i5?U9ik-3{SP(}h# zYWG8?Z^4d9Aaaf&) zX$>caA(A?5oqk!Gy>tJNZZo$H(aXfI1niK>QR=rBbi=60@V z^1y$^x)TQqG*)j4VxMfY1BuVegth)Cfs(1?!>kKWME5)34|~h#QH{4oq)Bqjt7v(B z@83P##MpFoKt=L3UEK~jU|;>1>{@{(t+62i@KQ_qD~!)#T&;*BzNRH{E*(dZR}uU+~<@<8)o@(0UXu5I>TteCKff`RoRvW4+a? zvaKWU+91v2dqgF=-J;z!k45hNx zmaZ7V?{X-SWx609Ax(-Z$@kSMQtm4jREfxfQRcVM zQxdZ-)M#CV1B1%C1&WOOg=T#G59=dP zG%K>B_&Q%4ycP&kYXV8E))h!cG>mQpAJ@swP1q||q9hR2)KMAAV{$p$<2tEneXP%y zwj%-lBL9&OJ|4MREy7|LxR5%J3k;i|etuXB35%6j3~Y$u>K)tCN=ZFh5mMj+VHl%N1t1HpDWfr{hQ75uj>#*!*k%VAPY^L@#prdZw)(hL$bZeO-C^^pneK&W>I0m2g&Q^v6;M(CeP zCr_0IYOK6d8iI5ci;QrW-@AcmxRgh=oSET`H2_=a9`{trUNh?#o{fO|g8|y5j3W@l z*+L6LGQmDv#J>WXId^TIvRH3FRQ}3Fv^W&WyTAC?m(O>YhJLgr@TrGOoP*FjF;lYa zWBY|S5y#Xab25$34Ee^5B8?xH1&SY8>T>~*sVP4XNY~|TF~d?EE%zaJHn`9Y;8}95 zU9JA~j;hhtIj>lCU4PnKI5wxV1hDA>hc;xF!XtFY&|wzs>1skikI5+`#Slb#ep+Wm zidb6v-Kzq^rVHe$%)K<(77irALL%vYxeoh1$>3A3wwa=s5&QH5t~+t%xsxonJsl4WPTu29&K}8~ zF$#c7$0DM7ffx_K5CBNR%!|c{nhAaajuzon7!!XmiuLJ;DKz4N{{9JjBus~mF_g8_ zmEA`XuN<1{|57uILCj8O40(0t}{9ijaVoH@abj?BN07=$6@woQ1+W$7uZSKIAs`&Ahhj@v7lzk-Yo z-Mf?vxycaJ)Vt|O`xPt>VeUfj|F*1l^)&U-p{Alb>@~i=&m~wOCsb5?OQHmO4BAHL zFvou2&o7Z~PQ7Wc=fJZv)2j5|#Oj$&6G6UC@Pp~(>k6#Pcw-4d8gk-g`uRQp|5q5F z6*XAps4t~HA3~8;Ym1EjF|T)JdYt1o*L*zOF*N@qR^+yYPt+7Qd@?1Pjz#QBxhOz-D2t0h zu^|yo?`OV$uC(q4s396$S&x4U)qHOK>&l2et{j=PPy<;t+cugU=#5x&R&I*f+lH_- z-GW_&1;J#o0-gYJK1PB(K~H0noKzNuK5yfRT}^*IWe4DK^tSoOEY_M2R7Wwn6vY&O z1p1CDB8i`b*qcc5Ig8Ll{m%<*ooKP)WB}vyBzTV=~(1A0XGkjCzr(X?I|24AsH|N-& zoD^W!h@52)%*0VviKsaxCA@Br*;XJ16*HoWIxLrae?O}5(t=Ym`B{qCGPZ2(t#5j^ z`lJb7nl5D4Pj$@$YP(;Ds`O*i6TDLp{jZpL1%C2H{FhjRrjtH|yL52FkJH*c=^;*C zX65YO#00EJC+L-938wykL~3y|%5XSQ4XY2S+m7;B#t|BT1E1+Rt*i0#al>Y z!@XC!eI7-!p(3tchuDuR&l%uWTFY7@m%x3&_*qb?(W^oEub}zPNi<8~&p&SoYJz2# zM(^J~gE*qXa~JR6kLObL^>YO+Lv@@3d4?`W+{{Jyyqc@QM7r@*%Jx|I6fF?4-4^ft zO<^+YorHPsCtb9(Xt|k|<{S98QuF$_YzvUt7;OzkXM2fq3_wI>x~O|kmTe$DhM?F< zkNbd^G&ljG4-K2C-n`YlB=om2N8tG{i<=uwEXk)&OoduUO!)Rwg=NjhL7XqX z%K>h+BUlQZFUz@4EZ?Vnib22^X$89j)8VO8+vn~8QT!$6{a6eJoS5k?gUMYX=Nz5l z6EQ?TmIj80?SC~6d_&S4x*Rp0NNW4NK^qZ>K~@J-L1AF%-Wk!=97 z8iP!k+%9E}N6WF2wA_H5QF$jbhIkN!ztpt_h(|M)tIgR< z8kT<0jMd;WE-cp#1+f14e*E>C6+4{6ni+>|o%;h&!az(&(RKFXJiRZ}E-$QF8o?I* z5(gru^opb)-5T2^$dyTXtd7wXwoEmeOL}yCs1U81RLLCin>O3>md~~-J`3a-wKU$q zwt8(%6E0J3n0;v$l1Y`CM?uk&tCo6|7JTo@dQ`+Tcb`X6%+Awb1KzIYz zm0I4b?AQg}CeFI`B#&AIW%XdHmGpEXS*w|=Zw?Kqh{B?kWCske0;Ba(v%UR@G%S@N zB2e#{IAjzGVe3_d9X~W77B_`|4b$^`M_C?yf2JG#&Wh_@dH3%#zlKeIq%&K?bhjHc ztWZg}vCGXN0=6$^;V6Z&kXnI+5Brv98Mm;;IMvGY1RDV)cvw~Whn~#Wcfdl;t}ZJv zk4d^+SUxPN#b^^u(wms?c+*)wPu_TK@s#i9RSJocAZm6;yQMl^Bad0#+Og-BsPkNx zK~gjp9dLkE!lVJYo>^&W;ZBx1L{W`pTM5RyANde0x_ulE-;u5ra-?DWs#haA0>01> z#vl_tyrzdMv-cgdXh`3xr}$@ym4HyDT-!SEreQm6Umc^U3v{~RYULUt`Z-Kq5kcOf zscYxV3J#@&s!NX1&bAq^w8u9F7=3X$&1}qI5EVnx^GAf zXq#&zXf3punE;#m=m7`)tHesPBAzYg;szg-)wQyVFG@Nh)B$-O9E%)dQwcG)IHZQk z=Hpl7Pq$ikq2M%qgrs0!1KPLfNnJ@JoPgjUMK>wjL<1WBjMEKTXR>gCh9m)Fup?Be z99`!gHB%Uqc!LR#uSEmYA-2NZDqJqm0_NcD5okF7pc=j$#} zCV(i+Q}Pg9Tw0|@VRzq@aEMx=KP}e;iuvOvAA^vvO(GN;*;H?Yq&NcQ#B? zV=7t%1scBTF{QpHNnKD zQQPCRZDQAlkz+b|=DCMd3MDor0++=r&%ueLY{LHjPQ%(*sNSky^*}fiK_UB!p^Gr4 z3Vdt+D{(@b0kj6+IXX5*xm2x_%2kgwt}HXUs>97xQC2W{c-q!@HO;GmaT><^hXl~e zWZ_+q9OA6Af(v(%9P${85H3AbtlGdC;>Foc5(E$vdKs^^_IE`1tSS+v(pH}%y~HSQ zuwwCo8=gp9P1P$fh=Wy+0U8m%R|y{tx=Z8fEwt9NafAIWwV(p2iSG3W{ro5;{`N1( zJ`!!^{b=^|k@AHElf$zWGV8GAP_iAyhT*N8{dq9>R^fAxNK`xMqjhdLqty5DIFK1f zQmtepdsn&u1+7{-gxfcJZDn;zJW3w;RtW!yvd{MNO5E(Niu^BE?Mg&< z%#)ksh~^aPW@-aeNnX^hO=cnB#HQ?ZCkljJl4r^Q8lz&EVdbx~(7ux^aS5CFYY?hN zX}b}>s7H3M#L}K{a4TCsZi@SNah@;CDQd{o@W69n@Bj`6;(%20s?O)}gG<&Z5Yf4C zJ=Rw>q~|U{)WK(E?yS*h)akysr4430(vudor1LhN0ioiDrhNQ@KI+zAF=js# zZQM(M3`jmCec3&7+7qcQKJAj6bqOxOmg5&FwR0BOz0qHa;*+`g&JD?)(<|beKu%9qqlo>rDW~_&1_0A9B*FIExP3L(jgM(c__X+fzALUo~#x| zU?=Z=FVJr!<(Kqb(ni)+UeQ52ry=L`mpHs(WfK{$ZO(R(E z?@d=o2n1d_%vR&@{Kb=nMc}2q%3u`jPDMk^3pAB?#!qMG99`W&!_?!?);>$%#%_V3 zLr;FKXw(8O8{8VWlYm!c3k6yn0CdZSDVe+v0o6VuJ2rPrflIcC@@wGLdH6Af@N<>= zlb|nZ9J)3ct><5dX{?shSuZq8LJ`5(ims1zeBgM zc}NF-h4Jf}OqzV(n>pL>3Vr?cp0{j_H(S)2#UP?L^QF)d#O)K!05Tv0>ku8E9Wr+J zNxa1jl2}{i6cLSEPvX;PXn!oe{R@tpF@usnl`78XHyFI3=42%t!RAb{v*xu*kl<=; zwX%wIWEe9s?OYTVg}-jtECNy1c(D^ea%`Y84OIYz9Arj%JfWa}HC+%oE4!+V9UAyg zOT`0MQ;RW7dZ#FR6;1s@4g=MmH9tl-+Brgh25=xnK+KE|@Bq){!D*1qwi3s|waZN; zU}30_i;MlD0i(phn)9l8s0=D5WC?Ca>P}xWP#BKLY0g1ym7TF7XGi8#pPf-@Ds=~> zlNEIr8JWh;u?SX%gUw?&UTMEGd*ILj(*A*0Yvq)XL}z><_0OMATlQHDZ#Xc>P^WhR zja|ZMsIm88YB;y7g!29R&2a3{A7)*o;8QA`M!xpAYU{C zg|YWc99fl!QTO6w+*wFCMzaA9Hs;|;bpyd1<<{jS4T8P|OY!cKGFIRc!^3%!Jzbsdya23-AhAFyu1M?n%qMWOU|##g6b$Khfi!4AW7I6OXn!(Z zjS7#$OJs6gqd4(@bIjCVER~GN#(3K~lk}`?sUPEpMB*}vPkH+yJC+gxQz@J+p%K4; zn6NzuZ49funOd7Tl*NmFpeSmGraG}$l_}s-W}>Km*+;lMISC}rEt(W?&W*LhEDQBv zdykO@h5bwerYGj9*pFcf3B7V1v4%m266xIn-HpEVHsOc)9#Rv6ddY-7ncd)Zx;;!} zoRV@*ebS;6M2!42m*b*(MKTux4oS~U=-$MSn{*P~NN}t~5?d6LnGU7oVLEg>g=@9E zpT8t~-49{nxH1W*=xQ2e`hcYf2>4abGE;-Y3>O^zHTGLK-%icd1P-Oga$i};gs`R! z8yOw4_Dh|;w~}jAUMJ+8_sn+gXoJrvj@A#Z5@18x%80~U9SgZjEGXnzm_lu|oD1Up zcYrmo?lZn;C+RezQz!G!yhpD+!QKIJe7{LUOMpq;?x1_50Ed=VB_IY;ccN4G{A-9% zE#L4J;p9WRIAlRDCq|1Yc%B7?t&9?$w6rINSY6o6TCMxzE*p1CMBCk8RrQU5hl1~d zC?(4xV+w?se=>$8RuxBn=OdYndo}*eGQ)Ore!(tH9xOX2+`=xsd`P4cYMQjIY3~|` z+<1P-0n$|jVesaP&|zI41~1d>Jc`Fggj@JCkqpW%{jOYy;iEDi20J`8el!KtqWet5 zgwa15Sd)z{o`Lu#;sMu3^w6|?cY~9P7X55@Zt&NUY0DP~rOs(djm^}3)c!jQdvghj z{}BLj>;gR-kbOR$h$O6rgUg&Wj_u`bzI)vV8b8fO%|39Xz0pXsAnOAN0CfxIUx%{k z!cH&t?d3PgiJ9Ujx}i?2fuN?>%O=ix8J>1Ye}jHvg3>vU6d@Mc9g}(_qG<&Rko5xi zt^@(ofcH7^ENmeOLc;{>>nlG65B>BMJj1epm%%mx7#~Zkqn~uw7K(Isv76)ZzLISS z31iMB7eNHqc_PI|0kMsm>h`|LU}t*Qb!jbKs_HE;=@#>wbGbp*a_lvz3=#11<5y?d;eT_;2b2LD) zHY4zTNQyA=tGY%jghjF9?0do&)Q0)%kPooNTTFiM(&(@N6kCIpK~@iA9)J+e9ENwd z7$&56Y@KW4X?E#B>x;C;DT-~8{QH=;y=k#`Rw~rbc!emb!^NNT;Q*9iZTJGG*3H00 z2Xl^X%R$SlC`S&AbPI(dp_ZiaZhG=`PkU5Cc~8OomP4Y_Q8!Fjh#Z9Es)|Xxd@{bHaZN&+ z!@#0@o`(g{yI+w25`QQy-+w=;AP;K%q-(yr*eD_UaQ-|s{T=M66NVOEWG%IIg(NXOU@KUICK=apBd|=|jct{3rr0>@F~-(>rT6&# zX9IlEV8bcUXKB(|&Vl7Q8zR#dsJ)ade19_AB(Bszr6qPqsFv1?Y5y)t`)2r}{je*A zyQ0Y?_@%M7bSG|fy@?51Y@B53_7(Gbk_4s#X~TbiIx^VtFR1D(*4-J?rRGx44Tq;d zzkXz=zgi`X8AC5}gBF!P$EC!AbumGdau*5C3th`s#5_}8Z>TQ*ze^a5gkdZKzez*~ zeb!9iPDWZ$7&0Cd+O_yE?UCPmWW$#SWchIA3%REr3j$MnL;P9y5HI~|-!@yMz0@kYM-S8j;B(?`Fmq-PMWpt@R1=M8 z($|c|z9-Wo5MD+E2;wo3S{yDSIlMp0SL&p;6=E<5`l*uh_HlEq)ee01WR5^1$+@$k zek-_2(?B_Q<%-r|PZ)&}H|Q%P(lZcjxi+?yi9)v6|>pP_EGRv*pQ~ zp$8WZZp{R=5w4yVi5oZK6hgG3BAu}!3+KVx)(kFDJ}JeTIYp(KCm;Pb`nDH(E$eA$ z^%uF0jywGOg%2+dm8(@`*T#~Ox^h%71DJ1f&omURx(|!j3R8Uvyyf*q6zWK&J6L2}YV*H(9y&}3b|FMnAO4gRgHgz{Jdus)YbUlh)g|9$dJabLw)1W|;` zFleNw7(i#OVT%TxQ46|RWQAJYGBBHJ^^HNK99UYn{rXg8`%<>`aoowWGq~gp$J_O~ zQK&2u*$2A{4UDPn{1#+BQj~gyw3x3BUd;!|8*elQV&GD3cFKFBho_1C_i!BI?0#mZ z4n9#Z9T{9cR>4*fCuKmb+W&p8$o%mB-_vKvNuCh4JvJN$cxW&*oCD^rpe^d~baloL zU6z)m!e6bd%D?kDJjhC+%9mLsCF_36X!S#F><|tpE;}o-w^TI{k;70GR zfe5*{#*zm@_-S6LBN$CYY#@D`EYJZG8wrzrMe9jWKtA-%B-MZ*H%5a;@Imh|NWBz_ zr7q+L&->O6IBb1FZ=?&HMXxMtO&mYQ1~M_I!ol=g4I?D^H4u<&4LmQ?SeQ6fgmr3n zPth&KhKNAXbIL=!A;q8KB#Ciik~#@`Kn9`Snny2_Q+|Z+*`BEI@GS-nws~U#HV43f)d4rlZ4?LiUUoS83NS z87A2F$;%P9A!(MQnW!Tcn0I}Vq3oOn)`QR;NDN+fa@gJvA;rP_>f^t=YsM`R@%KZw z@kunxxgA0Y^HwuJlShZlx`R10@aE`Q00}_+&5e6aOn_<<2Uxp}0zLf$-N}tPR0j5T z|G5Us@h#g!$a&fpAXA)5Nr6iwfn)M=Hxm3&gT*1f&}=STEG)mD#5%NIcOP}~HPx82 zj+h2E6Lf<#}|6yy{IEIgT~Vo>Y;QuO(tuV5{if*-l7msfn475c zQ6%aialaqL_NumvRw*F@wc@UES2=U;81>zApwx;Z6s@)r+k|BPEWKpy`GEm)!45w} z3XFny<JH=NI;{-GT@H&u7pMhQe`BqMS>XTvHl5=KAp5>!EQThh<+Dfw6@qmDuPP(&4>!g*3eAH;4&| z_|V!(crT3oci^j|F}~{)`+KQINtmjLKhvXD4gmt)qDs^Zd@mbC9+kp4rp$!%FPlP2?&cZVrv>ddC zW?k8=mHc5KwB}^EYW0fNSdFty`q-d1c1DN5w9}$RN~vt?OCoKD2;VWO6)+6^lICiD zG_=b_!uu1&XOuIaUlKJTJ&4sH4Fr0(9J1hz9$GsTgx^IK@+vzmMz_s-SmQGf(a%)( zmhg|^eP*L0w7dpBPFp8_I_*MWMui%M;;&stLOj@i1|IH#qiI zPB_%HH;~4<3^ir?g*P-zw`PwAPQcUhhY_=?$ag=Vyu4Dh-=}HyZDIjJr>)k-nC94m z)U(a#TC>!h$+IWVS;ULx!MHShMS*7{=mv-t{^h`SSuFD*s1H`itg8j)Jgj*CwEcCw z_+}kpdRc>)F<*Ojum(4zkURn5VS*wjSF1;#FMxF|)qNuRyv8<>MPs-la0wte|E+T)31!!|F#|V9nynUr!y*x>Q#R* z*m;-JEgp*Dp~9po)5Gb>_eZQk!kzC9~6njM35T%$$Di~*S==h_^;jyY{t;>ZOz0etT4msLOyI^DD=#a0M z6e0A#;jq6bhdNR`-0#GCH=LbuPwORsj4$P~b=1fj>(i-m2FX4&XLj1xu92oy$yNlT(?$M zTw2wOl+WX7)~kq>CCR5w2N;{Aie`(iqI#oK7b@>(_NN}FDF+e~H$iv{^3{9Mq?8Pb zfb;Ku5tuuSO$qv0=Ma#4CL;&Q|9j8=zzkxRr01vSnYw!SRG=+u-&ExV( zhO^THn}8D;REw^0zuX53DM2}Kw67tFvAlkNbhIuDt3|@JU;SuZNQexnGvCNn{ShwT z+N8rT}3fb#@dKGB!1!N_X zrbz%t7LqjO$`nSvmP~ScQwxjH)9{pQqS0$nKKQf}WsU56i$GH(T79-G3Tj$QX5f7W&~7^&S_;U>R6!$^ zPKyO_?=Wy!+0xOCP4fZ-S%c(8`>XRQ1H5N`8 zr74z+Y3p!t@9%`u!`Jn0T*13`vaR5KP4)wr@e8eT(kN@&`Y>wzwT8M<8s>^O#r`QE zgr^J;=pHejYM0CQ$|#C%TIVPq6_LZL!RSc&QE2VEtkc|kUAu3D%Db!Mlx4QYEA&sR z4Nfw|Ob}CkBh~A}+_2C=0CQ(b1C|*_#QNs#uFnDUM^h))B$W>sX<&AK1PM z@kl0-Tc9!c8kc;w02m8>roM>rSq3|eqXQ_n5Z~rZvvz}e_PBX~3S}5-Xa$7zMW0ZH zJ$1H zvVkTbJG5+NvQGYWdf7G)-oP0Sku|w8Z{9L1&~F$P_Obw(rW{sjE}lQKmXYHkHc6 zl<=ZnP53F|?&;igV_KQi(iWT73S!))H~Sx(B#>iBkF*`&zB>SSqzp_j9v9rM)ar)S}=^ZRM7jcfpl26=K3Pc3@DYLa|yrT%QV@`9U$jqYk*zAz$^jz&^Ml!F zwq^Aee6Y|Wq>Sev9R-E$@uHT`THN*Y@0gW>n_NE~5m6ObIcvPI4!h!RIa?6=6LB`d zCmA?A8`x;2&BM%1yecyghleskXBFbvDJRhA6}2Zgy8{$5IM}elD0q}q zB6`O9?De-?8o1gl#_K(qbPkZh>ixxK2yUfr=^5wwh#EX(X4)dM`z+A1TBQhPbpWG; zR=>El+C+c-y=L-GsLq>FWN&ICK9Cse)H$+ko3e(QizeILLe=eukIjMOH@8W+r9Ao) z)tQ{d!^33sXc+e!LV1n)Zs+v9h&Y@2x;$>4r&SN{seuriaD8mUtQ1`3EYGpOG@q9R zL6N#z55--9WZ!XfHT+;Hcau?Zu2#&Rx~{~C5TDzvU8MmOKw@<3=hj)n%!X z-N8OAjkklLhA#gfwVIT&$DsnWZZVrW3DSa0v$4yb5srI(V`0DkR93>6!;z){GmJqP}g=dXqcRt9T@aDJS zTM>|RFAq~~a?VFnQBR~_G(u3ows}xFB|O$weB@ZD}C_*;eb*jLCVWaXg<99g`Xt9RkNdG5q_;58{$ed2J*B6&I4? zp`RqgOsF}Vt+IuaS*ojzbWf}ej!(WZaIu^IR#JI%UN2kjtezuK#V|;41%0iG2o$5p zQjVF)4-XjNK1}E$8;K*kRPKYyjkD~AEVJTPY#NDzF_-*|pX(cwG2x7r4at#uA*lv5 zXu3li>=BE8$xRs|8B=U7oZl^!$l)+0A-p`>U=>G!S2q<~6$N+@hxZ9GiT)cnHWz3S zykifuN)=q+TtUM)z*1>VEiV2q2Nr!w%O=ZLjg~gGu6+#3on>7TjCQP*$ylq%TjWfZ z;*RvcJy?G;F?-~I$kPROf<1j)h3aSD)xSmS2ChLQr7@rHD!86icx%{G>HU%{f6tcyWxLCsuJ#SlD~y8{3bCldvj%P{<< zt-g56$2fdwp!Lh3-ByN$paVd{2~sw1yPx>aOt1?bW5XVyPfFzYOjPDJw+LSBJGr3> z1G^(ym2pa4KJfMP#m=#yaRpIam8~Bnnbpr*QV=_sdgrB>r$*8#0KRz77ee5AL!7rq`_V0EHeY`4S3L%YLgH>P;Dll!_0 zf)yM^XRg**GCiN;Cfs)h$g0_-f3#0x)~aEd9N_KNq7G$gg-TG7+NZ^zj{ATPLH1gJ z%~+-;R=RMDXP36Lnf0I#;*rjTM^^c~@)ma{p&%Sxq74}qwqJXWf9-D)XX=!ceY=3k zAwV4O&yr?$#ppN9nM=Q0Zl>B5i~2+XyKsD(<46T^?>8~Id1ku_&JPiQhY!ld@tDm zO;CG7mpE|BTqnPGWveII&^`k6JZB^dPgnnMl0HvwYP~Nr@36XJr^?!p!8b}}C=D&o z@tVBHV-4;_O={y5B%mvxuRPOLm_W;4h$rP?f06ST@IwF8361IC&#H1NBXl!b;u(R~ zv}A6GU5L1Q#1Zx2a$4Qqj-@Vc6v9jpcmiKyTzZgewej6z!!y<b)G*yBHH1gig&KWNSX4 zDBo^nu~OA)lX96Ne+?f5TObaIx`hKtBn9`H)&{_YH)8ju0g3dm3Tj&)rBD#*HBp;{ zCVnmm+DIyA4;;va*oJ5c%_t32F=6|dI>3e-+b|KZ-uHvxOzjQ2b%7p*P+K`4n^+el zk!2EMmMJ*2Pv$y&M-Xzd(&1A%wIr09sDm^>{lnLD*Fj%JAkRL+*(R(>Gzy0rUru*a zDBnnNL^uX`h@rBaAnr(xE6}RzV-!;Ks2XN{<3gmABcP)TB~<(&r#{kqKd7hz0`?`y z^h!V|Mg{o{HLg*mz-URikXjbDmPQB8F0p#XOC?h2Xb|Ln!&b@IU?ZLGUMv>@lY|EJ z(a!FKV;-qCz7SJ_ zN+2`qKMw>?y-}Sn7Cp2EK_PdMK+q06W(PQ{RLKz32#BlAVlQL;p0~B)$7JN*YpD7o z@Mf&o60?qDdUYj@-GfC$WP;|JZU?P5(7PtY@aH>Ni8>)+BMA|AG1vUR8f0G0!i0-5 z6~7ChPpnce%8y-7(<_Zr+4=F8Mab*Bnr>hTydWM}f8nQX|A6f4@>Ivdm^D#kSI#Nr z&^Lj+-Tn15ED-^inyo$F;=TO*{J9i;a^*b)ao8nVQHiEHM%ud+GbOQrM$MTGC6v;l zf>*KYy%xsSA1pu1bTDL>sgQH_a(Z0a;J^gZ_-Yp1B<6gBgh^hnm$5Evn$a?qy%%Rxe}W1P zpzf=k(g6S8l2PVFTs=tTP?l6dW$&I z$LR@26$MIxEU#GMTPqYi5+TX(S{)LfLU>c=fmciiSbZ>|I40w*SF{dHoHT8!s~=PE z2ItscfQK}k3!qaB@p{12*{ufwhrNXxrQIIf;A<9AveQcR&gB;-e(Qi=1} zG`qJBE~4E!)AQTHyThCA^Pgy{54<4Mx=jx1H>U(&MLZ9;G*Gy;PZ0l|*U#7=yB1Ss zYbyLl%4ybC$@qomRB|~#6No$;SnBL!GB+m+0nSj+ZzOOiI^85H z!kDhF(k6V-UO{|9AD8+4P$zXT5k!TeZ|&D|nesNXRs5lsWL*iEncf(^X`wD=<=v*& z+$YNFhe;a!21~&OKr-z+myy>V0fO`M>{wZ&h-@dfe-Nl*6D12irY*iBk11dB^a8nc zZnQmFVZQjifxA?iYsRoV6Az3i6$ZA3IN~)T8bxg0X-d zT8Ct`?Mka$108Z6t!@^2YBFHP8~;$#!{P zMk52I64Ma*3^lG%rNDJl*XFYNh(s%d;D04TrysOcWuXQyFJdT=y5j=GP8)E%oQ9_E zYM@MWqQbESf1wd1z1aMdDjC0{f+A98{{`9$M zKl~=H4{g88=5u_6XsgeP|NkRzIg1d2_Et867aLR~CxnPA-Rye?wGyY0fTl@Abz>YR z9!MgR|C%x|YqE39KfLO}SCzZEA&*>=j*0y9_6GmSjop2gt%z}l*V#N(EA_SA*>Q65 z%=3J5p%?CV$^lf|J5IXB!`V?;L|WX*oE(3tr4e8Z<{6k6;l8zd6rB=#&0m0u7M=&S z?$E+Api;4^>65#8>wC@gS#vc}Nj?6m-0WxVenu~iKK6#FrbLzz4RQ0rU`ENZ9u7@F7zC=|r=yk5|M7K6{(^DFRKFYaTN!VD9FMv~3M*u5JSFnB~Ioz712S#|&F{JD&{aj#p z9nCvxIN21T3GSA5_ch9#6DHaX?FP*ooDzylu7nK;%pr+9vsXn?(m8W7z+tBuwt`W$ zzO3lGDcmi%Al^v`s|qd#s9$G2cw^XMbfFohX!{d&f&$5fl|@*HFS`rsZlQvB$(>sU z{!N1j5YrtYmfzz>{=t0ud=TNXt)tV6M!px{Ht^cY09B*cA&nvYV*obt9e_&`okt@ZOVzwG@6+4j<+F?mC~_Fj<*Oo z<_pEQIy60fNNew~zp|V9rPw^+ExZ2udlPZwpSiA?M`y(N98;LA5c1l6K{xy~8(Dv^Knj^Hoz-AEF&2cOqLiyB# z0#EsFkfw|EAFr=Q@z4o0(oggr_xx-dr|@6eq31jHHLe{U!}HW>CD_%;z8@@B=&um zbZICBt&it*mCGUMY}`qCov5o3@#rcD-Za7u*6ZcGkF}RXD{SX<8LgJzX{wRs>)+o) zu^0X!)Zz1aK&#GRG+X7RHg@>~PPFT9R{xqh*yv9rCL}*uy~nPDT(2QQHs0HKBbd(T zdNkpiibqrOuWuV6^*G~n4!-%-C!WuE4#|Y{;5kpoAoljZ9iG2br^mUn|5T7^m?#B< zEAy^W#{_W7Rey})8zDyF9?$YzkCX3K@03;JmeF+}g@T_|AhHJ72H66;jmJvv()ZfWruz84oY-Ys@J+d4)zp zk7G1Agt8VE$&tE9%q{n0k%@|21x5Q6oI9LsgpEJWbRUSPuaR5-e&o@KDdA?bA5#Bq z+G5l-D>W-nbA-aPa+4aNw;a9i;5Lg;Lp#66ldeeDV}y$`(IKSP?%qTn`-h4^dzJy;aEac)Swas6Qm)m4u-)Em zcN}u=$cC@E>HDIo)3plEndwm=-f&j}p2uOq;5=z}^6L9$m~06ZOGPDj(K{D7%v_%Z zuS(8D?x1$SY{7*f@b{Hz`ypREqdG`lPa2Y#D141KW>SXOi zSh%KsVYR7$bevNketPs2r{&o}Oqh5&^-gZM&iC>USVl5SPBZK$(k$9snEwxNZgLk5 z4vQV^RLjO9=Qx`H7d9cxh_?v5>_PgJ#;Y07ZFb~W8|9>giU7_NZq@0(l`ChjTVq^f z_#kqXgEeh7^MI4Stepdpb@wad(n~{Hop@J&`y@wv>fe*RO`c7;z$0U z*G(}Al4jMta5!$geEEuMX?V?l8o9;a!AS^z9;*E)Zr_JSpPP^f8nHlXAXk|rrO+y< z{8d&u3MOvGm8NnfP6V9DC)9SMn%|=V2e&{TJE(^}g<&hFh(&XfZEvNzquHje|rfq#u6lBoK^l#;{ z+(J}vTX>MP^I`h_cX3wd=XFXUm}65Vk%!`Q8h!(EGKqOUwiOa$cjK5*b?|(_D>Qjq z6kx&|75o5@0NS_%k(6WObG=#ac!zCVh{IVPV-Ut{rRe}@|GrDbv_SPpp&D#}75SL+ zebB>xx+j6L4B|VITjatWm9OP5KM^i4P1Ir4t*K%VQu=$1L#`-dPCNqy&mZ5`Sd&U1 zOtJ@+v^ivlM`_Nll@AXzA;q0QB)-3y7*tHD+OMNh*) zuk^7dgv?y0FLKmc8c=M)UMfSk5E*l$S9+-!JmLe+4v6I^(pmG< zV`YY#((x9)iXSfjAHiv)#o-?@(@MaM@6Q6xcJu^tKvQxKUE3X9(_1TJ0}@D=V_eG3 zrX{_T4<|n8vd&`!RK?*dJ)=aHAzSjW^6l{69#yGKS&L>`i|pOda^=Fsf&Qg;fM1na zH>;Jf*hK&g`^i>498Tc`4!vE39>Qtg66C_GnHQ>NFMdaHmJlBdb=|16!Nx-QE-JkP zzyHb=6=8V91dga`OEJ<(Sz4{$S#FMh58g@L~#H_Dq2Y; zPKCf2_Q@(<(F@ioWjzw_f;HMn%i81P!J@3hCR-oK@ERdURP`y7Hp(7k5D)TCNa3z} zllkY5bWdBl$-9}Goon#)pgl6nwQ?b3nW-?VBmf;4FR}4&bNyMalA+EzQha(H;g~D( zb9`5#CWii8MX4+p3jn)Zq(C0%C!w&AikqmdKsPZiODO1}iMXd>FP^uBDRVG3XxFrG zg;bXO-?i5y8P@5A1(+c^C|Q5hMQOiq-_}E?9SV3CRMjinPr!_W*?A2lwPg@ zG0W0Q)1|R*)7U092=yrX#d7_W+sUX`w>&Tmkt9MS%d2q;m3^Y{i^W)`=-E?=o=l9G z&Jb#d5fCK3@#S423ux_5N~LVo{16DF68J&xMbQ3fgSpb|J#gqsI_b5oC6E-f@KgC~ z>QF3 z*B+lxh{CP7XSgy$cQ)m!CmxS>MHcJu2Rf1XbuF=#<>r6O9i*+fa$Vy&4V`LqWtp0F z*!nw$wtQH=gb&J;%TYY{to(bZ@(h_vNAX5uYB$1S5ahZ?$+YRN#qrxhHSn@!UrJ{( z?1m>=&c1IC8f)vY6gd!gRxO<+dPA(Y$YG{WXI$3;>w{n;8X^^ALICM7fJb!2K6UP^ z-Y0@tX2JxwvLOD|(RNk0i&|IHmxI3{deH$Z8U2XPWS>&GP40g~*Z;!}a`BqUbF8#R zOZus-TeE3K*@`U6knLdXIE~9o16g_**2HML8`h7FR!4k@-Nk@b=jfcIZTM zl%B<44KM;Q?%d=#rP(cczBqfH|HE-=#)jIVwcDWVYtdUU0&uv~9Y;qdQ2V!=L`Q_Q zZI2+ivI#s^42m`)b=>$tGT2EhsG!riD!wRg8)p5W@%Piv3(%0Y#GsG4b+X9JG-Xf> zC17WeD;2@!&-Ep*4BQv%a;r9ONsRvN=l(L8emh(Q;SomVa;i7-7Dd>Y1!h5^bzt`1 zf&8cw^wddiph=7OT{fd*m(1VIHtIXvx9p{wLt@g;MQ6fEhd#v5G^h#Yc^=vf77%We zWBF(JVuDv>=IlqMMepd5nb~?qma1}LCECA2XKcm{_Ji>**QnDVB@ay!1RWPEs|gz{ zGZb12Ss!R*m&vVnN6tFJX`ulFgH+Tdpea;W&}&^NA;RpswyOLRlHoQW zefHT!hq6s3Tqz<}9+s<6_;AyURRU}`(4CD*ENX^th*{kbOA+K3MA=~;nNqI89tjCS z-tiU87XEWlx#kv~FFw1^SV#%TcIOVXr{A5Z1|;R{)%pO$hKS5Dx4@WQVTNiNg)LU# zU@;(z!opFdF5N^Cg$>alcLZBs1s(Y(K(=d+JDG(*9j_amGNP>}>q^VMnKth)V?4p` z@00b$_@6orB7TF76mpwc#uzf?U`Jw-{}O=|g+d*28{Dgv_MXQZxX=18FQB#q>>ZHs zm{M@Q+9i6iy_~Z9u1ZYBi$kf1KAE~nzw(>-f*r#3-Vzp-Los$~0s=jU()sVor< z_fX7WZro(6I0C7-!VSpUd+vHnnz!mBL$l?@U3IZgfIVtDD?#NKIXfvm@)lT(wx`-5 zR@aw<82R{3u)n8g*fb=Wp2vw3>YttAWgMKUGaR5kc5QUFDG^4~?Kxj(!}S4(ZM`(- z7W`ds+86;@$buf^4-7?D@`x*}IQGW8%D)5fciK)o3yWoBY7S2;6>G3^zMIUdx7YwY zQU}ra$xgFscps#v%QXp`)3{ahy-0VXxht8)p7ucPI^_f{y9)%iN5m~o9rOb?M3y6T zTev8Ph-}9ArW;s8-7XszfCDj~Oyro-1Sqf;>2MiOk%%LLyPQ~oEMV_lL|_?vH=^y4 zk!oTRZ)!a1ZUeSbVw}ksPj)J)E6CppEy>m#sU&116BursFz^>wMSoJPuPswUXgSTP zkB!PYCJHwT+=oOAd!e#=@%q4L$}e#D^m|d zHPtC(-=R^izij)i^)_YU;wf@(vClrxy3|2TFHF51oFAljh$rTG!`jvmEjZ7-EcpU& z%km<)PpJ@9c|i@B;L!PyN52oA7w5+HY??B0zmSDzhQoY4<%24h(TIS8BV{#XNXeLBy*l zFte{E_rf{SCdIGFYH*CL+A81Buj<<13>&j)q37M@jtQZ=G@O+IMEe&W zntNf^&uN0xuy~Q{9AMvE)hzLocV05>VVwV}-0!){0Q~v-eDH-K+`dBf?}72y1nY-) z#Lnr#ySW(-be7V@z%>~l&AxCHmZm+Vw&d#x8#Sb!D!A^0pWqcdHi0|sOh{Oyl%}>z zwu1n87Kpt@Bno}nnB}QR{)7_D|2`U!s@aTS^8dvfy`-OCLS<(+A5MV%{Qn7UqbA5^ zcJN#m5wq;agGaHIHxhTJb>AyiQ7%52D-TXr{>eYHj>z7DimM-S|N3qEw@!YlteK>D zZ%OmOL1v2sqQE%oK69yX=M*S>;hIq^wlUFU%L*ZBHmc&i?5I2o5>Ll~TJ!!Sm)?dy zO*2r*Ae~_DBj-cT;7^l>ZrnVMv55CM_^z6r>T1f*BGH}^5M;^7MR+7uT=wA3U}&sm zA47!;8Q*%F3*_tEv@vFMX&D=DbiOo=CBNkoc{|{|bks7smtC1`=LTD-F!b8c5d;~? z20+MQ0hDV#J=>OZg|Fqbe{_F}2`XJu13w~sJ5Oqfr!a6f5!w(ltwkZc;&}?Bue~>; zB5ZlpMsgA(t*`A9?2^v2SUxQ#l!!^gBCa`MDZQ<=IAOYz%hY!0Pfq(4RL4DUJ=C}F zhgr|(|1QMDVIZsBxoezUB91$W_heVg!jaXUw{xXN(y#?I-S6>qoF1+k1f&eF7&AlQ zqgZ|S^KQ}qw8&i&$^gA}+C_%r)o_gso3Fg909=^Qw!N%lJ5sOXtJ)N|Rl_y=NJgiIw@?AR1pv&}i2m6RHnJbJ-HwaY02d zlQUtNyqgLZMH{p9@xbbd5;8K|!EFTH9J7jeEJu7Lp&_u-5O)FaJA)|xNezX+ttiCT zdO9+<*a>Y;%n9pu+TFa< zUI7udPb7W>;)_JRJfOI6C7JMA1clXf#h76^Kv#5QzXa~00g`+o)|?{_bYzibuys9} zvHs$2D#i9fo`B9Ob=Pq=Bo5tBk>S8@Xwu^TM9?Z4BadzObYQD$a(gw}TWW^jj4V@+ zX^Q(5_*Gjj0faMks41dSS={veq9FzrpZxdci*~MRgd|d-w%eV?eDjLS-^XW*_Z1JN z=P#v{UkF%9gaNnCo@vv8y`mvVr{{)%E^psi0hgeefFDl7eyk$0F`ogBaMFy{(3T@t zBjRTzjoCy{2DjP2vYgX8BqW)N3Pzted@gLY>SFYhwU9~Jn2{5w89kG#8JIlQ66Lq$ zKS@&YU*D4=y0ktz;mfJcH>Lk=KQsZKz+=AHYqnf{yq&pgj_5h^PFTqaXI5<0N;XXI z4MQGCMN@6A#kX_Evpl(TrZB`+j$DeSG&(%8KVuEN+SpIC5EV`BXKls$j@EoaY*_d4 zftmHD)I8~#Ca2bNi@LXTm{#|3sBwl9=U3Rcm-!8Aom01F*l_XcStMQfPil^Z5`t?E zjh|h-dVHqZ01A;5H%3VFRA|f%8`4wua(KEn9Vb5C>F2MYK+ch=MeSUuJ8?KMBo@4U zBM*zr5jt*8PB+;7XeU}2JdM^{aUC7OYa{n1#*+Lq#(cv(6>sEc#}}}rkfV`X#v^7J zifL0l)Tdq}Dlx4OJN8?xlc0t7f%u-4eJi~@=-)n2KBH=S)#$^>Jpj;nW%o?Mv5jp! zbVM^#Uq-gjk;Slg?V!i$ZK@3~iVH34$ynnMwR6par7=5?7EUWSS9Q;NrFTb6gB2_R z$=4NFh%;mS2;W?#YVkSMMpqAm3ecwEulDP>()QgNdfAmOZ?{}Lex$EXq>^Y?aPlhM zwA)?Dbb$F&dKj}_^>V=xo3p&v(8c`S2LUr4PyqA$5fOPxrdD`LX}d0D@VhCw*5#6q zBEv?iG~%@6v;>b%|2Dz8W;vPXM11Uq(vZa*IC5{D7;fz_X#8Q}0WB0H&fQ*E2~z4b zrj9A7$dN=c(YWR&m_|0ov*%Ol9tLqS29w&%{;H03FYU1Q_^6HI{}7nL-Zw{W*G1$qY$G#o$o2_;uZtst1^slA zj3@T%g}z=(jWu_(7>LDTe))onWF4Y9_MC#i@fG}D8uT{g&I8U4+Md)@D}ii_%(&p} zi@2h#8DumHC44Y{QdNEEL!b&heqL3mbVzKk;D)E3$s%wgtsw&nfiSl87v|)NPcc~%^XmR`2AQ3Wu5;RPb>Ce+Dhd*#z%~ocVi~uU zdcc=2SQ`EE!q6z$5UC$@lZ7gy+78Ae3~>(n*0G5+I0LkjoMmpbL~=5a#u#(bgmOv{G~|54+9RY6N0< zY(aYbgBLweSvV8W=R8q)AHHO2-y*7McjqW)7?6erH>E#y6mF=_Pg*{y z1{J)s#A!L}vY;AL+mk3Ju1_Udp`V+ewg1s043%R)a9!(e1tEvb{RuEg_)jhWLw>3K z(7gg!>*2vJUs;SQcWeR&d|O@C?K3|+EI;4b6O@nTt=n+aK(JM@x_TEyDPoG}1vJ zv6Yv{1Yit}YJjS-key$&P=~*aZtWVR#0hR!krhu?-;2{5U)o(AgP%^FJ%Uy=$g_C6 zCy_H+*SJz#fr5bBC~M;%Qk&mK6HO2rs{O>slI>C~f-2%%MSkwF6H$Gd-oN%ITRn7U zDrqJRE=Eh&ye?xmFcx_RXhXUtb%E(Jf4wIkK3WAYSHiG~o>1K|8U(e>OlVCbGlVWL zK@MoSrCM=`FW_9CB(ciD#M#AMcbp^XFQfcYH2;?a?IFs~odL%JR6Uj}pPcfS51K)! zvyU1#T=`EJ{*JI4+ayvn)n|Li+rg(^O9-!61DZ>~AcLZ3fk(K0_x$s4Ux7&jee+<+ zw**yTyE{niSH0LBd=ortr8HSe>0^XdHeXn(w~_J-&rt&mYO6KP0`#QOI!lWQq)QKb zI}re)K?+_@hOXLYv5=8TYust!#^AIR<3NxYhK|><>=R?fH=pNX>cUcP$=AS%B~0W!vgUKtHc> z3O?)Ut`rVwWE+qIwsK2dzFgPUJx)EC{JHH=CQ(*M2OJ3=5BJUMg#H?}qG=V7+c=t$ zl9)PITm`|BuPP|wMxGvnE~Iu7e8oP*Wg9Zk(DW8N2Wpzq;pLKsR!S+BjVz_+@oAjT zM{>tM?fUS37$|gS^LCWB;)?p-kEIZ!BmB2GQT^JLKmYd1da%Q7ViD+nFL~ufK$nwV z{wLQn+nl>SFA4HmTSg*dSmZ^5nu_d0xzzOJ|A`5k7Lvwt@3IM|BHPPeL|m;vQ?+Zt z=nXgCWRu5zd&>_xyW;0BlNO$KZk8HgC6?67^6aBr62vZ?=0ypY zj7X7%;OMMv5NzzJ;BvxX47zOX3(|TwK~uO?iGJa{XPP;`KM#2i*s$foMB#YW!Vs-N zwqUX}csy#ra(!F!*cnmpI>5fAtCsz8U{Pek*8Y4xgLQytWts_20RxPmbuOz$D813F zwwqGQuw}edEw0Of*7AaLC(3}CSMUTdO#uaY{CxtY1kMYC8Q(od{ALnG!unOCG_p%o zjjT&qtGz$2PxduFMO7(|ls1Z)7h& z4c-ZT4+KYiu5}|Zkbvm%F{>W}$k%Ea1x4Y4F@XEk=fj>V=4N{ZMZE(JZ23dEI01RA zeKl3BBgnP*JcK@=3_}7lo3n|T6MTTa>mTsllE~Im?N0*+3Ag+T=P{bAt5lCSq}k=7 zyZo-{wvAXQlg<_Z)u1o>_*|-LaXL{eaq53ucHI_FV-eMhF}{o2>K>j3bPUX2x;!7- z^sf+~?30d9XwV=ce>(=4XTx&^#5attfmo(-D|V=RlAvw!iwII3vIDZ!%9~&6p0FD! z6BH6Aa(oeD=l+pAOEXVQ?_eJn-)yI8coPCK0OT7V|HR&DqS=JBOb%zy+ve&||KOl7 zZ`fJ9Qq#op&N}Z#Kw&k#>&U>5e5@CdLeDkN9RRk?Y*Y`>*m+?swQ#7u z$x-I?)n2c*7r4?&3${bdM{E&~=;TJ>Ij*9*f&shfH~8&&oKaM8BtVR6z3A4hMg~Sc zC0P~>ft4U8L|#Ti7l9)+yX5mh7}ZA z1@1CB5KWl9`HQRqc8_m79WBVr!#t*k@Wo0l(V>h{Y`jw<&_PJt6~^Z<)2~~LNGcQo zpR}u6MM*?!iJ{on;#~6&zhJ#?fRlKtC^(gfO6f*!(&ItiOrbIYPE2zj5M(sfu?;%I zxb}0Zx$3AHbXQh*&EWl`RI&|jqh{WfogVvJ)WNFH<;EhH+NI46GiO23T>5~@*4}vz zfrd?xANqxW$Fr~2T9-==u#&+4|KlpK6fvv!)+L=Hdywkujwb(IL7S1BT`@2T z0H{p(tY`l$MpOS_^Kl1&CA1zS!b#b^jJj|n-OV0Zo6D{scP8K#zi_zKak(LA1Grno zCDq&5`+9yd+|Ygp)k+a&K7QIeTC=yVp#G0V%+rMNnG9ujFS`-beX)zXJzgZiYarP^VkU zRqwRx3NC$&d31OY$zWH~xwRx_BrV=eQ>0JFE%`9j$$u3a@|cOOF9nYfLY$}Ql@D-Z zV14}a7POZ0r`UaucLCf{)F{$R3O+raQ$4n~Sh{OXNU;o}iYqog`}NX??N1-Gzl3Dv zo_%{ZHerj^fmfxr|%BySpXBn{~XWCkP~zhqOOO*1mOQ#KZm zoVWI*>i7f5;&}U#9>9qky>ilRYWtQ2kC@tIF_7|5iII>1Kb$?O&Wq_;V0Qk%(o#@{ zwql(Tiy^=d-4f9YFAi*ESzLp>tsWKT2i9;(f*k1T$~p+e>C&CMuVf95#bedX>ZIH0 zgY47u^3a{Z-!?A4ngkCy&{^7q$2Z=K>HRX+$N6rqaUe?CSV@g01CDbL?c(+w^p&4& zDw;^reyq(%QlCuHt8qj`F6PKB_c#gb!}~;T6q(+ZGkR)noundnRMv?o)fO|KAt81H z{+O!YfrMd0bJP1Pw;(mfu)YVn4MbJk>A5%pMoJcKv-RcKoWUCXBSyxwB>z0*L;`rT zY8=XTa)|MRP@&KqNp4Uw$U=m9n#00__Uj7&z_XYPhla;J7t=!89%q{D!%-;`<26v1 zA-w18-Lg-0Og}q$C}A}U^yrU$$yT{uhlb}z3&?z1r4^?apz6Whh_IvitVSF%V-Bgv2tiv6U5NxM zl?t{tO3cPN%=#!&NuQNad;Wa`>dzY0M)_IHoo2RVUV_Hm!# zh_VlVu%7;`8zP=iY9ps@BLKAJ%^2N2n}{qgi_5mt9vWcn);uYlT9P`mDNa86x=;^12Vw>f zzTeyBAOumKM9TRUA|A%n)7S1;R zCjkG;L>AU|M*mYH0sw&jt^dX6{~rNdss2;M78bVucj*6BQU4PrK>u_7=QVI;VEi9d zwXk=z{|`AV?2YXHLl^^BM&SU`|FfZ3IN6*0&jbJf`rigx_%9*YTew^NuL2AK0r4N8 zS=ihBzyAMg0yqE&7y!VP$;Q~g83_Oiiqq2Ur(h5W3zmQ>{TfhQlm>vnA3y;>0p|mT zwW{kS`{CFojYF*23m}sZ)HRyUF4E|+9RU=$a=?yv?w|Gn;hm5hq8Lj7V-hX#Zr_qQ)#}Q z3SBxgP`rEv2Ve)H^4GH>UxOND%G*7wzpqD>=!fN>gc}_NSl%uezZtl^$ovzy2+2G2 z97G_!tOi8tX@3|jenR)kYEEtCs*mr7;J8NOR02;tmmvXAF|(tAH=#rPKG zBW*(2x;Tol)mhV~Y(Dh|a($e{XE&*t?A7i4GppHJ^?Qqde7|G{-9a{5D9?pbjSB z<9DhDJDx)0GS-O3-B%-`+WYKbHiokG4Bl$X&uo@As3bFvK)>>kP9%>fbm%^78i%nh`8!i?zW9gR@}vK2`iZr+0KIWH84~ z-b$xxqQODQ$c#c!W7imDml01wT7g6J0(aFVWu6Yyix1|L`XrRg#?(p*4jpcgUr^-*aL1mw@~sQA;l*;`U?4(#RT2{e zKRFu~`d{Q$GqwQJ4Nxn>N0L|KN%w=D;fX*E-&ZdvnlckZNfV`}i+R2m7`nv9>jsZd zQrr;IVZoB;-^RF2# zV^wWyglB#8p}2dnc6@~Mkyc4dhs-=(`4A;$$&41t%zneh#l*&;z6a;15x2WkUn04N z>*4RD5s;lM7I{?t8&$%9XscdJ&mK@xz{|5#3AIX9AZS<%J*i(xn{=r-y)bHjz8>s} z7m_lqejHp1pZf8g3GvMmOad|+$Zh}C`J5GP)ptQO5msS8I#J>#1pJ*J*< znQ+r(A_iawMAq0(6%09@@{2Ir-zvTiSSp_0@e@k*d*yliA(=-~*oO$0Xl7IuQg81! zNgM;P9$A#*V|B#d*cjb)>2MP_?2itc>g~zNnNfgFn%zz0vQityUQe&pLD)Ht>?&8P z>DJrQ)F^H`Jr#``rFQv9dOAx?dn&lC<%2LZNxH1Z^%1a?Uek2mLUAUS24fw<8cA4e zyg7iS*7&_V=v_~VVYI~`-(>xiYH=q~Jocbgr7d#o&r@2B6POd@vyK5GWvZ*!wzJS+ zLQ5ZZ*OApS;A|u!Md647&D|MKaNPXGy>{e?V3u1uacU&UZ%f%nsI7eG{D(AwFKqOq z!O#$HC;lD6S*MwwLMJcsMO~e#6zFV@JDm75oHl6X$jIr1aY4ZWkeiTKa&o%4naY0+ zvM|CIq_7)r6J0Vibjp`j`wD3L43S`o^2uOnEw_X1<8^|2%rpBO?(!o8)dJkc6cjJe-aRnNkRoI#H_!k%jIU)$c** zuC$V=KPhr=wl!xvXJ!MWyc03gRp}HD*ZPNh&ZSD8BKV(U$=T5>i4HPFsCN+hl2&Uk z(l=sib|Z`fP<8QsWLM3zy-1!1gVbLzBqb%N``j6;n%?~3#|IsIs&l=eUazJ3Fm)-x z&zfNbD60%0jeH-AN2;?f2WFH{mf0<}y-vJhXu2FD3TFdKhQm^c3r{lwh34Td7_&OazHK9#?3yO*Z2cEXg7>WlYv>{=gcShE`r#8!=$ClpPW~C z8pR}v9PEKjaLly1K)HN9yW6OvmQo@cQh&J(gd+%NWhqn8Z5n5#YRAt$aZ$y!o&g^fbUGf5~ zl@KM7qOQh6Z3KJ_94xPM*B|Rs-&qSlqm#S}t1NIbSuqlNz(;n<7fj^wMdqdZd*yt6 zr-d@bu^{L_6bBEhn~M-dkMPjiBc6T+;RL=;4xw7soZWU9z01rfef+06K1Xa)aS+MM zYb`%CZt(oZbX==g4SXOS;;pZf5o|F#5$Op?|0!t(!+)=C>M}_;+|84<7sh>M?RL3K3B<-RT<#nl;;ss56+s6?1OuW2b`#$1mIeT)~b*ysmdkhlv#e4hq=g za0S&Y5y4*puXzAqm2HlK6`$Et(f+=sA#fhaTim}xJi9wHL2pL&w~D#4pA4AetU4AO>hQ?U@a8M^Wu+@>}PIS z63# zY>qLf?^a-ihf@G;`i@A79ojgivt8amVdF9%i@L~Cx58hb1LxriLOfuCUbVM8z6+VvGzk|yotC5fdH;Udd{k;-!t5UzCLOi;kY4z#pw0Rb@$;w#y!e#T-} ze%vN*T-HCxAQEs9 zpD{433_h1~Yc(Y)p5YlZ*vN)2oB;j1(sNLm%n|BbQG-25Ny~Z4>GaaSP#+oNU46X16K{H?JJxGfH3bI|*yD6^J=MDk zw7U>>kuC)_X38>(^z|mm5KJ2IpKlZ)_*I3Ynpns^+mNOVXp?~|4#km&4cQJOw0%r_ssMn)^zru8{1jqW_U=6OuuQ2 z=EkzN-We1?mo~Vz23ZAw@seBAW^}jQK38roY+$tnB}j)DR;>VE2TevJ2PaTV zRAfOPJ(}OFpC75bqyg{47#(U==U>yf!k7w}YU+w?!@VQ{Jqe?_5OGYNG zu92-u_;j2kImS=~iX?Z*pQ28}JcC5kfVwY2`t1)?mU_{U+ULRMJ`EDEYHNvJ0I6@+ z?dvm^I$_Qs_%&L|=@no2Lz2RLm4;$h?>||_#d)p}@op&Cl1mTnQRh zE>uld2$cgA|7!S|)6Y~wgc?;fCNSG)1Hn<{i;b&luWxBhi_-_VOy&H2xv$=g=cl6E zoAD^I;OxhH{dV096$4yv3f-*D;H(PrLsJ^&GbpJ@OkJOF-cO`J8YMp^{PYfX6r)9g z#?$vUe@0a`7Y{+~$E|mui8vDm0ea_n#-3l}Uh@M3nG%A8qe=-Q#j^g3?@n(`AUE{a zMy-yU3SLy8^r>o(D-E-0Ku-^ST~ug3-i-b?D!2qWP$BhM7j!RPL7cJI(gRN7JF#MP z#B$w*^0s$^GPIvlTMEKWFKw^BTW9BEg>ny!%akaFDJfer!NU`!o1G@Y@?%OKwk}Ui z#>0A|vg&1xOcAD;6_5UA$?IiTth~0C!mYc8mEB-X>v(fsw6A@Oj1B;&^o~yKxcBmh z3fCRV@IwE7)LHln9@63=H3Birbx-W21p>nuYdkrRUeB3r5fC1ED`LkZ=Ksg2B;<&w za_r~cyw7@(*@`9$A}fD>rqqb=bNBQjrO+ zTjHH7U`G|QIS!;Oj$cIUEs||RsPO?h$#w3Q63vE}2n>t12yqBlFx{}#(4J4D5PLC; z=7^a(foL}uh0Evr1D13eYla7@>*XkZxE6U-dfnoV8oK$=&aOxeq~PYsZN!x8&XMwc z)Ed^%6mkzh%zBIg%bP!;XQ3&m)$2;hLHxa6=jc0}7y2z_IifZnM?uE*drk`P$?T;c zau%g)$DZK217u?y3jYMdhZf>XVr)07+$vWQ%Orh*a5qDf6G5?&Sd>6RhI&^74=){k zBF>3>#5nj*g@LyVup#S#nvwoz;92Tr5v6A2BTrZrQ@n1QRK9?7^&`G8<&6*duChomdzblODsw}Ar@bA3K5gCvZ?Nk$Ru&|^?S zm{{lgG55qDUZAZe>4@E5^!vW2QT(@m@Ky3Tu-(r}NuKeMEHtyy@5lOvvf;^B?Fsp}Sy+3&MGt5+fR`$X>{Ka)|*C&Q3- zQ}m7uLaoH^@ZvlJzG%o%X{>GJeRW3yohMrNYpd5r8P2rFp$lETf&?XdoO0Y$QAPW~ zjg^Luk>r-#znuXO?>hAfNhykV5hC3~Nd_)Vgp#SCgyJFtUQj*PgeS*d1WNtcBt?Rg zB4f89r{|KTW}sebwxk`BS4z%Dnsxp-Qt%1NMevdXNVjR`O?$01Euuo5k~k?daDm}l zoHtHQpsQ_SE`#tIB_ho8S_vYl1NAsyX9G}r6aDE)I9n=Tf?qUc_dVt{xKGBOQdN9i zXBHUQy@MUNm$JAMp@EeUb^3^r-_Tf1fww>@?MQ`B2qnuF%5xS(B~z7lOnkMdtjr#= zxNNKgs=u#6TPx#AIzl;feP_&N*kQ%ji|NqtY!J8&^7eywy-CO=^@c_ZL3N! zAK-ITms%B419{~yJ7vlkxWT^uumNSChTsC(o|nO z4UAi`Kp;Q}#T&%b(U0_(F2INC4cSexCV}as?Y+`@wC0Ci zEv=sy|Dfb*-;GYuybyC`>Ezj^8QU$S-HT;B%>B>FX`G;NRVffNW)rvUCtyB`f7IA5 zk~VL)u1z0fCOd(AeE5HDv`h}~x~iAcUrHMOEy)3CbclMvX`dG7XsRNJ%@=9iJ>^y6 z=TIzZPDP8_Jy6tN!P9>nO`9+^r>P=#B5vM3f8fW}Jy@=%pnBd{y$W4|Y$;=JYr{LO znoL0QuSBULX)6S^h_bMEQ5XD@&RZq>PBOmSVT8F({*a&9Q%u#^a5Ek_^-b!T2*Xw4 zM9D{63s+1dyME-X=qAPKz@ONSmgHsN+>VtM{uCDJ4lfN_8rUf8|IBD}dci1W)}2(b zF&RiBmz;%&N6<_VhV(D__y_GcDo!AXT7~y9j#We&D8O>DkVzu`mJR>iDbEZ{4iyoU z5)~ZpmVHP!!1|l{vI^s0n|6uV&9TEZkvEdWeu{`^3A6MRj+5OJPsS^qwjvDmn3{sp_b4l=`&Rv6@Ix-QqU;9z>2_oK7&hXP07yc?MQ*{3@V zrI=x`!LlyJC1PMbsF&J@F$E2)gSj7EFpHY_Qa3+!a|GLul~#T}Lv&K6{;A@1V@Id? z0exHP^ya^H2f(vF*mzn#WT-1LW=TOm1BP<8CvK4bG7~MUk+y|T6hiybWc%Q2BIMr@ z7UOUAV0-WpsC!1Q`)4IYvLJ2hkTJljs^JKxZadCeB+pD9Y{x3CsV%cm9B|>{uLmzq zh3F&5*N09|Eq%LPeg}wcF@@{P8f}a#CkzuNuKyhLMbqLRIbLDlt3)D@=pZT!`uGEj) zg~oS5>V(@X=T2dQ(o4h*eOiZToTi>5T@7XsgG%vg$2~kd4pPy;l;4&rYIJpkCYmIC zE8I?sjdh4B5OXKbR%Vyl_?y_du>qvv@FuR!<@*=3J$eBpl|&z@A(M)H{tLX5~Lz^UiMD$%!!7g8`Q7Hhz$r zX#L#{U!h7VuO^WavLEV|EzUxLX!fTNh&*dqF)$OXESWZ8@FySSqfgg?&QrlXxSFHu z=qWhvxyy*1me0&&Ae1V->7C`H8ha&2h2wK|IIM+L!7hkI!#BZL_O}7a7xK^N!gUL6Kgth) z9NQvzJFWj7N8Yncj5u&hPxm)Plf$`KGB^f$DXBp0Lmdq(XB5ETWRz9d*z4~vDY-y@ zwOKbet;Sv4lht9LOVtUlyiIfY!R*g?vw-Roy}e!Yoq^>>J9i@mEypdJVA(RUJ1$t2 z)U;S@v5Lz;Y?}bP;o_VaPijvBsWww-TauGI4nzS8*Z`D~!{TXCZe~)9~GSGu0P;8T6L=gyU9#+IURGY9-GuMkePysqlP^uqxKTLe z?c~mK7|;?+ImBoaO&be<-XdI2CkC;P{aIrd<@0N%6=|OvM~d+%dv$y$NpTC8AT#Cm zRn&V(1;xNxKv0$gnWj4~LFFvzLa1#NhQ~kiXCH_*R}JSY2}`TQYIU#(e%5y}3OF#O zgU&_7$dp9z_u|ooZlmzs#j6}y;6(ZUWS_-87VrV`Oyi=ybhw_vH@b7m34H+X7L!ju zhk93{``5C+^M8brLBnGEEY3Q<;4;ZNdkq$fIly>KLE3~-Qr>oO!&$_72YWBqdONAD zXNz)|pk;-_FLs;Wo3&B88vdjpVrOr_I@3z`0L)`{0zYk>y4n3Rm8J(&3Orap=kJ@v>Ee3VL zCoG`g+Q4daY)HtUvw^jNaiO;5C%wD}eIub^GR%=3yN7SVBEYX#sd=${@$ zI;)vxy4Ea(Wd{PsN;z)uJc3Bt7z8AI_9Z1olM4r*c=ShI;6e}mbP%#Ec3wh0^&Pd0 z-6YISRHDO#pF56u{4Lmlo=xJ@wbT5RLyqCkQSGCWYCQYl-2IchNDZ5HGo0gO+>ulY zFf;9OaO7&6d*@A^PZtn++)GRJps`!e40uU)7Bvo)DoexGq)?BZ6y{J)V)7qc@E_~f zCF;i2)R|iGLe4&8nXC`xe z7S%V5^Nm)_n9&IVt+(f4B~bHKjG@F;wv&R*)Q=`K)tyWx=2gxan_fxA0}6f1wdIqW zxMD+(O1#G@j$FRRY;W2c&&6@C`!&SpT`_|lT4qoY>(HI9p`!V+9<^>6hT>%3q3Sq* z*~nWE^@49&oX(_D5@}b;)Ci7%jehR<0MbP9LFPK0*ry1qDwlEyCxw0+_j*AjRGVhPrIry`gr z+(mC90TV1Y)Z8Evtq?{jT~ zX%awwXe=Ve(g#GIE~p7<^R4KV3cs`AI$OvveYhuoc$b~`FUt}hU`5<*t-{7wI&aD4 z;)N@qhJa;6kQz|#_k^buAp+zj=XS_kcWZJnEs;Xh-s;M@pl9W=$&6qX0(MTtiWN*l zTa&9|mB=j#`1C%2qt0Wry1t*to8-WAm7`S_K3e*n@iYP)O7eKPOaL&1%JFI`1WJRG zR26iZa*g(yKAo#F7bTxW_$2xYQ`gY@BLZhbY=@HZWO}xX`QfBqJF$g@@d0>H`sZBB^SFl# z2JeT=Mv=N0!78F0QR0@OBw0FR8+-Wzda3Cc>);$0aCs1=GbjP$_-DJzJ?ldqFOu&x ziGL^^<3NWydhI$^=m$0i}WwY1|@UJ!fJpxrs#ofYu zs}tCdCuhBX-cDjlxS#v7K)otv?yn)qGtW2Dnl%8JymA8LiDcT=Rk6UOzZgU-dO4uO zm8D;Bl~)HKTHtVgaGJ*N+GctAQFenLew$Rvg>>=?a!@?Qq1XZrz^d-*h=iaTw(^2}(V#eBr>!5lX3lDlX|9ty61a^bomnx48#Z z3FdKq=aWjk!SjQq0No31W)e#tK?AVZ*;00%G27V?Lp8rpFU+!%O9YqwfaiLAoZgWM zG_PYUxI?-o_?|Ec5r7ub{X=_|lPV#zf9O*$vg8ck8Qxr=p>|SIu@O$%3~uTSRt<~j z5aj)A;e7Gth42LLe64@R^+0Y$Ql)Oa5xWZI^9@Un((M#5sPrV_Yq+e~?nnltRX)T0 zs{jpm!&4d@ig}5`cl}%P#e4Ai25;ZrbeKBJ4pcv+=2Hx<}36Q9GgB;BRFbe$>QtUG=Oy>b+WuL|&t|89Gbo$k>lwB*H zU8kjmqnP51KC`{c<*Q52|AYoi*j)+?8E(hMB9nM-=YXaXQa0|sX>&a5JYXrY9 zpC6F9oF0ShKpli&z6-I!v3401t4ZW+nuMRwe98-8a8t7@jv63(pf|>&+C`j>aFNa%TuNX|i_**ThEM zxrUgHEAHe6`~9mBXSAUv$Mrxm*=y{Nq)SBYyKX1;Srv{qJ%45OlTj6YOR(VSCT9`Y zuU$>?eEWF9W^sZghHsURIm+p;fmuYGvzf3XjV$X%B?Vp{uIo6ce#^N>dd zNuYdWPm}zu+d6%&x6YKg&C7~~Rzj}GEJ{Z1x6qc+#l76u-Uuz_6QyKG*H+r8#N)%rg@9o`&XVrDAMxXHSkc+21j~02MxgGYvm6dF z3BG}KtIAMrRfG#x>T1fNji?K9q00NSt4I+p0ijBBG^eKSRCv8fE9vR%WT>n}!v^f{ zY=~pjjIbB~;&>4&(HOeAG-5-jP(gXM>BB(yg4?CNpo&D!d+gy5TVlw>efTo+6jqvN?tID#Y&M$$_k{`x7sAZ%@$Cb?;s^}Q?O%<8z z-H}rPhE6)7yKWLusO)L08nRb9%*dV2m4$a%T$aTc=_x)}%Ms|N{Ls+4vx=E+k2{=q z5A(m8>-QG7L5TO$o^xnwP2AZ}Mq-z~dvn}5AoY=qC%sjOW}0p;P?iXPe-v<8T~-Ci zX?>?(NOW!kaG$s14eOlQUp*s2&ol{*g`Sjb>5Z*g`hT9b2<87#gFKZ?n54)$-Kk8AQzP5gD z{_8}JL4<}T_`O_417tdU2Gtwt!DlJEMWnO0E6c!#`s0c76lQ}&u#P)+sXqP7r z27rzQTf-Cs6c&*s<(elES20zea;&JXquWx}d?4F8;*k-22!@bc%`=Ob9 zDeiaI-xKKxPg;nfY0MTwHw5*+og^mD%#k)Ef4qd3kr^@=$GQ}dnHLmK>1w9#Pi#Rm(ALx4yriq5891_mebut|ir!+l#B4fssf z0Y&l-wu=&2Au2J@Q31Ms!4C4n7b+SuN`|4F z-CM&5+RIv_yVae}qBRT{lvO#7g?IHBZ-%VZs*J0MY1ZPV-OQAe@Oy@dj|tY%m?8t< z@%B`}<=5;$9C*A4tfS*Q@+8;)NW`T^E9a-ZM{esUr zdK`iK<1mEVvl$-77j)JZn>PUSN23YuqfHuQ%#PwJCuAd>9g?|I3fgLA;<4<@^mA5i zr!A?I!gSE*nz{%ij|p+k*!GS@Lc~}ULcAUe?-ZP~(9Qn2fGC9p2)j93kbtdaCL2~W z*`tQ`GlJQrb&3R3y@DHcwiC*s)@}k-v3`O8kf4RTRUA`j4k(KSqFqoCWxV22viZ~-*=G!nlO<28CSs_Na5D4Z% zD57Vdno{T$YSx0*&qD5f0~$9Cn1PEXr8)Zq_=#80O5kHo95%y8jqUBImCzw~w(E3M zs~X*)*7@J^O*DaI)s(KfGrrH;QOJ2A@d9KzBLm=uFAzyHzc3^enBW<1EllbLlm1PL zD9@{j(x-%^FZS3aeDoXQT`@&G_)uNMNc0AEUn_nI)E>G}LMQ>RYlxuI`gs>-|B{U< zRIw5Nb~y2aoOF$sCM!z{l@@!9ztu}BmJe*_*68~XL-gi08qyj<2gcZmxu?67z#pyo zqVM7TH5-a9xZLqoBIem85gQS3R#Q4mt)(KJ)1Cui?Mpmkzh*nVByRtfHSv@He{L99 z^;-t!JMI1KuQg33Ip950rD7^Tvh0F?TDS<1E30;l~wczgB8y#S8=wf3E97_<;txrZIu7-#N8JC67(%ys1N$CJP<*SV;)@J)RxeJVkXv%BStDm2Rx8u& zx3LJ}c~+T2aIjOD?%_glmwaMn9&M+)A#Ru6r*!Kt*2+Pe+OmdX=pH)QXjiTRk6t3a z&xw6`a;S8MQ$-zIGR_K8s4F6=iU%MIsXf$86S*50Uuzp2@XKjU1Y=W4qfNeH$WOkf zzUynZb*?%-7brU`o*8r01d!CV%UgZV?vQ#Oaf>OQPbOQ)jL#$nwL{eF$(Gvu)44+% z9+4v|##}T~upw;+id3;SXq^^FSZU zc**!?V557KkbYRfo9kS*QrGFx69K0_utB(B95bF3)S@vUC5x`lrF*(#%+6AhY}M9n zs=B+AcM|Yoi?xg$GjX&v0XFAlXc1>S_Bh_KKPm>pdNGDnSjq@vv-% zDrH_;7V~Cv&PtE7Ulqd)U9aPOVSC!Y+^p|ZN5xCW*C(78Gx<{_^iY=f@3T#$TuoHY z?xiJ+?QS0-STE`dKDO(Pfcs14jin;+W;Hk0mAvdN$3!E3sI)84aAZ8BU3wz15?mg- zYP^v293FDPZDEv)K6`_i8Na|sKddU;>n%lW(p^>XBk}Ns{4$0j_8;Q?Vh>-)(;yXL zHvt4n^VH=jYbWB5Qp&F@x5mP_sNVz&l}>7jFOwYvW)#xNy`&;Ws>>#A@d;={cmcoc zDT@Sk1d2w(b1MU@`45JXRNV@yR2rl|o3zMfw`1mOwNk2P;Q)@ATq=ox>Gd3GH}AbX zJsr%~OpSi=mHrNX2XQrCza^43GhxC48dY?N2w9|fr$=c`o(&E#Za1DMYMHGHvyrGk zVD)(R*g6NS=G5;z44;a`Hto`w%=@mwtgGk#XUEOjDOA{^o0Jab{T$dk%vHUpE zN0Dp^w)dsc&Bo+|XFSwNfy6{n(I}SBZUACvt{AcdV233PdtW#{5hA&Ti2KKI$Sr8Yf2b^pO4{yWx}7J@-71VT_7_v`YxeDav;JU&o4AXqymXO|x#s0$+NM~C$TD^aoLC4gwjOKOOSrD*%QCT)C z_X{H|7Tc>&7RucG99Nykx;z|13fJ1^m1S4|WW z`!;clua1IEW3`s3v4|_0^e>eMXK_Nl0@8N7{dsiWueQmG2eH_lVH|$~L3NyI-iHq6 zlY*l~Kykgx1YPeae2d+1;M<^c%8$@RRMvkj`;YVyp8Nc{-=y^ty1v)l|7jT0Bwhh&E`H*Sk2tWFeEKp;C^2LN34`@sTXuj@|x7tCt*=8;l-nY`|RsYrZ zC1d8{l>BlkU;qFkO_j=xS pwyfpz9* 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%0Dxoa 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 Hy_cJlF|_^3 literal 0 HcmV?d00001 diff --git a/static/images/docs/oauth-server/scopes-guide/taskflow-consent-scopes.avif b/static/images/docs/oauth-server/scopes-guide/taskflow-consent-scopes.avif new file mode 100644 index 0000000000000000000000000000000000000000..4a119e1569bf6331a616d8297f06e0382fe56a6d GIT binary patch literal 18144 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 literal 0 HcmV?d00001 diff --git a/static/images/docs/oauth-server/scopes-guide/vantage-write-denied.avif b/static/images/docs/oauth-server/scopes-guide/vantage-write-denied.avif new file mode 100644 index 0000000000000000000000000000000000000000..8dc34ae643c2d99bb59e68e0acb637117286d4f2 GIT binary patch literal 33158 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 z z%hqFf+l7h*%)|qyJkmTU6q!?ipnV44DdA=svd`u-Up=%b_oEqu+t@>&n}C4}L75^~ zgS)wHAW-9s+GB3(6)V}tXGR59wKGWc2Tbe!RyflixKE0A^I4rG9B;^?xs)AChl0bc zrjbPQio_8{i=hBUp?U}9(7;v^jjqu&*}X<+G@qqIX!G5UN>{e2<# zlhq9fJ{Lc`p}s?0?oXNFKrEm0GIV>?YJw8LEjX}T@Sa3l5QF}i7UoovcvEN2C6XgC3pELz^)7E`5_WRN-e;7!B=Nq<`_NF zLaeA{TOnj!oP|IlqB&%Y!<~k$0Dw(+r6)MncLq(t`(+h&ZYkK-R*zz+MVAOmaU8w{ zI4jYsxMr#TgLl7NWP=teGBpJnVPv@+7Wr}L0h70dy|wjKS{2uM6Q|en`8p|-Ppg1! z?*L15i~WksM7Mt+PYNy%$Eo3b*Z)>9y?1X8i#2R&Z>n67un2TDS8LWfYnAroBu>K^Wiv{ifS5-$|6N@Wq-~oy*gJYMn52~BN)_ua1^PDGnqaKamO4h zrwhHEsK^ziZoR`?gz$-j(2&@36abF2N&2cc_@-FAU#MUd%mk|TI2gXc!CRu&=ykIW z3QdTkEDXnFBo_lbCbR<8u%6hsW0BwHCv17Y?{;_wR`&7nZ+#1Df2^^Re|A#*Wk@Np z6|ur%*&oNT3CsUFSd;AuV_1U@N0?sz?6?@no$v-o0W(-U&GzUQ>LNGRN};y3vnipZ z6$$CyB@^9^T>fso=|li*H?(FL#(oCmHuuuU%;lil=p}q2+LO#t^Sy>hZ|a(0V9MaQ z3#7NDe7fNd04u11D($Uqi^}beV{(bE1q zz~#q!9uM&dJK?2NMwIo`1sN=(@RAiHL>o7@M^E@izrpW;)fS-q0JVi6tZk9`bW=%I zxu*VZ{<}!$8436XFdJ1oljY%WE%++Ahygu zdytOV#k#HWfYr_2%9VQc89%TF&Y-&cA&Zv~s^N#p*2VgD8-RUBx$qR%?FSTC3f&2ja*cVr&eNE~~?2?jTeyPn2&XD|Mp(I%j;^|>Z( z69(cUY@4dPlDXd7MOpTmV&+$2ov0v94hVI8>Vr5O5_?;Qobi*TK5HK=;0ncC4wePBMYYjdPP#(x>#1ipl4^EYm3Z*MsP)SK=T03Xpn;CQBC=w)YQQ3VMP~HJNaJfKfn@o-YwbD!q5IZ zjD`_TSkWpoKR)x$8tU+;`n=uH$5L5l8RV3StLlH{y;qEbFLq2x+50qjG*(4+T-n5QQw_ zTsin1)#TK~KVWLRty;VvP9C#-U$h6~rB>R{r?vEz1%8kIF>HU`6>1GS1Vlj3G{+$6 zp=7mwQATUJ;o4x_sN=P0ezt>pF{H=n!;Z8RUbp?}ks(f#GV>iAtf<8=%( zwCNs@W=0ar%g#vgZy2UvWKF(ki|B3E%r-1c3Sh%Ag|lfP^Gbu6rSY45PckQRaB&ZK zN$0AN~sV1lm~Y>-#F0-`8=#mv>@h&LjH5maR>HM!-(K| z`7OB$rv=@1Cs^^?q!e8D0@{5kJL*(cex$)b6<(4>+rsb!>e}eL-G9Q07T2>sgS_F; z?L5wW@(;#Gzct4pCMTnFQa!U8u||%^>el{`(hH zFc`TZM!fgq6ks#-^S!KwGTIT<4 zO&2ViPU9Kxfa63_7D*@5cu&BkZ50FB$Cj}kyUjW>WQLhgAD3!t)VUoNpy$ypS&BN0 zS3T|L2$7(=yKin|IrKQ&Gh`|oXf7uK5(m4$AUWdG*QSF1GxU>I=+KnzRwL1bp&+Qq z?_)*!uE*yN#@5HJ{^cb7GE&^6(@&5Zyt~?+oR*dk-}W$qkg30oZ4)u-PXih;_!Gev zAQCPLNv%C9UAK0&oD!KfpgSzQ;D2mOAl9k)H>H(Lo3;e3FJ&~zp*ARX5%dJc@1+Po zR0^uWbIg%SSezi>hrgTl*(dZ10Wp`?w<(sI=KjwS=j5D!&wH(R$~Lc+q;>(v>K0P_ zS7K91;HRIiFfH)GNJZSU#q9{Mfu-lZ-1a4KR)0qUIQ)r=ZWtmImbQ9FMm@#oH3NZC7 zMr*9zY2!~-y+xo;c>GtUcK#CxT{zNM(A`S#d=!Mm0;bw98n!?|3O0Ur^Ph~h72afU z0CAx2)kmLThHa2@nJemynX2#8pyBmAGmQ8X#HU+S;|G-+o12*oD_qcTQ)p0cP`dDU zb=^E2QLxz>OBF7c&8@21gC=rHA}8WeJd~?PoSR+vE^Gy*bilZ(!bHdK17Hdm^@O8MGZI?YZ4A^6T9HDm zeXEw1Qw=`Q_mHV4>^e=e`V58xEy=!Es&s}_KLXQttho=BbFXy6Kv1NnV&n}hCK3sI z?mS+YRdh>b__<9`V_3>7x6Z)c0{|2usHT)qF>Jmvy}Sr&E-+B{Un2yb zcWuxl{?Ns5uvOlphUBW62-4wqDS6QQ%u~U62l{lowtxBJR<-voZentd$z%7-WTqZW zYz;+h5iNn+klS@n>Ei7sXAeNu>+K9yoOUhl!tcn2Qsq6QLxze7M3SLTy|?-5x3j?f zk)2feNfA>_RGf_+=fqXk-AdSG7o`&>Gw6KlvrdM)TUSqx$T6$RhGB z4EOueS&kJ>cszW?)pf`tfU$2q5vpX{{ zyJMwRzj2T#c`R^6KZOWts=1J(mhzv?H=^mtD`g%A?n>gswb6gbo4`pjM0|}t^r=y$ zLmajGVVq6nn)j8<+c}lLqSO%JuutK-Z{SA^T%A>!k4noQ$N zKmK)G9C{_~>28=B&7QAeeSW}Y&Smt9J78;(g7Zt?Z;)j5OH=2M3?^5-zf1gDq#&&` z5FFyO&3J`>?)P;a^_-jMNqoV$_ly=k;A@95`~c-K4+Q~@(s-CR?fSE8RqygY&gPQ$in&9O$uQZ1E+SQB>c_@Zb=Vcl$Gi1ximVYe|)u!FI5}ki3 zNC0RC(pRw=Juk;64G)i5U%6y{d9e}!8?BLwFCc4Re<2Me;sPG0U_@_X6+;&7)fY;K zaGT-Nf;fAN{w{t#z?IPPcqja;3#m`K1NKZ#=fo;BA6(2y$nV#4h5j+^9VF!wamz`D z_%z&ej3KE&Whi|_I4_qX{i zRQ*^2(Qm97y#vJy-zoqsg=|$BD&y-}m!1~&5{VbCldgaesB!``?N6b6rZZ^%iD#;O zp1mz;`#wC9LVwce#dblh5*MZNU;n8SoN)^S4Fq`EumRFy$k|t&CO-XR)FkI91W0Z`ttKa!{6^lVps=o|6FQio}XGpW{3%9eqT*g_!7H)lm+esT)gkRGd2zfpBXPZb zU+Ci<+G4pH0s{l(=J65Be-DbH^I@2d#eHN#Gvr9F6&c#|5A-@6@1x5fuxJb}Yd5tq zXNYfiWSpP^i~iqk^(W8FpDsCEJM$(M(|#ixky~`q-Q8f#;p&)5bd&T**uOEZiP8EX zR%0N9`91O=QS&UKJ9o?J+H6{8{6ypuyi_-uC!Esn5JF(8xcI*fNzx z$m}0OQopDCLY-CuAlc~|_&(DfH^pIcz%MRKk1(j{CBOoy#2wp~%<{1SLR9VUX$r9k z%p7~5PM~Tm?rOv2R07ZS<5Wt@Q);=V zj36AQm)Jr7=#|~$)<}s}40w7ea$8I~+wp_^Z!j!Gx#1AbfBWXI=p}fIA-|p^41^#h z+dWP6rDzxai>k!1&mkW+1DR!D!qLPT>F)PV*Cr&jUZB(k?QMovmyTN4R2 zm3uRW+ja2MecOm}PwavSf>f1};Kqe30cuPXod<;+pvpl{IY>6cvu9=Uw$PvQ;Y*&A zcT9{Nm}YWeJp(KT8PpZm1sbtN!ABzsuEf=w#M;cObyT_ zL@66&Td!(?9+f>2={j8c|JrlK(`hQLSENTsIM&KHlFmb6p}0=q=>p^3Fx3|f<%!n= z8Lqm39Y3(Ffbjk*H75?dm8c0!@l$HKdSt`L!kBormpXFk$VXS(kZ(o}?EQq2;v=N| zU!7$_36RbangbV%;wQup4eJ`jd=YuoHin3WB1bawf__DEtg(P0<#yICSKw!rAiaCc zE^BV;sD9upKxKQxSY9hOmF1yiR@m2odev;3xmSoJ8TS_xn3>b2- z(c1Gog|XktpP@>ZIo;roDrumM8}A(ttJu0h%uR4IfR#MJXjI7}Ct)e-%${cxGQH+9 z6pQqDq@{#78SEs`2J#sd)ds7p_rrbxXRe`#f!_5oS=jq!k zf1tU_N290Fk~}kcK_a>Iy6)TK(n#ubwwEA)_x^#aDzk|(%&7!sNFFiykDfy;pcFW! zGVz8peCIsR(Je$XGCCNFq{s_=k_Vs((HHjP@?|(9pj9^vZ~o(}6CycCo-d~%My?Xu zXeQGcG{TdfdE7M3e zUE)vDHNc^Y2wXlzhx4_Foc$7rxdw?CW27y+*#ZeNg z9KGuXFa`PsW%04EuPNbCpa1+7#67B6{SR*2YjE-xh-}}%p4=0szOpqSR;t5XXHr;L z()tSfD`1w?eCQ$I6Z*&g*|z7cJ;%j;Dn;HenW|h<9;EoLcj}Y{0e^8<%fn^z-J2G(xoi0QEHPsExixmn`gfBjO>K)^RI+~I*6uwXZ}aMSV$14z keoctF{WeVC_tEE-ytCehynAau@oM4Qcmvviz>MjCwhh4We|*Kp)Y;cBk|JVM% zh+q$Jw)sB<_&-eou(mV)9}^V>0{(CPPd@%X1aimtkNp7vZ2!-p|Hq5|A29{_U(|oG zhOUfE|1;G9_Kx=dAt%7z*zP}sGjwGV2_XAFVQ2s+d(-~~0Re&kw?XFrQ%LpzcfkKV zpiody{{aTT-sb=2|6dZI0U)42K<)%KCWg)^Krk>|mge9210Xo?M9jf=!1!QwK!ZTQ zfA{NZvR@WXO%z09Q^?V#$);UFvz*mnmk4RTm zBvWI!2i-_=Qsg%dRGb-eptZ~|!~Te6>60=z zoYj*m#Ip)2ba*At-XRl-m$Dw>YyB2&8-YrATBe`EBykW*HzZ)vgXPfD#OcCdE;%UO zuM=u5*qD(Ral+!`=N7XhJ&3A`x9)YX@JsK0$_Y1hf&*XP2lL~s%>$)2$C3n|OcIE> zKrwxN?L-hbR-dZ;Tjrq3L?l`@lI-ftumTF#!_3EoDKK)0&iBXm8yx+LhHKp8y{XW=G( zrk_XDrDFV3(H`Kf0~l;mZh|U2gz`V@A}G8O@+RCBcQkznZh$hA`|Y{g9lVqBFqDyvoFeNdiWqqx#od^Is?fsid=(a%yR2c(9EXUChk@}9bYvlqfCd(-jzpg zrNvNSz()2=Z}R-DRq8jDnxb?D!ZnE_qik;;b7bnar?y<^&C_p~7u*7@X13)vjL-$+${h1!{e-}Oc}(FHR7B|q@YyXV0%pr<=* zd+XcmjSCx*OG`~`4rsv4jat5(gBR-z`Q0{->l`_B?_X&Qa0TFc8FqdrR)%g5A(5q( z{;N$Pn0wZ*XiJw^i$)div_Ec{k4p{hav-P!$Wo*@!y(5|pMkk>2IL2`I#4 ze0;>fhM>t@X|@j_M)*RMNNlrpp{j7uhYyJ};ggS*6aVI_X8@75hlctD9GTJGcLd-H z7QqIQZb9Nwe;yqfYlFF>oufY8P);MsQU{H#dIeQkzF#6>{c-V^f^31?V^L#f&4!;| zlb}D2L;Mo$b-5C}zLua-R+;Pm(;g0sg!K=P^@3VD;??vmprGL2=f^ajF@K!%;!*OY z1^U>x__X`BVxaHFO7;di3pbLiAb9^Qgpvt$H6-1~glhU=1`OS9{6|3Cch^^eOWd_H zs-sS%Asei9jUB)tyms{f$NW1q^oIPyeGWE!W{hn$2-c#h=NAo6fIdDER$FF~I2AfE zrx&Jmm34Mt0!m=935}zPN@cMeIArUX!A)}U*y^itgSN2TQio~W3x3ip*nr@yYuktxW?rCoEnY_UG!JxEJD_jyZGy+d`)hO(M z9%-|_c+G76hJIajEDgl;jgwMD$iEny?+!L8X*^2jJ{>`0e^NVDoT_7mT@%h-&wpb) zv-7X~l+F>cb7p2-Z$y`jDY+PKx>Q24(9^1z*Hrl+7G7`cT!dDriXg~YmY(T-W$WDI z=@!OA3S4@2BXWT9&TH6p2UJ0zhRPkfxjT_cPmv#d<;hNnT~4F4Hs!SVuNf-Bm1iJf z4t0s}dW~64Fpu7iQPg*7<+N zR=8sL1V~8<76IR?(PDx!+0z~M+fxU)s!r~Yo(PeHNlc9r1gbhpg0TI*#3`4~OZXnMr)CM555f3xc}3hL(q0Rh_oEpMF)6rjs`)t~hglXGdC(T5 zwuLgxzabA!Cz=aHT>|3N$pX^2`yf=y8Bzv^+B!j>7nbii&+k8jL+^-3)rH68c}PU( z$l!D$ow4eMHoFsG2N0#3A}wR1Ywuq>@5gJtS#c{MjTiyZ60-CpDK4s4iPO!Vb!ZmQ z+wVQ`CgJ(e2e3Cq_PJ)JTMKoUwrkY6-zZcA9~C9}h4ew+ioWv1esG}$TKCmS)cN-b z{!P1xxd^B0YfRb^)@ToI?p2AVNP{5wyJs2rJraL|m?D&8v44Yj5B%OPr)zvG(yz#+ zgwMbySnN2UGqCiffh;lg7m_G#>)R}!k4Y959Sb3%-)kzL8@Wxvq}Z4@K#oCI!5NMn zgy3}FBTEc>_i(M=xCOodHkm){TgD0Bt_StkCM18bm#VR~A%Gw(Tk9Qb1B-@X@ACy7 zI@{;GWqWZw3^rYcB7hgFO!|&K@qn9iS3I?f3-sDvhSRJ`t1c!ZTZ-gqCGvyfN9S}(=cWlPzI$DoTJr&-t&270d1y%R zy^IpslajWK#iyqQCJY6Vgi~#IaJ*A~POpejQ>dlnB5SS@e19$eD?^fU7LMI|VJ>|^ zK~QJMnfBK!8rBD)byL8pbMCDnCjwOPnHN@y)ry~!wOCuWR=%VvDEiwLcXw)Ii1IIq zWiyd525JUk;T{c{{l4qQ_@(;JAqJxz`V`aW)g3F~elXS(aeEFfTtM(TEg9ez5Yni0{P9Say{LD zu4Gf`tv3c)`9X#(%PjLTz?>c%{XPtkHcA}xks;uC8ZLTM8%(`-o0UlQBSbJxe~iN% z8|&d~Lt?D`lf*03&*jT6TTOajSPFR%h+Ia7jp9ph6!YWpV_EB8K@xOv!OD_=^uTfT&4$s#PQxCPW&E0-5Ejhd*^CAi_e`x{76?i?1Yl@? zgXKfRV!@3RhrU}1PRW6G`jm-n*dBIA>scaL_)1e5qP&|~yLq@KZ$D;1vTZZ5u<}~B z-4%3g4GyR62)$>2!qN5z^j?>>#2#xIbHdyXzkb5>Zt!|kER(Wh)R+a$?|Dz;bh(Y4C`46;(OH;i;@k- zhe-^e^mkZZAL>Z~L)%shwC7PE3g7JcoV@Y|C_r1^>wV9-66pZB>D<#^FY?Hs==331 z4Hk6zzGDemY9ZrNmBxX_=p7~JmeWpS9nMXP594n!ls68(bX;$AUjgyZvc8{$|HHY3 zScmz`Z%y}Q1@0uT@xo~r#Q&3+J%cIy%Y2B-9ns?7Nu10M71+nFR3hk8{K9mCB^kPT zBM)29?Qkwf7_19hBJM$j6Tn8BQN{!J%JP^!@oJumv>5jNB2jAh2`x%r%o>mC)_p8H}so{E_AUmhN8}di!^7wFiK4**vnl!+pjT6i27>Si0jAg zk|bnc6GC9%A>RsWr9mle)5529?~8>2TOT7Ki2y|UYuY80b)nNBnzpyBq12i-p$5NH z8S|u+a6FYUq9}=6gFXyoAr>{JbEU)XV4KP`ALBea9JTIk#bW8+;;?q3+vfowxbD#>a;9M?sLI> z!U4hhKUg?fXd>m~#WW6(tEzl^_)UTNIuhskP3 zebU)xCyosY`g$CPKF}W}a<$9}m_TN_q_|3?{1uDhhZ3{(;x^EOUB@z|;L*T~f7M1* z+nw(8qSp*GKD?$&d6`slR9#I4E!yxQ`TlSe#7>hNQ@b(2+QgL0R5~P}&WvwDn^_QUC zX&|Q}-$H2q^sSMnFGelHXXbrJ&a3TIU8EY+Cc7*(DdqU?O|z>RXC8evj;U-cdD%_v z&(R`-kFr0CGj7X!@~PeKP+#)bEozr*Qqu&33g~Urf|b=;dLhDAlhs_!$X4w|p6uk7 zc<?<)10Imsq{x=()n=4>7V)=x{5_^t@npM zTE!&3DWK27693E5P{3_jyx14?dYVwH(7Sm0>s9C3sVD!o8#`{*#-;**!V`} zXU13e@)7AU8AQ<)AMl#(AXcs7sKXBDC@U>{nb*i{ai&})B)k8b3A_N$7) z_;mE|N{~|TPphGSkZX)l!V^`u&QF5cqt#v*-5SxoS78p$s%TU5K7`_ zcIgdkKYFkP=9JJW|`l%_dVbQe8$J4$s|31clk6vwrgC?2>@$P%d+mb1yx4uK~Kx0K3 zE+Ux*gHIQ<)BeR$5V6z>ww|0G!~5QMI|9pHyMx(?sTd0>0tX=2rwg8(-ei9a=79@w zX5T1nuJtLH0s!}+KVW^A`y`m`=Q3ATDC#f#jLW?kSfdM>0ILpyyG)fUAGc9alf+rH z(inB2zze<|-sfIt!7(tn5k|UwP0%bHc)2B)BUjT$fn7D)E_#GL0@b6`9Ak1`J^!W4 zziFFRInDUblM4d5-dT&~&=t)YnSx%huo-pmYrbf_1*T&mKF?qQT_0uFX{=kqla4w6 zI2pC~FM!)_ewMHzV3`cDyi>+b^^}&2y3w_eWdjN58IwaqP$QgrS?9NC_q^uxfk~BRHG4b}6QdV0MY^3sG$}y&jMY)>dK`*+1H3uYPKzc_ z@nKDmJT}4xWw&KpRaK&(#$8n4jy?t_gM-{RcFjWs9@Y>H+qFw>6j}J;)7p5>OU5DHY;`cqbREmeq_PLmB`nU2 zJ|tiidp&ONZ$7%q1f6MJ!M$mMJcCx&3GVI-Z^Ig{#nd|Xix`$H&2e$;)d&yj_pQ2) z{IYPzv{3KRPk>K{$dLObsSa&1K2LwBB!HgSR^6`K^41H0P%QOjM|w#7$cn8$L!MZs z90<83VM&BE>`qr#T1Aa~tS=LhlB~2~1(O^@l-8jLw)R|$z94F@SHDU(duGg(y+4hK z$Eo9=aIs|*qyY#8xPXXbSC&M~o#uMa&lRUwNtnlTA4RH&zUa-!_#g6PGF(xG3N_p# zC$5Ro@en2<<<3r4*A+0+IgYurG%gTCfAZ*7FedI(yb*h;7n5~KMlJ;L ze*|5D{Gaq;Y*L{`o}d$i(;6~O9CF| zr&f7wyqQ6xn}vOqsh9sTbKe#%#-fX;N9=*9#iqIC4s=Xf;to#q#S-v+5HCc996x*Q zuvZgt3K@JC&$k+l?t19%_)M^y zuAskO^3VpW=q+zxkblB+8&T?$L&Y`-7BjM{ZBx$220P3t(+>R+MKl)|%ac{pA=fbP ze#qcZ5(vmv%7(AS$U1U53PxmSo$}{r5Cd0kF+!qK)#hpvp#xkj)$SWIxYtLVlk%6! zh~L-t%w&kPHZ;J${VDREalC9%9(0SuX(opNoeU=dSGuV6(XZm>9QC#YaXdWUsG5Y6 zvzM>nMxi-GrOio3^T?$PW(hv&_krr8tFpD57c1Q5tg2@%t)knelhm!!|1OL?C{gkk z8t(2b(;K2dU5EPG{zc4VvTh{uEca12BAQELe-ARK?WQJe$@;#r3z_7x<_=_Ydg%tC zwjYjg4kS6!O_P2} zCfFwz3m@{`eUte;?C>uLC19!viqRBe2ClSIakMY$&_eE? zV|WG!Owl>O8cM2F&af1G*?2FL?$+2H*bS5P8Izfi~9{ssdU54eOMHP zy4M=MPCg7)NF%6zco9d9sL#I%_w_j7Jm}jv-$!bPnUi75bCM=c)eqQSu?K<+e9phs zRm@p0-n20wU58y3h!z=GOymeCWi&sLguPLCYb4b=G0>RTxj8=F3X-)}ufQI%@D$(S zEYhrG_hj--4gOmmgq3o9ATvJ8JJsciN=-ab3BkmXXMD_9wH*o?P`is)ZsO1q?9_ z7y>rrt+t27%eC=$kzF@|$aPZygP>;15SXFP$`r}a4{AwY?l;Q2J^iRyoq`-WcFiUX z9TD>ow3|CJ9mWo1FA@x4k>UtAYb z9#ADW$biSKnX%}dWNx-6_1pHq(^{!1{CPv|%*;b{4iu#O-Ps@aB&YBCqCWT->j*!T z^Po^}kNyIeoDDHL0X*WO&_H@Foo_sf>5mc#7RTR)?rK8JuFj7H#DgWra2;buvIRQ2 z6aO>2;>LJ3_j{v10a{y|$53}vOD%2({O2;V3pHQDWWk(E@26LX31rEBYU68DT0Gc> zf!J}h94T@&A<|lF^v|E+ASAmRg+0k*&|LTqjf*^ILL5+2G>LMKY%!fe<%8qE8uU`0 z?~SMmPnCj)x<5#;s=>dKh=p0uZ)hyzlukQq#L^K1m=2|sYE1_Dv=ns`8j0=^EI28r zg{t4S8^In@#DFA)aDS;G)nE}z__7{`DEaFpw;sYGdF#F#bznjmtK#s!pv z2g0-aqsY;yG+51eZ)>|z_r^dc055%@ze2RY86WUpA}Cv+$;QL59{r|`!(AuM*iZ!V zT?q+QmFe#s=-^1qs_wa;u=>ZfTij?8q;XxH08mIpQ(HXay6deg^xI`o4pnFSDt zo&>d>__2oXJ#gCJu?@b!GBxTzjsn|R` z=vZNje!kI=F1KEFonhkAdGBKdYjRjxS_?6ubn{$bl9Xw+BS|wN<&U1!R6xcS39%&b zNt{^i8%0Qt`!fp`QgTU3;ruYv=vNac@TIZBr7PhVY^A^l|&(pdjdmZNdvhw z9Ex7yyZc{W>yAFd_ve3TRQS54WpTXA-GTL`J)l*=Y*TuCpR9vUuh<07w&am<+{{-WtQ(mL#a6YS)~^=4^GDzGPSOB3}|?}b}`{<%eH~ii>4x6ys?MjIA1089Ai%^#*6O#4HYqIEw!~WS7Aya)musOy)o`-Ed>Q8NO3+TDj zrMJZYd2f#XSlqEu!-u*_L9x-BQ1SD^8uj{XlTU(_=&!~_`-1*}4RK_jyev3R{`~M1 z791cX+KrvEr|%;Kfu0FRnIR|0uSO9e16nP8{H5-yD9d(alC1q0nU!W9ln+Ol>R`vc zp7@;U$@`VHGTU&Ri^gM|j@RJ1v{qkOBqZDNQ97uPxDtjD3Zo7Lz)7WO1*$r3M+_|n zmQnGaI(!( zl^j{G;@h|}?hKR#Hq?nda5R7_6r{YW=;z*osc)>@s6}}Ez>~=2_N+ZwO_Uq_en@xR zTN#PUWw@to61g16^~B_X$Xw$!jsDng&B}V809II-yw_6nZ=wxvGQ?P}2_7;dyY_t1 zjI{M49b2J&Rl2EfRH%(;6)3SJC}}LY$lQvctq)Q2yk#0-a2CR(QG92;5AYOIW~SEA zcF31}B&LjMhZ|kZYAIJ$Bqlk>;Ua9A6QFl@s`6bsORsOy*0Rszh_hGiN_{xv!E-;N zzhOx4VZ#+da*RL9Gdzr+p!XL&r%j+-Yi4aJfg=Yg>R>5`jO&$!SV6Xc?-ikSyRN^C zB{L}zHpei1e`>`{f^mc2CMNL&ZpvZ%K}W9(X2SbEE9qBBho-ve4Qex0X8E{&G&a&k z5WD5U*DG5MYs`vtDHJ2oI?_B_B#VSBEnZL56J9d?I}t_c_$3#5BPm{yEx9>Prh0#o z6B|=OXPj&AeRSFj6~Oob)1W(mRIy{eIaP^n3}rU%+AoxL=VasI={8fFM3fO+Yet2+ku_>KO%GoeXPI_LT{RNFEWG z4((WlceE}ZN+rsHh{{ z50gQBGMgF~q#QE7*yzcZpG*sG;rS~6diQdVl;=|V4-yx=psVDyz$1#Z{1267i z3LuNt5H&Al+%g)k@K~5NR%W~-G>#mTIQLkX$|TdRQ*7^Am-+!Cc(9Y+Prap@!99Gr zFT7j=G!hdqGvQ~_CrGyItAP1yi@5giPkC>+jxhiS1^_j^UQ${SVLP&eD626IHyV`s zQMHxb&i&<6OH0mIDNhx8Bb}SwdkS@VlwF)7bBZ@se>D!6EArjQ6PjZ_jSJN@K>D&- z@~OfEtKQa*#4&h)A^7z+`X6FzYEew%Q1X{|5-{5g$P3tNXkJjJ|W zaiqUut5SvTY}Un#?2tFKz=<~s__6Uk>88Oe2gzwaJ617Xmc8|Wh6H(KRXe4-m>wC# z@oh95y|-C1;&140C-4)rkT9ul$D**D_TB4Up`J|zP{bsCJ4IS!|Ef?2!(d6)o<5+r zi3c6?GQifvb8oj}1-hWVM~)7e}q z9}nwe*3^>kz>7J`CY6M90qg&-$4ESu+}8v`Q9|zq>G(4=1b=y+uuQAH$yIfMhUPRN zQh(TqHJ9bh4XN9^0HhfQl4EA?HQc3_gK02TW3-8>p08=ya;larG6=Z36^7I@(ZMFf z;ioOwgxtEgYWbjhdqMm}IJIV`qzG%k$OG1&rYfY_`sP7Lb>^G6$0tuouUY!@nMKkvpC(a>mXFOt(p60%()KF zmUk;udhd+$?8T(*)*wI0wX>$-Y>&o7I72{1@MoA$j7___(OOV;e>cUaFu$q$>IW-s2tD%D8Rgj0h z*ysJ?cySp)l~L*fH?0cOzcY67Q{ak&a6^F03$H-#bH$%huUMgQ3kvYOTI&!rTYS3* zg9tXai!)7MAUmFYV39$(@vYtUrBj3`&6=7->!I+_$F?QIV4agq9RiuR+`j8_hn zxIr+Z6@~e4D^E1W%i*9!a1uYkmX6h9A1X?tXz>4&wLkkemb`xlH@oyctRj!yH^+ zP^Twd8IQPZDh5RCzWFfnjvvql)%)Y~OFs=vA5ORr@AZY9Fea~H85?Y&n$9x%)>=r0 ziJc6qH_dz<_+<+e5Hz|HG%Ycl-I*j7PT0E@rKZrIzHB) z5+|vIriB?ha#9ka>fDor-z{>EXC*AT`j{lTr({GgUmr{&h?cs;%rm;+E!wY#s* z=5HhlzBpBaMI~lhnbd@WeWpDL`Be9u+}Ie3IbugXGn0j`tG^NY3+2%TQ!JurgQhKa2xG-zoMwG%m7HRWibc0s+$t>?8JUolzTI41m3I;e55Ww;D`v( zO&obKo~Pk1JiNN67r5o*+vvYbYAK|upBE}JPP7{OqERBX5H?j76g?WgQL*6`aEvct ze&2E%P4#40E9y_;mwx)>cMW|7yVvA=CV1=OjQhl>ErDcc8WhO8hpqZ?r0@&y%61{k z1LMk(fm^5!_)s2AhR}X|B|^e=$yP*-pgs@~jF!G^6i$#w|26aPAL!oM@lhsb5x`UD zY_HSEznS}(svR8~-1n!5Qo(AsRNi-%BfYy-T?MC2DWp*bfC>LT$$e<`sG6X0 zcpxYViFCcrRN7fQDZjEsm&G@0_{_fqMW%*=iqZkTpzfp69rhZPFmn2r+}S zdGi-^ z5WI$3Z$$+H$9vX5e8g`#O}Li=!`GZ{_4n~2nOkxUJ54>^v75DRRH0}W z^?1)(eXAF`cjgbWQe;zAq9{Ek1rp%b#)X)TFh{(_Ra)3&XeZS$X_2QaybxcMUTddoUnsw@ zTQKC0$&{sn9$a1lDy&CSZe;I9WPWVg%vHL@q-=1g%!$$to=6_r5br*V{^)rU=%6Mt&Hb zK@=YRdV*m#({2r#sflc?z5FZ;{M&yuG(HI5ud^5(o0s1I00YfK3FO82O6#iDNfKO# z_Uq5T=&%xAU`G=e60B?HEZI9N(d}xv_+NcKeAFZWB?|wfkuDxT@H}5JnW|Re_jHfr zKp=QWt`;$6XoyC$@ALO}vuy))y6qCu8)k&FA%p&6)K*3mDA9EJCd zIENND6`VPnQrQN}`gcmh3f1Y08A=P@0={i~{q6(4-?0+9PydsdklMp;@8m1n{>`np zh?Vces!$IP6ttvlUT~P`Qoti)4$snUz|uyTGCHxT$|I#HzIepUvP@iAl_G|%X4^53 zO)r9h(Q!6CeVhVrlT{XHK!W7{nhfX1PobQS$($PYQ9y>X4+8+Gx`M@j-D`Sq|vKy&xke%M&v(={PLQGFO z|I;M{XKUjS4ZUFw4T#ps>RmvA`H$2SV%m-tIz=K$pk1n>7+?%ytsd?+E7H{G6 zC0a8YU|1rgJo)ppael+hbXhHOH6GbV97Uc83F9uzw+zs}2-@2*^<;j3e{aXiT!+jz zN&;Mz>kUdo(8$>q7C(DyTiogU*4;ffUBcdvQesT}cz9+Aq+^9)ME6TH&_-of?@!wp z3nvKvP9D2_`H)4_i;+;8{9qTh#wwG|n_2HVfBTVq`QbXEJ`ZliRYF0fokz;Gt`PP%nS|aYSKtGEgY848G@yof0qa;<=^pz z;cxsd0WS8H6_@8Y-&+tk*NKe*W6Xtv;=|3R^vgYtl zEI5~>)O2YCh-Q2U|+bk(WuLV91_9DG*`Aan3yO-u;zYVh~ev zY-~Af#A|%Hn8sIR)V@ct)tf82R8>8i$FhY)5Qf3z{%qYY)-CYcPM-(E*n4{ zQg4N7QQ=+^ndg2sQ0x&=^O*y4-HT$ft|#2w)W7N!e;aMnWo@1G>ah_KVXQfY9Ao(P zP+#%4St3+ll~pYsKc0+IiyqO&Re02^X2ig-n;3R;<4tX0_iT}sLPI-0Qw}fIK@`DY zOH11DIEMYq+Z-EsJ_{+GN7B^@bt9R5c&U?HcnP(KeBgrLn9yz#SP-^cEy~abhYK zT3`9ESVo@o0rf@jUyDx9l2y7Y?m2U&ZewLJ(zThd$nJvThtssP)?asm_y!yO1Md?C zZsOMq5=RuZgs0VU7=-$#LB}pK$ur^H&*xqY+Rw|Q zC-gW*LPeo8if`PS9ru_$M1X~Ak%=(E&-@_>)Yowh^XynAuG#0N`Osfbx&r?-h?Y~n z7_n`rW`S@}?{M^cwSlVX27^o?$@jnMZSxPiA7VswQt zL;DryzMami0=dM>PjwvvPxN@LuX>gzAi~5+H>TY6j#p>NY(e7|LLb1R))~ASLqN+N z?!jPZ^lbx_9q)!6V3(BVN-dJGa|%KHJ4meZDn9(em{kjyml5PnzRRTVtq4UzLu$)m zkMIT}3!Mv?EYs30yD$Nc{-@*>^RX+<{-9^T1Pcn;%z#V=eI91EeDF7S&}EZDMr&e@ zVt=4<>1BNuHC(iD?Mdj6DBm?=TCQyteTJR#ifVh}@3LaXJ~PqlNXum{oI0$MPh;`Z z&2OlkhOYo~6$tcc7%gu^Nac+Cs0=GW5RF&0IHX3mMn*f<1{`!{GBFX;N~ZVMw?a7v z?TV(Rb<#(8@{Lzzz5{%Ph|PP}Z^A{Io0TDWy`#h#il;s{Gm74{eUEtY1fFoJ_$#uB zw`?}~3MuNlIr8f`yw|C_iW$aO-zBZZ`6lk!vZANT$oZJ{{7=x%!enOdoa4)sKXmf<|e zCgS?@rFIe9)sSWY8VzzAVC4Nc6{u*7HC`;k-OExLNln|>?Li; zF{xC8U&lwfkl>|`GRmG0q!^Ldn(6U}4n;cYhlS^w0d$V7?ED{#85$FxY;I?7=2L;r z2PR3005i#dgBu&{p)DSQJ5aWa?={0=3z{=Z$A01YiGd)~F2kmO;kEGCf^R=N+m;PO z{qcz3O#2T9G&XWmm4Go&G+x?x;f6}sIpDe;u?$98^nP%P7jb14HbPJ)g}M+lPGCtO z_#_-rZ~UH2$3S=?{SKwSXYHu)RZ8xzY7iIP^$JSq7I@&&9S{%zANQUtm%S*bxfnMU z+vxSTK((D7I8&gl&DkZnY4epb-1QDaC2r7Uf#DoS3b-NikaXj3|BP_}RbfZ6(wIg? zo^Hca+BI^0!l?34_bq6za*+;S7hXNiaNo3Y{x~upTf9ga0_Ip-xGDK(p$PKg@8PUd z3zpCTcZ+GE0Hzm?)x+QGX@cZhZo64al_B?zvxFZzJ^IR#z$P-g*98C z@Phi>OKps@L`Eh82M@KK4cj(xEroOYVy?y+wGZZ^zL$G10Um zree=?UeUG_aYv6>qi-J}%)Gc1De{XGgE-wU*{4?Bynfq0~PB|3u7&nL=w00a7X z>ZzTfA6V?oMKX0#JT9QJ412Z632vGY+Y1k92|aM%!zHcq=+V^w?j6e-2ruI1jjs|I z(*lz6*E2u~S`mIv!bpjZ2=V3Ks1*}wGzDgQR2ek2+B6|GsaMdhgCDRcz-lQz61VwECZ;o># zuWp%@-({?p2UeEE7T+0QK7ajqH54_PbHZZLkum5pq}Njg;)07J+IbeAFN+DUo;~nu zZ+V9LQ=({Z?cRv<;OHd|%Aj3wi;1&zYs+I=EgxD3g_z0dmV!T&XGZva@MY;TG&@n7 zRKn@rr@1Bdgz89N4z_R`GD+)zj;tDp>9N8(h|lS$sS(aO-Q3&)&P#4<WGc=6=v2xK96-_}mnfZe)$sZ_g0D^sGh(JoG)wEpizm#7|A0)ct>4GnD zHl#A9ghHM{?x~Ga#yIcy2|kXv5)7paTL@3wF1*3Kk@AhPZ->jDJW!p**!Zi-jS3ut zWxp)II`>zkbFa#`8xG11>wK7`N3`ezD>@w#0O!-=G)v~d8WCd7&8s|DE&9024yS|o zUZYO{Wm3|2XijX~GD@eXfYWfpl(u)v3aY%o4jf})*x; zlj!Ze91@YH>qXTDOc%#Hn{&@&64@_vdn^(D{WwUa%r#p>lJ1s*ltM6&;+TXyGo^c^}DM5%m+v zxug7&?Emw*CBHf`&bK{ME_n04FQ1M~jdib9r);!tHDX97zEpM;=IQw~E+lhuz8Odl zL`A%GF7)bg)QYoctOPs~oZXaKWAZXY+R<5SXWE+3!^fg$84}sfmUlCvtM$cUlpfue zp<5DMWxi{Jtq>*kaPR1#ZLl%n+c}r(`~vp!%^wD3b}g*==AxU6KaytL7^n$GT2$2q z{Q3_V9^{v^WmWpde7%%_h)QKk3_8~(e1`lFg`Xh1(}*qdMb5G6+(1{v`8~?=)^v7? zHJ)$=NYA+gh5OpPUo!g)%@ri}QdRP>u#wEISTnl|)2 z3|%3)aQM{ zKx}CC&ywQTUYxP++*@dVv_>N9v@s*i2*+z}APHJPrmDeB0(&iW9Qaj@pmq1X; zyfO2?{m|n#3DQF+^4Y6#+KS_J<+J5+;^8Y{x>&+}Uw$_>sWd(Dt{2!V)XZHMv~8GRXO6opvL1sA$cJP+}MT0kstxrSXYj9WapO zvIPPpilphNHlS3c>ne;-{~YY(!8Ir$I zWn$xMYyw%2Sb~06@3P`)D7oD8-e@sOWX9-mux&XzkA!#o^Y6*TCNH?m#jKCZ=Jz6F z1rK~fa`cNAfHd@n#2HhMJz(@!@0^idivNqhYzX`UgUv4m`;Ar5zi*jYg%la=+Y>q3 z-a2@h`_Hn-T-Aug3UDSK>It>If0zP#M=*Xg=W4|ZH{|V%ai&K!AbjECcBq2JtVS)o zDNUMM=_^tk7l}@Dri48tXz4tr!p%9k;6?gL_*u8mYaoI~2bC->(1{rFPs*%BM6Wcb zok=d9?T6#hxd^VIUygap7!R#>a>;AXo=0n*`O$OEYx?3Kns;?mm82yW;Of*F<70np zn@22L6x^%jU1^ZFNonSj*ArvC&;Ay2PJh8R1Y;OowjZ|ax+lDl8EEn7n8o#Jo)Ggk zr$Sw1%7RkkqqLy0lbMbcEd0X4CT>jMwFEDd;xVm|MI37u+#FW49VagN#GMzuERzuz ziE@C3K?4$nF?;-d4xe~2eth>)?cM9o4`vP~>)hINEWu1W?V-8?5f0WxtEbty!jE)O zm;ca{<7exp{y0J~eu=}r*U@LKzqsyp9gJbSkEVk!2JIF_^({9_-#4LjqJ8CH{M;pz zBOS>~Wt-jkNo7hllNS@*;t*7>j_aGsf(ssnf*uE#NbX9jrhhP8|s->yKHsq#bG~Q4#Me zVLCr9f0E`P!R$r-tl%Y@KT`?CrS3=n%K)4a=A|pzP7$l?y2)$5d97HfKLZ?b&ilK- zN^+PkGyTX11=gKyV35d{`|JFhJ*k`Vw|v&bq&(Vg2_x z#=;d@!^!l&MOs`SQp24qEtqHIBREb2;Sb%kmZ&+JB})AyDg_MDoRp=;NPhJk9KAjR z^CD~XHJ0FoA#2gCE-AGxea}f%mg~6YPD^XWZ;`h`Z zK|Z0up?>*Ofr}p0RE8U?GQNc>*LGz@TDxqHkWx5t#2*uK4{Zgs61o&*iTW833UX z;}2G27%I{jfzQcWdbVJb{8Xb_gRl7`atK%Wbx13*!yRPOEs)E}Eczq*T(N>Wm@%3M zq-)=7_<uT1^gf{)L|G87yGjClX9&zM;$ z%JDzw7js=HN#`=1JIa|0S} zC>13$rZ^b#wD=QW>Jd>zrAw3T>?hDH?4cuYdDXCrOa+R%#%=XUyGTtbwdTs13zozTf4+?73d;?sDM}xt3P&Nh+ojk+&B%{U^4q# z^U)xP?YuE182E#*NJb3hWsW*z&gkgtwQe>+4;I?S@4zdvKcXu%BG>&51K9jN&CQE`dK*h|Kb_%P(0Xj;8{Vu} zSvTfASew(tM3k_2;*%8{Ol^1VGkr2XbN6o8=W2Qzo;B1&>%|AU36tp{givje zd$$J(PHk2Qo#P+0M7iq%Q;*hvEw<8IfzPS6zG~&VYrw*O9hjV-)8PKmg|DKKUQzv!| zK8|PWJ`xjmF%Fr4255V@mfC9XN(sajDPfNKczFuQB}r!1whAq z>k-A#<|HUSZfCCwu#6pG>#|?1Aby1Gjbil<;!mFZ)pD=Nkj(PLtNK+hJw$I%yf(CX zI8zN3so=M@-g-MU(b&|z${yBZ-vrZW&j$qaMR?HM(f@&3zT44HO917{DzFhXjAd^_ zZOSNjaFoF{LzifNg(7BCBD}uaz_e_@-YMVn3yZN<_nv6rx>POKMMHx$MnbpA_FTW` zogO>U07K$c1&xa>H=p?^vuM)f#2N_8h_0vOta|a8`vFX4CXeZl;nc#oY+zUb6mmrT zW2zxztRA4qLDDprZVv@2cE|r_FiJf=(tg0za328mu&cy^;zEe9$?6>$7DrLQ^XWhN zv#$OKO0|qU>$&`>K%$^r*?C7N5&-FLC^hyq+cMbd-iB&WcT^pM$U2n~UY7}isVhIj zul38y$}Rm}5V6DfF;ViLAdUMBH#YKR&0S*YGvF$xGK15Z#2&o8+VMH2SgTE#bIXQB z!ec^j-8FptOgb&RaN@+(M@`yT`mGsWy+qR=CoqKuqyMN-b#5L)oBKQn(FnF`K0^9vKFQJXk89pCJiI zU?zL5!|gy_!CgGWTl4Tm`h+zSH`HO25Dx^|x#d?)C zNPQ&UuUQ^jh?T;r?dK)-?Fy1b!Kk9Wcmj9)3(-#Uw4BxU7_exa$7oGD&*-$p1-$84N<%2`XnI+%a-cC4A{C-#K(yeFi?eM|4d4@XY zRZYHYmtTPiCNe^YGx=tplnIA@x3d_vn0SARH<52v z4_iEu$rUxBe=W{T zFX5qppO!;XH1i8VJ9HDvfVbjkq;kr4p{M8zfkgPnG_RXAcsp||`)gMB@FdY+IMcF>rE-_q>A(v_cJXvbK%bsP#8pt*@VLj6bOX`+Kt7mqbT>OQX z=S^u&lmf#mlo$Ha*T@WB%3zpin!uu|81`*>~H*<1h--X*%lndcpaoQ{z z%T^BTH=rj%wD2&}91K|Y&O;HBWg~bN7c14<;6Jur6*|E7F;%WtN3tn!9D+pC2=lQ)U{H;xOcwJ0dV73?^_jkCPTA z+>mzCOaT6YLaBsiBar#(dc5NHdejr;JDw@Z+;;{SG-m2Ybke&c5`}cFM`RZj zz1&|4ezhlIno{5PmslvN`E#Z?Z#1A zU8K!{>)1@{>59-ou^&#ScTEOaYTg>l`k=uwD7M&ZpLbO;rNe1)``rl44~ZI@T`Axu z+D5?bdq_ftL*;kd`B~e?gpd46)N9{>M)*eQKv}yOtlJokYfd2AwgS0mx^SUHXcI{q z6vg3X+w+*bbbQ=Y(F%((9>+QY9S8X(LLU~+MS#xYD@ON%sE{%2hyp7XM@D|um6(Yv4qA2t^pB`TZsolQVD=T(j z1+ymJ%ru=y-5g#O+g=DZi^eR=aD-Gn@Z6{h){kDZaVx~6pB&F73S3ZAA=q+S&Fr5^ zm|e}{{Ni<80wMyp*8YK+_9XX+7O*EmjW;~3evfFo zqcBTa>t`U6{v8Mf*uhTqz&5&m*2%4HRZ!!8XOe4xU9_SPr_x>FeD4<1)4y-p6U67i z;c9MGQSngfW|*V1=WXa2C=iLp^hALM_Lj`OBAdSS5wqy_GqW5<(gDA%yf~YjoJB;@ zFD2Tl^{M3lKDXv`V)B}ayTu4)FZQ9}WM2qa|{F7Zvpt!#Px5)IJg~V9t?;zGj zHlmo>qC!g#*9aq!_W~XBM8@Z`4B~D<+}YEI6tP&*KMeR}AcGp-PdN+WeLRb5z6mn8 zLtOCd(`g3E;pC;Np$Wy>i_s;8-TgvFD4lN!;7VS4^+zNud2-@vag>g5PZ?dUxN|{_ z3RGo4q2dCUfh#-Osi2V@8HH)<(JUGsy>p=wuHfWYA<0ToulLxxX#ZiwyuTa8qm?Q_ zD{+U8i)6%W82A4`j}KArhCOxyy9TTA(<;;r%l?mZ{Zp2lG+#vOVbW4B``yC}R+g5% zNOK($y}<@D&I#|Af*sODdgBXAvNA?jzIYXv-Vx2g^e=fa3HY`u(@Sf($3JXm z07$@WiItG0JO+H-_H6PG%32+w_78~zUa1zaLFYW_N8;I3#WBBh|6<1*u0}YJAMc6!Gg?n{b zp9w}DJ(7wNNK!^s2Lc_GLisrSJzLq$+I{aEG`~;5b?l5_e|G0Z%`^Z8Kcy|3f_=^l zK7Zq9#Sh_8hai|x1+G#&oD8sy2A9Tvc9gxp$6<(e>kvap67;hwIyfkeN=1M0u^g9H zD0@tV(t?AWTmJvB(sCrE>3b1B#o>ZkkDiZjNoo4^fV-Qj?K{EPwzV#Oe$vXB5&MKl zy@wSG66QRG15w2u5~jy!{#nqjFAnt`tw1|Ifggg*Kst6oiLKPt-d8Sj-i{5gyTfcK&l_mST=ng9++xmCw+@18 z3}POm^Ie9~GO!CuaG2}&Majgq-^g-i?o}5Jm}ONHu_*~6lLB8Y4lRjr9Cv|bco#8} zTIa*gl8RrtfJ{YQ=SH}`hXwf$wVk3tw#Rtt|HOEls_|sKM3rwKV!8o)i~zeZs5Y#= z&MTr2WoL?PN60cJ#% ziDwxso*I`?QLCixlhk>OFJGs;*`d9gRb*r!`gm{zGZ$Y$=>B$#792WCfk;GuF*71y zmx0F^Fe{77$2rDxHtFG0OuuG;ofGu17%duimXu=ItSMs`K&=vH{zZ#4HLnOj*SI)` z>W}bZ2=9u6i@p1JB#QOq@;HRTb#;-}QW?&Q45a#AS&W&X`U!*qNCah<2m|UNG<>kS z&D@6Tf$C4^j9H0REQOI2D8;345-ZZ|kmcMn$TPY@-^DMpRCIVqS7#z4+Qx&ARVQ#_ zXuxK8(w)!Wl`d)jMQ1lDItL+Nxcf+s1ao6}?|e+1hGb^AkQhYqMjdr6AQ>zNQ|$3> z69hopL37Uam88FnI!R5GrLDq`ITn(bpIsew-c!h8+Zaf3e;p&y)U}JmtY!R@O8bDv zT{HKMbc=F--)1CXOi*r-pxy`xbp0i13{I@WK{W4Afrne!AckzdNm7sU;U9q01~Sb) zHiziZQ|}PmKXYQSV#@Vu05u&!r>>G6 zX9S;QQPb6ZFURUDB>exUvrZKM%Xr8J%944X01W`oesSfxu__;1MOMuw>)FvQhuaNR zYJ_E|2gB^8*FgWK&xlXfKuu+`kyrg{8M>vsD;fE#G8a%;$&oErp?pkuT{%Zm{cO=i z?Z>!a`O8=>VqT@iC{OE(%oCbqz?Lbr0W;TGhLHVS8gHB2AkE8>m062*v5!!fMsOxd z4Z*Bt(44=iyY$@TqJlT)P)bvKh*PVl$J~&uVkqS5`)$Y-jTCBGH?h(Fxhq9=WgGC> zvM^gYP*~f@TQ|FFf1sa|+Cz8QtZ4zJIntXo}Tj0dzCD^U(qyHsh| z69S}Q8>FKjGP8lEQQ}Sz(r8Cr#o~f<%=DB(`+KHKyz&c(eRNZKYtIO{(u+$u1{?)l zgd9?Da|m~)_lpyG?;G}>*w&gWEo+!Di^NERPQ$Y3n2#hx=1Bwi1;!umXC|y70(#R{ zqGvsOkQ_%}Q${7=zH=+BL4^Y#QNKIgy7jUuCXgQ+{fh7-)$N&@9)x&`$ltO5<7JtK zKor*%dL$Pa#tP($sF`2I-e59Z#qGVK-e@@|VsN*N;%@{Y2=jEW-{eHvVf4(F6h{`j z*(89J?~9Z6Y#F)fVBfkkM3;h?6}(b!O-{I)&&l){a2_?D8$fr}(|-x#9>RKhmfnMA z4TcTj<*IZi;N3601k}m41~J}Mpw$ylFdVHSi0!LCDM#cVj0t`Hi1(fRQJRc9!Vd}5 zSxCr6t2SnvNn5d;k%`#3#|xb3Wa{D_86pu zZg0y@sEqym@r}!5?^80Ajs-K4lTHc*BYF>W#m4W`qr8tXPShJ^6&(T+lBxUl6-4wg zd}c%G9Nfl_@4=6+Z};ni`&0o6FPj|c&+jotjwUk&5my)s87f8VqCyYk_kWV*tFMAc zafz&gNZP)Yx)6@XZWsR^5if{=5*W!Wk+*JkXl+6L+)G^sfTl%HrVgtRQOW?i01E$C zycIv7Ff>jQPUE52C8i_U##TYkn}9tP!nn(=eTpD#U=(HE z^LgDSvMV+URaLBB0*RPL>u-VU=17l4DRaWO6RgMxLjr&brx|~L8z)6?vTg=1P8tBK z1=uZ0-*%`YJx&O`7zyVizy=yo=qfF{7z4pqQ&wc|3nGDaEh@O%RGF$mtv&4X8odvI zgh*+v2^61Q@FL_R$fw*0LzREs`*(Uuc2lw&%z==ZS8A}ykpUDcp75Six843&gvN*_ z7KnKQ_Rts(E8cescJG!JqGqWAIV%_cg%7N1O!>m7mY|E|R~sQFldv{+^MB5HF!P`y zksa>Xtndce@6p8{BVIwcfh*oK*DNgwArZ4~C5o@pX2Qs8)g`9Dy1z#PBcmc25p2>u1AI~&KW}@56lQQ`L-VZ{3s9S80my_ z4fnEG5uY=pC)Jhc`WMS;5o{i7NnIuNyF&=FIH%xU)2pZC#fo~glJ@)|I6pSl3y(N( z8;~%#eP+z;B3Uw<-v<7K`JmME)H@+>0?mTZBFpzrj@~gGu&)?|vkB@;PQag$!f0Js z$=Hk7VQ*f23Rm^N;LJQ&IUiczV3x{pFWGmHX zFopsBQV9PBHAskJamwdDt57qL@4~g3(7L~UzJwRQATN*9xT_y~0D6+hk2cPF6+fPK zAcozH;Qc;1ZdQf9{$Nfw@8G;Y2z?~ULP}uipgja@6)a!1R2Qb@2IPuY=);x%K|~kX zLPK!mMsz?l(3#kJLe-dK6SIB4fS$e87x)oDuAP!UC_ykaGR6kE@3I8%zY|?}q<1V^ zwUj1y1gjtGRSms?a(QuVag*tgmo zt)z1aMPruw0YoWha2!kN&7qw*Uj9JWrKkkV$56gIBLU>65YfK2p7yjJb_Ofo!Uru) z=jFCOo-D8DOhoKsCtD9m%rm^ch^5XhrjP4B2=#ae#kw8|yiB!Idm~)wlhfu-=reft zKbUhUDZzoNfKve<>bvaMWX}?a`FIY>^ppkX$}cy$a7m#&bDJmzXK~gi=!-?MN zWK6a}>O=Hxm}zR>^=puPu|095_y_~mm#--NVX)!(VTFJt9j|XrdDgPrUq^8Wrpny zQWuq=obnGM@dF4=QZ7U$cteOp_=%}LfGn%WU(gSo!^00*Tpv_IOSq>hB``(Rn1(x( z?_mFZV++1*+}`PCU!4!&Ozn^pY1kOYND9i37~5wU7A(lpW2Yb-KD@(B{{%i2qnKkwUUZ=fQbn?AFFhYQoKc#1 zrPmB#Zhx3af!Mf{G(SaW^$9t6SF#UdO1xfgG6F{PTKI`|&xbm`G9z&ZNCkgzSKCd- z6#aVaWsYA8Zgod6!>|htwK6$#TdJHNhJ-lvAD}-c6^Y#63)G!~O>gDPBozr5NAsv7 z52FSEt?H>P=^X||=X)7z;4nLS{;XuUy{ZBvV;?_2lPjD&#Q%_G6A;7}dfII(sPQ#a zvx}Dv8XLB%f~xY~+JKF*J>4R4(e;l&jtxeAc2VjW$r`;4T24^4^uXY{@luTXP7*O$ ztZ!!6(LuNfRUy&(qB(Pd{m}(YTs?px5Z!*mo>Z;GVD3eOS-J_Pb*$C8mf5Gf=kt1 z?);9A-%8g+mpDm&z@NDp6R3+JE(*Kr)gJL_A*TfwmqV;sjYoTX0)(tnQY88MIIAsa zTI_F}bL&=EEC#hacdIs}o}Qq|t3fiNNk&boCrcI&S(*;T*a?~sHi64ojzk|TtoXlF zcH5C;%-2m!R>{*UaFQkW_2ecp(j?-8Li#1mWsi^YkR%8$;7KHT9(Io5Gx=Gd2T1k= z{eF>rD!;f_rx!~*5*+T$HP0;&{y{)@DyQj&hoFp1JR%HhRFGm`YyR{Tr1Z$Uh&3o> z)>S<1m7Cx`wYbZ=@yJf6e}EWjvds|V>ot6h7Ca~XYcJUr1lbTH^5UoOihSI?0_v49xYG5JEgB@9N80+B&`}{m zLV*@fvXtgpm>juH3GcWr)7_P}9S71JzCFm2@N!C9BS7YxL=nTk^oM4zZOnW1kmz0v z`~PYUQVmg!LvR$A^^^38GfqHU5bugmflRpslLc_^j)bgW(eH{+iH0>@<+bnABBwsy z+uWQ~$#EU=Zgn*~yNTF`j!c~=Q`$R=M%Wuy;X-y*#Ow?L%H}pvVDz!Ow|IIRp%sj+ z(rBKzqDV6$H>tp^kNTk5kWFJ&RK8i8GTA%n+SDXK@&-RzwyEZsLk#@@( z!4PV|3RC*-jeiYySlKM@u%6)Vd=~#!hj;$RVJ8}=R}R96A;si@m4)Gl*!FE97yb~< z!;sxP!5he1Dcit8zmvr|4plkUP?WEBJ1pJL6wL}w?G4Yob8DPQ$c%)_N1;KNyIM$^ z=mMs#u)lFeutCgQ*NYs(I^i_HJY(XYU}5`;4Qzs?GlVM~rebwo@|iRGeiqj$dfOyP z`25!%8#ez(*JX1N;||6r4(MGzw|8TxRX()eE12{O>tpn~K3vWcYq-}{V#4mqwl*v@ z^y#lk8s~3;7rmx2X)y+dhg{5F2#RA42MwnDJ9r*lDQxLXcRZXz|wY#p{k^BLLGwfHp3>7yBZ@Ys;`;zuMH z{=YMZpOL%<0;T&gCC5zba^j}@S7bPdc(n>YkId~{sMqH_kXp$aVNlNl5e9S=cPno; zj&aCZ6l-e?h=S6hbjTxcOkfVQurr-Qv7h1Y{ZY16xhCbC8$dj%lpFkpm-shv?kI;j zr?bT4S!xxads7)K)L|*1SP?yQ7s=7$7u?s&`q`f_SjH09N@Uj$3POm3NV3yhGKY+! zY`W=UnQM4@Sp%C`7x(b?$!bJz&fk8G7m?4)L6U+%p}!BI%s>=%MiwF3birt&M?0oT z7S1(%*>oO$tux<$_yNo!DZmL<>#^*4ABpIIRX)7&a~p+WnZzo0xBvG#Jd>4NeRqah zXH}b}3-##*QrBiUBIxBMhIl+D^JHS`D_BUHvAL&Z=E9+TaDHmCJ07{7`GL_-Z5__& zIB>Z*8JbDsPfspr_)Dxfg_z>_KnnO@66!&g?W95ezG81OalwP-mri0VN`)cv7AWl$ z@g95HtKQLE`@j@!@}z)v-@TD4*(3Ze_P?)%w+cXH8s_slL|ol=i7jt4aD(W+g}u|d z-!P0rHE9>QB)xPFt#mT{cgxiR2!~#^hx`){I=Yvy5~W*GwWoMdccl(7v2SMcv~0Mw zmL8~f&LaCrvE%V*sXZfjHO>;w>t&JxM41M*4d5tO zj&*226g+JqKMz%kZ2N&2=LHZ;nGj+14~fUsWL;(;IIQ?EW`P_n=>;oh!P=pS&k9C; z?G?Lu`9e%PO)^l59gnBK5v6hHM3Dz+xAtGg`sfQ`fey7n25qB}B|AkTeFqd>>O6+( zu;4N+#Ho*OHc|tesmNDcvdxrmC}g9c{-`_1;VJdRwu7CF_25rk$`tDY+5cGR!3^(g z(JWWu{6Z9XuQ9=HQxXteZ~+`&cnkV1>z|yRJJ_V=e>y$drZ>oifQNC)Ujuq3c?3)O zkxpW`psv@uf3_OEHa;~OCyUeCiN}BglpId&rbabQ`MS$|^hudn!AYpR>Q^UeCXgKc z`1c6a=9^&p6g4f7j4oUtXiwM9;V?C2)JXBD>c) z_buCxB87ZVK-X2xTKb6vaZ+?UU}&{;2Zd<46x>~{H+zt|!h?Ri68&T-kah`k^&CjQ z?=j@o@m4k#q&t|M>-@?-9xs?=p8nG=@h)_xG2;bFkSSS~&DsY$ohMn=E^z%$Cy^s`5SaV$Z{BNmf)^RE}JY_{0l;KiE?i$QI+Gj>5@)iR!98Todo z*X(?Fule9C+$qprdp45oV3Su}((_D|(L?nZXnRs%3KrUHHPsPZG0PWz?qz>+w~RkaXXa^2x3`<=#AkBb^`XP6~U+C-V+^E`1v$)}hc@``R|0}J-$nWlwea_zerN$J_c z#~+6T!J*mMehv9?=mC?rg}t@)RazC-c@wAC^Z7a{luxUGZSMd}bc_9p%tW_;AWsS| z567wDeAoY0Fuiwg4vRHxYHzAskgy1Jae(Of8rp5x-~2A8mEUTAVX;FnKXs|T51VY% z{|98`y+GsE{|a^avSMozyX?4^n`(koxq6;dH%l~SjR8soo81PNd*>xnisV3jfwvHg z01xpZXVv3?5-+%l@lRKH)W=&-84?2Z7z9PZL9lePQ-=*d$w~4=0_oSv-DMP+_NKi| zML`(f|NW-hFXZ3UMqSM9cB;Hde_C3KZ(3lqoSgy`U&4f3qf$2Y@Ee3wy!RcvJ2%a# zt1*)!O0h(ZjfLp=Zxur8fG_a?OnW?g4{A!z2aOpSx}lfQFH=LVDK(FMf20PYvC|O>$8qV$p8(L?@PP>~U;)$gsM42G0^viC%D#5+7w+@b7Bv?~ZJ|9Atb5sC zb%V#CJf`>z?u}hN)%dMM&!zV%&2c_^cYvfpAym5*?ODS$fdJa@VTP@6BZ+ybb@ef~ zWZN8l*7y()Q7x2&LSiYvC|AMb7=KYIF{#n?PTL}qq?z-{fVZ^*aE3&AK_BC5a^ZTW zFyVmxk;)=PaAkkaDZM&ZC`LaZt|J)KeQ*@1i8Gl#33109E2j&+ov6qarEa~$T!iq6 zgV2!Ja})rMv`PA^H~6MlykDqb6wCyw_Ba^6!NFUi*XVV#4hl_(qbv-^WF!{@JSMaP z)v%t}xMPvu<|k}e2z3D^% zY&W!K7{-1EK4g#<^9N}0( z*C_RD037jGhlTd{i~BKC6?!F+k)G%0&Z=~{Q|$9DvFxDV79{d_-RXviT`KLZZi~w8 zuV&Cq$EE0uRUxV7z^3m%@Eu%`-)e7hwk0v@^yvYf9nsSMJHX|~dL9q)2s`1WR7RBb z)CCzVqwtayBSafFwntC+N58@Efz=kE`~bCuAgpbX`E*lBR=KABZvM3_Y~J49AR!b> zY}23L7NqvP9qbS+!5Ino1~3~{Jd@?&Z!SPBHVN2H`EjNu`$_-IQ0MZ3@2FJ3h?0O@ z5g>f#0wuj?RZ5{N`q^jXS5V;a1r(M_|Nc!VWX5YKAc1WHeku6x_AS)<7yP^B^}CH^ ze<)6MH1*w?H7K%$gmEz_CQNO$W(kN>AKn-4R}gz#=Lb%r=@N?)orabB44}-l-mz;@ zV2n#uwyGWt9|k?*oVE5PP?a>*9g*efIv}>pKYNgl*~Pl8@qpFM-O7ns z5qVZ(-oUnmf(VkZ9m08ZREk}z$BJ9!x`!o3Sctez5!^F_jvgk2g1A@^_n=_b3xpTF zJ!gv_r`QcZr3oz8R0oNSPAApn6q}TYUlr%2xRWdj=a@4DCOm&1l#unSwv-vnj5+h0 zs+;5e0uy`BI}0MWi%DHg;;eGXcPd{%X{?~e=_asSm#SDW3oKid4KsTEwXBpI?v*54 zX!R4Krlvy^e$9k$yzfd>JdiUuIV-CWK?EM{-89(9d_Tp`X=llT`EQO@I-0n*@Akb2 zm0!;33Mt>t+$dsQ!-vgYGp5h|>kVBL@bO%Z^|vL#T@q_=fv#%?bLC%xEE-Rz7JA=h zZ`VmRg`CmK9*^exlTl7HG2x{@PA@_|?rUg%A>SHSzj%5M| zw);YOx9lR8w7O?~t__ILSZx9}f>%V~x2>LYBL}hZk`f2ZQRUM`OE8T=x~pZ!UOp}+ zt2Ev&vXBC;@rqPe&DWj8IJ2(Fa2W5GijPS5Ti}V0q(eLc%=U$sn#%wEN4suAxJ5#0 z+XAC9>P2(PQt zWhQfwJNOm^5s)ltyN#j&;Fe2wTa|exbK%C9qh~zf-a#4 zE~a9KlZ6?wGLo>PJgtwyM~L-v$oSeSSKTO~3>4Oj*s_KKR;wT#v-Mr>!HC(JM22Mg zRoPhF<%f6XY$1*htCkMBd>m!vZ7v;Z6IuZwEPF+iT;!U7{o{+Mg9Lc1IO5n&C@t|Z+!gAo3ph=MR2%~UEwBUvluzvP z$4Uov_;r8!Q~|?tlaWn7o^S<_%Bc%$jv$sbHH1-D4y4(f&R;^C2?5enSiMq5wkDP% z(wUw@YGVkqB(mrDkj3>W7W`{nYszRqKH4TB!@t0AF56H^pV{I7qABX2E#^chvUXz; z-dO0QgDV|U{x{&`iPoitL%d%z7eiaw${8rv*j`&cKmU)STLF$t z+rP&h9`fEC#cWfTOPC1L%95##1SsjxTVkNQ59~|Eg>0i_^QqW6HRfcjZ+9i7NwIzv z1u(5_vcH1#$V*@Z58(|ix-15IT2nB<{ZEKC(@JPNp-ZKLG#*Z{Ck+Ir>USE7{x>2^ zt3BRG%oz&}8D39UCb7i(8CR{k4Yrx4Td3{vAH)B&+Zvt!nJ=U47gzO|G-($)>)VY# zFdz8rB*-@kAanv*Jsi$Pt-D0grs`Ta0`W6l)ErFn|42U!_QUH9=NmBy;(aduGcLR( zt7byck0(lK^L^>ImfA>h<(MF(JvAoact9M}sr-JrC%wd{_NyC)l+sPBOl+F(fE7+- z#u@%^g=WPu2tGmUeTtL4j$m|^1laBieAqShYgR#)Z$-u|@IN85S50;l$PfK$>U98& z-CD3qnpMxlb+&?VfJod(sK6B4pbl(>(%}^HJv89pD1x4mdr%8r&8eHr`-vW(a75k9 zq6Zm!w-KunQwSGKOY?{J=Q%CnszAr)Jq>*uLJ&&~^cL()e4^o~}zT zv$yUZW;g;e_SQNMlx^j)qWw9Yo691z%~_!l5R%(X%We5#D}|=kX7?S|=rl**QU6>q zX<-8(tx@IvFmh#hl*|oyOjL2l!0nY1&47`ll_T}vT_>`J$L6aUkPXDZ0O;Ro_kIj!I(O@;RW_-{vK!3vCmN6^h6lr@t$r<)vaCg|n(F{B1K-%|lzTRB zPnYMq4grs>-m=B#H$DO7bApeNgq(f1w=+(^Zkc;_m%#r6Q2l}uk&9SjtZ>34?$8f# zOWETgYf=*P8=ngV5)0c71m`;QVyx$@QEe>_O8pzWSvtqn)XHa(VW6jsiG^dKS73dZ z2XmE!o$DTOcUx_O#L|)}yW1GVsGj`Q3*<4zVjwHF8FTp|j2>mHCCda`U^gk)reT>= zsH6DmRRk5@vusm1ejs|wIm*yrC@(O55Nq@M_GQG$>oHLFu7MUXdLdyK2nER-abeUC zZD?MexcdM4L;p!roU){7+cLjWBbpQmVaQtQOP10_@z=Z*nA%(D_ci^3=0AQ;N$dej z$$;JeE1HD>gmoo6xI{7Ao|=c)>3*3F^Qek9?4RBhYZ66L44WBJj@6v7HOTcLih=OL zsHB7N31S6&S0FQ!MQ>5$JO1O3uO8|HCuko$coW*1au%a5|AN4gt;(Smxc-MU@Cn9- zQz2B7=J@jBwPO8meX!C&pwea^K_~Q+wJ){HZnBUa@2b^EG$O!-01K=8#^jy72UY!Q zs2D;gQrP`O3$|{NU^PuD9@Cd5K-O>lbbb3Z_|34{|EGNTHEbb5c|dFI4f1a%)sxZ7^WRx!jUNGAPiXc&O;HBWg~bN67WE8 Cgx6;P literal 0 HcmV?d00001 From 2ad43a9508ae77b7a76e1ddb171934fafcfc4a72 Mon Sep 17 00:00:00 2001 From: Atharva Deosthale Date: Wed, 15 Jul 2026 00:41:05 +0530 Subject: [PATCH 3/7] docs: address OAuth2 server review feedback --- .optimize-cache.json | 4 +- src/routes/docs/Sidebar.svelte | 2 +- .../docs/partners/oauth-server/+layout.svelte | 2 +- .../docs/partners/oauth-server/+page.markdoc | 44 +- .../oauth-server/authorization/+page.markdoc | 158 +- .../oauth-server/clients/+page.markdoc | 1770 +++++++---------- .../custom-scopes/step-1/+page.markdoc | 10 +- .../custom-scopes/step-2/+page.markdoc | 4 +- .../custom-scopes/step-3/+page.markdoc | 8 +- .../custom-scopes/step-4/+page.markdoc | 10 +- .../custom-scopes/step-7/+page.markdoc | 4 +- .../oauth-server/device-flow/+page.markdoc | 199 +- .../oauth-server/quick-start/+page.markdoc | 373 +++- .../oauth-server/scopes/+page.markdoc | 272 +-- .../step-1/+page.markdoc | 12 +- .../step-2/+page.markdoc | 10 +- .../step-4/+page.markdoc | 4 +- .../step-5/+page.markdoc | 10 +- .../step-6/+page.markdoc | 2 +- .../step-7/+page.markdoc | 4 +- .../oauth-server/tokens/+page.markdoc | 282 +-- .../dark/oauth2-server-create-app.avif | Bin 24357 -> 24200 bytes .../oauth2-server-create-app.avif | Bin 22852 -> 23394 bytes 23 files changed, 1662 insertions(+), 1522 deletions(-) diff --git a/.optimize-cache.json b/.optimize-cache.json index f0a14ff0cd..42482acac8 100644 --- a/.optimize-cache.json +++ b/.optimize-cache.json @@ -1589,7 +1589,7 @@ "static/images/docs/network/regions-map.png": "c65f1423ab19c3048bf8bf93117e8f2e1d13a2bc705c00307de7ee821e5668a1", "static/images/docs/oauth-server/dark/oauth2-server-apps-empty.png": "b81617a77c6489bc93cfe3c118c2fd075eebda850fc5803cba4b1b62792269f1", "static/images/docs/oauth-server/dark/oauth2-server-apps-list.png": "a0b1a9bcc5708bb48f7d4684d754cfc8af8e666f808e11d00fc42182ee7ccf6e", - "static/images/docs/oauth-server/dark/oauth2-server-create-app.png": "8237a7890f6246661086cf80b7eb6cdbf0b27b4bc1a5cbcf485209ef9a27dfcf", + "static/images/docs/oauth-server/dark/oauth2-server-create-app.png": "7ecd5625aa964ab77b87440e52bc866a4894dffe5183a0e86f7a46b8c438cee7", "static/images/docs/oauth-server/dark/oauth2-server-discovery.png": "e688439f87c4ae73086b76ee094e036d5bddb14b9431aaad5901d281ab3ca413", "static/images/docs/oauth-server/dark/oauth2-server-secret-created.png": "d675fe574706d58b224ce823c8904145482472f64ab940a8bb37b92fcc33008e", "static/images/docs/oauth-server/dark/oauth2-server-settings-disabled.png": "ad51d531eaa3736839859097c024bca41a28d1339ceef773e376c06936e040ee", @@ -1602,7 +1602,7 @@ "static/images/docs/oauth-server/guide/vantage-landing.png": "dc597717bcc93de02b2e5336a0f05d743ea66e6d91cef40fbdc61f8380577bec", "static/images/docs/oauth-server/oauth2-server-apps-empty.png": "6f7b5c2021df2db7a3a1c4da3dfcf9b2ff119e98450e755eb64f03263030da0a", "static/images/docs/oauth-server/oauth2-server-apps-list.png": "e3f38509e45e502f742e7532ae1a19bdd35b0891821b6a81601b7960ff16b38c", - "static/images/docs/oauth-server/oauth2-server-create-app.png": "182c207475ebd8f386d3d1ec522058f23f59cb47d85f4b681889d0dd08eb8cd8", + "static/images/docs/oauth-server/oauth2-server-create-app.png": "fafb26a8844e4d792a8105c1da2f4c403df117887eeda0fd1c4ea3384929facd", "static/images/docs/oauth-server/oauth2-server-discovery.png": "5b75f8e780cac92a68fda24a9686ba89ce83d89ac66e5f651428b4c62bb81cbd", "static/images/docs/oauth-server/oauth2-server-secret-created.png": "5a6d48595018a8faaa26aeafe099c3dda23613a35e49884decbecb0029449168", "static/images/docs/oauth-server/oauth2-server-settings-disabled.png": "648091d9d81308ab93dd456f172fa1c1977c2fbce9b8aa03893398bdefe10595", diff --git a/src/routes/docs/Sidebar.svelte b/src/routes/docs/Sidebar.svelte index b1c7a1edfa..7d6432d285 100644 --- a/src/routes/docs/Sidebar.svelte +++ b/src/routes/docs/Sidebar.svelte @@ -103,7 +103,7 @@ isParent: true }, { - label: 'OAuth server', + label: 'OAuth2 server', href: '/docs/partners/oauth-server', icon: 'icon-key', isParent: true, diff --git a/src/routes/docs/partners/oauth-server/+layout.svelte b/src/routes/docs/partners/oauth-server/+layout.svelte index 19949838e0..047de6bb1a 100644 --- a/src/routes/docs/partners/oauth-server/+layout.svelte +++ b/src/routes/docs/partners/oauth-server/+layout.svelte @@ -4,7 +4,7 @@ const parent: NavParent = { href: '/docs', - label: 'OAuth server' + label: 'OAuth2 server' }; const navigation: NavTree = [ diff --git a/src/routes/docs/partners/oauth-server/+page.markdoc b/src/routes/docs/partners/oauth-server/+page.markdoc index 554ea1163e..8e79a9bdda 100644 --- a/src/routes/docs/partners/oauth-server/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/+page.markdoc @@ -1,11 +1,11 @@ --- layout: article -title: OAuth server -description: Turn your Appwrite project into an OAuth 2.1 and OpenID Connect provider so third-party apps can sign in with your product. +title: OAuth2 server +description: Turn your Appwrite project into an OAuth 2.1 and OpenID Connect (OIDC) provider so third-party apps can sign in with your product. back: /docs --- -Appwrite can act as an **OAuth 2.1 and OpenID Connect provider**. When you enable the OAuth server on a project, third-party apps register as clients, send your users to a consent screen you host, and receive tokens your project issues. The users in your project become an identity provider that any standards-compliant OAuth or OIDC library can integrate with, the same way apps integrate with "Sign in with Google" or "Sign in with GitHub". +Your Appwrite project can act as an **OAuth 2.1 and OpenID Connect provider** (OIDC provider). When you enable the OAuth2 server, third-party apps register as clients, send your users to a consent screen you host, and receive tokens your project issues. Your project becomes an identity provider that any standards-compliant OAuth or OIDC library can integrate with: the same way apps offer "Sign in with Google" or "Sign in with GitHub", integrators can offer **Sign in with your product**. {% only_dark %} ![OAuth2 server settings in the Appwrite Console](/images/docs/oauth-server/dark/oauth2-server-settings.avif) @@ -16,23 +16,39 @@ Appwrite can act as an **OAuth 2.1 and OpenID Connect provider**. When you enabl # How it works {% #how-it-works %} -The OAuth server has three moving parts. +The OAuth2 server has three moving parts. -1. **The authorization server.** Enabling the server on your project exposes a full set of OIDC endpoints: authorization, token, userinfo, discovery, JWKS, revocation, and introspection. A keypair is generated for your project on first enable and used to sign tokens. -2. **Clients.** Each third-party app registers as a [client](/docs/partners/oauth-server/clients), either confidential (it has a backend that can hold a secret) or public (a browser or mobile app that cannot). Clients declare the redirect URIs they are allowed to return to. -3. **The consent screen.** You host a consent screen at an authorization URL you configure. When a user authorizes a client, Appwrite redirects them to your screen, your screen confirms the grant, and Appwrite issues an authorization code the client exchanges for tokens. +1. **The authorization server.** Enabling the server on your project exposes the full set of endpoints: discovery, JWKS, authorize, approve and reject, token, userinfo, introspect, logout, and revoke. More advanced integrations also get device authorization, pushed authorization, and dynamic client registration. +2. **Clients.** Each third-party app registers as a [client](/docs/partners/oauth-server/clients), either confidential (it has a backend that can hold a secret) or public (a browser or mobile app that cannot). A client declares the redirect URIs it can return to and the post-logout redirect URIs it can end sessions at, chooses whether the device flow is available (off by default), and carries what your consent screen shows for it: a name, logo, tagline, and description, along with directory details like tags, images, and contact and privacy information. +3. **The consent screen.** You host a consent screen at an authorization URL you configure. When a user authorizes a client, Appwrite redirects the user to your screen, your screen confirms the grant, and Appwrite issues an authorization code the client exchanges for tokens. -The flow follows the OAuth 2.1 authorization code grant with PKCE, plus the OpenID Connect layer for identity. Because the server is spec-compliant, integrators can point any OAuth or OIDC client library at your project's discovery URL and it works without Appwrite-specific code. +The flow follows the OAuth 2.1 authorization code grant, including PKCE for public clients, plus the OpenID Connect layer for identity. Because the server is spec-compliant, integrators can point any OAuth or OIDC client library at your project's discovery URL and it works without Appwrite-specific code. The URL is the same for every project, with only the project ID changing: + +```text +https://.cloud.appwrite.io/v1/oauth2//.well-known/openid-configuration +``` # Standards support {% #standards %} -The server implements the current OAuth 2.1 and OpenID Connect security practices: +The server follows the OAuth 2.1 security practices: the password and implicit access-token grants are not supported, refresh tokens rotate on every use with reuse detection, and redirect URIs match exactly. The implemented standards: -- **Authorization code grant with PKCE.** PKCE uses `S256` and is required for public clients. The password grant and the implicit access-token grant are not supported. -- **Refresh tokens with rotation.** Every refresh issues a new refresh token and invalidates the previous one. Reusing an old refresh token revokes the whole token family. -- **Exact redirect URI matching.** A returned redirect URI must exactly match a registered one, with a narrow loopback-port exception for public native clients (RFC 8252). -- **OpenID Connect.** The server issues `id_token` values, serves a discovery document at `/.well-known/openid-configuration`, and publishes signing keys at `/.well-known/jwks.json`. -- **Device authorization grant** (RFC 8628) for input-constrained devices like TVs and CLIs. +| Standard | What it covers | +| --- | --- | +| [RFC 6749](https://datatracker.ietf.org/doc/html/rfc6749) | OAuth 2.0, the core of the sign-in implementation. | +| [RFC 6750](https://datatracker.ietf.org/doc/html/rfc6750) | Bearer token usage, including `WWW-Authenticate` error responses. | +| [RFC 7009](https://datatracker.ietf.org/doc/html/rfc7009) | Token revocation. | +| [RFC 7591](https://datatracker.ietf.org/doc/html/rfc7591) | Dynamic client registration, useful for MCP server support. | +| [RFC 7636](https://datatracker.ietf.org/doc/html/rfc7636) | PKCE with `S256` hashing. Required for public clients, and a project setting can require it for confidential clients too. | +| [RFC 7662](https://datatracker.ietf.org/doc/html/rfc7662) | Token introspection, for building APIs that validate access tokens. | +| [RFC 8252](https://datatracker.ietf.org/doc/html/rfc8252) | OAuth for native apps: loopback redirects match on any port, and public clients can register private-use scheme redirect URIs. | +| [RFC 8414](https://datatracker.ietf.org/doc/html/rfc8414) | Authorization server metadata, published as the OpenID Connect discovery document. | +| [RFC 8628](https://datatracker.ietf.org/doc/html/rfc8628) | Device authorization grant, to sign in on input-constrained devices like TVs and remote servers. | +| [RFC 8707](https://datatracker.ietf.org/doc/html/rfc8707) | Resource indicators, so a token can be restricted to one of several APIs behind the same provider. | +| [RFC 7517](https://datatracker.ietf.org/doc/html/rfc7517), [RFC 7519](https://datatracker.ietf.org/doc/html/rfc7519), [RFC 9068](https://datatracker.ietf.org/doc/html/rfc9068) | JWT access tokens with an audience, and the JWK Set published at a well-known URL. | +| [RFC 9126](https://datatracker.ietf.org/doc/html/rfc9126) | Pushed authorization requests, which keep the authorize URL short where it is visible as text, such as in a CLI or an MCP client. | +| [RFC 9396](https://datatracker.ietf.org/doc/html/rfc9396) | [Rich authorization requests](/docs/partners/oauth-server/scopes#rich-authorization-requests), structured constraints where a flat scope says too little. | +| [OpenID Connect Core 1.0](https://openid.net/specs/openid-connect-core-1_0.html) | The identity layer: ID tokens and the userinfo endpoint. | +| [OpenID Connect RP-Initiated Logout 1.0](https://openid.net/specs/openid-connect-rpinitiated-1_0.html) | The logout endpoint, with per-client post-logout redirect URIs. | # Concepts {% #concepts %} diff --git a/src/routes/docs/partners/oauth-server/authorization/+page.markdoc b/src/routes/docs/partners/oauth-server/authorization/+page.markdoc index be7872d8d9..ff12a3085b 100644 --- a/src/routes/docs/partners/oauth-server/authorization/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/authorization/+page.markdoc @@ -1,29 +1,105 @@ --- layout: article title: Authorization -description: The OAuth 2.1 authorization code flow with PKCE, and how to host a consent screen for your Appwrite OAuth server. +description: How clients request authorization and how to host a consent screen for your Appwrite OAuth2 server. back: /docs/partners/oauth-server --- -Authorization is the step where a user allows a client to act on their behalf. Appwrite's OAuth server uses the **authorization code flow with PKCE**, the flow the OAuth 2.1 draft recommends for every client type. This page covers the flow end to end and how to host the consent screen it depends on. +Authorization is the step where a user allows a client to act on their behalf. Appwrite's OAuth2 server uses the authorization code flow. Public clients protect the flow with PKCE. Confidential clients authenticate with a client secret and can also use PKCE when your project requires it. # The authorization code flow {% #flow %} 1. The client sends the user to the **authorization endpoint** with its client ID, a registered redirect URI, `response_type=code`, and the scopes it wants. -2. Appwrite checks for a user session on your project. With a session, it creates a grant and redirects to your **authorization URL** with a `grant_id`. Without one, it redirects to your authorization URL with the full request so you can sign the user in first. -3. Your **consent screen** loads the grant, shows the user what is being requested, and approves or rejects it. -4. On approval, Appwrite redirects back to the client's redirect URI with a short-lived authorization `code`. -5. The client exchanges the code for tokens at the token endpoint. See [Tokens](/docs/partners/oauth-server/tokens). +2. Appwrite checks whether the user has a session on your project. If they are signed in, Appwrite creates a pending authorization request called a **grant**. The grant connects the user, client, requested scopes, and redirect URI. +3. Appwrite sends the browser to your **authorization URL**, which hosts your consent screen. The URL contains the grant ID for a signed-in user or the original authorization parameters for a signed-out user. +4. Your consent screen signs the user in when needed, loads the grant, and lets the user approve or reject it. +5. On approval, Appwrite redirects the browser to the client's redirect URI with a short-lived authorization `code`. +6. The client exchanges the code for tokens at the token endpoint. See [Tokens](/docs/partners/oauth-server/tokens). # PKCE {% #pkce %} -PKCE (Proof Key for Code Exchange) binds an authorization request to the client that started it, so an intercepted code cannot be redeemed by anyone else. The client generates a random `code_verifier`, hashes it with SHA-256 into a `code_challenge`, and sends the challenge on the authorize request. When it later redeems the code, it presents the original verifier, and the server checks that they match. +PKCE (Proof Key for Code Exchange) binds an authorization request to the client that started it. If someone intercepts the authorization code, they cannot exchange it without the original `code_verifier`. -The server supports the `S256` challenge method only. PKCE is **always required for public clients**. For confidential clients it is optional and controlled per project by the **Require PKCE** setting, since those clients already authenticate with a secret. +The client creates a random `code_verifier`, hashes it with SHA-256 to produce a `code_challenge`, and sends both `code_challenge` and `code_challenge_method=S256` in the authorization request. Appwrite supports `S256` only. -# Start authorization {% #authorize %} +PKCE is always required for **public clients**, which cannot safely keep a client secret. **Confidential clients** authenticate with a client secret and do not require PKCE by default. To require both protections for confidential clients, enable **Require PKCE** in your OAuth2 server settings. This setting is represented as `confidentialPkce` in the API. -Send the user to the authorization endpoint. A public client includes its `code_challenge`; a confidential client includes it when PKCE is enabled. +# 1. Send the user to the authorization endpoint {% #authorize %} + +The authorization endpoint is an Appwrite Cloud URL that the client opens in the user's browser. The client does not need an Appwrite SDK. + +The request contains: + +- `client_id`, which identifies the client asking for access. +- `redirect_uri`, which tells Appwrite where to return the browser after the user decides. It must match a URI registered for the client. +- `response_type=code`, which asks Appwrite to return an authorization code. The client exchanges this code for tokens later. +- `scope`, which lists the access the client is requesting. +- `state`, which the client uses to connect the callback to the request it started and protect against request forgery. +- `code_challenge` and `code_challenge_method=S256`, which are required for public clients and for confidential clients when **Require PKCE** is enabled. + +```http +GET /v1/oauth2//authorize?client_id=&redirect_uri=https%3A%2F%2Fclient.example.com%2Fcallback&response_type=code&scope=openid%20profile&state=&code_challenge=&code_challenge_method=S256 HTTP/1.1 +Host: .cloud.appwrite.io +``` + +After Appwrite validates the request, the browser goes to the authorization URL configured for your project. Your consent screen handles the user's session and decision. + +## Pushed authorization requests {% #par %} + +Pushed authorization requests (PAR) keep the authorization parameters out of the browser URL. The client first sends the parameters to the PAR endpoint: + +```http +POST /v1/oauth2//par HTTP/1.1 +Host: .cloud.appwrite.io +Content-Type: application/json + +{ + "client_id": "", + "redirect_uri": "https://client.example.com/callback", + "response_type": "code", + "scope": "openid profile", + "state": "", + "code_challenge": "", + "code_challenge_method": "S256" +} +``` + +Appwrite returns a `request_uri` and the number of seconds before it expires: + +```json +{ + "request_uri": "urn:appwrite:oauth2:request:", + "expires_in": 600 +} +``` + +Before it expires, send the user to the authorization endpoint with only the URL-encoded `request_uri`. Do not repeat the original authorization parameters. + +```http +GET /v1/oauth2//authorize?request_uri= HTTP/1.1 +Host: .cloud.appwrite.io +``` + +# 2. Host the consent screen {% #consent %} + +The authorization URL is a page you host. It must make sure the user is signed in, load the pending grant, explain what the client is requesting, and record the user's decision. + +The examples in this section use the generated client SDKs. The authorization URL is normally a browser page, but the same grant operations are available across the client SDKs. + +## Find or create the grant {% #resolve-grant %} + +A grant is Appwrite's record of one pending authorization request. It identifies the signed-in user and client, and stores the requested scopes, resources, and redirect URI. The `grant_id` in the consent page URL identifies the record your page needs to load. + +Handle the incoming URL in this order: + +1. Look for `grant_id` in the URL. If it is present, save the value and pass it to `oauth2.getGrant()` in [Load the request](#load-grant). The returned grant tells the consent screen which client is requesting access and which scopes and resources to show the user. +2. If `grant_id` is missing, call `account.get()` to check whether the user has a project session. +3. If the user is signed out, build a return URL from the consent page's current path and query string. Send the user to your normal sign-in or sign-up page with that value in a `redirect` search parameter. +4. After authentication, read `redirect` and return the user to it. The original authorization parameters are now available alongside the user's session. + +### Create the grant after sign-in {% #create-grant-after-sign-in %} + +When the signed-in user returns without `grant_id`, call `oauth2.authorize()` with the original authorization parameters. Use the returned `grantId` to continue. If the SDK returns `redirectUrl` instead, send the user there. {% multicode %} ```client-web @@ -43,7 +119,7 @@ const result = await oauth2.authorize({ state: '', // optional nonce: '', // optional codeChallenge: '', // optional - codeChallengeMethod: 's256', // optional + codeChallengeMethod: 'S256', // optional prompt: '', // optional maxAge: 0, // optional authorizationDetails: '', // optional @@ -69,7 +145,7 @@ Oauth2Authorize result = await oauth2.authorize( state: '', // optional nonce: '', // optional codeChallenge: '', // optional - codeChallengeMethod: 's256', // optional + codeChallengeMethod: 'S256', // optional prompt: '', // optional maxAge: 0, // optional authorizationDetails: '', // optional @@ -93,7 +169,7 @@ let oauth2Authorize = try await oauth2.authorize( state: "", // optional nonce: "", // optional code_challenge: "", // optional - code_challenge_method: "s256", // optional + code_challenge_method: "S256", // optional prompt: "", // optional max_age: 0, // optional authorization_details: "", // optional @@ -120,7 +196,7 @@ val result = oauth2.authorize( state = "", // (optional) nonce = "", // (optional) code_challenge = "", // (optional) - code_challenge_method = "s256", // (optional) + code_challenge_method = "S256", // (optional) prompt = "", // (optional) max_age = 0, // (optional) authorization_details = "", // (optional) @@ -146,7 +222,7 @@ oauth2.authorize( "", // state (optional) "", // nonce (optional) "", // code_challenge (optional) - "s256", // code_challenge_method (optional) + "S256", // code_challenge_method (optional) "", // prompt (optional) 0, // max_age (optional) "", // authorization_details (optional) @@ -179,7 +255,7 @@ const result = await oauth2.authorize({ state: '', // optional nonce: '', // optional codeChallenge: '', // optional - codeChallengeMethod: 's256', // optional + codeChallengeMethod: 'S256', // optional prompt: '', // optional maxAge: 0, // optional authorizationDetails: '', // optional @@ -190,17 +266,11 @@ console.log(result); ``` {% /multicode %} -Without a session on the project, Appwrite redirects to your authorization URL with the original request parameters attached. Sign the user in there (with your normal [Appwrite authentication](/docs/products/auth)), then send them back through the authorize endpoint so a grant can be created. - -# Host the consent screen {% #consent %} +For a PAR request, send the browser back to the authorization endpoint with only its `request_uri`, as shown in [Pushed authorization requests](#par). -Your authorization URL is a page you host. When Appwrite redirects a signed-in user to it with a `grant_id`, the page reads the grant, presents it, and records the user's decision. The consent endpoints authenticate with the user's session on your project. +## Load the request {% #load-grant %} -**Load the grant** to see which client, scopes, and resources are being requested, then render your UI. - -{% info title="Required scope" %} -Reading a grant requires the `oauth2.read` scope. Approving or rejecting one requires `oauth2.write`. -{% /info %} +Pass the grant ID to `oauth2.getGrant()`. Use the returned client details, scopes, and resources to explain the request on the consent screen. Keep the same grant ID for the approve or reject call after the user decides. {% multicode %} ```client-web @@ -301,7 +371,9 @@ console.log(result); ``` {% /multicode %} -**Approve** the grant to continue. Appwrite responds with the redirect URL back to the client, carrying the authorization code. Send the user there. +## Record the user's decision {% #decision %} + +When the user approves the request, you can pass the scopes they kept selected. Omit `scope` to approve every scope in the grant. {% multicode %} ```client-web @@ -414,7 +486,9 @@ console.log(result); ``` {% /multicode %} -**Reject** the grant if the user declines. Appwrite responds with the redirect URL carrying an error instead of a code. +The SDK response contains `redirectUrl`. Send the user to that URL to return them to the client. + +If the user declines, reject the grant and return them to the client with an `access_denied` error. {% multicode %} ```client-web @@ -515,8 +589,34 @@ console.log(result); ``` {% /multicode %} +The SDK requests JSON responses so it can behave consistently with other SDK methods. The approve and reject methods therefore return `redirectUrl`, and your browser code must navigate to it. A direct HTTP request without an `Accept: application/json` header receives a `302` redirect automatically. + +## Consent screen best practices {% #consent-best-practices %} + +- Show the client's name and logo so the user can recognize who is asking for access. +- Name the client in the approval action, such as **Allow Vantage**. +- Explain each scope in plain language instead of showing only its identifier. +- Let the user turn off optional scopes. Pass the remaining scopes to `oauth2.approve()`. +- Call attention to scopes that allow writing, deleting, broad access, or administrator-level access. +- Give the reject action clear, visible placement. Consent should be a real choice. +- Do not ask the user for their Appwrite password on the consent screen. Send signed-out users through your normal authentication flow. + +# Device flow authorization {% #device-flow %} + +Device flow is used when the client cannot easily open a browser or accept a callback, such as a TV or command-line tool. The client starts device authorization and shows the user a verification URL and user code. See [Device flow](/docs/partners/oauth-server/device-flow) for the client requests and polling behavior. + +Your verification page on the user's second device completes the authorization: + +1. Read `user_code` from the URL. If it is missing, let the user enter the code shown on the original device. +2. Ask the user to confirm that the code matches the one on the original device. +3. Make sure the user is signed in. If not, use the same `redirect` pattern as the consent screen so the user returns with the code intact. +4. Call `oauth2.createGrant({ userCode })`. This connects the pending device request to the signed-in user and returns its grant record, including the client and requested access to show on the verification page. +5. Pass the returned grant's ID to `oauth2.approve()` or `oauth2.reject()` after the user decides. + +The original device continues polling the token endpoint at the response's `interval`. After the user approves the grant, the device receives access and refresh tokens directly. Device flow does not use an authorization code callback. + # Redirect URI matching {% #redirect-uris %} -The `redirect_uri` on an authorization request must exactly match one of the client's registered redirect URIs, character for character. This is what stops an attacker from redirecting a code to a URL they control. +The `redirect_uri` on an authorization request must exactly match one of the client's registered redirect URIs, character for character. This stops an attacker from redirecting a code to a URL they control. -There is one narrow exception. For **public** clients, an `http` loopback address (`localhost`, `127.0.0.1`, or `[::1]`) matches on everything except the port. Native and CLI apps bind an unpredictable local port at runtime and cannot register it ahead of time (RFC 8252). Confidential clients get no such exception; their redirect URIs must match exactly, port included. +There is one narrow exception. For **public** clients, an `http` loopback address (`localhost`, `127.0.0.1`, or `[::1]`) matches on everything except the port. Native and CLI apps bind an unpredictable local port at runtime and cannot register it ahead of time (RFC 8252). Confidential clients get no such exception. Their redirect URIs must match exactly, including the port. diff --git a/src/routes/docs/partners/oauth-server/clients/+page.markdoc b/src/routes/docs/partners/oauth-server/clients/+page.markdoc index 9b11a8e2f5..6a2294219f 100644 --- a/src/routes/docs/partners/oauth-server/clients/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/clients/+page.markdoc @@ -1,11 +1,13 @@ --- layout: article title: Clients -description: Register confidential and public OAuth clients against your Appwrite project's OAuth server and manage their secrets. +description: Register confidential and public OAuth clients against your Appwrite project's OAuth2 server and manage them from your own developer platform. back: /docs/partners/oauth-server --- -A **client** is a third-party app that authenticates users through your project's OAuth server. Each client registers the redirect URIs it is allowed to return to, and, depending on its type, receives a client secret. Clients are managed from the **Auth > OAuth2 server > Apps** tab in the Console, or with a [Server SDK](/docs/sdks#server). +A **client** is a third-party app that authenticates users through your project's OAuth2 server. Each client registers the redirect URIs it is allowed to return to and the post-logout redirect URIs it can end sessions at, sets its type, and chooses whether the [device flow](/docs/partners/oauth-server/device-flow) is enabled. Its other attributes serve two surfaces: branding like the name, logo, and tagline can appear on your consent screen, while attributes like tags, images, and the privacy policy URL are for your project's apps marketplace. + +Integrators never visit the Appwrite Console. You are expected to build a developer platform on your own website with the [Client SDKs](/docs/sdks#client)' `apps` service, which covers the full lifecycle: `create`, `update`, `get`, `list`, `delete`, along with `createSecret`, `listSecrets`, `getSecret`, `deleteSecret`, `updateTeam`, and `deleteTokens`. Any signed-in user on your project can call them; no API key is involved. The Console's **Auth > OAuth2 server > Apps** tab is your own administrative view of the same data. {% only_dark %} ![OAuth2 clients list in the Appwrite Console](/images/docs/oauth-server/dark/oauth2-server-apps-list.avif) @@ -14,6 +16,8 @@ A **client** is a third-party app that authenticates users through your project' ![OAuth2 clients list in the Appwrite Console](/images/docs/oauth-server/oauth2-server-apps-list.avif) {% /only_light %} +Server SDKs matter in exactly two places: [introspecting](/docs/partners/oauth-server/tokens#introspect) a public client's tokens, which needs an API key because there is no client secret, and administrative operations like [curating labels](#labels). + # Confidential and public clients {% #client-types %} Every client is one of two types, and the difference comes down to a single question: can the app keep a secret? @@ -34,7 +38,7 @@ The type a client uses changes what it can do: | --- | --- | --- | | Client secret | Issued, sent on token requests | None issued | | PKCE | Optional (configurable per project) | Always required | -| Token introspection | Allowed | Not allowed | +| Token introspection | With its client secret | With a project API key holding the `oauth2.read` scope | | Default access token lifetime | 8 hours | 1 hour | | Default refresh token lifetime | 365 days | 30 days | @@ -42,602 +46,538 @@ Choose confidential whenever the app has a backend. It is the safer default: the # Register a client {% #register %} -Create a client from the **Apps** tab, or with the `create` method of the `Apps` service. Registering a confidential client returns its secret once. Store it immediately, because the full value cannot be retrieved again. - -{% only_dark %} -![Create an OAuth2 client dialog](/images/docs/oauth-server/dark/oauth2-server-create-app.avif) -{% /only_dark %} -{% only_light %} -![Create an OAuth2 client dialog](/images/docs/oauth-server/oauth2-server-create-app.avif) -{% /only_light %} - -{% info title="Required scope" %} -The API key used for this call needs the `apps.write` scope. -{% /info %} +Create a client with the `create` method. It needs only a name and a redirect URI; everything else can be filled in later with `update`. Registering a confidential client also calls for a [secret](#secrets) before it can exchange tokens. {% multicode %} -```server-nodejs -import { Client, Apps } from 'node-appwrite'; +```client-web +import { Client, Apps, ID } from 'appwrite'; const client = new Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint - .setProject('') // Your project ID - .setKey(''); // Your secret API key + .setProject(''); // Your project ID const apps = new Apps(client); -const result = await apps.create({ - appId: '', - name: '', - redirectUris: [], - description: '', // optional - clientUri: 'https://example.com', // optional - logoUri: 'https://example.com', // optional - privacyPolicyUrl: 'https://example.com', // optional - termsUrl: 'https://example.com', // optional - contacts: [], // optional - tagline: '', // optional - tags: [], // optional - images: [], // optional - supportUrl: 'https://example.com', // optional - dataDeletionUrl: 'https://example.com', // optional - postLogoutRedirectUris: [], // optional - enabled: false, // optional - type: 'public', // optional - deviceFlow: false, // optional - teamId: '' // optional +const app = await apps.create({ + appId: ID.unique(), + name: 'Custom App', + redirectUris: ['http://customapp.localhost/auth/redirect'], }); ``` -```server-deno -import { Client, Apps } from "npm:node-appwrite"; +```client-flutter +import 'package:appwrite/appwrite.dart'; + +Client client = Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +Apps apps = Apps(client); + +App app = await apps.create( + appId: ID.unique(), + name: 'Custom App', + redirectUris: ['http://customapp.localhost/auth/redirect'], +); +``` +```client-apple +import Appwrite + +let client = Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + +let apps = Apps(client) + +let app = try await apps.create( + appId: ID.unique(), + name: "Custom App", + redirectUris: ["http://customapp.localhost/auth/redirect"] +) +``` +```client-android-kotlin +import io.appwrite.Client +import io.appwrite.ID +import io.appwrite.services.Apps + +val client = Client(context) + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + +val apps = Apps(client) + +val app = apps.create( + appId = ID.unique(), + name = "Custom App", + redirectUris = listOf("http://customapp.localhost/auth/redirect") +) +``` +```client-android-java +import io.appwrite.Client; +import io.appwrite.ID; +import io.appwrite.coroutines.CoroutineCallback; +import io.appwrite.services.Apps; + +Client client = new Client(context) + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject(""); // Your project ID + +Apps apps = new Apps(client); + +apps.create( + ID.unique(), // appId + "Custom App", // name + List.of("http://customapp.localhost/auth/redirect"), // redirectUris + null, // description (optional) + null, // clientUri (optional) + null, // logoUri (optional) + null, // privacyPolicyUrl (optional) + null, // termsUrl (optional) + null, // contacts (optional) + null, // tagline (optional) + null, // tags (optional) + null, // images (optional) + null, // supportUrl (optional) + null, // dataDeletionUrl (optional) + null, // postLogoutRedirectUris (optional) + null, // enabled (optional) + null, // type (optional) + null, // deviceFlow (optional) + null, // teamId (optional) + new CoroutineCallback<>((result, error) -> { + if (error != null) { + error.printStackTrace(); + return; + } + + Log.d("Appwrite", result.toString()); + }) +); +``` +```client-react-native +import { Client, Apps, ID } from "react-native-appwrite"; const client = new Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint - .setProject('') // Your project ID - .setKey(''); // Your secret API key + .setProject(''); // Your project ID const apps = new Apps(client); -const result = await apps.create({ - appId: '', - name: '', - redirectUris: [], - description: '', // optional - clientUri: 'https://example.com', // optional - logoUri: 'https://example.com', // optional - privacyPolicyUrl: 'https://example.com', // optional - termsUrl: 'https://example.com', // optional - contacts: [], // optional - tagline: '', // optional - tags: [], // optional - images: [], // optional - supportUrl: 'https://example.com', // optional - dataDeletionUrl: 'https://example.com', // optional - postLogoutRedirectUris: [], // optional - enabled: false, // optional - type: 'public', // optional - deviceFlow: false, // optional - teamId: '' // optional +const app = await apps.create({ + appId: ID.unique(), + name: 'Custom App', + redirectUris: ['http://customapp.localhost/auth/redirect'], }); ``` -```server-php -```php -setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint - ->setProject('') // Your project ID - ->setKey(''); // Your secret API key +You can also create clients from the Console's **Apps** tab, which offers the same fields. -$apps = new Apps($client); +{% only_dark %} +![Create an OAuth2 client dialog](/images/docs/oauth-server/dark/oauth2-server-create-app.avif) +{% /only_dark %} +{% only_light %} +![Create an OAuth2 client dialog](/images/docs/oauth-server/oauth2-server-create-app.avif) +{% /only_light %} -$result = $apps->create( - appId: '', - name: '', - redirectUris: [], - description: '', // optional - clientUri: 'https://example.com', // optional - logoUri: 'https://example.com', // optional - privacyPolicyUrl: 'https://example.com', // optional - termsUrl: 'https://example.com', // optional - contacts: [], // optional - tagline: '', // optional - tags: [], // optional - images: [], // optional - supportUrl: 'https://example.com', // optional - dataDeletionUrl: 'https://example.com', // optional - postLogoutRedirectUris: [], // optional - enabled: false, // optional - type: 'public', // optional - deviceFlow: false, // optional - teamId: '' // optional -);``` -``` -```server-python -from appwrite.client import Client -from appwrite.services.apps import Apps -from appwrite.models import App +{% info title="Use Storage for logos and images" %} +`logoUri` and `images` accept URLs, not files. [Appwrite Storage](/docs/products/storage) pairs well here: upload the file to a bucket, take its preview URL, and store that URL on the app. +{% /info %} -client = Client() -client.set_endpoint('https://.cloud.appwrite.io/v1') # Your API Endpoint -client.set_project('') # Your project ID -client.set_key('') # Your secret API key +# Manage client secrets {% #secrets %} -apps = Apps(client) +A confidential client authenticates with a secret. Four methods manage them in one place: `createSecret`, `listSecrets`, `getSecret`, and `deleteSecret`. -result: App = apps.create( - app_id = '', - name = '', - redirect_uris = [], - description = '', # optional - client_uri = 'https://example.com', # optional - logo_uri = 'https://example.com', # optional - privacy_policy_url = 'https://example.com', # optional - terms_url = 'https://example.com', # optional - contacts = [], # optional - tagline = '', # optional - tags = [], # optional - images = [], # optional - support_url = 'https://example.com', # optional - data_deletion_url = 'https://example.com', # optional - post_logout_redirect_uris = [], # optional - enabled = False, # optional - type = 'public', # optional - device_flow = False, # optional - team_id = '' # optional -) +Generate a new secret with `createSecret`. The plaintext value is returned only in this response. -print(result.model_dump()) -``` -```server-ruby -require 'appwrite' +{% only_dark %} +![OAuth2 client secret shown once on creation](/images/docs/oauth-server/dark/oauth2-server-secret-created.avif) +{% /only_dark %} +{% only_light %} +![OAuth2 client secret shown once on creation](/images/docs/oauth-server/oauth2-server-secret-created.avif) +{% /only_light %} -include Appwrite +{% multicode %} +```client-web +import { Client, Apps } from 'appwrite'; -client = Client.new - .set_endpoint('https://.cloud.appwrite.io/v1') # Your API Endpoint - .set_project('') # Your project ID - .set_key('') # Your secret API key +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID -apps = Apps.new(client) +const apps = new Apps(client); -result = apps.create( - app_id: '', - name: '', - redirect_uris: [], - description: '', # optional - client_uri: 'https://example.com', # optional - logo_uri: 'https://example.com', # optional - privacy_policy_url: 'https://example.com', # optional - terms_url: 'https://example.com', # optional - contacts: [], # optional - tagline: '', # optional - tags: [], # optional - images: [], # optional - support_url: 'https://example.com', # optional - data_deletion_url: 'https://example.com', # optional - post_logout_redirect_uris: [], # optional - enabled: false, # optional - type: 'public', # optional - device_flow: false, # optional - team_id: '' # optional -) +const secret = await apps.createSecret({ + appId: '', +}); ``` -```server-dart -import 'package:dart_appwrite/dart_appwrite.dart'; +```client-flutter +import 'package:appwrite/appwrite.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint - .setProject('') // Your project ID - .setKey(''); // Your secret API key + .setProject(''); // Your project ID Apps apps = Apps(client); -App result = await apps.create( +AppSecretPlaintext secret = await apps.createSecret( appId: '', - name: '', - redirectUris: [], - description: '', // (optional) - clientUri: 'https://example.com', // (optional) - logoUri: 'https://example.com', // (optional) - privacyPolicyUrl: 'https://example.com', // (optional) - termsUrl: 'https://example.com', // (optional) - contacts: [], // (optional) - tagline: '', // (optional) - tags: [], // (optional) - images: [], // (optional) - supportUrl: 'https://example.com', // (optional) - dataDeletionUrl: 'https://example.com', // (optional) - postLogoutRedirectUris: [], // (optional) - enabled: false, // (optional) - type: 'public', // (optional) - deviceFlow: false, // (optional) - teamId: '', // (optional) ); ``` -```server-dotnet -```csharp -using Appwrite; -using Appwrite.Models; -using Appwrite.Services; +```client-apple +import Appwrite -Client client = new Client() - .SetEndPoint("https://.cloud.appwrite.io/v1") // Your API Endpoint - .SetProject("") // Your project ID - .SetKey(""); // Your secret API key +let client = Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID -Apps apps = new Apps(client); +let apps = Apps(client) -App result = await apps.Create( - appId: "", - name: "", - redirectUris: new List(), - description: "", // optional - clientUri: "https://example.com", // optional - logoUri: "https://example.com", // optional - privacyPolicyUrl: "https://example.com", // optional - termsUrl: "https://example.com", // optional - contacts: new List(), // optional - tagline: "", // optional - tags: new List(), // optional - images: new List(), // optional - supportUrl: "https://example.com", // optional - dataDeletionUrl: "https://example.com", // optional - postLogoutRedirectUris: new List(), // optional - enabled: false, // optional - type: "public", // optional - deviceFlow: false, // optional - teamId: "" // optional -);``` +let secret = try await apps.createSecret( + appId: "" +) ``` -```server-kotlin +```client-android-kotlin import io.appwrite.Client -import io.appwrite.coroutines.CoroutineCallback import io.appwrite.services.Apps -val client = Client() +val client = Client(context) .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint .setProject("") // Your project ID - .setKey("") // Your secret API key val apps = Apps(client) -val response = apps.create( - appId = "", - name = "", - redirectUris = listOf(), - description = "", // optional - clientUri = "https://example.com", // optional - logoUri = "https://example.com", // optional - privacyPolicyUrl = "https://example.com", // optional - termsUrl = "https://example.com", // optional - contacts = listOf(), // optional - tagline = "", // optional - tags = listOf(), // optional - images = listOf(), // optional - supportUrl = "https://example.com", // optional - dataDeletionUrl = "https://example.com", // optional - postLogoutRedirectUris = listOf(), // optional - enabled = false, // optional - type = "public", // optional - deviceFlow = false, // optional - teamId = "" // optional +val secret = apps.createSecret( + appId = "" ) ``` -```server-java +```client-android-java import io.appwrite.Client; import io.appwrite.coroutines.CoroutineCallback; import io.appwrite.services.Apps; -Client client = new Client() +Client client = new Client(context) .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint - .setProject("") // Your project ID - .setKey(""); // Your secret API key + .setProject(""); // Your project ID Apps apps = new Apps(client); -apps.create( +apps.createSecret( "", // appId - "", // name - List.of(), // redirectUris - "", // description (optional) - "https://example.com", // clientUri (optional) - "https://example.com", // logoUri (optional) - "https://example.com", // privacyPolicyUrl (optional) - "https://example.com", // termsUrl (optional) - List.of(), // contacts (optional) - "", // tagline (optional) - List.of(), // tags (optional) - List.of(), // images (optional) - "https://example.com", // supportUrl (optional) - "https://example.com", // dataDeletionUrl (optional) - List.of(), // postLogoutRedirectUris (optional) - false, // enabled (optional) - "public", // type (optional) - false, // deviceFlow (optional) - "", // teamId (optional) new CoroutineCallback<>((result, error) -> { if (error != null) { error.printStackTrace(); return; } - System.out.println(result); + Log.d("Appwrite", result.toString()); }) ); +``` +```client-react-native +import { Client, Apps } from "react-native-appwrite"; +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +const apps = new Apps(client); + +const secret = await apps.createSecret({ + appId: '', +}); ``` -```server-swift +{% /multicode %} + +A client can hold several secrets at once, which is how you rotate them without downtime: create the new secret, roll it out, then delete the old one. Each entry in `listSecrets` carries the metadata for deciding which secret can be removed safely: a `hint` of the value, who created it (`createdById`, `createdByName`), when it was created, and `lastAccessedAt` for when it last authenticated a request. + +{% multicode %} +```client-web +import { Client, Apps } from 'appwrite'; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +const apps = new Apps(client); + +const secrets = await apps.listSecrets({ + appId: '', +}); +``` +```client-flutter +import 'package:appwrite/appwrite.dart'; + +Client client = Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +Apps apps = Apps(client); + +AppSecretList secrets = await apps.listSecrets( + appId: '', +); +``` +```client-apple import Appwrite let client = Client() .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint .setProject("") // Your project ID - .setKey("") // Your secret API key let apps = Apps(client) -let app = try await apps.create( - appId: "", - name: "", - redirectUris: [], - description: "", // optional - clientUri: "https://example.com", // optional - logoUri: "https://example.com", // optional - privacyPolicyUrl: "https://example.com", // optional - termsUrl: "https://example.com", // optional - contacts: [], // optional - tagline: "", // optional - tags: [], // optional - images: [], // optional - supportUrl: "https://example.com", // optional - dataDeletionUrl: "https://example.com", // optional - postLogoutRedirectUris: [], // optional - enabled: false, // optional - type: "public", // optional - deviceFlow: false, // optional - teamId: "" // optional +let secrets = try await apps.listSecrets( + appId: "" ) - ``` -```server-go -package main +```client-android-kotlin +import io.appwrite.Client +import io.appwrite.services.Apps -import ( - "fmt" - "github.com/repoowner/reponame/client" - "github.com/repoowner/reponame/apps" -) +val client = Client(context) + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID -client := client.New( - client.WithEndpoint("https://.cloud.appwrite.io/v1") - client.WithProject("") - appwrite.WithKey("") -) +val apps = Apps(client) -service := apps.New(client) - -response, error := service.Create( - "", - "", - []string{}, - apps.WithCreateDescription(""), - apps.WithCreateClientUri("https://example.com"), - apps.WithCreateLogoUri("https://example.com"), - apps.WithCreatePrivacyPolicyUrl("https://example.com"), - apps.WithCreateTermsUrl("https://example.com"), - apps.WithCreateContacts([]string{}), - apps.WithCreateTagline(""), - apps.WithCreateTags([]string{}), - apps.WithCreateImages([]string{}), - apps.WithCreateSupportUrl("https://example.com"), - apps.WithCreateDataDeletionUrl("https://example.com"), - apps.WithCreatePostLogoutRedirectUris([]string{}), - apps.WithCreateEnabled(false), - apps.WithCreateType("public"), - apps.WithCreateDeviceFlow(false), - apps.WithCreateTeamId(""), +val secrets = apps.listSecrets( + appId = "" ) ``` -```server-rust -use appwrite::Client; -use appwrite::services::Apps; +```client-android-java +import io.appwrite.Client; +import io.appwrite.coroutines.CoroutineCallback; +import io.appwrite.services.Apps; -#[tokio::main] -async fn main() -> Result<(), Box> { - let client = Client::new(); - client.set_endpoint("https://.cloud.appwrite.io/v1"); // Your API Endpoint - client.set_project(""); // Your project ID - client.set_key(""); // Your secret API key +Client client = new Client(context) + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject(""); // Your project ID - let apps = Apps::new(&client); +Apps apps = new Apps(client); - let result = apps.create( - "", - "", - vec![], - Some(""), // optional - Some("https://example.com"), // optional - Some("https://example.com"), // optional - Some("https://example.com"), // optional - Some("https://example.com"), // optional - Some(vec![]), // optional - Some(""), // optional - Some(vec![]), // optional - Some(vec![]), // optional - Some("https://example.com"), // optional - Some("https://example.com"), // optional - Some(vec![]), // optional - Some(false), // optional - Some("public"), // optional - Some(false), // optional - Some("") // optional - ).await?; - - let _ = result; +apps.listSecrets( + "", // appId + new CoroutineCallback<>((result, error) -> { + if (error != null) { + error.printStackTrace(); + return; + } - Ok(()) -} + Log.d("Appwrite", result.toString()); + }) +); +``` +```client-react-native +import { Client, Apps } from "react-native-appwrite"; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +const apps = new Apps(client); + +const secrets = await apps.listSecrets({ + appId: '', +}); ``` {% /multicode %} -The `type` parameter accepts `confidential` (the default) or `public`. Set `deviceFlow` to `true` to let the client use the [device authorization flow](/docs/partners/oauth-server/device-flow). The branding fields (`logoUri`, `tagline`, `privacyPolicyUrl`, `termsUrl`) appear on the consent screen your users see. +`getSecret` reads a single entry by ID, and `deleteSecret` revokes it immediately. -# Manage client secrets {% #secrets %} +# List clients {% #list %} -A confidential client authenticates with a secret. Generate a new secret with the `createSecret` method. The plaintext value is returned only in this response. +The `list` method drives three different screens, depending on the queries you pass: -{% only_dark %} -![OAuth2 client secret shown once on creation](/images/docs/oauth-server/dark/oauth2-server-secret-created.avif) -{% /only_dark %} -{% only_light %} -![OAuth2 client secret shown once on creation](/images/docs/oauth-server/oauth2-server-secret-created.avif) -{% /only_light %} +- **A developer portal**: filter by the signed-in user with `Query.equal('userId', userId)` so developers manage their own apps. +- **Team settings**: filter with `Query.equal('teamId', teamId)` for the apps a team owns. +- **An apps marketplace**: list without an owner filter to show all registered apps. Filter by [labels](#labels), such as `Query.contains('labels', ['official'])`, when the marketplace should only show apps you have vetted, because labels cannot be self-assigned. + +Always paginate with `Query.limit()` and `Query.cursorAfter()`; a marketplace can grow past any single page. {% multicode %} -```server-nodejs -import { Client, Apps } from 'node-appwrite'; +```client-web +import { Client, Apps, Query } from 'appwrite'; const client = new Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint - .setProject('') // Your project ID - .setKey(''); // Your secret API key + .setProject(''); // Your project ID const apps = new Apps(client); -const result = await apps.createSecret({ - appId: '' +const portal = await apps.list({ + queries: [ + Query.equal('userId', ''), + Query.limit(25), + ], }); ``` -```server-deno -import { Client, Apps } from "npm:node-appwrite"; +```client-flutter +import 'package:appwrite/appwrite.dart'; -const client = new Client() +Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint - .setProject('') // Your project ID - .setKey(''); // Your secret API key + .setProject(''); // Your project ID -const apps = new Apps(client); +Apps apps = Apps(client); -const result = await apps.createSecret({ - appId: '' -}); +AppList portal = await apps.list( + queries: [ + Query.equal('userId', ''), + Query.limit(25), + ], +); ``` -```server-php -```php -setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint - ->setProject('') // Your project ID - ->setKey(''); // Your secret API key +let client = Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID -$apps = new Apps($client); +let apps = Apps(client) -$result = $apps->createSecret( - appId: '' -);``` +let portal = try await apps.list( + queries: [ + Query.equal("userId", value: ""), + Query.limit(25) + ] +) ``` -```server-python -from appwrite.client import Client -from appwrite.services.apps import Apps -from appwrite.models import AppSecretPlaintext +```client-android-kotlin +import io.appwrite.Client +import io.appwrite.Query +import io.appwrite.services.Apps -client = Client() -client.set_endpoint('https://.cloud.appwrite.io/v1') # Your API Endpoint -client.set_project('') # Your project ID -client.set_key('') # Your secret API key +val client = Client(context) + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID -apps = Apps(client) +val apps = Apps(client) -result: AppSecretPlaintext = apps.create_secret( - app_id = '' +val portal = apps.list( + queries = listOf( + Query.equal("userId", ""), + Query.limit(25) + ) ) +``` +```client-android-java +import io.appwrite.Client; +import io.appwrite.Query; +import io.appwrite.coroutines.CoroutineCallback; +import io.appwrite.services.Apps; -print(result.model_dump()) +Client client = new Client(context) + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject(""); // Your project ID + +Apps apps = new Apps(client); + +apps.list( + List.of( + Query.Companion.equal("userId", ""), + Query.Companion.limit(25) + ), // queries (optional) + new CoroutineCallback<>((result, error) -> { + if (error != null) { + error.printStackTrace(); + return; + } + + Log.d("Appwrite", result.toString()); + }) +); ``` -```server-ruby -require 'appwrite' +```client-react-native +import { Client, Apps, Query } from "react-native-appwrite"; -include Appwrite +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID -client = Client.new - .set_endpoint('https://.cloud.appwrite.io/v1') # Your API Endpoint - .set_project('') # Your project ID - .set_key('') # Your secret API key +const apps = new Apps(client); -apps = Apps.new(client) +const portal = await apps.list({ + queries: [ + Query.equal('userId', ''), + Query.limit(25), + ], +}); +``` +{% /multicode %} -result = apps.create_secret( - app_id: '' -) +# Get a client {% #get %} + +Read a single client with `get`. This backs the app detail page in a developer portal, and a [consent screen](/docs/partners/oauth-server/authorization#consent) uses it to show the requesting app's name and logo. + +{% multicode %} +```client-web +import { Client, Apps } from 'appwrite'; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +const apps = new Apps(client); + +const app = await apps.get({ + appId: '', +}); ``` -```server-dart -import 'package:dart_appwrite/dart_appwrite.dart'; +```client-flutter +import 'package:appwrite/appwrite.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint - .setProject('') // Your project ID - .setKey(''); // Your secret API key + .setProject(''); // Your project ID Apps apps = Apps(client); -AppSecretPlaintext result = await apps.createSecret( +App app = await apps.get( appId: '', ); ``` -```server-dotnet -```csharp -using Appwrite; -using Appwrite.Models; -using Appwrite.Services; +```client-apple +import Appwrite -Client client = new Client() - .SetEndPoint("https://.cloud.appwrite.io/v1") // Your API Endpoint - .SetProject("") // Your project ID - .SetKey(""); // Your secret API key +let client = Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID -Apps apps = new Apps(client); +let apps = Apps(client) -AppSecretPlaintext result = await apps.CreateSecret( +let app = try await apps.get( appId: "" -);``` +) ``` -```server-kotlin +```client-android-kotlin import io.appwrite.Client -import io.appwrite.coroutines.CoroutineCallback import io.appwrite.services.Apps -val client = Client() +val client = Client(context) .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint .setProject("") // Your project ID - .setKey("") // Your secret API key val apps = Apps(client) -val response = apps.createSecret( +val app = apps.get( appId = "" ) ``` -```server-java +```client-android-java import io.appwrite.Client; import io.appwrite.coroutines.CoroutineCallback; import io.appwrite.services.Apps; -Client client = new Client() +Client client = new Client(context) .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint - .setProject("") // Your project ID - .setKey(""); // Your secret API key + .setProject(""); // Your project ID Apps apps = new Apps(client); -apps.createSecret( +apps.get( "", // appId new CoroutineCallback<>((result, error) -> { if (error != null) { @@ -645,307 +585,270 @@ apps.createSecret( return; } - System.out.println(result); + Log.d("Appwrite", result.toString()); }) ); - ``` -```server-swift -import Appwrite - -let client = Client() - .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint - .setProject("") // Your project ID - .setKey("") // Your secret API key +```client-react-native +import { Client, Apps } from "react-native-appwrite"; -let apps = Apps(client) +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID -let appSecretPlaintext = try await apps.createSecret( - appId: "" -) +const apps = new Apps(client); +const app = await apps.get({ + appId: '', +}); ``` -```server-go -package main +{% /multicode %} -import ( - "fmt" - "github.com/repoowner/reponame/client" - "github.com/repoowner/reponame/apps" -) +# Update a client {% #update %} -client := client.New( - client.WithEndpoint("https://.cloud.appwrite.io/v1") - client.WithProject("") - appwrite.WithKey("") -) +Change a client's redirect URIs, branding, or type with the `update` method. -service := apps.New(client) +{% multicode %} +```client-web +import { Client, Apps } from 'appwrite'; -response, error := service.CreateSecret( - "", -) +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +const apps = new Apps(client); + +const app = await apps.update({ + appId: '', + name: 'Custom App', + description: 'A third-party app that signs in with your product.', + logoUri: 'https://example.com/logo.png', + redirectUris: ['http://customapp.localhost/auth/redirect'], + enabled: true, +}); ``` -```server-rust -use appwrite::Client; -use appwrite::services::Apps; +```client-flutter +import 'package:appwrite/appwrite.dart'; -#[tokio::main] -async fn main() -> Result<(), Box> { - let client = Client::new(); - client.set_endpoint("https://.cloud.appwrite.io/v1"); // Your API Endpoint - client.set_project(""); // Your project ID - client.set_key(""); // Your secret API key +Client client = Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID - let apps = Apps::new(&client); +Apps apps = Apps(client); - let result = apps.create_secret( - "" - ).await?; +App app = await apps.update( + appId: '', + name: 'Custom App', + description: 'A third-party app that signs in with your product.', + logoUri: 'https://example.com/logo.png', + redirectUris: ['http://customapp.localhost/auth/redirect'], + enabled: true, +); +``` +```client-apple +import Appwrite - let _ = result; +let client = Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID - Ok(()) -} +let apps = Apps(client) + +let app = try await apps.update( + appId: "", + name: "Custom App", + description: "A third-party app that signs in with your product.", + logoUri: "https://example.com/logo.png", + redirectUris: ["http://customapp.localhost/auth/redirect"], + enabled: true +) ``` -{% /multicode %} +```client-android-kotlin +import io.appwrite.Client +import io.appwrite.services.Apps -A client can hold more than one secret at a time, which lets you rotate without downtime: create the new secret, deploy it, then delete the old one. Deleting a secret immediately breaks any client still using it, including token refreshes in flight. +val client = Client(context) + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID -# List clients {% #list %} +val apps = Apps(client) -{% info title="Required scope" %} -The API key used for this call needs the `apps.read` scope. -{% /info %} +val app = apps.update( + appId = "", + name = "Custom App", + description = "A third-party app that signs in with your product.", + logoUri = "https://example.com/logo.png", + redirectUris = listOf("http://customapp.localhost/auth/redirect"), + enabled = true +) +``` +```client-android-java +import io.appwrite.Client; +import io.appwrite.coroutines.CoroutineCallback; +import io.appwrite.services.Apps; -{% multicode %} -```server-nodejs -import { Client, Apps } from 'node-appwrite'; +Client client = new Client(context) + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject(""); // Your project ID -const client = new Client() - .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint - .setProject('') // Your project ID - .setKey(''); // Your secret API key +Apps apps = new Apps(client); -const apps = new Apps(client); +apps.update( + "", // appId + "Custom App", // name + "A third-party app that signs in with your product.", // description (optional) + null, // clientUri (optional) + "https://example.com/logo.png", // logoUri (optional) + null, // privacyPolicyUrl (optional) + null, // termsUrl (optional) + null, // contacts (optional) + null, // tagline (optional) + null, // tags (optional) + null, // images (optional) + null, // supportUrl (optional) + null, // dataDeletionUrl (optional) + true, // enabled (optional) + List.of("http://customapp.localhost/auth/redirect"), // redirectUris (optional) + null, // postLogoutRedirectUris (optional) + null, // type (optional) + null, // deviceFlow (optional) + new CoroutineCallback<>((result, error) -> { + if (error != null) { + error.printStackTrace(); + return; + } -const result = await apps.list({ - queries: [], // optional - total: false // optional -}); + Log.d("Appwrite", result.toString()); + }) +); ``` -```server-deno -import { Client, Apps } from "npm:node-appwrite"; +```client-react-native +import { Client, Apps } from "react-native-appwrite"; const client = new Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint - .setProject('') // Your project ID - .setKey(''); // Your secret API key + .setProject(''); // Your project ID const apps = new Apps(client); -const result = await apps.list({ - queries: [], // optional - total: false // optional +const app = await apps.update({ + appId: '', + name: 'Custom App', + description: 'A third-party app that signs in with your product.', + logoUri: 'https://example.com/logo.png', + redirectUris: ['http://customapp.localhost/auth/redirect'], + enabled: true, }); ``` -```server-php -```php -setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint - ->setProject('') // Your project ID - ->setKey(''); // Your secret API key - -$apps = new Apps($client); - -$result = $apps->list( - queries: [], // optional - total: false // optional -);``` -``` -```server-python -from appwrite.client import Client -from appwrite.services.apps import Apps -from appwrite.models import AppsList - -client = Client() -client.set_endpoint('https://.cloud.appwrite.io/v1') # Your API Endpoint -client.set_project('') # Your project ID -client.set_key('') # Your secret API key +{% /multicode %} -apps = Apps(client) +The `type` parameter accepts `confidential` (the default) or `public`. Set `deviceFlow` to `true` to let the client use the [device authorization flow](/docs/partners/oauth-server/device-flow). The branding fields (`logoUri`, `tagline`, `privacyPolicyUrl`, `termsUrl`) can appear on the consent screen, and they fill out the app's listing on your marketplace. -result: AppsList = apps.list( - queries = [], # optional - total = False # optional -) +# Transfer to a team {% #transfer %} -print(result.model_dump()) -``` -```server-ruby -require 'appwrite' +Convert a user-owned app to team ownership, or move it between teams, with `updateTeam`. The member doing the transfer needs the `owner` or `developer` role in the app's current team, and at least membership in the new one. -include Appwrite +{% multicode %} +```client-web +import { Client, Apps } from 'appwrite'; -client = Client.new - .set_endpoint('https://.cloud.appwrite.io/v1') # Your API Endpoint - .set_project('') # Your project ID - .set_key('') # Your secret API key +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID -apps = Apps.new(client) +const apps = new Apps(client); -result = apps.list( - queries: [], # optional - total: false # optional -) +const app = await apps.updateTeam({ + appId: '', + teamId: '', +}); ``` -```server-dart -import 'package:dart_appwrite/dart_appwrite.dart'; +```client-flutter +import 'package:appwrite/appwrite.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint - .setProject('') // Your project ID - .setKey(''); // Your secret API key + .setProject(''); // Your project ID Apps apps = Apps(client); -AppsList result = await apps.list( - queries: [], // (optional) - total: false, // (optional) +App app = await apps.updateTeam( + appId: '', + teamId: '', ); ``` -```server-dotnet -```csharp -using Appwrite; -using Appwrite.Models; -using Appwrite.Services; +```client-apple +import Appwrite -Client client = new Client() - .SetEndPoint("https://.cloud.appwrite.io/v1") // Your API Endpoint - .SetProject("") // Your project ID - .SetKey(""); // Your secret API key +let client = Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID -Apps apps = new Apps(client); +let apps = Apps(client) -AppsList result = await apps.List( - queries: new List(), // optional - total: false // optional -);``` +let app = try await apps.updateTeam( + appId: "", + teamId: "" +) ``` -```server-kotlin +```client-android-kotlin import io.appwrite.Client -import io.appwrite.coroutines.CoroutineCallback import io.appwrite.services.Apps -val client = Client() +val client = Client(context) .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint .setProject("") // Your project ID - .setKey("") // Your secret API key val apps = Apps(client) -val response = apps.list( - queries = listOf(), // optional - total = false // optional +val app = apps.updateTeam( + appId = "", + teamId = "" ) ``` -```server-java +```client-android-java import io.appwrite.Client; import io.appwrite.coroutines.CoroutineCallback; import io.appwrite.services.Apps; -Client client = new Client() +Client client = new Client(context) .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint - .setProject("") // Your project ID - .setKey(""); // Your secret API key + .setProject(""); // Your project ID Apps apps = new Apps(client); -apps.list( - List.of(), // queries (optional) - false, // total (optional) +apps.updateTeam( + "", // appId + "", // teamId new CoroutineCallback<>((result, error) -> { if (error != null) { error.printStackTrace(); return; } - System.out.println(result); + Log.d("Appwrite", result.toString()); }) ); - -``` -```server-swift -import Appwrite - -let client = Client() - .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint - .setProject("") // Your project ID - .setKey("") // Your secret API key - -let apps = Apps(client) - -let appsList = try await apps.list( - queries: [], // optional - total: false // optional -) - -``` -```server-go -package main - -import ( - "fmt" - "github.com/repoowner/reponame/client" - "github.com/repoowner/reponame/apps" -) - -client := client.New( - client.WithEndpoint("https://.cloud.appwrite.io/v1") - client.WithProject("") - appwrite.WithKey("") -) - -service := apps.New(client) - -response, error := service.List( - apps.WithListQueries([]string{}), - apps.WithListTotal(false), -) ``` -```server-rust -use appwrite::Client; -use appwrite::services::Apps; - -#[tokio::main] -async fn main() -> Result<(), Box> { - let client = Client::new(); - client.set_endpoint("https://.cloud.appwrite.io/v1"); // Your API Endpoint - client.set_project(""); // Your project ID - client.set_key(""); // Your secret API key - - let apps = Apps::new(&client); +```client-react-native +import { Client, Apps } from "react-native-appwrite"; - let result = apps.list( - Some(vec![]), // optional - Some(false) // optional - ).await?; +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID - let _ = result; +const apps = new Apps(client); - Ok(()) -} +const app = await apps.updateTeam({ + appId: '', + teamId: '', +}); ``` {% /multicode %} -# Update a client {% #update %} +# Curate with labels {% #labels %} -Change a client's redirect URIs, branding, or type with the `update` method. +Labels are trust markers like `official`, `partner`, or `verified`. They are read-only for clients: only a [Server SDK](/docs/sdks#server) using a project API key with the `apps.write` scope can set them, so app owners cannot mark themselves as trusted. That is what makes them safe to filter a marketplace by. {% multicode %} ```server-nodejs @@ -958,25 +861,9 @@ const client = new Client() const apps = new Apps(client); -const result = await apps.update({ +const app = await apps.updateLabels({ appId: '', - name: '', - description: '', // optional - clientUri: 'https://example.com', // optional - logoUri: 'https://example.com', // optional - privacyPolicyUrl: 'https://example.com', // optional - termsUrl: 'https://example.com', // optional - contacts: [], // optional - tagline: '', // optional - tags: [], // optional - images: [], // optional - supportUrl: 'https://example.com', // optional - dataDeletionUrl: 'https://example.com', // optional - enabled: false, // optional - redirectUris: [], // optional - postLogoutRedirectUris: [], // optional - type: 'public', // optional - deviceFlow: false // optional + labels: ['official'], }); ``` ```server-deno @@ -989,29 +876,12 @@ const client = new Client() const apps = new Apps(client); -const result = await apps.update({ +const app = await apps.updateLabels({ appId: '', - name: '', - description: '', // optional - clientUri: 'https://example.com', // optional - logoUri: 'https://example.com', // optional - privacyPolicyUrl: 'https://example.com', // optional - termsUrl: 'https://example.com', // optional - contacts: [], // optional - tagline: '', // optional - tags: [], // optional - images: [], // optional - supportUrl: 'https://example.com', // optional - dataDeletionUrl: 'https://example.com', // optional - enabled: false, // optional - redirectUris: [], // optional - postLogoutRedirectUris: [], // optional - type: 'public', // optional - deviceFlow: false // optional + labels: ['official'], }); ``` ```server-php -```php update( +$app = $apps->updateLabels( appId: '', - name: '', - description: '', // optional - clientUri: 'https://example.com', // optional - logoUri: 'https://example.com', // optional - privacyPolicyUrl: 'https://example.com', // optional - termsUrl: 'https://example.com', // optional - contacts: [], // optional - tagline: '', // optional - tags: [], // optional - images: [], // optional - supportUrl: 'https://example.com', // optional - dataDeletionUrl: 'https://example.com', // optional - enabled: false, // optional - redirectUris: [], // optional - postLogoutRedirectUris: [], // optional - type: 'public', // optional - deviceFlow: false // optional -);``` + labels: ['official'] +); ``` ```server-python from appwrite.client import Client from appwrite.services.apps import Apps -from appwrite.models import App client = Client() client.set_endpoint('https://.cloud.appwrite.io/v1') # Your API Endpoint @@ -1057,28 +910,10 @@ client.set_key('') # Your secret API key apps = Apps(client) -result: App = apps.update( +app = apps.update_labels( app_id = '', - name = '', - description = '', # optional - client_uri = 'https://example.com', # optional - logo_uri = 'https://example.com', # optional - privacy_policy_url = 'https://example.com', # optional - terms_url = 'https://example.com', # optional - contacts = [], # optional - tagline = '', # optional - tags = [], # optional - images = [], # optional - support_url = 'https://example.com', # optional - data_deletion_url = 'https://example.com', # optional - enabled = False, # optional - redirect_uris = [], # optional - post_logout_redirect_uris = [], # optional - type = 'public', # optional - device_flow = False # optional + labels = ['official'] ) - -print(result.model_dump()) ``` ```server-ruby require 'appwrite' @@ -1092,25 +927,9 @@ client = Client.new apps = Apps.new(client) -result = apps.update( +app = apps.update_labels( app_id: '', - name: '', - description: '', # optional - client_uri: 'https://example.com', # optional - logo_uri: 'https://example.com', # optional - privacy_policy_url: 'https://example.com', # optional - terms_url: 'https://example.com', # optional - contacts: [], # optional - tagline: '', # optional - tags: [], # optional - images: [], # optional - support_url: 'https://example.com', # optional - data_deletion_url: 'https://example.com', # optional - enabled: false, # optional - redirect_uris: [], # optional - post_logout_redirect_uris: [], # optional - type: 'public', # optional - device_flow: false # optional + labels: ['official'] ) ``` ```server-dart @@ -1123,29 +942,12 @@ Client client = Client() Apps apps = Apps(client); -App result = await apps.update( +App app = await apps.updateLabels( appId: '', - name: '', - description: '', // (optional) - clientUri: 'https://example.com', // (optional) - logoUri: 'https://example.com', // (optional) - privacyPolicyUrl: 'https://example.com', // (optional) - termsUrl: 'https://example.com', // (optional) - contacts: [], // (optional) - tagline: '', // (optional) - tags: [], // (optional) - images: [], // (optional) - supportUrl: 'https://example.com', // (optional) - dataDeletionUrl: 'https://example.com', // (optional) - enabled: false, // (optional) - redirectUris: [], // (optional) - postLogoutRedirectUris: [], // (optional) - type: 'public', // (optional) - deviceFlow: false, // (optional) + labels: ['official'], ); ``` ```server-dotnet -```csharp using Appwrite; using Appwrite.Models; using Appwrite.Services; @@ -1157,30 +959,13 @@ Client client = new Client() Apps apps = new Apps(client); -App result = await apps.Update( +App app = await apps.UpdateLabels( appId: "", - name: "", - description: "", // optional - clientUri: "https://example.com", // optional - logoUri: "https://example.com", // optional - privacyPolicyUrl: "https://example.com", // optional - termsUrl: "https://example.com", // optional - contacts: new List(), // optional - tagline: "", // optional - tags: new List(), // optional - images: new List(), // optional - supportUrl: "https://example.com", // optional - dataDeletionUrl: "https://example.com", // optional - enabled: false, // optional - redirectUris: new List(), // optional - postLogoutRedirectUris: new List(), // optional - type: "public", // optional - deviceFlow: false // optional -);``` + labels: new List { "official" } +); ``` ```server-kotlin import io.appwrite.Client -import io.appwrite.coroutines.CoroutineCallback import io.appwrite.services.Apps val client = Client() @@ -1190,25 +975,9 @@ val client = Client() val apps = Apps(client) -val response = apps.update( +val app = apps.updateLabels( appId = "", - name = "", - description = "", // optional - clientUri = "https://example.com", // optional - logoUri = "https://example.com", // optional - privacyPolicyUrl = "https://example.com", // optional - termsUrl = "https://example.com", // optional - contacts = listOf(), // optional - tagline = "", // optional - tags = listOf(), // optional - images = listOf(), // optional - supportUrl = "https://example.com", // optional - dataDeletionUrl = "https://example.com", // optional - enabled = false, // optional - redirectUris = listOf(), // optional - postLogoutRedirectUris = listOf(), // optional - type = "public", // optional - deviceFlow = false // optional + labels = listOf("official") ) ``` ```server-java @@ -1223,25 +992,9 @@ Client client = new Client() Apps apps = new Apps(client); -apps.update( +apps.updateLabels( "", // appId - "", // name - "", // description (optional) - "https://example.com", // clientUri (optional) - "https://example.com", // logoUri (optional) - "https://example.com", // privacyPolicyUrl (optional) - "https://example.com", // termsUrl (optional) - List.of(), // contacts (optional) - "", // tagline (optional) - List.of(), // tags (optional) - List.of(), // images (optional) - "https://example.com", // supportUrl (optional) - "https://example.com", // dataDeletionUrl (optional) - false, // enabled (optional) - List.of(), // redirectUris (optional) - List.of(), // postLogoutRedirectUris (optional) - "public", // type (optional) - false, // deviceFlow (optional) + List.of("official"), // labels new CoroutineCallback<>((result, error) -> { if (error != null) { error.printStackTrace(); @@ -1251,7 +1004,6 @@ apps.update( System.out.println(result); }) ); - ``` ```server-swift import Appwrite @@ -1263,196 +1015,189 @@ let client = Client() let apps = Apps(client) -let app = try await apps.update( +let app = try await apps.updateLabels( appId: "", - name: "", - description: "", // optional - clientUri: "https://example.com", // optional - logoUri: "https://example.com", // optional - privacyPolicyUrl: "https://example.com", // optional - termsUrl: "https://example.com", // optional - contacts: [], // optional - tagline: "", // optional - tags: [], // optional - images: [], // optional - supportUrl: "https://example.com", // optional - dataDeletionUrl: "https://example.com", // optional - enabled: false, // optional - redirectUris: [], // optional - postLogoutRedirectUris: [], // optional - type: "public", // optional - deviceFlow: false // optional + labels: ["official"] ) - ``` ```server-go package main import ( "fmt" - "github.com/repoowner/reponame/client" - "github.com/repoowner/reponame/apps" + "github.com/appwrite/sdk-for-go/apps" + "github.com/appwrite/sdk-for-go/client" ) -client := client.New( - client.WithEndpoint("https://.cloud.appwrite.io/v1") - client.WithProject("") - appwrite.WithKey("") -) +func main() { + c := client.New( + client.WithEndpoint("https://.cloud.appwrite.io/v1"), + client.WithProject(""), + client.WithKey(""), + ) -service := apps.New(client) - -response, error := service.Update( - "", - "", - apps.WithUpdateDescription(""), - apps.WithUpdateClientUri("https://example.com"), - apps.WithUpdateLogoUri("https://example.com"), - apps.WithUpdatePrivacyPolicyUrl("https://example.com"), - apps.WithUpdateTermsUrl("https://example.com"), - apps.WithUpdateContacts([]string{}), - apps.WithUpdateTagline(""), - apps.WithUpdateTags([]string{}), - apps.WithUpdateImages([]string{}), - apps.WithUpdateSupportUrl("https://example.com"), - apps.WithUpdateDataDeletionUrl("https://example.com"), - apps.WithUpdateEnabled(false), - apps.WithUpdateRedirectUris([]string{}), - apps.WithUpdatePostLogoutRedirectUris([]string{}), - apps.WithUpdateType("public"), - apps.WithUpdateDeviceFlow(false), -) + service := apps.New(c) + + app, err := service.UpdateLabels( + "", + []string{"official"}, + ) + if err != nil { + panic(err) + } + + fmt.Println(app) +} ``` ```server-rust -use appwrite::Client; -use appwrite::services::Apps; +use appwrite::client::Client; +use appwrite::services::apps::Apps; #[tokio::main] async fn main() -> Result<(), Box> { - let client = Client::new(); - client.set_endpoint("https://.cloud.appwrite.io/v1"); // Your API Endpoint - client.set_project(""); // Your project ID - client.set_key(""); // Your secret API key + let client = Client::new() + .set_endpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .set_project("") // Your project ID + .set_key(""); // Your secret API key let apps = Apps::new(&client); - let result = apps.update( - "", - "", - Some(""), // optional - Some("https://example.com"), // optional - Some("https://example.com"), // optional - Some("https://example.com"), // optional - Some("https://example.com"), // optional - Some(vec![]), // optional - Some(""), // optional - Some(vec![]), // optional - Some(vec![]), // optional - Some("https://example.com"), // optional - Some("https://example.com"), // optional - Some(false), // optional - Some(vec![]), // optional - Some(vec![]), // optional - Some("public"), // optional - Some(false) // optional - ).await?; - - let _ = result; + let app = apps + .update_labels( + "", + vec!["official".into()], + ) + .await?; + + let _ = app; Ok(()) } ``` {% /multicode %} -# Delete a client {% #delete %} +Labels replace the previous set on every call. Up to 100 labels are allowed, each up to 36 alphanumeric characters. -Deleting a client immediately invalidates every token issued to it. +# Revoke all tokens {% #revoke-tokens %} + +`deleteTokens` invalidates every token issued to a client at once: a kill switch for all of its sessions. Reach for it when testing, since it forces the consent screen to reappear, or as an emergency response to a leaked secret, together with rotating the secret itself. {% multicode %} -```server-nodejs -import { Client, Apps } from 'node-appwrite'; +```client-web +import { Client, Apps } from 'appwrite'; const client = new Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint - .setProject('') // Your project ID - .setKey(''); // Your secret API key + .setProject(''); // Your project ID const apps = new Apps(client); -const result = await apps.delete({ - appId: '' +await apps.deleteTokens({ + appId: '', }); ``` -```server-deno -import { Client, Apps } from "npm:node-appwrite"; +```client-flutter +import 'package:appwrite/appwrite.dart'; -const client = new Client() +Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint - .setProject('') // Your project ID - .setKey(''); // Your secret API key + .setProject(''); // Your project ID -const apps = new Apps(client); +Apps apps = Apps(client); -const result = await apps.delete({ - appId: '' -}); +await apps.deleteTokens( + appId: '', +); ``` -```server-php -```php -setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint - ->setProject('') // Your project ID - ->setKey(''); // Your secret API key +let client = Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID -$apps = new Apps($client); +let apps = Apps(client) -$result = $apps->delete( - appId: '' -);``` +try await apps.deleteTokens( + appId: "" +) ``` -```server-python -from appwrite.client import Client -from appwrite.services.apps import Apps +```client-android-kotlin +import io.appwrite.Client +import io.appwrite.services.Apps -client = Client() -client.set_endpoint('https://.cloud.appwrite.io/v1') # Your API Endpoint -client.set_project('') # Your project ID -client.set_key('') # Your secret API key +val client = Client(context) + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID -apps = Apps(client) +val apps = Apps(client) -result = apps.delete( - app_id = '' +apps.deleteTokens( + appId = "" ) ``` -```server-ruby -require 'appwrite' +```client-android-java +import io.appwrite.Client; +import io.appwrite.coroutines.CoroutineCallback; +import io.appwrite.services.Apps; -include Appwrite +Client client = new Client(context) + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject(""); // Your project ID -client = Client.new - .set_endpoint('https://.cloud.appwrite.io/v1') # Your API Endpoint - .set_project('') # Your project ID - .set_key('') # Your secret API key +Apps apps = new Apps(client); -apps = Apps.new(client) +apps.deleteTokens( + "", // appId + new CoroutineCallback<>((result, error) -> { + if (error != null) { + error.printStackTrace(); + return; + } -result = apps.delete( - app_id: '' -) + Log.d("Appwrite", result.toString()); + }) +); ``` -```server-dart -import 'package:dart_appwrite/dart_appwrite.dart'; +```client-react-native +import { Client, Apps } from "react-native-appwrite"; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +const apps = new Apps(client); + +await apps.deleteTokens({ + appId: '', +}); +``` +{% /multicode %} + +# Delete a client {% #delete %} + +Deleting a client immediately invalidates every token issued to it. + +{% multicode %} +```client-web +import { Client, Apps } from 'appwrite'; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +const apps = new Apps(client); + +await apps.delete({ + appId: '', +}); +``` +```client-flutter +import 'package:appwrite/appwrite.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint - .setProject('') // Your project ID - .setKey(''); // Your secret API key + .setProject(''); // Your project ID Apps apps = Apps(client); @@ -1460,48 +1205,41 @@ await apps.delete( appId: '', ); ``` -```server-dotnet -```csharp -using Appwrite; -using Appwrite.Models; -using Appwrite.Services; +```client-apple +import Appwrite -Client client = new Client() - .SetEndPoint("https://.cloud.appwrite.io/v1") // Your API Endpoint - .SetProject("") // Your project ID - .SetKey(""); // Your secret API key +let client = Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID -Apps apps = new Apps(client); +let apps = Apps(client) -await apps.Delete( +try await apps.delete( appId: "" -);``` +) ``` -```server-kotlin +```client-android-kotlin import io.appwrite.Client -import io.appwrite.coroutines.CoroutineCallback import io.appwrite.services.Apps -val client = Client() +val client = Client(context) .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint .setProject("") // Your project ID - .setKey("") // Your secret API key val apps = Apps(client) -val response = apps.delete( +apps.delete( appId = "" ) ``` -```server-java +```client-android-java import io.appwrite.Client; import io.appwrite.coroutines.CoroutineCallback; import io.appwrite.services.Apps; -Client client = new Client() +Client client = new Client(context) .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint - .setProject("") // Your project ID - .setKey(""); // Your secret API key + .setProject(""); // Your project ID Apps apps = new Apps(client); @@ -1513,67 +1251,51 @@ apps.delete( return; } - System.out.println(result); + Log.d("Appwrite", result.toString()); }) ); - ``` -```server-swift -import Appwrite - -let client = Client() - .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint - .setProject("") // Your project ID - .setKey("") // Your secret API key +```client-react-native +import { Client, Apps } from "react-native-appwrite"; -let apps = Apps(client) +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID -let result = try await apps.delete( - appId: "" -) +const apps = new Apps(client); +await apps.delete({ + appId: '', +}); ``` -```server-go -package main +{% /multicode %} -import ( - "fmt" - "github.com/repoowner/reponame/client" - "github.com/repoowner/reponame/apps" -) +# Dynamic client registration {% #dynamic-registration %} -client := client.New( - client.WithEndpoint("https://.cloud.appwrite.io/v1") - client.WithProject("") - appwrite.WithKey("") -) +Clients can also register themselves over plain HTTP, without an Appwrite SDK or a signed-in user, through the registration endpoint ([RFC 7591](https://datatracker.ietf.org/doc/html/rfc7591)). This is what makes your OAuth2 server compatible with MCP servers and other software that provisions its own client on first contact. Registration is rate-limited per IP. -service := apps.New(client) +```http +POST /v1/oauth2//register HTTP/1.1 +Host: .cloud.appwrite.io +Content-Type: application/json -response, error := service.Delete( - "", -) +{ + "client_name": "MCP Client", + "redirect_uris": ["http://customapp.localhost/auth/redirect"], + "token_endpoint_auth_method": "none" +} ``` -```server-rust -use appwrite::Client; -use appwrite::services::Apps; - -#[tokio::main] -async fn main() -> Result<(), Box> { - let client = Client::new(); - client.set_endpoint("https://.cloud.appwrite.io/v1"); // Your API Endpoint - client.set_project(""); // Your project ID - client.set_key(""); // Your secret API key - - let apps = Apps::new(&client); - - let result = apps.delete( - "" - ).await?; - let _ = result; - - Ok(()) +```json +{ + "client_id": "6a56677caf736a2310a2", + "client_id_issued_at": 1784047484, + "redirect_uris": ["http://customapp.localhost/auth/redirect"], + "token_endpoint_auth_method": "none", + "grant_types": ["authorization_code"], + "response_types": ["code"], + "client_name": "MCP Client" } ``` -{% /multicode %} + +`token_endpoint_auth_method: none` registers a public client for PKCE; `client_secret_basic` (the default) and `client_secret_post` register confidential clients. The registered app appears in your Console and in `list` like any other client. diff --git a/src/routes/docs/partners/oauth-server/custom-scopes/step-1/+page.markdoc b/src/routes/docs/partners/oauth-server/custom-scopes/step-1/+page.markdoc index 45505c5453..99a9a4a1c7 100644 --- a/src/routes/docs/partners/oauth-server/custom-scopes/step-1/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/custom-scopes/step-1/+page.markdoc @@ -1,12 +1,12 @@ --- layout: tutorial title: Protect your API with custom scopes -description: Define custom scopes on your Appwrite OAuth server, request them from a client, and enforce them on your own API. +description: Define custom scopes on your Appwrite OAuth2 server, request them from a client, and enforce them on your own API. step: 1 difficulty: intermediate readtime: 20 framework: TanStack Start -category: OAuth server +category: OAuth2 server back: /docs/partners/oauth-server --- @@ -16,12 +16,12 @@ This tutorial continues with the same two apps. TaskFlow gains a task API that c # What you will build {% #what-you-will-build %} -- Two custom scopes on TaskFlow's OAuth server: `read:tasks` and `write:tasks`. +- Two custom scopes on TaskFlow's OAuth2 server: `read:tasks` and `write:tasks`. - A consent screen where the user grants or withholds **each permission individually**. - A **resource server**: an API route on TaskFlow that validates access tokens and enforces the scopes they carry, operation by operation. - A task composer on Vantage's dashboard that succeeds or gets refused depending on what the user granted. -The resource server is the new idea. The OAuth server issues tokens and stamps the granted scopes onto them, but it does not know what `read:tasks` means in your product. Your API gives the scope its meaning by checking it on every request. +The resource server is the new idea. The OAuth2 server issues tokens and stamps the granted scopes onto them, but it does not know what `read:tasks` means in your product. Your API gives the scope its meaning by checking it on every request. # The flow {% #the-flow %} @@ -35,7 +35,7 @@ Everything up to step 3 is the authorization code flow from the first guide, wit # Prerequisites {% #prerequisites %} -- The two apps from [Sign in with your product](/docs/partners/oauth-server/sign-in-with-your-product/step-1), running against a project with the OAuth server enabled and Vantage registered as a confidential client. +- The two apps from [Sign in with your product](/docs/partners/oauth-server/sign-in-with-your-product/step-1), running against a project with the OAuth2 server enabled and Vantage registered as a confidential client. - [Node.js](https://nodejs.org/) 20 or newer and `pnpm`. {% info title="Get the finished code" %} diff --git a/src/routes/docs/partners/oauth-server/custom-scopes/step-2/+page.markdoc b/src/routes/docs/partners/oauth-server/custom-scopes/step-2/+page.markdoc index 6651e4977c..523a75ad00 100644 --- a/src/routes/docs/partners/oauth-server/custom-scopes/step-2/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/custom-scopes/step-2/+page.markdoc @@ -1,11 +1,11 @@ --- layout: tutorial title: Define the scopes -description: Add read:tasks and write:tasks to your OAuth server's scopes. +description: Add read:tasks and write:tasks to your OAuth2 server's scopes. step: 2 --- -Scopes have to be defined on the OAuth server before a client can request them. Requesting a scope you have not defined fails the authorization request with `invalid_scope`. +Scopes have to be defined on the OAuth2 server before a client can request them. Requesting a scope you have not defined fails the authorization request with `invalid_scope`. # Add the scopes {% #add %} diff --git a/src/routes/docs/partners/oauth-server/custom-scopes/step-3/+page.markdoc b/src/routes/docs/partners/oauth-server/custom-scopes/step-3/+page.markdoc index dc1db6c8a6..6bc83e5c45 100644 --- a/src/routes/docs/partners/oauth-server/custom-scopes/step-3/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/custom-scopes/step-3/+page.markdoc @@ -14,11 +14,11 @@ In the consumer, extend the scope list in `consumer/src/lib/oauth.ts`: ```ts // consumer/src/lib/oauth.ts // read:tasks and write:tasks are custom scopes defined on TaskFlow's -// OAuth server. They authorize Vantage against TaskFlow's task API. +// OAuth2 server. They authorize Vantage against TaskFlow's task API. export const SCOPES = 'openid profile email read:tasks write:tasks' ``` -`authorizeUrl` already passes `SCOPES` as the `scope` parameter, so nothing else changes on the consumer. The OAuth server carries the requested scopes into the grant and shows them to the user. +`authorizeUrl` already passes `SCOPES` as the `scope` parameter, so nothing else changes on the consumer. The OAuth2 server carries the requested scopes into the grant and shows them to the user. # Label the scopes on the consent screen {% #label %} @@ -42,13 +42,13 @@ A raw scope string like `read:tasks` means something to you, not to your users. # Let the user choose {% #choose %} -Consent is not all-or-nothing. When approving a grant, the consent screen can pass the subset of scopes the user agreed to, and the OAuth server narrows the grant to exactly that. It rejects any scope that was not requested, and `openid` is always retained because it is the sign-in itself. +Consent is not all-or-nothing. When approving a grant, the consent screen can pass the subset of scopes the user agreed to, and the OAuth2 server narrows the grant to exactly that. It rejects any scope that was not requested, and `openid` is always retained because it is the sign-in itself. Update the `approve` helper in `provider/src/lib/oauth-server.ts` to pass the chosen scopes: ```ts // provider/src/lib/oauth-server.ts -/** Approve a grant. The OAuth server responds with the URL to send the +/** Approve a grant. The OAuth2 server responds with the URL to send the * user back to, carrying the authorization code. Passing scopes narrows * the grant to that subset; the server rejects anything that was not * requested and always retains openid. */ diff --git a/src/routes/docs/partners/oauth-server/custom-scopes/step-4/+page.markdoc b/src/routes/docs/partners/oauth-server/custom-scopes/step-4/+page.markdoc index 6afee0dcf3..932adb8b02 100644 --- a/src/routes/docs/partners/oauth-server/custom-scopes/step-4/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/custom-scopes/step-4/+page.markdoc @@ -5,7 +5,7 @@ description: Verify incoming access tokens against your project's JWKS and read step: 4 --- -TaskFlow's API is about to accept access tokens from the outside world, so it first needs a way to tell a token it issued from one somebody made up. Access tokens from your OAuth server are RS256-signed JWTs, and the matching public keys are published at your project's JWKS endpoint. That means TaskFlow can verify tokens locally, with no call back to the OAuth server on each request. +TaskFlow's API is about to accept access tokens from the outside world, so it first needs a way to tell a token it issued from one somebody made up. Access tokens from your OAuth2 server are RS256-signed JWTs, and the matching public keys are published at your project's JWKS endpoint. That means TaskFlow can verify tokens locally, with no call back to the OAuth2 server on each request. # Install jose {% #install %} @@ -23,13 +23,13 @@ Create `provider/src/lib/resource-server.ts`: ```ts // provider/src/lib/resource-server.ts // TaskFlow's resource server: validates access tokens issued by the -// project's OAuth server and enforces the scopes they carry. +// project's OAuth2 server and enforces the scopes they carry. import '@tanstack/react-start/server-only' import { createRemoteJWKSet, jwtVerify, type JWTPayload } from 'jose' const issuer = process.env.OAUTH_ISSUER! -// The OAuth server publishes its signing keys as a JWK Set. jose caches +// The OAuth2 server publishes its signing keys as a JWK Set. jose caches // the keys and refetches them when it sees an unknown key ID. const jwks = createRemoteJWKSet(new URL(`${issuer}/.well-known/jwks.json`)) @@ -60,7 +60,7 @@ export function hasScope(token: AccessToken, scope: string): boolean { `jwtVerify` checks the signature against the published keys and rejects expired tokens, so a forged or stale token never reaches your handlers. It also pins the algorithm to the RS256 keys in the JWKS, so `alg: none` and HMAC confusion attacks fail here too. -The `{ typ: 'at+jwt' }` option matters more than it looks. Your OAuth server signs [ID tokens](/docs/partners/oauth-server/tokens) with the same key as access tokens, and an ID token has no `scope` claim. Without the type check, a client could present its ID token to your API; requiring `at+jwt` (the [access token type](/docs/partners/oauth-server/tokens)) rejects it before it reaches a handler. An ID token is meant for the client that received it, never as a credential for your API. +The `{ typ: 'at+jwt' }` option matters more than it looks. Your OAuth2 server signs [ID tokens](/docs/partners/oauth-server/tokens) with the same key as access tokens, and an ID token has no `scope` claim. Without the type check, a client could present its ID token to your API; requiring `at+jwt` (the [access token type](/docs/partners/oauth-server/tokens)) rejects it before it reaches a handler. An ID token is meant for the client that received it, never as a credential for your API. Two claims in the verified payload matter for the API: @@ -68,7 +68,7 @@ Two claims in the verified payload matter for the API: - `sub` is the ID of the user who approved the grant. The API uses it to load that user's tasks, so a token can never read anyone else's data. {% info title="Build the JWKS URL from your own configuration" %} -The guard builds the JWKS URL from the `OAUTH_ISSUER` value the provider already has, the same base it uses for every other OAuth server call. Since [tokens](/docs/partners/oauth-server/tokens) are standard JWTs, any JWT library with JWKS support in any language can do this job. The API route just happens to live next to the consent screen here. +The guard builds the JWKS URL from the `OAUTH_ISSUER` value the provider already has, the same base it uses for every other OAuth2 server call. Since [tokens](/docs/partners/oauth-server/tokens) are standard JWTs, any JWT library with JWKS support in any language can do this job. The API route just happens to live next to the consent screen here. {% /info %} Continue to put the guard in front of an API route. diff --git a/src/routes/docs/partners/oauth-server/custom-scopes/step-7/+page.markdoc b/src/routes/docs/partners/oauth-server/custom-scopes/step-7/+page.markdoc index e9bb0f9003..4ac3b8a072 100644 --- a/src/routes/docs/partners/oauth-server/custom-scopes/step-7/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/custom-scopes/step-7/+page.markdoc @@ -25,7 +25,7 @@ pnpm dev ![TaskFlow consent screen with the write permission switched off](/images/docs/oauth-server/scopes-guide/taskflow-consent-choice.avif) -Open `http://localhost:4100` and click **Sign in with TaskFlow**. On the consent screen, switch **Create and update your tasks** off and authorize. The OAuth server narrows the grant to what was actually approved, so the access token comes back carrying `read:tasks` but not `write:tasks`. +Open `http://localhost:4100` and click **Sign in with TaskFlow**. On the consent screen, switch **Create and update your tasks** off and authorize. The OAuth2 server narrows the grant to what was actually approved, so the access token comes back carrying `read:tasks` but not `write:tasks`. ![Vantage dashboard with the write attempt refused as insufficient_scope](/images/docs/oauth-server/scopes-guide/vantage-write-denied.avif) @@ -41,7 +41,7 @@ Add the same task again. It lands in the list, and the `write:tasks` chip sits i # What each piece did {% #recap %} -- **The OAuth server** published the scopes, put them in front of the user as individual choices, and stamped the approved subset onto a signed access token. +- **The OAuth2 server** published the scopes, put them in front of the user as individual choices, and stamped the approved subset onto a signed access token. - **TaskFlow's API** verified each token against the project's JWKS and turned the `scope` claim into an allow-or-deny decision per operation. - **Vantage** requested the scopes it can use, and its access ends exactly where the user's grant does. diff --git a/src/routes/docs/partners/oauth-server/device-flow/+page.markdoc b/src/routes/docs/partners/oauth-server/device-flow/+page.markdoc index 53e233e687..1ae6eec6ad 100644 --- a/src/routes/docs/partners/oauth-server/device-flow/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/device-flow/+page.markdoc @@ -1,28 +1,123 @@ --- layout: article title: Device flow -description: Authorize TVs, CLIs, and other input-constrained devices against your Appwrite OAuth server with the device authorization grant. +description: Authorize TVs, CLIs, and other input-constrained devices against your Appwrite OAuth2 server with the device authorization grant. back: /docs/partners/oauth-server --- -Some devices cannot show a browser or take typed input: a TV app, a CLI on a remote server, a hardware device. The **device authorization grant** (RFC 8628) lets these clients get tokens by having the user approve on a second device, like their phone or laptop. +The device authorization grant (RFC 8628) lets a client request access even when it cannot open a browser or accept a callback. A TV app, command-line tool, or hardware device shows the user a code, and the user completes authorization on a phone or computer. + +This flow involves two applications: + +- The **device client** is the third-party application requesting access. It communicates with Appwrite over HTTP. +- The **verification page** belongs to your project. You build this page with an Appwrite Client SDK so the user can sign in, review the request, and approve or reject it. # How it works {% #how-it-works %} -1. The device asks the OAuth server to start a device authorization. The server returns a **device code**, a short **user code**, and a **verification URL**. -2. The device shows the user code and verification URL to the user (for example, "Go to example.com/activate and enter WDJB-MJHT"). -3. The user opens the verification URL on another device, signs in, and approves. -4. Meanwhile the device polls the token endpoint. Once the user approves, the poll returns tokens. +1. The device client starts a device authorization. Appwrite returns a device code, a shorter user code, and the URL of your verification page. +2. The device shows the user code and verification URL to the user. +3. The user opens the verification page on a second device, confirms the code, signs in, and reviews the request. +4. The verification page connects the pending request to the signed-in user and asks them to approve or reject it. +5. While this happens, the original device polls the token endpoint. After approval, the next successful poll returns tokens directly to the device. + +# Configure device flow {% #configure %} + +Device flow must be enabled in both the OAuth2 server settings and the client settings. + +## Configure the OAuth2 server {% #configure-server %} + +Use `project.updateOAuth2Server` from a Server SDK to configure the verification page and code behavior: + +| Setting | Purpose | +| --- | --- | +| `verificationUrl` | The URL of the verification page you host, such as `https://your-product.com/activate`. This setting is required for device flow. | +| `userCodeLength` | The number of characters in the user code. It can be from 6 to 12 and defaults to 8. | +| `userCodeFormat` | The characters used in the user code: `numeric`, `alphabetic`, or `alphanumeric`. The default is `alphanumeric`. | +| `deviceCodeDuration` | How long the device code and user code remain valid, in seconds. It can be from 60 to 1,800 and defaults to 600. | + +{% info title="The call replaces the whole configuration" %} +`updateOAuth2Server` sets the full OAuth2 server configuration in one call. Include your existing authorization URL, scopes, and other settings when you add the device flow settings. +{% /info %} + +## Enable device flow for the client {% #enable-client %} + +The client must also have **Device flow** enabled. Turn it on when you create or update the client in the Console, or set `deviceFlow: true` with a Server SDK. Devices that cannot protect a client secret should be registered as public clients. See [Clients](/docs/partners/oauth-server/clients#register) for client registration. + +# Integrate the device client {% #integrate-device %} + +The device client uses HTTP for the device authorization and token requests. + +## 1. Start a device authorization {% #start %} + +Send the client ID and requested scopes to the device authorization endpoint as JSON: + +```http +POST /v1/oauth2//device_authorization HTTP/1.1 +Host: .cloud.appwrite.io +Content-Type: application/json +Accept: application/json + +{ + "client_id": "", + "scope": "openid profile tasks.read" +} +``` + +The request can also include: + +- `authorization_details` for a JSON-encoded rich authorization request. +- `resource` for one resource indicator URI or an array of URIs. +- `audience` as a compatibility alias for one resource indicator. + +See [Scopes](/docs/partners/oauth-server/scopes#rich-authorization-requests) for authorization details and resource restrictions. + +Appwrite returns the codes, expiration, and polling interval: + +```json +{ + "device_code": "8575375669b9031cb5371b0ee39985c2...", + "user_code": "3RG9K9QF", + "verification_uri": "https://your-product.com/activate", + "verification_uri_complete": "https://your-product.com/activate?user_code=3RG9K9QF", + "expires_in": 600, + "interval": 1 +} +``` + +Show the `user_code` and `verification_uri` on the device. You can also present `verification_uri_complete` as a link or QR code, which opens the verification page with the code already filled in. -Device flow is available to a client only when both the project has a **verification URL** configured on the OAuth2 server settings and the client has **device flow** enabled. Device clients are public clients, so they authenticate with no secret. +## 2. Poll for tokens {% #poll %} -# Enable device flow on a client {% #enable %} +Start polling the token endpoint in the background. Wait at least the number of seconds in `interval` between requests: -Turn on **Device flow** when you create or update the client. In the Console, it is a toggle in the client dialog; with a Server SDK, set `deviceFlow: true` on the [client](/docs/partners/oauth-server/clients#register). +```http +POST /v1/oauth2//token HTTP/1.1 +Host: .cloud.appwrite.io +Content-Type: application/json +Accept: application/json -# Start a device authorization {% #start %} +{ + "grant_type": "urn:ietf:params:oauth:grant-type:device_code", + "device_code": "", + "client_id": "" +} +``` + +Handle each response according to its `error` value: + +- `authorization_pending`: The user has not finished authorization. Wait for `interval`, then poll again. +- `slow_down`: The client is polling too quickly. Increase the delay before the next request. +- `expired_token`: The device code expired. Start a new device authorization and show the new user code. +- `access_denied`: The user rejected the request. Stop polling and let them restart if they want to try again. -The device requests a device authorization with its client ID and the scopes it wants. +# Build the verification page {% #verification-page %} + +The `verificationUrl` page runs on the user's second device and completes the interactive part of the flow. + +1. Read `user_code` from the URL search parameters. If it is missing, show an input where the user can enter the code displayed on the original device. +2. Show the code and ask the user to confirm that it matches the original device. +3. Make sure the user is signed in to your project. If they are signed out, send them through your sign-in or sign-up flow and return them to the verification page with the user code intact. +4. Pass the confirmed code to `oauth2.createGrant`. This connects the pending device request to the signed-in user and returns the grant record. {% multicode %} ```client-web @@ -34,11 +129,8 @@ const client = new Client() const oauth2 = new Oauth2(client); -const result = await oauth2.createDeviceAuthorization({ - clientId: '', // optional - scope: '', // optional - authorizationDetails: '', // optional - resource: '' // optional +const result = await oauth2.createGrant({ + userCode: '' }); console.log(result); @@ -52,11 +144,8 @@ Client client = Client() Oauth2 oauth2 = Oauth2(client); -Oauth2DeviceAuthorization result = await oauth2.createDeviceAuthorization( - clientId: '', // optional - scope: '', // optional - authorizationDetails: '', // optional - resource: '', // optional +Oauth2Grant result = await oauth2.createGrant( + userCode: '', ); ``` ```client-apple @@ -68,17 +157,12 @@ let client = Client() let oauth2 = Oauth2(client) -let oauth2DeviceAuthorization = try await oauth2.createDeviceAuthorization( - client_id: "", // optional - scope: "", // optional - authorization_details: "", // optional - resource: "" // optional +let oauth2Grant = try await oauth2.createGrant( + user_code: "" ) - ``` ```client-android-kotlin import io.appwrite.Client -import io.appwrite.coroutines.CoroutineCallback import io.appwrite.services.Oauth2 val client = Client(context) @@ -87,11 +171,8 @@ val client = Client(context) val oauth2 = Oauth2(client) -val result = oauth2.createDeviceAuthorization( - client_id = "", // (optional) - scope = "", // (optional) - authorization_details = "", // (optional) - resource = "", // (optional) +val result = oauth2.createGrant( + user_code = "", ) ``` ```client-android-java @@ -105,11 +186,8 @@ Client client = new Client(context) Oauth2 oauth2 = new Oauth2(client); -oauth2.createDeviceAuthorization( - "", // client_id (optional) - "", // scope (optional) - "", // authorization_details (optional) - "", // resource (optional) +oauth2.createGrant( + "", // user_code new CoroutineCallback<>((result, error) -> { if (error != null) { error.printStackTrace(); @@ -119,10 +197,9 @@ oauth2.createDeviceAuthorization( Log.d("Appwrite", result.toString()); }) ); - ``` ```client-react-native -import { Client, Oauth2 } from "react-native-appwrite"; +import { Client, Oauth2 } from 'react-native-appwrite'; const client = new Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint @@ -130,42 +207,30 @@ const client = new Client() const oauth2 = new Oauth2(client); -const result = await oauth2.createDeviceAuthorization({ - clientId: '', // optional - scope: '', // optional - authorizationDetails: '', // optional - resource: '' // optional +const result = await oauth2.createGrant({ + userCode: '' }); console.log(result); ``` {% /multicode %} -The response contains the codes and where to send the user: +Use the returned grant to show the client, requested scopes, and authorization details. Then let the user approve or reject it with the same [consent flow](/docs/partners/oauth-server/authorization#consent) used for browser authorization. + +# Finish on the original device {% #finish %} + +The original device keeps polling while the user completes the verification page. After approval, the token endpoint returns access and refresh tokens, plus an ID token when `openid` was granted. The device uses these tokens directly. Device flow has no authorization code or redirect callback on the original device. ```json { - "device_code": "8575375669b9031cb5371b0ee39985c2...", - "user_code": "WDJB-MJHT", - "verification_uri": "https://example.com/activate", - "verification_uri_complete": "https://example.com/activate?user_code=WDJB-MJHT", - "expires_in": 600, - "interval": 1 + "access_token": "", + "refresh_token": "", + "id_token": "", + "token_type": "Bearer", + "expires_in": 3600, + "scope": "openid profile tasks.read", + "authorization_details": null } ``` -Show the `user_code` and `verification_uri` to the user. The `verification_uri_complete` embeds the code so a phone can open it directly, often as a QR code. - -# Poll for tokens {% #poll %} - -While the user approves on their other device, the client polls the token endpoint with the device code grant, waiting `interval` seconds between attempts. - -```http -POST /v1/oauth2//token HTTP/1.1 -Host: .cloud.appwrite.io -Content-Type: application/x-www-form-urlencoded - -grant_type=urn:ietf:params:oauth:grant-type:device_code&device_code=&client_id= -``` - -Until the user approves, the endpoint returns `authorization_pending`; keep polling. Once they approve, it returns an access token, refresh token, and ID token, exactly like the [authorization code flow](/docs/partners/oauth-server/tokens). If the user declines or the codes expire, the poll returns a terminal error and the device restarts the flow. +Store the newest refresh token securely and use the token response's granted scopes to determine which features are available. See [Tokens](/docs/partners/oauth-server/tokens) for validation, refresh, and revocation. diff --git a/src/routes/docs/partners/oauth-server/quick-start/+page.markdoc b/src/routes/docs/partners/oauth-server/quick-start/+page.markdoc index 30842fb69d..e09fe840f1 100644 --- a/src/routes/docs/partners/oauth-server/quick-start/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/quick-start/+page.markdoc @@ -1,11 +1,16 @@ --- layout: article -title: OAuth server quick start -description: Enable Appwrite's OAuth server, register a client, and run your first authorization code sign-in end to end. +title: OAuth2 server quick start +description: Enable Appwrite's OAuth2 server, register a client, and run your first authorization code sign-in end to end. back: /docs/partners/oauth-server --- -This guide turns a project into an OAuth provider and runs one sign-in through it. By the end you will have an enabled server, a registered client, and an access token issued by your project. +This guide turns your project into an OAuth2 provider and runs one sign-in through it. By the end you will have an enabled server, a registered client, and an access token issued by your project. + +The examples follow two apps, the same pair the [tutorials](/docs/partners/oauth-server/sign-in-with-your-product/step-1) build out in full: + +- **TaskFlow** (`http://platform.localhost`): your product and the **OAuth2 provider**, also called the authorization server. It authenticates users, presents the consent screen, and issues tokens. +- **Vantage** (`http://customapp.localhost`): the third-party **consumer**, called the client in OAuth2. It sends users to TaskFlow for authorization and receives tokens after they approve access. # Enable the server {% #enable %} @@ -18,7 +23,7 @@ In the Console, open **Auth**, select the **OAuth2 server** tab, and turn on **E ![Enabling the OAuth2 server in the Appwrite Console](/images/docs/oauth-server/oauth2-server-settings.avif) {% /only_light %} -Set the **Authorization URL** to the page you will host the consent screen on. This is where Appwrite redirects users during authorization. You can point it at a placeholder for now and change it later. The `openid`, `profile`, and `email` scopes are always included; add any custom scopes your clients will request. +Set the **Authorization URL** to the page you will host the consent screen on. This is where Appwrite redirects users during authorization, and where you present them the details of the request so they can approve or cancel. Point it at `http://platform.localhost/consent`, where TaskFlow will host its consent screen. Nothing needs to run there yet. The `openid`, `profile`, and `email` scopes are always included; add any scopes your custom APIs will support. You can also enable and configure the server with a [Server SDK](/docs/sdks#server) using the `updateOAuth2Server` method. @@ -394,11 +399,13 @@ Once enabled, the server publishes an OpenID Connect discovery document. Integra ![The OIDC discovery URL in the Appwrite Console](/images/docs/oauth-server/oauth2-server-discovery.avif) {% /only_light %} -Open it in a browser to confirm the server is live. It returns JSON describing the authorization, token, userinfo, and JWKS endpoints. +Open it in a browser to confirm the server is live. It returns JSON describing the authorization, token, userinfo, and JWKS endpoints, and more. # Register a client {% #register %} -Open the **Apps** sub-tab and create a client. Give it a name, add at least one redirect URI, and choose a type. Pick **Confidential** for this walkthrough so you get a secret to authenticate the token exchange. Copy the secret when it is shown, because it appears only once. +Each app that integrates with your project registers as a client. Here that is Vantage. The **redirect URI** it declares is a URL on Vantage, `http://customapp.localhost/auth/redirect`, where the OAuth2 server sends users back with the authorization code. Any HTTP or HTTPS URL works. + +Open the **Apps** sub-tab and create a client. Name it `Vantage`, add the redirect URI, and choose a type. Pick **Confidential** for this walkthrough so you get a secret to authenticate the token exchange. Copy the secret when it is shown, because it appears only once. {% only_dark %} ![Creating an OAuth2 client](/images/docs/oauth-server/dark/oauth2-server-create-app.avif) @@ -407,30 +414,344 @@ Open the **Apps** sub-tab and create a client. Give it a name, add at least one ![Creating an OAuth2 client](/images/docs/oauth-server/oauth2-server-create-app.avif) {% /only_light %} -See [Clients](/docs/partners/oauth-server/clients) for the full set of options and the SDK equivalents. +Clients can also be registered from code with the `apps` service in the [Client SDKs](/docs/sdks#client). Any signed-in user on your project can register an app, which enables self-serve registration for integrators. Creating a client needs only a name and a redirect URI: + +{% multicode %} +```client-web +import { Client, Apps, ID } from 'appwrite'; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +const apps = new Apps(client); + +const app = await apps.create({ + appId: ID.unique(), + name: 'Vantage', + redirectUris: ['http://customapp.localhost/auth/redirect'], +}); +``` +```client-flutter +import 'package:appwrite/appwrite.dart'; + +Client client = Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +Apps apps = Apps(client); + +App app = await apps.create( + appId: ID.unique(), + name: 'Vantage', + redirectUris: ['http://customapp.localhost/auth/redirect'], +); +``` +```client-apple +import Appwrite + +let client = Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + +let apps = Apps(client) + +let app = try await apps.create( + appId: ID.unique(), + name: "Vantage", + redirectUris: ["http://customapp.localhost/auth/redirect"] +) +``` +```client-android-kotlin +import io.appwrite.Client +import io.appwrite.ID +import io.appwrite.services.Apps + +val client = Client(context) + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + +val apps = Apps(client) + +val app = apps.create( + appId = ID.unique(), + name = "Vantage", + redirectUris = listOf("http://customapp.localhost/auth/redirect") +) +``` +```client-android-java +import io.appwrite.Client; +import io.appwrite.ID; +import io.appwrite.coroutines.CoroutineCallback; +import io.appwrite.services.Apps; + +Client client = new Client(context) + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject(""); // Your project ID + +Apps apps = new Apps(client); + +apps.create( + ID.unique(), // appId + "Vantage", // name + List.of("http://customapp.localhost/auth/redirect"), // redirectUris + null, // description (optional) + null, // clientUri (optional) + null, // logoUri (optional) + null, // privacyPolicyUrl (optional) + null, // termsUrl (optional) + null, // contacts (optional) + null, // tagline (optional) + null, // tags (optional) + null, // images (optional) + null, // supportUrl (optional) + null, // dataDeletionUrl (optional) + null, // postLogoutRedirectUris (optional) + null, // enabled (optional) + null, // type (optional) + null, // deviceFlow (optional) + null, // teamId (optional) + new CoroutineCallback<>((result, error) -> { + if (error != null) { + error.printStackTrace(); + return; + } + + Log.d("Appwrite", result.toString()); + }) +); +``` +```client-react-native +import { Client, Apps, ID } from "react-native-appwrite"; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +const apps = new Apps(client); + +const app = await apps.create({ + appId: ID.unique(), + name: 'Vantage', + redirectUris: ['http://customapp.localhost/auth/redirect'], +}); +``` +{% /multicode %} + +Updating a client accepts the full set of options, from consent screen branding to logout URIs and the device flow: + +{% multicode %} +```client-web +import { Client, Apps } from 'appwrite'; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +const apps = new Apps(client); + +const app = await apps.update({ + appId: '', + name: 'Vantage', + description: 'A dashboard that signs in with TaskFlow.', + logoUri: 'https://example.com/logo.png', + redirectUris: ['http://customapp.localhost/auth/redirect'], + enabled: true, +}); +``` +```client-flutter +import 'package:appwrite/appwrite.dart'; + +Client client = Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +Apps apps = Apps(client); + +App app = await apps.update( + appId: '', + name: 'Vantage', + description: 'A dashboard that signs in with TaskFlow.', + logoUri: 'https://example.com/logo.png', + redirectUris: ['http://customapp.localhost/auth/redirect'], + enabled: true, +); +``` +```client-apple +import Appwrite + +let client = Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + +let apps = Apps(client) + +let app = try await apps.update( + appId: "", + name: "Vantage", + description: "A dashboard that signs in with TaskFlow.", + logoUri: "https://example.com/logo.png", + redirectUris: ["http://customapp.localhost/auth/redirect"], + enabled: true +) +``` +```client-android-kotlin +import io.appwrite.Client +import io.appwrite.services.Apps + +val client = Client(context) + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + +val apps = Apps(client) + +val app = apps.update( + appId = "", + name = "Vantage", + description = "A dashboard that signs in with TaskFlow.", + logoUri = "https://example.com/logo.png", + redirectUris = listOf("http://customapp.localhost/auth/redirect"), + enabled = true +) +``` +```client-android-java +import io.appwrite.Client; +import io.appwrite.coroutines.CoroutineCallback; +import io.appwrite.services.Apps; + +Client client = new Client(context) + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject(""); // Your project ID + +Apps apps = new Apps(client); + +apps.update( + "", // appId + "Vantage", // name + "A dashboard that signs in with TaskFlow.", // description (optional) + null, // clientUri (optional) + "https://example.com/logo.png", // logoUri (optional) + null, // privacyPolicyUrl (optional) + null, // termsUrl (optional) + null, // contacts (optional) + null, // tagline (optional) + null, // tags (optional) + null, // images (optional) + null, // supportUrl (optional) + null, // dataDeletionUrl (optional) + true, // enabled (optional) + List.of("http://customapp.localhost/auth/redirect"), // redirectUris (optional) + null, // postLogoutRedirectUris (optional) + null, // type (optional) + null, // deviceFlow (optional) + new CoroutineCallback<>((result, error) -> { + if (error != null) { + error.printStackTrace(); + return; + } + + Log.d("Appwrite", result.toString()); + }) +); +``` +```client-react-native +import { Client, Apps } from "react-native-appwrite"; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +const apps = new Apps(client); + +const app = await apps.update({ + appId: '', + name: 'Vantage', + description: 'A dashboard that signs in with TaskFlow.', + logoUri: 'https://example.com/logo.png', + redirectUris: ['http://customapp.localhost/auth/redirect'], + enabled: true, +}); +``` +{% /multicode %} + +The same `apps` service is available in the [Server SDKs](/docs/sdks#server) with an API key. See [Clients](/docs/partners/oauth-server/clients) for the full set of options. # Run the authorization code flow {% #flow %} -With the server enabled and a client registered, you can run a sign-in. The flow has three steps: send the user to authorize, let them consent, then exchange the returned code for tokens. +With the server enabled and a client registered, you can run a sign-in. The flow has four steps: send the user to authorize, approve the grant, exchange the returned code for tokens, and use the access token to read their profile. + +## 1. Send the user to the authorization endpoint {% #send-to-authorization %} + +Vantage begins the sign-in by sending the user's browser to TaskFlow's authorization endpoint. This is the URL behind Vantage's **Sign in with TaskFlow** button. + +The URL uses TaskFlow's Appwrite API endpoint because its Appwrite project is acting as the authorization server. Replace `` with the region from your API endpoint, `` with TaskFlow's Appwrite project ID, and `` with the ID generated when you registered Vantage: + +```text +https://.cloud.appwrite.io/v1/oauth2//authorize + ?client_id= + &redirect_uri=http://customapp.localhost/auth/redirect + &response_type=code + &scope=openid%20profile%20email + &state= +``` + +Each query parameter tells TaskFlow how to handle the request: + +| Parameter | Meaning | +| --- | --- | +| `client_id` | Identifies Vantage as the client requesting access. | +| `redirect_uri` | Tells TaskFlow where to return the browser after the user approves or cancels. It must match a URI registered for Vantage. | +| `response_type=code` | Requests an authorization code. The browser receives this temporary code, then Vantage's server exchanges it for tokens in step 3. | +| `scope` | Lists the access Vantage is requesting. `openid` starts an OpenID Connect sign-in, while `profile` and `email` request the user's basic profile and email claims. | +| `state` | Carries a random value created and stored by Vantage. Vantage compares it with the value returned after authorization to confirm the response belongs to the same sign-in request. | + +When you open this URL, Appwrite validates the request and checks for an active TaskFlow user session. + +## 2. Review and approve Vantage's request {% #approve-grant %} + +After Vantage opens the authorization endpoint: + +- **Appwrite creates a grant.** For a signed-in user, Appwrite creates a pending authorization request that connects the user, Vantage, the requested scopes, and Vantage's redirect URI. This pending request is called a grant. + +- **Appwrite redirects to TaskFlow.** The **authorization endpoint** is the Appwrite Cloud URL Vantage opens. The **authorization URL** is TaskFlow's consent page, where Appwrite sends the browser with a `grant_id`. + +- **TaskFlow presents the request.** A complete consent screen uses the grant ID to show that Vantage is asking for the user's profile and email, then lets the user approve or cancel. The [Authorization](/docs/partners/oauth-server/authorization#consent) guide shows how to build this screen. + +- **Copy the grant ID.** This quick start does not build TaskFlow's consent screen, so the browser lands on `http://platform.localhost/consent` and finds nothing there. Copy the `grant_id` from the address bar to continue manually. -**1. Send the user to the authorization endpoint.** Include the client ID, a registered redirect URI, `response_type=code`, and the scopes you want. If the user has a session on your project, Appwrite redirects to your authorization URL with a `grant_id`. Otherwise it redirects there with the full request so your screen can sign the user in first. +- **Sign in if the grant ID is missing.** A URL without a `grant_id` means the user does not have an active TaskFlow session. Sign in a user on the project, then open Vantage's authorization URL again. + +- **Approve Vantage's request.** Send the `grant_id` to the approval endpoint using the same TaskFlow user's session. A browser sends the session cookie automatically. From another environment, pass the session token in the `X-Appwrite-Session` header. Use this request: ```http -GET /v1/oauth2//authorize?client_id=&redirect_uri=&response_type=code&scope=openid%20profile%20email&state= HTTP/1.1 +POST /v1/oauth2//approve HTTP/1.1 Host: .cloud.appwrite.io +Content-Type: application/json + +{ + "grant_id": "" +} ``` -**2. Approve the grant.** Your consent screen loads the grant, shows the user what the client is requesting, and approves it. Appwrite then redirects back to the client's redirect URI with an authorization `code`. Building this screen is covered in [Authorization](/docs/partners/oauth-server/authorization). +- **Return to Vantage.** After approval, Appwrite redirects the browser to Vantage's registered redirect URI with an authorization `code` in the query string. Vantage uses this code in the next step. + +## 3. Exchange the code for tokens {% #exchange-code %} -**3. Exchange the code for tokens.** The client sends the code to the token endpoint. A confidential client authenticates with HTTP Basic auth using its client ID and secret. +Vantage's server sends the code to the token endpoint. A confidential client passes its `client_secret`; a public client passes its PKCE `code_verifier` instead. ```http POST /v1/oauth2//token HTTP/1.1 Host: .cloud.appwrite.io -Authorization: Basic -Content-Type: application/x-www-form-urlencoded +Content-Type: application/json -grant_type=authorization_code&code=&redirect_uri= +{ + "grant_type": "authorization_code", + "code": "", + "redirect_uri": "http://customapp.localhost/auth/redirect", + "client_id": "", + "client_secret": "", + "code_verifier": "" +} ``` The response contains an access token, a refresh token, and an ID token: @@ -446,7 +767,27 @@ The response contains an access token, a refresh token, and an ID token: } ``` -The client can now call the userinfo endpoint with the access token, or validate the ID token against the server's JWKS. See [Tokens](/docs/partners/oauth-server/tokens) for token structure, refresh, and revocation. +## 4. Read the user's profile {% #read-profile %} + +Call the userinfo endpoint with the access token to confirm the sign-in worked end to end: + +```http +GET /v1/oauth2//userinfo HTTP/1.1 +Host: .cloud.appwrite.io +Authorization: Bearer +``` + +```json +{ + "sub": "6a5138d1971d49a87f0a", + "email": "walter@example.com", + "email_verified": true, + "name": "Walter O'Brien", + "updated_at": 1784040398 +} +``` + +See [Tokens](/docs/partners/oauth-server/tokens) for token structure, validation, refresh, and revocation. # Next steps {% #next-steps %} diff --git a/src/routes/docs/partners/oauth-server/scopes/+page.markdoc b/src/routes/docs/partners/oauth-server/scopes/+page.markdoc index 0d22ad96b6..f3d3c7c583 100644 --- a/src/routes/docs/partners/oauth-server/scopes/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/scopes/+page.markdoc @@ -1,7 +1,7 @@ --- layout: article title: Scopes -description: The built-in OpenID Connect scopes and the custom scopes clients can request from your Appwrite OAuth server. +description: The built-in OpenID Connect scopes and the custom scopes clients can request from your Appwrite OAuth2 server. back: /docs/partners/oauth-server --- @@ -22,7 +22,9 @@ These appear as locked entries in the **Scopes** field on the OAuth2 server sett # Custom scopes {% #custom %} -Beyond the built-in scopes, you define your own to represent permissions in your product, such as `read:projects` or `write:billing`. Add them in the **Scopes** field on the OAuth2 server settings, or with the `scopes` array on the `updateOAuth2Server` method. The `openid`, `profile`, `email`, and `phone` scopes are always merged in, so you only list the custom ones. +Beyond the built-in scopes, you define your own to represent permissions in your product. A common naming pattern is `resource.action`, such as `games.read` or `billing.write`. Some products also define an `admin` scope for full access. If you use a broad scope, describe it clearly on the consent screen and enforce it consistently in your API. + +Add custom scopes in the **Scopes** field on the OAuth2 server settings, or with the `scopes` array on the `updateOAuth2Server` method. The `openid`, `profile`, `email`, and `phone` scopes are always merged in, so you only list the custom ones. {% only_dark %} ![Configuring scopes on the OAuth2 server](/images/docs/oauth-server/dark/oauth2-server-settings.avif) @@ -33,166 +35,25 @@ Beyond the built-in scopes, you define your own to represent permissions in your A project can define up to 100 scopes, each up to 128 characters. A client can only request scopes you have defined; requesting an unknown scope fails the authorization request. -Custom scopes are labels the OAuth server carries through the flow and stamps onto the access token. Enforcing what each scope allows is your resource server's job: read the `scope` claim from the access token (or from an [introspection](/docs/partners/oauth-server/tokens#introspect) response) and allow or deny the request accordingly. +Custom scopes are labels the OAuth2 server carries through the flow and stamps onto the access token. Enforcing what each scope allows is your resource server's job: read the `scope` claim from the access token (or from an [introspection](/docs/partners/oauth-server/tokens#introspect) response) and allow or deny the request accordingly. # Requesting scopes {% #requesting %} -A client asks for scopes when it starts [authorization](/docs/partners/oauth-server/authorization#authorize). The request is a redirect to your project's authorize URL, and the scopes ride along as the `scope` query parameter, space-separated: - -```text -https://.cloud.appwrite.io/v1/oauth2//authorize - ?client_id= - &redirect_uri=https://example.com/oauth/callback - &response_type=code - &scope=openid%20profile%20email%20read:tasks - &state= -``` - -Integrators building on the Appwrite SDKs make the same request with the `authorize` method: - -{% multicode %} -```client-web -import { Client, Oauth2 } from 'appwrite'; - -const client = new Client() - .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint - .setProject(''); // Your project ID - -const oauth2 = new Oauth2(client); +A client asks for scopes in the space-separated `scope` parameter when it starts authorization, for example `openid profile games.read`. See [Authorization](/docs/partners/oauth-server/authorization#authorize) for the authorize request and SDK examples. -const result = await oauth2.authorize({ - clientId: '', - redirectUri: 'https://example.com/oauth/callback', - responseType: 'code', - scope: 'openid profile email read:tasks', - state: '', -}); -``` -```client-flutter -import 'package:appwrite/appwrite.dart'; - -Client client = Client() - .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint - .setProject(''); // Your project ID - -Oauth2 oauth2 = Oauth2(client); - -Oauth2Authorize result = await oauth2.authorize( - clientId: '', - redirectUri: 'https://example.com/oauth/callback', - responseType: 'code', - scope: 'openid profile email read:tasks', - state: '', -); -``` -```client-apple -import Appwrite - -let client = Client() - .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint - .setProject("") // Your project ID - -let oauth2 = Oauth2(client) - -let result = try await oauth2.authorize( - client_id: "", - redirect_uri: "https://example.com/oauth/callback", - response_type: "code", - scope: "openid profile email read:tasks", - state: "" -) -``` -```client-android-kotlin -import io.appwrite.Client -import io.appwrite.services.Oauth2 - -val client = Client(context) - .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint - .setProject("") // Your project ID - -val oauth2 = Oauth2(client) - -val result = oauth2.authorize( - client_id = "", - redirect_uri = "https://example.com/oauth/callback", - response_type = "code", - scope = "openid profile email read:tasks", - state = "", -) -``` -```client-android-java -import io.appwrite.Client; -import io.appwrite.coroutines.CoroutineCallback; -import io.appwrite.services.Oauth2; - -Client client = new Client(context) - .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint - .setProject(""); // Your project ID - -Oauth2 oauth2 = new Oauth2(client); - -oauth2.authorize( - "", // client_id - "https://example.com/oauth/callback", // redirect_uri - "code", // response_type - "openid profile email read:tasks", // scope (optional) - "", // state (optional) - null, // nonce (optional) - null, // code_challenge (optional) - null, // code_challenge_method (optional) - null, // prompt (optional) - null, // max_age (optional) - null, // authorization_details (optional) - null, // resource (optional) - new CoroutineCallback<>((result, error) -> { - if (error != null) { - error.printStackTrace(); - return; - } - - Log.d("Appwrite", result.toString()); - }) -); -``` -```client-react-native -import { Client, Oauth2 } from "react-native-appwrite"; - -const client = new Client() - .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint - .setProject(''); // Your project ID - -const oauth2 = new Oauth2(client); - -const result = await oauth2.authorize({ - clientId: '', - redirectUri: 'https://example.com/oauth/callback', - responseType: 'code', - scope: 'openid profile email read:tasks', - state: '', -}); -``` -{% /multicode %} - -The user is shown exactly these scopes on your consent screen, where they [approve or withhold each one](/docs/partners/oauth-server/authorization#consent). Whatever they grant is what the issued access token carries in its `scope` claim, and the token response reports the granted set in its `scope` field, so a client can tell when it received less than it asked for. Request only what the integration needs; smaller requests are easier to approve. +Your consent screen shows the requested scopes and can approve a subset. The access token and token response contain the scopes that were granted, so the client can detect when it received less access than it requested. Clients should request only the permissions the integration needs. # Rich authorization requests {% #rich-authorization-requests %} -A scope is a flat string, which works well for broad capabilities like `read:tasks` but cannot express structured constraints like "read tasks, in these two projects only". For that, the OAuth server supports rich authorization requests (RAR, [RFC 9396](https://datatracker.ietf.org/doc/html/rfc9396)): the client sends an `authorization_details` parameter, a JSON array of objects that each describe one grant of access in your product's own vocabulary. +A scope is a flat permission such as `tasks.read`. It tells your API what the client may do, but it cannot identify which projects the permission applies to. Rich authorization requests (RAR, [RFC 9396](https://datatracker.ietf.org/doc/html/rfc9396)) add those structured details. -Scopes and authorization details are not exclusive. Use scopes for broad capabilities, and add authorization details when an integration needs caveats a flat string cannot carry. +Keep scopes as the primary permission contract for third-party clients. Use authorization details to bind those permissions to resources selected during consent. With this model, a client can request `tasks.read` without knowing a project ID, and your consent screen can ask the user which projects to grant. ## Define accepted types {% #define-authorization-details-types %} -Think of an `authorization_details` entry as a small form the client fills in to ask for access. The `type` is the name printed at the top of the form. When your API sees `"type": "tasks"`, it knows it is reading the "access to tasks" form, so it knows what the other fields on it mean: which actions, which projects. - -For the task example, the two mechanisms cover the same resource at different granularities: - -- The `read:tasks` **scope** grants blanket read access to every task. -- A `tasks` **entry** describes task access with constraints attached, such as which actions and which projects. - -An integration that needs everything requests the scope. One that should only touch part of the data requests a `tasks` entry instead. +The OAuth2 server accepts only the authorization detail types configured in `authorizationDetailsTypes`. For project-level restrictions, include `project`. A `project` entry contains a non-empty `identifiers` array with project IDs, or `*` to represent every project. -The OAuth server only accepts types you have allowed on the project. Define them with the `authorizationDetailsTypes` parameter: +Configure the accepted types when you update the OAuth2 server: {% multicode %} ```server-nodejs @@ -208,8 +69,8 @@ const project = new Project(client); const result = await project.updateOAuth2Server({ enabled: true, authorizationUrl: 'https://your-product.com/oauth/consent', - scopes: ['read:tasks', 'write:tasks'], - authorizationDetailsTypes: ['tasks'], + scopes: ['tasks.read', 'tasks.write'], + authorizationDetailsTypes: ['project'], }); ``` ```server-php @@ -228,8 +89,8 @@ $project = new Project($client); $result = $project->updateOAuth2Server( enabled: true, authorizationUrl: 'https://your-product.com/oauth/consent', - scopes: ['read:tasks', 'write:tasks'], - authorizationDetailsTypes: ['tasks'] + scopes: ['tasks.read', 'tasks.write'], + authorizationDetailsTypes: ['project'] ); ``` ```server-python @@ -246,8 +107,8 @@ project = Project(client) result = project.update_o_auth2_server( enabled = True, authorization_url = 'https://your-product.com/oauth/consent', - scopes = ['read:tasks', 'write:tasks'], - authorization_details_types = ['tasks'] + scopes = ['tasks.read', 'tasks.write'], + authorization_details_types = ['project'] ) ``` ```server-ruby @@ -265,8 +126,8 @@ project = Project.new(client) result = project.update_o_auth2_server( enabled: true, authorization_url: 'https://your-product.com/oauth/consent', - scopes: ['read:tasks', 'write:tasks'], - authorization_details_types: ['tasks'] + scopes: ['tasks.read', 'tasks.write'], + authorization_details_types: ['project'] ) ``` ```server-dart @@ -282,8 +143,8 @@ Project project = Project(client); Project result = await project.updateOAuth2Server( enabled: true, authorizationUrl: 'https://your-product.com/oauth/consent', - scopes: ['read:tasks', 'write:tasks'], - authorizationDetailsTypes: ['tasks'], + scopes: ['tasks.read', 'tasks.write'], + authorizationDetailsTypes: ['project'], ); ``` ```server-dotnet @@ -301,8 +162,8 @@ Project project = new Project(client); Project result = await project.UpdateOAuth2Server( enabled: true, authorizationUrl: "https://your-product.com/oauth/consent", - scopes: new List { "read:tasks", "write:tasks" }, - authorizationDetailsTypes: new List { "tasks" } + scopes: new List { "tasks.read", "tasks.write" }, + authorizationDetailsTypes: new List { "project" } ); ``` ```server-kotlin @@ -319,8 +180,8 @@ val project = Project(client) val response = project.updateOAuth2Server( enabled = true, authorizationUrl = "https://your-product.com/oauth/consent", - scopes = listOf("read:tasks", "write:tasks"), - authorizationDetailsTypes = listOf("tasks") + scopes = listOf("tasks.read", "tasks.write"), + authorizationDetailsTypes = listOf("project") ) ``` ```server-java @@ -338,8 +199,8 @@ Project project = new Project(client); project.updateOAuth2Server( true, // enabled "https://your-product.com/oauth/consent", // authorizationUrl - List.of("read:tasks", "write:tasks"), // scopes (optional) - List.of("tasks"), // authorizationDetailsTypes (optional) + List.of("tasks.read", "tasks.write"), // scopes (optional) + List.of("project"), // authorizationDetailsTypes (optional) null, // accessTokenDuration (optional) null, // refreshTokenDuration (optional) null, // publicAccessTokenDuration (optional) @@ -372,8 +233,8 @@ let project = Project(client) let result = try await project.updateOAuth2Server( enabled: true, authorizationUrl: "https://your-product.com/oauth/consent", - scopes: ["read:tasks", "write:tasks"], - authorizationDetailsTypes: ["tasks"] + scopes: ["tasks.read", "tasks.write"], + authorizationDetailsTypes: ["project"] ) ``` ```server-go @@ -397,8 +258,8 @@ func main() { response, err := service.UpdateOAuth2Server( true, "https://your-product.com/oauth/consent", - project.WithUpdateOAuth2ServerScopes([]string{"read:tasks", "write:tasks"}), - project.WithUpdateOAuth2ServerAuthorizationDetailsTypes([]string{"tasks"}), + project.WithUpdateOAuth2ServerScopes([]string{"tasks.read", "tasks.write"}), + project.WithUpdateOAuth2ServerAuthorizationDetailsTypes([]string{"project"}), ) if err != nil { panic(err) @@ -424,8 +285,8 @@ async fn main() -> Result<(), Box> { .update_o_auth2_server( true, "https://your-product.com/oauth/consent", - Some(vec!["read:tasks".into(), "write:tasks".into()]), - Some(vec!["tasks".into()]), // authorization details types + Some(vec!["tasks.read".into(), "tasks.write".into()]), + Some(vec!["project".into()]), // authorization details types None, None, None, @@ -449,55 +310,50 @@ async fn main() -> Result<(), Box> { `updateOAuth2Server` sets the full OAuth2 server configuration in one call. Include your existing scopes and settings when adding types, or they reset to their defaults. {% /info %} -Like scopes, a project can define up to 100 types, each up to 128 characters. The accepted types are published in the [discovery document](/docs/partners/oauth-server/quick-start#discovery) under `authorization_details_types_supported`, so integrators can see them without asking you. +Like scopes, a project can define up to 100 types, each up to 128 characters. The accepted types are published in the [discovery document](/docs/partners/oauth-server/quick-start#discovery) under `authorization_details_types_supported`. ## Request authorization details {% #request-authorization-details %} -A client sends its entries, JSON-encoded, as the `authorization_details` parameter on the same [authorize request](/docs/partners/oauth-server/authorization#authorize) that carries `scope`: +Most clients should request scopes without sending `authorization_details`. Your consent screen can read the requested scopes, ask the user to select resources, and add the details when it approves the grant. This keeps project IDs and resource-selection logic out of the third-party integration. -```client-web -import { Client, Oauth2 } from 'appwrite'; +For example, after a client requests `tasks.read`, the user might choose one project. The consent screen approves the grant with the selected project in `authorization_details`: -const client = new Client() - .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint - .setProject(''); // Your project ID - -const oauth2 = new Oauth2(client); - -const details = [ +```bash +curl --request POST \ + 'https://.cloud.appwrite.io/v1/oauth2//approve' \ + --header 'Accept: application/json' \ + --header 'X-Appwrite-Session: ' \ + --form 'grant_id=' \ + --form 'authorization_details=[ { - type: 'tasks', - actions: ['read'], - projects: ['launch'], - }, -]; - -const result = await oauth2.authorize({ - clientId: '', - redirectUri: 'https://example.com/oauth/callback', - responseType: 'code', - scope: 'openid', - authorizationDetails: JSON.stringify(details), -}); + "type": "project", + "identifiers": [""] + } + ]' ``` -The server validates every entry before creating the grant: +In a browser-based consent screen, the project session cookie is sent automatically, so the `X-Appwrite-Session` header is not needed. The JSON response contains the client's redirect URL. Send the browser to that URL to continue the authorization flow. -- `type` is required and must be one of the types you defined. An unknown type fails the request with `invalid_authorization_details`. -- `actions`, when present, must be an array of non-empty strings. -- Every other field, like `projects` above, is yours to design. The server carries them through untouched. +A client that already knows the relevant resource IDs may send the same structure on its [authorize request](/docs/partners/oauth-server/authorization#authorize). Treat that as an optional preselection. The authorization flow should also work when the client omits it, and the consent screen should let the user review or narrow the final resource selection. + +For the `project` type, Appwrite accepts only `type` and a non-empty `identifiers` array. Each identifier must be a project ID, or `*` for every project. Other values fail validation before the grant is approved. ## Consent and enforcement {% #authorization-details-consent %} -Authorization details ride through the flow the same way scopes do: +Scopes and authorization details answer different questions throughout the flow: + +1. The client requests capabilities such as `tasks.read`. +2. Your consent screen reads the grant and asks the user which projects those capabilities should cover. +3. The consent screen approves the grant with the selected `authorization_details`. +4. Appwrite returns the granted details in the token response, includes them in the access token, and returns them from token introspection. -1. The requested details are stored on the grant, where your consent screen reads them to show the user exactly what is being asked. -2. When approving, the consent screen can pass a narrowed `authorization_details` back, the same way [consent](/docs/partners/oauth-server/authorization#consent) can grant a subset of the requested scopes. The user might approve `"actions": ["read"]` after the client asked for read and write. -3. The granted details are returned in the token response and stamped onto the access token as the `authorization_details` claim. +Your resource server must enforce both parts. After [introspecting the access token](/docs/partners/oauth-server/tokens#introspect), check that `active` is `true`, require the scope needed by the API operation, and then require an authorization detail that covers the requested resource. For an endpoint that reads tasks from one project, require `tasks.read` and a `project` entry whose `identifiers` contains that project ID or `*`. -Enforcement works exactly like scopes. Your API reads the `authorization_details` claim from the verified access token and applies the constraints it describes. The OAuth server only carries the details; your product gives them meaning. +Apply these checks conservatively: -That includes deciding how the two mechanisms combine when a token carries both: +- Treat a missing scope, missing authorization detail, unknown type, or unmatched identifier as denied. +- Interpret `*` explicitly as every project. Decide whether that includes projects created later and state that behavior on the consent screen. +- If `admin` grants every operation, document whether it also bypasses resource restrictions. Keep that rule consistent across every API endpoint. +- Compare stable resource IDs, not display names, and remove duplicate identifiers before evaluating them. -- If the token holds a `tasks` entry, apply its constraints: only the listed actions, only the listed projects. -- If it holds only the blanket scope, allow the whole resource. +Appwrite validates and carries the authorization details. Your consent screen decides what the user grants, and your resource server decides whether the granted scopes and details cover each API request. diff --git a/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-1/+page.markdoc b/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-1/+page.markdoc index 56f071e9f6..527c77a5f1 100644 --- a/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-1/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-1/+page.markdoc @@ -1,22 +1,22 @@ --- layout: tutorial title: Sign in with your product -description: Build an end-to-end "Sign in with your product" experience against your Appwrite OAuth server, from the consent screen to the token exchange. +description: Build an end-to-end "Sign in with your product" experience against your Appwrite OAuth2 server, from the consent screen to the token exchange. step: 1 difficulty: intermediate readtime: 25 framework: TanStack Start -category: OAuth server +category: OAuth2 server back: /docs/partners/oauth-server --- -Once your project's [OAuth server](/docs/partners/oauth-server) is enabled, other apps can offer "Sign in with your product". This tutorial builds that experience end to end with two small [TanStack Start](https://tanstack.com/start) apps, so you can see every moving part. +Once your project's [OAuth2 server](/docs/partners/oauth-server) is enabled, other apps can offer "Sign in with your product". This tutorial builds that experience end to end with two small [TanStack Start](https://tanstack.com/start) apps, so you can see every moving part. # What you will build {% #what-you-will-build %} Two apps play the two sides of an OAuth integration: -- **TaskFlow**, the provider. It owns the Appwrite project with the OAuth server enabled, and it hosts the **consent screen** where its users approve access. +- **TaskFlow**, the provider. It owns the Appwrite project with the OAuth2 server enabled, and it hosts the **consent screen** where its users approve access. - **Vantage**, the consumer. A separate product that adds a **Sign in with TaskFlow** button, exchanges the authorization code for tokens on its server, and reads the user's profile. TaskFlow is your product. Vantage stands in for any third party integrating with it. @@ -26,7 +26,7 @@ TaskFlow is your product. Vantage stands in for any third party integrating with When a Vantage user clicks **Sign in with TaskFlow**, this happens: 1. Vantage redirects the user to TaskFlow's **authorize** endpoint. -2. The OAuth server sends the user to TaskFlow's **consent screen** to sign in and approve. +2. The OAuth2 server sends the user to TaskFlow's **consent screen** to sign in and approve. 3. On approval, the server redirects back to Vantage with an **authorization code**. 4. Vantage's server **exchanges the code for tokens** using its client secret. 5. Vantage reads the user's profile from **userinfo** and signs them in. @@ -47,4 +47,4 @@ Vantage is a **confidential client**: it has a client secret. That secret authen The complete apps from this tutorial are on GitHub at [appwrite-community/oauth-guide-taskflow](https://github.com/appwrite-community/oauth-guide-taskflow). Clone it to follow along or to compare against your own. {% /info %} -Continue to enable the OAuth server on your project. +Continue to enable the OAuth2 server on your project. diff --git a/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-2/+page.markdoc b/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-2/+page.markdoc index 97c5a91157..06ac4fa880 100644 --- a/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-2/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-2/+page.markdoc @@ -1,7 +1,7 @@ --- layout: tutorial -title: Enable the OAuth server -description: Turn on the OAuth server on your Appwrite project and register the client app. +title: Enable the OAuth2 server +description: Turn on the OAuth2 server on your Appwrite project and register the client app. step: 2 --- @@ -18,7 +18,7 @@ Before writing any code, turn TaskFlow's project into an OAuth provider and regi In the Console, open **Auth**, select the **OAuth2 server** tab, and turn on **Enable OAuth2 server**. -Set the **Authorization URL** to where TaskFlow will host its consent screen. In this tutorial that is `http://localhost:4000/oauth/consent`. This is where the OAuth server sends users to sign in and approve. +Set the **Authorization URL** to where TaskFlow will host its consent screen. In this tutorial that is `http://localhost:4000/oauth/consent`. This is where the OAuth2 server sends users to sign in and approve. Leave the scopes at their defaults. `openid`, `profile`, and `email` are always included, which is all Vantage needs. See [Scopes](/docs/partners/oauth-server/scopes) to add your own later. @@ -35,7 +35,7 @@ Open the **Apps** sub-tab and create a client for Vantage: - **Name**: `Vantage`. This appears on the consent screen. - **Client type**: `Confidential`. Vantage has a server that can hold a secret. -- **Redirect URIs**: `http://localhost:4100/oauth/callback`. The OAuth server only returns codes to registered URIs. +- **Redirect URIs**: `http://localhost:4100/oauth/callback`. The OAuth2 server only returns codes to registered URIs. When you create the client, copy the **client secret**. It is shown once. You will also need the **client ID** from the clients list. @@ -47,7 +47,7 @@ When you create the client, copy the **client secret**. It is shown once. You wi {% /only_light %} {% info title="Keep these three values" %} -You now have everything the apps need to talk to the OAuth server: the **client ID**, the **client secret**, and your **project ID**. Keep them handy for the next step. +You now have everything the apps need to talk to the OAuth2 server: the **client ID**, the **client secret**, and your **project ID**. Keep them handy for the next step. {% /info %} For the full set of client options and the SDK equivalents, see [Clients](/docs/partners/oauth-server/clients). diff --git a/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-4/+page.markdoc b/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-4/+page.markdoc index cbed8da94f..f8cb982b4f 100644 --- a/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-4/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-4/+page.markdoc @@ -47,7 +47,7 @@ export function vantageSession() { # The start route {% #start-route %} -Clicking the button navigates to `/oauth/start`. Its loader mints a random `state` value, stores it in the session to protect against CSRF, and redirects to the OAuth server. Create `consumer/src/routes/oauth.start.tsx`: +Clicking the button navigates to `/oauth/start`. Its loader mints a random `state` value, stores it in the session to protect against CSRF, and redirects to the OAuth2 server. Create `consumer/src/routes/oauth.start.tsx`: ```tsx // consumer/src/routes/oauth.start.tsx @@ -83,4 +83,4 @@ On the landing page, the button is a link to `/oauth/start`: ``` -Start the app with `pnpm dev` and open `http://localhost:4100`. You have a landing page with a working sign-in button. Clicking it redirects to the OAuth server, which sends the user to TaskFlow's consent screen. That screen does not exist yet, so build it next. +Start the app with `pnpm dev` and open `http://localhost:4100`. You have a landing page with a working sign-in button. Clicking it redirects to the OAuth2 server, which sends the user to TaskFlow's consent screen. That screen does not exist yet, so build it next. diff --git a/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-5/+page.markdoc b/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-5/+page.markdoc index 0cdffe9d85..fa6c2766cc 100644 --- a/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-5/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-5/+page.markdoc @@ -5,7 +5,7 @@ description: Host the consent screen where your users sign in and approve access step: 5 --- -The consent screen is the page TaskFlow hosts at its authorization URL. When the OAuth server sends a user here, the screen signs them in, shows what the client is asking for, and records their decision. All of it runs on TaskFlow's server, carrying the user's Appwrite session. +The consent screen is the page TaskFlow hosts at its authorization URL. When the OAuth2 server sends a user here, the screen signs them in, shows what the client is asking for, and records their decision. All of it runs on TaskFlow's server, carrying the user's Appwrite session. # Types for the consent card {% #types %} @@ -33,7 +33,7 @@ export const SCOPE_LABELS: Record = { # The server helpers {% #helpers %} -Create `provider/src/lib/oauth-server.ts`. Every function here calls the OAuth server on behalf of the signed-in user. Appwrite returns the user's session token in a cookie on login, and that token is passed as the `X-Appwrite-Session` header on later calls. +Create `provider/src/lib/oauth-server.ts`. Every function here calls the OAuth2 server on behalf of the signed-in user. Appwrite returns the user's session token in a cookie on login, and that token is passed as the `X-Appwrite-Session` header on later calls. ```ts // provider/src/lib/oauth-server.ts @@ -98,7 +98,7 @@ export async function getClientApp(appId: string): Promise { return res.json() } -/** Approve or reject a grant. The OAuth server returns the URL to send the +/** Approve or reject a grant. The OAuth2 server returns the URL to send the * user back to, carrying the authorization code (approve) or an error (reject). */ async function decide( action: 'approve' | 'reject', @@ -212,8 +212,8 @@ The component renders one of two cards from the loader data. The login form subm ![TaskFlow consent screen sign-in form](/images/docs/oauth-server/guide/taskflow-login.avif) -When the OAuth server sends a user to the consent screen, they first sign in with their TaskFlow account. +When the OAuth2 server sends a user to the consent screen, they first sign in with their TaskFlow account. ![TaskFlow consent screen showing the requested permissions](/images/docs/oauth-server/guide/taskflow-consent.avif) -The consent card then shows the client's name and exactly what it is asking for. On **Authorize**, the OAuth server redirects back to Vantage with an authorization code. Vantage handles it next. +The consent card then shows the client's name and exactly what it is asking for. On **Authorize**, the OAuth2 server redirects back to Vantage with an authorization code. Vantage handles it next. diff --git a/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-6/+page.markdoc b/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-6/+page.markdoc index 874fbedfdf..38d65716cb 100644 --- a/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-6/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-6/+page.markdoc @@ -5,7 +5,7 @@ description: Handle the callback, exchange the authorization code for tokens on step: 6 --- -The OAuth server redirects back to Vantage's redirect URI with a `code` and the `state`. Vantage exchanges that code for tokens on its server, reads the user's profile, and signs them in. +The OAuth2 server redirects back to Vantage's redirect URI with a `code` and the `state`. Vantage exchanges that code for tokens on its server, reads the user's profile, and signs them in. # Add the token functions {% #token-functions %} diff --git a/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-7/+page.markdoc b/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-7/+page.markdoc index 4ffa7df73e..be0e5d5ec7 100644 --- a/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-7/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/sign-in-with-your-product/step-7/+page.markdoc @@ -31,11 +31,11 @@ Open `http://localhost:4100` and click **Sign in with TaskFlow**. You will: 2. See exactly what Vantage is requesting, and approve it. 3. Return to Vantage, signed in, with your TaskFlow name and email on the dashboard. -That round trip is a complete OAuth 2.1 authorization code flow against your project's OAuth server. +That round trip is a complete OAuth 2.1 authorization code flow against your project's OAuth2 server. # What each side did {% #recap %} -- **TaskFlow** enabled the OAuth server, registered Vantage as a confidential client, and hosted a consent screen that authenticates its users and approves grants. +- **TaskFlow** enabled the OAuth2 server, registered Vantage as a confidential client, and hosted a consent screen that authenticates its users and approves grants. - **Vantage** redirected to the authorize endpoint, exchanged the returned code for tokens on its server, and read the user's profile from userinfo. The client secret never left its server. Because the flow is standards-based, a real integrator does not have to use Appwrite or TanStack Start. Any OAuth or OpenID Connect client library pointed at your project's [discovery URL](/docs/partners/oauth-server/quick-start#discovery) works the same way. diff --git a/src/routes/docs/partners/oauth-server/tokens/+page.markdoc b/src/routes/docs/partners/oauth-server/tokens/+page.markdoc index 91a8901fce..add1fab9d3 100644 --- a/src/routes/docs/partners/oauth-server/tokens/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/tokens/+page.markdoc @@ -1,17 +1,17 @@ --- layout: article title: Tokens -description: Access, refresh, and ID tokens issued by Appwrite's OAuth server, their lifetimes, and how to refresh, introspect, and revoke them. +description: Access, refresh, and ID tokens issued by Appwrite's OAuth2 server, their lifetimes, and how to validate, refresh, introspect, revoke, and end sessions. back: /docs/partners/oauth-server --- -When a client redeems an authorization code, the OAuth server issues three tokens: an access token, a refresh token, and an ID token. This page covers what each one is, how long it lives, and how to refresh, validate, and revoke them. +When a client redeems an authorization code, the OAuth2 server issues an access token and refresh token. It also issues an ID token when the `openid` scope was granted. This page covers what each token does and how clients and resource servers validate, refresh, introspect, revoke, and end sessions. # The three tokens {% #tokens %} -- **Access token.** A JWT the client sends to call APIs on the user's behalf. It is signed with your project's key (`RS256`) and carries the granted scopes. Present it as a `Bearer` token to the userinfo endpoint or your own resource server. -- **Refresh token.** An opaque token the client exchanges for a new access token when the old one expires, without sending the user through authorization again. -- **ID token.** A JWT from the OpenID Connect layer that identifies the user (subject, and any profile claims the granted scopes allow). Clients validate it against the server's published keys. +- **Access token.** A signed JWT that a client presents to a resource server when it calls an API on the user's behalf. It contains the authorization information the resource server needs to evaluate the request. The claims are explained in [Validate tokens](#validate). +- **Refresh token.** A value the client exchanges for a new access token when the current one expires, without sending the user through authorization again. Treat it as an opaque secret even though Appwrite currently encodes it as a JWT. +- **ID token.** A signed JWT from OpenID Connect that tells the client who authenticated. It is returned when the `openid` scope is granted and can include profile, email, or phone claims when those scopes were approved. A public client can use these verified claims to show the user's name or decide that its sign-in UI needs attention before calling an API. Resource servers authorize requests with the access token, not the ID token. # Exchange a code for tokens {% #exchange %} @@ -164,7 +164,19 @@ console.log(result); ``` {% /multicode %} -The response contains the access token, refresh token, ID token, granted scope, and the access token's lifetime in seconds. +The response includes the access token, refresh token, granted scopes, token type, and access-token lifetime. It includes an ID token when the `openid` scope was granted. `authorization_details` contains the approved rich authorization data when the request used it. + +```json +{ + "access_token": "eyJ...", + "token_type": "Bearer", + "expires_in": 3600, + "refresh_token": "eyJ...", + "scope": "openid profile email", + "authorization_details": null, + "id_token": "eyJ..." +} +``` # Token lifetimes {% #lifetimes %} @@ -179,170 +191,198 @@ Public clients get shorter lifetimes because their tokens live on user devices, # Refresh with rotation {% #refresh %} -To refresh, the client calls the token endpoint with `grantType: 'refresh_token'` and its current refresh token. The response includes a **new** access token and a **new** refresh token. +To refresh, the client sends its current refresh token to the token endpoint. A successful response contains a new access token and a new refresh token. -Refresh tokens rotate: each refresh invalidates the token that was used. If an old refresh token is presented again, the server treats it as a compromise and revokes the entire token family, forcing the user to reauthorize. This means a client must always store the newest refresh token it received. +Each successful refresh replaces the stored refresh token. The client must store the newest refresh token before making another request. If the client presents an older refresh token again, Appwrite treats it as reuse and deletes the OAuth identity for that client and user. The current access token and newest refresh token then stop working, and the user must authorize that client again. Tokens issued to other clients are not affected. -To refresh, reuse the `createToken` call with the refresh grant: +This public-client example sends JSON. A confidential client also includes its `client_secret`. ```http POST /v1/oauth2//token HTTP/1.1 Host: .cloud.appwrite.io -Authorization: Basic -Content-Type: application/x-www-form-urlencoded +Content-Type: application/json -grant_type=refresh_token&refresh_token= +{ + "grant_type": "refresh_token", + "refresh_token": "", + "client_id": "" +} ``` +The response has the same shape as the original token response, with new values for `access_token`, `refresh_token`, and `expires_in`. + # Validate tokens {% #validate %} -Access and ID tokens are `RS256` JWTs signed with your project's key. A client validates them offline by fetching the server's public keys once from the JWKS endpoint and checking the signature, issuer, and expiry. +Access and ID tokens are `RS256` JWTs signed with your project's key. A JWT contains a header, payload, and signature. The payload is readable, but its claims are trustworthy only after the client or resource server verifies the signature, issuer, audience, and expiry. + +The server publishes its public keys as a JWKS document: ```http GET /v1/oauth2//.well-known/jwks.json HTTP/1.1 Host: .cloud.appwrite.io ``` -To read the user's profile from an access token, call the userinfo endpoint: +A web client can use the `jose` package to read the discovery document, select the correct public key from the JWKS response, and verify both tokens: -```http -GET /v1/oauth2//userinfo HTTP/1.1 -Host: .cloud.appwrite.io -Authorization: Bearer -``` +```client-web +import { createRemoteJWKSet, jwtVerify } from 'jose'; -# Introspect a token {% #introspect %} +const accessToken = ''; +const idToken = ''; +const clientId = ''; -A resource server can ask the OAuth server whether a token is still valid with the introspection endpoint. Introspection requires client authentication, so only confidential clients (or an API key with the `oauth2.read` scope) can call it. A public client, having no secret, cannot introspect. +const discoveryUrl = + 'https://.cloud.appwrite.io/v1/oauth2//.well-known/openid-configuration'; +const metadata = await fetch(discoveryUrl).then((response) => response.json()); +const jwks = createRemoteJWKSet(new URL(metadata.jwks_uri)); +const projectAudience = metadata.issuer.replace('/oauth2/', '/'); -```http -POST /v1/oauth2//introspect HTTP/1.1 -Host: .cloud.appwrite.io -Authorization: Basic -Content-Type: application/x-www-form-urlencoded +const { payload: accessClaims } = await jwtVerify(accessToken, jwks, { + issuer: metadata.issuer, + audience: projectAudience +}); -token= +const { payload: idClaims } = await jwtVerify(idToken, jwks, { + issuer: metadata.issuer, + audience: clientId +}); ``` -A valid token returns `"active": true` with its scope, subject, and expiry. A revoked or expired token returns `"active": false`. - -# Revoke a token {% #revoke %} - -A client revokes a token it no longer needs with the revocation endpoint. Confidential clients authenticate with their secret; public clients revoke without one. - -{% multicode %} -```client-web -import { Client, Oauth2 } from 'appwrite'; +A verified access-token payload contains the authorization context for API calls: + +```json +{ + "iss": "", + "sub": "", + "aud": [""], + "client_id": "", + "scope": "openid profile email calendar.read", + "auth_time": 1784052423, + "iat": 1784052858, + "exp": 1784056458, + "jti": "", + "tokenId": "" +} +``` -const client = new Client() - .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint - .setProject(''); // Your project ID +A verified ID-token payload identifies the signed-in user. Profile claims appear only when their matching scopes were granted: + +```json +{ + "iss": "", + "sub": "", + "aud": "", + "name": "Ada Lovelace", + "email": "ada@example.com", + "email_verified": true, + "auth_time": 1784052423, + "iat": 1784052858, + "exp": 1784056458, + "at_hash": "" +} +``` -const oauth2 = new Oauth2(client); +A client may decode a token without verification to make a temporary UI choice, such as showing a sign-in screen before an API request. Only verified claims should control access or display trusted identity information. -const result = await oauth2.revoke({ - token: '', - tokenTypeHint: 'access_token', // optional - clientId: '', // optional - clientSecret: '' // optional -}); +To retrieve the current user's profile with an access token, call the userinfo endpoint: -console.log(result); +```http +GET /v1/oauth2//userinfo HTTP/1.1 +Host: .cloud.appwrite.io +Authorization: Bearer ``` -```client-flutter -import 'package:appwrite/appwrite.dart'; -Client client = Client() - .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint - .setProject(''); // Your project ID +# Introspect a token {% #introspect %} -Oauth2 oauth2 = Oauth2(client); +An OAuth access token is not an Appwrite session or API key, so it does not authorize general Appwrite SDK methods. Appwrite's OAuth endpoints consume tokens only where the OAuth flow defines them. For example, userinfo accepts an access token as a bearer credential, while the token, introspection, and revocation endpoints accept their respective tokens as request parameters. - result = await oauth2.revoke( - token: '', - tokenTypeHint: 'access_token', // optional - clientId: '', // optional - clientSecret: '', // optional -); -``` -```client-apple -import Appwrite +To make an access token useful to your product: -let client = Client() - .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint - .setProject("") // Your project ID +1. Add custom scopes in **Auth > OAuth2 server > Settings** that describe the operations your API exposes. +2. Host an API that acts as the resource server. Appwrite Functions and server-rendered Appwrite Sites are suitable places to run it. +3. Read the bearer access token from each incoming request. +4. From your server, call the introspection endpoint with an Appwrite API key that has the `oauth2.read` scope. Keep this API key on the server. +5. Require `active: true`, then check that `scope` contains every permission the API operation needs. +6. Perform the operation only after those checks pass. -let oauth2 = Oauth2(client) +Introspection verifies the token against the current OAuth identity, so it detects expiry, revocation, refresh rotation, and refresh-token reuse. This is different from offline JWT verification, which cannot detect a token that was revoked before its `exp` time. -let result = try await oauth2.revoke( - token: "", - token_type_hint: "access_token", // optional - client_id: "", // optional - client_secret: "" // optional -) +The resource server sends JSON: +```http +POST /v1/oauth2//introspect HTTP/1.1 +Host: .cloud.appwrite.io +X-Appwrite-Project: +X-Appwrite-Key: +Content-Type: application/json + +{ + "token": "", + "token_type_hint": "access_token" +} ``` -```client-android-kotlin -import io.appwrite.Client -import io.appwrite.coroutines.CoroutineCallback -import io.appwrite.services.Oauth2 -val client = Client(context) - .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint - .setProject("") // Your project ID +An active access token returns its client, user, audience, expiry, and granted scopes: + +```json +{ + "active": true, + "scope": "calendar.read calendar.write", + "client_id": "", + "token_type": "Bearer", + "sub": "", + "aud": [""], + "iss": "", + "exp": 1784056458, + "iat": 1784052858, + "jti": "", + "token_use": "access_token" +} +``` -val oauth2 = Oauth2(client) +An expired, revoked, malformed, or otherwise inactive token returns: -val result = oauth2.revoke( - token = "", - token_type_hint = "access_token", // (optional) - client_id = "", // (optional) - client_secret = "", // (optional) -) +```json +{ + "active": false +} ``` -```client-android-java -import io.appwrite.Client; -import io.appwrite.coroutines.CoroutineCallback; -import io.appwrite.services.Oauth2; -Client client = new Client(context) - .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint - .setProject(""); // Your project ID +A confidential OAuth client can also authenticate with its client ID and client secret to introspect one of its own tokens. Public clients must not receive a project API key or client secret. -Oauth2 oauth2 = new Oauth2(client); +# Revoke a token {% #revoke %} -oauth2.revoke( - "", // token - "access_token", // token_type_hint (optional) - "", // client_id (optional) - "", // client_secret (optional) - new CoroutineCallback<>((result, error) -> { - if (error != null) { - error.printStackTrace(); - return; - } +A third-party client should revoke its token when the user disconnects the integration or the client no longer needs access. Revoking either the current access token or refresh token deletes the OAuth identity for that client and user, so both current tokens stop working. - Log.d("Appwrite", result.toString()); - }) -); +This public-client example sends JSON. A confidential client also includes its `client_secret`. +```http +POST /v1/oauth2//revoke HTTP/1.1 +Host: .cloud.appwrite.io +Content-Type: application/json + +{ + "token": "", + "token_type_hint": "access_token", + "client_id": "" +} ``` -```client-react-native -import { Client, Oauth2 } from "react-native-appwrite"; -const client = new Client() - .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint - .setProject(''); // Your project ID +A successful revocation returns `200 OK` with an empty body. The endpoint returns the same response for an unknown token so callers cannot use it to discover valid tokens. -const oauth2 = new Oauth2(client); +# Sign out from the authorization server {% #logout %} -const result = await oauth2.revoke({ - token: '', - tokenTypeHint: 'access_token', // optional - clientId: '', // optional - clientSecret: '' // optional -}); +Revocation disconnects one client without ending the user's browser session on your project. OpenID Connect logout ends that Appwrite session and revokes the tokens issued to the app identified by the ID token. This is useful for official apps that share your authorization server and need signing out of one app to require a fresh project sign-in elsewhere. -console.log(result); +Other clients' existing OAuth tokens remain valid. Revoke those clients separately if your security policy requires it. + +Before using logout, add the destination to the app's **Post-logout redirect URIs** in **Auth > OAuth2 server > Apps**. The URI in the logout request must match a registered value exactly. + +Send the browser to the logout endpoint with the ID token previously issued to the app: + +```http +GET /v1/oauth2//logout?id_token_hint=&post_logout_redirect_uri=https%3A%2F%2Fclient.example.com%2Fsigned-out&state= HTTP/1.1 +Host: .cloud.appwrite.io ``` -{% /multicode %} + +Appwrite verifies the ID token's signature, issuer, client, and user. It accepts an expired ID token as a logout hint, but still requires the token to be validly signed. After deleting the current project session and the app's OAuth identity, Appwrite redirects to the registered URI and returns `state` unchanged. If no post-logout redirect URI is supplied, the endpoint returns `204 No Content`. diff --git a/static/images/docs/oauth-server/dark/oauth2-server-create-app.avif b/static/images/docs/oauth-server/dark/oauth2-server-create-app.avif index a38ed59cfced29c781c521ab2c33dd606be79c58..94bd4a953e265f718c1a2fe4e60a227e90c2e96a 100644 GIT binary patch delta 23830 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 @aYe;{BMRDl4kV6wb6w^}h^skg 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 diff --git a/static/images/docs/oauth-server/oauth2-server-create-app.avif b/static/images/docs/oauth-server/oauth2-server-create-app.avif index 76a620c6698d7f75127ed421989532184037faa0..c437b93ebbf40f5f9538918220fe68d87f7124c6 100644 GIT binary patch delta 22528 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

6_TYmmFBX;3bJWIA)SkWC8gk@Yb316SZ)8Sa5 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 bXr)BB?}P8#tgEVMs(+aZ9_Y({AzH8~8I)vi delta 21981 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 A-2eap From 289f7dec17b7095447e0ecf2a6b254a58749453c Mon Sep 17 00:00:00 2001 From: Atharva Deosthale Date: Wed, 15 Jul 2026 16:44:16 +0530 Subject: [PATCH 4/7] docs(oauth-server): replace raw HTTP blocks with tabbed cURL and Hurl examples --- src/lib/utils/code.ts | 2 + src/lib/utils/references.ts | 2 + .../oauth-server/authorization/+page.markdoc | 83 +++++++++----- .../oauth-server/clients/+page.markdoc | 49 ++++++--- .../oauth-server/device-flow/+page.markdoc | 35 ++++-- .../oauth-server/quick-start/+page.markdoc | 90 +++++++++------ .../oauth-server/tokens/+page.markdoc | 103 ++++++++++++------ 7 files changed, 248 insertions(+), 116 deletions(-) diff --git a/src/lib/utils/code.ts b/src/lib/utils/code.ts index 87503c1066..f58058218a 100644 --- a/src/lib/utils/code.ts +++ b/src/lib/utils/code.ts @@ -54,6 +54,8 @@ const languages = { java: java, cpp: cpp, bash: bash, + curl: bash, + hurl: http, powershell: powershell, cmd: dos, yaml: yaml, diff --git a/src/lib/utils/references.ts b/src/lib/utils/references.ts index ad3358eebf..bc2dda57f8 100644 --- a/src/lib/utils/references.ts +++ b/src/lib/utils/references.ts @@ -136,6 +136,8 @@ export const platformMap: Record = { csharp: 'C#', cpp: 'C++', bash: 'Bash', + curl: 'cURL', + hurl: 'Hurl', powershell: 'PowerShell', cmd: 'CMD', yaml: 'YAML', diff --git a/src/routes/docs/partners/oauth-server/authorization/+page.markdoc b/src/routes/docs/partners/oauth-server/authorization/+page.markdoc index ff12a3085b..0ac7119c28 100644 --- a/src/routes/docs/partners/oauth-server/authorization/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/authorization/+page.markdoc @@ -37,10 +37,29 @@ The request contains: - `state`, which the client uses to connect the callback to the request it started and protect against request forgery. - `code_challenge` and `code_challenge_method=S256`, which are required for public clients and for confidential clients when **Require PKCE** is enabled. -```http -GET /v1/oauth2//authorize?client_id=&redirect_uri=https%3A%2F%2Fclient.example.com%2Fcallback&response_type=code&scope=openid%20profile&state=&code_challenge=&code_challenge_method=S256 HTTP/1.1 -Host: .cloud.appwrite.io +{% multicode %} +```curl +curl -G 'https://.cloud.appwrite.io/v1/oauth2//authorize' \ + --data-urlencode 'client_id=' \ + --data-urlencode 'redirect_uri=https://client.example.com/callback' \ + --data-urlencode 'response_type=code' \ + --data-urlencode 'scope=openid profile' \ + --data-urlencode 'state=' \ + --data-urlencode 'code_challenge=' \ + --data-urlencode 'code_challenge_method=S256' +``` +```hurl +GET https://.cloud.appwrite.io/v1/oauth2//authorize +[Query] +client_id: +redirect_uri: https://client.example.com/callback +response_type: code +scope: openid profile +state: +code_challenge: +code_challenge_method: S256 ``` +{% /multicode %} After Appwrite validates the request, the browser goes to the authorization URL configured for your project. Your consent screen handles the user's session and decision. @@ -48,21 +67,34 @@ After Appwrite validates the request, the browser goes to the authorization URL Pushed authorization requests (PAR) keep the authorization parameters out of the browser URL. The client first sends the parameters to the PAR endpoint: -```http -POST /v1/oauth2//par HTTP/1.1 -Host: .cloud.appwrite.io +{% multicode %} +```curl +curl -X POST 'https://.cloud.appwrite.io/v1/oauth2//par' \ + -H 'Content-Type: application/json' \ + -d '{ + "client_id": "", + "redirect_uri": "https://client.example.com/callback", + "response_type": "code", + "scope": "openid profile", + "state": "", + "code_challenge": "", + "code_challenge_method": "S256" + }' +``` +```hurl +POST https://.cloud.appwrite.io/v1/oauth2//par Content-Type: application/json - { - "client_id": "", - "redirect_uri": "https://client.example.com/callback", - "response_type": "code", - "scope": "openid profile", - "state": "", - "code_challenge": "", - "code_challenge_method": "S256" + "client_id": "", + "redirect_uri": "https://client.example.com/callback", + "response_type": "code", + "scope": "openid profile", + "state": "", + "code_challenge": "", + "code_challenge_method": "S256" } ``` +{% /multicode %} Appwrite returns a `request_uri` and the number of seconds before it expires: @@ -73,12 +105,19 @@ Appwrite returns a `request_uri` and the number of seconds before it expires: } ``` -Before it expires, send the user to the authorization endpoint with only the URL-encoded `request_uri`. Do not repeat the original authorization parameters. +Before it expires, send the user to the authorization endpoint with only the `request_uri`. Do not repeat the original authorization parameters. -```http -GET /v1/oauth2//authorize?request_uri= HTTP/1.1 -Host: .cloud.appwrite.io +{% multicode %} +```curl +curl -G 'https://.cloud.appwrite.io/v1/oauth2//authorize' \ + --data-urlencode 'request_uri=' +``` +```hurl +GET https://.cloud.appwrite.io/v1/oauth2//authorize +[Query] +request_uri: ``` +{% /multicode %} # 2. Host the consent screen {% #consent %} @@ -175,7 +214,6 @@ let oauth2Authorize = try await oauth2.authorize( authorization_details: "", // optional resource: "" // optional ) - ``` ```client-android-kotlin import io.appwrite.Client @@ -236,7 +274,6 @@ oauth2.authorize( Log.d("Appwrite", result.toString()); }) ); - ``` ```client-react-native import { Client, Oauth2 } from "react-native-appwrite"; @@ -313,7 +350,6 @@ let oauth2 = Oauth2(client) let oauth2Grant = try await oauth2.getGrant( grant_id: "" ) - ``` ```client-android-kotlin import io.appwrite.Client @@ -352,7 +388,6 @@ oauth2.getGrant( Log.d("Appwrite", result.toString()); }) ); - ``` ```client-react-native import { Client, Oauth2 } from "react-native-appwrite"; @@ -422,7 +457,6 @@ let oauth2Approve = try await oauth2.approve( authorization_details: "", // optional scope: "" // optional ) - ``` ```client-android-kotlin import io.appwrite.Client @@ -465,7 +499,6 @@ oauth2.approve( Log.d("Appwrite", result.toString()); }) ); - ``` ```client-react-native import { Client, Oauth2 } from "react-native-appwrite"; @@ -531,7 +564,6 @@ let oauth2 = Oauth2(client) let oauth2Reject = try await oauth2.reject( grant_id: "" ) - ``` ```client-android-kotlin import io.appwrite.Client @@ -570,7 +602,6 @@ oauth2.reject( Log.d("Appwrite", result.toString()); }) ); - ``` ```client-react-native import { Client, Oauth2 } from "react-native-appwrite"; diff --git a/src/routes/docs/partners/oauth-server/clients/+page.markdoc b/src/routes/docs/partners/oauth-server/clients/+page.markdoc index 6a2294219f..a5839e34e1 100644 --- a/src/routes/docs/partners/oauth-server/clients/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/clients/+page.markdoc @@ -61,7 +61,7 @@ const apps = new Apps(client); const app = await apps.create({ appId: ID.unique(), name: 'Custom App', - redirectUris: ['http://customapp.localhost/auth/redirect'], + redirectUris: ['http://vantage.localhost/auth/redirect'], }); ``` ```client-flutter @@ -76,7 +76,7 @@ Apps apps = Apps(client); App app = await apps.create( appId: ID.unique(), name: 'Custom App', - redirectUris: ['http://customapp.localhost/auth/redirect'], + redirectUris: ['http://vantage.localhost/auth/redirect'], ); ``` ```client-apple @@ -91,7 +91,7 @@ let apps = Apps(client) let app = try await apps.create( appId: ID.unique(), name: "Custom App", - redirectUris: ["http://customapp.localhost/auth/redirect"] + redirectUris: ["http://vantage.localhost/auth/redirect"] ) ``` ```client-android-kotlin @@ -108,7 +108,7 @@ val apps = Apps(client) val app = apps.create( appId = ID.unique(), name = "Custom App", - redirectUris = listOf("http://customapp.localhost/auth/redirect") + redirectUris = listOf("http://vantage.localhost/auth/redirect") ) ``` ```client-android-java @@ -126,7 +126,7 @@ Apps apps = new Apps(client); apps.create( ID.unique(), // appId "Custom App", // name - List.of("http://customapp.localhost/auth/redirect"), // redirectUris + List.of("http://vantage.localhost/auth/redirect"), // redirectUris null, // description (optional) null, // clientUri (optional) null, // logoUri (optional) @@ -165,7 +165,7 @@ const apps = new Apps(client); const app = await apps.create({ appId: ID.unique(), name: 'Custom App', - redirectUris: ['http://customapp.localhost/auth/redirect'], + redirectUris: ['http://vantage.localhost/auth/redirect'], }); ``` {% /multicode %} @@ -623,7 +623,7 @@ const app = await apps.update({ name: 'Custom App', description: 'A third-party app that signs in with your product.', logoUri: 'https://example.com/logo.png', - redirectUris: ['http://customapp.localhost/auth/redirect'], + redirectUris: ['http://vantage.localhost/auth/redirect'], enabled: true, }); ``` @@ -641,7 +641,7 @@ App app = await apps.update( name: 'Custom App', description: 'A third-party app that signs in with your product.', logoUri: 'https://example.com/logo.png', - redirectUris: ['http://customapp.localhost/auth/redirect'], + redirectUris: ['http://vantage.localhost/auth/redirect'], enabled: true, ); ``` @@ -659,7 +659,7 @@ let app = try await apps.update( name: "Custom App", description: "A third-party app that signs in with your product.", logoUri: "https://example.com/logo.png", - redirectUris: ["http://customapp.localhost/auth/redirect"], + redirectUris: ["http://vantage.localhost/auth/redirect"], enabled: true ) ``` @@ -678,7 +678,7 @@ val app = apps.update( name = "Custom App", description = "A third-party app that signs in with your product.", logoUri = "https://example.com/logo.png", - redirectUris = listOf("http://customapp.localhost/auth/redirect"), + redirectUris = listOf("http://vantage.localhost/auth/redirect"), enabled = true ) ``` @@ -708,7 +708,7 @@ apps.update( null, // supportUrl (optional) null, // dataDeletionUrl (optional) true, // enabled (optional) - List.of("http://customapp.localhost/auth/redirect"), // redirectUris (optional) + List.of("http://vantage.localhost/auth/redirect"), // redirectUris (optional) null, // postLogoutRedirectUris (optional) null, // type (optional) null, // deviceFlow (optional) @@ -736,7 +736,7 @@ const app = await apps.update({ name: 'Custom App', description: 'A third-party app that signs in with your product.', logoUri: 'https://example.com/logo.png', - redirectUris: ['http://customapp.localhost/auth/redirect'], + redirectUris: ['http://vantage.localhost/auth/redirect'], enabled: true, }); ``` @@ -1274,23 +1274,36 @@ await apps.delete({ Clients can also register themselves over plain HTTP, without an Appwrite SDK or a signed-in user, through the registration endpoint ([RFC 7591](https://datatracker.ietf.org/doc/html/rfc7591)). This is what makes your OAuth2 server compatible with MCP servers and other software that provisions its own client on first contact. Registration is rate-limited per IP. -```http -POST /v1/oauth2//register HTTP/1.1 -Host: .cloud.appwrite.io +{% multicode %} +```curl +curl -X POST 'https://.cloud.appwrite.io/v1/oauth2//register' \ + -H 'Content-Type: application/json' \ + -d '{ + "client_name": "MCP Client", + "redirect_uris": [ + "http://vantage.localhost/auth/redirect" + ], + "token_endpoint_auth_method": "none" + }' +``` +```hurl +POST https://.cloud.appwrite.io/v1/oauth2//register Content-Type: application/json - { "client_name": "MCP Client", - "redirect_uris": ["http://customapp.localhost/auth/redirect"], + "redirect_uris": [ + "http://vantage.localhost/auth/redirect" + ], "token_endpoint_auth_method": "none" } ``` +{% /multicode %} ```json { "client_id": "6a56677caf736a2310a2", "client_id_issued_at": 1784047484, - "redirect_uris": ["http://customapp.localhost/auth/redirect"], + "redirect_uris": ["http://vantage.localhost/auth/redirect"], "token_endpoint_auth_method": "none", "grant_types": ["authorization_code"], "response_types": ["code"], diff --git a/src/routes/docs/partners/oauth-server/device-flow/+page.markdoc b/src/routes/docs/partners/oauth-server/device-flow/+page.markdoc index 1ae6eec6ad..a034054364 100644 --- a/src/routes/docs/partners/oauth-server/device-flow/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/device-flow/+page.markdoc @@ -51,17 +51,26 @@ The device client uses HTTP for the device authorization and token requests. Send the client ID and requested scopes to the device authorization endpoint as JSON: -```http -POST /v1/oauth2//device_authorization HTTP/1.1 -Host: .cloud.appwrite.io +{% multicode %} +```curl +curl -X POST 'https://.cloud.appwrite.io/v1/oauth2//device_authorization' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -d '{ + "client_id": "", + "scope": "openid profile tasks.read" + }' +``` +```hurl +POST https://.cloud.appwrite.io/v1/oauth2//device_authorization Content-Type: application/json Accept: application/json - { "client_id": "", "scope": "openid profile tasks.read" } ``` +{% /multicode %} The request can also include: @@ -90,18 +99,28 @@ Show the `user_code` and `verification_uri` on the device. You can also present Start polling the token endpoint in the background. Wait at least the number of seconds in `interval` between requests: -```http -POST /v1/oauth2//token HTTP/1.1 -Host: .cloud.appwrite.io +{% multicode %} +```curl +curl -X POST 'https://.cloud.appwrite.io/v1/oauth2//token' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -d '{ + "grant_type": "urn:ietf:params:oauth:grant-type:device_code", + "device_code": "", + "client_id": "" + }' +``` +```hurl +POST https://.cloud.appwrite.io/v1/oauth2//token Content-Type: application/json Accept: application/json - { "grant_type": "urn:ietf:params:oauth:grant-type:device_code", "device_code": "", "client_id": "" } ``` +{% /multicode %} Handle each response according to its `error` value: diff --git a/src/routes/docs/partners/oauth-server/quick-start/+page.markdoc b/src/routes/docs/partners/oauth-server/quick-start/+page.markdoc index e09fe840f1..81a22008e2 100644 --- a/src/routes/docs/partners/oauth-server/quick-start/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/quick-start/+page.markdoc @@ -9,8 +9,8 @@ This guide turns your project into an OAuth2 provider and runs one sign-in throu The examples follow two apps, the same pair the [tutorials](/docs/partners/oauth-server/sign-in-with-your-product/step-1) build out in full: -- **TaskFlow** (`http://platform.localhost`): your product and the **OAuth2 provider**, also called the authorization server. It authenticates users, presents the consent screen, and issues tokens. -- **Vantage** (`http://customapp.localhost`): the third-party **consumer**, called the client in OAuth2. It sends users to TaskFlow for authorization and receives tokens after they approve access. +- **TaskFlow** (`http://taskflow.localhost`): your product and the **OAuth2 provider**, also called the authorization server. It authenticates users, presents the consent screen, and issues tokens. +- **Vantage** (`http://vantage.localhost`): the third-party **consumer**, called the client in OAuth2. It sends users to TaskFlow for authorization and receives tokens after they approve access. # Enable the server {% #enable %} @@ -23,7 +23,7 @@ In the Console, open **Auth**, select the **OAuth2 server** tab, and turn on **E ![Enabling the OAuth2 server in the Appwrite Console](/images/docs/oauth-server/oauth2-server-settings.avif) {% /only_light %} -Set the **Authorization URL** to the page you will host the consent screen on. This is where Appwrite redirects users during authorization, and where you present them the details of the request so they can approve or cancel. Point it at `http://platform.localhost/consent`, where TaskFlow will host its consent screen. Nothing needs to run there yet. The `openid`, `profile`, and `email` scopes are always included; add any scopes your custom APIs will support. +Set the **Authorization URL** to the page you will host the consent screen on. This is where Appwrite redirects users during authorization, and where you present them the details of the request so they can approve or cancel. Point it at `http://taskflow.localhost/consent`, where TaskFlow will host its consent screen. Nothing needs to run there yet. The `openid`, `profile`, and `email` scopes are always included; add any scopes your custom APIs will support. You can also enable and configure the server with a [Server SDK](/docs/sdks#server) using the `updateOAuth2Server` method. @@ -290,7 +290,6 @@ project.updateOAuth2Server( System.out.println(result); }) ); - ``` ```server-swift import Appwrite @@ -317,7 +316,6 @@ let project = try await project.updateOAuth2Server( userCodeFormat: "numeric", // optional deviceCodeDuration: 60 // optional ) - ``` ```server-go package main @@ -403,7 +401,7 @@ Open it in a browser to confirm the server is live. It returns JSON describing t # Register a client {% #register %} -Each app that integrates with your project registers as a client. Here that is Vantage. The **redirect URI** it declares is a URL on Vantage, `http://customapp.localhost/auth/redirect`, where the OAuth2 server sends users back with the authorization code. Any HTTP or HTTPS URL works. +Each app that integrates with your project registers as a client. Here that is Vantage. The **redirect URI** it declares is a URL on Vantage, `http://vantage.localhost/auth/redirect`, where the OAuth2 server sends users back with the authorization code. Any HTTP or HTTPS URL works. Open the **Apps** sub-tab and create a client. Name it `Vantage`, add the redirect URI, and choose a type. Pick **Confidential** for this walkthrough so you get a secret to authenticate the token exchange. Copy the secret when it is shown, because it appears only once. @@ -429,7 +427,7 @@ const apps = new Apps(client); const app = await apps.create({ appId: ID.unique(), name: 'Vantage', - redirectUris: ['http://customapp.localhost/auth/redirect'], + redirectUris: ['http://vantage.localhost/auth/redirect'], }); ``` ```client-flutter @@ -444,7 +442,7 @@ Apps apps = Apps(client); App app = await apps.create( appId: ID.unique(), name: 'Vantage', - redirectUris: ['http://customapp.localhost/auth/redirect'], + redirectUris: ['http://vantage.localhost/auth/redirect'], ); ``` ```client-apple @@ -459,7 +457,7 @@ let apps = Apps(client) let app = try await apps.create( appId: ID.unique(), name: "Vantage", - redirectUris: ["http://customapp.localhost/auth/redirect"] + redirectUris: ["http://vantage.localhost/auth/redirect"] ) ``` ```client-android-kotlin @@ -476,7 +474,7 @@ val apps = Apps(client) val app = apps.create( appId = ID.unique(), name = "Vantage", - redirectUris = listOf("http://customapp.localhost/auth/redirect") + redirectUris = listOf("http://vantage.localhost/auth/redirect") ) ``` ```client-android-java @@ -494,7 +492,7 @@ Apps apps = new Apps(client); apps.create( ID.unique(), // appId "Vantage", // name - List.of("http://customapp.localhost/auth/redirect"), // redirectUris + List.of("http://vantage.localhost/auth/redirect"), // redirectUris null, // description (optional) null, // clientUri (optional) null, // logoUri (optional) @@ -533,7 +531,7 @@ const apps = new Apps(client); const app = await apps.create({ appId: ID.unique(), name: 'Vantage', - redirectUris: ['http://customapp.localhost/auth/redirect'], + redirectUris: ['http://vantage.localhost/auth/redirect'], }); ``` {% /multicode %} @@ -555,7 +553,7 @@ const app = await apps.update({ name: 'Vantage', description: 'A dashboard that signs in with TaskFlow.', logoUri: 'https://example.com/logo.png', - redirectUris: ['http://customapp.localhost/auth/redirect'], + redirectUris: ['http://vantage.localhost/auth/redirect'], enabled: true, }); ``` @@ -573,7 +571,7 @@ App app = await apps.update( name: 'Vantage', description: 'A dashboard that signs in with TaskFlow.', logoUri: 'https://example.com/logo.png', - redirectUris: ['http://customapp.localhost/auth/redirect'], + redirectUris: ['http://vantage.localhost/auth/redirect'], enabled: true, ); ``` @@ -591,7 +589,7 @@ let app = try await apps.update( name: "Vantage", description: "A dashboard that signs in with TaskFlow.", logoUri: "https://example.com/logo.png", - redirectUris: ["http://customapp.localhost/auth/redirect"], + redirectUris: ["http://vantage.localhost/auth/redirect"], enabled: true ) ``` @@ -610,7 +608,7 @@ val app = apps.update( name = "Vantage", description = "A dashboard that signs in with TaskFlow.", logoUri = "https://example.com/logo.png", - redirectUris = listOf("http://customapp.localhost/auth/redirect"), + redirectUris = listOf("http://vantage.localhost/auth/redirect"), enabled = true ) ``` @@ -640,7 +638,7 @@ apps.update( null, // supportUrl (optional) null, // dataDeletionUrl (optional) true, // enabled (optional) - List.of("http://customapp.localhost/auth/redirect"), // redirectUris (optional) + List.of("http://vantage.localhost/auth/redirect"), // redirectUris (optional) null, // postLogoutRedirectUris (optional) null, // type (optional) null, // deviceFlow (optional) @@ -668,7 +666,7 @@ const app = await apps.update({ name: 'Vantage', description: 'A dashboard that signs in with TaskFlow.', logoUri: 'https://example.com/logo.png', - redirectUris: ['http://customapp.localhost/auth/redirect'], + redirectUris: ['http://vantage.localhost/auth/redirect'], enabled: true, }); ``` @@ -689,9 +687,9 @@ The URL uses TaskFlow's Appwrite API endpoint because its Appwrite project is ac ```text https://.cloud.appwrite.io/v1/oauth2//authorize ?client_id= - &redirect_uri=http://customapp.localhost/auth/redirect + &redirect_uri=http://vantage.localhost/auth/redirect &response_type=code - &scope=openid%20profile%20email + &scope=openid profile email &state= ``` @@ -717,21 +715,30 @@ After Vantage opens the authorization endpoint: - **TaskFlow presents the request.** A complete consent screen uses the grant ID to show that Vantage is asking for the user's profile and email, then lets the user approve or cancel. The [Authorization](/docs/partners/oauth-server/authorization#consent) guide shows how to build this screen. -- **Copy the grant ID.** This quick start does not build TaskFlow's consent screen, so the browser lands on `http://platform.localhost/consent` and finds nothing there. Copy the `grant_id` from the address bar to continue manually. +- **Copy the grant ID.** This quick start does not build TaskFlow's consent screen, so the browser lands on `http://taskflow.localhost/consent` and finds nothing there. Copy the `grant_id` from the address bar to continue manually. - **Sign in if the grant ID is missing.** A URL without a `grant_id` means the user does not have an active TaskFlow session. Sign in a user on the project, then open Vantage's authorization URL again. - **Approve Vantage's request.** Send the `grant_id` to the approval endpoint using the same TaskFlow user's session. A browser sends the session cookie automatically. From another environment, pass the session token in the `X-Appwrite-Session` header. Use this request: -```http -POST /v1/oauth2//approve HTTP/1.1 -Host: .cloud.appwrite.io +{% multicode %} +```curl +curl -X POST 'https://.cloud.appwrite.io/v1/oauth2//approve' \ + -H 'Content-Type: application/json' \ + -H 'X-Appwrite-Session: ' \ + -d '{ + "grant_id": "" + }' +``` +```hurl +POST https://.cloud.appwrite.io/v1/oauth2//approve Content-Type: application/json - +X-Appwrite-Session: { "grant_id": "" } ``` +{% /multicode %} - **Return to Vantage.** After approval, Appwrite redirects the browser to Vantage's registered redirect URI with an authorization `code` in the query string. Vantage uses this code in the next step. @@ -739,20 +746,32 @@ Content-Type: application/json Vantage's server sends the code to the token endpoint. A confidential client passes its `client_secret`; a public client passes its PKCE `code_verifier` instead. -```http -POST /v1/oauth2//token HTTP/1.1 -Host: .cloud.appwrite.io +{% multicode %} +```curl +curl -X POST 'https://.cloud.appwrite.io/v1/oauth2//token' \ + -H 'Content-Type: application/json' \ + -d '{ + "grant_type": "authorization_code", + "code": "", + "redirect_uri": "http://vantage.localhost/auth/redirect", + "client_id": "", + "client_secret": "", + "code_verifier": "" + }' +``` +```hurl +POST https://.cloud.appwrite.io/v1/oauth2//token Content-Type: application/json - { "grant_type": "authorization_code", "code": "", - "redirect_uri": "http://customapp.localhost/auth/redirect", + "redirect_uri": "http://vantage.localhost/auth/redirect", "client_id": "", "client_secret": "", "code_verifier": "" } ``` +{% /multicode %} The response contains an access token, a refresh token, and an ID token: @@ -771,11 +790,16 @@ The response contains an access token, a refresh token, and an ID token: Call the userinfo endpoint with the access token to confirm the sign-in worked end to end: -```http -GET /v1/oauth2//userinfo HTTP/1.1 -Host: .cloud.appwrite.io +{% multicode %} +```curl +curl 'https://.cloud.appwrite.io/v1/oauth2//userinfo' \ + -H 'Authorization: Bearer ' +``` +```hurl +GET https://.cloud.appwrite.io/v1/oauth2//userinfo Authorization: Bearer ``` +{% /multicode %} ```json { diff --git a/src/routes/docs/partners/oauth-server/tokens/+page.markdoc b/src/routes/docs/partners/oauth-server/tokens/+page.markdoc index add1fab9d3..13324a6daf 100644 --- a/src/routes/docs/partners/oauth-server/tokens/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/tokens/+page.markdoc @@ -82,7 +82,6 @@ let oauth2Token = try await oauth2.createToken( redirect_uri: "https://example.com", // optional resource: "" // optional ) - ``` ```client-android-kotlin import io.appwrite.Client @@ -137,7 +136,6 @@ oauth2.createToken( Log.d("Appwrite", result.toString()); }) ); - ``` ```client-react-native import { Client, Oauth2 } from "react-native-appwrite"; @@ -197,17 +195,26 @@ Each successful refresh replaces the stored refresh token. The client must store This public-client example sends JSON. A confidential client also includes its `client_secret`. -```http -POST /v1/oauth2//token HTTP/1.1 -Host: .cloud.appwrite.io +{% multicode %} +```curl +curl -X POST 'https://.cloud.appwrite.io/v1/oauth2//token' \ + -H 'Content-Type: application/json' \ + -d '{ + "grant_type": "refresh_token", + "refresh_token": "", + "client_id": "" + }' +``` +```hurl +POST https://.cloud.appwrite.io/v1/oauth2//token Content-Type: application/json - { - "grant_type": "refresh_token", - "refresh_token": "", - "client_id": "" + "grant_type": "refresh_token", + "refresh_token": "", + "client_id": "" } ``` +{% /multicode %} The response has the same shape as the original token response, with new values for `access_token`, `refresh_token`, and `expires_in`. @@ -217,9 +224,8 @@ Access and ID tokens are `RS256` JWTs signed with your project's key. A JWT cont The server publishes its public keys as a JWKS document: -```http -GET /v1/oauth2//.well-known/jwks.json HTTP/1.1 -Host: .cloud.appwrite.io +```text +https://.cloud.appwrite.io/v1/oauth2//.well-known/jwks.json ``` A web client can use the `jose` package to read the discovery document, select the correct public key from the JWKS response, and verify both tokens: @@ -286,11 +292,16 @@ A client may decode a token without verification to make a temporary UI choice, To retrieve the current user's profile with an access token, call the userinfo endpoint: -```http -GET /v1/oauth2//userinfo HTTP/1.1 -Host: .cloud.appwrite.io +{% multicode %} +```curl +curl 'https://.cloud.appwrite.io/v1/oauth2//userinfo' \ + -H 'Authorization: Bearer ' +``` +```hurl +GET https://.cloud.appwrite.io/v1/oauth2//userinfo Authorization: Bearer ``` +{% /multicode %} # Introspect a token {% #introspect %} @@ -309,18 +320,28 @@ Introspection verifies the token against the current OAuth identity, so it detec The resource server sends JSON: -```http -POST /v1/oauth2//introspect HTTP/1.1 -Host: .cloud.appwrite.io +{% multicode %} +```curl +curl -X POST 'https://.cloud.appwrite.io/v1/oauth2//introspect' \ + -H 'X-Appwrite-Project: ' \ + -H 'X-Appwrite-Key: ' \ + -H 'Content-Type: application/json' \ + -d '{ + "token": "", + "token_type_hint": "access_token" + }' +``` +```hurl +POST https://.cloud.appwrite.io/v1/oauth2//introspect X-Appwrite-Project: X-Appwrite-Key: Content-Type: application/json - { - "token": "", - "token_type_hint": "access_token" + "token": "", + "token_type_hint": "access_token" } ``` +{% /multicode %} An active access token returns its client, user, audience, expiry, and granted scopes: @@ -356,17 +377,26 @@ A third-party client should revoke its token when the user disconnects the integ This public-client example sends JSON. A confidential client also includes its `client_secret`. -```http -POST /v1/oauth2//revoke HTTP/1.1 -Host: .cloud.appwrite.io +{% multicode %} +```curl +curl -X POST 'https://.cloud.appwrite.io/v1/oauth2//revoke' \ + -H 'Content-Type: application/json' \ + -d '{ + "token": "", + "token_type_hint": "access_token", + "client_id": "" + }' +``` +```hurl +POST https://.cloud.appwrite.io/v1/oauth2//revoke Content-Type: application/json - { - "token": "", - "token_type_hint": "access_token", - "client_id": "" + "token": "", + "token_type_hint": "access_token", + "client_id": "" } ``` +{% /multicode %} A successful revocation returns `200 OK` with an empty body. The endpoint returns the same response for an unknown token so callers cannot use it to discover valid tokens. @@ -380,9 +410,20 @@ Before using logout, add the destination to the app's **Post-logout redirect URI Send the browser to the logout endpoint with the ID token previously issued to the app: -```http -GET /v1/oauth2//logout?id_token_hint=&post_logout_redirect_uri=https%3A%2F%2Fclient.example.com%2Fsigned-out&state= HTTP/1.1 -Host: .cloud.appwrite.io +{% multicode %} +```curl +curl -G 'https://.cloud.appwrite.io/v1/oauth2//logout' \ + --data-urlencode 'id_token_hint=' \ + --data-urlencode 'post_logout_redirect_uri=https://client.example.com/signed-out' \ + --data-urlencode 'state=' ``` +```hurl +GET https://.cloud.appwrite.io/v1/oauth2//logout +[Query] +id_token_hint: +post_logout_redirect_uri: https://client.example.com/signed-out +state: +``` +{% /multicode %} Appwrite verifies the ID token's signature, issuer, client, and user. It accepts an expired ID token as a logout hint, but still requires the token to be validly signed. After deleting the current project session and the app's OAuth identity, Appwrite redirects to the registered URI and returns `state` unchanged. If no post-logout redirect URI is supplied, the endpoint returns `204 No Content`. From 1448a129c17ac188ef62a98a88cc5c1aa19f8bec Mon Sep 17 00:00:00 2001 From: Atharva Deosthale Date: Wed, 15 Jul 2026 17:20:46 +0530 Subject: [PATCH 5/7] docs(oauth-server): rename custom scopes to dot notation (tasks.read, tasks.write) Aligns the custom-scopes tutorial and announcement blog with the dot notation used by the scopes reference and device-flow pages. Retakes the console and Vantage screenshots that displayed the old names. --- .optimize-cache.json | 10 +- .../announcing-oauth2-server/+page.markdoc | 265 ++++++++++++++++++ .../custom-scopes/step-1/+page.markdoc | 6 +- .../custom-scopes/step-2/+page.markdoc | 10 +- .../custom-scopes/step-3/+page.markdoc | 10 +- .../custom-scopes/step-4/+page.markdoc | 2 +- .../custom-scopes/step-5/+page.markdoc | 8 +- .../custom-scopes/step-6/+page.markdoc | 8 +- .../custom-scopes/step-7/+page.markdoc | 8 +- .../oauth-server/dark/scopes-defined.avif | Bin 32796 -> 32407 bytes .../docs/oauth-server/scopes-defined.avif | Bin 30500 -> 30213 bytes .../scopes-guide/vantage-tasks-dashboard.avif | Bin 27813 -> 27583 bytes .../scopes-guide/vantage-write-denied.avif | Bin 33158 -> 32980 bytes .../scopes-guide/vantage-write-granted.avif | Bin 30992 -> 30555 bytes 14 files changed, 296 insertions(+), 31 deletions(-) create mode 100644 src/routes/blog/post/announcing-oauth2-server/+page.markdoc diff --git a/.optimize-cache.json b/.optimize-cache.json index 42482acac8..684bc08a9b 100644 --- a/.optimize-cache.json +++ b/.optimize-cache.json @@ -1595,7 +1595,7 @@ "static/images/docs/oauth-server/dark/oauth2-server-settings-disabled.png": "ad51d531eaa3736839859097c024bca41a28d1339ceef773e376c06936e040ee", "static/images/docs/oauth-server/dark/oauth2-server-settings.png": "18da0340416739f803b8c04d66c191e92e7eafa70cd301acb1e269d8dd5a0c81", "static/images/docs/oauth-server/dark/oauth2-server-token-lifetimes.png": "46743e2f0a3e8c126d590809668a37c2beb1f1c5483002839d9a15eca9e110d4", - "static/images/docs/oauth-server/dark/scopes-defined.png": "71fe55ebcc533a83709394926d8cd8b3735d8f7bab3983590073357f467f7271", + "static/images/docs/oauth-server/dark/scopes-defined.png": "4723658a478b30e4f97372661d4ed7a9ba14d1cc7f0b56d4f5bf6148b5326cf1", "static/images/docs/oauth-server/guide/taskflow-consent.png": "5c4f4cbc6b225c60d5d6e2f1616abe45f0e6b66a5014438961fca98db349bd18", "static/images/docs/oauth-server/guide/taskflow-login.png": "5d0013b31b211efe4d3a2f6a9f224a5b547d3ef1370e507b9a183bb276fc90e1", "static/images/docs/oauth-server/guide/vantage-dashboard.png": "b2e95c34ec9c19be090e5f3384e0c3278dd840059b3f015ccdb13a16c135dde1", @@ -1608,12 +1608,12 @@ "static/images/docs/oauth-server/oauth2-server-settings-disabled.png": "648091d9d81308ab93dd456f172fa1c1977c2fbce9b8aa03893398bdefe10595", "static/images/docs/oauth-server/oauth2-server-settings.png": "914aa6511caedb568f199eacef837366c523f78125c551afa992e39098707431", "static/images/docs/oauth-server/oauth2-server-token-lifetimes.png": "895bf62c7f5171c8f244fda37b516760266c47447f2c66c93c3c812139823b96", - "static/images/docs/oauth-server/scopes-defined.png": "63d9d4bd8bfa353fe8760a4840f396cee6efd8d79351966eadff9659972701cf", + "static/images/docs/oauth-server/scopes-defined.png": "ae1d03cc7cd585f52b6445f5b6506a77f3cb47f50f5677c23e5ff650667942b4", "static/images/docs/oauth-server/scopes-guide/taskflow-consent-choice.png": "27a8ebf167728a50059bf315bc9676e3c5ec9f32f47eb70ea7c4e4715fadbf99", "static/images/docs/oauth-server/scopes-guide/taskflow-consent-scopes.png": "ad7975be44e1840e85d994c3a12e19bcbe63e4eec5ba4bec9028c6683db3ae60", - "static/images/docs/oauth-server/scopes-guide/vantage-tasks-dashboard.png": "d8f81bd5e0dce05d66d286aa08c57710e383e37c026695c5d97621a4ccdaff07", - "static/images/docs/oauth-server/scopes-guide/vantage-write-denied.png": "d2f1fc73a56e88608109b35905d23a0a8ebfd35f13b21c207f11bab526aa30d6", - "static/images/docs/oauth-server/scopes-guide/vantage-write-granted.png": "6d82810a35789608f50cf27299f506551c5138ae8854b2dc8bfdb71d8f2ceb96", + "static/images/docs/oauth-server/scopes-guide/vantage-tasks-dashboard.png": "a621e10d803c25408eafcb0393e934080c4a2fd00e3230ad2a8cab0fbc84d778", + "static/images/docs/oauth-server/scopes-guide/vantage-write-denied.png": "7e2f32309bad509c9920e5725f8b49654e4dbc19699ee6af309b174e955bd2fd", + "static/images/docs/oauth-server/scopes-guide/vantage-write-granted.png": "1565538a08f94180a7ff35df2cad426c962609eeeae021e2fc8c076242882e1e", "static/images/docs/platform/add-platform.png": "5a05bb9d75a8d5270bfa5e67df7e6de20a9fad174476a112b5bdab72e7bdad30", "static/images/docs/platform/create-api-key.png": "7661b3845e13704643f8ff4f763faa8e61efb90878c3ffa7466ece0910b8ecab", "static/images/docs/platform/create-webhook.png": "77e08173da6ac534524e025433cf75e532d853a135944a7c6ba2278357d88b2d", diff --git a/src/routes/blog/post/announcing-oauth2-server/+page.markdoc b/src/routes/blog/post/announcing-oauth2-server/+page.markdoc new file mode 100644 index 0000000000..593359ce33 --- /dev/null +++ b/src/routes/blog/post/announcing-oauth2-server/+page.markdoc @@ -0,0 +1,265 @@ +--- +layout: post +title: "Announcing the Appwrite OAuth2 server: Turn your project into an identity provider" +description: Your Appwrite project can now act as an OAuth 2.1 and OpenID Connect provider, so other apps can offer Sign in with your product and request scoped access to your APIs. +date: 2026-07-15 +cover: /images/blog/announcing-oauth2-server/cover.png +timeToRead: 6 +author: matej-baco +category: announcement +featured: false +callToAction: true +draft: true +faqs: + - question: "What is the Appwrite OAuth2 server?" + answer: "The OAuth2 server lets your Appwrite project act as an OAuth 2.1 and OpenID Connect provider. Third-party apps register as clients, send your users through an authorization flow you control, and receive tokens they can use to sign users in or call your APIs with scoped access." + - question: "How is the OAuth2 server different from Appwrite's OAuth providers?" + answer: "OAuth providers let your users sign in to your app with Google, GitHub, and other identity providers. The OAuth2 server is the other direction: your project becomes the identity provider, and other apps integrate with you the same way you would integrate with Google." + - question: "Which OAuth standards does the Appwrite OAuth2 server support?" + answer: "The server implements OAuth 2.1 with PKCE, OpenID Connect Core, discovery metadata, token introspection and revocation, the device authorization flow, pushed authorization requests, dynamic client registration, JWT access tokens, and rich authorization requests." + - question: "Can users register OAuth2 clients without the Appwrite Console?" + answer: "Yes. The apps service is available in the Client SDKs, so any signed-in user on your project can register and manage their own clients. This lets you build a self-serve developer portal on top of your project, and the standard dynamic client registration endpoint is also supported." + - question: "Can I define custom scopes for my own APIs?" + answer: "Yes. Alongside the built-in openid, profile, and email scopes, you can define scopes like tasks.read for your own APIs. Your resource server verifies the access token and checks the granted scopes before serving a request." + - question: "Is the OAuth2 server available on self-hosted Appwrite?" + answer: "The OAuth2 server is available on Appwrite Cloud. Every project includes it, and you can enable it from the Auth section of the Console." +--- + +If you have ever added **Sign in with Google** or **Sign in with GitHub** to an app, you have been on the consuming side of OAuth. Being on the other side, the side that issues the tokens, has always been much harder. Building an authorization server means implementing authorize and token endpoints, PKCE, consent, token rotation, client management, and a stack of specifications that are easy to get subtly wrong. + +That work is now part of your Appwrite project. With the **OAuth2 server**, your project can act as an **OAuth 2.1 and OpenID Connect provider**. Third-party developers register their apps as clients, your users approve what those apps can access, and your project issues the tokens. Integrators can offer **Sign in with your product** and request scoped access to your APIs, using the same standard flows they already know from Google or GitHub. + +# What your project provides + +Once enabled, your project exposes the full set of endpoints an OAuth or OIDC integration expects: authorization, token, userinfo, introspection, revocation, logout, device authorization, pushed authorization requests, and dynamic client registration. All of them are described by a discovery document, so most integrators point their OAuth library at one URL and never read your endpoint list: + +```text +https://.cloud.appwrite.io/v1/oauth2//.well-known/openid-configuration +``` + +Two design decisions matter more than the endpoint list. + +First, **you own the consent screen**. The OAuth2 server handles the protocol, but the page where users review and approve a request is a page you host, built with your components and your branding. Users approving access to their data never leave your product's design language. + +Second, **client registration is an API, not a Console form**. The `apps` service is available in the Client SDKs, so any signed-in user on your project can register an app. That is what makes a self-serve developer portal possible: integrators create their clients, manage their secrets, and rotate credentials inside your product, while the Console remains your admin view. + +# Enable the server in the Console + +The OAuth2 server lives in the **Auth** section of the Console, under the **OAuth2 server** tab. Turn it on, set the authorization URL to the page that will host your consent screen, and add any custom scopes your APIs support. The `openid`, `profile`, and `email` scopes are always included. + +Once enabled, the Console shows your project's discovery URL, and opening it in a browser confirms the server is live. + +![The OIDC discovery URL in the Appwrite Console](/images/docs/oauth-server/dark/oauth2-server-discovery.avif) + +# Register a client + +The rest of this post follows two apps: + +- **TaskFlow**: your product, a task manager built on Appwrite, acting as the OAuth2 provider. +- **Vantage**: a third-party analytics dashboard that wants to offer **Sign in with TaskFlow**. + +Vantage registers as a client with a name and a redirect URI, the URL where users return to Vantage with an authorization code after approving access. You can create the client in the **Apps** sub-tab of the Console, or let integrators like Vantage register their own from code: + +{% multicode %} +```client-web +import { Client, Apps, ID } from 'appwrite'; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +const apps = new Apps(client); + +const app = await apps.create({ + appId: ID.unique(), + name: 'Vantage', + redirectUris: ['http://vantage.localhost/auth/redirect'], +}); +``` +```client-flutter +import 'package:appwrite/appwrite.dart'; + +Client client = Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +Apps apps = Apps(client); + +App app = await apps.create( + appId: ID.unique(), + name: 'Vantage', + redirectUris: ['http://vantage.localhost/auth/redirect'], +); +``` +```client-apple +import Appwrite + +let client = Client() + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + +let apps = Apps(client) + +let app = try await apps.create( + appId: ID.unique(), + name: "Vantage", + redirectUris: ["http://vantage.localhost/auth/redirect"] +) +``` +```client-android-kotlin +import io.appwrite.Client +import io.appwrite.ID +import io.appwrite.services.Apps + +val client = Client(context) + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject("") // Your project ID + +val apps = Apps(client) + +val app = apps.create( + appId = ID.unique(), + name = "Vantage", + redirectUris = listOf("http://vantage.localhost/auth/redirect") +) +``` +```client-android-java +import io.appwrite.Client; +import io.appwrite.ID; +import io.appwrite.coroutines.CoroutineCallback; +import io.appwrite.services.Apps; + +Client client = new Client(context) + .setEndpoint("https://.cloud.appwrite.io/v1") // Your API Endpoint + .setProject(""); // Your project ID + +Apps apps = new Apps(client); + +apps.create( + ID.unique(), // appId + "Vantage", // name + List.of("http://vantage.localhost/auth/redirect"), // redirectUris + null, // description (optional) + null, // clientUri (optional) + null, // logoUri (optional) + null, // privacyPolicyUrl (optional) + null, // termsUrl (optional) + null, // contacts (optional) + null, // tagline (optional) + null, // tags (optional) + null, // images (optional) + null, // supportUrl (optional) + null, // dataDeletionUrl (optional) + null, // postLogoutRedirectUris (optional) + null, // enabled (optional) + null, // type (optional) + null, // deviceFlow (optional) + null, // teamId (optional) + new CoroutineCallback<>((result, error) -> { + if (error != null) { + error.printStackTrace(); + return; + } + + Log.d("Appwrite", result.toString()); + }) +); +``` +```client-react-native +import { Client, Apps, ID } from "react-native-appwrite"; + +const client = new Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +const apps = new Apps(client); + +const app = await apps.create({ + appId: ID.unique(), + name: 'Vantage', + redirectUris: ['http://vantage.localhost/auth/redirect'], +}); +``` +{% /multicode %} + +Clients come in two types: + +- **Confidential** clients run on a server, hold a client secret, and authenticate the token exchange with it. +- **Public** clients, such as mobile and single-page apps, cannot keep a secret and use PKCE instead. + +Beyond the basics, each client carries consent screen branding, post-logout redirect URIs, and an optional device flow, and clients can be transferred to teams so a whole organization manages them together. + +# Run a sign-in + +The default flow is the standard authorization code flow. When a user clicks **Sign in with TaskFlow**, Vantage sends their browser to TaskFlow's authorization endpoint with its client ID, redirect URI, and requested scopes: + +```text +https://.cloud.appwrite.io/v1/oauth2//authorize + ?client_id= + &redirect_uri=http://vantage.localhost/auth/redirect + &response_type=code + &scope=openid profile email + &state= +``` + +Appwrite validates the request and redirects the user to TaskFlow's consent screen with a grant ID. The page shows what Vantage is asking for, and when the user approves, Appwrite sends them back to Vantage with an authorization code. Vantage's server then exchanges the code for tokens: + +{% multicode %} +```curl +curl -X POST 'https://.cloud.appwrite.io/v1/oauth2//token' \ + -H 'Content-Type: application/json' \ + -d '{ + "grant_type": "authorization_code", + "code": "", + "redirect_uri": "http://vantage.localhost/auth/redirect", + "client_id": "", + "client_secret": "", + "code_verifier": "" + }' +``` +```hurl +POST https://.cloud.appwrite.io/v1/oauth2//token +Content-Type: application/json +{ + "grant_type": "authorization_code", + "code": "", + "redirect_uri": "http://vantage.localhost/auth/redirect", + "client_id": "", + "client_secret": "", + "code_verifier": "" +} +``` +{% /multicode %} + +The response contains a JWT access token, a refresh token with rotation, and an OIDC ID token. A call to the userinfo endpoint with the access token returns the user's profile, which is everything Vantage needs to sign the user in on its side. + +# Protect your own APIs with custom scopes + +Sign-in is the starting point. The larger opportunity is scoped access to your APIs. TaskFlow defines scopes like `tasks.read` or `tasks.write` on the server, Vantage requests them during authorization, and users see exactly what they are granting on the consent screen before Vantage can read a single task. + +Access tokens are signed JWTs that carry the granted scopes, so your API verifies a request with your project's public keys from the JWKS endpoint and checks the scope before serving it. No call back to Appwrite is needed on the hot path. For fine-grained cases that scopes cannot express, such as an app requesting access to one specific resource, the server also supports rich authorization requests (RFC 9396). + +# Standards support + +Every flow follows the corresponding specification, so off-the-shelf OAuth and OIDC libraries work without custom adapters: + +| Standard | What it covers | +| --- | --- | +| OAuth 2.1 with PKCE | Authorization code flow with proof key for code exchange | +| OpenID Connect Core | ID tokens, userinfo, and RP-initiated logout | +| RFC 8414 | Discovery metadata for automatic client configuration | +| RFC 7662 and RFC 7009 | Token introspection and revocation | +| RFC 8628 | Device authorization flow for TVs and CLIs | +| RFC 9126 | Pushed authorization requests | +| RFC 7591 | Dynamic client registration | +| RFC 9068 | JWT access tokens | +| RFC 9396 | Rich authorization requests | + +# Get started + +The OAuth2 server is available on Appwrite Cloud. Enable it from the **Auth** section of your project, register a client, and run your first sign-in in a few minutes with the quick start. + +- [OAuth2 server documentation](/docs/partners/oauth-server) +- [Quick start: run your first authorization flow](/docs/partners/oauth-server/quick-start) +- [Tutorial: add Sign in with your product to an app](/docs/partners/oauth-server/sign-in-with-your-product/step-1) +- [Tutorial: protect an API with custom scopes](/docs/partners/oauth-server/custom-scopes/step-1) diff --git a/src/routes/docs/partners/oauth-server/custom-scopes/step-1/+page.markdoc b/src/routes/docs/partners/oauth-server/custom-scopes/step-1/+page.markdoc index 99a9a4a1c7..578b28a6ea 100644 --- a/src/routes/docs/partners/oauth-server/custom-scopes/step-1/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/custom-scopes/step-1/+page.markdoc @@ -16,16 +16,16 @@ This tutorial continues with the same two apps. TaskFlow gains a task API that c # What you will build {% #what-you-will-build %} -- Two custom scopes on TaskFlow's OAuth2 server: `read:tasks` and `write:tasks`. +- Two custom scopes on TaskFlow's OAuth2 server: `tasks.read` and `tasks.write`. - A consent screen where the user grants or withholds **each permission individually**. - A **resource server**: an API route on TaskFlow that validates access tokens and enforces the scopes they carry, operation by operation. - A task composer on Vantage's dashboard that succeeds or gets refused depending on what the user granted. -The resource server is the new idea. The OAuth2 server issues tokens and stamps the granted scopes onto them, but it does not know what `read:tasks` means in your product. Your API gives the scope its meaning by checking it on every request. +The resource server is the new idea. The OAuth2 server issues tokens and stamps the granted scopes onto them, but it does not know what `tasks.read` means in your product. Your API gives the scope its meaning by checking it on every request. # The flow {% #the-flow %} -1. Vantage adds `read:tasks` and `write:tasks` to its authorization request. +1. Vantage adds `tasks.read` and `tasks.write` to its authorization request. 2. TaskFlow's consent screen shows each permission, and the user decides which to grant. 3. The access token Vantage receives carries exactly the approved scopes in its `scope` claim. 4. Vantage calls TaskFlow's task API with the access token. diff --git a/src/routes/docs/partners/oauth-server/custom-scopes/step-2/+page.markdoc b/src/routes/docs/partners/oauth-server/custom-scopes/step-2/+page.markdoc index 523a75ad00..5a7c2c7891 100644 --- a/src/routes/docs/partners/oauth-server/custom-scopes/step-2/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/custom-scopes/step-2/+page.markdoc @@ -1,7 +1,7 @@ --- layout: tutorial title: Define the scopes -description: Add read:tasks and write:tasks to your OAuth2 server's scopes. +description: Add tasks.read and tasks.write to your OAuth2 server's scopes. step: 2 --- @@ -10,16 +10,16 @@ Scopes have to be defined on the OAuth2 server before a client can request them. # Add the scopes {% #add %} {% only_dark %} -![The read:tasks and write:tasks scopes on the OAuth2 server settings](/images/docs/oauth-server/dark/scopes-defined.avif) +![The tasks.read and tasks.write scopes on the OAuth2 server settings](/images/docs/oauth-server/dark/scopes-defined.avif) {% /only_dark %} {% only_light %} -![The read:tasks and write:tasks scopes on the OAuth2 server settings](/images/docs/oauth-server/scopes-defined.avif) +![The tasks.read and tasks.write scopes on the OAuth2 server settings](/images/docs/oauth-server/scopes-defined.avif) {% /only_light %} In the Console, open **Auth**, select the **OAuth2 server** tab, and find the **Scopes** field on the **Integration** card. Add two scopes and click **Update**: -- `read:tasks` grants read access to the user's tasks. -- `write:tasks` grants permission to create and update tasks. +- `tasks.read` grants read access to the user's tasks. +- `tasks.write` grants permission to create and update tasks. The `openid`, `profile`, `email`, and `phone` scopes stay locked in place. They are always available, so you only define the ones specific to your product. diff --git a/src/routes/docs/partners/oauth-server/custom-scopes/step-3/+page.markdoc b/src/routes/docs/partners/oauth-server/custom-scopes/step-3/+page.markdoc index 6bc83e5c45..43cb397a4d 100644 --- a/src/routes/docs/partners/oauth-server/custom-scopes/step-3/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/custom-scopes/step-3/+page.markdoc @@ -13,9 +13,9 @@ In the consumer, extend the scope list in `consumer/src/lib/oauth.ts`: ```ts // consumer/src/lib/oauth.ts -// read:tasks and write:tasks are custom scopes defined on TaskFlow's +// tasks.read and tasks.write are custom scopes defined on TaskFlow's // OAuth2 server. They authorize Vantage against TaskFlow's task API. -export const SCOPES = 'openid profile email read:tasks write:tasks' +export const SCOPES = 'openid profile email tasks.read tasks.write' ``` `authorizeUrl` already passes `SCOPES` as the `scope` parameter, so nothing else changes on the consumer. The OAuth2 server carries the requested scopes into the grant and shows them to the user. @@ -33,12 +33,12 @@ export const SCOPE_LABELS: Record = { profile: 'See your name and profile details', email: 'See your email address', phone: 'See your phone number', - 'read:tasks': 'See your tasks', - 'write:tasks': 'Create and update your tasks', + 'tasks.read': 'See your tasks', + 'tasks.write': 'Create and update your tasks', } ``` -A raw scope string like `read:tasks` means something to you, not to your users. The label is what stands between them and approving a permission they do not understand. +A raw scope string like `tasks.read` means something to you, not to your users. The label is what stands between them and approving a permission they do not understand. # Let the user choose {% #choose %} diff --git a/src/routes/docs/partners/oauth-server/custom-scopes/step-4/+page.markdoc b/src/routes/docs/partners/oauth-server/custom-scopes/step-4/+page.markdoc index 932adb8b02..ac6e1e1189 100644 --- a/src/routes/docs/partners/oauth-server/custom-scopes/step-4/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/custom-scopes/step-4/+page.markdoc @@ -64,7 +64,7 @@ The `{ typ: 'at+jwt' }` option matters more than it looks. Your OAuth2 server si Two claims in the verified payload matter for the API: -- `scope` holds the granted scopes as a single space-separated string, such as `openid profile email read:tasks`. `hasScope` splits it and looks for an exact entry. +- `scope` holds the granted scopes as a single space-separated string, such as `openid profile email tasks.read`. `hasScope` splits it and looks for an exact entry. - `sub` is the ID of the user who approved the grant. The API uses it to load that user's tasks, so a token can never read anyone else's data. {% info title="Build the JWKS URL from your own configuration" %} diff --git a/src/routes/docs/partners/oauth-server/custom-scopes/step-5/+page.markdoc b/src/routes/docs/partners/oauth-server/custom-scopes/step-5/+page.markdoc index 2ba5f9a05b..048f7446f2 100644 --- a/src/routes/docs/partners/oauth-server/custom-scopes/step-5/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/custom-scopes/step-5/+page.markdoc @@ -1,7 +1,7 @@ --- layout: tutorial title: Protect the API route -description: Serve tasks only to tokens that carry read:tasks. +description: Serve tasks only to tokens that carry tasks.read. step: 5 --- @@ -108,7 +108,7 @@ export const Route = createFileRoute('/api/tasks')({ GET: async ({ request }) => { const token = await authenticate(request) if (!token) return unauthorized() - if (!hasScope(token, 'read:tasks')) return forbidden('read:tasks') + if (!hasScope(token, 'tasks.read')) return forbidden('tasks.read') // The token's subject is the TaskFlow user who approved access. return Response.json({ tasks: tasksFor(token.sub!) }) @@ -117,7 +117,7 @@ export const Route = createFileRoute('/api/tasks')({ POST: async ({ request }) => { const token = await authenticate(request) if (!token) return unauthorized() - if (!hasScope(token, 'write:tasks')) return forbidden('write:tasks') + if (!hasScope(token, 'tasks.write')) return forbidden('tasks.write') const { title } = await request.json() return Response.json( @@ -137,6 +137,6 @@ Each handler applies the same two checks, in order: The two error shapes follow RFC 6750, including the `WWW-Authenticate` header, so standard OAuth client libraries understand the refusal. The distinction matters to callers: a 401 means get a new token, a 403 means ask the user for more scopes. -Note what the `POST` handler implies: a client can hold a perfectly valid token and still be refused a write with it, whenever the user granted `read:tasks` but withheld `write:tasks` on the consent screen. +Note what the `POST` handler implies: a client can hold a perfectly valid token and still be refused a write with it, whenever the user granted `tasks.read` but withheld `tasks.write` on the consent screen. Continue to call the API from Vantage. diff --git a/src/routes/docs/partners/oauth-server/custom-scopes/step-6/+page.markdoc b/src/routes/docs/partners/oauth-server/custom-scopes/step-6/+page.markdoc index d3e1d724f6..72ff42e695 100644 --- a/src/routes/docs/partners/oauth-server/custom-scopes/step-6/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/custom-scopes/step-6/+page.markdoc @@ -37,7 +37,7 @@ export type TaskFlowTask = { done: boolean } -/** Read the user's tasks. Requires the read:tasks scope. */ +/** Read the user's tasks. Requires the tasks.read scope. */ export async function fetchTasks(accessToken: string): Promise { const res = await fetch(`${taskflowApi}/api/tasks`, { headers: { Authorization: `Bearer ${accessToken}` }, @@ -52,7 +52,7 @@ export type WriteResult = | { created: false; status: number; error: string } /** Create a task on TaskFlow. Succeeds only when the access token - * carries the write:tasks scope; otherwise TaskFlow answers with + * carries the tasks.write scope; otherwise TaskFlow answers with * 403 insufficient_scope. */ export async function createTask( accessToken: string, @@ -106,7 +106,7 @@ const loadDashboard = createServerFn().handler( if (!user || !accessToken) throw redirect({ to: '/' }) // Reads the user's tasks from TaskFlow's API with the granted - // access token. Works because the user granted read:tasks. + // access token. Works because the user granted tasks.read. const tasks = await fetchTasks(accessToken) return { user, grantedScope: grantedScope ?? '', tasks } @@ -120,7 +120,7 @@ const addTask = createServerFn({ method: 'POST' }) const { accessToken } = session.data if (!accessToken) throw redirect({ to: '/' }) - // TaskFlow only accepts this if the token carries write:tasks. + // TaskFlow only accepts this if the token carries tasks.write. return createTask(accessToken, data.title) }) ``` diff --git a/src/routes/docs/partners/oauth-server/custom-scopes/step-7/+page.markdoc b/src/routes/docs/partners/oauth-server/custom-scopes/step-7/+page.markdoc index 4ac3b8a072..1f90027370 100644 --- a/src/routes/docs/partners/oauth-server/custom-scopes/step-7/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/custom-scopes/step-7/+page.markdoc @@ -25,7 +25,7 @@ pnpm dev ![TaskFlow consent screen with the write permission switched off](/images/docs/oauth-server/scopes-guide/taskflow-consent-choice.avif) -Open `http://localhost:4100` and click **Sign in with TaskFlow**. On the consent screen, switch **Create and update your tasks** off and authorize. The OAuth2 server narrows the grant to what was actually approved, so the access token comes back carrying `read:tasks` but not `write:tasks`. +Open `http://localhost:4100` and click **Sign in with TaskFlow**. On the consent screen, switch **Create and update your tasks** off and authorize. The OAuth2 server narrows the grant to what was actually approved, so the access token comes back carrying `tasks.read` but not `tasks.write`. ![Vantage dashboard with the write attempt refused as insufficient_scope](/images/docs/oauth-server/scopes-guide/vantage-write-denied.avif) @@ -33,11 +33,11 @@ On the dashboard, your tasks render live, so the read scope is doing its job. No # Grant the write {% #grant %} -Sign out of Vantage and sign in again. This time leave every permission on and authorize. The previous grant did not cover `write:tasks`, so the consent screen asks again. +Sign out of Vantage and sign in again. This time leave every permission on and authorize. The previous grant did not cover `tasks.write`, so the consent screen asks again. -![Vantage dashboard with write:tasks granted and the new task in the list](/images/docs/oauth-server/scopes-guide/vantage-write-granted.avif) +![Vantage dashboard with tasks.write granted and the new task in the list](/images/docs/oauth-server/scopes-guide/vantage-write-granted.avif) -Add the same task again. It lands in the list, and the `write:tasks` chip sits in the granted scopes. Nothing about TaskFlow's API changed between the two runs; the same guard that refused the write now lets it through, because the token finally carries the scope it checks for. +Add the same task again. It lands in the list, and the `tasks.write` chip sits in the granted scopes. Nothing about TaskFlow's API changed between the two runs; the same guard that refused the write now lets it through, because the token finally carries the scope it checks for. # What each piece did {% #recap %} diff --git a/static/images/docs/oauth-server/dark/scopes-defined.avif b/static/images/docs/oauth-server/dark/scopes-defined.avif index 125cff62c454ef3357739e3e58840cb8b095c52a..b9a5517403b401e8c5759d3cdec7e8699dc19266 100644 GIT binary patch delta 31284 zcmV(pK=8kufC88O0g!hBeVvhcdn0|NZDe6|5&#McIcjJ9p~3Y@sv zPI0>RqkT#;^*l$IjDo^d1%br1o?OA42uR67^h@yp135eNl{qV_m3SRd>BEwfC0*|4 z?tx==I#J5`qIT_f0(G;D3F9DpiGw1V>@Fe#Irucjj$Q1i2=Lg}lq(`86NdXcyp+?ZTtKDU@`b`N zi)C+JH#HBdFsPUEudu320eK5K-5tjZ@7XiSd@M&A>?r#}1j^;&=FbiFuY_(uTKn>8 zrDf(T@_$4=J#rG&^t$GR=!K8C55tb{Yggxj#p4bJzLGKNiXIp!;w%FlWGrfHm5I0Z zq{{Vqh9g-oj=I`fCOOLq1XpdnKJbX9aSPveQE>Yq`H5Hbq)xTfofm64Kw+lP+S+H? zyOg34qiTNK%`ga@g2v9a{=+GWSIbjP62R;6Y=1#R`BPW|*Q7xCK5OR4?^I=;{{*O* z=>)(C@X^}9Xa8$$qwhJ6dsQ>HJg=U3bl_jUT?x62&K?@(5&G-T7u^8NEyZgM5t|$B zwlL7!MB630HofnZ@E z6@Oh)99phVb?w}U$<%T9DU~g_Ak&up`6=^%&^atyTcW(Y;px48$B=NiT$m8C({ZG~ z4j}7XmZ2sRDgWEL6ex49gT5TZyP!jtH;!h$&2wK!_4r|9?lPUosfBZLLBpBiuG3Du zHYarHFt$4+iyIqc7Omr$WY08CEwCFx(|^o{l9!+eG!XN{0`tPBgK%HTLKWr?t2|D( zkq1M$P%#_evpG`ZDja0I3~?u2`ugzkDb6Odf`00>Gw4H7OB&v6P4^{EA<%43q6-w# z$ws9C`7m`eQ;G{+XpP_YTWkG_rqNO*?)v52T+)xPe#lC2jNmU$Aa=6ZZ4hErn15ct zdRYCvMbMZ!HEvvbyAEy|F+-r2yE6lY9?+2N*%sLXgaDSH_W_5KlWCJV9Bpn3wzd=}JCNmpdEHmOhNR}Do zpoapq9D-|yH<5puuSI*w6zcMb2BJH!5)W;^CbC9>uu)0zF5{HghzDa$Z!l5iT|PCe z2ew+xXO6dDi(EttMfzjtvhX}c$12Y4eI&=1&1o+vV7K$B_$R`a%W-!jX5<<Rew=* zsoxJhlwQQ1!as_i^9uChY?_Yhg+x1=au`VU;Vu2e#!d>*(DZ4#sn&4%$FFml&c}=< zPHLh^(LXc}vNo~~gCq3mzstTj=s~M)ENmLqv8!+{M;i^GotSl3VShnW7>c1VRan>Z zzp~MSw=IPWX@Gy2Oqy_m=uP_J>KY2$^;h+M4TXBbb6Fvmuw(+PMPVwas zk*PMG;ZCEP6V6Q2E38d z$Ec%_uCv0Qt8DDo@nkGB-_3w2`!QfpX1Cp9n7KNhS5P-dx9E ztp7~=ACJpzg7cG2lN#|y&IuyhbVX0(8XGl7s+@9OLNf&KU);n}HxzI76Q~gxpBY=S zsj0|NJFhufX+c;E*$VON0%q41YlN+$8Mj84*4N76X9T_|#bvY};$pC-qN<+J*S z$^t9$iQ^s;dw(#On-FJBFdH%;|CW%QPhB-ZpBSp7ly?o2bT_TOD}g)xBH)uqOXVLF zoIF|rV!UXw|3}e7D^;^#=*6%Cb8uK}Puf;Eh!*F@j4oRP0j|>zOl?0g(kN8;9)jA9 z4qYUxfjtoA98J3j+|hJAM!mfe@>27fwImrB8Z$D6Yw)CKx-1{ZG^ zv1zYvSBV`g<3}K6@nrS-ldP;4BOyJbUOlGJ5BX1bn%r? z7z_%a&9lm!rDQHc7Eo*MoBIcKA(Dy@q5EjK)d|mFYHfKarubn-SAeG@IfFRtSD)m`+xMDFKgfU5^$8U2#noJptM2x`s0vR zPR1}g^eE;=^|)h8C^Yxi%naTo-z0KXlGWR4yR;xAE@yN5q~5*EdWZz9nvZP-b0JSP zgn#c%oWX4Ib+LKolngYcY>RSn*vwf_Ly3N(+)KHuPzV>ti@6ZZR~8mOiqez#ZobM7 z(SMB=sX=+)m7}Uzj{Fj40;77YX?0mYGhJUp0}MV7q|5mFoK-3bg;6+c1*opmrVXk~ zu5kCZpAgfrn2D+raysVddLCRe_lu~~LBT4F&jp`xxIa_^_?)M|nO8QXxI-4tHCDPF z!#(V_bm6cJHs<(GUC705hpS|Ma$UO>U4IpdK3Wu%;{$(i_ir#_5q0dRsGmUFyhEL~ z*|vlkcbokuo5NT|tr{s6jNFm7Qy-)&(vwbA3%?3Mmw59Z+C1vkXGQFI}FP6Q%5}j^s zWql{w!jRJi*2q@w_1rc|&&@YqQlSe$OaLHQC#zvR+78PhYpy96)es zUIMyCy#(31ZcNH*l+kB*o%*rbLw^PV{S9eujYrlEYRX!OV8Yoo_sY{ssJOaNsg^t*Tg9D^_#C$ImN0j1sx zvfHXZKS@%>ta0=2!uBvBHdY;l#duLMua0>VVD);?*^@-yIUY}C&@lIUD}RQhlZu`s zI%w6;Q&_z3&Z=xcsc_hhyaN0g-XrmbaaRx_jh6DZ68{S=%Tojc$sYvKW}(ga4yeCD zpX*Yg&DGIGVOezMOBNRnY=7oq8DcQ-#1{YoJtF{*W}Fku>=YX%jEre3VMFm?-(uNo z8u^%0_-4ptBMxNsT7tO9>3dQ7)?#XVYW47U@2#kK8C7M9!CmM9y#9X&)S_D zB0c;@c-{}&XhrHYY3BO@X@&Wtt8Pn5>MRvBiZPn29z-j2;{2ZX%`K!Z6bZKY^VJRuYiT*GL{-~7&w(Q){u74qx+SLm#RQRN^ zYIbUs0sKVWN|BX|C-GY0rLkNlRUd^cUW@ z0iDkq+PkiNLYy0zh zMn5Ayo&W{HX`m#ZiGN0auOS_ysvJKijP0Xgxk2G(glC@1Or_a_g4U1a*Ca?qj zbBuRQ=8XxT@wKXxcva^~edyL=%m&AC3z+HW(Yma(f?4}1P=F4J+7rPVX5Hz8c+;R} z>s3US!*l$xfPaq$cu#~#(=Kbm637fb#;01l<8P%QgjmK8W$DZ`hle23V$}C3VrZ97 zR4t3+XW%6r8`ohH0jK?VVnWnJ+*m7F)YFsH{Dkk$u6HDHQ<$3x!MLjS^pmX=mCJ%t zDJgM}Sp+X9r|`K8T_@@C@Ss)BuJu_}g->oVPzbox>VIuDmDPQz^s8xMwN4Bc3u2p2 zOj(uWkl?-p7Jx|>a7vv3xfq;Q4B4)&Ik6`cl#(?t@q45PMviSP+FGy$G?-Q)dVdZL38s6S=$~?Ofw`546)UlXZyF^49Sg(aq70qan&) z7U#;6j(^$d(P*)+gvB1?S{)lB{d2v5mra2aPP)Q6qbRLchMo>Y-5Al1?5g1h1Aa;c z`(vJal92F^jCvH-$rwtwzVoLB%`}1}CwLkE+N=k@*sIK9PJN7nqj8y02MR{~)!UF` z38TzqN|XSYcG12cFL(&K*89D)i-shD7#{dSyno*bw@XZ%==^WU{B^1`71n=WC~m$( zt6bpClxoIagC)nEqX;%Xe)Ie~QYX!+mJ33>#2jp!THxftZJSg&FOEI#5C{?kgC0ihLqRc*HK9%pKOaYx_a5oQk$ow9X-E3G?NW+m zihtz?WZ=pa-#HgQxN-c~i@~hr?PerzOF$z3!-6^W!4z8v7H|fUK60jUJc=qqBA@Yl zdb;`?ZvUq6VvNmx-+0v z_KNVq24*uN&+Abg_9eGl@w+_|C);YWoqrEmfaY+uutF954wq5%(0yVe;kBYMxfPEJOJWwOvJh3II#$m6r%o1;F9eo5(mWS(XEZg@W-q*Qu2DFoHUW6 zRu}D1Ybh!aN~H2pSj2*SDYE1(?8RK-s&r@nrn@V)@oxHr8ny^i_lK8k=@ik=v42^Y z^lNGw=w9+1=@EeXIO@_72hXkFexdN3CoHnI>!@M$9(N`N0t&BJNq?kEzf8e<7$`K* zW~dKKH4zLMi(-T|e%v!5PWRPc-ZPDMy2_}3func!J>-Oq&&|F?biLe*=cYr4p^>6F z67a>u(qcBrAs4_%%Wg&E}IPyevei*#fTgmpq|X^mFLvOl{%2eF?x;ztz#4A3lguWmt+Z z-Vg)qKz0;a$-(3oWsi35MB3&) z`d7<$S$T11)OS1PJ2aJVuqoLgzrRa5&|Hp^j83%Eg|ojK%62W|LPEjX^@d+qCT zYhKPEu+ABK;?n`~u^AbjGCpoL=&WP5si(SNRv;l9!iO)UWT zcPMM=#a)qpGefAbZpyl9`kJ?==A$n%PFSj9>Aedf-xETBm2yssTTg=HKqTgltmd?* z!W|k>xG?iqqYD|h0|)Vs26O*>QGqGLUVS65q8;Q^Ktm3Jzwy|1QG$e4?nrjouWvth zLUSl^?kWB@@#r~?nSbdeezjNO>m={rJL-p?|HG4KCLH7omsqc0$g^ zUL($pXD-?KO}P(ZFb&&-YaH*ZX)kky3PY!EBvAP6ZHd}9rj~4mY1(+JGg=TrQg-%- z`d!Cxu6DAA%DI`(SHZ;a!h;!EnC__BXBfPpOnKyv;S-hMB7COH$;vzbsL1TxOjCOUb`^* z#T1Wf&E{m=DZy2V=(YOpz*WMpa>@g&LfR9Ahf|d2o(3PSh0Gc_cfGNH_*9h83@va~ zxv08ussZGhH0*GV;Lx{xUMOAX;9FzZ2?9G#fM0L&n1Adq2dS--%!6+PoZ8t~T)D~3 zxRN{-#p#{*@%9sSjZ%+!G1k@T{hx7n6pp24Pu(tR?{?fQ8@nQt{Kc1~Q7eYqx$J}v zne2M8pkl>L;Z0QHji-U` zUZ=gU=zmTNI*YukL^uVz3Rn@`ye&eK7CEHhqo+3RAPyd+$_IY@6}!tnW*t`2o#zQY zqH1W;kVkM{z-hZd8z3iBPdts53-Z!{Ts?^6&hNa%86b%T-#5*`W6SClCtwYI3j?Dx zsnK;A=BX6o6q9U54nejK{pc=)-G&F?{g)5=s(+SR^o3caj1KlOdXW0F(FxF zwx}*A1cHuG&)IcB?<_8OP0b6kEj}uoGafBA0(^?Oc(q>h!>L<}Zmql&mQW>J2ie#{ z^{APg3OJWyZyR5(nX$?s@t--FgWX7#-+y&lkJ|By+)y;9A8QxyNmZ#?YGQG`FqWiF znHNZ?g$lR0esh?kRl^qaCh|908x5DCBKUT-&U&Bz-zh|zGV5b&bpKD0{C3Y?$?K|3 zCk^wB%`8`+eY>_+o{<>blac~8XkU}=?;BboFLDO4SLpiy?(pMJ#5?N}xvXi|C4b-4 zJhzTPG#S6q4@B}t+nn=3)eR9hGrmMsKYGSAAuj;TN*9cpvT+{%+~|17R-eXPxy5}o zaV;dj;#4qDn^n>qZIX*C$KGD;oFkFy@g6HyuVK=-T^r*;!em~UJo}MYQ$c{Y_*>7R zcQ$Zjw0m%Ajf){)1MJo4)^0Ca=IFVEP?<~Ik&&WNtw*4F_?;zlUxjRSbhxYhtHjOk?dEcr%tKpA(Zb1R$ zFU>#W`!V2q$qQIu&3~onzw8J#BQw{=MrBk=_W$so$yU(My84fO)fn4Ki+%Ov3iGUiF@m^(JS2HZhfF`_Pkxp| zwTDO9mfkmNGoR(C=Rn-a*3Okgra%8S<=Z9K(k9()(798&E2Z_YHqMc(gZy&mZqGsw z%21A$sI1@}4pFW8jd#h1(tqH)M3Li#V8pCHCRtsnu6Yip_EmteurEfME1n5IO$Qx1 z|9x><3UjQWf9~87f$N33jL%s}i+O#FkO#zZB~;x5*`!34@`dY}xYUDh!WD)1y-E}A z2f-EO;ZN^rp4XB33wR@gOY3NkyYEa_)m?8nc+X`^&dXr-OFKDch<|s>AAUBhCLWa$ zikW?t0cnjVBnHde4|#1Ax|I=>W;w_Y+eBs(65mTmd=3)e|h2{r&CptZlF(t_BtyHqqJ?n2+o_}-yBjx-a>VuSzp|6KK zh*t;LVLT9vylM)nwJH8y0g&Qbn>#Cx9A@g4=y zyYZe=%tbGv-9wl;cSI6=A@0hDPX@aG1|hMa?#3jD4S%UJW@H#g9)dPucI@;km>>rs zdbE9wIx&i1ztNwwV=GVPR6JqsD%~-1g9uWO-`qVN-0Yydap_v`?9) zux$L_NKkg`W0}bx|6`(PNJ%3;)?&F{Z4Q0ehkngXMY0_|s3jrGqPOhuMQ4mJm-Frs zv4sg!>VFq|k+s{%sh$nSm5JD2Ez*HHNCw~YvG3YNXs|-3U&~fnGET72G(%K zqrOyGa_T)&HpFt+{@U`4GNB{@tgv@3e=K*M@_+R^bhL;iP{@E>lQsqpTzZp2ycZql z6Jg37ZteI1&mXy4#7tDX{aETW@6{ZJ4qJrwJ64mEG<`)??G!{nkR7bGf{#r|aR z*PCn>g}+EVRxPU9&Vf%chl6!zA-r33girZF^Bb2aiDU=SzHZCqiK}8X5j<7walyfO zl7FBqh!&@ODwI+pBvfO9b@j?C5=7EsFUdr8&y4&Z!IX-O>l|Y+7)8R0f|)7Qr9&Hd z)yV~ARzDcz9Tfttmu4QzVN$`j0hU2`LlIke*}sXs(!qogrFNdKP924a%~)Bg07w5T zhX?iy!t!%E!YE1%g6ym)#WjMVIsFE)e1Bf*~zMFs|#mwZ+q7}?S}7O5JVigpi+;M`$A!sP4d9{ zFcZMRCMES@(l%HvwFoi7Nk}`*dK$;KcLGhTUUP!Fd5ZfC;_f0%cdr*l_SI%se18<9 zQp0)6l{6yR)35XqZus|m+?>070Qyk!!U%XR(=a|T} zF@KGdD9B0WzEEfn6hT)jDJXdYuPo*DA8BDN=Q98B*059bLHXHyX78tU0`&Ete_e2{ z)uq=4UIJ;-wJL$xjDI_kMFp6ncw~Dbd2h#GH&CfUt+GzMM>rD( zvY`<^XJ@Q^GsT=e+QKF0m9u*HOg*D~=RQ7du&@uqt2|{;inZnjMoDU#liqSfK3fbd zrjzN9$SdK_4Fx3p%Nx$Xh8L5;9)N#Ew^OVHKsnI|B@gJCaDWo}f#s>k&M{_o?e-7z zdv3k7m9XpajnJyf!Ko|LFkaIIw>W0#7T{^Wj5va{=^w-msd`8^58}guJ%akpR|N9Q&Cs zp$cJ6Zkgn^ayw5=6a1K#3KO8%8yLR|{MJXwyom9Lv`2jO<{LR35QVR2ybpgD4WDyxxMnnL z)P!ZZ0o!}$#s6O-^=K>yuLFD62b^)3m{3*QRUvMNC-NkP|CrPZWoU)qZTiowO?{&f zI)pj3iN?M&j1ZQkd^SLWZ7B4`aA1{}{vaqS-Up^KN|jaLKO2dihQ`5sowO`|v2m}4 zB>RQWQlY@ZUn;6_VorYsr8IgK6c#vjRK3F3)*x7}lO5&02^&|fhrKDqUhSGUdzza2 zfS*_P4c2&T6LL9dp?u6mnxLI*vY#z>tjAXzxLm&oWHFV5okr~dk;D_)PHOjsSflqj zHvW;1N8DStg};$9K<3Gc>1x`bZ^xrW4z;ctu!Ha-pSohsF2R4@%iQ1W9tSP41{=(H zE_Q(`(INqT6S5}}TVKzGoEfNl0$aG0OWw@GU{CQaK|;ZQEh$irb zK!1oYwW;AI2{V_GxTAN9kWl~K?GjR44@lJN3A;e$;g?$^?tT}gEI*qG#bp#>TeakX zqe$&i2=2yRm;@=pSrLn^^`At-R6E#+kL6qWC(>>HYhQ5-|)#GuJ&TUMyWXC`Zg4!FkQiFgL z1L;4J&s=qZ<7y3P?}N=YsCma3h%fCi)&t&!?q+{VRJt+ufAp>26*w=xa>3YLEzr>h z*3s(bP$#o0ALCSyVgb---om(E@gaja*B9rHfvZUG&=E-(z%}(c_ZjIvupdv2xZv6Nh}8-xgJoQZ%GT=m0N$FK>XA?ZEe|@MBEo-;6bNUH}EY+6;8K- zD-;=)kq^V4n_x$BC<&KYV~+OlwD!lppOqRq<7saXLJ*E|9n!5sR$w6U<)L;i8fC-B zT<>BMs7>Mo^$n!H^`gdsvZiFl^%Pn)zT_Iuf%{H|ib27FlD{@*ix8>C$f%I9ldgYB zYcw@bW@RdCAO=XF#AZ&F3ZFkUQ8Hf>@WIU|6oQaNet85#Xg_1jw=4lChC$*Z#|G`> zBnv#yHh}f6PrE-W1a5Bi`#))R-JnGch^-l8kgUL_I@Wdwev;*eXbevWqi z^O*PPO15ZkopOQ3lTJ3Ps-+6j*`I&siwN+knp~!IzU*}mhS(;M<0h4>He^sUoigAQ zZeN!ZcsXE-@?^U%%3@pu(DYrCYt;8^s;x6ZpFkVOlGf`qgLZ$y0Ed~b$r7&Q%Dc-B#iV`%F&6`lg3O32Xj8UjjFP!fxsmRjh_eTp4eyvMp@ zlfpwUltf~hRqhc!U|n#F9cjBGv~dQBXYY}pQbN0CNUcd5rLV`yNh3WDHWiMd z8G3!%IqTj2-VFE~n{=JrRXcfgYw36)jVl6+WIKyh|8xjDn4Z}j%YuJO?zp#n7&4qS6oanHONG5GCxK zfQ(%z!@$qW30Ta+H3i8%QsE`cUiwAr;p2MCA3tosL*M3xiZZEP+Ij_Yv8v$M8gaAb zPl8WbaLE%C^nrG&N}7L%_BeSoh=>g{eJ}}Uk_iFcyy@+vM1bF99Ao&Scxwjef5K|w zRMrln;QhN|)^JkfpqhjBDWYGxVp!W)sz=q>wDaC?_BEDJ%ZM*P4_r5<#ot6-k(K1& zd}ecre;hk%{88WB0>C&MRwdIYXyJcP#iRFt;^6{aDDH$;5AGWy@ zZ+d@1Pa@a>VL3&7k&O+Mlq>V9$hBLhxx+VLTzJ3f8``{}W$S;9iL~A$yINcq9>X-j z>7o$?%upbO8*_hzX^I6>L~HGF$x$CN+dtz9^ebXue1eUw$LXq$gRAohsrTK^IslPw2IZBD?BC52k;z31kAKT^VLml->emoeoS{L?D%MEjOiLG-0YXc|x zxw60ZQ514I*b+4152g?k-}C<6Ff(PAj!(B}Pt@Gz-qK)QLDXj=i~s*(4K+J#$A(Rs ziMKl_F)M$y9n!pQfR%yvJSl}7*ru(DcifEqFq(9J!tdQi#6vD;eNQo}Q= zd*~mPYRr+&zWrDp(;vO`EuM>Eb7iRZBfaS7?lZTSyJ2oSrnqHaMo=w9)VS?#N1k6E zQwcvpLbuB77nBRv?-2gZ8C<%-9_8PRPDwpZaEKWBwcs`fE5!;wc3~TgLDzBbg8Nvex2Io zwtzo1;@bd)h~rsVw|zQiO|=F6HwSJlxr$%vx~Ci3^%*cs_C0iJG<9!wV!WuWBAS0S z_x-vY^(e$2$7J7d=)Zeb)GkuV5Pk%76eUrF>4m~D047kG&b-yvROGaZ$mT;?6>uhQ z2TB0t|8ij{r_vm>-yvbsk1a%+Kz9JsUu+0GgkuF*qX&swI!{~2{@tt(PN<=GW8$+Z z+1noxTiTr^w7F;*R*Qrp}+8W4ZyS;W@q>|E212pw$;29tK!k`T<~FN})Yp309= z)a@x{mW5$h%L?5$KY|?1$v~@Q*htQ+CD;mpf_EX#6MTW=V*`LP{(|jUJ34)cgw-Y% z8kT%@M^_DXLBy75%*KrrXW;P2-C$*i%W$G>p5tGE1PxSv^N8i!$q7$m z=Ut8$&zrsw0yMT^lRDP71r$wHz)u4}qb%&2lIGG1y0ow~a$ClnB$}IcVGv-@(=Bi@ z0kC9r;6*0V-|B^Q&N8v$K9_%Ln_)65&B2W3plL%DNFS%?Icu6QI=A*+i&-@5%;&ZH zK423oe|a{OV)CtCcj$%%@}X1|3SP}3`7-k0`0%E z_Mp@cf&STBX-$OFg_r@hn&8!F<_Oa*<9pi3w}cP0-QTGBe2LuxFVcUP(n@&`Bx=sP zevZ(~yF2@gx|EyCeIBK}YSO*d2k~RR|Dr4C8P8vloBXbHD~D83fg*6){03{5bvwRX zDmg`N2Y){$@`|yAt~|gjMK#bft6*Db+0S$!Rb%@lkgVq;kgF7 zkd6GZaCA$7=uAM#Qqg~vyQbqc%}kT#*AE|}<-BEr*XNaRz*~M%+hb_!!SntSEbxzT z*~W>oEuSg)Wh=nfqo2z4&%9w9JQYr!pTu568BJtuoZOwrs>ZZ~xu(I(uc6Gnhp=b} zm!9DwM_mBF(jCSEm`K6wHZ-I#bFl7rW__$3$?mKdau$KI=ly^7j&@N_?q7``Gp4x7 zL*#^c#|NgQBb)r6+PTvhn%_Aj2AA)DBdoj>&*QbcgW&U2?)GE`CTuUqJrF7gOw}t` ze#%6lv26?0lw_AziyJJV8gL^^Du{zTN2r6@7%J^(p3@TtSUsE9M4$}Gl7LUxk(j6* zQ@C8kHKk#4#0G!XRd>?-6^n*B z<6g`q=>mTzBbZh692iq3TZt2b zE*y_fR}0MZoO6-l0Mu)L|F%Q`?(;TBmVbOi;^9NT;<|ugUapY3>N6`p!7xX9*8|H z`;|cI_?eU`jbIYpEtD|ZgEWwhYC)L;vhjZ**L1lM{z&+BikvDU40PGhMa(3-eorrd z$0VW3acf{Fs<8+g9GI7&AEfxVDVe=jPj7d|=xI?N`2!+vgwsrAIK@>Sn`0ph}#G&(VLU zr&{K#*Km-3y7UFjhk1R}kXsJvw9s(!A{EBL5VmYomjs5b6MP~ja_o_?uD1>?g;^o3 z-83pdt^IZE`;$6R&VMH!A%v{OOT7mq$;g~!UXpOnHNwO!SX|#e1l9wNuxU-M=MSAo z5}jrif}aaW@bJ;5T0A?^5OLFsq^9{+M(|Ns7Daj>Z~DIiF7Iaxp(h@SOTn+Pn22EA;!HIf$x7^);>ldfpk|rgh@~sPC^6>A{Ta-&@i5^Is>X?`FEC^92kwfvOaawvH*+RNL=s zTC&SwU3jy`DOuig09}((;bT*dP5)at%%P`c-P^xb2@># z){C|3@@U}M!QxXeFlwi40s6jaWgXKhLM_K0x4Zl(w6p1<^a~I#T7oyfv;{CWH@p(g zqSqDxqeeTm8XjoJC0m4Hbhp+47Cl9Iuf-ZLTH4pmKGzmg zn!hyQ7CpIjlOZA6LS?!qYSUGhgoCXtaC2<9^<%9G?!~u8>xO_rMJsg1lSP7kZn0pB zKOd$ZCC{U2sY8p(z4CpC{hnh@xc6-mA*{EB!*xAR5!A*5Mbxg~b9T;M2_7a$#;3Yck z$8cT_zzp#m=LD+2ky;^g(CV3^P>i!De;u2*&`6gtM6fsX!&1pCBrwkMonWo@zAKk6 z6}_TA3hUKztd;@8%wlMxv8Pv<_t@}7L!or>bk}MKI?h^v84Qz~KHPtdp43;&UF^Q# z!+nyy7t!L;Z8JI;heZ@4OCTGc8%9<*J6%&|M95~^szQ3K@xhRKw`}E1V;Wa=@!5cL z`U@^lC2+zjAM!MsVe_Hne-#C#{7Pgqx~ImUSUv+RU2wDhv)Cjb zxS@A)dlk}I+bz>dDTseJdzSnI7o11SVS-%SLPOe@%oLXAumei zFSpZAf}+g?G?!HuxLSk5h3ITVMP}u*6X*ED&vngfn}JcVp5%O)$}1Srug1~=(DId_5?PU?SiLN8yK`Kt9;1rQF8SFS$8 zo}~3cCCbFFro{;4{ZdEvUoe+rle80zcBe)9?O@_CslI*te=%%POTBNk-?ATu1o_FLJB73{^GFTgpJqygSm#MCq^S{wbc6eD^pcjh2 zQnsB86q%D!*SMbd-tN)T(L%@tk*+rsec^m&}uulSEi8w!Jg3JHF@d)O>F7~$2u!> zB`|_vu|};9Lr0dya9GzGr=mq;yU;lr0OA6v_^kPGcI83H|a*qi_wik>_JG}Q= z5R61^8(iK#nE_GHCFFH8^qW|}z}mWsT&n>5HC0>q;qf})mbwDiVkbbAImd~2DRc)) zttD|&4hEY)s0r21+d4;owBTxWRQlIljB@wF`*b;v! z3LkjuZ1W{p4cEH`vfui4JU^6J9|6WCPqpK3cJfB-E&%60OdVh&VdARJZH(IQYHv!9 zhDtgq)VZnf({j{NGrSOEPcPl;y=wX`C&xi2tejTOAFTsOGfqy)-&YnjBg^Byb3!c# zm#9#t*${l;tI5NB!YW?X3qd)a4aa{WZF3g8^yCgF*rknIDbX`#x0-EjPkbNlsc>`? zb2feMlaL8R5M4pxd2FPM!-o7ov{$%WXkY%YXAW9klMcQnKsPUE!|L#b67!IL>Fy%g zp_uQE-990&G98qJAzLw}Hn9rfo3+a@>Hr|-Yk!lEUgXb~Z!~yFt6I^GtgC<8QF?Ra z?Ee2#HRP>5)F4KHeK{kD7k}I;eps~73ol}J5h4aP&Wtvyg8~%3Lx_UeQdI6>$;~~H z3jh(L?_ooYjR#|A>uoAfM9;p;3a{StxLQkX;o+P(@|{lVkxVqO;)x-bGu%$=pG`0y zz}eFK_tCZB!@rsC&QT9$E^mK+sN^0jvWSnbnW4XGHp(!D;enJqS3xP5?~>qh_>l-( z*?!fZEM*>kdhyhz>bte@gtLvP$8IGS6v0i6dk?RSlu+c2i;~$pY2S`)tIRKrvOr{C zbSnNABUS)*;V-sdpj34sN)1}oI{K6sGAX#ka7@5qOYu(=%qE$n~j`^s}H>?k5) zb*3HiCvB~i-T3w2?-b;kYZ#qa8-u;aEi;&?UQREUiTR(i3RKg+fk<5TpHs~f0P>js z7Z}~5$uIb@H*j;`=@!~WwjZZhQ^NQJ@qiZWa)_~S!rJC9b{0${Ax8>0>e?zU%PtK- z@$eCoH2eE)2RJL4eQAHc=&~-Ij4t15ctNpj5O?)p6fNb+L+Q#?MFcUS*SpQoY!kQ2 z8)2tTDy10M^=X#Oj|5mx9$?V3P^b52$oBRVpj#ZMG`oA;#}Fu#iV!TR{@V-9sndhY zu%F3cdFX3uazvbsx@$L%(&17zTk|PJdD0pw&woRxS( zi9yJ}NPK`WjIGZl@q1Uk+AD`C#DKQ(q%8gVE4S4cBHICb+SQ@!M)j(h*lw7{IKoJa z{H4+6qUm<28xaSg^UrNxm;XIZ?i>Nqg6sDigqUKp&?n$zCcrKA=ue%5!zhWN7nka- zW+`pT)?g1nO80+7N4JGWh03N^1p53z&d-V9KV#Gco*p2b5R}q@8450-gX`s=aLZDW-Cy zbl#@?Ux*Wx_HUKUtf&m_O&{JpsHg+Wme^+zk8l4m7Dk1Xwc-W-k7tdSqgGeNjRO`o zSIWu|QR;tzu5MGR95p<4xC!PeI??qLI5^8}jpDj}J{Ei)^XuPz2tW{i-+S}i-rQRo z2E<=#&I?N**)E(OzW(5>=?s5PUaPug3x$xw*FnVlhNZf=Z(1)N{OMah-U!1VIrcG~ z%yxwJmXc915^e!hGH9abDvY}^(Z-%RoP=vmC}Dq`pkiYy43VLj#Ne+)f}jeibCu$? ztVKe!n+q^g8R3JM-_~38FY{R~d@9Wmb;}$hlBgD%vs2w;q6t#K5~#Kq7_5#)4D9w(!)s5bhY_QZM4$!_al%d=mE1 z;U#}JpEhi-inlIFg99ecT41;Lv0i1p$v>=lAwr(AEj8xP1v%Y5VF zoMrT<8PiJ)6F;-A+`(HGhuo%};Fi<(yH|fLsh0f5JOJ*D2w)Q;8rLVe^0fu|?MQUd z(4Sgaqo50ES}jS&s>HqAa?JY;M+YdapREBUI@-n0=)^A;I-Wm~XZ7DINt?f~5!|FM zTw^qq(7?c{puwWU>Td`u3pSEFYHj#APt97rr?==`*1{K~{NgjLyv8Fm4(ZhZh+L@| zBxxX4Up{PnA$u^VY5dP`d3(u@(^*JiM)j`C%3wmMZH1l6>xLQ{4!*2FHg4#^EXz*| zcM_Fu+SSGIqreJFunATWFCL5EBB+X3%kzosxAhZiWMBQA^aQh}PNxBXIzZzhm`^wX zM`5NK<^q$4C1*yd@RXK$sFCJqNhVv2eDz@A$$_4$X?KrYUUk{ImI(THoIQbaibB0q zE5((O;+XusP_m;Wny`s)_U;tscK{4&f)cXP#$qw_gZ1|UIAex<^z2+W4h4W+JLz+$ z89l1Akf8QVez6IO7wkuWxX&aOZ5zQHT`JB9*A97?f8nq!8pn7RX?X~(fos7_{Sk}y2b1x0u$LI^~E+D)Yyj8E;q(N)+x zA5gV#?2a=i2}x$p!jLojPb(t@la9@5t#cL!dOUt=6&a6p!fX-}c!D!jLwv5xnawJN ziVVwBjd`^sDsMVsK>e*nEm%W9Qk(W;$wo{DQU}3A zv1j0$3>$S11A7exN=t?P&()qCY5aTt!^r4aG^|$BO6T=Tt%WzFV-eQRx)-WhAX-&o zseA09|8F0`&N}wfG;xtV)dDRj88nLT1c6$6(6e}}GbS#Q2Z7A}=?@YGi|ot0eUzs; zR3w7&kP9Av>67}?cF%di04bpFw|h!_Dl%?*hlRY|Yu<-=q$0;fhfpaM+0L}XHT&?m zS*mjWz;G_K%<19%ZKg|5RA&YJiJz~$U`K(n)Rs}kd)-<_YVKKe2)DQgl-fKH4byVA zXGUmc-r}F>G$xx$doGz*f9nJwo92=cu!HsL0WvpLF-?C~hwcF$ae^ZTK3%xurscTNwvr%X#R$rQ%nxY z78UUMHs?)TK97}tDmSP~?(iaIXA_$$g0kO+vW*sO%UaWN$#e@bS=8tZWH+(~F;M8N z0imWo6@2)INDDRs2>uW}k-n~yEN3N)ov_sb3n19Psmo{FD0U-hdw&oeGD2s=GdC3E zXpXA~Cd~4P7RJd0HL?6 z^u1_c)s5tt4=BxZMSsU0qPNH!v_t;fl%Uc_1O2VN;viGDCmo&USOT90u##nb2x#W_ z{0N)Xu@p<-szRRLN%R(R;kqIl-k01p0zB^$Q^?b?dxde6y}_V|M&s^TpC{=`;+1J= z7q_7`DdSq-!@ssGv4jjdYbV?C&RwG&Nij4DikqB8h^0`3pnph{zg6y>MNScj+b`w} zPfIVp($#D+w%3>0c0@e9gR|#r_7R1T*^CrkKN@qjv~%fo`!AdWyiWKpQhHkAv7=bm z!BbH9kDc^0>H)mmFTKE&R(2IvA_X|t*Vr7^^DRBDot!%1?{6sTX?P~P-2U6`H(CHS z9)I)Wbfs}O!GDqT0KFD0y0)~b4i-5z0&t9&0pQ%P;x@DKiBC%*&#(#W?>ai|KfoXs zjuS*6cBYPhQKqRU7WR@tq5VJeDN%((0KS5xCQw9d9zt6IY0IXo>}1VFaIXZy!m}1! z3wlvu?<;Mpl6di64&7`}0F2WxOF|P`X9&c0glQUgW`D+DlO|JtxNbK_oMm&5mgfeUr_z0t00Z&Mz`DAk9X&rv1 z+NNO+N`EUEcY&hCT_8X8seRlNNcGSleiF=mjGRBmF<_~pdOCM%2AD`Klitl6h5{$c zLrwdm?;y4(K?PS%o(>-61_(7!220#ZyYbane5zt@qWgkO#Hn1HNigY%hy_rAkI6Zf zAysh)NL8eMeHa|Kx&FKF$RvYFl<#2a#YVGwaepapkA1G0Ag&h^Nhyv&-=DAnOGto7 zlwRe|Jlr-)qXCL-o#QUjhs)j&U-_y&ZzsB_@cI&Va8peOw{@i$7}&DYv}2|=2W&tV z^ACvXKwSkw>I%ZWO_}45Xn<*Y;yxcUmBnJQ?7~HqG*(JHVmarKgT!r7v4p9<0}~d@ z<9{^Lg$-}qM>Z1+bi$5pb_b|uZ_oI3EG)M<%&yC@>9*v{VU0MlD)%hUNJasld?1J; z%Lc*vo-wQ1OkE}Z?*M-rxVp&3gieV?_X37)o{LfG06rB$WF8humS}R^U7<*8;W5E+ zkuO64(frhdDOEZfn56r#<$-9z-0g-fP=7^0>gP6P6hm1zgtv(g%gq%-d=FX;oS0gw z9PQI%#-cPIX8uA6*5CW#ZnkfiD7Oq7~TdkXkN=`hM z8fO;7EUr|x+~ixj8u38xd1j8R>gT|eg<;P;I{FzsDCg^ zc^6;p7fI_}NL3MbQ`L9K@ImkkgQd3?c}d(icjV$dv9T}FhuN_&sJK+=!>!QZ6quC@ zd%>@GE-x`^b=KBz9}J zIuWxm!Y9J~F20;m->3C#5pQgAm4Ad;BBj$+ojfNzFB&)eH%YYF$+?=lO&$K5`fi(2CO2=5A-;F`2j0c)N zXI=P9zt|bsf=m6D`qzkmrkZf-A&B2_xrWl-<~n*|Dz7z>S_oL% z?;XH)W0iKJqasl6qMO0Z#|Rm85g022D6bt5bIT5VoOkE*{d(yGnxUsjxQ5XXXp8YI z#;TjQn#Bv&)MuUU9y|9PSQP?Uzt+*`9I+~-vB0Je_s-h!(dCT=?9~MI7sT5DiGLaD0{E9>JZDoirXJXCrry_hsCJ+(<+Q}>#wgR8Z!5SH z4 zQU;M9SrwHsgJJyix%+35HIv+ntU0*coIM1#Bq+1u4ygu|2+0W0RDbYS9Dn0CM2rL{ zHGfqnpW>Onb=YeYNX)moG&~0mt>&^E>;;Fpt6Ui@g+|AHXpE)yb8~_uI+bc%Y##44 zi?#jbPFKVm-My;YZI%|nJ{4;o6J5?ob}$)n!HZvRNzh z*y}Yq+?0=@7YXvN!+(}5rCX>bjA@7D6Q@7cTCta<8sN}A^$!#^m4oxs{`oBvk;Cxa zzt{I}L~AF>=N@N-V62va<7D%?HP+BOrgb&ORZnu34i(nh)HN0CCE9GPrtrGV#PO`k z*s$BL*$dTFQ>3ciFhQ_EtrClWffhBq9t6?qz`e4qyTsPtZGV5M)MZGDz+%KCs@%^) z0xa+qKo@w{c@VzA&H0L=D2>BC(&bs4lQoi+0jI#Pgf*;W78|XUjDm`cnM#WN)$YP5 zin`rzQ+AsHTa{1bV2z0sM0a;vzMYMnIzX^;Y4-vfY?pW^QTK^Swaa#)fPE z{^zLr^X>s=EGdgcw zKX|`GkB~>Zv&dp94kN0(z5Wx_+LQ+>34yC1SVv;m9j#{3kfnQD{?W`_Ln!5=Ww9Nt zX^qNF<=PaYZT1qH-9zj# ziLvfVUx>h;;Rn&p^B(nTbzNQ127ePY?o~yKs}PhyOZ6g@JGHPtVz#I%LOM&}03Ckq zys6;Wh<|}kE+B_-CFHj(QTTYfHYc*@s|yh zok*JpfPWyhH%6fPkfScurh4a?CgXaTb|dg^b*ZkE$z750sqq?O4slAwjL27L zi!Ujm*{~#x6ZgAJGeg=_ULV(^ce>l<6s|VLoJVA7W`C2? zf!j4v4BvIwAb&S{xx!`LFei1!T9ig2@1EV>52gxAFfH0{FV>{a`qeZ&&);=YqyMK` zqBOa1e=oq{DMGUua($m=oz=~#M0}_%=p)Ir*|ulc_$XAS-~B^d|0ytctvm?@v*fIh zRrJoDo^=%SQ7?j-XK28WFE+wi*?%(@_bAgHtPz5;Ke<;$4=$? zdtJCr!aZG5KyFUPk;JOf=LnvHGMR>!HQ!-Bbtj-0gaSsKoSs23@nIx#^nbhpA4i;C ztB<@9A)o-^Z>J~!33@Kv_HzIS4MX=g1Rp*SYS9Tu2R~}(C=<=C;(GBQl3L8bcNso! zdBu@B3pc{39Y}^L7}fKJE}e7R3k_*}U36x7ZKbpwYIqI3c4sS^8se6){|3#bkFqr| z{YZX2%bJq&K##_C?Nfhwk|Ce1*99L1E#iUzCgi{iY~;kBeCp3M{Z6P7z)B6G z%t#P`pKJsM?o6yLB1FyGU^%?8%kwm6tdM7|QwP#nelb)gTAb0*q<=8$KE(G@silHy zPH+N5*z3FqThaX8Tb&yt#9q97<|aNv4d;S+Ux8 zy|+HYZ%E&vsxPQ$s_S=ck2W+#S%x4%_h^(bwgIO^;%Tuo{F-NfG zPW3u(>Xb!>T#fs02!CRds#XdT&I2W9G!v&UJFs|Aq6fn|o`k~FHd=hXOMUTEQ;o>c zdw19b<%(hV38k@3G~<>^f?S+;ZZ}h>+%%GrLhE z;y!*M7iWDJSU8vO^!XzBET=J({NmvPnZjmUA*epyO+)fCX@6!)l-QV|Atp9zgCJ~R z@^=M`7)li?|6GgoX6;nfQKz-%1|zikgiq|ac8>q4R>m?Oj*;wgo*&L_;7rG6yot>4 z*S)sDAF4*5CaGNFZa^@>c3Sk7SX=E%3E`iU!AT#>($beoOGGbZ)*&W`<_?B#zpRt5 z#ut+;bE8s5Pk;LlFv^}`neMejSbn0*JNNE#)u)@jSxx!G$@KaVB!Ht-lB>hupAuiKMmxe~8E4gMJz9XxgxC67-4u1)1Tzb}Rd3_=Cr7lSPu{%-J zlMKNM45zIAN0uSOU^gat0XJ_!7@u_1v#r7H^xq+`Dv{u!AqmY+MFNvS=~2Xvi?Kn#F8E$|76H5wUQiRceIqVULzagK{zzB77cyNpJljAyBDmUM)J=1c|fT zZzT9F41a)Fy3i`P__ScrjozBl{KDud(~l*;*mQleU^N0?JdI~fG)DJv(nIiVsBuB2 zSFl*pub?{H+caL^gxDq9&!)r1&IhE%?SZ@}_t38#^F!gmL?A;XWR|dom??hNlIS3o zd?zKLoW`c(ppe3~-0+_Hao95ZbU5|!I@(x~-hVu3&#O42+FK!Ey`8@%eXTx}aCzcr z9PxL73Y?^X02=-ifpv(QL(j^!1{{!pVl&R&0RWvpLmV~{wWx8A7sZ2z-K)1pMQY_N zEc3ti;>sWjz0guP_`)|`#HCF(=A`*dmdEVTl&-h2jLf>ocQNu##$lyjV4YOGnY3sC z=6@d`w8VA6Ub@OPT*yX6Z+)8qb=nprn%2t%BE)=Ue5G8q|Gt&)gnS==PhUvRKiN7$ z#94I^xSuN}%+7m1-Yr?Y`Mt4U54WmuzSUNtn}`~bt1N7|&?uhC`8Lxw<6SW+kr0)r zRZU8?4p4Hvq1|GE{;r-amoKCY8kF5h$?M$AbbS8$on>RK7_X_%tT?KAvFi>%Dj z%Wwo1o%wlu_%QM`#?q=RlYksKr+**T$oFeu<#R5(d^2pL=MhXnbbhWD z@`yD1w@Rtm(eg+WddV3T4zT8&!3OnSE{k3ZCB&3~kU+i|Rv64jDpV3{j(@$HNc^%e zFLq=5Eo-{`ZtLukKr{12yA`gwcWN`UPME$<_;$iZ8N)9^-V^1>F>&)zl#@Bv6wZO< zm%jU={WF@RcHXNipOA5AX!Zo+nj>SP)nktKgu1Q{WqhB)Qs(~V^@eXG8`|e7p|p^y zgHanqlMh%1$CoAo}?0(|~ZDH-gLmoaFkp%6BF2~k=xtyl`STx$6@7Nhw3N`GgCt8a}HDQR?C z6o>m4U*YYUIn!+-(iphQi&VbZFz$&n2ge@U1y#wWpOu`FpK>G|C*v6upy=BKUJO=%Hvf*`aP z!zP2Qb?YFJRTcly|9?&hM72NBPm*bUWPb%lL9`5o1{{EdO0?`>*uG7bA&Xj}#&K0N zOTaQK!0D(2hbh}{la~%lv59IGuwBQjbE5_I2geL03246a7253|ROY_s zDjSoAD5maK7b>a6I%e%erR%4)M-5-6EOXztm5~+0dE`f+I3El$Gk#z6CV6{$%fm^L zya<(evcWa&j(@j(OHu#fGVpiueJ31CiL@-eaezE2-`ICWE(oME_0657n3w#B=HV2@ z9N6@~gPyR8Vva|VMCg$eVFt6kF)d!icVj@>eo5)`$9TKd%N{Mj_a&xpZc&F(OR+7hZd;dZ7p6lbfTsRpIBFDq+Z!OMXOO)F1217!&_ zsst0!VOUUd>+pOajoo)TsP%*Co$P$wMa4^oX{UP+{K$X_u|l)`G~*_xWj$f;sybXyY1C`VZLy-(4Xw$K65f|9{tVQRy+WlPSr!m^v`Gpu_vAZT+VwR)7@BYd%GH z`4^zabmu8#wn^^xvmL`04;6)%sz6qXc+&O&r}1DUA+_F-hOz11scGQF|b){ zT&LPgNjHl7Ty0~}yn9IDJNV~;W!F8^L?)OCBn3eAIJe$pZejndY$_s%`-&hvoyDi9 z;IePB$*2%~9{Pa|kKB5j*MBrV9PpbsrFey4LFa=&NIUm}MVrs*G`}%I3HReMb7Q%( zpl?ql;UI0m{2e0ZWG#Yd_geVE&1f5!hFYueqMM*VRvcA8%x`vGjN;Q64RCv1#|8C@~^K@RLPwM8ihJ=O!BzX{)poLe&zyuI5W6TnQpH z@EDo>MUlU2#Vgyx*|+Dx)Q;EtvaPzXc4o7|42SNCzpyGh)$xn0Ux_^fXmUU}qfJf) z2>m!V3{!@Ln1i3&w|`KG*0Psxm`pJ#68N=oP#6lTR|7W0nJ-tru{4Hd-NVUAjw@?- z92DNqPccHe{O8N@Y0F>3d@rUb{MGDe$jqQ<`CZ2I(_g!%aN1I!c`Ot?3%*CrkB0sZ zMv^?wOQis~(Zo$@MfR_Mvr5maT%?Tj z$${m)g*>Mp7aP$9pC~kgFr-}98lBinFbko#!7v;4uzux`V z^q-8Mg6Q?`0J7y)%Us-Ft0RG&S-9^@>>8;UJ=5gKVTke6dlNvpJu|*{# zU|~N^YeRGhntyzLAPesUuwPz;&plDsfi)NW%GPl(gtschZNfN5+u}B#I?vRG{5|l@ zD8}@;zo}|ijd-KaY=TnB=qz_@lrs~G)$oD7L?`^ut7)^&+{JSAx$&cYkn7vHkWOOO)jnN)PmZ_LQuvpenCplA{U7tdUZGY&j1EJLAN)1Tu~WL$)2f3tciEb-zIf+PA&wu zm*N@Y7mIvTHBY3n3WBDQemf}>ZoKVo2Cm^+j0l{a@PuVi1-}!5Aox%M_eRW$`le5c zpUJp%hkwi2kmWOie3t(@(6$)PJ~lP)8HUer24|W%1ymG{Kt|3&Q!<5~S_wQTi8$}e zEl^PDG(>fJ0lCV;f<^vUuPo$9Bk;}Xi?A@&MW}(l zjDw<6&!yrZ>q{vg7%vTC(HAf6#jLGpH(&plJAcn0REZ@FS;8%$&6g9FM(%%aPf}11 zm3?zDoyR>$RP83kF$I}@ftNLkav-(;c!03LC!R=MbnUXGN%AH=fRXlHRkr)Nm9?_6 zrj8#zuEr%Q`Fe?}Z8i=6(_4Ud46l9lc_dyOm_<@#yhM=ED31}C27ffkUBZQ+v`%^GyE;ES4(6z^akk)E9ITkw z?k!*&5d&i^Q#0?w-{8h!a=?6b4z`RJ@EO+eyO5Axav&-i5Ac*?I$_bcARea@B=8M9 zd?a)i4NSwH*thZXv>B!>ds(hy} zc8i#-;e87$rikOlAfCYaUaO`tINnusw1UZ~dVD<5$4g{@cX~6UY#!D*Kn;f?r= zRwa{)Nxqhv?}r=Io;J9T9LktY^nYYCPJaK^V{n46_QKq0RpWKN56j#Jr~P}jlPL<< z^Rnm9jDT72vBSotB&I0o!5JT#5zUPXsawhoHd0Q{AXqH_>a(IVi~;oeWjsK!&3sW) zGsaBjdvkUfxO@f4?kdIx>Fk@iEg42GXol!(icM3GWw_iSLz;S%CT7$1rGJz>Ms3%S z60eyv7Me^n-|zLvO2kDN1|0K| zu=i9`_jfOUaWRD3EMx|`eShsU?9hdL1ROYoau@AidyrPV<0x5Oh2V(&Exk3ReR~r( zQ~v46~*m9!;=^b2iU zrCS38B5yM>Tl>w&YWbrTQXV^}TcER6%75G7>G?Jpq{U~y82qr8gEbvdFQq*KVO-IQzYK4 zZ^Eb{Qf-*`&1M^o^5@ew8~=ROf-gym*5R^&lFfX<6{k#P3@FJhegP+3C9|(-F)KmD zP=q;#&^9R0Wd!s1Y5eE!FpBc*?9L2L1}m2ntAp+^lO?|>bARS5A;Hr}(&|E){HX3q zTiqrMFrDFyw1r-{oRtX*>V2OseISJfgl|t1T?`smlImE zX#-*0MKWD(K}*lxq1d6?Q3>^3m%N(UUwDiEOU3ym&`+8jiufbxBU=Z69VWc3+a*>l zjV`{>JM$DcR)4LO+0F1EIqL%bdPQsnL9BM%kyV=AFBa1(a?CjpFVZBc+u~WQ6Mk&< z?JtI7`+;+!MW6p1svW?%&n&*4&fRZz?}=cI$5&_7KWb)!f!`-{XbflA%qt1Hz-S)6 zYZT(gIqtl?KUxljr+&4lG8(7_VT(gu<_0>10j40zwST{)CVDu2_#aRnKuwh607Lf1 zm{3V*J4rpozdxsfx`^kx%=shnW!$85_L^qp$h+rrCQZ?&)}x@Pr{IuV=qG8w*po8e zjk271UXVy!F##O0FYSdp(^R9pR*9Y-08V&?yjYWOTO~u;;frI}9Z-^#WO`uX&T#>c zcpex(9e<@m!@%pl^2a(RBi;CsICXGa!a7lnPAFW(SOyns2D&;W3M-f2&N-S!Y^{Or zD0e4cP%W55Sw~n_5i$=X!%hF>e5IL+d*S$iT1k$b$lYy4-CMKGEar&UwCFh4gKG}4)lqvFnv5A2Nmf}Sy{`gp0+ShNUStxg6w7;T5Ikg%LODA zqJL+>^L9VlZiuZu#)JNiS);uBT{bb<$6t$dtZDP?ZZmXUu`(p#X5)3EpXs))i!Q*`V1Z5Qfk6pg^N<+=4T>vV=djs@p=XN!$dlFZ zo5{>p?t9-SMzhzz>3$^JMRe!FJ3@1puEFX54Ub8R6HsjW};Ew;?AH_*& zSHYH|&z}1g+3xX{^9O!!SG}>z(biIlb=po99-C^OJ|WhB?ham&dpHR{uH>4&I%^aZuMl+_9%e1ERv zc(x4o(J)4yPohuZ{5#fJrs_yF#-uOlrLYKnE-0Bx3QK?9VaY?!OZJI~yW(*Mg@Ide z+3u5HQAiz33hloci82AIiNg?ARLu5uU8JAeZ`$c7BL!-gr5&a~)sZGo_dCB~PQC$N zBo|-2mRh543`)Riwe&;vCkI}yvwzb%%#=_McA-e`5}=bC1%SyW+T0secZojVElPSW z?37s1D9xYm9JvGiNlZyR$D5vO2qc{1O4}F~G>AaWK3@>!Va-@W&UCQeleUJprgx_~hee(sB_j7WtV&hfbG-PwR#(cJ?UpdIBp8j8`)P&gYCs|!u(UYly?;%+twyNA z`bJqXI7kMr+}{s4PR0=Pyp_${S^Khf2@}-3kayB3s+#@+zx&_jKhy(csArwAjrwOy zWuO86DbWn)4!KH&Df9}1SmFwvUQdftUP67dnLb8MYPJA)R=N^HJ zBVkc_Ixm$FgBfbFIdyMAc&uOgC_Q>)! zg}JPu>9vA7`j&x5mci}*%XP^Lgf`6nKzsJY=3KHnJS?`s~e1?;&>V}jtuFRaO2XHf3R2n8FO05ypy-}9 zOy7N@&T51j=(94G5BwnLo$OQprTGr4yMT6=ONOnAG%64?;P`e07+l;O!fIf< zhc}^E_ous5Cp_D3KY%&7H|qeZJRZj~R(|a=v=v?3oNP`j#%MbKf_~>omrY5T2-w6k z+h+k^Npqe_MSq|F|Fn*A2s}ih9;*P>%8Iq&K<|H>WF=B_-}6@z_Om#v^XALe%{(*j zQ=@EF~884$_2q6}&I)exRcVZD0nf(Uv)AFZNYC&Cq_{yervhxoI>Z}Udlg^Y51*pGd<>PX&dlTebs;=;?XMZs;t+q*yZnJ-kGnP z4@=JHhfgK=>W#GDbz_W9uZAa_Jp#jR*kiuE_ad-iJI}g^qG`Uk{X=w+wXfqewqxn3?a3IOIgq1m0+-vxA zgd~IOwuHC?atr;LuJ}Bjoenf_!qO>(pno9h?BFVn8d32+m%n4tLEhvrW!QhwAuZ2^ zUXMDuh7mwZ@$R0vEn_(5-^Oss*W+p(_8zgSLQ+BV)!U*sk8rkMLuBn-#L(<8 zpWOLH*QfrZjxl9Xqq<&a;+mP^RNVExzE=0J@ONjglg{Xx+sxbRB8p$!O2>rDfjQG# zPMk=2_+F;l=SOEgdf{ecqk&zbAb;Hx7}w&5vs<>AO?7vsErveSY~Dt|R4MS8ROoRJ zb+mfX{vCB;Fli=+H_l>TR!|6KIgfo%QX!D~C~hQn+rI)Q1zvB{1(@;*@OV@Upu?V% z2Jgq#@vwwXOlu3??=V!fv=4AP|BfZ>RFy)?0Y7S{09*p-{{v;$yr4T!Pk+#Dp2l>T zyAiNTiOvPy;nv2CUsqsCJc_ba3GXqTauVK*uS$fvEf^vvX6ts`xT6ZlE1!#kCH%$* z^thzyk*Of1jxC@Wp*g#omd+53uk(_ltJ2D=y!ZcZ>8{;r&eAHcQSvvOPV?yJw)I*b zn6S-)@8V-XmR%CGu7D1L9e?5E3L!qOX;(@>R^vqMmxm<#b!njz?NF5*e!zo}f@*~r zwx$D3O8J?ZO-DqCK(lf=ekRXM`Hituk0P*(km5MdqT}s-O^2`ynG1G}O4Ez>=T4`SY?YL^yO9zkSM`?&T*z( zWvJI4Yz88Yw#rNgo9J#Esy}{BGMKgequMmPA zkLX9Y2p{QN*MDHt)8HQcIH9orhqMkBEmcA@Ab1(e&QYW_MjwnA`%4sq&cQZ#OlxLh z54Itom|U2C#U+3BB!>bzqppTv2R%0mQTeI%iuf}C_e50KBr`3MwI}uK4e)9`#Pwle;(ui;{ajW3XT@1$$vVt`)xTR{%|qvpibo$LfX?; zr0uR&Pp7tk4)Ut<(B86)kU5%Voh&rT$?f{#frqKL(VkIw_$h9IvWBvt4j9hQNC-a| zoGOrl$VgsZvQxm*!_0UMRR+_V-Lj8#O@rq40*J!}>vVoTe$(XntSfr7<*{^I>x@_q z^cJKz-+yp%7Wd&cXK5#gl{Q?&v#`j}@J#>S$b`xj=Dp$zTwuARTSh2?xA(7k&F%1S zwm7nF)gif2V^&3^rIrebB`X!KEbI*AB&^kb!X?yf6Mhogb~DKsQzcS9dHD(B#gt6p z_(QM-QSkgdsfyqKO6@+L^t-eutb>+0A-xST^M81e24nFdX{pN0bZxsWLcz`S2n{=)1T3tQ-)S&fP{f ztSPDQd#$$Pe^0{kd0*)rbT{&@{*Jg_5iKu92PYO7#y{Io$FZ9>F0^YS;xPQh^m(Fz znSX}ugMFKt8E{-rb^^cP%)<}>gwuLUc^lP7B{XUhux-t}Ef%i&=clP%4u}x4RlI-C zo7=8?pP+=F#5;(t2{VN!?$E0^@-A$;zYlJRTXiwZj$zm z@YLZ}QyoD7wcW|NS$HuNc(+Zz6QK%Ckbla{|G1fOkFcnAud`kOj#Y}pIs(dI0)hlKm zeTei#DG0qv|EzXAAfBxY9iUPE3jThgjHA6jxz(rx$7$&5k<1^mu`b|mX^)+cfq&A1 zIh6W%J*c%>d10ybCfDHJ7{|LEoEq6wgv2T{dX5rSG-{HqJ63PD>mp&Jwm6=Di+r9HEviM^DNHS(QxcbIjZfpAi&^-Fm$g{DZ^=G=T}pB3supX)&w zeh1nS6Y>2=Nl2<&zS%Ge`F}`dsZ2_haSpK!@igRF*}R_6L8|qNTr((xN8&)G;af|wQxIAbsP`-74ev0?iJphLI3Xfa)4#(|EvRRpLcGn@r>aAxi=|74vF^97XQ zFH~=-6o?2Ip`+zs;~ANgar&lIW0xOl40Igv1ND>HMDMMj3=1*09wrAtdq?duye$ue z6w9RF*3pI<`z2Vw5P!&;1kTp>#&oC2F}4QyqvjCa|EtVMNwv@SF_n9J=Hg)f#~jE^ zS{_*3B<$JdS_l^>BIjtSp%1{mJD3JQ&osh+aj=!IAdYnwiSVrX!NX`yLkd#sy+{AH zL#lr#ZOv};3X3oS$JbsB0#65<&p(TkTh6HthYy*!rXJ2S!+(TUU=b?8&c8`$=2(w1 zxniEbRN>qIxiW}HR!#y0gdn3_p7&-7AMvGC`y}3lFv-P*o!xioBoyfD8_bB0GqTiM+?w?$A>|qJPEicB6N(qsA{4(e$-Uq5}H$ zc6hYoL{K|`4izZb1u+L3T3MT(F4y zLrXoq3`&SCj)pMwvL+ZAwM$o|*o^qVdtDPZ@sTk2^o0#y%Qb$*`rW#CzjZ|KWTGmE zF47n_kAGL6Oq(a6d|U+F2+J0Ol=gZScJ{VY~|4|$X{enN?@l#v8Q=w3@&qw09d^BM5`^!f6srFuHp$bAT7&@MxL zLP||+TdcX-WwzzWzE(8&j0IwIUKxR;yQZU7lYc6^^alQlX6dd#LZK~?)$3V*vR9on zfQ|jEa3;!n%ekoFhg+0F&`Se&b)NDVw($Hk<;t{(Pdr~~e>Z1A0dgr^T?C|0+a+w^ z@*z8W<67p%)6|}3N@hTYw?i*e5Q>ycpNH~wK2V1twea!hn~K{;DahSs1I&fTwvmyu7OHrZHC`=-Q8O@`1) z>13~*tGHwX!02yKRi0)M3`fp)IlaiX(?9RKQR^b`Wc{E5?9*y`DR z_7dL&5Fu9fOWOQfgO;QlF#96s(2mIlum0;etQHe!Y(#Pb3Gc3!r7j#XouY@#N1pMP zSEHGn4=^o-?!(75CP{6_sz-k#T8z5DZhz+o z5SaZb&BFEQFM_0{{5i`BMtU0&ryg}#U5>% z_Ua+2N#dHr)|1`R*Y&1g_{diM_1e}s zWj>W;ACQ>4s7f%q^!HvuWYeK#AgEvh$Ch{-b3WKmdMO!b+dYh+-7`@fq}tY!F)hDN zrTnVGGF@4?7>Htdm1~(^=J0%AkTOlK_fa!5!W^zxd^{U0_ooFGQ4+wE+J7w2Q5*f+ z4WsLb9RHN3JArZ~V-p>4P`^Wn0PhtzPub5zcTrCY73=ZKLRxB^XwZ1@TXo;EGYfp$ z#KV6Ww`7Ij&XZBJ^Mw^8sBxRd91Y!sS)5ficR?|913sZt$Kd^GJ7#}Z0n{-Q<}m*Y z1lAO|ditmt?KX#kpJ$W{m4A0O+*69Hq*F3Mv}=Xj^H)o+0e^<&lLj zUJ5u7_Ay+0n?d#Qhw`at@Mdfv`r!&2|K|9gFNQd{`^P*5nt13_nvZhrm(>~G+a%dU z4xzjNWzMdnwq}@8j?c+hli3Q4v)z;9d2Q{i2D=8y%|kg>&|DMfmoQvs224C8;B<(4s+--tBRHL} z1*N@WMV8F0yeAsr#o^EFTL|BG1eZ+VMAHn$7HYDkX%_5DC4V)&V8-QL{vu3J@v^)X zJuxVP>p5*yK$d)?_=m7T#|8{M= zgsy=w$s!S~H+yz|P{@_jhG)O~=?k%z5cQIXuNzQsKEGh)K zw#z@d`@=>j$m-ONqyetI%9*1yBBCs?$w*4b37|93el+2{8NWu&P}^DpSkl5UDL04r zTs@M+0+Q61L%4{q5()>xKaJosb>l}7zW*;cKx!8bNzG`k4AxP()LB{(ofVr6^XQhT~58PXL5H+V4{=>n1AAy!wOrs7v$-^|)^hfvhtaKts(D6_e zB~Xk)9uqYGYK?V9ZTeXNjh56%N+{<*3Vl!DzJG-=2Wh2oilXybNmSKb#gAz(&z~Z{ z)RmVhZvPn{?(hy_X(zPW>fqXu>i>T_3NY2xb%~I61q3Rg!wOAUBIJA7 z0sLUQ^++rFj;j;&duS_z5Ih;F0IPFj9IGr3x;BVRi2lP5ITc58g&_w8q-SO(x}(5u zLVt0Hmv=AtM3uGaNNVG6Z413K&^p7oS#hSS2*ffx?Sk^|`jMtVhTCJu9J5G4` zUzlaPZa1>*0Ki-MG{Om{EP!)X8X#3i7JtShy-; zemW9cp8?f*k>cnm#BEPAe%?c_te{288H1$OD=FuMS9|AMca5-yT;lo@P%snU#ec1K zyP7k%ae}Kwk!!<)2rTK8WDqG{lB6oYgYmCx#~bwEu(0T zL7HWm`=JY9yrEM;Xjg5=Ef5xhPk30W(eXeWM_v2+Q}-QW@Am)D{q^l{*-=z_G@<;4 z{4Zi0WN{jQMN#wXg|&85Mng|RC4X$dFKbL-v4$Di4@|Yva}byxwTS|Y&*SlDOwTP` z1fFZKm~~U-YnXdTN+^%OxIE@ZKfEP#0p(H0Z9)@2RL0M7*nr3z#nv*B^?tXxTKA+a z4<|=&n4n5r8E>zmGNxAX1_ZFC{QRt^WEV3-hZb#g37Vr1-B_z$ei?Sqb${?B>tu-G z%SIuD4)=}%4J4ra|EH|!0t5kAV7IH%uNRne62t3!Y$QnK-XBc4Lq~+BXedT34&Lo= zI39o(8iNh9;Nhz)>I;ds&0ntZGQsxbRfN&XLd3%Um{2<06d8SUB2IT1-xXfSM`P;s zIj!8iVqUw(czlUHg#-d_%74!Lag!?PDBUgTEEc*@raJ-WfE&u;D|DoM+X72X3c=A2 zb#4#^V4tF^kPdIM?em%UnVdtgNDVi9Dx5W``G8 z%eqQT({&OhUqMERhJVsYHNvy-_f%#t)t*7o=6=NS&ByJ^*Q+BlnD$Qq0+hi_q3x!X zN~}#W$CLmMevZ5y2%3d3t?^Q^aL`v7X{sG*#5XjH(MvGzNeh3DJmeTp)dl?Ax`vwO zemqtXQ-7-AD1YL9MjEz+nd&au+=}pL1I}xl#S=JfS)Hj`#*(KsA13|kYeFTW5)<8E zwEY93>bE6XNoVIb&Ln&Wwz=yUedl;Q7css#d>?_^A;99=&=CgO9R-i-YN%;iQJ+=i z_|`T2z$f%No3-0D22SQ;a(<@Q%gNZSsxaDdaQQZP?teoNBS*iD9Sm=vZH+P#aXVx9 z+{?k<+kZhB014VRecj)lpSk1G87=;jhdTq zR4EMB$x$+MA2(TmmV}Y8zysW1p5|Y-$4Xfiko&P!^{O*!d1$>nSC4QNy9%WdfYK4y}lV8Qaf)llz8sC~|UDa|z1!YperYStP^G5QTuhj!(wZ z;ew(WX%P2BWe1)s9e%beuh}sd$H@#{0{klg5P#syC1P?+DhCdmp~Y&$ojx68Dl!N` z##n^x>GX(q%8k-}uqSj*vMtK@1pHvaTtqNVH2If(y- zvVVPhk6`{J;J}kc?X}CuoN@i-$)V%(j993-A{vU)vSYbyjo8L$@IN8{!|;in7Ae_i zXew&MY&2gU-BSPRbyx*ze(F1BzTgx-kk5UH^b>cNPn1wVtc<&kAF@Raq_!WE|3L?wpfRg@%`Wt z-r<)maqm)drmG*8c%^`<`bgNv$>goOPv?Ng=E&}-#_7j!SIU^;h~x>drE4?5{m7;( ztVg5qCL$TOh_<#$7I`&u=ODlX%&FNPPg;k=X}k}x(h=OLoxni^15N)28ZGr~Lw|GB zC1fs8(V!F?Yj7Jg86ttM7twc5@T0^e{wzAlc=9l|GG{5_Ya?yu@Knc4DN8kYRR~X{ zJ{?Nf!)iWwz3}7imYi0YoyT&AeDNvD?otT#f?y?!@Qa?cbMs3zj!-cku;6`ApjWnv zRX+yxN6xH#-D!9K-Q+LcsGa-~C4W4*3gEnhj{diVep2QZR`;}O?=rnLiC7cx9A4aE><;V5ijjq|C1&E4m zg^V%@Q$`0xNyQ(O>YtKp-Z0>19)A%1!8Tvg6710X1|Je<2N`D-)nSk6`hPA8n7o|iL&!d7ScqRZC+en<$;ELe=fIx&yrl;1h*#QrpVtSU_=Rx*)It;tMr zjxy8JzMAKg_GRbjsrWT!hW)w3I3(?byOU(El}F;XOTh>k;z%s>V_G7N0k%hD2hJHX zNPeAEFMqrd2b*1`8rIK9aN%H;m4*Z2tz+zqG#i^tE=CoZ(pi#h9$g5?oRao1R)-%m*WAXS2vZ%@y3EJlR% z&Osj<3SYKPSUjJ0-e$cG)8C5uv=Z@$+P77VJ4XL2Gymo18qQ9M?SJNBN^#nWVtJ~) z_N{{Bk{1$w9aa#~5!i5!coNi6hd^XfUCtbbY={NhGF9$4Kw2H((i`oR9A3-tO;F4b zoQeh;cI1T6%XxZERkx6XsDni!bKFj%4zJ|vA9kW%&`rgM{rpk$u3|@_Cyw&)%k_gY zwj(M6^q$+ccmltMlz+hbG{M3>3%f9Mbbt+i@adDL)zQkc`JcMo6e9f zc&g4B5+6Nx%lC||DCzAyWH)jGaSoL5G^nlug9`r z?0*V&;!29k_pno<&~0gJe(h1gw2Sen8b)A$@~saz2(-a!Jn^uTkcS1R7Qu|aGE%YK zDd4oLGk(v-WiO-3Kr;y@;L1EX8EBNbPbx$Snu`E$@k&*!L(CbCxZcY_^=GtofBq)D z<;w)}WCICY4}Ufj_cRA6Nw5c^EmGdi4iW>%lY9NhS0r~-*`>)}0a{YsmMwVCS>^Jk z3uew`7|4jG(5jTh9dCpbpoD2vv)|lSq-}rab@Q(X= zUmulfd`c>iK?+k?=eywlpe^NDH^&T$B8=Cw-uj6Q;kd;Jwvtn-i^`oU*m=Bo3e}aN z5tm`cP2j@44^weg-SO%r<1Ydqpes38kAlNZJS^>$K!bOI=mxywEihF84=V@3l{qhzyqtIt z1nxPY27Z5*OFQyTU}d`Op2TAMoZ9VR+~0lk3VDa?0uDfBp7XaMV1>KrQOLmMtLe^? zK}v62v;X;Ah4=#5147az^^l_^rnMihN9OD9WPf-0BQe!Qf3-i0K#e$C*`N11v3hA3Q808&fx0q1-_bLb~hrEW2s!@HC z^LP$>89==XzM@KWK-}qtoOqI>G@oja`DZ3>ux#I;>q^lw6_|K>%CoUhhJu}*6gN5f zaDQyFzzs}782fz<$-*e${F>JeC%>No(lLO!8P6fXVTGc(#z4>l0qaDIok^9Yx(|ZC zp{-9X9h}7nr9PtsP5$T~?F5I!Fczfe^P*xqY-0mU$W}v>%!@l5`PkFMU40B=!e6wVo_~2M}{2k3RNR(0b)`s z?8J{`WhU4nO7FIR6_9>%7wG--{uTAF{Rq4#EHXkIl{w{8=8oXlLNxO^TNv5JL|34a|8 zqGn1|FEefc=jS-;fi8O@$+;e)?i?UAX}t+e_8$MGD!PP&W1a`IA?!(BvfKXY2C0QD zgpDFNqGA-n0=>hkmvFx_SQbF+ES0lykOJ(n6j^|$*Ld@rGg z)u4&R5zR0}9#7f~;dlt*g(2lIm4DwXOrGQVE=edEp?F=w4+V@(#&R^^kpIOGmR-9v zRbw)zmp-*C@Y(3w*?Lq?PaanQ!|qMPJ_+InOh(dPRd0;izo=F;}i zKiWJZQc6wP3_ePW(5P{b>S}O;6m$9`?YlUOTz3#7rm^Hx53bg0LKr}-7aUjp zD`(gBAL@3@VEGDTxe*n;1b<~}d2RullOveE>5v%}^c9N(IkZBG-GOVtCZYg;c1{Wb zX#pebp{)wn5VLnJ4f2X{=m!Q`5Fnqhsd8#$QTL(^Zq48l>2^&RWIJ5Wv3qE*Iu~RSS`4vbshM(i!hgkJwmokn_sbfS z8;8uuEa9x-nKJqOnvY?=^%988*rZh(0y`okr8|Z9J~h&wI`ptvjnAdXH@7U*^&u-gFqZ2ghRPjps{J(RbAioHZevQ6iQ#3T-}zU7v1lh*(ckSYp#~a|dL)EHw65Gl8|U6Q0ZP(OiMan& z1SeV_3))7@j>2;v#(qy>E6TWwnM^s-S6zMn;_>tEk8i!Z34e@1we9f5a~tjdXW(rG zmLK<)vlcN?T+znC)ewi0%73^Bo@8$;#hdSR{8=|wp~}AMauPST)crNwE@_~wY;k07 zNnQK)*46izxm$~bIq2Dww?yoUZdrSqNK%2-AuL`--MLupQh|77<&vyO>e}{*DMw2w zUoz*+{O0RkYkytAKGsCY>||l;3NJQ)?Gy%pLtrK3RxJqRP8{GWOP-s zN@B$S=9^p>x?zILn>Q{`) zL&4ie5Fz>rl#VM_sHe z*$LZph?`FZNpXWl`=M2~O475~ekS@`($wG+<7{STi?}47(u)a-`d)UKrK@qOtuUak zDYnq`wtpuD+EUs%bSXS0Pc3X6BR>>;_IU?iZr!+7-d|F9vra#N0ChW5230K*OV(DR@+0kWbu(i8f6*wlRk(i$%H*%ORQV6pP=2pjVG$24}Q6X@t$M*Uo|*jq4Pk3 zaesr2ax6c6dPXT5I+z+l@MB}FvC}D=^3%2-ANy|Q1Ql&3<&v?093Hm^Xl@})8MxO7 zbQKrA4}W;fyxa`!HY1e-SeVF9D&{CraOSa1&SDw-_qpXmLZyPo`$0cZuw5di3k`>{ zd+Qf(|H48HYfEd_kQW;V#;)IRsH{w3E`Ji+P$je{G78t;sRvoGU>mocH3qp6{zh%> zNYU0c9;)WGzwTZ*3@ri+^HiR2S6KQK@vTpejcu^pNEGB<;6>aAHhnYaMOYSzW#X-w zG&C3Z14&^yMMLpyYO@&w$pDr)xpo=_zh!y^XKbR7US`0beA3q+`JFPStypZvCX==w zcYi|K*6QCg#s6K)A1ubFc7+vu7?+)LkitgX5Xo8ypPXjtWI@VhjAr!KL#FgKvY-G6 zn3wutkH$?oxAKSaZygG=2Axs3y|{ufbXbmVpZFQEy*#;hIo!^jLmMxI#oJKT zii=>$77NsJFRzCL<|rzRNe@TA|G3acrGGWJ!g{TPiO!=^D{6gQH`C)x1&53;8hFNm z^-mux*tuvEX(WHb0PegUQazPy>aW=XNsb9>p$wCZo*UxqQ^H_Ou4aXJ(eA?+4e6|3 zwX1;Arm-qp5@QOz>BClS3sP!EUq%A(aOUolbhueL^ET^hwtwsLK+QShJNk5FIDflj zgquU6vawoYgQa>O9L8(S>G&AQveYPpH0fH2A1vqZ_I1;0U6VQ#^(vp^D{p-7jPA2j za{VN@VjeSqUM&22L1O7ru;CefS&Xa5S0ops0;tK0jlcmi;{^`@5k@rBrVw0{fkSj_ zimeyRJQt>7FC-~jk^w$EiS#0x41bSgP;p>T;uA`&#m&O~S!9n8o|ZC)_;xx%vd4K7 z*LYslHZGh(a+?bO?YI~Mz4UuyiYNYxSpi-)i+B3J0@VqaaC6#cDcKKWB1Cgl?YqK= zG%2$Apy+Ur#Ci?PLOSx`m}#2DzW`d%{c6w$4Au60H~JBD*ah9x^ny`Zuzwk;7duhK z2au5owFU7%GcUjG5P5I;=jVV078mx(m9l%VY*Af;Az}27#+%bi=;k3_0S51yC?b@giDLVRwU!O^TuqlKs+> z4dx0$%o&W{Yk!T+Jr0&C6<=$R*Q!VWPQ{%&F;ugZ4PpP%!qKR){{gd(23BE0-4trk z+WqZiFp;VfCZt;uSbv^yjwk{7BwWx@%`|>*BB+{cI7c-PXVj|>AqdisODL0JTg)gX zPzx}j+x0kEV%nGA0DI;6+&pQJZb1ZJRFd?h;D=I>|hrmjZZ;pVoUAl*l$qjnP$A9=?0f zxB)R&X(Ow#8F%u6fh&rrqv$76&?%6qH=bVI{xCPPmCHaay%IM3T3q8SaT?@UFv-r# zK+Olj_!yz1fqzn^LhKpDXv}{i;4clv^v+(tnum40X{tDWBq25t=N7EVlW2lGN3a~5 zsT?{KWUk~ax#gn$TWZZ=OXjM;%1 zxT&{{)dqkCLNydD7On(B?FvEaC0wTt>iqB_uZB?7$ba(r{DnDzbG4tL+KbH=(mC+Va zEFMR|l|?FpZm>^yCW11GWNh?#78e5Vzwv=2Lw_jcaDx(AF;A&c;3}_sx8_w&QNwX% zs=PE8N`(i4P3~(0d$t*HU)|3OI^B3_d*zA<5IS@Kd*Gxn&**EM1?Pscx zUw>uI8&9qkcbblph(#`0O{dW$`Cd2H-GAO#A2kT+EKVN7-deD)wH-5{iE^l&5ofJg zd!wb*cwJhpT_Iw0Ln8(Hd{?hr=T-R%WrPnpKNfL$qNG5+fHxzB!q!@Lvbk@0iOhLT zDIJ-2l)vpo>oP;o@`w!^*v7IPb(!q^o_~cfvK7W1k;96!8SPo2_)y8~FWem3Zp=Sf ziz=?fm~BqZlqa}pcz~ZRCP!1$ZA`lh0#h<>)wXhS$4(3@WDo(s=}HKV6C$|ni*Z5< zA{jj?g0D07`n##2Fv6U9FyGgB@v6Qc>4CG{LJ{e3WSV*J6&Z+3dCBbD#UVHSG=D~o zQ>llrLzDY*xAsqYiL{Yetm>0*LlF)PSW@%9ocQ_x)34xQHY7i1nsJGu3?^&HwF{N` zNr1|=>B2vu%CM%*fc)*3B~?Tep1ZniS}(LeX|dVneBDTP(Y<4pju|fkgKd+{V<=&1 zsHmjhomvN_uWY%e7y5xH#S9j5k$*oyI0S!--?O&JD(2l=wy+c@~Hh8SPL5)s}h;tIs1{o+9+*J^eriZU9Z~GdI|Grtiq(sgz zi%dkpvlaeG=dq`>4MRl4DZVBR%d-_9&vow=yp~3zTTCG`hI9#-Q7^pVEHjBSO0#D_ zfNQe}rF0vY`U4?y9i>D%dE&((MPjN2X1~#$u7FEH#*=JOdmF!C4UDVL(09kk2OjD z@@iAb`cF_&1#ijZmB;R_OH<;?3R&q}bikaf)!1!Llvnxww0=O)iA-C~jz<#;4z=`+ z!ScZn*8n5Tu3F!8n5RFMlDQ()s)f#m%AD+R15L3Wky{Zg{|Dp{K;=s;MiN=>FtTzHZc_^vFqr5lQpcae(A-kPA`hR$FSd(XOv|fAYxy#^x zGC9tM&-TA2O%srpiybw6p>uU5smpTm@mp?YMY3(eSmQ>V4^y7)F})&>tp?rF{glgI zF$Aw4c8-vbR;XFLD|lfxk*S=Ht-E<>R8T~g#?EkN*qME^GR_Nr|0MvxGi!dMmWOs< z*BuS(mWT9^4}XeI#im%ZI){Bax+R4GNk#X{ux^5M5B#mCMk`)g(I)H{skgdf@0N?U zmn^m{V-!q46usOuMFNzyp4xRO58x&CDuXR$rVGYa{i%q-=j}>MZ<6i^6-9NYRR6HuzZ) z_PtRBwXA^|&E$SDb%_AXPq2XU)I2yKWY8wmjEBw(|9S7gY-(&JsbbbAicFKg5J zqm?(dsg+^{+MT{zK;gN4R%M$WI#bR1eHU%`P>^K=}b8pZl?KQ>7Vo=r0n8(3->3k>N=$?doQUa zK@~sINx3O#e;pXlB_zha_{Fx) zCbF2(H%iB)b~Aa>IM3=Mpnum_asGzBV}JF8;Noy-d(|hNBx%LPMx=c0=IrV%3d7P3y`k>xcRYhT>inC2UK1 zKr`WNL}2gE4<#?J(@zYG!>*2;W7_d3d%Y}A$ZFxQKSTfqut=1#!Pq4N+<)d~ z`M-LagZYL*(O6soBg>}5uNmyZc=fjB*J9u zE;`P+h-7OZVutCk_G7gbFmd#FDm1?YoVAl=%C^;DrR+O>Un5FC^QQ6V3Y!Ha%&tZc zI4HpSqhhosLQH=MHK{_}PL+`z2Y|adwWbvn?~ff;YO*A$d4! z7hfVw zEc_wCjmiqJmJ{RODo$vT#eZ?UD+^ES#hlf^6_uvZHCyvFmB;E+(KH*lyb?`rVf1OO zE3Y&@v+q7*zh5#g9eS%!K(-(X#TPivM1W~piu*7*&p$|9IaaeDuw-2chy!pvMV@fxXO?%zygf&*|d5i1-@%q1I*|(51MYF-Kv~{ZqGvJ%5fd1H(@YbB>ap zhsp8$B;7Ovl(4OJi;f+#C4aPJa^_0j8Vx-%n<_$>E0KR71rB6f%&ZL|+|QJ$-}&v6hjjz1Aos>%9EqQ*qTHNot~|^ zI0^zhx2y9zwYO#qn!HFjtu3gOAT&0>eM-o{ z?sxBu0Mo_6J3Bb*vlpjxZaVF@#i&T?D!*A(3<2wZxAq zv&De+4%5l{oE%VBi^zJW<{i)o4KiuNIX5)M%vxhapMO@k)|Fc!!INxCzNe`+0;go; z(qD#gGp!Ru&kYgYH^i_oXR0~D6!k6$;gl9lEi`0v9rA(#uLEpUMC?!Rn^8x9iPoC& zAZiN=SEIYz9Gu0RhEx5myVK`dsSBh!;wtnTmg_2W>iT#=jQE#h-_F0iym~+n%r$%b zs*A*iJb(VUO;hxaz6z#yeb9PpLOl>fx@9*A83U{BCb2Iv*f8&$8>)r^ir_esOjszt`Pb<{gKO9WqMIet;5ms3HO@ zQ|Z+eB=-YnH}-|w###AjZfA3;l1Td#R9=Xfb$>N&sZ$*)oD*36a*KEMbwiZV)MukQ z(aE|C)SxM`eLr){%|CN1W4xl($rtGvrND z3xB&{yhgBHe)j!Lz71B`iDc7sf?MLa-1+EgSwrMb z$)NZ)$we8?WVAAKo#Lo=e%+R@SNO|PcHwE?@h*nxDdpPZ?UM|Lxv3*cxOAjFr)w!v zH8Y5BU3R0Ag5LsM?ed%c(9ADej+o4%>3@F6?tBIM0Fgl;CWxm3CVBA+zfAz-Y;C6l zV@>f$&GJIo5DB;b4y%eN#o!z#h4<%W)R!K7qolYpOMEUa=VTeZ8#Gvg1@zo>V zzWuGTw1nhD`a~0_)LT46sDJG9 zlq*HG%y6%|y~+sN_Vb?sU{nJ!emjd_HrmDpsa(9}k{b{W(>%+T1UOFmR-_kySJH_L z#?8v*%>lPy_9HVF!pMZLo*PP=5cx-Y4Z$Pxwbt?P9GDf3_HpWCK6EqPfB_S+b=6rn zXnM$U{+%1#)d@oM00-uG3eba|>VL|V5k^@Y9W<578-0Fi;O@Z$lFm0QIK$;$+q5my zP=5e}1bK!++6iyH8=9toz(QxAkIh0O?<|zB2P`mQo+O?3#?E(|`3m(j318}rM@CgDA^ET(nt&!SdT;NvL%o;-8!EDcKFJa8FaGIVCZw3Fi*wR z3OR5wh$gxy5xj@~B+hW+Jb%}SUeO>pqGmB!7ia~(MJzDE6)+yMb*`H#Jw4*4e$y{y zSy&J#M=F42r-Ywd1R30mAAcpK7$2>@$g4(38If|oiql!fLa`F#8Opb3AmA-uH2_q& zhE@aE;<#RGG)1*g;Y$lR2Tz?`hwDu5y$e>ADWJm7n8;rA%V;gb7D4}0=zOVNDC)F6E4}3{a(i);U~uI<0qmGs?&fH(Gjg2 zcJM?mJxBTAjT7)$p9o?f1AACj!pyN^x=(y6wsR-%;D6YKeK|^evb3aY-$2Hki+d%S zI_RLc79I?lI0~CIp@xqrs2?E|2|yQ=`6Vb=M4!_`&EdsDo$?3w!dd=r-6p^+S77Dy zEJFs-N_h*>Y4fEfa)v9*v=vV7GNyp%&c_FRWg!nrkBnV8cSoN<|5oiP0iW@zRBi?J7o>~t7T3p4&j%3a4j~tiA7}#F zW1EKF?WrB zm!@2wrKnuz`@(NxaO+{W+L;xy>!5UW-$LS~^MChqtk|t5?q*DkU{Naz!x;I|_AM#6 zVDr@OQ_aDXK&o;CLCMjai{?W0+Un2LC(X6kg;7q$?rrgG3MaiF>>6t$#6GO7347H5 zHukAb>!i>qKJ|c?de|4#15^#0W3(_S!xlELH;x3)S%vS^HVN3>V`GIFdu@00(ni2+5kW+9(9GAmcu7djErE28zCF^7e%s+=W z;Wr#H4hjVo9OE>-h21QQnp!gZU^TbZq<Kvvv%0LZ^?;Vcd*`V8H3WnI!KJNlwbD#Beof&pxwd@}%HNaY{hIx34Za&%}lz#;B zB{AN%70{*TxX;rIt$v&ReM2F<&|44))Y&zm10wuttY1WqBP3%^@Rmcn1CWdhp6xDt zA)_e8{xeOp4^hc29wGZMbHpswh#6W%fet|Vx&Y+3^%k@*gwPhOskoHN<{JTLW33z* zf!K*6B^twnmTm&lPqd_z&7~RWaewkDzD+j}4=KOsKP1~tLYH++7w2b~%mm{n2U@ju z`NJysW0FGtoOMP3bIHEzHZ%&pDDU-sDma2G?fhTEd`A0NjO8VRC7R;6_MiNt4|l%Z z^0P47FJGmI-kBsXFCI-2e3D96x?ZQoA>MzXpGt2fwoxt1u_Qy%c=t~#ynoIDVFzHt zl!n%IbKc^ICLA99!9wxzwjHNOf`Jxqf0SvT@Wm5}epzD`QWglE@eAo=emTF>1A`DC zJss{OArxnk0NL=31n4{pygeAjsRjA+{MigS{!qUnI_SBBPo|hEDIFtA9B23O$A!FFd|6C_S4V7h^G&HTq5KZn+JAm`Il4=_ZGq3H zCHhoVx+mewN33HmPZsaB@d!CGQ)WFQy!1zn^OWMk190uIy)IRgixjKzwBS~p(dHET ze8Z@1IfxaotQ%(~(&?I~+4l1>2-9&NhfM`3B-iA9KUH%cU*?@dn^T(6EkP~dCw!aE z%@5)w&2~0VI0Ww&V1Ft2rHS@!gLZ34I&Cz#36Il>b@LX-P2Mp8D_T}DQAgLMN|}TS z{$b7fa}Y%9eWT@j+bg+NDO}T*KyyzTQ1;Qo1{6?Clx#oA;mXPC?$sQ}cI1*FY4wC( zl3{(a2uJZh6aD-Ew?g=BtI}*(cA$a_9tpQ&E@&|MKq0Sciho!FYK5OeE?}v- zxc%xyBk5oMbmf6hZt**58qe@zvA|`KwS*sB<rWi?xdWdIT`*sJ#0u^ZsDF zY)K1r8v-|qcz*?+?bp$!W;LvLXutkrGW(ceu;e|H)WA(b;2xWlz+WftGLTe}YwV3c zCXywinHG=|jj*OI}%bnW$NG}V3k z{;`&td$Yf+A-TX7cWKcM2$a1F3KTz4a;b|K-4#ugw1J1ae%b92#?*nt7zhxPHaFaVl`JAK18u}D2Nu3j5=8G| z6}kxrf$Oaj*f=g1zHj=8wDvzE|INPLM*n2;oV0WbQd=J!xx62mF4KgYt63>j8sKyy z9t@n*gCtOnREngV;CB+5Wx0ZW1{>X5KPVaTE+-*-gud8dx-n6XGxs+KKSZ@H*{F~P(S&l`t~pI*RtO_eZQk!kzC9~6njM35T%$$Di~*S==h_^;jyY{ zt;>ZOz0etT4msLOyI^DD=#a0M6e0A#;jq7dD2F;yJlyZZdN-V%aZl?dfQ&EYvUSwR z8tc=kaR$jgG-+M(VcrV8=zy2?%3|QfXl;O=?u1_|s4fr5(02ePxPvfyx`8vAKlST1 zgfzO3q0k#-u(_aDfV~ZQ>Rh*0R$N-ui5&XucCURQx__K z?`QU>9;Yb>5)wB-cnk8?d(otn42ppB?|u=OJB&>U`dQ}?kb5R02g(0?&;Gy+VwR-m zr{|fve!!gqG%*F@GgUN&h6l~#@=1oX(*v7;6B$&Cu5rKI2MQ@cIdHVEA&IfPet&ed zE(@zg!n9xgXkAE%45>5U$W{FjF5lXJq{CZ*S%Fxor@jiB;ukGt#%|b}`(*dnmRy|q zy+oYJASf}hG^%(EtlU8s=)2?h}p>KDX%HiQ%K*-*b-@(y#%y;mIr z)YduB(F52C#VFwIyDDS(12*-g%fCfaZFUS=oh$JMxn*3czFLo0Nxb0&cfVb{+Oqco znzT7Fs5{Vx(Tu{}GZA=$R}*0A^?;+2f8rU&tj~YSTGD$kRsru{A@mz8kN})7!7*_p zK6=d(`(2j+HfJqzF3RSw1iEn0KN73CPNMelR5u$G0R&J`_RiDrlxw2VYf(P4qC zbX=6A@Qa#tB{a+eD~b#a_Bu1msV)NQlOGN>7ET$ZDVB?A>u_=J?}XFC*Y$2(!Mk>{ zt>Ar4_5+yl3$1d}C~MpLFlzj@hPqN3=88AP{wW}YrwkD29xs#uFnDUM^h))B$W>sX<&AK1PM@kl0-Tc9!c8kc;w02m8>roM>r zSq3|eqXQ_n5Z~rZvvz}e_PBX~3S}5-Xa$7zMW0ZHJ$N`9cMcExj3!`Q#+_HftAUm{dWwK8Gb$Z!058l8T z4v{svGH>28E6{Hk7WT3LnWh|8X)c~W=VyP$n~VX_*o(N^!hzR6hu>->ntiW-LusX9 zmzBUz;dbQD4EPPbybgJJfB63DghJ>`w!c+F06MtoTN#X>MY;#qt>9Jn+u)Y?svG`w zf*2HM?ftw`K}t3ggZi%T4DXOAelzqC+dHCz8#`_}@1tT5d>y+N{TA>6Qb8W<9PtlW z)2w0uTglz+WA3)iUgWYop1GK@SDh0=dd}5Sia64km2x4HSQsj%e-~*9fzqDaW9In} zZ!*AyH#{8P?G|4eGH?4_aBI{=T_6w`5PO6w&!9z?hNV@L^q2jEWTSa{!^kIC=O+Hs z*Hvyc_G*2#iL3V%R6qMVgI|9U=}%a-HeD9#8=xjOmCD4F@SD+WSSqzp_j9v9rM)ar)S}= z^ZRM7jcfpl26=K3Pc3@DYLa|yrT%QV@`9U$jqYk*zAz$^jz&^Ml!Ff3{`y7JRVKBBYGxARPsT z?eU_P&syB|^zWFJf}31F9T8C#SUGFFunxQ8ZaG^J`V(wV zIT&$DsnWZZVrW3DSa0v$4yb5srI(V`0DkR9f8}3%8%*Q2TjH9*EmKES@1|sm_2xZw zCs+oIcOL_Crk_AV2ulBwhqi>APrzVml{mXfAdc_F?r2K?Xh9+D?eWd{Z8jzZZ&1V< zfDFCp7vjSN_Rfx06}eAD#rz3hB+NC1UW#nlO--(_z=9&+WXvmduN_|$9LZklE1Cz5 zf3QaX*@c8mIX-+BbN<7U_LiSn=``z}7;Tmiu=|B)jbwK|$e!@#x8Yk6kaI5&Q*Cn2 zM^jNxq+c{bP{6i%P&wsMA@_*8nf{6-fwN06hr)KfCD{mye;Wb*y`CF^M4FDnbWzDg z8qRHLAp+S}>(h+Md8KhYpAj9C8W$Y`f5$*E{QJlc;*w5zZ6p8{7n0(kpCrUgs5zUh zvW1gbs;iB3Ppl1&Prfm5v77!@Qh9Vl>3X;f$3H$&q>?sRlG?xU=>G!S2q<~6$N+@hxZ9GiT)cnHWz3SykifuN)=q+ zTtUM)z*1>VEiV2q2Nr!w%O=ZLjg~gGu6+#3on>7TjCQP*$ylq%TjWfZ;*RvcJy?G; zF?-~I$kPROf<1j)h3aSD)xSmSe+I5WB&9K*?<&8}CkC;+6b`)`-+T#}F=5Ht+;NLg zRb!fuGDw;vnHeEPyUjM1c3;7wm#m9HY(dRjQpFHFm%9T15hoJ`n9DHyrLDer%f~o; zXrT4Wpxsu6g`fjK!U<9~Z@ZuP&rGlj9b>~Dp-)QW_)JvhHn#{~>^r%ke+mP;BU+Vl zN?kti_4CEfv7m7UQCyX+A0(O8&s$OuJD7UsrI@Ei(kTGGc+VF?_aHJtwGv7r^TO+`+yEX_F90=Sf(ac zx^RnUm$tN-^`H;pkXejyyMW0dKpgMS zl4f_s=r_%oOTSxgrrH&Y`a}V{aD1BMNCk55H!-<+X1fXGBj*U$e`2oM@5j$n6i;;9 zhY0vK9su(64cxsgL#sF_n|C|}i1`UU1F`mGEESC$07)2C4xYdd{~K4lXM(7@!NO0k zZf|(&JPiQhY!ld@tDmO;CG7 zmpE|BTqnPGWveIIf6zVx^gL%I3Qt%6Z<0PwZ)&|SGw-mvVyDX5kij=fWhf0T&+(eP z$72odMNMks6eOT4pszgBRpluK<3!TgSFWk=CQ9EGAtRV+_Oev)ati9iryz+C+9{wN zIe1y2>n-X(qasIZlW!z{jhH~oUx+8=VSkbH81O>>)CrC0f8fumaw;QqGg{&qf!4HS zZirooxO>DA_26<^-QJF+E^ZXUOb~biUt(N(kZZN^-D1Nt)+UK!esexI-bKE$X;r;y zaJm-hTuIisSbS-I$={-ud#&He?04vlBr`Ud3R5tI`$Foy9M!uR6B>k0%^qZHKA1^1fP2Ec?jV)v#2iS)1vYFi(rP!Q=gQJaJ& zel7^wNGfL!9LR;(hG+@RC=FCGVf&amz=j*!FcGlc_k-X}?G3thfgXiWTR9(_SQjLb zWfEeRDLAxG<~n>w5OT88;Zr%aB$S${gET<>!`E}yO+jBpAkRL+*(R(>Gzy0rUru*a zDBnnNL^uX`h@rBaAnr(xE6}RzV-!;Ks2XN{<3gmABcP)TB~<(&r#{kqKd7hz0`?`y z^h!V|Mg_A{L#F|MFl3jhkaPBOdR*Gzzy#9xY8Koi=6r*MNYyBdphH1b(l*xcg5Im7 zS}??&Ma+N$&>Pz@sEUhro6*I@3*-*~@2O^HO&EbX$ji5vu`Xl6dW$&I z$LR@26$MIxEU#GMTPqYi5+TX(S{)LfLU>c=fmciiSbZ>|I40w*SF{dHoHT8!s~=PE z2ItscfQK}k3!qaB@p{12*{3nAQz$Baw1GG_6zKsqaq8Qt%&Kvkq%wfVMu9^}|22j}K@K3O*Z`4w{Ab@`Cc$uxB zizcL>paa_MC@e;B=}o$7(t~s1?h~oWO$6-5t#pO zBveNV!$Bi+cO+Lz8);RKtA8P%hIrep4PURrt`kVhyGl5&o-gBfS{+hMp+6+#N1alM z^Vl@Iw+=3%-8$3r+rqoUo9^?UXsQpqAk?}|4(d0j1Ybow54SW>xV29Z|DD&**dMzV zQ)X*_D*Q*vY1UTB_=V?GaydT}h&&ru>g;1OHzx}L&QQ>ADcxDLO=a!d6;A$K{Dk;A z-6Sf)n69tVCVbIeL3~0Vm-+orCv`9pM1`Vn?bmXd@;0+o{Gpd*T?v?(-Wa`Up)O|S z-KN*vC(7!FNgDkIOTh&|GVME;k=Gspg7fo#>{wZ&h-@dfe-Nl*6D12irY*iBk11dB z^a8ncZnQmFVZQjifxA?iYsRoV6Az3i6$ZA3IN~)T8b6|? zkqS-5FX$~Hs^t!hJ281B49PGHcCq?)v8N%6lG}~uKzf0^P;}>^6b29^w0(&R+|<~S zj`oDv`{&RR({||-kJ9@766lyVJ*~SauEAZ(=hs?F^m^vp2kD)e9=`L#pZ85od(Ess zplHccLl)ySgEdT#}B7{PXq(|H+NreU`0= zafjF0JXI_8wcXiqa`DXbd~%@|?sv)oRNOmGy2iuVQCUP<+{v6Af2pMrU<~FNm>A){ zwR;qu5_`>GfQlBL2et0d!ZM&zv8m~kyLsz-&GcDwHBm`D{;J&Ue`oD}MlX#%_KE)z zgyXaFOnBG-oahv(RRC=W>1CCR+ua&23rritmm8hH2ez95^blQ0*!J%5AyWM5M6<7t zSHuS6jhz)3Th)=+h6=D8F#v-%eiZ4&t+y!jbN%OPCwejftX>L45?mUZTuCQK6{(^DFRKFYaTe@WO_jxT^yRYw3TOINUd zBRSlfr3XfM(J`d#D*aqwcpc3xp$YDmcK0>PoD(M64ebWa8=Mk~ORj_s2+Sdg zJhN9tQPMecGQeS{8McB^wZ5$AyD8i)xFFt12&)P%2B=?WJ$Pf-VRWGxrfB;Ub%FxP zg_T8Eh%dVff9h_bf_TZDTL%73g9s4Q9U+$A<3|3$eENJ4;j*ox(~CyF7vDDU+R6Y` zqt_vgA^hXct4lu29^SUwi0?z9hR-oVDyha&B5hWcnDLIcA&-^Pu}Y4&2s!2p#kV>%J$*=P@36nJf1CQH*gW7ZyZ-un6LI99xvrT< zXT=gd`0s-y2Ys5*9x~# z1%m9IK9;7*p(|d86|NR-)c{UD-dr|@6eq31j zHHLe{U!}HW>CD_%;z8@@B=&umbZICBt&it*f0fH2=xp3cd7Y@M5%K6M2;MZp4c6=B zypOe)L@R9PbQ!Id-)X9m zBqk(3S-r=ugIup6LN?ypcq5q3=Xx~Zn~FzM@~>|jA@w-pbPm4x)hC|Mcn-;g^x!#9 zf5;&A_P-sTzf`Bkxw8LMkZG7G1%oT|u2RPYaLQGGjN%(1M&TaN?WvqSZ^BIP_j^=B zq;uRilK1yc%ngA9jgBv?vue%je z)Yh|iC(wYy2%8xXFYjy2DLQ$DMnjKde>6CRvKAJ}k-A9CE%#%QiHckWMf(+;JDhBU zjX%zGABd-~kz4?%qTn z`-h4^dzJy;aEac)Swas6Qm)m4f3V%&ZFd}U?#PC(x#|0&snfLz&zb2_Al`6S0-ncV z!Qeb;ck=4{W|(XV6-z}WchNf+ILut11+PlZMDCz=z-+;VAn^BGD}V~>?hJJ+FY3b4{vUA7Yz=J9qd%g#vA#gLXRljhTx0kka+QNMZ8r0OlfJB-1CVw1E925jLt349 zSAY8?M||qvle|ryO}W4$e{r`gk^U&O*XE2&#uw1@z!N;2lLQ9Y;C@w*;Hy$%bsbQg zb+~MIBHFxE)G2L(f+0n!r)e5{+O-3yF=gJ@O)&|QX4SoLIBvas`HE_3c+Gzrxy9eX zNeF))s{JT#--kw@n~(?^u|R4dSD7TG&?>0>RaQC*CT_-+tLyqXf0t%4t|eWODsJ$f zG!mT_j(vsriM#h7J~{JsdN8Kw4lVIG)YY{?VoiEKV<{}Z@-_}@@N+3+K2bHurWQRv-&aagg0B`mqRP%wG z)mDyLfEAfPfB(%PFt(^GGO^ep#hpMT=z=fDyTetSN~Xh9wkELqIcp#`{j9n6#IoJi z$XbM!nNQP>Wub;lQlgjurFSRY3yIRJ!Bzi7Ps2g4^fYU^sD@>UG`F48J|&uj%v`50 za@1NHP;A0pDnqvr8FQmodZ`#Z;seeOh~+2JS@Y9le`SW6((x9)iXSfjAHiv)#o-?@ z(@MaM@6Q6xcJu^tKvQxKUE3X9(_1TJ0}@D=V_eG3rX{_T4<|n8vd&`!RK?*dJ)=aH zAzSjW^6l{69#yGKS&L>`i|pOda^=Fsf&Qg;fM1naH>;Jf*hK&g`^i>498Tc`4!vE3 z9>Qtge-h-vtC<(7W-oq6ah4Dt40YY8w86$g`7SEG1Hb>u6%|~Q6#>e1TYt#Ga|jp< z$ZU|BG8_(L>-o#?KGB2MdB`q>M1}ekV?=QPL@HWIB~FFF81~63UeOEIDP=tp?}9bj zNz2;f4gQDAv!2o ze}B|PX}@sa)I_0c?~4BWe{_DHR?vq?&6ZZPToMDUia$#fC=a? zaDjx(-_&>~q{sX;MmfwuTUr9ovzYSS1BEX@;x61SG)Q$N3%))M(FrEHc9|JL9utto zX|Pwrj*p$ajCn=B)G0IO)-S0G0W0Q)1|R*)7U092=yrX z#d7_W+sUX`w>&Tmkt9MS%d2q;m3^Y{i^W)`=-E?=o=l9G&Jb#d5fCK3@#S423ux_5 zN~LVo{16DF68J&xMbQ3fgSpb|J#gqsI_b5oC6E-f@KgC~>QF3jl&X*i+otXDPL5EMQlRu+f<`)u%0Y)W{0J4_%_Qdx^neIwy11o^@47 zpDRtyvo8=4DGP_x|KIRa$cc2*hpFqVAv7!&rz4AjpR(_ZZP9{-!3^!IRJ;Z$jVXp( zQOhsU+gW1Ze-Bl1yBXDnvF$iEfBwOUl9Z+lCUk@$5jv6bcKf6E=Dt+{et<2enTYIJ3pnswOvJBGG=SiXc0%9P7d zJol{pd#LgZnM+6UMq_F>!eS8Qx<|>h>8{1`+d?()vSnXNXEN-DCtA+Fe{T;OYwNHS zIS_YNEuAHLL#(&RVWv-KT-O5YgJ2^XA{Apo0O>G*M|8zLb?&R)CxTgK!UVUnApX_S zc2&2FT36GTgTEnq(E%$N{fN$FpHjI^?teqq|HBP(@tVnVth7c;`l+m2vuQ@ziY&_H zThQqjEYswC+qrYVuC5H8e+_dCknLdXIE~9o16g_**2HML8`h7FR!4k@-Nk@b=jfcIZTMf0UlZU=1(=Fz(#s zIi=YxdA>M%p8vyfYQ~1zp|#tf>}%0mFamJ6(;Y`gCQ$pgn?y&1v~7vF3$Zb^*(f9&V}GMRomTm<0}M&)v(;y`eO%enhe-|sO2^%ak6j}>eA82Ic z1d3Z9pnDLP$*p%s&N{+rp#cMfRMaJ)DO6X`Yh5TI!tA=Xs{9g?;Wi+B_Sr>;vP~vj zDI!)Lma9YKCu!S=|sz5#$#{*alcLZBs1s(Y(K(=d+JDG(*9j_amGNP>}>q^VMnKth)V?4p`@00b$_@6or zB7TF76mpwc#uzf?U`Jw-{}O=|g+d*28{Dgv_MXQZf4I;3FE60B1MD4;@R(9?zS<>v zvAvwK`>sk%#fw9!h(4LRN#nq_r!PZIa4)vdqSuMBe-s*en506yFo2jP#B8#2;2PxJ z|BBH6op;9S!;1Oq;xE!ILXy6Rw$nXpbEh^zRll)fUaDmKfam9M1gR_$4fjyYU~b%G zt2hFwf4IU8$l81EdQ6(P>LWw5<;7ifu~2|LYC0=HSQiqV189YGM*^ ze`-AHZUeSbVw}ksPj)J)E6CppEy>m#sU&116BursFz^>wMSoJPuPswUXgSTPkB!PY zCJHwT+=oOAdQBZ?Vrl(7Mz?OfO8m9h@JecZetEdBfV)5G^>*ye#C>BJq`{GaWPkFyVJ!ycvwNitYVA~b0}J5IU*vb)-bty zj;UCp(xQ1o_JKDmplQJ@i5uodkhK=;8CuZXP-zFVGh))*c=Ww8W-2X2-coZg=uI%Q zuO;`wInpM}z*FF_0>t=@!*6PEe~hi#D&Nqr>e}E88?$Ml=iTLw38A|*oRtAY`xhRX zdtuhkX@bxXy5 z&gsFsxfu?0meRz)H5nkyzHk(lrah##z zwu1n87Kpt@Bno}nnB}QR{)7_D|2`U!s@aTS^8dvfy`-OCLS<(+A5MV%{Qn7UqbA5^ zcJN#m5wq;agGaHIHxhTJb>AyiQ7%52D-TXr{>eYHj>z7DimM-S|N3qEw@!YlteK>D zZ%OmOL1v2sqQE%oK69yXf9Dh^eBqi=E4DGwWXlR6X*R0jz3iww3ldMqfLinZB$wWX zKTR`G$snCz?jz?z&frgzhi=?FjS zH=`nKdDTX85+kjz?Gx;h&a+rPEhdzRNy8$pIbkWit+hB|x|7S)cIZz|`xR8jJ#RhK zx9^8p&*%Rx#Kd7Bf2-ZOYn)snjys9>WLL|=k=35JbEQVoumv>T@9}h;9?AR1pv&}i2m6RHnJbJ-Hw zaY02dlQUtNyqgLZMH{p9@xbbd5;8K|!EFTH9J7jeEJu7Lp&_u-5O)FaJA)|xNezX+ zttiCTdO9+eTIem%bx19Swcybbz12BgB?g06UGM6 zan|L<6_j{s^(qojiq}pbHf7o)xP!@F|-Q-~IXI&CY1sUCu zTa|n5@j^EN_T|mYAR)fKzYHf9fAnu9Sho9ri=8Hu3y0kDP!)#0b37c2lg7uiz;xaFiJjf=(ad{IsXIc$Y9_ z$}RBaVW1h!_hFZG;r&$Kkbsn@!)!CfJGN@^yeC2^H65;8_HzqF$y`NXNtfS#-J|u) z3F~&+-MrIY0TH%OBz^?qi$uLVptx`)nebW!e}&a_#h76^Kv#5QzXa~00g`+o)|?{_ zbYzibuys9}vHs$2D#i9fo`B9Ob=Pq=Bo5tBk>S8@Xwu^TM9?Z4BadzObYQD$a(gw} zTWW^jj4V@+X^Q(5_*Gjj0faMks41dSS={veq9FzrpZxdci*~MRgd|d-w%eV?eDjLS zf8WPvi}w`|rROiDlwSx~NrVBn&Yo%0fxV(3NT=t9fG%&}Spk=znSdWo!+xwHvN4|l zj&Rb9*3gzCS0mzQC5_ocPzJZzzp|XuIwT~SiV8-bID9T_wd!K@leLgZ*qD(Mrx`ty zsu`F())M8noG z#rlrcd_rtk_wj+5^`_K3>6s>{)^dxww{)0R_i?Ckh7;#k*tnPZ4QriKw`SOIfAQ*B zBwhGVYL0~xf@= zJpj;nW%o?Mv5jp!bVM^#Uq-gjk;Slg?V!i$ZK@3~iVH34$ynnMwR6par7=5?7EUWS zS9Q;NrFTb6gB2_R$=4NFh%;mS2;W?#YVkSMMpqAm3ecwEulDP>()QgNe|p)KE^oJ7 zJbt9FPNb4(S8(zw-L%_X$#j7EQ+gP)UiEUp5u3BT*U-iM-3I|P9#8=D`w9k0QfHsx;!XKjaiO(YmwO8Z+~cOC3eT? zrJG2+%_5R@Jb~Hxa^f~vv}~|3xzcfb{tpSMTy<+qn$P&GXk;&1c+DU@yktKm4A03X zmWFyOWh^Y_5(D|7V-i5k3?Lz(T`%Ax#DEZk6z8B_30p8Bd`J49fAOX&SY)3&EgY5S z^!)uS#I&b=es5+^0cS1hI-G%O_>DjK&1+oQ6O!Jm?Q6^78wvz5#h8)ddaR<9I=jhc z*$Jcx6|>{ z_d^T7KwPHGpX%6ge@&kN+2$ToN;>qS29w&%{;H03FYU1Q_^6HI{}7nL-Zw{W*G1$q zY$G#o$o2_;uZtst1^slAj3@T%g}z=(jWu_(7>LDTe))onWF4Y9_MC#i@fG}D8uT{g z&I8U4+Md)@D}ii_%(&p}i@2h#8DumHC44Y{QdNEEL!b&he|}z7sB}ndui%EKp5zKE z$ehI&^C_WLVUjAb1sXD^>{alV7F)M8{{}|kK_>jTz|?*)65xi_L@`)u6OomYkW9MW z$qIl>8}rYS7^W#FVLeT?{AEaL3;dy7d=o}I1|w4JW+WczGQ0OBC2V3=O||wkcI~1 zh*tznKei}umN}Od7^hvA2D9u34)#JSk{|qRG-&JBb$+a=Ir|n{k(H4#z7Due>6RG! z=_W%&f8&H&T&*=WcTL01+l-GUPM-%C4&~mMu7<54A`|yP#Q_IR+1zA^?WCT&QDrCsRk9iv&3mR>$0F4QrnX#CazB4;4Ncc}J|3iMM{m{JvSnJ`zE?-%UDtBxG2Yg#y*6lMtJ1jrn*%OqH zf90*)aMVDsRk6By7ey&zis$2^722u=;qDWYrYUJBIefc|Bkhg0Wxd$%{TDKEYr8b8 z@h*33urvdY+P~9*Z1hvdeXiXzCgf1^Z4rsZhT5*Xl;9Q?1vC6^3*~MIUoFnNkf1~_T zH2;?a?IFs~odL%JR6Uj}pPcfS51K)!vyU1#T=`EJ{*JI4+ayvn)n|Li+rg(^O9-!6 z1DZ>~AcLZ3fk(K0_x$s4Ux7&jee+<+w**yTyE{niSH0LBd=ortr8HSe>0^XdHeXn( zw~_J-&rt&mYO6KP0`#QOI!lWQf22zfdpi*TqCpB?PKbFwJ9E&_uHWF_VLlm+F=pzF zdZ~ykP6hD$sn&*IG|#t?omA{xd8-N9;wyYskizCYvfjkBdF`Vu5RwBPAl9^ z9DT#jC}z#n`tr2(&oe>^hNPEkOdh2BM{U@)Bto0WqZ#+O!L4kIWH|<8f5^Di^v>)L zPSEZ7kq=1CdE<929!FV#@8D(I>PJ97uW<@K>*=l(4ryc?kOH=HOI^NP*VR2vJ(&Et z?NBCBR!9dN2_6sk&Fh5z8nvQn6_DFFnvs&2I#*l;!IG~kDB?z*9)m8Vb`yNXKE!1k zGSJZU7CQ%On$qFrl7?1Fe<_xYET!i0X`IhTa>qaI`tW`jD0FA@c9gc_iu&G_x zyW;0BlNO$KZk8HgC6?67^6aBr62vZ?=0ypYj7X7%;OMMv5NzzJ;BvxX47zOX3(|Tw zK~uO?iGJa{XPP;`KM#2i*s$foMB#YW!Vs-NwqUX}csy#ra(!F!*cnmpI>5fAtCsz8 zU{Pek*8Y4xgLQyte`T5pP5}dqpLH&)Mku|}thSp{%CKd;R4uN{f!6YZb0^AxnOE=x zFiimkdHj6>r3B6kgBjmFM*L(uIwJbs#bvxNW3z4Zvo0vzO z@C*aR6^J`SD_|UP`NuZDX|Bu*fYW?pqieo+{>Mdj&G|I0|p7V{0iqWnyaf+k2j>*<)XX%uIaXoSSXXu768?tFZ%dgs%mjM zQ7duke_VFme-=+;5!H(^zKh%H9-ant49s7;JRjTiuMnT?la5bl&>$jzI|i6%!*d11 zH;k@_IX zY^P~>69O>+N}Z# zKw&k#>&U>5e5@CdLeDkN9RRk?Y*Y`>*m+?swQ#7u$x-I?)n2c*7r4?&3${bdM{E&~ z=;TJ>Ij*9*f&shfH~8&&oKaM8BtVR6z3A4hMg~ScC0P~>ft4U8L|#Ti7l9)x#U0j#eL;oJf(B!(3fS_SShIuK2mz4?o*0(OsYJRL2_ z%)>mUhw#NpF43WkQEa?ZBG5rd+!e;>Fw?JFi%2RI0iU$1TSZAkYl)%Q*Wz6B55Hi& zZh(_`swg;>h)U^3ZqnmH-b|q~0!~bG9}r|Tf7P)KI>Wg3bE>)Os2OxuR(Q?e{i9T} z4Q``m-j$sm`&-n(s?X)dBA42w%?&eWLD5|LfXde1c@BYwO^_e@g@DJiuhv?ZOAWA+ z!2kc_G7*1smy9D*S+10#4`F;{mg&F6=(rbELi4Vt4K>0iHJXD#$W)ojaFlowlTjrG4#8Ps zH}&7f;+s?5(-|k$=Bw>K;?M(q_Fzp7e~hv3)-Q3jwb(IL7S1BT`@2T0H{p(tY`l$MpOS_^Kl1& zCA1zS!b#b^jJj|n-OV0Zo6D{scP8K#zi_zKak(LA1GrnoCDq&5`+9yd+|Ygpf7MD} zIAT(eL`eL?2jpsJZZLQe2Y;n*PDT^P;asqAG|tvCcnmO3Vm!9X0Rr8xKm($q_|0b| zX`*d7sB&*u-#L49Nj!!KD<~3Pck@pO;obmIu(jh9usW53Q2(|-wxr{CLe^lN_`FXzs2Vic7K&nuuTgp}MwCf5keT;c@coE59 zSJJt)BxWQn-c3`aPsc6!FxAO_6&v!HiLEaMj}Stfr|6XraARP7{PPyHmh-3BeUEnm z+)>mh(n|_HJ)ToNwzpWiYfVV845ErFHa`3H(ueI&AG5!NWaZ@+qTk$Be~LeQ@PT2? zIGcv1mCt#Bz!X3vZyIwX4e17C1|%E5WK*C`Gcvm5txwJ&CwnjuUss%prKwooI%j5^ zf~rHL9Q#mTWX-qH_&=5U$)+N%)Wv64C93DQcQNzTaIJ%WIz$!;`!W@gB+J+1D5Evj zg2Ruxk6A%+GR{06&~Psm_b(Szvblz|vAshPGmz5sM+f58V>c z3oj0AWLaE;ysaJ;f940)a7uz4=<3Qk2*v5rox87O4UWZQ)y(Ro+v$Vs)ARDsox$HW zF29-t4>{0T+Jwh9-izt|GS0yUA$9})n5y4_gkeK- z)B7v8AT`FYz6ZJuL{;4Bxi|twN)~Oi_2t=|!5aM|M#i)x|2*VG0(i4(9Ljcbi1C9^ zq0k&jZcsAFLWFsm!@`61>k9wCvzQErhQ~b@(?Z%FXPWH8Q7IDRHBgr!yyxuQvQKqP zKRbCSVKoZ$f9Q{W$yT{uhlb}z3&?z1r4^?ap3J(+!OYkUAvJ!jVS}k|z{OCx;&f&4H|+)>iceKNw?32@Df>|1 zqpntNFgmV_tIX-W-1(RVj3l>|@g+7c-#WAEhyw?jtFzIIA2&$G?>tzKI}#+&TMM2AK`&ZIn| zPWS~1Ty%mP6#Z7%Gz%??7Z~jW_|x*5Lp+(Co!BiXMtCSwkTw6~qc_uqEK6^~hk&g# zWfFd`&p}M6`yITPr|F=p-4her#qT;CV`W#ee@IH>xT>{}ws3rMVY~^fuREi7j2c;h zLX{}e{wFtNg>*|W%kG9}ub(|!S=R1_IIK^mvsZwcs*szAie1PEL0b%6i3BT^3br;% z%*Hv)`Y2LKpOsL23JZS5*{1RY4zP=iY9ps@BLKAJ%^2N2n}{qgi_5mt9vWcn);uYlT9P`mDNa86x=;^12Vw>fzTeyB zAOumKM9TRUbPUEC3*Y z2v7j{lNJHve~eXKyMb%<*gmqIRTAfMCzHr&F@yQ0R$S#3QW`9ZKThJneADIUg!~7& z*+h>{1x40CW2YEpU2?!F=l4LbQN^HHOU$g%2BKjLuCZ!b4YHR%rfUk~TlspbAG>&u zvx|>}N>T~0YhD(&vDU!{AnQPuNcEnC2KRbUuTXL8e?n~-T8CN%-+UnIEzAV9*%dTq zm@xG+S4D?&I2d4vyMv5>eH}HA@R-%gx;!P=e7cxoo>iWfajajVxCsY@x-tXh`7H8o zJfUT%HIuth(64zgA#5=1xv!WKBA(q9N2v`efr$%bPp}-zNo!e7z9`6Mm^6kew&2QD z*^nnve@(6Fplp&@mX6CYH&V*7r{j|19yGRdnel1{Zy9^qnWC+} z#9s+NSikw8CA&%wu)xH|RgVTjPGW$85LI2Zw4oN&wgpKmMv(rvmOJ@gPb-# zAwGR2{rTq1h7p)|ZJK6*E&q@{C#m_mEXEo$e`?snvS8?gIlxsR;BxsHOcMxk+dr#x ztt7+4ON*MJM`d@86L!XWa~7ii(#U|GwuZjx1?B{ygFgGuWcS&p&ErYm{5be)B3-pz z2Q$}`lA_Og5gI*pkGgSMrfP=nTlGSDwn}za?7Pd+aA0uioKJDzR+I8mJ%RNr_*H+I>E;rc^&*2}tc@vhLpr+lQU{lHGsusr6pyDf8y)pOgYy1W(sX! zFR_IS-xww%P*AO0@a2)~=CdnQ{7pHH6dHPe!l=xY@<`Bk^I@8<(okz&;M%|pazHne z>Pb$wd+bGm1C)ga8fbY(o$aG7f97g~rDz0S2SlZX_s^5J(%mkZP)XP=Mw3->zLT?` zZyGk(c9mB3tsf1@N4fQa&9Z>J`=k<#UBn-MD(!y!c9C72h@iRepyxwLsbHw4`FtUP zfoKDUs{S<@gS{RtkWLROVelwxOS5KjCKfU7zvXtOJ5aVZZ{JTm?0bP*epl58g9d2(qjOgZu&@BVQPDQrfQw6d@={*J?Lt4V#|zv_$Dpod{I<9Zy7YP8p;Fn z0lixg8-Qn`Ld)@pCsCVHOhYZbKFcnJ%jDwb36wcd9QdaZ#bwC|wgk(w$j6Su9V5X6 zjB_Pw7d!I?EP=)3d4loJe?j-EDGfz)Bf|W61M7lx4Kq(Km&c@|6H$1OI)9|5RoCrr z&kYDd)cS7ii>*!vI3z@(hZ91zy_)n6J3*zta3>Q8Y24n9RwNVn)SKiLw?OH3!xibj zhWzD7_fUN|Q&+2|34|!b>f3{S2A2+QSc77HFn-2Q*StI#7rhG`e=p4$6pB+sHblx^I?SCY!iC~8iNVzrfAwoegKZeJZ>VW+1ipL>GA3agEkP4_-b?*b{ z(?XNKsguP*Wv@{ z2cf%jsp9Ea3=o^ z+BZT7wdzSt5*3^F69Zd9Pp!VN=^VHS!L>bvDbb4e_#^SOe(!lEm5Pr2MtGaM7m=hi z`?!WrV$PUm93w^zQF9{K4|?2fDP^QTLFZ=u|5I6K(R_Y#lp=htC3(fka6=s>)Z8oF z?`F}>ek6HI-hv@c8fCE_rNv;8krauIKmM49X1k4lQ)B?Vec z4DPyfe{f5hFC7wjC1jVp7wsw?`z|wHB;zw?Mb*F%lt7s+RL+DiCh6@)D9fGpX}5ng z0GP@I zJ0pC~olB)+6^~SJp^`BoafyY?BCd4bZBE+ue@>*2z|!yQK;1{m`y@*WcAL_O=_A#R z#rCiaea@ASB9WFFY7uZ*sxUNZ!DZ3KAU)1daJr4?7WqtIt6EOvtrr!JDqkk}x#;)f7pLe*>E9W%)e@@vRmfE1rZye8sP1SM`OMx~!;E~*D+|F&l zA0x62vDl%o6bS%fDC&rF{rS~r3_WnrHtH`R<5xD`J-{y877lDjt19_bfnMqL5?!rC zu1L@&!CRsBz;6$}A@oX%%;eqjT(2EP!y;o-zbAHUeDv3D!2!1XyX8^)vK1$B zB?p8Dtvo-wHhTwnvx*v*=3)WQQGDvQO`N;_`6Zi*j1&4kSc!44rnh*B!szAPQ~>se z7@AazOP3v*bEv>0p-n|X)t@M^%Ihwd=|BOPkitD%PJ=rifN<@O3s9nLf0&_<;03cB zoa~LBOP`eE955~F@gk9?z+5>^`eHSV<@7&6{Z^lQ&>Mq~Pbf&Y|G-5PtnXd@>}eQP z=Z#d^`PzI}&jggJU)^`WdA&z&-$6vgl_ha>`ts#h6|?lZb#fic>BZLGRO%qvri;?H z4z?fkB9^60^gG6tP}u0uf2!b28%A{5v0>)QK( zMNfwWO{IZS6BNL z9*46)4?I-l#og+?-NX6}0-_OPCRvI8jATA(J_6E@)(}~x8O&KYe*xwC(Uh}Q5jC2# z@>`j^TN{gJz4pNF@AhYbu3VGLDRsGAJ|e`vWsZaP`g)dD&~mU(`=B`(kO|fvdhjeA zVV$^Dd5`Q3F6GSQ@hgSa2{ny_9_jMNw)bPgX}X3Z*Z&?(#5nSWSz*?OdJ_(z>Qwu% zOv$wNcU7eVH(@w9e-W&w8pzf5qU-~jTB4V@YE`kr?jUp5PaGDa)dZXH&)AWpWnthBkwU+rg|Z3_={-mWeXa;KOE$%8u?B9q5VxGmdpA0_75hAtl?}#_ zr@n0|iKtUNbx84L6@iXdoV|>cP@M%`iJ~~J#K=R#e*?=JbYF-}u$NSR;q>BR6Fa^U zL^!{FFjM*{eR5H1AXv6Ue*)h*%S%tE<2YQM5fhQ$6?nTe>>>4BLot1lie^w8PGLE? zykt-=P{?<8v5(5aOb;Oq7mj|pQPW*?sXYu?eO@r~=yho_a^mkVb280(zJLV{N==gZ zjO&PFf2)5X(yMS=cJisS>38>7V-P7tCO%h;L=R4z*bl}N_(IDKyf7U-snT|lfkT{D zizNNC4mi^< zZu5p#dQt>bOVMboJRN-wJJ=TOtJO8z@t79e%3ud$(qWI5`Q*tDUM5VGy+rVZzL-@Y zCQqYTQd6BjvfZ-iD@MP!Mp^&pM)3b{R%-OXi~om{{|e~OT( zp>Zl=8mp2HGfNGnQtT`xpeCvdtYFWQpyENoy@v`i&6B-kgt(}W5kUZW^WoUBzKY% zw#H7oe&yW7nKFsk^sSrg_yI9Mq=5v$b6xfa*O=Xkzf7M}oFF(V+!xaqm~AH@H%Bv= z;-Xk4s9Mto2_EH7PT^UERF4-lPdEc$BH~Ms=?8e~?WgyAjtw zz`iGvhB7AS|NJG0Wyv}t_#lX!ct`teDlKg>bt`<|UMkv!FLIJT^m$k3P=hG2-mA`A ziA-1!(a&wzX@_iM3U8-HeT2|xb2coCjF9NSc9wHmWQ z{BL5jzVH;Y=5k}8&H~w}#Uk*sqGBEq&UKF#JWTO`u z3UThV%4jFt{nk#PU$*dUJzg9tlb(!wvim}PH%0kS=J_S~a@|V9e-}D`KBAvg6LXP7 zGEir570!`nRBhNX7qmfXk_k}UK36i_j3JM>$D+;j?S41R9YkYEyxmZFppxsPS|Ety zf19i0n;SZ30(Jkz6d3jO&I;$#17rSh8)kf(gNT;U!vDm}&Z(I;-3?Fs)VU-Cp_UWF z3KvhK?{LayA)bsEe@?;^>2g-WlFtKhM|cV(*~{2dO>M|r#;Tgh&)l=uV@g)7sH4X{ zS}a9#HYEJ~W*?d#K~536e(VWcnM~A+XHV=7JR@iz2V6-SA1d#Z8P0iEN`^c}iz=4bcM-f89a<6VlI7;uvWwtPOH( zGC)pO>~QjHZGXl+uj^)I5+?i8hCKKej2m>PX$a9N>Hh8{+53jy8a6?>N21nGMihMa z*fX3A76k$9b(?9ix!E6tmBuZZXrt6J!Z-LwVd0JD;>CYNQKl}kRb;zS2nyDo-Q6;S zfh~&xPcy$^e~`S6w#Us8+V_NsiDJH%h*|;SF(YuzDh8}gmedTC|KAY)1gzK88`D*= z5Gq3zl1F`msUM&2-IeEF3lgBiQ9h4-BJ6F8eOU}I*n@(2hC@sWtlw9|oQ^)+Ni$kJ z$ZyQ>agtyDY-E}n*}I0n1-fd}FC zIghB5FnA&hq%7nPfX&kwvHZ4CoexJo#Gs(P4=kX{vRPU7=$bc?_6_Nma z@5evBe>VA4G4n=R6C-&K3cE9^|AJ96j0mtTtwzQK17T;&Lw*>ru&MOpgMu^!dbf1< zejUB_Q33PXBXXwv@y4cw6Opyg$+{&RpJa?BY|6Ck7A=a(3G z(BJOR1XWy`p8NF|YyI25_9wYueSzz=p5BT2i>RtyI*UjN&C7We(q~u~we*g_TauFu ze+O`*z^3@pl36qnLvJvE@mrbC@>(O()!7+t%Xmpm2(ngc1-F+zBberZWqNOFqHhS}*Y9NkBYWB+C!_)fl{R6O2Z1C~M)1`P9T5)3!<5Fx8S>@rWl*YnfAm{) z?Jf(s@sX@=Gig#gb9g6ax%Mj1aG$UaKYTxbyV|iX zEjV%x#{R>^#;9Q=*Gn>nWtdNQe|Ruk;v`2mLjrdWM|y~!t|iYIGgFi)N%9>k#7Pq7 z+PIjDi^9!ogtqOG7F0ncbbbh&1nIiaEVlSvMywX;iNYR^`Vk7@uWT#ki8y+%pGa8i zg*{Y;#llaXSE)Hd1yF3L>-0)s0=beMCz-Gp!Lx`9Tm0SYHm`M}lCg+1e}JJz2%)(q zn7(~i+dF#Kv@Y8TBfS5IWUkJ$!~drm159_KS>N< z#pD^lM_(3%FiqcflVUv-9RIH^Or`+DdMs z&S=4BVBDlLSQTvzI^N3sW0qLy>b=Ktkcs3W(@8wD+WwQRiugVZfAr>MC7+h+msH7y zAo1<*d6jD}0sgjdi*j8#wH-iB;PM#@Z%xs+UCIPe)ouolB&!ODv-E)5p*ZC~Iq<9x ztv30JvlDjWhb21YLS?33(a(I`sZfS zBR~s%jX}I4&a`=6^i*ZTQ12JNOpe{ca?%QBuIyo^wgpTsqLK8VJ{A7pLgUPL6f9`SS8EqV`GimH~>);a5 zKx0-CZwX$ee=RqBc@=Uzl~#Caq5t+5G+rc3)}R%ZgXnquZnWT93>;&&w_?Xa`>*Im2M-fw2F= zAfr1~o+e>Te^vNZW)R@L_V6|2I<*H$07@b#m_W0?a71Nf-qB!=Uo?rdbua%TuDym4D~}K*?LI>w@b&|D=q6;hk5`!cP#)s6z=Y6NH97JQ;xKa*D7c^0;lp~-tl(# z-7%5y*@LHpHP!Y^EVHEk=|zHs@65}d?WjSmtK1IWf8{8ay_V#$s}Bu*s?W_IJFu4T z5l9E?sV}~6c>b6eRSG|UuBP%Hk#9Qm@Y;g^d>%yJThsKoUM;yKuCDU4eUE2H72#j$ zNBCS27lUz66ObVtqdR0NSi8?$Njje+m|=r+Dj=ST5eb#V=&Czxt3upqeU0X5IxYxx05^bqV~G7C+0`VM z)dW*BmycmCRUsAJKb7bsRrtT9GV;c#rPuO1e{{YGSovkg7D+Lrlm(jdjkgySo9q3; zxmh=NdppW7WM-;)ZawXC_ro05nz#`FePC%(Jq<077m%mthVDTX*(`58nDbTvb}K0v zKm3w@5nA`lEQ@WQfS4A^?_iC3dMpxUjTqYr46q; zVf0e|j2Ogr>8!U&yGhZ0s(hIv(ahE+8O$6t^Uyp&ho`;A$SEpFQF(Fd>HzFKb{-+z zgNPn^eAX|2V~;VVA$iv~i(m1L(fc?Y8`>?$S|lk@=6v^o_&9#9TFb5)Y>5rVM|8Q)=7V(QmzYO;NH!6>`#EFe2))Pc3`4IBI(eRU zL~@)3)QOxiZ9Hr#ogYeNF19PRuu9dt{RFl?md?a~tp9p9rP;fev+r_9raz1SDo`mR zN$xoAZM={iT^L?5($J&~kJEa4|@i%A7!VJ!WGO2}pWBMUZx}D8xVH{K65ck!J zCsU2VmU!5P$p-M$4197MtS%LE;vb{C|8GvuQPyeE-ga)Sdw2RYikOtu-YDOI9vL8K zq#Pc97qW@pEc7XbOWK8THlIvl-)VgQSc}*ulsaHlP^z@vOw!D17Q&{y& zn8x&HpcLM&%8J~7VFm@xHj)K*)kC}LVlXJ4_KbHYXW1!aX?mj31{Xr9ZC{_o_vbvG zoEKPVGdLpfB|w_(yW*)<|Le(M}=xv0-~lMt+G-qr-F zV^ho7F)wSjt#V=~cTcnLI!^PXDLcD6LMe0Em_zUI;Pi;TQ=8nSWhfq}z8$hz$@-(} zlp^KTsK0+`<+iX4VzME_gN@hV1RFfVrhaA0IbvWlk+gnwI4Y_pLC=`lLjO^IQx(jg z(L>*HYaS=*98fdnpP#O!6H26iR5I;=xuTh9gj=I@lclxI%tvqpNS3+FA$VvMjkVH& zV4X@ZUpG*?2FhMjE}|4Na>nV+^HF4d)Pg{+D_4bh@$Un%P))JAnT{ z?wURc*;O2f+pWA00hSc%>5I>m#6lE$!roosir4x>*2O+C#*(;TxcT;G+lbG#I(5yfjxJ zFo@tC9tq5)NR*JJezsg`66LhSa*+E<4a{vxs{f6n$%jA<&9;!E$9oeQ+ zAqf;?1TaA5rr4c-cQheZIw=^M><}TI$D9ouVqR*qTrY7}m*MuM@>-71h?cZK!jr-q z|90qIsMD?VO}A5Say?3azYCv$UCutxQU)Y!A8tVnddlxiMOv(MhA_%w*%zG)?3)_B zoN=YKHI+iaTB*D$z{o~RoPgU2qxYFA4YO=e_o&ge!9XU?PX;U8qo%4`d|<(=A>Ai+(LN%J)K1+{9zg`8fVL;{n6Ajn0}HwFvIAuQ~1US zFXF$u;DE`0A)7=zYA1PJGziW3ef&e!*2Ji6QjlYs^B57#Pjx&6*$kv9S~mJby>%%P zBcvq|c;C%C5KQncR#)EptbA-nY949m@v366O|kpl0B&LWlFHJc+49@`Gh8aR7SvU6 zZ_Q!+udIG^FFu7i&Ks0xg%3$&kj?O$H{=8?Z^#;i+MyT zTpE2s3C*;O&jsZ^U9J~M5da?l&W!FY+zK91`hUsWXEcYFtH6$4xEf~bfVKG zb*-+X|McO2>=jIBNUxlNf3>qxxbRa)w=O*ob4TC^_iZr>uU1zGSUwlCHdFJ+`UR-$ zlkO+MB$)6aytNt#5_D>y=!RP^?8#3mqX8;^%wK}5#5-d+$xm#BtztHjU~YU^%%~9~?I)X}Q9B&qTL! zb}_2nU{H?G5L>30>k*D}RI2=^Lu!W&(p9o#sYT%lGdI?iDKx|JDdw)mh&9ayJoK`E zDXtd$=}r^XPoXhYo6VRmd@1eyPAC?3(iuiiqq~%_7lpGKB1Yi!UA!przhzS@B1$?p zSa{H&E8RJ0Ca21n4P${q0aA0agYV~@$G@tjxr)ORJa*SgzREP(6MZxIen7C*31{K; zAjPZFIonemuU{*GD%Wn=rdsDyOd<<^TqVx0zq&0Y}xVwpW5tGRL&*#Q4rrBUotWM;s>YSQ&PD%dm%YBLz*h~&7{J7>~%AV9c6 zo*BM1azQ}w=C0y!_quZ)i(j{phPxZEO%0Sc^;&uvFYXLUSM znY&~s>(`I#JbJPvZ_Jb7U7mY?HL|33lw#+BE2*h8MdX&Sw5Sv1ULmW86Fg>2W4Y~k z0{Svvte-L@Rl_kX4%~?Dh=;*(k+NYyS#XqMIyx|)PFS`g%;_l#&7Gy%C*;(zw0a8< z2T7<$6F}L#U6_P+Vn~`<`92LSrZZ?7mci#eSYL}iaWwDjuNYalbkH_`L;8I){)(#j z+U@10;yxreu0RWbdFa3^oCZ_h3Qz1xX1bKe*%WKTa!)z-_}zkp+C%D}Q3X_}fVLxq znUevSnRl))RpNo{8_n$Zkj@n-854~lW@$UZ90$>!b)dcdyflQCfTE%BB~F69!#@VyF!~N=Pz?r_-iNw+VDcl0_wH6t297TaLZYvU;j;f zQFD}~WxU|md>RLuW9--gDdP_U1$YNbn)+DhB6L>)VrV2_eUC|qARm4`Bo8$+Tz|lO zRBRA3K(dgotJqjT3~5U;<$p`@-wN!{f+*6$fU8!O0M6G|BMmNp5WG0lR%+_$_eWQd z+9B~$Fz$qTLr!~*OBJ3~0h{kDDUU11a2dUVJr|zhTAn@E9??{b^^s8l|G$(|CK#A0 zv7GJqD6Ra4*8j~v*aOm<9#$DvaRiPz1}a?#ZQ`@sP3M8nb^J;Q+`BjBc|+t`M!M;lOS zlX09`Y|Y3VDweZAWOMQKm>@?z^6E}!Bg=R4DV`7U0S$5oo@2L`WfE+EM}#6$i6J`B zEyr|!!2EznY9p5lHftK6*w%xFA%a0ppxao9OFTmp;>&n{s@B~%h2o7Bp)3!phWorq zw?L#23p=XxGHb;|(kfvs#>Au4dBcx9vYjZ1idt`js<)gr9cIn`%UU~cu^IxpxG;CW z7X7m>oddZwKkL}ic9BLEj$?(t%5{GN8(M@9eeiP{%WgF@Cox><*>SKkZC%&d0?N4i zw7Rn1w#q<%a0W>p?u+(i7=0~@klEUKN6__U*hBdQV=XDC8(2UECM89$i1>DKG!UMyshV_#-%txB}`eL`# z#)!s-lgT{5JEK7=gK*MC;3}*ZKv!0&+;LEfHDVvdjtv9H-;g%LtV!Fov?v>HGaDGY zbE5W>`u10}6{ao;Fwvbpyw2h(7c}@r<|TM#64T7A1apXQjL~)hP$(n%gFqox$5l%H z5uT}kjBDM6Pd9+s*5?6ZR(5v#nFPvU+i7hz^)=#)8>hYc3TA#kmQ|KTR!wpbPM=+KvO)_QUDO5jc5Y+FRZ3J+21!xl~JmBOyadqz=yCu-Z{_N@x_ zC(xE}17Ty$I2?i1OT`|?0)gt^fID7)%s-O8;xdLjGS;i7Oaq%m+NsraDs~hP{lMAU z@4^Yg>0i@64(>KhS9D6bA(B1cc#>_mzPOw7++(LJ)nv=bwwuo63YQVr8()sEQmz6^ zBE9MUTL0|qUVpsKR$R$5iG@U?oHrr%la}oKqGDR-c;u;=*r$It% zzK^Nht}cgch*0a0VgXe(1`)S0E^peHU$bsJn!~-VOYy+Z93mN(j42Mpq7{vVZ{544 zCYb~KlFPCY%c@Da2ThlGv4aoO;~}sm>ddp#7i~b-P;*QXFiZ2a+Soau{()Ub(dvxA zvTtL97yBgoPsen0C7-z0>w=#jUl3F102uZD}$Pj7qI3~xY5pimJbP{M;4nvqHT- z>9!E@e3mE4&ILe}6b*EEn-m0-o#-{7I;2rtE>12C#0*Dutg6v7x7fozRR+n=+5U?X z@CHhUokN(H^{Q8|s$vT{zEM32hgv7v>yJTj#DVr9u$`G)IYDl9F_j(D&Lb-_hD&Ck z6iu_&ai9JPB#hO%aRP|u@ zIuraDwgyY>l(c8^jnSj~byNI8()u2Egs8Hd8WEEm>uh$jT13t?YQ0WpmFKq-TH=82 zm7x8}oK7LiMZycgfX+AQU1*rmfqH>nj^w~FK8SjIW*5lAe(be>CiXuRF8Pogs4SFB zy<(GuBMDjSU+^5D+bQ~4?+s-HF(YB086F7W#-t${O;LYD8q2ci zho$8mcNJ=^f$#bgJt>=E0`WT++J4YFk`2WGWO)3F%M{T5`&?L+Y8g( z>Z(Cq4VT7O=7fU04fxW=(QyBf+VcEh24$D7pKy&!UtJG%{orKin^^hRya3N5e(Wo+ za{R5m_VI?ps0AW$?u=#~WZuMjXj7n|Z2)G97Uk7xCxKrKnT0{n8aBYC4`4`RU-n zNV6pi^thf=;Ai78HtcBm9!LX*8J4g4vQk--iaJYwCm89ixQNKh8Y5(UUsm-sXzGl* z1k9plA_qSL0!x^FJIk@*8$XgF4uj>=c5hfdTw+el-p>HlI|ov|=VrHQ4L=R5xS0DK zUOHJ4B^-e7hVFtWr7nvN`nD29B1}3XK1s7Vi>J1LAjS?-J~h?6YU zzBx{RAOt^Zk1p;M+lhU8Okz9x8s6vBa1~~e&zitSu3ad>A=;3xRWlBg9}YWfpT6v* zD^hk15X9)M4vM^I^9(a@SvbkIB7T$W%JENWDcpq8^-2 z&157T&b1w0f#Q*#6`uvC-iSV|EEAZc_gPneIIg>UJVG@)9rvC)PYaTIOFgS6shs16 z5;+xmuGrAj#ZOzgxZM=F-^g5wbtW0-go3zozrv1dAJNHK6$;^KSQX2 zi*#M5U?gB;PK#~F;LQ<^P{VM#@iaL`!$4T%N_nFw_If|NVBlG5;{RjP1mD>!tv7~q zlsiWpuiU;z!V5MDhzm1!^iraQ^PhQz5Rmbc)w}Mu5C{jWFE1(XSUoa&~L5HH=b;b-g> z30ML5z1UYYD=u~4ML06BYes~BZ%jb}b1AaV{zH7k%aP`&?_>p{BL*he27X6G1_P}#kD zjtY@rB>)QiiFVp1yh|jWD<`nA|%;=iQ!IXc@5og z4@SL6YQF-&DH-%*4&CRg-K>w6)`2h_16Jx7`#@S4j9sgCsOgoE7*r3M+&Ouc2wyyx zFk$%hnO2)ii28~h+xls!bW~|I$&4W069?-I`!*E@{{^P((!bBmQ;uQL7*&(WxA8nh z$z0F1_hNTE>H!%Zy=X6g*CMNPtg~9B*1AEu|07e$V2NbHf$QAdWiE3)UEvhBknnNe zdT@BF3o|0rHs|5uR>CSmKyU>vC6KZgzF_Db$)A2b+*MT;HhPtP5ZoVtfx7=SK3E1C;V^ zurnhKJwuYbkAiuJ=V0AjZP4b*75*0BuZn5$PTQ%sp^K0^)Wit`c(7e?qA*b-YDu$& zCBOZ7Pv^5CCbG;UiF_FYf;x_)A;QOvAUf|?R#xz<7+Yt5z`on8%_91bd^s36_vhO) zdkC*ocJzZ|$~%FOC2=k7@E)x!`(>`uOyop&xwL0}#{fLevTq6T8I;Md)g=2vp)~QDUgOOJ z=W`touh}_&BA-3&$ka8_-sJ5WkIl(MBC#wgIVQBTzn0MWH-S&*nJgGFox)6(RfKB~ z@4JOxY5pi6{;W_C!acAQ3y))$Wan|X3p^y4$tQthDZ0a)-BdlTFQCw3-JVb)9ThLh zUG_C02Ez#*0a$$d>%E5+i4$D!-1u;^m+IA6q83|!be)tiN2Hv}*=3ngrN;Y7uaft) z1UA=JVzcG7LY5gR*%r2(>`&66J#@~#<}@gtSa<0U->$I|=GjA{qPhC91zc;9U>?`n zS*;JX%H~JoOkK0kUAB5D+M+V9NVU5+Kzdv0B*1I8R$h!&{2YVMRCbfJ7Quf>VmjrM z-3kEw-Eq1@{ zTT?h6eA!$6FasmZ`C(XVf^((4`&JJ9H>?vlNTLx%LCz7ldKUxCJ|RrDvGZyu`HB^d zwT(h63qX|9Zle0qpwPm4boG3Mjuh>FS}{m}ir`(*LEu`_9!-`i0}We4%b75J<5;Xg z#T?3~Y~rX-3uLfh8)Zgqoibs0Aw9~4#VMCg&@rJ2Ge-ahr)J6bLZ=*|N{7J9#tz6% zEyzsd!#C#Sie2uZ4;%%$4`@6;luXT7fJDDnfGPmXGh^e-i%%hPB=jZ$Kub8h`A2zw zC&>P0cw4XfR=^(LlhH#!Ryav*!iL(S!_yoFZ@Y0(zgyFKSR~(8nGQoMf^Nv*72`;a zI4x-v1tr;k!%pamOWVS7k{&Ayz`Pr|Jbm$;1TbaoXGGz)6Fa^?+8>_LtlYVnQ-7@t zw@aHOupCK;fau4syRvB>M*Bu(i6#Yq{sTL2iQ}m~*grc)S!b$*OwivW2&A|tdF(2= z>qYAbR>y|P{$kH80Vpma#q1~g;X_m&nfZRr+nC+LLPB`Q4kTL3)rBPt$$K6klviA* zP!FiOVG$NBBnC4wS9vu+MYeO~hWE>(uBXbi^W~LR1L8?&xIdS?QJ}_rN)+jm6i-`R`^#l;*AKFaFBNz z9PZ*WLL%rB6y*#Pw;4!zG~4Ms`?UkmcF~H}%%EsW`l%Q^qY!@ER#7p3H7qTIhLA~b zJmMb^0@r<7Yo(p~N`w&XsLy`wza|ae?DB$||EebJw$Q`{UAzw-C0JcVCKKHF?eNQr zklt5O+>YU|D!I}sdJOen{QmPE)%|)IHqQSmN3RqI<{F&pvA~eMZ0Dc%8F#j39DVnw z>-LT>UYQJh6Q;mLMPTh(h?UO$?9-WZp_&6ZE_tycgSlnsp@-0Dk!4=1x!kh@r_l(! z90yJfx_Jph=YT^NpxuhswAwk>z0%&|l?|4Lwq2GlDh58gCrH3E?ZQU8s%i+SS2u(w zAQ7{ZNJj#H>0ij9C5URqg8KtuuDZ=fp0*9xBA82*+NTV~O$&~`u^nR}084QOL2`K* zY8X>Q2}3M-uD*DtM{b?qWQA#rZWCKAtGuT@<=1w5)DmYM!1?DcxSxD`WnDSs+E^xR z$|`2%QS4jL#et5V-tklbqlsW>ecN5MM<8#Uur}6zR}O30?54R{Y)d&9$u6vr=t*o{aZsrzBxb*-!h8|-hZT6Sx2u={Ehc9jkATVf^b~H zk9}YN|qN!tSs9qiSx-7 z0i$Doj?9`~1&}O?^Amp`9hu2&+BFh4XhTTg09AZxaQ&O94jrN!t zk&84Kima@P{ey^~wr8&_urDVsgdsm-VOi$pHrl9B{2bLr+;YxSS`nP77G*`!6YQzO zYu408PLuFOFL%b6f^?4un}viQ`On5uy_5&(ED^AA7g(G_V^nUzKKR&OZv1|S9%Z+j z1juC?$PwaIH~@|T;H8~$Y>2j*bu^6{^;NlbF4RJ?>PpZo7rKp<3cb7l*S95Lr@;4Y zphdI9O~nF#kO`IPuXnN!_G1vc=stwGmVFZ^Hvh*&Yh0B^#3n;!2a>Q7-PCr`_ep7_ zp8@>5nh`J{9%m%_kKM7$J+26 z4%ce*J1C$-5TDou5bxS2Q%i-^i|LcRxe2s})Fl#RrfPCMGj^rADcN?@K;owj{oQf#mKL|zp|vO0 ze5j1*OT_0I^o&gaKbqmZxtW6hO8HF_6Pllz9Kx$QvcZfN83YRi7t(*A3P7IS?v7fp zGP0)uPPT`94K#HQwP%RYlGlk0xe9yAXxm^nQr*E#e_VU?m+0&ab?C@d>UUz{EQ7Py zZ0__RFm#pXAtiF^u{IN!b3ApkR;VQgTwQ7K~X>84yaqn;X zjT5XI)HEE&mX*9HZ!)I7zdk}6_)U3!N2C}Ba(peZqTYB6mQMbLI zDEtQ9f4d33_t7*aBL5+XTl8avu6iI0^&=2H(NqnT8&fCtGl*_ zPX0$)?CsxnnfJTU4||R$y5Z)U8%|-OxUMip928)u3sZ&PoHf!W|i z@O80?=KaqFsm@eDs_n617e{i9BrEuqt`_V}0@&6YTS# z3hym;KBq2fE*MRRXo+?vgRTK%-Jl=+@D_#Oe0~-b?A^N;5f7z_E^q^tx`lA_~VV88-~q|PTFn6HEa+#V}2qkX@}ZG&jlWZe;G;w z7Lt>yXRL4wMF(eEfN@K+q$m8^f74P+2hU2d>+*7JA*34zbm zd&ySk`3TlNodE9J^vW1fBg#VKlNri>PA1+rIVVQE3kef3a_kl~r7b<0eE=p$ksdtJ z!c$+tkLk4h(mCy(LA`rZ2Zm!Pe`T_c)7q2^#kmb3B~wzoNrGwC$jKLlA(|>74`L?s zn^7iGGU`^-k~UBdDNUqlC4>@DEIk~zv3gx-U#E0KNe#a_SnXeSJdzvw`)Rdy0o|>X zR9dRPg1;wWvsO{bb0V|?U~D8wiS4BNl5dTd#9_q7W%q#E~u)F8qRd?L35!{xR z^yMDG@WY>=_SmLdz`$Y&7N^SVRWgVvEe_(@^pS#I8!gf`@7?9MFK`PLx(5uoT7%$Z>mU>6w&vvwpaXLUS(Ugf7jZ`w-2|AK=8oB!D_u$0B}TlkCVf(uL{>2F|CD}H?_dI zB;Y721eE<4+u?rkpG@A)J3S6;zo- z_RU>R4WlQ-o^uBx_g~sNLL2*xkIq}?Ske4g_7g;emAKMSjdMfNfCX=&n zRP9G3TK(LO^OalZz=UMD$Qxm1Z}4{24t91_dgfJ2to|dSqilMNQj&yKC6U1#t+Z05 zrp1gJkVU?)+mRGXd>O47hkLptP?Wa=CJiTf2ArMzO)mkPo$c z?hSi#Wx}U*1Z>NbsC?GPTOxS6M~FtR0BWtKX<06iS;#;@XWzX}ekCBIOoh6Wfv1xE zkQ2)_?WrB@(KB1Y){!bahg>)f7vZ|pa&!n>6CA9u?U!?zw8Ti z)N%;O8qlr?mbAmu7R(n93bMcUuXQ=Bu^Np`*3yB>ywZkRz-ILaiab4?W*yYO zD@4iy9#0Tc^Zfp}-fyPz=f>*1#9)2_j$)eCG3AUF(0Z?2%+MadeWOc0OMe0+J({0- z`F7J$eYjRIgS2#8)1CbEFC{X=qbj&YDwWb>3K1p$>koGfX!zSO+=wGTQ(xTiZt05S zf0^W*-JnZ`w*gfN-2?e-4blwAJ)dF7vN4_7O?A<-oymt(-lK|zo=jpP zvPIDT#4pZV)~#4!t`827vNr*oD}N zz9;d4WGk-koH?V;Wjso1`weQb%P7(shIxbX6^F>8hF(LKlUlPIU#&2`Gvh);f6!?W z%~EcR;PtGD;sLCnzc}xKMUr6*3lWMlY@jEW2kz*c@quqt(#q<^jiiQfAhG~fNvkb- zMb;*(wrm0Yj_I^bsS9eduYfnr8{fBxf{{^o8fW+0g zX=^FetKS4J!W*fIIH48%V6qYI;*A()nmOPFjM0pBta=o;2?2b>cPiracweTi_x8V# zR-EY31->yAn_mqpjJdU=pk9UoFrHiwao{JXLC%@e3CRQ`k`-lJJh|;&e+Gv%TW(0| zd@TR|CZDHd_cGM<8Y-mYkFLM;fXz(4)di1TEnOhaSY#aPK83)(Cf_GzV{_QUCj;d9 z3goxXBCB~Z)41mn188)cS03}_QuEoOa_7ISB}i4L?Mc}|`$pcRseo+%2B z+xaUNO7m`iA|e`ilM(1TMd7>d7*kUjbUXUy?Js9!^30cT9iGK+HjM~8Wf zmu{t4r*;ADg9*8Hn$4lORg{A#6zTT(tyV}BCV7dI;i($%iFIL3D|a;knSiT#nBYXP z*1Zi+D+fFF&RK=8v5yP&rgoVpN@C;zcN{KlsbA>p?S6n<-wKcEf5w%`g8!=~I|M)w zj4T^ib(!I72>kG+HF`!cCK~j(o>Snyu=@FbQmzP(V}$vOMR|a#=B!cu86jdJCQi{! z_A6YOtyG6bb2%3ipogba zLIr>+3sLeabCWn|f8F>OvQ{;T?Z9Wj9}gy!BY{nSx8%7qzm{haXJQd~?kTV_D$a@6<$w-aIqhPG!beUfVbjH z+w@TmF7{60e=6YOdNB$uv&6!R0-o(*~OmGR_0l6}8ohzoQ zgt}w8A+%$$?rwOl-0#|BQR{DV#niQS5*vbx>DJsE^V8eDc*M`;Qh&98TovO7N>kn@ z@qc?CA`XrYtmZV5q(L##I3k;P5^1x!gU`D$YM#Nce+3M{M75;&pgEEd_kL-}?Wo~e z{V7WSaC1z>hwTmlG|rt#;apCBwDp5W1VuOF{7TIb9hYRQg>bv4SSh( zH}aS&e_r()axZ!7AUDul(DLDYTvEXISh;-C0w#SRwB}_M`dJdBBQa=RU&+Y106LCW z$E>#?>ZLZKSf#6XKiu?=n)}3U>fx}_QDlZtf9ITdB4|APWPs0ck1J(sd8hyYWNQyr zmOz+Ph+OlgF%gtvJf1Va_glIAkrQpFmN-Rrf2S8Q|2>irjBD<}V4FA9N9Xtr0?_=~ zX3%CnjTc+IeMMwV>!+1UfiuqK>@}xC|J>*L(mJp!*}agBBTirAh@x17?7tR6ZmRID z>$%j@x{CN-imRsD?23roA$W*O=*BCfLg*{2Kl%cC2)L#7;F6NBVj7`}Pn6rf+s5~g+!V|6%=IKZ_+Ailx3ZHzdRViGMn^2@ zs0=%Tcg(`LlaH24tX?o5L7zjQK|%#f+!0+}mw z1t#tt7bcx$+;Tk~OYGs@tX;J?jM@F{e}yk=RCuO~P&dzayG4`S0(XaVYrN%L?pp#S zj(d1rE6|l2y5qTm!lz!mtyd0R{EHCa7(=fM&AD9M=|S%DM&qO~E0m_D`7VBx&2dMD zx^H8$iF6?B9-l>+2L>_Ed;TxQe=IxHSgUhz$&qoVZxFJep8t4?2<|;2e>9`etb8;=^ zmL%N;gai9B|KFr26|!mVd{joS61fE$inxFD$;F-G{|wvxJey9h4I;nDf6^@JXevB6 z2Lf)vIR1-wHUi|bk&N#1^4EwEa8LOR$ojKcwUTvaLhE4NIWQKOOW#}SlBjznC{#)SQYTg;Go%m1EG+8o=<<~5ykbM1sek6i= zl-;%GV$@$a-(Uy_FV}9Je>SCyX-tlunEMoxFPc=HPxaH0>R=~CT(MOMD{vZREq*uM zR8)xlq<7EprzUbI5c4bkK)G8V8 zLJS}o@&#DYwC203N7Q(tDGBV;UYgd$u7}sW%=2b?tQb&8eondlaxKD|w~lSiP&?gS zpJ#Se4g+iGBo8|!_AjyTX4#-nJfF*|sTrrL5r8-er#oV?Zqp^usBF_^t1EQ5D6`xS z^U0K6J0Jl~IB)7jfBRdEhb11Mdfw)X$sZRB8baZA%C@iAAVdQ+03&YHsJG zIFH~5`D%dP7YYZ6Ev{CGipL&h20m^FXFojq8e(|eE_-fD z+(OMCGP6lr8J?Qrsa8!xBo9^`3p9y4bky;3%kl7M1rgN^LO}$miWN%^oImxO0lJ;E)ftPjyf0wKhppv<Pu8Pr%!G*b3l>A5D|{}%Q6%hU zrtw6S%ukVyabG2cVn^m|7j27`It$XoghwK|{C4!{up+!QS41Vpo4urt{kqaZR>uE()j zw;(}_yBHV^;#H$yHB3r=z@?ORkuo)2>}!lMC_}z=J1!(5gG(|l&LA>%D!Zx ze|kp#Wt>WKJmM&FmY%~XMaN?uW(RrIJ|fPz^XVHUUno0$S5{tY>vg->c8+{4I>OBB zn2|HsjF*h&p?6wy5xVP}UANYV-x-enCYeIW=(VWr^{aNXZOW{Fm0h;0+c}+m4Ui&D zxCPei)MbZ-=tgo;A&JJTi@wxi+Hko`xAd@^4vXekUWl#(2mi7*9f&=NNLQkIjoY)BOe;u^* zNlZjXP_?JxwK@mv?6Zlg*0ehcdP7Lr^v>`QR@`k+Ij};n#k$R!Dn^?N@i#Z#(TjCpB<8I^iXs_0VLFNbKDWg6)0fnRvY^jUfj$Irz%NVov$V%e=tQNK4x!I@537@ z3n594WdJbI$w4;bBP2*^S? zBQHypalpqMqiV%P^3P;vZJw4sGqAQ75{Lg3nhBXk zP}*>OVb(}7Sb|_GO20b1w*|g5wKj|4KzQ}KFX4z_tl1B9+B z(<2*(bUccfe=zt8Ds`Q!fRV02vzZkP6wIfw4w)CMDapOWkaE=6NM&`-8#W_4%mB`d z+9w@Es`H$m#W4zv3D%J8#bY*jC<*M`m{E6z?ftAxq3!T&nWxcvo;_R?h5Vl+sFpn> zdQM`p94XN-28BK^(OC=AgZa2>38~cmOiQ^N}gj6&%~$|M%+w=*^jH*!;PFUXymCNtf7k-6zARpQwU%2vMZ?mNa8ii-RTt>`HW0iXZVr z{GCtyZqsA1o>Pg&`Kirxf*~6k2;RY36kso*e^&k&$~8Bt^?SE+a0{lC3L@tmtXyvI z7xHE?M}+zFKtK7L@{y>2{9pg!?cH1^AklRInxi$R+iwsP>@nSZ`~Usr+N*2)@50+K zT8W6`0IY${*Rid4!eM40$hD-Va4lGNJLo$+uXTe%+tRHLR5i`7SSx)qi(e%u1nZMS ze_Uv;nDa`lsTXen{O~+ubnoB;D^x#V{flwLgBZ2QWEL-#u)Okb#xDP}Xd##=ozQoA zzhHk}by~oDvp%8tN80wtTbRvtce?tTitMn1f~Kx#pT`WsDHy4nejMK0SBn(hM41uv z4#EJdM$0-Eb;!E#nWQ%d#g7l^37a?te{609;J%bx^1dr9Bi|z`^mAZCal57VxbeXb zuAg9YDzMiKqPwpnROaJIL)>%3^tI}b#GAug&PI0UP6PzNv}g)e99e6w6I z-BB@>yq**#=qNnMkm!Y1^)FB<0EOPzPfvCFb(!R%Gk&u^-Fb$H-$#$u&U%a7f8-I; zF*{fVp+vm0cy83=m=`pS=kO?08fnY_Zx7LJA+(u8hfL;q@{LwVs&VPd$p+oVo%Fg6 z6zT>@p3VdH45I*M2YIiYC#5l`WyEHjyn@DFSf|BFV0X-{M_Jqq=o+J3cd7IMw89I| zPUyD}>qu~?uY|5C10Wusznt>*e*knQpmHm0ok{rllBD>6V5q|p9HRMIeCCxcrp|w5 zY{Zj5xBOiDCD_zO>MZ^#DG0e~xMh$PnSx}=>ybuKEargh`ik;$8)quvo$ZXcsu$rY z0>2m`sA&@_NbLd_HxygZxxwjP!PCG?!9&D`H2<%4K-^g?ujc_D*;s+BFNsEe_Z>=A zc2E>ZLJOkiz|U3Eiv|0;e=d5b>lPbIp;#W8AThfiZH~|OwLtE@I}$aiHDEh}hCPZy z(FV94`3ia`mG<1G%4{FGS~SV^T{AusDbi~$z3HU64;LeR+NbvZu5$<~f@cN7Lj84O(-^Y#0> zE6uM|NGtE+wSc?5I4z(fKPe8espl&oT6YxELG4!nMZ0XK0v$~(iJ4<*8BGkN@QX{K zz2I<$G+?$`L;+ZTV6yu2x=~8u=DC-ijb9{0d4F?ef6Mf;fAg%}{sjly>@ccZH=vSL z3f(lPy2yYCx(|DxKpcC^rY)Y8=W8d4iO%BtrdQX{`9X;XB;35(HiKMYSkamVF3`jX zx&nLl94s$ON;8~%jNos0Co^gB3EwQ8b}#j^a8D*>KNpYHq4k#@?}lxl#uYP{*e*v; z6NFBudTTTWe+rGm;Gx+MiqyZ=ecfSAv%EGx^Gj+_@a%xFpQEP>EYXaf9_h|atcBalsJKE+{cPWipW2z z@hIGQ*FZ1Su2lKG-3%~CnLp}TfzlOxab7Q`bxQCyUib|oC)mja{^&EnDm`YUci zGpyP4e=qM$VWOg3G@SCq!{_OMkOX%V+5wn-#l0WdJA0a3mS>HI71&5noIGu@jzj@U zC!0uJL$<;1YXM=e(7;C<$ZcY69zGe6mQ9(K@tMZ0hQu~$X6*@%qV>!9B#%Oq8bbY^ ze|4Ss2zN=UBF{N<_M8T(p~YGF;~79=V_c?Nfg7)bJhb#hMpn21r!hd;JRTjcdooqy zGD~6jo;3=a&ae7=P)pVu5wHPoHq&diS?X79M!o98;3FsE-)#&&)L+&Jofkg0-uB~* z^d?JJ)tBsGYQUE4XZ_38j+hc1FD8tc{WI#AKD$!FCp6K zSs+*zc!277)bHBzVI=c;<&pcB^YV5y{?EOs2jtK23uH%<>*_jSPwxcjuQ(tIf5&dZ z<f9>>h7_&s+ z=4~Zv;X4Z>fEP3r;$_8u|E!_vFD-Q&QpIzwMeefOM!XiWJkbS$$3Qc%vzMz?WHEp7 zNIDkus-_%NGrr6g_tpA@6&;~ie+i9mlQKz5aVb%Mt5j1VLm30@AUz(rAh_wYv4G6; zNOdeg7at~+m`lwt$^rah#~d@ahh=N9!kr7etfdEKlVEjZnmoRLqMGpyY}4mSsZz2y zu{Ev!-wx*ZeUhT6jh+fw!ZYKlQ4@JCsdKG@+{d<`#XLSu;)UVhG~1l>e-Dpb6M~tl z1Yxn4y^R__Ses5}hZ%?cmb?~u_vu_bp8l8XVq62vK9Z+6j*6?J*7w-C)f_MEz?fWU zsx!YbH&aQ0Wc6zw3B^ttfValZO@vD2)v_GR`?Ll&UAbtL9G6|h;Jc%0+I8<{0@M0K zYp{3sW;d_^1Jn##@H5gBf9!g@!Ax}|ww)?F*;JiaSmoz~epz7+Cu9b;HxaW;Q<3p# z5ZG|&X^NW6-qA^F3CCQ;pxNxRWO&=I$8fjrtDZ=Aj%XzKn^oeljr+nE!O*mc;*3f{*1~D&mZW_oe*zMqe@>3;ZpZ0^ zLN%$Wq*eu>;~(BkKye%$ibPaN%Rr=E_`&HDNinQ5!j~`$%p&%>m~JLumT6ko5{s|7 z6sr=Al_;G#T(DHSA{|N~H7q}KxWn5jE>5Ca7h4H{MA*}p(L?YV;*#D8d;gJlG``t> zr(6xwzTO7(xSmtse`o4$GkV9)=>211>=3@Vkz7K*yNjVI3r#M54I$E)Vq!0Fm-XEe zS2{e}mbQH|U|)%va=P>$%QH=IMi=l*B5Rb^8n?MQ|D=s0;&t`oIh-Lubl|uOehl7~ zlN&Uf>L8u+M6MfGr!B<6kB8B(S%(5nGN(`{6?g+%&vnTL8S>GE&_ zCgC2tni^yAgzqvWS$W@9+TF-n9#O?XMCyg-hDZ3s zOog%@LCc?*;WDXo%LJ%UIP_Y4BfZvB%h=v{NS2+aT)KvacmNAh$d8g)ho&CvapGp1 zn@6X*UHU~*4dU}20xMno3}z%*SK=?{H&tRz8}V74{@lVf1}%}lS908lq(2A`wF!7w z*oXwof4*jOHs2S6zK-6uc6V17%Y&q4%v_-6)E--an;xB5{BSzZ)j@HX8ZTE9cbZ z3wY$qYD*{~vpM+O5$h{c$%Kxx!`(7crYBL-0%fQf4hy-1g|I#coa7f`Ls}u%#TEI+ ze`(#_%caT8-6mvvsIQ>qSlQeruYLjXXG)xf z{{@p?&8XJy)`@~g33GX!AiW$sVmsrMU{q%tvMnSy+%Fp!C z2}3@1!f9@x8RUii4KDXr-df%F9)9V^f0QWwIZo5dw9V6$y?xhB*Y{$kkG74W5On$NHYR2%KGgS`QVP?>_XGo5+^o*re>q|d z|J>wL+Ka(g-35i#1T|Qr&v9X;KuXnuDE#NuDY+wKq2U~=yDM>+@=kyMp8OOiM!F?6 z6IaK6&f}5l!ydP1jVo(fxfszg^@5&BDdD0kQlF6H`wKuNpv4RFXw*;rq_*ZOr5COc zZ$Rw6X_7qut5+WwB$Q6lwGvT8e{c*l80}|8#t#jd&U>=!1MPWv-weyB)*eIq-)*pA z=22MKY$B`WjafXxjd6I@g2pgui^EJSt-)~unRma-RepkFP!bS?$(1|2gk^!RfhZ(? zxoDM1pOD;~*rkXA_5cf#pe?spjB5w0% z%)7Tq)xi>5#5=^h(O?~N_IoW*#cSNN)BK80>3t(c&%R&Um9e3(PDbNIvM;RDaW2_` zyJUA~9otp9zN10Pe>DL*t#>!pi2heX;5_aiT??7S8bT02;fubi-+NBaG;ASxgYy(_qW8Hk6Hog&hnULHr z;FDy@8*FcS8B#Oo!*sfx^kVH*`KFv%dt}`w?m_8Od{F76LbSBnfBAE4Q%V&)%jefy z!szVGo3e1NVzX}f2q-tC<(!eNZL=uB#KAHD+$)zL)DBqeSOPD}ydS-N@+nu+Z5Nzu zKg$J)tbxoe+8I5HD0nPk_S-lzuq$!{2#0+{nSN}mBZ%SmztRid$eZI+@3DHKz;-H- zC_^ygogM8Mz#QSLe~;Jf(SJrm(#?#=9{S^*r0760^zgi<;RfVA*v0^+v)|?j;fp>> zv#X9iK88m8Z(nA1wc=9kO?8P?0%|uyUUPQbfXacSBSX7le}TsqoG|+#fp%tRAM5GY zbFuxYZ^YW0TSsYh-rVQqrgQBshRkF0J=96pxUvb&#opx9e@coyvFY=z(%#hY|N1!1 z(6hQbpplQd6dj=A=cnktx#t8CLTl#Ok{9v?Y(3TPmct6i`nx9u5L-3~26Phwie>np zD#?~*wZQ+{&pRlOF#%PJBcOV@ypHdM0Sl6HYQ)r37XH{)#45+%-0@Ei{wqFnrkFec zbCqq>>Fg$$f2rLhtnx!^EYLv*{c>GA0I-36ssvz{!@Zv^LRBWE+TcENIY*D0?DqEU z#2m}7@g@MHu^dn6!G2_diCSfjlUb+UlZXRvK@Yo+PXR6!H5vtB5i&~cl^cyFQ#OVN qd)xactMxAp-%|a^IdwWjEU+Utd>?1v2mi3rETf0G23S-2j{$(y4J2#; delta 28649 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 MdFEf>xTQJgTGfDTuK)l5 diff --git a/static/images/docs/oauth-server/scopes-guide/vantage-tasks-dashboard.avif b/static/images/docs/oauth-server/scopes-guide/vantage-tasks-dashboard.avif index c2ba5047ce600fee5875593b4fb2be11127447b0..ceac007fb183e2250d74ff40d850a93d92a9204b 100644 GIT binary patch delta 6527 zcmV-_8Gz=c*#W=T0g!hBYQ>Rxdn0PiZDe6|5&#McIcjJ9p~3Y&#%6=%J z^%gx(ErLJbqEKP*gN`%GN7wu|69s3l65_uJwS@iU9a*g4GKzcv^X)aEA!AqwU%s{6wx*C2R+5ry{^M* zO^m6?2RoF)D}SFaC3$`GWpfC(WGIcJ31*BEg*r%U!^?k4wbtfe57FsO2vWJ7t+0_H z&3(w)8etIypDDY8i>sz^X`e~W$}C#BazM^dF$C9tL)AW|$|vivAbLn@N*zk`z{;b& z#~llaLEaQIpv4m+d7J&YR{t6OtvFC7AqUF?9+=%1S24dnpSfZ&97Z|y&3u2xL5glF zM1BX5f@FWM3YK7w5|`fATinD``<`3S^dY&ro&m$&=FBdlOR*2TRZiBNU9LxaUZXut zn#ADT&Z3jEPcA5zc>rXHC&eiJu$-@vA0Jl7tcMBbMBX0}{VzF6;1DOhYzs3RKWuM361{7UQap{ey`Howi4{qw z&hmdXs<31L@a8+y?&=h3P1vbcY}4MWKOE5NS5ird@!~2&PnNdv#kGncOCyJ|QgHX; zoAzkr*U14D6)+Eyar4%3AbygFR}k-EeBNiYb%FXkMW)?ZU#X%Dmk6MCw<@7tD6 z?<^|ZfbQQO0Ybf+mFK-&0(lxNbd#lf{j7g{cdiyDoGweEu~$IFU_hILi5rqkIi|iV zXP`~(2?nckiUGjML88^Dy4a+}#2kNqxCb`60@J*w!>hQr zLTU5m58y#jzDun`mYtfuH@FMm^#AX^OW?jDm&0oYv6hj9bHC)`4nEzB&a+{=fdGFN z7bB?pC5%^QD5hJ#%pYd43j1Nrh@wz{X!o>}qr=H>ue2&U!KIDwmsKa^sJ-zP3A2l~ zEL-fzL5)C@ zFC766%m?c`9ot1sD_k>kDc#LAo}45t9y&V*H9L1oDxS# z!j6B4b^yiaGg#*RuBe*r z&?UUx_LVHFupto^YU(21m}XV>52V2TDz<2kj+sT&HyY(2{7wl-Z#K;R^#GL-A&(1_$5Sn2c-H3k{Hjx=e$_l?r z`Au0F34}PR`iSdQ*ZYV{5S_6qnQ(@*m!D$Grl;oA^6Hw#DRm3$L+$43xA0Vu^&FL3 zOb*COAsFhLL>d;|r}nVV5cIXN@!m(X5c{PeyStZiSPK|lV=7Ucb9f(^bJ zPIqC%$fE5>0BVh2-U)xr*?SNeh81(Zn7=kX%P`m}+qY^p`Mzuf%$uXeOjlHs<9`H! zf4S4F9j>~kswl$H-Ndq)uM}7&PXAp2#to2;nBrhC8jk<_ycq$Vs$bvNCqbo`QyQ`K zh&q}`Vv{GHz66qfn1GGq5;CfjrRSbuXc&i&t>BEj?-L@d+H!wXdR`5-=cNPjcJ(C5 zQb`hXovcNzlqqul=$IHF$%4k9a|ETZNVQsEG!AyVB<4Rhvt!aQc0Gb52PwoVvH8@Z z`{?+hSBu|@aC}yq5;q6M1ckg)&^Rb{`YkH>firZ0XzTt^>U5FxrYvpee*kb4(I8@$ zZqqQG;JamJz{Y~WcuW`mL>bk(axoc$xmV2)o{G=OBe@K_&juVySWzj zvej<^e?_&UY4st@guUbQVrj&)1E?HMsmWT&PpEz7;vjf$iCKqB=WqpV^N9(OiFZDm*;>=CMYwUd^`q3pomg zNePdsuqlUlmVhKaca(rOudf2WH9WU+1>o6tRD>p2U*h;TUw9W6c(4$e0OJg+RIP-w zrj65bKHFoNrz?0Hr)JfF^C4XLtC##RCp2l>@em*hHEV*MAKkN^EAl3rW=1nF;Vub+ zlPD`a#cqGd`%yo*qfX^Wa2{e+SRWT%(krOY;#-&L?pH?1EVhyO7zfU?T}w>n?dgOP zYNwfRKYuy>I!JX!(to~exx6nkE=g$*K|%gjw%Z12P|pEC^Z8T!1VRrQUE7wK}~ z9~DQv*l}D0asde5-+2AiVlh_DBW;R?Xa`)foo;`g{G6PHDLK|$O~NhVXX_WspvooE z4!@gNtAZc7?9?kmLzf@tP@#NAmdrG}hNw_wIxoER3aTb0(c@Grh$)Bk%}d{B$~pT2 z;Q`+))N*~P=~m|K(JI0TELBU(h`5dKkMDvit%$3uQ6C$^z+*$t!Aa4ZepxHZ9)f&$ z(7AtRu9W60DzDXpzMn5|il`o#flNI-j|nSwG}#M;cTQ=SN#E(lIORoPqjL)8kfuyR zZkp&ao`%zeSV~@P>G+4;AUh9;Ph+mLjNM$28BKLEOxty~-Y8~HT@2ueC~ZIHpeEo{ zu51vU4a|s9aezTBUmo{o*Yc{?3`v9e>!k|UX%r6%DY=#*6_Z{&9J6&LJ`8^-pYPWr zwX+k`$hd7l^t|av;(GuwKzZjzH{I(IfzDI`MEI4e(+#C&3&JAZ0mOH{vY_MI_P{5Y zs|0GXg}#ZZ4JNL2cgK&I zsot)YtjS01_gm1i`ZHrX`W*3>`YH|dURD>bTxe9L6K+DRv-mrg3ns@gUUWFfzXN%L zPipnN662Cb z_#IMe7z1BCGLE4sh*5Ot zKe&dX-Nu(t4p1Rqn@0bjID9F>jqfXN{G@nby;57v=4P>O5aN_QI!k=(O#|X zV5X$ioxWp0KZe$!Yz?#;Ew;)NMVtStCI#Z0#7nNumF8x7y?0Aptlw`68GPd_er4T7 zOpJ7x|KrI!hJAmlN1fM0{GUY}eNHB8N!8>i6`|hOzP|DYX866|U0$L?@7$4Osen;Z zECh@2pC)W313~ch4-^_fbem6=NLRc)s6djmiL|ms`dkPM+gYZ?;N{f{z#&~8^v>(| zkBIjyzk}_LB@PjX#Z{v16xm-5;y_!R9~g$&xeBfo6oY?wGVdeDvG&}#)CbeK87rh# zBSFN!Q<-itCCd(|Tu4?NQ$?pcimZQ-iA#N0-MB5dl6b5ZjA>)!3ys zI{ZjW-y!t{E+3y&cMR5|Q2X^w#T3_8MMlV2B$l_6V@A;0=W7LwdFWC?HuwgjL+1vM?$v zfZPh&51@sh&v!0>PQ5!6bH4}J) zMQcGzYjss*xtUI3i__Jc8Oir!Q%Z#VJ=Z?P`O#wP?KqCE1%%NzB04dgLb;5Ow^TSD zW%#6AjRIW>??CooRX?eo=omryBAP{_FPSI$zaIvTj}(HraA7M5bcRnU*|O6>A5YjF z{pWu-N=o|Wm9Mr~=KSI3`&`eLBUHz?{t}r98Q7ZN)pNg^2bOXJH+Y2D z6KiXCb2ZunbU_6lW~hsB(YH2XWfY)4s<@Rt_sTo504vndwZXv65Oqk$9^m zyD5^xx5xFu-LFV&jirCNwPoFG`qPPUBnF2q6GC>EE{&RLQ z?7b^U&gi;@jBGgS0_&}L8S@9hqTfinm=>5S475>G^m@6fFyKM0^62je^YVXTyjK;1 zn!Tw$&e@$voIRrW<8Ik!aQOv~3Z(@pDZ(qf?B z>i%4@_DJwLIqr*KGWCb2I%^-W*1_6@p4*wwS7?8_t5cx*)s5~pO9z2eORWnnEG-p_22v;^mAw?-(qCkVmXG}caxcw>{mN* z5?c{cjrEN5$1fU~Y}rEkNC+T1H20*nKsVoCGJNnU6+^}PhJ8E;;*0aI&Rm z6qQfhco&wp6Dc};JKDY5APM8US5YLgMZQGH!`Y8Jbf#XH5O&xM;PZcH0-B(rj;xg$ zF|yxL>ly|-EE2*Uin?_Sh^mmkuABh3DJUu5gIb@NEh0DAS4;XQ+tL~#lO;o&SWW+n z_w3V=apkdHsI(3XVXk=|sQ5JNKS$N!cZ(lK&e}#k5q}&3^!bT06h5+d(YsALLfnUv z`ek`MTvYrMTQDi47$Sd3^}cFaAv+`A)OP@*p|Uw%90K!8B-1=Ob7;ef>1O4??*#U3 zY@m;@Ab;N#9-viAe+U<-x8a(Q%gnFaULxc09qI?_LU8-5Xcx9Bo!!8%OfCd4Z1(>N z+}W^m_qeU=KhOr$KjUYTEwF;YGyjX?zi=5EcBbf8SsxlnSK?W0l5lP?3Oxm!9#c+< z!h4jg4d?R`fy?_ethe{uP5;y!yG$Q(0 z@!{$&Z4O2(I*A^J+!Br>I2Hd1y@JnRA(Q{S^({0qO0p*F5iC|MxLvW<2GsHKNwsIp zqQo2&-q^oZe;ZYegUT`~rqbYwR3Gh=`D8nbdS`OxQ|<&NNvg)y3?-BCXYXCEc1}|a zHwoNh;z0L$zJN!KAq&1#vTG1eep*Iw(y`uhEe{@D50iSl_Xe=rzX7 z?*~t*@1XG&p=PAjh5`=AnjoruHtxvj3K-5vxnqF0e{uivB!HY@m!*{)p7HBhL#Bqu z%94)RJUmK&TA}^S=m<*pz#vfh!cJegZpgVF8a&vS^53wt*A8vkctq(waY{7zuJMAl!QpP>Nko;0}ZNYDDDy zO$LLrfAwh3#gP zg3u#&3FAmVU(l1Ju((vmCDO~!WkeqOrf*_>0e}4(KifR^*KQxOr)k3VOPbAJiNR!Qbc>?&%3yv$vDh%^MV@CSdlCe|)G! zBSrymUh)|GE>;FW{q@axGU!e6#C0nLe_oM4(gLh4e^4ymp{SYmM zFV$j~p6r_2mUMYMzp_sU3X)Of0*Vd5<6X=lgTm^O`!ol!LW_4e(71Rm*=Nspf2m5f zJrSOLcRJfEZeC@X$w|#dubX$$0%!SZf91c?T-o@KzH0fqDu5!s292x9*i-V#?kl2 zGI>2U&`LR~#s~bVh)5Clc^ouEe?_gR*v6CvfI4ns0!HTRH8-771ML%<0%xh8+sKHZ z`-4$QH|8I)>mBD(8SjH7QP!-&IsH78Il%XOGnT^~dNrqax<<8#Y{BiDmgLfmXETcZ zicRQz5v1mZ7npIMckVe+!LI66&Vs zWz>zZ8FFW9LokqDm6jtRp1UUT1Nkbv9bsiPaQB;%Q(-ZDjzATwBkdSm@}AIvxg*J~ zWKE!~6!!mDy_U_mZf5}*_=%L?G$1;JAl&FCK)%z6#loSlo|ov%rqGuRMWbd^v(#z# zQD|_N@|$738FAJG20{Jqf51a5OK!N!?Y`G+tTE@#OG)nwWc98krcy44ad!{0yW8R3 z|Ix}c;8ksy%;9ovEahy$F$ET6v_gbM687u_JB{(gUBo-l&J&qY^?vGjva=9_u|o8O zw(a!8$|nl|Rd!i$uou`@4$^_R?`%q2C^A{5Fme_M+w0UD{J@|eu- zoWWO+x;2;-&<^=`cKjSA_@}*PRXWA+0oif!GM(Zpe{0GR_60|KME2|H5;o@wO%h#Z z{}3n_umJ=B z0YCshB$Ht!9J4b4I2wN-$fe{S4qRA(DB8Qq_obZYy9Deo4XIfuI{lC7&bU(&B*V5E zl+*8eILs-L)@&N=07J@jiEwR5VVcp$iUGNs#=2R`1OY-z%x<6EJ_wzDUpZ=L>+3_Z zfJiUB4mHQvUBM+muzcC6&wTjwn7@?E*24)JOkj?Ycf%}{S1y09a3RGqUTPnL#@;RB z213doP{BssWh~%O&iQz2!tetB`fbXG4dH>R*xhwIgODuf(|hI=T6zBj?n#=urIF6% z2lIZCnf@FqHsQIgg9r16jtEg9MegzX=P@uElf`t-ERTnCly0!>YBA!5KeJ~i7tZ)3 zP@V{QHUwkQp5cF3&k?@}yTDPPIb4^Fq5x``1dR^Ei%5HK15X4p3v0+HjQQP62&-u6 zpu((LbKl2{e^z(dz<$}O6;|oTrTFA+TF~Y2hM&5L+?yPIS>UV$DQ>=|?811?yDw?dlBx=`t*3V1sp$(~TqRN7wUEytNr4omcDX z9OREIh)aL#bO{d&))?Gt=RtOfTo=@hYFu*_mXW453q`7h(@SFHnGiOZks)wCm7?8U zab^~8JIyOoW|`2NUz0kJ?{=H;#l%gZQ*eI@C~%LP@WGv622u$U8v*~(Z637S>(?u4 zx4bQSg-SIH7=^JKc88&rR^BsQER68{6pq-ioZJ#wcjINDO*7|HLsx4mHd zEL}+)U5O7d2Z4;@&`*J48vePTpX?Mmz#V@t9y!z-zfU!2YGRApR`}?TGQ~hEdj{Qr zLU^pSvRI&z)Ldu*->=#I%P3c3R^po%0;QdQ;u-;2OfPPa8(O-u%aq|~Td8UnvFVEtW2 z&vYkJgKR>yR@$=U6c8dxD;Jhx*bddGH>T)nd>mscXLwPVWtrpDas1+NL|ryn;1~o1 z(@ICLcM!%`OsB8xT4WsuVvviC8lZpfVz~Hp;KkOM!j#}Mdr?$7+7qxqHdWjgk>BGZ z{#717B~u($?FQ+Jq;lbH=4xF70~=?R_mX8zjnnlMjEG^iBfRwl4G_TCGoXEq0l3Kmn7pvDw9^U6pbe^|2XgX<$%Dx8x zr(R{C!#*G?v}c6P%M(6ofWtOnc4g>WFx57UGqzR+Le?2_XkDCzn)3?LUc}V$Os^d~ z{AJm8boi|(?1MNrjghnNoYjBWK=Rtt+w|OdA7`C*paScWDOzQ@i%gov+5JpM{DzFp z4tB&tWPLz_jrtVlz=2T^pwQ+qv#j|lrdf%?BnU60!J~Msge3swE*kCBapd+>6 zn#`rS?mPuK!4Emum|4jm83%yc7+l@`Jwsv$x`uejmC$ zWXMx116==mgVt7J6PXu3z3UHYZ1CQitFhSPWxOo(zckxdAbKds zj%fu=PM9+N&+E^2lN35qt)In~Pq5Hu>K?qbqohceY@BDw)7e0olG83#nFDwk+ z+qH%8T1_5vS@PFoE9#n}_GbU9U(BMwrt-9@a^dl$y4#(;m%xzT0&s6HVU2Q>k8{QE z#W+4IO^F+W;(|inDd-#&I{g-vd_bAHK(uxLD0MnW`coD*^S^*N6{`3Jy!o$SpM@(_ zB_itGF;?ZgE|ZS&ZFWiABPU+5VM z)zwG2ltocqN?wdS@k$5ho^F3f6))!Dtu)p8Dlx}KX6Q!iM>cJE#}QM z>GDTOQkqV>s=zIsPN}^QXWjkH?CMYYwv3IrVGw)K!EDu}b zq?IH}uj{j8R#kTKNt>`vvq=$bBwJ?&ory9Vc8)tCO42%E@KYKj<4%a0-`}~<2>wZy zk_CS(u9TsTP^*2ST_1|z`71PAZPupSw*2$qp$<~iZypl9L6IHH-+#;zO$Wb)$s?lt zeR1HIq`qwu6ORU>+zWezs=dLxXwOZEZ+7PDa`S`2?FbO?{vLOb!zqsXLhKe}G;rV{ud_i9Zuq)z6dr$o1eUwF3x_KwBFU;F;{xGRqYCOH< zHTSm%)fi$s&0gZyioU`!THAg2%#CnRT1iGW>DYhxrE|Pb>uW*PX*0nmXWGdka6g_R zGnv0tz}C@)WR}Hjduw=LZcXX3@9}5Ne>tBR{)Zn%snc?|j;gmYc7V_K$&_4#3dfeh+_&ur(1 z;{0%Us| zC^Q)zAc>~VDrHuU@jcRmG3qO3Q@5{&!CE{VwB1~|$jjjw^&Y~%IPb$xXW&XkWKn;T zQGjpZVp}A&Tp5>xLqJhECA);HNvx_USefA^Po9=AlUC00n!Ux8rimwq7`vC&I~&g4 zOESPQR_{ZyKIf&)UJXmL5zU!uQ^5aC$5NY$)x46N5Ey5C9gbz#iPCaE_on58(T4fT zsi`ck{hCA-@H-M0lu2imYX6}ajMjhKVzyDL#sX=kF2lUgaZW###8zZBf`b=cvQ&lcu2L*r8#Zw9dnJ%_N3fa2iXlJ^1_sYybe(^A?1tNx zImj!UvmSI;@2dehl4o>ZReR=9|4Wv$Il0ZAGT01^gYrv@`spVwLr|BJ$KLasQcD)c z!ZcPe%btg^XSl6A-jjG_P*Pe{RhEOOG^Ei-OcLb705dJ93cjFi( zQ=-!m8_7InVLrEvFI^BlW0XEOh8RPO4+8GB&7 z2K}|v3b?jxEiCCK{r^V7c6|rQFbXr`=2fH^o3S`^jF>SaBA@}>(f~zU{)y9=NY-7f zR(G2+)B_Y(A1`?`@`|Y{nlk6O+PH>H6SU7<=gxrM(@1!NFCu?NqYITn!*};w%mvFi zL784YT7g$c9=b=pB23D1`!IAQfpR?*8so6~iUILa^hZ(T!Cq~52Y?P>O}C7Zu0@-k z9zf@Tld?Yg_J<+R-=A&4+tU>_AkAsGQcD6l~=f9`B0kdOR$i1!VK#syupEyR2vI(`mry`OkZ;z>q?fzV>XvD9DHN0MZ2G#h5PpYb9l+T+{^JUmHHX+%HAC6x9MmZCee z^kX1WdrnF`F&s3a*#pP%+Pt7Y%1`?fMhT#IRz!AOL{+dm#4>@3$g3_J5iMhip;MT~ zvc?PFvpj!@=1CO!eEPKhD$E8dGnc2E-MB`(%STLz5;omc+!JuIwIz%FIU&BQi6&g8 zh(m|MZ5KYuwE&srjCv(DAq-;V9fLeHQ;2RuAO)!JLq~guzr%1pY0S31@$^iAWv;)};7BVN(sSQKB^ zWc;+Y>|M4!c->^~wkuOdlI6(@)Vk1^?==Z<6fP>&`N8U{zXPqWTf*^g0idiiZj&y;jCrY;BDe5F+cpWq#f`dW<_ z%R$ey1ZjGYfSsx?p3D>kfpNq7ES7Swb*Guq?faFmlL9)UtHZtT$pKRBuFxcP6q^Fn&HBoMw(7{coR%DYq-V=@f!mhFFh|R)U<)Gha(j zuU6V)h2D>@(oBb*-0`m!rr3aMN==YeMvH135Q*>;5R+jg9J8T1bR_|Avld`01%Gq~ zqHJ!~w6TBujD0R68~_X`s{R+r3C0q(XAecD?7xf=92 zt7d|L1*-s?@ig~LL3k3>?6_Qd32#^r+9O+wIhM<;#$iM&uwsBU0BEq*AL9%Il`Om0 zd%S{n=)65;9}Iu|4G~0~i%8zcZGZ9s#AtNfw@PChZ2TEUe9a4uG$A6!6my|E*5O>$ zt~&XF-GLey6~fik7=g{aNs`XTOg=IJtE0TVzErYn5Kn$uMsU)x-f}Gu9$gQUdc5}r zt*XVHP^#ge72=E3gplOcD`isUhrqZ=LUb56+K7*302qxEA&O>2;_^=;5Pw-uq~-(A z5j)TXgNqZ=A|?PqAQKFWg#?e&8zuH{D7676U}sYcIZG;ha+hHhWO!gg4V$-fsdN7D4*x(6Qa$3sqkKE=Tf#U`xEn zYr1>rl@yc+gO@Tpd>wuj=ri<}c>Q3!S;dW=DrN|bER3^H_@7wb#eY)Su4XkT*aFrA zNQM1O&)O6%mrQah-TNxhMg-|!xdt~{*4tjv2G&g4?n70?9Nc3=$f0Zt$-OF@Z)kx= zxNvTiK{Gi-dQnk=CpEacCWCo}Nc!xP>k{?v1-D3KE@G}xCGQ#&rK|xwJC+-vZTqPB z_0F|)ha+EL7}#|z|9{`1Pd$M3B!aC~lxx%5u9S3o>le6fW;#SM)Vn_LLb|PqZ=x>E z2D*cJZ7nhD-38BrIl8=v+ojn8+idKlpr4O^FWQjwc^tEz+4m~oRn$PlX-tn2&|)FJ z@stM+M|mT4x7Ww;1ZbwG&PR?8#7E#I@f}Yml-a4=_g~uwY=7Gx8J0X39YRA7@SP~{ zQjdL3$&y0%cIX;rNm(#3rE%njLNAIb9f^@OBGE|}2klBRck4;*?>J7B> zU%V4}l{60((u6HdzTwP<&8cUc+@!K9(~U^@&d@b;x&9`bPh74DX{P7#6%ghEFbe<^ zqZkd-ncX6~j*Mc`W;?Wj`$fMR=21NdV7?#8m&5scUw-gj%-d{kj*p28#|!6e>!9(RAD_+3 z$>T386dw}4`wl9qh5}^lmWbkKxPS0TMc;R$x*HqpIdSE2#CJKFDC?d(0{;xzn(Q7*411OWfPN$CbzZXZIen7 zyiO`LnE4S58zOD-U5r66l_s53i)Z}!xwHi%*`_yPoT-J;)ff-U8 zDUF4Ij2z59*$t#?P~B(`t&VxkDpV($R1?S;cPpvL^v-1GS=UcrPgYCBB=fBFyc}5+ z=~8cIdU+0gEF)X6X=!nLghu=oa;+ItSyI_aF5@xB4j_pT;4(t^cO($wfFky#nGmg LpK5e~lX`1KSE>J; diff --git a/static/images/docs/oauth-server/scopes-guide/vantage-write-denied.avif b/static/images/docs/oauth-server/scopes-guide/vantage-write-denied.avif index 8dc34ae643c2d99bb59e68e0acb637117286d4f2..b142fe1c762d58727cfec535bcfd0793a2fe66b7 100644 GIT binary patch delta 14991 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 Z#86#@^3FIFvF^$mHeU(D%36~{fkVz*@9zKr delta 15162 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 diff --git a/static/images/docs/oauth-server/scopes-guide/vantage-write-granted.avif b/static/images/docs/oauth-server/scopes-guide/vantage-write-granted.avif index c3b01390708295ab6f3a4dc2761a656afcc14424..6615d730ea1b6c92dd0de4a790964790ce78ba2e 100644 GIT binary patch delta 12428 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 K8v@9a%6LWu4I!cc delta 12871 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 Date: Wed, 15 Jul 2026 18:20:46 +0530 Subject: [PATCH 6/7] docs(oauth-server): add concept diagrams to all reference pages Mermaid-rendered flow diagrams (light and dark) placed after the concept heading on the overview, authorization, clients, tokens, scopes, and device-flow pages. --- .optimize-cache.json | 12 ++++++++++++ .../docs/partners/oauth-server/+page.markdoc | 7 +++++++ .../oauth-server/authorization/+page.markdoc | 7 +++++++ .../partners/oauth-server/clients/+page.markdoc | 7 +++++++ .../oauth-server/device-flow/+page.markdoc | 7 +++++++ .../partners/oauth-server/scopes/+page.markdoc | 7 +++++++ .../partners/oauth-server/tokens/+page.markdoc | 7 +++++++ .../dark/diagram-authorization.avif | Bin 0 -> 28852 bytes .../docs/oauth-server/dark/diagram-clients.avif | Bin 0 -> 13076 bytes .../oauth-server/dark/diagram-device-flow.avif | Bin 0 -> 25062 bytes .../oauth-server/dark/diagram-overview.avif | Bin 0 -> 13290 bytes .../docs/oauth-server/dark/diagram-scopes.avif | Bin 0 -> 10818 bytes .../docs/oauth-server/dark/diagram-tokens.avif | Bin 0 -> 19087 bytes .../oauth-server/diagram-authorization.avif | Bin 0 -> 26408 bytes .../docs/oauth-server/diagram-clients.avif | Bin 0 -> 12975 bytes .../docs/oauth-server/diagram-device-flow.avif | Bin 0 -> 22997 bytes .../docs/oauth-server/diagram-overview.avif | Bin 0 -> 13788 bytes .../docs/oauth-server/diagram-scopes.avif | Bin 0 -> 11200 bytes .../docs/oauth-server/diagram-tokens.avif | Bin 0 -> 19035 bytes 19 files changed, 54 insertions(+) create mode 100644 static/images/docs/oauth-server/dark/diagram-authorization.avif create mode 100644 static/images/docs/oauth-server/dark/diagram-clients.avif create mode 100644 static/images/docs/oauth-server/dark/diagram-device-flow.avif create mode 100644 static/images/docs/oauth-server/dark/diagram-overview.avif create mode 100644 static/images/docs/oauth-server/dark/diagram-scopes.avif create mode 100644 static/images/docs/oauth-server/dark/diagram-tokens.avif create mode 100644 static/images/docs/oauth-server/diagram-authorization.avif create mode 100644 static/images/docs/oauth-server/diagram-clients.avif create mode 100644 static/images/docs/oauth-server/diagram-device-flow.avif create mode 100644 static/images/docs/oauth-server/diagram-overview.avif create mode 100644 static/images/docs/oauth-server/diagram-scopes.avif create mode 100644 static/images/docs/oauth-server/diagram-tokens.avif diff --git a/.optimize-cache.json b/.optimize-cache.json index 684bc08a9b..1406333235 100644 --- a/.optimize-cache.json +++ b/.optimize-cache.json @@ -1587,6 +1587,12 @@ "static/images/docs/network/edges-map.png": "12ecc1ea200905ba75eb7cfd17055a156fd51fccf746869a1058f923dfd7ac1b", "static/images/docs/network/pops-map.png": "205ead599703cf47d0df316db8fcc4f48d5eed01508109fc740d17914275e9ab", "static/images/docs/network/regions-map.png": "c65f1423ab19c3048bf8bf93117e8f2e1d13a2bc705c00307de7ee821e5668a1", + "static/images/docs/oauth-server/dark/diagram-authorization.png": "5f82a31fb0ec0b753b7b0a2dc6b4f044609847c870205cc32e9ee87767db2d8f", + "static/images/docs/oauth-server/dark/diagram-clients.png": "00de79e7ef87e325309ae33c34a21395b4f3906bfa0809698f63214e3b9457ef", + "static/images/docs/oauth-server/dark/diagram-device-flow.png": "e555617a52b852a33df22d2c991ee8948e0e64599775efea533327cf79d8e37c", + "static/images/docs/oauth-server/dark/diagram-overview.png": "cf64794cfb2d0204d4cff2f0061923a73f5d77a8333bfba6ddb693f28a80671d", + "static/images/docs/oauth-server/dark/diagram-scopes.png": "9e1aeae9645bb68b581881596393db446402f76ecb4740dd05aca69536324876", + "static/images/docs/oauth-server/dark/diagram-tokens.png": "060e52ff548a7a337af7a62ac89f0f832034255cf4d3b3652d15384b989622fd", "static/images/docs/oauth-server/dark/oauth2-server-apps-empty.png": "b81617a77c6489bc93cfe3c118c2fd075eebda850fc5803cba4b1b62792269f1", "static/images/docs/oauth-server/dark/oauth2-server-apps-list.png": "a0b1a9bcc5708bb48f7d4684d754cfc8af8e666f808e11d00fc42182ee7ccf6e", "static/images/docs/oauth-server/dark/oauth2-server-create-app.png": "7ecd5625aa964ab77b87440e52bc866a4894dffe5183a0e86f7a46b8c438cee7", @@ -1596,6 +1602,12 @@ "static/images/docs/oauth-server/dark/oauth2-server-settings.png": "18da0340416739f803b8c04d66c191e92e7eafa70cd301acb1e269d8dd5a0c81", "static/images/docs/oauth-server/dark/oauth2-server-token-lifetimes.png": "46743e2f0a3e8c126d590809668a37c2beb1f1c5483002839d9a15eca9e110d4", "static/images/docs/oauth-server/dark/scopes-defined.png": "4723658a478b30e4f97372661d4ed7a9ba14d1cc7f0b56d4f5bf6148b5326cf1", + "static/images/docs/oauth-server/diagram-authorization.png": "84371bcc0218c49124772bb1efffd98880195f580dd53350c57c93ac7a0cea94", + "static/images/docs/oauth-server/diagram-clients.png": "d288a77ddede75c405419df9e3477d471ee7cb57ed63efe6c005cdf2b35098ac", + "static/images/docs/oauth-server/diagram-device-flow.png": "2e887ebd32a76f9ba1aae2f377f7e5c74f4456f36c91ee767aeb4a3dc307a7ee", + "static/images/docs/oauth-server/diagram-overview.png": "71488c2c882c2befa2384cf20aaff7f681bf55b52f3247a4b0f3e73b3684f412", + "static/images/docs/oauth-server/diagram-scopes.png": "6bc6b498f71b1ec5ac1fdac3cddedca3749b2e50c8452e587235b366b577638c", + "static/images/docs/oauth-server/diagram-tokens.png": "62de8f079c3b585c312c13c830fc53d957e8fc8e6432eaa0d33c5a1942e331bc", "static/images/docs/oauth-server/guide/taskflow-consent.png": "5c4f4cbc6b225c60d5d6e2f1616abe45f0e6b66a5014438961fca98db349bd18", "static/images/docs/oauth-server/guide/taskflow-login.png": "5d0013b31b211efe4d3a2f6a9f224a5b547d3ef1370e507b9a183bb276fc90e1", "static/images/docs/oauth-server/guide/vantage-dashboard.png": "b2e95c34ec9c19be090e5f3384e0c3278dd840059b3f015ccdb13a16c135dde1", diff --git a/src/routes/docs/partners/oauth-server/+page.markdoc b/src/routes/docs/partners/oauth-server/+page.markdoc index 8e79a9bdda..48bffe9978 100644 --- a/src/routes/docs/partners/oauth-server/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/+page.markdoc @@ -16,6 +16,13 @@ Your Appwrite project can act as an **OAuth 2.1 and OpenID Connect provider** (O # How it works {% #how-it-works %} +{% only_dark %} +![A third-party app obtaining tokens from your project's OAuth2 server and calling your APIs](/images/docs/oauth-server/dark/diagram-overview.avif) +{% /only_dark %} +{% only_light %} +![A third-party app obtaining tokens from your project's OAuth2 server and calling your APIs](/images/docs/oauth-server/diagram-overview.avif) +{% /only_light %} + The OAuth2 server has three moving parts. 1. **The authorization server.** Enabling the server on your project exposes the full set of endpoints: discovery, JWKS, authorize, approve and reject, token, userinfo, introspect, logout, and revoke. More advanced integrations also get device authorization, pushed authorization, and dynamic client registration. diff --git a/src/routes/docs/partners/oauth-server/authorization/+page.markdoc b/src/routes/docs/partners/oauth-server/authorization/+page.markdoc index 0ac7119c28..127f12ba1d 100644 --- a/src/routes/docs/partners/oauth-server/authorization/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/authorization/+page.markdoc @@ -9,6 +9,13 @@ Authorization is the step where a user allows a client to act on their behalf. A # The authorization code flow {% #flow %} +{% only_dark %} +![The authorization code flow between the browser, the client, the OAuth2 server, and your consent screen](/images/docs/oauth-server/dark/diagram-authorization.avif) +{% /only_dark %} +{% only_light %} +![The authorization code flow between the browser, the client, the OAuth2 server, and your consent screen](/images/docs/oauth-server/diagram-authorization.avif) +{% /only_light %} + 1. The client sends the user to the **authorization endpoint** with its client ID, a registered redirect URI, `response_type=code`, and the scopes it wants. 2. Appwrite checks whether the user has a session on your project. If they are signed in, Appwrite creates a pending authorization request called a **grant**. The grant connects the user, client, requested scopes, and redirect URI. 3. Appwrite sends the browser to your **authorization URL**, which hosts your consent screen. The URL contains the grant ID for a signed-in user or the original authorization parameters for a signed-out user. diff --git a/src/routes/docs/partners/oauth-server/clients/+page.markdoc b/src/routes/docs/partners/oauth-server/clients/+page.markdoc index a5839e34e1..a23c43be9d 100644 --- a/src/routes/docs/partners/oauth-server/clients/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/clients/+page.markdoc @@ -20,6 +20,13 @@ Server SDKs matter in exactly two places: [introspecting](/docs/partners/oauth-s # Confidential and public clients {% #client-types %} +{% only_dark %} +![Confidential clients hold a secret on a server while public clients rely on PKCE](/images/docs/oauth-server/dark/diagram-clients.avif) +{% /only_dark %} +{% only_light %} +![Confidential clients hold a secret on a server while public clients rely on PKCE](/images/docs/oauth-server/diagram-clients.avif) +{% /only_light %} + Every client is one of two types, and the difference comes down to a single question: can the app keep a secret? - A **confidential** client runs code on a server the developer controls, so it can store a `client_secret` that users never see. It authenticates to the token endpoint with that secret, which lets your server prove which client is calling. diff --git a/src/routes/docs/partners/oauth-server/device-flow/+page.markdoc b/src/routes/docs/partners/oauth-server/device-flow/+page.markdoc index a034054364..0c5e4ea45b 100644 --- a/src/routes/docs/partners/oauth-server/device-flow/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/device-flow/+page.markdoc @@ -14,6 +14,13 @@ This flow involves two applications: # How it works {% #how-it-works %} +{% only_dark %} +![The device flow between the device, the OAuth2 server, and the user's phone](/images/docs/oauth-server/dark/diagram-device-flow.avif) +{% /only_dark %} +{% only_light %} +![The device flow between the device, the OAuth2 server, and the user's phone](/images/docs/oauth-server/diagram-device-flow.avif) +{% /only_light %} + 1. The device client starts a device authorization. Appwrite returns a device code, a shorter user code, and the URL of your verification page. 2. The device shows the user code and verification URL to the user. 3. The user opens the verification page on a second device, confirms the code, signs in, and reviews the request. diff --git a/src/routes/docs/partners/oauth-server/scopes/+page.markdoc b/src/routes/docs/partners/oauth-server/scopes/+page.markdoc index f3d3c7c583..5bea1af18c 100644 --- a/src/routes/docs/partners/oauth-server/scopes/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/scopes/+page.markdoc @@ -39,6 +39,13 @@ Custom scopes are labels the OAuth2 server carries through the flow and stamps o # Requesting scopes {% #requesting %} +{% only_dark %} +![A scope travels from the client's request through consent and the access token to the resource server's check](/images/docs/oauth-server/dark/diagram-scopes.avif) +{% /only_dark %} +{% only_light %} +![A scope travels from the client's request through consent and the access token to the resource server's check](/images/docs/oauth-server/diagram-scopes.avif) +{% /only_light %} + A client asks for scopes in the space-separated `scope` parameter when it starts authorization, for example `openid profile games.read`. See [Authorization](/docs/partners/oauth-server/authorization#authorize) for the authorize request and SDK examples. Your consent screen shows the requested scopes and can approve a subset. The access token and token response contain the scopes that were granted, so the client can detect when it received less access than it requested. Clients should request only the permissions the integration needs. diff --git a/src/routes/docs/partners/oauth-server/tokens/+page.markdoc b/src/routes/docs/partners/oauth-server/tokens/+page.markdoc index 13324a6daf..d20f16d6fa 100644 --- a/src/routes/docs/partners/oauth-server/tokens/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/tokens/+page.markdoc @@ -9,6 +9,13 @@ When a client redeems an authorization code, the OAuth2 server issues an access # The three tokens {% #tokens %} +{% only_dark %} +![The token endpoint issues access, refresh, and ID tokens, with refresh rotation and revocation](/images/docs/oauth-server/dark/diagram-tokens.avif) +{% /only_dark %} +{% only_light %} +![The token endpoint issues access, refresh, and ID tokens, with refresh rotation and revocation](/images/docs/oauth-server/diagram-tokens.avif) +{% /only_light %} + - **Access token.** A signed JWT that a client presents to a resource server when it calls an API on the user's behalf. It contains the authorization information the resource server needs to evaluate the request. The claims are explained in [Validate tokens](#validate). - **Refresh token.** A value the client exchanges for a new access token when the current one expires, without sending the user through authorization again. Treat it as an opaque secret even though Appwrite currently encodes it as a JWT. - **ID token.** A signed JWT from OpenID Connect that tells the client who authenticated. It is returned when the `openid` scope is granted and can include profile, email, or phone claims when those scopes were approved. A public client can use these verified claims to show the user's name or decide that its sign-in UI needs attention before calling an API. Resource servers authorize requests with the access token, not the ID token. diff --git a/static/images/docs/oauth-server/dark/diagram-authorization.avif b/static/images/docs/oauth-server/dark/diagram-authorization.avif new file mode 100644 index 0000000000000000000000000000000000000000..cd9c4fce615df7120ac784be7fab5cf73dfac2d3 GIT binary patch literal 28852 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 literal 0 HcmV?d00001 diff --git a/static/images/docs/oauth-server/dark/diagram-clients.avif b/static/images/docs/oauth-server/dark/diagram-clients.avif new file mode 100644 index 0000000000000000000000000000000000000000..565a9a2ae3d5088eda391aea7b6227399e10d356 GIT binary patch literal 13076 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%0Dl;T-jpvtU9Ja&`jsS|}cCfip&7 zX)Mn{3uwI?|5?Gk`Y1#S&&7tU_6ZN4e)^Y4Sb$}pmumKb#iL6j+}pcsO~3aXNy8l1 z8w9S7q+Rq8JP}!-KSDSIc^FxzVcTjwMFsIRUh4=BTF6p+|s|#(JAg4_dTMbY(CLYsCHS>vBZz#_EoePIBvbgUqL*ZP8Jth$6 zjxe`j(=r4>*UCh88w2+55mLnoDL6ylzgf~gdIZ-Wf8DJXL zDxNC6==ROXG#cLol49&g$Vp;t*e(h)F0O^`0Uxt2)8KSO_au1)=)5d;{IA2d6lu>7 zf-XWG_?5^WdEW6^Ki0WY+qp!U#ExNAg)QumC~a#}B+cy9-}VBe!JNXfIvmFnG#BFL zill|dhjy9Garg?p9?sn_*-(J-t^%3z#;6!>y+R(jqc%_9i!U!q**?ih@b!ld8uxU9 z{8O5u3I-djiQ&RVvV(XFf}H2{CF{aId^`D2UqKCQ4w+*>6?fDpH20NuVP4smqKvB$@#&W=sbt*V)R`G}cI5D~dgCmR5Me$M6lo znAaz|`U&6_fZHWmRuiFHOKNTMu!YVNM6OP=wr`z%>fyMF#pjJE*h!$2LGI=1;3TI5 zbiD@Gn~a)290@h6Uuqz}Z{!dVegP*&U>j;U7qRykAIp+gCM$)`(MKq%7IWL&pe_`N zb0PQ|BVUP_cvM;HYVj}l+1bKXy#<&xqZ6dW#l+t?a|3qi;nP$Qh3`drpg@e~BQDwDGS4Q?oqEK+XV~<#) z>Lj-6Wl!92~uK> sIvR$cwA+wL` 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 literal 0 HcmV?d00001 diff --git a/static/images/docs/oauth-server/dark/diagram-overview.avif b/static/images/docs/oauth-server/dark/diagram-overview.avif new file mode 100644 index 0000000000000000000000000000000000000000..46af40e6d53ef4a4e8837c9c2b68512788f12995 GIT binary patch literal 13290 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 literal 0 HcmV?d00001 diff --git a/static/images/docs/oauth-server/dark/diagram-tokens.avif b/static/images/docs/oauth-server/dark/diagram-tokens.avif new file mode 100644 index 0000000000000000000000000000000000000000..f496fb4a2f222f037d0e7ae17f8b82b14023ae46 GIT binary patch literal 19087 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 literal 0 HcmV?d00001 diff --git a/static/images/docs/oauth-server/diagram-authorization.avif b/static/images/docs/oauth-server/diagram-authorization.avif new file mode 100644 index 0000000000000000000000000000000000000000..6991f58ba54af0cd0d75e2b3d94a9988c56e8f51 GIT binary patch literal 26408 zcmZtsV~{XR4=sw0ZQHhO+qP}nwr$(CZF}Y!+va({eeeEr>ZGf)vQnw){Awf(004kv z=HlsK=w@jK@SoUPnlb**wzV|;A78UIbus*(|34wLFtKs^|Cs;)4wl9)|JVM%25Yv{(n z_&-z4(!t5$Kjg4VGP|Eg#$_dPZ)}&vxDjXf&c(O|C>OI|0x6qOApKcd4M4x zApQe1O9$KkoBw}F00#mA0|1z@*_s%-AOS!@aax)G6b=Dl!4fd#%m9k3(f}|F04M+` z!0zpwos>C`D!9ThglWVRI^>XpME7;Yc;e7|@+UGq76xZc|?!&W5!XWPlHB_Jqzs0+h-byHe6h%YyX$^VdaW^+nVFE_TeMn6TmbH6T9c z_PCl7Li2Hf24Us_>elQu5Pt&?$QZj!}-XF04X`jqTME;mrff6#DmisG)qg3<0|G zSimQ)PbRE4mggJ2P8@r~SZ<~JJjuC0X7U$c-qAVky~5Ml{ibHxyUVNA5Z@+YllV!V zj)uM~)Kny8Co@scMlfkbco*g0 zCvc*Fv?a~niB-;aaK8DZ2I;`IgjO%42_7r~cl8=XQ{9{Q>)d4aO?i0D>jH@n`rRV! zsK8%o6hE~Vo$)IdZMahT^^?IA4EhGdCS0YH*E^y!sSP(ulsTT{^vcE0wD}##f!@fs;&C`<&6Wk<7YMruQN=8G zl!HB8&7UvwpV5>l2l&4#GUcKObT!{4Cb7xpZf4v|DJ3sQS{_5+@J}k(osTe(e~J?I z3GF1YXtNrm7i;o&lI23n3Bp<>R&~wTGU^%S7$7+4RuM2V2DXEx`PzmKhJw!GT{$ba zh6+Zh$jqdW5LQ~1cdmlMx5}2Q7@`9#9oV7kd4!gMl{|Au1dglToq13i3HN&Kt~n(j z_p-$ahjlCsyg4qlN2{V$H0=(TtDSkITT73+9! z37HY0Pz`5F*m{izEu-z0HH#H~$?AX4ke`4_)WX5vpr2askC<8A31WApJS8wwLl1b< zACP?eSW=}TvhMk`Ib!YwSEiP$nd10!aU=T&?+v4gq$@Anp8n&hd!P3RufGchhkdJDjPjf$;3+h`3EhJ~;mTP2i)-v!u4}lh)-h zDR2lbybCV`3BKiU%s3&d$k_y)y?^5I5+m7HAi3GC57LatVs)e_Ipqt(V_UXM(?x{E z?G{ow0wSBithrqT7PG&yga)xjCi+#0plGiRxU507P6*jtaDk|jI0LXGnBL6oXMkr~ z0S;MtY5#FB2D&jUAVwW}L!LJnKS^@|+WF}tjL=oMOr50tGu-#SLQPwRR{UEmQsbA& z*oN*02D#MS5?AM%`B(tNPVL_Mc%_ewn9wEEOH`CZYCO_O$gT{FTi$aiBlyK{EFlSW zHg=-2F%j%9M~c4N+AUP5p7NsgxMOtK1}@&W{W>-A4O>BT%20<}uQ&0^w2#cV8FKrL z-C;Wur`kylYQ2&lzfOS^N2_xsBR#j=?sW>=t;k)trEF5E_w@Z+RA#7N`rzOp8c-pabT zpSzcwB8HIW6RG}zxR4C&uws~yl63Nny|yE0b<}ZOI<;ni&mC@6E3}>CPF)a<3KMe7 zpQtx3oAMX^#T}LeRK}@Yu?;C2zdiz0rMaOLd8}OGN29^cIU#^kLPS=Qabm7-A{aE+M++%>Zirm z6?Do@;`-9Kv=F|!LMz9DnMB!?YYXaRZ`!(97nlRy=qDaiOPduqfQO0kjE5TI_(weOx zX-zBWik$>Pvj6wdEfx(yp%P}F_n`_B^^lT(1R6jjt>XRoUV2E~F)t}>otWu?bq3pagu-<$eGDq@i>Q5ux z#V$czzF_tet1X2^=&{kq$4C=UXZYuW$~HQC3r!@tJ#g#&6nNl7#*mbv+1A*r$_@@e zs+E2-8r^*!O$s%a@ySM0TI_9wg^bggE6;%D0sDQx2vl-n1!M~EiJ>Hz*7R}`C-x~1 z$)~363AqOH?yh5Ig5^rvBAZ`|mD>RCXEd^$Gv#_0B6ebE5-%)ye?rzij^LUOLc!V{ z5JL{LTiE63;b(BE)8`?dl#sR~2^J*qG($>T%rNc4rFHSkm-|gpt+9+8ma}%a^Q+U; zABtAEj#QAem={cmbtYkqAAva*5H1(#IJ^Q@G>WG3+BR7(T@l=*tOx*D?<5fxHAqgc zq z{v9)AKQEL>)mG$1Q0WEl?{&SIOiJ(S)vQcmxAwEK{|3PX%0+zsGs^{^dU%SXgM_|| z=OA6j?QAg6DzA-tWq8`Kx;ve^gk%;xWW@IUC{(&>ic|%(#&Fto-;1XsDXm<>xeMNu z;4iH6yYfZS@1~S><30oy*x=fpo=P@U@>ITcD(I(!x`ASnX?l5( z;HECyJpX~!yCXk9WNmR9d4-=J249}`p$(a5Ek>Quq1MQK?qZV#fhonG%{%k5P0*ibGW-wrudjil~N%>`yA*+PO3<(Ti>nb zu2HN!0l5W13h6d@u*PwtKN|}2iIgj&F0ZK9Fn()|n>5e(=lchiAD?Cuio#QVLRh|G zsO7DkP2*FMd)X)^2T6{+w8z(!u9ucJ_0?41IcmON#d$&^t6MY53XYvx)Fhv z>~UGTpulph4U*VUfe=`{1yI(JVxbMpb$VuqPx`1Gt_OzD~H8d$R36frB?Q!e!?n9gr3$}M88AGHMq~3SiXgYNJ~>aSckcE%DVd?Ekl>cvqkEx zJ0~)9>~jDFP}g)+WTh}>V{Py@ws&GB*Wf zUy1O$n@b+`10tVw{cF4ATAy(ZI5V8)MU~S9z29il)T(dOs=#J!d-|l3Lsr{yRdQMc z`2f2nk^ta&+qg0wa|?pL@Z@!un+iiUe(7|RzYor{YOQvW+A=)vfHyplo7%NdG1Qyc zq_?*{zCXscDAsAw4$8wJRVGaYg@WijoLS9zO?_-NQB-(awEHZd{uk@$ue$>0)!aDx z$$L;K+Np*WUWCo`#x*cyd3b);v4TtWcu01;?pWI7GBJqNp&wECL){eNfPmSpT)4Xl~NSAj)53^Bb*k$H3jnJ8Cq&x@$sdcVmXW&61B;23D5&Krg zqE#`emFA6y?uh-8L#O960Zq{_j?N6Ox%H%Xm}PLj`X7#lZm%Xr@lEOgsei4h7*GpomTo_wR`cyYfga zttq6SK@XeAR;U~60YcB?3u(MA6c18NcF^NtO%d;Q@YHkj33InDD`gj2dIlP`HZ_36 zze46~*^oNCs9hF#$gP%pb)$ZqK*tRJcq9^t2v^ANwRA&5-~v?ms>Jq6@?HrK)KARc z^_^Kx`cK~|Z_WnI39p#Fe_^E@)N+1NjM9q{?oevb!_mQ+Qs}E{anWf>nZ@P^8l@sy zEH;kYT?uz8#qa@Z5Z?qWSrT^2=c_LVlH{p_v3(qMtI&87jQEhqmqaa^dcs*j0M(Nu zncT`=!SygLp@Q~`0o{Z^9p-^9o-Z@evB)TL`?;+~+u4cXINYIMz|dig9| ziIQ+!$8WRiYIxAzl_usFF|`GLD!MPo&g??C6EK}-<=ksoOO>z7;=e6_zpUC?g9L7d zcRvKS7f>tll72R%BL|@<)H4FMQdQsz8YB}+rl}UlGyLi_cS7hP6ZhG*FU!!;*iB5- zdDOdqN;v9F#3n&Z;X=DI>!~eTb;^Tl?X_@3_X%D08JAPz3?1B{sEzGRz@QW`*@YWpr>;J8=B4ItSfXR1D~}monbzb`n%czNhYbw64oG8*n8v(? z6&RSrw|sSvm+6v>^DAZm+2Dox)kx2_XB&|Nm9soP7YV&A)ulS_m!NP~oqB=4#G8FC z*Q@gc6-A3b6IAe~ls3KK&dNwYF(WJfygc$&fHC$$!G7Ki^|$edfok)wi>ZmGkM$D7 zJNGTK)**z8Kx9!6d8@&z%cGPa*xxSchK5rRhU6!$dz;ZYYC`x?{^11q$`0jJm>4i$ zRqbix6)8YKn7Xoabd^u&d3~x9e+d`LkYa+-t zoih4)tA_Gp+Kc(+rY7==&h~Gg64N&bG!&}$wbjK;I4K4AMg68e+twwT9hu}eVOBFz zX(RYFwV#LSJljL~GSa-XIz&rL2#j2*txH~b5I)Q`zW}1mTui@zryA|i zLqT_tw#0eI-x(tRVxs-fwM4-=n;AEvlCAq{kg5&u{B4W55l9EIav_C0m`wb58s37D z3OWrkQ&&yhVlCb)kFE$MCPS}sBQltsC9z$o*u_}_x-WH$coE?ST>=s$-56NyK>F6# z;U&0Tc587o^FVXRcj=@pa>M<87@JYGC*2~IdpfAwIhHV%oGI;qBj3E_hm|CuyBwf* zEEnEjRcW`-MDH78Ejjlrd%xbgFM33b3whb6$7->qEe~4iI=$FR8n=mrDjkC#x{~{U zDtKWsIw?{{=R({pC*sc2P%9F+Vpk+Z216*ZSp()EYdsCpOlDU|DFY8SA3QuP%aEf*v-yM4M~G65jl$anzhS|!%RY}Jb?6XB1LPR=5)Pps4#t<%snXJnui zUZ})b#QH(2mBfBTO!cbq$dc@R2u}nU_9EG7J2|ew&F%7pyb2UT6n55?36E(y0eVn+ zcjK0h*u`Nd5)ORw1pdPxh$NR%75GahKc=8f;7_zhQAa>Crc8MC8f<6ct&RMAd3AN& zSNLVu`$iM~^-$lVomeL#j4S2NY>q2SgqBb82p8^~Jzb+LBnqD3u}5p|oCJ}d36t_h z&P^*P={4Gz4jXxjq)DHJ?Z86ZdrqUvO6TjsoDUv;KbEj(RNfm(=)=dAh_+*61kS}1 zjlnP=1oQ0yaoq0o1ecFr?xO-@HS+X!SCvnwEV7U;jivz2xr&UjG8u zKW&>EkpXuh{ZGi^hR3Top}P5~Nou&`FhBLyYzPh;`d^`8i}rNFk4<_~b$KKq^Kxsx z`(TlVFk}3SD~Gn%c9fT_j15{5#Fy?eE!z z6-=#rKcEd$2lGZy5@C2F=mf9mKOjXPEwU*j{h+1dIzI8=`tNJ1+pqSGOr9R((E)^p z;Y-HpoZk7N2$7Egv?|TPBp`C^arMpitL<|XBAJ^=7weQu8oE^~T?IgG{95xv8uHmo zW(B-PcbeVi*|_T6&Ntx@Ub}=O0m#hqr(UG-N87G$g#yr-!G0dmL2piOA3wZ1cgg9@ z@G!DB?9af>v1MQNl;JyXetAIF`8Lxcu4xo_A*y`1EN&-BukMoyF^F}Xh+#B4qAAdkj+ zbK|YC$^c!eb+vi*k}_w_IvgAbKSo?cns`I_`kH4>l|?s6$EOXtmu=I`-p5k@Qwk9f zvhDq`VSP+8VZ&^jvfZz`c!GPVewD7FmH@}~yHy9l>lFz;=L)7ng?{2X+Pds$Sf8Zr z&$er3u@+-6qYDpAN$XIv$B7EH0i?1C9{%}aN_wp*tD1>Yy z6q&@z94_S z^v=DH0I{x?i;mL-mZk!SF61B_kbF6Jmtfv+kO`M+L(H36Z~4Sn0X=w~A4Ic7aZM>Bj>W6C=#Oa1TSfXi6r zC&}&H0uR~I;HbS8Z@JDK66t(B6@)Jbb!aJu6&A$Y*S$BxN#{Vo`V{8|>aG@RTzA8Q zTT|<;fZ6T=l^B1g(>fNDoS#sd9{rq?{?iU9{3=4a8^n03PHW`Om;}7M9^G=~h{Rr{ z$AIr7oKfR`_HAP5bfSq``VN9CFC9CTS;W(IvSe4KUw#DY7bpavZ3A{)Q4qK+e1xOAnb2fV02s?>Rojpv6>88Ut&Cw+{-8 zIGj;8UWcQxO505?-b;Rn5qq8G{9qd9=C^^Ag@P>)%!0gVR1GW|wf9{crsMixd0fl{ zXl;1*bQY`i%knI(s89n8EtM6h|IZrHaM>&g-56F|zkfS5L{jybgj*hjx#o{T32?8pUCf4SVY%+8dZ-Y#%2HaOB2W;QBsj>*srsh( z_`uqtD}MTAF*qLA|84|bAt6NT-PU_$XHDuF<;5&$Z6FO2RqMpV>OK`aZKTgX@SZC| z)X1b1FNDk}lRFzPVB^Vzu`#Z{P7uj=R~+R#gx!SX*RKHaDv$-8?eHrZO;7zj86$`c zn;FEBGaX$Zg}zmyyDC}r&wN261E7M+ceAK{r8H?ZGtitRBv#tliI21p7S7>Gf)t<} zx8B%f($Itw0xsdpug}GVKHue!oouAsoKL`nd&=T`&ZllgF)w|~4>ge>ML4*H0V@>t1 z{)DJ$$;mn9`-YK7Y==p$+QU{E&!T+eeIWUi;bJ32sVr~YVcTZye)?mwKLRL>auh@k z3MJ1UOy>-2&^@MAQIWfp3FDz+LX|M%Z&ERtbBD8HjtzTcaHNjnt5Pc0$urG!o;b6` zn&GX*K|O6Pfti9QpEK8&+}cu^UDwnJL6Ux-M%8QEbtV%fsR}1pyUC*4{!x~debC!9 znU>G7ol3o_lIuDE-?3a1h*ax@=LlA}Bc`BcF(r-?ptIAvLVL1k6v?!|;7P$>xIQ7! z?dIYR%X}(wV}vOv!=G`Ow828pb9&)wZAOKya|`h5DT-`3Sml%|by0!kX{<*3{h4tJ zEpT%#jRwDiIh&kd(9u6T*F5sWLT^wu2m#D1pwDVtKqz|d;fpP23~%>XAS%X+Dh~V_ z!X1W$6{g3B#&L$n|2=X{t)so{$LVGNW66}a^tOfB>M$5Saw8?dHy{ptku*WI^cAqE zPXs)+U}Sf;(M2JEs%d`SN|bn`jE|V1O3TEtoF%MPqK*Jm;C&ulB7F-nylMMUZHt8i zJ@5>@r>y*b6$e}9E-g`E_t~ezBNaIz3@^fuxjr{lMWm#Wd8m)aB^(oRqIdiDJal1T zac9pZ1z`V~8fLw^Kx8!;I3jk#LU zn-u{E4`NOoHqFz<9E6d97!5eJCG3Po>){Ted#mx56-)UZL-`s}9E)qwPwm=V0rswo zj-|C@o}Ss-6!U#7FPmY-h*|mr{7uR00NO3HC`vYFKO_A7Zej+Ki)eiI=E=Pe1vT?y zx8BXv^IL_Fbl2j~!N59demAN0@iipF?^nl(NLLNfaDn0mmt^$8W!CA5*V)WM)1_)u zt>efQH6>Xc7mh|S_9bodFpvSbmhfRb{+>#~BK#itu|P2^%$fDRw|#h|>Hs%iEk4?^ zYcVD?fa9aeL9*&lj zV5^J$wiFoY2!QXu{TpYWMT8HVMtA8FHG$z4WWg6u?kFhB&i{xXAMN6Ct)DK2f0=&`;KO3lYeZ!#nE z{i@By0)nbbbGAyJH#k03T1$b7?{O%qFyXZQKO1-5WVuiC9BaT7#^ieWiGDNfC%gng zf{uO8Z|duG^G7M%g<&IbYjZ zeBjFLJPfIPx@UBcsuXrfW&8W)gc>{D!$~CoI{Y636yl-$-(~^}uviJHlM7^46|Fyd2ud`TH*@{te)4oM2p`T&SHC zb2R=&YL|=gLk6H~4C}D8+A*IW&v|}5E#9)8(&L|0lz|LvsRJL*kzR-a>0QT>^W3&^Fq1rGk3QZvzeT_xi=P<{PeGiD0{6IRAk4k>ZD1>m zJ9`OWO*vK&v2y&!nVSkjC&S<%Q5gIoR=!u*Zpq3y`NpTENfU)MMQ=Ue#Zk~!%pnM% z`VZ-)@Jw{8P6>P(uDBYoo*j);#hq{`4cliYc&+Npi9ru=Ge(dUuPx$RNi|*f>sXrn zm$~ESLV=J-?oQ*Av_U$G)5(nL$RZ#=h#qDM1i6-ILTy>)mf=IEZ~!`tVW`mt)VGB~tllpcn1I9Pizr$#m9C zpC_}fXExr%Wp97)t#CC)fI}`#gb4$2`n~hnapn(R|NM|+M%IvjdY2Wd%Mo6n$lpjw zGtuuv{j4GgU?YM4B`WK}Q$2`QN+2#AYcJz7zvM3lBfC>b$>yCpMDssCM;sbonWf_uhYVBX2YewLAQ zro~Lf1ve`4{x;JWEqK*|M0S}!rba}FC7_Vo7TP+xm$!V#XP9hns7EHnY;~p3`>9Lrz zhqU5y?(@vbjWuhRF#>kR^uJrUQ*nKX{z?W<47zRuu!v10vk^oi^X;a?ZRCc{KMp=X z2kl-!nr5@AEQ)6;!w_!_t&)Y#MIE)n$;u_oa#0h(+n$!~Oqcn3#R;?xFRJ_I&{gKv zI=6FAk8CO|Q0lTUb@RHy;JTIz0_VxAWY;qH78lAA-hOrhNc9(M&q|xzeEAI6?m2l7 z>Kx_~W@n8rV516Lk;AxS6_1)pNhAkA_Vd+5JGQT}SOt`n>lsM6UZp~Ss;jjM_4ojq z{7S%g(9Ne-Xmy!-2R*YYcmA`SRRhPXbYej@{Hzvb%OdG`GIP6D-gw%SIn+0^?-k>aa%h ztxMmXzNM+V=GS_YLX}D8;O`2%W6){crDylXT<9Z0_oQ5%?(LtgmMVb%jd=BwL+`lRx<=G^I05X+yP~zA4x2Y5$%eD&gdn18+{G;^{-W@hHG*3{H_0T4nKz}J!htno# zeq^3tnsFk6#E;m2NZmN3!MQbF=8AAkq@|c&e4O$(8+*@fi)I1XwLzgpUZd@)(*tC1 z!J5eV*(vrNE40d+fUK#9S3K_RYv zoJ^VVplTvOYUTlc2apar(>X)`{q{W`8xhBCvn{6qG!nd!fbi3+#O{@6K6p@21L$&$ zv}8R+e!Fk1?~=aN*3kg3b(mZf|0Pu#SIG4{06L1DAm_pw4iUPHOOj`Yt6|Xd=SH4 zJ>rtdR0sag(Ewa43gEY?8_R^iZ`JU{FUDXF6&hqN#KRl%NI?IYS$~zG8nM!7YX!Tl9 zi^vU7lF!{sHZw25vQ2cZ)@zEZVKL16hb{~&HI}rJ`bkob_GXi)RO})8(ZIN);2i1e z&iW81cNi0_Q(^p4yi)&BPOWiZM?bk!UdkV-r`V>X33rlB9AuiO(wx-#6|z4PVjXrg zHIhVq`BPeaUwbEiH(f4+ipdMkZYaxgV7VIFsC&ht!zHD+J-rh>qT;1oLNB^rF1fK^ zJa-@GhY1fP{FHW4WeAO9*2lt^xlYsh?@w`}8Tt1>f+|^#Vc%D~{W>8_>N+3v*ZTxt zd1{t_)E2wroyN#la7{MO*32-n2u-WwTE?rF0BNz8bjk860!zu^LXZ(^T0^z^n%%KD zrc4E#$VS`zrJ=?*$5h2r5(S$g1?kZ(<{*G0s3;b26Q4joA3Qp9X2kF;RHlAC+PgE< z0f?A`0oQB(K|PV+D9`{LD1=}bn|f&LI>HOSmBdpBLaaZlzyq-E=j3>U&mpcvrq8uD z1C@=vScV{JF!p(l8zJ~>RF!S}`;wV+PO+aOOrGEHu6se$t~ z8>Gu!2yq0C+GGGpl@cm?OXnn_pIYT?7kCnX4yB)_I@YFIKsx+Q#~!#FVyjQGMa3r7 zTu<7^5PAia`W<2_%7IL((~VM%>?YxI^VXN z#ibh~?Ix=#`Kh`Uz^9@YprXLM;$__i>LVAWi%8`d>Bc4HOZGDPoMzql8Vc4FRh8L& zkBM5G~fb5~)K^Dx^_sjN3I|wq6=&T^IbA z92=G;n(ILn;x*iE%!ESH4kqa_{Wsjfm2)u@3i?>Z#i}A38$H?_lPh=hV)6&=L4rk- zFTibS4y@RgJ6KVtkUpTP^MP!<$G4Y>fG%NAsWnRnHI5p=F>y7u2$uZ_8EQVUV(N(# zhoaW;t^3xYau5aNNK&5@l7}^j-4KVpnGkEWg;|UGD;>@RGs@>Us{U}!hCdidM?2?sxt(}o-&));D3D)i!yDcLld8Q z)DWoDrNvtdX9H}~Re;@Z%Lc9%0U}_jSIErM49v_y#Ay~!p@ZONNFfH2rhWv_c-Rtz z(a@JvQiE3RClAr*&(_c0_J)}rUS9O75!M$xuP}4%EvANg8}enHv60Wfcg0&nTBYD` z7^`MROa#+$9f0uIH5+}+;uI@tz6mN;lUcC?Z?;yb@fxoq{}eN2g}+4@RsBwy_{#km z39ju3#mPHuVR2gyXvDc?m&8JG6%$XGP?CaDn5N-#S^eZ#(Rp+3vzB?n8K}o5-ALL7 zFhDHU;b`GIbA{k$XE$H%hT(b{p90z`4YjHmWzm0}6;o4e%s!(56?&Rw)f`P@0Q|K5|3MDf~p&Wy-gl+_dME;rJ#-4N@G$%wvVo;P4%xgdhLK)iTr7Hb= zBgd6swIb74E}yoc?fS!CU44+98w(akP+Tu#s9B|^`-5^=`}t+Ng{Yf!SHKNpnY#}W z#E4r_Q?u5edH#UCW!h2%x*;)?((?)&oWLUxbFC9ki!AoYOScvsOi1hx;<=XY(AG3p zHoszB3#Q+-5Kllg*4}1dnTnhTm94#yG%xRBJIOo;);rR@<9!7^M5Vm5{d#D=+akfAO4AV7bJWD z#T*tJ-fgVRY{J_L0<1xo2ygP(437y%Akm|(gdm?!S*gzvaG-`*7 z`X`gKIWoY9rP{>3gNA}M0gikD^?2o(dxoCL^UE22+G$(Xm~QK}?336fxtsj(@YDV( zfH?yCqqKHOna0p5R0>EUAH+-$cO5@;aKw{_uW@d;7#NNzT0|8aTo*nAP>PLw<=9v& z2-Ly8^wDw3@$DR%LvwFkK!!JVF1x#3Y&xc`my3(vf+!b71>66SULLR^UsQyVs}Dq@ zZZ(&WC=O;!X!mJPT0;k?V|ie3$+W^co3r}pRnP#Ab@0WwNYlZ^pswP$` zy;IfV@AV9Xo7Xy}Ak>fps^?T1u9EnCdhGN?QfykJoDRx9Ws*Ch@6tmh9wODM&vxAt zm8-Wo+p}z&F|>?$F+l?nv30)zTCSjefHt_Mx)f0ZyNECoX{iPgFAKtmP2NSNeGLb?F%(yb&1@c*hLP*~uv z;$VRUru2i=$r6?2JJrd(Sj#OpDs*BIAFVwx?fbGH!B4VwabNP(p#^uc9H&g~A4aW7 z;2Pwm^NPYIXhOnh?8f6haK(t5-tHRad6kr*!$Zn$QqFd+CQpnw`FwmqnaD$qzPaci zyI?9S>{24-;`25088T1J&=VSMp1i(+hHnBbAK{-C0QPRDSD@qF z^NfclBNw!^4lyXh;P%wuwA5RKLm4Jm2aSiO`6(QPJq1UIE~fp|rAqihB&&;1Etwhd z2un}?>!F#r$Cdkk3xrG(odX=}|7vo< zNW)nMOGv#vrI~Ia3KhVpJCe!M2=1k`{}a|fA2z1pw9+9A4u&NfXH**K3_zb>> zSj>J{R(05O83$^k6aAewCM@Upq*KJJDEVw}cIYfNKpVbsT5o`bo+{&E%d^zgM0(f< z=6?lO6LI~>U1+YxePi)t_`oZsi7<3Z2dB%d@@a+bkIWCvkbTmz&Y%G=PW9I7XB=Ve zBA_a~!TS(U6FusWx}A>3Ht|nO#0r(SKmj?Uqjb*tf$zL}PC3bA|CjuotJijnvj)wQ zMV`nOsKjp70QmrSc7C<8D$_m#K~8i%IMi5k}0(zpyn*v#V9g0$kb)KPv;RnH27Z!VT%JsJRI})+4AG1vq21 z0q&YjXgL)-KHjY6{dxe~LC$Bq#Oav@nhzG(e})KOy3g&+@!1{!?G$a@LECx+ir^aR zsb7M%x+&!HdRN>hYw0-UtM{mVz(>(1-~+h)uVhg5)}?M(9RMHz(6LlvxmnYn6q*^T zt!a*<$!{-HwU)xe@*3LDGaSsY z@DglhF3mKnWtpe!B7209T9~#ye=lLLMXm_MQ&}&e z!fSr1adwR)^dbZR2W*Qq2iF}KE;~s}FP8%a=quRi{eh;GARxajX+%wWYXDjG*AK_r z3T1BcSBh~POdU_;k;TZSDA>N7Vw2^v;-p_XZ3rWu%pr(XtuyVf8lYf1c44Y!mI;5u zplM`>%c-Tdw_Ui@)%Xq)zI##Pg~m1(pncW2fIm8?-AC z4=um`N#CG8R|x7RzEjzF>xLB%NB_wWd!#nFeQ~YxUu%ZzLb`k6PH-d1z^60WeW6*z zJQSva>>*!^DupxV(go6%o@&99bp~@HVqtV9R=L!~4TJFlj)w(A*`D9-%8#t5&C0W-<(lR0bTU;gexZqr~31bnTI{TBISzC%P)16#v38SI2mFu5}Hy$9~KRC`RXo z+MefdTBH-q^F2-_Y-A8W->yeNx!27}5!RxGit_x`5u!2cZ)`Yfm-~>rKLgK`S}=K0 zsvG=}KjaMhvXvJr(Z9ZLd2GS;tg5|-5`+=N+t_f`#Gtg?$+`A1u8Zk;FTsv8cE z%XDJtGCD;!16?#3&3-d5!9YH4nq{|yh1ny=FwHB4I;}$cNNAg71GZZP69i9TnIq@o z6A#n(Mn~I))&9+n05tBp+_fDuBIyV-p+VCmQ!%*dOXZO2eT%-=NU|7(3^pu*pj9fz z5xieCT>xP6ryWNZlMNPNl*17z%!#Zw%HZOTCbQ3cP0%0iQv{d)%Ofco_PLyc1te=`Onc9B9;Z_wI|Qgm`JaJl_ zYoa~4L}y^}Se;8SGKv;XW(qK^hU^3Gc~v`9wGXUBqev`W`~!H8g|~n72v`dtLtemQ z+H**n5n>_V30-I9P|h^m%U!7L+=Uf}N*B-t-Bj0~4Xu6ADb@CxFi*<&7Pz#`` zv9trOl(ykvYfS%70F)+c*&mvY6379;D>sohlUW}XHP%_ts`s$82Vgw^KaW>`a* zLQtVWHzf4{onFHPjz>HD!zUxQ6gr^VXu5rJ;E*l>+FaI=Il5tm&I*8VW{PoH$)neC zP)T|IL#Xj{bD>`4?yal47`cpmW&y`#39tQ&tHZ&U4iVrcl}iWZscXLt0bp`tBME>6 znbz40!-eQ4%a^4f2|mGnoFV)*?b7<`h%NlAl5h(2x~2dTVnj}*Ntv4gihTf%lKgv< z@3D_rFJe?@5yHyPyBn&9ydb1)D(v?1#>qx#R7T#pZ7g!7Wue*Z$CxJWGDtHXDOY#` zz~c92%r0!-Bc(T5;d?Mm+XK8p=oQpZPu=GTa z>#`YLtJqYva_#ZC!B^2dlmi<^t~vmW==AZS27I`^6=lsl$}>+S z#=NZrcN-;X_u6}#OG2)i~p=zcI81Fd?UZd zNzy%rCY5ZyCcDlhATHU$dCn|@FdI>VwvyM04~_hOAqC6LE{OKyxb6@9#~MO8li_*> zccFyc@=3ne5QqR9p>b*ea2p4|AzI9v)c}xC9DvE;9NsZ3giy-z^x57c*vBch;*e5@ z@e0#n=};*U; z;Dsb51Y#iP2lTsi1T)Xuzn;jy<8n$ltl4d4db0l0thI4yR4ND86U>h4`N^*{6O9`U zAZ=3AtHD)sYZx7I!nBFh7d)|!`nWHwM}H9z#OB%^Gy|akPaS4YL7qIFe%bI8*@$DA z7ux|C*3#X`oTMug&VsgQ4DFqGHFM5h3qeq%t*;K41~{R(inO9cGUmT=5bL^(R&52h z$=7d#ktng4_mKZkpF|!oYLCDbE`$W^{SfRO&Rj-@&_yF!-t8=Htw+Nm$yPF?eiM!L zD+M%kRV)F~3*}GE+kva5gR1dAnoIo98$ucSC#23xvi&V+RB~tvj!TTpe#jC)zg5|D(jZnrLj}-WW?!By+yl4jtc_ zXkPt-0~B8^)IeRb9rmqwJiI?UY)tvx9dPG2w?Zwcc52fLF@pIy>u?M( zJMJ3zc&M!mks?>Igy>kTJewk{S+SXEr$yXbcfaXl*s5t!E?v`Pp3_jb*?SDQHnGW~iQrj#YtfDrSzn$ZXI7LI~g5Nh46dkmQx zD7--{^5eze9~An&-Dq1*zTBj}9jupKqC-fkV&NJ1i?7mzMDo*yWu-EL&Bd!{=zi4; zGU|@3wOC5kQ%0lp^wICao(miDZb>)tSVAy}UfduCCBQ2!uDQ45dk{ilNpbxrjqNhc z8pj;GlH8ooN{u(>KXyS9iEo1g;Koqy)%f4Acj8bqO}V`St_>LUI?~rf`H{$xB5@=q zfm+EGPrr3^#0@m{Y4#(f7@0v%s?gm%swKI`rA!#7;F?MX7hAbJBiEY@^VtDMlb?5_ z#BZ)Or?2s`_JNyTnXcHooXJl}IS#qS>cnF9ZB=Uwu~rDq@@9{xO|RkP11A+_j~eLG zKw}qIb==y&*E1HM>Alp>8wp0LmEHwI7c^tm8+Ks&k78Yey3}cv`e;1_haJOgoMf^Z zT)|gn;~rTTb=5kEKDT3o#a0euTj@o>`b#9xnm1Yu=g$7;ENAq@?$1~%P&}Bp@eM`8rU6`rO29w=Nqo3t42!VPeeAaRdv9(KfXF1=Po;Ec z6p1TWzv|yC*3C5S}?+&R@5yvob7%R!u@a>`7SUPLpuhaB+lU)_=*@!J)^VEa@LrhF7} zN(A6gv+9(f5ZwpGN>u>qx%VMi-@P>$%b0krELx9?IB_lJ%;|TRRl70}%tSuH{Bi?= zvxu~jykMae)-+alepw^j7ms{hS#agjoVP*&8iKRrk4V}rYRM>O=o29w$uU^4o-Z!P zI-`ia708mLwUYR74KQ>p2-96(^85M>mAk#?$`Wne73v=AdaHn5kFWHoMEtj#k*P$Q zDFoZ5tprwG!b-d8x*QXKTjc9DR-@{XLy5c$!$qPDW!M7j0U3F-snc;pOstimSe0%- zf*)H)!}B>7k19)q{JhEtu_Q6DniF{uFQY*YlMj~y?`ktN5H6t67kGMz<9}*z-$A#Hroa<9r^^umuVDB^pt%d2L-KhIelVGs;5R%6qt6 zfP3!E|7im}P1GiK@M9k$2L~dJz+x?lz)S@)gobIXJoS8fT(IklNMoFG%Wq3}ft-2> ziOGfYkWQWlToY>e!F*Q>4EfW7LF=kh^cUd^)4@J6G`sd-s!GJN+IBM{E!fZ1WxWh$ z>$a{$`52c~YFDPq9@s0YoZ~wZbN&W%Eyia}&Rn{k3y~d3alHQN=xVTB@j=z6S3|q8ZI5Ka zegXNA;^;t0N!Mp#MIixJTajss%G>f(yB4Ce6FFvkJ8`W0PxMf!rr8&epP*n|1uBa) z&J3I%wc|%EoQ36Gpy~@E*BJ5ggRyff(Y;Tz8=7}xe%EZKgypZX(q6gJwys$~6?S+{ zQ=D`E=b9)i;K;u4(D8_5N(V2%SfYe7>q~d?CAJ7z9!UZNYXk3mqa2==OO?&ZbUCr^3n&0FJY3mmf#LIW<{i!`Dk)@oa&Vy6z{Y~689q5TV7Yeplq7Z z`&F`xYP~<93P|D#}cQgf{ zM2SQ)*VI|eLYhW8yNDar*uI9HQYzVQJI7jmOjH1s3-Sb7cgS8BN7Ew|`Fjk?iI5Ux zGY$2xVcp<_{}*zxN%ho^IAzjnn4x%YQkWy>d?Y1Zz0bGldN#qBR+4>iLpy^&CVlviCF#7J4}{m0ONtVI3SqDK0LZap-Nuj^({1UAy7Pe zdPi}`1OTv-h+l$Yd+X=!%z6O^1AQ6zCufe+)Q%+lUTLkP-pp}#ocZi4USc#K(W#RE zBieJaimA6R^1AP*&1twOt)hIAy`XmhJDzZr&l#d+Fe_%PNd>6`yDpz zFMr~W#%y4?-o=$roQFAdtM07F@nI?uiPBkFr;=Tt*ZYuOYm`W*Td3-Z43#vI7!3}x z%H~TJXD_8uMmAkB{*ms#7znDYQow4Ek0y`OsnMEZGs?D%Qs>LNUu4B{H>UIVJ9z0i zYk|kTLJ?f zl13_+#c<7~As^|uRX=~MS@Og*Km2}X;KbD0!?zLY8=SnKdBn)GNRBM{*^5u&Z)yc2 zPuf;Onr8Cg0zrs%1^4Ni^(1`-!ML6jRxO{p{JD$|j7Xbh`^&V$vR)@dn}4Lt zfLh3yBe29M>c^9Vs9VaFX0P%@|3MiB6_PKxt?uqyvLsoD843FzkF|OA=&i_K;b)zL z)hx^{)hQ=uau5|w$C2T{CFg7rY59^<(XNqV-3^<`6xdtkX0B>N->`!Eaoy{O~ZG}F-r61 zK$-=0pEWw$;~+mrLf@L9kw>ACSZShM+aU(2DI#tiP&R4U9YF@ecN4w&ghiN+<(iq( z2@ekP3z0yrX4T`LU;g^%F{NM9iv}BM@=&T*PaxHy3l>3Ly4*;>zghRSAPpMQc|_2T zjYKBw?^kbli}xkOw(gwt3YS>4^Sc{*qK~d-s9)l1YZ1+^8^>1%9X#DP=CVydW7Cr8 z#|YUHVL#t7WdUA0>}@AVU#($!gc9T7@wUnWWtNlaOkgKn1_W4WpEh|7oqY0HpI^8% zK|6wIxC+yyeQM=j;kT>KXkoNwZsYQ|{Xm;JNmIp|2pjzIRO1q;Py2)!1Pg`tX8G(3 z$9@_D@F&&fq!Su+oW)st;kaLHaIHcTb%ju^IjkOHm_=5{67wr{p+vmmN>s^m{+|XS z{BTy5h;HiHuXIXP!u;(9KPmYCmc!cN7st~T>+-zAurVOvC+tJmA!#CP>}m^9>-Ce1 zXAq-_AtlJHq;bp_3O!jW+x{K4UjR_JwIxNmZ&G+EJ_f$FRitIC&{3XoHkItGtg`}W zh+d0WjVP4Eg1v!hmKjskQulMR2N`E0w)R`kQQ^vTolB^cg2*d*zeSKtWG55qU(pZL z0u*d@N#J-XbdHhG%ml@A&to6^)wo^&;|wyI6vAiTQ~D2dS92AW?=%uV9bit83zSk# z!K>tbn%C`d(XN};zCoWMTZL-CgCUk55Nsy02T5>sd*>vBmiG5EItGWx1@Oz?g0KE* zwZ3PQp)GCid8ymD`xjEE^t^PxHaE1up%@ih)=)81$z^`}K1BJXD$*}bxe%evi1OEc z`fHa*fXvVl=!V7BbE(B9>>{cT1?Ev_h#$Y>C?-l?9@-|6au}Gyd8Mm#&n*z4R@W#{ z5Vj~{8R!5+P%+4KwVr?j#UuhtXimYsMG?y1rDCZRB;Ol7H4GivER+!0r)A*2V&449 zDXq-LaKy1P(+urnXI;LS5Xt&n0C*c{bQ3N<|HcqX8K}13$dGFDJ2spMF5C<~g3gBa zz&eaO^1)eC~L)bOUk?KpaLK#jKTdaHS?>DmeXooXNy zw?5;Y_>04DDy$Ap#jl>=2X=^Kb@mD@hcBT6tO?R73z zl}|vrR70#JJxjjZAo?h8`G4Yx#Hfb^$2N^+{~tDwu{WgWL^PkPFbk2R92&c*Y$P67W>{)-N*dvsojvG zp%=CdEBRT2Fwu7EFETqiSvmUrQ%!lFsJom2Gn>MG!d$&ap&GbED4D1x=xl<& z2-mpLQ7vZ zGD_REh3RyC{53@T_$}r$SDhyZa5gpsxAbfVh=QRJ3L?hU8inGrjSeLUMz=ZgV#K)# z!Vn11Ct;4Q9zFOvOb`LG!}r^+FW@U@e{&XEo%4p`Fie9)2EHZIqpU%Jyg{ku=G{3- z6l8|?eY!Tq)OBZ6&3(pvy~GtCg73?MRMn<_B$jIAU*&Ja!1u`470}}^EntcKNEC!{ zx=Z^b12y;aEkQrz-0!DsnoG5ey`f6%s<6&lSr{?+tteqp`f*l!Z{?8Q@4kM;kIC=pY(uJh^=aatW>dBnZt!dv^L9fk z8*s-y3h&r5*sgMF zkkm%}UFTE@4{A3Q*Wn^9ey7$7$=fWMU>PpAWn-e+{~`tDdR8G`vvvl$Q6Eh z5oYXHLII+1(v++(sH}^pin5;!BtmFYcK3072d6f~KF*O-2na=_L8Qhadt*y|jK9U5 zxVPy#qemd16!{fkSL?9`*lHc{9-?HCXL*}zOlvp7qd2tx>AJt*C!*S+!0dCaJ}1lj zwlLi(AT=!Xg+)xm#13Zuu5o(Jr34Qsa9JG+mCv?Fi96^P)F9+tqX8xS$uu>3&E)oEqpt1^0rc45ExeAf{*J{?!RR>R{h^w zofzp3z2?j7CkymSU}{fpU69E&DLYR#fy{6ZgGo={#|f&SX1xnYhbbxfOjG90gaKDy z9-(=qz3L@6x`}VcNyRID$XWPpYsVQmu}WNLCXBUts&7?1LfRSlc2WG46z(pw^wvb` z_#u56l7r!f7bcruT9V5ZY}HRl2_XT@~5$GmQfh1wDXFS_4Tb$rjM(_-M zAc~L4TpQO395D?0VZ!&<1W+_j+H3fDNEc2=G%ci*4Zk=bs2?+eNjZjT9S)b4U%phiD_soGd7QODJge8zeUoY4@p$r^Guc zXg%6Vl1{+@2#UnQZk-(D{IV=}lx5bF3la&KPLmLzIR6bN5V#j|nU^0m!*~KboF%o4 z0Q`Y=X)$g{8&C{Sex9gLM5CI3&&u9go`e*NHo^Sh>o>zxYOB{XY}3h!!6 ztyZzC7=!U#ffs(S2p44ft#s-e6w=a!lF3kkR?Mq(6~*Rp7|Kzt8d#l)c6PBuRVy`I z$TYvikx2GgDn8N}FFch`93GL}7>QM}uXL^6qOrrS@1u~4zdv2;QazUD?!Tp+Ze0rx z@1&)nP%Drf8B4@6+5}?N8aP=gMHo0eMk5BE@YZZvdrNWORuwvX}%2{n)k^zuEsvc?ra4UaNTEso68>qb6s_ZI{&nVE z4I;%XE~#P`SmlW=#$=Q~%7LJZ(<3tHNi-v)9_w|)FFqlkh;~h%@8%Z|1$d3iP<1 zQ{d0ofHC0jsni?izdi$39-|R(0xdN0s3B2heWi?kUKV;; zylOowSa;nInhC43Op$ZP5Zj;Vi8J1CD$$Bu%&Jm&eg%y|C_%@e1E8vKQ!@5@P&6tJ zdyE`8*dGE^L3zi|4IO-u?D{xvr#GTDgNY`G`%z>WO70rh5!G9(}ounzn`@;>A<;E9@78q3xeD zA+TR^L6Op7NEPuTw5ZJlVeL%}Y+d-rEtyRKOH5vnGxrVHIBm6jf@ zg|<_;4ygjGS%5c$33BI~=xolcAj?4Xy@PpM?A>S1TqHj6>mQJdjo)JIW(>ETE31ts z_ZzEd+L7~2_iZZAW+QuFOJo5*Zxw*5oDlHH0#0}E>P~5+&|a5usW0$snve~wkbgsR zsNA?lz3)hEm3+H!=Iqv!q`hwJL4@!=;LrW0I2*E7)*C@t2C4#a_^00sSr7$*0`&0hzweg5R=h<@p zf3~I;$vhJ0HaaV8N!1S_gc!9Q7FZt9uLlqeuI4fM`g0rt=y_dv;ns=xRMxsO-FUQ` zqFcQE>MZm^T~Va`?^#5iHojkZ7>R=0qMKTsfFh_NBBT%;MUSfog;pLjUCE_bBtY>@ zYJKR}iQG32d}eGT6ArH8P2mNLW1WX(dQ9KAre=Bg@S_WH$Rky_w>O9`4G(OmbSLC; zll0kuLU?`>BZhmGD%*APqxE_ldm*1>w?W3k?3J;rh23RtLic7&1ZUTZOnAdM#}Q@E zow1~Hc#$dySpQ!+co5TC`kiXk^U3>cQM}h+j`E|IIqQ_oHLb%(E{LpQE6~Kvvs(6C+MS4K5u{# zFVXxYb+wZeS_rPX4w9!*7e<4JqTnp3W-7LbP%4NGJ3rCHe{XA0$q2 z*`AecvC+9jGUl)HW$?-k*Fe_I9CnDZ7VS+p{;S9^C>FH}(6X?T4F`_l8P3+v++h;F z_BPAj6|@X~)VAeb&w%)%%#*Zyfu36ITMU8MJ=?uNOSo@Ludq=sebtp7+=zUyz{XRR z5_PtZ`IqiZl$|U@Fy&CHGAA`^Q6J5xA!^4kgU{Q)dV4&&6lT(j-)kPRK?@2R={l&; z0##Y-37934+9t_gzw_GdFgxAECwDT&;w4PH{BepV19G@XF={7giVP5sgk3!wz|P-8 z4PZA*^URsmrviy{G8?(VWtX>&l6w0 zumy-yFiDWlJoor2EN&lc)tVx&hH<2;LKE_{TI6d8-7}>OiPRkHcrOU6N>OAZD7x`H zE0KZ4&B{P+u5H3{c)wx%>P-F z$0IC8QbhusJ9+YiesS8++@jS@re_U~gv2_GtP>vEUn&W~+!)G|ww*Y~7z2Ui%#XFy zfnu(mEl&v+rS@GHj7VU;YY{D-H`5~9o8mZ(>^Bp59IQoPG+DGnIf)|#H0%@Fy11^Q z6nPV&i;cC96j)xUB4KE}IyJpTRZ!x#;ySVI=kXEpwr-kAE@yS3; zhCA_wClM5oqeTv)oj%kNSGMZ_3#x0o%Nx&nK=uK(vZ%+XHX0LcR#!y?A=%9B7m&(0 zv)wtSD*Ks1;9}}|O#{T*P3K>UMahbZAb#zkrC{$(D@&SPJVq3~% zf#B=)<)pL!G!Kh#p)#^z-av&WTOD4ydt%7CI{DPsXP`MX1aZ^hmBMtC354!1cx$9T+KG zM+(?W-#mF~Q0g`vF|#F0I3dT+yTcr{h!;X)`B~-=na&0cNLFQxuYO}?5!exNmhAa& zXlsDHpFDguH=;9OrH*dq?1Jl-X)_4WC=?BM-URt1?Vp)m`$gxR^tDt#aImktWlZ-2#;nOw_7(8bPe_T|lA*2c8y20RAujSXA3s@% zu-H8hXXft=d=XW4>@7(^@$3PONj5U|nX@h#2h32EXldLG@Gd|v=v4u{s=Oa2{FBXw zWzF!XBoFY*rwD>cOmKrI&{F|?3OfWaj3Z{Y=IY!A3LFV8OatJ71Y+C^H(FW?<8S-S zl|mKhhM5pk=?d^5K3>PuIy(If!hDnGK}&lTT!0h-Lz9*_FBX$fYI*rkIe+7di_rVe z>Cmy38V6l8H+=Z|_#*dsL;vELbDj2zHCQi$pxe(OYpv54ZkQiq$ZwnZ+!OxI1V#z< z*_HEKJbF{yjF8QT8ol8h-}1`DJ6o7#B%%kw<<^m9-89qgxkj1Q5G{-q(6GMrrqpuQ zY-aDx1%Eh!E{q?++m|%IqG=atgEWt|Lt&DH>Uitp+PR^wP#XjVJF#pF-`*jEzjhsx zSx+jIQ9TrHwWv692q`qkV5=w97i6#ri`C*2!1!O>u^tV;wjyZ3!&xY!EHI*Qthr&+ z_!t;>MLwN$h7ws?^AcgIicyfm zofIWfU7t2HntT)JeY3X|eQAO5oFwBI3|QTd9qy?!QUXbfm-w!*Hx%#c8qMLpB{z_| zv|6{^)Ilw@pu&05uyn#T%Byeqm@KV!Z literal 0 HcmV?d00001 diff --git a/static/images/docs/oauth-server/diagram-clients.avif b/static/images/docs/oauth-server/diagram-clients.avif new file mode 100644 index 0000000000000000000000000000000000000000..430c22c882c01b9e8e6e7b849881932afefc1524 GIT binary patch literal 12975 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 literal 0 HcmV?d00001 diff --git a/static/images/docs/oauth-server/diagram-device-flow.avif b/static/images/docs/oauth-server/diagram-device-flow.avif new file mode 100644 index 0000000000000000000000000000000000000000..7f3517e54555e139df2f588b5fd774d684245ffe GIT binary patch literal 22997 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 BiAewe literal 0 HcmV?d00001 diff --git a/static/images/docs/oauth-server/diagram-overview.avif b/static/images/docs/oauth-server/diagram-overview.avif new file mode 100644 index 0000000000000000000000000000000000000000..531e123229903be66ca7eb9f3f9d5618c1e48ceb GIT binary patch literal 13788 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 literal 0 HcmV?d00001 diff --git a/static/images/docs/oauth-server/diagram-scopes.avif b/static/images/docs/oauth-server/diagram-scopes.avif new file mode 100644 index 0000000000000000000000000000000000000000..aabd371fc8703389877e58383142bc822bd596f6 GIT binary patch literal 11200 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 literal 0 HcmV?d00001 From d2aa7e584271fd9525e8b28f662c3ae18875a51a Mon Sep 17 00:00:00 2001 From: Atharva Deosthale Date: Wed, 15 Jul 2026 18:42:37 +0530 Subject: [PATCH 7/7] docs(oauth-server): tab authorize URL as text/curl/hurl and authenticate approve with session cookie --- .../oauth-server/quick-start/+page.markdoc | 25 ++++++++++++++++--- .../oauth-server/scopes/+page.markdoc | 4 +-- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/routes/docs/partners/oauth-server/quick-start/+page.markdoc b/src/routes/docs/partners/oauth-server/quick-start/+page.markdoc index 81a22008e2..91c48791bb 100644 --- a/src/routes/docs/partners/oauth-server/quick-start/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/quick-start/+page.markdoc @@ -684,6 +684,7 @@ Vantage begins the sign-in by sending the user's browser to TaskFlow's authoriza The URL uses TaskFlow's Appwrite API endpoint because its Appwrite project is acting as the authorization server. Replace `` with the region from your API endpoint, `` with TaskFlow's Appwrite project ID, and `` with the ID generated when you registered Vantage: +{% multicode %} ```text https://.cloud.appwrite.io/v1/oauth2//authorize ?client_id= @@ -692,6 +693,24 @@ https://.cloud.appwrite.io/v1/oauth2//authorize &scope=openid profile email &state= ``` +```curl +curl -G 'https://.cloud.appwrite.io/v1/oauth2//authorize' \ + --data-urlencode 'client_id=' \ + --data-urlencode 'redirect_uri=http://vantage.localhost/auth/redirect' \ + --data-urlencode 'response_type=code' \ + --data-urlencode 'scope=openid profile email' \ + --data-urlencode 'state=' +``` +```hurl +GET https://.cloud.appwrite.io/v1/oauth2//authorize +[Query] +client_id: +redirect_uri: http://vantage.localhost/auth/redirect +response_type: code +scope: openid profile email +state: +``` +{% /multicode %} Each query parameter tells TaskFlow how to handle the request: @@ -719,13 +738,13 @@ After Vantage opens the authorization endpoint: - **Sign in if the grant ID is missing.** A URL without a `grant_id` means the user does not have an active TaskFlow session. Sign in a user on the project, then open Vantage's authorization URL again. -- **Approve Vantage's request.** Send the `grant_id` to the approval endpoint using the same TaskFlow user's session. A browser sends the session cookie automatically. From another environment, pass the session token in the `X-Appwrite-Session` header. Use this request: +- **Approve Vantage's request.** Send the `grant_id` to the approval endpoint using the same TaskFlow user's session. A browser sends the session cookie automatically. From another environment, send the same cookie yourself: it is named `a_session_` and holds the session token. Use this request: {% multicode %} ```curl curl -X POST 'https://.cloud.appwrite.io/v1/oauth2//approve' \ -H 'Content-Type: application/json' \ - -H 'X-Appwrite-Session: ' \ + -H 'Cookie: a_session_=' \ -d '{ "grant_id": "" }' @@ -733,7 +752,7 @@ curl -X POST 'https://.cloud.appwrite.io/v1/oauth2//approve' ```hurl POST https://.cloud.appwrite.io/v1/oauth2//approve Content-Type: application/json -X-Appwrite-Session: +Cookie: a_session_= { "grant_id": "" } diff --git a/src/routes/docs/partners/oauth-server/scopes/+page.markdoc b/src/routes/docs/partners/oauth-server/scopes/+page.markdoc index 5bea1af18c..effca6f659 100644 --- a/src/routes/docs/partners/oauth-server/scopes/+page.markdoc +++ b/src/routes/docs/partners/oauth-server/scopes/+page.markdoc @@ -329,7 +329,7 @@ For example, after a client requests `tasks.read`, the user might choose one pro curl --request POST \ 'https://.cloud.appwrite.io/v1/oauth2//approve' \ --header 'Accept: application/json' \ - --header 'X-Appwrite-Session: ' \ + --header 'Cookie: a_session_=' \ --form 'grant_id=' \ --form 'authorization_details=[ { @@ -339,7 +339,7 @@ curl --request POST \ ]' ``` -In a browser-based consent screen, the project session cookie is sent automatically, so the `X-Appwrite-Session` header is not needed. The JSON response contains the client's redirect URL. Send the browser to that URL to continue the authorization flow. +In a browser-based consent screen, the project session cookie is sent automatically, so the `Cookie` header is not needed. The JSON response contains the client's redirect URL. Send the browser to that URL to continue the authorization flow. A client that already knows the relevant resource IDs may send the same structure on its [authorize request](/docs/partners/oauth-server/authorization#authorize). Treat that as an optional preselection. The authorization flow should also work when the client omits it, and the consent screen should let the user review or narrow the final resource selection.

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 Kg7?r24}*}P_|N+Q literal 0 HcmV?d00001 diff --git a/static/images/docs/oauth-server/dark/oauth2-server-settings.avif b/static/images/docs/oauth-server/dark/oauth2-server-settings.avif new file mode 100644 index 0000000000000000000000000000000000000000..de48efaec8e83dfc05ea099b0612a6c98fe63abd GIT binary patch literal 31883 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 JbtuP%ND6P5u`I008>m1X}n{A=q2ETl~)h3;_Z0 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 literal 0 HcmV?d00001 diff --git a/static/images/docs/oauth-server/guide/vantage-dashboard.avif b/static/images/docs/oauth-server/guide/vantage-dashboard.avif new file mode 100644 index 0000000000000000000000000000000000000000..914c30a57ccfb56263da3c71c1fe5273a1a3b6ed GIT binary patch literal 16679 zcmb69V~{XB6D^94ZQHhO+qP}nw)u>0+qP}n_RM*|eb4@Ts&1!})vK$kl2nDA0002s zn7Md57`j=S0sJSnmS&9q(`_vc|HoHtO{68il008)3`k#FMzX%{e`yV5=w6yy_mHrVL!(=zm`S`5L-0 zF#bFi+oKPLbH(El>f!hZ#VgQbV%|17`| z5D@0FuUj^X#1d_NPLSH>C|1-!c|vrw89 z$)vv9-^lYv4DF!q3PO0mN4j_yg7Gs7F=;TBL&3>oEe9kwElpRQSCL+>n4gRYsd16S z=1`GUN+V=~#{#JTl;1%tg_^h{u^D`hwOLj;-q{lAh-l~}uw4VIp7iB;rY9aaQhK6~ zt<}w)XHlOiwoXr7kI>l3GY9D?k(V{yqtVJAwr88tid=)^e6EbjA*b4vkeb(lT~hh9a#xeR%_1woKN zwi`(vGcVaDO9CJ_s8Mn>W9gS|$bj<69Dc2@d5d^g9+MtoSq}mMO0o9YIOg3iGSQ;k zrsn2h3|@Ylpl|Cu+js62Lh|@6Az9i*TD;9h0}jWd@KWp$FuutdZcbg&o&! ztWL5ybWK(oK5AtGYYn+M<&5q>@>>rd@c0W{a;#$z|ES^3)(P;mYmn|Hls zyLSI4f;csm#F5*P3|#6e9>|FSh^5$P|3s1+#DnocpUeAtSxphW_~ji~5{KHBS(6p#JZEmU%fmrnC-15{tQSV`y^1Iv z(U>-UtG-a~{}Y(J{bl#g4Tq`JU$~_%Rphc%?M-qaW$`Lo9OqDTdHsRu6|T8bGMHHW z`&7ID8#kFKvA}|{>gsJD)pn|Sw_o6zTI<4sp!gkG{~2ayi}O%0ZBojfFD7*^%j62w z7&geYk8Z^jmdY#i=aMZRSqcLxa?m3anxAUHz{hG+=mfn<=!1@ls6f>ZgH7&it`+w=)Ry-932u!rL-K zcJ*5jYG4csZH=9J`e{cy4eo-qP;;9ZlC;Bcl#!0ELR97pw+a0voKv8?w`fO}?3tDA z%&hV z_}KB~-f!njDbky<8%OIpmX}cF+8;FwVNq48()hg2Mwsm{$f(7VYSp7Z>0YzeA4rMw zf*rbN3B^a&FK5;LUe`LZnrVFhM39D~0huz_OY8m?IdVQSuo(#WG-RMIU`nMkK_n2x zmz^s*8YGn?qWD4Jp=5Z?%h67cs)t^pd$PG(0P@RhAQeDE5dGxnm`BP{BR1UDd9STy z(jTwEX(>wVthTH59u%IV?ljLSEi+>~wFNm}{wenj-I?`66A*wSNJE@WLG@0${PC4- z!Sx{XOYm-|MYq1D(b=9ovCoT^&SA*OhRv)d3LLTf6>GT8%E9*e(%w)#XzqDCT=e$p zOZ+6(*eG?Ds{oyMe$v6yKb8S-rV_`Yg@8-7NWCa;ywRMU@(JO%HPO?$IN%p}=XUYy z2%}|wT!K;ZpOy)vHNH7H_F7-+VI8a=F!Bxq1iM?0-1@c-??=^B3$HE6N;#ql8px3 zapTgnA91g_w9hu+4gi{nG&}WCC*OqVdFxWL~wV5<*Wy6=@vsVqG4g_{gmc=YAw<#i|KI*4A8 z7T%nK57Obd+_O!HxK)faHToo~&+tElRZBMaAW|>Q?dpnxcSA@!Hwz1TAms4#E`lC> zRhvgo73z1FW8+cHAga4*kL0kHu`OiY*m_E7k8;W-$PLNGq{ewTHc!RT!jLu8$QP^6 zjAuodAl?n^KE+b*SUSq$czdjfC-rErlGn&^8ZUU*f2DBC0;_!1ksCW@gIvrumekf# zQ|(g=nBjG~7Y>+r(^Nt!usd*lBBlQ3&fE z`A6qnYMt9D)U#c)znqpOV#@ezJ(~fMqZIHS4J}*XpOobpC*r{nOVHfTyg_U>iKhv zMz^}*v$o3(C07#gh(j6N(S_6imhYyD4K#qZz&kCiA6y$cMI3ldh1AlJG9|&v$PQT+ z*0)PNM(8G7PtJCRH+UeIVW({)=KF!+Cm79Fu9c;Z2ezkKjME}njb$++QJ~(lvq2v( zF4V697_+aE^2|&~(-k87pHkrcAo^-<0BhEEMb3FPlGT>K8S20VJ}Q^KGtl|XYwf-` zun6v2io#b5@X`04M(V;eQSALz0moL;@X0F-q{6AB3TN??{Z14d)Hh|D?-okS zT{k9hXauk__+Go1_n;}#76L{2w3>BJ(qzn}n4ip^wHI%Ba1g88 zr>i(WaSLHb0{486Wsd^cGi`a~{0r0})q1 za>=S^*pzj4YEd_ugac2Y6GDwd-B2J3>#>rlm3}D|d5|!3sWyp=CJw1lipZ}Ov(fGVIqFnTl^aV-}R4}{SBE2rE2%19fl3^ zw7rfo(^GIi!I7VG{vZs-&LC|u?zLH0XX&)b=u76r=)tyl#c84U?Vd$RO|xQlO&d5L z^{_vaD9BBGkiv3gYg^$)P(si-u`&7-*K-w0ID_P+nux-SySRk~JOgNEt^CN@@#k7BIx>L_fF8J~ z*2aSpc`uc@PrR9nNy`(9daM!gr7>C1GWDlON-7{|$Lx)B#gkm8SeT^`?(M|CU?>zX zP`1zC`B|qSWfd+Lrg1I8A)&HXK|0HKXZq;Ycz_<}p(T_rP3nJxb0J+pH8L>F14_Pb zd4!S}EP(%XwRx>|xXusswhTqIwZKCd=Nj!I8!DFn8|lLQn(-hYIox(4mUluB&u~od zp118VPOXdQY;fkgYyl!@%Vg)HV)zM~5U#xK_UXe^7(>umX+-|u&Iw04^J!mP>@zaDstK(7pkQck_Fix>V=k&~sXV(OlM{)yn~gB0SM91$S+)Hbo}t2znR<2* z&F44lBzHW`7X4;MO#6L(SQB``y-81@Fo}h{1~u+xuvz*;fLtz)`@_TdI9daZ zvKkF|N;_%~B=q(C?z{kG0XCWzr#dJ}S+smpW_Kl}umLKS?|#l_Ede5mZ3%1eoO9tV zsc;cA_Js@`H$$}V5ahUl}0#UTR}N5%$@ve@RCJIL6al%CE=2qF}qyJ+dlmB=Yz2;gQG zRCD>jcWG`whCp`nKGiF@oI+6a3JfvcxfjJg@)`smb79Wd4V@$wQwG&Q(QF}isTDTS z+|vWxvb|W3KQjdHm~%V~+mq&(`*O%iL`2Rk^O^$SCzLMtdJy03biR>0xjffmSe>q1 z?=k*-*1B$L10BNdhyDQT9ItAqHGq)3{`*wdEvT8bwhEYu_GUfzXDJ~fOH!K zax_;JR4Cv)VN4cbZ!DD}s(9ku?fIKU8t3P+4@CRFrs&jnX)9%daX;BiV*TYzex z_Js-PH(UWV`;DHJrB&ySyPN?j-S_O`*grHP0I@A>8Uum-jvQ`4%3xbf!f;5rY&CVWu!q7jJ7t|;Ix^fFK15&HM2lWkx+^wu&vs(1e(19z`1AJs~1brd}Z%RpgX&C+y7!v6PW8A zKE~3=bQ+N>=&$z)d`ZnAa8J9L@z3h+QD2Y&y}3brI9n2xa3BDDfBFSC54`J zU1vuxoopr+P^SM=zE13!^v}Wf&TYwb)#EW+4S#+ZJvn0?jt~+DNL;mO&d5&zjsxcv z6``4O5aHXcgT6gQ)7I4w18~$E!QU!35wp@cdBF@=?kp1P1#aEg5TFb$6j&9lzzt(I zOV4}^7EmK1%3x2;M8zemjaNAenN|=rE**A%uecDc$u?;Pvqa^}*QXZd2A<7NN6}}` zHg>1YakbL`@(^amn%ARuN6i{5j=g%(XX z0>txC2WwVGaUm^FGh}bqs#Un}MPLLT4-!01lT%_HNB;(ZWytgw!!A!U^Jb#cEQc<9 z9fIHGvyx43C|!}vLBysc2~FM=_Pd=}?kg;ffkVP-!_A`$T4P96dUJQ&@Xr=yDDNN? zHZ#;IfqYjWdo<)7$-(aC`h{jZP(Czri&F-_MbhIs2sxmi`YFgS1HN`~)`XarSwz|{ zyZx6N1yU&wd9YqL)8sXvr zgU5eu=2@naxk*IcjDBDCanm`5&?dG=ys}XNIkj=u9vTGkpt_OL4Lok>qkw$^3&p-U zNN@B|P>7);VAFR2#$EP3em7cn@1TipAI@IUHSv#aln2z*#FWGl?@*Wlx#oa>^U-YF zTt-lbdE4RfS&dda)ze2c@0gXC@`BNdu>A#2^f3n@Z7Q{4E`7cK3?O-|`X=T%-rjaX zNc%856UHw7-{U%JspvxAS|DEx6rKk*EI zbE|l%dCP;CelT|158bhXRyN+2f@IKMzZi!@>nOZ**H=VBBaPf1po0f+xt9~@WKu|?=0!t+0@f3n1C zTak#P@~YaP+^9X{|^<9n`zS`rCkVrCWN?3ecC2^btpLh#Dh&C0sEBW=<8ZxOMkJI-uIA_k>aHPC8?X{Q%P#KB3JjDSxg1LtyWDpfV*yg-^^=v z{t3>=l(1hYiU$+IGwe_JO}Rq`_H~_^>2sGB_R4;Sh(PdPy*1b@y2wQiRy}yP%lHf} zDg|xQu&e!4T^4qa&C^CdV)~TXU*MxJ73gg+l9@`Kb8LGY&-zx8I(MpnsW7=d^^l?z_tHl7ko1YIo?jCf?vw!X z!|y-pGEwJRWofZf_BzI0O7l-}LPN?iinp!$VC~x&heq7359$usEayl_ z65C5~1;oy4qvmLt#$+#EyE1w+l4Qd7bd}j5z!U?+qJdmk>hz|401Ga$D}?1VtH}b( z<*_euy+zga@DE&wdV{qQ&4^_`pAb;^nzr}-IuubACVdvPTVw6Zv4T&zN%W?e zXiUHJhDae!8S;pJ)f=Yy8^GDHQY}hTE;XIUyOIWLl2Jv>0Zzgx(nXapGiOk2^45&D zSH0>CwOQ*(A|+#QcBG@bdTC`Xw|m2mHE=N^x3H_bCnRBCy^kwF&M!*h$e5g@1?K{3 zfU*~H^;H5V26Jehd~YSK5(5St(+=a<-%!E|)8dk}zSOBG|>BfE!$w?s2V zdvxqC*|rPHx7iC-F|T>U#Xu~esB}>CyRsmw@gprn(gYaH$+(gPHf&%m=PV=9dkkB} z#bnYWpJiK(*;#0H)3jea-A+J`SHcG}Z(J82wW0JbakBu_OOP^d%98i7KIrIY>Xqrz zi4KA3%aD#5AOBeX($6~DTaYUhu-+)F5BjpbrpA;o`)ruZS|2x}Q+jP&ZsZF%VZJIs z8@kC!5VJ9&wFq+zu{`@*)*2OaAa!T51R^3lU9jBaqXE1hbX4NvLN>OOfP7UxWtRvX z>G#FRPUf~1d7>0{PmA{LU2|Da2G0DeLBv5D$`gvwuk~vBnZ!EvM&-%f_Bf0Ctc%15 zMG4LwjLUI-uR)z+r2nrs9kF;aKNB!TalKoFldteF+?56Va;=VLH`PUI>a)OT{SjxD zJmz&JqCpB9H^q*nqlr7mw(A!ZM|h4Ao#yIItE z+B+I9#F5n2{Gpz$g{KxYyx9*2CtkSAJ*!>L`JVT`cLi3&Y}6q~G=PRv2S!!ZGu|6F zUd>uLo@)*(cn~`B9IKjVK zp^5B8sA&uv&>~$NqXn}U;Bb=rkEh=aT9XD$hHadSVA&9d4b(tv{$E$Y18a4~Y>*7#%DXSQr#u3B!v%Z(vY2onga6P1deDqal zePB7@npE?i3rvP$61J=oD(zV5Z`54(`w~#dw;H*P=Jc`|5b=U$=-v4sP*L0i*{|c+ z=bG8L5@qZdwp_vY$>_&}pnu`o0fB=t_!NORJd8kKe|mH)jpspu@H_W9!q3K6)+Qg< z=bYAVUm2Gpn$zun0&~XI6f($^SzXlfsmN>>w>K@^$SOK$QSJ$5qr1aFhG-vfd19M+2|co@?XG9P?*v=lvAH za!dT^XU+=P@^uZ2p zY>j)ww{0z>I{RVJdc2tCdp02Y%*0q%SsEagNRt121+Y|ho28$*85UxNKTpZpl$#Fn ztqY;h=z9v{>qbk!4jm*Kodox~%aE2wv`tr{g5Q2OD^_{KKWKnkb(D49ShvPW15Dd< zd1UrVkc2v(_5qL z6w8MpIn3_O zcc%9!28TiUo(s!!k3`QHK}ML8>wx6w%v-|*1x^5TJsonpQ2%6$K3Ox_v_e8^s@L z-Qb$5r?{iZa>2m#h5KiG#l2@#=an?Jf6&xfz*RVyfWh*-qH|8-eowP(fn z6fmWV;65GaE0(kh5(&qpHB5Nx?^-&C_;}7Fpfon@6uI-9FlmrO|MBh|ZS|&%GR1No zSf*;QynR1;M$HX<@6YW&e)e?xw~x23|J5U#-2RGSqL>^ec&=&5KTJmwD1EViL>4{mi_{PC$ENt)NyqlB@gnjFM0p*mj#QM?4 zo__iy)TvJvn)b;$AKn%54q?@Zwf?@k zL}iAp%Sb9bFp{laJhDqBw8kapUhj3#(2RS)#G<>7hUoSs(LIBkaoaBIdt!V7z0=J# zqsKn^3fLa6r~tus5Oe_j7ffidAdq1q2^JKqO30HGAWR=i^5FANKTG(qU}YqXt3Cdf z+8NB>xeY~7fkTgYX{jW|*sovN7N0K|q@WJDEioUCsLceFty?lzDm6nL ze3FJo&mk9>@D#A~)NgIK8ggcPFmYVteqeN~7m}+E2jkb=k>-|=dBLdbZ7t?Eugu&* z9`APV#1MhS2DmGmex0EL8(fEi8=f`~+aqiq*5~qZ98I~%k6k%?@+*P3Ked&U|0W2cSsgMT;8N==(d)oF4mvwE?a1#zWOfnecUyka@$ zD54>C`Isnebccz3G=~l;7pKR3&#!;y_7Ft-a}=eSV5J9SIw>h-{0`MBHpFB^0kg(q zQANI7mt}jn-MUTDJ0KZk9Xb)Il;jeoy@#RkQ7JSX==K8{V>-zgco?WRia{~XbHdMr zMND5{h$f&-h&6;Yz!o=JQ0Y6+ULVCA@Jp)m&84D#N$0^vWh5bUv2$|#i=S3PmD@6I zpyE#QPC^gzH0(9BvO*U5)1>cJ`ehBe$GsoxT30G5v(3}0#aS>0Tx1!(^$omwP^^nYc97;@3HozJ zg~Pg3hrpdv`ib_ap>0mCtzT2(=(7YZV`7=igJjhdiK_bY%o~{a;Y{a}~*^R1U{p zwBz9Iu2=m|f!i%Jf92BqK$A(ad69`sjrz>D8M?cr>X`*f(Gul!H^|F(SGE`CQ~#9i z@m&%6is!# zP>-T#3>j*4Y+Z3Vfr=poFPyB04HATTxPB~ESnTky!fH@!oOdT<0^|0XrMAIM&0R zCtYG1cVAf^3DBRf++_WJn09TKYZ-qOeXsrM1mJD^8sp2%e>>fxa`3!m*6{&+>R z--gqD0M_f2z!7)T^w^j$OV9rVyFHt4B;%u>ZoO~InS*v%3U?Ya09RZ6kBzN^j#X&C z9*n)wtekrPHNx65Yf$Cz;s}$gSoB% ze)F-EtCLHJdpoF$%MDIwCLAO9lrnE7p9lf-Q6&#;Y&F4xcg?=t!j2T?w4K z-bgBs?q46tP~&t{7Ofba!TFZ0C$8?iUK(UaPw?v@VsajHo%e;A-ZWU6*kJ2wqF5ge z+=k1e^~2hxbX1pWG!*SWY8EC7TeNWT9(>z^B*oVrk69BrMs2F{J|w*K-b=tP_plR* zG1qhD)P@=Ocq}uoi+R3hVNck7QeVs%AgvFNC`J$(q;VfW_|n;jfo|56RLtV4LHe;d z@PnpRn8Rg4v}OJ^9za*eeY@8v9wnyGI07U{GYnMWLJf+Kks_n=-=1HL8lK4beAMIo z_gx%pkqFn_9N8GE`20wpGaZlGXbt{s63C5}F_G4-@k*m)go}Ruk=1m!F4H>wq_f>o z44GP^qDvU$eoVo8itQXNPELVVEAN-D-Y3Av$I5Es!)5+f3%B0;Q*zA0*V;KXcznG! zRN3bXxo@tUIv2$Molk#vD!=O>IbG)U#mkDcdxQE0gPkzk<13@TWxkm+5r|7X@7-7SunJLC@+PBJWi+TmwdsbG6{<5{s zgsc6}*72%V-!?Zanyx1;z-6cwLin;h^sc&q@W^Lg*y_q8x z`;xCB!ze{Zu%{t(#EaH-P~}`qf%Fs8<)@}6nu4l;O8J+Ze+G2X!sNKwXN?s6Z=)WB zv}_kIMR#v_SKcJoC5F`ykWY1;feJ~u96chYyR5iTIg~}vn*qBLvay|IhYOr+k%O4b z7gstGW>Ct;= zl6aPE{)N<Rhl-XSy-Q~?paiJtfYC^D#mKPqb8b=E3xYl42xNzPQ4YRKSHKk$njx6D= zwdTBTO-&CxA#6?DxU$E@62H+L{nCh>gcqf#6j^~@MN2on{wC>GmxThzAW zXGCPC#or30fA$MXTP`ndwr3?i3EJOp)JNfW8l;GR>VP{r_br4UPaNo*&*3r_+3_JO z{KOqvdzKm(Gdg~?io{21q8wA!*2zX<1^$0A9dwCy;!2ReLuP^=N8fy~DGW<7;z`q| zNp#3OYWsxG`D{Dtqk)s5Jnz+-Og+v`*W)lBpUN?wQdf+QqNj3evL1rf(Dlcl_>kIq z+7IMmfkkV!F{~%hSZdKHf<7f=y0h(VYvYZjri31$$80$fJrhise(T&iI3>WZlUm|Aa(v%Wx5$eOa$3m!6so0c8pT*aWYt2cF3jCj28Ree zb0&HD9^iuof*KAuyyCM}8w{$;A*;!xhem{~VRhd&PD=HowEotF{<5gm?4qvfOaUC3 zHan_|z9aZ{NoV)_gdwu_ywoK_VSC#5Naw-+^)E9H$X(0-HcpJv-1NH2c%hAZ#PrLE zKBckc24M3c4SM+@S}8-CBoLs`&pg&Xe<+i45xv@3J{#?k(p+kl3dx@AV^d#CH$M{r z1eBK>FcwODVPZuSW6fNUxa$&3X%Z`+J<-_JmmTWca*Fw@lsVnK+)C;_w`+jD4gh{1rPs9(q`bd=-#*^Y?XzaW8J(T;X2IqNOpD>H)lfyS(IWk1{VB9y z`R$g#IGayBHnFm43?mxM00sofS5fTms*+ac`kBTh_06Q=q+NAGV&geZNx}7Hu+P|) zvJWv_19OE!GC})3p^HQIyp}R7Z6K3;zsfW$XPYO1YqQQ;SXh0%>96^)_0`Oz|IIXh zigRcfM>euC_R{8-3oK2csgbAtom{0VtsIJpFWMwwGZBW}x`%RBZ&*NHmkwk?a7RPk zsrrjQd>~v!$ID9~fX&ebxg(4)}wl~x+M?O>&qH=+EdCqol2Us3XI z2{Hysxt_jz2X;4U#qHCp!c%0tV##cf?a;`z`2%B;R!)Vb8P=tJDjI4!;U_1;Cj1IL zf>wdBU;}A1_23GfMpdes^uEdmXr0>@fQ173+MhWTF*!7()SUc3i9q;&csamW=^Y+wQ{cgKRdcFyn7=ArdXZJe6CNjPP4_TLGyZawK70Ns1hjb$28! zBH|8~DS->e0sn+>ooO5s!{4O#lSIm8N)?N8*a(K!M>B%l7Ax_FU(402Mt6CE^Eyy# zU%oY%Rs6=Ul-!a^|7MthTt2IBC3BDKYh!t&%rA3UeLX&C8@O-a<@$>_wT#5H-jRPCX9P-2|Xi5S_5pI6L8=NCC?+MhaZeY(IKzWOmCy^7PnSt7MB5^ zU1olT&3CiDkAEy{=f8nt;mHaMgiOrAdZ`a?-wJ-027})C?zJq{fsc9qoWK49$Nt$p zszC$#??J9tJgXZoTe%j^-Vk&_SBz5n$J02wRExx3R!ov8VN@77aIC_Ta*{{rZp!sJ zQG+U#-@f5(Ehk5N*Ye%xJ{?~^gqhI;8cBH@QaEfx5p^erAj{fz1Gx}%gx{stGreJ~ z^c<~7in?1_t#g5&%a=PWoeHl1qCH{lJD$35t)C7dzA(aIQKHZVFb{e8vw;lV*&t_m zzYimM*qby2e#wQhLoeS-v7cn#MRLESIT5BD7QG}(_OBi3j|<%WnX>ZT-lgpYfp7Ie zT>aA0cYKb)&3CjrM9!2hokpa*`Cb*ijE_vbt(_iGIZ(9lD4nKt))5Ij`6}-In^;PT z+zY`M=&MIH*@=_t6ILTr{>hVUj0{ea?`uIIXD`5^j`G+^bv#soh}Mkt6^zR}RwF02 zI%G?beHYI{Hk6(dv4+QA^dhH69RbhYXQDO>g*5Fyd>>xFfhElTS=q}1ePk5#GDNY! zwj?0m$ql4|Yfn}EH2sSX6VRN<}Y_rmE5{uy#Uaq+@{j{4{?t>8Mj)i zu_U{a%AfLve1_S}rkM+>{;`NOb0YFc1 zbNiIL&ENIZc=aWRy{3On?&rj@IR$n2GeT-R^wi# zgJAT?vWW_7jKkr}=qUha8+|mR)`tX9gknfc6h?mVnMaCze3e$bAqH8fP|_s36dpbG z4ThNveA;$_URjduf*H+Hm%Ay3)R!(%t}&W|EfOp;x>~3QOVvfmQ)M9bAf9;eM zQ+}x#pwWY@l_eeJmrB)RSK#_;HYLAJg@V5d$2kA$yt2BqaK&;V9;#7f z6niK?b-PDCOtRK?PKw7Ho&~_mu#>gZnn8)xc0&{Sz% zbX+cmzu`V7Vc*@!IQo(aHR`bc!h>xZh47il(*dKm4gnV4g@f%|7(c9E1apW%={Xv; z{Cx)H$D&15*xn1bA9rBp-Mr!NWPvr6lNjXOSKA3j1)pfrA8S!~xMVckg>|1&9>jp< zkV2xFHkpcZYG3KMU$XC!a#RJUouxxfRHA4?1Sl;EMRjzoqH&Cd&~d&7hG@%)KOP%W zihC3@*1HWC?#nUE6-{{kSsDQDVuT_D-f2Pf1h%G-~rar z!5BuLA+q-Z_Sk&W=UO1>a=t0Y0v@q+cF2Lz-s+%4@gDcw*YL++|xKNo&988w9WK4 z+VF$L+YC6ZQ`Zz9$^$r9<;(Do4&-M+wB<-S$pe^9883TM7!H{Wb*3UujA{p9J_O{I zf|nf@S6ginbLZyejVE#>%CyHR<=b{lA%nWB&@)R(K;DsL$y+x=K3AotGuQclV)00s zUoTqGl7k^5>l8FOb77OP9>*c~5DstOa{-jX{kF63x70pP)!QvC*~z6^u6@Pe z!!OU)b+MMUBSd;F(2Bf5NBSD~Ne9*fWeif7jC7K`%-eJp$d|rhL&V@;IWr8KI?Z7x zTH*MM7mPw}>*mR_)9W}d3{7)9SmwrE!tkLq%V*!kt; z#Zow4;)0l1AzcKT(766;r<)+N>eyU<{WNRg>KB|lwX_qZsEsE4>c-WaK*oH}KF1dN@zXd-6XcOqZ6d)xGyjs{LJAWXQ6RQaG#7KB>?;%v~i! zb%?+8W+;<_sr9NTz@(=_Pd6U{Te&MzyVuOqQw{6ea=Ltd*J>S`g~1%+{(f0}B^9te*qYKo-ABW1x8rIl>BHsqNU!dt=N#1-O=52Zp;UX2$n2yJ z=!*aJh$E`Gou_G4@IaQBQ>VmbTtfI{FL%buZX(#&Ew=Fc+ z!rXr1cz1Ebe>@V}h*l%KjA&&Min``;dbnj4i*ii>A~s9Y{acH={X`CrK;J*`lQ`+j zZj8yI7x+_EAIgft4Y#2iQ%Wm-G`TDmuuCp0jO{*yMGgWI&YUcfxLw5aikr;P7ieiY zmbIS&vb(*Tbfv2**gt!hh?48Ek6FMm$?A%ssL%DA>Qhy*(#Db zotiSCT1`zom6@itG{uaMAor$1QR z|Af9O_$*%^o_T|-JI`XnMW9>?mV03QUdt!VTJmVt9^zlo`9SWboq<|TPek7Iw2`{Z z5B;b3>PqmURWnmmc>YL)lM}w8$fL1ZC6;{6NUfIHx| z%$MYxgDEmIfNdyu$Gq&8maRfjh{Yv1AYWqpL9=CEV6lf)pw{CeWg1Y1!Z7Yh7>UuL zlAY>j`kQC}C08g>HmS9P!v>!0(<>Me4?C{$sxz8h{eyxM56Pm8Bw)4b7I87{Ch%v@ zvf`byFPIP*B(@=krSl2sxh{Br-*|coU5DaahgE^Med9sdnHu~KE8F&L6{_J4ihpb` zx6Lqa!|7{54D$}KfdP$K6j`1IM>ZV4#)lZMa(Jle50YppO=8ze0c{&z^3_wU;f}Bo zblaSe=Vce{rsfHgv6qfII2JpcECfnTDH^`g!-nGf%WZj@+691rQ<3^W00-dzWFrHz z(Z0o6Z&TLJ2~G0KF)aXEOlSFOB$*66&2OS+`c80P4t zGc6yUI>Gtmbc2jRSTgDTu+hL*!~%KAJ)5y3Uw&SG))&bKw^q_QntZ&4H}R!0 zqK*xuN17aLGU3-^{cY}-RhgNv(ZYsPE;_BO#^AoHjf`RT!fsOw<@wBA&Yb|j zuw`$cbCyvUM5h+LV_||t8jKnw z4o?D$I-Os4jRt-ADw0fDpVzL=p>m&H%Y&#hxm)KQEtnJqRs?wqznhj+voDBAuHiW1 zyI1JWJgy&QaN3bhBLiut<*O}M9m3-FBIrAl8}yONrnf!iz~tskM8Uh!C;M|ey&k!M zUFh6`v~|)FiVZYG%)D|Eca(dd2lc0oB4@jXNvGynwe)^B+x`6LTkBE}o3Hj$sn)#p zab2yyRnRi9{bKRJ<&0qAd>c9rjmH4t*o~wP*VAOH*NUhZ0D>zhuLC#fum*;9&(2cE z*o4fee77cd8007Jg0@j(Eo5HN^6Lvrp9NBW-AnQ4_?WBcNaAai-G@Wvot(XzyDGWW ztwCbX5eNe*>ox*b_x@(UW0u!(R`2T-tl5AHVwA~sM zfE*4*SA4;&sYDVZ8VcB2ytrRP_Ksw?5)(bDb-Ul7gr^))6EN!B8s$ zH;Q9NfkH;1qYxhGwU_$g@fd*vLRvi@#|S-GHczjVzD%-nMTJmnX+mv@eq~NBz?%P1 zib`wOM*HQP_Xn8wrhYbwXR8;IV~(= zJ~dIVt%?)3(|U393*9SesM*6w;q;x+4jQ=bRqNkDqVO)9qm&>b?}ARO72$!dz-(oZ zZI>l$$Y{WfW;_lmWV{aU23y_0r9Bk^Ney&0K*$dfbTD5J1XW@k4Hsj${vS{?x=%Z@ zBc&}c2@04Ovx{G4WC#y-?P~-UfXm>323on=OxHRHlhLPH29^smEK8qMpjidd1nHQP z#E5V2?EH)Vf^EUrt7F@Q??xbIU_kX5c3U6xs=RThJS9(gk?72s7cO__%b=AIoX04P z6qo1%9f!AazOiqKvuaVqGw*W}WP~j_rgMogXf~I5bG=7L5MT;GrTU5!Fv+w^l_YcS zZ7$y zCo%?ZoL+vXQEIurcG(l|gyCndKCB%Zvvc6V+ z?3z<3pu*5$H%#9Ooausw8*(iROJ78{32g4E>M%r5{RE|T?GbM}E9Ecl!k}_TJh9<8NRm zy@lrIWLQ6*sdbPMfmP0q~%ltOO)!VW|S3@yb;yJNT))}$#sR$S(FdnR7Ix`TWD zEC|Rye0i=!IB55Jxst&^aYgk&4lb}!ZnJgAz|gCo>}B}yZ>9EDlxM@?>ybY0JXBxY zB-n33qo4i4Dy{OW17d90YO=F>3y7*|copz}t=K9`S(U)b^hY>W5R}V{hAJV&q0PbwbG0p#|abW7ZCr~?LEc({dEiuOLF+GM=zBnW& zeWmZoEP*NrV;b>xe4Kb>0bK@G<6EmV!uys&S5*FQiC^AC4sW_X^K%x7)uv0Dnlt^} zAb-5%?cKSdT`~w>r3Xi?3z)rcd!<@yOaVssP`H!k5ay4Ce!tCqqPxsZc@l4rhJosL zf!CmMngfsYwBHxhi|0PGG(!}d-N?0rrhf6*SkV3^D=X+IkNVOElLJANk0246phlrp zfUOSjhYin+<|rxV^=MgN4|2jk)>@K^!FvD@GpK|`j@)V82+GuN<_Q;M$eYisc!|FI z>#~9(G3o^JwKN1BGfAviii4;N2>qfxH%3XX6E+95m}bh)p&6LE%D;UjzR#bz{((QU zg%JLth4I0=sO>Naz@ht1S@n6UG(%{uwv~rTPi{&gwG$I2P-*aJ>4UAFckDo~`trB@ z-HYkFddQ#L^ezX0CIq-rhF+Gwmaj#TQ7{t)<0)BlXZkUvJXx?Q*f2=|pA)>XgK-i| zg!ZXlMQkX;b$cdR3wYPc1}bCJAZHKKfdAU}6Ml^k(F|IPlStZ&jzt60f(Td1Amio^ z7J@x!{+JNL)y9B*AoQIpNd&MI$-!F4J0Wif4LU8A++#OLlv|+jAm9ggT<9Ywj`&sv zO+xsc7L6O~dbX`CnuH*`!C@Yj>63f8C>0w=@ltrPQVGX8p;v+>o!C?pP3a0 zzACjyH2wH5l*98i=eBUpwDRmFNlB~hpM&;OmvDi}`)6I|Yf4JAUxGMbkBTg!YeyjL z7V*P`>D$xw-2-0(QkO(Lq^ma3|mR>m<7!8->>C6$6w_9uhgoFFxgm zlirV1L%}W#)rxmR!oSVP3xZsT7-kjqxCkCgzC>SI#-5B}U{YvILz=)+sY=+FFQoFf z`KZ^A5rs@rnV?&wxJ4f!Z=fSec6*XOZH?hjQ;CW}4H5&SeSiS?AGi@vif{Mom(^6Tv4-=gVvrw3n{c1t%BPR1wJ z7pu}ACRQ^xTQMj%rNzB>7#6xWoEePkDPX$S2#yBt8Pa)iG}msCFUu9HfOL`Km%+N@ zvL8ba&#wfNWn8d7yiO-X7Hcu8W9!l11frIuwWZ=mVC8F|BquY=s~O=pC?p?OCTt>Q zwzjTV7xf$>!+p4B^cPX2@h5tkJ+}7n-3K^6zZD9DW797(<|!VVL*f3Jc+wyI?9sh8 z%r}-G?C3>&IX|SU?NrV!;bd$H6iLNOJgou zj{w(bcOqfpH%<9)hj|z#bv+wi#FsPg0VCBtO1YUN8xW;pI;Tyo_H{e zci0TdicaIRfLE!OocYjz!D-oPGfAqkRZLf%sQLy#z(BzI0NQ{2 z-6EdZM^YXRiD7F54R!);CMMGr%BOdH(=-x$%H*Jc)VU&LOgb1|fco~K2B~bU?MRof z@Yjk%rV7LXW;#1pXd9XQu_$aUFk1Z9uS9;W7-(u5#R-T9;PF5I?~ z7TvyoZ!yYci8|K`-v!87iNaJzEg~_H9~&R&QJ&Kn@1)NyVn{`5mk^uvVavg~e_}MJ z{;B=>E>VM4+C5O95!yq8-->W5_tp7;SY!zIld%__wJb7g*i$EPmE=oP-qW5}Dkj$j`rW93JVf{)zX?*3@b@A?-X{6vkz z!HfF|g@F;JC6NK|!LHrUkr6t5S*{y32C%z5fuz3LFuItKd5?97tt{zq!8>$jJ*Bo_ zdzDY!1|czP_gzezrvOSAfdw%f7c!Rib4~ZLE2!UFcE*SC!W>whNh7c`3?RUpn(5f# zyRi^onVh6-j8NX|QcrN}jj9V&qh$dACU1=8#xQS@G63>lh6#WaG!d~;l>uBx$qLnx zoh<gQW~wz#m2lN6AF)~r69`;X@LMaX=Z{~%jVYW);N$4X_J_Em#>{{WlI zQpy!0H!*EgueJE6B!#O)0!vm))j4p4hJI&@Qz1u$!yb9Wp2{Qaz5a4S5~Hc{!J!Cm z*U0Dzn_$tSe7dBjAHQ{=nt6MZ?#y~SUjN`NW6{b5fV=;4z8ZE~54Jx8ksBbAYKw)8 zR3E`Ti2NqtaXUcCZSxf>KH^0vT&-djavDwWF6B5pfm=3b9BguN-7E%;$b5B2W*|$| z_2cG``#rnY$(~+^Vx6ziOX_WsV#*kJD#mct#-NQs)-S7Eob0;0ldx_5}mp+l*Z z96bYs4hAJ~p5~Zy-qhFLbD%ML` zyDG?4qPs#JmzxxOqrX;q)Uo98V)#`KKLlbq=`W^IcbrVyh-!ZQ9nm+r16v9byh5 z+%~IDlHHZq?WJ2k9G-y9r4W*I)xB5Q(UbR>mxc06X9AI&js6af=cUQgMJ_A)VF9?< zkj8_Zb09_+QU*Nx0oUtt=i2HQM201hd2}{yoGpPOn!L)JR5Hz!F6swj=+1%(fE_3G zR*+s6JLsB1VmiM&x}nzf=%yH&r^^#>s$SyjMMDrw)CzFwu3Bt^jKw6Knhax>$ znT5hnbBL3_K>u;o1_W7t847Bp9(JON<5+45fq#IT-xU$f-FcB|)Z-`=rUl9KO%L(7 zmLd4JY(DMvk6%`Q)AEcJ4iR%`GlEm>05I4}+HpVnjJ5xSnXSQ~{17=5IPWWZyWGI4 z(7D#DA<1%^Hi3MI}0V~RVzvA8lCfPiQe7m+EBg*4M4Rb7B&ugpl5O?6 zaO67-WmlB#w?T|Ir^ufr76wyV1T)8=xhCXCX~$TQcVp&YFn+8?-bK`}v-$hk?Bc=i zN+4|}aQ0n-qA6PvWAI%2T(XO$uKMKVUuMIr7PqJ@+HKj${iF0JL;vWHNt1H7;l0XO z{LLJ))8G-HCD&pW37CSi`{=*U^fzZ|22LmfqdAiY$FrgP#nJ6jxqQA$EKrFPRwG~O z_!``0A|^jvfI`7O;bE(lV1e;KcxVdD6_RlD9ZAt#!6@RY-A}Tfa%ycBL3FH=Ij{BE z8L@E5CLCS4Y&~DOJvkPRIGF{a%3VJWs6f2$F^L_BLy%IpJ8JXRdNsNL%=36+`OpO< zAznfxM^~Q|rO9TV-eU1(aOVq=8dtt=iB#f?(~1p&0E&+LD4@V|52Y?D6c74*J@-So z8Hhx#5+|MHl@WXejDWpyI@(Z0RGhsEV${WaByr5ru26Io$qHXuHB0ST-()!U*oD|Z zao@cnZoR~C=YLfmfn31}+<00Q9Sk9f>~iK@Zpj&#C4uN&FvW=$zqTTRSD8XjfE(f+ zcjM7AdOxU1;rW~L@GEi|R5f~0qMLZLQnU9x?OnTEr!~3yhPYw~yrAYyqrvBWdiZrB zUyF&wys}-xXfm)PbfccUBsX1`(lVaF#DpLqpu`pG#;o+Vf*@cXM3ccqH;&zNF9|N` zt_vHwrJpL~?GV$W>)QQRatClk79D59Q9?pDxs!}kJ2r2^94?JBt8C)wD_Erw^f?mY zEiRF-n5RlosW1yWmp~IzH6+x8IspSo66`u29_3M6rq=uZnm_J7W(OF#mI%lAV!XO$ z#S+RV>sv<_yaR*OkmyEftz#+oq&N!yFxP8Y+Ax$&0&uL|K&=<^$Qv*1ntdYoxHJ!~ z73P%h`3g>S_g=|JP;ZyE48|~IxzaaLQhtoU?>NXG)j_y&&*fFF3^tmm6REI^v_t9* zBq(SrA!S(_qr1Yyc^?)*9~Q;&De1e5=62%*fX-4p<)AT|pHMH)P&nSw?|BIQxFQwU zE_E~Z--|~I+3POK^p;W3kG4LVxmwib`R%jSO#zJd=qw+`2c{T_i2C|&IFi-@()PhY z)lAw(FgFQHx0&!sUVsd`C1ewISlAm2$0Z(Y!Ed2|()g*tUJ}B>F#-kow3xbz`E8N> zm!9dVx!&5Ej8TLr!{=Dm#wC176|;oCowA2_l~T~pq6zG#p#Ck3rD|tQunobnT`cGu z*EI3%!UpwHeBI_W3iM@2OZFGumXueBAOFPCcf-tPg2hf_As=-z4FYhR$P2M=KdXe* z0qvCM9ag+}CUfJk(w_U21*tS17|5&KWU>Q;$4C56lCDGs_}Fj&;sFEz2o@c(hSWy> zmXiz_rt@u1yKGtPcvgm$kn}|1k?2Q?p40i{{?c9oW%l0N>6>UOOC8LwxzSqv z=5)&dQXlzWq4)!j|4g6LXw?**36`dF>0*lPH&}g%V}IE$KS7M~0iIjPTXzANSU47F zn$HWw{9X*o6ad`*+vKLO*)cOez_`Y0J&nSi{bEy^xS3G7Zf);?_-GUW|2^y->)4zg zeOC-nf6MGd{5-p_4uQ8EgL-;DfV}_Q0BoEaQui_3d>o@K8@ z>2xf1Tel|W-9%&pxbpP3WT6p{iDw-kxLef5^Cq_OQCtbzlh_xBKv;$1fk@2`^LIpb zQ`ndH`=2AbK&x^Pz#(GvjT$~SE2j=gfJeln&IWgYGCtrQ&q&f*v~qY+TNIo5EKtuS z7+Hfc#!fgw_|d#yfD&!65h(vvA+9=0T@j;G4oQ8VGdSyRbTu(v_Y>iLv|!@TH8_;Z z=fFlPAnS07`!r!BW^c~X)gpv#%~YA>qrcS=aaGFf)!~m<0c8`Rc-y0CkXI3gU%Jnk zmuW^+wy>+9l&-ajS0lP$4t)0NVAHn= zJ8F+;PXIXuRZBl@pg$u!lfCIKo=i-gwL6WK5b?Pp_-DOoO=wb0E~esBJ?NH20JwA_>V7=t7-t;^GE5CC?-+*TSDD< zp&?;k9JZ>GE}CnG8@r~ z3%Y#eW1{+#8G!^c{X#|m&y}y?wYHxn`qKk4sRqArXc>frzS_VMQT@JsT8-6m0V%Fm z1whhWj+1F_N;oERo>|-1qai?`Wn8Ly$|^_jfoP#mXO5qe{s%QcM`s)g^9#Q=6EC(6!rah*~$r8NGT`~sm~2gfyEU7 z;yuL@?P2D$WZ6YhIn`YB&vtM{WqdyeN1C}UNl7f3=xLF2bB@(3tMd-=`Cn8!N;xVb z0#fh39|R_rqFS3AQJJFS-ASLI1T0UPI#!z8J#{sU3r~&VL^sSp7Tb5w(2B)WR&tm- zKa;mzWyJ&yLL@$a{MEKZo73j^0N8o)+jN!fHS$Kh_8a;aX2%(Q(|#ObdzZGJzC1@5XK_t^v-TbeIHketvq z-8ur*`M|}w$&`pK@3_e2Q@{}q@cponcZ+wqe2@hLfa#vE|Aafxhx0z`Gs5| z0HKZ<1LRIiB|i-_iAf}pUs!X;I*h-0z{RlWqEHTjpmYnAeK~VE4LN3j#2FHLrI9lK zF`-b&OVp+rl0Ezis&5)hUO2aoX0Q%;iT$YeNq1v-*Ysb*M@3-}1ZKhO9@$$~ca@^~ zJvELjb%B|b6`#XJQYjtc9Pj$!aYyWUc8PRASVJ-qER0|(uRXcuz}E@h_3E8dAjDKO zvf&_@LA6~}ILkx%W$vOqDZOK8$4{Cb`6lf^er}m&appgy1w3zda`ANfM$eJyS*i&r z<@Mi=i3P0%lp(?ND@%)pRScsYf*xSILu@M<5c_=p>@Gz{rUs=a5(Vf~WLHe#Ki>nI zg=?kg{bO5zs3UVl;j8z3!vu$|X8>~xxB-6lru5?ss$2J03rF}iY5E?{%1y_HzOy!# z@MZF-B@h!75`Y6ZU#r zi;pJqJ9+KFUk@de@?e1vn&!SDd5VGgX?K!J6*}eSQ-}Lh!VRGB_clk6yN=p<_EG0= z+_WFa+|(h3y(w9)eD0ajb4GDGEUD2EsddK}d#rFFaxVf@%XoS{u; za-`A;s~H0i2^uG?bSC7H;>!zZdB)B$a~FuPFOn6veWlTxX)mj~CMKo}ErGSU&bBO` z@#s$;qBp~$G@jYRS{)sY`n3O=Tr(Q|)7BT``CYU>F+Y}uEyLOe7mm1^`0dWebcF&} zt9$%swz7!j((5afC^XZahSm`kO75+#AX_K}scnI3c-v(qFj!Phj}9*!97DsrL|}!F z?w8}7&(_Dy5IdrnP^LFk1!FUmOYnM>k1HG2*XN=hNVd^QoRy#H%|u=btLv0|Ym0=n zPHqtK&7Hjt3A&;amO+=Y&TD=rpg*b1z2&ABRb+^Tz1PuXFQpzybkN0$--(+}D+bPQ z^A4whpRq((>T%r`I7WJ&;TB#mQ>===OT_}&;en9fcLKa3;n5J71%XySb z4q{8qAO;?W2jKOUW1q4-qCD(qwj?=~s^=oWGj$eev5b9!od3b@Mx!)fx|d(h)e4gC zq3F>FwZmnC1x1s6$T+S0SAc83AtC8&QI|=%#_+Eu`~eSBh`CYSEs!x^<63=bHFW4{ zz&W;q$>+Gy-u~Gwq4LkH1Isdt36~{ECnzstNmQ1f@mJEZkoF1;OMQExOf^ZN);7lO znthp$HhVSMzM|dxa~J@S;XAiEos_nkGV16Noj{!YAf{2&a~}Sw8IKt*+L`3MM^fQz z|7-sggU>nKr5vajD5=Qp>fZwu)D>k=R`p_&@(rJOuzi>fQRKPeQ@MYKo}%dfPFCn= zN7%dx2({%=ybT!qq8r~&?{+{T)PztNjD~fV@!SQ;I#LmqS1&%C8*y(-h_3~oUf2(r z(1GYFP~r8_ULK>H@D0_H8Jyr@@->w&w8yzA-BJ|dF*Qq?HDx=B)d#U!e^_>KX!#?@)yKzQcI?h z9>sys{`4O#YpUZsMfP|$tl%FWtJrE6*@p2rMo2GGaHmFQkF3}>{tlM3|H1-TCAH*^ zdsz~S10^Id1o{Bqs(^9Cn!|&?*XFx$tZ**$VeB>33kA?fuY<~)@mN$Xz~<&5$SAAo zI~E8MrQWhqlgh_?hVGH#9a|n|B&|}VozN~B1paian7cSfkF!8{U<+Fz;tQHJ-XjH<*ovSSILD23mAfs`yfl+1P4vd&<6Q58f;YgJAe3aFi{NbM zN|ye@s1TZyH9sQjrf{n0{WGk=#?R#6^j#Q;8h=7e-8@B*JQDECLdUQnFd}!KYxE{r zKU#*3lE5`Ri)p*e_f67Q^5l%Xbjl4cs979wA-;*AL100j1cGKvqj-~glS*vnqwnD+ zvVD{>_E%hsq4}Qov}%g;btm^xGwb0d7RLk5w@zTLi|mUo-=;EOIc&yt-DpU02fP^n zM8!7Ysx@`=Cl=~3_}#M8r)Mj9bHp;AO692EHlk12f%bqk8!tf5DgsQ_Rcc~Up3T07 zw&4=*&jpHjM02sZZZ1)q>heqLzyXrId$zF|be+0om+2O*ucb1=)CuEqG>%qU0B%md zHFB)yqNv3scrMl%T&b%5$M)T}f>ejxH2&8S1P3pq9IY8ieibe~$Ff}h-_GiMy9~7v zLW|Bi2qyPWY#;-vv|u1woFoF z%dF%YRHdWtwl~+zDs&dzRwxYqze?zgzFQL69B}c`TIoN6Oaql7ykm6O_NIAm`G0eqGj`w$9^gDaMAl)_>p7nwyj(PnN=4rMBeI}2# zIPR5&0kGh&wb@x4MjBwpnuxzO`N@fMdM=F`K(`Z#1SQBSZ8fbpTj?Vc^Awp$$yke# z-;j&p%fQ7fUSJ7LQCW55c-bjJAv7SnB>ggC?3db=1iYT{9Mcd>x`__0hTxs%)rkD z+5j*MH=^K(lL0Syan+#32Y$B%nUp5N0Lt#-2BhTUtAl2JnY3*RZ!#A9Vi1}qAaVRs ze@S7?aWcYXlL7oD8uFr4p&d6Eo|`r*`who^uLW-dZC|$BC=(x||CJe_gf@fncKx$i z+zw?Xb2nXGh;cdIT|*M!k_Acv!N5-C^T43u{y}Xna;cvce>Ad?%Ia^93#@iYB3QKY z)hwrBNGO5@b-hBO^WNRN(yc3Sn~vcOuWsv;|AOU@gxO4X}}EgM(Eb-bKMVVnvyY>F^#m*wXd>7pcj;^ zd625~7^U&InlHR#@tU_Yl|OL}wMl`;m<2_WLJ6(g5L4COMLh+HNBz$Ar+9$&1ydeRFnq5$4bZ%={EXRob$C8pQy@Jp*F z=7rzUE1Ur>9Tj9eBj@YFk5XhwtdKiS6gO}9c{D6{r4ka$16*9>ih1LuYOUQG2fGiy z{(=Jmj^EYoG`tgYv7kXxhE7^>jGkSy&;lX3KZZRK@K2fLwvZxmO7de5@UR@9>bgNA zvGOWF+&=2Wl?Yx}0qT+DfRLa4R|~F>R{_wNl$uS@cCj#MC=_^@;NYzPdNNNH4P4AQ z3-GKC-_GvCPl`!DRO7dhBAoRyCF1_?Gcs1UD6WzQ6wxIh?5&V7Xt;?iwV1nbZA<+I zX)cd+pofG0-X<`v*~U~59ASt>=61WW5K&`^VUbxECfxOHv1Qqs4d}c%@q>&ph35N) z*B^QI7E5>}GFeU@rW%v^KDrlw45s^nX+Y44{BEizO#T)4P!SizT2cMT+-)S)eNDWv z07*X#hYu7bZ#wh_Mq}Hx(n6BJ*haG5AdN4^H=$fKiI{Eg5^w?==*9sNKi>8?6&Ete zO@BFlT`>trzNxMvT&k$kdWarY&+}b~TUG3=YvvS(rcD46`Gz`RSYpMR7Yo(NuVPS- z%Q<3!-#zDKGGAVl05SOQV}cXRMY$qP+*}D#@(yiTrcF|{5sI!&W9DILQn9vsK;o!; z>P*Jsf_?~e^;snSx4S<1^aU_QZ{F-_B6d#`hmaJEvuYk-Wg?SsS1!9ZG>y&k21!TKg8tl zHzP*QzenahM)H4YT`jE z_>6NOi9$CFJVR2@W{40w?bJc9)bVrHwWF}}0KTU~#`UKSc+qf=_}Kp*%Z4GNEj*$h z%C}nPoAcRs6BfVGLtBhD!V2xu{CJNNeU~P;xHB#k6c$Q?Ovf6dj`H6Z{Qy?j1@%F-4V8dbF2h)R9cjigNC z?V403q@48D-R$=8P?J(0bIYNNRhCiXMZHunygj4kz~;om9}-7aXfr`a^znI~z-Rq06DDfiJR%qx(sEyxtdu?qaAv*=gj zU7x3buVb1J>b+5%L#&lYa?Zn~QYCuKlA5{aOspKcG!IJI_z68tJ40Ne;2X{ULv^+8 z%W71FJkXHdixk_=nGZVwyUX#ztFee~8HJCKs6V9OPFop|x>x+$@;@I%>W$~#`vZyresUxnAF94ndx+I?xyg9UERg8X7feDa~h zMm--}+oXOBE|jVbkg7BP=HFBFY2{2NjN2HL_VUT@zz>4<^bF|kW;0>vn8?}2Nr&h^ zBJbf|$RJ|NH#Z;XQu%80cr*{=pj6G8#I&N8LWU;P%jY)-R6$R3n}oHFXQ9(qIQR=qX|oAON< z!XvFpS;qVf9&!5><)ikOnI2=kZ`bfe+W`bLHQs5mp-LL)%HRMH9`~XWV|xqJ4<8t{OkWE$F7Kj1Njslg-0zds)HtP)d0nL4ve^ zd+;dveAZeORc$1GGd#&9cz;)oHxQ(#1!<|SXf)vIb}bfqf0wo@^j`?Lr1nUQjc?Q? zI$=F=m}h>3N>LStN?rsho1tpp2N)|VFP*ZQQW$Iv7x;E3Z|GSV5uG=c$e1B~$;Qm1 z&PSlPdBZMIsS}1Bn@~ zyRLbgqip&zRk4sjEpa4x&7D&9^eZ`NAPGM+Af;z37b>l*kojelaTu;oVFH&M&buFi zM(;FuDWjr2MGh_uX&z>hoj0m_9B}FT)XZJJ2M%40q8vyHn$=Wnt&9B;83LK$oKH^H zNt`2{mBt|+g9enymUOao;KqnhXq)nfaBMY}_f7e2nsoeVYpMZA(@-xH7~ZmK;S6AtYtayq6I@XMxS_x>4T%;%NE;a~U(SLus* z62p!?69p8%{`Rb#JW}Bc*-s*D8ciQpdsjahR<%7X-W32%aO&tH^!Ue#K4gQWMiZrM zaQdXj^`xD_q^IO9wfI%V)jUzbMao-D7%WsO$R@{ZnJyIRsebu0Nlr* zjR8OP?nsi;KSAn>R(E;MzHxq^bIUbU?EMf*U{n30yPd3=l(Iz|F_~ZzC1`#WuqK0{ zW3prHXSTusD1|$c-R7G~glR7WcfFNoWr49@hAt`>L#n6cmfG!7(%YE0UMD-eC}orp zw|_nnq$~fr|LL`Y!iO~{JcpuOsmz-4ZfRPqVeGI-NP3N(nnaz!u+8_#?pkgN18z5z zLR~RfyMa!N@`ZBv59IluL;8xoYhsxp1?<^Yj~`*gsuzyeE48U`p~;tYme z!yA+MQwc5Tq3sM;FXxdUrB1jXaKtc}Fs^o|Vbz9prt#u2Ld%2$dX6HAOU8*1MW1(_ zQYZResMZnYuZ$_4yEFs4Z2B!ue z)=9|(+>ruH`hkd4K!NXSM2kEj`)wVfu-X4*p>28fm{P%iTdHM*ZatoA_s&Zw0a3=vTf8|m zmt=(xlaCc4Kb~*Ml`QizU1$zJM33xMj=f)dG>iJp>$-j>F?2rOqJxmVHzMN%kt}nM zl$ER58vs^!*{qq7i?Ul~5!F)cDxgU|+MV-U=ZWPQ@F*TAsK)(;i~J}(Yp`Ym_0N*n z?EHL?$GTNZ^J1VJOncLzjM0!h553k{#LoSwh6hr3uIUoN>U#=Z6H(hI^gW)|?&kEO z<0M@hP5u#|?KDizGh$kE^;Q%KqR#f@^NdNaOC{|x*UB@+7y~i@zMWDBIgkqvg6E<7 z``4QDu>!l=H_C&nIDEXRDn^s)E;{O9^_v`JBvf9;XlQYvnVsReyuMi;3x}!Ze7=zd zP^dhq{Hz`qB6!GVd?Ek>=Koij{_jg&87vwCuR%>_k^>LGZb!W4u2>elPZ!%8As&!O zi_y}4Nh4xxW+O}hg19*U%Z(9kHdmJQoF;8Wm4gJ#Y3OSnS~cs1a2|0D8Zi;Hnc5nq z7n>>pQwZ8IN_auin}|a3Qc;U1@{SChHql;jF+Ft@=$66tJ`o{Fo8cI>o^wGxot=#$;0J34e!>tOUI9$)&&no*DX(p zu#$bnP=Sp{`?NcaMJ+J7(Mvpu2A2MZ&f|_Z!P)>fA%!VNJ8JgR!lu}K6~>EOo5G{Y z-b?lEjqpn!eR3j4tff31ESEDkE6R90wg3LXo2r5+HfM89BWhrL!A>vG{j^~c{;{fN zGE@Q304dQBoUoeO+P@1oI1)YL%3a^a5N(whVyQ4z|@;N4`v<_-aoh~%piFXCusZ1Rmq3?t8?*T$*PAYQQ`)fR-YR?J|W z7F@wui`t?rD9S-IZv#=!1D8Cy{B4ZiKGzMW75RgO8>%znI|Z;B%gfS#@s-%?Cyj#t z;9I+gO92j767BIaF<0dKaFUnG&u%txM30o3Lc>37g4`@MD2el#go;-HcB0DaidRgM zB&7}B+%+i)TnM1g*w7$yxReAIe{i%qhZ#{-lBLBQe||3|Y{yn;HCT1MKJ%ZJz;o=F zWPWCwU&j$0rqpC;sveyBN50nc+HmB3kW{=cUNJn1kl@KrGH|mRIWD2>FkvZnSRjHbuRJew;RRJ`+=#6 zN?8zgvA-0#c3zlqB<^Q5S`1jSr=NWGF!@6f4XOA*@*0-q-Ve=gyHR{6=t~7K#QHmr zr_aA;8^Z&6>izO+D@srWQ*$B-qd#YM1p0a1u`2O@$%8|9-%D!Irm8zm6D(SUp z6Ouih?YlS5=LPi49RbMqr*xQOd8-ZR3C5X27lC6)U7KtiAFl9a{}b~XNN5_%3n@Sp zZSZFZjrGi*GHy9l92p!5{aLHOvkZ-ZXn&Imn^=8U5v%5$YiizKPO>IMF>V*{z;uu^ z0w$mei7;f^4XqnvREm`d>8lZv0SK@a*Bq6Vmq5yP*u3=k2X*>RkqLMqk@`NU(0Hdx zmxa&XjrL8S0=lpvmxP{JRB>NEWpWFQmn}5P35=HG2>>z=H$dot9dAToCBA!IC6_4MJpmu%^-iFB6op<6tT-bh%60V2-w?HeCquHdq;R zxGJ~UeCP_zI0p#i1aQDML7J<~Ei3aqiOgiN01Vz;6vF$=oIH!*VS_?yYzeg% z5MVc{Z9H>*gMQbJI*X4Tj1v#9lM#3~d8fQd3e(Ftci|%-B;&r2B%N9cg%A$A ziiZ|;<=XS}J}Qz^M-!~c)r)k88~%591cVK!cY@2A#*ZEn9_F38H11?1+cm9qHAZ4- z;aPSX_R=W#-gS3Qe|AjOuV*YnEP#U60#z~(zbnZQoVLzIU4orbR9d^L1UV~f`#d{V zSbAM_ox;}$Rx&zQop4X&Qqo~~2fX#e40*bI0JwtFl5Tb4@Op#s^j#RzhG`LiH*6DJ zP$}1%lE726~=iuD-{S=pF*{=-3?Ca6N3* z|LU?jcebK1HUCclwkt{0h(;H{v65|uY%47@YQm^+os$~g7PRYo01>(=O!WGlXPKJU zuM_6$UgPfv?L!>FQ2gWX#4El@E<@C{mK^5hkpqFpFgXtuG(+F`f1TQJ0|?bi7cIzH zviS9}RE^F8GYQwIZxU>Imc5B0w83$fp!Kqob#zp7v%y zziZJH`)n=<5kpAJ2}5yw1a9ZJiP2;QUL_tI%A+vjCQ_nf?nqt;bx<@|&;y6a!i_&l zlD`mAw0^tC*ASlQtLv|z)gx(>i0g%%gyT^lNI@IAkKPgoYkz;a<`Hb8*o-5W$w@B7 zt+-MjBbv?@J0c`TqCzzoWQg8=uXB#Smq`9|?*j1w_ByKn&!|648KH ztExUc9d*_H(Bj))NcS*6pzKO;lmu7^9!-j)SY8WLxRm8^TlT}0xuwJy2f}2cg7@{+V;g8WcPT6YlTVbgH?NME;QNuIWxp zA2q`qD%sK-3?ADzcOTNG!|da>fEIWLVH1`rF+rn^l7a4qtIX@FKIN(|`z4nd4 zAstQr6DLy&6N1OZ$h5z;?V7!Bz#dIr+F_bZB_2==2-~hv7zy#I?eVrR-Rcopn340? zkDXjcfnZFvU&!o_)5WR+2?e91UVVL4U#jG8^l*al_=N=z z{@f-r=Faa!qt`a4`DPYecoL6kL6!vV?WlUG=xw{0^`U01R06&O;HBWg~bN67WDM5)4@O z&O;HBWg~bN7c14+1m3kil18>*D*WZCLGCi!jJGI04M_aL6|As!)>V#`BuP+zPS}Sh z7QV}$k~bc6;&1T-UKp#mrO{H>Syd?lLNcst6=1Nm$tJcKe)*c(nr?e<-8u2b_40edC^WYJK_+4Y;;ccw%Vkr6|JPsR&svu8 zUH|?yx1@J!%_Py1F~(OE7H$MSIqU58r+K*nlgAW5v7nyTsdUgIKAn1EU^c6v%b5ZS zNKVORQrDQ1<)7sa{0dU<3t<4mdI>?K0~^6Wgv*z*;_0ulH|;d{;^pqfaI~ps5V*xyD_FmOs$ei@`j9Kq(8 z++;5*hDk5r%d5(eXAwcfeC^Y$^D%*Eg+J7q0KkCFj63Jo-GE)JkV*=&g>HCTD--5E zJ`sY`)$=O8k5afk{)M{zJp-tW=k`!Vak_Q!O7iRkjTc1X8=Vq=WJOB)GXjW^IfBQ3lGKEui^*Y>#(QRVnL=2ubPefGpjo*vN%9^+?dn&lhO=O z@e14NhRP+%OOv7S4y3~R7F&hu)L4(v8%v`>Dk^J+bi*9I6Gz(lHQRpMHGE_l{9M6+ zz4D?S%B-hpo8-`FvVB!iEL821w=GFZ*e3-OS+3OQdXGNM=yE97`sM_U+f8Be8>1tD zYA}=|;~tKb`JDMF=(+!SD}JfSmJPGb0H7Jv>pHwgY%ZrNAqYW{#lfT?G8T2{iy= zljCG;XG%U%NDt-4F*O+B%n$oH^?o4`td)u=9W_ogpOcDf(ov{&6|Uc1 zo%x%#V+{QsSA{XB9G!yZ3mg?~fguqMsVdim{0w&r`B!D507lYzV-I+7(4(GyHTf zs`b8ga)Ta;h9}|q0il3Mz1pL-oXX9lpl)`%GkDQYSM(meq>R@{=H-7KlfNILn5F*${MZJBQ?6EgN z8m?a$@Zr|&01rL3Zgdb^r+vlmostqO0cS4BslT1{IX2fN!#>O3q*)vEi7 zO)9!C2?e0MIq@z0H%Wu{SFv%eBv z`*Z**tHyOr6cc0W-(2T0dTRQTRv7QF#Y@puncmfEqrz5-rGH{?$wudN!;CnU1F87( z>yvGzD?WVa0xAX*^=Kfc-WDKi)A3s+3+q4+xufMbBJN?XZWkhMccc}>AZOvKVu5^j zU~6m5xj6kUqd)173j^om`y5_$jdsfLw!T!ZV_+D>4&v~9$8W2i*u0cFX`lG7JAA4m zFUvkdOjCP@V_2yMO>e=9T4YR%-%{M#C0beZlU=87;Q^PA7?u4Qz#QVGsLhef2j382 z01plAf%HDNbCTpMKExR~g5bV`5%#&w*N8r$j){A=_xGXK>9bZk!gWjcOA>y+zs>7) z)ZSeLKmA85FKROe+mGnY$m6`p+X}liFMRq}S8=~)5LRgjVf8Ja;u8j_?J}kI8;A** zlXv~cjVf9Ara4@&J7yLCTUn5KXGgL;u0uw8GznOzRtIbNmn3=tKapg*YsaX`Ce7(W ztV5rw?iKI(sM?Y zZfVQc{V(9BRcfffgN~|rkB8Y3Jh9YwIl(o7urb>G4N&!9#B_b9`y7;%V0C?yoa;FXDKig zH^Dbx;bU#PWGE*N`_DP}-qhGt{S@!jwR_7}rAYp)Tk9$?HXV6LjK0g?n;O0k)6Y+K z7S}hY{<>r7FJL1~sW}g~utxvIz@Rxe@<_}PV>r|kL$mEEVmo~oSWin@Z?HkeVj5S& zRsGWZccD;XOURPh95++eD@846folFW!edAxxO(9H|53xcB_3lTeOA1p2BcXErlBT) z99Yxm0@G+5ER@#JjH3u42E+uR?SWARg^Q1t{PdRTm;Ieh5>jy*WvWv@`^UKceni*D z*LnPISWEW0o2x_(Kn6c}p|eq?oVy%uPiA**I7QH}3751G@DxiiOg3*I`V!r6aC z&@oIDFh{x(kV&PP?s*`N{J_LyL2i!)g7X(mGV%3rF0kKc+v1K}S3b@PGG7!mSp9wi zdh26whsc9NfpdpU7px#H3FM~vtqn7faJ3j$BlI4@HV`Y!;BnEbZC%pS(PpcdAu!bjyv6){=&Ks;DB!nB0LdS+Dg z$ie#BKq#_rnL!O3+8EG-lw?h}&9Ql|UtjPsS#~hIq-qaXIZ>`yyDNTbpB(O=GsrTP z&%7pl4fLMkAS?;RjgT|)vm4l}_5A>XU(Djh=R>mEe!?v^78Nh0Wvt^_W_?A6ce4O` z8Ya@?q}0RTQP{`jQ-`j*G{!xxG(l5_XI_LzN`~Kp?f5&`%;YvI2xivf6;6v)5XE8_ z@Qx@!joMNlRRZzcmA`KFRPW7r1ep^ZbdZT~>2KDQ&f6Smi8<0QdN%=Qvxs|8R$SL( zYsH?WljAk_8AoXLgS56e$6RkRM!1Du+P=)akln6t5diB;`cz%qpND`YUk&`OUg<9x z)~^cwJQkxF!c#ZpxZ+@tsYg1ieP~u_ixsmYd7x%B`KNCUY&A^dpxNbfM}hTLd*|s1 zOH%$+HK2=!nj^ykIA}4Dd$kAf1EqdvMF0C`BKr317fw(5ndm#mm3ayFn$blu4&ke8 zJd=rgpCrVh#MeuolIWu{Mj*`C80o)+XjV9&jY;^FVY2Zu9 zbV|l-&wBvE1&!c=PqN38gjAW~u)yyFeW2N-VX-AZOaum`@XEDF1k1bkss`nS$ zGO?=W)Lzq5el6)j#??9FZqMty>$(JM&dMutXa?jzZcRzzec6dEr82>zZ=y%vvIZkc z&|KGr`E6On5lF3&YBLFo^Wo!8Q9RXy7$|4LrH7-*r5kt8PJYA?r8#=Uqwsvhax9MR zn~=n63J6Dv4Sk(5lZn&Z4TGB-k74mrKeVC6)`Va$d(3OaE#HH>%}G^3>q_Sn-&x`Q zAGC}(`Uu;1iZSli3ct|3%9+|`mV1TYJ6<0@A(**d&io7fz*I}u_aK$=sV&-BY1Z)@%m z$_1o?mOjQyz*^QdH4*IhZ)CW}R>X|*?>Ncz!N;O3b*Dhwv*(ytf;}+kdFdYa>=&{p zMq1mBN%*qs-|bMQw$VyVArl2>0h+esAxYF2lMA;GZUAHt}WI$0G_La-y7rYpyp*F zo9dPGM|%Y;Blvkvx<9;-KczsZNKlVSP5lu#5S2Q{+D??qwFohCZgd_opZ9_#smFhOY|kCn1p#<&ro#Rg+!*h%ena=cR){y|ID`{RSy<- z*nm4QZ%k6s#s;euxSDFqoe=%cSMN>|4s1lysOQ$W=X%XOq}zJMVyxoFHEktw=eW#1 zWk@^E103PA6>KZqfss5WnasRr{$g-?z!vztyXR?wymA)y)8$K1cOz49tiz_xt!?u? z5mR~JAoT@c?)iOLH#@i;ML{^XHvs5lKh=TzM_Vh0*8JIA6i=zqqIp=MY_i~G!^~Kf z<)v?=w3K8Yp0|$10hE!8g=8_DV(MZjsthgBcSH;!&GjMC{l9cchOmh=(Bf6v*JyWI zF>vMa7}L@drbK$ruen~L+KZVpEH=jK;df&|{4X8ycjOh4s{A9_~3 z(ECJ>6#`=66gJIrB*a8WKQ@3^2s8f24Qf_#6Zz6`;G(MNPldDh2k5i59*geRe~_;C zAvxa@`;>~^hdp1Li(L$$*}W#C)9#{gLec5oiq09>kykyPTB=ZX02hEAMP9o68 zYL^A%wOF}Q!iM3e^U5zMFR-Hx`Lu8`M>SC&YU1breNwT4OrEBPo;-eKH_sE9Es_y~ zl+bjDmj23YK;D7mLEtf^Js^infV3A@u!t;b^SO+!qoxsb0G1p=_O0`gV4hY^#PyZu zYAyJ74|y=;;54fw+`_&vKY)}`8%d7ui^!tFnRQH7iDM&X=f%UM_#RBj_6}>#Mp)8X zkejipbhlW)z8O8~Ado{R_>}0g=h{xUP#E+X0a`2zo0vwCnf0650}|6qW~`%aH4Xtf zd7;#%@qEZ^&G4 zYT~Q^$q;~- z6ciYMC@5pG3(*5=Xqg6M#DrR;wovklDSFTFJh>1u2fx0X#QO{NaqeESds&xrK#1m98=j zqImQte}}6v`==jhiEwat_`~u+2;U*Q+w{x|(*}BEQU}(U$-{uW_{=VMo}B0{n$5c# zi344RXRDl&*vC}QIu!zWZM*1DLysTGByyroky9FNDi;<5d=48gyl|Gjm8gvcqa6#) z3mEa}yLc(XuvtS!T>qbYbn&1o#pb+xeXzzhXNH338J4XBd}etA=g+t`(K?e>@uOnY zDZwtbHes^n^wr@XO>Cg}@evZh&=h1Gfbg7O>NbCBQEUr_8cT*=HT|F!@+dXu;*F{) zrCBP28rE9er>Mf9#Zsm2W-4M)X8t+4jHB&}QW3KJe%kw;h52X##wMJuktl0wkW&*U z^Um?21$#0UXv68i7}OvXO!jBKXbc2cqN$nOJkXtSYlR(Hz$G_t09&;=^(IG((}&rX z$^EM!W}qtr*wWak)d1YH*0(XLLkEP+1+>zX>@;+R(=dL)eWPQ*O5fytha^lt0mbj7 zP!vpBtuP(=n>=1DJj!BAn`?uM417%j8p@2tG^;P;k{A^0o26ATV383pc+-2c#MbZN zu%66DGyrLTDK>{?U1K7NZG2r1jde{j8$*r^RDd3j0erX~`b^e;1ul}4SV0cQJczSh zM{AnZg=9?iu6$|weBC^B+C)T9Y3fIL*m>WGtl?h~lf7dPX8av# zR01o-74VF%+eJRQpCmmp$9K#RWJWKRl;=YW>yqo%ePe5)_V7!{kW%NPK_O|b#E01@ z`!X&61s#l*dkqpMufvS-7K=wo1!XIfOb=OLTP7|f?9GJQN|LM{9_s}0jp>+j@jLq* zTFlNop^e8KS`QzZXsrt9Q+a5J4ieEn6UN?gO}|PK$6FN{YB%**wR~?TpMT73;R@rG6rxqqZfH_fDE)Al^Bp@c8TNuSLcmt`NwwLg40$>$>i{w zY=<(9uaV42UDw=F^pChl{T_EZKav(4oC?y^VPR%+)pok4MT_ZkkB9SX4+;Tc8!GIl zw8rp6noOCB!g2bqzc~Y7k3>i0^*?|vWHRQ`_YT56pG5d-$@?%c5+%)}p6-;icpaRV zOI6*7c8bi==rx2i!yvpl68^rQFDpaO+iGdp1ghyLWp0SU0)-ZW6^EwMl*YmOuu~OT z64~x@v{!hMh?qt&3z{Em_pbKa9%%83`A-6WNM0|%^rS3CyWPID##<$gY6BzbDVA&B z8_Nrp{Z?Zm9mKoC8=y};P(#~ice`X#RuUt6+xXFCA7S^H>{PICK$wu=M1)8t@n-3K z)X2ZcC$?Jln^AKIbDC=bH|r1)XZ4zt<!7LT2^dL3V(V7KUUSe z3&x^5E#khHGs;$E2lg7t6-i(99{^Deem-UW4prqj@dCokxF)$r=I9XRi5&FNGw|M+ zW=^xRE6ebRxT{*Dvn2P+W$Lu5sP!%{Pct~DMbdaLj-64AeM6B!F{aq8@+HJrBm>Kx zV?%di9d#-5QCus+im6h+uQx_X-dfq!v~LFGIo;c&7>|a6)2{{Ogp?2U&%W z#qXEx>Ak{~oXY`Xe^F2f@4$G`@956E%>ZhwVmaKI$zZrChB&`qgkXR`6mPpzI!%H!Pr@OKZmy2>xCW4N9-G)5^zL>)IJ1N8eEWaO^^tF^7p zs`OLZJmgwx3i+=ipo8u7OvwG_BgDH0nx0vsNiUC%nANthg&cch_7P_Q z*z~t0y_L0Oh)z*^_2U8&xtpGDfF(&$hChQhOG*cd==ss14<*CEtn?nxHJ$06p2R}i zv-x#OP@(c>6l`>j=o#s+w_5sH?DShBW^Jn>4#Z|yeuV%QUI||pSiD6g^9Qv`GgIQo zw0AP50s`QD1`lpvV^aha49XJ`x4)yXJowA1pw{;38JvuwjGf7?Y((-2ca+dXL&nVu z+h|v~JVp7*B0Y%IPP7SEMHk;8kDEaj?E?Ul{cG06e)*xldm(7&Y8W_0cyVf`-p&CA zH1*cnEb5Msi^*34@Kx08;Sl;x$mfKES@F>v2WrTjQf zELDd;w5{zFu+^*UoQowxAB(&yTwyz#3UoNGe^9FbI;^U(p{Eh+g|E~-9!gIRE%S!m zznXrxT1*SD(P}GJ-9^C8N-j=YGqo4!%k1zB0drmKOE%@R7u@r~h{cR?wqTe?j~U$j zBylN|lD%--U;f`Svk8P3!jdvh)8dIpZy?`rmrn~6~Do%+k! ze841tK)+q1loEwIFqX(iLCjva7BD;#@O3z2>`9Io#``6x3I&oFH@p}+P}c|Fb_vGw#O*%hiqi3D3)kHKYj|tt8kd1l{Np+qb|IY|+CD(^-u<1tvbxHa-Ie?6nmJ#v0Et@ojGD z$(vo=QU~y-F17H=`+`A7TJ!8np_6iR!!*~u`RP1g*8FewMXCH1-av3q7U|>8VEq2h zg=lK>)(ojo3WN96`sS|AL_4EHZj5#LUq=Bh@Rz*~B3>g^XB}MHzh-fUc1G4Nywi>e z_y=P`NpYN@_w4@Jd8d8Ymec}}vzUz*XV>>L{=t6`fhZAeP8Bx@HFc3N)!uUf9aDd3 zm$*JyE0y)y_|*0d{H|n5X-eXenkbP{@xhHS>m^Ka-a$ht^}KB1^~E;eVH#0#mD_wEtu;a!Ch^ zszw+uB>B&Th(dDtG!%#$kElq0{w-&X*OY`iFHxR0Vo%QrJ`ez>E`vK_{8CWf*MeUp zC?6Fi17XwXeR1UB&v0`4qXlF+RQT7g7ciB(L44+_x zOT_OU9zY}SEj>4+j*N1+I$qH$F$p^(II82r*ZdIXA+D>DDK-F8-jpThZF^~_{1d#5 z?vFq?28&SCAN5J$k}kSrx?%e#38*lEIyBuZ;H4#O(qGH4g9C}115*()&bvYi(}Kp@ zGG2iWxCipI2qf z{_Hm;y<~*w^1}%7wzOVdO#4ZgG6wt#03Cfm*$4TrZOA1@n zc{mcq>GrTcS=!K`*R2L9GuC`~)&idtFv2F4gcdv=I#d7EOm6UQMi9YwdHK#U;|I%p zF%o;mvO(m`De^9uU^gZK3i50skQiXkYQ?etoNG}00x1kGi+}(VQQ`O;Aqz6Nm1QF@SB?|FC4t*Zw5> z_@_1fA6Iy>B~cbbo+=KXo&w1nMB5hu42^~MDmoIZe}Qh0=Z&puR+uB{+7S(X{93D! z8Q^6mO(&SZA9}qH9^~ee-v%Z|Q1-_x)-_nc0Y7dL${w$o5;Qg%$gCP79 zn3Cpw$b#@4&L zhUcAV@$}h0LLYT4$=8o6P7>ri6xQkJKXqZKM@a_qW{5G*MeMYSn=Ep)1Qud_W(#d~ zqIZ(|msxnZ(nYP8Ogk3s{(;(|Yb|=SAePk8T>hE7Dac%}o4j{Om6}V3p@wE&QqLj* zkFDuHVyRvf%YG1kLK-sOzP?Y+k0DfYi8~^+MOkD(9oG;hbLm~5L3cT?bXWDfC^#=X z1e^;1peIw zDr4(reDx_405U6BAyJ@4;87~_03ej1ii3`gU z=e%YwVAT9L(JzIocyghIl}YL{e-SE#UmZjQ07dk5Ssnx$7q1I`YL>;iqngk6@#>#% z-~J}?7sZwVyVl#(EtI1z^0ddaaKy(_l#S}-=cT#)mG%vtC~mCc9tq-H_KJ{vwgqR| zjSDWP{!J<1BPh#7 zjcf>QY=l>&8kp2K51o4R3!?@J`|Sm@n4#DQ{H3ND;Y6dujk>A;u3LFmNDdU<$#beI zPM^%Rf(TPOIi8WwM7!F9Ek8(UiOFU#BYe7;eNZP3x60E z!EQWA`{|D8J)S!DY9<#p@_O%e&;8UKXwCMeUP`0GEq7_MU~{_#nhfNQKX*48)2nu+ zMHDdhj1wG{`-+Dt6baNp1_(BnBpuR9LqePEn7oQdolxkyC(YMr*iR79-qS2C=`BM! z{DIKg@ACj5{=CxwHC*?YNY`<8ycZg-Nt#!9L%H~{{!C^o>E{)YddNQ=rJsrg{A#3cDtE|A8lb6d2&%A5TtuIRj+)EKo`diGKcX z>hVdfb3is8TPQCVCvmmev^!41SZGq23STGgaV=Slmd}GN6Y{)w+J@n{EVdU` z3DI~?w}^*lL-wI!5oe6Ap$%7Zia78o+&?%!_X+GNiJ5^Sokq4f8+h5vdBr~96sbdDWl1(w24w-~`lOgdbb|Ey*WJKIXRncaeb0Us zGib`!x408`l`%WOw)?r1fk?u+=Bkz>bs-ALz&hG8HpK*~ZL_ID9kJoQM0T;wcivez zn+xp_%SH7CbN3xZ)r-=GLG2i?t&>c_ApbmPWxc#kch;RU2myZR?u=(&Rh`1xrk56+ dI6Y(DZg6JjZqD_93|RKgLlKf?BX|}P@IbO?Mf3mw literal 0 HcmV?d00001 diff --git a/static/images/docs/oauth-server/oauth2-server-apps-empty.avif b/static/images/docs/oauth-server/oauth2-server-apps-empty.avif new file mode 100644 index 0000000000000000000000000000000000000000..9b21288189d3e206f8c491872dd1ec827a723a29 GIT binary patch literal 24515 zcmXu|V~{Ys(lv~ZZQHhO+qUg%Y}>YN+qP}n_I&q#&UrhPUZ_=-{+Uz&003~zoIM;2 zT`kQ3{wrHcGsgdMTT8?L=~Y`(XT$&b{}rKyiH+0$j{*QVSQise5C)BlA406_oSKnwph1P4oZ%l|pR5D*am0h*!(JVJYQpk%4{` ^V6Hoa*43zN!>j+L5< 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 OXT-L`n?o#yBZ!S}3}IOS literal 0 HcmV?d00001 diff --git a/static/images/docs/oauth-server/oauth2-server-apps-list.avif b/static/images/docs/oauth-server/oauth2-server-apps-list.avif new file mode 100644 index 0000000000000000000000000000000000000000..9980ef09d76f91246e4452df602bb997a78db418 GIT binary patch literal 25399 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 SX&16p0Uu~MEg6}EKT1HI4*Dzr literal 0 HcmV?d00001 diff --git a/static/images/docs/oauth-server/oauth2-server-create-app.avif b/static/images/docs/oauth-server/oauth2-server-create-app.avif new file mode 100644 index 0000000000000000000000000000000000000000..76a620c6698d7f75127ed421989532184037faa0 GIT binary patch literal 22852 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