Federated via graft
179 kB
1613 lines
1<!DOCTYPE html><html lang="fr-FR"><head><title>Forges & web décentralisé</title><meta property="og:title" content="Forges & web décentralisé"><meta charset="UTF-8"><meta name="viewport" content="width=device-width,height=device-height,initial-scale=1.0"><meta name="apple-mobile-web-app-capable" content="yes"><meta http-equiv="X-UA-Compatible" content="ie=edge"><meta property="og:type" content="website"><meta name="twitter:card" content="summary"><style>@media screen{body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button,body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button,body[data-bespoke-view=overview] button.bespoke-marp-overview-close,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-page-area .bespoke-marp-presenter-info-page,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button{appearance:none;background-color:initial;border:0;color:inherit;cursor:pointer;font-size:inherit;opacity:.8;outline:none;padding:0;transition:opacity .2s linear;-webkit-tap-highlight-color:transparent}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button:disabled,body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button:disabled,body[data-bespoke-view=overview] button.bespoke-marp-overview-close:disabled,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-page-area .bespoke-marp-presenter-info-page:disabled,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button:disabled,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button:disabled{cursor:not-allowed;opacity:.15!important}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button:hover,body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button:hover,body[data-bespoke-view=overview] button.bespoke-marp-overview-close:hover,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-page-area .bespoke-marp-presenter-info-page:hover,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button:hover,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button:hover{opacity:1}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button:hover:active,body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button:hover:active,body[data-bespoke-view=overview] button.bespoke-marp-overview-close:hover:active,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-page-area .bespoke-marp-presenter-info-page:hover:active,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button:hover:active,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button:hover:active{opacity:.6}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button:hover:not(:disabled),body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button:hover:not(:disabled),body[data-bespoke-view=overview] button.bespoke-marp-overview-close:hover:not(:disabled),body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-page-area .bespoke-marp-presenter-info-page:hover:not(:disabled),body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button:hover:not(:disabled),body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button:hover:not(:disabled){transition:none}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=prev],body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=prev],body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button.bespoke-marp-presenter-info-page-prev{background:#0000 url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSI1IiBkPSJNNjggOTAgMjggNTBsNDAtNDAiLz48L3N2Zz4=") no-repeat 50%;background-size:contain;overflow:hidden;text-indent:100%;white-space:nowrap}body[data-bespoke-view=""] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=next],body[data-bespoke-view=next] .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=next],body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button.bespoke-marp-presenter-info-page-next{background:#0000 url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSI1IiBkPSJtMzIgOTAgNDAtNDAtNDAtNDAiLz48L3N2Zz4=") no-repeat 50%;background-size:contain;overflow:hidden;text-indent:100%;white-space:nowrap}:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=fullscreen]{background:#0000 url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48ZGVmcz48c3R5bGU+LmF7ZmlsbDpub25lO3N0cm9rZTojZmZmO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6NXB4fTwvc3R5bGU+PC9kZWZzPjxyZWN0IHdpZHRoPSI4MCIgaGVpZ2h0PSI2MCIgeD0iMTAiIHk9IjIwIiBjbGFzcz0iYSIgcng9IjUuNjciLz48cGF0aCBkPSJNNDAgNzBIMjBWNTBtMjAgMEwyMCA3MG00MC00MGgyMHYyMG0tMjAgMCAyMC0yMCIgY2xhc3M9ImEiLz48L3N2Zz4=") no-repeat 50%;background-size:contain;overflow:hidden;text-indent:100%;white-space:nowrap}:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) .bespoke-marp-parent>.bespoke-marp-osc>button.exit[data-bespoke-marp-osc=fullscreen]{background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48ZGVmcz48c3R5bGU+LmF7ZmlsbDpub25lO3N0cm9rZTojZmZmO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6NXB4fTwvc3R5bGU+PC9kZWZzPjxyZWN0IHdpZHRoPSI4MCIgaGVpZ2h0PSI2MCIgeD0iMTAiIHk9IjIwIiBjbGFzcz0iYSIgcng9IjUuNjciLz48cGF0aCBkPSJNMjAgNTBoMjB2MjBtLTIwIDAgMjAtMjBtNDAgMEg2MFYzMG0yMCAwTDYwIDUwIiBjbGFzcz0iYSIvPjwvc3ZnPg==")}:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=presenter]{background:#0000 url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSI1IiBkPSJNODcuOCA0Ny41Qzg5IDUwIDg3LjcgNTIgODUgNTJIMzVhOC43IDguNyAwIDAgMS03LjItNC41bC0xNS42LTMxQzExIDE0IDEyLjIgMTIgMTUgMTJoNTBhOC44IDguOCAwIDAgMSA3LjIgNC41ek02MCA1MnYzNm0tMTAgMGgyME00NSA0MmgyMCIvPjwvc3ZnPg==") no-repeat 50%;background-size:contain;overflow:hidden;text-indent:100%;white-space:nowrap}body[data-bespoke-view=overview] button.bespoke-marp-overview-close,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button.bespoke-marp-presenter-note-bigger{background:#0000 url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48cGF0aCBzdHJva2U9IiNmZmYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSI1IiBkPSJNMTIgNTBoODBNNTIgOTBWMTAiLz48L3N2Zz4=") no-repeat 50%;background-size:contain;overflow:hidden;text-indent:100%;white-space:nowrap}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button.bespoke-marp-presenter-note-smaller{background:#0000 url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSI1IiBkPSJNMTIgNTBoODAiLz48L3N2Zz4=") no-repeat 50%;background-size:contain;overflow:hidden;text-indent:100%;white-space:nowrap}:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=overview]{background:#0000 url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48ZGVmcz48c3R5bGU+LmF7ZmlsbDpub25lO3N0cm9rZTojZmZmO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6NXB4O3J4OjVweDtyeTo1cHg7d2lkdGg6MjVweDtoZWlnaHQ6MjVweH08L3N0eWxlPjwvZGVmcz48cmVjdCB4PSIyMCIgeT0iMjAiIGNsYXNzPSJhIi8+PHJlY3QgeD0iNTUiIHk9IjIwIiBjbGFzcz0iYSIvPjxyZWN0IHg9IjIwIiB5PSI1NSIgY2xhc3M9ImEiLz48cmVjdCB4PSI1NSIgeT0iNTUiIGNsYXNzPSJhIi8+PC9zdmc+") no-repeat 50%;background-size:contain;overflow:hidden;text-indent:100%;white-space:nowrap}}@keyframes __bespoke_marp_transition_reduced_outgoing__{0%{opacity:1}to{opacity:0}}@keyframes __bespoke_marp_transition_reduced_incoming__{0%{mix-blend-mode:plus-lighter;opacity:0}to{mix-blend-mode:plus-lighter;opacity:1}}.bespoke-marp-note,.bespoke-marp-osc,.bespoke-progress-parent{display:none;transition:none}@media screen{::view-transition-group(*){animation-duration:var(--marp-bespoke-transition-animation-duration,.5s);animation-timing-function:ease}::view-transition-new(*),::view-transition-old(*){animation-delay:0s;animation-direction:var(--marp-bespoke-transition-animation-direction,normal);animation-duration:var(--marp-bespoke-transition-animation-duration,.5s);animation-fill-mode:both;animation-name:var(--marp-bespoke-transition-animation-name,var(--marp-bespoke-transition-animation-name-fallback,__bespoke_marp_transition_no_animation__));mix-blend-mode:normal}::view-transition-old(*){--marp-bespoke-transition-animation-name-fallback:__bespoke_marp_transition_reduced_outgoing__;animation-timing-function:ease}::view-transition-new(*){--marp-bespoke-transition-animation-name-fallback:__bespoke_marp_transition_reduced_incoming__;animation-timing-function:ease}::view-transition-new(root),::view-transition-old(root){animation-timing-function:linear}::view-transition-new(__bespoke_marp_transition_osc__),::view-transition-old(__bespoke_marp_transition_osc__){animation-duration:0s!important;animation-name:__bespoke_marp_transition_osc__!important}::view-transition-new(__bespoke_marp_transition_osc__){opacity:0!important}.bespoke-marp-transition-warming-up::view-transition-group(*),.bespoke-marp-transition-warming-up::view-transition-new(*),.bespoke-marp-transition-warming-up::view-transition-old(*){animation-play-state:paused!important}body,html{height:100%;margin:0}body{background:#000;overflow:hidden}svg.bespoke-marp-slide{content-visibility:hidden;interactivity:inert;opacity:0;pointer-events:none;z-index:-1}svg.bespoke-marp-slide:not(.bespoke-marp-active) *{view-transition-name:none!important}svg.bespoke-marp-slide.bespoke-marp-active{content-visibility:visible;interactivity:auto;opacity:1;pointer-events:auto;z-index:0}svg.bespoke-marp-slide.bespoke-marp-active.bespoke-marp-active-ready *{animation-name:__bespoke_marp__!important}@supports not (content-visibility:hidden){svg.bespoke-marp-slide[data-bespoke-marp-load=hideable]{display:none}svg.bespoke-marp-slide[data-bespoke-marp-load=hideable].bespoke-marp-active{display:block}}}@media screen and (prefers-reduced-motion:reduce){svg.bespoke-marp-slide *{view-transition-name:none!important}}@media screen{[data-bespoke-marp-fragment=inactive]{visibility:hidden}:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) .bespoke-marp-parent{inset:0;position:absolute}:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) .bespoke-marp-parent>.bespoke-marp-osc{background:#000000a6;border-radius:7px;bottom:50px;color:#fff;contain:paint;display:block;font-family:Helvetica,Arial,sans-serif;font-size:16px;left:50%;line-height:0;opacity:1;padding:12px;position:absolute;touch-action:manipulation;transform:translateX(-50%);transition:opacity .2s linear;-webkit-user-select:none;user-select:none;view-transition-name:__bespoke_marp_transition_osc__;white-space:nowrap;will-change:transform;z-index:1}:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) .bespoke-marp-parent>.bespoke-marp-osc>:where(*){margin-left:6px}:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) .bespoke-marp-parent>.bespoke-marp-osc>:where(*):where(:first-child){margin-left:0}:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) .bespoke-marp-parent>.bespoke-marp-osc>span{opacity:.8}:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) .bespoke-marp-parent>.bespoke-marp-osc>span[data-bespoke-marp-osc=page]{display:inline-block;min-width:140px;text-align:center}:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=fullscreen],:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=next],:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=overview],:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=presenter],:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) .bespoke-marp-parent>.bespoke-marp-osc>button[data-bespoke-marp-osc=prev]{height:32px;line-height:32px;width:32px}:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) .bespoke-marp-parent.bespoke-marp-inactive{cursor:none}:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) .bespoke-marp-parent.bespoke-marp-inactive>.bespoke-marp-osc{opacity:0;pointer-events:none}:is(body[data-bespoke-view=""],body[data-bespoke-view=next]) svg.bespoke-marp-slide{height:100%;left:0;position:absolute;top:0;width:100%}body[data-bespoke-view=""] .bespoke-progress-parent{background:#222;display:flex;height:5px;width:100%}body[data-bespoke-view=""] .bespoke-progress-parent+:where(.bespoke-marp-parent){top:5px}body[data-bespoke-view=""] .bespoke-progress-parent .bespoke-progress-bar{background:#0288d1;flex:0 0 0;transition:flex-basis .2s cubic-bezier(0,1,1,1)}body[data-bespoke-view=next]{background:#0000}body[data-bespoke-view=presenter]{background:#161616}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container{display:grid;font-family:Helvetica,Arial,sans-serif;grid-template:"current dragbar next" minmax(140px,1fr) "current dragbar note" 2fr "info dragbar note" 3em;grid-template-columns:minmax(3px,var(--bespoke-marp-presenter-split-ratio,66%)) 0 minmax(3px,1fr);height:100%;left:0;position:absolute;top:0;width:100%}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container :where(.bespoke-marp-parent){grid-area:current;overflow:hidden;position:relative}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container :where(.bespoke-marp-parent) :where(svg.bespoke-marp-slide){height:calc(100% - 40px);left:20px;pointer-events:none;position:absolute;top:20px;-webkit-user-select:none;user-select:none;width:calc(100% - 40px)}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container :where(.bespoke-marp-parent) :where(svg.bespoke-marp-slide).bespoke-marp-active{filter:drop-shadow(0 3px 10px rgba(0,0,0,.5))}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-dragbar-container{background:#0288d1;cursor:col-resize;grid-area:dragbar;margin-left:-3px;opacity:0;position:relative;transition:opacity .4s linear .1s;width:6px;z-index:10}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-dragbar-container:hover{opacity:1}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-dragbar-container.active{opacity:1;transition-delay:0s}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-next-container{background:#222;cursor:pointer;display:none;grid-area:next;overflow:hidden;position:relative}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-next-container.active{display:block}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-next-container iframe.bespoke-marp-presenter-next{background:#0000;border:0;display:block;filter:drop-shadow(0 3px 10px rgba(0,0,0,.5));height:calc(100% - 40px);left:20px;pointer-events:none;position:absolute;interactivity:inert;top:20px;-webkit-user-select:none;user-select:none;width:calc(100% - 40px)}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container{background:#222;color:#eee;grid-area:note;position:relative;z-index:1}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container button{height:1.5em;line-height:1.5em;width:1.5em}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-presenter-note-wrapper{display:block;inset:0;position:absolute}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-presenter-note-buttons{background:#000000a6;border-radius:4px;bottom:0;display:flex;gap:4px;margin:12px;opacity:0;padding:6px;pointer-events:none;position:absolute;right:0;transition:opacity .2s linear}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-presenter-note-buttons:focus-within,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-presenter-note-wrapper:focus-within+.bespoke-marp-presenter-note-buttons,body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container:hover .bespoke-marp-presenter-note-buttons{opacity:1;pointer-events:auto}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-note{box-sizing:border-box;font-size:calc(1.1em*var(--bespoke-marp-note-font-scale, 1));height:calc(100% - 40px);margin:20px;overflow:auto;padding-right:3px;white-space:pre-wrap;width:calc(100% - 40px);word-wrap:break-word;scrollbar-color:#eeeeee80 #0000;scrollbar-width:thin}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-note::-webkit-scrollbar{width:6px}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-note::-webkit-scrollbar-track{background:#0000}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-note::-webkit-scrollbar-thumb{background:#eeeeee80;border-radius:6px}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-note:empty{pointer-events:none}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-note.active{display:block}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-note p:first-child{margin-top:0}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-note-container .bespoke-marp-note p:last-child{margin-bottom:0}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container{align-items:center;box-sizing:border-box;color:#eee;display:flex;flex-wrap:nowrap;grid-area:info;justify-content:center;overflow:hidden;padding:0 10px}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container :is(.bespoke-marp-presenter-info-page-area,.bespoke-marp-presenter-info-time,.bespoke-marp-presenter-info-timer){box-sizing:border-box;display:block;padding:0 10px;white-space:nowrap;width:100%}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container button{height:1.5em;line-height:1.5em;width:1.5em}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-page-area{order:2;text-align:center}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-page-area .bespoke-marp-presenter-info-page{display:inline-block;min-width:120px;text-align:center}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-time{color:#999;order:1;text-align:left}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-timer{color:#999;order:3;text-align:right}body[data-bespoke-view=presenter] .bespoke-marp-presenter-container .bespoke-marp-presenter-info-container .bespoke-marp-presenter-info-timer:hover{cursor:pointer}body[data-bespoke-view=overview]{background:#161616;overflow:auto}body[data-bespoke-view=overview] [data-bespoke-marp-fragment=inactive]{visibility:visible}body[data-bespoke-view=overview] .bespoke-marp-overview-header{backdrop-filter:blur(4px);background:#222222d9;box-shadow:0 3px 10px #00000080;box-sizing:border-box;display:flex;height:48px;inset:0 0 auto;justify-content:flex-end;padding:10px;position:fixed;z-index:1}body[data-bespoke-view=overview] button.bespoke-marp-overview-close{height:28px;line-height:28px;transform:rotate(45deg);width:28px}body[data-bespoke-view=overview] .bespoke-marp-parent{display:grid;gap:40px;grid-template-columns:repeat(auto-fit,minmax(0,240px));justify-content:space-around;padding:30px}body[data-bespoke-view=overview] .bespoke-marp-parent svg.bespoke-marp-slide{--bov-selected:#0000;--bov-focus:#161616;--bov-focus-outline:#0000;background-image:conic-gradient(#161616 0 0),conic-gradient(var(--bov-focus) 0 0),conic-gradient(var(--bov-focus-outline) 0 0),conic-gradient(var(--bov-selected) 0 0);background-position:5px 5px,3px 3px,2px 2px,0 0;background-repeat:no-repeat;background-size:calc(100% - 10px) calc(100% - 10px),calc(100% - 6px) calc(100% - 6px),calc(100% - 4px) calc(100% - 4px),100% 100%;content-visibility:visible;cursor:pointer;filter:drop-shadow(0 3px 10px rgba(0,0,0,.5));margin:-6px;padding:6px;interactivity:auto;opacity:1;outline:0;pointer-events:auto;scroll-margin-block:30px;width:100%;z-index:0}body[data-bespoke-view=overview] .bespoke-marp-parent svg.bespoke-marp-slide *,body[data-bespoke-view=overview] .bespoke-marp-parent svg.bespoke-marp-slide.bespoke-marp-active *{pointer-events:none;interactivity:inert}body[data-bespoke-view=overview] .bespoke-marp-parent :is(svg.bespoke-marp-slide:active,svg.bespoke-marp-slide:focus-visible,svg.bespoke-marp-slide:hover){--bov-focus-outline:#161616}body[data-bespoke-view=overview] .bespoke-marp-parent svg.bespoke-marp-slide:focus-visible,body[data-bespoke-view=overview] .bespoke-marp-parent svg.bespoke-marp-slide:hover{--bov-focus:#999}body[data-bespoke-view=overview] .bespoke-marp-parent svg.bespoke-marp-slide:active{--bov-focus:#eee}body[data-bespoke-view=overview] .bespoke-marp-parent svg.bespoke-marp-slide.bespoke-marp-active{--bov-selected:#0288d1}body[data-bespoke-view=overview]:has(.bespoke-marp-overview-header) .bespoke-marp-parent{padding-top:78px}body[data-bespoke-view=overview]:has(.bespoke-marp-overview-header) .bespoke-marp-parent svg.bespoke-marp-slide{scroll-margin-top:78px}.bespoke-marp-overview{background:#000000a6;inset:0;opacity:0;pointer-events:none;position:fixed;transition:opacity .1s ease;z-index:10}.bespoke-marp-overview iframe{background:#222;border:0;display:block;height:100%;left:0;position:absolute;top:0;width:100%}.bespoke-marp-overview[data-open="1"]{opacity:1;pointer-events:auto}}@media print{.bespoke-marp-overview,.bespoke-marp-presenter-info-container,.bespoke-marp-presenter-next-container,.bespoke-marp-presenter-note-container{display:none}}</style><style>@charset "UTF-8";@import "https://fonts.bunny.net/css?family=Lato:400,900|Roboto+Mono:400,700&display=swap";div#\:\$p > svg > foreignObject > section{width:1280px;height:720px;box-sizing:border-box;overflow:hidden;position:relative;scroll-snap-align:center center;-webkit-text-size-adjust:100%;text-size-adjust:100%}div#\:\$p > svg > foreignObject > section::after{bottom:0;content:attr(data-marpit-pagination);padding:inherit;pointer-events:none;position:absolute;right:0}div#\:\$p > svg > foreignObject > section:not([data-marpit-pagination])::after{display:none}div#\:\$p > svg > foreignObject > section :where(:is(h1, marp-h1)){font-size:2em;margin-block:0.67em}div#\:\$p > svg > foreignObject > section section:where(:is(h1, marp-h1)){--marpit-root-font-size: 2em}div#\:\$p > svg > foreignObject > section video::-webkit-media-controls{will-change:transform}@page {size:1280px 720px;margin:0}@media print{html, body{background-color:#fff;margin:0;page-break-inside:avoid;break-inside:avoid-page}div#\:\$p > svg > foreignObject > section{page-break-before:always;break-before:page}div#\:\$p > svg > foreignObject > section, div#\:\$p > svg > foreignObject > section *{-webkit-print-color-adjust:exact!important;animation-delay:0s!important;animation-duration:0s!important;color-adjust:exact!important;print-color-adjust:exact!important;transition:none!important}div#\:\$p > svg[data-marpit-svg]{display:block;height:100vh;width:100vw}}div#\:\$p > svg > foreignObject > :where(section){container-type:size}div#\:\$p > svg > foreignObject > section img[data-marp-twemoji]{background:transparent;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em;width:1em}/*!
2 * Marp / Marpit Gaia theme.
3 *
4 * @theme gaia
5 * @author Yuki Hattori
6 *
7 * @auto-scaling true
8 * @size 16:9 1280px 720px
9 * @size 4:3 960px 720px
10 */div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) code.hljs{display:block;overflow-x:auto;padding:1em}div#\:\$p > svg > foreignObject > section code.hljs{padding:3px 5px}div#\:\$p > svg > foreignObject > section .hljs{background:#000;color:#f8f8f8}div#\:\$p > svg > foreignObject > section .hljs-comment,div#\:\$p > svg > foreignObject > section .hljs-quote{color:#aeaeae;font-style:italic}div#\:\$p > svg > foreignObject > section .hljs-keyword,div#\:\$p > svg > foreignObject > section .hljs-selector-tag,div#\:\$p > svg > foreignObject > section .hljs-type{color:#e28964}div#\:\$p > svg > foreignObject > section .hljs-string{color:#65b042}div#\:\$p > svg > foreignObject > section .hljs-subst{color:#daefa3}div#\:\$p > svg > foreignObject > section .hljs-link,div#\:\$p > svg > foreignObject > section .hljs-regexp{color:#e9c062}div#\:\$p > svg > foreignObject > section .hljs-name,div#\:\$p > svg > foreignObject > section .hljs-section,div#\:\$p > svg > foreignObject > section .hljs-tag,div#\:\$p > svg > foreignObject > section .hljs-title{color:#89bdff}div#\:\$p > svg > foreignObject > section .hljs-class .hljs-title,div#\:\$p > svg > foreignObject > section .hljs-doctag,div#\:\$p > svg > foreignObject > section .hljs-title.class_{text-decoration:underline}div#\:\$p > svg > foreignObject > section .hljs-bullet,div#\:\$p > svg > foreignObject > section .hljs-number,div#\:\$p > svg > foreignObject > section .hljs-symbol{color:#3387cc}div#\:\$p > svg > foreignObject > section .hljs-params,div#\:\$p > svg > foreignObject > section .hljs-template-variable,div#\:\$p > svg > foreignObject > section .hljs-variable{color:#3e87e3}div#\:\$p > svg > foreignObject > section .hljs-attribute{color:#cda869}div#\:\$p > svg > foreignObject > section .hljs-meta{color:#8996a8}div#\:\$p > svg > foreignObject > section .hljs-formula{background-color:#0e2231;color:#f8f8f8;font-style:italic}div#\:\$p > svg > foreignObject > section .hljs-addition{background-color:#253b22;color:#f8f8f8}div#\:\$p > svg > foreignObject > section .hljs-deletion{background-color:#420e09;color:#f8f8f8}div#\:\$p > svg > foreignObject > section .hljs-selector-class{color:#9b703f}div#\:\$p > svg > foreignObject > section .hljs-selector-id{color:#8b98ab}div#\:\$p > svg > foreignObject > section .hljs-emphasis{font-style:italic}div#\:\$p > svg > foreignObject > section .hljs-strong{font-weight:700}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1),div#\:\$p > svg > foreignObject > section :is(h2, marp-h2),div#\:\$p > svg > foreignObject > section :is(h3, marp-h3),div#\:\$p > svg > foreignObject > section :is(h4, marp-h4),div#\:\$p > svg > foreignObject > section :is(h5, marp-h5),div#\:\$p > svg > foreignObject > section :is(h6, marp-h6){margin:.5em 0 0}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1) strong,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2) strong,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3) strong,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4) strong,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5) strong,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6) strong{font-weight:inherit}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h2, marp-h2)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h3, marp-h3)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h4, marp-h4)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h5, marp-h5)::part(auto-scaling),div#\:\$p > svg > foreignObject > section :is(h6, marp-h6)::part(auto-scaling){max-height:580px}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1){font-size:1.8em}div#\:\$p > svg > foreignObject > section :is(h2, marp-h2){font-size:1.5em}div#\:\$p > svg > foreignObject > section :is(h3, marp-h3){font-size:1.3em}div#\:\$p > svg > foreignObject > section :is(h4, marp-h4){font-size:1.1em}div#\:\$p > svg > foreignObject > section :is(h5, marp-h5){font-size:1em}div#\:\$p > svg > foreignObject > section :is(h6, marp-h6){font-size:.9em}div#\:\$p > svg > foreignObject > section blockquote,div#\:\$p > svg > foreignObject > section p{margin:1em 0 0}div#\:\$p > svg > foreignObject > section ol>li,div#\:\$p > svg > foreignObject > section ul>li{margin:.3em 0 0}div#\:\$p > svg > foreignObject > section ol>li>p,div#\:\$p > svg > foreignObject > section ul>li>p{margin:.6em 0 0}div#\:\$p > svg > foreignObject > section code{display:inline-block;font-family:Roboto Mono,monospace;font-size:.8em;letter-spacing:0;margin:-.1em .15em;padding:.1em .2em;vertical-align:baseline}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre){display:block;margin:1em 0 0;overflow:visible}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre) code{box-sizing:border-box;margin:0;min-width:100%;padding:.5em;font-size:.7em}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre)::part(auto-scaling){max-height:calc(580px - 1em)}div#\:\$p > svg > foreignObject > section blockquote{margin:1em 0 0;padding:0 1em;position:relative}div#\:\$p > svg > foreignObject > section blockquote:after,div#\:\$p > svg > foreignObject > section blockquote:before{content:"“";display:block;font-family:Times New Roman,serif;font-weight:700;position:absolute}div#\:\$p > svg > foreignObject > section blockquote:before{top:0;left:0}div#\:\$p > svg > foreignObject > section blockquote:after{right:0;bottom:0;transform:rotate(180deg)}div#\:\$p > svg > foreignObject > section blockquote>:first-child{margin-top:0}div#\:\$p > svg > foreignObject > section mark{background:transparent}div#\:\$p > svg > foreignObject > section table{border-spacing:0;border-collapse:collapse;margin:1em 0 0}div#\:\$p > svg > foreignObject > section table td,div#\:\$p > svg > foreignObject > section table th{padding:.2em .4em;border-width:1px;border-style:solid}div#\:\$p > svg > foreignObject > section footer,div#\:\$p > svg > foreignObject > section header,div#\:\$p > svg > foreignObject > section:after{box-sizing:border-box;font-size:66%;height:70px;line-height:50px;overflow:hidden;padding:10px 25px;position:absolute}div#\:\$p > svg > foreignObject > section:after{--marpit-root-font-size:66%}div#\:\$p > svg > foreignObject > section header{top:0}div#\:\$p > svg > foreignObject > section footer,div#\:\$p > svg > foreignObject > section header{left:0;right:0}div#\:\$p > svg > foreignObject > section footer{bottom:0}div#\:\$p > svg > foreignObject > section{--color-background:light-dark(#fff8e1, #455a64);--color-background-stripe:light-dark(
11 rgba(69,90,100,.1),
12 rgba(255,248,225,.1)
13 );--color-foreground:light-dark(#455a64, #fff8e1);--color-dimmed:light-dark(
14 #6a7a7d,
15 #dad8c8
16 );--color-highlight:light-dark(#0288d1, #81d4fa);color-scheme:light;background-color:var(--color-background);background-image:linear-gradient(135deg, var(--color-background), color-mix(in srgb, var(--color-background) 98%, #888 2%) 50%, var(--color-background) 50%, color-mix(in srgb, var(--color-background) 95%, #fff 5%));color:var(--color-foreground);font-size:35px;font-family:Lato,Avenir Next,Avenir,Trebuchet MS,Segoe UI,sans-serif;height:720px;line-height:1.35;letter-spacing:1.25px;padding:70px;width:1280px;overflow-wrap:break-word}div#\:\$p > svg > foreignObject > section{--marpit-root-font-size:35px}div#\:\$p > svg > foreignObject > section:after{right:0;bottom:0;font-size:80%}div#\:\$p > svg > foreignObject > section:after{--marpit-root-font-size:80%}div#\:\$p > svg > foreignObject > section a,div#\:\$p > svg > foreignObject > section mark{color:var(--color-highlight)}div#\:\$p > svg > foreignObject > section code{background:var(--color-dimmed);color:var(--color-background)}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1) strong,div#\:\$p > svg > foreignObject > section :is(h2, marp-h2) strong,div#\:\$p > svg > foreignObject > section :is(h3, marp-h3) strong,div#\:\$p > svg > foreignObject > section :is(h4, marp-h4) strong,div#\:\$p > svg > foreignObject > section :is(h5, marp-h5) strong,div#\:\$p > svg > foreignObject > section :is(h6, marp-h6) strong{color:var(--color-highlight)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre){background:var(--color-foreground)}div#\:\$p > svg > foreignObject > section :is(pre, marp-pre)>code{background:transparent}div#\:\$p > svg > foreignObject > section blockquote:after,div#\:\$p > svg > foreignObject > section blockquote:before,div#\:\$p > svg > foreignObject > section footer,div#\:\$p > svg > foreignObject > section header,div#\:\$p > svg > foreignObject > section section:after{color:var(--color-dimmed)}div#\:\$p > svg > foreignObject > section table td,div#\:\$p > svg > foreignObject > section table th{border-color:var(--color-foreground)}div#\:\$p > svg > foreignObject > section table thead th{background:var(--color-foreground);color:var(--color-background)}div#\:\$p > svg > foreignObject > section table tbody>tr:nth-child(odd) td,div#\:\$p > svg > foreignObject > section table tbody>tr:nth-child(odd) th{background:var(--color-background-stripe, transparent)}div#\:\$p > svg > foreignObject > section>:first-child,div#\:\$p > svg > foreignObject > section>header:first-child+*{margin-top:0}div#\:\$p > svg > foreignObject > section:where(.invert){color-scheme:dark}div#\:\$p > svg > foreignObject > section:where(.gaia){--color-background:#0288d1;--color-background-stripe:rgba(255,248,225,.1);--color-foreground:#fff8e1;--color-dimmed:#cce2de;--color-highlight:#81d4fa;}div#\:\$p > svg > foreignObject > section:where(.lead){place-content:safe center center;flex-flow:column nowrap;align-items:stretch}div#\:\$p > svg > foreignObject > section:where(.lead) :is(h1, marp-h1),div#\:\$p > svg > foreignObject > section:where(.lead) :is(h2, marp-h2),div#\:\$p > svg > foreignObject > section:where(.lead) :is(h3, marp-h3),div#\:\$p > svg > foreignObject > section:where(.lead) :is(h4, marp-h4),div#\:\$p > svg > foreignObject > section:where(.lead) :is(h5, marp-h5),div#\:\$p > svg > foreignObject > section:where(.lead) :is(h6, marp-h6){text-align:center}div#\:\$p > svg > foreignObject > section:where(.lead) p{text-align:center}div#\:\$p > svg > foreignObject > section:where(.lead) blockquote>:is(h1, marp-h1),div#\:\$p > svg > foreignObject > section:where(.lead) blockquote>:is(h2, marp-h2),div#\:\$p > svg > foreignObject > section:where(.lead) blockquote>:is(h3, marp-h3),div#\:\$p > svg > foreignObject > section:where(.lead) blockquote>:is(h4, marp-h4),div#\:\$p > svg > foreignObject > section:where(.lead) blockquote>:is(h5, marp-h5),div#\:\$p > svg > foreignObject > section:where(.lead) blockquote>:is(h6, marp-h6),div#\:\$p > svg > foreignObject > section:where(.lead) blockquote>p{text-align:left}div#\:\$p > svg > foreignObject > section:where(.lead) ol>li>p,div#\:\$p > svg > foreignObject > section:where(.lead) ul>li>p{text-align:left}div#\:\$p > svg > foreignObject > section:where(.lead) table{margin-left:auto;margin-right:auto}div#\:\$p > svg > foreignObject > section{font-size:25px}div#\:\$p > svg > foreignObject > section{--marpit-root-font-size: 25px}div#\:\$p > svg > foreignObject > section :is(h1, marp-h1){color:#1a5fb4}div#\:\$p > svg > foreignObject > section :is(h2, marp-h2){color:#1a5fb4}div#\:\$p > svg > foreignObject > section :is(h3, marp-h3){color:#555;font-size:24px;margin-bottom:0.2em}div#\:\$p > svg > foreignObject > section table{font-size:21px}div#\:\$p > svg > foreignObject > section code{font-size:18px}div#\:\$p > svg > foreignObject > section.wide table{font-size:18px}div#\:\$p > svg > foreignObject > section.part{background-color:#1a5fb4!important}div#\:\$p > svg > foreignObject > section.part :is(h1, marp-h1), div#\:\$p > svg > foreignObject > section.part :is(h2, marp-h2), div#\:\$p > svg > foreignObject > section.part p{color:#fff!important}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"]{columns:initial!important;display:block!important;padding:0!important}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"]::before, div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"]::after, div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="content"]::before, div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="content"]::after{display:none!important}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"] > div[data-marpit-advanced-background-container]{all:initial;display:flex;flex-direction:row;height:100%;overflow:hidden;width:100%}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"] > div[data-marpit-advanced-background-container][data-marpit-advanced-background-direction="vertical"]{flex-direction:column}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"][data-marpit-advanced-background-split] > div[data-marpit-advanced-background-container]{width:var(--marpit-advanced-background-split, 50%)}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"][data-marpit-advanced-background-split="right"] > div[data-marpit-advanced-background-container]{margin-left:calc(100% - var(--marpit-advanced-background-split, 50%))}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"] > div[data-marpit-advanced-background-container] > figure{all:initial;background-position:center;background-repeat:no-repeat;background-size:cover;flex:auto;margin:0}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="background"] > div[data-marpit-advanced-background-container] > figure > figcaption{position:absolute;border:0;clip:rect(0, 0, 0, 0);height:1px;margin:-1px;overflow:hidden;padding:0;white-space:nowrap;width:1px}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="content"], div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="pseudo"]{background:transparent!important}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background="pseudo"], div#\:\$p > svg[data-marpit-svg] > foreignObject[data-marpit-advanced-background="pseudo"]{pointer-events:none!important}div#\:\$p > svg > foreignObject > section[data-marpit-advanced-background-split]{width:100%;height:100%}
17</style></head><body><div class="bespoke-marp-osc"><button data-bespoke-marp-osc="prev" tabindex="-1" title="Previous slide">Previous slide</button><span data-bespoke-marp-osc="page"></span><button data-bespoke-marp-osc="next" tabindex="-1" title="Next slide">Next slide</button><button data-bespoke-marp-osc="fullscreen" tabindex="-1" title="Toggle fullscreen (f)">Toggle fullscreen</button><button data-bespoke-marp-osc="overview" tabindex="-1" title="Toggle overview view (o)">Toggle overview view</button><button data-bespoke-marp-osc="presenter" tabindex="-1" title="Open presenter view (p)">Open presenter view</button></div><div id=":$p"><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="1" data-paginate="true" data-background-color="#fff" data-class="lead" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
18h1 { color: #1a5fb4; }
19h2 { color: #1a5fb4; }
20h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
21table { font-size: 21px; }
22code { font-size: 18px; }
23section.wide table { font-size: 18px; }
24section.part { background-color: #1a5fb4 !important; }
25section.part h1, section.part h2, section.part p { color: #fff !important; }
26" lang="fr-FR" class="lead" data-marpit-pagination="1" style="--paginate:true;--background-color:#fff;--class:lead;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
27h1 { color: #1a5fb4; }
28h2 { color: #1a5fb4; }
29h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
30table { font-size: 21px; }
31code { font-size: 18px; }
32section.wide table { font-size: 18px; }
33section.part { background-color: #1a5fb4 !important; }
34section.part h1, section.part h2, section.part p { color: #fff !important; }
35;background-color:#fff;background-image:none;" data-marpit-pagination-total="42">
36<h1 id="forges--web-d%C3%A9centralis%C3%A9">Forges & web décentralisé</h1>
37<p>État des lieux au 10 septembre 2026</p>
38</section>
39</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="2" data-paginate="true" data-background-color="#1a5fb4" data-class="lead part" data-color="#ffffff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
40h1 { color: #1a5fb4; }
41h2 { color: #1a5fb4; }
42h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
43table { font-size: 21px; }
44code { font-size: 18px; }
45section.wide table { font-size: 18px; }
46section.part { background-color: #1a5fb4 !important; }
47section.part h1, section.part h2, section.part p { color: #fff !important; }
48" lang="fr-FR" class="lead part" data-marpit-pagination="2" style="--paginate:true;--background-color:#1a5fb4;--class:lead part;--color:#ffffff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
49h1 { color: #1a5fb4; }
50h2 { color: #1a5fb4; }
51h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
52table { font-size: 21px; }
53code { font-size: 18px; }
54section.wide table { font-size: 18px; }
55section.part { background-color: #1a5fb4 !important; }
56section.part h1, section.part h2, section.part p { color: #fff !important; }
57;color:#ffffff;background-color:#1a5fb4;background-image:none;" data-marpit-pagination-total="42">
58<h1 id="1-cadrage">1. Cadrage</h1>
59<h2 id="code-et-collaboration">code et collaboration</h2>
60</section>
61</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="3" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
62h1 { color: #1a5fb4; }
63h2 { color: #1a5fb4; }
64h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
65table { font-size: 21px; }
66code { font-size: 18px; }
67section.wide table { font-size: 18px; }
68section.part { background-color: #1a5fb4 !important; }
69section.part h1, section.part h2, section.part p { color: #fff !important; }
70" lang="fr-FR" data-marpit-pagination="3" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
71h1 { color: #1a5fb4; }
72h2 { color: #1a5fb4; }
73h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
74table { font-size: 21px; }
75code { font-size: 18px; }
76section.wide table { font-size: 18px; }
77section.part { background-color: #1a5fb4 !important; }
78section.part h1, section.part h2, section.part p { color: #fff !important; }
79;background-color:#fff;background-image:none;" data-marpit-pagination-total="42">
80<h2 id="automatisation-de-la-mise-en-miroir">Automatisation de la mise en miroir</h2>
81<p><strong>Le transport</strong> du code est résolu depuis 2005 : git est distribué par construction, un dépôt peut exister à plusieurs endroits.</p>
82<p><strong>L'orchestration</strong> n'existe pas. Chaque miroir se configure à la main, instance par instance. Chaque projet écrit elle-même l'intégration continue qui l'entretient.</p>
83</section>
84</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="4" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
85h1 { color: #1a5fb4; }
86h2 { color: #1a5fb4; }
87h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
88table { font-size: 21px; }
89code { font-size: 18px; }
90section.wide table { font-size: 18px; }
91section.part { background-color: #1a5fb4 !important; }
92section.part h1, section.part h2, section.part p { color: #fff !important; }
93" lang="fr-FR" data-marpit-pagination="4" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
94h1 { color: #1a5fb4; }
95h2 { color: #1a5fb4; }
96h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
97table { font-size: 21px; }
98code { font-size: 18px; }
99section.wide table { font-size: 18px; }
100section.part { background-color: #1a5fb4 !important; }
101section.part h1, section.part h2, section.part p { color: #fff !important; }
102;background-color:#fff;background-image:none;" data-marpit-pagination-total="42">
103<h2 id="%C3%A9l%C3%A9ments-non-couverts-par-git">Éléments non couverts par git</h2>
104<p>Le véritable obstacle, c'est tout ce qui entoure un dépôt : tickets,<br />
105propositions de modification, relectures, identité, droits.</p>
106<p>Ces éléments sont stockés dans la base de données d'un serveur Forgejo, en dehors de git.</p>
107<p><a href="https://www.w3.org/TR/activitypub/">ActivityPub</a>, le protocole de la fédiverse, les fait circuler : il transporte de petits messages (« créé », « aimé », « suivi »), pas des fichiers.</p>
108</section>
109</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="5" data-paginate="true" data-background-color="#1a5fb4" data-class="lead part" data-color="#ffffff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
110h1 { color: #1a5fb4; }
111h2 { color: #1a5fb4; }
112h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
113table { font-size: 21px; }
114code { font-size: 18px; }
115section.wide table { font-size: 18px; }
116section.part { background-color: #1a5fb4 !important; }
117section.part h1, section.part h2, section.part p { color: #fff !important; }
118" lang="fr-FR" class="lead part" data-marpit-pagination="5" style="--paginate:true;--background-color:#1a5fb4;--class:lead part;--color:#ffffff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
119h1 { color: #1a5fb4; }
120h2 { color: #1a5fb4; }
121h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
122table { font-size: 21px; }
123code { font-size: 18px; }
124section.wide table { font-size: 18px; }
125section.part { background-color: #1a5fb4 !important; }
126section.part h1, section.part h2, section.part p { color: #fff !important; }
127;color:#ffffff;background-color:#1a5fb4;background-image:none;" data-marpit-pagination-total="42">
128<h1 id="2-%C3%A9tat-de-la-f%C3%A9d%C3%A9ration-dans-forgejo">2. État de la fédération dans Forgejo</h1>
129<h2 id="fonctionnalit%C3%A9s-livr%C3%A9es-et-fonctionnalit%C3%A9s-manquantes">Fonctionnalités livrées et fonctionnalités manquantes</h2>
130</section>
131</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
132h1 { color: #1a5fb4; }
133h2 { color: #1a5fb4; }
134h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
135table { font-size: 21px; }
136code { font-size: 18px; }
137section.wide table { font-size: 18px; }
138section.part { background-color: #1a5fb4 !important; }
139section.part h1, section.part h2, section.part p { color: #fff !important; }
140" lang="fr-FR" data-marpit-pagination="6" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
141h1 { color: #1a5fb4; }
142h2 { color: #1a5fb4; }
143h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
144table { font-size: 21px; }
145code { font-size: 18px; }
146section.wide table { font-size: 18px; }
147section.part { background-color: #1a5fb4 !important; }
148section.part h1, section.part h2, section.part p { color: #fff !important; }
149;background-color:#fff;background-image:none;--marpit-advanced-background-split:33%;" data-marpit-pagination-total="42" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("img/forgejo_v16.jpg");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="67%" height="720"><section id="6" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
150h1 { color: #1a5fb4; }
151h2 { color: #1a5fb4; }
152h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
153table { font-size: 21px; }
154code { font-size: 18px; }
155section.wide table { font-size: 18px; }
156section.part { background-color: #1a5fb4 !important; }
157section.part h1, section.part h2, section.part p { color: #fff !important; }
158" lang="fr-FR" data-marpit-pagination="6" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
159h1 { color: #1a5fb4; }
160h2 { color: #1a5fb4; }
161h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
162table { font-size: 21px; }
163code { font-size: 18px; }
164section.wide table { font-size: 18px; }
165section.part { background-color: #1a5fb4 !important; }
166section.part h1, section.part h2, section.part p { color: #fff !important; }
167;background-color:#fff;background-image:none;--marpit-advanced-background-split:33%;" data-marpit-pagination-total="42" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right">
168<h2 id="p%C3%A9rim%C3%A8tre-fonctionnel-de-la-f%C3%A9d%C3%A9ration-forgejo">Périmètre fonctionnel de la fédération <a href="https://forgejo.org">Forgejo</a></h2>
169<h3 id="fonctionne">Fonctionne</h3>
170<ul>
171<li>Le favori fédéré : un fork mis en favori transmet ce favori au dépôt<br />
172d'origine.</li>
173<li>Le suivi de comptes distants, avec un flux de leur activité.</li>
174<li>Les fondations techniques : pages d'acteur, découverte, requêtes signées.</li>
175</ul>
176<h3 id="pas-impl%C3%A9ment%C3%A9">Pas implémenté</h3>
177<p>Tickets, commentaires et propositions de modification fédérés. Modération et<br />
178contrôle d'accès entre serveurs.</p>
179</section>
180</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
181h1 { color: #1a5fb4; }
182h2 { color: #1a5fb4; }
183h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
184table { font-size: 21px; }
185code { font-size: 18px; }
186section.wide table { font-size: 18px; }
187section.part { background-color: #1a5fb4 !important; }
188section.part h1, section.part h2, section.part p { color: #fff !important; }
189" lang="fr-FR" data-marpit-pagination="6" style="" data-marpit-pagination-total="42" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="7" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
190h1 { color: #1a5fb4; }
191h2 { color: #1a5fb4; }
192h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
193table { font-size: 21px; }
194code { font-size: 18px; }
195section.wide table { font-size: 18px; }
196section.part { background-color: #1a5fb4 !important; }
197section.part h1, section.part h2, section.part p { color: #fff !important; }
198" lang="fr-FR" data-marpit-pagination="7" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
199h1 { color: #1a5fb4; }
200h2 { color: #1a5fb4; }
201h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
202table { font-size: 21px; }
203code { font-size: 18px; }
204section.wide table { font-size: 18px; }
205section.part { background-color: #1a5fb4 !important; }
206section.part h1, section.part h2, section.part p { color: #fff !important; }
207;background-color:#fff;background-image:none;" data-marpit-pagination-total="42">
208<h2 id="fonctionnement-du-favori-f%C3%A9d%C3%A9r%C3%A9">Fonctionnement du favori fédéré</h2>
209<pre is="marp-pre" data-auto-scaling="downscale-only"><code>@alice@forgeA --(c'est quoi, ce dépôt ?)--> acteur du dépôt sur forgeB
210 --(« aimé », signé)---------> boîte de réception sur forgeB
211forgeB vérifie la signature --> compteur de favoris +1, favori ajouté au profil d'alice
212</code></pre>
213<p>Le message part à sens unique, il est signé, il ne contient aucun texte :<br />
214rien à modérer.</p>
215<p>C'est le test le plus simple pour vérifier que l'échange entre deux serveurs<br />
216fonctionne.</p>
217</section>
218</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="8" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
219h1 { color: #1a5fb4; }
220h2 { color: #1a5fb4; }
221h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
222table { font-size: 21px; }
223code { font-size: 18px; }
224section.wide table { font-size: 18px; }
225section.part { background-color: #1a5fb4 !important; }
226section.part h1, section.part h2, section.part p { color: #fff !important; }
227" lang="fr-FR" data-marpit-pagination="8" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
228h1 { color: #1a5fb4; }
229h2 { color: #1a5fb4; }
230h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
231table { font-size: 21px; }
232code { font-size: 18px; }
233section.wide table { font-size: 18px; }
234section.part { background-color: #1a5fb4 !important; }
235section.part h1, section.part h2, section.part p { color: #fff !important; }
236;background-color:#fff;background-image:none;" data-marpit-pagination-total="42">
237<h2 id="suivi-de-comptes-entre-forgejo-et-la-f%C3%A9diverse">Suivi de comptes entre Forgejo et la fédiverse</h2>
238<p>Un compte Forgejo peut suivre un compte <a href="https://joinmastodon.org">Mastodon</a> ou <a href="https://gotosocial.org">GoToSocial</a>, et l'inverse.<br />
239Les commits et les versions apparaissent alors dans un fil social.</p>
240<p>C'est la première fonction de fédération visible pour quelqu'un qui ne<br />
241développe pas.</p>
242<p>Seuls Forgejo, <a href="https://joinmastodon.org">Mastodon</a> et <a href="https://gotosocial.org">GoToSocial</a> sont acceptés pour l'instant.</p>
243</section>
244</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="9" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
245h1 { color: #1a5fb4; }
246h2 { color: #1a5fb4; }
247h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
248table { font-size: 21px; }
249code { font-size: 18px; }
250section.wide table { font-size: 18px; }
251section.part { background-color: #1a5fb4 !important; }
252section.part h1, section.part h2, section.part p { color: #fff !important; }
253" lang="fr-FR" data-marpit-pagination="9" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
254h1 { color: #1a5fb4; }
255h2 { color: #1a5fb4; }
256h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
257table { font-size: 21px; }
258code { font-size: 18px; }
259section.wide table { font-size: 18px; }
260section.part { background-color: #1a5fb4 !important; }
261section.part h1, section.part h2, section.part p { color: #fff !important; }
262;background-color:#fff;background-image:none;" data-marpit-pagination-total="42">
263<h2 id="risque-associ%C3%A9-%C3%A0-lactivation-de-la-f%C3%A9d%C3%A9ration">Risque associé à l'activation de la fédération</h2>
264<p>Le projet se réserve le droit de casser la fédération sans préavis.</p>
265<p>Les autres serveurs mémorisent le domaine et les clés d'une instance dès que la fédération est active. Une rupture peut rendre ce domaine définitivement<br />
266inutilisable pour tout usage ActivityPub.</p>
267</section>
268</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
269h1 { color: #1a5fb4; }
270h2 { color: #1a5fb4; }
271h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
272table { font-size: 21px; }
273code { font-size: 18px; }
274section.wide table { font-size: 18px; }
275section.part { background-color: #1a5fb4 !important; }
276section.part h1, section.part h2, section.part p { color: #fff !important; }
277" lang="fr-FR" data-marpit-pagination="10" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
278h1 { color: #1a5fb4; }
279h2 { color: #1a5fb4; }
280h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
281table { font-size: 21px; }
282code { font-size: 18px; }
283section.wide table { font-size: 18px; }
284section.part { background-color: #1a5fb4 !important; }
285section.part h1, section.part h2, section.part p { color: #fff !important; }
286;background-color:#fff;background-image:none;--marpit-advanced-background-split:38%;" data-marpit-pagination-total="42" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("img/term404.jpg");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="62%" height="720"><section id="10" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
287h1 { color: #1a5fb4; }
288h2 { color: #1a5fb4; }
289h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
290table { font-size: 21px; }
291code { font-size: 18px; }
292section.wide table { font-size: 18px; }
293section.part { background-color: #1a5fb4 !important; }
294section.part h1, section.part h2, section.part p { color: #fff !important; }
295" lang="fr-FR" data-marpit-pagination="10" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
296h1 { color: #1a5fb4; }
297h2 { color: #1a5fb4; }
298h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
299table { font-size: 21px; }
300code { font-size: 18px; }
301section.wide table { font-size: 18px; }
302section.part { background-color: #1a5fb4 !important; }
303section.part h1, section.part h2, section.part p { color: #fff !important; }
304;background-color:#fff;background-image:none;--marpit-advanced-background-split:38%;" data-marpit-pagination-total="42" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right">
305<h2 id="adoption-en-production">Adoption en production</h2>
306<p>La fédération est désactivée par défaut, et les grandes instances publiques ne<br />
307l'activent pas.</p>
308<p>Les points d'entrée de la fédération répondent 404 sur<br />
309<a href="https://codeberg.org">codeberg.org</a>, <a href="https://disroot.org">disroot</a> et<br />
310<a href="https://verdigado.com">verdigado</a>.</p>
311</section>
312</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
313h1 { color: #1a5fb4; }
314h2 { color: #1a5fb4; }
315h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
316table { font-size: 21px; }
317code { font-size: 18px; }
318section.wide table { font-size: 18px; }
319section.part { background-color: #1a5fb4 !important; }
320section.part h1, section.part h2, section.part p { color: #fff !important; }
321" lang="fr-FR" data-marpit-pagination="10" style="" data-marpit-pagination-total="42" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="11" data-paginate="true" data-background-color="#1a5fb4" data-class="lead part" data-color="#ffffff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
322h1 { color: #1a5fb4; }
323h2 { color: #1a5fb4; }
324h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
325table { font-size: 21px; }
326code { font-size: 18px; }
327section.wide table { font-size: 18px; }
328section.part { background-color: #1a5fb4 !important; }
329section.part h1, section.part h2, section.part p { color: #fff !important; }
330" lang="fr-FR" class="lead part" data-marpit-pagination="11" style="--paginate:true;--background-color:#1a5fb4;--class:lead part;--color:#ffffff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
331h1 { color: #1a5fb4; }
332h2 { color: #1a5fb4; }
333h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
334table { font-size: 21px; }
335code { font-size: 18px; }
336section.wide table { font-size: 18px; }
337section.part { background-color: #1a5fb4 !important; }
338section.part h1, section.part h2, section.part p { color: #fff !important; }
339;color:#ffffff;background-color:#1a5fb4;background-image:none;" data-marpit-pagination-total="42">
340<h1 id="3-autres-solutions">3. Autres solutions</h1>
341<h2 id="des-solutions-ind%C3%A9pendantes-dactivitypub">Des solutions indépendantes d'ActivityPub</h2>
342</section>
343</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="12" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
344h1 { color: #1a5fb4; }
345h2 { color: #1a5fb4; }
346h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
347table { font-size: 21px; }
348code { font-size: 18px; }
349section.wide table { font-size: 18px; }
350section.part { background-color: #1a5fb4 !important; }
351section.part h1, section.part h2, section.part p { color: #fff !important; }
352" lang="fr-FR" data-marpit-pagination="12" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
353h1 { color: #1a5fb4; }
354h2 { color: #1a5fb4; }
355h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
356table { font-size: 21px; }
357code { font-size: 18px; }
358section.wide table { font-size: 18px; }
359section.part { background-color: #1a5fb4 !important; }
360section.part h1, section.part h2, section.part p { color: #fff !important; }
361;background-color:#fff;background-image:none;" data-marpit-pagination-total="42">
362<h2 id="mise-en-relation-de-deux-forges-par-miroir">Mise en relation de deux forges par miroir</h2>
363<p>Forgejo push ou pull déjà un dépôt vers une autre instance. Le code passe,<br />
364les tickets non.</p>
365<p>Deux projets comblent une partie du manque :</p>
366<ul>
367<li><strong><a href="https://github.com/lukaswrz/forgesync">forgesync</a></strong> copie tous les dépôts d'une Forgejo vers une autre, tickets et propositions compris.</li>
368<li><strong><a href="https://github.com/RayLabsHQ/gitea-mirror">gitea-mirror</a></strong> fait la même chose avec une interface web, et transfère aussi étiquettes, jalons, versions et wikis.</li>
369<li></li>
370</ul>
371</section>
372</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="13" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
373h1 { color: #1a5fb4; }
374h2 { color: #1a5fb4; }
375h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
376table { font-size: 21px; }
377code { font-size: 18px; }
378section.wide table { font-size: 18px; }
379section.part { background-color: #1a5fb4 !important; }
380section.part h1, section.part h2, section.part p { color: #fff !important; }
381" lang="fr-FR" data-marpit-pagination="13" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
382h1 { color: #1a5fb4; }
383h2 { color: #1a5fb4; }
384h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
385table { font-size: 21px; }
386code { font-size: 18px; }
387section.wide table { font-size: 18px; }
388section.part { background-color: #1a5fb4 !important; }
389section.part h1, section.part h2, section.part p { color: #fff !important; }
390;background-color:#fff;background-image:none;" data-marpit-pagination-total="42">
391<h2 id="f3--migrer-un-projet-pas-le-f%C3%A9d%C3%A9rer"><a href="https://code.forgejo.org/f3/f3-documentation">F3</a> : migrer un projet, pas le fédérer</h2>
392<p>F3 est un format d'export qui contient tout un projet : dépôt, tickets,<br />
393propositions, commentaires, comptes.</p>
394<p>Le code de migration de Forgejo s'en sert déjà.</p>
395</section>
396</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
397h1 { color: #1a5fb4; }
398h2 { color: #1a5fb4; }
399h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
400table { font-size: 21px; }
401code { font-size: 18px; }
402section.wide table { font-size: 18px; }
403section.part { background-color: #1a5fb4 !important; }
404section.part h1, section.part h2, section.part p { color: #fff !important; }
405" lang="fr-FR" data-marpit-pagination="14" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
406h1 { color: #1a5fb4; }
407h2 { color: #1a5fb4; }
408h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
409table { font-size: 21px; }
410code { font-size: 18px; }
411section.wide table { font-size: 18px; }
412section.part { background-color: #1a5fb4 !important; }
413section.part h1, section.part h2, section.part p { color: #fff !important; }
414;background-color:#fff;background-image:none;--marpit-advanced-background-split:33%;" data-marpit-pagination-total="42" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("img/authint.jpg");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="67%" height="720"><section id="14" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
415h1 { color: #1a5fb4; }
416h2 { color: #1a5fb4; }
417h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
418table { font-size: 21px; }
419code { font-size: 18px; }
420section.wide table { font-size: 18px; }
421section.part { background-color: #1a5fb4 !important; }
422section.part h1, section.part h2, section.part p { color: #fff !important; }
423" lang="fr-FR" data-marpit-pagination="14" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
424h1 { color: #1a5fb4; }
425h2 { color: #1a5fb4; }
426h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
427table { font-size: 21px; }
428code { font-size: 18px; }
429section.wide table { font-size: 18px; }
430section.part { background-color: #1a5fb4 !important; }
431section.part h1, section.part h2, section.part p { color: #fff !important; }
432;background-color:#fff;background-image:none;--marpit-advanced-background-split:33%;" data-marpit-pagination-total="42" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right">
433<h2 id="authorized-integrations--authentification-entre-serveurs"><a href="https://forgejo.org/docs/latest/user/api/authorized-integrations/">Authorized Integrations</a> : authentification entre serveurs</h2>
434<p>Forgejo v16, juillet 2026 : <strong>Authorized Integrations</strong>. La CI d'une instance<br />
435peut désormais s'authentifier sur les dépôts d'une autre, sans secret partagé<br />
436ni jeton à renouveler.</p>
437<p>Un lien automatisable, arrivé cette année, sans ActivityPub. Nous l'avons<br />
438testée en conditions réelles entre deux instances, f1 et f2.cyberwild.org.</p>
439</section>
440</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
441h1 { color: #1a5fb4; }
442h2 { color: #1a5fb4; }
443h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
444table { font-size: 21px; }
445code { font-size: 18px; }
446section.wide table { font-size: 18px; }
447section.part { background-color: #1a5fb4 !important; }
448section.part h1, section.part h2, section.part p { color: #fff !important; }
449" lang="fr-FR" data-marpit-pagination="14" style="" data-marpit-pagination-total="42" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="15" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
450h1 { color: #1a5fb4; }
451h2 { color: #1a5fb4; }
452h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
453table { font-size: 21px; }
454code { font-size: 18px; }
455section.wide table { font-size: 18px; }
456section.part { background-color: #1a5fb4 !important; }
457section.part h1, section.part h2, section.part p { color: #fff !important; }
458" lang="fr-FR" data-marpit-pagination="15" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
459h1 { color: #1a5fb4; }
460h2 { color: #1a5fb4; }
461h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
462table { font-size: 21px; }
463code { font-size: 18px; }
464section.wide table { font-size: 18px; }
465section.part { background-color: #1a5fb4 !important; }
466section.part h1, section.part h2, section.part p { color: #fff !important; }
467;background-color:#fff;background-image:none;" data-marpit-pagination-total="42">
468<h2 id="mise-en-place--ex%C3%A9cuteur-et-confiance">Mise en place : exécuteur et confiance</h2>
469<p>Un runner Forgejo (<code>forgejo-runner</code>), en mode host et sans Docker, est<br />
470enregistré sur f1. Côté f2, une intégration autorisée fait confiance aux JWT<br />
471émis par l'émetteur de f1, filtrés par une revendication.</p>
472<pre is="marp-pre" data-auto-scaling="downscale-only"><code>forgejo admin user create-authorized-integration \
473 --username forgeadmin \
474 --issuer https://f1.cyberwild.org/api/actions \
475 --claim-eq repository=forgeadmin/testrepo \
476 --scope write:repository \
477 --repo forgeadmin/testrepo
478</code></pre>
479</section>
480</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="16" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
481h1 { color: #1a5fb4; }
482h2 { color: #1a5fb4; }
483h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
484table { font-size: 21px; }
485code { font-size: 18px; }
486section.wide table { font-size: 18px; }
487section.part { background-color: #1a5fb4 !important; }
488section.part h1, section.part h2, section.part p { color: #fff !important; }
489" lang="fr-FR" data-marpit-pagination="16" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
490h1 { color: #1a5fb4; }
491h2 { color: #1a5fb4; }
492h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
493table { font-size: 21px; }
494code { font-size: 18px; }
495section.wide table { font-size: 18px; }
496section.part { background-color: #1a5fb4 !important; }
497section.part h1, section.part h2, section.part p { color: #fff !important; }
498;background-color:#fff;background-image:none;" data-marpit-pagination-total="42">
499<h2 id="le-ci-de-f1-demande-un-jeton-oidc-%C3%A0-sa-propre-instance">Le CI de f1 demande un jeton OIDC à sa propre instance</h2>
500<pre is="marp-pre" data-auto-scaling="downscale-only"><code>jobs:
501 inspect:
502 runs-on: linux-host
503 enable-openid-connect: true
504 steps:
505 - run: |
506 AUD="u:1:11412bf9-...-f06c"
507 curl -s -H "Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN" \
508 "$ACTIONS_ID_TOKEN_REQUEST_URL&audience=$AUD"
509</code></pre>
510<p>Revendications du JWT reçu : <code>iss</code>, <code>repository</code>, <code>ref</code>, <code>workflow</code>, <code>sub</code>. Le<br />
511jeton est signé par f1 et vérifiable par f2 sans contact préalable.</p>
512</section>
513</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="17" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
514h1 { color: #1a5fb4; }
515h2 { color: #1a5fb4; }
516h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
517table { font-size: 21px; }
518code { font-size: 18px; }
519section.wide table { font-size: 18px; }
520section.part { background-color: #1a5fb4 !important; }
521section.part h1, section.part h2, section.part p { color: #fff !important; }
522" lang="fr-FR" data-marpit-pagination="17" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
523h1 { color: #1a5fb4; }
524h2 { color: #1a5fb4; }
525h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
526table { font-size: 21px; }
527code { font-size: 18px; }
528section.wide table { font-size: 18px; }
529section.part { background-color: #1a5fb4 !important; }
530section.part h1, section.part h2, section.part p { color: #fff !important; }
531;background-color:#fff;background-image:none;" data-marpit-pagination-total="42">
532<h2 id="le-jeton-sert-directement-%C3%A0-sauthentifier-sur-f2">Le jeton sert directement à s'authentifier sur f2</h2>
533<pre is="marp-pre" data-auto-scaling="downscale-only"><code>curl -X POST \
534 -H "Authorization: Bearer $JWT" \
535 -H "Content-Type: application/json" \
536 --data '{"title":"Proposition de test depuis le CI de f1","head":"f1-ci-run-6","base":"main"}' \
537 https://f2.cyberwild.org/api/v1/repos/forgeadmin/testrepo/pulls
538</code></pre>
539<p>Aucun jeton n'est stocké côté f2 pour f1 : la confiance repose sur la<br />
540signature du JWT et les règles de revendications, pas sur un secret échangé à<br />
541l'avance.</p>
542</section>
543</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="18" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
544h1 { color: #1a5fb4; }
545h2 { color: #1a5fb4; }
546h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
547table { font-size: 21px; }
548code { font-size: 18px; }
549section.wide table { font-size: 18px; }
550section.part { background-color: #1a5fb4 !important; }
551section.part h1, section.part h2, section.part p { color: #fff !important; }
552" lang="fr-FR" data-marpit-pagination="18" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
553h1 { color: #1a5fb4; }
554h2 { color: #1a5fb4; }
555h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
556table { font-size: 21px; }
557code { font-size: 18px; }
558section.wide table { font-size: 18px; }
559section.part { background-color: #1a5fb4 !important; }
560section.part h1, section.part h2, section.part p { color: #fff !important; }
561;background-color:#fff;background-image:none;" data-marpit-pagination-total="42">
562<h2 id="r%C3%A9sultat--trois-actions-inter-instances-r%C3%A9ussies">Résultat : trois actions inter-instances réussies</h2>
563<table>
564<thead>
565<tr>
566<th>Action déclenchée depuis f1</th>
567<th>Résultat sur f2</th>
568</tr>
569</thead>
570<tbody>
571<tr>
572<td>Créer un fichier</td>
573<td>HTTP 201</td>
574</tr>
575<tr>
576<td>Créer une branche</td>
577<td>HTTP 201</td>
578</tr>
579<tr>
580<td>Ouvrir une proposition de modification</td>
581<td>HTTP 201</td>
582</tr>
583</tbody>
584</table>
585</section>
586</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="19" data-paginate="true" data-background-color="#1a5fb4" data-class="lead part" data-color="#ffffff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
587h1 { color: #1a5fb4; }
588h2 { color: #1a5fb4; }
589h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
590table { font-size: 21px; }
591code { font-size: 18px; }
592section.wide table { font-size: 18px; }
593section.part { background-color: #1a5fb4 !important; }
594section.part h1, section.part h2, section.part p { color: #fff !important; }
595" lang="fr-FR" class="lead part" data-marpit-pagination="19" style="--paginate:true;--background-color:#1a5fb4;--class:lead part;--color:#ffffff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
596h1 { color: #1a5fb4; }
597h2 { color: #1a5fb4; }
598h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
599table { font-size: 21px; }
600code { font-size: 18px; }
601section.wide table { font-size: 18px; }
602section.part { background-color: #1a5fb4 !important; }
603section.part h1, section.part h2, section.part p { color: #fff !important; }
604;color:#ffffff;background-color:#1a5fb4;background-image:none;" data-marpit-pagination-total="42">
605<h1 id="4-comparaison-avec-dautres-syst%C3%A8mes-d%C3%A9centralis%C3%A9s">4. Comparaison avec d"autres systèmes décentralisés</h1>
606<h2 id="panorama-des-syst%C3%A8mes-compar%C3%A9s">Panorama des systèmes comparés</h2>
607</section>
608</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
609h1 { color: #1a5fb4; }
610h2 { color: #1a5fb4; }
611h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
612table { font-size: 21px; }
613code { font-size: 18px; }
614section.wide table { font-size: 18px; }
615section.part { background-color: #1a5fb4 !important; }
616section.part h1, section.part h2, section.part p { color: #fff !important; }
617" lang="fr-FR" data-marpit-pagination="20" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
618h1 { color: #1a5fb4; }
619h2 { color: #1a5fb4; }
620h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
621table { font-size: 21px; }
622code { font-size: 18px; }
623section.wide table { font-size: 18px; }
624section.part { background-color: #1a5fb4 !important; }
625section.part h1, section.part h2, section.part p { color: #fff !important; }
626;background-color:#fff;background-image:none;--marpit-advanced-background-split:33%;" data-marpit-pagination-total="42" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("img/forgefed.jpg");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="67%" height="720"><section id="20" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
627h1 { color: #1a5fb4; }
628h2 { color: #1a5fb4; }
629h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
630table { font-size: 21px; }
631code { font-size: 18px; }
632section.wide table { font-size: 18px; }
633section.part { background-color: #1a5fb4 !important; }
634section.part h1, section.part h2, section.part p { color: #fff !important; }
635" lang="fr-FR" data-marpit-pagination="20" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
636h1 { color: #1a5fb4; }
637h2 { color: #1a5fb4; }
638h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
639table { font-size: 21px; }
640code { font-size: 18px; }
641section.wide table { font-size: 18px; }
642section.part { background-color: #1a5fb4 !important; }
643section.part h1, section.part h2, section.part p { color: #fff !important; }
644;background-color:#fff;background-image:none;--marpit-advanced-background-split:33%;" data-marpit-pagination-total="42" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right">
645<h2 id="forgefed--une-sp%C3%A9cification-distincte-de-forgejo"><a href="https://forgefed.org">ForgeFed</a> : une spécification distincte de Forgejo</h2>
646<p><strong>ForgeFed</strong> est une extension d'ActivityPub pensée pour les forges : dépôts,<br />
647tickets, propositions, versions.</p>
648<p><strong><a href="https://hackage.haskell.org/package/vervis">Vervis</a></strong> en est l'implémentation de référence : une forge complète et<br />
649séparée, pas un module à brancher sur Forgejo.</p>
650<p>Forgejo construit sa propre fédération. Le blog ForgeFed n'a rien publié depuis janvier 2025.</p>
651</section>
652</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
653h1 { color: #1a5fb4; }
654h2 { color: #1a5fb4; }
655h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
656table { font-size: 21px; }
657code { font-size: 18px; }
658section.wide table { font-size: 18px; }
659section.part { background-color: #1a5fb4 !important; }
660section.part h1, section.part h2, section.part p { color: #fff !important; }
661" lang="fr-FR" data-marpit-pagination="20" style="" data-marpit-pagination-total="42" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="21" data-paginate="true" data-background-color="#fff" data-class="wide" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
662h1 { color: #1a5fb4; }
663h2 { color: #1a5fb4; }
664h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
665table { font-size: 21px; }
666code { font-size: 18px; }
667section.wide table { font-size: 18px; }
668section.part { background-color: #1a5fb4 !important; }
669section.part h1, section.part h2, section.part p { color: #fff !important; }
670" lang="fr-FR" class="wide" data-marpit-pagination="21" style="--paginate:true;--background-color:#fff;--class:wide;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
671h1 { color: #1a5fb4; }
672h2 { color: #1a5fb4; }
673h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
674table { font-size: 21px; }
675code { font-size: 18px; }
676section.wide table { font-size: 18px; }
677section.part { background-color: #1a5fb4 !important; }
678section.part h1, section.part h2, section.part p { color: #fff !important; }
679;background-color:#fff;background-image:none;" data-marpit-pagination-total="42">
680<h2 id="comparaison-des-mod%C3%A8les-techniques">Comparaison des modèles techniques</h2>
681<table>
682<thead>
683<tr>
684<th></th>
685<th><a href="https://www.w3.org/TR/activitypub/">ActivityPub</a></th>
686<th><a href="https://atproto.com">ATProto</a></th>
687<th><a href="https://ipfs.tech">IPFS</a></th>
688<th><a href="https://radicle.dev">Radicle</a></th>
689</tr>
690</thead>
691<tbody>
692<tr>
693<td>Organisé autour de</td>
694<td>le serveur</td>
695<td>l'utilisateur</td>
696<td>le contenu</td>
697<td>le dépôt</td>
698</tr>
699<tr>
700<td>Identité</td>
701<td>une adresse sur un serveur</td>
702<td>un identifiant portable</td>
703<td>une clé</td>
704<td>une clé, sans compte</td>
705</tr>
706<tr>
707<td>Données stockées</td>
708<td>sur le serveur</td>
709<td>pointées par l'identifiant</td>
710<td>partout où copiées</td>
711<td>sur les nœuds relais</td>
712</tr>
713<tr>
714<td>Droits</td>
715<td>signatures, plus l'admin</td>
716<td>des clés, on peut déménager</td>
717<td>aucun</td>
718<td>une liste de clés signée</td>
719</tr>
720<tr>
721<td>Point faible</td>
722<td>changer de serveur = changer d'identité</td>
723<td>une société écrit les règles</td>
724<td>pas de contrôle d'accès</td>
725<td>sans relais, le projet disparaît</td>
726</tr>
727</tbody>
728</table>
729<p>Radicle range tickets et propositions <strong>dans le dépôt git lui-même</strong> .</p>
730</section>
731</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-background-color="#fff" data-class="wide" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
732h1 { color: #1a5fb4; }
733h2 { color: #1a5fb4; }
734h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
735table { font-size: 21px; }
736code { font-size: 18px; }
737section.wide table { font-size: 18px; }
738section.part { background-color: #1a5fb4 !important; }
739section.part h1, section.part h2, section.part p { color: #fff !important; }
740" lang="fr-FR" class="wide" data-marpit-pagination="22" style="--paginate:true;--background-color:#fff;--class:wide;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
741h1 { color: #1a5fb4; }
742h2 { color: #1a5fb4; }
743h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
744table { font-size: 21px; }
745code { font-size: 18px; }
746section.wide table { font-size: 18px; }
747section.part { background-color: #1a5fb4 !important; }
748section.part h1, section.part h2, section.part p { color: #fff !important; }
749;background-color:#fff;background-image:none;--marpit-advanced-background-split:26%;" data-marpit-pagination-total="42" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("img/shipyard.jpg");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="74%" height="720"><section id="22" data-paginate="true" data-background-color="#fff" data-class="wide" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
750h1 { color: #1a5fb4; }
751h2 { color: #1a5fb4; }
752h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
753table { font-size: 21px; }
754code { font-size: 18px; }
755section.wide table { font-size: 18px; }
756section.part { background-color: #1a5fb4 !important; }
757section.part h1, section.part h2, section.part p { color: #fff !important; }
758" lang="fr-FR" class="wide" data-marpit-pagination="22" style="--paginate:true;--background-color:#fff;--class:wide;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
759h1 { color: #1a5fb4; }
760h2 { color: #1a5fb4; }
761h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
762table { font-size: 21px; }
763code { font-size: 18px; }
764section.wide table { font-size: 18px; }
765section.part { background-color: #1a5fb4 !important; }
766section.part h1, section.part h2, section.part p { color: #fff !important; }
767;background-color:#fff;background-image:none;--marpit-advanced-background-split:26%;" data-marpit-pagination-total="42" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right">
768<h2 id="comparaison-des-mod%C3%A8les-de-gouvernance">Comparaison des modèles de gouvernance</h2>
769<table>
770<thead>
771<tr>
772<th></th>
773<th>Code</th>
774<th>Gouvernance</th>
775</tr>
776</thead>
777<tbody>
778<tr>
779<td>ActivityPub</td>
780<td>Mastodon, PeerTube, GoToSocial : AGPL</td>
781<td>spécification W3C figée en 2018. Threads est propriétaire et fédère quand même</td>
782</tr>
783<tr>
784<td>ATProto</td>
785<td>référence ouverte, auto-hébergeable</td>
786<td>une société écrit le protocole, tient l'infrastructure</td>
787</tr>
788<tr>
789<td>IPFS</td>
790<td><a href="https://github.com/ipfs/kubo">Kubo</a> et <a href="https://github.com/ipfs/helia">Helia</a>, MIT</td>
791<td>fondation, mais Protocol Labs possède les domaines et arrête son financement le 30 septembre 2026</td>
792</tr>
793<tr>
794<td>Radicle</td>
795<td><a href="https://github.com/radicle-dev/heartwood">Heartwood</a>, MIT et Apache 2.0</td>
796<td>mené par ses mainteneurs, financé par le <a href="https://radworks.org">DAO Radworks</a></td>
797</tr>
798</tbody>
799</table>
800<p>Ni ActivityPub ni Radicle ne dépendent d'une société..</p>
801</section>
802</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-background-color="#fff" data-class="wide" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
803h1 { color: #1a5fb4; }
804h2 { color: #1a5fb4; }
805h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
806table { font-size: 21px; }
807code { font-size: 18px; }
808section.wide table { font-size: 18px; }
809section.part { background-color: #1a5fb4 !important; }
810section.part h1, section.part h2, section.part p { color: #fff !important; }
811" lang="fr-FR" class="wide" data-marpit-pagination="22" style="" data-marpit-pagination-total="42" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
812h1 { color: #1a5fb4; }
813h2 { color: #1a5fb4; }
814h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
815table { font-size: 21px; }
816code { font-size: 18px; }
817section.wide table { font-size: 18px; }
818section.part { background-color: #1a5fb4 !important; }
819section.part h1, section.part h2, section.part p { color: #fff !important; }
820" lang="fr-FR" data-marpit-pagination="23" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
821h1 { color: #1a5fb4; }
822h2 { color: #1a5fb4; }
823h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
824table { font-size: 21px; }
825code { font-size: 18px; }
826section.wide table { font-size: 18px; }
827section.part { background-color: #1a5fb4 !important; }
828section.part h1, section.part h2, section.part p { color: #fff !important; }
829;background-color:#fff;background-image:none;--marpit-advanced-background-split:33%;" data-marpit-pagination-total="42" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("img/bridgy.jpg");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="67%" height="720"><section id="23" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
830h1 { color: #1a5fb4; }
831h2 { color: #1a5fb4; }
832h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
833table { font-size: 21px; }
834code { font-size: 18px; }
835section.wide table { font-size: 18px; }
836section.part { background-color: #1a5fb4 !important; }
837section.part h1, section.part h2, section.part p { color: #fff !important; }
838" lang="fr-FR" data-marpit-pagination="23" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
839h1 { color: #1a5fb4; }
840h2 { color: #1a5fb4; }
841h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
842table { font-size: 21px; }
843code { font-size: 18px; }
844section.wide table { font-size: 18px; }
845section.part { background-color: #1a5fb4 !important; }
846section.part h1, section.part h2, section.part p { color: #fff !important; }
847;background-color:#fff;background-image:none;--marpit-advanced-background-split:33%;" data-marpit-pagination-total="42" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right">
848<h2 id="ponts-entre-r%C3%A9seaux-sociaux-d%C3%A9centralis%C3%A9s">Ponts entre réseaux sociaux décentralisés</h2>
849<p><strong><a href="https://fed.brid.gy">Bridgy Fed</a></strong> relie la fédiverse, Bluesky et le web<br />
850ouvert dans les deux sens. <strong><a href="https://github.com/snarfed/granary">granary</a></strong>, en dessous traduit entre les formats.</p>
851<p>Ce sont des projets personnels.</p>
852</section>
853</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
854h1 { color: #1a5fb4; }
855h2 { color: #1a5fb4; }
856h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
857table { font-size: 21px; }
858code { font-size: 18px; }
859section.wide table { font-size: 18px; }
860section.part { background-color: #1a5fb4 !important; }
861section.part h1, section.part h2, section.part p { color: #fff !important; }
862" lang="fr-FR" data-marpit-pagination="23" style="" data-marpit-pagination-total="42" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="24" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
863h1 { color: #1a5fb4; }
864h2 { color: #1a5fb4; }
865h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
866table { font-size: 21px; }
867code { font-size: 18px; }
868section.wide table { font-size: 18px; }
869section.part { background-color: #1a5fb4 !important; }
870section.part h1, section.part h2, section.part p { color: #fff !important; }
871" lang="fr-FR" data-marpit-pagination="24" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
872h1 { color: #1a5fb4; }
873h2 { color: #1a5fb4; }
874h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
875table { font-size: 21px; }
876code { font-size: 18px; }
877section.wide table { font-size: 18px; }
878section.part { background-color: #1a5fb4 !important; }
879section.part h1, section.part h2, section.part p { color: #fff !important; }
880;background-color:#fff;background-image:none;" data-marpit-pagination-total="42">
881<h2 id="tentatives-dh%C3%A9bergement-de-git-sur-ipfs">Tentatives d'hébergement de git sur IPFS</h2>
882<table>
883<thead>
884<tr>
885<th>Projet</th>
886<th>État</th>
887</tr>
888</thead>
889<tbody>
890<tr>
891<td><a href="https://github.com/Gitlawb/node">Gitlawb/node</a>, <a href="https://github.com/meyer1994/ipgit">ipgit</a></td>
892<td>actifs en 2026, une centaine de favoris chacun</td>
893</tr>
894<tr>
895<td>git-remote-ipfs, pando, brig</td>
896<td>génération précédente, abandonnée</td>
897</tr>
898</tbody>
899</table>
900<p>Rien n'est utilisable en production.</p>
901<p>ATProto s'inspire du même principe : chaque contenu est identifié par une<br />
902empreinte plutôt que par une adresse, comme sur IPFS. Mais contrairement à<br />
903IPFS, ATProto associe ce contenu à des comptes utilisateurs identifiables.</p>
904</section>
905</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
906h1 { color: #1a5fb4; }
907h2 { color: #1a5fb4; }
908h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
909table { font-size: 21px; }
910code { font-size: 18px; }
911section.wide table { font-size: 18px; }
912section.part { background-color: #1a5fb4 !important; }
913section.part h1, section.part h2, section.part p { color: #fff !important; }
914" lang="fr-FR" data-marpit-pagination="25" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
915h1 { color: #1a5fb4; }
916h2 { color: #1a5fb4; }
917h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
918table { font-size: 21px; }
919code { font-size: 18px; }
920section.wide table { font-size: 18px; }
921section.part { background-color: #1a5fb4 !important; }
922section.part h1, section.part h2, section.part p { color: #fff !important; }
923;background-color:#fff;background-image:none;--marpit-advanced-background-split:33%;" data-marpit-pagination-total="42" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("img/keyoxide.jpg");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="67%" height="720"><section id="25" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
924h1 { color: #1a5fb4; }
925h2 { color: #1a5fb4; }
926h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
927table { font-size: 21px; }
928code { font-size: 18px; }
929section.wide table { font-size: 18px; }
930section.part { background-color: #1a5fb4 !important; }
931section.part h1, section.part h2, section.part p { color: #fff !important; }
932" lang="fr-FR" data-marpit-pagination="25" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
933h1 { color: #1a5fb4; }
934h2 { color: #1a5fb4; }
935h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
936table { font-size: 21px; }
937code { font-size: 18px; }
938section.wide table { font-size: 18px; }
939section.part { background-color: #1a5fb4 !important; }
940section.part h1, section.part h2, section.part p { color: #fff !important; }
941;background-color:#fff;background-image:none;--marpit-advanced-background-split:33%;" data-marpit-pagination-total="42" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right">
942<h2 id="portabilit%C3%A9-de-lidentit%C3%A9">Portabilité de l'identité</h2>
943<p><strong><a href="https://keyoxide.org">Keyoxide</a></strong> produit des preuves d'identité<br />
944décentralisées, déjà utilisées par Forgejo pour ses propres contacts.<br />
945<strong><a href="https://w3c-ccg.github.io/did-method-web/">did:web</a></strong> permet à un domaine de publier une identité portable dès aujourd'hui.</p>
946<p>Mais quitter une instance reste synonyme d'abandonner son identité, ses<br />
947contributions et ses relations. Radicle évite ce défaut en fondant l'identité<br />
948sur des clés plutôt que sur un compte.</p>
949</section>
950</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
951h1 { color: #1a5fb4; }
952h2 { color: #1a5fb4; }
953h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
954table { font-size: 21px; }
955code { font-size: 18px; }
956section.wide table { font-size: 18px; }
957section.part { background-color: #1a5fb4 !important; }
958section.part h1, section.part h2, section.part p { color: #fff !important; }
959" lang="fr-FR" data-marpit-pagination="25" style="" data-marpit-pagination-total="42" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="26" data-paginate="true" data-background-color="#1a5fb4" data-class="lead part" data-color="#ffffff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
960h1 { color: #1a5fb4; }
961h2 { color: #1a5fb4; }
962h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
963table { font-size: 21px; }
964code { font-size: 18px; }
965section.wide table { font-size: 18px; }
966section.part { background-color: #1a5fb4 !important; }
967section.part h1, section.part h2, section.part p { color: #fff !important; }
968" lang="fr-FR" class="lead part" data-marpit-pagination="26" style="--paginate:true;--background-color:#1a5fb4;--class:lead part;--color:#ffffff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
969h1 { color: #1a5fb4; }
970h2 { color: #1a5fb4; }
971h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
972table { font-size: 21px; }
973code { font-size: 18px; }
974section.wide table { font-size: 18px; }
975section.part { background-color: #1a5fb4 !important; }
976section.part h1, section.part h2, section.part p { color: #fff !important; }
977;color:#ffffff;background-color:#1a5fb4;background-image:none;" data-marpit-pagination-total="42">
978<h1 id="5-d%C3%A9monstration-pratique">5. Démonstration pratique</h1>
979<h2 id="radicle-test%C3%A9-entre-r1-et-r2cyberwildorg">Radicle testé entre r1 et r2.cyberwild.org</h2>
980</section>
981</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="27" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
982h1 { color: #1a5fb4; }
983h2 { color: #1a5fb4; }
984h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
985table { font-size: 21px; }
986code { font-size: 18px; }
987section.wide table { font-size: 18px; }
988section.part { background-color: #1a5fb4 !important; }
989section.part h1, section.part h2, section.part p { color: #fff !important; }
990" lang="fr-FR" data-marpit-pagination="27" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
991h1 { color: #1a5fb4; }
992h2 { color: #1a5fb4; }
993h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
994table { font-size: 21px; }
995code { font-size: 18px; }
996section.wide table { font-size: 18px; }
997section.part { background-color: #1a5fb4 !important; }
998section.part h1, section.part h2, section.part p { color: #fff !important; }
999;background-color:#fff;background-image:none;" data-marpit-pagination-total="42">
1000<h2 id="mise-en-place--identit%C3%A9s-et-connexion-directe-entre-pairs">Mise en place : identités et connexion directe entre pairs</h2>
1001<p>Radicle 1.10.3 est installé sur les deux nœuds. Pas de serveur central :<br />
1002chaque nœud a sa propre identité (clé Ed25519) et écoute en pair-à-pair.<br />
1003Comme r1 et r2 sont sur le même réseau local, la connexion est directe, sans<br />
1004tunnel.</p>
1005<pre is="marp-pre" data-auto-scaling="downscale-only"><code>rad auth --alias radicle1
1006radicle-node --listen 0.0.0.0:8776
1007
1008# depuis r1, connexion directe au nœud r2
1009rad node connect z6Mkfqb...2nbFDJg@192.168.1.108:8776
1010</code></pre>
1011</section>
1012</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="28" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
1013h1 { color: #1a5fb4; }
1014h2 { color: #1a5fb4; }
1015h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1016table { font-size: 21px; }
1017code { font-size: 18px; }
1018section.wide table { font-size: 18px; }
1019section.part { background-color: #1a5fb4 !important; }
1020section.part h1, section.part h2, section.part p { color: #fff !important; }
1021" lang="fr-FR" data-marpit-pagination="28" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
1022h1 { color: #1a5fb4; }
1023h2 { color: #1a5fb4; }
1024h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1025table { font-size: 21px; }
1026code { font-size: 18px; }
1027section.wide table { font-size: 18px; }
1028section.part { background-color: #1a5fb4 !important; }
1029section.part h1, section.part h2, section.part p { color: #fff !important; }
1030;background-color:#fff;background-image:none;" data-marpit-pagination-total="42">
1031<h2 id="un-d%C3%A9p%C3%B4t-partag%C3%A9-sans-serveur">Un dépôt partagé, sans serveur</h2>
1032<pre is="marp-pre" data-auto-scaling="downscale-only"><code># sur r1 : publier un dépôt existant sur le réseau
1033rad init --name testrepo --default-branch master --public
1034# -> rad:z2YWuPL53okTkr5mgb7WCKsfxG7h8
1035
1036# sur r2 : récupérer le même dépôt directement depuis r1
1037rad clone rad:z2YWuPL53okTkr5mgb7WCKsfxG7h8
1038</code></pre>
1039<p>Le dépôt, avec ses fichiers, est répliqué intégralement entre les deux nœuds<br />
1040via le protocole pair-à-pair, sans jamais passer par un serveur HTTP.</p>
1041</section>
1042</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="29" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
1043h1 { color: #1a5fb4; }
1044h2 { color: #1a5fb4; }
1045h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1046table { font-size: 21px; }
1047code { font-size: 18px; }
1048section.wide table { font-size: 18px; }
1049section.part { background-color: #1a5fb4 !important; }
1050section.part h1, section.part h2, section.part p { color: #fff !important; }
1051" lang="fr-FR" data-marpit-pagination="29" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
1052h1 { color: #1a5fb4; }
1053h2 { color: #1a5fb4; }
1054h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1055table { font-size: 21px; }
1056code { font-size: 18px; }
1057section.wide table { font-size: 18px; }
1058section.part { background-color: #1a5fb4 !important; }
1059section.part h1, section.part h2, section.part p { color: #fff !important; }
1060;background-color:#fff;background-image:none;" data-marpit-pagination-total="42">
1061<h2 id="un-patch-l%C3%A9quivalent-radicle-dune-proposition-de-modification">Un patch (l'équivalent Radicle d'une proposition de modification)</h2>
1062<pre is="marp-pre" data-auto-scaling="downscale-only"><code># sur r2 : proposer un changement
1063git checkout -b feature-dummy4
1064git commit -am "add dummy4.txt"
1065git push rad HEAD:refs/patches
1066# -> Patch 922387e... ouvert
1067
1068# sur r1 (mainteneur) : relire et fusionner
1069rad patch checkout 922387e
1070git merge --no-ff feature-dummy4-review
1071git push rad master
1072</code></pre>
1073</section>
1074</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="30" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
1075h1 { color: #1a5fb4; }
1076h2 { color: #1a5fb4; }
1077h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1078table { font-size: 21px; }
1079code { font-size: 18px; }
1080section.wide table { font-size: 18px; }
1081section.part { background-color: #1a5fb4 !important; }
1082section.part h1, section.part h2, section.part p { color: #fff !important; }
1083" lang="fr-FR" data-marpit-pagination="30" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
1084h1 { color: #1a5fb4; }
1085h2 { color: #1a5fb4; }
1086h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1087table { font-size: 21px; }
1088code { font-size: 18px; }
1089section.wide table { font-size: 18px; }
1090section.part { background-color: #1a5fb4 !important; }
1091section.part h1, section.part h2, section.part p { color: #fff !important; }
1092;background-color:#fff;background-image:none;" data-marpit-pagination-total="42">
1093<h2 id="r%C3%A9sultat--f%C3%A9d%C3%A9ration-pair-%C3%A0-pair-sans-passerelle-http-obligatoire">Résultat : fédération pair-à-pair, sans passerelle HTTP obligatoire</h2>
1094<table>
1095<thead>
1096<tr>
1097<th>Étape</th>
1098<th>Résultat</th>
1099</tr>
1100</thead>
1101<tbody>
1102<tr>
1103<td>Connexion directe r1 et r2</td>
1104<td>établie</td>
1105</tr>
1106<tr>
1107<td>Réplication du dépôt sur r2</td>
1108<td>fichiers identiques</td>
1109</tr>
1110<tr>
1111<td>Patch ouvert sur r2, visible sur r1</td>
1112<td>propagé automatiquement</td>
1113</tr>
1114<tr>
1115<td>Fusion du patch sur r1</td>
1116<td>master mis à jour</td>
1117</tr>
1118</tbody>
1119</table>
1120<p>Contrairement à Forgejo, aucune passerelle HTTP n'est nécessaire pour fédérer : l'identité et le partage reposent sur les clés des nœuds, pas sur un serveur public, cohérent avec le tableau de comparaison de la section précédente.</p>
1121</section>
1122</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="31" data-paginate="true" data-background-color="#1a5fb4" data-class="lead part" data-color="#ffffff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
1123h1 { color: #1a5fb4; }
1124h2 { color: #1a5fb4; }
1125h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1126table { font-size: 21px; }
1127code { font-size: 18px; }
1128section.wide table { font-size: 18px; }
1129section.part { background-color: #1a5fb4 !important; }
1130section.part h1, section.part h2, section.part p { color: #fff !important; }
1131" lang="fr-FR" class="lead part" data-marpit-pagination="31" style="--paginate:true;--background-color:#1a5fb4;--class:lead part;--color:#ffffff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
1132h1 { color: #1a5fb4; }
1133h2 { color: #1a5fb4; }
1134h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1135table { font-size: 21px; }
1136code { font-size: 18px; }
1137section.wide table { font-size: 18px; }
1138section.part { background-color: #1a5fb4 !important; }
1139section.part h1, section.part h2, section.part p { color: #fff !important; }
1140;color:#ffffff;background-color:#1a5fb4;background-image:none;" data-marpit-pagination-total="42">
1141<h1 id="6-faire-dialoguer-forgejo-et-radicle">6. Faire dialoguer Forgejo et Radicle</h1>
1142<h2 id="graft--un-miroir-entre-les-deux-mondes-d%C3%A9j%C3%A0-test%C3%A9s">graft : un miroir entre les deux mondes déjà testés</h2>
1143</section>
1144</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="32" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
1145h1 { color: #1a5fb4; }
1146h2 { color: #1a5fb4; }
1147h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1148table { font-size: 21px; }
1149code { font-size: 18px; }
1150section.wide table { font-size: 18px; }
1151section.part { background-color: #1a5fb4 !important; }
1152section.part h1, section.part h2, section.part p { color: #fff !important; }
1153" lang="fr-FR" data-marpit-pagination="32" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
1154h1 { color: #1a5fb4; }
1155h2 { color: #1a5fb4; }
1156h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1157table { font-size: 21px; }
1158code { font-size: 18px; }
1159section.wide table { font-size: 18px; }
1160section.part { background-color: #1a5fb4 !important; }
1161section.part h1, section.part h2, section.part p { color: #fff !important; }
1162;background-color:#fff;background-image:none;" data-marpit-pagination-total="42">
1163<h2 id="ce-que-fait-graft">Ce que fait <a href="https://github.com/jeanbaptiste/graft">graft</a></h2>
1164<p>Un démon qui synchronise, entre une instance Forgejo et un nœud Radicle : le code, les tickets, et les propositions de modification dans les deux sens.</p>
1165<p>Il tourne à intervalle régulier, garde son état dans une base SQLite locale, et<br />
1166ne force jamais un push. Les vraies divergences sont signalées et laissées à<br />
1167l'arbitrage humain plutôt que résolues automatiquement.</p>
1168<p>Projet récent (GPLv3, quatre commits, aucune version publiée) : une<br />
1169démonstration de faisabilité, pas un outil éprouvé.</p>
1170</section>
1171</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="33" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
1172h1 { color: #1a5fb4; }
1173h2 { color: #1a5fb4; }
1174h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1175table { font-size: 21px; }
1176code { font-size: 18px; }
1177section.wide table { font-size: 18px; }
1178section.part { background-color: #1a5fb4 !important; }
1179section.part h1, section.part h2, section.part p { color: #fff !important; }
1180" lang="fr-FR" data-marpit-pagination="33" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
1181h1 { color: #1a5fb4; }
1182h2 { color: #1a5fb4; }
1183h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1184table { font-size: 21px; }
1185code { font-size: 18px; }
1186section.wide table { font-size: 18px; }
1187section.part { background-color: #1a5fb4 !important; }
1188section.part h1, section.part h2, section.part p { color: #fff !important; }
1189;background-color:#fff;background-image:none;" data-marpit-pagination-total="42">
1190<h2 id="relier-f1-et-r1">Relier f1 et r1</h2>
1191<pre is="marp-pre" data-auto-scaling="downscale-only"><code class="language-yaml"><span class="hljs-attr">sync_interval:</span> <span class="hljs-string">5m</span>
1192<span class="hljs-attr">state_db:</span> <span class="hljs-string">/var/lib/graft/state.db</span>
1193
1194<span class="hljs-attr">repos:</span>
1195 <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">testrepo</span>
1196 <span class="hljs-attr">forgejo:</span>
1197 <span class="hljs-attr">base_url:</span> <span class="hljs-string">https://f1.cyberwild.org</span>
1198 <span class="hljs-attr">owner:</span> <span class="hljs-string">forgeadmin</span>
1199 <span class="hljs-attr">repo:</span> <span class="hljs-string">testrepo</span>
1200 <span class="hljs-attr">token_file:</span> <span class="hljs-string">/etc/graft/testrepo.token</span>
1201 <span class="hljs-attr">radicle:</span>
1202 <span class="hljs-attr">rid:</span> <span class="hljs-string">rad:z2YWuPL53okTkr5mgb7WCKsfxG7h8</span>
1203 <span class="hljs-attr">http_base_url:</span> <span class="hljs-string">https://r1.cyberwild.org</span>
1204 <span class="hljs-attr">rad_home:</span> <span class="hljs-string">/home/graft/.radicle</span>
1205 <span class="hljs-attr">sync:</span>
1206 <span class="hljs-attr">git:</span> <span class="hljs-literal">true</span>
1207 <span class="hljs-attr">issues:</span> <span class="hljs-literal">true</span>
1208 <span class="hljs-attr">patches:</span> <span class="hljs-literal">true</span>
1209</code></pre>
1210<p>Le même dépôt que dans la démonstration Radicle, maintenant relié à f1 plutôt<br />
1211qu'à r2 seul.</p>
1212</section>
1213</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="34" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
1214h1 { color: #1a5fb4; }
1215h2 { color: #1a5fb4; }
1216h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1217table { font-size: 21px; }
1218code { font-size: 18px; }
1219section.wide table { font-size: 18px; }
1220section.part { background-color: #1a5fb4 !important; }
1221section.part h1, section.part h2, section.part p { color: #fff !important; }
1222" lang="fr-FR" data-marpit-pagination="34" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
1223h1 { color: #1a5fb4; }
1224h2 { color: #1a5fb4; }
1225h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1226table { font-size: 21px; }
1227code { font-size: 18px; }
1228section.wide table { font-size: 18px; }
1229section.part { background-color: #1a5fb4 !important; }
1230section.part h1, section.part h2, section.part p { color: #fff !important; }
1231;background-color:#fff;background-image:none;" data-marpit-pagination-total="42">
1232<h2 id="ce-qui-se-synchronise-et-limites-actuelles">Ce qui se synchronise et limites actuelles</h2>
1233<ul>
1234<li><strong>Code</strong> : la branche par défaut, uniquement en avance rapide.</li>
1235<li><strong>Tickets</strong> : un ticket Forgejo devient un ticket Radicle et inversement,<br />
1236mais seulement à la création.</li>
1237<li><strong>Propositions de modification</strong> : une PR Forgejo ouvre un patch Radicle en poussant son commit de tête vers <code>refs/patches</code>, et inversement un patch Radicle ouvre une PR Forgejo.</li>
1238</ul>
1239<h2 id="aucun-force-push">Aucun force-push.</h2>
1240<h2 id="compl%C3%A9mentarit%C3%A9">Complémentarité</h2>
1241<p>graft ne tranche pas entre Radicle et Forgejo, il les traite comme<br />
1242complémentaires : le même projet existe sur les deux à la fois.</p>
1243<p>Ce que ça ne résout pas : l'identité reste double, un compte Forgejo d'un<br />
1244côté, une clé Radicle de l'autre.</p>
1245</section>
1246</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="35" data-paginate="true" data-background-color="#1a5fb4" data-class="lead part" data-color="#ffffff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
1247h1 { color: #1a5fb4; }
1248h2 { color: #1a5fb4; }
1249h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1250table { font-size: 21px; }
1251code { font-size: 18px; }
1252section.wide table { font-size: 18px; }
1253section.part { background-color: #1a5fb4 !important; }
1254section.part h1, section.part h2, section.part p { color: #fff !important; }
1255" lang="fr-FR" class="lead part" data-marpit-pagination="35" style="--paginate:true;--background-color:#1a5fb4;--class:lead part;--color:#ffffff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
1256h1 { color: #1a5fb4; }
1257h2 { color: #1a5fb4; }
1258h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1259table { font-size: 21px; }
1260code { font-size: 18px; }
1261section.wide table { font-size: 18px; }
1262section.part { background-color: #1a5fb4 !important; }
1263section.part h1, section.part h2, section.part p { color: #fff !important; }
1264;color:#ffffff;background-color:#1a5fb4;background-image:none;" data-marpit-pagination-total="42">
1265<h1 id="7-fonctions-sociales-de-graft">7. Fonctions sociales de graft</h1>
1266<h2 id="un-tableau-de-bord-et-des-ponts-vers-discourse-zulip-tangled">Un tableau de bord, et des ponts vers Discourse, Zulip, Tangled</h2>
1267</section>
1268</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
1269h1 { color: #1a5fb4; }
1270h2 { color: #1a5fb4; }
1271h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1272table { font-size: 21px; }
1273code { font-size: 18px; }
1274section.wide table { font-size: 18px; }
1275section.part { background-color: #1a5fb4 !important; }
1276section.part h1, section.part h2, section.part p { color: #fff !important; }
1277" lang="fr-FR" data-marpit-pagination="36" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
1278h1 { color: #1a5fb4; }
1279h2 { color: #1a5fb4; }
1280h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1281table { font-size: 21px; }
1282code { font-size: 18px; }
1283section.wide table { font-size: 18px; }
1284section.part { background-color: #1a5fb4 !important; }
1285section.part h1, section.part h2, section.part p { color: #fff !important; }
1286;background-color:#fff;background-image:none;--marpit-advanced-background-split:40%;" data-marpit-pagination-total="42" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("img/graft_dashboard.png");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="60%" height="720"><section id="36" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
1287h1 { color: #1a5fb4; }
1288h2 { color: #1a5fb4; }
1289h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1290table { font-size: 21px; }
1291code { font-size: 18px; }
1292section.wide table { font-size: 18px; }
1293section.part { background-color: #1a5fb4 !important; }
1294section.part h1, section.part h2, section.part p { color: #fff !important; }
1295" lang="fr-FR" data-marpit-pagination="36" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
1296h1 { color: #1a5fb4; }
1297h2 { color: #1a5fb4; }
1298h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1299table { font-size: 21px; }
1300code { font-size: 18px; }
1301section.wide table { font-size: 18px; }
1302section.part { background-color: #1a5fb4 !important; }
1303section.part h1, section.part h2, section.part p { color: #fff !important; }
1304;background-color:#fff;background-image:none;--marpit-advanced-background-split:40%;" data-marpit-pagination-total="42" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right">
1305<h2 id="le-tableau-de-bord-graft">Le tableau de bord graft</h2>
1306<p>Une page HTML unique, régénérée à chaque cycle de synchronisation : la liste<br />
1307des dépôts, leur nombre de miroirs, et un flux d'activité récente (les 10<br />
1308derniers commits, tickets, patches et commentaires).</p>
1309<p>Volontairement plat : pas de base de données à interroger, pas<br />
1310d'authentification, juste un fichier HTML servi par le démon lui-même.</p>
1311</section>
1312</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
1313h1 { color: #1a5fb4; }
1314h2 { color: #1a5fb4; }
1315h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1316table { font-size: 21px; }
1317code { font-size: 18px; }
1318section.wide table { font-size: 18px; }
1319section.part { background-color: #1a5fb4 !important; }
1320section.part h1, section.part h2, section.part p { color: #fff !important; }
1321" lang="fr-FR" data-marpit-pagination="36" style="" data-marpit-pagination-total="42" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
1322h1 { color: #1a5fb4; }
1323h2 { color: #1a5fb4; }
1324h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1325table { font-size: 21px; }
1326code { font-size: 18px; }
1327section.wide table { font-size: 18px; }
1328section.part { background-color: #1a5fb4 !important; }
1329section.part h1, section.part h2, section.part p { color: #fff !important; }
1330" lang="fr-FR" data-marpit-pagination="37" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
1331h1 { color: #1a5fb4; }
1332h2 { color: #1a5fb4; }
1333h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1334table { font-size: 21px; }
1335code { font-size: 18px; }
1336section.wide table { font-size: 18px; }
1337section.part { background-color: #1a5fb4 !important; }
1338section.part h1, section.part h2, section.part p { color: #fff !important; }
1339;background-color:#fff;background-image:none;--marpit-advanced-background-split:38%;" data-marpit-pagination-total="42" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("img/graft_social.png");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="62%" height="720"><section id="37" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
1340h1 { color: #1a5fb4; }
1341h2 { color: #1a5fb4; }
1342h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1343table { font-size: 21px; }
1344code { font-size: 18px; }
1345section.wide table { font-size: 18px; }
1346section.part { background-color: #1a5fb4 !important; }
1347section.part h1, section.part h2, section.part p { color: #fff !important; }
1348" lang="fr-FR" data-marpit-pagination="37" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
1349h1 { color: #1a5fb4; }
1350h2 { color: #1a5fb4; }
1351h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1352table { font-size: 21px; }
1353code { font-size: 18px; }
1354section.wide table { font-size: 18px; }
1355section.part { background-color: #1a5fb4 !important; }
1356section.part h1, section.part h2, section.part p { color: #fff !important; }
1357;background-color:#fff;background-image:none;--marpit-advanced-background-split:38%;" data-marpit-pagination-total="42" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right">
1358<h2 id="une-identit%C3%A9-f%C3%A9diverse-par-d%C3%A9p%C3%B4t">Une identité fédiverse par dépôt</h2>
1359<p>Chaque série synchronisée (<code>constitution</code>, <code>federation-x</code>, <code>graft-source</code>...)<br />
1360obtient sa propre identité ActivityPub : <code>@série@graft.cyberwild.org</code>, avec<br />
1361WebFinger, Actor et Outbox interrogeables.</p>
1362<p>Une entrée AT Proto / Bluesky par série existe aussi dans le modèle, prête à<br />
1363être activée dès qu'une clé d'app y est associée — « not configured » pour<br />
1364l'instant.</p>
1365</section>
1366</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
1367h1 { color: #1a5fb4; }
1368h2 { color: #1a5fb4; }
1369h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1370table { font-size: 21px; }
1371code { font-size: 18px; }
1372section.wide table { font-size: 18px; }
1373section.part { background-color: #1a5fb4 !important; }
1374section.part h1, section.part h2, section.part p { color: #fff !important; }
1375" lang="fr-FR" data-marpit-pagination="37" style="" data-marpit-pagination-total="42" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="38" data-paginate="true" data-background-color="#1a5fb4" data-class="lead part" data-color="#ffffff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
1376h1 { color: #1a5fb4; }
1377h2 { color: #1a5fb4; }
1378h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1379table { font-size: 21px; }
1380code { font-size: 18px; }
1381section.wide table { font-size: 18px; }
1382section.part { background-color: #1a5fb4 !important; }
1383section.part h1, section.part h2, section.part p { color: #fff !important; }
1384" lang="fr-FR" class="lead part" data-marpit-pagination="38" style="--paginate:true;--background-color:#1a5fb4;--class:lead part;--color:#ffffff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
1385h1 { color: #1a5fb4; }
1386h2 { color: #1a5fb4; }
1387h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1388table { font-size: 21px; }
1389code { font-size: 18px; }
1390section.wide table { font-size: 18px; }
1391section.part { background-color: #1a5fb4 !important; }
1392section.part h1, section.part h2, section.part p { color: #fff !important; }
1393;color:#ffffff;background-color:#1a5fb4;background-image:none;" data-marpit-pagination-total="42">
1394<h1 id="ponts-vers-discourse-zulip-et-tangled">Ponts vers Discourse, Zulip et Tangled</h1>
1395<h2 id="faire-vivre-lactivit%C3%A9-de-graft-ailleurs-que-sur-une-forge">Faire vivre l'activité de graft ailleurs que sur une forge</h2>
1396</section>
1397</foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
1398h1 { color: #1a5fb4; }
1399h2 { color: #1a5fb4; }
1400h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1401table { font-size: 21px; }
1402code { font-size: 18px; }
1403section.wide table { font-size: 18px; }
1404section.part { background-color: #1a5fb4 !important; }
1405section.part h1, section.part h2, section.part p { color: #fff !important; }
1406" lang="fr-FR" data-marpit-pagination="39" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
1407h1 { color: #1a5fb4; }
1408h2 { color: #1a5fb4; }
1409h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1410table { font-size: 21px; }
1411code { font-size: 18px; }
1412section.wide table { font-size: 18px; }
1413section.part { background-color: #1a5fb4 !important; }
1414section.part h1, section.part h2, section.part p { color: #fff !important; }
1415;background-color:#fff;background-image:none;--marpit-advanced-background-split:35%;" data-marpit-pagination-total="42" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("img/discourse_bridge.png");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="65%" height="720"><section id="39" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
1416h1 { color: #1a5fb4; }
1417h2 { color: #1a5fb4; }
1418h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1419table { font-size: 21px; }
1420code { font-size: 18px; }
1421section.wide table { font-size: 18px; }
1422section.part { background-color: #1a5fb4 !important; }
1423section.part h1, section.part h2, section.part p { color: #fff !important; }
1424" lang="fr-FR" data-marpit-pagination="39" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
1425h1 { color: #1a5fb4; }
1426h2 { color: #1a5fb4; }
1427h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1428table { font-size: 21px; }
1429code { font-size: 18px; }
1430section.wide table { font-size: 18px; }
1431section.part { background-color: #1a5fb4 !important; }
1432section.part h1, section.part h2, section.part p { color: #fff !important; }
1433;background-color:#fff;background-image:none;--marpit-advanced-background-split:35%;" data-marpit-pagination-total="42" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right">
1434<h2 id="pont-vers-discourse">Pont vers Discourse</h2>
1435<p>Un démon séparé (<code>graft-discourse</code>), branché sur le flux ActivityPub de<br />
1436graft : chaque série synchronisée devient une catégorie Discourse<br />
1437(« Federated Repos »), chaque ticket ou patch un sujet.</p>
1438<p>Les réponses sur Discourse repartent en commentaire vers le ticket<br />
1439Forgejo/Radicle d'origine, marquées « via Fediverse ». Le pont ignore ses<br />
1440propres messages pour ne pas boucler.</p>
1441</section>
1442</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
1443h1 { color: #1a5fb4; }
1444h2 { color: #1a5fb4; }
1445h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1446table { font-size: 21px; }
1447code { font-size: 18px; }
1448section.wide table { font-size: 18px; }
1449section.part { background-color: #1a5fb4 !important; }
1450section.part h1, section.part h2, section.part p { color: #fff !important; }
1451" lang="fr-FR" data-marpit-pagination="39" style="" data-marpit-pagination-total="42" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
1452h1 { color: #1a5fb4; }
1453h2 { color: #1a5fb4; }
1454h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1455table { font-size: 21px; }
1456code { font-size: 18px; }
1457section.wide table { font-size: 18px; }
1458section.part { background-color: #1a5fb4 !important; }
1459section.part h1, section.part h2, section.part p { color: #fff !important; }
1460" lang="fr-FR" data-marpit-pagination="40" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
1461h1 { color: #1a5fb4; }
1462h2 { color: #1a5fb4; }
1463h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1464table { font-size: 21px; }
1465code { font-size: 18px; }
1466section.wide table { font-size: 18px; }
1467section.part { background-color: #1a5fb4 !important; }
1468section.part h1, section.part h2, section.part p { color: #fff !important; }
1469;background-color:#fff;background-image:none;--marpit-advanced-background-split:35%;" data-marpit-pagination-total="42" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("img/zulip_bridge.png");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="65%" height="720"><section id="40" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
1470h1 { color: #1a5fb4; }
1471h2 { color: #1a5fb4; }
1472h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1473table { font-size: 21px; }
1474code { font-size: 18px; }
1475section.wide table { font-size: 18px; }
1476section.part { background-color: #1a5fb4 !important; }
1477section.part h1, section.part h2, section.part p { color: #fff !important; }
1478" lang="fr-FR" data-marpit-pagination="40" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
1479h1 { color: #1a5fb4; }
1480h2 { color: #1a5fb4; }
1481h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1482table { font-size: 21px; }
1483code { font-size: 18px; }
1484section.wide table { font-size: 18px; }
1485section.part { background-color: #1a5fb4 !important; }
1486section.part h1, section.part h2, section.part p { color: #fff !important; }
1487;background-color:#fff;background-image:none;--marpit-advanced-background-split:35%;" data-marpit-pagination-total="42" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right">
1488<h2 id="pont-vers-zulip">Pont vers Zulip</h2>
1489<p>Même principe, décliné pour Zulip (<code>graft-zulip</code>) : un canal par série<br />
1490(ici <code>constitution</code>), un fil (<em>topic</em>) par ticket. Zulip distingue le canal<br />
1491et le sujet là où Discourse n'a qu'une catégorie et un sujet — les deux<br />
1492démons partagent l'essentiel de leur code, seule la couche protocole change.</p>
1493</section>
1494</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
1495h1 { color: #1a5fb4; }
1496h2 { color: #1a5fb4; }
1497h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1498table { font-size: 21px; }
1499code { font-size: 18px; }
1500section.wide table { font-size: 18px; }
1501section.part { background-color: #1a5fb4 !important; }
1502section.part h1, section.part h2, section.part p { color: #fff !important; }
1503" lang="fr-FR" data-marpit-pagination="40" style="" data-marpit-pagination-total="42" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
1504h1 { color: #1a5fb4; }
1505h2 { color: #1a5fb4; }
1506h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1507table { font-size: 21px; }
1508code { font-size: 18px; }
1509section.wide table { font-size: 18px; }
1510section.part { background-color: #1a5fb4 !important; }
1511section.part h1, section.part h2, section.part p { color: #fff !important; }
1512" lang="fr-FR" data-marpit-pagination="41" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
1513h1 { color: #1a5fb4; }
1514h2 { color: #1a5fb4; }
1515h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1516table { font-size: 21px; }
1517code { font-size: 18px; }
1518section.wide table { font-size: 18px; }
1519section.part { background-color: #1a5fb4 !important; }
1520section.part h1, section.part h2, section.part p { color: #fff !important; }
1521;background-color:#fff;background-image:none;--marpit-advanced-background-split:35%;" data-marpit-pagination-total="42" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("img/tangled_bridge.png");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="65%" height="720"><section id="41" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
1522h1 { color: #1a5fb4; }
1523h2 { color: #1a5fb4; }
1524h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1525table { font-size: 21px; }
1526code { font-size: 18px; }
1527section.wide table { font-size: 18px; }
1528section.part { background-color: #1a5fb4 !important; }
1529section.part h1, section.part h2, section.part p { color: #fff !important; }
1530" lang="fr-FR" data-marpit-pagination="41" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
1531h1 { color: #1a5fb4; }
1532h2 { color: #1a5fb4; }
1533h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1534table { font-size: 21px; }
1535code { font-size: 18px; }
1536section.wide table { font-size: 18px; }
1537section.part { background-color: #1a5fb4 !important; }
1538section.part h1, section.part h2, section.part p { color: #fff !important; }
1539;background-color:#fff;background-image:none;--marpit-advanced-background-split:35%;" data-marpit-pagination-total="42" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right">
1540<h2 id="vers-tangled-et-at-proto">Vers Tangled et AT Proto</h2>
1541<p>Tangled (une forge Git construite sur AT Proto/Bluesky) demande une identité<br />
1542signée par un PDS pour enregistrer un serveur Git (<em>knot</em>). Un PDS a été<br />
1543installé pour produire ce DID, <code>tangled.cyberwild.org</code> a été enregistré et<br />
1544vérifié : la prochaine étape naturelle est d'y raccrocher les mêmes séries<br />
1545que sur Forgejo et Radicle.</p>
1546</section>
1547</foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
1548h1 { color: #1a5fb4; }
1549h2 { color: #1a5fb4; }
1550h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1551table { font-size: 21px; }
1552code { font-size: 18px; }
1553section.wide table { font-size: 18px; }
1554section.part { background-color: #1a5fb4 !important; }
1555section.part h1, section.part h2, section.part p { color: #fff !important; }
1556" lang="fr-FR" data-marpit-pagination="41" style="" data-marpit-pagination-total="42" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
1557h1 { color: #1a5fb4; }
1558h2 { color: #1a5fb4; }
1559h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1560table { font-size: 21px; }
1561code { font-size: 18px; }
1562section.wide table { font-size: 18px; }
1563section.part { background-color: #1a5fb4 !important; }
1564section.part h1, section.part h2, section.part p { color: #fff !important; }
1565" lang="fr-FR" data-marpit-pagination="42" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
1566h1 { color: #1a5fb4; }
1567h2 { color: #1a5fb4; }
1568h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1569table { font-size: 21px; }
1570code { font-size: 18px; }
1571section.wide table { font-size: 18px; }
1572section.part { background-color: #1a5fb4 !important; }
1573section.part h1, section.part h2, section.part p { color: #fff !important; }
1574;background-color:#fff;background-image:none;--marpit-advanced-background-split:28%;" data-marpit-pagination-total="42" data-marpit-advanced-background="background" data-marpit-advanced-background-split="right"><div data-marpit-advanced-background-container="true" data-marpit-advanced-background-direction="horizontal"><figure style="background-image:url("img/radicle.jpg");background-size:contain;"></figure></div></section></foreignObject><foreignObject width="72%" height="720"><section id="42" data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
1575h1 { color: #1a5fb4; }
1576h2 { color: #1a5fb4; }
1577h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1578table { font-size: 21px; }
1579code { font-size: 18px; }
1580section.wide table { font-size: 18px; }
1581section.part { background-color: #1a5fb4 !important; }
1582section.part h1, section.part h2, section.part p { color: #fff !important; }
1583" lang="fr-FR" data-marpit-pagination="42" style="--paginate:true;--background-color:#fff;--theme:gaia;--lang:fr-FR;--style:section { font-size: 25px; }
1584h1 { color: #1a5fb4; }
1585h2 { color: #1a5fb4; }
1586h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1587table { font-size: 21px; }
1588code { font-size: 18px; }
1589section.wide table { font-size: 18px; }
1590section.part { background-color: #1a5fb4 !important; }
1591section.part h1, section.part h2, section.part p { color: #fff !important; }
1592;background-color:#fff;background-image:none;--marpit-advanced-background-split:28%;" data-marpit-pagination-total="42" data-marpit-advanced-background="content" data-marpit-advanced-background-split="right">
1593<h2 id="synth%C3%A8se-et-questions">Synthèse et questions</h2>
1594<p><strong>Discussion :</strong></p>
1595<ul>
1596<li>Qui modère une proposition de modification abusive venue d'un autre<br />
1597serveur ?</li>
1598<li>Les miroirs et F3 marchent déjà. ActivityPub résout-il le vrai problème ?</li>
1599<li>Radicle et Forgejo : rivaux, ou deux moitiés de la même réponse ?</li>
1600</ul>
1601</section>
1602<script>!function(){"use strict";const t={h1:{proto:()=>HTMLHeadingElement,attrs:{role:"heading","aria-level":"1"},style:"display: block; font-size: 2em; margin-block-start: 0.67em; margin-block-end: 0.67em; margin-inline-start: 0px; margin-inline-end: 0px; font-weight: bold;"},h2:{proto:()=>HTMLHeadingElement,attrs:{role:"heading","aria-level":"2"},style:"display: block; font-size: 1.5em; margin-block-start: 0.83em; margin-block-end: 0.83em; margin-inline-start: 0px; margin-inline-end: 0px; font-weight: bold;"},h3:{proto:()=>HTMLHeadingElement,attrs:{role:"heading","aria-level":"3"},style:"display: block; font-size: 1.17em; margin-block-start: 1em; margin-block-end: 1em; margin-inline-start: 0px; margin-inline-end: 0px; font-weight: bold;"},h4:{proto:()=>HTMLHeadingElement,attrs:{role:"heading","aria-level":"4"},style:"display: block; margin-block-start: 1.33em; margin-block-end: 1.33em; margin-inline-start: 0px; margin-inline-end: 0px; font-weight: bold;"},h5:{proto:()=>HTMLHeadingElement,attrs:{role:"heading","aria-level":"5"},style:"display: block; font-size: 0.83em; margin-block-start: 1.67em; margin-block-end: 1.67em; margin-inline-start: 0px; margin-inline-end: 0px; font-weight: bold;"},h6:{proto:()=>HTMLHeadingElement,attrs:{role:"heading","aria-level":"6"},style:"display: block; font-size: 0.67em; margin-block-start: 2.33em; margin-block-end: 2.33em; margin-inline-start: 0px; margin-inline-end: 0px; font-weight: bold;"},span:{proto:()=>HTMLSpanElement},pre:{proto:()=>HTMLElement,style:"display: block; font-family: monospace; white-space: pre; margin: 1em 0; --marp-auto-scaling-white-space: pre;"}},e="data-marp-auto-scaling-wrapper",i="data-marp-auto-scaling-svg",n="data-marp-auto-scaling-container";class s extends HTMLElement{container;containerSize;containerObserver;svg;svgComputedStyle;svgPreserveAspectRatio="xMinYMid meet";wrapper;wrapperSize;wrapperObserver;constructor(){super();const t=t=>([e])=>{const{width:i,height:n}=e.contentRect;this[t]={width:i,height:n},this.updateSVGRect()};this.attachShadow({mode:"open"}),this.containerObserver=new ResizeObserver(t("containerSize")),this.wrapperObserver=new ResizeObserver((...e)=>{t("wrapperSize")(...e),this.flushSvgDisplay()})}static get observedAttributes(){return["data-downscale-only"]}connectedCallback(){this.shadowRoot.innerHTML=`\n<style>\n svg[${i}] { display: block; width: 100%; height: auto; vertical-align: top; }\n span[${n}] { display: table; white-space: var(--marp-auto-scaling-white-space, nowrap); width: max-content; }\n</style>\n<div ${e}>\n <svg part="svg" ${i}>\n <foreignObject><span ${n}><slot></slot></span></foreignObject>\n </svg>\n</div>\n `.split(/\n\s*/).join(""),this.wrapper=this.shadowRoot.querySelector(`div[${e}]`)??void 0;const t=this.svg;this.svg=this.wrapper?.querySelector(`svg[${i}]`)??void 0,this.svg!==t&&(this.svgComputedStyle=this.svg?window.getComputedStyle(this.svg):void 0),this.container=this.svg?.querySelector(`span[${n}]`)??void 0,this.observe()}disconnectedCallback(){this.svg=void 0,this.svgComputedStyle=void 0,this.wrapper=void 0,this.container=void 0,this.observe()}attributeChangedCallback(){this.observe()}flushSvgDisplay(){const{svg:t}=this;t&&(t.style.display="inline",requestAnimationFrame(()=>{t.style.display=""}))}observe(){this.containerObserver.disconnect(),this.wrapperObserver.disconnect(),this.wrapper&&this.wrapperObserver.observe(this.wrapper),this.container&&this.containerObserver.observe(this.container),this.svgComputedStyle&&this.observeSVGStyle(this.svgComputedStyle)}observeSVGStyle(t){const e=()=>{const i=(()=>{const e=t.getPropertyValue("--preserve-aspect-ratio");if(e)return e.trim();return`x${(({textAlign:t,direction:e})=>{if(t.endsWith("left"))return"Min";if(t.endsWith("right"))return"Max";if("start"===t||"end"===t){let i="rtl"===e;return"end"===t&&(i=!i),i?"Max":"Min"}return"Mid"})(t)}YMid meet`})();i!==this.svgPreserveAspectRatio&&(this.svgPreserveAspectRatio=i,this.updateSVGRect()),t===this.svgComputedStyle&&requestAnimationFrame(e)};e()}updateSVGRect(){let t=Math.ceil(this.containerSize?.width??0);const e=Math.ceil(this.containerSize?.height??0);void 0!==this.dataset.downscaleOnly&&(t=Math.max(t,this.wrapperSize?.width??0));const i=this.svg?.querySelector(":scope > foreignObject");if(i?.setAttribute("width",`${t}`),i?.setAttribute("height",`${e}`),this.svg&&(this.svg.setAttribute("viewBox",`0 0 ${t} ${e}`),this.svg.setAttribute("preserveAspectRatio",this.svgPreserveAspectRatio),this.svg.style.height=t<=0||e<=0?"0":""),this.container){const t=this.svgPreserveAspectRatio.toLowerCase();this.container.style.marginLeft=t.startsWith("xmid")||t.startsWith("xmax")?"auto":"0",this.container.style.marginRight=t.startsWith("xmi")?"auto":"0"}}}const r=(t,{attrs:e={},style:i})=>class extends t{constructor(...t){super(...t);for(const[t,i]of Object.entries(e))this.hasAttribute(t)||this.setAttribute(t,i);this._shadow()}static get observedAttributes(){return["data-auto-scaling"]}connectedCallback(){this._update()}attributeChangedCallback(){this._update()}_shadow(){if(!this.shadowRoot)try{this.attachShadow({mode:"open"})}catch(t){if(!(t instanceof Error&&"NotSupportedError"===t.name))throw t}return this.shadowRoot}_update(){const t=this._shadow();if(t){const e=i?`<style>:host { ${i} }</style>`:"";let n="<slot></slot>";const{autoScaling:s}=this.dataset;if(void 0!==s){n=`<marp-auto-scaling exportparts="svg:auto-scaling" ${"downscale-only"===s?"data-downscale-only":""}>${n}</marp-auto-scaling>`}t.innerHTML=e+n}}};let o;const a=()=>o??(o=!!document.createElement("div",{is:"marp-auto-scaling"}).outerHTML.startsWith("<div is"),o),l=Symbol();let c;const d="marpitSVGPolyfill:setZoomFactor,",h=Symbol(),g=Symbol();const p=()=>{const t="Apple Computer, Inc."===navigator.vendor,e=t?[v]:[],i={then:e=>(t?(async()=>{if(void 0===c){const t=document.createElement("canvas");t.width=10,t.height=10;const e=t.getContext("2d"),i=new Image(10,10),n=new Promise(t=>{i.addEventListener("load",()=>t())});i.crossOrigin="anonymous",i.src="data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2210%22%20height%3D%2210%22%20viewBox%3D%220%200%201%201%22%3E%3CforeignObject%20width%3D%221%22%20height%3D%221%22%20requiredExtensions%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%3Cdiv%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%20style%3D%22width%3A%201px%3B%20height%3A%201px%3B%20background%3A%20red%3B%20position%3A%20relative%22%3E%3C%2Fdiv%3E%3C%2FforeignObject%3E%3C%2Fsvg%3E",await n,e.drawImage(i,0,0),c=e.getImageData(5,5,1,1).data[3]<128}return c})().then(t=>{null==e||e(t?[v]:[])}):null==e||e([]),i)};return Object.assign(e,i)};let m,u;function v(t){const e="object"==typeof t&&t.target||document,i="object"==typeof t?t.zoom:t;window[g]||(Object.defineProperty(window,g,{configurable:!0,value:!0}),document.body.style.zoom=1.0001,document.body.offsetHeight,document.body.style.zoom=1,window.addEventListener("message",({data:t,origin:e})=>{if(e===window.origin)try{if(t&&"string"==typeof t&&t.startsWith(d)){const[,e]=t.split(","),i=Number.parseFloat(e);Number.isNaN(i)||(u=i)}}catch(t){console.error(t)}}));let n=!1;Array.from(e.querySelectorAll("svg[data-marpit-svg]"),t=>{var e,s,r,o;t.style.transform||(t.style.transform="translateZ(0)");const a=i||u||t.currentScale||1;m!==a&&(m=a,n=a);const l=t.getBoundingClientRect(),{length:c}=t.children;for(let i=0;i<c;i+=1){const n=t.children[i];if(n.getScreenCTM){const t=n.getScreenCTM();if(t){const i=null!==(s=null===(e=n.x)||void 0===e?void 0:e.baseVal.value)&&void 0!==s?s:0,c=null!==(o=null===(r=n.y)||void 0===r?void 0:r.baseVal.value)&&void 0!==o?o:0,d=n.children.length;for(let e=0;e<d;e+=1){const s=n.children[e];if("SECTION"===s.tagName){const{style:e}=s;e.transformOrigin||(e.transformOrigin=`${-i}px ${-c}px`),e.transform=`scale(${a}) matrix(${t.a}, ${t.b}, ${t.c}, ${t.d}, ${t.e-l.left}, ${t.f-l.top}) translateZ(0.0001px)`;break}}}}}}),!1!==n&&Array.from(e.querySelectorAll("iframe"),({contentWindow:t})=>{null==t||t.postMessage(`${d}${n}`,"null"===window.origin?"*":window.origin)})}function w({once:t=!1,target:e=document}={}){const i=function(t=document){if(t[h])return t[h];let e=!0;const i=()=>{e=!1,delete t[h]};Object.defineProperty(t,h,{configurable:!0,value:i});let n=[],s=!1;(async()=>{try{n=await p()}finally{s=!0}})();const r=()=>{for(const e of n)e({target:t});s&&0===n.length||e&&window.requestAnimationFrame(r)};return r(),i}(e);return t?(i(),()=>{}):i}m=1,u=void 0;const b=Symbol(),y=(e=document)=>{if("undefined"==typeof window)throw new Error("Marp Core's browser script is valid only in browser context.");if(((e=document)=>{const i=window[l];i||customElements.define("marp-auto-scaling",s);for(const n of Object.keys(t)){const s=`marp-${n}`,o=t[n].proto();a()&&o!==HTMLElement?i||customElements.define(s,r(o,{style:t[n].style}),{extends:n}):(i||customElements.define(s,r(HTMLElement,t[n])),e.querySelectorAll(`${n}[is="${s}"]`).forEach(t=>{t.outerHTML=t.outerHTML.replace(new RegExp(`^<${n}`,"i"),`<${s}`).replace(new RegExp(`</${n}>$`,"i"),`</${s}>`)}))}window[l]=!0})(e),e[b])return e[b];const i=w({target:e}),n=()=>{i(),delete e[b]},o=Object.assign(n,{cleanup:n,update:()=>y(e)});return Object.defineProperty(e,b,{configurable:!0,value:o}),o},f=document.currentScript;y(f?f.getRootNode():document)}();
1603</script></foreignObject><foreignObject width="1280" height="720" data-marpit-advanced-background="pseudo"><section data-paginate="true" data-background-color="#fff" data-theme="gaia" data-lang="fr-FR" data-style="section { font-size: 25px; }
1604h1 { color: #1a5fb4; }
1605h2 { color: #1a5fb4; }
1606h3 { color: #555; font-size: 24px; margin-bottom: 0.2em; }
1607table { font-size: 21px; }
1608code { font-size: 18px; }
1609section.wide table { font-size: 18px; }
1610section.part { background-color: #1a5fb4 !important; }
1611section.part h1, section.part h2, section.part p { color: #fff !important; }
1612" lang="fr-FR" data-marpit-pagination="42" style="" data-marpit-pagination-total="42" data-marpit-advanced-background="pseudo" data-marpit-advanced-background-split="right"></section></foreignObject></svg></div><script>/*!! License: https://unpkg.com/@marp-team/marp-cli@4.5.1/lib/bespoke.js.LICENSE.txt */
1613!function(){"use strict";function e(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var t,n,r=(n||(n=1,t={from:function(e,t){var n,r=1===(e.parent||e).nodeType?e.parent||e:document.querySelector(e.parent||e),o=[].filter.call("string"==typeof e.slides?r.querySelectorAll(e.slides):e.slides||r.children,function(e){return"SCRIPT"!==e.nodeName}),i={},a=function(e,t){return(t=t||{}).index=o.indexOf(e),t.slide=e,t},s=function(e,t){i[e]=(i[e]||[]).filter(function(e){return e!==t})},l=function(e,t){return(i[e]||[]).reduce(function(e,n){return e&&!1!==n(t)},!0)},c=function(e,t){o[e]&&(n&&l("deactivate",a(n,t)),n=o[e],l("activate",a(n,t)))},d=function(e,t){var r=o.indexOf(n)+e;l(e>0?"next":"prev",a(n,t))&&c(r,t)},u={off:s,on:function(e,t){return(i[e]||(i[e]=[])).push(t),s.bind(null,e,t)},fire:l,slide:function(e,t){if(!arguments.length)return o.indexOf(n);l("slide",a(o[e],t))&&c(e,t)},next:d.bind(null,1),prev:d.bind(null,-1),parent:r,slides:o,destroy:function(e){l("destroy",a(n,e)),i={}}};return(t||[]).forEach(function(e){e(u)}),n||c(0),u}}),t),o=e(r);const i=document.body,a=(...e)=>history.replaceState(...e),s="",l="presenter",c="next",d="overview",u=["",l,d,c],f="bespoke-marp-",m=`data-${f}`,g=(e,{protocol:t,host:n,pathname:r,hash:o}=location)=>{const i=e.toString();return`${t}//${n}${r}${i?"?":""}${i}${o}`},p=()=>i.dataset.bespokeView,v=e=>new URLSearchParams(location.search).get(e),h=(e,t={})=>{const n={location,setter:a,...t},r=new URLSearchParams(n.location.search);for(const t of Object.keys(e)){const n=e[t];"string"==typeof n?r.set(t,n):r.delete(t)}try{n.setter({...window.history.state??{}},"",g(r,n.location))}catch(e){console.error(e)}},w=(()=>{const e="bespoke-marp";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return!1}})(),y=e=>{try{return localStorage.getItem(e)}catch{return null}},b=(e,t)=>{try{return localStorage.setItem(e,t),!0}catch{return!1}},k=e=>{try{return localStorage.removeItem(e),!0}catch{return!1}},x=(e,t)=>{const n="aria-hidden";t?e.setAttribute(n,"true"):e.removeAttribute(n)},E=e=>{e.parent.classList.add(`${f}parent`),e.slides.forEach(e=>e.classList.add(`${f}slide`)),e.on("activate",t=>{const n=`${f}active`,r=t.slide,o=r.classList,i=!o.contains(n);if(e.slides.forEach(e=>{e.classList.remove(n),x(e,!0)}),o.add(n),x(r,!1),i){const e=`${n}-ready`;o.add(e),document.body.clientHeight,o.remove(e)}})},$=e=>{let t=0,n=0;Object.defineProperty(e,"fragments",{enumerable:!0,value:e.slides.map(e=>[null,...e.querySelectorAll("[data-marpit-fragment]")])});const r=r=>void 0!==e.fragments[t][n+r],o=(r,o)=>{t=r,n=o,e.fragments.forEach((e,t)=>{e.forEach((e,n)=>{if(null==e)return;const i=t<r||t===r&&n<=o;e.setAttribute(`${m}fragment`,(i?"":"in")+"active");const a=`${m}current-fragment`;t===r&&n===o?e.setAttribute(a,"current"):e.removeAttribute(a)})}),e.fragmentIndex=o;const i={slide:e.slides[r],index:r,fragments:e.fragments[r],fragmentIndex:o};e.fire("fragment",i)};e.on("next",({fragment:i=!0})=>{if(i){if(r(1))return o(t,n+1),!1;const i=t+1;e.fragments[i]&&o(i,0)}else{const r=e.fragments[t].length;if(n+1<r)return o(t,r-1),!1;const i=e.fragments[t+1];i&&o(t+1,i.length-1)}}),e.on("prev",({fragment:i=!0})=>{if(r(-1)&&i)return o(t,n-1),!1;const a=t-1;e.fragments[a]&&o(a,e.fragments[a].length-1)}),e.on("slide",({index:t,fragment:n})=>{let r=0;if(void 0!==n){const o=e.fragments[t];if(o){const{length:e}=o;r=-1===n?e-1:Math.min(Math.max(n,0),e-1)}}o(t,r)}),o(0,0)},L=document,S=()=>!(!L.fullscreenEnabled&&!L.webkitFullscreenEnabled),P=()=>!(!L.fullscreenElement&&!L.webkitFullscreenElement),_=e=>{e.fullscreen=()=>{S()&&(async()=>{P()?(L.exitFullscreen||L.webkitExitFullscreen)?.call(L):((e=L.body)=>{(e.requestFullscreen||e.webkitRequestFullscreen)?.call(e)})()})()},document.addEventListener("keydown",t=>{"f"!==t.key&&"F11"!==t.key||t.altKey||t.ctrlKey||t.metaKey||!S()||(e.fullscreen(),t.preventDefault())})},O=`${f}inactive`,T=(e=2e3)=>({parent:t,fire:n})=>{const r=t.classList,o=e=>n(`marp-${e?"":"in"}active`);let i;const a=()=>{i&&clearTimeout(i),i=setTimeout(()=>{r.add(O),o()},e),r.contains(O)&&(r.remove(O),o(!0))};for(const e of["mousedown","mousemove","touchend"])document.addEventListener(e,a);setTimeout(a,0)},I=["AUDIO","BUTTON","INPUT","SELECT","TEXTAREA","VIDEO"],M=e=>{e.parent.addEventListener("keydown",e=>{if(!e.target)return;const t=e.target;(I.includes(t.nodeName)||"true"===t.contentEditable)&&e.stopPropagation()})},A=e=>{window.addEventListener("load",()=>{for(const t of e.slides){const e=t.querySelector("marp-auto-scaling, [data-auto-scaling], [data-marp-fitting]");t.setAttribute(`${m}load`,e?"":"hideable")}})},C=({interval:e=250}={})=>t=>{document.addEventListener("keydown",e=>{if(" "===e.key&&e.shiftKey)t.prev();else if("ArrowLeft"===e.key||"ArrowUp"===e.key||"PageUp"===e.key)t.prev({fragment:!e.shiftKey});else if(" "!==e.key||e.shiftKey)if("ArrowRight"===e.key||"ArrowDown"===e.key||"PageDown"===e.key)t.next({fragment:!e.shiftKey});else if("End"===e.key)t.slide(t.slides.length-1,{fragment:-1});else{if("Home"!==e.key)return;t.slide(0)}else t.next();e.preventDefault()});let n,r,o=0;t.parent.addEventListener("wheel",i=>{let a=!1;const s=(e,t)=>{e&&(a=a||((e,t)=>((e,t)=>{const n="X"===t?"Width":"Height";return e[`client${n}`]<e[`scroll${n}`]})(e,t)&&((e,t)=>{const{overflow:n}=e,r=e[`overflow${t}`];return"auto"===n||"scroll"===n||"auto"===r||"scroll"===r})(getComputedStyle(e),t))(e,t)),e?.parentElement&&s(e.parentElement,t)};if(0!==i.deltaX&&s(i.target,"X"),0!==i.deltaY&&s(i.target,"Y"),a)return;i.preventDefault();const l=Math.sqrt(i.deltaX**2+i.deltaY**2);if(void 0!==i.wheelDelta){if(void 0===i.webkitForce&&Math.abs(i.wheelDelta)<40)return;if(i.deltaMode===i.DOM_DELTA_PIXEL&&l<4)return}else if(i.deltaMode===i.DOM_DELTA_PIXEL&&l<12)return;r&&clearTimeout(r),r=setTimeout(()=>{n=0},e);const c=Date.now()-o<e,d=l<=n;if(n=l,c||d)return;let u;(i.deltaX>0||i.deltaY>0)&&(u="next"),(i.deltaX<0||i.deltaY<0)&&(u="prev"),u&&(t[u](),o=Date.now())})},D=(e=`.${f}osc`)=>{const t=document.querySelector(e);if(!t)return()=>{};const n=(e,n)=>{t.querySelectorAll(`[${m}osc=${JSON.stringify(e)}]`).forEach(n)};if(S()||n("fullscreen",e=>e.style.display="none"),!w){const e=(e,t)=>{e.disabled=!0,e.title=`${t} is disabled due to restricted localStorage.`};n("presenter",t=>e(t,"Presenter view")),n("overview",t=>e(t,"Overview view"))}return e=>{t.addEventListener("click",t=>{if(t.target instanceof HTMLElement){const{bespokeMarpOsc:n}=t.target.dataset;n&&t.target.blur();const r={fragment:!t.shiftKey};"next"===n?e.next(r):"prev"===n?e.prev(r):"fullscreen"===n?e?.fullscreen():"presenter"===n?e.openPresenterView():"overview"===n&&e.toggleOverviewView()}}),e.parent.appendChild(t),e.on("activate",({index:t})=>{n("page",n=>n.textContent=`Page ${t+1} of ${e.slides.length}`)}),e.on("fragment",({index:t,fragments:r,fragmentIndex:o})=>{n("prev",e=>e.disabled=0===t&&0===o),n("next",n=>n.disabled=t===e.slides.length-1&&o===r.length-1)}),e.on("marp-active",()=>x(t,!1)),e.on("marp-inactive",()=>x(t,!0)),S()&&(e=>{for(const t of["","webkit"])L.addEventListener(t+"fullscreenchange",e)})(()=>n("fullscreen",e=>e.classList.toggle("exit",S()&&P())))}},N=e=>{if(e.syncKey&&"string"==typeof e.syncKey)return!0;throw new Error("The current instance of Bespoke.js is incompatible with Marp bespoke sync plugin.")},B=(e={})=>{const t=e.key||window.history.state?.marpBespokeSyncKey||Math.random().toString(36).slice(2),n=`bespoke-marp-sync-${t}`;var r;r={marpBespokeSyncKey:t},h({},{setter:(e,...t)=>a({...e,...r},...t)});const o=()=>{const e=y(n);return e?JSON.parse(e):Object.create(null)},i=e=>{const t=o(),r={...t,...e(t)};return b(n,JSON.stringify(r)),r},s=()=>{window.removeEventListener("pageshow",s),i(e=>({reference:(e.reference||0)+1}))};return e=>{s(),Object.defineProperty(e,"syncKey",{value:t,enumerable:!0});let r=!0;setTimeout(()=>{e.on("fragment",e=>{r&&i(()=>({index:e.index,fragmentIndex:e.fragmentIndex}))})},0),window.addEventListener("storage",t=>{if(t.key===n&&t.oldValue&&t.newValue){const n=JSON.parse(t.oldValue),o=JSON.parse(t.newValue);if(n.index!==o.index||n.fragmentIndex!==o.fragmentIndex)try{r=!1,e.slide(o.index,{fragment:o.fragmentIndex,forSync:!0})}finally{r=!0}}});const a=()=>{const{reference:e}=o();void 0===e||e<=1?k(n):i(()=>({reference:e-1}))};window.addEventListener("pagehide",e=>{e.persisted&&window.addEventListener("pageshow",s),a()}),e.on("destroy",a)}},K=e=>{w&&document.addEventListener("keydown",t=>{("o"!==t.key||t.altKey||t.ctrlKey||t.metaKey)&&"Escape"!==t.key||(t.preventDefault(),e())})};let q=null;const V=({closeOnSelect:e=!0}={})=>t=>{N(t);const n=n=>{const r=(()=>{if(!q||!q.isConnected){q=document.createElement("div"),q.className=`${f}overview`,q.inert=!0;const n=document.createElement("iframe");n.src=(()=>{const n=new URLSearchParams(location.search);return n.set("view","overview"),n.set("sync",t.syncKey),e&&n.set("closeOnSelect","1"),g(n)})(),q.append(n),document.body.append(q)}return q})(),o=n??!r.dataset.open;setTimeout(()=>{if(r.dataset.open=o?"1":"",r.inert=!o,t.skipTransition=o,o){const e=r.querySelector("iframe");try{e?.contentWindow?.focus()}catch{e?.focus()}}else window.focus()},0)};Object.defineProperties(t,{toggleOverviewView:{enumerable:!0,value:n}}),window.addEventListener("message",e=>{e.origin===window.origin&&"closeOverview"===e.data&&n(!1)}),K(n)},j=e=>{const{title:t}=document;document.title="[Overview]"+(t?` - ${t}`:"");const n=!!v("closeOnSelect"),r=()=>{window.parent.postMessage("closeOverview","null"===window.origin?"*":window.origin)};if(e.slides.forEach((t,o)=>{t.tabIndex=0;const i=()=>{e.slide(o,{fragment:-1}),n&&r()};t.addEventListener("click",i),t.addEventListener("keydown",e=>{"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),i())})}),window.addEventListener("keydown",t=>{const n=e.slide(),r=t=>{const r=t=>{const n=e.slides[t].getBoundingClientRect();return[Math.round((n.left+n.right)/2),Math.round((n.top+n.bottom)/2)]};let o=null,i=n;do{const e=r(i);if(o){if(Math.abs(e[0]-o[0])<2)return i}else o=e;i+=t}while(i>=0&&i<e.slides.length);return n};if("ArrowLeft"===t.key)e.slide(Math.max(n-1,0),{fragment:-1});else if("ArrowRight"===t.key)e.slide(Math.min(n+1,e.slides.length-1),{fragment:-1});else if("ArrowUp"===t.key)e.slide(r(-1),{fragment:-1});else if("ArrowDown"===t.key)e.slide(r(1),{fragment:-1});else if("End"===t.key)e.slide(e.slides.length-1,{fragment:-1});else{if("Home"!==t.key)return;e.slide(0,{fragment:-1})}t.preventDefault();const o=e.slide();e.slides[o]?.focus?.(),e.slides[o]?.scrollIntoView?.({behavior:"smooth",block:"nearest"})}),e.on("slide",({index:t})=>{e.slides[t]?.scrollIntoView?.({behavior:"smooth",block:"nearest"})}),window.parent!==window){K(r);const e=document.createElement("header");e.className=`${f}overview-header`;const t=document.createElement("button");t.className=`${f}overview-close`,t.type="button",t.title="Close overview",t.textContent=t.title,t.addEventListener("click",r),e.append(t),document.body.prepend(e)}},F=()=>{const e=p();return{[s]:V(),[l]:V({closeOnSelect:!1}),[d]:j}[e]},U=e=>{window.addEventListener("message",t=>{if(t.origin!==window.origin)return;const[n,r]=t.data.split(":");if("navigate"===n){const[t,n]=r.split(",");let o=Number.parseInt(t,10),i=Number.parseInt(n,10)+1;i>=e.fragments[o].length&&(o+=1,i=0),e.slide(o,{fragment:i})}})};var R,X,H,W,J,Y,z,G={exports:{}},Q=(R||(R=1,G.exports=(X=["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"],H=function(e){return String(e).replace(/[&<>"']/g,function(e){return"&"+W[e]+";"})},W={"&":"amp","<":"lt",">":"gt",'"':"quot","'":"apos"},J="dangerouslySetInnerHTML",Y={className:"class",htmlFor:"for"},z={},function(e,t){var n=[],r="";t=t||{};for(var o=arguments.length;o-- >2;)n.push(arguments[o]);if("function"==typeof e)return t.children=n.reverse(),e(t);if(e){if(r+="<"+e,t)for(var i in t)!1!==t[i]&&null!=t[i]&&i!==J&&(r+=" "+(Y[i]?Y[i]:H(i))+'="'+H(t[i])+'"');r+=">"}if(-1===X.indexOf(e)){if(t[J])r+=t[J].__html;else for(;n.length;){var a=n.pop();if(a)if(a.pop)for(var s=a.length;s--;)n.push(a[s]);else r+=!0===z[a]?a:H(a)}r+=e?"</"+e+">":""}return z[r]=!0,r})),G.exports),Z=e(Q);const ee=({children:e})=>Z(null,null,...e),te=`${f}presenter-`,ne={container:`${te}container`,dragbar:`${te}dragbar-container`,next:`${te}next`,nextContainer:`${te}next-container`,noteContainer:`${te}note-container`,noteWrapper:`${te}note-wrapper`,noteButtons:`${te}note-buttons`,infoContainer:`${te}info-container`,infoPageArea:`${te}info-page-area`,infoPage:`${te}info-page`,infoPagePrev:`${te}info-page-prev`,infoPageNext:`${te}info-page-next`,noteButtonsBigger:`${te}note-bigger`,noteButtonsSmaller:`${te}note-smaller`,infoTime:`${te}info-time`,infoTimer:`${te}info-timer`},re=e=>{const{title:t}=document;document.title="[Presenter view]"+(t?` - ${t}`:"");const n={},r=e=>(n[e]=n[e]||document.querySelector(`.${e}`),n[e]);document.body.appendChild((e=>{const t=document.createElement("div");return t.className=ne.container,t.appendChild(e),t.insertAdjacentHTML("beforeend",Z(ee,null,Z("div",{class:ne.nextContainer},Z("iframe",{class:ne.next,src:"?view=next"})),Z("div",{class:ne.dragbar}),Z("div",{class:ne.noteContainer},Z("div",{class:ne.noteWrapper}),Z("div",{class:ne.noteButtons},Z("button",{class:ne.noteButtonsSmaller,tabindex:"-1",title:"Smaller notes font size"},"Smaller notes font size"),Z("button",{class:ne.noteButtonsBigger,tabindex:"-1",title:"Bigger notes font size"},"Bigger notes font size"))),Z("div",{class:ne.infoContainer},Z("div",{class:ne.infoPageArea},Z("button",{class:ne.infoPagePrev,tabindex:"-1",title:"Previous"},"Previous"),Z("button",{class:ne.infoPage}),Z("button",{class:ne.infoPageNext,tabindex:"-1",title:"Next"},"Next")),Z("time",{class:ne.infoTime,title:"Current time"}),Z("time",{class:ne.infoTimer,title:"Timer"})))),t})(e.parent)),(e=>{let t=!1;r(ne.dragbar).addEventListener("mousedown",()=>{t=!0,r(ne.dragbar).classList.add("active")}),window.addEventListener("mouseup",()=>{t=!1,r(ne.dragbar).classList.remove("active")}),window.addEventListener("mousemove",e=>{if(!t)return;const n=e.clientX/document.documentElement.clientWidth*100;r(ne.container).style.setProperty("--bespoke-marp-presenter-split-ratio",`${Math.max(0,Math.min(100,n))}%`)}),r(ne.nextContainer).addEventListener("click",()=>e.next());const n=r(ne.next),o=(i=n,(e,t)=>i.contentWindow?.postMessage(`navigate:${e},${t}`,"null"===window.origin?"*":window.origin));var i;n.addEventListener("load",()=>{r(ne.nextContainer).classList.add("active"),o(e.slide(),e.fragmentIndex),e.on("fragment",({index:e,fragmentIndex:t})=>o(e,t))});const a=document.querySelectorAll(".bespoke-marp-note");a.forEach(e=>{e.addEventListener("keydown",e=>e.stopPropagation()),r(ne.noteWrapper).appendChild(e)}),e.on("activate",()=>a.forEach(t=>t.classList.toggle("active",t.dataset.index==e.slide())));let s=0;const l=e=>{s=Math.max(-5,s+e),r(ne.noteContainer).style.setProperty("--bespoke-marp-note-font-scale",(1.2**s).toFixed(4))},c=()=>l(1),d=()=>l(-1),u=r(ne.noteButtonsBigger),f=r(ne.noteButtonsSmaller);u.addEventListener("click",()=>{u.blur(),c()}),f.addEventListener("click",()=>{f.blur(),d()}),document.addEventListener("keydown",e=>{"+"===e.key&&c(),"-"===e.key&&d()},!0);const m=r(ne.infoPage);e.on("activate",({index:t})=>{m.textContent=`${t+1} / ${e.slides.length}`}),m.addEventListener("click",()=>{m.blur(),e.toggleOverviewView()});const g=r(ne.infoPagePrev),p=r(ne.infoPageNext);g.addEventListener("click",t=>{g.blur(),e.prev({fragment:!t.shiftKey})}),p.addEventListener("click",t=>{p.blur(),e.next({fragment:!t.shiftKey})}),e.on("fragment",({index:t,fragments:n,fragmentIndex:r})=>{g.disabled=0===t&&0===r,p.disabled=t===e.slides.length-1&&r===n.length-1});let v=new Date;const h=()=>{const e=new Date,t=e=>`${Math.floor(e)}`.padStart(2,"0"),n=e.getTime()-v.getTime(),o=t(n/1e3%60),i=t(n/1e3/60%60),a=t(n/36e5%24);r(ne.infoTime).textContent=e.toLocaleTimeString(),r(ne.infoTimer).textContent=`${a}:${i}:${o}`};h(),setInterval(h,250),r(ne.infoTimer).addEventListener("click",()=>{v=new Date})})(e)},oe=e=>{N(e),Object.defineProperties(e,{openPresenterView:{enumerable:!0,value:ie},presenterUrl:{enumerable:!0,get:ae}}),w&&document.addEventListener("keydown",t=>{"p"!==t.key||t.altKey||t.ctrlKey||t.metaKey||(t.preventDefault(),e.openPresenterView())})};function ie(){const{max:e,floor:t}=Math,n=e(t(.85*window.innerWidth),640),r=e(t(.85*window.innerHeight),360);return window.open(this.presenterUrl,te+this.syncKey,`width=${n},height=${r},menubar=no,toolbar=no`)}function ae(){const e=new URLSearchParams(location.search);return e.set("view","presenter"),e.set("sync",this.syncKey),g(e)}const se=e=>{const t=p();return t===c&&e.appendChild(document.createElement("span")),{[s]:oe,[l]:re,[c]:U}[t]},le=e=>{e.on("activate",t=>{document.querySelectorAll(".bespoke-progress-parent > .bespoke-progress-bar").forEach(n=>{n.style.flexBasis=100*t.index/(e.slides.length-1)+"%"})})},ce=e=>{const t=Number.parseInt(e,10);return Number.isNaN(t)?null:t},de=(e={})=>{const t={history:!0,...e};return e=>{let n=!0;const r=e=>{const t=n;try{return n=!0,e()}finally{n=t}},o=(t={fragment:!0})=>{let n=t.fragment?ce(v("f")||""):null;((t,n)=>{const{min:r,max:o}=Math,{fragments:i,slides:a}=e,s=o(0,r(t,a.length-1)),l=o(0,r(n||0,i[s].length-1));s===e.slide()&&l===e.fragmentIndex||e.slide(s,{fragment:l})})((()=>{if(location.hash){const[t]=location.hash.slice(1).split(":~:");if(/^\d+$/.test(t))return(ce(t)??1)-1;const r=document.getElementById(t)||document.querySelector(`a[name="${CSS.escape(t)}"]`);if(r){const{length:t}=e.slides;for(let o=0;o<t;o+=1)if(e.slides[o].contains(r)){const t=e.fragments?.[o],i=r.closest("[data-marpit-fragment]");if(t&&i){const e=t.indexOf(i);e>=0&&(n=e)}return o}}}return 0})(),n)};e.on("fragment",({index:e,fragmentIndex:r})=>{n||h({f:0===r||r.toString()},{location:{...location,hash:`#${e+1}`},setter:(...e)=>t.history?history.pushState(...e):history.replaceState(...e)})}),setTimeout(()=>{o(),window.addEventListener("hashchange",()=>r(()=>{o({fragment:!1}),h({f:void 0})})),window.addEventListener("popstate",()=>{n||r(()=>o())}),n=!1},0)}},{PI:ue,abs:fe,sqrt:me,atan2:ge}=Math,pe={passive:!0},ve=({slope:e=-.7,swipeThreshold:t=30}={})=>n=>{let r;const o=n.parent,i=e=>{const t=o.getBoundingClientRect();return{x:e.pageX-(t.left+t.right)/2,y:e.pageY-(t.top+t.bottom)/2}};o.addEventListener("touchstart",({touches:e})=>{r=1===e.length?i(e[0]):void 0},pe),o.addEventListener("touchmove",e=>{if(r)if(1===e.touches.length){e.preventDefault();const t=i(e.touches[0]),n=t.x-r.x,o=t.y-r.y;r.delta=me(fe(n)**2+fe(o)**2),r.radian=ge(n,o)}else r=void 0}),o.addEventListener("touchend",o=>{if(r){if(r.delta&&r.delta>=t&&r.radian){const t=(r.radian-e+ue)%(2*ue)-ue;n[t<0?"next":"prev"](),o.stopPropagation()}r=void 0}},pe)},he=new Map;he.clear(),he.set("none",{backward:{both:void 0,incoming:void 0,outgoing:void 0},forward:{both:void 0,incoming:void 0,outgoing:void 0}});const we={both:"",outgoing:"outgoing-",incoming:"incoming-"},ye={forward:"",backward:"-backward"},be=e=>`--marp-bespoke-transition-animation-${e}`,ke=e=>`--marp-transition-${e}`,xe=be("name"),Ee=be("duration"),$e=e=>new Promise(t=>{const n={},r=document.createElement("div"),o=e=>{r.remove(),t(e)};r.addEventListener("animationstart",()=>o(n)),Object.assign(r.style,{animationName:e,animationDuration:"1s",animationFillMode:"both",animationPlayState:"paused",position:"absolute",pointerEvents:"none"}),document.body.appendChild(r);const i=getComputedStyle(r).getPropertyValue(ke("duration"));i&&Number.parseFloat(i)>=0&&(n.defaultDuration=i),((e,t)=>{requestAnimationFrame(()=>{e.style.animationPlayState="running",requestAnimationFrame(()=>t(void 0))})})(r,o)}),Le=async e=>he.has(e)?he.get(e):(e=>{const t={},n=[];for(const[r,o]of Object.entries(we))for(const[i,a]of Object.entries(ye)){const s=`marp-${o}transition${a}-${e}`;n.push($e(s).then(e=>{t[i]=t[i]||{},t[i][r]=e?{...e,name:s}:void 0}))}return Promise.all(n).then(()=>t)})(e).then(t=>(he.set(e,t),t)),Se=e=>Object.values(e).flatMap(Object.values).every(e=>!e),Pe=(e,{type:t,backward:n})=>{const r=e[n?"backward":"forward"],o=(()=>{const e=r[t],n=e=>({[xe]:e.name});if(e)return n(e);if(r.both){const e=n(r.both);return"incoming"===t&&(e[be("direction")]="reverse"),e}})();return!o&&n?Pe(e,{type:t,backward:!1}):o||{[xe]:"__bespoke_marp_transition_no_animation__"}},_e=e=>{if(e)try{const t=JSON.parse(e);if((e=>{if("object"!=typeof e)return!1;const t=e;return"string"==typeof t.name&&(void 0===t.duration||"string"==typeof t.duration)})(t))return t}catch{}},Oe="_tSId",Te="_tA",Ie="bespoke-marp-transition-warming-up",Me=window.matchMedia("(prefers-reduced-motion: reduce)"),Ae="__bespoke_marp_transition_reduced_outgoing__",Ce="__bespoke_marp_transition_reduced_incoming__",De={forward:{both:void 0,incoming:{name:Ce},outgoing:{name:Ae}},backward:{both:void 0,incoming:{name:Ce},outgoing:{name:Ae}}},Ne=e=>{if(!document.startViewTransition)return;const t=t=>(void 0!==t&&(e._tD=t),e._tD);let n;t(!1),((...e)=>{CSS.registerProperty({name:ke("duration"),syntax:"<time>",inherits:!0,initialValue:"-1s"});const t=[...new Set(e).values()];return Promise.all(t.map(e=>Le(e))).then()})(...Array.from(document.querySelectorAll("section[data-transition], section[data-transition-back]")).flatMap(e=>[e.dataset.transition,e.dataset.transitionBack].flatMap(e=>{const t=_e(e);return[t?.name,t?.builtinFallback?`__builtin__${t.name}`:void 0]}).filter(e=>!!e))).then(()=>{document.querySelectorAll("style").forEach(e=>{e.innerHTML=e.innerHTML.replace(/--marp-transition-duration:[^;}]*[;}]/g,e=>e.slice(0,-1)+"!important"+e.slice(-1))})});const r=(n,{back:r,cond:o})=>i=>{const a=t();if(a)return!!i[Te]||!("object"!=typeof a||(a.skipTransition(),!i.forSync));if(e.skipTransition)return!0;if(!o(i))return!0;const s=e.slides[e.slide()],l=()=>i.back??r,c="data-transition"+(l()?"-back":""),d=s.querySelector(`section[${c}]`);if(!d)return!0;const u=_e(d.getAttribute(c)??void 0);return!u||((async(e,{builtinFallback:t=!0}={})=>{let n=await Le(e);if(Se(n)){if(!t)return;return n=await Le(`__builtin__${e}`),Se(n)?void 0:n}return n})(u.name,{builtinFallback:u.builtinFallback}).then(e=>{if(!e){t(!0);try{n(i)}finally{t(!1)}return}let r=e;Me.matches&&(console.warn("Use a constant animation to transition because preferring reduced motion by viewer has detected."),r=De);const o=document.getElementById(Oe);o&&o.remove();const a=document.createElement("style");a.id=Oe,document.head.appendChild(a),((e,t)=>{const n=[`:root{${ke("direction")}:${t.backward?-1:1};}`,":root:has(.bespoke-marp-inactive){cursor:none;}"],r=t=>{const n=e[t].both?.defaultDuration||e[t].outgoing?.defaultDuration||e[t].incoming?.defaultDuration;return"forward"===t?n:n||r("forward")},o=t.duration||r(t.backward?"backward":"forward");void 0!==o&&n.push(`::view-transition-group(*){${Ee}:${o};}`);const i=e=>Object.entries(e).map(([e,t])=>`${e}:${t};`).join("");return n.push(`::view-transition-old(root){${i(Pe(e,{...t,type:"outgoing"}))}}`,`::view-transition-new(root){${i(Pe(e,{...t,type:"incoming"}))}}`),n})(r,{backward:l(),duration:u.duration}).forEach(e=>a.sheet?.insertRule(e));const s=document.documentElement.classList;s.add(Ie);let c=!1;const d=()=>{c||(n(i),c=!0,s.remove(Ie))},f=()=>{t(!1),a.remove(),s.remove(Ie)};try{t(!0);const e=document.startViewTransition(d);t(e),e.finished.finally(f)}catch(e){console.error(e),d(),f()}}),!1)};e.on("prev",r(t=>e.prev({...t,[Te]:!0}),{back:!0,cond:e=>e.index>0&&!((e.fragment??1)&&n.fragmentIndex>0)})),e.on("next",r(t=>e.next({...t,[Te]:!0}),{cond:t=>t.index+1<e.slides.length&&!(n.fragmentIndex+1<n.fragments.length)})),setTimeout(()=>{e.on("slide",r(t=>e.slide(t.index,{...t,[Te]:!0}),{cond:t=>{const n=e.slide();return t.index!==n&&(t.back=t.index<n,!0)}}))},0),e.on("fragment",e=>{n=e})};let Be;const Ke=()=>(void 0===Be&&(Be="wakeLock"in navigator&&navigator.wakeLock),Be),qe=async()=>{const e=Ke();if(e)try{return await e.request("screen")}catch(e){console.warn(e)}return null},Ve=async()=>{if(!Ke())return;let e;const t=()=>{e&&"visible"===document.visibilityState&&qe()};for(const e of["visibilitychange","fullscreenchange"])document.addEventListener(e,t);return e=await qe(),e};((e=document.getElementById(":$p"))=>{(()=>{const e=v("view");i.dataset.bespokeView=u.some(t=>t&&t===e)?e:""})();const t=(e=>{const t=v(e);return h({[e]:void 0}),t})("sync")||void 0;o.from(e,((...e)=>{const t=u.findIndex(e=>p()===e);return e.map(([e,n])=>e[t]&&n).filter(e=>e)})([[1,1,1,0],B({key:t})],[[1,1,0,1],se(e)],[[1,1,0,0],M],[[1,1,1,1],E],[[1,0,0,0],T()],[[1,1,1,1],A],[[1,1,1,1],de({history:!1})],[[1,1,0,0],C()],[[1,1,1,0],_],[[1,0,0,0],le],[[1,1,0,0],ve()],[[1,0,0,0],D()],[[1,1,1,0],F()],[[1,0,0,0],Ne],[[1,1,1,1],$],[[1,1,1,0],Ve]))})()}();</script></body></html>