[{"data":1,"prerenderedAt":755},["ShallowReactive",2],{"fougere:post.list:{}":3,"docs:\u002Fdocs\u002Fadopt\u002Fanother-repository":6,"docs-uses":448,"docs-nav":617},{"items":4,"hasMore":5},[],false,{"id":7,"title":8,"body":9,"description":435,"extension":436,"forms":437,"kind":438,"meta":439,"navigation":330,"path":440,"seo":441,"stem":442,"step":443,"uses":444,"__hash__":447},"docs\u002Fdocs\u002F7.adopt\u002F5.another-repository.md","A frond from another repository",{"type":10,"value":11,"toc":430},"minimark",[12,21,26,29,96,103,107,110,171,184,188,202,390,403,417,426],[13,14,15,16,20],"p",{},"A frond can live in another repository, with its own team and release cycle. Your app still calls\nit. What has to reach your repository is its ",[17,18,19],"strong",{},"contract"," — its entities and operations — never its\ncode.",[22,23,25],"h2",{"id":24},"get-the-contract","Get the contract",[13,27,28],{},"Two commands, depending on how the other team shares it:",[30,31,32,47],"table",{},[33,34,35],"thead",{},[36,37,38,41,44],"tr",{},[39,40],"th",{},[39,42,43],{},"What it does",[39,45,46],{},"When",[48,49,50,76],"tbody",{},[36,51,52,63,73],{},[53,54,55],"td",{},[56,57,59],"a",{"href":58},"\u002Freference\u002Fcli#fougere-sync-consume-a-remote-frond",[60,61,62],"code",{},"fougere sync",[53,64,65,66,69,70],{},"asks the running frond for its card (",[60,67,68],{},"rpc.discover",") and writes its entities and facade into ",[60,71,72],{},"remotes\u002F",[53,74,75],{},"the frond is running — also the only way to use a frond written in another language",[36,77,78,86,93],{},[53,79,80],{},[56,81,83],{"href":82},"\u002Freference\u002Fcli#fougere-build-frond-publish-a-fronds-entities",[60,84,85],{},"fougere build-frond",[53,87,88,89,92],{},"compiles its ",[60,90,91],{},"entities\u002F"," into a package you install",[53,94,95],{},"the other team publishes its contract as a dependency",[13,97,98,99,102],{},"Either way ",[60,100,101],{},"@fronds\u002F\u003Cname>"," resolves, so your pages and handlers import the frond the same way as\none of your own.",[22,104,106],{"id":105},"call-it","Call it",[13,108,109],{},"Give it its address, as for any frond in another process:",[111,112,117],"pre",{"className":113,"code":114,"language":115,"meta":116,"style":116},"language-ts shiki shiki-themes material-theme-lighter fougere-pastel material-theme-palenight","\u002F\u002F fougere.config.ts\nfronds: { billing: { remote: 'https:\u002F\u002Fbilling.internal' } },\n","ts","",[60,118,119,128],{"__ignoreMap":116},[120,121,124],"span",{"class":122,"line":123},"line",1,[120,125,127],{"class":126},"skXKP","\u002F\u002F fougere.config.ts\n",[120,129,131,135,139,142,145,147,149,152,154,158,162,165,168],{"class":122,"line":130},2,[120,132,134],{"class":133},"sWI7z","fronds",[120,136,138],{"class":137},"s15xx",":",[120,140,141],{"class":137}," {",[120,143,144],{"class":133}," billing",[120,146,138],{"class":137},[120,148,141],{"class":137},[120,150,151],{"class":133}," remote",[120,153,138],{"class":137},[120,155,157],{"class":156},"sDDC1"," '",[120,159,161],{"class":160},"sN-8n","https:\u002F\u002Fbilling.internal",[120,163,164],{"class":156},"'",[120,166,167],{"class":137}," }",[120,169,170],{"class":137}," },\n",[13,172,173,174,178,179,183],{},"The two processes must be able to reach each other, and the receiver must know who calls it:\n",[56,175,177],{"href":176},"\u002Fdocs\u002Frun\u002Fdeploy#splitting-in-production","Deploy a split"," and\n",[56,180,182],{"href":181},"\u002Fdocs\u002Frun\u002Fsecure","Secure calls between processes",".",[22,185,187],{"id":186},"facts-across-repositories","Facts across repositories",[13,189,190,193,194,197,198,201],{},[17,191,192],{},"Finding the listeners."," When the other frond has an address in your ",[60,195,196],{},"fronds:",", its card says which\nfacts it accepts, and an announcement reaches it as a call — nothing more to write. A call keeps\nnothing, though: a listener that is down misses the fact. When that matters, or when the other side\nhas no address you can call, put a ",[17,199,200],{},"carrier"," under the announcement — a queue or a broker of your\nown. Both sides meet on the fact's name, read off their own code:",[111,203,205],{"className":113,"code":204,"language":115,"meta":116,"style":116},"const app = await createApp({\n  root: import.meta.dirname,\n  createContainer,\n  onEmit: (fact, payload) => publishToYourBroker(fact, payload),   \u002F\u002F out\n});\n\n\u002F\u002F in — the same local dispatch, validation and links included\nawait app.deliver(fact, payload);\n\u002F\u002F what to subscribe to, read off your own signatures\napp.listensTo();                                                   \u002F\u002F ['postPublished']\n",[60,206,207,235,260,268,314,325,332,338,364,370],{"__ignoreMap":116},[120,208,209,213,217,220,224,228,232],{"class":122,"line":123},[120,210,212],{"class":211},"s76I7","const",[120,214,216],{"class":215},"sPEhv"," app ",[120,218,219],{"class":137},"=",[120,221,223],{"class":222},"sK6XW"," await",[120,225,227],{"class":226},"s4mR9"," createApp",[120,229,231],{"class":230},"srlTG","(",[120,233,234],{"class":137},"{\n",[120,236,237,241,243,246,248,252,254,257],{"class":122,"line":130},[120,238,240],{"class":239},"sHtqg","  root",[120,242,138],{"class":137},[120,244,245],{"class":222}," import",[120,247,183],{"class":137},[120,249,251],{"class":250},"sy9f4","meta",[120,253,183],{"class":137},[120,255,256],{"class":250},"dirname",[120,258,259],{"class":137},",\n",[120,261,263,266],{"class":122,"line":262},3,[120,264,265],{"class":215},"  createContainer",[120,267,259],{"class":137},[120,269,271,274,276,279,283,286,289,292,296,299,301,303,305,307,309,311],{"class":122,"line":270},4,[120,272,273],{"class":226},"  onEmit",[120,275,138],{"class":137},[120,277,278],{"class":137}," (",[120,280,282],{"class":281},"shDUQ","fact",[120,284,285],{"class":137},",",[120,287,288],{"class":281}," payload",[120,290,291],{"class":137},")",[120,293,295],{"class":294},"scTuO"," =>",[120,297,298],{"class":226}," publishToYourBroker",[120,300,231],{"class":230},[120,302,282],{"class":215},[120,304,285],{"class":137},[120,306,288],{"class":215},[120,308,291],{"class":230},[120,310,285],{"class":137},[120,312,313],{"class":126},"   \u002F\u002F out\n",[120,315,317,320,322],{"class":122,"line":316},5,[120,318,319],{"class":137},"}",[120,321,291],{"class":230},[120,323,324],{"class":137},";\n",[120,326,328],{"class":122,"line":327},6,[120,329,331],{"emptyLinePlaceholder":330},true,"\n",[120,333,335],{"class":122,"line":334},7,[120,336,337],{"class":126},"\u002F\u002F in — the same local dispatch, validation and links included\n",[120,339,341,344,347,349,352,354,356,358,360,362],{"class":122,"line":340},8,[120,342,343],{"class":222},"await",[120,345,346],{"class":215}," app",[120,348,183],{"class":137},[120,350,351],{"class":226},"deliver",[120,353,231],{"class":230},[120,355,282],{"class":215},[120,357,285],{"class":137},[120,359,288],{"class":215},[120,361,291],{"class":230},[120,363,324],{"class":137},[120,365,367],{"class":122,"line":366},9,[120,368,369],{"class":126},"\u002F\u002F what to subscribe to, read off your own signatures\n",[120,371,373,376,378,381,384,387],{"class":122,"line":372},10,[120,374,375],{"class":215},"app",[120,377,183],{"class":137},[120,379,380],{"class":226},"listensTo",[120,382,383],{"class":230},"()",[120,385,386],{"class":137},";",[120,388,389],{"class":126},"                                                   \u002F\u002F ['postPublished']\n",[13,391,392,395,396,398,399,183],{},[17,393,394],{},"Knowing the shape."," A frond's card lists every fact its handlers announce, so ",[60,397,62],{}," writes\nthe fact's class rather than you copying its fields. Re-export it into one of your fronds, and an\narriving fact is checked against the announcer's own declaration. When the shape changes, readers\ndeploy before the sender: see ",[56,400,402],{"href":401},"\u002Fdocs\u002Fconcepts\u002Ffact#changing-a-fact","Changing a fact",[13,404,405,406,412,413,416],{},"A carrier has no address. An announcement and a listener name nobody, so a carrier can take a fact\nacross. A ",[56,407,409],{"href":408},"\u002Fdocs\u002Fbehaviour\u002Ffinish-a-fact",[60,410,411],{},"Pipe\u003CT>"," is called and answers, so it needs an address —\nit crosses processes, never a carrier. ",[60,414,415],{},"Emit\u003CT, A>"," draws the same line: it needs answers back.",[13,418,419,425],{},[56,420,424],{"href":421,"rel":422},"https:\u002F\u002Fgithub.com\u002Fchok\u002Ffougere\u002Ftree\u002Fmain\u002Fdemos\u002Femit-multirepo",[423],"nofollow","emit-multirepo"," runs two projects and\none fact, and loses the first publication on purpose to show what a carrier buys.",[427,428,429],"style",{},"html pre.shiki code .skXKP, html code.shiki .skXKP{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#7D8C80;--shiki-default-font-style:inherit;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sWI7z, html code.shiki .sWI7z{--shiki-light:#E2931D;--shiki-default:#93CFC0;--shiki-dark:#FFCB6B}html pre.shiki code .s15xx, html code.shiki .s15xx{--shiki-light:#39ADB5;--shiki-default:#A3B0A5;--shiki-dark:#89DDFF}html pre.shiki code .sDDC1, html code.shiki .sDDC1{--shiki-light:#39ADB5;--shiki-default:#EE9F6B;--shiki-dark:#89DDFF}html pre.shiki code .sN-8n, html code.shiki .sN-8n{--shiki-light:#91B859;--shiki-default:#EE9F6B;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s76I7, html code.shiki .s76I7{--shiki-light:#9C3EDA;--shiki-default:#8FCF86;--shiki-dark:#C792EA}html pre.shiki code .sPEhv, html code.shiki .sPEhv{--shiki-light:#90A4AE;--shiki-default:#DDE5DA;--shiki-dark:#BABED8}html pre.shiki code .sK6XW, html code.shiki .sK6XW{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#8FCF86;--shiki-default-font-style:inherit;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s4mR9, html code.shiki .s4mR9{--shiki-light:#6182B8;--shiki-default:#C9B6EA;--shiki-dark:#82AAFF}html pre.shiki code .srlTG, html code.shiki .srlTG{--shiki-light:#90A4AE;--shiki-default:#A3B0A5;--shiki-dark:#BABED8}html pre.shiki code .sHtqg, html code.shiki .sHtqg{--shiki-light:#E53935;--shiki-default:#93CFC0;--shiki-dark:#F07178}html pre.shiki code .sy9f4, html code.shiki .sy9f4{--shiki-light:#90A4AE;--shiki-default:#93CFC0;--shiki-dark:#BABED8}html pre.shiki code .shDUQ, html code.shiki .shDUQ{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#DDE5DA;--shiki-default-font-style:inherit;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .scTuO, html code.shiki .scTuO{--shiki-light:#9C3EDA;--shiki-default:#A3B0A5;--shiki-dark:#C792EA}",{"title":116,"searchDepth":130,"depth":130,"links":431},[432,433,434],{"id":24,"depth":130,"text":25},{"id":105,"depth":130,"text":106},{"id":186,"depth":130,"text":187},"Call a frond whose code is not here.","md",[62,85],"task",{},"\u002Fdocs\u002Fadopt\u002Fanother-repository",{"title":8,"description":435},"docs\u002F7.adopt\u002F5.another-repository",null,[445,446],"facade","frond","sSsN8Q7BbCD9uwi2l2MbVytWgjD2Tkw2SPkC-7xru2s",[449,452,455,458,461,464,467,470,473,478,484,489,493,497,501,505,509,514,518,522,525,529,533,537,541,544,546,550,554,558,562,566,570,574,578,580,584,587,590,593,596,599,602,605,608,611,614],{"path":450,"title":451,"uses":443},"\u002Fdocs\u002Fconcepts\u002Fentity","Entity",{"path":453,"title":454,"uses":443},"\u002Fdocs\u002Fconcepts\u002Fhandler","Handler",{"path":456,"title":457,"uses":443},"\u002Fdocs\u002Fconcepts\u002Frepository","Repository",{"path":459,"title":460,"uses":443},"\u002Fdocs\u002Fconcepts\u002Ffrond","Frond",{"path":462,"title":463,"uses":443},"\u002Fdocs\u002Fconcepts\u002Ffacade","Facade",{"path":465,"title":466,"uses":443},"\u002Fdocs\u002Fconcepts\u002Ffact","Fact",{"path":468,"title":469,"uses":443},"\u002Fdocs\u002Fconcepts\u002Fport","Port",{"path":471,"title":472,"uses":443},"\u002Fdocs\u002Fconcepts\u002Fconfiguration","Configuration",{"path":474,"title":475,"uses":476},"\u002Fdocs\u002Faccess\u002Fauthentication","Authentication",[477,446],"port",{"path":479,"title":480,"uses":481},"\u002Fdocs\u002Faccess\u002Fstate","Keep a caller's state",[482,483],"configuration","handler",{"path":485,"title":486,"uses":487},"\u002Fdocs\u002Fdata\u002Fsql","SQLite or Postgres",[488,482],"entity",{"path":490,"title":491,"uses":492},"\u002Fdocs\u002Fdata\u002Fseveral-databases","Several databases",[482,488],{"path":494,"title":495,"uses":496},"\u002Fdocs\u002Fdata\u002Fcomputed-field","A computed field",[488,477],{"path":498,"title":499,"uses":500},"\u002Fdocs\u002Fdata\u002Fevolve","Evolve a schema",[488],{"path":502,"title":503,"uses":504},"\u002Fdocs\u002Fdata\u002Fseeds","Seed data",[488],{"path":506,"title":507,"uses":508},"\u002Fdocs\u002Fdata\u002Fvalues","Read settings and secrets",[488,482],{"path":510,"title":511,"uses":512},"\u002Fdocs\u002Fdata\u002Fmirror","Mirror a source you cannot query",[513],"repository",{"path":515,"title":516,"uses":517},"\u002Fdocs\u002Fdata\u002Ftogether","Two writes as one",[513],{"path":519,"title":520,"uses":521},"\u002Fdocs\u002Fbehaviour\u002Faround-every-call","Around every call",[477,446],{"path":408,"title":523,"uses":524},"Finish a fact",[282],{"path":526,"title":527,"uses":528},"\u002Fdocs\u002Fserve\u002Frest-graphql","REST, OpenAPI, GraphQL",[483,482],{"path":530,"title":531,"uses":532},"\u002Fdocs\u002Fserve\u002Fpages","Pages: queries and commands",[483,445],{"path":534,"title":535,"uses":536},"\u002Fdocs\u002Fserve\u002Fforms","A form",[488],{"path":538,"title":539,"uses":540},"\u002Fdocs\u002Fserve\u002Fadmin","An admin panel",[483],{"path":542,"title":177,"uses":543},"\u002Fdocs\u002Frun\u002Fdeploy",[482,446],{"path":181,"title":182,"uses":545},[482,446],{"path":547,"title":548,"uses":549},"\u002Fdocs\u002Frun\u002Flifecycle","Reload and shut down",[482],{"path":551,"title":552,"uses":553},"\u002Fdocs\u002Frun\u002Fobserve","Observe",[482,483],{"path":555,"title":556,"uses":557},"\u002Fdocs\u002Frun\u002Fdev-panel","The dev panel",[483],{"path":559,"title":560,"uses":561},"\u002Fdocs\u002Frun\u002Ftest","Test",[488,477],{"path":563,"title":564,"uses":565},"\u002Fdocs\u002Fadopt\u002Fnew-project","Start a project",[446,482],{"path":567,"title":568,"uses":569},"\u002Fdocs\u002Fadopt\u002Fexisting-app","Add Fougere to an existing app",[446,482],{"path":571,"title":572,"uses":573},"\u002Fdocs\u002Fadopt\u002Fbring-your-schema","Bring your schema",[488],{"path":575,"title":576,"uses":577},"\u002Fdocs\u002Fadopt\u002Fhosts","Pick a host",[482],{"path":440,"title":8,"uses":579},[445,446],{"path":581,"title":582,"uses":583},"\u002Fdocs\u002Fadopt\u002Fdemos","Demos",[],{"path":585,"title":586,"uses":443},"\u002Fdocs\u002Fextending\u002Fscan","How the scan reads a project",{"path":588,"title":589,"uses":443},"\u002Fdocs\u002Fextending\u002Fwithout-compiler","Boot without the compiler",{"path":591,"title":592,"uses":443},"\u002Fdocs\u002Fextending\u002Fboot","The boot, step by step",{"path":594,"title":595,"uses":443},"\u002Fdocs\u002Fextending\u002Fcard-and-wire","The card and the wire",{"path":597,"title":598,"uses":443},"\u002Fdocs\u002Fextending\u002Fextension-points","Registries and extension points",{"path":600,"title":601,"uses":443},"\u002Fdocs\u002Fextending\u002Fvocabulary","Teach a word",{"path":603,"title":604,"uses":443},"\u002Fdocs\u002Fextending\u002Fextensions","Run code at boot and shutdown",{"path":606,"title":607,"uses":443},"\u002Fdocs\u002Fextending\u002Fsource-adapter","Write a source adapter",{"path":609,"title":610,"uses":443},"\u002Fdocs\u002Fextending\u002Fsurface","Write a surface",{"path":612,"title":613,"uses":443},"\u002Fdocs\u002Fextending\u002Fforeign-frond","A frond in another language",{"path":615,"title":616,"uses":443},"\u002Fdocs","What is Fougere",[618],{"title":619,"path":615,"stem":620,"children":621,"page":-1},"Docs","docs",[622,624,645,654,675,684,697,714,730],{"title":616,"path":615,"stem":623},"docs\u002Findex",{"title":625,"path":626,"stem":627,"children":628,"page":5},"Concepts","\u002Fdocs\u002Fconcepts","docs\u002F1.concepts",[629,631,633,635,637,639,641,643],{"title":451,"path":450,"stem":630},"docs\u002F1.concepts\u002F1.entity",{"title":454,"path":453,"stem":632},"docs\u002F1.concepts\u002F2.handler",{"title":457,"path":456,"stem":634},"docs\u002F1.concepts\u002F3.repository",{"title":460,"path":459,"stem":636},"docs\u002F1.concepts\u002F4.frond",{"title":463,"path":462,"stem":638},"docs\u002F1.concepts\u002F5.facade",{"title":466,"path":465,"stem":640},"docs\u002F1.concepts\u002F6.fact",{"title":469,"path":468,"stem":642},"docs\u002F1.concepts\u002F7.port",{"title":472,"path":471,"stem":644},"docs\u002F1.concepts\u002F8.configuration",{"title":646,"path":647,"stem":648,"children":649,"page":5},"Access","\u002Fdocs\u002Faccess","docs\u002F2.access",[650,652],{"title":475,"path":474,"stem":651},"docs\u002F2.access\u002F1.authentication",{"title":480,"path":479,"stem":653},"docs\u002F2.access\u002F2.state",{"title":655,"path":656,"stem":657,"children":658,"page":5},"Data","\u002Fdocs\u002Fdata","docs\u002F3.data",[659,661,663,665,667,669,671,673],{"title":486,"path":485,"stem":660},"docs\u002F3.data\u002F1.sql",{"title":491,"path":490,"stem":662},"docs\u002F3.data\u002F2.several-databases",{"title":495,"path":494,"stem":664},"docs\u002F3.data\u002F3.computed-field",{"title":499,"path":498,"stem":666},"docs\u002F3.data\u002F4.evolve",{"title":503,"path":502,"stem":668},"docs\u002F3.data\u002F5.seeds",{"title":507,"path":506,"stem":670},"docs\u002F3.data\u002F6.values",{"title":511,"path":510,"stem":672},"docs\u002F3.data\u002F7.mirror",{"title":516,"path":515,"stem":674},"docs\u002F3.data\u002F8.together",{"title":676,"path":677,"stem":678,"children":679,"page":5},"Behaviour","\u002Fdocs\u002Fbehaviour","docs\u002F4.behaviour",[680,682],{"title":520,"path":519,"stem":681},"docs\u002F4.behaviour\u002F1.around-every-call",{"title":523,"path":408,"stem":683},"docs\u002F4.behaviour\u002F2.finish-a-fact",{"title":685,"path":686,"stem":687,"children":688,"page":5},"Serve","\u002Fdocs\u002Fserve","docs\u002F5.serve",[689,691,693,695],{"title":527,"path":526,"stem":690},"docs\u002F5.serve\u002F1.rest-graphql",{"title":531,"path":530,"stem":692},"docs\u002F5.serve\u002F2.pages",{"title":535,"path":534,"stem":694},"docs\u002F5.serve\u002F3.forms",{"title":539,"path":538,"stem":696},"docs\u002F5.serve\u002F4.admin",{"title":698,"path":699,"stem":700,"children":701,"page":5},"Run","\u002Fdocs\u002Frun","docs\u002F6.run",[702,704,706,708,710,712],{"title":177,"path":542,"stem":703},"docs\u002F6.run\u002F1.deploy",{"title":182,"path":181,"stem":705},"docs\u002F6.run\u002F2.secure",{"title":548,"path":547,"stem":707},"docs\u002F6.run\u002F3.lifecycle",{"title":552,"path":551,"stem":709},"docs\u002F6.run\u002F4.observe",{"title":556,"path":555,"stem":711},"docs\u002F6.run\u002F5.dev-panel",{"title":560,"path":559,"stem":713},"docs\u002F6.run\u002F6.test",{"title":715,"path":716,"stem":717,"children":718,"page":5},"Adopt","\u002Fdocs\u002Fadopt","docs\u002F7.adopt",[719,721,723,725,727,728],{"title":564,"path":563,"stem":720},"docs\u002F7.adopt\u002F1.new-project",{"title":568,"path":567,"stem":722},"docs\u002F7.adopt\u002F2.existing-app",{"title":572,"path":571,"stem":724},"docs\u002F7.adopt\u002F3.bring-your-schema",{"title":576,"path":575,"stem":726},"docs\u002F7.adopt\u002F4.hosts",{"title":8,"path":440,"stem":442},{"title":582,"path":581,"stem":729},"docs\u002F7.adopt\u002F6.demos",{"title":731,"path":732,"stem":733,"children":734,"page":5},"Extending","\u002Fdocs\u002Fextending","docs\u002F8.extending",[735,737,739,741,743,745,747,749,751,753],{"title":586,"path":585,"stem":736},"docs\u002F8.extending\u002F1.scan",{"title":589,"path":588,"stem":738},"docs\u002F8.extending\u002F10.without-compiler",{"title":592,"path":591,"stem":740},"docs\u002F8.extending\u002F2.boot",{"title":595,"path":594,"stem":742},"docs\u002F8.extending\u002F3.card-and-wire",{"title":598,"path":597,"stem":744},"docs\u002F8.extending\u002F4.extension-points",{"title":601,"path":600,"stem":746},"docs\u002F8.extending\u002F5.vocabulary",{"title":604,"path":603,"stem":748},"docs\u002F8.extending\u002F6.extensions",{"title":607,"path":606,"stem":750},"docs\u002F8.extending\u002F7.source-adapter",{"title":610,"path":609,"stem":752},"docs\u002F8.extending\u002F8.surface",{"title":613,"path":612,"stem":754},"docs\u002F8.extending\u002F9.foreign-frond",1794396615071]