PageSourceSearch

https://relay.dev/assets/js/0e0e9316.1ecb871f.js

js relay.dev collected 2026-10-02 03:13:01 UTC 23,649 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunk=self.webpackChunk||[]).push([["17695"],{76777(e,n,t){t.r(n),t.d(n,{metadata:()=>a,default:()=>d,frontMatter:()=>o,contentTitle:()=>l,toc:()=>p,assets:()=>c});var a=JSON.parse('{"id":"getting-started/step-by-step-guide","title":"Server Setup Example","description":"Step-by-step guide for setting up Relay","source":"@site/versioned_docs/version-v18.0.0/getting-started/step-by-step-guide.md","sourceDirName":"getting-started","slug":"/getting-started/step-by-step-guide/","permalink":"/docs/v18.0.0/getting-started/step-by-step-guide/","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/relay/tree/main/website/versioned_docs/version-v18.0.0/getting-started/step-by-step-guide.md","tags":[],"version":"v18.0.0","frontMatter":{"id":"step-by-step-guide","title":"Server Setup Example","slug":"/getting-started/step-by-step-guide/","description":"Step-by-step guide for setting up Relay","keywords":["setup"]}}'),r=t(74848),s=t(28453),i=t(86898);t(17352);let o={id:"step-by-step-guide",title:"Server Setup Example",slug:"/getting-started/step-by-step-guide/",description:"Step-by-step guide for setting up Relay",keywords:["setup"]},l,c={},p=[{value:"Step 1: Create React App",id:"step-1-create-react-app",level:2},{value:"Step 2: Fetch GraphQL (without Relay)",id:"step-2-fetch-graphql-without-relay",level:2},{value:"2.1: GitHub GraphQL Authentication",id:"21-github-graphql-authentication",level:3},{value:"2.2: A fetchGraphQL Helper",id:"22-a-fetchgraphql-helper",level:3},{value:"2.3: Fetching GraphQL From React",id:"23-fetching-graphql-from-react",level:3},{value:"Step 3: When To Use Relay",id:"step-3-when-to-use-relay",level:2},{value:"Step 4: Adding Relay To Our Project",id:"step-4-adding-relay-to-our-project",level:2},{value:"4.1 Configure Relay Compiler",id:"41-configure-relay-compiler",level:3},{value:"4.2 Configure Relay Runtime",id:"42-configure-relay-runtime",level:3},{value:"Step 5: Fetching a Query With Relay",id:"step-5-fetching-a-query-with-relay",level:2},{value:"Step 6: Explore!",id:"step-6-explore",level:2}];function h(e){let n={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["Relay is a framework for managing and declaratively fetching GraphQL data. It allows developers to declare ",(0,r.jsx)(n.em,{children:"what"})," data each component needs via GraphQL, and then aggregate these dependencies and efficiently fetch the data in fewer round trips. In this guide we'll introduce the key concepts for using Relay in a React app one at a time."]}),"\n",(0,r.jsx)(n.h2,{id:"step-1-create-react-app",children:"Step 1: Create React App"}),"\n",(0,r.jsxs)(n.p,{children:["For this example we'll start with a standard install of ",(0,r.jsx)(n.a,{href:"https://create-react-app.dev",children:"Create React App"}),". Create React App makes it easy to get a fully configured React app up and running and also supports configuring Relay. To get started, create a new app with:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"# NPM\nnpx create-react-app your-app-name\n\n# Yarn\nyarn create react-app your-app-name\n"})}),"\n",(0,r.jsx)(n.p,{children:"At this point we should be able to change to the app's directory and run it:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"# NPM\ncd your-app-name\nnpm start\n\n# Yarn\ncd your-app-name\nyarn start\n"})}),"\n",(0,r.jsxs)(n.p,{children:["For troubleshooting and more setup options, see the ",(0,r.jsx)(n.a,{href:"https://create-react-app.dev/docs/getting-started",children:"Create React App documentation"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"step-2-fetch-graphql-without-relay",children:"Step 2: Fetch GraphQL (without Relay)"}),"\n",(0,r.jsxs)(n.p,{children:["If you're exploring using GraphQL with Relay, we highly recommend starting with a basic approach and using as few libraries as possible. GraphQL servers can generally be accessed using plain-old HTTP requests, so we can use the ",(0,r.jsxs)(n.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API",children:[(0,r.jsx)(n.code,{children:"fetch"})," API"]})," to request some data from our server. For this guide we'll use GitHub's GraphQL API as the server, but if you already have a GraphQL server feel free to use that instead."]}),"\n",(0,r.jsx)(n.h3,{id:"21-github-graphql-authentication",children:"2.1: GitHub GraphQL Authentication"}),"\n",(0,r.jsx)(n.p,{children:"To start we'll need an authentication token for the GitHub API (if you're using your own GraphQL endpoint, you can skip this 
1step):"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Open ",(0,r.jsx)(n.a,{href:"https://github.com/settings/tokens",children:"github.com/settings/tokens"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["Ensure that at least the ",(0,r.jsx)(n.code,{children:"repo"})," scope is selected."]}),"\n",(0,r.jsx)(n.li,{children:"Generate a token"}),"\n",(0,r.jsxs)(n.li,{children:["Create a file ",(0,r.jsx)(n.code,{children:"./your-app-name/.env.local"})," and add the following contents, replacing ",(0,r.jsx)(n.code,{children:"<TOKEN>"})," with your authentication token:"]}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"# your-app-name/.env.local\nREACT_APP_GITHUB_AUTH_TOKEN=<TOKEN>\n"})}),"\n",(0,r.jsx)(n.h3,{id:"22-a-fetchgraphql-helper",children:"2.2: A fetchGraphQL Helper"}),"\n",(0,r.jsx)(n.p,{children:"Next let's update the home screen of our app to show the name of the Relay repository. We'll start with a common approach to fetching data in React, calling our fetch function after the component mounts (note: later we'll see some limitations of this approach and a better alternative that works with React Concurrent Mode and Suspense). First we'll create a helper function to load data from the server. Again, this example will use the GitHub API, but feel free to replace it with the appropriate URL and authentication mechanism for your own GraphQL server:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-javascript",children:"// your-app-name/src/fetchGraphQL.js\nasync function fetchGraphQL(text, variables) {\n  const REACT_APP_GITHUB_AUTH_TOKEN = process.env.REACT_APP_GITHUB_AUTH_TOKEN;\n\n  // Fetch data from GitHub's GraphQL API:\n  const response = await fetch('https://api.github.com/graphql', {\n    method: 'POST',\n    headers: {\n      Authorization: `bearer ${REACT_APP_GITHUB_AUTH_TOKEN}`,\n      'Content-Type': 'application/json',\n    },\n    body: JSON.stringify({\n      query: text,\n      variables,\n    }),\n  });\n\n  // Get the response as JSON\n  return await response.json();\n}\n\nexport default fetchGraphQL;\n"})}),"\n",(0,r.jsx)(n.h3,{id:"23-fetching-graphql-from-react",children:"2.3: Fetching GraphQL From React"}),"\n",(0,r.jsxs)(n.p,{children:["Now we can use our ",(0,r.jsx)(n.code,{children:"fetchGraphQL"})," function to fetch some data in our app. Open ",(0,r.jsx)(n.code,{children:"src/App.js"})," and edit it as follows:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-javascript",children:'// your-app-name/src/App.js\nimport React from \'react\';\nimport \'./App.css\';\nimport fetchGraphQL from \'./fetchGraphQL\';\n\nconst { useState, useEffect } = React;\n\nfunction App() {\n  // We\'ll load the name of a repository, initially setting it to null\n  const [name, setName] = useState(null);\n\n  // When the component mounts we\'ll fetch a repository name\n  useEffect(() => {\n    let isMounted = true;\n    fetchGraphQL(`\n      query RepositoryNameQuery {\n        # feel free to change owner/name here\n        repository(owner: "facebook" name: "relay") {\n          name\n        }\n      }\n    `).then(response => {\n      // Avoid updating state if the component unmounted before the fetch completes\n      if (!isMounted) {\n        return;\n      }\n      const data = response.data;\n      setName(data.repository.name);\n    }).catch(error => {\n      console.error(error);\n    });\n\n    return () => {\n      isMounted = false;\n    };\n  }, []);\n\n  // Render "Loading" until the query completes\n  return (\n    <div className="App">\n      <header className="App-header">\n        <p>\n          {name != null ? `Repository: ${name}` : "Loading"}\n        </p>\n      </header>\n    </div>\n  );\n}\n\nexport default App;\n'})}),"\n",(0,r.jsx)(n.h2,{id:"step-3-when-to-use-relay",children:"Step 3: When To Use Relay"}),"\n",(0,r.jsxs)(n.p,{children:["At this point we can fetch data with GraphQL and render it with React. This is a reasonable solution that can be sufficient for many apps. However, this approach doesn't necessarily scale. As our app grows in size and complexity, or the number of people working on the app grows, a simple approach like this can become limiting. Relay provides a number of features designed to help keep applications fast and reliable even as they grow in size and complexity: collocating data dependencies in components with GraphQL fragments, data consistency, mutations, etc. Check out ",(0,r.jsx)(n.a,{href:"../../principles-and-architecture/thinking-in-graphql/",children:"Thinking in GraphQL"})," and ",(0,r.jsx)(n.a,{href:"../../principles-and-architecture/thinking-in-relay/",children:"Thinking in Relay"})," for an overview of how Relay makes it easier to work with GraphQL."]}),"\n",(0,r.jsx)(n.h2,{id:"step-4-adding-relay-to-our-project",children:"Step 4: Adding Relay To Our Project"}),"\n",(0,r.jsxs)(n.p,{children:["In this guide we'll demonstrate installing the ",(0,r.jsx)(n.em,{children:"experimental"})," release of Relay Hooks, a new, hooks-based Relay API that supports React Concurrent Mode and Suspense."]}),"\n",(0,r.jsx)(n.p,{children:"First we'll add the necessary packages. Note that Relay is comprised of three key pieces: a compiler (which is used at build time), a core runtime (that is React agnostic), and a React integration layer."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"# NPM Users\nnpm install --save relay-runtime react-relay\nnpm install --save-dev relay-compiler babel-plugin-relay\n\n# Yarn Users\nyarn add relay-runtime react-relay\nyarn add 
1--dev relay-compiler babel-plugin-relay\n"})}),"\n",(0,r.jsx)(n.h3,{id:"41-configure-relay-compiler",children:"4.1 Configure Relay Compiler"}),"\n",(0,r.jsxs)(n.p,{children:["Next let's configure Relay compiler. We'll need a copy of the schema as a ",(0,r.jsx)(n.code,{children:".graphql"})," file. If you're using the GitHub GraphQL API, you can download a copy directly from the Relay example app:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cd your-app-name\ncurl https://raw.githubusercontent.com/relayjs/relay-examples/main/issue-tracker/schema/schema.graphql > schema.graphql\n"})}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.em,{children:"Note:"})," On Windows, the ",(0,r.jsx)(n.code,{children:".graphql"})," file has to be explicitly saved with UTF-8 encoding, not the default UTF-16. See this ",(0,r.jsx)(n.a,{href:"https://github.com/prisma-labs/get-graphql-schema/issues/30",children:"issue"})," for more details."]}),"\n",(0,r.jsxs)(n.p,{children:["If you're using your own API we suggest using the ",(0,r.jsx)(n.a,{href:"https://www.npmjs.com/package/get-graphql-schema",children:(0,r.jsx)(n.code,{children:"get-graphql-schema"})})," utility to download your schema into a ",(0,r.jsx)(n.code,{children:".graphql"})," file."]}),"\n",(0,r.jsxs)(n.p,{children:["Now that we have a schema we can modify ",(0,r.jsx)(n.code,{children:"package.json"})," to run the compiler first whenever we build or start our app:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'// your-app-name/package.json\n{\n  ...\n  "scripts": {\n    ...\n    "start": "yarn run relay && react-scripts start",\n    "build": "yarn run relay && react-scripts build",\n    "relay": "yarn run relay-compiler"\n    ...\n  },\n  "relay": {\n    "src": "./src/",\n    "schema": "./schema.graphql",\n    "language": "javascript"\n  }\n  ...\n}\n'})}),"\n",(0,r.jsx)(n.p,{children:"At this point, you should be able to run the following successfully:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"cd your-app-name\nyarn start\n"})}),"\n",(0,r.jsxs)(n.p,{children:["If it works, your app will open at ",(0,r.jsx)(n.a,{href:"http://localhost:3000",children:"localhost:3000"}),". Now when we write GraphQL in our app, Relay will detect it and generate code to represent our queries in ",(0,r.jsx)(n.code,{children:"your-app-name/src/__generated__/"}),". We recommend checking in these generated files to source control."]}),"\n",(0,r.jsx)(n.h3,{id:"42-configure-relay-runtime",children:"4.2 Configure Relay Runtime"}),"\n",(0,r.jsxs)(n.p,{children:["Now that the compiler is configured we can set up the runtime - we have to tell Relay how to connect to our GraphQL server. We'll reuse the ",(0,r.jsx)(n.code,{children:"fetchGraphQL"})," utility we built above. Assuming you haven't modified it (or at least that it still takes ",(0,r.jsx)(n.code,{children:"text"})," and ",(0,r.jsx)(n.code,{children:"variables"})," as arguments), we can now define a Relay ",(0,r.jsx)(n.code,{children:"Environment"}),". An ",(0,r.jsx)(n.code,{children:"Environment"})," encapsulates how to talk to our server (a Relay ",(0,r.jsx)(n.code,{children:"Network"}),") with a cache of data retrieved from that server. We'll create a new file, ",(0,r.jsx)(n.code,{children:"src/RelayEnvironment.js"})," and add the following:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-javascript",children:"// your-app-name/src/RelayEnvironment.js\nimport {Environment, Network, RecordSource, Store} from 'relay-runtime';\nimport fetchGraphQL from './fetchGraphQL';\n\n// Relay passes a \"params\" object with the query name and text. So we define a helper function\n// to call our fetchGraphQL utility with params.text.\nasync function fetchRelay(params, variables) {\n  console.log(`fetching query ${params.name} with ${JSON.stringify(variables)}`);\n  return fetchGraphQL(params.text, variables);\n}\n\n// Export a singleton instance of Relay Environment configured with our network function:\nexport default new Environment({\n  network: Network.create(fetchRelay),\n  store: new Store(new RecordSource()),\n});\n"})}),"\n",(0,r.jsx)(n.h2,{id:"step-5-fetching-a-query-with-relay",children:"Step 5: Fetching a Query With Relay"}),"\n",(0,r.jsxs)(n.p,{children:["Now that Relay is installed and configured we can change ",(0,r.jsx)(n.code,{children:"App.js"})," to use it instead. We'll prepare our data as the app starts, and wait for it to be ready in ",(0,r.jsx)(n.code,{children:"<App>"}),". Replace the contents of ",(0,r.jsx)(n.code,{children:"src/App.js"})," with the following:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-javascript",children:"import React from 'react';\nimport './App.css';\nimport graphql from 'babel-plugin-relay/macro';\nimport {\n  RelayEnvironmentProvider,\n  loadQuery,\n  usePreloadedQuery,\n} from 'react-relay/hooks';\nimport RelayEnvironment from './RelayEnvironment';\n\nconst { Suspense } = React;\n\n// Define a query\nconst RepositoryNameQuery = graphql`\n  query AppRepositoryNameQuery {\n    repository(owner: \"facebook\", name: \"relay\") {\n      name\n    }\n  }\n`;\n\n// Immediately load the query as our app starts. For a real app, we'd move this\n// into our routing configuration, preloading data as we transition to new routes.\nconst preloadedQuery = loadQuery(RelayEnvironment, RepositoryNameQuery, {\n  /* query variables */\n});\n\n// Inner component that reads the preloaded query results via `usePreloadedQuery()`.\n// This works as follows:\n// - If the query has completed, it returns the results of the query.\n// - If the query is still pending, it \"
1suspends\" (indicates to React that the\n//   component isn't ready to render yet). This will show the nearest <Suspense>\n//   fallback.\n// - If the query failed, it throws the failure error. For simplicity we aren't\n//   handling the failure case here.\nfunction App(props) {\n  const data = usePreloadedQuery(RepositoryNameQuery, props.preloadedQuery);\n\n  return (\n    <div className=\"App\">\n      <header className=\"App-header\">\n        <p>{data.repository.name}</p>\n      </header>\n    </div>\n  );\n}\n\n// The above component needs to know how to access the Relay environment, and we\n// need to specify a fallback in case it suspends:\n// - <RelayEnvironmentProvider> tells child components how to talk to the current\n//   Relay Environment instance\n// - <Suspense> specifies a fallback in case a child suspends.\nfunction AppRoot(props) {\n  return (\n    <RelayEnvironmentProvider environment={RelayEnvironment}>\n      <Suspense fallback={'Loading...'}>\n        <App preloadedQuery={preloadedQuery} />\n      </Suspense>\n    </RelayEnvironmentProvider>\n  );\n}\n\nexport default AppRoot;\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Note that you'll have to restart the app - ",(0,r.jsx)(n.code,{children:"yarn start"})," - so that Relay compiler can see the new query and generate code for it. See the ",(0,r.jsx)(n.a,{href:"../installation-and-setup/#set-up-relay-compiler",children:"Relay Compiler setup docs"})," for how to run Relay Compiler in watch mode, to regenerate code as you modify queries."]}),"\n",(0,r.jsx)(n.h2,{id:"step-6-explore",children:"Step 6: Explore!"}),"\n",(0,r.jsx)(n.p,{children:"At this point we have an app configured to use Relay. We recommend checking out the following for information and ideas about where to go next:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["The ",(0,r.jsx)(n.a,{href:"../../guided-tour/",children:"Guided Tour"})," describes how to implement many common use-cases."]}),"\n",(0,r.jsxs)(n.li,{children:["The ",(0,r.jsx)(n.a,{href:"../../api-reference/use-fragment/",children:"API Reference"})," has full details on the Relay Hooks APIs."]}),"\n",(0,r.jsxs)(n.li,{children:["The ",(0,r.jsx)(n.a,{href:"https://github.com/relayjs/relay-examples/tree/main/issue-tracker",children:"Example App"})," is a more sophisticated version of what we've started building here. It includes routing integration and uses React Concurrent Mode and Suspense for smooth transitions between pages."]}),"\n"]}),"\n",(0,r.jsx)(i.A,{})]})}function d(e={}){let{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},86898(e,n,t){t.d(n,{A:()=>m});var a=t(74848),r=t(95310),s=t(17352),i=t(96540);function o(){let e=window.encodeURI(JSON.stringify({title:"Feedback about "+window.location.pathname,description:"**!!! Required !!!**\n\nPlease modify the task description to let us know how the docs can be improved.\n\n**Please do not ask support questions via this form! Instead, ask in fburl.com/relay_support**",tag_ids:{add:[0xac96423e5b680,0x64079768ac750]}}));window.open("https://www.internalfb.com/tasks/?n="+e)}function l({children:e}){return(0,a.jsxs)("div",{className:"docsRating",id:"docsRating",children:[(0,a.jsx)("hr",{}),e]})}let c=()=>{let[e,n]=i.useState(!1),t=e=>{n(!0),window.ga&&window.ga("send",{hitType:"event",eventCategory:"button",eventAction:"feedback",eventValue:e})};return e?"Thank you for letting us know!":(0,a.jsxs)(a.Fragment,{children:["Is this page useful?",(0,a.jsx)("svg",{className:"i_thumbsup",alt:"Like",id:"docsRating-like",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 81.13 89.76",onClick:()=>t(1),children:(0,a.jsx)("path",{d:"M22.9 6a18.57 18.57 0 002.67 8.4 25.72 25.72 0 008.65 7.66c3.86 2 8.67 7.13 13.51 11 3.86 3.11 8.57 7.11 11.54 8.45s13.59.26 14.64 1.17c1.88 1.63 1.55 9-.11 15.25-1.61 5.86-5.96 10.55-6.48 16.86-.4 4.83-2.7 4.88-10.93 4.88h-1.35c-3.82 0-8.24 2.93-12.92 3.62a68 68 0 01-9.73.5c-3.57 0-7.86-.08-13.25-.08-3.56 0-4.71-1.83-4.71-4.48h8.42a3.51 3.51 0 000-7H12.28a2.89 2.89 0 01-2.88-2.88 1.91 1.91 0 01.77-1.78h16.46a3.51 3.51 0 000-7H12.29c-3.21 0-4.84-1.83-4.84-4a6.41 6.41 0 011.17-3.78h19.06a3.5 3.5 0 100-7H9.75A3.51 3.51 0 016 42.27a3.45 3.45 0 013.75-3.48h13.11c5.61 0 7.71-3 5.71-5.52-4.43-4.74-10.84-12.62-11-18.71-.15-6.51 2.6-7.83 5.36-8.56m0-6a6.18 6.18 0 00-1.53.2c-6.69 1.77-10 6.65-9.82 14.5.08 5.09 2.99 11.18 8.52 18.09H9.74a9.52 9.52 0 00-6.23 16.9 12.52 12.52 0 00-2.07 6.84 9.64 9.64 0 003.65 7.7 7.85 7.85 0 00-1.7 5.13 8.9 8.9 0 005.3 8.13 6 6 0 00-.26 1.76c0 6.37 4.2 10.48 10.71 10.48h13.25a73.75 73.75 0 0010.6-.56 35.89 35.89 0 007.58-2.18 17.83 17.83 0 014.48-1.34h1.35c4.69 0 7.79 0 10.5-1 3.85-1.44 6-4.59 6.41-9.38.2-2.46 1.42-4.85 2.84-7.62a41.3 41.3 0 003.42-8.13 48 48 0 001.59-10.79c.1-5.13-1-8.48-3.35-10.55-2.16-1.87-4.64-1.87-9.6-1.88a46.86 46.86 0 01-6.64-.29c-1.92-.94-5.72-4-8.51-6.3l-1.58-1.28c-1.6-1.3-3.27-2.79-4.87-4.23-3.33-3-6.47-5.79-9.61-7.45a20.2 20.2 0 01-6.43-5.53 12.44 12.44 0 01-1.72-5.36 6 6 0 00-6-5.86z"})}),(0,a.jsx)("svg",{className:"i_thumbsdown",alt:"Dislike",id:"docsRating-dislike",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 81.13 89.76",onClick:()=>t(0),children:(0,a.jsx)("path",{d:"M22.9 6a18.57 18.57 0 002.67 8.4 25.72 25.72 0 008.65 7.66c3.86 2 8.67 7.13 13.51 11 3.86 3.11 8.57 7.11 11.54 8.45s13.59.26 14.64 1.17c1.88 1.63 1.55 9-.11 15.25-1.61 5.86-5.96 10.55-6.48 16.86-.4 4.83-2.7 4.88-10.93 4.88h-1.35c-3.82 0-8.24 2.93-12.92 3.62a68 68 0 01-9.73.5c-3.57 0-7.86-.08-13.25-.08-3.56 0-4.71-1.83-4.71-4.48h8.42a3.51 3.51 0 000-7H12.28a2.89 2.89 0 01-2.88-2.88 1.91 1.91 0 01.77-1.78h16.46a3.51 3.51 0 000-7H12.29c-3.21 0-4.84-1.83-4.84-4a6.41 6.41 0 011.17-3.78h19.06a3.5 3.5 0 100-7H9.75A3.51 3.51 0 016 42.27a3.45 3.45 0 013.75-3.48h13.11c5.61 0 7.71-3 5.71-5.52-4.43-4.74-10.84-12.62-11-18.71-.15-6.51 2.6-7.83 5.36-8.56m0-6a6.18 6.18 0 00-1.53.2c-6.69 1.77-10 6.65-9.82 14.5.08 5.09 2.99 11.18 8.52 18.09H9.74a9.52 9.52 0 00-6.23 16.9 12.52 12.52 0 00-2.07 6.84 9.64 9.64 0 003.65 7.7 7.85 7.85 0 00-1.7 5.13 8.9 8.9 0 005.3 8.13 6 6 0 00-.26 1.76c0 6.37 4.2 10.48 10.71 10.48h13.25a73.75 73.75 0 0010.6-.56 35.89 35.89 0 007.58-2.18 17.83 17.83 0 014.48-1.34h1.35c4.69 0 7.79 0 10.5-1 3.85-1.44 6-4.59 6.41-9.38.2-2.46 1.42-4.85 2.84-7.62a41.3 41.3 0 003.42-8.13 48 48 0 001.59-10.79c.1-5.13-1-8.48-3.35-10.55-2.16-1.87-4.64-1.87-9.6-1.88a46.86 46.86 0 01-6.64-.29c-1.92-.94-5.72-4-8.51-6.3l-1.58-1.28c-1.6-1.3-3.27-2.79-4.87-4.23-3.33-3-6.47-5.79-9.61-7.45a20.2 20.2 0 01-6.43-5.53 12.44 12.44 0 01-1.72-5.36 6 6 0 00-6-5.86z"})})]})},p=()=>(0,a.jsxs)("p",{children:["Let us know how these docs can be improved by",(0,a.jsx)("a",{className:"button",role:"button",tabIndex:0,onClick:o,children:"Filing a task"})]}),h=()=>(0,a.jsxs)("p",{children:["Help us make the site even better by"," ",(0,a.jsx)(r.default,{to:"https://www.surveymonkey.com/r/FYC9TCJ",children:"answering a few quick questions"}),"."]}),d=()=>(0,a.jsxs)(l,{children:[(0,a.jsx)(p,{}),(0,a.jsx)(c,{}),(0,a.jsx)(h,{})]}),u=()=>(0,a.jsxs)(l,{children:[(0,a.jsx)(c,{}),(0,a.jsx)(h,{})]}),m=()=>(0,s.fbContent)({internal:(0,a.jsx)(d,{}),external:(0,a.jsx)(u,{})})},28453(e,n,t){t.d(n,{R:()=>i,x:()=>o});var a=t(96540);let r={},s=a.createContext(r);function i(e){let n=a.useContext(s);return a.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),a.createElement(s.Provider,{value:n},e.children)}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.