diff --git a/404.html b/404.html index c1bd8410..5598fbc1 100644 --- a/404.html +++ b/404.html @@ -4,8 +4,8 @@ Paima Engine - - + +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

diff --git a/assets/js/0205cee1.010c0337.js b/assets/js/0205cee1.010c0337.js deleted file mode 100644 index 91feef2a..00000000 --- a/assets/js/0205cee1.010c0337.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkpaima_engine_docs=self.webpackChunkpaima_engine_docs||[]).push([[6266],{9369:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>h});var a=i(5893),n=i(1151);const o={},r="Create your own Primitive",s={id:"home/state-machine/react-to-events/primitive-catalogue/create-your-own",title:"Create your own Primitive",description:"Although custom Primitives do not always have to be added to Paima (people can just use the Generic EVM Primitive), adding a Primitive to Paima itself helps both with usability and with type inference.",source:"@site/docs/home/100-state-machine/300-react-to-events/10-primitive-catalogue/2000-create-your-own.md",sourceDirName:"home/100-state-machine/300-react-to-events/10-primitive-catalogue",slug:"/home/state-machine/react-to-events/primitive-catalogue/create-your-own",permalink:"/home/state-machine/react-to-events/primitive-catalogue/create-your-own",draft:!1,unlisted:!1,editUrl:"https://github.com/PaimaStudios/paima-engine-docs/tree/main/docs/home/100-state-machine/300-react-to-events/10-primitive-catalogue/2000-create-your-own.md",tags:[],version:"current",sidebarPosition:2e3,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Generic Primitives",permalink:"/home/state-machine/react-to-events/primitive-catalogue/mina/generic"},next:{title:"L2 Quirks",permalink:"/home/state-machine/react-to-events/L2-quirks"}},c={},h=[{value:"FAQ",id:"faq",level:2},{value:"Q: Do I need to write a Primitive for my dApp? I have an API where people can fetch their account state in my dApp already",id:"q-do-i-need-to-write-a-primitive-for-my-dapp-i-have-an-api-where-people-can-fetch-their-account-state-in-my-dapp-already",level:3},{value:"Q: All this seems only for reading state. What about writing state?",id:"q-all-this-seems-only-for-reading-state-what-about-writing-state",level:3}];function l(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",ul:"ul",...(0,n.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.h1,{id:"create-your-own-primitive",children:"Create your own Primitive"}),"\n",(0,a.jsxs)(t.p,{children:["Although custom Primitives do not always have to be added to Paima (people can just use the ",(0,a.jsx)(t.a,{href:"/home/state-machine/react-to-events/primitive-catalogue/evm/Generic",children:"Generic EVM Primitive"}),"), adding a Primitive to Paima itself helps both with usability and with type inference."]}),"\n",(0,a.jsx)(t.p,{children:"To add a custom Primitive to Paima, you need to do the following:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:["(templates - optional) add your contract to ",(0,a.jsx)(t.code,{children:"packages/contracts"})," if you think this contract should be bundled with Paima (useful for specifications like ERC20, etc. that might be reused often)"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:["fetcher (",(0,a.jsx)(t.code,{children:"@paima/funnel"}),"): fetches your data from the blockchain"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:["updater (",(0,a.jsx)(t.code,{children:"@paima/sm"}),"): handles creating updates for the Paima state machine / database when data for the Primitive is found"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:["indexer (",(0,a.jsx)(t.code,{children:"@paima/db"}),"): stores historical onchain Primitive updates to the database for games to easily access"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:["config (",(0,a.jsx)(t.code,{children:"@paima/runtime"}),"): handles parsing Primitive config files users will write"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:["utils (",(0,a.jsx)(t.code,{children:"@paima/utils"}),"): provides utility functions on top your Primitive (ex: get all NFTs owned by a user)"]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.p,{children:["With all these steps complete, your can create a pull request to the ",(0,a.jsx)(t.a,{href:"https://github.com/PaimaStudios/paima-engine/",children:"Paima codebase"})," so users can leverage your Primitive!"]}),"\n",(0,a.jsx)(t.h2,{id:"faq",children:"FAQ"}),"\n",(0,a.jsx)(t.h3,{id:"q-do-i-need-to-write-a-primitive-for-my-dapp-i-have-an-api-where-people-can-fetch-their-account-state-in-my-dapp-already",children:"Q: Do I need to write a Primitive for my dApp? I have an API where people can fetch their account state in my dApp already"}),"\n",(0,a.jsx)(t.p,{children:"It depends what you want. If actions in your dApp do no directly tie into the game world, you do not need a Primitive. However, if you want actions in your dApp to be able to affect game state (ex: something like Pokemon where some pokemon only evolves if you trade them on a specific marketplace), then you will need a Primitive so that the game can trustlessly update based on the onchain activity (otherwise, the game would break if your API ever goes down)"}),"\n",(0,a.jsx)(t.h3,{id:"q-all-this-seems-only-for-reading-state-what-about-writing-state",children:"Q: All this seems only for reading state. What about writing state?"}),"\n",(0,a.jsxs)(t.p,{children:["Primitives are just about reading state from the chain and evolving the game based off of them. For creating transactions from the game frontend, you can use whatever API you prefer for creating the transaction. Do keep in mind that Paima does come with its own ",(0,a.jsx)(t.a,{href:"/home/multichain-support/wallet-layer/introduction",children:"account abstraction framework"})," for creating wallets, so if your API for creating transactions is too high-level (ex: if it handles the entire flow from wallet initialization through ",(0,a.jsx)(t.code,{children:"window.ethereum"})," down to creating the transaction) it may be hard to combine with our account abstraction framework."]})]})}function d(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(l,{...e})}):l(e)}},1151:(e,t,i)=>{i.d(t,{Z:()=>s,a:()=>r});var a=i(7294);const n={},o=a.createContext(n);function r(e){const t=a.useContext(o);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),a.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0205cee1.8f43c1d3.js b/assets/js/0205cee1.8f43c1d3.js new file mode 100644 index 00000000..6531356d --- /dev/null +++ b/assets/js/0205cee1.8f43c1d3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkpaima_engine_docs=self.webpackChunkpaima_engine_docs||[]).push([[6266],{9369:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>h});var a=i(5893),n=i(1151);const o={},r="Create your own Primitive",s={id:"home/state-machine/react-to-events/primitive-catalogue/create-your-own",title:"Create your own Primitive",description:"Although custom Primitives do not always have to be added to Paima (people can just use the Generic EVM Primitive), adding a Primitive to Paima itself helps both with usability and with type inference.",source:"@site/docs/home/100-state-machine/300-react-to-events/10-primitive-catalogue/2000-create-your-own.md",sourceDirName:"home/100-state-machine/300-react-to-events/10-primitive-catalogue",slug:"/home/state-machine/react-to-events/primitive-catalogue/create-your-own",permalink:"/home/state-machine/react-to-events/primitive-catalogue/create-your-own",draft:!1,unlisted:!1,editUrl:"https://github.com/PaimaStudios/paima-engine-docs/tree/main/docs/home/100-state-machine/300-react-to-events/10-primitive-catalogue/2000-create-your-own.md",tags:[],version:"current",sidebarPosition:2e3,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Contract state",permalink:"/home/state-machine/react-to-events/primitive-catalogue/midnight/contract-state"},next:{title:"L2 Quirks",permalink:"/home/state-machine/react-to-events/L2-quirks"}},c={},h=[{value:"FAQ",id:"faq",level:2},{value:"Q: Do I need to write a Primitive for my dApp? I have an API where people can fetch their account state in my dApp already",id:"q-do-i-need-to-write-a-primitive-for-my-dapp-i-have-an-api-where-people-can-fetch-their-account-state-in-my-dapp-already",level:3},{value:"Q: All this seems only for reading state. What about writing state?",id:"q-all-this-seems-only-for-reading-state-what-about-writing-state",level:3}];function l(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",ul:"ul",...(0,n.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.h1,{id:"create-your-own-primitive",children:"Create your own Primitive"}),"\n",(0,a.jsxs)(t.p,{children:["Although custom Primitives do not always have to be added to Paima (people can just use the ",(0,a.jsx)(t.a,{href:"/home/state-machine/react-to-events/primitive-catalogue/evm/Generic",children:"Generic EVM Primitive"}),"), adding a Primitive to Paima itself helps both with usability and with type inference."]}),"\n",(0,a.jsx)(t.p,{children:"To add a custom Primitive to Paima, you need to do the following:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:["(templates - optional) add your contract to ",(0,a.jsx)(t.code,{children:"packages/contracts"})," if you think this contract should be bundled with Paima (useful for specifications like ERC20, etc. that might be reused often)"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:["fetcher (",(0,a.jsx)(t.code,{children:"@paima/funnel"}),"): fetches your data from the blockchain"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:["updater (",(0,a.jsx)(t.code,{children:"@paima/sm"}),"): handles creating updates for the Paima state machine / database when data for the Primitive is found"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:["indexer (",(0,a.jsx)(t.code,{children:"@paima/db"}),"): stores historical onchain Primitive updates to the database for games to easily access"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:["config (",(0,a.jsx)(t.code,{children:"@paima/runtime"}),"): handles parsing Primitive config files users will write"]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:["utils (",(0,a.jsx)(t.code,{children:"@paima/utils"}),"): provides utility functions on top your Primitive (ex: get all NFTs owned by a user)"]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(t.p,{children:["With all these steps complete, your can create a pull request to the ",(0,a.jsx)(t.a,{href:"https://github.com/PaimaStudios/paima-engine/",children:"Paima codebase"})," so users can leverage your Primitive!"]}),"\n",(0,a.jsx)(t.h2,{id:"faq",children:"FAQ"}),"\n",(0,a.jsx)(t.h3,{id:"q-do-i-need-to-write-a-primitive-for-my-dapp-i-have-an-api-where-people-can-fetch-their-account-state-in-my-dapp-already",children:"Q: Do I need to write a Primitive for my dApp? I have an API where people can fetch their account state in my dApp already"}),"\n",(0,a.jsx)(t.p,{children:"It depends what you want. If actions in your dApp do no directly tie into the game world, you do not need a Primitive. However, if you want actions in your dApp to be able to affect game state (ex: something like Pokemon where some pokemon only evolves if you trade them on a specific marketplace), then you will need a Primitive so that the game can trustlessly update based on the onchain activity (otherwise, the game would break if your API ever goes down)"}),"\n",(0,a.jsx)(t.h3,{id:"q-all-this-seems-only-for-reading-state-what-about-writing-state",children:"Q: All this seems only for reading state. What about writing state?"}),"\n",(0,a.jsxs)(t.p,{children:["Primitives are just about reading state from the chain and evolving the game based off of them. For creating transactions from the game frontend, you can use whatever API you prefer for creating the transaction. Do keep in mind that Paima does come with its own ",(0,a.jsx)(t.a,{href:"/home/multichain-support/wallet-layer/introduction",children:"account abstraction framework"})," for creating wallets, so if your API for creating transactions is too high-level (ex: if it handles the entire flow from wallet initialization through ",(0,a.jsx)(t.code,{children:"window.ethereum"})," down to creating the transaction) it may be hard to combine with our account abstraction framework."]})]})}function d(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(l,{...e})}):l(e)}},1151:(e,t,i)=>{i.d(t,{Z:()=>s,a:()=>r});var a=i(7294);const n={},o=a.createContext(n);function r(e){const t=a.useContext(o);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),a.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/22dd74f7.1fa922f7.js b/assets/js/22dd74f7.1fa922f7.js deleted file mode 100644 index 0014b8e0..00000000 --- a/assets/js/22dd74f7.1fa922f7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkpaima_engine_docs=self.webpackChunkpaima_engine_docs||[]).push([[4980],{5904:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"category","label":"Intro","collapsible":false,"collapsed":false,"items":[{"type":"link","label":"What is Paima Engine?","href":"/","docId":"home/intro/what-is-paima-engine","unlisted":false}]},{"type":"category","label":"Environment Setup","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"How To Use Paima Engine","href":"/home/setup/how-to-use-paima-engine","docId":"home/setup/how-to-use-paima-engine","unlisted":false},{"type":"link","label":"Environment Configuration Variables","href":"/home/setup/environment-config-values","docId":"home/setup/environment-config-values","unlisted":false},{"type":"link","label":"Connect Wallet To Test","href":"/home/setup/connecting-wallets","docId":"home/setup/connecting-wallets","unlisted":false},{"type":"link","label":"Paima Batcher","href":"/home/setup/paima-bacher","docId":"home/setup/paima-bacher","unlisted":false}]},{"type":"category","label":"Smart Contracts Management","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Solidity","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Contract Configurations","href":"/home/smart-contracts/evm/introduction","docId":"home/smart-contracts/evm/introduction","unlisted":false},{"type":"link","label":"Deploying the L2 Contract","href":"/home/smart-contracts/evm/paima-l2-contract","docId":"home/smart-contracts/evm/paima-l2-contract","unlisted":false},{"type":"link","label":"Deploying a Stateful NFT","href":"/home/smart-contracts/evm/deploy-stateful-nft","docId":"home/smart-contracts/evm/deploy-stateful-nft","unlisted":false},{"type":"link","label":"Generating Code","href":"/home/smart-contracts/evm/generating-code","docId":"home/smart-contracts/evm/generating-code","unlisted":false}]}]},{"type":"category","label":"State Machine (L2) Creation","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Define your State Machine","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Onchain Data Grammar","href":"/home/state-machine/define-machine/base-format","docId":"home/state-machine/define-machine/base-format","unlisted":false},{"type":"link","label":"Reading L2 Data","href":"/home/state-machine/define-machine/read-data","docId":"home/state-machine/define-machine/read-data","unlisted":false},{"type":"link","label":"Sequential State Identifier","href":"/home/state-machine/define-machine/parallelism","docId":"home/state-machine/define-machine/parallelism","unlisted":false}]},{"type":"category","label":"User \u2192 L2: Directly write state","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Writing L2 Data","href":"/home/state-machine/direct-write/write-data","docId":"home/state-machine/direct-write/write-data","unlisted":false},{"type":"link","label":"Error Handling","href":"/home/state-machine/direct-write/error-handling","docId":"home/state-machine/direct-write/error-handling","unlisted":false},{"type":"link","label":"Batched mode","href":"/home/state-machine/direct-write/batched-mode","docId":"home/state-machine/direct-write/batched-mode","unlisted":false},{"type":"link","label":"Replay protection","href":"/home/state-machine/direct-write/replay-protection","docId":"home/state-machine/direct-write/replay-protection","unlisted":false},{"type":"link","label":"Auto-signing for apps","href":"/home/state-machine/direct-write/autosign","docId":"home/state-machine/direct-write/autosign","unlisted":false}]},{"type":"category","label":"L1 \u2192 L2: Reacting To Events","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Funnels: fetch L1 data","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Common concepts","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction to Paima Funnels","href":"/home/state-machine/react-to-events/funnel-types/common-concepts/intro","docId":"home/state-machine/react-to-events/funnel-types/common-concepts/intro","unlisted":false},{"type":"link","label":"Parallel funnels","href":"/home/state-machine/react-to-events/funnel-types/common-concepts/parallel-networks","docId":"home/state-machine/react-to-events/funnel-types/common-concepts/parallel-networks","unlisted":false}]},{"type":"link","label":"Configuring your Funnel","href":"/home/state-machine/react-to-events/funnel-types/configuration","docId":"home/state-machine/react-to-events/funnel-types/configuration","unlisted":false},{"type":"link","label":"EVM Block Funnel","href":"/home/state-machine/react-to-events/funnel-types/block-funnel","docId":"home/state-machine/react-to-events/funnel-types/block-funnel","unlisted":false},{"type":"link","label":"EVM Parallel funnel","href":"/home/state-machine/react-to-events/funnel-types/parallel-evm-funnel","docId":"home/state-machine/react-to-events/funnel-types/parallel-evm-funnel","unlisted":false},{"type":"link","label":"Emulated Block Funnel (Stable Ticks)","href":"/home/state-machine/react-to-events/funnel-types/stable-tick-rate-funnel","docId":"home/state-machine/react-to-events/funnel-types/stable-tick-rate-funnel","unlisted":false},{"type":"link","label":"Carp Funnel","href":"/home/state-machine/react-to-events/funnel-types/carp-funnel","docId":"home/state-machine/react-to-events/funnel-types/carp-funnel","unlisted":false},{"type":"link","label":"Mina funnel","href":"/home/state-machine/react-to-events/funnel-types/mina-funnel","docId":"home/state-machine/react-to-events/funnel-types/mina-funnel","unlisted":false},{"type":"link","label":"Avail Parallel funnel","href":"/home/state-machine/react-to-events/funnel-types/parallel-avail-funnel","docId":"home/state-machine/react-to-events/funnel-types/parallel-avail-funnel","unlisted":false},{"type":"link","label":"Avail block funnel","href":"/home/state-machine/react-to-events/funnel-types/avail-block-funnel","docId":"home/state-machine/react-to-events/funnel-types/avail-block-funnel","unlisted":false}]},{"type":"category","label":"Primitive Catalogue: react to L1 data","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Primitive Catalogue","href":"/home/state-machine/react-to-events/primitive-catalogue/introduction","docId":"home/state-machine/react-to-events/primitive-catalogue/introduction","unlisted":false},{"type":"category","label":"Meta Primitives","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Primitive List","href":"/home/state-machine/react-to-events/primitive-catalogue/meta/introduction","docId":"home/state-machine/react-to-events/primitive-catalogue/meta/introduction","unlisted":false}]},{"type":"category","label":"EVM Primitives","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"ERC20 Primitives","href":"/home/state-machine/react-to-events/primitive-catalogue/evm/ERC20","docId":"home/state-machine/react-to-events/primitive-catalogue/evm/ERC20","unlisted":false},{"type":"link","label":"ERC721 Primitives","href":"/home/state-machine/react-to-events/primitive-catalogue/evm/ERC721","docId":"home/state-machine/react-to-events/primitive-catalogue/evm/ERC721","unlisted":false},{"type":"link","label":"ERC6551 Primitives","href":"/home/state-machine/react-to-events/primitive-catalogue/evm/ERC6551","docId":"home/state-machine/react-to-events/primitive-catalogue/evm/ERC6551","unlisted":false},{"type":"link","label":"ERC1155 Primitives","href":"/home/state-machine/react-to-events/primitive-catalogue/evm/ERC1155","docId":"home/state-machine/react-to-events/primitive-catalogue/evm/ERC1155","unlisted":false},{"type":"link","label":"Dynamic primitives","href":"/home/state-machine/react-to-events/primitive-catalogue/evm/dynamic-primitives","docId":"home/state-machine/react-to-events/primitive-catalogue/evm/dynamic-primitives","unlisted":false},{"type":"link","label":"Generic Primitives","href":"/home/state-machine/react-to-events/primitive-catalogue/evm/Generic","docId":"home/state-machine/react-to-events/primitive-catalogue/evm/Generic","unlisted":false}]},{"type":"category","label":"Cardano Primitives","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Pool Delegation","href":"/home/state-machine/react-to-events/primitive-catalogue/cardano/stakepools","docId":"home/state-machine/react-to-events/primitive-catalogue/cardano/stakepools","unlisted":false},{"type":"link","label":"Delayed State","href":"/home/state-machine/react-to-events/primitive-catalogue/cardano/delayed-state","docId":"home/state-machine/react-to-events/primitive-catalogue/cardano/delayed-state","unlisted":false},{"type":"link","label":"Cardano Transfer","href":"/home/state-machine/react-to-events/primitive-catalogue/cardano/cardano-transfer","docId":"home/state-machine/react-to-events/primitive-catalogue/cardano/cardano-transfer","unlisted":false},{"type":"link","label":"Cardano Mint and Burn","href":"/home/state-machine/react-to-events/primitive-catalogue/cardano/cardano-mint-burn","docId":"home/state-machine/react-to-events/primitive-catalogue/cardano/cardano-mint-burn","unlisted":false},{"type":"link","label":"Cardano Projected NFT","href":"/home/state-machine/react-to-events/primitive-catalogue/cardano/projected-nft","docId":"home/state-machine/react-to-events/primitive-catalogue/cardano/projected-nft","unlisted":false}]},{"type":"category","label":"Mina Primitives","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Generic Primitives","href":"/home/state-machine/react-to-events/primitive-catalogue/mina/generic","docId":"home/state-machine/react-to-events/primitive-catalogue/mina/generic","unlisted":false}]},{"type":"link","label":"Create your own Primitive","href":"/home/state-machine/react-to-events/primitive-catalogue/create-your-own","docId":"home/state-machine/react-to-events/primitive-catalogue/create-your-own","unlisted":false}]},{"type":"link","label":"L2 Quirks","href":"/home/state-machine/react-to-events/L2-quirks","docId":"home/state-machine/react-to-events/L2-quirks","unlisted":false}]},{"type":"category","label":"L2 \u2192 L2: Triggering Events","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/home/state-machine/creating-events/introduction","docId":"home/state-machine/creating-events/introduction","unlisted":false},{"type":"link","label":"Timers & Ticks","href":"/home/state-machine/creating-events/timers-ticks","docId":"home/state-machine/creating-events/timers-ticks","unlisted":false},{"type":"category","label":"Log Events","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/home/state-machine/creating-events/events/introduction","docId":"home/state-machine/creating-events/events/introduction","unlisted":false},{"type":"link","label":"General Interface","href":"/home/state-machine/creating-events/events/general-interface","docId":"home/state-machine/creating-events/events/general-interface","unlisted":false},{"type":"link","label":"Built-in events","href":"/home/state-machine/creating-events/events/builtin-events","docId":"home/state-machine/creating-events/events/builtin-events","unlisted":false},{"type":"link","label":"Low-level API","href":"/home/state-machine/creating-events/events/low-level-api","docId":"home/state-machine/creating-events/events/low-level-api","unlisted":false}]},{"type":"category","label":"Paima Precompiles","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Setup","href":"/home/state-machine/creating-events/precompiles/introduction","docId":"home/state-machine/creating-events/precompiles/introduction","unlisted":false}]}]},{"type":"link","label":"L2 Block structure","href":"/home/state-machine/structure","docId":"home/state-machine/structure","unlisted":false}]},{"type":"category","label":"Game Node API","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Basic Concepts","href":"/home/game-node-api/introduction","docId":"home/game-node-api/introduction","unlisted":false},{"type":"link","label":"Achievements","href":"/home/game-node-api/achievements","docId":"home/game-node-api/achievements","unlisted":false}]},{"type":"link","label":"Randomness","href":"/home/randomness/","docId":"home/randomness/index","unlisted":false},{"type":"category","label":"Database Management","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/home/database-management/introduction","docId":"home/database-management/introduction","unlisted":false},{"type":"link","label":"Setting Up Database","href":"/home/database-management/setup","docId":"home/database-management/setup","unlisted":false},{"type":"link","label":"Database Snapshotting","href":"/home/database-management/snapshotting","docId":"home/database-management/snapshotting","unlisted":false},{"type":"link","label":"Data Migrations","href":"/home/database-management/migrations","docId":"home/database-management/migrations","unlisted":false},{"type":"link","label":"Updating Typescript Bindings","href":"/home/database-management/ts-bindings","docId":"home/database-management/ts-bindings","unlisted":false}]},{"type":"category","label":"Game Release Process","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Deploying Your Game Node","href":"/home/releasing-a-game/generate-build","docId":"home/releasing-a-game/generate-build","unlisted":false},{"type":"link","label":"Game Versioning","href":"/home/releasing-a-game/versioning","docId":"home/releasing-a-game/versioning","unlisted":false},{"type":"link","label":"Deploying a Game in Production","href":"/home/releasing-a-game/deployment","docId":"home/releasing-a-game/deployment","unlisted":false}]},{"type":"category","label":"Multichain Support","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"NFTs","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/home/multichain-support/nfts/introduction","docId":"home/multichain-support/nfts/introduction","unlisted":false},{"type":"category","label":"Projected NFTs","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Basics","href":"/home/multichain-support/nfts/projected-nfts/basics","docId":"home/multichain-support/nfts/projected-nfts/basics","unlisted":false},{"type":"link","label":"Cardano","href":"/home/multichain-support/nfts/projected-nfts/cardano","docId":"home/multichain-support/nfts/projected-nfts/cardano","unlisted":false},{"type":"link","label":"EVM","href":"/home/multichain-support/nfts/projected-nfts/evm","docId":"home/multichain-support/nfts/projected-nfts/evm","unlisted":false}]}]},{"type":"category","label":"Wallet Layer","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Basics","href":"/home/multichain-support/wallet-layer/introduction","docId":"home/multichain-support/wallet-layer/introduction","unlisted":false},{"type":"category","label":"Delegate Wallet","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/home/multichain-support/wallet-layer/delegate-wallet/introduction","docId":"home/multichain-support/wallet-layer/delegate-wallet/introduction","unlisted":false},{"type":"link","label":"Effect on Interfaces","href":"/home/multichain-support/wallet-layer/delegate-wallet/interfaces","docId":"home/multichain-support/wallet-layer/delegate-wallet/interfaces","unlisted":false},{"type":"link","label":"Integrate into your game","href":"/home/multichain-support/wallet-layer/delegate-wallet/integrate","docId":"home/multichain-support/wallet-layer/delegate-wallet/integrate","unlisted":false}]}]}]},{"type":"category","label":"Libraries","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"@paima/evm-contracts","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/home/libraries/evm-contracts/introduction","docId":"home/libraries/evm-contracts/introduction","unlisted":false},{"type":"category","label":"Solidity Contracts","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Generated Docs","href":"/home/libraries/evm-contracts/solidity/generated-docs","docId":"home/libraries/evm-contracts/solidity/generated-docs","unlisted":false}]},{"type":"link","label":"Hardhat task list","href":"/home/libraries/evm-contracts/hardhat-tasks","docId":"home/libraries/evm-contracts/hardhat-tasks","unlisted":false}]},{"type":"category","label":"cardano-contracts","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Aiken Contracts","href":"/home/libraries/cardano-contracts/contrats","docId":"home/libraries/cardano-contracts/contrats","unlisted":false}]}]},{"type":"category","label":"Paima Standards (PRCs)","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"prc-1\uff1aPaima Achievement Interface","href":"/home/PRCs/prc-1","docId":"home/PRCs/prc-1","unlisted":false},{"type":"link","label":"prc-2\uff1aPaima Hololocker Interface","href":"/home/PRCs/prc-2","docId":"home/PRCs/prc-2","unlisted":false},{"type":"link","label":"prc-3\uff1aPaima Inverse Projection Interface","href":"/home/PRCs/prc-3","docId":"home/PRCs/prc-3","unlisted":false},{"type":"link","label":"prc-5\uff1aPaima Inverse Projection Interface for ERC1155","href":"/home/PRCs/prc-5","docId":"home/PRCs/prc-5","unlisted":false}]},{"type":"link","label":"Paima Game Templates","href":"https://github.com/PaimaStudios/paima-game-templates"},{"type":"link","label":"Paima Engine Code","href":"https://github.com/PaimaStudios/paima-engine/"},{"type":"link","label":"Paima Studios Website","href":"https://paimastudios.com"}]},"docs":{"home/database-management/introduction":{"id":"home/database-management/introduction","title":"Introduction","description":"Although typically when you build an application with Paima all information lives onchain, querying data that lives on the blockchain is not always efficient. To enable more efficient management of this data, Paima uses PostgresDB for database management. This is a very common practice not only done by many dApps, but L1 chains themselves as well (for example, the Geth client for Ethereum uses LevelDB).","sidebar":"tutorialSidebar"},"home/database-management/migrations":{"id":"home/database-management/migrations","title":"Data Migrations","description":"Data Migrations allow game developers to add data to the database e.g., World Setup, NPC, Items, and other system tables.","sidebar":"tutorialSidebar"},"home/database-management/setup":{"id":"home/database-management/setup","title":"Setting Up Database","description":"Paima Engine requires you to deploy a Postgres database which will be used to store all state of your game node.","sidebar":"tutorialSidebar"},"home/database-management/snapshotting":{"id":"home/database-management/snapshotting","title":"Database Snapshotting","description":"Paima will periodically generate local snapshots of the database. This is useful for two main cases:","sidebar":"tutorialSidebar"},"home/database-management/ts-bindings":{"id":"home/database-management/ts-bindings","title":"Updating Typescript Bindings","description":"Paima leverages a tool called pgtyped to automatically generate Typescript bindings to your database queries. This can save a lot of time and helps avoid bugs by ensuring that your code always matches the database schema.","sidebar":"tutorialSidebar"},"home/game-node-api/achievements":{"id":"home/game-node-api/achievements","title":"Achievements","description":"[PRC-1] defines a standard API for Paima Engine game nodes to serve achievement","sidebar":"tutorialSidebar"},"home/game-node-api/introduction":{"id":"home/game-node-api/introduction","title":"Basic Concepts","description":"Games need to communicate not just with their UI, but also the rest of the web2 world that may want to interact with the game state. Paima exposes multiple different endpoints to help both with humans and tools to access the game state.","sidebar":"tutorialSidebar"},"home/intro/what-is-paima-engine":{"id":"home/intro/what-is-paima-engine","title":"What is Paima Engine?","description":"Paima is a Web3 Engine optimized for games, gamification and autonomous worlds that allows building web3 applications in just days","sidebar":"tutorialSidebar"},"home/libraries/cardano-contracts/contrats":{"id":"home/libraries/cardano-contracts/contrats","title":"Aiken Contracts","description":"Aiken contracts provided as part of Paima Engine.","sidebar":"tutorialSidebar"},"home/libraries/evm-contracts/hardhat-tasks":{"id":"home/libraries/evm-contracts/hardhat-tasks","title":"Hardhat task list","description":"Paima Hardhat tasks allow easily interacting with the Paima contracts through the CLI or other external tools.","sidebar":"tutorialSidebar"},"home/libraries/evm-contracts/introduction":{"id":"home/libraries/evm-contracts/introduction","title":"Introduction","description":"NPM package: @paima/evm-contracts","sidebar":"tutorialSidebar"},"home/libraries/evm-contracts/solidity/generated-docs":{"id":"home/libraries/evm-contracts/solidity/generated-docs","title":"Generated Docs","description":"Solidity contracts provided as part of Paima Engine.","sidebar":"tutorialSidebar"},"home/multichain-support/nfts/introduction":{"id":"home/multichain-support/nfts/introduction","title":"Introduction","description":"Paima Engine allows connecting NFTs to games without requiring an NFT bridge - even if the NFT lives on a different layer of the same chain, or on a different chain entirely.","sidebar":"tutorialSidebar"},"home/multichain-support/nfts/projected-nfts/basics":{"id":"home/multichain-support/nfts/projected-nfts/basics","title":"Basics","description":"The goal of cross-chain NFTs is to allow people to play with NFTs from one chain in a game hosted on a different chain without requiring any bridge of centralized solution.","sidebar":"tutorialSidebar"},"home/multichain-support/nfts/projected-nfts/cardano":{"id":"home/multichain-support/nfts/projected-nfts/cardano","title":"Cardano","description":"Block timing","sidebar":"tutorialSidebar"},"home/multichain-support/nfts/projected-nfts/evm":{"id":"home/multichain-support/nfts/projected-nfts/evm","title":"EVM","description":"You can find the specification for EVM-based projected NFTs here.","sidebar":"tutorialSidebar"},"home/multichain-support/wallet-layer/delegate-wallet/integrate":{"id":"home/multichain-support/wallet-layer/delegate-wallet/integrate","title":"Integrate into your game","description":"Here we share all the steps to integrate the wallet delegation system into a game","sidebar":"tutorialSidebar"},"home/multichain-support/wallet-layer/delegate-wallet/interfaces":{"id":"home/multichain-support/wallet-layer/delegate-wallet/interfaces","title":"Effect on Interfaces","description":"Enabling wallet delegation has implications on the interfaces of multiple different parts of your application.","sidebar":"tutorialSidebar"},"home/multichain-support/wallet-layer/delegate-wallet/introduction":{"id":"home/multichain-support/wallet-layer/delegate-wallet/introduction","title":"Introduction","description":"Delegate Wallet allows for a wallet address to be delegated to another wallet address.","sidebar":"tutorialSidebar"},"home/multichain-support/wallet-layer/introduction":{"id":"home/multichain-support/wallet-layer/introduction","title":"Basics","description":"Paima, although being EVM based, uses account abstraction to support wallets from multiple different cryptocurrencies. You can learn how to setup the batchers for account abstraction here.","sidebar":"tutorialSidebar"},"home/PRCs/prc-1":{"id":"home/PRCs/prc-1","title":"prc-1\uff1aPaima Achievement Interface","description":"Interface for sharing in-game achievements.","sidebar":"tutorialSidebar"},"home/PRCs/prc-2":{"id":"home/PRCs/prc-2","title":"prc-2\uff1aPaima Hololocker Interface","description":"Interface for projecting ERC721 tokens on EVM networks for usage in Paima","sidebar":"tutorialSidebar"},"home/PRCs/prc-3":{"id":"home/PRCs/prc-3","title":"prc-3\uff1aPaima Inverse Projection Interface","description":"Interface for inverse projection of game state into NFTs in other chains","sidebar":"tutorialSidebar"},"home/PRCs/prc-5":{"id":"home/PRCs/prc-5","title":"prc-5\uff1aPaima Inverse Projection Interface for ERC1155","description":"Interface for inverse projection of game state into ERC1155 tokens in other chains","sidebar":"tutorialSidebar"},"home/randomness/index":{"id":"home/randomness/index","title":"Randomness","description":"Randomness is an important part of many games and having a good source of randomness prevents users from abusing statistical trends to their own benefit.","sidebar":"tutorialSidebar"},"home/releasing-a-game/deployment":{"id":"home/releasing-a-game/deployment","title":"Deploying a Game in Production","description":"This guide will show you the steps to deploy the backend and frontend of your game, so players can connect from the internet and play and interact.","sidebar":"tutorialSidebar"},"home/releasing-a-game/generate-build":{"id":"home/releasing-a-game/generate-build","title":"Deploying Your Game Node","description":"If you wish to deploy your game on a server/move into a production environment, the following files are all that is needed for Paima Engine to run your game node:","sidebar":"tutorialSidebar"},"home/releasing-a-game/versioning":{"id":"home/releasing-a-game/versioning","title":"Game Versioning","description":"Games often require frequent updates to keep users engaged, so Paima makes releasing new versions of games as easy as possible.","sidebar":"tutorialSidebar"},"home/setup/connecting-wallets":{"id":"home/setup/connecting-wallets","title":"Connect Wallet To Test","description":"When you deploy your game to production, of course you can use whatever wallet system you want to interact with your application.","sidebar":"tutorialSidebar"},"home/setup/environment-config-values":{"id":"home/setup/environment-config-values","title":"Environment Configuration Variables","description":"The following is a list of possible environment variables that can be configured for your project. These variables are read in the ENV class, located in @paima/utils/config.js. Please refer to that file for more information on default values.","sidebar":"tutorialSidebar"},"home/setup/how-to-use-paima-engine":{"id":"home/setup/how-to-use-paima-engine","title":"How To Use Paima Engine","description":"Paima Engine is as an all-in-one batteries-included executable which provides you with everything you need to get started writing your own trustless Web3 game.","sidebar":"tutorialSidebar"},"home/setup/paima-bacher":{"id":"home/setup/paima-bacher","title":"Paima Batcher","description":"Paima Batcher is the first key component of the Paima Whirlpool infrastructure which enables cross-chain play (via account abstraction layer), automatically paying transaction fees for users, and decreasing overall fees by batching many game inputs together.","sidebar":"tutorialSidebar"},"home/smart-contracts/evm/deploy-stateful-nft":{"id":"home/smart-contracts/evm/deploy-stateful-nft","title":"Deploying a Stateful NFT","description":"Paima Engine supports both standard NFT contracts (such as ERC721) and Paima Extended ERC721 NFT contracts for Stateful NFTs.","sidebar":"tutorialSidebar"},"home/smart-contracts/evm/generating-code":{"id":"home/smart-contracts/evm/generating-code","title":"Generating Code","description":"Once you\'ve configured all the contracts for your project, typically the next step is to generate bindings for them for your contract.","sidebar":"tutorialSidebar"},"home/smart-contracts/evm/introduction":{"id":"home/smart-contracts/evm/introduction","title":"Contract Configurations","description":"Paima templates leverage Hardhat for deploying and managing EVM contracts.","sidebar":"tutorialSidebar"},"home/smart-contracts/evm/paima-l2-contract":{"id":"home/smart-contracts/evm/paima-l2-contract","title":"Deploying the L2 Contract","description":"The Paima L2 Contract is built for developers to deploy their own game as an L2 which seamlessly works with Paima Engine.","sidebar":"tutorialSidebar"},"home/state-machine/creating-events/events/builtin-events":{"id":"home/state-machine/creating-events/events/builtin-events","title":"Built-in events","description":"Paima Engine comes with built-in events:","sidebar":"tutorialSidebar"},"home/state-machine/creating-events/events/general-interface":{"id":"home/state-machine/creating-events/events/general-interface","title":"General Interface","description":"Events are defined by two components:","sidebar":"tutorialSidebar"},"home/state-machine/creating-events/events/introduction":{"id":"home/state-machine/creating-events/events/introduction","title":"Introduction","description":"Typically, when using Paima, you are reacting to events created by underlying funnels. There are cases, however, where you want your rollup to react to events emitted by your rollup itself, and this case is supported through \\"ticks\\" (scheduled events). However, what if you want your rollup to emit events purely for external applications to connect to, as opposed to triggering a state transition in your rollup? This is the goal of event logs.","sidebar":"tutorialSidebar"},"home/state-machine/creating-events/events/low-level-api":{"id":"home/state-machine/creating-events/events/low-level-api","title":"Low-level API","description":"Under the hood, Paima Engine uses MQTT for its event system. MQTT was chosen because:","sidebar":"tutorialSidebar"},"home/state-machine/creating-events/introduction":{"id":"home/state-machine/creating-events/introduction","title":"Introduction","description":"Typically, when using Paima, you are reacting to events created by underlying funnels. There are cases, however, where you want your rollup itself to be emitting events.","sidebar":"tutorialSidebar"},"home/state-machine/creating-events/precompiles/introduction":{"id":"home/state-machine/creating-events/precompiles/introduction","title":"Setup","description":"Paima precompiles allow games to define specific addresses that are only part of","sidebar":"tutorialSidebar"},"home/state-machine/creating-events/timers-ticks":{"id":"home/state-machine/creating-events/timers-ticks","title":"Timers & Ticks","description":"Games heavily rely on passive time to trigger events (often based on ticks), such as limits on the length of a match or the duration of status effects. Paima supports these through a generic system called scheduledData that keeps track of which inputs (that conform to your app\'s grammar) to trigger at which block height (used instead of timestamps).","sidebar":"tutorialSidebar"},"home/state-machine/define-machine/base-format":{"id":"home/state-machine/define-machine/base-format","title":"Onchain Data Grammar","description":"To be a rollup, Paima state has to eventually be written to the L1. As a sovereign rollup, the way the data is stored is fairly simple (calling a contract function that simply emits its input as an event) and we provide a way to generate a grammar for this data.","sidebar":"tutorialSidebar"},"home/state-machine/define-machine/parallelism":{"id":"home/state-machine/define-machine/parallelism","title":"Sequential State Identifier","description":"By default, updates to Paima state may be applied in parallel. This is powerful as it allows different matches played by different players to be run in parallel. However, moves by players in the same lobby need to be made sequential.","sidebar":"tutorialSidebar"},"home/state-machine/define-machine/read-data":{"id":"home/state-machine/define-machine/read-data","title":"Reading L2 Data","description":"Creating the parser","sidebar":"tutorialSidebar"},"home/state-machine/direct-write/autosign":{"id":"home/state-machine/direct-write/autosign","title":"Auto-signing for apps","description":"Requiring users to manually sign every transaction for every game is a terrible user experience not just because it breaks immersion constantly, but because it\'s incompatible with games where users play with a controller (which is how many users play games)","sidebar":"tutorialSidebar"},"home/state-machine/direct-write/batched-mode":{"id":"home/state-machine/direct-write/batched-mode","title":"Batched mode","description":"To learn how to setup a batcher yourself, see the documentation here","sidebar":"tutorialSidebar"},"home/state-machine/direct-write/error-handling":{"id":"home/state-machine/direct-write/error-handling","title":"Error Handling","description":"Errors are unavoidable. Notably, be sure to take into accounts the following error types:","sidebar":"tutorialSidebar"},"home/state-machine/direct-write/replay-protection":{"id":"home/state-machine/direct-write/replay-protection","title":"Replay protection","description":"Given that games made with Paima Engine are technically \\"open\\" (meaning anyone can submit valid game input), one thing which we need to look out for is replay attacks. Replay attacks are situations classically in blockchains (but liable to any openly accessible state machine) where a previous valid input is resubmitted to the state machine/blockchain. Usually this is done by bad actors, and can cause various issues.","sidebar":"tutorialSidebar"},"home/state-machine/direct-write/write-data":{"id":"home/state-machine/direct-write/write-data","title":"Writing L2 Data","description":"Concise Builder","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/funnel-types/avail-block-funnel":{"id":"home/state-machine/react-to-events/funnel-types/avail-block-funnel","title":"Avail block funnel","description":"An analogous to the evm block funnel, but for Avail.","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/funnel-types/block-funnel":{"id":"home/state-machine/react-to-events/funnel-types/block-funnel","title":"EVM Block Funnel","description":"Block funnel is the most standard funnel type in Paima. It simply downloads the blocks from the RPC provider for the chain you are deploying to.","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/funnel-types/carp-funnel":{"id":"home/state-machine/react-to-events/funnel-types/carp-funnel","title":"Carp Funnel","description":"This funnel allows using Cardano Primitives leveraging Carp. It\'s enabled when either Cardano is specified in the settings or .env.","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/funnel-types/common-concepts/intro":{"id":"home/state-machine/react-to-events/funnel-types/common-concepts/intro","title":"Introduction to Paima Funnels","description":"paima-funnel is a core library which allows a consumer to initialize a chain funnel object which holds state regarding:","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/funnel-types/common-concepts/parallel-networks":{"id":"home/state-machine/react-to-events/funnel-types/common-concepts/parallel-networks","title":"Parallel funnels","description":"Merging state from multiple chains","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/funnel-types/configuration":{"id":"home/state-machine/react-to-events/funnel-types/configuration","title":"Configuring your Funnel","description":"On startup, Paima Engine will look for a file name either","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/funnel-types/mina-funnel":{"id":"home/state-machine/react-to-events/funnel-types/mina-funnel","title":"Mina funnel","description":"Configuration","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/funnel-types/parallel-avail-funnel":{"id":"home/state-machine/react-to-events/funnel-types/parallel-avail-funnel","title":"Avail Parallel funnel","description":"Note that there are two Avail funnels:","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/funnel-types/parallel-evm-funnel":{"id":"home/state-machine/react-to-events/funnel-types/parallel-evm-funnel","title":"EVM Parallel funnel","description":"This funnel processes the same primitives as the block funnel,","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/funnel-types/stable-tick-rate-funnel":{"id":"home/state-machine/react-to-events/funnel-types/stable-tick-rate-funnel","title":"Emulated Block Funnel (Stable Ticks)","description":"Not every blockchain has a predictable block time. This is especially true of L2s like Arbitrum that only create batches when there is at least 1 transaction to post to the L1","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/L2-quirks":{"id":"home/state-machine/react-to-events/L2-quirks","title":"L2 Quirks","description":"L2s often have different definitions for certain fields inside blocks. If you are deploying a game with Paima on top of one of these L2s, you need to understand the meaning of these values to avoid tipfalls. To facilitate these, we\'ve generated a table of the meaning of these values for the most commons L2s.","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/primitive-catalogue/cardano/cardano-mint-burn":{"id":"home/state-machine/react-to-events/primitive-catalogue/cardano/cardano-mint-burn","title":"Cardano Mint and Burn","description":"mint-burn}","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/primitive-catalogue/cardano/cardano-transfer":{"id":"home/state-machine/react-to-events/primitive-catalogue/cardano/cardano-transfer","title":"Cardano Transfer","description":"transfer}","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/primitive-catalogue/cardano/delayed-state":{"id":"home/state-machine/react-to-events/primitive-catalogue/cardano/delayed-state","title":"Delayed State","description":"Different blockchains may have different block times & finality, so trying to guarantee the state of blockchain A from blockchain B often requires timelock systems like projected data.","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/primitive-catalogue/cardano/projected-nft":{"id":"home/state-machine/react-to-events/primitive-catalogue/cardano/projected-nft","title":"Cardano Projected NFT","description":"Different blockchains may have different block times & finality, so trying to guarantee the state of blockchain A from blockchain B often requires timelock systems like projected data.","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/primitive-catalogue/cardano/stakepools":{"id":"home/state-machine/react-to-events/primitive-catalogue/cardano/stakepools","title":"Pool Delegation","description":"stake-delegation}","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/primitive-catalogue/create-your-own":{"id":"home/state-machine/react-to-events/primitive-catalogue/create-your-own","title":"Create your own Primitive","description":"Although custom Primitives do not always have to be added to Paima (people can just use the Generic EVM Primitive), adding a Primitive to Paima itself helps both with usability and with type inference.","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/primitive-catalogue/evm/dynamic-primitives":{"id":"home/state-machine/react-to-events/primitive-catalogue/evm/dynamic-primitives","title":"Dynamic primitives","description":"This primitive allows registering new extensions in runtime, without changing","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/primitive-catalogue/evm/ERC1155":{"id":"home/state-machine/react-to-events/primitive-catalogue/evm/ERC1155","title":"ERC1155 Primitives","description":"- ERC1155, keeping track of ERC1155 ownership for a specified ERC1155 contract at the currently processed blockheight","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/primitive-catalogue/evm/ERC20":{"id":"home/state-machine/react-to-events/primitive-catalogue/evm/ERC20","title":"ERC20 Primitives","description":"- ERC20, keeping track of wallet balances for a specified ERC20 contract;","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/primitive-catalogue/evm/ERC6551":{"id":"home/state-machine/react-to-events/primitive-catalogue/evm/ERC6551","title":"ERC6551 Primitives","description":"- ERC6551 Registry, keeping track of registrations of Token-Bound Accounts (TBAs) on the chain","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/primitive-catalogue/evm/ERC721":{"id":"home/state-machine/react-to-events/primitive-catalogue/evm/ERC721","title":"ERC721 Primitives","description":"- ERC721, keeping track of NFT ownership for a specified ERC721 contract at the currently processed blockheight, as well as generating scheduled inputs for newly minted NFTs;","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/primitive-catalogue/evm/Generic":{"id":"home/state-machine/react-to-events/primitive-catalogue/evm/Generic","title":"Generic Primitives","description":"- Generic, allowing you to provide an arbitrary contract ABI and the signature of the event to track, allowing you to collect data even from smart contracts not directly supported by the above types.","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/primitive-catalogue/introduction":{"id":"home/state-machine/react-to-events/primitive-catalogue/introduction","title":"Primitive Catalogue","description":"When writing an application, you often want to update your application based on common patterns (ex: token transfers). Instead of having to re-implement these patterns from scratch every time, Paima Engine can automatically do the heavy work for you via a feature called the Primitive Catalogue.","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/primitive-catalogue/meta/introduction":{"id":"home/state-machine/react-to-events/primitive-catalogue/meta/introduction","title":"Primitive List","description":"Meta primitives are primitives built into Paima Engine that are trigger by engine-related functionality.","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/primitive-catalogue/mina/generic":{"id":"home/state-machine/react-to-events/primitive-catalogue/mina/generic","title":"Generic Primitives","description":"- Generic, allowing you to provide an arbitrary contract address to track any event / action it emits, allowing you to collect data even from smart contract standards not directly supported by other primitives.","sidebar":"tutorialSidebar"},"home/state-machine/structure":{"id":"home/state-machine/structure","title":"L2 Block structure","description":"Rollups built with Paima Engine, similar to other blockchains, consist of blocks that contain transactions inside them. The key difference is that unlike typical chains, data that forms Paima blocks comes from underlying sources or deterministic self-defined transitions as opposed to user inputs intrinstic to the system itself.","sidebar":"tutorialSidebar"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/22dd74f7.3226136f.js b/assets/js/22dd74f7.3226136f.js new file mode 100644 index 00000000..aa422db4 --- /dev/null +++ b/assets/js/22dd74f7.3226136f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkpaima_engine_docs=self.webpackChunkpaima_engine_docs||[]).push([[4980],{5904:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"category","label":"Intro","collapsible":false,"collapsed":false,"items":[{"type":"link","label":"What is Paima Engine?","href":"/","docId":"home/intro/what-is-paima-engine","unlisted":false}]},{"type":"category","label":"Environment Setup","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"How To Use Paima Engine","href":"/home/setup/how-to-use-paima-engine","docId":"home/setup/how-to-use-paima-engine","unlisted":false},{"type":"link","label":"Environment Configuration Variables","href":"/home/setup/environment-config-values","docId":"home/setup/environment-config-values","unlisted":false},{"type":"link","label":"Connect Wallet To Test","href":"/home/setup/connecting-wallets","docId":"home/setup/connecting-wallets","unlisted":false},{"type":"link","label":"Paima Batcher","href":"/home/setup/paima-bacher","docId":"home/setup/paima-bacher","unlisted":false}]},{"type":"category","label":"Smart Contracts Management","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Solidity","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Contract Configurations","href":"/home/smart-contracts/evm/introduction","docId":"home/smart-contracts/evm/introduction","unlisted":false},{"type":"link","label":"Deploying the L2 Contract","href":"/home/smart-contracts/evm/paima-l2-contract","docId":"home/smart-contracts/evm/paima-l2-contract","unlisted":false},{"type":"link","label":"Deploying a Stateful NFT","href":"/home/smart-contracts/evm/deploy-stateful-nft","docId":"home/smart-contracts/evm/deploy-stateful-nft","unlisted":false},{"type":"link","label":"Generating Code","href":"/home/smart-contracts/evm/generating-code","docId":"home/smart-contracts/evm/generating-code","unlisted":false}]}]},{"type":"category","label":"State Machine (L2) Creation","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Define your State Machine","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Onchain Data Grammar","href":"/home/state-machine/define-machine/base-format","docId":"home/state-machine/define-machine/base-format","unlisted":false},{"type":"link","label":"Reading L2 Data","href":"/home/state-machine/define-machine/read-data","docId":"home/state-machine/define-machine/read-data","unlisted":false},{"type":"link","label":"Sequential State Identifier","href":"/home/state-machine/define-machine/parallelism","docId":"home/state-machine/define-machine/parallelism","unlisted":false}]},{"type":"category","label":"User \u2192 L2: Directly write state","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Writing L2 Data","href":"/home/state-machine/direct-write/write-data","docId":"home/state-machine/direct-write/write-data","unlisted":false},{"type":"link","label":"Error Handling","href":"/home/state-machine/direct-write/error-handling","docId":"home/state-machine/direct-write/error-handling","unlisted":false},{"type":"link","label":"Batched mode","href":"/home/state-machine/direct-write/batched-mode","docId":"home/state-machine/direct-write/batched-mode","unlisted":false},{"type":"link","label":"Replay protection","href":"/home/state-machine/direct-write/replay-protection","docId":"home/state-machine/direct-write/replay-protection","unlisted":false},{"type":"link","label":"Auto-signing for apps","href":"/home/state-machine/direct-write/autosign","docId":"home/state-machine/direct-write/autosign","unlisted":false}]},{"type":"category","label":"L1 \u2192 L2: Reacting To Events","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Funnels: fetch L1 data","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Common concepts","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction to Paima Funnels","href":"/home/state-machine/react-to-events/funnel-types/common-concepts/intro","docId":"home/state-machine/react-to-events/funnel-types/common-concepts/intro","unlisted":false},{"type":"link","label":"Parallel funnels","href":"/home/state-machine/react-to-events/funnel-types/common-concepts/parallel-networks","docId":"home/state-machine/react-to-events/funnel-types/common-concepts/parallel-networks","unlisted":false}]},{"type":"link","label":"Configuring your Funnel","href":"/home/state-machine/react-to-events/funnel-types/configuration","docId":"home/state-machine/react-to-events/funnel-types/configuration","unlisted":false},{"type":"link","label":"EVM Block Funnel","href":"/home/state-machine/react-to-events/funnel-types/block-funnel","docId":"home/state-machine/react-to-events/funnel-types/block-funnel","unlisted":false},{"type":"link","label":"EVM Parallel funnel","href":"/home/state-machine/react-to-events/funnel-types/parallel-evm-funnel","docId":"home/state-machine/react-to-events/funnel-types/parallel-evm-funnel","unlisted":false},{"type":"link","label":"Emulated Block Funnel (Stable Ticks)","href":"/home/state-machine/react-to-events/funnel-types/stable-tick-rate-funnel","docId":"home/state-machine/react-to-events/funnel-types/stable-tick-rate-funnel","unlisted":false},{"type":"link","label":"Carp Funnel","href":"/home/state-machine/react-to-events/funnel-types/carp-funnel","docId":"home/state-machine/react-to-events/funnel-types/carp-funnel","unlisted":false},{"type":"link","label":"Mina funnel","href":"/home/state-machine/react-to-events/funnel-types/mina-funnel","docId":"home/state-machine/react-to-events/funnel-types/mina-funnel","unlisted":false},{"type":"link","label":"Avail Parallel funnel","href":"/home/state-machine/react-to-events/funnel-types/parallel-avail-funnel","docId":"home/state-machine/react-to-events/funnel-types/parallel-avail-funnel","unlisted":false},{"type":"link","label":"Avail block funnel","href":"/home/state-machine/react-to-events/funnel-types/avail-block-funnel","docId":"home/state-machine/react-to-events/funnel-types/avail-block-funnel","unlisted":false},{"type":"link","label":"Midnight funnel","href":"/home/state-machine/react-to-events/funnel-types/midnight-funnel","docId":"home/state-machine/react-to-events/funnel-types/midnight-funnel","unlisted":false}]},{"type":"category","label":"Primitive Catalogue: react to L1 data","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Primitive Catalogue","href":"/home/state-machine/react-to-events/primitive-catalogue/introduction","docId":"home/state-machine/react-to-events/primitive-catalogue/introduction","unlisted":false},{"type":"category","label":"Meta Primitives","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Primitive List","href":"/home/state-machine/react-to-events/primitive-catalogue/meta/introduction","docId":"home/state-machine/react-to-events/primitive-catalogue/meta/introduction","unlisted":false}]},{"type":"category","label":"EVM Primitives","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"ERC20 Primitives","href":"/home/state-machine/react-to-events/primitive-catalogue/evm/ERC20","docId":"home/state-machine/react-to-events/primitive-catalogue/evm/ERC20","unlisted":false},{"type":"link","label":"ERC721 Primitives","href":"/home/state-machine/react-to-events/primitive-catalogue/evm/ERC721","docId":"home/state-machine/react-to-events/primitive-catalogue/evm/ERC721","unlisted":false},{"type":"link","label":"ERC6551 Primitives","href":"/home/state-machine/react-to-events/primitive-catalogue/evm/ERC6551","docId":"home/state-machine/react-to-events/primitive-catalogue/evm/ERC6551","unlisted":false},{"type":"link","label":"ERC1155 Primitives","href":"/home/state-machine/react-to-events/primitive-catalogue/evm/ERC1155","docId":"home/state-machine/react-to-events/primitive-catalogue/evm/ERC1155","unlisted":false},{"type":"link","label":"Dynamic primitives","href":"/home/state-machine/react-to-events/primitive-catalogue/evm/dynamic-primitives","docId":"home/state-machine/react-to-events/primitive-catalogue/evm/dynamic-primitives","unlisted":false},{"type":"link","label":"Generic Primitives","href":"/home/state-machine/react-to-events/primitive-catalogue/evm/Generic","docId":"home/state-machine/react-to-events/primitive-catalogue/evm/Generic","unlisted":false}]},{"type":"category","label":"Cardano Primitives","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Pool Delegation","href":"/home/state-machine/react-to-events/primitive-catalogue/cardano/stakepools","docId":"home/state-machine/react-to-events/primitive-catalogue/cardano/stakepools","unlisted":false},{"type":"link","label":"Delayed State","href":"/home/state-machine/react-to-events/primitive-catalogue/cardano/delayed-state","docId":"home/state-machine/react-to-events/primitive-catalogue/cardano/delayed-state","unlisted":false},{"type":"link","label":"Cardano Transfer","href":"/home/state-machine/react-to-events/primitive-catalogue/cardano/cardano-transfer","docId":"home/state-machine/react-to-events/primitive-catalogue/cardano/cardano-transfer","unlisted":false},{"type":"link","label":"Cardano Mint and Burn","href":"/home/state-machine/react-to-events/primitive-catalogue/cardano/cardano-mint-burn","docId":"home/state-machine/react-to-events/primitive-catalogue/cardano/cardano-mint-burn","unlisted":false},{"type":"link","label":"Cardano Projected NFT","href":"/home/state-machine/react-to-events/primitive-catalogue/cardano/projected-nft","docId":"home/state-machine/react-to-events/primitive-catalogue/cardano/projected-nft","unlisted":false}]},{"type":"category","label":"Mina Primitives","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Generic Primitives","href":"/home/state-machine/react-to-events/primitive-catalogue/mina/generic","docId":"home/state-machine/react-to-events/primitive-catalogue/mina/generic","unlisted":false}]},{"type":"category","label":"Midnight Primitives","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Contract state","href":"/home/state-machine/react-to-events/primitive-catalogue/midnight/contract-state","docId":"home/state-machine/react-to-events/primitive-catalogue/midnight/contract-state","unlisted":false}]},{"type":"link","label":"Create your own Primitive","href":"/home/state-machine/react-to-events/primitive-catalogue/create-your-own","docId":"home/state-machine/react-to-events/primitive-catalogue/create-your-own","unlisted":false}]},{"type":"link","label":"L2 Quirks","href":"/home/state-machine/react-to-events/L2-quirks","docId":"home/state-machine/react-to-events/L2-quirks","unlisted":false}]},{"type":"category","label":"L2 \u2192 L2: Triggering Events","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/home/state-machine/creating-events/introduction","docId":"home/state-machine/creating-events/introduction","unlisted":false},{"type":"link","label":"Timers & Ticks","href":"/home/state-machine/creating-events/timers-ticks","docId":"home/state-machine/creating-events/timers-ticks","unlisted":false},{"type":"category","label":"Log Events","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/home/state-machine/creating-events/events/introduction","docId":"home/state-machine/creating-events/events/introduction","unlisted":false},{"type":"link","label":"General Interface","href":"/home/state-machine/creating-events/events/general-interface","docId":"home/state-machine/creating-events/events/general-interface","unlisted":false},{"type":"link","label":"Built-in events","href":"/home/state-machine/creating-events/events/builtin-events","docId":"home/state-machine/creating-events/events/builtin-events","unlisted":false},{"type":"link","label":"Low-level API","href":"/home/state-machine/creating-events/events/low-level-api","docId":"home/state-machine/creating-events/events/low-level-api","unlisted":false}]},{"type":"category","label":"Paima Precompiles","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Setup","href":"/home/state-machine/creating-events/precompiles/introduction","docId":"home/state-machine/creating-events/precompiles/introduction","unlisted":false}]}]},{"type":"link","label":"L2 Block structure","href":"/home/state-machine/structure","docId":"home/state-machine/structure","unlisted":false}]},{"type":"category","label":"Game Node API","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Basic Concepts","href":"/home/game-node-api/introduction","docId":"home/game-node-api/introduction","unlisted":false},{"type":"link","label":"Achievements","href":"/home/game-node-api/achievements","docId":"home/game-node-api/achievements","unlisted":false}]},{"type":"link","label":"Randomness","href":"/home/randomness/","docId":"home/randomness/index","unlisted":false},{"type":"category","label":"Database Management","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/home/database-management/introduction","docId":"home/database-management/introduction","unlisted":false},{"type":"link","label":"Setting Up Database","href":"/home/database-management/setup","docId":"home/database-management/setup","unlisted":false},{"type":"link","label":"Database Snapshotting","href":"/home/database-management/snapshotting","docId":"home/database-management/snapshotting","unlisted":false},{"type":"link","label":"Data Migrations","href":"/home/database-management/migrations","docId":"home/database-management/migrations","unlisted":false},{"type":"link","label":"Updating Typescript Bindings","href":"/home/database-management/ts-bindings","docId":"home/database-management/ts-bindings","unlisted":false}]},{"type":"category","label":"Game Release Process","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Deploying Your Game Node","href":"/home/releasing-a-game/generate-build","docId":"home/releasing-a-game/generate-build","unlisted":false},{"type":"link","label":"Game Versioning","href":"/home/releasing-a-game/versioning","docId":"home/releasing-a-game/versioning","unlisted":false},{"type":"link","label":"Deploying a Game in Production","href":"/home/releasing-a-game/deployment","docId":"home/releasing-a-game/deployment","unlisted":false}]},{"type":"category","label":"Multichain Support","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"NFTs","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/home/multichain-support/nfts/introduction","docId":"home/multichain-support/nfts/introduction","unlisted":false},{"type":"category","label":"Projected NFTs","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Basics","href":"/home/multichain-support/nfts/projected-nfts/basics","docId":"home/multichain-support/nfts/projected-nfts/basics","unlisted":false},{"type":"link","label":"Cardano","href":"/home/multichain-support/nfts/projected-nfts/cardano","docId":"home/multichain-support/nfts/projected-nfts/cardano","unlisted":false},{"type":"link","label":"EVM","href":"/home/multichain-support/nfts/projected-nfts/evm","docId":"home/multichain-support/nfts/projected-nfts/evm","unlisted":false}]}]},{"type":"category","label":"Wallet Layer","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Basics","href":"/home/multichain-support/wallet-layer/introduction","docId":"home/multichain-support/wallet-layer/introduction","unlisted":false},{"type":"category","label":"Delegate Wallet","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/home/multichain-support/wallet-layer/delegate-wallet/introduction","docId":"home/multichain-support/wallet-layer/delegate-wallet/introduction","unlisted":false},{"type":"link","label":"Effect on Interfaces","href":"/home/multichain-support/wallet-layer/delegate-wallet/interfaces","docId":"home/multichain-support/wallet-layer/delegate-wallet/interfaces","unlisted":false},{"type":"link","label":"Integrate into your game","href":"/home/multichain-support/wallet-layer/delegate-wallet/integrate","docId":"home/multichain-support/wallet-layer/delegate-wallet/integrate","unlisted":false}]}]}]},{"type":"category","label":"Libraries","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"@paima/evm-contracts","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Introduction","href":"/home/libraries/evm-contracts/introduction","docId":"home/libraries/evm-contracts/introduction","unlisted":false},{"type":"category","label":"Solidity Contracts","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Generated Docs","href":"/home/libraries/evm-contracts/solidity/generated-docs","docId":"home/libraries/evm-contracts/solidity/generated-docs","unlisted":false}]},{"type":"link","label":"Hardhat task list","href":"/home/libraries/evm-contracts/hardhat-tasks","docId":"home/libraries/evm-contracts/hardhat-tasks","unlisted":false}]},{"type":"category","label":"cardano-contracts","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Aiken Contracts","href":"/home/libraries/cardano-contracts/contrats","docId":"home/libraries/cardano-contracts/contrats","unlisted":false}]}]},{"type":"category","label":"Paima Standards (PRCs)","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"prc-1\uff1aPaima Achievement Interface","href":"/home/PRCs/prc-1","docId":"home/PRCs/prc-1","unlisted":false},{"type":"link","label":"prc-2\uff1aPaima Hololocker Interface","href":"/home/PRCs/prc-2","docId":"home/PRCs/prc-2","unlisted":false},{"type":"link","label":"prc-3\uff1aPaima Inverse Projection Interface","href":"/home/PRCs/prc-3","docId":"home/PRCs/prc-3","unlisted":false},{"type":"link","label":"prc-5\uff1aPaima Inverse Projection Interface for ERC1155","href":"/home/PRCs/prc-5","docId":"home/PRCs/prc-5","unlisted":false}]},{"type":"link","label":"Paima Game Templates","href":"https://github.com/PaimaStudios/paima-game-templates"},{"type":"link","label":"Paima Engine Code","href":"https://github.com/PaimaStudios/paima-engine/"},{"type":"link","label":"Paima Studios Website","href":"https://paimastudios.com"}]},"docs":{"home/database-management/introduction":{"id":"home/database-management/introduction","title":"Introduction","description":"Although typically when you build an application with Paima all information lives onchain, querying data that lives on the blockchain is not always efficient. To enable more efficient management of this data, Paima uses PostgresDB for database management. This is a very common practice not only done by many dApps, but L1 chains themselves as well (for example, the Geth client for Ethereum uses LevelDB).","sidebar":"tutorialSidebar"},"home/database-management/migrations":{"id":"home/database-management/migrations","title":"Data Migrations","description":"Data Migrations allow game developers to add data to the database e.g., World Setup, NPC, Items, and other system tables.","sidebar":"tutorialSidebar"},"home/database-management/setup":{"id":"home/database-management/setup","title":"Setting Up Database","description":"Paima Engine requires you to deploy a Postgres database which will be used to store all state of your game node.","sidebar":"tutorialSidebar"},"home/database-management/snapshotting":{"id":"home/database-management/snapshotting","title":"Database Snapshotting","description":"Paima will periodically generate local snapshots of the database. This is useful for two main cases:","sidebar":"tutorialSidebar"},"home/database-management/ts-bindings":{"id":"home/database-management/ts-bindings","title":"Updating Typescript Bindings","description":"Paima leverages a tool called pgtyped to automatically generate Typescript bindings to your database queries. This can save a lot of time and helps avoid bugs by ensuring that your code always matches the database schema.","sidebar":"tutorialSidebar"},"home/game-node-api/achievements":{"id":"home/game-node-api/achievements","title":"Achievements","description":"[PRC-1] defines a standard API for Paima Engine game nodes to serve achievement","sidebar":"tutorialSidebar"},"home/game-node-api/introduction":{"id":"home/game-node-api/introduction","title":"Basic Concepts","description":"Games need to communicate not just with their UI, but also the rest of the web2 world that may want to interact with the game state. Paima exposes multiple different endpoints to help both with humans and tools to access the game state.","sidebar":"tutorialSidebar"},"home/intro/what-is-paima-engine":{"id":"home/intro/what-is-paima-engine","title":"What is Paima Engine?","description":"Paima is a Web3 Engine optimized for games, gamification and autonomous worlds that allows building web3 applications in just days","sidebar":"tutorialSidebar"},"home/libraries/cardano-contracts/contrats":{"id":"home/libraries/cardano-contracts/contrats","title":"Aiken Contracts","description":"Aiken contracts provided as part of Paima Engine.","sidebar":"tutorialSidebar"},"home/libraries/evm-contracts/hardhat-tasks":{"id":"home/libraries/evm-contracts/hardhat-tasks","title":"Hardhat task list","description":"Paima Hardhat tasks allow easily interacting with the Paima contracts through the CLI or other external tools.","sidebar":"tutorialSidebar"},"home/libraries/evm-contracts/introduction":{"id":"home/libraries/evm-contracts/introduction","title":"Introduction","description":"NPM package: @paima/evm-contracts","sidebar":"tutorialSidebar"},"home/libraries/evm-contracts/solidity/generated-docs":{"id":"home/libraries/evm-contracts/solidity/generated-docs","title":"Generated Docs","description":"Solidity contracts provided as part of Paima Engine.","sidebar":"tutorialSidebar"},"home/multichain-support/nfts/introduction":{"id":"home/multichain-support/nfts/introduction","title":"Introduction","description":"Paima Engine allows connecting NFTs to games without requiring an NFT bridge - even if the NFT lives on a different layer of the same chain, or on a different chain entirely.","sidebar":"tutorialSidebar"},"home/multichain-support/nfts/projected-nfts/basics":{"id":"home/multichain-support/nfts/projected-nfts/basics","title":"Basics","description":"The goal of cross-chain NFTs is to allow people to play with NFTs from one chain in a game hosted on a different chain without requiring any bridge of centralized solution.","sidebar":"tutorialSidebar"},"home/multichain-support/nfts/projected-nfts/cardano":{"id":"home/multichain-support/nfts/projected-nfts/cardano","title":"Cardano","description":"Block timing","sidebar":"tutorialSidebar"},"home/multichain-support/nfts/projected-nfts/evm":{"id":"home/multichain-support/nfts/projected-nfts/evm","title":"EVM","description":"You can find the specification for EVM-based projected NFTs here.","sidebar":"tutorialSidebar"},"home/multichain-support/wallet-layer/delegate-wallet/integrate":{"id":"home/multichain-support/wallet-layer/delegate-wallet/integrate","title":"Integrate into your game","description":"Here we share all the steps to integrate the wallet delegation system into a game","sidebar":"tutorialSidebar"},"home/multichain-support/wallet-layer/delegate-wallet/interfaces":{"id":"home/multichain-support/wallet-layer/delegate-wallet/interfaces","title":"Effect on Interfaces","description":"Enabling wallet delegation has implications on the interfaces of multiple different parts of your application.","sidebar":"tutorialSidebar"},"home/multichain-support/wallet-layer/delegate-wallet/introduction":{"id":"home/multichain-support/wallet-layer/delegate-wallet/introduction","title":"Introduction","description":"Delegate Wallet allows for a wallet address to be delegated to another wallet address.","sidebar":"tutorialSidebar"},"home/multichain-support/wallet-layer/introduction":{"id":"home/multichain-support/wallet-layer/introduction","title":"Basics","description":"Paima, although being EVM based, uses account abstraction to support wallets from multiple different cryptocurrencies. You can learn how to setup the batchers for account abstraction here.","sidebar":"tutorialSidebar"},"home/PRCs/prc-1":{"id":"home/PRCs/prc-1","title":"prc-1\uff1aPaima Achievement Interface","description":"Interface for sharing in-game achievements.","sidebar":"tutorialSidebar"},"home/PRCs/prc-2":{"id":"home/PRCs/prc-2","title":"prc-2\uff1aPaima Hololocker Interface","description":"Interface for projecting ERC721 tokens on EVM networks for usage in Paima","sidebar":"tutorialSidebar"},"home/PRCs/prc-3":{"id":"home/PRCs/prc-3","title":"prc-3\uff1aPaima Inverse Projection Interface","description":"Interface for inverse projection of game state into NFTs in other chains","sidebar":"tutorialSidebar"},"home/PRCs/prc-5":{"id":"home/PRCs/prc-5","title":"prc-5\uff1aPaima Inverse Projection Interface for ERC1155","description":"Interface for inverse projection of game state into ERC1155 tokens in other chains","sidebar":"tutorialSidebar"},"home/randomness/index":{"id":"home/randomness/index","title":"Randomness","description":"Randomness is an important part of many games and having a good source of randomness prevents users from abusing statistical trends to their own benefit.","sidebar":"tutorialSidebar"},"home/releasing-a-game/deployment":{"id":"home/releasing-a-game/deployment","title":"Deploying a Game in Production","description":"This guide will show you the steps to deploy the backend and frontend of your game, so players can connect from the internet and play and interact.","sidebar":"tutorialSidebar"},"home/releasing-a-game/generate-build":{"id":"home/releasing-a-game/generate-build","title":"Deploying Your Game Node","description":"If you wish to deploy your game on a server/move into a production environment, the following files are all that is needed for Paima Engine to run your game node:","sidebar":"tutorialSidebar"},"home/releasing-a-game/versioning":{"id":"home/releasing-a-game/versioning","title":"Game Versioning","description":"Games often require frequent updates to keep users engaged, so Paima makes releasing new versions of games as easy as possible.","sidebar":"tutorialSidebar"},"home/setup/connecting-wallets":{"id":"home/setup/connecting-wallets","title":"Connect Wallet To Test","description":"When you deploy your game to production, of course you can use whatever wallet system you want to interact with your application.","sidebar":"tutorialSidebar"},"home/setup/environment-config-values":{"id":"home/setup/environment-config-values","title":"Environment Configuration Variables","description":"The following is a list of possible environment variables that can be configured for your project. These variables are read in the ENV class, located in @paima/utils/config.js. Please refer to that file for more information on default values.","sidebar":"tutorialSidebar"},"home/setup/how-to-use-paima-engine":{"id":"home/setup/how-to-use-paima-engine","title":"How To Use Paima Engine","description":"Paima Engine is as an all-in-one batteries-included executable which provides you with everything you need to get started writing your own trustless Web3 game.","sidebar":"tutorialSidebar"},"home/setup/paima-bacher":{"id":"home/setup/paima-bacher","title":"Paima Batcher","description":"Paima Batcher is the first key component of the Paima Whirlpool infrastructure which enables cross-chain play (via account abstraction layer), automatically paying transaction fees for users, and decreasing overall fees by batching many game inputs together.","sidebar":"tutorialSidebar"},"home/smart-contracts/evm/deploy-stateful-nft":{"id":"home/smart-contracts/evm/deploy-stateful-nft","title":"Deploying a Stateful NFT","description":"Paima Engine supports both standard NFT contracts (such as ERC721) and Paima Extended ERC721 NFT contracts for Stateful NFTs.","sidebar":"tutorialSidebar"},"home/smart-contracts/evm/generating-code":{"id":"home/smart-contracts/evm/generating-code","title":"Generating Code","description":"Once you\'ve configured all the contracts for your project, typically the next step is to generate bindings for them for your contract.","sidebar":"tutorialSidebar"},"home/smart-contracts/evm/introduction":{"id":"home/smart-contracts/evm/introduction","title":"Contract Configurations","description":"Paima templates leverage Hardhat for deploying and managing EVM contracts.","sidebar":"tutorialSidebar"},"home/smart-contracts/evm/paima-l2-contract":{"id":"home/smart-contracts/evm/paima-l2-contract","title":"Deploying the L2 Contract","description":"The Paima L2 Contract is built for developers to deploy their own game as an L2 which seamlessly works with Paima Engine.","sidebar":"tutorialSidebar"},"home/state-machine/creating-events/events/builtin-events":{"id":"home/state-machine/creating-events/events/builtin-events","title":"Built-in events","description":"Paima Engine comes with built-in events:","sidebar":"tutorialSidebar"},"home/state-machine/creating-events/events/general-interface":{"id":"home/state-machine/creating-events/events/general-interface","title":"General Interface","description":"Events are defined by two components:","sidebar":"tutorialSidebar"},"home/state-machine/creating-events/events/introduction":{"id":"home/state-machine/creating-events/events/introduction","title":"Introduction","description":"Typically, when using Paima, you are reacting to events created by underlying funnels. There are cases, however, where you want your rollup to react to events emitted by your rollup itself, and this case is supported through \\"ticks\\" (scheduled events). However, what if you want your rollup to emit events purely for external applications to connect to, as opposed to triggering a state transition in your rollup? This is the goal of event logs.","sidebar":"tutorialSidebar"},"home/state-machine/creating-events/events/low-level-api":{"id":"home/state-machine/creating-events/events/low-level-api","title":"Low-level API","description":"Under the hood, Paima Engine uses MQTT for its event system. MQTT was chosen because:","sidebar":"tutorialSidebar"},"home/state-machine/creating-events/introduction":{"id":"home/state-machine/creating-events/introduction","title":"Introduction","description":"Typically, when using Paima, you are reacting to events created by underlying funnels. There are cases, however, where you want your rollup itself to be emitting events.","sidebar":"tutorialSidebar"},"home/state-machine/creating-events/precompiles/introduction":{"id":"home/state-machine/creating-events/precompiles/introduction","title":"Setup","description":"Paima precompiles allow games to define specific addresses that are only part of","sidebar":"tutorialSidebar"},"home/state-machine/creating-events/timers-ticks":{"id":"home/state-machine/creating-events/timers-ticks","title":"Timers & Ticks","description":"Games heavily rely on passive time to trigger events (often based on ticks), such as limits on the length of a match or the duration of status effects. Paima supports these through a generic system called scheduledData that keeps track of which inputs (that conform to your app\'s grammar) to trigger at which block height (used instead of timestamps).","sidebar":"tutorialSidebar"},"home/state-machine/define-machine/base-format":{"id":"home/state-machine/define-machine/base-format","title":"Onchain Data Grammar","description":"To be a rollup, Paima state has to eventually be written to the L1. As a sovereign rollup, the way the data is stored is fairly simple (calling a contract function that simply emits its input as an event) and we provide a way to generate a grammar for this data.","sidebar":"tutorialSidebar"},"home/state-machine/define-machine/parallelism":{"id":"home/state-machine/define-machine/parallelism","title":"Sequential State Identifier","description":"By default, updates to Paima state may be applied in parallel. This is powerful as it allows different matches played by different players to be run in parallel. However, moves by players in the same lobby need to be made sequential.","sidebar":"tutorialSidebar"},"home/state-machine/define-machine/read-data":{"id":"home/state-machine/define-machine/read-data","title":"Reading L2 Data","description":"Creating the parser","sidebar":"tutorialSidebar"},"home/state-machine/direct-write/autosign":{"id":"home/state-machine/direct-write/autosign","title":"Auto-signing for apps","description":"Requiring users to manually sign every transaction for every game is a terrible user experience not just because it breaks immersion constantly, but because it\'s incompatible with games where users play with a controller (which is how many users play games)","sidebar":"tutorialSidebar"},"home/state-machine/direct-write/batched-mode":{"id":"home/state-machine/direct-write/batched-mode","title":"Batched mode","description":"To learn how to setup a batcher yourself, see the documentation here","sidebar":"tutorialSidebar"},"home/state-machine/direct-write/error-handling":{"id":"home/state-machine/direct-write/error-handling","title":"Error Handling","description":"Errors are unavoidable. Notably, be sure to take into accounts the following error types:","sidebar":"tutorialSidebar"},"home/state-machine/direct-write/replay-protection":{"id":"home/state-machine/direct-write/replay-protection","title":"Replay protection","description":"Given that games made with Paima Engine are technically \\"open\\" (meaning anyone can submit valid game input), one thing which we need to look out for is replay attacks. Replay attacks are situations classically in blockchains (but liable to any openly accessible state machine) where a previous valid input is resubmitted to the state machine/blockchain. Usually this is done by bad actors, and can cause various issues.","sidebar":"tutorialSidebar"},"home/state-machine/direct-write/write-data":{"id":"home/state-machine/direct-write/write-data","title":"Writing L2 Data","description":"Concise Builder","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/funnel-types/avail-block-funnel":{"id":"home/state-machine/react-to-events/funnel-types/avail-block-funnel","title":"Avail block funnel","description":"An analogous to the evm block funnel, but for Avail.","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/funnel-types/block-funnel":{"id":"home/state-machine/react-to-events/funnel-types/block-funnel","title":"EVM Block Funnel","description":"Block funnel is the most standard funnel type in Paima. It simply downloads the blocks from the RPC provider for the chain you are deploying to.","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/funnel-types/carp-funnel":{"id":"home/state-machine/react-to-events/funnel-types/carp-funnel","title":"Carp Funnel","description":"This funnel allows using Cardano Primitives leveraging Carp. It\'s enabled when either Cardano is specified in the settings or .env.","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/funnel-types/common-concepts/intro":{"id":"home/state-machine/react-to-events/funnel-types/common-concepts/intro","title":"Introduction to Paima Funnels","description":"paima-funnel is a core library which allows a consumer to initialize a chain funnel object which holds state regarding:","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/funnel-types/common-concepts/parallel-networks":{"id":"home/state-machine/react-to-events/funnel-types/common-concepts/parallel-networks","title":"Parallel funnels","description":"Merging state from multiple chains","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/funnel-types/configuration":{"id":"home/state-machine/react-to-events/funnel-types/configuration","title":"Configuring your Funnel","description":"On startup, Paima Engine will look for a file name either","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/funnel-types/midnight-funnel":{"id":"home/state-machine/react-to-events/funnel-types/midnight-funnel","title":"Midnight funnel","description":"Paima can observe [Midnight] contract states.","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/funnel-types/mina-funnel":{"id":"home/state-machine/react-to-events/funnel-types/mina-funnel","title":"Mina funnel","description":"Configuration","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/funnel-types/parallel-avail-funnel":{"id":"home/state-machine/react-to-events/funnel-types/parallel-avail-funnel","title":"Avail Parallel funnel","description":"Note that there are two Avail funnels:","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/funnel-types/parallel-evm-funnel":{"id":"home/state-machine/react-to-events/funnel-types/parallel-evm-funnel","title":"EVM Parallel funnel","description":"This funnel processes the same primitives as the block funnel,","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/funnel-types/stable-tick-rate-funnel":{"id":"home/state-machine/react-to-events/funnel-types/stable-tick-rate-funnel","title":"Emulated Block Funnel (Stable Ticks)","description":"Not every blockchain has a predictable block time. This is especially true of L2s like Arbitrum that only create batches when there is at least 1 transaction to post to the L1","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/L2-quirks":{"id":"home/state-machine/react-to-events/L2-quirks","title":"L2 Quirks","description":"L2s often have different definitions for certain fields inside blocks. If you are deploying a game with Paima on top of one of these L2s, you need to understand the meaning of these values to avoid tipfalls. To facilitate these, we\'ve generated a table of the meaning of these values for the most commons L2s.","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/primitive-catalogue/cardano/cardano-mint-burn":{"id":"home/state-machine/react-to-events/primitive-catalogue/cardano/cardano-mint-burn","title":"Cardano Mint and Burn","description":"mint-burn}","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/primitive-catalogue/cardano/cardano-transfer":{"id":"home/state-machine/react-to-events/primitive-catalogue/cardano/cardano-transfer","title":"Cardano Transfer","description":"transfer}","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/primitive-catalogue/cardano/delayed-state":{"id":"home/state-machine/react-to-events/primitive-catalogue/cardano/delayed-state","title":"Delayed State","description":"Different blockchains may have different block times & finality, so trying to guarantee the state of blockchain A from blockchain B often requires timelock systems like projected data.","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/primitive-catalogue/cardano/projected-nft":{"id":"home/state-machine/react-to-events/primitive-catalogue/cardano/projected-nft","title":"Cardano Projected NFT","description":"Different blockchains may have different block times & finality, so trying to guarantee the state of blockchain A from blockchain B often requires timelock systems like projected data.","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/primitive-catalogue/cardano/stakepools":{"id":"home/state-machine/react-to-events/primitive-catalogue/cardano/stakepools","title":"Pool Delegation","description":"stake-delegation}","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/primitive-catalogue/create-your-own":{"id":"home/state-machine/react-to-events/primitive-catalogue/create-your-own","title":"Create your own Primitive","description":"Although custom Primitives do not always have to be added to Paima (people can just use the Generic EVM Primitive), adding a Primitive to Paima itself helps both with usability and with type inference.","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/primitive-catalogue/evm/dynamic-primitives":{"id":"home/state-machine/react-to-events/primitive-catalogue/evm/dynamic-primitives","title":"Dynamic primitives","description":"This primitive allows registering new extensions in runtime, without changing","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/primitive-catalogue/evm/ERC1155":{"id":"home/state-machine/react-to-events/primitive-catalogue/evm/ERC1155","title":"ERC1155 Primitives","description":"- ERC1155, keeping track of ERC1155 ownership for a specified ERC1155 contract at the currently processed blockheight","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/primitive-catalogue/evm/ERC20":{"id":"home/state-machine/react-to-events/primitive-catalogue/evm/ERC20","title":"ERC20 Primitives","description":"- ERC20, keeping track of wallet balances for a specified ERC20 contract;","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/primitive-catalogue/evm/ERC6551":{"id":"home/state-machine/react-to-events/primitive-catalogue/evm/ERC6551","title":"ERC6551 Primitives","description":"- ERC6551 Registry, keeping track of registrations of Token-Bound Accounts (TBAs) on the chain","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/primitive-catalogue/evm/ERC721":{"id":"home/state-machine/react-to-events/primitive-catalogue/evm/ERC721","title":"ERC721 Primitives","description":"- ERC721, keeping track of NFT ownership for a specified ERC721 contract at the currently processed blockheight, as well as generating scheduled inputs for newly minted NFTs;","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/primitive-catalogue/evm/Generic":{"id":"home/state-machine/react-to-events/primitive-catalogue/evm/Generic","title":"Generic Primitives","description":"- Generic, allowing you to provide an arbitrary contract ABI and the signature of the event to track, allowing you to collect data even from smart contracts not directly supported by the above types.","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/primitive-catalogue/introduction":{"id":"home/state-machine/react-to-events/primitive-catalogue/introduction","title":"Primitive Catalogue","description":"When writing an application, you often want to update your application based on common patterns (ex: token transfers). Instead of having to re-implement these patterns from scratch every time, Paima Engine can automatically do the heavy work for you via a feature called the Primitive Catalogue.","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/primitive-catalogue/meta/introduction":{"id":"home/state-machine/react-to-events/primitive-catalogue/meta/introduction","title":"Primitive List","description":"Meta primitives are primitives built into Paima Engine that are trigger by engine-related functionality.","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/primitive-catalogue/midnight/contract-state":{"id":"home/state-machine/react-to-events/primitive-catalogue/midnight/contract-state","title":"Contract state","description":"Midnight contracts have a publically-visible ledger state.","sidebar":"tutorialSidebar"},"home/state-machine/react-to-events/primitive-catalogue/mina/generic":{"id":"home/state-machine/react-to-events/primitive-catalogue/mina/generic","title":"Generic Primitives","description":"- Generic, allowing you to provide an arbitrary contract address to track any event / action it emits, allowing you to collect data even from smart contract standards not directly supported by other primitives.","sidebar":"tutorialSidebar"},"home/state-machine/structure":{"id":"home/state-machine/structure","title":"L2 Block structure","description":"Rollups built with Paima Engine, similar to other blockchains, consist of blocks that contain transactions inside them. The key difference is that unlike typical chains, data that forms Paima blocks comes from underlying sources or deterministic self-defined transitions as opposed to user inputs intrinstic to the system itself.","sidebar":"tutorialSidebar"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/42703ed8.4e1f0827.js b/assets/js/42703ed8.4e1f0827.js deleted file mode 100644 index adc3216f..00000000 --- a/assets/js/42703ed8.4e1f0827.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkpaima_engine_docs=self.webpackChunkpaima_engine_docs||[]).push([[4838],{3134:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>r,toc:()=>l});var n=i(5893),a=i(1151);const o={sidebar_position:2},s="Primitive Catalogue",r={id:"home/state-machine/react-to-events/primitive-catalogue/introduction",title:"Primitive Catalogue",description:"When writing an application, you often want to update your application based on common patterns (ex: token transfers). Instead of having to re-implement these patterns from scratch every time, Paima Engine can automatically do the heavy work for you via a feature called the Primitive Catalogue.",source:"@site/docs/home/100-state-machine/300-react-to-events/10-primitive-catalogue/1-introduction.md",sourceDirName:"home/100-state-machine/300-react-to-events/10-primitive-catalogue",slug:"/home/state-machine/react-to-events/primitive-catalogue/introduction",permalink:"/home/state-machine/react-to-events/primitive-catalogue/introduction",draft:!1,unlisted:!1,editUrl:"https://github.com/PaimaStudios/paima-engine-docs/tree/main/docs/home/100-state-machine/300-react-to-events/10-primitive-catalogue/1-introduction.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Avail block funnel",permalink:"/home/state-machine/react-to-events/funnel-types/avail-block-funnel"},next:{title:"Primitive List",permalink:"/home/state-machine/react-to-events/primitive-catalogue/meta/introduction"}},c={},l=[{value:"Configuration",id:"configuration",level:2},{value:"Accessing the collected data",id:"accessing-the-collected-data",level:2},{value:"Implicit ledger state",id:"implicit-ledger-state",level:3},{value:"Explicit ledger state",id:"explicit-ledger-state",level:3},{value:"Relation to funnels",id:"relation-to-funnels",level:2}];function h(e){const t={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"primitive-catalogue",children:"Primitive Catalogue"}),"\n",(0,n.jsxs)(t.p,{children:["When writing an application, you often want to update your application based on common patterns (ex: token transfers). Instead of having to re-implement these patterns from scratch every time, Paima Engine can automatically do the heavy work for you via a feature called the ",(0,n.jsx)(t.em,{children:"Primitive Catalogue"}),"."]}),"\n",(0,n.jsx)(t.p,{children:"Primitives allow you to tap into these standards trustlessly from multiple locations (such as various L1/L2s) to either for simple accounting purposes (ex: keep track of token ownership by accounts) or for triggering more update complex logic specified by your application's state machine. The goal is the Primitive Catalogue is to be the Library of Alexandria of primitives necessary to build onchain games."}),"\n",(0,n.jsx)("div",{style:{textAlign:"center"},children:(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{src:i(306).Z+"",width:"1024",height:"1024"})})}),"\n",(0,n.jsx)(t.p,{children:"The basic approach is simple: you set up a config file where you specify what contracts you want to collect data from, and Paima Engine automatically projects the emitted event data to your game node. In other words, when you then run your game node, it will automatically acquire the data for you along with a simple-to-use interface in the Paima SDK to allow you to access this data."}),"\n",(0,n.jsx)(t.p,{children:"Paima Engine currently supports many different kinds of primitives that you can find in this section of the documentation."}),"\n",(0,n.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,n.jsxs)(t.p,{children:["To specify which Primitives you are using for your game, you need to provide a configuration file. By default, a file named ",(0,n.jsx)(t.code,{children:"extensions.yml"})," in your root directory (same place as the ",(0,n.jsx)(t.code,{children:".env"})," file) is expected, but you may adjust this path using the ",(0,n.jsx)(t.code,{children:"CDE_CONFIG_PATH"})," environment variable. We recommend using ",(0,n.jsx)(t.code,{children:"extensions.$NETWORK.yml"})," to have different files depending on which network you're deploying your rollup to (ex: ",(0,n.jsx)(t.code,{children:"localhost"})," or ",(0,n.jsx)(t.code,{children:"mainnet"}),")"]}),"\n",(0,n.jsxs)(t.p,{children:["Here is an example ",(0,n.jsx)(t.code,{children:"extensions.yml"})," that you can copy paste into the root folder of your project:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-yaml",children:'extensions:\n - name: "My NFT Contract"\n type: "erc721"\n contractAddress: "0x01...EF"\n startBlockHeight: 7654321\n scheduledPrefix: "newnft"\n'})}),"\n",(0,n.jsx)(t.p,{children:"Note that extensions of different types often require slightly different fields \u2013 this will be described in their respective sections. However, here is a quick overview of the purposes of each field in the above config:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"name"}),": This field allows you to refer to this particular extension when using the Paima SDK functions for accessing the data it has collected;"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"type"}),": This specifies which extension you want to use, currently supporting values corresponding to the types of extensions described in later subsections (such as ",(0,n.jsx)(t.code,{children:"erc20"}),")"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"contractAddress"}),": The address of the contract to read data from;"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"startBlockHeight"}),": The starting blockheight from which you want the data to be read, zero by default; You should always set this to the block height that the smart contract was deployed on when in production."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"scheduledPrefix"}),": For extensions that trigger scheduled inputs (ERC721 and ERC20Deposit) specifies the prefix used with these scheduled inputs;"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"depositAddress"}),": This field is only used by the ERC20Deposit extension type to specify the target address of transactions you are interested in tracking."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"network"})," (see ",(0,n.jsx)(t.a,{href:"/home/state-machine/react-to-events/funnel-types/configuration",children:"here"})," to learn about handling primitives for multiple networks)"]}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"If you try to run your game node with an invalid or non-existent Primitive Catalogue config file, Paima Engine will report the problem to you and then carry on as if no Primitives were specified."}),"\n",(0,n.jsx)(t.h2,{id:"accessing-the-collected-data",children:"Accessing the collected data"}),"\n",(0,n.jsx)(t.p,{children:"Primitive data is written directly ledger state for your rollup including the underlying database. You can learn more about how to fetch the information aggregated either from your state machine or from the SQL queries by reading the documentation for the corresponding primitive."}),"\n",(0,n.jsx)(t.p,{children:"Each extension may provide data to your game in one (or both) of the two ways below:"}),"\n",(0,n.jsx)(t.h3,{id:"implicit-ledger-state",children:(0,n.jsx)(t.em,{children:"Implicit ledger state"})}),"\n",(0,n.jsx)(t.p,{children:"Some primitives work by collecting the data and saving it into your game database directly without necessarily triggering your STF directly. This is useful if you want to passively aggregate information for future use in your application (ex: keep track of user token balances) without having to write no-op STF handlers for all of them."}),"\n",(0,n.jsx)(t.p,{children:"In this case, the data can still be access through SQL queries directly for the corresponding database, and you can also access it through Javascript with opinionated APIs through primitive-specific utility functions."}),"\n",(0,n.jsx)(t.p,{children:"Note that, given these modify implicit ledger state, these will not modify the block hash of your L2 blocks (this is industry standard, in the same way that for other blockchains things like epoch transitions are not reflected in the block hash)"}),"\n",(0,n.jsx)(t.h3,{id:"explicit-ledger-state",children:(0,n.jsx)(t.em,{children:"Explicit ledger state"})}),"\n",(0,n.jsxs)(t.p,{children:["Some primitives work by creating ",(0,n.jsx)(t.a,{href:"/home/state-machine/creating-events/timers-ticks",children:"scheduling inputs"})," when certain events happen, which you can then react to in your ",(0,n.jsx)(t.a,{href:"../../../read-write-L2-state/read-data#stf-function",children:"state transition function"}),"."]}),"\n",(0,n.jsx)(t.p,{children:"The exact data passed to your STF depends on the extension, and you can read the documentation of each extension to learn more."}),"\n",(0,n.jsx)(t.p,{children:"Given these primitive trigger a state transition, they are also each given a transaction hash, and the call triggered by a scheduled input originating from a Primitive can also access:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"inputData.scheduledTxHash"}),": the original transaction hash that triggered this primitive"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"inputData.extensionName"}),": the primitive that triggered the STF (name specified in your config file)"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"caip2"}),": the ",(0,n.jsx)(t.a,{href:"https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-2.md",children:"caip2"})," id of the chain that triggered the event"]}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["The inputs are always scheduled either for the current blockheight (which enables them to be processed immediately, as scheduled inputs are processed before the state transition function is called), or, if they are triggered before the overall ",(0,n.jsx)(t.code,{children:"START_BLOCKHEIGHT"})," of the game node (specified in the ",(0,n.jsx)(t.code,{children:".env"})," file), in the so-called ",(0,n.jsx)(t.em,{children:"pre-sync"})," phase, they are scheduled for ",(0,n.jsx)(t.code,{children:"START_BLOCKHEIGHT + 1"})," (which is the first blockheight for which the state transition function is called). The scheduled inputs will always start with the prefix specified in the config as ",(0,n.jsx)(t.code,{children:"scheduledPrefix"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"relation-to-funnels",children:"Relation to funnels"}),"\n",(0,n.jsxs)(t.p,{children:["Paima ",(0,n.jsx)(t.a,{href:"/home/state-machine/react-to-events/funnel-types/common-concepts/intro",children:"funnels"})," are in charge of fetching data from various sources for your game, including data for the Primitive Catalogue which are stored as part of ",(0,n.jsx)(t.code,{children:"ChainData"}),". Depending on where the data you want to access comes from, you may have to add an extra funnel to your game."]})]})}function d(e={}){const{wrapper:t}={...(0,a.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},306:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/primitive-catalogue-334251ea9aa6d8d48b5f72c18c4530d9.png"},1151:(e,t,i)=>{i.d(t,{Z:()=>r,a:()=>s});var n=i(7294);const a={},o=n.createContext(a);function s(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/42703ed8.adbb02bf.js b/assets/js/42703ed8.adbb02bf.js new file mode 100644 index 00000000..7e0b2e01 --- /dev/null +++ b/assets/js/42703ed8.adbb02bf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkpaima_engine_docs=self.webpackChunkpaima_engine_docs||[]).push([[4838],{3134:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>r,toc:()=>h});var n=i(5893),a=i(1151);const o={sidebar_position:2},s="Primitive Catalogue",r={id:"home/state-machine/react-to-events/primitive-catalogue/introduction",title:"Primitive Catalogue",description:"When writing an application, you often want to update your application based on common patterns (ex: token transfers). Instead of having to re-implement these patterns from scratch every time, Paima Engine can automatically do the heavy work for you via a feature called the Primitive Catalogue.",source:"@site/docs/home/100-state-machine/300-react-to-events/10-primitive-catalogue/1-introduction.md",sourceDirName:"home/100-state-machine/300-react-to-events/10-primitive-catalogue",slug:"/home/state-machine/react-to-events/primitive-catalogue/introduction",permalink:"/home/state-machine/react-to-events/primitive-catalogue/introduction",draft:!1,unlisted:!1,editUrl:"https://github.com/PaimaStudios/paima-engine-docs/tree/main/docs/home/100-state-machine/300-react-to-events/10-primitive-catalogue/1-introduction.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Midnight funnel",permalink:"/home/state-machine/react-to-events/funnel-types/midnight-funnel"},next:{title:"Primitive List",permalink:"/home/state-machine/react-to-events/primitive-catalogue/meta/introduction"}},c={},h=[{value:"Configuration",id:"configuration",level:2},{value:"Accessing the collected data",id:"accessing-the-collected-data",level:2},{value:"Implicit ledger state",id:"implicit-ledger-state",level:3},{value:"Explicit ledger state",id:"explicit-ledger-state",level:3},{value:"Relation to funnels",id:"relation-to-funnels",level:2}];function l(e){const t={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h1,{id:"primitive-catalogue",children:"Primitive Catalogue"}),"\n",(0,n.jsxs)(t.p,{children:["When writing an application, you often want to update your application based on common patterns (ex: token transfers). Instead of having to re-implement these patterns from scratch every time, Paima Engine can automatically do the heavy work for you via a feature called the ",(0,n.jsx)(t.em,{children:"Primitive Catalogue"}),"."]}),"\n",(0,n.jsx)(t.p,{children:"Primitives allow you to tap into these standards trustlessly from multiple locations (such as various L1/L2s) to either for simple accounting purposes (ex: keep track of token ownership by accounts) or for triggering more update complex logic specified by your application's state machine. The goal is the Primitive Catalogue is to be the Library of Alexandria of primitives necessary to build onchain games."}),"\n",(0,n.jsx)("div",{style:{textAlign:"center"},children:(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{src:i(306).Z+"",width:"1024",height:"1024"})})}),"\n",(0,n.jsx)(t.p,{children:"The basic approach is simple: you set up a config file where you specify what contracts you want to collect data from, and Paima Engine automatically projects the emitted event data to your game node. In other words, when you then run your game node, it will automatically acquire the data for you along with a simple-to-use interface in the Paima SDK to allow you to access this data."}),"\n",(0,n.jsx)(t.p,{children:"Paima Engine currently supports many different kinds of primitives that you can find in this section of the documentation."}),"\n",(0,n.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,n.jsxs)(t.p,{children:["To specify which Primitives you are using for your game, you need to provide a configuration file. By default, a file named ",(0,n.jsx)(t.code,{children:"extensions.yml"})," in your root directory (same place as the ",(0,n.jsx)(t.code,{children:".env"})," file) is expected, but you may adjust this path using the ",(0,n.jsx)(t.code,{children:"CDE_CONFIG_PATH"})," environment variable. We recommend using ",(0,n.jsx)(t.code,{children:"extensions.$NETWORK.yml"})," to have different files depending on which network you're deploying your rollup to (ex: ",(0,n.jsx)(t.code,{children:"localhost"})," or ",(0,n.jsx)(t.code,{children:"mainnet"}),")"]}),"\n",(0,n.jsxs)(t.p,{children:["Here is an example ",(0,n.jsx)(t.code,{children:"extensions.yml"})," that you can copy paste into the root folder of your project:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-yaml",children:'extensions:\n - name: "My NFT Contract"\n type: "erc721"\n contractAddress: "0x01...EF"\n startBlockHeight: 7654321\n scheduledPrefix: "newnft"\n'})}),"\n",(0,n.jsx)(t.p,{children:"Note that extensions of different types often require slightly different fields \u2013 this will be described in their respective sections. However, here is a quick overview of the purposes of each field in the above config:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"name"}),": This field allows you to refer to this particular extension when using the Paima SDK functions for accessing the data it has collected;"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"type"}),": This specifies which extension you want to use, currently supporting values corresponding to the types of extensions described in later subsections (such as ",(0,n.jsx)(t.code,{children:"erc20"}),")"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"contractAddress"}),": The address of the contract to read data from;"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"startBlockHeight"}),": The starting blockheight from which you want the data to be read, zero by default; You should always set this to the block height that the smart contract was deployed on when in production."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"scheduledPrefix"}),": For extensions that trigger scheduled inputs (ERC721 and ERC20Deposit) specifies the prefix used with these scheduled inputs;"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"depositAddress"}),": This field is only used by the ERC20Deposit extension type to specify the target address of transactions you are interested in tracking."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"network"})," (see ",(0,n.jsx)(t.a,{href:"/home/state-machine/react-to-events/funnel-types/configuration",children:"here"})," to learn about handling primitives for multiple networks)"]}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"If you try to run your game node with an invalid or non-existent Primitive Catalogue config file, Paima Engine will report the problem to you and then carry on as if no Primitives were specified."}),"\n",(0,n.jsx)(t.h2,{id:"accessing-the-collected-data",children:"Accessing the collected data"}),"\n",(0,n.jsx)(t.p,{children:"Primitive data is written directly ledger state for your rollup including the underlying database. You can learn more about how to fetch the information aggregated either from your state machine or from the SQL queries by reading the documentation for the corresponding primitive."}),"\n",(0,n.jsx)(t.p,{children:"Each extension may provide data to your game in one (or both) of the two ways below:"}),"\n",(0,n.jsx)(t.h3,{id:"implicit-ledger-state",children:(0,n.jsx)(t.em,{children:"Implicit ledger state"})}),"\n",(0,n.jsx)(t.p,{children:"Some primitives work by collecting the data and saving it into your game database directly without necessarily triggering your STF directly. This is useful if you want to passively aggregate information for future use in your application (ex: keep track of user token balances) without having to write no-op STF handlers for all of them."}),"\n",(0,n.jsx)(t.p,{children:"In this case, the data can still be access through SQL queries directly for the corresponding database, and you can also access it through Javascript with opinionated APIs through primitive-specific utility functions."}),"\n",(0,n.jsx)(t.p,{children:"Note that, given these modify implicit ledger state, these will not modify the block hash of your L2 blocks (this is industry standard, in the same way that for other blockchains things like epoch transitions are not reflected in the block hash)"}),"\n",(0,n.jsx)(t.h3,{id:"explicit-ledger-state",children:(0,n.jsx)(t.em,{children:"Explicit ledger state"})}),"\n",(0,n.jsxs)(t.p,{children:["Some primitives work by creating ",(0,n.jsx)(t.a,{href:"/home/state-machine/creating-events/timers-ticks",children:"scheduling inputs"})," when certain events happen, which you can then react to in your ",(0,n.jsx)(t.a,{href:"../../../read-write-L2-state/read-data#stf-function",children:"state transition function"}),"."]}),"\n",(0,n.jsx)(t.p,{children:"The exact data passed to your STF depends on the extension, and you can read the documentation of each extension to learn more."}),"\n",(0,n.jsx)(t.p,{children:"Given these primitive trigger a state transition, they are also each given a transaction hash, and the call triggered by a scheduled input originating from a Primitive can also access:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"inputData.scheduledTxHash"}),": the original transaction hash that triggered this primitive"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"inputData.extensionName"}),": the primitive that triggered the STF (name specified in your config file)"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.code,{children:"caip2"}),": the ",(0,n.jsx)(t.a,{href:"https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-2.md",children:"caip2"})," id of the chain that triggered the event"]}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["The inputs are always scheduled either for the current blockheight (which enables them to be processed immediately, as scheduled inputs are processed before the state transition function is called), or, if they are triggered before the overall ",(0,n.jsx)(t.code,{children:"START_BLOCKHEIGHT"})," of the game node (specified in the ",(0,n.jsx)(t.code,{children:".env"})," file), in the so-called ",(0,n.jsx)(t.em,{children:"pre-sync"})," phase, they are scheduled for ",(0,n.jsx)(t.code,{children:"START_BLOCKHEIGHT + 1"})," (which is the first blockheight for which the state transition function is called). The scheduled inputs will always start with the prefix specified in the config as ",(0,n.jsx)(t.code,{children:"scheduledPrefix"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"relation-to-funnels",children:"Relation to funnels"}),"\n",(0,n.jsxs)(t.p,{children:["Paima ",(0,n.jsx)(t.a,{href:"/home/state-machine/react-to-events/funnel-types/common-concepts/intro",children:"funnels"})," are in charge of fetching data from various sources for your game, including data for the Primitive Catalogue which are stored as part of ",(0,n.jsx)(t.code,{children:"ChainData"}),". Depending on where the data you want to access comes from, you may have to add an extra funnel to your game."]})]})}function d(e={}){const{wrapper:t}={...(0,a.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},306:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/primitive-catalogue-334251ea9aa6d8d48b5f72c18c4530d9.png"},1151:(e,t,i)=>{i.d(t,{Z:()=>r,a:()=>s});var n=i(7294);const a={},o=n.createContext(a);function s(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/70fc18b7.93438106.js b/assets/js/70fc18b7.93438106.js new file mode 100644 index 00000000..05d71e41 --- /dev/null +++ b/assets/js/70fc18b7.93438106.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkpaima_engine_docs=self.webpackChunkpaima_engine_docs||[]).push([[8690],{95:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>h,frontMatter:()=>c,metadata:()=>r,toc:()=>d});var a=n(5893),i=n(1151);const c={},o="Contract state",r={id:"home/state-machine/react-to-events/primitive-catalogue/midnight/contract-state",title:"Contract state",description:"Midnight contracts have a publically-visible ledger state.",source:"@site/docs/home/100-state-machine/300-react-to-events/10-primitive-catalogue/40-midnight/10-contract-state.md",sourceDirName:"home/100-state-machine/300-react-to-events/10-primitive-catalogue/40-midnight",slug:"/home/state-machine/react-to-events/primitive-catalogue/midnight/contract-state",permalink:"/home/state-machine/react-to-events/primitive-catalogue/midnight/contract-state",draft:!1,unlisted:!1,editUrl:"https://github.com/PaimaStudios/paima-engine-docs/tree/main/docs/home/100-state-machine/300-react-to-events/10-primitive-catalogue/40-midnight/10-contract-state.md",tags:[],version:"current",sidebarPosition:10,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Generic Primitives",permalink:"/home/state-machine/react-to-events/primitive-catalogue/mina/generic"},next:{title:"Create your own Primitive",permalink:"/home/state-machine/react-to-events/primitive-catalogue/create-your-own"}},s={},d=[{value:"Example configuration",id:"example-configuration",level:3},{value:"Concise format",id:"concise-format",level:2},{value:"JSON format",id:"json-format",level:2}];function m(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",pre:"pre",...(0,i.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.h1,{id:"contract-state",children:"Contract state"}),"\n",(0,a.jsxs)(t.p,{children:["Midnight contracts have a publically-visible ",(0,a.jsx)(t.a,{href:"https://docs.midnight.network/develop/reference/compact/lang-ref#ledger-state-types",children:"ledger state"}),".\nOnce a ",(0,a.jsx)(t.a,{href:"/home/state-machine/react-to-events/funnel-types/midnight-funnel",children:"Midnight funnel"})," is configured,\nthe ",(0,a.jsx)(t.code,{children:"midnight-contract-state"})," primitive can be used to observe updates to this state."]}),"\n",(0,a.jsx)(t.h3,{id:"example-configuration",children:"Example configuration"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-yaml",children:'extensions:\n - name: "my midnight extension"\n type: midnight-contract-state\n network: MidnightLocal\n contractAddress: 010000c39bbf7ba21aa4c953e08412a8ff7ab1fab4a7cc11a00ad20eeb8050965ee838\n startBlockHeight: 0\n scheduledPrefix: myaction\n'})}),"\n",(0,a.jsx)(t.h2,{id:"concise-format",children:"Concise format"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{children:"midnightContractState = myaction|data\n"})}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-ts",children:"const midnightContractState: ParserRecord = {\n data: PaimaParser.Json(),\n};\n"})}),"\n",(0,a.jsx)(t.h2,{id:"json-format",children:"JSON format"}),"\n",(0,a.jsxs)(t.p,{children:["The JSON blob within the concise payload conforms to the ",(0,a.jsx)(t.a,{href:"https://docs.midnight.network/develop/reference/midnight-api/onchain-runtime/type-aliases/EncodedStateValue",children:"EncodedStateValue"})," type."]})]})}function h(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(m,{...e})}):m(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>r,a:()=>o});var a=n(7294);const i={},c=a.createContext(i);function o(e){const t=a.useContext(c);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),a.createElement(c.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/903c50e1.810365ef.js b/assets/js/903c50e1.810365ef.js deleted file mode 100644 index 20c71468..00000000 --- a/assets/js/903c50e1.810365ef.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkpaima_engine_docs=self.webpackChunkpaima_engine_docs||[]).push([[2180],{3773:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>r,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var a=n(5893),l=n(1151);const o={},i="Avail block funnel",s={id:"home/state-machine/react-to-events/funnel-types/avail-block-funnel",title:"Avail block funnel",description:"An analogous to the evm block funnel, but for Avail.",source:"@site/docs/home/100-state-machine/300-react-to-events/3-funnel-types/800-avail-block-funnel.md",sourceDirName:"home/100-state-machine/300-react-to-events/3-funnel-types",slug:"/home/state-machine/react-to-events/funnel-types/avail-block-funnel",permalink:"/home/state-machine/react-to-events/funnel-types/avail-block-funnel",draft:!1,unlisted:!1,editUrl:"https://github.com/PaimaStudios/paima-engine-docs/tree/main/docs/home/100-state-machine/300-react-to-events/3-funnel-types/800-avail-block-funnel.md",tags:[],version:"current",sidebarPosition:800,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Avail Parallel funnel",permalink:"/home/state-machine/react-to-events/funnel-types/parallel-avail-funnel"},next:{title:"Primitive Catalogue",permalink:"/home/state-machine/react-to-events/primitive-catalogue/introduction"}},r={},c=[{value:"Configuration",id:"configuration",level:2},{value:"Conceptually",id:"conceptually",level:2}];function h(e){const t={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",li:"li",mermaid:"mermaid",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,l.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.h1,{id:"avail-block-funnel",children:"Avail block funnel"}),"\n",(0,a.jsxs)(t.p,{children:["An analogous to the ",(0,a.jsx)(t.a,{href:"/home/state-machine/react-to-events/funnel-types/block-funnel",children:"evm block funnel"}),", but for Avail."]}),"\n",(0,a.jsx)(t.p,{children:"Note that there are two Avail funnels:"}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.a,{href:"/home/state-machine/react-to-events/funnel-types/avail-block-funnel",children:"Avail block funnel"})," for when Avail is the main chain for your app"]}),"\n",(0,a.jsxs)(t.li,{children:[(0,a.jsx)(t.a,{href:"/home/state-machine/react-to-events/funnel-types/parallel-avail-funnel",children:"Avail parallel funnel"})," for when a different chain is the main chain for your app, and you sync Avail in parallel for extra data"]}),"\n"]}),"\n",(0,a.jsx)(t.h2,{id:"configuration",children:"Configuration"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-yaml",children:"Avail:\n type: avail-main\n lightClient: 'http://localhost:7007'\n rpc: ws://127.0.0.1:9944\n funnelBlockGroupSize: 100\n presyncStepSize: 1000\n genesisHash: \"0xdd60847daa1119ecc9bdd006b140087737ac03d260ce110ecd7cb33cf721be35\"\n"})}),"\n",(0,a.jsx)(t.h2,{id:"conceptually",children:"Conceptually"}),"\n",(0,a.jsx)(t.p,{children:"This funnel will do the following:"}),"\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsxs)(t.li,{children:["Get the latest block number with verified data availability from the Avail light client through the ",(0,a.jsx)(t.code,{children:"v2/status"})," endpoint. ",(0,a.jsx)(t.a,{href:"https://docs.availproject.org/docs/operate-a-node/run-a-light-client/light-client-api-reference#v2status",children:"Reference"}),"."]}),"\n",(0,a.jsxs)(t.li,{children:["Fetch a group of ",(0,a.jsx)(t.code,{children:"funnelBlockGroupSize"})," headers (or less if we're already at the tip)."]}),"\n",(0,a.jsxs)(t.li,{children:["Fetch all the submitted data from the Avail light client through the ",(0,a.jsx)(t.code,{children:"v2/blocks/{block_number}/data"})," endpoint (",(0,a.jsx)(t.a,{href:"https://docs.availproject.org/docs/operate-a-node/run-a-light-client/light-client-api-reference#v2blocksblock_numberdatafieldsdataextrinsic",children:"reference"}),"). This means full blocks are never processed, because the light client can filter by app id."]}),"\n",(0,a.jsxs)(t.li,{children:["Use ",(0,a.jsx)(t.code,{children:"TextDecoder"})," to read the binary input as text, and continue with the Paima concise format processing."]}),"\n"]}),"\n",(0,a.jsxs)(t.p,{children:["Note that this means we download blocks from Avail ",(0,a.jsx)(t.em,{children:"even if"})," they are not related to our rollup, as we use the Avail blockchain as the clock for our application."]}),"\n",(0,a.jsx)(t.p,{children:"Here is a visual representation of the flow:"}),"\n",(0,a.jsx)(t.mermaid,{value:"stateDiagram-v2\n [*] --\x3e RequestBlockNumber\n \n RequestBlockNumber: Request latest block number (v2/status)\n \n fork_state: fetch remote data for the next group of block numbers\n RequestBlockNumber --\x3e fork_state\n state fork_state <>\n\n GetBlockHeaders: Get block headers (v2/blocks/${block}/header)\n\n GetBlockData: Get block content (v2/blocks/{block}/data)\n\n fork_state --\x3e GetBlockHeaders\n fork_state --\x3e GetBlockData\n \n join_state: merge remote data together\n state join_state <>\n \n GetBlockHeaders --\x3e join_state\n GetBlockData --\x3e join_state\n \n join_state --\x3e ProcessData\n \n ProcessData: Decode block data into rollup data format\n\n ProcessData --\x3e FeedDataToSM\n \n FeedDataToSM: Feed data to user-specified state machine\n \n FeedDataToSM --\x3e [*]"})]})}function d(e={}){const{wrapper:t}={...(0,l.a)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}},1151:(e,t,n)=>{n.d(t,{Z:()=>s,a:()=>i});var a=n(7294);const l={},o=a.createContext(l);function i(e){const t=a.useContext(o);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:i(e.components),a.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/903c50e1.ec70265c.js b/assets/js/903c50e1.ec70265c.js new file mode 100644 index 00000000..14a88832 --- /dev/null +++ b/assets/js/903c50e1.ec70265c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkpaima_engine_docs=self.webpackChunkpaima_engine_docs||[]).push([[2180],{3773:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>r});var a=t(5893),l=t(1151);const o={},i="Avail block funnel",s={id:"home/state-machine/react-to-events/funnel-types/avail-block-funnel",title:"Avail block funnel",description:"An analogous to the evm block funnel, but for Avail.",source:"@site/docs/home/100-state-machine/300-react-to-events/3-funnel-types/800-avail-block-funnel.md",sourceDirName:"home/100-state-machine/300-react-to-events/3-funnel-types",slug:"/home/state-machine/react-to-events/funnel-types/avail-block-funnel",permalink:"/home/state-machine/react-to-events/funnel-types/avail-block-funnel",draft:!1,unlisted:!1,editUrl:"https://github.com/PaimaStudios/paima-engine-docs/tree/main/docs/home/100-state-machine/300-react-to-events/3-funnel-types/800-avail-block-funnel.md",tags:[],version:"current",sidebarPosition:800,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Avail Parallel funnel",permalink:"/home/state-machine/react-to-events/funnel-types/parallel-avail-funnel"},next:{title:"Midnight funnel",permalink:"/home/state-machine/react-to-events/funnel-types/midnight-funnel"}},c={},r=[{value:"Configuration",id:"configuration",level:2},{value:"Conceptually",id:"conceptually",level:2}];function h(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",li:"li",mermaid:"mermaid",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,l.a)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h1,{id:"avail-block-funnel",children:"Avail block funnel"}),"\n",(0,a.jsxs)(n.p,{children:["An analogous to the ",(0,a.jsx)(n.a,{href:"/home/state-machine/react-to-events/funnel-types/block-funnel",children:"evm block funnel"}),", but for Avail."]}),"\n",(0,a.jsx)(n.p,{children:"Note that there are two Avail funnels:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"/home/state-machine/react-to-events/funnel-types/avail-block-funnel",children:"Avail block funnel"})," for when Avail is the main chain for your app"]}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"/home/state-machine/react-to-events/funnel-types/parallel-avail-funnel",children:"Avail parallel funnel"})," for when a different chain is the main chain for your app, and you sync Avail in parallel for extra data"]}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:"Avail:\n type: avail-main\n lightClient: 'http://localhost:7007'\n rpc: ws://127.0.0.1:9944\n funnelBlockGroupSize: 100\n presyncStepSize: 1000\n genesisHash: \"0xdd60847daa1119ecc9bdd006b140087737ac03d260ce110ecd7cb33cf721be35\"\n"})}),"\n",(0,a.jsx)(n.h2,{id:"conceptually",children:"Conceptually"}),"\n",(0,a.jsx)(n.p,{children:"This funnel will do the following:"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:["Get the latest block number with verified data availability from the Avail light client through the ",(0,a.jsx)(n.code,{children:"v2/status"})," endpoint. ",(0,a.jsx)(n.a,{href:"https://docs.availproject.org/docs/operate-a-node/run-a-light-client/light-client-api-reference#v2status",children:"Reference"}),"."]}),"\n",(0,a.jsxs)(n.li,{children:["Fetch a group of ",(0,a.jsx)(n.code,{children:"funnelBlockGroupSize"})," headers (or less if we're already at the tip)."]}),"\n",(0,a.jsxs)(n.li,{children:["Fetch all the submitted data from the Avail light client through the ",(0,a.jsx)(n.code,{children:"v2/blocks/{block_number}/data"})," endpoint (",(0,a.jsx)(n.a,{href:"https://docs.availproject.org/docs/operate-a-node/run-a-light-client/light-client-api-reference#v2blocksblock_numberdatafieldsdataextrinsic",children:"reference"}),"). This means full blocks are never processed, because the light client can filter by app id."]}),"\n",(0,a.jsxs)(n.li,{children:["Use ",(0,a.jsx)(n.code,{children:"TextDecoder"})," to read the binary input as text, and continue with the Paima concise format processing."]}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["Note that this means we download blocks from Avail ",(0,a.jsx)(n.em,{children:"even if"})," they are not related to our rollup, as we use the Avail blockchain as the clock for our application."]}),"\n",(0,a.jsx)(n.p,{children:"Here is a visual representation of the flow:"}),"\n",(0,a.jsx)(n.mermaid,{value:"stateDiagram-v2\n [*] --\x3e RequestBlockNumber\n \n RequestBlockNumber: Request latest block number (v2/status)\n \n fork_state: fetch remote data for the next group of block numbers\n RequestBlockNumber --\x3e fork_state\n state fork_state <>\n\n GetBlockHeaders: Get block headers (v2/blocks/${block}/header)\n\n GetBlockData: Get block content (v2/blocks/{block}/data)\n\n fork_state --\x3e GetBlockHeaders\n fork_state --\x3e GetBlockData\n \n join_state: merge remote data together\n state join_state <>\n \n GetBlockHeaders --\x3e join_state\n GetBlockData --\x3e join_state\n \n join_state --\x3e ProcessData\n \n ProcessData: Decode block data into rollup data format\n\n ProcessData --\x3e FeedDataToSM\n \n FeedDataToSM: Feed data to user-specified state machine\n \n FeedDataToSM --\x3e [*]"})]})}function d(e={}){const{wrapper:n}={...(0,l.a)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>s,a:()=>i});var a=t(7294);const l={},o=a.createContext(l);function i(e){const n=a.useContext(o);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:i(e.components),a.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/95d5be9b.1a909ff3.js b/assets/js/95d5be9b.1a909ff3.js new file mode 100644 index 00000000..b9367fdc --- /dev/null +++ b/assets/js/95d5be9b.1a909ff3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkpaima_engine_docs=self.webpackChunkpaima_engine_docs||[]).push([[8516],{5692:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>l});var i=t(5893),s=t(1151);const r={},a="Midnight funnel",o={id:"home/state-machine/react-to-events/funnel-types/midnight-funnel",title:"Midnight funnel",description:"Paima can observe [Midnight] contract states.",source:"@site/docs/home/100-state-machine/300-react-to-events/3-funnel-types/900-midnight-funnel.md",sourceDirName:"home/100-state-machine/300-react-to-events/3-funnel-types",slug:"/home/state-machine/react-to-events/funnel-types/midnight-funnel",permalink:"/home/state-machine/react-to-events/funnel-types/midnight-funnel",draft:!1,unlisted:!1,editUrl:"https://github.com/PaimaStudios/paima-engine-docs/tree/main/docs/home/100-state-machine/300-react-to-events/3-funnel-types/900-midnight-funnel.md",tags:[],version:"current",sidebarPosition:900,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Avail block funnel",permalink:"/home/state-machine/react-to-events/funnel-types/avail-block-funnel"},next:{title:"Primitive Catalogue",permalink:"/home/state-machine/react-to-events/primitive-catalogue/introduction"}},c={},l=[{value:"Configuration",id:"configuration",level:2},{value:"Primitives",id:"primitives",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"midnight-funnel",children:"Midnight funnel"}),"\n",(0,i.jsxs)(n.p,{children:["Paima can observe ",(0,i.jsx)(n.a,{href:"https://docs.midnight.network/learn/introduction/what-is-midnight/",children:"Midnight"})," contract states."]}),"\n",(0,i.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,i.jsx)(n.p,{children:"Public devnet example:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"MidnightDevnet:\n type: midnight\n networkId: 1\n indexer: https://indexer.devnet.midnight.network/api/v1/graphql\n # indexerWS: wss://indexer.devnet.midnight.network/api/v1/graphql/ws\n confirmationDepth: 2\n"})}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://docs.midnight.network/develop/tutorial/creating/local-testing#run-the-dapp-in-standalone-mode",children:"Standalone network"})," example:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"MidnightLocal:\n type: midnight\n networkId: 0\n indexer: http://localhost:32807/api/v1/graphql\n # indexerWS: ws://localhost:32807/api/v1/graphql/ws\n confirmationDepth: 0\n"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"indexer"})," should be the full URL to the ",(0,i.jsx)(n.a,{href:"https://docs.midnight.network/develop/reference/midnight-api/pubsub-indexer/#queries",children:"indexer GraphQL"})," endpoint."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"indexerWs"})," can be used to manually override the ",(0,i.jsx)(n.a,{href:"https://docs.midnight.network/develop/reference/midnight-api/pubsub-indexer/#subscriptions",children:"indexer WebSocket"})," URL if the default is insufficient."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"networkId"})," must match the network ID encoded into proofs on the chain associated with the indexer.","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"0"})," for a standalone test node."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"1"})," for the public devnet."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"confirmationDepth"})," controls how many Midnight blocks behind the tip will be processed.","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Setting this to 0 will increase latency because the funnel will always have to wait for the newest Midnight block even if its timestamp would be higher than that of the main block being processed."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"primitives",children:"Primitives"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/home/state-machine/react-to-events/primitive-catalogue/midnight/contract-state",children:"Contract state"})}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,s.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>o,a:()=>a});var i=t(7294);const s={},r=i.createContext(s);function a(e){const n=i.useContext(r);return i.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(s):e.components||s:a(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d811efd8.34bc9ef4.js b/assets/js/d811efd8.34bc9ef4.js deleted file mode 100644 index ec571a2e..00000000 --- a/assets/js/d811efd8.34bc9ef4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkpaima_engine_docs=self.webpackChunkpaima_engine_docs||[]).push([[655],{8605:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>r,metadata:()=>c,toc:()=>m});var i=t(5893),a=t(1151);const r={},o="Generic Primitives",c={id:"home/state-machine/react-to-events/primitive-catalogue/mina/generic",title:"Generic Primitives",description:"- Generic, allowing you to provide an arbitrary contract address to track any event / action it emits, allowing you to collect data even from smart contract standards not directly supported by other primitives.",source:"@site/docs/home/100-state-machine/300-react-to-events/10-primitive-catalogue/30-mina/10-generic.md",sourceDirName:"home/100-state-machine/300-react-to-events/10-primitive-catalogue/30-mina",slug:"/home/state-machine/react-to-events/primitive-catalogue/mina/generic",permalink:"/home/state-machine/react-to-events/primitive-catalogue/mina/generic",draft:!1,unlisted:!1,editUrl:"https://github.com/PaimaStudios/paima-engine-docs/tree/main/docs/home/100-state-machine/300-react-to-events/10-primitive-catalogue/30-mina/10-generic.md",tags:[],version:"current",sidebarPosition:10,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Cardano Projected NFT",permalink:"/home/state-machine/react-to-events/primitive-catalogue/cardano/projected-nft"},next:{title:"Create your own Primitive",permalink:"/home/state-machine/react-to-events/primitive-catalogue/create-your-own"}},s={},m=[{value:"Generic",id:"generic",level:2},{value:"Example configuration",id:"example-configuration",level:3},{value:"Concise format",id:"concise-format",level:2}];function l(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"generic-primitives",children:"Generic Primitives"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"#generic",children:"Generic"}),", allowing you to provide an arbitrary contract address to track any ",(0,i.jsx)(n.a,{href:"https://docs.minaprotocol.com/zkapps/o1js/fetch-events-and-actions",children:"event / action"})," it emits, allowing you to collect data even from smart contract standards not directly supported by other primitives."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"generic",children:"Generic"}),"\n",(0,i.jsx)(n.p,{children:"Generic primitives allow getting all of the events or all the actions provided the address of a zkApp."}),"\n",(0,i.jsx)(n.h3,{id:"example-configuration",children:"Example configuration"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:'extensions:\n - name: "mina generic event"\n type: "mina-event-generic"\n address: "B62qoP3xe9zZJmBDacZPL8roBivpVKhAiDNtpAM9RCAW579JnJo1ZL2"\n startBlockHeight: 0\n scheduledPrefix: "mge"\n network: \'Mina\'\n - name: "mina generic action"\n type: "mina-action-generic"\n address: "B62qoP3xe9zZJmBDacZPL8roBivpVKhAiDNtpAM9RCAW579JnJo1ZL2"\n startBlockHeight: 0\n scheduledPrefix: "mga"\n network: \'Mina\'\n'})}),"\n",(0,i.jsx)(n.h2,{id:"concise-format",children:"Concise format"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"minaGenericEvent = mge|data\nminaGenericAction = mga|data\n"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-ts",children:"const minaGenericEvent: ParserRecord = {\n data: PaimaParser.Json(),\n};\n\nconst minaGenericAction: ParserRecord = {\n data: PaimaParser.Json(),\n};\n"})})]})}function d(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>c,a:()=>o});var i=t(7294);const a={},r=i.createContext(a);function o(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d811efd8.525cc799.js b/assets/js/d811efd8.525cc799.js new file mode 100644 index 00000000..37e1e274 --- /dev/null +++ b/assets/js/d811efd8.525cc799.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkpaima_engine_docs=self.webpackChunkpaima_engine_docs||[]).push([[655],{8605:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>o,default:()=>l,frontMatter:()=>r,metadata:()=>c,toc:()=>m});var i=t(5893),a=t(1151);const r={},o="Generic Primitives",c={id:"home/state-machine/react-to-events/primitive-catalogue/mina/generic",title:"Generic Primitives",description:"- Generic, allowing you to provide an arbitrary contract address to track any event / action it emits, allowing you to collect data even from smart contract standards not directly supported by other primitives.",source:"@site/docs/home/100-state-machine/300-react-to-events/10-primitive-catalogue/30-mina/10-generic.md",sourceDirName:"home/100-state-machine/300-react-to-events/10-primitive-catalogue/30-mina",slug:"/home/state-machine/react-to-events/primitive-catalogue/mina/generic",permalink:"/home/state-machine/react-to-events/primitive-catalogue/mina/generic",draft:!1,unlisted:!1,editUrl:"https://github.com/PaimaStudios/paima-engine-docs/tree/main/docs/home/100-state-machine/300-react-to-events/10-primitive-catalogue/30-mina/10-generic.md",tags:[],version:"current",sidebarPosition:10,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Cardano Projected NFT",permalink:"/home/state-machine/react-to-events/primitive-catalogue/cardano/projected-nft"},next:{title:"Contract state",permalink:"/home/state-machine/react-to-events/primitive-catalogue/midnight/contract-state"}},s={},m=[{value:"Generic",id:"generic",level:2},{value:"Example configuration",id:"example-configuration",level:3},{value:"Concise format",id:"concise-format",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"generic-primitives",children:"Generic Primitives"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"#generic",children:"Generic"}),", allowing you to provide an arbitrary contract address to track any ",(0,i.jsx)(n.a,{href:"https://docs.minaprotocol.com/zkapps/o1js/fetch-events-and-actions",children:"event / action"})," it emits, allowing you to collect data even from smart contract standards not directly supported by other primitives."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"generic",children:"Generic"}),"\n",(0,i.jsx)(n.p,{children:"Generic primitives allow getting all of the events or all the actions provided the address of a zkApp."}),"\n",(0,i.jsx)(n.h3,{id:"example-configuration",children:"Example configuration"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:'extensions:\n - name: "mina generic event"\n type: "mina-event-generic"\n address: "B62qoP3xe9zZJmBDacZPL8roBivpVKhAiDNtpAM9RCAW579JnJo1ZL2"\n startBlockHeight: 0\n scheduledPrefix: "mge"\n network: \'Mina\'\n - name: "mina generic action"\n type: "mina-action-generic"\n address: "B62qoP3xe9zZJmBDacZPL8roBivpVKhAiDNtpAM9RCAW579JnJo1ZL2"\n startBlockHeight: 0\n scheduledPrefix: "mga"\n network: \'Mina\'\n'})}),"\n",(0,i.jsx)(n.h2,{id:"concise-format",children:"Concise format"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"minaGenericEvent = mge|data\nminaGenericAction = mga|data\n"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-ts",children:"const minaGenericEvent: ParserRecord = {\n data: PaimaParser.Json(),\n};\n\nconst minaGenericAction: ParserRecord = {\n data: PaimaParser.Json(),\n};\n"})})]})}function l(e={}){const{wrapper:n}={...(0,a.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>c,a:()=>o});var i=t(7294);const a={},r=i.createContext(a);function o(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/main.97165982.js b/assets/js/main.97165982.js deleted file mode 100644 index dbd0017c..00000000 --- a/assets/js/main.97165982.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see main.97165982.js.LICENSE.txt */ -(self.webpackChunkpaima_engine_docs=self.webpackChunkpaima_engine_docs||[]).push([[179],{1728:(e,t,n)=>{"use strict";function r(e){var t,n,a="";if("string"==typeof e||"number"==typeof e)a+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;ta});const a=function(){for(var e,t,n=0,a="";n{"use strict";n.d(t,{Z:()=>p});n(7294);var r=n(8356),a=n.n(r),o=n(6887);const i={"017231c8":[()=>n.e(9187).then(n.bind(n,3768)),"@site/docs/home/100-state-machine/325-creating-events/100-events/110-builtin-events.md",3768],"0205cee1":[()=>n.e(6266).then(n.bind(n,9369)),"@site/docs/home/100-state-machine/300-react-to-events/10-primitive-catalogue/2000-create-your-own.md",9369],"0337d15a":[()=>n.e(7160).then(n.bind(n,5813)),"@site/docs/home/100-state-machine/300-react-to-events/3-funnel-types/600-mina-funnel.mdx",5813],"04103e85":[()=>n.e(6730).then(n.bind(n,6425)),"@site/docs/home/1-setup/4-environment-config-values.md",6425],"0710f3de":[()=>n.e(9746).then(n.bind(n,6910)),"@site/docs/home/100-state-machine/300-react-to-events/10-primitive-catalogue/20-cardano/40-cardano-mint-burn.md",6910],"07bff4a9":[()=>n.e(4786).then(n.bind(n,54)),"@site/docs/home/100-state-machine/325-creating-events/1-introduction.md",54],"09fe6904":[()=>n.e(1002).then(n.bind(n,401)),"@site/docs/home/100-state-machine/300-react-to-events/10-primitive-catalogue/10-evm/6-ERC1155.md",401],"0f317bf9":[()=>n.e(8899).then(n.bind(n,2452)),"@site/docs/home/100-state-machine/300-react-to-events/3-funnel-types/400-stable-tick-rate-funnel.mdx",2452],"138e0e15":[()=>n.e(9524).then(n.t.bind(n,536,19)),"@generated/@easyops-cn/docusaurus-search-local/default/__plugin.json",536],"14a3ce3e":[()=>n.e(4425).then(n.bind(n,9263)),"@site/docs/home/500-database-management/300-snapshotting.md",9263],"177ebf49":[()=>n.e(4105).then(n.bind(n,3381)),"@site/docs/home/100-state-machine/100-define-machine/10-read-data.md",3381],17896441:[()=>Promise.all([n.e(532),n.e(2312),n.e(7918)]).then(n.bind(n,4281)),"@theme/DocItem",4281],"1a4e3797":[()=>Promise.all([n.e(532),n.e(7920)]).then(n.bind(n,2027)),"@theme/SearchPage",2027],"22dd74f7":[()=>n.e(4980).then(n.t.bind(n,5904,19)),"@generated/docusaurus-plugin-content-docs/default/p/index-466.json",5904],"238a268c":[()=>n.e(9222).then(n.bind(n,6835)),"@site/docs/home/700-multichain-support/2-wallet-layer/1-introduction.mdx",6835],"2485616c":[()=>n.e(2264).then(n.bind(n,5559)),"@site/docs/home/700-multichain-support/1-nfts/1-introduction.mdx",5559],"27ec1384":[()=>n.e(1685).then(n.bind(n,1288)),"@site/docs/home/20000-PRCs/prc-3.md",1288],"283269cf":[()=>n.e(4537).then(n.bind(n,5141)),"@site/docs/home/100-state-machine/200-direct-write/400-batched-mode.md",5141],"2a57241f":[()=>n.e(1566).then(n.bind(n,4196)),"@site/docs/home/700-multichain-support/1-nfts/2-projected-nfts/2-cardano.md",4196],"39d42adf":[()=>n.e(3104).then(n.bind(n,9445)),"@site/docs/home/50-smart-contracts/200-evm/200-paima-l2-contract.md",9445],"3e9a914b":[()=>n.e(1573).then(n.bind(n,1129)),"@site/docs/home/100-state-machine/300-react-to-events/3-funnel-types/500-carp-funnel.md",1129],"42703ed8":[()=>n.e(4838).then(n.bind(n,3134)),"@site/docs/home/100-state-machine/300-react-to-events/10-primitive-catalogue/1-introduction.md",3134],"43c2639d":[()=>n.e(109).then(n.bind(n,4793)),"@site/docs/home/100-state-machine/300-react-to-events/3-funnel-types/300-block-funnel.md",4793],"4a045d69":[()=>n.e(4778).then(n.bind(n,3220)),"@site/docs/home/100-state-machine/300-react-to-events/10-primitive-catalogue/10-evm/200-dynamic-primitives.md",3220],"4a94c5b9":[()=>n.e(8361).then(n.bind(n,4911)),"@site/docs/home/10000-libraries/100-evm-contracts/300-hardhat-tasks.md",4911],"4c68101a":[()=>n.e(2322).then(n.bind(n,4271)),"@site/docs/home/100-state-machine/200-direct-write/300-error-handling.md",4271],"4c85fb4d":[()=>n.e(5151).then(n.bind(n,9044)),"@site/docs/home/100-state-machine/300-react-to-events/10-primitive-catalogue/20-cardano/10-stakepools.md",9044],"4fed49a9":[()=>n.e(1513).then(n.bind(n,5272)),"@site/docs/home/100-state-machine/325-creating-events/50-timers-ticks.md",5272],51632284:[()=>n.e(5955).then(n.bind(n,5239)),"@site/docs/home/100-state-machine/325-creating-events/100-events/100-general-interface.md",5239],"558eb34d":[()=>Promise.all([n.e(532),n.e(2312),n.e(2112)]).then(n.bind(n,4352)),"@site/docs/home/10000-libraries/200-cardano-contracts/100-contrats.mdx",4352],"5e95c892":[()=>n.e(9661).then(n.bind(n,1892)),"@theme/DocsRoot",1892],"6a06fb5c":[()=>n.e(2692).then(n.bind(n,8438)),"@site/docs/home/700-multichain-support/2-wallet-layer/100-delegate-wallet/1-introduction.mdx",8438],"6e4bc4ac":[()=>n.e(5031).then(n.bind(n,2979)),"@site/docs/home/600-releasing-a-game/3-deployment.md",2979],"71654c3b":[()=>n.e(2277).then(n.bind(n,2712)),"@site/docs/home/100-state-machine/325-creating-events/300-precompiles/100-introduction.md",2712],"74a06df9":[()=>n.e(5753).then(n.bind(n,9152)),"@site/docs/home/600-releasing-a-game/1-generate-build.md",9152],76048346:[()=>n.e(4675).then(n.bind(n,8402)),"@site/docs/home/0-intro/0-what-is-paima-engine.md",8402],"7bf026b6":[()=>n.e(7452).then(n.bind(n,217)),"@site/docs/home/100-state-machine/300-react-to-events/3-funnel-types/1-common-concepts/1-intro.md",217],"7ed7e275":[()=>n.e(1034).then(n.bind(n,9421)),"@site/docs/home/100-state-machine/325-creating-events/100-events/200-low-level-api.md",9421],"8042f79e":[()=>n.e(7380).then(n.bind(n,376)),"@site/docs/home/100-state-machine/100-define-machine/200-parallelism.md",376],"8d646370":[()=>n.e(1991).then(n.bind(n,2471)),"@site/docs/home/100-state-machine/325-creating-events/100-events/1-introduction.md",2471],"8eabe20c":[()=>n.e(5434).then(n.bind(n,2474)),"@site/docs/home/350-game-node-api/2-achievements.md",2474],"903c50e1":[()=>n.e(2180).then(n.bind(n,3773)),"@site/docs/home/100-state-machine/300-react-to-events/3-funnel-types/800-avail-block-funnel.md",3773],"93b3fbb3":[()=>n.e(479).then(n.bind(n,6625)),"@site/docs/home/100-state-machine/300-react-to-events/10-primitive-catalogue/10-evm/3-ERC721.md",6625],"94b38fb2":[()=>n.e(1768).then(n.bind(n,4553)),"@site/docs/home/500-database-management/200-setup.md",4553],"9566962c":[()=>n.e(51).then(n.bind(n,2517)),"@site/docs/home/100-state-machine/300-react-to-events/3-funnel-types/350-parallel-evm-funnel.mdx",2517],"95ad9355":[()=>n.e(1107).then(n.bind(n,892)),"@site/docs/home/700-multichain-support/1-nfts/2-projected-nfts/1-basics.mdx",892],"97ba3c0e":[()=>n.e(6303).then(n.bind(n,751)),"@site/docs/home/700-multichain-support/2-wallet-layer/100-delegate-wallet/3-interfaces.mdx",751],"984945ec":[()=>n.e(2524).then(n.bind(n,6432)),"@site/docs/home/100-state-machine/300-react-to-events/10-primitive-catalogue/20-cardano/30-cardano-transfer.md",6432],"9893d9f7":[()=>n.e(5165).then(n.bind(n,9593)),"@site/docs/home/20000-PRCs/prc-5.md",9593],"9a804797":[()=>n.e(6096).then(n.bind(n,7570)),"@site/docs/home/100-state-machine/300-react-to-events/10-primitive-catalogue/20-cardano/20-delayed-state.md",7570],"9b2dba92":[()=>n.e(4473).then(n.bind(n,7249)),"@site/docs/home/1-setup/10-connecting-wallets.md",7249],"9e4d28d8":[()=>n.e(7241).then(n.bind(n,8105)),"@site/docs/home/50-smart-contracts/200-evm/400-generating-code.md",8105],"9f6354d7":[()=>n.e(4888).then(n.bind(n,6476)),"@site/docs/home/50-smart-contracts/200-evm/300-deploy-stateful-nft.md",6476],a7bd4aaa:[()=>n.e(8518).then(n.bind(n,8564)),"@theme/DocVersionRoot",8564],a94703ab:[()=>Promise.all([n.e(532),n.e(4368)]).then(n.bind(n,2674)),"@theme/DocRoot",2674],aa90b64c:[()=>n.e(3052).then(n.bind(n,520)),"@site/docs/home/100-state-machine/1000-structure.md",520],aae12c5c:[()=>n.e(6299).then(n.bind(n,5394)),"@site/docs/home/100-state-machine/200-direct-write/20-write-data.md",5394],ab41c636:[()=>n.e(3164).then(n.bind(n,965)),"@site/docs/home/500-database-management/100-introduction.md",965],aba21aa0:[()=>n.e(3629).then(n.t.bind(n,1765,19)),"@generated/docusaurus-plugin-content-docs/default/__plugin.json",1765],abbecba4:[()=>n.e(5651).then(n.bind(n,6853)),"@site/docs/home/1-setup/1-how-to-use-paima-engine.md",6853],ad558597:[()=>n.e(8366).then(n.bind(n,3428)),"@site/docs/home/100-state-machine/300-react-to-events/10-primitive-catalogue/10-evm/2-ERC20.md",3428],afaed507:[()=>n.e(6957).then(n.bind(n,307)),"@site/docs/home/100-state-machine/300-react-to-events/3-funnel-types/1-common-concepts/2-parallel-networks.mdx",307],b3d087d3:[()=>n.e(874).then(n.bind(n,1081)),"@site/docs/home/20000-PRCs/prc-2.md",1081],b4ad4667:[()=>n.e(5126).then(n.bind(n,9988)),"@site/docs/home/100-state-machine/200-direct-write/500-replay-protection.md",9988],b97c32ab:[()=>n.e(8290).then(n.bind(n,6031)),"@site/docs/home/100-state-machine/300-react-to-events/100-L2-quirks.md",6031],ba4a5ca9:[()=>n.e(5650).then(n.bind(n,1199)),"@site/docs/home/500-database-management/400-migrations.md",1199],bb3229a5:[()=>n.e(4471).then(n.bind(n,861)),"@site/docs/home/100-state-machine/300-react-to-events/10-primitive-catalogue/10-evm/4-ERC6551.md",861],bbf2ceff:[()=>Promise.all([n.e(532),n.e(7440)]).then(n.bind(n,1131)),"@site/docs/home/10000-libraries/100-evm-contracts/200-solidity/200-generated-docs.mdx",1131],bf86fd9d:[()=>n.e(3973).then(n.bind(n,1458)),"@site/docs/home/100-state-machine/300-react-to-events/10-primitive-catalogue/20-cardano/50-projected-nft.md",1458],c94d43dd:[()=>n.e(544).then(n.bind(n,8363)),"@site/docs/home/100-state-machine/200-direct-write/600-autosign.md",8363],ca8632a3:[()=>n.e(4927).then(n.bind(n,5811)),"@site/docs/home/100-state-machine/300-react-to-events/3-funnel-types/200-configuration.md",5811],cd18a899:[()=>n.e(8688).then(n.bind(n,7489)),"@site/docs/home/100-state-machine/100-define-machine/1-base-format.md",7489],d3c9a13b:[()=>n.e(5780).then(n.bind(n,9681)),"@site/docs/home/400-randomness/index.md",9681],d4f81001:[()=>n.e(7361).then(n.bind(n,2228)),"@site/docs/home/600-releasing-a-game/2-versioning.md",2228],d5b93c44:[()=>n.e(5728).then(n.bind(n,8171)),"@site/docs/home/500-database-management/500-ts-bindings.md",8171],d66933b8:[()=>n.e(3801).then(n.bind(n,1612)),"@site/docs/home/700-multichain-support/1-nfts/2-projected-nfts/3-evm.md",1612],d811efd8:[()=>n.e(655).then(n.bind(n,8605)),"@site/docs/home/100-state-machine/300-react-to-events/10-primitive-catalogue/30-mina/10-generic.md",8605],de82a7f3:[()=>n.e(9064).then(n.bind(n,3364)),"@site/docs/home/20000-PRCs/prc-1.md",3364],de8c59a0:[()=>n.e(4077).then(n.bind(n,8196)),"@site/docs/home/100-state-machine/300-react-to-events/10-primitive-catalogue/10-evm/999-Generic.md",8196],df625df2:[()=>n.e(2534).then(n.bind(n,7077)),"@site/docs/home/1-setup/20-paima-bacher.md",7077],e3280e5e:[()=>n.e(9444).then(n.bind(n,515)),"@site/docs/home/50-smart-contracts/200-evm/100-introduction.md",515],e9f2a58c:[()=>n.e(7458).then(n.bind(n,7510)),"@site/docs/home/350-game-node-api/1-introduction.md",7510],eaecfe53:[()=>n.e(4113).then(n.bind(n,3639)),"@site/docs/home/700-multichain-support/2-wallet-layer/100-delegate-wallet/200-integrate.mdx",3639],eafebc7e:[()=>n.e(3584).then(n.bind(n,1480)),"@site/docs/home/10000-libraries/100-evm-contracts/1-introduction.md",1480],eb8c02a4:[()=>n.e(1892).then(n.bind(n,9623)),"@site/docs/home/100-state-machine/300-react-to-events/10-primitive-catalogue/5-meta/100-introduction.md",9623],eebe83ee:[()=>n.e(7756).then(n.bind(n,1127)),"@site/docs/home/100-state-machine/300-react-to-events/3-funnel-types/700-parallel-avail-funnel.md",1127]};var s=n(5893);function l(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,s.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,s.jsx)("p",{children:String(t)}),(0,s.jsx)("div",{children:(0,s.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,s.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,s.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,s.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,s.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var c=n(9670),u=n(226);function d(e,t){if("*"===e)return a()({loading:l,loader:()=>n.e(1772).then(n.bind(n,1772)),modules:["@theme/NotFound"],webpack:()=>[1772],render(e,t){const n=e.default;return(0,s.jsx)(u.z,{value:{plugin:{name:"native",id:"default"}},children:(0,s.jsx)(n,{...t})})}});const r=o[`${e}-${t}`],d={},p=[],f=[],h=(0,c.Z)(r);return Object.entries(h).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],p.push(r[1]),f.push(r[2]))})),a().Map({loading:l,loader:d,modules:p,webpack:()=>f,render(t,n){const a=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const o=r.default;if(!o)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof o&&"function"!=typeof o||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{o[e]=r[e]}));let i=a;const s=n.split(".");s.slice(0,-1).forEach((e=>{i=i[e]})),i[s[s.length-1]]=o}));const o=a.__comp;delete a.__comp;const i=a.__context;delete a.__context;const l=a.__props;return delete a.__props,(0,s.jsx)(u.z,{value:i,children:(0,s.jsx)(o,{...a,...l,...n})})}})}const p=[{path:"/search",component:d("/search","822"),exact:!0},{path:"/",component:d("/","08a"),routes:[{path:"/",component:d("/","e14"),routes:[{path:"/",component:d("/","0c9"),routes:[{path:"/home/database-management/introduction",component:d("/home/database-management/introduction","7e2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/database-management/migrations",component:d("/home/database-management/migrations","d22"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/database-management/setup",component:d("/home/database-management/setup","1ae"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/database-management/snapshotting",component:d("/home/database-management/snapshotting","6ae"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/database-management/ts-bindings",component:d("/home/database-management/ts-bindings","e6b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/game-node-api/achievements",component:d("/home/game-node-api/achievements","94f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/game-node-api/introduction",component:d("/home/game-node-api/introduction","268"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/libraries/cardano-contracts/contrats",component:d("/home/libraries/cardano-contracts/contrats","e00"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/libraries/evm-contracts/hardhat-tasks",component:d("/home/libraries/evm-contracts/hardhat-tasks","33a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/libraries/evm-contracts/introduction",component:d("/home/libraries/evm-contracts/introduction","2c8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/libraries/evm-contracts/solidity/generated-docs",component:d("/home/libraries/evm-contracts/solidity/generated-docs","466"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/multichain-support/nfts/introduction",component:d("/home/multichain-support/nfts/introduction","0b6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/multichain-support/nfts/projected-nfts/basics",component:d("/home/multichain-support/nfts/projected-nfts/basics","276"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/multichain-support/nfts/projected-nfts/cardano",component:d("/home/multichain-support/nfts/projected-nfts/cardano","50c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/multichain-support/nfts/projected-nfts/evm",component:d("/home/multichain-support/nfts/projected-nfts/evm","f9e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/multichain-support/wallet-layer/delegate-wallet/integrate",component:d("/home/multichain-support/wallet-layer/delegate-wallet/integrate","c83"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/multichain-support/wallet-layer/delegate-wallet/interfaces",component:d("/home/multichain-support/wallet-layer/delegate-wallet/interfaces","d91"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/multichain-support/wallet-layer/delegate-wallet/introduction",component:d("/home/multichain-support/wallet-layer/delegate-wallet/introduction","8b7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/multichain-support/wallet-layer/introduction",component:d("/home/multichain-support/wallet-layer/introduction","cd5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/PRCs/prc-1",component:d("/home/PRCs/prc-1","d8b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/PRCs/prc-2",component:d("/home/PRCs/prc-2","7b8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/PRCs/prc-3",component:d("/home/PRCs/prc-3","866"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/PRCs/prc-5",component:d("/home/PRCs/prc-5","cb3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/randomness/",component:d("/home/randomness/","1f8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/releasing-a-game/deployment",component:d("/home/releasing-a-game/deployment","93d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/releasing-a-game/generate-build",component:d("/home/releasing-a-game/generate-build","c2b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/releasing-a-game/versioning",component:d("/home/releasing-a-game/versioning","1f8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/setup/connecting-wallets",component:d("/home/setup/connecting-wallets","8fd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/setup/environment-config-values",component:d("/home/setup/environment-config-values","17c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/setup/how-to-use-paima-engine",component:d("/home/setup/how-to-use-paima-engine","099"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/setup/paima-bacher",component:d("/home/setup/paima-bacher","bc8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/smart-contracts/evm/deploy-stateful-nft",component:d("/home/smart-contracts/evm/deploy-stateful-nft","144"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/smart-contracts/evm/generating-code",component:d("/home/smart-contracts/evm/generating-code","1b7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/smart-contracts/evm/introduction",component:d("/home/smart-contracts/evm/introduction","5b9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/smart-contracts/evm/paima-l2-contract",component:d("/home/smart-contracts/evm/paima-l2-contract","ded"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/creating-events/events/builtin-events",component:d("/home/state-machine/creating-events/events/builtin-events","f0b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/creating-events/events/general-interface",component:d("/home/state-machine/creating-events/events/general-interface","549"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/creating-events/events/introduction",component:d("/home/state-machine/creating-events/events/introduction","876"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/creating-events/events/low-level-api",component:d("/home/state-machine/creating-events/events/low-level-api","ca3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/creating-events/introduction",component:d("/home/state-machine/creating-events/introduction","ec7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/creating-events/precompiles/introduction",component:d("/home/state-machine/creating-events/precompiles/introduction","cb6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/creating-events/timers-ticks",component:d("/home/state-machine/creating-events/timers-ticks","b8c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/define-machine/base-format",component:d("/home/state-machine/define-machine/base-format","946"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/define-machine/parallelism",component:d("/home/state-machine/define-machine/parallelism","61f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/define-machine/read-data",component:d("/home/state-machine/define-machine/read-data","92b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/direct-write/autosign",component:d("/home/state-machine/direct-write/autosign","d3a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/direct-write/batched-mode",component:d("/home/state-machine/direct-write/batched-mode","044"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/direct-write/error-handling",component:d("/home/state-machine/direct-write/error-handling","ba6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/direct-write/replay-protection",component:d("/home/state-machine/direct-write/replay-protection","b9b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/direct-write/write-data",component:d("/home/state-machine/direct-write/write-data","eb6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/react-to-events/funnel-types/avail-block-funnel",component:d("/home/state-machine/react-to-events/funnel-types/avail-block-funnel","743"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/react-to-events/funnel-types/block-funnel",component:d("/home/state-machine/react-to-events/funnel-types/block-funnel","228"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/react-to-events/funnel-types/carp-funnel",component:d("/home/state-machine/react-to-events/funnel-types/carp-funnel","1cc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/react-to-events/funnel-types/common-concepts/intro",component:d("/home/state-machine/react-to-events/funnel-types/common-concepts/intro","761"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/react-to-events/funnel-types/common-concepts/parallel-networks",component:d("/home/state-machine/react-to-events/funnel-types/common-concepts/parallel-networks","da3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/react-to-events/funnel-types/configuration",component:d("/home/state-machine/react-to-events/funnel-types/configuration","4f3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/react-to-events/funnel-types/mina-funnel",component:d("/home/state-machine/react-to-events/funnel-types/mina-funnel","fd7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/react-to-events/funnel-types/parallel-avail-funnel",component:d("/home/state-machine/react-to-events/funnel-types/parallel-avail-funnel","8d2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/react-to-events/funnel-types/parallel-evm-funnel",component:d("/home/state-machine/react-to-events/funnel-types/parallel-evm-funnel","28f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/react-to-events/funnel-types/stable-tick-rate-funnel",component:d("/home/state-machine/react-to-events/funnel-types/stable-tick-rate-funnel","217"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/react-to-events/L2-quirks",component:d("/home/state-machine/react-to-events/L2-quirks","4df"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/react-to-events/primitive-catalogue/cardano/cardano-mint-burn",component:d("/home/state-machine/react-to-events/primitive-catalogue/cardano/cardano-mint-burn","a01"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/react-to-events/primitive-catalogue/cardano/cardano-transfer",component:d("/home/state-machine/react-to-events/primitive-catalogue/cardano/cardano-transfer","673"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/react-to-events/primitive-catalogue/cardano/delayed-state",component:d("/home/state-machine/react-to-events/primitive-catalogue/cardano/delayed-state","767"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/react-to-events/primitive-catalogue/cardano/projected-nft",component:d("/home/state-machine/react-to-events/primitive-catalogue/cardano/projected-nft","1df"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/react-to-events/primitive-catalogue/cardano/stakepools",component:d("/home/state-machine/react-to-events/primitive-catalogue/cardano/stakepools","afa"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/react-to-events/primitive-catalogue/create-your-own",component:d("/home/state-machine/react-to-events/primitive-catalogue/create-your-own","3b0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/react-to-events/primitive-catalogue/evm/dynamic-primitives",component:d("/home/state-machine/react-to-events/primitive-catalogue/evm/dynamic-primitives","6dd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/react-to-events/primitive-catalogue/evm/ERC1155",component:d("/home/state-machine/react-to-events/primitive-catalogue/evm/ERC1155","ec8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/react-to-events/primitive-catalogue/evm/ERC20",component:d("/home/state-machine/react-to-events/primitive-catalogue/evm/ERC20","fbd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/react-to-events/primitive-catalogue/evm/ERC6551",component:d("/home/state-machine/react-to-events/primitive-catalogue/evm/ERC6551","fc3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/react-to-events/primitive-catalogue/evm/ERC721",component:d("/home/state-machine/react-to-events/primitive-catalogue/evm/ERC721","c02"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/react-to-events/primitive-catalogue/evm/Generic",component:d("/home/state-machine/react-to-events/primitive-catalogue/evm/Generic","d51"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/react-to-events/primitive-catalogue/introduction",component:d("/home/state-machine/react-to-events/primitive-catalogue/introduction","856"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/react-to-events/primitive-catalogue/meta/introduction",component:d("/home/state-machine/react-to-events/primitive-catalogue/meta/introduction","85a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/react-to-events/primitive-catalogue/mina/generic",component:d("/home/state-machine/react-to-events/primitive-catalogue/mina/generic","4ba"),exact:!0,sidebar:"tutorialSidebar"},{path:"/home/state-machine/structure",component:d("/home/state-machine/structure","cf7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/",component:d("/","23c"),exact:!0,sidebar:"tutorialSidebar"}]}]}]},{path:"*",component:d("*")}]},8934:(e,t,n)=>{"use strict";n.d(t,{_:()=>o,t:()=>i});var r=n(7294),a=n(5893);const o=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,a.jsx)(o.Provider,{value:n,children:t})}},7221:(e,t,n)=>{"use strict";var r=n(7294),a=n(745),o=n(405),i=n(3727),s=n(6809),l=n(412);const c=[n(2497),n(3310),n(8320),n(2295)];var u=n(723),d=n(6550),p=n(8790),f=n(5893);function h(e){let{children:t}=e;return(0,f.jsx)(f.Fragment,{children:t})}var m=n(5742),g=n(2263),b=n(4996),y=n(6668),v=n(1944),w=n(4711),x=n(9727),k=n(3320),S=n(8780),E=n(197);function _(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,g.Z)(),r=(0,w.l)(),a=n[e].htmlLang,o=e=>e.replace("-","_");return(0,f.jsxs)(m.Z,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,f.jsx)("meta",{property:"og:locale",content:o(a)}),Object.values(n).filter((e=>a!==e.htmlLang)).map((e=>(0,f.jsx)("meta",{property:"og:locale:alternate",content:o(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function C(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,g.Z)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,g.Z)(),{pathname:r}=(0,d.TH)();return e+(0,S.applyTrailingSlash)((0,b.ZP)(r),{trailingSlash:n,baseUrl:t})}(),a=t?`${n}${t}`:r;return(0,f.jsxs)(m.Z,{children:[(0,f.jsx)("meta",{property:"og:url",content:a}),(0,f.jsx)("link",{rel:"canonical",href:a})]})}function T(){const{i18n:{currentLocale:e}}=(0,g.Z)(),{metadata:t,image:n}=(0,y.L)();return(0,f.jsxs)(f.Fragment,{children:[(0,f.jsxs)(m.Z,{children:[(0,f.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,f.jsx)("body",{className:x.h})]}),n&&(0,f.jsx)(v.d,{image:n}),(0,f.jsx)(C,{}),(0,f.jsx)(_,{}),(0,f.jsx)(E.Z,{tag:k.HX,locale:e}),(0,f.jsx)(m.Z,{children:t.map(((e,t)=>(0,f.jsx)("meta",{...e},t)))})]})}const P=new Map;var L=n(8934),N=n(8940),R=n(469);function A(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>a.forEach((e=>e?.()))}const O=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,R.Z)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,a=t.hash===n.hash,o=t.search===n.search;if(r&&a&&!o)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),A("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function j(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,p.f)(u.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class I extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=l.Z.canUseDOM?A("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=A("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),j(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return(0,f.jsx)(O,{previousLocation:this.previousLocation,location:t,children:(0,f.jsx)(d.AW,{location:t,render:()=>e})})}}const F=I,D="__docusaurus-base-url-issue-banner-container",M="__docusaurus-base-url-issue-banner",B="__docusaurus-base-url-issue-banner-suggestion-container";function z(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '${D}';\n var bannerHtml = ${JSON.stringify(function(e){return`\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

\n

We suggest trying baseUrl =

\n
\n`}(e)).replace(/{let{route:t}=e;return!0===t.exact})))return P.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return P.set(e.pathname,t),{...e,pathname:t}}((0,d.TH)());return(0,f.jsx)(F,{location:e,children:W})}function G(){return(0,f.jsx)(Q.Z,{children:(0,f.jsx)(N.M,{children:(0,f.jsxs)(L.t,{children:[(0,f.jsxs)(h,{children:[(0,f.jsx)(H,{}),(0,f.jsx)(T,{}),(0,f.jsx)(U,{}),(0,f.jsx)(q,{})]}),(0,f.jsx)(V,{})]})})})}var Y=n(6887);const K=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const a=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;a?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var X=n(9670);const J=new Set,ee=new Set,te=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ne={prefetch:e=>{if(!(e=>!te()&&!ee.has(e)&&!J.has(e))(e))return!1;J.add(e);const t=(0,p.f)(u.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(Y).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,X.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?K(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!te()&&!ee.has(e))(e)&&(ee.add(e),j(e))},re=Object.freeze(ne);function ae(e){let{children:t}=e;return"hash"===s.default.future.experimental_router?(0,f.jsx)(i.UT,{children:t}):(0,f.jsx)(i.VK,{children:t})}const oe=Boolean(!0);if(l.Z.canUseDOM){window.docusaurus=re;const e=document.getElementById("__docusaurus"),t=(0,f.jsx)(o.B6,{children:(0,f.jsx)(ae,{children:(0,f.jsx)(G,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},i=()=>{if(window.docusaurusRoot)window.docusaurusRoot.render(t);else if(oe)window.docusaurusRoot=a.hydrateRoot(e,t,{onRecoverableError:n});else{const r=a.createRoot(e,{onRecoverableError:n});r.render(t),window.docusaurusRoot=r}};j(window.location.pathname).then((()=>{(0,r.startTransition)(i)}))}},8940:(e,t,n)=>{"use strict";n.d(t,{_:()=>d,M:()=>p});var r=n(7294),a=n(6809);const o=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/","versions":[{"name":"current","label":"Next","isLast":true,"path":"/","mainDocId":"home/intro/what-is-paima-engine","docs":[{"id":"home/database-management/introduction","path":"/home/database-management/introduction","sidebar":"tutorialSidebar"},{"id":"home/database-management/migrations","path":"/home/database-management/migrations","sidebar":"tutorialSidebar"},{"id":"home/database-management/setup","path":"/home/database-management/setup","sidebar":"tutorialSidebar"},{"id":"home/database-management/snapshotting","path":"/home/database-management/snapshotting","sidebar":"tutorialSidebar"},{"id":"home/database-management/ts-bindings","path":"/home/database-management/ts-bindings","sidebar":"tutorialSidebar"},{"id":"home/game-node-api/achievements","path":"/home/game-node-api/achievements","sidebar":"tutorialSidebar"},{"id":"home/game-node-api/introduction","path":"/home/game-node-api/introduction","sidebar":"tutorialSidebar"},{"id":"home/intro/what-is-paima-engine","path":"/","sidebar":"tutorialSidebar"},{"id":"home/libraries/cardano-contracts/contrats","path":"/home/libraries/cardano-contracts/contrats","sidebar":"tutorialSidebar"},{"id":"home/libraries/evm-contracts/hardhat-tasks","path":"/home/libraries/evm-contracts/hardhat-tasks","sidebar":"tutorialSidebar"},{"id":"home/libraries/evm-contracts/introduction","path":"/home/libraries/evm-contracts/introduction","sidebar":"tutorialSidebar"},{"id":"home/libraries/evm-contracts/solidity/generated-docs","path":"/home/libraries/evm-contracts/solidity/generated-docs","sidebar":"tutorialSidebar"},{"id":"home/multichain-support/nfts/introduction","path":"/home/multichain-support/nfts/introduction","sidebar":"tutorialSidebar"},{"id":"home/multichain-support/nfts/projected-nfts/basics","path":"/home/multichain-support/nfts/projected-nfts/basics","sidebar":"tutorialSidebar"},{"id":"home/multichain-support/nfts/projected-nfts/cardano","path":"/home/multichain-support/nfts/projected-nfts/cardano","sidebar":"tutorialSidebar"},{"id":"home/multichain-support/nfts/projected-nfts/evm","path":"/home/multichain-support/nfts/projected-nfts/evm","sidebar":"tutorialSidebar"},{"id":"home/multichain-support/wallet-layer/delegate-wallet/integrate","path":"/home/multichain-support/wallet-layer/delegate-wallet/integrate","sidebar":"tutorialSidebar"},{"id":"home/multichain-support/wallet-layer/delegate-wallet/interfaces","path":"/home/multichain-support/wallet-layer/delegate-wallet/interfaces","sidebar":"tutorialSidebar"},{"id":"home/multichain-support/wallet-layer/delegate-wallet/introduction","path":"/home/multichain-support/wallet-layer/delegate-wallet/introduction","sidebar":"tutorialSidebar"},{"id":"home/multichain-support/wallet-layer/introduction","path":"/home/multichain-support/wallet-layer/introduction","sidebar":"tutorialSidebar"},{"id":"home/PRCs/prc-1","path":"/home/PRCs/prc-1","sidebar":"tutorialSidebar"},{"id":"home/PRCs/prc-2","path":"/home/PRCs/prc-2","sidebar":"tutorialSidebar"},{"id":"home/PRCs/prc-3","path":"/home/PRCs/prc-3","sidebar":"tutorialSidebar"},{"id":"home/PRCs/prc-5","path":"/home/PRCs/prc-5","sidebar":"tutorialSidebar"},{"id":"home/randomness/index","path":"/home/randomness/","sidebar":"tutorialSidebar"},{"id":"home/releasing-a-game/deployment","path":"/home/releasing-a-game/deployment","sidebar":"tutorialSidebar"},{"id":"home/releasing-a-game/generate-build","path":"/home/releasing-a-game/generate-build","sidebar":"tutorialSidebar"},{"id":"home/releasing-a-game/versioning","path":"/home/releasing-a-game/versioning","sidebar":"tutorialSidebar"},{"id":"home/setup/connecting-wallets","path":"/home/setup/connecting-wallets","sidebar":"tutorialSidebar"},{"id":"home/setup/environment-config-values","path":"/home/setup/environment-config-values","sidebar":"tutorialSidebar"},{"id":"home/setup/how-to-use-paima-engine","path":"/home/setup/how-to-use-paima-engine","sidebar":"tutorialSidebar"},{"id":"home/setup/paima-bacher","path":"/home/setup/paima-bacher","sidebar":"tutorialSidebar"},{"id":"home/smart-contracts/evm/deploy-stateful-nft","path":"/home/smart-contracts/evm/deploy-stateful-nft","sidebar":"tutorialSidebar"},{"id":"home/smart-contracts/evm/generating-code","path":"/home/smart-contracts/evm/generating-code","sidebar":"tutorialSidebar"},{"id":"home/smart-contracts/evm/introduction","path":"/home/smart-contracts/evm/introduction","sidebar":"tutorialSidebar"},{"id":"home/smart-contracts/evm/paima-l2-contract","path":"/home/smart-contracts/evm/paima-l2-contract","sidebar":"tutorialSidebar"},{"id":"home/state-machine/creating-events/events/builtin-events","path":"/home/state-machine/creating-events/events/builtin-events","sidebar":"tutorialSidebar"},{"id":"home/state-machine/creating-events/events/general-interface","path":"/home/state-machine/creating-events/events/general-interface","sidebar":"tutorialSidebar"},{"id":"home/state-machine/creating-events/events/introduction","path":"/home/state-machine/creating-events/events/introduction","sidebar":"tutorialSidebar"},{"id":"home/state-machine/creating-events/events/low-level-api","path":"/home/state-machine/creating-events/events/low-level-api","sidebar":"tutorialSidebar"},{"id":"home/state-machine/creating-events/introduction","path":"/home/state-machine/creating-events/introduction","sidebar":"tutorialSidebar"},{"id":"home/state-machine/creating-events/precompiles/introduction","path":"/home/state-machine/creating-events/precompiles/introduction","sidebar":"tutorialSidebar"},{"id":"home/state-machine/creating-events/timers-ticks","path":"/home/state-machine/creating-events/timers-ticks","sidebar":"tutorialSidebar"},{"id":"home/state-machine/define-machine/base-format","path":"/home/state-machine/define-machine/base-format","sidebar":"tutorialSidebar"},{"id":"home/state-machine/define-machine/parallelism","path":"/home/state-machine/define-machine/parallelism","sidebar":"tutorialSidebar"},{"id":"home/state-machine/define-machine/read-data","path":"/home/state-machine/define-machine/read-data","sidebar":"tutorialSidebar"},{"id":"home/state-machine/direct-write/autosign","path":"/home/state-machine/direct-write/autosign","sidebar":"tutorialSidebar"},{"id":"home/state-machine/direct-write/batched-mode","path":"/home/state-machine/direct-write/batched-mode","sidebar":"tutorialSidebar"},{"id":"home/state-machine/direct-write/error-handling","path":"/home/state-machine/direct-write/error-handling","sidebar":"tutorialSidebar"},{"id":"home/state-machine/direct-write/replay-protection","path":"/home/state-machine/direct-write/replay-protection","sidebar":"tutorialSidebar"},{"id":"home/state-machine/direct-write/write-data","path":"/home/state-machine/direct-write/write-data","sidebar":"tutorialSidebar"},{"id":"home/state-machine/react-to-events/funnel-types/avail-block-funnel","path":"/home/state-machine/react-to-events/funnel-types/avail-block-funnel","sidebar":"tutorialSidebar"},{"id":"home/state-machine/react-to-events/funnel-types/block-funnel","path":"/home/state-machine/react-to-events/funnel-types/block-funnel","sidebar":"tutorialSidebar"},{"id":"home/state-machine/react-to-events/funnel-types/carp-funnel","path":"/home/state-machine/react-to-events/funnel-types/carp-funnel","sidebar":"tutorialSidebar"},{"id":"home/state-machine/react-to-events/funnel-types/common-concepts/intro","path":"/home/state-machine/react-to-events/funnel-types/common-concepts/intro","sidebar":"tutorialSidebar"},{"id":"home/state-machine/react-to-events/funnel-types/common-concepts/parallel-networks","path":"/home/state-machine/react-to-events/funnel-types/common-concepts/parallel-networks","sidebar":"tutorialSidebar"},{"id":"home/state-machine/react-to-events/funnel-types/configuration","path":"/home/state-machine/react-to-events/funnel-types/configuration","sidebar":"tutorialSidebar"},{"id":"home/state-machine/react-to-events/funnel-types/mina-funnel","path":"/home/state-machine/react-to-events/funnel-types/mina-funnel","sidebar":"tutorialSidebar"},{"id":"home/state-machine/react-to-events/funnel-types/parallel-avail-funnel","path":"/home/state-machine/react-to-events/funnel-types/parallel-avail-funnel","sidebar":"tutorialSidebar"},{"id":"home/state-machine/react-to-events/funnel-types/parallel-evm-funnel","path":"/home/state-machine/react-to-events/funnel-types/parallel-evm-funnel","sidebar":"tutorialSidebar"},{"id":"home/state-machine/react-to-events/funnel-types/stable-tick-rate-funnel","path":"/home/state-machine/react-to-events/funnel-types/stable-tick-rate-funnel","sidebar":"tutorialSidebar"},{"id":"home/state-machine/react-to-events/L2-quirks","path":"/home/state-machine/react-to-events/L2-quirks","sidebar":"tutorialSidebar"},{"id":"home/state-machine/react-to-events/primitive-catalogue/cardano/cardano-mint-burn","path":"/home/state-machine/react-to-events/primitive-catalogue/cardano/cardano-mint-burn","sidebar":"tutorialSidebar"},{"id":"home/state-machine/react-to-events/primitive-catalogue/cardano/cardano-transfer","path":"/home/state-machine/react-to-events/primitive-catalogue/cardano/cardano-transfer","sidebar":"tutorialSidebar"},{"id":"home/state-machine/react-to-events/primitive-catalogue/cardano/delayed-state","path":"/home/state-machine/react-to-events/primitive-catalogue/cardano/delayed-state","sidebar":"tutorialSidebar"},{"id":"home/state-machine/react-to-events/primitive-catalogue/cardano/projected-nft","path":"/home/state-machine/react-to-events/primitive-catalogue/cardano/projected-nft","sidebar":"tutorialSidebar"},{"id":"home/state-machine/react-to-events/primitive-catalogue/cardano/stakepools","path":"/home/state-machine/react-to-events/primitive-catalogue/cardano/stakepools","sidebar":"tutorialSidebar"},{"id":"home/state-machine/react-to-events/primitive-catalogue/create-your-own","path":"/home/state-machine/react-to-events/primitive-catalogue/create-your-own","sidebar":"tutorialSidebar"},{"id":"home/state-machine/react-to-events/primitive-catalogue/evm/dynamic-primitives","path":"/home/state-machine/react-to-events/primitive-catalogue/evm/dynamic-primitives","sidebar":"tutorialSidebar"},{"id":"home/state-machine/react-to-events/primitive-catalogue/evm/ERC1155","path":"/home/state-machine/react-to-events/primitive-catalogue/evm/ERC1155","sidebar":"tutorialSidebar"},{"id":"home/state-machine/react-to-events/primitive-catalogue/evm/ERC20","path":"/home/state-machine/react-to-events/primitive-catalogue/evm/ERC20","sidebar":"tutorialSidebar"},{"id":"home/state-machine/react-to-events/primitive-catalogue/evm/ERC6551","path":"/home/state-machine/react-to-events/primitive-catalogue/evm/ERC6551","sidebar":"tutorialSidebar"},{"id":"home/state-machine/react-to-events/primitive-catalogue/evm/ERC721","path":"/home/state-machine/react-to-events/primitive-catalogue/evm/ERC721","sidebar":"tutorialSidebar"},{"id":"home/state-machine/react-to-events/primitive-catalogue/evm/Generic","path":"/home/state-machine/react-to-events/primitive-catalogue/evm/Generic","sidebar":"tutorialSidebar"},{"id":"home/state-machine/react-to-events/primitive-catalogue/introduction","path":"/home/state-machine/react-to-events/primitive-catalogue/introduction","sidebar":"tutorialSidebar"},{"id":"home/state-machine/react-to-events/primitive-catalogue/meta/introduction","path":"/home/state-machine/react-to-events/primitive-catalogue/meta/introduction","sidebar":"tutorialSidebar"},{"id":"home/state-machine/react-to-events/primitive-catalogue/mina/generic","path":"/home/state-machine/react-to-events/primitive-catalogue/mina/generic","sidebar":"tutorialSidebar"},{"id":"home/state-machine/structure","path":"/home/state-machine/structure","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/","label":"home/intro/what-is-paima-engine"}}}}],"breadcrumbs":false}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en","ja"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"},"ja":{"label":"Japanese","direction":"ltr","htmlLang":"ja","calendar":"gregory","path":"ja"}}}');var s=n(7529);const l=JSON.parse('{"docusaurusVersion":"3.4.0","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.4.0"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.4.0"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.4.0"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.4.0"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.4.0"},"docusaurus-tailwindcss":{"type":"local"},"docusaurus-plugin-client-redirects":{"type":"package","name":"@docusaurus/plugin-client-redirects","version":"3.4.0"},"docusaurus-plugin-remote-content-prc":{"type":"package","name":"docusaurus-plugin-remote-content","version":"4.0.0"},"docusaurus-theme-mermaid":{"type":"package","name":"@docusaurus/theme-mermaid","version":"3.4.0"},"@easyops-cn/docusaurus-search-local":{"type":"package","name":"@easyops-cn/docusaurus-search-local","version":"0.44.2"}}}');var c=n(5893);const u={siteConfig:a.default,siteMetadata:l,globalData:o,i18n:i,codeTranslations:s},d=r.createContext(u);function p(e){let{children:t}=e;return(0,c.jsx)(d.Provider,{value:u,children:t})}},4763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>m});var r=n(7294),a=n(412),o=n(5742),i=n(8780),s=n(2045),l=n(226),c=n(5893);function u(e){let{error:t,tryAgain:n}=e;return(0,c.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,c.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,c.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,c.jsx)(d,{error:t})]})}function d(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,c.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function p(e){let{children:t}=e;return(0,c.jsx)(l.z,{value:{plugin:{name:"docusaurus-core-error-boundary",id:"default"}},children:t})}function f(e){let{error:t,tryAgain:n}=e;return(0,c.jsx)(p,{children:(0,c.jsxs)(m,{fallback:()=>(0,c.jsx)(u,{error:t,tryAgain:n}),children:[(0,c.jsx)(o.Z,{children:(0,c.jsx)("title",{children:"Page Error"})}),(0,c.jsx)(s.Z,{children:(0,c.jsx)(u,{error:t,tryAgain:n})})]})})}const h=e=>(0,c.jsx)(f,{...e});class m extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??h)(e)}return e??null}}},412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});n(7294);var r=n(405),a=n(5893);function o(e){return(0,a.jsx)(r.ql,{...e})}},3692:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(7294),a=n(3727),o=n(8780),i=n(2263),s=n(3919),l=n(412),c=n(8138),u=n(4996),d=n(5893);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:h,isActive:m,"data-noBrokenLinkCheck":g,autoAddBaseUrl:b=!0,...y}=e;const{siteConfig:v}=(0,i.Z)(),{trailingSlash:w,baseUrl:x}=v,k=v.future.experimental_router,{withBaseUrl:S}=(0,u.Cg)(),E=(0,c.Z)(),_=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>_.current));const C=p||f;const T=(0,s.Z)(C),P=C?.replace("pathname://","");let L=void 0!==P?(N=P,b&&(e=>e.startsWith("/"))(N)?S(N):N):void 0;var N;"hash"===k&&L?.startsWith("./")&&(L=L?.slice(1)),L&&T&&(L=(0,o.applyTrailingSlash)(L,{trailingSlash:w,baseUrl:x}));const R=(0,r.useRef)(!1),A=n?a.OL:a.rU,O=l.Z.canUseIntersectionObserver,j=(0,r.useRef)(),I=()=>{R.current||null==L||(window.docusaurus.preload(L),R.current=!0)};(0,r.useEffect)((()=>(!O&&T&&null!=L&&window.docusaurus.prefetch(L),()=>{O&&j.current&&j.current.disconnect()})),[j,L,O,T]);const F=L?.startsWith("#")??!1,D=!y.target||"_self"===y.target,M=!L||!T||!D;return g||!F&&M||E.collectLink(L),y.id&&E.collectAnchor(y.id),M?(0,d.jsx)("a",{ref:_,href:L,...C&&!T&&{target:"_blank",rel:"noopener noreferrer"},...y}):(0,d.jsx)(A,{...y,onMouseEnter:I,onTouchStart:I,innerRef:e=>{_.current=e,O&&e&&T&&(j.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(j.current.unobserve(e),j.current.disconnect(),null!=L&&window.docusaurus.prefetch(L))}))})),j.current.observe(e))},to:L,...n&&{isActive:m,activeClassName:h}})}const f=r.forwardRef(p)},5999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c,I:()=>l});var r=n(7294),a=n(5893);function o(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var i=n(7529);function s(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return o(s({message:n,id:r}),t)}function c(e){let{children:t,id:n,values:r}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const i=s({message:t,id:n});return(0,a.jsx)(a.Fragment,{children:o(i,r)})}},9935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},3919:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>a,b:()=>r})},4996:(e,t,n)=>{"use strict";n.d(t,{Cg:()=>i,ZP:()=>s});var r=n(7294),a=n(2263),o=n(3919);function i(){const{siteConfig:e}=(0,a.Z)(),{baseUrl:t,url:n}=e,i=e.future.experimental_router,s=(0,r.useCallback)(((e,r)=>function(e){let{siteUrl:t,baseUrl:n,url:r,options:{forcePrependBaseUrl:a=!1,absolute:i=!1}={},router:s}=e;if(!r||r.startsWith("#")||(0,o.b)(r))return r;if("hash"===s)return r.startsWith("/")?`.${r}`:`./${r}`;if(a)return n+r.replace(/^\//,"");if(r===n.replace(/\/$/,""))return n;const l=r.startsWith(n)?r:n+r.replace(/^\//,"");return i?t+l:l}({siteUrl:n,baseUrl:t,url:e,options:r,router:i})),[n,t,i]);return{withBaseUrl:s}}function s(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},8138:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});var r=n(7294);n(5893);const a=r.createContext({collectAnchor:()=>{},collectLink:()=>{}}),o=()=>(0,r.useContext)(a);function i(){return o()}},2263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8940);function o(){return(0,r.useContext)(a._)}},2389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8934);function o(){return(0,r.useContext)(a._)}},469:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(7294);const a=n(412).Z.canUseDOM?r.useLayoutEffect:r.useEffect},9670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function a(e){const t={};return function e(n,a){Object.entries(n).forEach((n=>{let[o,i]=n;const s=a?`${a}.${o}`:o;r(i)?e(i,s):t[s]=i}))}(e),t}},226:(e,t,n)=>{"use strict";n.d(t,{_:()=>o,z:()=>i});var r=n(7294),a=n(5893);const o=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(o),s=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:i,value:n})),[i,n]);return(0,a.jsx)(o.Provider,{value:s,children:t})}},143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>m,gA:()=>p,_r:()=>u,Jo:()=>g,zh:()=>d,yW:()=>h,gB:()=>f});var r=n(6550),a=n(2263),o=n(9935);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,a.Z)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const s=e=>e.versions.find((e=>e.isLast));function l(e,t){const n=function(e,t){const n=s(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}(e,t),a=n?.docs.find((e=>!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:a,alternateDocVersions:a?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(a.id):{}}}const c={},u=()=>i("docusaurus-plugin-content-docs")??c,d=e=>{try{return function(e,t,n){void 0===t&&(t=o.m),void 0===n&&(n={});const r=i(e),a=r?.[t];if(!a&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return a}("docusaurus-plugin-content-docs",e,{failfast:!0})}catch(t){throw new Error("You are using a feature of the Docusaurus docs plugin, but this plugin does not seem to be enabled"+("Default"===e?"":` (pluginId=${e}`),{cause:t})}};function p(e){void 0===e&&(e={});const t=u(),{pathname:n}=(0,r.TH)();return function(e,t,n){void 0===n&&(n={});const a=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return o}(t,n,e)}function f(e){return d(e).versions}function h(e){const t=d(e);return s(t)}function m(e){const t=d(e),{pathname:n}=(0,r.TH)();return l(t,n)}function g(e){const t=d(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=s(e);return{latestDocSuggestion:l(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},8320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(4865),a=n.n(r);a().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{a().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){a().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var r=n(2573),a=n(6809);!function(e){const{themeConfig:{prism:t}}=a.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(6854),n(1881)(`./prism-${e}`)})),delete globalThis.Prism}(r.p1)},2503:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});n(7294);var r=n(512),a=n(5999),o=n(6668),i=n(3692),s=n(8138);const l={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var c=n(5893);function u(e){let{as:t,id:n,...u}=e;const d=(0,s.Z)(),{navbar:{hideOnScroll:p}}=(0,o.L)();if("h1"===t||!n)return(0,c.jsx)(t,{...u,id:void 0});d.collectAnchor(n);const f=(0,a.I)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof u.children?u.children:n});return(0,c.jsxs)(t,{...u,className:(0,r.Z)("anchor",p?l.anchorWithHideOnScrollNavbar:l.anchorWithStickyNavbar,u.className),id:n,children:[u.children,(0,c.jsx)(i.Z,{className:"hash-link",to:`#${n}`,"aria-label":f,title:f,children:"\u200b"})]})}},9471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});n(7294);const r={iconExternalLink:"iconExternalLink_nPIU"};var a=n(5893);function o(e){let{width:t=13.5,height:n=13.5}=e;return(0,a.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,a.jsx)("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"})})}},2045:(e,t,n)=>{"use strict";n.d(t,{Z:()=>At});var r=n(7294),a=n(512),o=n(4763),i=n(1944),s=n(6550),l=n(5999),c=n(5936),u=n(5893);const d="__docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,r.useRef)(null),{action:t}=(0,s.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&p(t)}),[]);return(0,c.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const h=(0,l.I)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function m(e){const t=e.children??h,{containerRef:n,onClick:r}=f();return(0,u.jsx)("div",{ref:n,role:"region","aria-label":h,children:(0,u.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var g=n(5281),b=n(9727);const y={skipToContent:"skipToContent_fXgn"};function v(){return(0,u.jsx)(m,{className:y.skipToContent})}var w=n(6668),x=n(9689);function k(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:a=1.2,className:o,...i}=e;return(0,u.jsx)("svg",{viewBox:"0 0 15 15",width:t,height:n,...i,children:(0,u.jsx)("g",{stroke:r,strokeWidth:a,children:(0,u.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const S={closeButton:"closeButton_CVFx"};function E(e){return(0,u.jsx)("button",{type:"button","aria-label":(0,l.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,a.Z)("clean-btn close",S.closeButton,e.className),children:(0,u.jsx)(k,{width:14,height:14,strokeWidth:3.1})})}const _={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,w.L)(),{content:n}=t;return(0,u.jsx)("div",{...e,className:(0,a.Z)(_.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const T={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function P(){const{announcementBar:e}=(0,w.L)(),{isActive:t,close:n}=(0,x.n)();if(!t)return null;const{backgroundColor:r,textColor:a,isCloseable:o}=e;return(0,u.jsxs)("div",{className:T.announcementBar,style:{backgroundColor:r,color:a},role:"banner",children:[o&&(0,u.jsx)("div",{className:T.announcementBarPlaceholder}),(0,u.jsx)(C,{className:T.announcementBarContent}),o&&(0,u.jsx)(E,{onClick:n,className:T.announcementBarClose})]})}var L=n(2961),N=n(2466);var R=n(902),A=n(3102);const O=r.createContext(null);function j(e){let{children:t}=e;const n=function(){const e=(0,L.e)(),t=(0,A.HY)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,R.D9)(o);return(0,r.useEffect)((()=>{o&&!i&&a(!0)}),[o,i]),(0,r.useEffect)((()=>{o?e.shown||a(!0):a(!1)}),[e.shown,o]),(0,r.useMemo)((()=>[n,a]),[n])}();return(0,u.jsx)(O.Provider,{value:n,children:t})}function I(e){if(e.component){const t=e.component;return(0,u.jsx)(t,{...e.props})}}function F(){const e=(0,r.useContext)(O);if(!e)throw new R.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,A.HY)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:I(o)})),[a,o,t])}function D(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:o}=F();return(0,u.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,u.jsxs)("div",{className:(0,a.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":o}),children:[(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:n}),(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:r})]})]})}var M=n(2949),B=n(2389);function z(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"})})}function $(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"})})}const U={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function H(e){let{className:t,buttonClassName:n,value:r,onChange:o}=e;const i=(0,B.Z)(),s=(0,l.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===r?(0,l.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,l.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,u.jsx)("div",{className:(0,a.Z)(U.toggle,t),children:(0,u.jsxs)("button",{className:(0,a.Z)("clean-btn",U.toggleButton,!i&&U.toggleButtonDisabled,n),type:"button",onClick:()=>o("dark"===r?"light":"dark"),disabled:!i,title:s,"aria-label":s,"aria-live":"polite",children:[(0,u.jsx)(z,{className:(0,a.Z)(U.toggleIcon,U.lightToggleIcon)}),(0,u.jsx)($,{className:(0,a.Z)(U.toggleIcon,U.darkToggleIcon)})]})})}const Q=r.memo(H),Z={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function V(e){let{className:t}=e;const n=(0,w.L)().navbar.style,r=(0,w.L)().colorMode.disableSwitch,{colorMode:a,setColorMode:o}=(0,M.I)();return r?null:(0,u.jsx)(Q,{className:t,buttonClassName:"dark"===n?Z.darkNavbarColorModeToggle:void 0,value:a,onChange:o})}var W=n(1327);function q(){return(0,u.jsx)(W.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function G(){const e=(0,L.e)();return(0,u.jsx)("button",{type:"button","aria-label":(0,l.I)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,u.jsx)(k,{color:"var(--ifm-color-emphasis-600)"})})}function Y(){return(0,u.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,u.jsx)(q,{}),(0,u.jsx)(V,{className:"margin-right--md"}),(0,u.jsx)(G,{})]})}var K=n(3692),X=n(4996),J=n(3919);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(9471);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:a,label:o,html:i,isDropdownLink:s,prependBaseUrlToHref:l,...c}=e;const d=(0,X.ZP)(r),p=(0,X.ZP)(t),f=(0,X.ZP)(a,{forcePrependBaseUrl:!0}),h=o&&a&&!(0,J.Z)(a),m=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,u.jsxs)(u.Fragment,{children:[o,h&&(0,u.jsx)(te.Z,{...s&&{width:12,height:12}})]})};return a?(0,u.jsx)(K.Z,{href:l?f:a,...c,...m}):(0,u.jsx)(K.Z,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(p)},...c,...m})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const o=(0,u.jsx)(ne,{className:(0,a.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,u.jsx)("li",{children:o}):o}function ae(e){let{className:t,isDropdownItem:n,...r}=e;return(0,u.jsx)("li",{className:"menu__list-item",children:(0,u.jsx)(ne,{className:(0,a.Z)("menu__link",t),...r})})}function oe(e){let{mobile:t=!1,position:n,...r}=e;const a=t?ae:re;return(0,u.jsx)(a,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ie=n(6043),se=n(8596),le=n(2263);const ce={dropdownNavbarItemMobile:"dropdownNavbarItemMobile_S0Fm"};function ue(e,t){return e.some((e=>function(e,t){return!!(0,se.Mg)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){let{items:t,position:n,className:o,onClick:i,...s}=e;const l=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{l.current&&!l.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[l]),(0,u.jsxs)("div",{ref:l,className:(0,a.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c}),children:[(0,u.jsx)(ne,{"aria-haspopup":"true","aria-expanded":c,role:"button",href:s.to?void 0:"#",className:(0,a.Z)("navbar__link",o),...s,onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))},children:s.children??s.label}),(0,u.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(qe,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function pe(e){let{items:t,className:n,position:o,onClick:i,...l}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,le.Z)(),{pathname:t}=(0,s.TH)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:p,toggleCollapsed:f,setCollapsed:h}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&h(!d)}),[c,d,h]),(0,u.jsxs)("li",{className:(0,a.Z)("menu__list-item",{"menu__list-item--collapsed":p}),children:[(0,u.jsx)(ne,{role:"button",className:(0,a.Z)(ce.dropdownNavbarItemMobile,"menu__link menu__link--sublist menu__link--sublist-caret",n),...l,onClick:e=>{e.preventDefault(),f()},children:l.children??l.label}),(0,u.jsx)(ie.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:p,children:t.map(((e,t)=>(0,r.createElement)(qe,{mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active",...e,key:t})))})]})}function fe(e){let{mobile:t=!1,...n}=e;const r=t?pe:de;return(0,u.jsx)(r,{...n})}var he=n(4711);function me(e){let{width:t=20,height:n=20,...r}=e;return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0,...r,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"})})}const ge="iconLanguage_nlXk";var be=n(1029),ye=n(1728),ve=n(373),we=n(143),xe=n(22),ke=n(8202),Se=n(3545),Ee=n(3926),_e=n(1073),Ce=n(2539),Te=n(726);const Pe='',Le='',Ne='',Re='',Ae='',Oe='',je='',Ie={searchBar:"searchBar_RVTs",dropdownMenu:"dropdownMenu_qbY6",searchBarLeft:"searchBarLeft_MXDe",suggestion:"suggestion_fB_2",cursor:"cursor_eG29",hitTree:"hitTree_kk6K",hitIcon:"hitIcon_a7Zy",hitPath:"hitPath_ieM4",noResultsIcon:"noResultsIcon_EBY5",hitFooter:"hitFooter_E9YW",hitWrapper:"hitWrapper_sAK8",hitTitle:"hitTitle_vyVt",hitAction:"hitAction_NqkB",hideAction:"hideAction_vcyE",noResults:"noResults_l6Q3",searchBarContainer:"searchBarContainer_NW3z",searchBarLoadingRing:"searchBarLoadingRing_YnHq",searchClearButton:"searchClearButton_qk4g",searchIndexLoading:"searchIndexLoading_EJ1f",searchHintContainer:"searchHintContainer_Pkmr",searchHint:"searchHint_iIMx",focused:"focused_OWtg",input:"input_FOTf",hint:"hint_URu1",suggestions:"suggestions_X8XU",dataset:"dataset_QiCy",empty:"empty_eITn"};function Fe(e){let{document:t,type:n,page:r,metadata:a,tokens:o,isInterOfTree:i,isLastOfTree:s}=e;const l=n===Se.P.Title,c=n===Se.P.Keywords,u=l||c,d=n===Se.P.Heading,p=[];i?p.push(Oe):s&&p.push(je);const f=p.map((e=>`${e}`)),h=`${u?Pe:d?Le:Ne}`,m=[`${c?(0,Ce.C)(t.s,o):(0,Te.o)(t.t,(0,_e.m)(a,"t"),o)}`];if(!i&&!s&&be.H6){const e=r?r.b?.concat(r.t).concat(t.s&&t.s!==r.t?t.s:[]):t.b;m.push(`${(0,Ee.e)(e??[])}`)}else u||m.push(`${(0,Ce.C)(r.t||(t.u.startsWith("/docs/api-reference/")?"API Reference":""),o)}`);const g=`${Re}`;return[...f,h,``,...m,"",g].join("")}function De(){return`${Ae}${(0,l.I)({id:"theme.SearchBar.noResultsText",message:"No results"})}`}var Me=n(311),Be=n(51);async function ze(){const e=await Promise.all([n.e(8443),n.e(5525)]).then(n.t.bind(n,8443,23)),t=e.default;return t.noConflict?t.noConflict():e.noConflict&&e.noConflict(),t}const $e="_highlight";const Ue=function(e){let{handleSearchBarToggle:t}=e;const n=(0,B.Z)(),{siteConfig:{baseUrl:a},i18n:{currentLocale:o}}=(0,le.Z)(),i=(0,we.gA)();let c=a;try{const{preferredVersion:e}=(0,ve.J)(i?.pluginId??be.gQ);e&&!e.isLast&&(c=e.path+"/")}catch(D){if(be.l9&&!(D instanceof R.i6))throw D}const d=(0,s.k6)(),p=(0,s.TH)(),f=(0,r.useRef)(null),h=(0,r.useRef)(new Map),m=(0,r.useRef)(!1),[g,b]=(0,r.useState)(!1),[y,v]=(0,r.useState)(!1),[w,x]=(0,r.useState)(""),k=(0,r.useRef)(null),S=(0,r.useRef)(""),[E,_]=(0,r.useState)("");(0,r.useEffect)((()=>{if(!Array.isArray(be.Kc))return;let e="";if(p.pathname.startsWith(c)){const t=p.pathname.substring(c.length);let n;for(const e of be.Kc){const r="string"==typeof e?e:e.path;if(t===r||t.startsWith(`${r}/`)){n=r;break}}n&&(e=n)}S.current!==e&&(h.current.delete(e),S.current=e),_(e)}),[p.pathname,c]);const C=!!be.hG&&Array.isArray(be.Kc)&&""===E,T=(0,r.useCallback)((async()=>{if(C||h.current.get(E))return;h.current.set(E,"loading"),k.current?.autocomplete.destroy(),b(!0);const[{wrappedIndexes:e,zhDictionary:t},n]=await Promise.all([(0,xe.w)(c,E),ze()]);if(k.current=n(f.current,{hint:!1,autoselect:!0,openOnFocus:!0,cssClasses:{root:(0,ye.Z)(Ie.searchBar,{[Ie.searchBarLeft]:"left"===be.pu}),noPrefix:!0,dropdownMenu:Ie.dropdownMenu,input:Ie.input,hint:Ie.hint,suggestions:Ie.suggestions,suggestion:Ie.suggestion,cursor:Ie.cursor,dataset:Ie.dataset,empty:Ie.empty}},[{source:(0,ke.v)(e,t,be.qo),templates:{suggestion:Fe,empty:De,footer:e=>{let{query:t,isEmpty:n}=e;if(n&&(!E||!be.pQ))return;const r=(e=>{let{query:t,isEmpty:n}=e;const r=document.createElement("a"),i=new URLSearchParams;let s;if(i.set("q",t),E){const e=E&&Array.isArray(be.Kc)?be.Kc.find((e=>"string"==typeof e?e===E:e.path===E)):E,t=e?(0,Be._)(e,o).label:E;s=be.pQ&&n?(0,l.I)({id:"theme.SearchBar.seeAllOutsideContext",message:'See all results outside "{context}"'},{context:t}):(0,l.I)({id:"theme.SearchBar.searchInContext",message:'See all results within "{context}"'},{context:t})}else s=(0,l.I)({id:"theme.SearchBar.seeAll",message:"See all results"});if(!E||!Array.isArray(be.Kc)||be.pQ&&n||i.set("ctx",E),c!==a){if(!c.startsWith(a))throw new Error(`Version url '${c}' does not start with base url '${a}', this is a bug of \`@easyops-cn/docusaurus-search-local\`, please report it.`);i.set("version",c.substring(a.length))}const u=`${a}search?${i.toString()}`;return r.href=u,r.textContent=s,r.addEventListener("click",(e=>{e.ctrlKey||e.metaKey||(e.preventDefault(),k.current?.autocomplete.close(),d.push(u))})),r})({query:t,isEmpty:n}),i=document.createElement("div");return i.className=Ie.hitFooter,i.appendChild(r),i}}}]).on("autocomplete:selected",(function(e,t){let{document:{u:n,h:r},tokens:a}=t;f.current?.blur();let o=n;if(be.vc&&a.length>0){const e=new URLSearchParams;for(const t of a)e.append($e,t);o+=`?${e.toString()}`}r&&(o+=r),d.push(o)})).on("autocomplete:closed",(()=>{f.current?.blur()})),h.current.set(E,"done"),b(!1),m.current){const e=f.current;e.value&&k.current?.autocomplete.open(),e.focus()}}),[C,E,c,a,d]);(0,r.useEffect)((()=>{if(!be.vc)return;const e=n?new URLSearchParams(p.search).getAll($e):[];setTimeout((()=>{const t=document.querySelector("article");if(!t)return;const n=new be.vc(t);n.unmark(),0!==e.length&&n.mark(e),x(e.join(" ")),k.current?.autocomplete.setVal(e.join(" "))}))}),[n,p.search,p.pathname]);const[P,L]=(0,r.useState)(!1),N=(0,r.useCallback)((()=>{m.current=!0,T(),L(!0),t?.(!0)}),[t,T]),A=(0,r.useCallback)((()=>{L(!1),t?.(!1)}),[t]),O=(0,r.useCallback)((()=>{T()}),[T]),j=(0,r.useCallback)((e=>{x(e.target.value),e.target.value&&v(!0)}),[]),I=!!n&&/mac/i.test(navigator.userAgentData?.platform??navigator.platform);(0,r.useEffect)((()=>{if(!be.AY)return;const e=e=>{!(I?e.metaKey:e.ctrlKey)||"k"!==e.key&&"K"!==e.key||(e.preventDefault(),f.current?.focus(),N())};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}}),[I,N]);const F=(0,r.useCallback)((()=>{const e=new URLSearchParams(p.search);e.delete($e);const t=e.toString(),n=p.pathname+(""!=t?`?${t}`:"")+p.hash;n!=p.pathname+p.search+p.hash&&d.push(n),x(""),k.current?.autocomplete.setVal("")}),[p.pathname,p.search,p.hash,d]);return(0,u.jsxs)("div",{className:(0,ye.Z)("navbar__search",Ie.searchBarContainer,{[Ie.searchIndexLoading]:g&&y,[Ie.focused]:P}),hidden:C,dir:"ltr",children:[(0,u.jsx)("input",{placeholder:(0,l.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),"aria-label":"Search",className:"navbar__search-input",onMouseEnter:O,onFocus:N,onBlur:A,onChange:j,ref:f,value:w}),(0,u.jsx)(Me.Z,{className:Ie.searchBarLoadingRing}),be.AY&&be.t_&&(""!==w?(0,u.jsx)("button",{className:Ie.searchClearButton,onClick:F,children:"\u2715"}):n&&(0,u.jsxs)("div",{className:Ie.searchHintContainer,children:[(0,u.jsx)("kbd",{className:Ie.searchHint,children:I?"\u2318":"ctrl"}),(0,u.jsx)("kbd",{className:Ie.searchHint,children:"K"})]}))]})},He={navbarSearchContainer:"navbarSearchContainer_Bca1"};function Qe(e){let{children:t,className:n}=e;return(0,u.jsx)("div",{className:(0,a.Z)(n,He.navbarSearchContainer),children:t})}var Ze=n(2802);const Ve=e=>e.docs.find((t=>t.id===e.mainDocId));const We={default:oe,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:a="",...o}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,le.Z)(),p=(0,he.l)(),{search:f,hash:h}=(0,s.TH)(),m=[...n,...c.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${h}${a}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...r],g=t?(0,l.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return(0,u.jsx)(fe,{...o,mobile:t,label:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(me,{className:ge}),g]}),items:m})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,u.jsx)(Qe,{className:n,children:(0,u.jsx)(Ue,{})})},dropdown:fe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:o=!1}=e;const i=o?"li":"div";return(0,u.jsx)(i,{className:(0,a.Z)({navbar__item:!r&&!o,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...a}=e;const{activeDoc:o}=(0,we.Iw)(r),i=(0,Ze.vY)(t,r),s=o?.path===i?.path;return null===i||i.unlisted&&!s?null:(0,u.jsx)(oe,{exact:!0,...a,isActive:()=>s||!!o?.sidebar&&o.sidebar===i.sidebar,label:n??i.id,to:i.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...a}=e;const{activeDoc:o}=(0,we.Iw)(r),i=(0,Ze.oz)(t,r).link;if(!i)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return(0,u.jsx)(oe,{exact:!0,...a,isActive:()=>o?.sidebar===t,label:n??i.label,to:i.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...a}=e;const o=(0,Ze.lO)(r)[0],i=t??o.label,s=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(o).path;return(0,u.jsx)(oe,{...a,label:i,to:s})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:a,dropdownItemsAfter:o,...i}=e;const{search:c,hash:d}=(0,s.TH)(),p=(0,we.Iw)(n),f=(0,we.gB)(n),{savePreferredVersionName:h}=(0,ve.J)(n),m=[...a,...f.map((e=>{const t=p.alternateDocVersions[e.name]??Ve(e);return{label:e.label,to:`${t.path}${c}${d}`,isActive:()=>e===p.activeVersion,onClick:()=>h(e.name)}})),...o],g=(0,Ze.lO)(n)[0],b=t&&m.length>1?(0,l.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):g.label,y=t&&m.length>1?void 0:Ve(g).path;return m.length<=1?(0,u.jsx)(oe,{...i,mobile:t,label:b,to:y,isActive:r?()=>!1:void 0}):(0,u.jsx)(fe,{...i,mobile:t,label:b,to:y,items:m,isActive:r?()=>!1:void 0})}};function qe(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),a=We[r];if(!a)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,u.jsx)(a,{...n})}function Ge(){const e=(0,L.e)(),t=(0,w.L)().navbar.items;return(0,u.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(qe,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function Ye(e){return(0,u.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,u.jsx)(l.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)",children:"\u2190 Back to main menu"})})}function Ke(){const e=0===(0,w.L)().navbar.items.length,t=F();return(0,u.jsxs)(u.Fragment,{children:[!e&&(0,u.jsx)(Ye,{onClick:()=>t.hide()}),t.content]})}function Xe(){const e=(0,L.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?(0,u.jsx)(D,{header:(0,u.jsx)(Y,{}),primaryMenu:(0,u.jsx)(Ge,{}),secondaryMenu:(0,u.jsx)(Ke,{})}):null}const Je={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function et(e){return(0,u.jsx)("div",{role:"presentation",...e,className:(0,a.Z)("navbar-sidebar__backdrop",e.className)})}function tt(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,w.L)(),i=(0,L.e)(),{navbarRef:s,isNavbarVisible:d}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,N.RF)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=s?n(!1):i+c{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return a.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return(0,u.jsxs)("nav",{ref:s,"aria-label":(0,l.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,a.Z)("navbar","navbar--fixed-top",n&&[Je.navbarHideable,!d&&Je.navbarHidden],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown}),children:[t,(0,u.jsx)(et,{onClick:i.toggle}),(0,u.jsx)(Xe,{})]})}var nt=n(9690);const rt="right";function at(e){let{width:t=30,height:n=30,className:r,...a}=e;return(0,u.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...a,children:(0,u.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function ot(){const{toggle:e,shown:t}=(0,L.e)();return(0,u.jsx)("button",{onClick:e,"aria-label":(0,l.I)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,u.jsx)(at,{})})}const it={colorModeToggle:"colorModeToggle_DEke"};function st(e){let{items:t}=e;return(0,u.jsx)(u.Fragment,{children:t.map(((e,t)=>(0,u.jsx)(nt.QW,{onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t}),children:(0,u.jsx)(qe,{...e})},t)))})}function lt(e){let{left:t,right:n}=e;return(0,u.jsxs)("div",{className:"navbar__inner",children:[(0,u.jsx)("div",{className:"navbar__items",children:t}),(0,u.jsx)("div",{className:"navbar__items navbar__items--right",children:n})]})}function ct(){const e=(0,L.e)(),t=(0,w.L)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??rt)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),a=t.find((e=>"search"===e.type));return(0,u.jsx)(lt,{left:(0,u.jsxs)(u.Fragment,{children:[!e.disabled&&(0,u.jsx)(ot,{}),(0,u.jsx)(q,{}),(0,u.jsx)(st,{items:n})]}),right:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(st,{items:r}),(0,u.jsx)(V,{className:it.colorModeToggle}),!a&&(0,u.jsx)(Qe,{children:(0,u.jsx)(Ue,{})})]})})}function ut(){return(0,u.jsx)(tt,{children:(0,u.jsx)(ct,{})})}function dt(e){let{item:t}=e;const{to:n,href:r,label:a,prependBaseUrlToHref:o,...i}=t,s=(0,X.ZP)(n),l=(0,X.ZP)(r,{forcePrependBaseUrl:!0});return(0,u.jsxs)(K.Z,{className:"footer__link-item",...r?{href:o?l:r}:{to:s},...i,children:[a,r&&!(0,J.Z)(r)&&(0,u.jsx)(te.Z,{})]})}function pt(e){let{item:t}=e;return t.html?(0,u.jsx)("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)("li",{className:"footer__item",children:(0,u.jsx)(dt,{item:t})},t.href??t.to)}function ft(e){let{column:t}=e;return(0,u.jsxs)("div",{className:"col footer__col",children:[(0,u.jsx)("div",{className:"footer__title",children:t.title}),(0,u.jsx)("ul",{className:"footer__items clean-list",children:t.items.map(((e,t)=>(0,u.jsx)(pt,{item:e},t)))})]})}function ht(e){let{columns:t}=e;return(0,u.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,u.jsx)(ft,{column:e},t)))})}function mt(){return(0,u.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function gt(e){let{item:t}=e;return t.html?(0,u.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)(dt,{item:t})}function bt(e){let{links:t}=e;return(0,u.jsx)("div",{className:"footer__links text--center",children:(0,u.jsx)("div",{className:"footer__links",children:t.map(((e,n)=>(0,u.jsxs)(r.Fragment,{children:[(0,u.jsx)(gt,{item:e}),t.length!==n+1&&(0,u.jsx)(mt,{})]},n)))})})}function yt(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,u.jsx)(ht,{columns:t}):(0,u.jsx)(bt,{links:t})}var vt=n(9965);const wt={footerLogoLink:"footerLogoLink_BH7S"};function xt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.Cg)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,u.jsx)(vt.Z,{className:(0,a.Z)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function kt(e){let{logo:t}=e;return t.href?(0,u.jsx)(K.Z,{href:t.href,className:wt.footerLogoLink,target:t.target,children:(0,u.jsx)(xt,{logo:t})}):(0,u.jsx)(xt,{logo:t})}function St(e){let{copyright:t}=e;return(0,u.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function Et(e){let{style:t,links:n,logo:r,copyright:o}=e;return(0,u.jsx)("footer",{className:(0,a.Z)("footer",{"footer--dark":"dark"===t}),children:(0,u.jsxs)("div",{className:"container container-fluid",children:[n,(r||o)&&(0,u.jsxs)("div",{className:"footer__bottom text--center",children:[r&&(0,u.jsx)("div",{className:"margin-bottom--sm",children:r}),o]})]})})}function _t(){const{footer:e}=(0,w.L)();if(!e)return null;const{copyright:t,links:n,logo:r,style:a}=e;return(0,u.jsx)(Et,{style:a,links:n&&n.length>0&&(0,u.jsx)(yt,{links:n}),logo:r&&(0,u.jsx)(kt,{logo:r}),copyright:t&&(0,u.jsx)(St,{copyright:t})})}const Ct=r.memo(_t),Tt=(0,R.Qc)([M.S,x.p,N.OC,ve.L5,i.VC,function(e){let{children:t}=e;return(0,u.jsx)(A.n2,{children:(0,u.jsx)(L.M,{children:(0,u.jsx)(j,{children:t})})})}]);function Pt(e){let{children:t}=e;return(0,u.jsx)(Tt,{children:t})}var Lt=n(2503);function Nt(e){let{error:t,tryAgain:n}=e;return(0,u.jsx)("main",{className:"container margin-vert--xl",children:(0,u.jsx)("div",{className:"row",children:(0,u.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,u.jsx)(Lt.Z,{as:"h1",className:"hero__title",children:(0,u.jsx)(l.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,u.jsx)("div",{className:"margin-vert--lg",children:(0,u.jsx)(nt.Cw,{onClick:n,className:"button button--primary shadow--lw"})}),(0,u.jsx)("hr",{}),(0,u.jsx)("div",{className:"margin-vert--md",children:(0,u.jsx)(nt.aG,{error:t})})]})})})}const Rt={mainWrapper:"mainWrapper_z2l0"};function At(e){const{children:t,noFooter:n,wrapperClassName:r,title:s,description:l}=e;return(0,b.t)(),(0,u.jsxs)(Pt,{children:[(0,u.jsx)(i.d,{title:s,description:l}),(0,u.jsx)(v,{}),(0,u.jsx)(P,{}),(0,u.jsx)(ut,{}),(0,u.jsx)("div",{id:d,className:(0,a.Z)(g.k.wrapper.main,Rt.mainWrapper,r),children:(0,u.jsx)(o.Z,{fallback:e=>(0,u.jsx)(Nt,{...e}),children:t})}),!n&&(0,u.jsx)(Ct,{})]})}},1327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});n(7294);var r=n(3692),a=n(4996),o=n(2263),i=n(6668),s=n(9965),l=n(5893);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,a.ZP)(t.src),dark:(0,a.ZP)(t.srcDark||t.src)},i=(0,l.jsx)(s.Z,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?(0,l.jsx)("div",{className:r,children:i}):i}function u(e){const{siteConfig:{title:t}}=(0,o.Z)(),{navbar:{title:n,logo:s}}=(0,i.L)(),{imageClassName:u,titleClassName:d,...p}=e,f=(0,a.ZP)(s?.href||"/"),h=n?"":t,m=s?.alt??h;return(0,l.jsxs)(r.Z,{to:f,...p,...s?.target&&{target:s.target},children:[s&&(0,l.jsx)(c,{logo:s,alt:m,imageClassName:u}),null!=n&&(0,l.jsx)("b",{className:d,children:n})]})}},197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});n(7294);var r=n(5742),a=n(5893);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return(0,a.jsxs)(r.Z,{children:[t&&(0,a.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,a.jsx)("meta",{name:"docusaurus_version",content:n}),o&&(0,a.jsx)("meta",{name:"docusaurus_tag",content:o}),i&&(0,a.jsx)("meta",{name:"docsearch:language",content:i}),n&&(0,a.jsx)("meta",{name:"docsearch:version",content:n}),o&&(0,a.jsx)("meta",{name:"docsearch:docusaurus_tag",content:o})]})}},9965:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r=n(7294),a=n(512),o=n(2389),i=n(2949);const s={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var l=n(5893);function c(e){let{className:t,children:n}=e;const c=(0,o.Z)(),{colorMode:u}=(0,i.I)();return(0,l.jsx)(l.Fragment,{children:(c?"dark"===u?["dark"]:["light"]:["light","dark"]).map((e=>{const o=n({theme:e,className:(0,a.Z)(t,s.themedComponent,s[`themedComponent--${e}`])});return(0,l.jsx)(r.Fragment,{children:o},e)}))})}function u(e){const{sources:t,className:n,alt:r,...a}=e;return(0,l.jsx)(c,{className:n,children:e=>{let{theme:n,className:o}=e;return(0,l.jsx)("img",{src:t[n],alt:r,className:o,...a})}})}},6043:(e,t,n)=>{"use strict";n.d(t,{u:()=>c,z:()=>b});var r=n(7294),a=n(412),o=n(469),i=n(1442),s=n(5893);const l="ease-in-out";function c(e){let{initialState:t}=e;const[n,a]=(0,r.useState)(t??!1),o=(0,r.useCallback)((()=>{a((e=>!e))}),[]);return{collapsed:n,setCollapsed:a,toggleCollapsed:o}}const u={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function p(e,t){const n=t?u:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(e){let{collapsibleRef:t,collapsed:n,animation:a}=e;const o=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=a?.duration??function(e){if((0,i.n)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${a?.easing??l}`,height:`${t}px`}}function s(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return p(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(s(),requestAnimationFrame((()=>{e.style.height=u.height,e.style.overflow=u.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{s()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,a])}function h(e){if(!a.Z.canUseDOM)return e?u:d}function m(e){let{as:t="div",collapsed:n,children:a,animation:o,onCollapseTransitionEnd:i,className:l,disableSSRStyle:c}=e;const u=(0,r.useRef)(null);return f({collapsibleRef:u,collapsed:n,animation:o}),(0,s.jsx)(t,{ref:u,style:c?void 0:h(n),onTransitionEnd:e=>{"height"===e.propertyName&&(p(u.current,n),i?.(n))},className:l,children:a})}function g(e){let{collapsed:t,...n}=e;const[a,i]=(0,r.useState)(!t),[l,c]=(0,r.useState)(t);return(0,o.Z)((()=>{t||i(!0)}),[t]),(0,o.Z)((()=>{a&&c(t)}),[a,t]),a?(0,s.jsx)(m,{...n,collapsed:l}):null}function b(e){let{lazy:t,...n}=e;const r=t?g:m;return(0,s.jsx)(r,{...n})}},9689:(e,t,n)=>{"use strict";n.d(t,{n:()=>m,p:()=>h});var r=n(7294),a=n(2389),o=n(812),i=n(902),s=n(6668),l=n(5893);const c=(0,o.WA)("docusaurus.announcement.dismiss"),u=(0,o.WA)("docusaurus.announcement.id"),d=()=>"true"===c.get(),p=e=>c.set(String(e)),f=r.createContext(null);function h(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,s.L)(),t=(0,a.Z)(),[n,o]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{o(d())}),[]);const i=(0,r.useCallback)((()=>{p(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&p(!1),!r&&d()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,l.jsx)(f.Provider,{value:n,children:t})}function m(){const e=(0,r.useContext)(f);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},2949:(e,t,n)=>{"use strict";n.d(t,{I:()=>b,S:()=>g});var r=n(7294),a=n(412),o=n(902),i=n(812),s=n(6668),l=n(5893);const c=r.createContext(void 0),u="theme",d=(0,i.WA)(u),p={light:"light",dark:"dark"},f=e=>e===p.dark?p.dark:p.light,h=e=>a.Z.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),m=e=>{d.set(f(e))};function g(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,s.L)(),[a,o]=(0,r.useState)(h(e));(0,r.useEffect)((()=>{t&&d.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(o(t),a&&m(t)):(o(n?window.matchMedia("(prefers-color-scheme: dark)").matches?p.dark:p.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(a))}),[a]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=d.get();null!==t&&i(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const l=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||l.current?l.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:a,setColorMode:i,get isDarkTheme(){return a===p.dark},setLightTheme(){i(p.light)},setDarkTheme(){i(p.dark)}})),[a,i])}();return(0,l.jsx)(c.Provider,{value:n,children:t})}function b(){const e=(0,r.useContext)(c);if(null==e)throw new o.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},373:(e,t,n)=>{"use strict";n.d(t,{J:()=>v,L5:()=>b});var r=n(7294),a=n(143),o=n(9935),i=n(6668),s=n(2802),l=n(902),c=n(812),u=n(5893);const d=e=>`docs-preferred-version-${e}`,p={save:(e,t,n)=>{(0,c.WA)(d(e),{persistence:t}).set(n)},read:(e,t)=>(0,c.WA)(d(e),{persistence:t}).get(),clear:(e,t)=>{(0,c.WA)(d(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const h=r.createContext(null);function m(){const e=(0,a._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,s]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{s(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=p.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(p.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){p.save(e,t,n),s((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function g(e){let{children:t}=e;const n=m();return(0,u.jsx)(h.Provider,{value:n,children:t})}function b(e){let{children:t}=e;return s.cE?(0,u.jsx)(g,{children:t}):(0,u.jsx)(u.Fragment,{children:t})}function y(){const e=(0,r.useContext)(h);if(!e)throw new l.i6("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=o.m);const t=(0,a.zh)(e),[n,i]=y(),{preferredVersionName:s}=n[e];return{preferredVersion:t.versions.find((e=>e.name===s))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>c,b:()=>l});var r=n(7294),a=n(902),o=n(5893);const i=Symbol("EmptyContext"),s=r.createContext(i);function l(e){let{children:t,name:n,items:a}=e;const i=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return(0,o.jsx)(s.Provider,{value:i,children:t})}function c(){const e=(0,r.useContext)(s);if(e===i)throw new a.i6("DocsSidebarProvider");return e}},4477:(e,t,n)=>{"use strict";n.d(t,{E:()=>l,q:()=>s});var r=n(7294),a=n(902),o=n(5893);const i=r.createContext(null);function s(e){let{children:t,version:n}=e;return(0,o.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(null===e)throw new a.i6("DocsVersionProvider");return e}},2961:(e,t,n)=>{"use strict";n.d(t,{M:()=>f,e:()=>h});var r=n(7294),a=n(3102),o=n(7524),i=n(6550),s=n(902);function l(e){!function(e){const t=(0,i.k6)(),n=(0,s.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}var c=n(6668),u=n(5893);const d=r.createContext(void 0);function p(){const e=function(){const e=(0,a.HY)(),{items:t}=(0,c.L)().navbar;return 0===t.length&&!e.component}(),t=(0,o.i)(),n=!e&&"mobile"===t,[i,s]=(0,r.useState)(!1);l((()=>{if(i)return s(!1),!1}));const u=(0,r.useCallback)((()=>{s((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&s(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:i})),[e,n,u,i])}function f(e){let{children:t}=e;const n=p();return(0,u.jsx)(d.Provider,{value:n,children:t})}function h(){const e=r.useContext(d);if(void 0===e)throw new s.i6("NavbarMobileSidebarProvider");return e}},3102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>l,Zo:()=>c,n2:()=>s});var r=n(7294),a=n(902),o=n(5893);const i=r.createContext(null);function s(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,o.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(!e)throw new a.i6("NavbarSecondaryMenuContentProvider");return e[0]}function c(e){let{component:t,props:n}=e;const o=(0,r.useContext)(i);if(!o)throw new a.i6("NavbarSecondaryMenuContentProvider");const[,s]=o,l=(0,a.Ql)(n);return(0,r.useEffect)((()=>{s({component:t,props:l})}),[s,t,l]),(0,r.useEffect)((()=>()=>s({component:null,props:null})),[s]),null}},9727:(e,t,n)=>{"use strict";n.d(t,{h:()=>a,t:()=>o});var r=n(7294);const a="navigation-with-keyboard";function o(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},7524:(e,t,n)=>{"use strict";n.d(t,{i:()=>s});var r=n(7294),a=n(412);const o={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function s(e){let{desktopBreakpoint:t=i}=void 0===e?{}:e;const[n,s]=(0,r.useState)((()=>"ssr"));return(0,r.useEffect)((()=>{function e(){s(function(e){if(!a.Z.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>e?o.desktop:o.mobile}(t))}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[t]),n}},5281:(e,t,n)=>{"use strict";n.d(t,{k:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",unlistedBanner:"theme-unlisted-banner",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{blogFooterTagsRow:"theme-blog-footer-tags-row",blogFooterEditMetaRow:"theme-blog-footer-edit-meta-row"},pages:{pageFooterEditMetaRow:"theme-pages-footer-edit-meta-row"}}},1442:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{n:()=>r})},2802:(e,t,n)=>{"use strict";n.d(t,{LM:()=>f,_F:()=>g,cE:()=>p,SN:()=>E,lO:()=>x,vY:()=>S,oz:()=>k,s1:()=>w,f:()=>y});var r=n(7294),a=n(6550),o=n(8790),i=n(143),s=n(373),l=n(4477),c=n(1116);function u(e){return Array.from(new Set(e))}var d=n(8596);const p=!!i._r;function f(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=f(t);if(e)return e}}(e):void 0:e.href}const h=(e,t)=>void 0!==e&&(0,d.Mg)(e,t),m=(e,t)=>e.some((e=>g(e,t)));function g(e,t){return"link"===e.type?h(e.href,t):"category"===e.type&&(h(e.href,t)||m(e.items,t))}function b(e,t){switch(e.type){case"category":return g(e,t)||e.items.some((e=>b(e,t)));case"link":return!e.unlisted||g(e,t);default:return!0}}function y(e,t){return(0,r.useMemo)((()=>e.filter((e=>b(e,t)))),[e,t])}function v(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const a=[];return function e(t){for(const o of t)if("category"===o.type&&((0,d.Mg)(o.href,n)||e(o.items))||"link"===o.type&&(0,d.Mg)(o.href,n)){return r&&"category"!==o.type||a.unshift(o),!0}return!1}(t),a}function w(){const e=(0,c.V)(),{pathname:t}=(0,a.TH)(),n=(0,i.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?v({sidebarItems:e.items,pathname:t}):null}function x(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,s.J)(e),a=(0,i.yW)(e);return(0,r.useMemo)((()=>u([t,n,a].filter(Boolean))),[t,n,a])}function k(e,t){const n=x(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function S(e,t){const n=x(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${u(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function E(e){let{route:t}=e;const n=(0,a.TH)(),r=(0,l.E)(),i=t.routes,s=i.find((e=>(0,a.LX)(n.pathname,e)));if(!s)return null;const c=s.sidebar,u=c?r.docsSidebars[c]:void 0;return{docElement:(0,o.H)(i),sidebarName:c,sidebarItems:u}}},9690:(e,t,n)=>{"use strict";n.d(t,{aG:()=>u,Ac:()=>c,Cw:()=>l,QW:()=>d});var r=n(7294),a=n(5999),o=n(8780);const i={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};var s=n(5893);function l(e){return(0,s.jsx)("button",{type:"button",...e,children:(0,s.jsx)(a.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function c(e){let{error:t,tryAgain:n}=e;return(0,s.jsxs)("div",{className:i.errorBoundaryFallback,children:[(0,s.jsx)("p",{children:t.message}),(0,s.jsx)(l,{onClick:n})]})}function u(e){let{error:t}=e;const n=(0,o.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,s.jsx)("p",{className:i.errorBoundaryError,children:n})}class d extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}},1944:(e,t,n)=>{"use strict";n.d(t,{FG:()=>f,d:()=>d,VC:()=>h});var r=n(7294),a=n(512),o=n(5742),i=n(226);function s(){const e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var l=n(4996),c=n(2263);var u=n(5893);function d(e){let{title:t,description:n,keywords:r,image:a,children:i}=e;const s=function(e){const{siteConfig:t}=(0,c.Z)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,l.Cg)(),p=a?d(a,{absolute:!0}):void 0;return(0,u.jsxs)(o.Z,{children:[t&&(0,u.jsx)("title",{children:s}),t&&(0,u.jsx)("meta",{property:"og:title",content:s}),n&&(0,u.jsx)("meta",{name:"description",content:n}),n&&(0,u.jsx)("meta",{property:"og:description",content:n}),r&&(0,u.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),p&&(0,u.jsx)("meta",{property:"og:image",content:p}),p&&(0,u.jsx)("meta",{name:"twitter:image",content:p}),i]})}const p=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(p),s=(0,a.Z)(i,t);return(0,u.jsxs)(p.Provider,{value:s,children:[(0,u.jsx)(o.Z,{children:(0,u.jsx)("html",{className:s})}),n]})}function h(e){let{children:t}=e;const n=s(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const o=`plugin-id-${n.plugin.id}`;return(0,u.jsx)(f,{className:(0,a.Z)(r,o),children:t})}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>s,Qc:()=>u,Ql:()=>c,i6:()=>l,zX:()=>i});var r=n(7294),a=n(469),o=n(5893);function i(e){const t=(0,r.useRef)(e);return(0,a.Z)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function s(e){const t=(0,r.useRef)();return(0,a.Z)((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function c(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return(0,o.jsx)(o.Fragment,{children:e.reduceRight(((e,t)=>(0,o.jsx)(t,{children:e})),n)})}}},8596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>s});var r=n(7294),a=n(723),o=n(2263);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function s(){const{baseUrl:e}=(0,o.Z)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(a).flatMap((e=>e.routes??[])))}(n)}({routes:a.Z,baseUrl:e})),[e])}},2466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>f,OC:()=>c,RF:()=>p});var r=n(7294),a=n(412),o=n(2389),i=(n(469),n(902)),s=n(5893);const l=r.createContext(void 0);function c(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return(0,s.jsx)(l.Provider,{value:n,children:t})}function u(){const e=(0,r.useContext)(l);if(null==e)throw new i.i6("ScrollControllerProvider");return e}const d=()=>a.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function p(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=u(),a=(0,r.useRef)(d()),o=(0,i.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=d();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function f(){const e=(0,r.useRef)(null),t=(0,o.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const a=document.documentElement.scrollTop;(n&&a>e||!n&&at&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},3320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>r,os:()=>a});n(2263);const r="default";function a(e,t){return`docs-${e}-${t}`}},812:(e,t,n)=>{"use strict";n.d(t,{WA:()=>c});n(7294);const r=JSON.parse('{"d":"localStorage","u":""}'),a=r.d;function o(e){let{key:t,oldValue:n,newValue:r,storage:a}=e;if(n===r)return;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,a),window.dispatchEvent(o)}function i(e){if(void 0===e&&(e=a),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,s||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),s=!0),null}var t}let s=!1;const l={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function c(e,t){const n=`${e}${r.u}`;if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(n);const a=i(t?.persistence);return null===a?l:{get:()=>{try{return a.getItem(n)}catch(e){return console.error(`Docusaurus storage error, can't get key=${n}`,e),null}},set:e=>{try{const t=a.getItem(n);a.setItem(n,e),o({key:n,oldValue:t,newValue:e,storage:a})}catch(t){console.error(`Docusaurus storage error, can't set ${n}=${e}`,t)}},del:()=>{try{const e=a.getItem(n);a.removeItem(n),o({key:n,oldValue:e,newValue:null,storage:a})}catch(e){console.error(`Docusaurus storage error, can't delete key=${n}`,e)}},listen:e=>{try{const t=t=>{t.storageArea===a&&t.key===n&&e(t)};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)}catch(t){return console.error(`Docusaurus storage error, can't listen for changes of key=${n}`,t),()=>{}}}}}},4711:(e,t,n)=>{"use strict";n.d(t,{l:()=>i});var r=n(2263),a=n(6550),o=n(8780);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:s}}=(0,r.Z)(),{pathname:l}=(0,a.TH)(),c=(0,o.applyTrailingSlash)(l,{trailingSlash:n,baseUrl:e}),u=s===i?e:e.replace(`/${s}/`,"/"),d=c.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${u}`:`${u}${e}/`}(n)}${d}`}}}},5936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(7294),a=n(6550),o=n(902);function i(e){const t=(0,a.TH)(),n=(0,o.D9)(t),i=(0,o.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6668:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(2263);function a(){return(0,r.Z)().siteConfig.themeConfig}},8802:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.removeTrailingSlash=t.addLeadingSlash=t.addTrailingSlash=void 0;const r=n(5913);function a(e){return e.endsWith("/")?e:`${e}/`}function o(e){return(0,r.removeSuffix)(e,"/")}t.addTrailingSlash=a,t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[i]=e.split(/[#?]/),s="/"===i||i===r?i:(l=i,n?a(l):o(l));var l;return e.replace(i,s)},t.addLeadingSlash=function(e){return(0,r.addPrefix)(e,"/")},t.removeTrailingSlash=o},4143:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},8780:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.removePrefix=t.addSuffix=t.removeSuffix=t.addPrefix=t.removeTrailingSlash=t.addLeadingSlash=t.addTrailingSlash=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var a=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}}),Object.defineProperty(t,"addTrailingSlash",{enumerable:!0,get:function(){return a.addTrailingSlash}}),Object.defineProperty(t,"addLeadingSlash",{enumerable:!0,get:function(){return a.addLeadingSlash}}),Object.defineProperty(t,"removeTrailingSlash",{enumerable:!0,get:function(){return a.removeTrailingSlash}});var o=n(5913);Object.defineProperty(t,"addPrefix",{enumerable:!0,get:function(){return o.addPrefix}}),Object.defineProperty(t,"removeSuffix",{enumerable:!0,get:function(){return o.removeSuffix}}),Object.defineProperty(t,"addSuffix",{enumerable:!0,get:function(){return o.addSuffix}}),Object.defineProperty(t,"removePrefix",{enumerable:!0,get:function(){return o.removePrefix}});var i=n(4143);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return i.getErrorCausalChain}})},5913:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.removePrefix=t.addSuffix=t.removeSuffix=t.addPrefix=void 0,t.addPrefix=function(e,t){return e.startsWith(t)?e:`${t}${e}`},t.removeSuffix=function(e,t){return""===t?e:e.endsWith(t)?e.slice(0,-t.length):e},t.addSuffix=function(e,t){return e.endsWith(t)?e:`${e}${t}`},t.removePrefix=function(e,t){return e.startsWith(t)?e.slice(t.length):e}},311:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});n(7294);var r=n(1728);const a={loadingRing:"loadingRing_RJI3","loading-ring":"loading-ring_FB5o"};var o=n(5893);function i(e){let{className:t}=e;return(0,o.jsxs)("div",{className:(0,r.Z)(a.loadingRing,t),children:[(0,o.jsx)("div",{}),(0,o.jsx)("div",{}),(0,o.jsx)("div",{}),(0,o.jsx)("div",{})]})}},22:(e,t,n)=>{"use strict";n.d(t,{w:()=>s});var r=n(1336),a=n.n(r),o=n(1029);const i=new Map;function s(e,t){const n=`${e}${t}`;let r=i.get(n);return r||(r=async function(e,t){{const n=`${e}${o.J.replace("{dir}",t?`-${t.replace(/\//g,"-")}`:"")}`;if(new URL(n,location.origin).origin!==location.origin)throw new Error("Unexpected version url");const r=await(await fetch(n)).json(),i=r.map(((e,t)=>{let{documents:n,index:r}=e;return{type:t,documents:n,index:a().Index.load(r)}})),s=r.reduce(((e,t)=>{for(const n of t.index.invertedIndex)/\p{Unified_Ideograph}/u.test(n[0][0])&&e.add(n[0]);return e}),new Set);return{wrappedIndexes:i,zhDictionary:Array.from(s)}}return{wrappedIndexes:[],zhDictionary:[]}}(e,t),i.set(n,r)),r}},8202:(e,t,n)=>{"use strict";n.d(t,{v:()=>c});var r=n(1336),a=n.n(r);var o=n(1029);function i(e){return s(e).concat(s(e.filter((e=>{const t=e[e.length-1];return!t.trailing&&t.maybeTyping})),!0))}function s(e,t){return e.map((e=>({tokens:e.map((e=>e.value)),term:e.map((e=>({value:e.value,presence:a().Query.presence.REQUIRED,wildcard:(t?e.trailing||e.maybeTyping:e.trailing)?a().Query.wildcard.TRAILING:a().Query.wildcard.NONE})))})))}var l=n(3545);function c(e,t,n){return function(r,s){const c=function(e,t){if(1===t.length&&["ja","jp","th"].includes(t[0]))return a()[t[0]].tokenizer(e).map((e=>e.toString()));let n=/[^-\s]+/g;return t.includes("zh")&&(n=/\w+|\p{Unified_Ideograph}+/gu),e.toLowerCase().match(n)||[]}(r,o.dK);if(0===c.length)return void s([]);const u=function(e,t){const n=function(e,t){const n=[];return function e(r,a){if(0===r.length)return void n.push(a);const o=r[0];if(/\p{Unified_Ideograph}/u.test(o)){const n=function(e,t){const n=[];return function e(r,a){let o=0,i=!1;for(const s of t)if(r.substr(0,s.length)===s){const t={missed:a.missed,term:a.term.concat({value:s})};r.length>s.length?e(r.substr(s.length),t):n.push(t),i=!0}else for(let t=s.length-1;t>o;t-=1){const l=s.substr(0,t);if(r.substr(0,t)===l){o=t;const s={missed:a.missed,term:a.term.concat({value:l,trailing:!0})};r.length>t?e(r.substr(t),s):n.push(s),i=!0;break}}i||(r.length>0?e(r.substr(1),{missed:a.missed+1,term:a.term}):a.term.length>0&&n.push(a))}(e,{missed:0,term:[]}),n.sort(((e,t)=>{const n=e.missed>0?1:0,r=t.missed>0?1:0;return n!==r?n-r:e.term.length-t.term.length})).map((e=>e.term))}(o,t);for(const t of n){const n=a.concat(...t);e(r.slice(1),n)}}else{const t=a.concat({value:o});e(r.slice(1),t)}}(e,[]),n}(e,t);if(0===n.length)return[{tokens:e,term:e.map((e=>({value:e,presence:a().Query.presence.REQUIRED,wildcard:a().Query.wildcard.LEADING|a().Query.wildcard.TRAILING})))}];for(const a of n)a[a.length-1].maybeTyping=!0;const r=[];for(const i of o.dK)if("en"===i)o._k||r.unshift(a().stopWordFilter);else{const e=a()[i];e.stopWordFilter&&r.unshift(e.stopWordFilter)}let s;if(r.length>0){const e=e=>r.reduce(((e,t)=>e.filter((e=>t(e.value)))),e);s=[];const t=[];for(const r of n){const n=e(r);s.push(n),n.length0&&t.push(n)}n.push(...t)}else s=n.slice();const l=[];for(const a of s)if(a.length>2)for(let e=a.length-1;e>=0;e-=1)l.push(a.slice(0,e).concat(a.slice(e+1)));return i(n).concat(i(l))}(c,t),d=[];e:for(const{term:t,tokens:a}of u)for(const{documents:r,index:o,type:i}of e)if(d.push(...o.query((e=>{for(const n of t)e.term(n.value,{wildcard:n.wildcard,presence:n.presence})})).slice(0,n).filter((e=>!d.some((t=>t.document.i.toString()===e.ref)))).slice(0,n-d.length).map((t=>{const n=r.find((e=>e.i.toString()===t.ref));return{document:n,type:i,page:i!==l.P.Title&&e[0].documents.find((e=>e.i===n.p)),metadata:t.matchData.metadata,tokens:a,score:t.score}}))),d.length>=n)break e;!function(e){e.forEach(((e,t)=>{e.index=t})),e.sort(((t,n)=>{let r=t.type!==l.P.Heading&&t.type!==l.P.Content&&t.type!==l.P.Description||!t.page?t.index:e.findIndex((e=>e.document===t.page)),a=n.type!==l.P.Heading&&n.type!==l.P.Content&&n.type!==l.P.Description||!n.page?n.index:e.findIndex((e=>e.document===n.page));if(-1===r&&(r=t.index),-1===a&&(a=n.index),r===a){const e=(0===n.type?1:0)-(0===t.type?1:0);return 0===e?t.index-n.index:e}return r-a}))}(d),function(e){e.forEach(((t,n)=>{n>0&&t.page&&e.slice(0,n).some((e=>(e.type===l.P.Keywords?e.page:e.document)===t.page))&&(n{"use strict";function r(e){return e.join(" \u203a ")}n.d(t,{e:()=>r})},1690:(e,t,n)=>{"use strict";function r(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}n.d(t,{X:()=>r})},1073:(e,t,n)=>{"use strict";function r(e,t){const n=[];for(const r of Object.values(e))r[t]&&n.push(...r[t].position);return n.sort(((e,t)=>e[0]-t[0]||t[1]-e[1]))}n.d(t,{m:()=>r})},2539:(e,t,n)=>{"use strict";n.d(t,{C:()=>a});var r=n(1690);function a(e,t,n){const o=[];for(const i of t){const n=e.toLowerCase().indexOf(i);if(n>=0){n>0&&o.push(a(e.substr(0,n),t)),o.push(`${(0,r.X)(e.substr(n,i.length))}`);const s=n+i.length;s${(0,r.X)(e)}`:(0,r.X)(e):o.join("")}},726:(e,t,n)=>{"use strict";n.d(t,{o:()=>l});var r=n(1690),a=n(2539);const o=/\w+|\p{Unified_Ideograph}/u;function i(e){const t=[];let n=0,r=e;for(;r.length>0;){const a=r.match(o);if(!a){t.push(r);break}a.index>0&&t.push(r.substring(0,a.index)),t.push(a[0]),n+=a.index+a[0].length,r=e.substring(n)}return t}var s=n(1029);function l(e,t,n,o){void 0===o&&(o=s.Hk);const{chunkIndex:l,chunks:c}=function(e,t,n){const o=[];let s=0,l=0,c=-1;for(;sl){const t=i(e.substring(l,u)).map((e=>({html:(0,r.X)(e),textLength:e.length})));for(const e of t)o.push(e)}-1===c&&(c=o.length),l=u+d,o.push({html:(0,a.C)(e.substring(u,l),n,!0),textLength:d})}}if(l({html:(0,r.X)(e),textLength:e.length})));for(const e of t)o.push(e)}return{chunkIndex:c,chunks:o}}(e,t,n),u=c.slice(0,l),d=c[l],p=[d.html],f=c.slice(l+1);let h=d.textLength,m=0,g=0,b=!1,y=!1;for(;h0){const e=u.pop();h+e.textLength<=o?(p.unshift(e.html),m+=e.textLength,h+=e.textLength):(b=!0,u.length=0)}else{if(!(f.length>0))break;{const e=f.shift();h+e.textLength<=o?(p.push(e.html),g+=e.textLength,h+=e.textLength):(y=!0,f.length=0)}}return(b||u.length>0)&&p.unshift("\u2026"),(y||f.length>0)&&p.push("\u2026"),p.join("")}},51:(e,t,n)=>{"use strict";function r(e,t){if("string"==typeof e)return{label:e,path:e};{const{label:n,path:r}=e;return"string"==typeof n?{label:n,path:r}:Object.prototype.hasOwnProperty.call(n,t)?{label:n[t],path:r}:{label:r,path:r}}}n.d(t,{_:()=>r})},1029:(e,t,n)=>{"use strict";n.d(t,{vc:()=>o,gQ:()=>f,H6:()=>c,hG:()=>g,l9:()=>h,dK:()=>r,_k:()=>a,pu:()=>p,AY:()=>u,t_:()=>d,Kc:()=>m,J:()=>i,Hk:()=>l,qo:()=>s,pQ:()=>b});n(1336);const r=["en"],a=!1,o=null,i="search-index{dir}.json?_=ab5237c4",s=8,l=50,c=!1,u=!0,d=!0,p="right",f=void 0,h=!0,m=null,g=!1,b=!1},3545:(e,t,n)=>{"use strict";var r;n.d(t,{P:()=>r}),function(e){e[e.Title=0]="Title",e[e.Heading=1]="Heading",e[e.Description=2]="Description",e[e.Keywords=3]="Keywords",e[e.Content=4]="Content"}(r||(r={}))},9318:(e,t,n)=>{"use strict";n.d(t,{lX:()=>w,q_:()=>C,ob:()=>f,PP:()=>P,Ep:()=>p});var r=n(3117);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r=0;p--){var f=i[p];"."===f?o(i,p):".."===f?(o(i,p),d++):d&&(o(i,p),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&a(i[0])||i.unshift("");var h=i.join("/");return n&&"/"!==h.substr(-1)&&(h+="/"),h};var s=n(8776);function l(e){return"/"===e.charAt(0)?e:"/"+e}function c(e){return"/"===e.charAt(0)?e.substr(1):e}function u(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function p(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function f(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.Z)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(s){throw s instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):s}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function h(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=f(e,t,m(),w.location);u.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(9864),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function l(e){return r.isMemo(e)?i:s[e.$$typeof]||a}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,h=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(h){var a=f(n);a&&a!==h&&e(t,a,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var s=l(t),m=l(n),g=0;g{"use strict";e.exports=function(e,t,n,r,a,o,i,s){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,a,o,i,s],u=0;(l=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},1336:(e,t,n)=>{var r,a;!function(){var o,i,s,l,c,u,d,p,f,h,m,g,b,y,v,w,x,k,S,E,_,C,T,P,L,N,R,A,O,j,I=function(e){var t=new I.Builder;return t.pipeline.add(I.trimmer,I.stopWordFilter,I.stemmer),t.searchPipeline.add(I.stemmer),e.call(t,t),t.build()};I.version="2.3.9",I.utils={},I.utils.warn=(o=this,function(e){o.console&&console.warn&&console.warn(e)}),I.utils.asString=function(e){return null==e?"":e.toString()},I.utils.clone=function(e){if(null==e)return e;for(var t=Object.create(null),n=Object.keys(e),r=0;r0){var l=I.utils.clone(t)||{};l.position=[i,s],l.index=a.length,a.push(new I.Token(n.slice(i,o),l))}i=o+1}}return a},I.tokenizer.separator=/[\s\-]+/,I.Pipeline=function(){this._stack=[]},I.Pipeline.registeredFunctions=Object.create(null),I.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&I.utils.warn("Overwriting existing registered function: "+t),e.label=t,I.Pipeline.registeredFunctions[e.label]=e},I.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||I.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},I.Pipeline.load=function(e){var t=new I.Pipeline;return e.forEach((function(e){var n=I.Pipeline.registeredFunctions[e];if(!n)throw new Error("Cannot load unregistered function: "+e);t.add(n)})),t},I.Pipeline.prototype.add=function(){Array.prototype.slice.call(arguments).forEach((function(e){I.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)}),this)},I.Pipeline.prototype.after=function(e,t){I.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");n+=1,this._stack.splice(n,0,t)},I.Pipeline.prototype.before=function(e,t){I.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");this._stack.splice(n,0,t)},I.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},I.Pipeline.prototype.run=function(e){for(var t=this._stack.length,n=0;n1&&(oe&&(n=a),o!=e);)r=n-t,a=t+Math.floor(r/2),o=this.elements[2*a];return o==e||o>e?2*a:os?c+=2:i==s&&(t+=n[l+1]*r[c+1],l+=2,c+=2);return t},I.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},I.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,n=0;t0){var o,i=a.str.charAt(0);i in a.node.edges?o=a.node.edges[i]:(o=new I.TokenSet,a.node.edges[i]=o),1==a.str.length&&(o.final=!0),r.push({node:o,editsRemaining:a.editsRemaining,str:a.str.slice(1)})}if(0!=a.editsRemaining){if("*"in a.node.edges)var s=a.node.edges["*"];else{s=new I.TokenSet;a.node.edges["*"]=s}if(0==a.str.length&&(s.final=!0),r.push({node:s,editsRemaining:a.editsRemaining-1,str:a.str}),a.str.length>1&&r.push({node:a.node,editsRemaining:a.editsRemaining-1,str:a.str.slice(1)}),1==a.str.length&&(a.node.final=!0),a.str.length>=1){if("*"in a.node.edges)var l=a.node.edges["*"];else{l=new I.TokenSet;a.node.edges["*"]=l}1==a.str.length&&(l.final=!0),r.push({node:l,editsRemaining:a.editsRemaining-1,str:a.str.slice(1)})}if(a.str.length>1){var c,u=a.str.charAt(0),d=a.str.charAt(1);d in a.node.edges?c=a.node.edges[d]:(c=new I.TokenSet,a.node.edges[d]=c),1==a.str.length&&(c.final=!0),r.push({node:c,editsRemaining:a.editsRemaining-1,str:u+a.str.slice(2)})}}}return n},I.TokenSet.fromString=function(e){for(var t=new I.TokenSet,n=t,r=0,a=e.length;r=e;t--){var n=this.uncheckedNodes[t],r=n.child.toString();r in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[r]:(n.child._str=r,this.minimizedNodes[r]=n.child),this.uncheckedNodes.pop()}},I.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},I.Index.prototype.search=function(e){return this.query((function(t){new I.QueryParser(e,t).parse()}))},I.Index.prototype.query=function(e){for(var t=new I.Query(this.fields),n=Object.create(null),r=Object.create(null),a=Object.create(null),o=Object.create(null),i=Object.create(null),s=0;s1?1:e},I.Builder.prototype.k1=function(e){this._k1=e},I.Builder.prototype.add=function(e,t){var n=e[this._ref],r=Object.keys(this._fields);this._documents[n]=t||{},this.documentCount+=1;for(var a=0;a=this.length)return I.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},I.QueryLexer.prototype.width=function(){return this.pos-this.start},I.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},I.QueryLexer.prototype.backup=function(){this.pos-=1},I.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do{t=(e=this.next()).charCodeAt(0)}while(t>47&&t<58);e!=I.QueryLexer.EOS&&this.backup()},I.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(I.QueryLexer.TERM)),e.ignore(),e.more())return I.QueryLexer.lexText},I.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(I.QueryLexer.EDIT_DISTANCE),I.QueryLexer.lexText},I.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(I.QueryLexer.BOOST),I.QueryLexer.lexText},I.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(I.QueryLexer.TERM)},I.QueryLexer.termSeparator=I.tokenizer.separator,I.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==I.QueryLexer.EOS)return I.QueryLexer.lexEOS;if(92!=t.charCodeAt(0)){if(":"==t)return I.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(I.QueryLexer.TERM),I.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(I.QueryLexer.TERM),I.QueryLexer.lexBoost;if("+"==t&&1===e.width())return e.emit(I.QueryLexer.PRESENCE),I.QueryLexer.lexText;if("-"==t&&1===e.width())return e.emit(I.QueryLexer.PRESENCE),I.QueryLexer.lexText;if(t.match(I.QueryLexer.termSeparator))return I.QueryLexer.lexTerm}else e.escapeCharacter()}},I.QueryParser=function(e,t){this.lexer=new I.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},I.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=I.QueryParser.parseClause;e;)e=e(this);return this.query},I.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},I.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},I.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},I.QueryParser.parseClause=function(e){var t=e.peekLexeme();if(null!=t)switch(t.type){case I.QueryLexer.PRESENCE:return I.QueryParser.parsePresence;case I.QueryLexer.FIELD:return I.QueryParser.parseField;case I.QueryLexer.TERM:return I.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(n+=" with value '"+t.str+"'"),new I.QueryParseError(n,t.start,t.end)}},I.QueryParser.parsePresence=function(e){var t=e.consumeLexeme();if(null!=t){switch(t.str){case"-":e.currentClause.presence=I.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=I.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+t.str+"'";throw new I.QueryParseError(n,t.start,t.end)}var r=e.peekLexeme();if(null==r){n="expecting term or field, found nothing";throw new I.QueryParseError(n,t.start,t.end)}switch(r.type){case I.QueryLexer.FIELD:return I.QueryParser.parseField;case I.QueryLexer.TERM:return I.QueryParser.parseTerm;default:n="expecting term or field, found '"+r.type+"'";throw new I.QueryParseError(n,r.start,r.end)}}},I.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(null!=t){if(-1==e.query.allFields.indexOf(t.str)){var n=e.query.allFields.map((function(e){return"'"+e+"'"})).join(", "),r="unrecognised field '"+t.str+"', possible fields: "+n;throw new I.QueryParseError(r,t.start,t.end)}e.currentClause.fields=[t.str];var a=e.peekLexeme();if(null==a){r="expecting term, found nothing";throw new I.QueryParseError(r,t.start,t.end)}if(a.type===I.QueryLexer.TERM)return I.QueryParser.parseTerm;r="expecting term, found '"+a.type+"'";throw new I.QueryParseError(r,a.start,a.end)}},I.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(null!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(null!=n)switch(n.type){case I.QueryLexer.TERM:return e.nextClause(),I.QueryParser.parseTerm;case I.QueryLexer.FIELD:return e.nextClause(),I.QueryParser.parseField;case I.QueryLexer.EDIT_DISTANCE:return I.QueryParser.parseEditDistance;case I.QueryLexer.BOOST:return I.QueryParser.parseBoost;case I.QueryLexer.PRESENCE:return e.nextClause(),I.QueryParser.parsePresence;default:var r="Unexpected lexeme type '"+n.type+"'";throw new I.QueryParseError(r,n.start,n.end)}else e.nextClause()}},I.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="edit distance must be numeric";throw new I.QueryParseError(r,t.start,t.end)}e.currentClause.editDistance=n;var a=e.peekLexeme();if(null!=a)switch(a.type){case I.QueryLexer.TERM:return e.nextClause(),I.QueryParser.parseTerm;case I.QueryLexer.FIELD:return e.nextClause(),I.QueryParser.parseField;case I.QueryLexer.EDIT_DISTANCE:return I.QueryParser.parseEditDistance;case I.QueryLexer.BOOST:return I.QueryParser.parseBoost;case I.QueryLexer.PRESENCE:return e.nextClause(),I.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+a.type+"'";throw new I.QueryParseError(r,a.start,a.end)}else e.nextClause()}},I.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="boost must be numeric";throw new I.QueryParseError(r,t.start,t.end)}e.currentClause.boost=n;var a=e.peekLexeme();if(null!=a)switch(a.type){case I.QueryLexer.TERM:return e.nextClause(),I.QueryParser.parseTerm;case I.QueryLexer.FIELD:return e.nextClause(),I.QueryParser.parseField;case I.QueryLexer.EDIT_DISTANCE:return I.QueryParser.parseEditDistance;case I.QueryLexer.BOOST:return I.QueryParser.parseBoost;case I.QueryLexer.PRESENCE:return e.nextClause(),I.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+a.type+"'";throw new I.QueryParseError(r,a.start,a.end)}else e.nextClause()}},void 0===(a="function"==typeof(r=function(){return I})?r.call(t,n,t,e):r)||(e.exports=a)}()},2497:(e,t,n)=>{"use strict";n.r(t)},2295:(e,t,n)=>{"use strict";n.r(t)},4865:function(e,t,n){var r,a;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function a(e,t,n){return en?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),c=o.querySelector(r.barSelector),u=r.speed,d=r.easing;return o.offsetWidth,s((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(c,i(e,u,d)),1===e?(l(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){l(o,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*a(Math.random()*t,.1,.95)),t=a(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var a,i=t.querySelector(r.barSelector),s=e?"-100":o(n.status||0),c=document.querySelector(r.parent);return l(i,{transition:"all 0 linear",transform:"translate3d("+s+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&f(a),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var s=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),l=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function c(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=p(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},7874:()=>{!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var a=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,i=0;i{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,s=i.length;-1!==n.code.indexOf(a=t(r,s));)++s;return i[s]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(s){for(var l=0;l=o.length);l++){var c=s[l];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=o[a],d=n.tokenStack[u],p="string"==typeof c?c:c.content,f=t(r,u),h=p.indexOf(f);if(h>-1){++a;var m=p.substring(0,h),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=p.substring(h+f.length),y=[];m&&y.push.apply(y,i([m])),y.push(g),b&&y.push.apply(y,i([b])),"string"==typeof c?s.splice.apply(s,[l,1].concat(y)):c.content=y}}else c.content&&i(c.content)}return s}(n.tokens)}}}})}(Prism)},893:()=>{Prism.languages.solidity=Prism.languages.extend("clike",{"class-name":{pattern:/(\b(?:contract|enum|interface|library|new|struct|using)\s+)(?!\d)[\w$]+/,lookbehind:!0},keyword:/\b(?:_|anonymous|as|assembly|assert|break|calldata|case|constant|constructor|continue|contract|default|delete|do|else|emit|enum|event|external|for|from|function|if|import|indexed|inherited|interface|internal|is|let|library|mapping|memory|modifier|new|payable|pragma|private|public|pure|require|returns?|revert|selfdestruct|solidity|storage|struct|suicide|switch|this|throw|using|var|view|while)\b/,operator:/=>|->|:=|=:|\*\*|\+\+|--|\|\||&&|<<=?|>>=?|[-+*/%^&|<>!=]=?|[~?]/}),Prism.languages.insertBefore("solidity","keyword",{builtin:/\b(?:address|bool|byte|u?int(?:8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?|string|bytes(?:[1-9]|[12]\d|3[0-2])?)\b/}),Prism.languages.insertBefore("solidity","number",{version:{pattern:/([<>]=?|\^)\d+\.\d+\.\d+\b/,lookbehind:!0,alias:"number"}}),Prism.languages.sol=Prism.languages.solidity},1881:(e,t,n)=>{var r={"./prism-bash":7874,"./prism-solidity":893};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=1881},2703:(e,t,n)=>{"use strict";var r=n(414);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return n.PropTypes=n,n}},5697:(e,t,n)=>{e.exports=n(2703)()},414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4448:(e,t,n)=>{"use strict";var r=n(7294),a=n(3840);function o(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n