From bb7c54e9caf6080ba6085597574654e576a1e480 Mon Sep 17 00:00:00 2001 From: dcconstructions Date: Mon, 6 Jul 2026 00:27:04 +0300 Subject: [PATCH] Integrate knowledge docs and admin updates --- _astro/InstrumentSans-Bold.DWGdGw8L.woff2 | Bin 0 -> 29540 bytes .../InstrumentSans-BoldItalic.BOjDmDe7.woff2 | Bin 0 -> 30848 bytes _astro/InstrumentSans-Italic.FeNa2EJX.woff2 | Bin 0 -> 30616 bytes _astro/InstrumentSans-Medium.B2xOBd5A.woff2 | Bin 0 -> 29972 bytes ...InstrumentSans-MediumItalic.c03vUl6A.woff2 | Bin 0 -> 31620 bytes _astro/InstrumentSans-Regular.JnvgzjHK.woff2 | Bin 0 -> 29100 bytes _astro/InstrumentSans-SemiBold.wfsLgfkq.woff2 | Bin 0 -> 30048 bytes ...strumentSans-SemiBoldItalic.DRnKVj3E.woff2 | Bin 0 -> 31508 bytes admin/admin.css | 263 ++++ admin/admin.js | 1109 ++++++++++++++++- admin/index.html | 43 +- assets/custom/css/knowledge.css | 120 ++ ...astro_type_script_index_0_lang.hwBsy0Mo.js | 1 + ...astro_type_script_index_0_lang.FuRcXuRY.js | 1 + .../ssscript-docs/_astro/index.Bh6uiXgK.css | 1 + .../_astro/logo-app-bg.CaK6FTqF_Z1HYzg2.svg | 15 + .../ssscript-docs/_astro/page.B1D-nYk3.js | 1 + .../ssscript-docs/_astro/print.DNXP8c50.css | 1 + assets/vendor/ssscript-docs/favicon.svg | 3 + content/knowledge.json | 201 +++ content/pages/home.json | 52 +- index.html | 24 +- knowledge/agent-context/index.html | 281 +++++ knowledge/index.html | 276 ++++ knowledge/modules/1c-integration/index.html | 281 +++++ .../modules/city-digital-twins/index.html | 284 +++++ .../modules/construction-contour/index.html | 281 +++++ knowledge/modules/drone-management/index.html | 281 +++++ .../modules/enterprise-management/index.html | 281 +++++ knowledge/modules/index.html | 280 +++++ .../modules/industrial-contour/index.html | 281 +++++ knowledge/modules/seo-module/index.html | 281 +++++ knowledge/modules/tender-agent/index.html | 282 +++++ knowledge/platform/engine/index.html | 279 +++++ knowledge/platform/hub/index.html | 277 ++++ knowledge/platform/index.html | 282 +++++ knowledge/platform/ops/index.html | 279 +++++ package.json | 1 + sitemap.xml | 75 ++ .../home/blocks/project-video-first.html | 2 +- tools/admin-server.mjs | 83 +- tools/render-home.mjs | 139 ++- tools/render-knowledge.mjs | 769 ++++++++++++ 43 files changed, 7038 insertions(+), 72 deletions(-) create mode 100644 _astro/InstrumentSans-Bold.DWGdGw8L.woff2 create mode 100644 _astro/InstrumentSans-BoldItalic.BOjDmDe7.woff2 create mode 100644 _astro/InstrumentSans-Italic.FeNa2EJX.woff2 create mode 100644 _astro/InstrumentSans-Medium.B2xOBd5A.woff2 create mode 100644 _astro/InstrumentSans-MediumItalic.c03vUl6A.woff2 create mode 100644 _astro/InstrumentSans-Regular.JnvgzjHK.woff2 create mode 100644 _astro/InstrumentSans-SemiBold.wfsLgfkq.woff2 create mode 100644 _astro/InstrumentSans-SemiBoldItalic.DRnKVj3E.woff2 create mode 100644 assets/custom/css/knowledge.css create mode 100644 assets/vendor/ssscript-docs/_astro/MobileTableOfContents.astro_astro_type_script_index_0_lang.hwBsy0Mo.js create mode 100644 assets/vendor/ssscript-docs/_astro/TableOfContents.astro_astro_type_script_index_0_lang.FuRcXuRY.js create mode 100644 assets/vendor/ssscript-docs/_astro/index.Bh6uiXgK.css create mode 100644 assets/vendor/ssscript-docs/_astro/logo-app-bg.CaK6FTqF_Z1HYzg2.svg create mode 100644 assets/vendor/ssscript-docs/_astro/page.B1D-nYk3.js create mode 100644 assets/vendor/ssscript-docs/_astro/print.DNXP8c50.css create mode 100644 assets/vendor/ssscript-docs/favicon.svg create mode 100644 content/knowledge.json create mode 100644 knowledge/agent-context/index.html create mode 100644 knowledge/index.html create mode 100644 knowledge/modules/1c-integration/index.html create mode 100644 knowledge/modules/city-digital-twins/index.html create mode 100644 knowledge/modules/construction-contour/index.html create mode 100644 knowledge/modules/drone-management/index.html create mode 100644 knowledge/modules/enterprise-management/index.html create mode 100644 knowledge/modules/index.html create mode 100644 knowledge/modules/industrial-contour/index.html create mode 100644 knowledge/modules/seo-module/index.html create mode 100644 knowledge/modules/tender-agent/index.html create mode 100644 knowledge/platform/engine/index.html create mode 100644 knowledge/platform/hub/index.html create mode 100644 knowledge/platform/index.html create mode 100644 knowledge/platform/ops/index.html create mode 100644 tools/render-knowledge.mjs diff --git a/_astro/InstrumentSans-Bold.DWGdGw8L.woff2 b/_astro/InstrumentSans-Bold.DWGdGw8L.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..e4e387f8c517f8703adc5d91896fc1dff1154853 GIT binary patch literal 29540 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 TO}iYHEPucJs~J3kRSL z3=An zeGw-rQHe@T&#!M2nOx}c4)e(>RCrQ}N>pk*d%1=?I|v`8E`k+8RbfyYS4`ujj&1dy zBf0I$Ipv-yA@velS)*gQq#Y0|9Z04&FP11-TD7OZ^U@)dlHp;=|gFSwNuG=qXUe6Ksz(j@$#5|4jAym zyY~AQ25jUqQ*RKs7T;|==_0UkVPl;n-AfeF3IElzmrI@ien8j*er|tn8)F-Dj2dHO z12$LzD`*j63|gW^qC~nasw_l|#6+||HZ~@-f`x*JQNUL$Ah0ECCm}#n)#2*nc~-4i zcUaR@c6MtscOeHB&?S$;uqL4hgnxVb$;)>ccsKq3=U*znV)7}bM}>L2yS20GS!I<; zMX4FqQo$u5N`!=vgd~Inym0(a=YO6n1PBlyiTFYYKcu+HDXw$paa*`(%3VnOMZcN$ z_T4FklEjlQ2o8ZT4lP!|mI{B5o4r?ss>az$f^aw_O&}n==l}0-`gaDEnSJs(rSdiT z;%(FfnRrS9O$P}FlE>1ioaTzX^2(@6wiJ+KB}ErV2BnES9te>kFe9~`^Z4Uj`E~S@ z3he8#9Ko8;znU3jT{mqbPzCxDpVB+0u+J z$hovmJoiy_ibl~WiUN96bcBS$LVA8~i}LOdWSC9C9)xYE#|xWP6X@IfzgJg&0B2U~ z0C2_7CG|)nTfQ^ki^JGTDK{5jXz62lFg(A_-qtoY(JlWIDNzD~g(9Mu`*WSvIk$Pv zWnEOeU2S*gMfSMUKX2Z=`R7p-MNt$*Q4~c{6h%=KMNt$*QFJ<;4o$ijI2eth(Nh$) zG?#u;V$#g2S3rEF=K@f!8N@^Z1W*AN+k33UGfm_0#Ul$ir9hkZ=hym6MY}y=3n^O?0F`o90!bN}hb=CH@TzWjt{F)|;ox==t1HHGO# zkpRX3>nteaJ-64PAV*>ys%5N=T&PlPY?3L{rm1pkVx`Js1+gOi|F+im!}qAJnMPKC zZvv}5YaT+cSoWiTHpoP?SNFc^l2;E}nWk!_k@>&I&M6pUoa$!&X_}dHfHkuoSYaIa z>d}g8wwZ_G;pTx@yg``lkJj(q`^~=OCcBW(17|3zG$a2yaN{JK@*kXJ=tZ?E)JJ7e z4;PEl`1O0=+3er+rykugkr-#(RyY1(fDab1|8SOz?$oReW z?ig#12Ce;%Kc=XZdApr*iKZK$L9WErim_x@RM?iAalb~|S%OJVp6;QeA8<31U4k{CVgXDW=q4R%! zK;*)s&?jY0##^{JsZg*8kjOx4{f->U3J{ppwp+84ef99BNlP3#RqLy=)+yKc9|Hn! z7dmFU$L;WhCk^ARZ3X5A7KK2^G-eV|P|sidCLn*x3?c-Wlci{=oxcw}Af5eNFkr#} z`a%MM+Al<(^(SMX{{P~`fOgK+yb)MPU$4q?#ExMoAfjO65JSO15iWa@>$05k4HRDK zH9rB147n}<-~B%Tfh>J%%s;%p*+p-~x?+=>J^9kk4tK1RFPp*h75O^-`gBny!B@l8 ze%-kyuK7_snveeH{u>n6oYuWN-nZUwKH^#Kr|RS2C!5d1ET44WL{*d6eCPbrIq3f0 z?Y5gXC!2&Ju}I#eMABwb2dR_vQdwO&M0t<$Mdc}S4N8q_L+v7;A-_aMNa5R5UcJ_b z`W|1>DW!@@O!$!KN>u&KwQhzQZM>%+Bjnk487Xsm*Ui$2-%xZkL_k&X4oUiJy+C%f` zPx=4ZUHe+rv#FJ~d-~yX-UWoBHUwr*)67a`Q41D95$teTLQD9{y#V z?iyUDd+cCGI8}4qXrP8_v=(cHUe^0cY0C@xj^5wL`C{MU$9yZ)!y?=Ph1Fr5M#F&Z zQ51U&``*rOugfN~4TQHPFoPX?TWa#l~^#3m!H+tzNXKr!sHdAV*)LlBD?T|RzAjg^( zQQJ1xu2&rSOx%u?A4$#u^#rp`sy1*PPC}p@nFb9s9`lLK@84|Y6KIEZN!jIn1&ocIEdgVXn|~l zxKy8!>`3c?>>`}g2${|?8TV1K=cOJa4S8adL4zU0fW#E$h;Ug-eS|NZm!Kt@k0e3X z)fcdXgsjI*7c7!GT!X+?&6Ci<9MVg$HthB6*937!du?DbCW=h%wsEcSw zvq^EW1Q18XG3+Q4RPoltm@+mc)TJ~)Y+S?WxI{t*BN{~|&?wgA)QK9Dgfv;4mey9kbm>Bjq3*R1b+kOoD0?M!i;u=B|`|X%-p1 zbYB@YX^ls~WQ`=7Y*3PH#nvD!K4n4Kr2lxAXd*E|U@QSe#EW1^%w)Viv_YE`=f*r? z=wmr_fbJlv{wv3>4bzd=!_+~~^+lAw3sY&cJR|}+N?*Y7;yMA}2>69oI2uI)Q)o=C zCe#xyF<^CqI!S=Zmg}SmdcvM?up)s>)D$6;mGmi7gvF5zR+fN+nrwECk~XRi)h0B< zf!rlJ1qnungHZ$uQ9%SrCh4P7zzi-9O%vv1!0TyVK{SDE8xdATl7LJu9o<~#q?jCF zK>~otDI!e<=#w_+-zlDnSrfO(Fl|MJB0Q#M_m$8MnRP~^2)XU zqD1v`U`PbXhee|vSflmcPVzopyDnV{0fH6o3dcak}1oE zt(a0_w86;oziK@0@`~+(BkVCFnm~uWan!P7mYocE3EA`FTq9oO_Y$L*`Me_PRYqT% z&`s_q>w0qjHSd3&*@mgucq=!?DviBrW2|1LE^rf&wnf`F+=0;!9e2dtF;^%2-Qemb zXSWP@+pF#}c8{_9z_4~ysvpC&&-w~RvY3b_{s~nzxZFlS6KxYap$yue?=~-C!D)$B z$_74xC=&~5U+Nof z0^1+}iM~OSlz)WMS8@nCo^Lg8*Mid$t&Cc+$#O%@siU^NDDEYjUUuXap>FPe0^GJp z7@l^64--wG617DrN)@VN4(s~3D8rSSoU1~QaMb^p2i+b+cUv{V@(G8REABIyhQx8G z9%G%j-D&!yJe2m7?v4ooWoKocmR}?*>RaIB%?34&3$W7WkNX7((MXq;5+?yeOuD{H z{izd->U&_f^0tiYCxt!6dvQdw-#@=5;-#ojk~Okd`pn99{*dn$bC&xqlNOe+8c@f= zI!UYZA)0%}Fq&ag6~Po{iEEQ}h`K~Q@wwQ6)`($RIa`ViL$U)pCatt_V`*uTm{W3j z)z&XjC=4dG>*fh-yd`Z>r98B*+~Cx#aXJf4*vV6)FNW38LhQu?!5!PmX&3BctOD`r{fxxVsR+&VumLiWh&62KSUNg_(jc#@l0md z9!-S}%UWCKRUgckbEY`aU0c0l@X9~)TqQ?&?!K(QXhjV~P5c|>&DT+Gjt6)6;C$enpB{Z8@M0pLL9r|)z(gzMb%Do{q&aB2 zOlr#sBY@QcL@_=-L=dWe|E{5V+Y~S)>;exWT8|h;Laj160>?4OV=M)hE+S~=rFPL% z#Gw|-g0a!V_<%*#h)|0dq69<|AtW2Lf|Z0gB_Z*x7J&vX<$x?lPD`dxqDZ3H%PAHv z*%h{A?RIqK*jzz}j_l8}-BOyZ(HpHAl<9bTW@ES4U zN~fzY?pm8PA4>T@y8o1Spm>$bPMYh0TiMwj2KKllqypBYf)ZJo6J{VAuiY1q4a=7Y z#?5cBhenXSMSxI)0|&_@5;OdY%1(0;CL8p`DxmO(6*8@*6mW#Lb?t~^;5_C6tx2ps zzYd9^CIxL#c_my(3DF(N5f!yf)6LKks_ z*1DPvWm_^4XaJ2t^GLX8j+!lKS?4)nj-%; zbZCbzVkoIpQYp9{({3P3slgn~qYyTf{DH4ci4W>bz_csHIBt@^@C6l^s*wB9UV^oc zjCc{?dut3ITOKOFUs6C!P*P4!UPnPkQOBffi#p2D)&pLp<6Sl1Vw*9HqA?0Hj?V5; zD9GQ8fQXGckYGfaBg<16M$VTNZI4xzQ}Ze}?e;?sd^5pku&C6< zNOFbBH&`*H={Sq4zLMXnuJ`5p>g-?gPPyfurv##UsKefh?y#1L3?`re9~V4)_HV|Z z$DeHU;c??unAwhh$^nBdf0mT+G{_now=(Ro<3e}j!DEf96Ka&6!Y6NosfUO`#&$$K26OZ_q!$g9Hm$~R?H=FP$Reby?~bGIv)>J@!sero>gOJadK}=n+4k1VmSUSjY&5hCx@`~1n6oY%@Ez=P6R%17F-fbG^Y&dmC>0nXeJ257<1dGFq3=2 zyEWzQRJ;p!3qkSVspWbi8X>A;;p>bKJrW&{JFCohnEQ?^0l;J0S8t<&3=^*faP`#y z(e-a6@ly8eWYKV9LTp^E*ee#lE^pyY5_Xq6Ksb@|{h1F6+Da4AZQ?>C#Yv?=S=x ziCxZw2c&%=9%XC- zbV4F*QcD@ICu2g+i5VBJEV=V!&6^)v0m8{disB(g98U?7`AU^4P?j7)^5h9osMreY zl?zv|L6l9lim}@v@s2nmL%VjFI&{c#(n;CQI3vd;m*l$cx;zg&kgrdl0t22X^xSi+ zz4Y1|6DE{-=bdt2eN|z`j7mTKROOF9s{Qj%jRhp3wnYdDnj%Nl#;Bp%5+h8_S;Rt1 zRBPS6Xr%U=xGcJ1{)BytD4S4dIEYw5`A zsNhLdbv0FrbuCRgm%I`eRZUictO$q71Sum!K=Q$*)zuZ^6a^3o6rBROQo~0E4^t8n z8UC(@GjPE1D4xg#hfJ|rW0aQcryzonO4Ycfp{Dnq^yX7!xs8LZW*<}GgFnIaMRmey@ik{n{+uwMt3*F{aI;l1ZmQpswF;qq|*HTtV9w59SA_d4Qf@HW@EXi5AD6hCW zQk%kJSX?R(yK2RA9rD3I@f1<^_VwsbA5#9SP%uaLfm}R*lE`4@&>M& zC~?u~3BsZ7IDC@4*hcQiwnQ*O5LFD4&V^P`e6Djsgqc{{JtV91Rcl4lh*6@Udf?|Q z$%87&7zQrnSgsviMp1GqCoN={++`Dp=228<9BFd73sG@__tTszn_N7EVg;p$31U)3 zdop|qIqw^&R=dvZIsiOIbDEIQ|GXQ6?2576|qwtNIES? z+VwTwE`);OqOpY*DQ!MO&-y=5!J@66kP=#QMak6m62e*Gn!+csxejy(>U+IMsyCh9!O~RG(1_O^LPbDL*YirE zD5?8`PQ+NkDOLc71w`u?SR8m|uBX!?l+`?%lEe{uDHBdZx{oc~;2piSLfW8-9ur;I zUKLf}4P1{bHOj5yCJ?0DU zOk|NTbwg77qabWO-{6-hieq05sB}NExy4}kiyQM(XeJ4qD?NJsB;X>1?$&-5VCXpQ zm;A0yM%J8#Kl`A5zv@V$c8U`k0>vgK)>B8qm`75mx*d&Y2Ri)cYEKq`C6(ZQQxPGOfO|9XW|xihYz2$MiZe8rWe_J|5F&IiFU>>_ZTCHA}0 zH+W)HndSXCTEScXTa77LIVsC-rL?KF>05XwA4>c*{a?sgJK}ql==1o@8k7yk3O34B zcoby?AtF|73Iz-_!`h|H1unGhf28qHSr7gG)i7?dE@c^ zkK6J{sv9y|=Ywh!Cv+>yZ3c)jV##cb5R=WiWv}NvN}Y&T#N*10TQXyWFuvWa8?sgf zh)iHl!M%PGYn1FmzH(cSPLf2x<>G#(7;MvuRV^~30cczq- z8bP))B#|8nB|}Z)s7<&=;7Pe$)Y3AqYbQ*5VFJJkN+}X-IAg6eSWTiJXmlN9nT<>8 z3wBvSmNKQXK8zNUK>{3#xl}g91+nWEi>IZy0!cGIi`cR}*&X*<7U;9c{8QR_H(8N_ zu*jTaRaI1&`UDo&S{g1n2VFBDr4(p{bKbq)A%PEo2mKLA)Q-8s|&@f zZ71k7da$Ev#*hF`;&s+QyBA~(uzD-AzAcA$f?me3|6aIj+V45y6*+w9mVU|p6LfNHsyIun2k+l;@= z4_VG?QV>KZ*Wyo6c*xn)Hw%>$BN@M?dPlPYK_YTB=>Weu^>{NN-__5WGUdw`9t^rTVp@A*Oyei5 z64P8R=kTaUw`(lk&vKQq?ay+CS5Q3SHu#u{`gx_T`aA_pNlRx%R?OO8>>vA6ZyZ^6 zgwmi+*9E6*lu(|R`|6mZ9Th@B{X&D^W_0!f8NhQ=fVfm@2^}z^6Wdh)`C~YlS3RLI z`bFhNu5g;`(E=(=#|d76CC24UO0|-@|E{7Ya5Q_D;t)R?ZU$e2qH!&8ZI0_X8S268 zAbhEc!vBOh;2j4uSO9btdtqXcy#^IzO4I~f1W94=K}JM!&ovJvp#IzO0=^+)eoV-| zc&R(me30D@7uT7W>PFh;cg!j!6e($kk(vGLi6(8*EM|&#RA@2yH9q9{_mCwQN+_Od zivLl{yLSBh!|5dxtGA>%g}mTrcWz%skOOMR&%bZhQ_L<5wi~geS3llfQ1e_3i$jUq zbFcO@(0k+ffXE$)a5N)#_anbbvC&7KlMCAhwYW*uO1SGfIWWgxFx zl;-GQre-E(mH#1;Kg!fU_Ukf$Kz`-TDsJX!lf0prDkWL7ghfkGHBk6vh@=-0pWj@EUI;?LywX zYsYou>0ZNdC*X2Y+~YK zV!S9IiwLKZ6a?YSu`5doSEw#BZBYfxoFH2kFtZ_)J+0rF@?TuELkFI+ka&cg$zhOU zijLTj@<>6N9XSUmZniKOv;lD6t{gKO1}?cgtO%7uh^&nnEH-W1zr_^^QS7T;^B9T4 z!F{Hea$+EgmjMJY|Kxcs*p+f0jTiAi5%0d7WA_=bLC2W;GWLbT7QF+SCaE)}-u*zN z|K_Y|g={14EY_5tL! zJV>)KlRRc1Q${^exj5wqM0H^+qR2OI1C3iL$O-QK&n4AiT|@2e z0+U;UDeCeNu@O&sBqGP99Zuq{cRnK+L3wNl#`H=NVMZM}XETg7pTJ}5x>Dj~zM}Qq z)fIqNgt?>3m1kE>5dd?{UZ9G2=@O-D2|z-S(jy{9DY3CKWT#nfjXQvK*MtHl52*=~ zH$ZAl~zsYj@BnUVc^9Vd6)`n&>iz`7S9$`gazRdFP0ahD4ySqncD-wDdRt zy1UhoK_Lha?Z7WAL49(Uz}aQxz;{7>d)CA!Q-b)n7lmOOkdanBVJ?`Gs11_K6E&i7 z?Oj-CV*-IK`sqsNn4uXEDuD`SLEujxdZ6Zk14L{|QKVF>=1WNTvqdHUz%FnkgZZ(w za3Aj6uL6F-ep7w0Q52ZsV)t}K^>U6Mr;4+V+6Z6iI?07_sj4W%{BeyyaLNm^+nicY ztSOP?TS%8&ux4O(x?}Pj4^f#!bh( zi(SQY>XETrfb^ae8HHUo?LC8ynWR>~Ay*E2>P~ZE>bRRi>8EHIO;b}*B5QzjT`NlK zsDRZ>4Wg@vDoB~|U}Q-MNqVndQii9G9*2im&PBEXQ(jzw?x|6FFJGzOyIjYDmOav4 zsnC!&t1!)OQ3xjK6(P9$4k)otPi1d+gp6j3{5_x8G0)Ux3FclX{)tlF-aR^!)1e*T zw7GsA@LjbPyK9T18s4CT7-}4Z)oDd=P*<<6H7Agb70ay>7gEc=JO%d zsH<^gLALp)Aq@G6U(Ligh1^bJW${SNHMet|6$kZPtaA|7RZb19{k!tc9N>iUdulpj zn|LVlvX}PSy!ly75#uvY6Uj!^)zjfJLkRP)`p~}R0-dX7#88%`C@rEl(ar|ou2O8o zf}9>5dgSi!2<@ZKx~X85UzHUrDkK=bQ~?tTmPGne`&7<9npGKf=IBucF$GCtdE?qaUp%f zSSG#V{#S||VH8yRL%>O`nCSTOx;V*t97))Bm&GR%vmR45Gk*A}!0denw4 zPkZW-T?a&-YqPPytm=uPNT-_bNE>*kz0ZxT!_MM@)jqFH_knwxl6v6Fvev>$=jO-u zRmV$P%Fm$F8SvE69LEL8afp7WMPD%=V<{nY^r?QLafW#E+6 z?UUFM3cmnH6c0Mtpgf&ooTxn_XpCR#=v?leWf6v({gxA!l+5p-DcszE6YU1D(kxH- zh7YXRG)|wj?ZPPuwU0VT+#Sm^fDy_HcRWr3b$7p%7QjaPhHl;+i+D>@-;j|9K~imT z%tVfU0ocl$il=M(oe*&uPPLXUeVXj0TivMM4lh$ah$5?9X;Gc+_8h3tFkMHCEj7;# zS{PLP)xn@FpG5Bus;8gPdx|aYRyRs_9u+6r1&HQ96r^oqAZ~LCz%q!+3=M)GB&t|Z z1`hLg$KuQo#^N4NgrOFEH_A_4@0ua&te}7@_lhaC8Rb>tf4DJlujFAKk)!A6`ND#8yUyd1=+Bb<#R*TDCNyw_b)DW?TLW&@2srr6oU+AH>P-UP^eg&x1v4w- zwO1}#pbos^wa#S5mXfF?VHpSu*1UOlB%GMHXWo~QcGo1xkfeP(mUvCLL?PKwj?KrV z(MW&qp1n1ps+TOvQd7$E3zV-9={OPKV-|$H@Iot z3etjkn#Gw@$c=&PmSljHigTsHm5nQ3SY{{`Tlfjgp9#i+_F(AzJ=;;6P2#(&aW3A? zArW}%>5PgPj}r%Ku@J}MuxHVx|LlM!+_+;Q?>#Rt-?Dbb->qHSRPukCfvaKryg0&& z1$|tKJmZp*a--($HLDK5L@d5sRV*QLh7o@-KHht;g_#V$!iGU*=>POcpeJvi@7(m6Hk2h@ zq}fj28hD#brW3uqm*+8Mt;kU``D_JLSKYQ$BiPBug`WsgIb8?=ET)9D0D#5@yBhid zJ7}l3(Bvj$g&H<$L*5};;_BpLr%j6~BOnxMHzR3Tbk#Z_`%5U-i#m-v3*S*U{D4cF{R;P4x{2>SK)$FY_@xB(5xO77_Uq~LzFPhuj4gMsasNMv*0ot#* ztIaPk-89Z$R^4#|akCQDiu%uFG`Pw#ZqL5z{Q1zeHn^1PWu5MZMKfQRHvIlkv*y65 zj5%Z8cFm~f9w(>I92l!}qf?D!g2Y?LyLNe@oWH!}Y2;82)SH>7Q5yq>r>ZMcrO)RJ z9Hsa{gL*)rT?!to$LeCAAtSu_8!{f595!!U;pv@`**+o@@5wR z008I%meW9moJjz1-lzhAaCMzT>b9HoHkLgBz};Vfqoo1$7Vv!O>H;2*uLTT>A;6e_ znDP+-?w917O&orG5Wd}7Z~b&72@r9@)fG+X$gKxb z6Jz69$(5%GFU{e?*_v-4uPpBJ=;wo%egfb?i60tFAWQ;qSG)egA~-aEBq8zl{7mV17)& zez8ox-$U{Y9P07O6JI$@dECp=5&M2Hfzj}EU2X0)Z>A@Ax4S#j>&@eO9q8hWgOop8 zH_x!Y5JO^xuvEKJgk%GFKuI6skbGW0Fc`4ARS%eoFZ{edhH_u+ts*rWozJ(IkkZ85^#U2mso=4OhDuT>z+%Eb%~t z$(90mtpLuQ0_?p295)>^phbo2tHQ)IqQdbk=jyYByPC)C$OC!NR*O)Bt-tEsv)A|S zYTsOkoKJTi7Kb-P7>S}sA`TM@AVE?zgYdY_jc#H9pipo~Xv{J1 z^r`MBX~&9}Fw?BF%PEh13og9a5=$?);?}KI^}MNGx0JEnjm&jIpg3Hkpd&IM5+PwSCr55vufL+ zb2r`h)a&UcW}tMHr;QcTFfH3r+Vu>~#{zRyYECN6Y3JsAgR-t}fwEv-sI9vXN20NK zBAH5OvblVrSSnYlwR)r3TD!BJ-u3k_ZGXqY_9oS4Vx~#Z&!y&)Xa0p0SzO6wmS1UQ z)vDKR+;UroBVE_Uv~{P*>MtF`yO+oAKAgJyaeo)8w@7`9R(o-pFKPSBw(I2(T@)P00NuMy_@7$L(YJn@eZA|sCE$Rs~XDT^A$ zqnSBY*km6QXE@>xk?04Gm$2~xHGc3np;RwekyIZfnrS0(%p6H-_K|GOb#l`?1^z&! z#`@mPw$L>`bJR&+x{waIola`;T$cf30-|Y5?zNxPwwiMurSUj@KrRdEQp7lZj6kNa zY;MKUs-IJrZ93a>we4=l)2_EYKlc6mx%Hp64q|zHhDF?SVoYe4p8bco$Z;-t z=KQ704j(^r&UX85-f#MWPxIWJ5!n8)eVN_rLv?NH{tJFjc9-R|>QW^eX7g+_+t+Yi zb`3j;qQoB(^&{jIjI17cFAxJzij%ZE>VQweDRWZhm%mGcq<}?Nmx0)gWn#A%C%d=! z+QTK>o-BzMd%omKv8lLqh(%qJ6z z0T>e=@ZlgiN>0r1vEua$2{3l%m+`kV)NuixxmvyE5;VZvH~M2Y4_1wtFg=EEju`Y2 zALkGHhF4$kKltgW%EUnn#@kF{bwx-3J8+pGbnCtYX)XbS&b9!|9Kei1z4LE?df}1J zRyYrg8;d_^24!W8I$S->!92uMFk?vB%ujp*4CFIm#@!6T4xZ`#R;SDdrHDS?|9&0r zuJio$%IHyI)tde1@HSS+G?)YF2-OA!cmtgksc?<4F@(j0l>Ir}Md!IqcPv0d}?(QbfU*Aw1hj6~PCbrg$Xd}yL9JC@O9XJKvF*6#7T zJ;iUV1x1nam;{v9&`9f*DdmQgnB+^Pch0fcbrPii!O{-R+t#RJt@i)y;)SjN9)E=` z(2f1jTNN1!&O0Hlt*DPSP3|I1&c57@=5t7>$}nEl8jvYE=oqR4H{mW;%jpkUx3x% zdcv-_Pz&GasL%FBUM!w?=5o@|Llbk!$BVD$Xxg%3@hw!=(0u%9RVe^=fyjrg5?W#! znJA5(zr&-&K?IFDMj7E;<`@@cUg@6IX?U! zMH?=K=+;Ib(CFx9FnM|H*`fa9@hSrPmchEH(rybbrcRWQVG0b(4lI+P?>M&0IuqX< z7P~D1q1msQno3e$7^Zn6xN0nY0;80Df#M+oUe{Pe4-#6ia2{Br`w`|gbiPh66Mh9}Lz*aeaEm8jiD7q9W0xQ#p;NU?K zFrq+61V=)Oz>Fm#Yu3nYETKY9PK^^6>fCtI`fPfk&A7k?3qb zH%pn?pSUk@FmNPrJa8&-HgF+uIdCm-GjJzxKSVRc4k-J8R|2mG-U@LM5_{(%hWlDO zI1i667Q^6#AHsU$i6LQZa?97AfSZOd58xOEepCm7-|@*CD1Q+tAQJMn&RHk~WE9$v zkh_PKEP)p(=|GRC@y8!rPos;&NHToE*%)HbXKwpbtL<^)&1k6Q0-K)uBTh+ZrV840z6AE{l{Jn zak6Lm-8xl_17Up@4TsiQq;~|a_P>6vqaZ)TU%nkl&;@%5ELldf*3ByD;FdD}KPqL( zmYf@JfkH)#mnvI&JftXnaX!`x4WdLUbZXyUUnLEC!ZaKcdse-z*l4;Yp=P>_t?f@8 z(7yk6m4R)6ojXTx5V~Y{=Idb2qPC_#9l@0C#PjRXh!!DHMy5iQ8g&{dG*M}xF@@XV zmu*1g!}1JhcsTEg%Wu}(cRsv(4Ge^O;PKEvoW7dNNcNZ0$GzK^+s94)?j7d2dJ3zD zT|LFs!>t~E^$06bx}JW*Wh~&ppGxAVp#3vQQaJsj5rWPq4`R6LT@ttAe)Pt0JdZce znflJe48HuN$^>Tr8g&VNUy>4JLaaC4A0bsnTQ5PD4jYXjtxFCj7;DZoksqz$shcvl~%0*h7L?aiSOxo9CeA zOX-26_P;hb04ad9!2>`h02v2Q0Wt%~9CyzNkhy@xiKoCnSH)-LDpjFDvt17AaNbpS z^m=N{lyBw&WQLGKjc#}m$1--h=>1oY;6;(e+D*0G73*}@(5 z`@p8dkOpD)X=uNO=NCK|Cp1SRMwUCkz|GCN+~~154F@*yC~t9;FFBX}o1Xy*|2GMq z9i*trRkES*LVuv|@ssA3*0!h5+RKY2i&^s~&y>%f`dR$Yb@@G!==|!Cp(C&S{)e}p z`Rd|@eV_iSc;fQ8v*-Wk)x)lR^ZJht{{NNVUi+POKi}|+^u&&SH0kCqzrXPZo7PS% z$A_Q2@mg>uJvW<7C5D#rdlxTQxZ=jGn-3oH`0V2iw7Z#{ww*_BIrWayrAG%YZsX6M zA{@LFj6W_(ou?B&a!+MwNJzYD%Ix_*c9!wvD^$2hvEmh4t6ZIW8#UXi#WvgR)u!EX zr=9Vi3og0pnr`!_2?y6Wa~!;LW7I7=+G#!Vizy~o$z^0s}xbISLA==YEL*)M(tv4@&{cz&!z z>2eiYr%Hp(TA|YAgIA|KtE+bFn)h_WN7_Q7N-VqTx(`9;wmtTx)tf$sN^R99_bb9& zg`1;jQ&i(Y#hFpMW$zcIk;@>|U}#`qVv+L@BSVf>=k)6L(kpYhcoq~@+Vq)113Qa{ zK=ZK72m}aFP=`1KF^u@svP2|iF@LqNvf8|bx3{G(3=m&&noOV&?6Y)S?zIkzAjvTY zVD4!|v5{;~a*qzi$HzQx;pK6q6p_)6P(WVk7a&}SAfRBryxu>Ww`wHN8o(++V8H_Y zDEj13efhX(gY&m8)w>5!CUr$P=S#VPo^fz z1IvQO$YJUzF5U*=4}*k?#RUSBE1>9o)A-KFFbGu9=;jz`uDm+BmL44kmC#Nfj_r1U z9-?`hfJ}$$cMqk3ya(R(j@{n#k!4o<(EropW5J#pzEq~CMthSyQ$#!bIUQ|{qc|td zYd%(rvh*4%{**Gd-+{$)7|K-8VA^Ypc)n&r*%-c69;Z(`CyUg3qW{U9Zi-`NE)~T! zA1lRBTnr`R$Gy2N3KKC~luBAH)hBK7kS%J<1zTFp$@EOLl*&ks{jqhgv-{oW0S|+~ z3U$W0RI)UiPWzK>GsS~52ZpYYXVr|N>*~%Gl4_b6rdtR?fterX{4S1PM&`wN7G{}k zt~vVVpeyiL+*sOOq;Z4sX5=uHnC#E9Rr4%BGBHtG$bsqO+cQ1 zvt!Z(IG!B^x=QWW=9rVt>U1eZL@o5N!;N7~ViDW8xXcwsxzbV}hh7$SH!q4oA(TGnT`mX*(^cXyaLJ9QDO1Ke+^q zG#zXL6}Qj`VrR%lawE#uAm4*Q;3=?xWW5&Kzyai22;0H~MaoF5=v2Tz;yV+8#z_w0 zp)br+i9PG>TrGu7uGLSV-7rd-WXY{so<@z`Xg1X0(DEZKuu?Snv(g;Rjxr@ZaKGvm zpGg{1NsK7?rbvZybPm20T!>1M>wd1LiuY8W>U@_wN=wqH4C8JmTC#9TGU<@@Ci~-K z@K}A2ru8yQ(_S2DUCuepCh@k4F&W=6#k8F)K`D*mxfWA_!3}IyN>z8dA6V0kD=M7# zR3v9s?H0+TN}el4+RJmC$zE0fjZqW;H+$=;iJch3bCs;29Ms2I6KSmzz-*pRFHa+0 z-;HKt9S)6}=w48l)qJ<`Fy|p{GKTsOp++Mi@;q4bzTA{NLWhLl!sp6pqgp!OD9hfG z=OgmM6b%@IS~C(hSfkcG9<|A8w!x5qrLA5w)WXG!Hwg|^my`k77F3t8+?o_;5cy3d z#jU3SxnIKR7*OB@9!+dQ0R)l(MRq6sej7u$-D`Fpr^{0A3HQr4JYYorJM|U)K;DBj zhQ2Oho?x?*Upna&R(K`o};FS}Zde;?s4arxN259c%p30*FYqF-;Og8TGn z4rYsif0}xSJ>poeZr--e!f%7SXU-^m@+G~t3Z|NM@^SaL-sfu2^#*{Jwcu zrup^fOyPB*RCzaKg{xnZ|0te5ODP)`lcojcY>Hu<0p=m*)9yNw*dQ>SB-zX>?Frfr zts!e9I$@P7lcS;fJYYJ#?eUG_S#8g?@g{t)u+;+J+9h+_cu@KTWA0?Q%5!SoU@f|_ zs}$5i)peScNc2MaPDoIpOL!}i+hTgCie#xO*!<999%u`;sJ+09Ynb?dkCk;|!|N$5 zsD!8*a5))_A4E03L6WV~JeYVXXQ8WDLVF@@eh3N%ul>2UB702UxVH zf!761`(6#*pN(Csr2mopGmnD=|? zZgP1!ivaz^l9>@?J!&1Cfw-q`_}22G`%q>5X@|cA_Fao0K;JJ7<_kukLKC&#%+cj$ z$AAgcI|b1h%|nRf<0)uPW}uCv0Xz>96p9^e-cJ!T zOgsVK4d8So2>yxnB(pVL5{Au#t=pqH2*ngnS*I(9UEH)2oJiM1gXU`t;_wWHC%-sm zGdU>RDVX__J1mxLpRzjI^ZeC@LK>oC|5lGZ+x?96!U(~exGKE98>6x*n>DM_*nJYB zOfQ;;hP|w#j~Uc=>jjMYtkJw4B-9n{c|BSu|6E?G8o3X%37M85IK>YKvxK4IrTSi{ zF%2rd#SRG5vcGwXJ@=fIeIj6#)`5w5qhkZ&=+S0AnH-dVG-nJM*0(Nech9kN6)760 z#c{G0v6~py5)DrqEN$6B427gn*R=FS7dru=BC{=BbGdD~+Rdkhh1C9S1cymiYvh#zl2tIXj%!qu-r2e z!ZtUL+^(PSyIyA?cKT1zD)sq~JZJR{WX*g!QK&k5jb-GaW;*@%;JxpX7_iY4KYt9A}#w+6hMQj($Y$ZY*wn3B&U2*jFg7S zP69)g7jsTEEK08)pXh-OZ+zF@$46mJB&bENCHtv@X!%F1#IUa`L%!_kQOsXgC>zRR zK~reQhEiaoO=^?khpu0# z>a1t26KkNy6sYc8$s38@RNM}RB@!ti2?E=Nv1mBQ%IRNPbEC~%NweHsWZtms%p^}e zrUznVs<;cql^|M4Dm#P}BT0r~GL-X~OiAqzAizbU1?@i(*dFi+_Fj|QdMFMF28%)d znrFQ65EyC#U(G|#w7Gz?!d!V`xXcGv#h~zcnDMB@B8N)08yu#pK{y;-P*%qAQoGwl zk~+hwukQ6~5D%rVOeRxRa78gEJ{iuVLIqOCDv{-hoHI%T)>NI&2~eG1fXTMZhr@ZC z9vugW2z+-5tO`JF&84Ctw{i5w45HyC=?D-Os9ZY^Eat%B<+o@ysNM5fi~8hzl0i;d zgM}#S4veAeime1N+*g@$4FTI%P*oUDK=vUB5{pK`TJ)agu_$F*WV0T#Dz}15;aQK8 zRYBT-RODq9VT48{UNKZEibe_6rFkG@A)o7Q8Z8uYqE(FcuW`PJqwZAHszQ%q+Gv`a!pT=5B=Xl`XwgL*L>Y&f1~yK3!r`nnpu)+6Ki^BIiabs1?CD>ey4+4 zz03%4S&^z6X47i)Pc*BZ)7U#aeeMwA>HenyD&^J-27+1}Y!PUsNt)iFRvV)os#_(= z8i??yF6|o{TZ~8J;c4R7?gFz|v`;FmmpeTz8#V4?QTTlU9Ly*DW2Y$=wNV=_mQ0zv zraY1w-g>3u8-ScT6AbD~lFH z+6)1>QkI|3mX`1TQM;d0+hhTvzyT&+cv*0t z{udK0!TIIYo3=+pRqd=ceS;59Gj*ZWZfI*nSk=K!>tlXPnyK1I+jK|AQtd2|Ys2aW z9c}b1(Ol&ykTWc*I4E83cr4Uj;KMzkH_46=Jd&Qxr{{o0A6^wYy|KNO@1YW$Y&InR zc`KvuaIV#mW!D8vN?E>V<@v2E+$HwqSOh4tcCmCA#zn`b*caD~6KKzs9YN7QwuCT4 zM&>m@Hgr&cjp4&*nx@U<^;_)n z0(uUFLtg4@X`2HDXc0y*t7$&T6h8EUUUl-%>@KG6Jr4FMn>}mBX0b>%T5|XaF4lVez^PbWPtYGylZVr^`xOW+4s&3I(e~JVi#18sayOl zLo$cESEvgqIe%E5UVpj&WmTR0YuAN$t)utX!|P%O#!6SV*FPahz?*4Vn=xnC^SiwM z4xv_d*JYaRvR}lJn*(M>wVQ1{YbSA;`xCx;%?WJDytFp!Sv9oed770Dd1IUS?)YY9 zD8b6BtkP6Olf|g$wgO9HkZXOBixRnayZRY5${m{3vF8>Regf>ap2nuREa$oPVRP>& zll0+9kVDPi#aj1?KJO0B)%lJtF%=hem^s>K|I3~cai@^!`o&x0zya5CzZH%;bIY*O z7e6)EdSDI`@!@rT_XLQXKCC@_v180%zdso<-LfJ-ZAiG=$OC@6 zXL7tR4Y}5`OMxA_+>)hXk*6{MSLmzMV38w`48lb2x^6%oKBm!MKhbLCtaE2F?sXg+ z+|BU8{P^NlLB4ehgXbhZ+oAKA^P3~I2WzC??RB(mL$bs2S?gY8`h(^DEyt$$7VEW(zQ?zZ| zkg==7bZ~I!pvk>jo)B35%$(lHOZX%zd5mxNF}jR(oP<}x=x4*#zE!G<>lECC2hK3` zztM6&rrm*P(>VW6YE2xh#0OUUy)`SXUkc0}_BQAAzh{`rNIdWFtTC$>CvB_5BBu6* zf#?7faN9kL&1tbBRtV$HnKfG9H(LGgu-qT&E>$u_ zgVXwRTa`DO2qw-f+GuW?nC+iyN0;+N+hJg>^&^`vtY$xR5O?S=_jL8S(C@6%WhcRN z8S7m8rM2tg+;#W$UV^DWO|$cFK~)-%}`W%VSr!1ZMZ{3+E{1gTZox7fco*cP}hlDaV%kY*WU{if4%%}$Cf z;-sQ3-r3y_bB5fpv^2PmT;J-YD7*RCC-r7-(3IT(4V{yG7ytyylBIR+E)g~+^SCrAvKs0Z)ipUtj~_o()uwwnkZC(erLj4o?P$}agrk3> zR?oF31o&&E6~T^BW9?)drhhP9!gI*4r;OHO211wtFgk3X!h~Fky><+>%p$z1-ms-h zU$v!-%8ke(jp)%lRM)Nic2BdM*GF>UaWFFTnExXcPG!iAQEy*WqeEBluDaTAbF-KA zimqPQP3#R&TmLrEh8Ha_f9z1q7*FDY-@U`TnGR6Emagq|9#13gs+hw65VKZkmtq>{ z!?3;NOU)r#oZ*0~Dns{logrs83Ui?}$b&uoT4UDuqVBM-zqUF;)b{l<)EmSkXFfG7 zR>2bgIxO_?o;vlyMoJpKcquF&%8dpE^%gDDsoZqxg^OlF>fQTq6P@c%9TTRc;BLTT z3F=fPY0nut%5WW~h%QN7UH!re%26_n|GZXt$1V@19%C{|WGYvhZHC*JDob$%1Z^jB zkQ&rU!!Z6%8=Fj~@nksQCn3VCv$`dH`w7*G-!uAHRZrj48u+a8ZF6U?l1l>4;Qf~M zS0x;}DM#V)Zvqpyd7e~wCtaQ`;N)-O6!I@z_Wie2_|9_tvm>_uLSyjnc65y5nV5a3 z^s-$sC(HlcpwhPdTr^0Eet$RPXwY*rKGF zrVt_(Vo~KiySz9T7IH~sDyL=)v6WR2iN^d@{JpZKu|rnBJ$dFc`8euZD`7wy$9q0lPgHg%|uxBqDEO;?_AT4q!?4Ai11144Tt zPbXE2t`KsV%ssA02!GMEzGQZ^fgfGmi4SZp$L8P(bg)ywVLNPmhP!%^t_JqHcFiI^ zbGbC*$x@^1YMHM0moIVwMc6-~*#RuKDJHM|h@MzdQNu&uXIbU#RQ+MP>kIbmt zFPx^6?iNdJ?AkHwKzvZLYfxjSXzSUyaZYfur*(fYL^k=u3e3=qB>!N~S`q+C3EJ>h zd_2_(AmI!Rjp(hx=Gx7%&@R=ryF{3n$YayQ$O>&*Wbm`3kznqSgyk~GH{YuvC;lQ}&5%tWa#Wlw zOJr|#i*RAN&8CRp#mX>KP~TX*$c`jil(@v*&yEV3)-K%V8Q9-0uId%^xZ`~a2*KUX z%syPpx;Cjzd}G$5u2S(BOf6)2qR_-`eT%{#@99wDw-e_0i|uP#x5(o=1cfiYGoF?=4^Khz z1R?l$+*m%=FWSQh@cL%61mT_hDunLV7R(0$)b0tVyt9Dnr(I7Os#{MRFbAz_S|M}P zj~N8g1G`>l1eNcNFlN*A%j4t5lJAFg?;fD9Joyv_XSz~qS1Xa$q%+OHY?$(9f>!TP zq*!w_#4`>qc8Ct6oN@n#H$#w*YOn^sYE!^F)?#C?^K~NbL!2h2Z%H8z>xgTvT5;i}+^Z|j+$Auje+6YP+T_h=v%0SeG5S*Oq0je=az+s!lD zd$a~Q&LZgR;Y$$gUlHL9wU>h{SQa*Hpnwk}hE6azoz&yd#K{VMr^t9gc2d@&%myO) z3%tXL?OY0;>>OoyXscGUr`BtZavCf~PV-T4im z(-ZfKzp%V!jWp50hD~e%;fj8#s^%VP;-O#|G{&R5`_SFM$%Y5vM@Ji?n;$C2)2>9c z6}!eILA5>Q_#TOYBs<25J)+{h8vGUWS8~X|+Uan^{7FmgsLoP3x%4ZM%S6G>h^L&Nj@~OTJzrM_6 zr5hwXWqlOFZYg4_6=@NbZca*C1L7}@32d7Zta!3yLXR8vxhS2_0hRcbTw+CV9v+0v zIL5mZ)wrRDyeJCi&?^>SXEI^N7QV~T%6h^T0?S3a<-D$`k}OdT7%Z-3t(bZAYa%UYGG%%P%ZvYG+~G& zrn4Qviuyo@+gI)frhDbvcKm4M(PRqDM+dfSz72BA42eke(IlCC6d6AIZ6LIk;>k7i z)LnVtB)%w*uC+`F0Ti?$(B>X$RYx}4(pzWi!B{a&~J_~{Co@#n_()Q82M zmcA7JG4MMoSf|e>ddha6B_H^g)ISEg>(&#vozM)HMLeRvn9e@g8aM5pF9STIc{77D#PRzKWi7aNlO?x z!uZ6A8wvaNx4yVfRvG!gduE6E!+`AePy5QS;(nMqd1U{SmujIy-OJ~`r&k$lAM?(X z!d*H4HcO0DvQKNEqGiER)}iJ;$Xv~)>$#?doT_=TYir*x;Z3INR@air%+gv89!ub{ zww}7mp1X<5vqnmtE+#MuBdrQ%MDLpSWlR-BsZ=7thQwgIA)pq}xibSg}Kt$uSS6RfyTW;|>!Zi>wxX z{vpx4zR=W`SO?QbC2YhqHjVG0_l@P+lD&=1N@+g3^61tccd>mU1_7#s#bI;2m}62bV-388d7( zq$q%MK7pplJgHJH4aP&UKj9BudZ=ZiVECcw8r z^2j1wynTuWzQeM3R#wsMcC{Xe?Zf@TS_Vz=WAsYKDI>hO70yByh@*TZWVOVh?oREWhiv{3D-8zOIIh-OrJn0S&xc7TkH#z$M#W^VgOW zD9Ut^rl_^+)re?W@9*%%jqMcekgs?xo!tlV=<&i6Xw2PPGNww>#R(0@gL;*s=?M+S zJRnfugEOh9AscOxidIvH`1uMv+e;P#g9M=msV<3#nlL+Cct*HaZHAe7rK@yv@>W-U z8^2;yYoeFX1hkx*q3cBWRnapHP(s8_i?E~4Cv^+vTsYL9nXLC`x6(THuV|@Dilh;p zRv35N5}LToA)7W`-GoIznGe}6T*deBnY9nU{12r`oXs^!_T*gTI{Kipr-%o?a)wI0 zL#Q$<-rJ<%ink03b#=WAtFMlAgEkoK%)PbWGtc8~)6$;&#O`&de?WL(gwj`a-5ChV zwF*MMf7N)AWvTA>;fJB?a9x+4Q~w?SrB#f>W$q|>|Oi60jHBkS31!7GwAchahW)# zlrX&(b&MdH62KgWov$(k`-L7+q-2Jc@qZ8Laa8AM*q!Ha=c)Nu1Q*`0d9{+is43BP zgy~|!8g!MNxZ6Y8_@Di+-Dn2OEppz<)K2o_{0q^nsVk8c6ymNz(!L{6q=>!!T*7`o zjA2b(+2Nv)b`_HM9ogw-=?|8r%;!l9@*lPPgFJAziProu!?8xj)=)EjbEVZ8xsjoX z)ZKhywwsCGQk< zKMBAPy*j{ke5>a!KcKlw75zC$b<13?3g(MJPMILssxNUOAJC}_?-Jz|%o_8Mfgsxd zHP@{M3{+q|*A=5ywTy&k%w3DEtp4n_z2jj@`n*GWLi2IHn91fx41;fC&AusxNx9yw zEcQwk<-8vI@YUZd7ruxY3k(>K5gGd584w=-0w0#r_i-6yTh>aUm&y$8X}P-xOW4Dt zlE9KMdlF}=<>`JJkxnZ!#6kgNPFz$FbaYx61`8TRWu*%D9P{PMXgWp2ZXZ1*0W88R zMW3;yR`~Y@>e&BykBT&|N_RRH-Ip{&ImvZm5Eb zv;?s);G8vc69|tv(ku_7me;2sfgq9#BhKqvoKKw#`bH4-Ly^>oN=QeZPT>5oxxjgD z=y(vh220LU&G}|YpfaYQNo=C`!d zzY-*v2b^e8JR{x>@ciEvG#3vEI??UTry9K_eDCvC^QEoDM&1in$uJt6$ zqFo(Sd5u!d2~N6zaQ##}-K#Sk{Z_(pgbGFkBWs#V_1*HGgeKyyFH5*+9z(E;cWzRD zosddNmFRgyfCugxx4Lt%GzMMkhMoC!*)$XoOtdwl%6&gG&+3CdZ7Y z_uZ5uLQJ{u-h#3D*ogeH8g+t>s=rG$VIAHZ@!VnaUXdt>7eHG?Q8*RDH%96HpHRPv z;u_9=(+xzDj(_5_>raL+n|cMfsqhoaKD~xG3JE$Tk!?Ps3f_ocbS7{`(jG3}uWQpUQw_9kjzQQ1=3t{vB6 zox%_iyX$7WOaQ;_*Di*_=I<2~Z$AM$8KKb2=*`EvFNpGVFWPzjBp>@{Dan9&{nqy@N{beRBu(-9Fj@t3RQF)4%GY4L{hNS zV2LYm)GM@?E*Q%Vo%$j5xyZW*)P0$R!cu1dx+=7n8D}ywr;PTMl08}ZO806e2?fC3 zdv_1j>{->2mv3v;Ha&|OFZJowVsqWXfoZQ53#v~1!uxm<60peTfcibrFv|veA%a$_ z_fj0HX_;jW^)`V`VL$h?xi-D@4+ZW_eG~CPPtdR7#PO5qqW{ktP@|cypoaJ59>VlM zug=g8_On`4@2-zWaX7Qjq>iTMaCIx7`p?Cw=h-x~iA1jAYKGQUAs~N>)hdcLJ0h1Q zXZ8X9WRTxQ+Z@G|l4$hO?bV_=MpioQwO#qjkmQstDrf8Tmu(q4~48Bj?qF;kH&s&`!{~m7t=rUnv9i{-9-ZyDIGB zEkSpnFXUG!Yx}m?@c)bjf)$@zXQ~&Gdp(CG3%P8y2bH((-;%<$)=Z|yIo&ZyGK*Wt zkH=+Hwew0qCR1oqxP{XDk+(R*`p4sj9I+jX04Y|6Fbu8c+Cp~kyw}p!($e?!7N_KG zj>ubU$8C!1)W@@id@Y)@64W&)s#8y=SjR2uB(O3t;ysnOYIbg69m>Te0@s>%Xlk7k z->lb4$WhF0-Uz4>j1(g#d?s&e4VTVFo0_IIWyV^Zxg>PXa2Z#o=;Th$dL3hU4W^?4 zx51-^nQ|B$7M)x*IG6#7lr5d^W)A6;F{r|+E~k4br+X-;sn|V3Lun4IYL=RJuVv98 z`m+vh?-Yiv&gAZopEzbjfGvM7CPHv+Ax4ba1G%cT{`A2PD10eeV z-Vd@NrM#hTFCbSPDoq8sVSo@K)YXkg-5c>T>Ep7C(Qzk{h5^ZyMRF8r)?!^Iorn{d zN?j+e;42N|S}J7Ws8>2#vD#TrxNM#B=gKH|LQf(VHMSS2UL#*Ht=VYJTs@xYKQv{! zIp(jrJC{sFX8G?T@w*JS##n!|RlkQDNjJGGnr!#}dWELC z_cB~rO>WohrF~Wil?_r->XnT~Ev1%1_?0~|Ngz=MRFoI)#R?J-F zF7AM4-Y^<1L(c&dsB0uEP!Z@*+_~T2C<6FF3z`yR*Mf7OtnH|cD(!czAoT5$1oaF1 zR=N)M2Z=cn{(wPo-_*Ss=mp@BaM3{)ZRel|Ktb-hwzCIL04YopT30NNpB@j zhhn<=$v=62qQ0W*S$n*>n*9h&TdkiErdYDFr>Fe6=ubMkuL!K_AEa5rB^NQ~My&q* zYY5pVm(UYQ_{k$I_MLaTh5y;W`eSI{u_rI6T&$;Rg)zzLP>P9MzLKEHQL6i>xqu!fLUcQ~mIYnS{18`GkJGrBP;<27YYSq;=nAoFo9SSg!zsv4rffa6H>XmS}j8Feru%}Gr%QkA{xcx zqs4VDc={al`NC`3-{j2+N@0bIm}a&zEv#%f+ghEI5luRB_7kPgNqrdtV$k@dG))LY@Z(p-qd7d}0Xm`8O zbdD5!$gf3Zhdb4QcSzn<>v5(0`h;|^(6jRxqdX0v5S(Giz3;)i^~KGbPq5PaRPs&~ z{wV8j=?t>c{u-srJ_WK-A0W(@?=cpzQu6l^TYyqMrpTruCGsCy5)Yk;Lw&Iza14v=TBdemr@K{`56uN_7E(gg%o)L4 za3t#b$65wpUF3{%#PR(`JHE2}bJjfGb-M%f&s@R``Rj9r=v0JJP?m3lu^9>#bkdr3 zXT+Vcv}7Awb8TMZevtWR%D6RvO5AaF))I3^fHfA8@IYo{%{~`U0AY#a80@T_sj=4* zDdp!e`0i#aNhkhM?`z+@Kr`L5(TtxoeFCPFdQU)aQu_&LPZ~Y}!%5B);7sa20sTp; zqTqgT`KWKJOSC7{T?_PP=umIt<)yh~h~ePF0D#s-z+9}~G6EFnGeGx%P@VO5N`3@z5iWy%%Rd zuRbTN^34Xr1`Ub#(Pz~XB}kGYS*ktKWJs4OOO9;0@_dl5P=O*Pigns+wNh)W^~o1U z;JU=gCWl-S_@7TfKDt?xq>zXrib;_sLkXpn5zU-mQKA`YwBR(%4lPZb)|8xGTsEh zK20_SbPnn8qjKJMddpeo+*awBJFdD`26bfu&Pk4Gp824vv52pK%=ckLfBY{9qc};k zyeO->X}f+HjVIIDe6d`uH{0DFI?qn$ui1LLKb}8p{#jp;je36o7yJLtu5Q>;_4NZA zhS2bk=ujVqs}hq_KOe6*ICF7)Bw8C61TY~$6uu@*c0LDtx=wYu24?tiSY2D+*xcHF zy|er4BxB5CoY~A_E)&dSJ`0#+A&Xed6zKVCEOU8EGFn%;PON0dY_mGDmTJ~)=if3K zIMT@a?YD(AZ{ouux7Jpjc86EE8=jgur;2`3@g3~nZ!tnE$+%{4(qm= z^hy%%I7G>^nww6^vziwm1kLHbI4Z$({5Dl&dc#M3AiW{qCT{tPw39jAZ@P$_Sbf%T zaAG5=##alw?Q0vA)!yV1OFFLd){*g+x%y}+_Ay3BHK{pLp41}S34_sOTLwg#G2CIe zY2%A9L1XNb&QgPlYE-jYBDF!A8Cmp>ou0! zMSD#w6t&k;kjj@)*4l;62!ww0WLmNCFH#->XcBM}v{4|-Nz#}xT+!4iSSqSZfcU3)cIw=7o;@{B;;uG>b7QiDqnI>z7jP!S$^w6f=d$Gc1YNk z2XkA-CDd77-Tuc6O65L?|-noY7ky` za1@#GoU4K-P7LQp4T)o#*1N74+986e3trRA_SMQuD zZ*aXilMMHAZZAxnZRDllR~9}fJ9y8d>=`N(_khMQQnS1Kmxv3w=NWeA9H3bNf8}<} zq!NSwG2z)cFhR0l#2dU(S|e8JhF#h{ZWQvnx-hu9w$cA6pa-TkYa}>kjlk{#FKnVY z3K+UxLfL&sRbO?M5~qxI1w}K7!wr#g>ZQHhOTU*<uhVRUUNo!1T za~9dN79$^Pr*~C->=S9tisn*eqo@Y%a1{&pfnHpQy5EO7o>w_KMWh&dCBv!Q=4C!K zAxJC#YMpn;YqqgJf4R1kl1``At@Z$TL)_&+)0 z(WI_OmY=NOjE0m=e=@=HSgtXH8gU8?q~DUP2~XL0YMvuhI4H7O-fA`$|9xu^{%~9= z^tRbh_@effq4g2`y0#Vd9tQV#cvCDH1Z~0D>YP_Mx@yKjsZsbC3g`_`K3)CXAp=E; z-I0rzs3y~CskY28XV!hlr00#H_X3~}2d|?LhYJ#lA4tKQh%xKxnS^4a7)GLz!3i_O zT=&bY!IQd#6DK-o%hD9A-6Q=-p8E$-@`km?4TDY@#amX)H@_cH)Egya*p|6et>WbW zwYY8XkzbC2(UMYw@e?RO`htNGh7=a3lCbZl=G0#qD1aae(MR9P)Kw`VyL@5w?kE`M<+b)P$?rw z4q;w;Sx)`EH)$h%wz;ni-r9{wuB2R)E*@8BU5)ieLt~mGz2I#R1?lziww#DVFhbWNEv>cGobu)0c5dP{E?@6B zYZmq`>w8`#klB%7)s&|uxjIgNwBx6)_*Mp1nh6Xeav`K)ThFD>a+;l5ZHp2|^<%bS^u5%q7Cikf`<*CY?G8K{8 zm^tc4p97oW?{{p*i1Kf~x!@DM5*T5jwQU=RP}&*z46r$ErH2KZmOi;Lgj0OXQ)feClkXVlIGxyhGONPHb z>lB0r#0_*J-XO8no$~Rc_WC#dyTwiu&v|r-R7WgICEi8M z;$_^4Vzt=#dVgrtf0X$IHss>fss#hyIAN;_dwOCEi!AP)8uwUUQB2skdakL^9@e$Rl*cvJEO0PReHE6tQzZJB=Ta{Q( z$Xbn<$@4*A5yCmvhw=)PK8>UxisVGdXs5_TB8|_sdJW21Zhn6ZEwC_6vDUAdKGErj z2}!I}s#h3bY$3HNy>vtUxi0k}}f09Sz!PJ^IyFkkmf7gXt`VK6sb6qIS>6IR++S!^`<@U4m z_Njz;G)rZf?smBNLsZVUUWvEAp_Bz||Im-YPBhMtZHUX(~PjzYwmnKVvOt@cBcK;;&B;obQZ==kmBsN3&MAWTvxVtClhLi|sS^ zICz}(a2em3{k;79b@|VPh8GzI&kIhGmSkABPnIvHPZEYR<<56x6)c%mei5x0?adk+ z7dm9Ngm^GIlPm*^Ph|D`y7*u*b22w~MR`^k*a)`Gkt3Y8M`n5bE$Ts2YMSz3LBEfX z>~#s!yMiHCjo?!1w<~)V{P`DiK9buuLZCkeUpzXq2yZt|;5~jTy`yH|3yLYW_|2qb zaxSrg(`h~9?Y^B0UfZuBUPnDUnn!rvKas^?b=PmXr{R6Wt@=p{_U~OHChr7n5h4rH zO&N)Du_XS3p#rC;Bd0saYyK9S4YS?ZoGgT#XG|U47wuKgd&sleEHDFmlSESzo-KZn zHB<2TSuPbbeS@%tFkz(4k|>u2$VLHK#f||%DV1m=+ZCgwQDz>ZgMa1 zo@9fh$CobX7+jw59MT-z_R;I9ZPq$dE6 z#?d?N_dc*5bR#r$G#Aq0YJ8zI(YQf(`g%pgbjmvArpQc6#Y) zm_Oi=Z2J#r?aU?uAlw!CqT4Nc?Q$ExPU!50(UXe<>C!BkEv zQ&ns`J*%n&f+L(nUZM2T9H(wRiXAaJM)WxaEH*MF4of1dYAev(SfilIKF9)2gPoq*+{C zUw(r;mm$Y#JsFA1tE;&QhtskR72>POl2-I`Z{!0*kgFz8)O;-uXP4jgGCJ6kh5I zw2O|BY7!p7)iUw;#f{ID^4w-%caW6<1Ctx-MdpmR3jotVx3Uj8^3uQDPQ)| zn<~a_u}FuM($s{kQCzCx6{PM&kkN|kSvc*VmG{0sl$qO{pVVX+2wGEfXCsDG$!+M3 zMFng5sYas^45Usl-pzTsi2Ae3VH9OG1V{3XJA~OxzU7XwtKHWeuPm;Ba`tO5%1uy{ z8YqRZmc#b*K}w~S1bHP5ANEeN`sv*76G8Ik-GK^XHU z9X1oVUgk4t4=^3u-j_>JmE9m&izg*Ob5Gu);jjevg1DqnPv_(#JJ!y~Pr2)j#>(_R zkz<-;Qg~|mZhvU-df%;CuSx6akU>(vu2^ZHB=7P2)GtG{_dKdJ%~E)X2%z1_@;fco zr}nV!p{sYu^_*TNz@u;x6N&e9@LDH=Ei2!63lH9r)Bk=$MJJ%elh44K{(~gD4$*{T zf^ULqVxS|tC0sa+8$Uo0#zR>m@q=;@2jgupO=s0G_^h)9+vQhq4AzE-kaXpUpBLoP z*GuEoGRP%oa=2i*q=>*E!$Fuc8lgz z)QJ+s!_Bq^ajT+hzsT#?En2?Rd-XFctqBcb#ipFAWB?V^dN+lIae_|SPJv+^aaBAQ zA&LbecJb9L^mk5?;C!;h z4#a01MS4-H! z;$oqt#W*U|$pwb0hCK|ov&Equ^@`=<;t!6<)v2M;==o{3G%K%fWO$Jbug#vF4FP^k zsV2}Ed5xVjH2VU)w*BC_HnLz$DUj#G7x8j_tC^q(fBxq99!0I{9PflVT2IvekKSLe znwUPUPD*fZeVrB`Wjf)t>f0RnEazlBKo^yd1N|Pq{a#u8R0`$*2_gl_>x7|$*Ra$o zydqgZJe2gY`v~}{ZcCXWi}Hz9HL}`Gbkr=aWt(`oV!_1F(WdKT4`84f5*yGFd&9%wNqe@op#OT zr z=0#!9NOlz>fm=YXs}x®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

TaEd`j1Q- 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 To?&0mO^0_(f0ut)7-;|i7A}(! literal 0 HcmV?d00001 diff --git a/_astro/InstrumentSans-Regular.JnvgzjHK.woff2 b/_astro/InstrumentSans-Regular.JnvgzjHK.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..fd72c2573968ec7b389e06549fc4cd940fe0ce86 GIT binary patch literal 29100 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

dtO7g_GDJ`rJm)FeLeUP% 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 literal 0 HcmV?d00001 diff --git a/_astro/InstrumentSans-SemiBold.wfsLgfkq.woff2 b/_astro/InstrumentSans-SemiBold.wfsLgfkq.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..8073ca4ace8ba9bfeb0dd8671783c9e96697a20d GIT binary patch literal 30048 zcmV)AK*YayPew8T0RR910Civh5C8xG0US^O0CfET0RR9100000000000000000000 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 H$}!tZZ2x`V literal 0 HcmV?d00001 diff --git a/_astro/InstrumentSans-SemiBoldItalic.DRnKVj3E.woff2 b/_astro/InstrumentSans-SemiBoldItalic.DRnKVj3E.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b3ba828d33e73282478d291922a5248433226e3a GIT binary patch literal 31508 zcmV(?K-a%_Pew8T0RR910DBYw5C8xG0V5Cq0D7?i0RR9100000000000000000000 z0000#Mn+Uk92$ZK8-ju;9GUKO9!A0 z3TxGx%E!^Qz)=6tE_|NsAgM>3Hy zyIk>-rXXTbr>L9T-XFx=Js?OmkgaM=<+N{s%=v)j*jt;{4v#vYDmv27f)shVe5@o- z!X(?m12U0Rq7s#guea<@wgocVJu#;lWkN=1y15BR&>)Xa$LH$U%S1RrCO)Y|B`TF( zHu|;D2VS@sxt$XcScp5^)`%MdS5>j|xY|`Swuv5gNd?nDzB^-u%k(H-hHX}j`u9j@ zzy3r!!tj^LPT}-ACWa$yZ6Z-v`+9%#?;UA+x&Ci14Kl?XpCYHM9Rv)VaLjqi`HJX z8H)(UGFiCPt!)HjYjfpC0`tedP13X=prG&X=7wNSyE>uZQ77Vr2q7*&LI@Iw5X6gB zF|F#_t-!2i%%sjzlhMuF{eGQkH~y*LGd*_~KAEWKh)kyfOr@-_RTbXzHkV_jzm{VP znWQ7F9QR7R<2+I$G{zu219YxsXvs@jkS{GQXwiNEhm{S`@xCG@h=Gq$DenUc8w58P?p9F|xBIM_3?d9XP|Kj5%4zP3S6Z26&RL0-6xFh2kSCExV>^Vl z12a+q_;vKN3w#7Bt4uD?FCL}Se^h+DZhG&2O4lr}Kg}-rTp%)PvINEsQ1}839DzAYmBlHCKZbgNT>&fz5Y}8D&J+2QbMalG`9C_h2i$jT|0-_{>c6T zbd2)<9RWaPwE;Z<6s8120v6joIyg+WWC2J}yuWb!djHx>TT&1TAr%Nsg3>sPMKock zXtyV90Yw^6^I)Cc^dW>!b%S$@rf8a`Xo{i}0>C0877$Q3+*yd1N9$_wL#$^%bP#tU z;P1_}Oy{xrZ?GP}rdU{0|bXgA8&_qOPu@Y zMR5nCxm|3pfuU&S3|7W_>=gIRoFh>v6&CW8hm4Jw-9|Dtl_KlXi*!MzBvcS9bvDVQ zJXMg&|5DXl0s`Tjstc(ouOw++C~w?Vi}!c6z%G{}K~QFp9AYFu@rHt}Q@W6Im2=Ug zs&rdicZ9JMJ}`X2K?HLQpD@inSKsW;^j=r?0u+UiE99mq&p(`iBvY^EH+K}bT#s-s znN)@2IF-W)grZQC=l@@8U+>%Hz${`qOX5(HCPE`*eas*(Lo=~P6D#3i-%OGwlm5@| zmdtw;O&((Uez`ZL_w^(qxobQ-hVBVr7r+(6}7861+!5CqL7{nmVF3TCgD!OFO0)Bm+{B#&|hC%z+E({RyA<9?RpTA`jQZcrA zaNA(^Fo~T1Ux$4mM3ckUOtQdk?f+j22*4-bb4~{E;pgbl0DSb<;Rgr|2Ec}Zk6`G4 zI}RkF1Y8ea4tc`aFy(H9yy<3`w{(S6QH81Y6J)=?fIIAOAo6Hq%z=cr@nWT!V+jlj zG?4zFSh?}5LXg~gEmPiwk$7~pTwVu(YJ>7?p5^!_I)t`vbkZrOogs5pS#`9R1~dco zLg2cZLx+LQ-~O`!fA(kSAb>_Z&4jJ^)1M>8o_{1mR!9KkF$zGi?P7e7zk(sd{}<0e z=KuD1k03jt4-tK_;>Q3IWat>P!Xbh|1w-(&JtP2k`reTNJnA>1z=DqX1n}tng%D`? z%Tc5!{k(hnQwN9WkRBFeV?q}H z%$=9hJs%FyBjNy##tK`Ab-c98yb2fOAioN($W18!c8}fAL;66Uf`y0WhWW`t5#|h1EZilw-8a`ms zmU}%to&U~Ee2F9#D5VhTB5!|U0y_ax{<@QMVyERyoR!)d=qlU*qs;J)OKx~7w*StZ zxygp_p55Ai8q(BW%Nuwz@3h_9r{g-McLILU|8sj?t!;NFn(6Uy`mx{hpA0as=6I|= z?QQh&tW9K6(?6J$lWt#JBRI#u?jjEISWoH{4t9jg7@l7H>w4ig<<4H`ja}k>>k%{j zAME+Pl&5~g_pOgTwf&{!9}Yw#vgrzjVg#`gf+Rw&3zLwAzngl( z&V+Nx^&xg4X)0ZVFKhEV_4}`wbZ1gsna}n+Ilx@T1T4=@e3)E9T@o!VLE)gX(8QV0 zfGkdq7zdG{hl_C-)i8!|A>fMLD@f8zE7?)GAN>1G>lv*8YI`;8ow)U}}J+!-u~noI2+8huII0KaS6mEnt|DX^?uH8km<44GQZ z)J9#GgJuH$kmpF{iX^D>U_FxOOBG0!`lRm^*kllcndMwpBAqWsGQo#Pez-L-+n$6J z?K)N(?}ZUxuq@aQbU-HdV9rQ6yL&EHA7fk0K*|o#E+O6R3`+@LfmhSC&^%qAO@&Z2)Zcf*7PB42f5tONb;zi76D>Sd6mXDiAY5c|Q#r}2 z^2X`UeJdQzL6C)ML~&v&;s^;vNtCn`nrBK(bVp!V7#p@NCrlNkiKx)fxm6_$MGN7D zn*LOt7gHC9N~lW0rK!nk6c(c>svQL+&9M@fGOvm~I)y5&2@6bFYj7K&h-yF@w~gP- z7fBGqCJ;U{Eb?>roa%vs0L@J$3T1i~Q*;ZemTmCj!%is7R2MW+6=qdFCPG8Ql%_Qe z$yg8sI|LAb{o|;UQIS=ab53S4Zi-==O<_OY0lY37N6`SqM^=Lm`69;OrL|H!xYAge z#IkW&5(c5XP=0VoLUd_aGM>d9CL~#~Asumov;d1KL=)Cbl8J_(dIE0AQLjvz%quU) zpkebkpsCBCr^=D9Mm3C&7{&xU0|>{+KtOT0guEnJ1|^FnOE6gVunvKoip^E^4k!$4 zPPZ$MMU@7yI1Pw{n5AQRAYpMC2{uW9jI1m`&JW4n7g~`%6ec93lacRFbBUfy#p9{4?1t!>saL#@%K31-8F; zi+^?-i~VTX+^HUltHFcXQ4jeY(eKFEx-`>uapW(HNznaLFr|eVVl0+6=yu*pQeZ*= z30IQp(wepTm#_*Fo4#LgPzT_4U|cM*cwCtxy+h24&5x=NMAG_5%^3RODTrAdBjKr} zy#6}p=EWWx7M5pbaBFyN!CQ+4%d`?<)wfA);X<}+ZsYQ>4V(P^8}htGhky<{a?FwA z4xI{c1KR7NT(7;!<1L5YcI6#m?>hFAWnNN$IN(E_qw&A%X$mi2`72gul`2!^N?Ns4 zb<$x#bHXio-Lkn>7+U3Njk9&WHaObkZp-Vo?X^qVp5yi;>4VGbb=^+WH;(7<d8Ua^XLC1VzXI3=1z!Ay36%u;9p|!7{A& zww<%xX^Qihe^bO;C%-)nJy5886$r~TXUho+r5*{`q9p-`s^?`j0Ndz24#LFWCTuqw z;9@{~`4@Dovfb9>=L+k~)W%PY_BGy9q8XY=B@@c%KX_Mh;}&zFsUpvccO`iR z0tt+;H6n194*uavjmt@xi@>840ZE)Bi?ugP!qI*Q?=itK(I1L>D`r*Pu7tmlv?pan z+KG&PS-WaoFx_uPgp2$-DcTX<5zHX2Qi*e(*L-8#ah}+D2g(v*OK>y|@H{+UH)OsE zU=MB;(Us6)O9PYCSJ3okZbF*|P2LM~+ASv@kyROVWGbNTP6#QSL90;N#1q*qc0d-giYT(sE>zBq0Kk`o!Hh@6YFMA;y2WS&OI8is&DiYmphEJv3c z713;_eqpD2;hII7jXcIeiCet0JH-*_KC-rZ1$CU}h)|$lS+B&$ zb1jw8958qb2rU2{9T}kJkD(HB)3ifPys^$3C^<-DSP~kd#TLb)+7E+zPls<5D6K!D zL5_1vfiR@U(H`0#;6i260_1~}95`RUHisR6#;o-@1%%6cf=O^LWI>c&OhUqW)G{jU zg2fTg#%a&7;M?3TGR>9}Eu9n*cHk0bT{|ddEUqmf9v_@?F_kX{MQ8$>ahqR?b*k`V zD^?-9xc1BIA)Eo710e|qi(>@>DDDdAE= z6xteAiwB$_~1Xj>=P!nzMsC#VCR zj&wREbfVL#PE;mPh%0773T29AN+b|Lfigo=FzqLt3N5$pegc(KD!;_E%${Y77K#qX zhr<{_Ss^K5kO-KmWdmzd&lX{{rBp5e#;q{X#A>Ya4FfBLHEIz$<#in!sE&uvcKtAj zL<_^@f)YZi!eS;En8q6MHRGBJwHB&ld>>z)TkIEauO2CES}44Ki_evF zD#$B>m?&+a4zDLb-jZ!eE@~-2^khyfUIi8w6cZAa`?02;Isb{m@YLKsYW8HlYND-Mg8fWg#|UD;iqXbQ-w-2yJ+M|JTA5=(ez~rAbSM3H^ZX zy7{z^RNU2)R?D`YLK-k0e!DocX!Wu+%Qh2ksch}U)`@*C^qXAhuh0}{#5pG70h+D_ zW}X$!^!nGEj+TMJzAl^>*-l(c{7It^#*IZ_bAf?>`T_^s2qPohQ>HIdZfH`A}* z&NSANGl~ z{BtwRK(RwLMRQBZj*6Rfk5s)t7e!O}X~Mlq^kyG1Pqe+!fO9E}Y7FEm5Y0T@YbZ=E zhNo~-$!X*&|;1qf{ItcXyeq}$AeAjd%^^zv-a@@75~ zvm)WS`y3a!gL!IOVR&X>-0dn8vTd=Xy9NGKAjSojO3nn?oV*Q&MYbDm6w%|>7tfI9 z_3qN?Rc{P6OfoCkJ~&T0L>1$fV8{ma-v!T{YO_`W|!TLY_4Ftp2+h}0WkJEOupDjQ_(8#liE~v+KCYnS?8_3SSn%SUzCo1JDZ0PIJ!6aaC-~7|7X?&+rck zn|ZK_C(D0>Na2KJ2*OXfi^c-@Iuw=tzk#{(G)1vULsL=5QrTLfYum2AeFsL4oSHay zW#PsHiANqg_S6ffUVG=#2Or!*>xNstOG4rY?s?#co|y6zFTL_}^On71+mR2QIPsNp z=dQbS=>|Eun^aV8F)_K#!9gM@=#IF!yOJ{Qfx#vels$&Qe1k-qQdjp>Q`0jY9nTF6 zOdA=QVJXHC4khU#22{o}gX&C0QkSK8>hn;_w!Ddb)9aJrp~n5n&j=XzjK`+??N}-=|=b6?@kZA=x(pQ>1pqM=y@$# zdRZHFjj)yeBLPeQS?(`bAOiF=F-}*_zzAierKX{!N6=AsVql=f4OQpR(v=s&s(^q} zfq+0bD6h1Lo-Qm*P)VTxp(&}z>8M48HYFw^9$>2YQNb%|L6o(jYD#h_MHv}I0z_33 zt%cD;$cxD%;7U*iJ}5I#TToF-99qc)N05gE3QaNb38hD{Ah`f=icv}xKRWt`1Pweb z-hiNwY}KVEH%_BgpwK5pHW64oyhFRLqQax7i%{0kFrwy;9IdXk*iuRH1foZXvHg^; zu13gHWzINw2^1U>s1ypUB2CYx;0YQ_Z$V$nj0%r4udoO>oX#PHLsCV+GjpDS1Bz*5 zv*5s?DSAiFR8XPe1jdqOb5Ti^h+zmJ7#H|b7pJXftgmN4AmVg2H1N6vqrf$>V6cpg zs=T}&0uEIUk!>_IRp61sq<}#AR2hL}gF+z!P8A+^z;Z= zw7v$B1qu!0;gSQZD#;n5&`5Zpq#9i`78WkmlpI*OyZ>qAfWhdZ<0@4al%j>l>*`{3 zRq^ULBovDBQkS4e4Mz&#U^1LYWjUaDAV4V%1x_|MmZ%BDLg*H{3$9* z_Q<7502yt4EyPd=da8{YC8R6r0T;q>b;v?8z@W=zA?%QHR+konspv}V%a%J5jUl~c^z}3~kc2|~z35K*yyu*RI@YeF30QE>RD^iBZ ze^^;CZIz|;rmZ|H`EvF2GsR}xm94S?Vu9K!byX#K!DeNW8G-T2T7Oj)+0;-9U|?Vh zvW9SSE*5g{s7IDxr9d zwa~n3SO=CWJ(nlWr!;Ue78*-JCqNb3q}2n~((NV1N}-I5PXWb_bYyUXAu74}EpwW< z)IJw5JiN$2K?K0IC(JL53-bYaktl#tCUaC7xyKSzF>%d{B2bHPdsv@12`PP~^0()q zeSNQ0=Digi0}SA2S)^(h>j23!qPkL`KxBUpDJgzD4mQ{ni4Lx7ZVX<)3e1BfP{7Ip zZ4fQX$9AKF0IZUGHWyW!fr5u+jLt*dctqfbUT;oHB(30u{8DI-pVw1skCH*NSOa)G%i^X1M0SSa?*E6_ME_!Bwz2K-n>v zeF-TJt|>oTmk*%17IEJ{#0U&65=FHXN&?ugBSa$Bs2jl|n<|H>5V$ZFEqEfT=OmJR z+#DjYWRo)lmodj}9_z>&35jc-!@Or+)2SLrmfxJuQic$<_%1x<9W!3{OGU$YKnT>@ zo$%*9Osw3lZb1zdn~d-otx#U6D>V*D_-zn*h7Gq6n~9_D$}1SDQ$fMllG}d&+)+Ae zOXchx+Z+D{d!nX3@N`Bd0BF$QwuKlEKm-*ApW`)hUfo@=ENE15&pPC8Fh7sYXQN_Y z6I6wskKKyg>?LU?OV!HAB#5~^uFXRs)Y0*%6dw-+z3z^dCY#|}?yJ^i#`_~#bzsR z1Dz>oVH{G@3&ubR5)MOxlQU~#btmT=Aft|P&X3ry8Ja8+CHP21b#frNdh;YC{)bs6Q}h)IW1K^WZa1k&Oz^~NxNhUcBs{ukzw5pIdK}H z2DXmHq(aIb8C6Gj@Ka1!P*71*ddijbfU|WO)Q4!oLFDt2Vx(ceo0ZVelk!*vU=t}N zLaP3)ITf0s;|kTjU8-y$eS|VK3XLw8)$SEf16&MH#;~q1392tE{8t_AXP{VQ!)3>v-&k z1ab`qgSim-K`F4v;=uf{REjeKOK)aR5@N`C!WA{GKdcPYp6zYHk$Zt#}&~r+4Wmn00``VAVj* zXU(~qyQnH7(n6ZbVMBBj7IU^`&dSo$1WOZ9cY^En`I~&Y9xrXq*pJ~$s3X!zoR)`>(3tAE z744=6T6Qw&dk*d{(4hrgo$rS#i71FVb|IoY0pwwUhN|l-Pf+9wKFQh_ot^Q%rf``+jPmQg>M~TmVQB5+e?@U{#d}EwqYDK&|(Z5=cC_#I&Ls z5gVFJ$mVE3-D=%E^{2vWDZ{5$i3C`AZ)wn|7oh!{9{R=@Q5sPew=1-qMGe%`!~mcH z1_KtS7-+*X2cmLZnpB6##7l8 zNSp_(BjL0Ep+_lQ>7X}ANgIx+_NK}!NTkN0m^t&JLQIW71>v&exOzm!FzVB++}%&M z&m%b)kU(pSAQj!+rm2UZ@|6;Z&WY(yM;l^lUb)#{hV_WR$>p(f9(0JWX=L2tLrgbW zL=BB_x;urH^rW|nu$c}I$`OEKNcc2cAIJ!WwW@&3w~GjJF*+g{S^=Tj9DCuq>d+*N zF-DX(9WBwoL0ZN1M8vousOyltH+jG7!N5;r#odFzF3ZlrYqElD+KEpu*G3F8$< zvmH-tmxn*p-*i&5Q>q?>^=?5+pH}fN-&gB;{jSM*K2WErL}lotXvRkUS*&=?+^jg^ zq>51@QjE#0i6{x0@)Xi#Vki;Aiwr3kF56t@sr= zUXErBcL z3YG>$Zp2Pn%ZUGKJ)CAcwncQ3&zt6(47y61UNgiha@IjAMNSS_`lB-SQ_rkK+A6WF#JrXW>Waex z6|H>*wyIl_E?=4+o>-y~+~)THatL`icz@3!kujKqUY!sijoRswle5?a7U@xkD4D~@ zkBA@pvL>EXN3x1;C{_BMD`*>q0^?Pf6M_34_LFG?ks>U742&g6_t0i`~+2 zhk|vaA|4d7kKoReC%kmTJ-;IfWWgw@pK*$clg=pTIT%t(yutw25}e^KyX4faiEzgZ zrKR)4r^4DHxotgS+N^I7wk0GjTaCNQ&~g;*yDwGLYq$P6=($T-7d$z!E`!u#)! zG0_TjD6Ab-fzpa2&$c726!Str9Z6<9J|`EcVHrVv(UFKYp_7FVJJcRagaRA5U} z@LeL`H|&PUuU4dyB2QcrYMj3`;RJTT%+FP92*_Gk$W{wMvKFG6hpOg-ID=ebUfkC5 zPNJ9_$&$Q+Of2V>-9ZQAbR*c69a?(tKXCP9yTr}JKnCF9QJ?@znzCvZ;R*t>=*YBb zRkA>F0De)!e8O`RX6^mhdQF35m5##-0)ZsJOUd3`0B{5{g+^wOrFaAYz;lL00B9r_ zUX#EvTWM?nXAF=63?~p|Pxabd$I2IE9xiG?415*LTDi!c0ma+_o`%-H( z0Dz^mwx3QqASh$uA`fsvSbzwp$YY$BOD)M8WQa$0U+M%`H386TtGJTP5{f3%C4-L( zry7|R_GW;EC?J~S`nZ83j*MQ9q05sHXD3y6*}?~+g(;n{xS%sKd?-pveg@&P^!ywe z&QUJ1(s7fvV0d0qnRMk|5c3vd$%bok0q-EpIB}Y&Aoq*`EkTY*EO`k^+-U0}vfHQW z5^7W~*U~T4EMCi44mQZf zVun*i3;?=onyPZq+4zT`QjcXTcd^CzDH2bqjl5wVIF{N)h^DAAM-f>gI$@=)rfcYl zJL00aqG}3ZF1trG%7Tja?Rdb5V0FbQ4-l3_J8&rmljp+Q2RV{Ju~Uf^DH3}STII-z zdP2gDmL>NLiw?S1TeF2d!BA|g+d|7j2ssdIKtYd*_#YNMy4g#1mXtsu21ddn(HVCp z-m`FdaYZqODvi$^hSdQTk#C@G*o?9HG?bi(1G=+8u!OWBL}j!ThI|8>u1am()fA^a z%;rg_lmL9Ba1|0Ri4mV8T=x6RCj}7|&=$ie%By=R9zz@o9p4`)RuN<6P_w#$ zvC@Y0A5%63vXBNt8r1EMZkSFCp2i2aVmhLYh)hivqYB6I1#@u88Q4YzKUDZfn!I8U zYH<~;&|>eft$E5_*FtNL z1d_dTZAn(I+V}OQ$x?m#T#vlt{m5-9{2MQQNx-uM5%?oFv2P<> z!zI!fBhv`Z=lNMR=NY6-P-fgQnVCM)X9Yj^j>kJ#_`BYS3Me> zPlK3RTW=z)2_pPGZSP$~ahOT0)nHH51R7ZC=j+nx(lA6VqOq3KLbI z1}{5OvglHS-WGoBAQ@}6Q+jZ8e4?DP;@EkgzQHSkqNIe236T%kPKiU)%y^We#{X-e zo6NB=Z+L=D>kS1&1LpCm0|xqB6;46&OO zpcve%$9OG5aPA-YiJ)r$RM@}GykC6urZp%=#>I&7RqSzcU*FiqkV`;%NM02__zT1Jp z(^M+<6odqzLry`yN*US+c=3FteF9qR1F%KDq6rfNphP|EFv_UE9@>FWmHxr#tbEM5 z_BlK|D*R2VCR)CCmZX)1gSP+rR4xR{SF>i{T2R|3Kz@5f?aAZb2ukVwe2#GV4)hyw zvwS8WJ1~-pY`lJLda31KW^NLhU0AX$** zT*`g+Ahnff(y5uIXePHI9YjJV?bNv^PS@$`cOz}hD>%D@4!ky^Sw^FQRxgdPG_Rsj zBezl~k+J%93z)s-kms#do~^wm+h%{v0Us0hXZBXb4ea zGHl$!$~+Zm>dLw#eqa|_Gz$xpa2dgTX1Z)u-y+f>5OtKqgi*@Yj8-bB#+^)|)j7P* z5yx7AXni^fX*1zQqWF`YKUA|NV3AGdnSN{w-!Q^L7Pa!-K%qEoz3jMt|U_h|nW-a`lU&KSa? z^v|~h!@r#{7MV~OEg7{EdY8%G)1fst@1L~!xiIZo=pLuqP<5JWHf07FFLG- zIKNeB!cOkMxgSFqMcq?U@FAOn4^CSY3@q7@1Ne=IrXDxu_-Thu0&2*bZ~_-spu|VwtM$U&>E5qJ6#8@EHccnu|`YF4X zAn&OZZ4IAUsh65_Bu+J1)a7(9kC$1kg%JGgR3AOcikQ?ihkIe(XliE39lF#dJ?pXcQtdDhQNFqo(PgXe@&nWX=nh#-*GBR%vz~00Piqk1GQp zI0}j>I|Z(7ogT}3UuS1lkpB>k>Szg?0|5TPTwOEr#!@ zxy-1Pc~!J8p*RMgG1hV)%iz)zaF$Dn<)%fmv1zpPBUMQ#G8SoS-`y)MzH48A&3gwa ztT}PV)-u7b3F&K%@Ml8^j{y^znP2#pIrj0wNWmTV5x(DF6$>q)jG>GjvAI3F2Kr*# zI%ZN*4C^!5GipFqt4yY)1dWH+pl;FuVHX$BH3WyY{Lkc&k z;wq>)oBeplBqG2VfdnWXebq0J_#~?N7~p`CiK+U`JtIdUKy(U9_pzkNM`D-*2?0#3 zmZAL|lF?L>8k58mczso>x2bf>n8U^4(;cVU$J1(J zwB=k_xCr#jE$xERnrSN3El~(ly0I`9j@ls*d8j8JXV!Kh3=&|GA(q0t0;*^Qvo!|3 zouB@wT0k+qSeaO*Pk0}Q$8=`liL!(=cVhvPjK(pNf43D&kWJA=NDbfoPiX*$M-rvb z3JN?WF<)I%R>wlYTB2#&uC{##dXAhLICo{@#sdqFJ+|+Sw+?*p!I7`NIrhWfjQl5; zJ(I6cW0rac&2!Xgd1PK&?X4CEwCQwQ7nRex^^oZ^LhiS}?ie-dK23NOd6-9c{+jzz z1V_UKRP?Km6=_;!kcq?OY<dG3$jSw|tP|p%zojQJLy%J<>ycyZ3&8 z_Z<#hv(dVphnj1;j_bRTo0?lV-`vin4!Y72bMLM(_vS?Hn=JFIO5m+HCI<98{{s-N0J>kTvqNZbH zVH=bQEB0K$1qc%(NrqfS%Aqvr&}U?tvM{ZQNP(0P7!ALG1CpdZ;bJArkf+#OHNuj% z<0?-Ze*{E`w9-0T>~g>{XIwI1Oh8yf%9<@ferE`5=lL>9Vl4wR30+1kz&P{dCq$G4 zX|fe4ovSry(__elIUXSipaKky^Ax0ip?A8y!g5ur)oIkC?HQWMY?Xbk!3!v?n3BpU zx1!2J)l^4)jWpFlzImtAd{JqB5i@`3*9;CT(uCiesKZX|F(%=}lYE*`#ky%zmrEZI zB4m}-)lydjjWyF!fnw81@bnNheW*44@gac-*s2VWLz{vb&J_HJB8?*I=wgHgFr4wk zj}W3rAdMN`u*3#?kR zc*94SjS|9dv=C`yhN#mGBNhSU9G?6lL{ub5i);l^s#=3KJ%&t}ixr_b0LBe0-r(Yg zVEhBRc>uBb0KJ(5+-41kn0zpfYdElvXwVHM6Gh#}}l7x&6e+iCrfD3=F>!#cSd|tN!lJ11+ zU@+M{+*b$f^AE@kG14v;0J>w1K#*31rq=6JYzf%>#6&_Pf*}W@n(z&2d{3=pmCtKP z>&zCFpzyrp&J-p5MuPd4AurQI^~TjXJOgKTd&gQ7K#2y}<0#N}gn!rQ<&(t3Cw#tf zcxuN##^j)4?m(QGOw)1UoOHM!AYZ2qin@SkR>gvLt%^vtMu^!$Lws%1*Z9GeePCdM z03>+KPHNw*IUj>;|K!tlNJ1!H(U%|k@Tflt3Vuod@~816TyB$nnt?YP%a~>^d)g^8 z6{m6CPu5%4+G^!I&N3aX+RPV&d@zW5=R0l6@~81m>G+YOS-ZzTEtHi@Q*^AUB5KO8 z|H!(jjb6^<*X$G9+@}j4)kEgY`NL+D_DwnW8>uNWkg8BumGhXNGk5IOb@*(|_NmKh z{I+%2+PG(j@?tTM+r2ifX1wCcf?t0YfM4UM_g8FIfwWVz+NPnO2Vx9n3nmhZ0xYO) zH6#YD9{+PK$+?FIgSB&8nyEaV@;BF#vdF_b5%AD8rb)+D8s&Mor0p2Pu8cHpEqL_D zVD}F>R~Uort5IyoTY2N zR<%w=KK~t6;hx(`@R1J*4V})%4{I)eQQEv@euET?k(ILXKTx`DEgdu^&aBNRrD7fSirdDro17?8=B*Fg0k2A^x<-NvRsY9 zdSW86cNLK3Qvg%La8O&C>8)L$kbBaAQ0~`Gbq=%5h-4{QCFkvByE@Z6iSi3q`|NAI_mH<8P|5mtXw@xCMV~}R7mrfK+?hQ zz~e;K9Soaa=G{+v|1N@qfWgB@MnH&)m;?&(Ix5L65bxJ&$^HN>(%~U@Psy7mW9p6FU zD1J}PlO}2HS=l;Mx7^G1y%-&mGrz#Z;Qv`0upwY`z_x&$0eb@W2OJ7G8gL@ubila~ z^$@#Y901%3xEt^w#5KFlnm*U`gA{z)6>x{b73#{qHgY4GV1SZFejadV13_V;z@PZ4 z3&toqWatRQ+Ta2V8Z5@xkaYDp!zGl4N3&fOp^KRaZgz&(AKY)w1_wX3UB^|4>!sQ2 zYWlHS<-e+OshX^on2osR$W2o=8Es z2=soyV4tk1uD1n_Sf>12mGIT*C)s9jpG?16JRD^JM}o4Ome*fWHnZt*y+L4K#*n+W2QAsQRlP zZk?qb_fL^qU{^=EuJIac_R;&5wUpgvFRpsG%Jk`m;%F z3Y>~W8e71*hT7^7xYE!ZX#lrUpa`A>jlsL1HR!sSzUF1oCh)zbsiP6dJ@o&8BJuap zEYRA;+L)xR8QO`|B3^r`qe0eq2^DBkGMvpjaBmfE=?V%U0mMB$l;OY$*gy%mfDhzA z3WPumbZt7-u4C;v)V_Tk*wvwJ9Z7V`N~bM!#!P2Tbk0cU!CL=o6aona0~#hQ*kFg( zJr5P^I(7S}tN5|{;Wz(5D238OrP&#m-11PP4?6Yv>30Ct5KE*)848rCVd42NhWg-u zxI$U<2xy@l)$h(F|Ri&EF>+zl1dmr?A7+bz=-t)3)I_co4GcaXQL5+@<)I67dJcPt#_2VwCT{P z-4j3bS!uNuRvLEHamUD<_3`qz%YxkvO?bF=p63!AGGeUf6dijVEY`xlYZ&FEUGd06k2QF1 zlOoRy8}|a(jbXbn-5Ap~c!p`yX_wAS;|y~QoY#C?31w##>RF#o5|*>WDW(vpg^0hG;jHK{z|Ffs|bllm4l8 z3@Z6lA!t$BwI1CsNsDx(h*@!DAWq+pydOn;?Zp+06PMeYycX;O*d6{m27W)F^=y83 zrpreGNbg7sxB!6lxE4^LC%nrrl&3obqsu?;Br5~96^M+DH4ZxLq_Zx#;(A)hK#UZ# zWSgy2l@?B=LaKE8Xci%j3u}8MoQl(N{lpkODTB&<4N?|^#b`01m{QCu7BBA1vyWd^ zAkSl*W8YVjKxcrB~OWRwQM|sqUy}fG^BBUA0FTpoQCTs`slG4ROU;N zqUbM%n+J=*xiXeN{e_nQhxMJi#l*-!OHE1c(z#Q|jz}HYvt!Ge|IfJQD-En3UMIi- z>^c+01Q-WHApiVdvOjSsRV7c!RdST}N^_-t=l+P(aXT~v;x=9h8nBnAVdYPpKY6}d zZ2HZclDX8K zz@It{6DUZ75D4eUDNSO;e)pqGkf`0sQly%w!DLA@?ZurQINVCeS_N35t&nYYOmV|@ z+iQ<~_B-f+LssfN?wAu!+4lQMM(!M7Z|P>6o23kO7MY)`rRD*SRPOeU*_rI12>fv1 zN@wJnmHYlZrwhi8VT*5R6g!z0Y5ooC|074PZ^L17Q|!@>BZpE#8)nlQHa zHV@&On3T3EsR?DOQ6%bDI2i>>ZPO4@1Jei*tYgiG6BGm`CYWvzp4XZXGAuE+f*rrkbKD1DXK$79lARD6oWc1=4(41XB)GN-$7;1sT|J-WCgr9^h|d5HU0k-a5}D zg)1&GB_ax|z<;_1Tn4yoKht3UBbZ1~Y8Xl$qO8nhM2R$&f~|EaBzgXC<+`qn!)~g4 z0LNCq!sodL*PaWdBfcODnAk=u=}g|1#4i`=;@B>!%p=dW}dTeiWx>)$(~TNV$62z7Fp z4OZr?|8s15Wjhp!1-++Vg@D?jrIzhlo>AtyOL*AJ_{lS+z};-& zwHND+Nvx<-c{vP%pIqGeE4`V`kitPdJlYIo)0m&!-sCm7=3b!11S)I#9%{6=Lm1}` zBoM3IGtWGj^>U;Aw!38t(J8g{2h^|&mo=q&hHsRoZ_O7vTCKKwBw><+x2*nm`ex$B(a%Z9R$ks(9ZqHevT7S8*Pdx)A37wX2Bm)8ANHT4JmSo96GierwVxZ-?K8@>c?2}tj?gxmW^%wae79B9aW z`b_Gwc)m;L?*tI>Cmn$`8CEk^r1oPbjhpc_4a@!VfIHFC$T9;f{|QNqlhy?Zj^Gc! zFtvd_+bI!a3QZNmL`~VdnBo`P9*Ugw5xQ&-CI@>y7rBp8pSy!!&+?&W7F{9H z$Cx@EwAHHh3@`gmNc`#D-)l0U#H%6ILddZBGA}zjHC!ob_M|qO(rWG$>D3MQI)7~f z28pU*caMuR&gWDg+r`2b!}%ujbIstR@GjcBjygK zkqriVHLQ8`q1+2|7S*jXQ&~qx7%NYLQeE8IR9NHm`KVS`ww2_2l(g*$0?ruv!$Cm6 z{~5v!YQl3vJpT2s>!GMN@q`=Cx7TlY?;4enS4o6z@WD#67%1j8$q;0uzrFCVwn_arMFt;j+f8kG*2C{kXiq1+ZGdS>F$fW z+GSvmWC#_(R}`2)2*YWuQgZ$MXJAs`ed;8q`(=F+ICqJ~FugX%^?)xjvOCnsAoZ zEmk$&mQTJW3n;$X-6U?voZ0V{1oF~NGj;FlT)PM4Qr?N3-)mTV0(-B%N6t5Xy0^6E zZDCqHmBMTA-T5VXnIlntM&tz@36fs}4=nb`4jR7MzeQfV+5*^6Zf#bG8~X#^fhLGi zM07g-&#-yXEZyR^+l7fj;sSqhM4!LF6J5iIv2f42-yAah@mUxEwq3W7e$w9NPv)8% zw0Rx#SIl}TlDD+NM}(Wv(2~Sl(Nsudv{G?>TCbZbv6RQTz8F)pES;t!B`3+#RjFd) zY1eeLG?Gt~NKa!1EE;s1iuH76n|F?G0$gKR0)&)GG(GSM>VnRlJDhiVL)BI^+%qm7 z=G^s3|HZ>jIw+{DI5(kkH1nZVF~q|N7fQ)RPL=MQ=Mk-H2q}jal93d{y^T(h_{EXf z|N4k(2ru<8<1!tX0+j?vB5}xlVTNnlGfJ1Yb0|q;SgBmJPJttvS=bZB!*!UsaX*R* z#&aQgD5->EssV-Evi5QUvF7S!lm>MTF=OikwFEUU-Q2Xf_Ji87HyhN4i$n)Gp(O*6 zXb(!#*!_&)0Y21{`u)m-3{=rF_1+|~Q&JoxCgx!*w%)^d=wzi1vnw4+uM93j+?9;O3k(sh?r~(3d?{p)DXG-yS8gunAUBxfs$MHsmT_As3G`|0_Cn6JiD35~;5nFP zVTr;HI@$L4$-dyl1X%ur|M$X&U9CgWJ%cn@{7sWNya$q?*wGdT;_+2glSE@UW=!IA z-9&Y9j__KUqRd;5w8fdQbo?bXoSn<}Tm31l_F&^QWan|&l;9pc{?MO-vk&(R?ylRu zUeX>svN&%h-sTH%4w~7iw@kaecL@#p9WUnn=yc0`@xs!zCpkBWUHgwy^jwY%RG^Z9EC{E7D(oMko;Hm=5tQ8rNX;r6Tu_Es+D4j;D4#1cO z77_EvBgVu9G;@Ao?egTG=iDQfF~Qo%e$wSldHqXxoq5MP+ibf)a;d zY*Nz6XDLPs88o&U2AD-5qnbH-$&YE&V6L6TMwQ#9l{NRRK|_Z_lPLU+b9%*_h2kch z?*x4@WXC)t2>uiNdSc+~Q~wY*Y$9y{p^$jH@EN``Cxdk%s=Fk8SwQw#{7^OMwj9Lu z)|@&Y>l(;THOrsVO=$a4m&wqZ#e8B}OQ*;|GDIjZUZGd9icd_%a}gM9U#CxnI1m0U5RXB1}t=NIm6Txu}>bHHmZb3S-i5 zS)L&?;XNXaLSmgFp|P53+V(9FNeE@nX4yqXb9i;0BZ-+W^O2ccvdDlDWk+d#o3jPH&dj_6jz9HS@n z?^OEb2c$Y+{G-e+nev8>?~NRa=vP!9-nF^UOSPck1>v%49WmSmt>)XjdOuiLFIrZk z!-qSdF}~Gn@Hc>a6LlZOQ1^?ou<|pT2H5-O-e}wV_j2Nfjo6iGR<93uJwVo0BWeMK z*e)`I%K&k=$aJK9rT~X}7BSc66hPfZO&ES@n3)r+g&P#@JsnYo@^Hp#NtgcMV?31+`On^9=V3z2}1{pOb7 z?v8=A-G3uuVnq1*gWjn)SO}4o5i~NQ)76XJtfHfiD0ki@s5|)tld@yY=oWaaLZ5E` z&2-pI7D&tavN97FAP3GDp zvgVAUPgcFrWHIEFa}@!DkWy~2##rVml2tCo(B~DCh{h@%PGZu5X*sW4(Qe!vTL+IV zgqBrQZ@*k0Cp7~@h-H~bTcY5S&0iJZgx_)WRGN;>p;-;m61>D%%TpA}7zFJ)7gE^B zHnJI30iWTqDkCIW4EK|cj}`td#x0=mFrweOt*E~55|Atp8@cf*63J`@7^JML8(C!R zqeh=m1XiiEJtOeRO7^!dJYQ^tinRhtiSelEtt~Qjo1c?jORJNIoz5r+(L*v;X)xJF zZ4S|D6`?4g7`SRs^)2mwMJudq^EN~^nEax)g?w@0Jqg%MB6DCCf&SC@{Li_DW#gul zukeg>Vp+aexe97@SGI}F#yYmbBV#89zC3$-$H{+)8#WR*fE$UHQCg!*v%;sQFL%^7 zdDe4_w5ur*lcLU)$EvmEhj=nUbPYA>H7AcPH56!RFbC6k#zJ5*H#Xe;j2m3m@>yTO zoeXrrLyVQFbC#{)Tl@pE;&N_Vo$I;L< z6d)Xmuh&VScQ0iE*}tYU_J=?4nyBgWgXiW}~V5-XQx z`@(~mI%r)|P-;=@E4y;srpb8!WE|8%N=Mzc4InKMTbEOAwFjgztW?{~%(rAkN_wGX zSN~x0JOo`X--Qn5gu~56j^<*7vkzWSy>f#NOhHuN&8yvZkH8<$ZQND+)J{g+u zIM$XHs<$p{+Nlnx3JF{=B{8ZR;IWIuZZ#r036EAV5V1E|2q2vdoJR!M8fZ0N;qcuD znUIQcw{1hEiMhsB6LYL!8niW3hn7{mpr6+_c`{3)RSC8DjTN+O?VP>)jJ|%(2kWmO zY?x{(Pap4FzOygif>+&=U^{>t!qg|;g;!_Q(Ik3NsiG zhtt8yRhJ8L{JA;IVyiYvRs0FB`UX$+3UFLw_RP8(Fb`5R;&C#jd_i!|rf0A8gqze_ zNQ8HRn09%U-Wrh*KYw8docL=nN zXA_PdxE?I3*Zd zAo-#G$q9 zzy1WDm!}7#5JQzr7Bh%&0g2rvDaMI-Zp;aiA#25w?dJ*D1w+^WCMl&F5%X``3cPiHhPwhmEpJDlaAEXkr3InE`w3=qnk1`&ac#8o#Ae{41xf;Pe`ml--NzB-{EuKs2aKvsbu_ zV1p8PMO#}6bGWjXyK*-yY=wux`#ahiy2>)Yqwb1K=8#>0m3Fk0i&awHUMnq2g9_uv zR(33ah1WK!1d=6Er{dkXADXNSMCU^WvR*XA_cs zIow_P+;t-MbO6%+Y!$j|L15_K+h`V!q|la1SoK@8MxAd7BWi@(AVDZm#?ja4j}V_sXr$!sc*fP?Ouv15$LIA18X1hZ7CGP+pL zZG*0!C9tlbGcI!6*h#rTD9o{i7~ls;nI)82T>Z`{uj8NgpR%AIoP>uyjNP4th3nyA za1-KlH^WLTif*IuLNQRx)WyA9QybfSAK{aF`!WywmdMcsH~-){v-&g~5w@gHf`?pU*1KYvR-45jtV8oHj2u z&l4-DiohdflnslcAW&^h*n)9y;{>1qN&p@KW_`)}olP_mpnPXE&{AcKG(k+Pv}jLO zRHw2e97JnHc7VF{VyHT5ML5c4c409mF7`2$xn*A(!(vaI3jwpMt7l{W*~!aMMF{a( zVnWrgh{Y$2wp6SPI_y+2K?b1Q0|0Y;` ze4$IA3Bq7+?{;AHD5X`{FZhftF!I}gn9qI-3!7ECaNBatB1d=e3*RcsX#2^jA|B^$ zEOehTA2%%*U|&kdLMOk{1%qw4?7-@gY!+n=W`Q?TTqE*WOg`dr5x!y9k}FSgO0~;` zMSfwMR;#eWDp;#qBLQDPGKW<`Sx!Ww$qC7~u9dEu0L0>IxXD#m3k@c#FOT!VD)&-r zO))ThJ{c{Xj~~lspkP63(Nl{+!g+ga6hFkFqfabi{g28w=UfOR-Lt0rSYcqOuyGsB ztCa1uDXBg(V|1#d#jOa!yjGq$kwI`Hk?GkCf7Y;S6Qu%&cT%ex!Jl`yH~&dxu}o$* zH&<_wFqsw;ho(mwjR+i!fGjeM9|Q1CU(E%M$jZ-hapm%8wc6a5q%T;0_$Swqp8#dI z!RywL)?C-(*-SJ3BLR8;k2)O13H{9Rd>TQIg??{4o=)_Ey5s)y`=*Cqea(KtU3~tz z>ET1KIZgn@9b+|H?vb(omcP6Cjh+=pIhy(n|K4HF8WqVs0@W&oC(tSwzD3elCKfHR zYF}J=Fy4PKKq}IKh=tVf=qLt$%wUik3FtYCXU`f+$%z%^?D!skKF!?nP4}{&kd4F3 zYgzeFJ&R!waH*E-9{2}s#gO8VNs$+6$p!vV&If_P6;~p}m#1hM#|Z0f1(#d!71P#l z_vTfKrBSmG72w+q@*;vLw_G6ey43y=V%F_?8Fv+lxP(>py0`#>0xI~nlW1Gv0n7wV zBVS)>b?r21rO>Bn}XNoeB7L<|W-_8{09s8)+*DN|F8cS^IJ=rVDns%n^|p1f6EYQlfQS`y-dDq;8sWVNJO%*i zt8?WwCKadNlbmh?zKtz6nkvh{d?_)g~6)sx+xj6Tcyr9H#uR9(Imc$g;k z9`Ni1zfG-c_P!1ZOw)UZf_p1k`x+1R0ht?ftSBu5w#Vd&HhsXvZ={1v_#Tt{6_*oK zwLnX2prt^nVrkIpA8aTpyynGceHry9+adu_nvWeH$Bl!f9>T;JLh~ZVi4$N{!0cp_ ze$fzE*EJ_B)}XW*yED_XQ`26_OcR4ArjUE@KFeO12xz9@um@WE8V~n%P45K-CS+Zz zsmP(9e<}0Q;LFRf-5}h4DSM{<;%py7wIpi;7Lb0I{2nvCFu50&(vY0=!S8}fYda(f z%P?dE*IkK|#P$`~NM|mXQOQqJQ&5lYeh9WF5;O^K*CJzYdNZk8^zWK4`4HWb zX7v?%QXWnB?)`feeh4f*|8%IexP_QJ`6pCy-bF?ZRjK)hL9JNhfyGjiGZYo!7)zLHDG(&)3N`J#O zC1#aF)Ay*hp~52IaWPwj-(oDk9aGK$m?O~cY$KP7h-(RDOIRn zd1$8aWJll($b%I1I?Q9mVq`Txq%ZWVYA6bE3EC*mvhoIrC@+a)#SgI!XnTsCET{WS zylncp*Dnq2Eef;<_N=G)KS$m98_51kXBzlaU0hl`i?wU*nb?})ijtgQ$!JZWU`a5O z<0dD@Fk<0v$X#d_xuW;^ijtD|yImoY(N;|hb)%#A7kN{X_PJdWOA!b>9y3Jl==~Vk z$C`-e6^S~peSTEpeiuZ;N!qCr`!EbeY|Qif=3&hMch`OUv5bM(=fOV(ETaCl%TLZ| z&d2~%-6gV_dCoPk)oIvpWXYLo)GRX-pk&6=hV;n|cv&(tkV@4hv4!ylkjzRIGSncK zO=h~8ZnxQsH9)HAIPn+G?QH0J@NR79xlQd^cV_nfSCwc248C2eke5`;OpB~vXn7gd zJ*>C;X_Ni?AB#SNhZbcWg;6=Zq8HcI0KFgLZLs(BrSBaI#Cwa53+=}@C%?-3@>Q@L zQnubvxHcri)QW>p_}e(;iqDs=MGQZg3z44%bY$hH}0)n=W`YWpeE~f}!(wyBL1~Z@G2} zj7niD^l~qGz1!qBdkuI|5x{{N)lFGZYNFx7q+v9&JMmI?d()+F5{VbtAD@);3_2jm zvt6QOHf!1jdIkB_ZS{P^F!cav$k=XKuWXkZZ^6P> z4Oqeg7nR-ubwK3j8TotYEG&m>k)iwW&711Nxm9#kfgw*A$Tx;1Az?u_moc*r5d$=c zwc3``lh4nr&Wh!h*p1~3sjbE$=?(GR5IpcJt+1UIx0;=r4Pj%;$r5xf&x zkl?^sg&xpH>z99Qf9k-#fLSf@;7xp1>;4%b3?4fNj{yoi*6w?5sG^qXrP9n)P5?57 zX;{}7E^R0)kz_a4cTJDBxzBaLW56&mx0IsPAbl+(n3lEzG z!X>;z)tglChzJXQSA3G7UQ9&~JKI-}u26{vL%L(k{^ol^Q9fU&=?D+ks1X&e0u`dE zl`Gom`guC-RM^i}x# ze=ZdC<4nVJMFh2$(N2co_1dKkBUT(02(4 zrih7XnSG4lOG8OXr#jS%s_lxam9kC6LqLC$to0(OLW!>R-U$2 zrfT!EQ>uye;;_|K$<6G+egzX?vh%cj%)Q?;FqGp@z!F&CzP!+`E)==BKQu6y<22@3 zOdqCZthFMql#^YkRPc)Jh7xJ1$S!`ym}x-7z}nt1i^%2j4EToKY-1qppW+)6Yi^wS zXHpdi3`ftH7y4p6xBC0*>pw?gP1C>+cNu84;yjlEu?A)>s%+(}HMMlLTgm(@_tfB# zmbcDO93O_L>-Js4`t#FYwU4c(du|JV<9)(E!sfnVi)F|Hk|FqMB6@TLL3oKkH3GvO z-_?BbO53)frGz3px+?}J>|k*@L7y3<{Zsz++JUbli!XA6rHrnkS^q7@gEvF z|E+K>o7&D1c)|uqKa-@72;1A$x)Att`wHCsgMFG$%iTy~U*d>ucCeAP`jx$dwN=xT z6~R?Ur@FV?z7L$D{};I!DZJtavLEQ*t$UG`XOcdjUurx#xGyMM5z-AE)E^HND)t=$ zCcp0&E-{=M+#8e&4<0m}C@#!ZbVN5kUSOU;LWUQq`j5UrPswOVi?Ge*gEs<;MNzc5}lFzLP~k zo0K-jmveV{d)lX`k8kWJ5`O}V&R>1Z-`zGfo!qyHNS;S0#MtDP-mQ!%C$n8yEau~( zpgDE2V!Wt|sbNvfESajXmG9ydCm)1|zIP;3gdfE*n2B%j)3AyUxjL+w!E2QL>Jlw$ zDE+|BOv}k-RR$#zn@!5Yu2I|4i@y`_;vF}ik@93_DNoCBFGF{NuZIcic9)DRasAc! z;gQmDByrP!3^wRqnEz&kxNi4EB~#V4l}HlTHc|Ic4eI`K)+xUo3F7sg*Nxi><-4-F z@)cQ~gLyjZ^;(^6Z^~P{G3iNesdNnC|8=pzFEBa@6$>D3YDF z)P;Jd6N*AzRB_hI36BqCpG4fx0yl0|9a-u`eO9$nRiUoMvOs2Z1mAt*6@S$T+MGBOo&qR1FP=(zZ&gbp;|+Tqe6A*r6H#M3QG_lc zYJ4T=P!r5FGETGT2Xu-2@}ORUz!))vt3YADBpMqm{F)%wtBuBWadf#|}K${#%BTehW~ zm*(}k`xEf4Pat*fZ|vC;z|*hIZNQlZ{8Rb;C4teZ@~2l7j1lP7=nZzS3ZbAe1hxvR za4Y36FE;MD?WYo;T`1SAiUFu`&Gcek2%m(=m77U?)Y&+*no5+$GaKJ5n&o2Ndhzmb zi(Gn;w9GwqP8I+ZcAlCnoTx;ta|j&6d7ManE=1Y zXP$t^kIUH{p_47P6tfq74K(d9H0-puS2E)Y-CSMW$MpEiC}95 zfld`BTy|n~3CDi!sT)J#+|jh^kylSbz4~rYqkdzU_8T?;FWB^iiz?+r5|*VZylmP6 z@PbcW^yV}~XCgedZR=)K9+rsL0)lWz$n-Z;fqT&;^e-u?bXQzRD^A|Avf;JGJ&1QQf7hD#Foxm_ zoUad0Jfj!BHgkS@%}DU`9-i--n?${$CE4j^kNJe;KkXXA?NycKdhrg4>l;IoGm~%r zI&`AP#RZfCl>p4UGJuQT&ZyV4UG9kgHu#4BrZ~p`06wj6T>DNCpIdp5D}FA+F@Xz5 z_viQ@6Y!$_fbM6@L)qI0&GLF(Mc0JbH+9;8^TpidXYQA}iYIQUm+nG38J?(mGM9=y zudoa6zEDRoH|Nk(9gz|}mxDO@U1Ig5x~2BwleZs!vYI|2 zl6pry(R{76K?+=+-x+zS&)SsHs4U4<`(5E=rJgu(9kFZq%cQ(YVIxd#S~J3=0#&b{ zyYJ`Hv0oC;NiPq+y(0@RX1DgfqgL1r+~kN2uQA>}8KZ(P>E8;>D~2=$M;knQj=|+g zKzzxHMcq@xwRGvXooLB>YuciiO@ZvDSuq!$|Db^w;L8amduL0qk)PcB7w&Mi<1V^Y zM=Nt9@1JYqLF-wqAaHo%^z4BOZnE;iN)VvW7;=4H+O6O!O)2} zQ}>+I-L1i+p+@w+#MMaB%-khd{*h>PV4_!$SdlMjCt8BB>6kDAq%~4+C05L~-AAt# z#QoVDw1b$HQXsp33)WVGg+XbbwQO!Y;oytuyPU7R{`eSZwO5buy_^iBb*i z%*f3dsaLd$0k`3@=bjjJJQJTYVrBN}VLxuCWqY!kl_h&MY7%s6PCSN@WKn`j)})sc zYQ$tu%4c28aaCcb-sZ;c zfvOct(6}OZuDLDD0up!5&3uR7=R1ATuf&VCNF!41eKXp zzU5se6mML1hx2S8>2R}Z6Vi#fVG$G~=H@a&rcF_%Q=erm8Pv{(2?m0@+K!K1K`Z=491S}-M@6+NiuU4 z+&rn6``57>t(dMGa`r@Tw4*DB%!Xy%xC1Ne6gGeni=zgCIYuo;@tl?=@^9t7FFmSc z(6*--lLQZ{q`GuE?MQb?vFqLVxFuOM9M!LZ7w0-zrx+K5VS*Y#d)s zkITKAG}&9Zr{_+J@8^1Rnk7K9x8jW`q^@QR1($U@pH^L7D_U3KY;BTCI_96s&X&|} z_c23y?Gkpn&wh^}DX$e!4TJd}I401EBZJ=Kd2MuM_p z+Lbt~r%%Zk=OZA7Iu*`<^Wg?K3r>eCm)9hJjQQsWSv}sW%M0deq>*2kn(q$Ucux3H*Sn=!YrjEf2hvS1>bYbcygNOFMk`GvX0WWsYz=uUzxP_V%<5a@9$4qaz7pkeCB3F)@{<-$(*s^Ih;L+ zw#7SgMxcph8S0LVS^fBF8a^}LjHD^n&^xE*{>~Ee3+!VkE#Z2*bT!ew&Z{O`Y3us% z6|tvLS!JTerRG5J1PTzK3taGnY_NfG6SdOx)@6VLqo~^n1H&;iWi-*_Sr!gp2Zf-TsEv8!*gN+ye7s)LBWD|(8H-N9lz+oaB3)s+ODJDvf{ z)3REheZZ$SVZ6L(gA7=_1x?w7V5$k~?uv^ONI26sfgof=%C#+c0rt0l^K!Z|D-6xV zjz2F1_$Lc#5sm`l#wF@3JnM7q?LAy0F|9NTC~k-nL=U49)?}hEXdP_eW7XX2l#j_J%)^Kx0i335=R<6rfX8K~lG&q;^7C zMliTuf5lCpfAxlgO4u1nb@rVYTYs>a@z~OrP6RY7OngD!jlBKL@ zzRWT|fcg$5&b^?7U{)hDIOioVkyG z_hWL6`j2O#*=rJ1aRCA~zIaAMsPe#mP!bjZE`$bYyo(ZB@zp;Y8YwltYc-hNJpKEX zmF6YP+s&ajEo%o}J>ov8_Z0W*Tvq2#rk7KeB};S*d|7~FtbWD-k2$E1y({MQX#Hgm zKA|1vCp~HT-lbrFOM5Tck9PUt6OGLWWjZd+BVfL{S7Qyx8}`lM)Q`{T;fX}U_qAbM$5R6drI&H%ale7rs;S^RO>5Bf>Yzplm92>;_e4AZ!eoQyyQ>$FvoC^yP7 z$AX2+mC0qJe6m!LFs+Rr*U%-QzaXP#9}QyUa3dG^WPu(NQUJ+TP)W61Xw4SGri~gE zwP@&&OG7A9^yAFaxsZ1*3q^MP5Qf>rDX#vxmUID!vZD~FGL27*7(KET5Km=_!k!BDLvTvxqGL=M@G2dp45Xo?a%VdAp zWDg(@200Rr`8&9O0tkkm=9&)&NfK{?B|3X$y|C%T49F8NJ?B!e<? z3VM%EKvYOrM8*4(V&Y^zz0RSh=j<9g0v77{-+6oXfTEVH6c3EMF=qv6R}J;!%U&V`0Y<{ z5h6t?(Yq7)>wPwo_|vV@r0Xz-OuDGz$(AG6>J)6T)!^`g0Xcuk|+A zXp_yhC{UKv6hHu+%DksMVs7gLu}lk+Pb z4)>eNYGOWN*{@kTGTz#yQ)fc%Z6WiewOn_d#tJ6y1~+EXL$#ELeK49Dod2XpFcSC<5^8_Gfz$x@?V6s_4!T@)aDLB^^*KZ76rDyiTU}DDf*2{r61j^hy4QB( zc?+TUFv@hMX<+I^wiYzbxL6U1b)jit;4F2}YDwJ^9-^_)$tO*LE?w$jGAWExLG|-c zmUV3ZR8#rh1x`jZOR&F~z{||1y+hpVGZw9I(WgZK9 z6l*a{>Syo!q~Tj7*!c!KqmfI#McH4QLFbYv>p<~+iA;F2gbEqiqu!pu8NERq1D!z| z!V_icAQo;F{?eAl@K3syfJMkj;BhGfR?HVB*ayuoefZGkTiX-7B{9QF!tfCOAx;Rv z+nYCVWEF=ja|E?X{?dU?VsSI`M5dMUh^iASUZNpkTpd`@hTmSR%=1z7P^yq}rW?@} zd~zbaC$%&PAR2ekF=8=7xg-IRM5d+9ok3W1mZ*K{L}(zr$AhAbg+4hbpKvjqWk#-M z&1QwgLv*R}GmD;`BRcUU1-|?njDsRn6pv^9xA$Ea3a!XFD^cbFwI5z+x zGIPQse{?#T>hx`QYQV2Lkv2sN5-E literal 0 HcmV?d00001 diff --git a/admin/admin.css b/admin/admin.css index e152db4..f4baa1e 100644 --- a/admin/admin.css +++ b/admin/admin.css @@ -802,6 +802,15 @@ body[data-admin-mode="seo"] .json-details { display: none; } +body[data-admin-mode="knowledge"] #block-form, +body[data-admin-mode="knowledge"] #empty-state { + display: none !important; +} + +body:not([data-admin-mode="knowledge"]) #knowledge-form { + display: none !important; +} + .hidden { display: none !important; } @@ -1669,6 +1678,221 @@ select { line-height: 1.45; } +.knowledge-editor { + display: grid; + min-height: 0; + overflow: auto; + gap: 1rem; + padding: 0 0.2rem 5rem; + scrollbar-color: rgba(255, 255, 255, 0.25) transparent; +} + +.knowledge-tree { + display: grid; + gap: 0.28rem; + padding-inline: 0.35rem; +} + +.knowledge-tree-item, +.knowledge-tree-children { + display: grid; + gap: 0.22rem; +} + +.knowledge-tree-row { + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + min-height: 3.1rem; + align-items: center; + gap: 0.28rem; + border-radius: var(--launcher-radius-circle); + background: rgba(255, 255, 255, 0.035); + padding: 0.24rem 0.34rem 0.24rem calc(0.34rem + (var(--depth, 0) * 0.82rem)); + opacity: 0.86; +} + +.knowledge-tree-row[data-active="true"] { + background: rgba(255, 255, 255, 0.14); + opacity: 1; +} + +.knowledge-tree-row[data-disabled="true"] { + opacity: 0.42; +} + +.knowledge-tree-select { + display: grid; + grid-template-columns: 2.2rem minmax(0, 1fr); + min-width: 0; + min-height: 2.55rem; + align-items: center; + gap: 0.5rem; + border-radius: var(--launcher-radius-circle); + background: transparent; + color: var(--text-secondary); + padding: 0; + text-align: left; +} + +.knowledge-tree-icon { + display: grid; + width: 2.2rem; + height: 2.2rem; + place-items: center; + border-radius: var(--launcher-radius-circle); + background: rgba(255, 255, 255, 0.055); + color: var(--text-muted); + font-size: 0.72rem; + font-weight: 850; +} + +.knowledge-tree-copy { + display: grid; + min-width: 0; + gap: 0.1rem; +} + +.knowledge-tree-title, +.knowledge-tree-meta { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.knowledge-tree-title { + color: var(--text-primary); + font-size: 0.82rem; + font-weight: 850; +} + +.knowledge-tree-meta { + color: var(--text-muted); + font-size: 0.68rem; + font-weight: 720; +} + +.knowledge-tree-actions { + display: inline-flex; + gap: 0.18rem; + opacity: 0; + transition: opacity 160ms ease; +} + +.knowledge-tree-row:hover .knowledge-tree-actions, +.knowledge-tree-row[data-active="true"] .knowledge-tree-actions { + opacity: 1; +} + +.knowledge-tree-action { + display: grid; + width: 2rem; + height: 2rem; + place-items: center; + border-radius: var(--launcher-radius-circle); + background: rgba(255, 255, 255, 0.07); + color: var(--text-secondary); + padding: 0; + font-size: 0.82rem; +} + +.knowledge-tree-action:hover { + background: rgba(255, 255, 255, 0.14); + color: var(--text-primary); +} + +.knowledge-tree-action .trash-can-icon { + width: 0.92rem; + height: 0.92rem; +} + +.knowledge-empty-tree { + margin-inline: calc(var(--admin-nav-pad) + 0.35rem); +} + +.knowledge-rich-panel { + gap: 0.8rem; +} + +.knowledge-rich-toolbar { + display: flex; + flex-wrap: wrap; + gap: 0.35rem; +} + +.knowledge-rich-toolbar button { + min-height: 2.15rem; + border-radius: var(--launcher-radius-circle); + background: rgba(255, 255, 255, 0.075); + color: var(--text-secondary); + padding: 0 0.72rem; + font-size: 0.72rem; + font-weight: 850; +} + +.knowledge-rich-toolbar button:hover { + background: rgba(255, 255, 255, 0.14); + color: var(--text-primary); +} + +.knowledge-rich-editor { + min-height: 28rem; + overflow: auto; + border-radius: var(--launcher-radius-card); + background: rgba(255, 255, 255, 0.04); + color: var(--text-secondary); + padding: 1.1rem; + font-size: 1rem; + line-height: 1.55; + outline: none; +} + +.knowledge-rich-editor:focus { + background: rgba(255, 255, 255, 0.06); +} + +.knowledge-rich-editor h2, +.knowledge-rich-editor h3, +.knowledge-rich-editor strong { + color: var(--text-primary); +} + +.knowledge-rich-editor h2 { + margin: 1.4rem 0 0.6rem; + font-size: 1.85rem; + line-height: 1.1; +} + +.knowledge-rich-editor h3 { + margin: 1.2rem 0 0.55rem; + font-size: 1.25rem; +} + +.knowledge-rich-editor p { + margin: 0 0 1rem; +} + +.knowledge-rich-editor img { + display: block; + max-width: 100%; + height: auto; + border-radius: 0.65rem; + margin: 1rem 0; +} + +.knowledge-rich-editor .knowledge-button { + display: inline-flex; + min-height: 2.75rem; + align-items: center; + justify-content: center; + border-radius: 999px; + background: rgba(255, 255, 255, 0.92); + color: rgba(8, 8, 10, 0.96); + padding: 0 1.25rem; + font-size: 0.88rem; + font-weight: 850; + text-decoration: none; +} + .status { min-height: 1.25rem; margin: 0.8rem 0.35rem 0; @@ -2469,18 +2693,57 @@ select { width: min(28rem, calc(100vw - 2.8rem)); } +.knowledge-button-modal-layer { + z-index: 300; +} + +.knowledge-button-modal { + width: min(34rem, calc(100vw - 2.8rem)); +} + .media-action-head { padding-right: 1.25rem; } +.knowledge-button-head { + padding-right: 4.5rem; +} + .media-action-body { padding: 0 1.25rem 1.25rem; } +.knowledge-button-body { + display: grid; + gap: 0.9rem; + padding: 0 1.25rem 1.25rem; +} + +.knowledge-button-hint, +.knowledge-button-error { + margin: 0; + font-size: 0.78rem; + font-weight: 650; + line-height: 1.4; +} + +.knowledge-button-hint { + color: var(--text-muted); +} + +.knowledge-button-error { + min-height: 1.1rem; + color: rgba(255, 123, 108, 0.95); +} + .media-action-foot { justify-content: flex-end; } +.knowledge-button-foot { + justify-content: flex-end; +} + .media-modal-foot { justify-content: space-between; } diff --git a/admin/admin.js b/admin/admin.js index 8c41ab7..f894c0d 100644 --- a/admin/admin.js +++ b/admin/admin.js @@ -1,4 +1,5 @@ const ADMIN_LAYOUT_STORAGE_KEY = "nodedc-admin-layout-v1"; +const KNOWLEDGE_ROOT_ID = "__knowledge-root__"; function readAdminLayoutState() { try { @@ -35,12 +36,17 @@ function readLastMediaDirectory() { } function readAdminMode() { - return readAdminLayoutState().mode === "seo" ? "seo" : "content"; + const mode = readAdminLayoutState().mode; + return mode === "seo" || mode === "knowledge" ? mode : "content"; } const state = { mode: readAdminMode(), page: null, + knowledge: null, + knowledgeSelectedId: null, + knowledgeSavedSelection: null, + knowledgeOpenIds: new Set(readAdminLayoutState().knowledgeOpenIds || []), templates: [], selected: null, clipboard: null, @@ -52,6 +58,7 @@ const state = { filePickerResetTimer: null, deleteConfirmResolve: null, mediaActionResolve: null, + knowledgeButtonResolve: null, collectionOpenState: readCollectionOpenState(), mediaLibrary: { columns: [], @@ -140,6 +147,7 @@ const BLOCK_SEO_FIELDS = [ const el = { modeContent: document.querySelector("#admin-mode-content"), modeSeo: document.querySelector("#admin-mode-seo"), + modeKnowledge: document.querySelector("#admin-mode-knowledge"), sidebarTitle: document.querySelector("#sidebar-title"), workspaceRole: document.querySelector("#workspace-role"), editorHeading: document.querySelector("#editor-heading"), @@ -155,12 +163,14 @@ const el = { status: document.querySelector("#status"), empty: document.querySelector("#empty-state"), form: document.querySelector("#block-form"), + knowledgeForm: document.querySelector("#knowledge-form"), selectedRegion: document.querySelector("#selected-region"), selectedTitle: document.querySelector("#selected-title"), id: document.querySelector("#block-id"), label: document.querySelector("#block-label"), template: document.querySelector("#block-template"), anchor: document.querySelector("#block-anchor"), + targetOptions: document.querySelector("#block-target-options"), enabled: document.querySelector("#block-enabled"), contentFields: document.querySelector("#content-fields"), json: document.querySelector("#block-json"), @@ -210,6 +220,15 @@ const el = { mediaActionInput: document.querySelector("#media-action-input"), mediaActionCancel: document.querySelector("#media-action-cancel"), mediaActionConfirm: document.querySelector("#media-action-confirm"), + knowledgeButtonModal: document.querySelector("#knowledge-button-modal"), + knowledgeButtonClose: document.querySelector("#knowledge-button-close"), + knowledgeButtonName: document.querySelector("#knowledge-button-name"), + knowledgeButtonLink: document.querySelector("#knowledge-button-link"), + knowledgeButtonTarget: document.querySelector("#knowledge-button-target"), + knowledgeButtonTargetOptions: document.querySelector("#knowledge-button-target-options"), + knowledgeButtonError: document.querySelector("#knowledge-button-error"), + knowledgeButtonCancel: document.querySelector("#knowledge-button-cancel"), + knowledgeButtonConfirm: document.querySelector("#knowledge-button-confirm"), }; const STATIC_FALLBACK = { @@ -223,7 +242,7 @@ const STATIC_FALLBACK = { logoAlt: "главная", brandLabel: "NODE.DC", links: [ - { enabled: true, label: "О продукте", href: "", target: "index.html#features", linkMode: "target", linkTarget: "" }, + { enabled: true, label: "О продукте", href: "", target: "index.html#platform-composition", linkMode: "target", linkTarget: "" }, { enabled: true, label: "Лист ожидания", href: "", target: "index.html#hero", linkMode: "target", linkTarget: "" }, { enabled: true, @@ -233,7 +252,7 @@ const STATIC_FALLBACK = { linkMode: "href", linkTarget: "_blank", }, - { enabled: true, label: "Тарифы", href: "", target: "index.html#pricing-wrap", linkMode: "target", linkTarget: "" }, + { enabled: true, label: "Тарифы", href: "", target: "index.html#pricing-intro", linkMode: "target", linkTarget: "" }, ], }, notifications: [ @@ -496,6 +515,7 @@ function setFilePickerActive(active) { function recoverEditorSurface() { if (!activeBlock()) return; + el.knowledgeForm.classList.add("hidden"); el.empty.classList.add("hidden"); el.form.classList.remove("hidden"); } @@ -513,6 +533,15 @@ function clone(value) { return JSON.parse(JSON.stringify(value)); } +function escapeHtml(value) { + return String(value ?? "") + .replaceAll("&", "&") + .replaceAll("<", "<") + .replaceAll(">", ">") + .replaceAll('"', """) + .replaceAll("'", "'"); +} + function getByPath(source, path) { return path.split(".").reduce((value, key) => value?.[key], source); } @@ -565,9 +594,14 @@ function ensureSeoModel() { } function setAdminMode(nextMode) { - const mode = nextMode === "seo" ? "seo" : "content"; + const mode = nextMode === "seo" || nextMode === "knowledge" ? nextMode : "content"; state.mode = mode; updateAdminLayoutState({ mode }); + if (mode === "knowledge" && !state.knowledge) { + loadKnowledge().catch((error) => setStatus(error.message)); + updateAdminModeSurface(); + return; + } if (state.page) { renderAll(); } else { @@ -577,19 +611,37 @@ function setAdminMode(nextMode) { function updateAdminModeSurface() { const isSeo = state.mode === "seo"; + const isKnowledge = state.mode === "knowledge"; document.body.dataset.adminMode = state.mode; - if (el.modeContent) el.modeContent.dataset.active = String(!isSeo); + if (el.modeContent) el.modeContent.dataset.active = String(!isSeo && !isKnowledge); if (el.modeSeo) el.modeSeo.dataset.active = String(isSeo); - if (el.sidebarTitle) el.sidebarTitle.textContent = isSeo ? "SEO" : "Администрирование"; - if (el.workspaceRole) el.workspaceRole.textContent = isSeo ? "SEO-режим сайта" : "Администратор сайта"; - if (el.editorHeading) el.editorHeading.textContent = isSeo ? "SEO сайта" : "Настройки сайта"; - if (el.panelKicker) el.panelKicker.textContent = isSeo ? "SEO" : "Контент"; - if (el.panelTitle) el.panelTitle.textContent = isSeo ? "Семантика и сниппеты" : "Редактируемые поля"; + if (el.modeKnowledge) el.modeKnowledge.dataset.active = String(isKnowledge); + if (el.sidebarTitle) el.sidebarTitle.textContent = isKnowledge ? "База знаний" : isSeo ? "SEO" : "Администрирование"; + if (el.workspaceRole) { + el.workspaceRole.textContent = isKnowledge ? "Редактор материалов" : isSeo ? "SEO-режим сайта" : "Администратор сайта"; + } + if (el.editorHeading) el.editorHeading.textContent = isKnowledge ? "База знаний" : isSeo ? "SEO сайта" : "Настройки сайта"; + if (el.panelKicker) el.panelKicker.textContent = isKnowledge ? "Knowledge" : isSeo ? "SEO" : "Контент"; + if (el.panelTitle) el.panelTitle.textContent = isKnowledge ? "Дерево и статья" : isSeo ? "Семантика и сниппеты" : "Редактируемые поля"; if (el.panelNote) { - el.panelNote.textContent = isSeo - ? "Поля готовят страницу и секции к семантической настройке и дальнейшей автоматизации." - : "Поля сгруппированы по смысловым подблокам верстки."; + el.panelNote.textContent = isKnowledge + ? "Материалы генерируются в статические SEO-страницы раздела /knowledge/." + : isSeo + ? "Поля готовят страницу и секции к семантической настройке и дальнейшей автоматизации." + : "Поля сгруппированы по смысловым подблокам верстки."; + } + if (el.addBlock) { + el.addBlock.title = isKnowledge ? "Добавить раздел в корень базы знаний" : "Добавить блок"; + el.addBlock.setAttribute("aria-label", el.addBlock.title); + } + if (el.save) { + el.save.textContent = isKnowledge ? "Сохранить базу" : "Сохранить модель"; + el.save.title = isKnowledge ? "Записать дерево в content/knowledge.json" : "Записать текущую модель в content/pages/home.json"; + } + if (el.render) { + el.render.textContent = isKnowledge ? "Обновить /knowledge/" : "Обновить index.html"; + el.render.title = isKnowledge ? "Сохранить дерево и пересобрать публичный раздел /knowledge/" : "Сохранить модель и пересобрать публичный index.html"; } } @@ -815,6 +867,127 @@ function isExternalHref(value) { return /^(https?:)?\/\//i.test(String(value || "")) || /^(mailto:|tel:)/i.test(String(value || "")); } +function normalizeLandingTargetCandidate(value) { + const raw = String(value || "").trim(); + if (!raw || /^javascript:/i.test(raw) || isExternalHref(raw)) return ""; + + let target = raw; + if (target.includes("#")) { + target = target.slice(target.indexOf("#") + 1); + } + + target = target + .replace(/^\/+/, "") + .replace(/^index\.html#?/i, "") + .replace(/^#+/, "") + .trim(); + + if (!target || target === "/" || target === "index.html" || target.startsWith("knowledge/") || isWindowTarget(target)) { + return ""; + } + + return target; +} + +function landingBlockTargets() { + const targets = []; + + for (const region of state.page?.regions || []) { + for (const block of region.blocks || []) { + if (block.enabled === false) continue; + const target = normalizeLandingTargetCandidate(block.anchor); + if (!target) continue; + targets.push({ + block, + id: block.id, + label: block.adminLabel || block.id, + target, + }); + } + } + + return targets.sort((left, right) => left.target.localeCompare(right.target, "ru")); +} + +function collectLandingButtonTargets() { + return landingBlockTargets().map((item) => item.target); +} + +function findLandingTargetByInput(value) { + const input = String(value || "").trim(); + const normalized = normalizeLandingTargetCandidate(input); + const lowerInput = input.toLowerCase(); + const lowerTarget = normalized.toLowerCase(); + + return ( + landingBlockTargets().find((item) => item.target.toLowerCase() === lowerTarget) || + landingBlockTargets().find((item) => item.id.toLowerCase() === lowerInput) || + landingBlockTargets().find((item) => item.label.toLowerCase() === lowerInput) || + null + ); +} + +function uniqueLandingTarget(base, exceptBlock = null) { + const usedTargets = new Set( + landingBlockTargets() + .filter((item) => item.block !== exceptBlock) + .map((item) => item.target), + ); + const root = safeBucketSegment(normalizeLandingTargetCandidate(base) || base || "section"); + let candidate = root; + let index = 2; + + while (usedTargets.has(candidate)) { + candidate = `${root}-${index}`; + index += 1; + } + + return candidate; +} + +function landingTargetDuplicates() { + const seen = new Map(); + const duplicates = []; + + for (const item of landingBlockTargets()) { + if (seen.has(item.target)) { + duplicates.push({ target: item.target, first: seen.get(item.target), second: item }); + continue; + } + seen.set(item.target, item); + } + + return duplicates; +} + +function assertUniqueLandingTargets() { + const duplicates = landingTargetDuplicates(); + if (!duplicates.length) return; + + const details = duplicates + .map(({ target, first, second }) => `${target}: ${first.label} / ${second.label}`) + .join("; "); + throw new Error(`Target должен быть уникальным для каждого блока. Дубли: ${details}`); +} + +function renderLandingTargetOptions() { + if (!el.targetOptions) return; + + el.targetOptions.innerHTML = ""; + for (const { target, label } of landingBlockTargets()) { + const option = document.createElement("option"); + option.value = target; + option.label = label; + el.targetOptions.append(option); + } +} + +function knowledgeTargetPromptText() { + const targets = landingBlockTargets(); + const hint = targets.length ? `\n\nДоступные блоки:\n${targets.map((item) => `${item.target} — ${item.label}`).join("\n")}` : ""; + return `Target или ID блока лендинга. Если пусто, откроется первый экран.${hint}`; +} + function normalizeChoiceLink(item, fallback = {}) { if (!item || typeof item !== "object") return; @@ -1586,6 +1759,9 @@ function addBlockFromTemplate(templateKey) { block.id = uniqueBlockId(block.id); block.enabled = true; + if (block.anchor) { + block.anchor = uniqueLandingTarget(block.anchor || block.adminLabel || block.id, block); + } block.scopeIds = true; block.seo = { ...BLOCK_SEO_DEFAULTS, @@ -1606,6 +1782,7 @@ function setStructuralControlsDisabled(disabled) { function renderEditorError(error) { console.error(error); + el.knowledgeForm.classList.add("hidden"); el.empty.classList.add("hidden"); el.form.classList.remove("hidden"); el.contentFields.innerHTML = ""; @@ -1619,6 +1796,7 @@ function renderEditorError(error) { function renderEditor() { updateAdminModeSurface(); + el.knowledgeForm.classList.add("hidden"); const region = activeRegion(); const block = activeBlock(); @@ -1630,6 +1808,7 @@ function renderEditor() { el.form.classList.add("hidden"); el.selectedRegion.textContent = "NODE.DC / Выберите блок"; el.selectedTitle.textContent = isSeo ? "SEO-слой" : "Контентный слой"; + renderLandingTargetOptions(); return; } @@ -1645,6 +1824,9 @@ function renderEditor() { el.label.value = block.adminLabel || ""; el.template.value = block.template || block.type || ""; el.anchor.value = block.anchor || ""; + el.anchor.placeholder = "hub-video / engine-video / applied-modules"; + el.anchor.title = "Публичный Target конкретного блока: используется как якорь лендинга и как ссылка из Knowledge."; + renderLandingTargetOptions(); el.enabled.checked = block.enabled !== false; el.id.readOnly = isStatic; el.anchor.disabled = isStatic; @@ -1667,6 +1849,10 @@ function renderEditor() { function renderAll() { try { + if (state.mode === "knowledge") { + renderKnowledgeAll(); + return; + } renderRegions(); renderEditor(); } catch (error) { @@ -1684,8 +1870,14 @@ function syncBlockFromFields() { if (!isStaticSelection()) { block.id = el.id.value.trim(); - block.anchor = el.anchor.value.trim() || null; + block.anchor = normalizeLandingTargetCandidate(el.anchor.value) || null; + el.anchor.value = block.anchor || ""; block.enabled = el.enabled.checked; + renderLandingTargetOptions(); + const duplicate = landingTargetDuplicates().find((item) => item.second.block === block || item.first.block === block); + if (duplicate) { + setStatus(`Target «${duplicate.target}» уже используется в другом блоке. Переименуйте один из target-ов перед сохранением.`); + } } el.json.value = JSON.stringify(block, null, 2); @@ -2932,7 +3124,8 @@ async function toggleMediaTrash() { } async function openMediaLibrary(context) { - const currentValuePath = pathFromUrl(context.hiddenInput.value || ""); + const currentValue = context.hiddenInput?.value || ""; + const currentValuePath = pathFromUrl(currentValue); const suggestedPath = `assets/uploads/${uploadBucketForField(context.block, context.editableField)}`; const lastPath = state.mediaLibrary.lastPath || readLastMediaDirectory(); const startPath = lastPath || (currentValuePath ? parentMediaPath(currentValuePath) : suggestedPath); @@ -2940,7 +3133,7 @@ async function openMediaLibrary(context) { state.mediaLibrary.context = context; state.mediaLibrary.trashMode = false; state.mediaLibrary.previousPath = ""; - state.mediaLibrary.selectedUrl = context.hiddenInput.value || ""; + state.mediaLibrary.selectedUrl = currentValue; state.mediaLibrary.selectedEntry = null; state.mediaLibrary.selectedPath = startPath; state.mediaLibrary.query = ""; @@ -2954,7 +3147,7 @@ async function openMediaLibrary(context) { refreshMediaSiteSize().catch((error) => setStatus(`Ошибка размера сайта: ${error.message}`)); try { - await loadMediaColumns(startPath, { selectedUrl: context.hiddenInput.value || "" }); + await loadMediaColumns(startPath, { selectedUrl: currentValue }); } catch (error) { setStatus(`Ошибка медиатеки: ${error.message}`); renderMediaLibrary(); @@ -2982,12 +3175,16 @@ function chooseSelectedMediaFile() { return; } - updateMediaFieldValue({ - ...context, - value: file.url, - }); + if (typeof context.onSelect === "function") { + context.onSelect(file.url, file); + } else { + updateMediaFieldValue({ + ...context, + value: file.url, + }); + context.setSource("file"); + } rememberMediaDirectory(file.directory || parentMediaPath(pathFromUrl(file.url))); - context.setSource("file"); closeMediaLibrary(); markDirty(`Выбран файл: ${file.url}. Нажмите «Сохранить модель», чтобы записать путь.`); } @@ -4081,6 +4278,808 @@ function syncBlockFromJson() { } } +function knowledgeTree() { + if (!state.knowledge) return []; + if (!Array.isArray(state.knowledge.tree)) state.knowledge.tree = []; + return state.knowledge.tree; +} + +function knowledgeWalk(nodes = knowledgeTree(), parent = null, callback = () => {}) { + nodes.forEach((node, index) => { + callback(node, parent, nodes, index); + knowledgeWalk(Array.isArray(node.children) ? node.children : [], node, callback); + }); +} + +function allKnowledgeIds() { + const ids = new Set(); + knowledgeWalk(knowledgeTree(), null, (node) => { + if (node.id) ids.add(node.id); + }); + return ids; +} + +function findKnowledgeNode(id) { + let found = null; + let foundParent = null; + let foundSiblings = null; + let foundIndex = -1; + + knowledgeWalk(knowledgeTree(), null, (node, parent, siblings, index) => { + if (found || node.id !== id) return; + found = node; + foundParent = parent; + foundSiblings = siblings; + foundIndex = index; + }); + + return found ? { node: found, parent: foundParent, siblings: foundSiblings, index: foundIndex } : null; +} + +function isKnowledgeRootId(id) { + return id === KNOWLEDGE_ROOT_ID; +} + +function isKnowledgeRootSelected() { + return isKnowledgeRootId(state.knowledgeSelectedId); +} + +function knowledgeRootTitle() { + return state.knowledge?.title || state.knowledge?.settings?.navTitle || "Knowledge"; +} + +function selectedKnowledgeNode() { + if (isKnowledgeRootSelected()) return state.knowledge; + return findKnowledgeNode(state.knowledgeSelectedId)?.node || null; +} + +function knowledgeSlug(value, fallback = "material") { + const map = { + а: "a", + б: "b", + в: "v", + г: "g", + д: "d", + е: "e", + ё: "e", + ж: "zh", + з: "z", + и: "i", + й: "y", + к: "k", + л: "l", + м: "m", + н: "n", + о: "o", + п: "p", + р: "r", + с: "s", + т: "t", + у: "u", + ф: "f", + х: "h", + ц: "c", + ч: "ch", + ш: "sh", + щ: "sch", + ъ: "", + ы: "y", + ь: "", + э: "e", + ю: "yu", + я: "ya", + }; + const safe = String(value || "") + .toLowerCase() + .replace(/[а-яё]/g, (char) => map[char] || "") + .replace(/[^a-z0-9]+/g, "-") + .replace(/^-+|-+$/g, ""); + + return safe || fallback; +} + +function uniqueKnowledgeValue(values, base) { + const cleanBase = base || "material"; + if (!values.has(cleanBase)) return cleanBase; + let index = 2; + while (values.has(`${cleanBase}-${index}`)) index += 1; + return `${cleanBase}-${index}`; +} + +function createKnowledgeNode(title = "Новый материал", siblings = []) { + const ids = allKnowledgeIds(); + const siblingSlugs = new Set(siblings.map((node) => node.slug).filter(Boolean)); + const slug = uniqueKnowledgeValue(siblingSlugs, knowledgeSlug(title)); + return { + id: uniqueKnowledgeValue(ids, slug), + title, + slug, + enabled: true, + useContent: true, + seo: { + title, + description: "", + }, + bodyHtml: "

Новый материал базы знаний.

", + children: [], + }; +} + +function ensureKnowledgeSelection() { + if (!state.knowledge) return; + if (isKnowledgeRootSelected()) return; + const existing = state.knowledgeSelectedId ? findKnowledgeNode(state.knowledgeSelectedId) : null; + if (existing) return; + state.knowledgeSelectedId = KNOWLEDGE_ROOT_ID; +} + +function selectKnowledgeNode(id) { + state.knowledgeSelectedId = id; + updateAdminLayoutState({ knowledgeSelectedId: id }); + renderKnowledgeAll(); +} + +function persistKnowledgeOpenState() { + updateAdminLayoutState({ knowledgeOpenIds: [...state.knowledgeOpenIds] }); +} + +function setKnowledgeNodeOpen(id, open) { + if (!id) return; + if (open) state.knowledgeOpenIds.add(id); + else state.knowledgeOpenIds.delete(id); + persistKnowledgeOpenState(); +} + +function addKnowledgeNode(parentId = null) { + const parent = parentId ? findKnowledgeNode(parentId)?.node : null; + const siblings = parent ? (parent.children ||= []) : knowledgeTree(); + const node = createKnowledgeNode(parent ? "Новый подраздел" : "Новый раздел", siblings); + siblings.push(node); + if (parent) setKnowledgeNodeOpen(parent.id, true); + state.knowledgeSelectedId = node.id; + renderKnowledgeAll(); + markDirty("Материал добавлен в дерево базы знаний."); +} + +function moveKnowledgeNode(id, delta) { + const match = findKnowledgeNode(id); + if (!match) return; + const nextIndex = match.index + delta; + if (nextIndex < 0 || nextIndex >= match.siblings.length) return; + const [node] = match.siblings.splice(match.index, 1); + match.siblings.splice(nextIndex, 0, node); + renderKnowledgeAll(); + markDirty("Порядок дерева базы знаний изменён."); +} + +async function deleteKnowledgeNode(id) { + const match = findKnowledgeNode(id); + if (!match) return; + const confirmed = await requestDeleteConfirmation({ + title: "Удалить материал?", + body: `«${match.node.title || match.node.id}» и все вложенные элементы будут удалены из дерева.`, + }); + if (!confirmed) return; + match.siblings.splice(match.index, 1); + if (state.knowledgeSelectedId === id) { + state.knowledgeSelectedId = match.siblings[Math.min(match.index, match.siblings.length - 1)]?.id || match.parent?.id || KNOWLEDGE_ROOT_ID; + } + renderKnowledgeAll(); + markDirty("Материал удалён из дерева базы знаний."); +} + +function renderKnowledgeTreeItem(node, depth = 0) { + const item = document.createElement("div"); + const row = document.createElement("div"); + const select = document.createElement("button"); + const icon = document.createElement("span"); + const copy = document.createElement("span"); + const title = document.createElement("span"); + const meta = document.createElement("span"); + const actions = document.createElement("span"); + const children = Array.isArray(node.children) ? node.children : []; + const hasChildren = children.length > 0; + const isOpen = state.knowledgeOpenIds.has(node.id) || node.id === state.knowledgeSelectedId || children.some((child) => child.id === state.knowledgeSelectedId); + + item.className = "knowledge-tree-item"; + item.style.setProperty("--depth", String(depth)); + row.className = "knowledge-tree-row"; + row.dataset.active = String(node.id === state.knowledgeSelectedId); + row.dataset.disabled = String(node.enabled === false); + select.className = "knowledge-tree-select"; + select.type = "button"; + icon.className = "knowledge-tree-icon"; + icon.textContent = hasChildren ? (isOpen ? "▾" : "›") : node.useContent === false ? "G" : "A"; + copy.className = "knowledge-tree-copy"; + title.className = "knowledge-tree-title"; + title.textContent = node.title || node.id; + meta.className = "knowledge-tree-meta"; + meta.textContent = node.useContent === false ? "группа" : hasChildren ? "страница + ветка" : "статья"; + copy.append(title, meta); + select.append(icon, copy); + select.addEventListener("click", () => { + if (hasChildren) setKnowledgeNodeOpen(node.id, !isOpen); + selectKnowledgeNode(node.id); + }); + + actions.className = "knowledge-tree-actions"; + [ + ["+", "Добавить дочерний материал", () => addKnowledgeNode(node.id)], + ["↑", "Поднять", () => moveKnowledgeNode(node.id, -1)], + ["↓", "Опустить", () => moveKnowledgeNode(node.id, 1)], + [FINDER_TRASH_ICON_SVG, "Удалить", () => deleteKnowledgeNode(node.id)], + ].forEach(([symbol, titleText, handler]) => { + const button = document.createElement("button"); + button.type = "button"; + button.className = "knowledge-tree-action"; + button.title = titleText; + button.setAttribute("aria-label", titleText); + if (titleText === "Удалить") button.innerHTML = symbol; + else button.textContent = symbol; + button.addEventListener("click", (event) => { + event.stopPropagation(); + Promise.resolve(handler()).catch((error) => setStatus(`Ошибка дерева: ${error.message}`)); + }); + actions.append(button); + }); + + row.append(select, actions); + item.append(row); + + if (hasChildren && isOpen) { + const childList = document.createElement("div"); + childList.className = "knowledge-tree-children"; + children.forEach((child) => childList.append(renderKnowledgeTreeItem(child, depth + 1))); + item.append(childList); + } + + return item; +} + +function renderKnowledgeRootItem() { + const item = document.createElement("div"); + const row = document.createElement("div"); + const select = document.createElement("button"); + const icon = document.createElement("span"); + const copy = document.createElement("span"); + const title = document.createElement("span"); + const meta = document.createElement("span"); + const actions = document.createElement("span"); + const add = document.createElement("button"); + + item.className = "knowledge-tree-item knowledge-root-item"; + item.style.setProperty("--depth", "0"); + row.className = "knowledge-tree-row"; + row.dataset.active = String(isKnowledgeRootSelected()); + row.dataset.disabled = "false"; + select.className = "knowledge-tree-select"; + select.type = "button"; + icon.className = "knowledge-tree-icon"; + icon.textContent = "K"; + copy.className = "knowledge-tree-copy"; + title.className = "knowledge-tree-title"; + title.textContent = knowledgeRootTitle(); + meta.className = "knowledge-tree-meta"; + meta.textContent = "/knowledge/ главная"; + copy.append(title, meta); + select.append(icon, copy); + select.addEventListener("click", () => selectKnowledgeNode(KNOWLEDGE_ROOT_ID)); + + actions.className = "knowledge-tree-actions"; + add.type = "button"; + add.className = "knowledge-tree-action"; + add.title = "Добавить раздел в корень"; + add.setAttribute("aria-label", "Добавить раздел в корень"); + add.textContent = "+"; + add.addEventListener("click", (event) => { + event.stopPropagation(); + addKnowledgeNode(null); + }); + actions.append(add); + + row.append(select, actions); + item.append(row); + return item; +} + +function renderKnowledgeRegions() { + el.regions.innerHTML = ""; + const group = document.createElement("section"); + const title = document.createElement("h2"); + const root = document.createElement("div"); + + group.className = "region-group knowledge-region"; + title.className = "region-title"; + title.textContent = "База знаний"; + root.className = "knowledge-tree"; + root.append(renderKnowledgeRootItem()); + + if (!knowledgeTree().length) { + const empty = document.createElement("div"); + empty.className = "empty-note knowledge-empty-tree"; + empty.textContent = "Дерево пустое. Нажмите плюс сверху, чтобы добавить первый раздел."; + root.append(empty); + } else { + knowledgeTree().forEach((node) => root.append(renderKnowledgeTreeItem(node))); + } + + group.append(title, root); + el.regions.append(group); +} + +function updateKnowledgeNodeField(node, path, value, message = "Материал базы знаний обновлён.") { + setByPath(node, path, value); + markDirty(message); +} + +function createKnowledgeInput({ node, path, label, kind = "text", wide = false, placeholder = "" }) { + const field = document.createElement("label"); + const labelRow = document.createElement("span"); + const labelText = document.createElement("span"); + const kindLabel = document.createElement("span"); + const input = kind === "textarea" ? document.createElement("textarea") : document.createElement("input"); + const pathLabel = document.createElement("span"); + + field.className = `field-control${wide || kind === "textarea" ? " wide" : ""}`; + labelRow.className = "field-label-row"; + labelText.className = "field-label-text"; + labelText.textContent = label; + kindLabel.className = "field-kind"; + kindLabel.textContent = kind; + input.value = getByPath(node, path) ?? ""; + input.placeholder = placeholder; + input.dataset.knowledgePath = path; + if (input.tagName === "INPUT") { + input.type = kind === "url" ? "url" : "text"; + input.autocomplete = "off"; + } + input.addEventListener("input", () => { + updateKnowledgeNodeField(node, path, input.value); + if (path === "title" || path === "settings.navTitle") renderKnowledgeRegions(); + }); + pathLabel.className = "field-path"; + pathLabel.textContent = path; + labelRow.append(labelText, kindLabel); + field.append(labelRow, input, pathLabel); + return field; +} + +function createKnowledgeCheckbox({ node, path, label, checkedDefault = true }) { + const field = document.createElement("label"); + const labelRow = document.createElement("span"); + const labelText = document.createElement("span"); + const kindLabel = document.createElement("span"); + const input = document.createElement("input"); + const pathLabel = document.createElement("span"); + + field.className = "field-control boolean-field"; + labelRow.className = "field-label-row"; + labelText.className = "field-label-text"; + labelText.textContent = label; + kindLabel.className = "field-kind"; + kindLabel.textContent = "boolean"; + input.type = "checkbox"; + const value = getByPath(node, path); + input.checked = value == null ? checkedDefault : value !== false; + input.addEventListener("change", () => { + updateKnowledgeNodeField(node, path, input.checked); + renderKnowledgeEditor(); + renderKnowledgeRegions(); + }); + pathLabel.className = "field-path"; + pathLabel.textContent = path; + labelRow.append(labelText, kindLabel); + field.append(labelRow, input, pathLabel); + return field; +} + +function knowledgeSelectionNodeInsideEditor(editor, node) { + if (!editor || !node) return false; + const element = node.nodeType === Node.ELEMENT_NODE ? node : node.parentElement; + return Boolean(element && editor.contains(element)); +} + +function saveKnowledgeEditorSelection() { + const selection = window.getSelection(); + if (!selection?.rangeCount) return; + const editor = el.knowledgeForm.querySelector("[data-knowledge-richtext]"); + if (!knowledgeSelectionNodeInsideEditor(editor, selection.anchorNode) || !knowledgeSelectionNodeInsideEditor(editor, selection.focusNode)) return; + state.knowledgeSavedSelection = selection.getRangeAt(0).cloneRange(); +} + +function restoreKnowledgeEditorSelection(editor) { + editor.focus(); + let range = state.knowledgeSavedSelection; + if (!range || !knowledgeSelectionNodeInsideEditor(editor, range.commonAncestorContainer)) { + range = document.createRange(); + range.selectNodeContents(editor); + range.collapse(false); + state.knowledgeSavedSelection = range.cloneRange(); + } + const selection = window.getSelection(); + selection.removeAllRanges(); + selection.addRange(range); + return range; +} + +function syncKnowledgeRichText(node, editor) { + setByPath(node, editor.dataset.knowledgeBodyPath || "bodyHtml", editor.innerHTML.trim()); + markDirty("Текст статьи обновлён."); +} + +function execKnowledgeCommand(editor, node, command, value = null) { + restoreKnowledgeEditorSelection(editor); + document.execCommand(command, false, value); + syncKnowledgeRichText(node, editor); +} + +function insertKnowledgeHtml(editor, node, html) { + restoreKnowledgeEditorSelection(editor); + document.execCommand("insertHTML", false, html); + saveKnowledgeEditorSelection(); + syncKnowledgeRichText(node, editor); +} + +function escapeKnowledgeShortcodeAttr(value) { + return String(value ?? "") + .replace(/\s+/g, " ") + .trim() + .replaceAll("&", "&") + .replaceAll('"', """) + .replaceAll("[", "(") + .replaceAll("]", ")"); +} + +function normalizeKnowledgeLandingTarget(value) { + return String(value || "") + .trim() + .replace(/^#+/, "") + .replace(/^index\.html#/i, "") + .replace(/^\/?#/, ""); +} + +function normalizeKnowledgeButtonLink(value) { + return (String(value ?? "").trim() || "/").replace(/^\/+(https?:\/\/)/i, "$1").replace(/^\/+((?:mailto|tel):)/i, "$1"); +} + +function knowledgeButtonShortcode({ name, link, target, blockId }) { + const safeName = escapeKnowledgeShortcodeAttr(name || "Посмотреть"); + const safeLink = escapeKnowledgeShortcodeAttr(normalizeKnowledgeButtonLink(link)); + const safeTarget = normalizeKnowledgeLandingTarget(target); + const safeBlockId = String(blockId || "").trim(); + const blockPart = safeBlockId ? ` block="${escapeKnowledgeShortcodeAttr(safeBlockId)}"` : ""; + const targetPart = safeTarget ? ` target="${escapeKnowledgeShortcodeAttr(safeTarget)}"` : ""; + return `[button name="${safeName}" link="${safeLink}"${blockPart}${targetPart}]`; +} + +function renderKnowledgeButtonTargetOptions() { + if (!el.knowledgeButtonTargetOptions) return; + + el.knowledgeButtonTargetOptions.innerHTML = ""; + const added = new Set(); + + for (const { id, label, target } of landingBlockTargets()) { + const targetKey = target.toLowerCase(); + if (!added.has(targetKey)) { + const option = document.createElement("option"); + option.value = target; + option.label = `${label} / ${id}`; + el.knowledgeButtonTargetOptions.append(option); + added.add(targetKey); + } + + const idKey = String(id || "").toLowerCase(); + if (id && !added.has(idKey)) { + const option = document.createElement("option"); + option.value = id; + option.label = `${label} / block id`; + el.knowledgeButtonTargetOptions.append(option); + added.add(idKey); + } + } +} + +function setKnowledgeButtonError(message = "") { + if (el.knowledgeButtonError) el.knowledgeButtonError.textContent = message; +} + +function closeKnowledgeButtonModal(value = null) { + const resolve = state.knowledgeButtonResolve; + + state.knowledgeButtonResolve = null; + el.knowledgeButtonModal.classList.add("hidden"); + setKnowledgeButtonError(""); + if (resolve) resolve(value); +} + +function confirmKnowledgeButtonModal() { + const name = el.knowledgeButtonName.value.trim(); + if (!name) { + setKnowledgeButtonError("Название кнопки обязательно."); + el.knowledgeButtonName.focus(); + return; + } + + const link = normalizeKnowledgeButtonLink(el.knowledgeButtonLink.value); + el.knowledgeButtonLink.value = link; + closeKnowledgeButtonModal({ + name, + link, + targetInput: el.knowledgeButtonTarget.value.trim(), + }); +} + +function requestKnowledgeButtonInput({ name = "Посмотреть демо", link = "/", target = "" } = {}) { + if (state.knowledgeButtonResolve) closeKnowledgeButtonModal(null); + + return new Promise((resolve) => { + state.knowledgeButtonResolve = resolve; + renderKnowledgeButtonTargetOptions(); + setKnowledgeButtonError(""); + el.knowledgeButtonName.value = name; + el.knowledgeButtonLink.value = normalizeKnowledgeButtonLink(link); + el.knowledgeButtonTarget.value = normalizeKnowledgeLandingTarget(target); + el.knowledgeButtonModal.classList.remove("hidden"); + el.knowledgeButtonName.focus(); + el.knowledgeButtonName.select(); + }); +} + +function openKnowledgeMediaPicker(editor, node) { + saveKnowledgeEditorSelection(); + const fakeInput = { value: "" }; + const fakeText = { textContent: "", title: "" }; + const fakePreview = document.createElement("div"); + const fakeHint = document.createElement("span"); + const fakeError = document.createElement("span"); + const fakeUrlInput = { value: "" }; + openMediaLibrary({ + block: { id: node.id || "knowledge" }, + editableField: { path: "content.bodyHtml", label: "Изображение статьи" }, + hiddenInput: fakeInput, + urlInput: fakeUrlInput, + fileName: fakeText, + preview: fakePreview, + hint: fakeHint, + error: fakeError, + setSource() {}, + onSelect(url) { + const safeUrl = String(url || ""); + if (!safeUrl) return; + insertKnowledgeHtml(editor, node, ``); + }, + }).catch((error) => setStatus(`Ошибка медиатеки: ${error.message}`)); +} + +function renderKnowledgeToolbar(editor, node) { + const toolbar = document.createElement("div"); + toolbar.className = "knowledge-rich-toolbar"; + const buttons = [ + ["P", "Абзац", () => execKnowledgeCommand(editor, node, "formatBlock", "P")], + ["H2", "Заголовок H2", () => execKnowledgeCommand(editor, node, "formatBlock", "H2")], + ["H3", "Заголовок H3", () => execKnowledgeCommand(editor, node, "formatBlock", "H3")], + ["B", "Жирный", () => execKnowledgeCommand(editor, node, "bold")], + ["I", "Курсив", () => execKnowledgeCommand(editor, node, "italic")], + ["UL", "Список", () => execKnowledgeCommand(editor, node, "insertUnorderedList")], + ["OL", "Нумерованный список", () => execKnowledgeCommand(editor, node, "insertOrderedList")], + ["Link", "Ссылка", () => { + const href = window.prompt("Адрес ссылки", "/knowledge/"); + if (!href) return; + execKnowledgeCommand(editor, node, "createLink", href); + }], + ["Button", "Кнопка", async () => { + saveKnowledgeEditorSelection(); + const values = await requestKnowledgeButtonInput(); + if (!values) return; + const targetInput = values.targetInput; + const landingTarget = findLandingTargetByInput(targetInput); + const target = landingTarget ? landingTarget.target : targetInput; + const blockId = landingTarget?.id || ""; + insertKnowledgeHtml( + editor, + node, + `

${escapeHtml(knowledgeButtonShortcode({ name: values.name, link: values.link, target, blockId }))}

`, + ); + }], + ["Image", "Изображение", () => openKnowledgeMediaPicker(editor, node)], + ]; + + buttons.forEach(([label, title, action]) => { + const button = document.createElement("button"); + button.type = "button"; + button.textContent = label; + button.title = title; + button.addEventListener("mousedown", (event) => event.preventDefault()); + button.addEventListener("click", action); + toolbar.append(button); + }); + + return toolbar; +} + +function renderKnowledgeEditor() { + const isRoot = isKnowledgeRootSelected(); + const node = selectedKnowledgeNode(); + el.empty.classList.add("hidden"); + el.form.classList.add("hidden"); + el.knowledgeForm.classList.remove("hidden"); + el.knowledgeForm.innerHTML = ""; + + if (!state.knowledge) { + el.knowledgeForm.innerHTML = '
Загружаем базу знаний...
'; + return; + } + + if (!node) { + const empty = document.createElement("section"); + empty.className = "content-panel"; + empty.innerHTML = "

Дерево базы знаний пустое

Нажмите плюс в левом верхнем углу, чтобы создать первый раздел.

"; + el.knowledgeForm.append(empty); + return; + } + + state.knowledge.settings ||= {}; + const bodyPath = isRoot ? "introHtml" : "bodyHtml"; + const match = isRoot ? null : findKnowledgeNode(node.id); + const parentTitle = match?.parent?.title || state.knowledge.title || "База знаний"; + el.selectedRegion.textContent = isRoot + ? `NODE.DC / ${knowledgeRootTitle()} / /knowledge/` + : `NODE.DC / ${state.knowledge.title || "База знаний"} / ${parentTitle}`; + el.selectedTitle.textContent = isRoot ? knowledgeRootTitle() : node.title || "Материал"; + + const metaPanel = document.createElement("section"); + const metaHead = document.createElement("div"); + const metaTitle = document.createElement("h3"); + const metaKicker = document.createElement("div"); + const grid = document.createElement("div"); + metaPanel.className = "content-panel"; + metaHead.className = "panel-head"; + metaKicker.className = "section-kicker"; + metaKicker.textContent = isRoot ? "Корневая страница" : "Узел дерева"; + metaTitle.textContent = isRoot ? "Настройки /knowledge/" : "Параметры материала"; + metaHead.append(Object.assign(document.createElement("div"), { innerHTML: `${metaKicker.outerHTML}

${metaTitle.textContent}

` })); + grid.className = "group-grid"; + if (isRoot) { + grid.append( + createKnowledgeInput({ node, path: "title", label: "H1 / название в sidebar", wide: false }), + createKnowledgeInput({ node, path: "settings.navTitle", label: "Название в шапке", wide: false }), + createKnowledgeInput({ node, path: "settings.searchPlaceholder", label: "Placeholder поиска", wide: false }), + createKnowledgeInput({ node, path: "settings.homeHref", label: "Ссылка логотипа", kind: "url", wide: false }), + createKnowledgeInput({ node, path: "settings.themeDefault", label: "Тема по умолчанию", wide: false }), + createKnowledgeCheckbox({ node, path: "settings.downloadEnabled", label: "Показывать Download", checkedDefault: false }), + ); + } else { + grid.append( + createKnowledgeInput({ node, path: "title", label: "Название", wide: false }), + createKnowledgeInput({ node, path: "slug", label: "Slug", wide: false }), + createKnowledgeCheckbox({ node, path: "enabled", label: "Публиковать" }), + createKnowledgeCheckbox({ node, path: "useContent", label: "Использовать как информационную страницу" }), + ); + } + metaPanel.append(metaHead, grid); + + const seoPanel = document.createElement("section"); + const seoHead = document.createElement("div"); + const seoGrid = document.createElement("div"); + seoPanel.className = "content-panel"; + seoHead.className = "panel-head"; + seoHead.innerHTML = `
SEO

${isRoot ? "Сниппет раздела" : "Сниппет страницы"}

Поля попадут в title, description, Open Graph и sitemap.`; + seoGrid.className = "group-grid"; + if (isRoot) { + seoGrid.append( + createKnowledgeInput({ node, path: "settings.description", label: "SEO description / описание", kind: "textarea", wide: true }), + ); + } else { + node.seo ||= {}; + seoGrid.append( + createKnowledgeInput({ node, path: "seo.title", label: "SEO title", wide: true }), + createKnowledgeInput({ node, path: "seo.description", label: "SEO description", kind: "textarea", wide: true }), + ); + } + seoPanel.append(seoHead, seoGrid); + + const contentPanel = document.createElement("section"); + const contentHead = document.createElement("div"); + const editor = document.createElement("div"); + contentPanel.className = "content-panel knowledge-rich-panel"; + contentHead.className = "panel-head"; + contentHead.innerHTML = `
Контент

${isRoot ? "Текст главной страницы" : "Текст статьи"}

H2/H3 формируют правый список “На этой странице”.`; + editor.className = "knowledge-rich-editor"; + editor.contentEditable = isRoot || node.useContent !== false ? "true" : "false"; + editor.dataset.knowledgeRichtext = "true"; + editor.dataset.knowledgeBodyPath = bodyPath; + editor.innerHTML = getByPath(node, bodyPath) || "

"; + editor.addEventListener("focusout", () => saveKnowledgeEditorSelection()); + editor.addEventListener("keyup", () => saveKnowledgeEditorSelection()); + editor.addEventListener("mouseup", () => saveKnowledgeEditorSelection()); + editor.addEventListener("input", () => syncKnowledgeRichText(node, editor)); + contentPanel.append(contentHead, renderKnowledgeToolbar(editor, node), editor); + if (!isRoot && node.useContent === false) { + const disabledNote = document.createElement("p"); + disabledNote.className = "group-desc"; + disabledNote.textContent = "Контент сохранится в модели, но публичная страница для этого узла не будет генерироваться, пока флаг выключен."; + contentPanel.append(disabledNote); + } + + const jsonDetails = document.createElement("details"); + jsonDetails.className = "json-details knowledge-json"; + jsonDetails.innerHTML = `${isRoot ? "JSON всей базы знаний" : "JSON выбранного материала"}`; + const jsonField = document.createElement("label"); + const json = document.createElement("textarea"); + jsonField.className = "json-field"; + json.value = JSON.stringify(node, null, 2); + json.addEventListener("blur", () => { + try { + const parsed = JSON.parse(json.value); + if (isRoot) { + state.knowledge = parsed; + state.knowledgeSelectedId = KNOWLEDGE_ROOT_ID; + } else { + const match = findKnowledgeNode(node.id); + if (!match) return; + match.siblings[match.index] = parsed; + state.knowledgeSelectedId = parsed.id || node.id; + } + renderKnowledgeAll(); + markDirty(isRoot ? "JSON базы знаний применён локально." : "JSON материала применён локально."); + } catch (error) { + setStatus(`Ошибка JSON ${isRoot ? "базы знаний" : "материала"}: ${error.message}`); + } + }); + jsonField.innerHTML = "Техническое представление"; + jsonField.append(json); + jsonDetails.append(jsonField); + + el.knowledgeForm.append(metaPanel, seoPanel, contentPanel, jsonDetails); +} + +function renderKnowledgeAll() { + updateAdminModeSurface(); + ensureKnowledgeSelection(); + renderKnowledgeRegions(); + renderKnowledgeEditor(); +} + +async function loadKnowledge() { + const response = await fetch("/api/knowledge"); + if (!response.ok) throw new Error(await response.text()); + state.knowledge = await response.json(); + state.knowledgeSelectedId = readAdminLayoutState().knowledgeSelectedId || state.knowledgeSelectedId || null; + ensureKnowledgeSelection(); + renderAll(); + setDirty(false); + setStatus("Модель knowledge.json загружена."); +} + +async function persistKnowledge() { + const response = await fetch("/api/knowledge", { + method: "PUT", + headers: { "content-type": "application/json" }, + body: JSON.stringify(state.knowledge), + }); + + if (!response.ok) throw new Error(await response.text()); +} + +async function saveKnowledge() { + await persistKnowledge(); + setDirty(false); + setStatus("База знаний сохранена в content/knowledge.json."); +} + +async function renderKnowledge() { + await persistKnowledge(); + const response = await fetch("/api/render/knowledge", { method: "POST" }); + const payload = await response.json(); + + if (!response.ok || !payload.ok) { + throw new Error(payload.error || "Render failed"); + } + + setDirty(false); + setStatus(payload.stdout ? `База знаний сохранена. ${payload.stdout}` : "База знаний сохранена и пересобрана."); +} + async function loadPage() { const [pageResponse, templatesResponse] = await Promise.all([ fetch("/api/page/home"), @@ -4099,10 +5098,15 @@ async function loadPage() { renderAll(); setDirty(false); setStatus("Модель home.json загружена."); + + if (state.mode === "knowledge" && !state.knowledge) { + await loadKnowledge(); + } } async function persistPage() { if (activeBlock()) syncBlockFromFields(); + assertUniqueLandingTargets(); const response = await fetch("/api/page/home", { method: "PUT", @@ -4157,6 +5161,9 @@ function duplicateSelected() { const duplicate = clone(block); duplicate.id = uniqueId(block.id); duplicate.adminLabel = `${block.adminLabel || block.id} — копия`; + if (duplicate.anchor) { + duplicate.anchor = uniqueLandingTarget(duplicate.anchor, duplicate); + } duplicate.scopeIds = true; region.blocks.splice(state.selected.blockIndex + 1, 0, duplicate); state.selected.blockIndex += 1; @@ -4181,6 +5188,9 @@ function pasteAfterSelected() { const pasted = clone(state.clipboard); pasted.id = uniqueId(pasted.id); pasted.adminLabel = `${pasted.adminLabel || pasted.id} — вставка`; + if (pasted.anchor) { + pasted.anchor = uniqueLandingTarget(pasted.anchor, pasted); + } pasted.scopeIds = true; region.blocks.splice(state.selected.blockIndex + 1, 0, pasted); state.selected.blockIndex += 1; @@ -4210,8 +5220,10 @@ for (const input of [el.id, el.label, el.anchor, el.enabled]) { el.modeContent?.addEventListener("click", () => setAdminMode("content")); el.modeSeo?.addEventListener("click", () => setAdminMode("seo")); +el.modeKnowledge?.addEventListener("click", () => setAdminMode("knowledge")); el.json.addEventListener("blur", () => { + if (state.mode === "knowledge") return; if (state.filePickerActive || state.mediaUploadActive) { recoverEditorSurface(); return; @@ -4219,7 +5231,14 @@ el.json.addEventListener("blur", () => { syncBlockFromJson(); }); -el.addBlock.addEventListener("click", openTemplateModal); +el.addBlock.addEventListener("click", () => { + if (state.mode === "knowledge") { + addKnowledgeNode(null); + return; + } + + openTemplateModal(); +}); el.templateModalClose.addEventListener("click", closeTemplateModal); el.templateModalCancel.addEventListener("click", closeTemplateModal); el.templateModal.addEventListener("click", (event) => { @@ -4235,6 +5254,15 @@ el.mediaActionConfirm.addEventListener("click", () => closeMediaActionModal(el.m el.mediaActionModal.addEventListener("click", (event) => { if (event.target === el.mediaActionModal) closeMediaActionModal(null); }); +el.knowledgeButtonClose.addEventListener("click", () => closeKnowledgeButtonModal(null)); +el.knowledgeButtonCancel.addEventListener("click", () => closeKnowledgeButtonModal(null)); +el.knowledgeButtonConfirm.addEventListener("click", confirmKnowledgeButtonModal); +el.knowledgeButtonLink.addEventListener("blur", () => { + el.knowledgeButtonLink.value = normalizeKnowledgeButtonLink(el.knowledgeButtonLink.value); +}); +el.knowledgeButtonModal.addEventListener("click", (event) => { + if (event.target === el.knowledgeButtonModal) closeKnowledgeButtonModal(null); +}); el.mediaModalClose.addEventListener("click", closeMediaLibrary); el.mediaModalCancel.addEventListener("click", closeMediaLibrary); el.mediaModal.addEventListener("click", (event) => { @@ -4284,6 +5312,10 @@ document.addEventListener("contextmenu", (event) => { if (el.mediaModal.contains(event.target)) return; closeMediaContextMenu(); }); +document.addEventListener("selectionchange", () => { + if (state.mode !== "knowledge") return; + saveKnowledgeEditorSelection(); +}); document.addEventListener("keydown", (event) => { if (!el.deleteModal.classList.contains("hidden")) { if (event.key === "Enter") { @@ -4309,6 +5341,22 @@ document.addEventListener("keydown", (event) => { return; } + if (!el.knowledgeButtonModal.classList.contains("hidden")) { + if (event.key === "Enter" && (event.metaKey || event.ctrlKey)) { + event.preventDefault(); + confirmKnowledgeButtonModal(); + } + if (event.key === "Enter" && event.target !== el.knowledgeButtonTarget) { + event.preventDefault(); + confirmKnowledgeButtonModal(); + } + if (event.key === "Escape") { + event.preventDefault(); + closeKnowledgeButtonModal(null); + } + return; + } + if (!el.mediaModal.classList.contains("hidden")) { if (!el.mediaContextMenu.classList.contains("hidden") && event.key === "Escape") { event.preventDefault(); @@ -4361,9 +5409,18 @@ document.addEventListener("keydown", (event) => { closeTemplateModal(); } }); -el.reload.addEventListener("click", () => loadPage().catch((error) => setStatus(error.message))); -el.save.addEventListener("click", () => savePage().catch((error) => setStatus(error.message))); -el.render.addEventListener("click", () => renderHome().catch((error) => setStatus(error.message))); +el.reload.addEventListener("click", () => { + const action = state.mode === "knowledge" ? loadKnowledge : loadPage; + action().catch((error) => setStatus(error.message)); +}); +el.save.addEventListener("click", () => { + const action = state.mode === "knowledge" ? saveKnowledge : savePage; + action().catch((error) => setStatus(error.message)); +}); +el.render.addEventListener("click", () => { + const action = state.mode === "knowledge" ? renderKnowledge : renderHome; + action().catch((error) => setStatus(error.message)); +}); el.moveUp.addEventListener("click", () => moveSelected(-1)); el.moveDown.addEventListener("click", () => moveSelected(1)); el.duplicate.addEventListener("click", duplicateSelected); diff --git a/admin/index.html b/admin/index.html index fc31835..dfefc99 100644 --- a/admin/index.html +++ b/admin/index.html @@ -27,6 +27,9 @@ +
@@ -113,8 +116,9 @@
@@ -174,6 +178,8 @@ + +

       
     
@@ -300,6 +306,39 @@
         
       
     
+    
     
   
 
diff --git a/assets/custom/css/knowledge.css b/assets/custom/css/knowledge.css
new file mode 100644
index 0000000..e1903d2
--- /dev/null
+++ b/assets/custom/css/knowledge.css
@@ -0,0 +1,120 @@
+.site-title-logo:where(.astro-idrpryed) img {
+  display: block;
+  width: auto;
+  height: 100%;
+  object-fit: contain;
+}
+
+.knowledge-search-popover {
+  position: absolute;
+  top: calc(100% + 0.5rem);
+  left: 50%;
+  z-index: calc(var(--sl-z-index-navbar) + 1);
+  width: min(28rem, calc(100vw - 2rem));
+  max-height: calc(100vh - 7rem);
+  overflow: auto;
+  transform: translateX(-50%);
+  border: 1px solid var(--sl-color-gray-5);
+  border-radius: 0.5rem;
+  background: var(--sl-color-gray-6);
+  box-shadow: var(--sl-shadow-lg);
+  padding: 0.75rem;
+}
+
+.knowledge-search-popover[hidden] {
+  display: none;
+}
+
+.knowledge-download-placeholder {
+  visibility: hidden;
+  pointer-events: none;
+}
+
+.knowledge-download-placeholder:where(.astro-sle7k2hz) {
+  min-width: 8.25rem;
+}
+
+.knowledge-search-input {
+  display: block;
+  width: 100%;
+  border: 1px solid var(--sl-color-gray-5);
+  border-radius: 0.5rem;
+  background: var(--sl-color-black);
+  color: var(--sl-color-white);
+  font: inherit;
+  padding: 0.75rem 0.875rem;
+  outline-offset: 2px;
+}
+
+.knowledge-search-results {
+  display: grid;
+  gap: 0.25rem;
+  margin-top: 0.5rem;
+}
+
+.knowledge-search-result {
+  display: grid;
+  gap: 0.2rem;
+  border-radius: 0.35rem;
+  color: var(--sl-color-gray-2);
+  padding: 0.65rem 0.7rem;
+  text-decoration: none;
+}
+
+.knowledge-search-result:hover {
+  background: var(--sl-color-gray-5);
+  color: var(--sl-color-white);
+}
+
+.knowledge-search-result strong {
+  color: var(--sl-color-white);
+  font-size: var(--sl-text-sm);
+  font-weight: 600;
+}
+
+.knowledge-search-result span {
+  color: var(--sl-color-gray-3);
+  font-size: var(--sl-text-xs);
+  line-height: 1.35;
+}
+
+summary:where(.astro-j63poqv6) .knowledge-summary-link {
+  display: inline;
+  margin: 0;
+  padding: 0;
+  color: inherit;
+  text-decoration: none;
+}
+
+summary:where(.astro-j63poqv6)[aria-current="page"] .knowledge-summary-link,
+summary:where(.astro-j63poqv6)[aria-current="page"] .large,
+summary:where(.astro-j63poqv6)[aria-current="page"] .caret {
+  color: var(--sl-color-text-invert);
+}
+
+.sl-markdown-content .knowledge-button:not(:where(.not-content *)) {
+  display: inline-flex;
+  align-items: center;
+  border: 1px solid var(--sl-color-text-accent);
+  border-radius: 999rem;
+  background: var(--sl-color-text-accent);
+  color: var(--sl-color-black);
+  font-size: var(--sl-text-base);
+  font-weight: 600;
+  line-height: 1.1875;
+  padding: 0.9375rem 1.25rem;
+  text-decoration: none;
+}
+
+.sl-markdown-content .knowledge-button:hover:not(:where(.not-content *)) {
+  color: var(--sl-color-black);
+  filter: brightness(1.06);
+}
+
+.knowledge-card-list {
+  padding-inline-start: 1.25rem;
+}
+
+.knowledge-card-list li + li {
+  margin-top: 0.35rem;
+}
diff --git a/assets/vendor/ssscript-docs/_astro/MobileTableOfContents.astro_astro_type_script_index_0_lang.hwBsy0Mo.js b/assets/vendor/ssscript-docs/_astro/MobileTableOfContents.astro_astro_type_script_index_0_lang.hwBsy0Mo.js
new file mode 100644
index 0000000..b2fd297
--- /dev/null
+++ b/assets/vendor/ssscript-docs/_astro/MobileTableOfContents.astro_astro_type_script_index_0_lang.hwBsy0Mo.js
@@ -0,0 +1 @@
+import{S as r}from"./TableOfContents.astro_astro_type_script_index_0_lang.FuRcXuRY.js";class c extends r{set current(e){super.current=e;const t=this.querySelector(".display-current");t&&(t.textContent=e.textContent)}constructor(){super();const e=this.querySelector("details");if(!e)return;const t=()=>{e.open=!1};e.querySelectorAll("a").forEach(s=>{s.addEventListener("click",t)}),window.addEventListener("click",s=>{e.contains(s.target)||t()}),window.addEventListener("keydown",s=>{if(s.key==="Escape"&&e.open){const o=e.contains(document.activeElement);if(t(),o){const n=e.querySelector("summary");n&&n.focus()}}})}}customElements.define("mobile-starlight-toc",c);
diff --git a/assets/vendor/ssscript-docs/_astro/TableOfContents.astro_astro_type_script_index_0_lang.FuRcXuRY.js b/assets/vendor/ssscript-docs/_astro/TableOfContents.astro_astro_type_script_index_0_lang.FuRcXuRY.js
new file mode 100644
index 0000000..53de038
--- /dev/null
+++ b/assets/vendor/ssscript-docs/_astro/TableOfContents.astro_astro_type_script_index_0_lang.FuRcXuRY.js
@@ -0,0 +1 @@
+const m="_top";class H extends HTMLElement{constructor(){super(),this._current=this.querySelector('a[aria-current="true"]'),this.minH=parseInt(this.dataset.minH||"2",10),this.maxH=parseInt(this.dataset.maxH||"3",10),this.tocHeadingSelector=`h1#${m},:where(${[...Array.from({length:1+this.maxH-this.minH}).map((e,n)=>`h${this.minH+n}`)].join()})[id]`,this.onIdle=e=>(window.requestIdleCallback||(n=>setTimeout(n,1)))(e),this.init=()=>{const e=[...this.querySelectorAll("a")],n=t=>t.matches(this.tocHeadingSelector),i=t=>{if(!t)return null;const h=t;for(;t;){if(t.matches(".sl-markdown-content, main > *"))return document.getElementById(m);if(n(t))return t;const s=t.querySelector(this.tocHeadingSelector);if(s)return s;for(t=t.previousElementSibling;t?.lastElementChild;)t=t.lastElementChild;const o=i(t);if(o)return o}return i(h.parentElement)},c=t=>{for(const{isIntersecting:h,target:s}of t){if(!h)continue;const o=i(s);if(!o)continue;const l=e.find(g=>g.hash==="#"+encodeURIComponent(o.id));if(l){this.current=l;break}}},a=document.querySelectorAll([`main :where(${this.tocHeadingSelector})`,`main :where(${this.tocHeadingSelector}, .sl-heading-wrapper) ~ *:not(:has(${this.tocHeadingSelector}))`,`main .sl-markdown-content > *:not(:has(${this.tocHeadingSelector}))`,`main > *:not(:has(${this.tocHeadingSelector}))`].join());let r;const u=()=>{r||(r=new IntersectionObserver(c,{rootMargin:this.getRootMargin()}),a.forEach(t=>r.observe(t)))};u();let d;window.addEventListener("resize",()=>{r&&(r.disconnect(),r=void 0),clearTimeout(d),d=setTimeout(()=>this.onIdle(u),200)})},this.onIdle(()=>this.init())}set current(e){e!==this._current&&(this._current&&this._current.removeAttribute("aria-current"),e.setAttribute("aria-current","true"),this._current=e)}getRootMargin(){const e=document.querySelector("header")?.getBoundingClientRect().height||0,n=this.querySelector("summary")?.getBoundingClientRect().height||0,i=e+n+32,c=i+53,a=document.documentElement.clientHeight;return`-${i}px 0% ${c-a}px`}}customElements.define("starlight-toc",H);export{H as S};
diff --git a/assets/vendor/ssscript-docs/_astro/index.Bh6uiXgK.css b/assets/vendor/ssscript-docs/_astro/index.Bh6uiXgK.css
new file mode 100644
index 0000000..1d2f9e8
--- /dev/null
+++ b/assets/vendor/ssscript-docs/_astro/index.Bh6uiXgK.css
@@ -0,0 +1 @@
+/*! tailwindcss v4.2.1 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking:initial;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial}}}@layer base{*,:after,:before{border:0 solid}html,:host{font-family:var(--font-sans)}code,kbd,samp,pre{font-family:var(--font-mono)}}@layer starlight,theme,components;@layer utilities{:root{--sl-font:var(--font-sans);--sl-font-mono:var(--font-mono);--sl-color-white:var(--color-white);--sl-color-gray-1:var(--color-gray-200);--sl-color-gray-2:var(--color-gray-300);--sl-color-gray-3:var(--color-gray-400);--sl-color-gray-4:var(--color-gray-600);--sl-color-gray-5:var(--color-gray-700);--sl-color-gray-6:var(--color-gray-800);--sl-color-black:var(--color-gray-900);--sl-color-accent-low:var(--color-accent-950,var(--color-accent-900,#1e1b4b));--sl-color-accent:var(--color-accent-600,#4f46e5);--sl-color-accent-high:var(--color-accent-200,#c7d2fe)}:root[data-theme=light]{--sl-color-white:var(--color-gray-900);--sl-color-gray-1:var(--color-gray-800);--sl-color-gray-2:var(--color-gray-700);--sl-color-gray-3:var(--color-gray-500);--sl-color-gray-4:var(--color-gray-400);--sl-color-gray-5:var(--color-gray-300);--sl-color-gray-6:var(--color-gray-200);--sl-color-gray-7:var(--color-gray-100);--sl-color-black:var(--color-white);--sl-color-accent-low:var(--color-accent-200,#c7d2fe);--sl-color-accent:var(--color-accent-600,#4f46e5);--sl-color-accent-high:var(--color-accent-900,#312e81)}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.relative{position:relative}.static{position:static}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.col-span-full{grid-column:1/-1}.-m-1{margin:calc(var(--spacing) * -1)}.m-0{margin:calc(var(--spacing) * 0)}.my-4{margin-block:calc(var(--spacing) * 4)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mb-0{margin-bottom:calc(var(--spacing) * 0)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-flex{display:inline-flex}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-full{height:100%}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-shrink{flex-shrink:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.resize{resize:both}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-\(--sl-nav-gap\){gap:var(--sl-nav-gap)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-x-8{column-gap:calc(var(--spacing) * 8)}.gap-y-4{row-gap:calc(var(--spacing) * 4)}.overflow-clip{overflow:clip}.overflow-hidden{overflow:hidden}.rounded{border-radius:.25rem}.rounded-\[8px\]{border-radius:8px}.rounded-\[12px\]{border-radius:12px}.rounded-lg{border-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-amber-400\/35{border-color:#fcbb0059}@supports (color:color-mix(in lab,red,red)){.border-amber-400\/35{border-color:color-mix(in oklab,var(--color-amber-400) 35%,transparent)}}.border-amber-400\/40{border-color:#fcbb0066}@supports (color:color-mix(in lab,red,red)){.border-amber-400\/40{border-color:color-mix(in oklab,var(--color-amber-400) 40%,transparent)}}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/10{background-color:color-mix(in oklab,var(--color-amber-500) 10%,transparent)}}.p-1{padding:calc(var(--spacing) * 1)}.p-3{padding:calc(var(--spacing) * 3)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-\[0\.5rem\]{padding-inline:.5rem}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-\[0\.3rem\]{padding-block:.3rem}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-\[0\.4rem\]{padding-left:.4rem}.text-center{text-align:center}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-\[10px\]{font-size:10px}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.whitespace-nowrap{white-space:nowrap}.text-amber-100{color:var(--color-amber-100)}.text-amber-100\/90{color:#fef3c6e6}@supports (color:color-mix(in lab,red,red)){.text-amber-100\/90{color:color-mix(in oklab,var(--color-amber-100) 90%,transparent)}}.text-amber-100\/95{color:#fef3c6f2}@supports (color:color-mix(in lab,red,red)){.text-amber-100\/95{color:color-mix(in oklab,var(--color-amber-100) 95%,transparent)}}.text-amber-200{color:var(--color-amber-200)}.uppercase{text-transform:uppercase}.no-underline{text-decoration-line:none}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[color\,filter\]{transition-property:color,filter;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}@media not all and (min-width:48rem){.max-md\:flex{display:flex}}@media(min-width:48rem){.md\:items-start{align-items:flex-start}.md\:justify-start{justify-content:flex-start}.md\:gap-6{gap:calc(var(--spacing) * 6)}.md\:px-5{padding-inline:calc(var(--spacing) * 5)}.md\:py-\[0\.9375rem\]{padding-block:.9375rem}.md\:text-left{text-align:left}}@media print{.print\:hidden{display:none}}}@font-face{font-family:Instrument Sans;src:url(/_astro/InstrumentSans-Regular.JnvgzjHK.woff2)format("woff2");font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:Instrument Sans;src:url(/_astro/InstrumentSans-Italic.FeNa2EJX.woff2)format("woff2");font-weight:400;font-style:italic;font-display:swap}@font-face{font-family:Instrument Sans;src:url(/_astro/InstrumentSans-Medium.B2xOBd5A.woff2)format("woff2");font-weight:500;font-style:normal;font-display:swap}@font-face{font-family:Instrument Sans;src:url(/_astro/InstrumentSans-MediumItalic.c03vUl6A.woff2)format("woff2");font-weight:500;font-style:italic;font-display:swap}@font-face{font-family:Instrument Sans;src:url(/_astro/InstrumentSans-SemiBold.wfsLgfkq.woff2)format("woff2");font-weight:600;font-style:normal;font-display:swap}@font-face{font-family:Instrument Sans;src:url(/_astro/InstrumentSans-SemiBoldItalic.DRnKVj3E.woff2)format("woff2");font-weight:600;font-style:italic;font-display:swap}@font-face{font-family:Instrument Sans;src:url(/_astro/InstrumentSans-Bold.DWGdGw8L.woff2)format("woff2");font-weight:700;font-style:normal;font-display:swap}@font-face{font-family:Instrument Sans;src:url(/_astro/InstrumentSans-BoldItalic.BOjDmDe7.woff2)format("woff2");font-weight:700;font-style:italic;font-display:swap}:root,:host{--color-accent-200:var(--color-indigo-200);--color-accent-600:var(--color-indigo-600);--color-accent-900:var(--color-indigo-900);--color-accent-950:var(--color-indigo-950);--color-gray-100:var(--color-zinc-100);--color-gray-200:var(--color-zinc-200);--color-gray-300:var(--color-zinc-300);--color-gray-400:var(--color-zinc-400);--color-gray-500:var(--color-zinc-500);--color-gray-600:var(--color-zinc-600);--color-gray-700:var(--color-zinc-700);--color-gray-800:var(--color-zinc-800);--color-gray-900:var(--color-zinc-900);--font-sans:"Instrument Sans", ui-sans-serif, system-ui, sans-serif;--font-mono:ui-monospace, monospace;--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-indigo-200:oklch(87% .065 274.039);--color-indigo-600:oklch(51.1% .262 276.966);--color-indigo-900:oklch(35.9% .144 278.697);--color-indigo-950:oklch(25.7% .09 281.288);--color-zinc-100:oklch(96.7% .001 286.375);--color-zinc-200:oklch(92% .004 286.32);--color-zinc-300:oklch(87.1% .006 286.286);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-500:oklch(55.2% .016 285.938);--color-zinc-600:oklch(44.2% .017 285.786);--color-zinc-700:oklch(37% .013 285.805);--color-zinc-800:oklch(27.4% .006 286.033);--color-zinc-900:oklch(21% .006 285.885);--color-white:#fff;--spacing:.25rem;--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--font-weight-medium:500;--font-weight-semibold:600;--tracking-wide:.025em;--radius-lg:.5rem;--ease-out:cubic-bezier(0, 0, .2, 1);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1)}:root{--sl-color-black:#0a0a0a;--sl-color-gray-6:#141414;--sl-color-gray-5:#161616;--sl-color-gray-4:#2d2d2d;--sl-color-gray-3:#525252;--sl-color-gray-2:#b4b4b4;--sl-color-gray-1:#ebebeb;--sl-color-white:#fff;--docs-bg-gradient:linear-gradient(to bottom, #141414 0%, #0a0a0a 100%);--sl-color-accent-low:#2d2d2d;--sl-color-accent:#c4c4c4;--sl-color-accent-high:#ebebeb;--sl-color-text:var(--sl-color-gray-2);--sl-color-text-accent:var(--sl-color-accent-high);--sl-color-text-invert:var(--sl-color-accent-low);--sl-color-bg:var(--sl-color-black);--sl-color-bg-nav:var(--sl-color-gray-6);--sl-color-bg-sidebar:var(--sl-color-gray-6);--sl-color-bg-inline-code:var(--sl-color-gray-5);--sl-color-bg-accent:var(--sl-color-accent-high);--sl-color-hairline-light:var(--sl-color-gray-5);--sl-color-hairline:var(--sl-color-gray-6);--sl-color-hairline-shade:var(--sl-color-black);--sl-color-backdrop-overlay:#0a0a0aa8;--sl-line-height-headings:1.25;--sl-line-height-body:1.45}:root[data-theme=light],[data-theme=light]{--sl-color-white:#0f0f0f;--sl-color-gray-1:#181818;--sl-color-gray-2:#2d2d2d;--sl-color-gray-3:#525252;--sl-color-gray-4:#737373;--sl-color-gray-5:#a3a3a3;--sl-color-gray-6:#d4d4d4;--sl-color-gray-7:#ebebeb;--sl-color-black:#fff;--docs-bg-gradient:linear-gradient(to bottom, #fafafa 0%, #ebebeb 100%);--sl-color-accent-high:#2d2d2d;--sl-color-accent:#525252;--sl-color-accent-low:#e5e5e5;--sl-color-text-accent:var(--sl-color-accent-high);--sl-color-text-invert:var(--sl-color-black);--sl-color-bg-nav:var(--sl-color-gray-7);--sl-color-bg-sidebar:var(--sl-color-bg);--sl-color-bg-inline-code:var(--sl-color-gray-6);--sl-color-bg-accent:var(--sl-color-accent);--sl-color-hairline-light:var(--sl-color-gray-6);--sl-color-hairline-shade:var(--sl-color-gray-6);--sl-color-backdrop-overlay:#0006}body{background:var(--docs-bg-gradient);background-attachment:fixed;min-height:100vh}@layer starlight.core{.page,[data-sl-sidebar],[data-sl-main],.sl-sidebar-pane,.main-frame{background:0 0!important}site-search dialog{box-sizing:border-box;width:90%!important;max-width:40rem!important;height:max-content!important;min-height:15rem!important;max-height:calc(100% - 8rem)!important;margin:4rem auto auto!important;position:fixed!important;inset:0!important}}.sl-markdown-content{line-height:var(--sl-line-height-body)}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@layer starlight.base,starlight.reset,starlight.core,starlight.content,starlight.components,starlight.utils;@layer starlight.base{:root,::backdrop{--sl-color-white: hsl(0, 0%, 100%);--sl-color-gray-1: hsl(224, 20%, 94%);--sl-color-gray-2: hsl(224, 6%, 77%);--sl-color-gray-3: hsl(224, 6%, 56%);--sl-color-gray-4: hsl(224, 7%, 36%);--sl-color-gray-5: hsl(224, 10%, 23%);--sl-color-gray-6: hsl(224, 14%, 16%);--sl-color-black: hsl(224, 10%, 10%);--sl-hue-orange: 41;--sl-color-orange-low: hsl(var(--sl-hue-orange), 39%, 22%);--sl-color-orange: hsl(var(--sl-hue-orange), 82%, 63%);--sl-color-orange-high: hsl(var(--sl-hue-orange), 82%, 87%);--sl-hue-green: 101;--sl-color-green-low: hsl(var(--sl-hue-green), 39%, 22%);--sl-color-green: hsl(var(--sl-hue-green), 82%, 63%);--sl-color-green-high: hsl(var(--sl-hue-green), 82%, 80%);--sl-hue-blue: 234;--sl-color-blue-low: hsl(var(--sl-hue-blue), 54%, 20%);--sl-color-blue: hsl(var(--sl-hue-blue), 100%, 60%);--sl-color-blue-high: hsl(var(--sl-hue-blue), 100%, 87%);--sl-hue-purple: 281;--sl-color-purple-low: hsl(var(--sl-hue-purple), 39%, 22%);--sl-color-purple: hsl(var(--sl-hue-purple), 82%, 63%);--sl-color-purple-high: hsl(var(--sl-hue-purple), 82%, 89%);--sl-hue-red: 339;--sl-color-red-low: hsl(var(--sl-hue-red), 39%, 22%);--sl-color-red: hsl(var(--sl-hue-red), 82%, 63%);--sl-color-red-high: hsl(var(--sl-hue-red), 82%, 87%);--sl-color-accent-low: hsl(224, 54%, 20%);--sl-color-accent: hsl(224, 100%, 60%);--sl-color-accent-high: hsl(224, 100%, 85%);--sl-color-text: var(--sl-color-gray-2);--sl-color-text-accent: var(--sl-color-accent-high);--sl-color-text-invert: var(--sl-color-accent-low);--sl-color-bg: var(--sl-color-black);--sl-color-bg-nav: var(--sl-color-gray-6);--sl-color-bg-sidebar: var(--sl-color-gray-6);--sl-color-bg-inline-code: var(--sl-color-gray-5);--sl-color-bg-accent: var(--sl-color-accent-high);--sl-color-hairline-light: var(--sl-color-gray-5);--sl-color-hairline: var(--sl-color-gray-6);--sl-color-hairline-shade: var(--sl-color-black);--sl-color-backdrop-overlay: hsla(223, 13%, 10%, .66);--sl-shadow-sm: 0px 1px 1px hsla(0, 0%, 0%, .12), 0px 2px 1px hsla(0, 0%, 0%, .24);--sl-shadow-md: 0px 8px 4px hsla(0, 0%, 0%, .08), 0px 5px 2px hsla(0, 0%, 0%, .08), 0px 3px 2px hsla(0, 0%, 0%, .12), 0px 1px 1px hsla(0, 0%, 0%, .15);--sl-shadow-lg: 0px 25px 7px hsla(0, 0%, 0%, .03), 0px 16px 6px hsla(0, 0%, 0%, .1), 0px 9px 5px hsla(223, 13%, 10%, .33), 0px 4px 4px hsla(0, 0%, 0%, .75), 0px 4px 2px hsla(0, 0%, 0%, .25);--sl-text-2xs: .75rem;--sl-text-xs: .8125rem;--sl-text-sm: .875rem;--sl-text-base: 1rem;--sl-text-lg: 1.125rem;--sl-text-xl: 1.25rem;--sl-text-2xl: 1.5rem;--sl-text-3xl: 1.8125rem;--sl-text-4xl: 2.1875rem;--sl-text-5xl: 2.625rem;--sl-text-6xl: 4rem;--sl-text-body: var(--sl-text-base);--sl-text-body-sm: var(--sl-text-xs);--sl-text-code: var(--sl-text-sm);--sl-text-code-sm: var(--sl-text-xs);--sl-text-h1: var(--sl-text-4xl);--sl-text-h2: var(--sl-text-3xl);--sl-text-h3: var(--sl-text-2xl);--sl-text-h4: var(--sl-text-xl);--sl-text-h5: var(--sl-text-lg);--sl-line-height: 1.75;--sl-line-height-headings: 1.2;--sl-font-system: ui-sans-serif, system-ui, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--sl-font-system-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--__sl-font: var(--sl-font, var(--sl-font-system)), var(--sl-font-system);--__sl-font-mono: var(--sl-font-mono, var(--sl-font-system-mono)), var(--sl-font-system-mono);--sl-nav-height: 3.5rem;--sl-nav-pad-x: 1rem;--sl-nav-pad-y: .75rem;--sl-mobile-toc-height: 3rem;--sl-sidebar-width: 18.75rem;--sl-sidebar-pad-x: 1rem;--sl-content-width: 45rem;--sl-content-pad-x: 1rem;--sl-content-gap-y: 1rem;--sl-main-pad: 0 0 3vh 0;--sl-menu-button-size: 2rem;--sl-nav-gap: var(--sl-content-pad-x);--sl-outline-offset-inside: -.1875rem;--sl-z-index-toc: 4;--sl-z-index-menu: 5;--sl-z-index-navbar: 10;--sl-z-index-skiplink: 20}:root[data-theme=light],[data-theme=light] ::backdrop{--sl-color-white: hsl(224, 10%, 10%);--sl-color-gray-1: hsl(224, 14%, 16%);--sl-color-gray-2: hsl(224, 10%, 23%);--sl-color-gray-3: hsl(224, 7%, 36%);--sl-color-gray-4: hsl(224, 6%, 56%);--sl-color-gray-5: hsl(224, 6%, 77%);--sl-color-gray-6: hsl(224, 20%, 94%);--sl-color-gray-7: hsl(224, 19%, 97%);--sl-color-black: hsl(0, 0%, 100%);--sl-color-orange-high: hsl(var(--sl-hue-orange), 80%, 25%);--sl-color-orange: hsl(var(--sl-hue-orange), 90%, 60%);--sl-color-orange-low: hsl(var(--sl-hue-orange), 90%, 88%);--sl-color-green-high: hsl(var(--sl-hue-green), 80%, 22%);--sl-color-green: hsl(var(--sl-hue-green), 90%, 46%);--sl-color-green-low: hsl(var(--sl-hue-green), 85%, 90%);--sl-color-blue-high: hsl(var(--sl-hue-blue), 80%, 30%);--sl-color-blue: hsl(var(--sl-hue-blue), 90%, 60%);--sl-color-blue-low: hsl(var(--sl-hue-blue), 88%, 90%);--sl-color-purple-high: hsl(var(--sl-hue-purple), 90%, 30%);--sl-color-purple: hsl(var(--sl-hue-purple), 90%, 60%);--sl-color-purple-low: hsl(var(--sl-hue-purple), 80%, 90%);--sl-color-red-high: hsl(var(--sl-hue-red), 80%, 30%);--sl-color-red: hsl(var(--sl-hue-red), 90%, 60%);--sl-color-red-low: hsl(var(--sl-hue-red), 80%, 90%);--sl-color-accent-high: hsl(234, 80%, 30%);--sl-color-accent: hsl(234, 90%, 60%);--sl-color-accent-low: hsl(234, 88%, 90%);--sl-color-text-accent: var(--sl-color-accent);--sl-color-text-invert: var(--sl-color-black);--sl-color-bg-nav: var(--sl-color-gray-7);--sl-color-bg-sidebar: var(--sl-color-bg);--sl-color-bg-inline-code: var(--sl-color-gray-6);--sl-color-bg-accent: var(--sl-color-accent);--sl-color-hairline-light: var(--sl-color-gray-6);--sl-color-hairline-shade: var(--sl-color-gray-6);--sl-color-backdrop-overlay: hsla(225, 9%, 36%, .66);--sl-shadow-sm: 0px 1px 1px hsla(0, 0%, 0%, .06), 0px 2px 1px hsla(0, 0%, 0%, .06);--sl-shadow-md: 0px 8px 4px hsla(0, 0%, 0%, .03), 0px 5px 2px hsla(0, 0%, 0%, .03), 0px 3px 2px hsla(0, 0%, 0%, .06), 0px 1px 1px hsla(0, 0%, 0%, .06);--sl-shadow-lg: 0px 25px 7px rgba(0, 0, 0, .01), 0px 16px 6px hsla(0, 0%, 0%, .03), 0px 9px 5px hsla(223, 13%, 10%, .08), 0px 4px 4px hsla(0, 0%, 0%, .16), 0px 4px 2px hsla(0, 0%, 0%, .04)}@media(min-width:50em){:root{--sl-nav-height: 4rem;--sl-nav-pad-x: 1.5rem;--sl-text-h1: var(--sl-text-5xl);--sl-text-h2: var(--sl-text-4xl);--sl-text-h3: var(--sl-text-3xl);--sl-text-h4: var(--sl-text-2xl)}}@media(min-width:72rem){:root{--sl-content-pad-x: 1.5rem;--sl-mobile-toc-height: 0rem}}}@layer starlight.reset{*,*:before,*:after{box-sizing:border-box}*{margin:0}html{color-scheme:dark;accent-color:var(--sl-color-accent);-webkit-text-size-adjust:100%;text-size-adjust:100%}html[data-theme=light]{color-scheme:light}body{font-family:var(--__sl-font);line-height:var(--sl-line-height);-webkit-font-smoothing:antialiased;color:var(--sl-color-text);background-color:var(--sl-color-bg)}input,button,textarea,select{font:inherit}p,h1,h2,h3,h4,h5,h6,code{overflow-wrap:break-word}code{font-family:var(--__sl-font-mono)}}@layer starlight.components{.starlight-aside{padding:1rem;border-inline-start:.25rem solid var(--sl-color-asides-border);color:var(--sl-color-white)}.starlight-aside--note{--sl-color-asides-text-accent: var(--sl-color-blue-high);--sl-color-asides-border: var(--sl-color-blue);background-color:var(--sl-color-blue-low)}.starlight-aside--tip{--sl-color-asides-text-accent: var(--sl-color-purple-high);--sl-color-asides-border: var(--sl-color-purple);background-color:var(--sl-color-purple-low)}.starlight-aside--caution{--sl-color-asides-text-accent: var(--sl-color-orange-high);--sl-color-asides-border: var(--sl-color-orange);background-color:var(--sl-color-orange-low)}.starlight-aside--danger{--sl-color-asides-text-accent: var(--sl-color-red-high);--sl-color-asides-border: var(--sl-color-red);background-color:var(--sl-color-red-low)}.starlight-aside__title{display:flex;gap:.5rem;align-items:center;font-size:var(--sl-text-h5);font-weight:600;line-height:var(--sl-line-height-headings);color:var(--sl-color-asides-text-accent)}.starlight-aside__icon{font-size:1.333em;width:1em;height:1em}.starlight-aside__title+.starlight-aside__content{margin-top:.5rem}.starlight-aside__content a{color:var(--sl-color-asides-text-accent)}}@layer starlight.utils{.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sl-hidden{display:none}.sl-flex{display:flex}.sl-block{display:block}@media(min-width:50rem){.md\:sl-hidden{display:none}.md\:sl-flex{display:flex}.md\:sl-block{display:block}}@media(min-width:72rem){.lg\:sl-hidden{display:none}.lg\:sl-flex{display:flex}.lg\:sl-block{display:block}}[data-theme=light] .light\:sl-hidden,[data-theme=dark] .dark\:sl-hidden{display:none}[dir=rtl] .rtl\:flip:not(:where([dir=rtl] [dir=ltr] *)){transform:scaleX(-1)}}@layer starlight.content{.sl-markdown-content .sl-heading-wrapper{--sl-anchor-icon-size: .8275em;--sl-anchor-icon-gap: .25em;--sl-anchor-icon-space: calc(var(--sl-anchor-icon-size) + var(--sl-anchor-icon-gap));line-height:var(--sl-line-height-headings)}.sl-markdown-content :not(h1,h2,h3,h4,h5,h6,.sl-heading-wrapper)+:is(.sl-heading-wrapper){margin-top:1.5em}.sl-markdown-content .sl-heading-wrapper.level-h1{font-size:var(--sl-text-h1)}.sl-markdown-content .sl-heading-wrapper.level-h2{font-size:var(--sl-text-h2)}.sl-markdown-content .sl-heading-wrapper.level-h3{font-size:var(--sl-text-h3)}.sl-markdown-content .sl-heading-wrapper.level-h4{font-size:var(--sl-text-h4)}.sl-markdown-content .sl-heading-wrapper.level-h5{font-size:var(--sl-text-h5)}.sl-markdown-content .sl-heading-wrapper.level-h6{font-size:var(--sl-text-h6)}.sl-markdown-content .sl-heading-wrapper>:first-child{display:inline;padding-inline-end:var(--sl-anchor-icon-space)}.sl-markdown-content .sl-anchor-link{position:relative;margin-inline-start:calc(-1 * var(--sl-anchor-icon-size));-webkit-user-select:none;user-select:none;display:inline-flex}.sl-markdown-content .sl-anchor-link:after{content:"";position:absolute;inset:-.25rem -.5rem}.sl-markdown-content .sl-anchor-icon>svg{display:inline;width:var(--sl-anchor-icon-size);vertical-align:top;transform:translateY(calc((var(--sl-line-height-headings) * 1em - var(--sl-anchor-icon-size)) / 2))}@media(hover:hover){.sl-markdown-content .sl-anchor-link{opacity:0}.sl-markdown-content .sl-anchor-link:focus,.sl-markdown-content .sl-heading-wrapper:hover .sl-anchor-link{opacity:1}}}@layer starlight.core{.sl-banner:where(.astro-2xxawopd){--__sl-banner-text: var(--sl-color-banner-text, var(--sl-color-text-invert));padding:var(--sl-nav-pad-y) var(--sl-nav-pad-x);background-color:var(--sl-color-banner-bg, var(--sl-color-bg-accent));color:var(--__sl-banner-text);line-height:var(--sl-line-height-headings);text-align:center;text-wrap:balance;box-shadow:var(--sl-shadow-sm)}.sl-banner:where(.astro-2xxawopd) a{color:var(--__sl-banner-text)}}@layer starlight.core{.content-panel:where(.astro-hxjpthjh){padding:1.5rem var(--sl-content-pad-x)}.content-panel:where(.astro-hxjpthjh)+.content-panel:where(.astro-hxjpthjh){border-top:1px solid var(--sl-color-hairline)}.sl-container:where(.astro-hxjpthjh){max-width:var(--sl-content-width)}.sl-container:where(.astro-hxjpthjh)>*+*{margin-top:1.5rem}@media(min-width:72rem){.sl-container:where(.astro-hxjpthjh){margin-inline:var(--sl-content-margin-inline, auto)}}}@layer starlight.components{svg:where(.astro-fr7meb3z){color:var(--sl-icon-color);font-size:var(--sl-icon-size, 1em);width:1em;height:1em}}@layer starlight.core{p:where(.astro-hykfrv54){border:1px solid var(--sl-color-orange);padding:.75em 1em;background-color:var(--sl-color-orange-low);color:var(--sl-color-orange-high);width:max-content;max-width:100%;align-items:center;gap:.75em;font-size:var(--sl-text-body-sm);line-height:var(--sl-line-height-headings)}}@layer starlight.core{a:where(.astro-uawllorr){gap:.5rem;align-items:center;text-decoration:none;color:var(--sl-color-gray-3)}a:where(.astro-uawllorr):hover{color:var(--sl-color-white)}}@layer starlight.core{.pagination-links:where(.astro-7ghqze2o){display:grid;grid-template-columns:repeat(auto-fit,minmax(min(18rem,100%),1fr));gap:1rem}a:where(.astro-7ghqze2o){display:flex;align-items:center;justify-content:flex-start;gap:.5rem;width:100%;flex-basis:calc(50% - .5rem);flex-grow:1;border:1px solid var(--sl-color-gray-5);border-radius:.5rem;padding:1rem;text-decoration:none;color:var(--sl-color-gray-2);box-shadow:var(--sl-shadow-md);overflow-wrap:anywhere}:where(.astro-7ghqze2o)[rel=next]{justify-content:end;text-align:end;flex-direction:row-reverse}a:where(.astro-7ghqze2o):hover{border-color:var(--sl-color-gray-2)}.link-title:where(.astro-7ghqze2o){color:var(--sl-color-white);font-size:var(--sl-text-2xl);line-height:var(--sl-line-height-headings)}svg:where(.astro-7ghqze2o){flex-shrink:0}}@layer starlight.components{:root{--sl-badge-default-border: var(--sl-color-accent);--sl-badge-default-bg: var(--sl-color-accent-low);--sl-badge-default-text: #fff;--sl-badge-note-border: var(--sl-color-blue);--sl-badge-note-bg: var(--sl-color-blue-low);--sl-badge-note-text: #fff;--sl-badge-danger-border: var(--sl-color-red);--sl-badge-danger-bg: var(--sl-color-red-low);--sl-badge-danger-text: #fff;--sl-badge-success-border: var(--sl-color-green);--sl-badge-success-bg: var(--sl-color-green-low);--sl-badge-success-text: #fff;--sl-badge-caution-border: var(--sl-color-orange);--sl-badge-caution-bg: var(--sl-color-orange-low);--sl-badge-caution-text: #fff;--sl-badge-tip-border: var(--sl-color-purple);--sl-badge-tip-bg: var(--sl-color-purple-low);--sl-badge-tip-text: #fff}[data-theme=light]:root{--sl-badge-default-bg: var(--sl-color-accent-high);--sl-badge-note-bg: var(--sl-color-blue-high);--sl-badge-danger-bg: var(--sl-color-red-high);--sl-badge-success-bg: var(--sl-color-green-high);--sl-badge-caution-bg: var(--sl-color-orange-high);--sl-badge-tip-bg: var(--sl-color-purple-high)}.sl-badge:where(.astro-px754twf){display:inline-block;border:1px solid var(--sl-color-border-badge);border-radius:.25rem;font-family:var(--sl-font-system-mono);line-height:normal;color:var(--sl-color-text-badge);background-color:var(--sl-color-bg-badge);overflow-wrap:anywhere}.sidebar-content .sl-badge:where(.astro-px754twf){line-height:1;font-size:var(--sl-text-xs);padding:.125rem .375rem}.sidebar-content a[aria-current=page]>.sl-badge:where(.astro-px754twf){--sl-color-bg-badge: transparent;--sl-color-border-badge: currentColor;color:inherit}.default:where(.astro-px754twf){--sl-color-bg-badge: var(--sl-badge-default-bg);--sl-color-border-badge: var(--sl-badge-default-border);--sl-color-text-badge: var(--sl-badge-default-text)}.note:where(.astro-px754twf){--sl-color-bg-badge: var(--sl-badge-note-bg);--sl-color-border-badge: var(--sl-badge-note-border);--sl-color-text-badge: var(--sl-badge-note-text)}.danger:where(.astro-px754twf){--sl-color-bg-badge: var(--sl-badge-danger-bg);--sl-color-border-badge: var(--sl-badge-danger-border);--sl-color-text-badge: var(--sl-badge-danger-text)}.success:where(.astro-px754twf){--sl-color-bg-badge: var(--sl-badge-success-bg);--sl-color-border-badge: var(--sl-badge-success-border);--sl-color-text-badge: var(--sl-badge-success-text)}.tip:where(.astro-px754twf){--sl-color-bg-badge: var(--sl-badge-tip-bg);--sl-color-border-badge: var(--sl-badge-tip-border);--sl-color-text-badge: var(--sl-badge-tip-text)}.caution:where(.astro-px754twf){--sl-color-bg-badge: var(--sl-badge-caution-bg);--sl-color-border-badge: var(--sl-badge-caution-border);--sl-color-text-badge: var(--sl-badge-caution-text)}.small:where(.astro-px754twf){font-size:var(--sl-text-xs);padding:.125rem .25rem}.medium:where(.astro-px754twf){font-size:var(--sl-text-sm);padding:.175rem .35rem}.large:where(.astro-px754twf){font-size:var(--sl-text-base);padding:.225rem .45rem}.sl-markdown-content :is(h1,h2,h3,h4,h5,h6) .sl-badge:where(.astro-px754twf){vertical-align:middle}}@layer starlight.components{.sl-steps{--bullet-size: calc(var(--sl-line-height) * 1rem);--bullet-margin: .375rem;list-style:none;counter-reset:steps-counter var(--sl-steps-start, 0);padding-inline-start:0}.sl-steps>li{counter-increment:steps-counter;position:relative;padding-inline-start:calc(var(--bullet-size) + 1rem);padding-bottom:1px;min-height:calc(var(--bullet-size) + var(--bullet-margin))}.sl-steps>li+li{margin-top:0}.sl-steps>li:before{content:counter(steps-counter);position:absolute;top:0;inset-inline-start:0;width:var(--bullet-size);height:var(--bullet-size);line-height:var(--bullet-size);font-size:var(--sl-text-xs);font-weight:600;text-align:center;color:var(--sl-color-white);background-color:var(--sl-color-gray-6);border-radius:99rem;box-shadow:inset 0 0 0 1px var(--sl-color-gray-5)}.sl-steps>li:after{--guide-width: 1px;content:"";position:absolute;top:calc(var(--bullet-size) + var(--bullet-margin));bottom:var(--bullet-margin);inset-inline-start:calc((var(--bullet-size) - var(--guide-width)) / 2);width:var(--guide-width);background-color:var(--sl-color-hairline-light)}}@layer starlight.content{.sl-steps>li>:first-child{--lh: calc(1em * var(--sl-line-height));--shift-y: calc(.5 * (var(--bullet-size) - var(--lh)));transform:translateY(var(--shift-y));margin-bottom:var(--shift-y)}.sl-steps>li>:first-child:where(h1,h2,h3,h4,h5,h6){--lh: calc(1em * var(--sl-line-height-headings))}@supports (--prop: 1lh){.sl-steps>li>:first-child{--lh: 1lh}}}@layer starlight.core{footer:where(.astro-vcuyfr7s){flex-direction:column;gap:1.5rem}.meta:where(.astro-vcuyfr7s){gap:.75rem 3rem;justify-content:space-between;flex-wrap:wrap;margin-top:3rem;font-size:var(--sl-text-sm);color:var(--sl-color-gray-3)}.meta:where(.astro-vcuyfr7s)>p:only-child{margin-inline-start:auto}.kudos:where(.astro-vcuyfr7s){align-items:center;gap:.5em;margin:1.5rem auto;font-size:var(--sl-text-xs);text-decoration:none;color:var(--sl-color-gray-3)}.kudos:where(.astro-vcuyfr7s):hover{color:var(--sl-color-white)}}@layer starlight.components{.kudos:where(.astro-vcuyfr7s) svg{color:var(--sl-color-orange)}}@layer starlight.core{label:where(.astro-47nlhtql){--sl-label-icon-size: .875rem;--sl-caret-size: 1.25rem;--sl-inline-padding: .5rem;position:relative;display:flex;align-items:center;gap:.25rem;color:var(--sl-color-gray-1)}label:where(.astro-47nlhtql):hover{color:var(--sl-color-gray-2)}.icon:where(.astro-47nlhtql){position:absolute;top:50%;transform:translateY(-50%);pointer-events:none}select:where(.astro-47nlhtql){border:0;padding-block:.625rem;padding-inline:calc(var(--sl-label-icon-size) + var(--sl-inline-padding) + .25rem) calc(var(--sl-caret-size) + var(--sl-inline-padding) + .25rem);margin-inline:calc(var(--sl-inline-padding) * -1);width:calc(var(--sl-select-width) + var(--sl-inline-padding) * 2);background-color:transparent;text-overflow:ellipsis;color:inherit;cursor:pointer;appearance:none}option:where(.astro-47nlhtql){background-color:var(--sl-color-bg-nav);color:var(--sl-color-gray-1)}@media(min-width:50rem){select:where(.astro-47nlhtql){font-size:var(--sl-text-sm)}}}@layer starlight.components{.label-icon:where(.astro-47nlhtql){font-size:var(--sl-label-icon-size);inset-inline-start:0}.caret:where(.astro-47nlhtql){font-size:var(--sl-caret-size);inset-inline-end:0}}@layer starlight.core{.pagefind-ui__result.svelte-j9e30.svelte-j9e30{list-style-type:none;display:flex;align-items:flex-start;gap:min(calc(40px * var(--pagefind-ui-scale)),3%);padding:calc(30px * var(--pagefind-ui-scale)) 0 calc(40px * var(--pagefind-ui-scale));border-top:solid var(--pagefind-ui-border-width) var(--pagefind-ui-border)}.pagefind-ui__result.svelte-j9e30.svelte-j9e30:last-of-type{border-bottom:solid var(--pagefind-ui-border-width) var(--pagefind-ui-border)}.pagefind-ui__result-thumb.svelte-j9e30.svelte-j9e30{width:min(30%,calc((30% - (100px * var(--pagefind-ui-scale))) * 100000));max-width:calc(120px * var(--pagefind-ui-scale));margin-top:calc(10px * var(--pagefind-ui-scale));aspect-ratio:var(--pagefind-ui-image-box-ratio);position:relative}.pagefind-ui__result-image.svelte-j9e30.svelte-j9e30{display:block;position:absolute;left:50%;transform:translate(-50%);font-size:0;width:auto;height:auto;max-width:100%;max-height:100%;border-radius:var(--pagefind-ui-image-border-radius)}.pagefind-ui__result-inner.svelte-j9e30.svelte-j9e30{flex:1;display:flex;flex-direction:column;align-items:flex-start;margin-top:calc(10px * var(--pagefind-ui-scale))}.pagefind-ui__result-title.svelte-j9e30.svelte-j9e30{display:inline-block;font-weight:700;font-size:calc(21px * var(--pagefind-ui-scale));margin-top:0;margin-bottom:0}.pagefind-ui__result-title.svelte-j9e30 .pagefind-ui__result-link.svelte-j9e30{color:var(--pagefind-ui-text);text-decoration:none}.pagefind-ui__result-title.svelte-j9e30 .pagefind-ui__result-link.svelte-j9e30:hover{text-decoration:underline}.pagefind-ui__result-excerpt.svelte-j9e30.svelte-j9e30{display:inline-block;font-weight:400;font-size:calc(16px * var(--pagefind-ui-scale));margin-top:calc(4px * var(--pagefind-ui-scale));margin-bottom:0;min-width:calc(250px * var(--pagefind-ui-scale))}.pagefind-ui__loading.svelte-j9e30.svelte-j9e30{color:var(--pagefind-ui-text);background-color:var(--pagefind-ui-text);border-radius:var(--pagefind-ui-border-radius);opacity:.1;pointer-events:none}.pagefind-ui__result-tags.svelte-j9e30.svelte-j9e30{list-style-type:none;padding:0;display:flex;gap:calc(20px * var(--pagefind-ui-scale));flex-wrap:wrap;margin-top:calc(20px * var(--pagefind-ui-scale))}.pagefind-ui__result-tag.svelte-j9e30.svelte-j9e30{padding:calc(4px * var(--pagefind-ui-scale)) calc(8px * var(--pagefind-ui-scale));font-size:calc(14px * var(--pagefind-ui-scale));border-radius:var(--pagefind-ui-border-radius);background-color:var(--pagefind-ui-tag)}.pagefind-ui__result.svelte-4xnkmf.svelte-4xnkmf{list-style-type:none;display:flex;align-items:flex-start;gap:min(calc(40px * var(--pagefind-ui-scale)),3%);padding:calc(30px * var(--pagefind-ui-scale)) 0 calc(40px * var(--pagefind-ui-scale));border-top:solid var(--pagefind-ui-border-width) var(--pagefind-ui-border)}.pagefind-ui__result.svelte-4xnkmf.svelte-4xnkmf:last-of-type{border-bottom:solid var(--pagefind-ui-border-width) var(--pagefind-ui-border)}.pagefind-ui__result-nested.svelte-4xnkmf.svelte-4xnkmf{display:flex;flex-direction:column;padding-left:calc(20px * var(--pagefind-ui-scale))}.pagefind-ui__result-nested.svelte-4xnkmf.svelte-4xnkmf:first-of-type{padding-top:calc(10px * var(--pagefind-ui-scale))}.pagefind-ui__result-nested.svelte-4xnkmf .pagefind-ui__result-link.svelte-4xnkmf{font-size:.9em;position:relative}.pagefind-ui__result-nested.svelte-4xnkmf .pagefind-ui__result-link.svelte-4xnkmf:before{content:"⤷ ";position:absolute;top:0;right:calc(100% + .1em)}.pagefind-ui__result-thumb.svelte-4xnkmf.svelte-4xnkmf{width:min(30%,calc((30% - (100px * var(--pagefind-ui-scale))) * 100000));max-width:calc(120px * var(--pagefind-ui-scale));margin-top:calc(10px * var(--pagefind-ui-scale));aspect-ratio:var(--pagefind-ui-image-box-ratio);position:relative}.pagefind-ui__result-image.svelte-4xnkmf.svelte-4xnkmf{display:block;position:absolute;left:50%;transform:translate(-50%);font-size:0;width:auto;height:auto;max-width:100%;max-height:100%;border-radius:var(--pagefind-ui-image-border-radius)}.pagefind-ui__result-inner.svelte-4xnkmf.svelte-4xnkmf{flex:1;display:flex;flex-direction:column;align-items:flex-start;margin-top:calc(10px * var(--pagefind-ui-scale))}.pagefind-ui__result-title.svelte-4xnkmf.svelte-4xnkmf{display:inline-block;font-weight:700;font-size:calc(21px * var(--pagefind-ui-scale));margin-top:0;margin-bottom:0}.pagefind-ui__result-title.svelte-4xnkmf .pagefind-ui__result-link.svelte-4xnkmf{color:var(--pagefind-ui-text);text-decoration:none}.pagefind-ui__result-title.svelte-4xnkmf .pagefind-ui__result-link.svelte-4xnkmf:hover{text-decoration:underline}.pagefind-ui__result-excerpt.svelte-4xnkmf.svelte-4xnkmf{display:inline-block;font-weight:400;font-size:calc(16px * var(--pagefind-ui-scale));margin-top:calc(4px * var(--pagefind-ui-scale));margin-bottom:0;min-width:calc(250px * var(--pagefind-ui-scale))}.pagefind-ui__loading.svelte-4xnkmf.svelte-4xnkmf{color:var(--pagefind-ui-text);background-color:var(--pagefind-ui-text);border-radius:var(--pagefind-ui-border-radius);opacity:.1;pointer-events:none}.pagefind-ui__result-tags.svelte-4xnkmf.svelte-4xnkmf{list-style-type:none;padding:0;display:flex;gap:calc(20px * var(--pagefind-ui-scale));flex-wrap:wrap;margin-top:calc(20px * var(--pagefind-ui-scale))}.pagefind-ui__result-tag.svelte-4xnkmf.svelte-4xnkmf{padding:calc(4px * var(--pagefind-ui-scale)) calc(8px * var(--pagefind-ui-scale));font-size:calc(14px * var(--pagefind-ui-scale));border-radius:var(--pagefind-ui-border-radius);background-color:var(--pagefind-ui-tag)}legend.svelte-1v2r7ls.svelte-1v2r7ls{position:absolute;clip:rect(0 0 0 0)}.pagefind-ui__filter-panel.svelte-1v2r7ls.svelte-1v2r7ls{min-width:min(calc(260px * var(--pagefind-ui-scale)),100%);flex:1;display:flex;flex-direction:column;margin-top:calc(20px * var(--pagefind-ui-scale))}.pagefind-ui__filter-group.svelte-1v2r7ls.svelte-1v2r7ls{border:0;padding:0}.pagefind-ui__filter-block.svelte-1v2r7ls.svelte-1v2r7ls{padding:0;display:block;border-bottom:solid calc(2px * var(--pagefind-ui-scale)) var(--pagefind-ui-border);padding:calc(20px * var(--pagefind-ui-scale)) 0}.pagefind-ui__filter-name.svelte-1v2r7ls.svelte-1v2r7ls{font-size:calc(16px * var(--pagefind-ui-scale));position:relative;display:flex;align-items:center;list-style:none;font-weight:700;cursor:pointer;height:calc(24px * var(--pagefind-ui-scale))}.pagefind-ui__filter-name.svelte-1v2r7ls.svelte-1v2r7ls::-webkit-details-marker{display:none}.pagefind-ui__filter-name.svelte-1v2r7ls.svelte-1v2r7ls:after{position:absolute;content:"";right:calc(6px * var(--pagefind-ui-scale));top:50%;width:calc(8px * var(--pagefind-ui-scale));height:calc(8px * var(--pagefind-ui-scale));border:solid calc(2px * var(--pagefind-ui-scale)) currentColor;border-right:0;border-top:0;transform:translateY(-70%) rotate(-45deg)}.pagefind-ui__filter-block[open].svelte-1v2r7ls .pagefind-ui__filter-name.svelte-1v2r7ls:after{transform:translateY(-70%) rotate(-225deg)}.pagefind-ui__filter-group.svelte-1v2r7ls.svelte-1v2r7ls{display:flex;flex-direction:column;gap:calc(20px * var(--pagefind-ui-scale));padding-top:calc(30px * var(--pagefind-ui-scale))}.pagefind-ui__filter-value.svelte-1v2r7ls.svelte-1v2r7ls{position:relative;display:flex;align-items:center;gap:calc(8px * var(--pagefind-ui-scale))}.pagefind-ui__filter-value.svelte-1v2r7ls.svelte-1v2r7ls:before{position:absolute;content:"";top:50%;left:calc(8px * var(--pagefind-ui-scale));width:0px;height:0px;border:solid 1px #fff;opacity:0;transform:translate(calc(4.5px * var(--pagefind-ui-scale) * -1),calc(.8px * var(--pagefind-ui-scale))) skew(-5deg) rotate(-45deg);transform-origin:top left;border-top:0;border-right:0;pointer-events:none}.pagefind-ui__filter-value.pagefind-ui__filter-value--checked.svelte-1v2r7ls.svelte-1v2r7ls:before{opacity:1;width:calc(9px * var(--pagefind-ui-scale));height:calc(4px * var(--pagefind-ui-scale));transition:width .1s ease-out .1s,height .1s ease-in}.pagefind-ui__filter-checkbox.svelte-1v2r7ls.svelte-1v2r7ls{margin:0;width:calc(16px * var(--pagefind-ui-scale));height:calc(16px * var(--pagefind-ui-scale));border:solid 1px var(--pagefind-ui-border);appearance:none;-webkit-appearance:none;border-radius:calc(var(--pagefind-ui-border-radius) / 2);background-color:var(--pagefind-ui-background);cursor:pointer}.pagefind-ui__filter-checkbox.svelte-1v2r7ls.svelte-1v2r7ls:checked{background-color:var(--pagefind-ui-primary);border:solid 1px var(--pagefind-ui-primary)}.pagefind-ui__filter-label.svelte-1v2r7ls.svelte-1v2r7ls{cursor:pointer;font-size:calc(16px * var(--pagefind-ui-scale));font-weight:400}.pagefind-ui--reset *:where(:not(html,iframe,canvas,img,svg,video):not(svg *,symbol *)){all:unset;display:revert;outline:revert}.pagefind-ui--reset *,.pagefind-ui--reset *:before,.pagefind-ui--reset *:after{box-sizing:border-box}.pagefind-ui--reset a,.pagefind-ui--reset button{cursor:revert}.pagefind-ui--reset ol,.pagefind-ui--reset ul,.pagefind-ui--reset menu{list-style:none}.pagefind-ui--reset img{max-width:100%}.pagefind-ui--reset table{border-collapse:collapse}.pagefind-ui--reset input,.pagefind-ui--reset textarea{-webkit-user-select:auto}.pagefind-ui--reset textarea{white-space:revert}.pagefind-ui--reset meter{-webkit-appearance:revert;appearance:revert}.pagefind-ui--reset ::placeholder{color:unset}.pagefind-ui--reset :where([hidden]){display:none}.pagefind-ui--reset :where([contenteditable]:not([contenteditable=false])){-moz-user-modify:read-write;-webkit-user-modify:read-write;overflow-wrap:break-word;-webkit-line-break:after-white-space;-webkit-user-select:auto}.pagefind-ui--reset :where([draggable=true]){-webkit-user-drag:element}.pagefind-ui--reset mark{all:revert}:root{--pagefind-ui-scale:.8;--pagefind-ui-primary:#393939;--pagefind-ui-text:#393939;--pagefind-ui-background:#ffffff;--pagefind-ui-border:#eeeeee;--pagefind-ui-tag:#eeeeee;--pagefind-ui-border-width:2px;--pagefind-ui-border-radius:8px;--pagefind-ui-image-border-radius:8px;--pagefind-ui-image-box-ratio:3 / 2;--pagefind-ui-font:system, -apple-system, "BlinkMacSystemFont", ".SFNSText-Regular", "San Francisco", "Roboto", "Segoe UI", "Helvetica Neue", "Lucida Grande", "Ubuntu", "arial", sans-serif}.pagefind-ui.svelte-e9gkc3{width:100%;color:var(--pagefind-ui-text);font-family:var(--pagefind-ui-font)}.pagefind-ui__hidden.svelte-e9gkc3{display:none!important}.pagefind-ui__suppressed.svelte-e9gkc3{opacity:0;pointer-events:none}.pagefind-ui__form.svelte-e9gkc3{position:relative}.pagefind-ui__form.svelte-e9gkc3:before{background-color:var(--pagefind-ui-text);width:calc(18px * var(--pagefind-ui-scale));height:calc(18px * var(--pagefind-ui-scale));top:calc(23px * var(--pagefind-ui-scale));left:calc(20px * var(--pagefind-ui-scale));content:"";position:absolute;display:block;opacity:.7;-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.7549 11.255H11.9649L11.6849 10.985C12.6649 9.845 13.2549 8.365 13.2549 6.755C13.2549 3.165 10.3449 0.255005 6.75488 0.255005C3.16488 0.255005 0.254883 3.165 0.254883 6.755C0.254883 10.345 3.16488 13.255 6.75488 13.255C8.36488 13.255 9.84488 12.665 10.9849 11.685L11.2549 11.965V12.755L16.2549 17.745L17.7449 16.255L12.7549 11.255ZM6.75488 11.255C4.26488 11.255 2.25488 9.245 2.25488 6.755C2.25488 4.26501 4.26488 2.255 6.75488 2.255C9.24488 2.255 11.2549 4.26501 11.2549 6.755C11.2549 9.245 9.24488 11.255 6.75488 11.255Z' fill='%23000000'/%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.7549 11.255H11.9649L11.6849 10.985C12.6649 9.845 13.2549 8.365 13.2549 6.755C13.2549 3.165 10.3449 0.255005 6.75488 0.255005C3.16488 0.255005 0.254883 3.165 0.254883 6.755C0.254883 10.345 3.16488 13.255 6.75488 13.255C8.36488 13.255 9.84488 12.665 10.9849 11.685L11.2549 11.965V12.755L16.2549 17.745L17.7449 16.255L12.7549 11.255ZM6.75488 11.255C4.26488 11.255 2.25488 9.245 2.25488 6.755C2.25488 4.26501 4.26488 2.255 6.75488 2.255C9.24488 2.255 11.2549 4.26501 11.2549 6.755C11.2549 9.245 9.24488 11.255 6.75488 11.255Z' fill='%23000000'/%3E%3C/svg%3E%0A");-webkit-mask-size:100%;mask-size:100%;z-index:9;pointer-events:none}.pagefind-ui__search-input.svelte-e9gkc3{height:calc(64px * var(--pagefind-ui-scale));padding:0 calc(70px * var(--pagefind-ui-scale)) 0 calc(54px * var(--pagefind-ui-scale));background-color:var(--pagefind-ui-background);border:var(--pagefind-ui-border-width) solid var(--pagefind-ui-border);border-radius:var(--pagefind-ui-border-radius);font-size:calc(21px * var(--pagefind-ui-scale));position:relative;appearance:none;-webkit-appearance:none;display:flex;width:100%;box-sizing:border-box;font-weight:700}.pagefind-ui__search-input.svelte-e9gkc3::placeholder{opacity:.2}.pagefind-ui__search-clear.svelte-e9gkc3{position:absolute;top:calc(3px * var(--pagefind-ui-scale));right:calc(3px * var(--pagefind-ui-scale));height:calc(58px * var(--pagefind-ui-scale));padding:0 calc(15px * var(--pagefind-ui-scale)) 0 calc(2px * var(--pagefind-ui-scale));color:var(--pagefind-ui-text);font-size:calc(14px * var(--pagefind-ui-scale));cursor:pointer;background-color:var(--pagefind-ui-background);border-radius:var(--pagefind-ui-border-radius)}.pagefind-ui__drawer.svelte-e9gkc3{gap:calc(60px * var(--pagefind-ui-scale));display:flex;flex-direction:row;flex-wrap:wrap}.pagefind-ui__results-area.svelte-e9gkc3{min-width:min(calc(400px * var(--pagefind-ui-scale)),100%);flex:1000;margin-top:calc(20px * var(--pagefind-ui-scale))}.pagefind-ui__results.svelte-e9gkc3{padding:0}.pagefind-ui__message.svelte-e9gkc3{box-sizing:content-box;font-size:calc(16px * var(--pagefind-ui-scale));height:calc(24px * var(--pagefind-ui-scale));padding:calc(20px * var(--pagefind-ui-scale)) 0;display:flex;align-items:center;font-weight:700;margin-top:0}.pagefind-ui__button.svelte-e9gkc3{margin-top:calc(40px * var(--pagefind-ui-scale));border:var(--pagefind-ui-border-width) solid var(--pagefind-ui-border);border-radius:var(--pagefind-ui-border-radius);height:calc(48px * var(--pagefind-ui-scale));padding:0 calc(12px * var(--pagefind-ui-scale));font-size:calc(16px * var(--pagefind-ui-scale));color:var(--pagefind-ui-primary);background:var(--pagefind-ui-background);width:100%;text-align:center;font-weight:700;cursor:pointer}.pagefind-ui__button.svelte-e9gkc3:hover{border-color:var(--pagefind-ui-primary);color:var(--pagefind-ui-primary);background:var(--pagefind-ui-background)}}@layer starlight.core{[data-search-modal-open]{overflow:hidden}#starlight__search{--sl-search-result-spacing: calc(1.25rem * var(--pagefind-ui-scale));--sl-search-result-pad-inline-start: calc(3.75rem * var(--pagefind-ui-scale));--sl-search-result-pad-inline-end: calc(1.25rem * var(--pagefind-ui-scale));--sl-search-result-pad-block: calc(.9375rem * var(--pagefind-ui-scale));--sl-search-result-nested-pad-block: calc(.625rem * var(--pagefind-ui-scale));--sl-search-corners: calc(.3125rem * var(--pagefind-ui-scale));--sl-search-page-icon-size: calc(1.875rem * var(--pagefind-ui-scale));--sl-search-page-icon-inline-start: calc( (var(--sl-search-result-pad-inline-start) - var(--sl-search-page-icon-size)) / 2 );--sl-search-tree-diagram-size: calc(2.5rem * var(--pagefind-ui-scale));--sl-search-tree-diagram-inline-start: calc( (var(--sl-search-result-pad-inline-start) - var(--sl-search-tree-diagram-size)) / 2 )}#starlight__search .pagefind-ui__form:before{--pagefind-ui-text: var(--sl-color-gray-1);opacity:1}#starlight__search .pagefind-ui__search-input{color:var(--sl-color-white);font-weight:400;width:calc(100% - var(--sl-search-cancel-space))}#starlight__search input:focus{--pagefind-ui-border: var(--sl-color-accent)}#starlight__search .pagefind-ui__search-clear{inset-inline-end:var(--sl-search-cancel-space);width:calc(60px * var(--pagefind-ui-scale));padding:0;background-color:transparent;overflow:hidden}#starlight__search .pagefind-ui__search-clear:focus{outline:1px solid var(--sl-color-accent)}#starlight__search .pagefind-ui__search-clear:before{content:"";-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='m13.41 12 6.3-6.29a1 1 0 1 0-1.42-1.42L12 10.59l-6.29-6.3a1 1 0 0 0-1.42 1.42l6.3 6.29-6.3 6.29a1 1 0 0 0 .33 1.64 1 1 0 0 0 1.09-.22l6.29-6.3 6.29 6.3a1 1 0 0 0 1.64-.33 1 1 0 0 0-.22-1.09L13.41 12Z'/%3E%3C/svg%3E") center / 50% no-repeat;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='m13.41 12 6.3-6.29a1 1 0 1 0-1.42-1.42L12 10.59l-6.29-6.3a1 1 0 0 0-1.42 1.42l6.3 6.29-6.3 6.29a1 1 0 0 0 .33 1.64 1 1 0 0 0 1.09-.22l6.29-6.3 6.29 6.3a1 1 0 0 0 1.64-.33 1 1 0 0 0-.22-1.09L13.41 12Z'/%3E%3C/svg%3E") center / 50% no-repeat;background-color:var(--sl-color-text-accent);display:block;width:100%;height:100%}#starlight__search .pagefind-ui__results>*+*{margin-top:var(--sl-search-result-spacing)}#starlight__search .pagefind-ui__result{border:0;padding:0}#starlight__search .pagefind-ui__result-nested{position:relative;padding:var(--sl-search-result-nested-pad-block) var(--sl-search-result-pad-inline-end);padding-inline-start:var(--sl-search-result-pad-inline-start)}#starlight__search .pagefind-ui__result-title:not(:where(.pagefind-ui__result-nested *)),#starlight__search .pagefind-ui__result-nested{position:relative;background-color:var(--sl-color-black)}#starlight__search .pagefind-ui__result-title:not(:where(.pagefind-ui__result-nested *)):hover,#starlight__search .pagefind-ui__result-title:not(:where(.pagefind-ui__result-nested *)):focus-within,#starlight__search .pagefind-ui__result-nested:hover,#starlight__search .pagefind-ui__result-nested:focus-within{outline:1px solid var(--sl-color-accent-high)}#starlight__search .pagefind-ui__result-title:not(:where(.pagefind-ui__result-nested *)):focus-within,#starlight__search .pagefind-ui__result-nested:focus-within{background-color:var(--sl-color-accent-low)}#starlight__search .pagefind-ui__result-thumb,#starlight__search .pagefind-ui__result-inner{margin-top:0}#starlight__search .pagefind-ui__result-inner>:first-child{border-radius:var(--sl-search-corners) var(--sl-search-corners) 0 0}#starlight__search .pagefind-ui__result-inner>:last-child{border-radius:0 0 var(--sl-search-corners) var(--sl-search-corners)}#starlight__search .pagefind-ui__result-inner>.pagefind-ui__result-title{padding:var(--sl-search-result-pad-block) var(--sl-search-result-pad-inline-end);padding-inline-start:var(--sl-search-result-pad-inline-start)}#starlight__search .pagefind-ui__result-inner>.pagefind-ui__result-title:before{content:"";position:absolute;inset-block:0;inset-inline-start:var(--sl-search-page-icon-inline-start);width:var(--sl-search-page-icon-size);background:var(--sl-color-gray-3);-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='currentColor' viewBox='0 0 24 24'%3E%3Cpath d='M9 10h1a1 1 0 1 0 0-2H9a1 1 0 0 0 0 2Zm0 2a1 1 0 0 0 0 2h6a1 1 0 0 0 0-2H9Zm11-3V8l-6-6a1 1 0 0 0-1 0H7a3 3 0 0 0-3 3v14a3 3 0 0 0 3 3h10a3 3 0 0 0 3-3V9Zm-6-4 3 3h-2a1 1 0 0 1-1-1V5Zm4 14a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h5v3a3 3 0 0 0 3 3h3v9Zm-3-3H9a1 1 0 0 0 0 2h6a1 1 0 0 0 0-2Z'/%3E%3C/svg%3E") center no-repeat;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='currentColor' viewBox='0 0 24 24'%3E%3Cpath d='M9 10h1a1 1 0 1 0 0-2H9a1 1 0 0 0 0 2Zm0 2a1 1 0 0 0 0 2h6a1 1 0 0 0 0-2H9Zm11-3V8l-6-6a1 1 0 0 0-1 0H7a3 3 0 0 0-3 3v14a3 3 0 0 0 3 3h10a3 3 0 0 0 3-3V9Zm-6-4 3 3h-2a1 1 0 0 1-1-1V5Zm4 14a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h5v3a3 3 0 0 0 3 3h3v9Zm-3-3H9a1 1 0 0 0 0 2h6a1 1 0 0 0 0-2Z'/%3E%3C/svg%3E") center no-repeat}#starlight__search .pagefind-ui__result-inner{align-items:stretch;gap:1px}#starlight__search .pagefind-ui__result-link{position:unset;--pagefind-ui-text: var(--sl-color-white);font-weight:600}#starlight__search .pagefind-ui__result-link:hover{text-decoration:none}#starlight__search .pagefind-ui__result-nested .pagefind-ui__result-link:before{content:unset}#starlight__search .pagefind-ui__result-nested:before{content:"";position:absolute;inset-block:0;inset-inline-start:var(--sl-search-tree-diagram-inline-start);width:var(--sl-search-tree-diagram-size);background:var(--sl-color-gray-4);-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' viewBox='0 0 16 1000' preserveAspectRatio='xMinYMin slice'%3E%3Cpath d='M8 0v1000m6-988H8'/%3E%3C/svg%3E") 0% 0% / 100% no-repeat;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' viewBox='0 0 16 1000' preserveAspectRatio='xMinYMin slice'%3E%3Cpath d='M8 0v1000m6-988H8'/%3E%3C/svg%3E") 0% 0% / 100% no-repeat}#starlight__search .pagefind-ui__result-nested:last-of-type:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' viewBox='0 0 16 16'%3E%3Cpath d='M8 0v12m6 0H8'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' viewBox='0 0 16 16'%3E%3Cpath d='M8 0v12m6 0H8'/%3E%3C/svg%3E")}[dir=rtl] .pagefind-ui__result-title:before,[dir=rtl] .pagefind-ui__result-nested:before{transform:scaleX(-1)}#starlight__search .pagefind-ui__result-link:after{content:"";position:absolute;inset:0}#starlight__search .pagefind-ui__result-excerpt{font-size:calc(1rem * var(--pagefind-ui-scale));overflow-wrap:anywhere}#starlight__search mark{color:var(--sl-color-gray-2);background-color:transparent;font-weight:600}#starlight__search .pagefind-ui__filter-value:before{border-color:var(--sl-color-text-invert)}#starlight__search .pagefind-ui__result-tags{background-color:var(--sl-color-black);margin-top:0;padding:var(--sl-search-result-nested-pad-block) var(--sl-search-result-pad-inline-end)}}@layer starlight.core{site-search:where(.astro-2f6du2pg){display:contents}button:where(.astro-2f6du2pg)[data-open-modal]{display:flex;align-items:center;gap:.5rem;border:0;background-color:transparent;color:var(--sl-color-gray-1);cursor:pointer;height:2.5rem;font-size:var(--sl-text-xl)}@media(min-width:50rem){button:where(.astro-2f6du2pg)[data-open-modal]{border:1px solid var(--sl-color-gray-5);border-radius:.5rem;padding-inline-start:.75rem;padding-inline-end:.5rem;background-color:var(--sl-color-black);color:var(--sl-color-gray-2);font-size:var(--sl-text-sm);width:100%;max-width:22rem}button:where(.astro-2f6du2pg)[data-open-modal]:hover{border-color:var(--sl-color-gray-2);color:var(--sl-color-white)}button:where(.astro-2f6du2pg)[data-open-modal]>:where(.astro-2f6du2pg):last-child{margin-inline-start:auto}}button:where(.astro-2f6du2pg)>kbd:where(.astro-2f6du2pg){border-radius:.25rem;font-size:var(--sl-text-2xs);gap:.25em;padding-inline:.375rem;background-color:var(--sl-color-gray-6)}kbd:where(.astro-2f6du2pg){font-family:var(--__sl-font)}dialog:where(.astro-2f6du2pg){margin:0;background-color:var(--sl-color-gray-6);border:1px solid var(--sl-color-gray-5);width:100%;max-width:100%;height:100%;max-height:100%;box-shadow:var(--sl-shadow-lg)}dialog:where(.astro-2f6du2pg)[open]{display:flex}dialog:where(.astro-2f6du2pg)::backdrop{background-color:var(--sl-color-backdrop-overlay);-webkit-backdrop-filter:blur(.25rem);backdrop-filter:blur(.25rem)}.dialog-frame:where(.astro-2f6du2pg){position:relative;overflow:auto;flex-direction:column;flex-grow:1;gap:1rem;padding:1rem}button:where(.astro-2f6du2pg)[data-close-modal]{position:absolute;z-index:1;align-items:center;align-self:flex-end;height:calc(64px * var(--pagefind-ui-scale));padding:.25rem;border:0;background:transparent;cursor:pointer;color:var(--sl-color-text-accent)}#starlight__search:where(.astro-2f6du2pg){--pagefind-ui-primary: var(--sl-color-text);--pagefind-ui-text: var(--sl-color-gray-2);--pagefind-ui-font: var(--__sl-font);--pagefind-ui-background: var(--sl-color-black);--pagefind-ui-border: var(--sl-color-gray-5);--pagefind-ui-border-width: 1px;--pagefind-ui-tag: var(--sl-color-gray-5);--sl-search-cancel-space: 5rem}:root[data-theme=light] #starlight__search:where(.astro-2f6du2pg){--pagefind-ui-tag: var(--sl-color-gray-6)}@media(min-width:50rem){#starlight__search:where(.astro-2f6du2pg){--sl-search-cancel-space: 0px}dialog:where(.astro-2f6du2pg){margin:4rem auto auto;border-radius:.5rem;width:90%;max-width:40rem;height:max-content;min-height:15rem;max-height:calc(100% - 8rem)}.dialog-frame:where(.astro-2f6du2pg){padding:1.5rem}}}@layer starlight.core{a:where(.astro-zjlfhtpr){color:var(--sl-color-text-accent);padding:.5em;margin:-.5em}a:where(.astro-zjlfhtpr):hover{opacity:.66}}@layer starlight.core{.download-cta:where(.astro-sle7k2hz){color:var(--sl-color-accent-high);background:var(--bg-b-t, linear-gradient(180deg, #1b1b1b 0%, #000 100%));border:1px solid var(--sl-color-hairline-light)}.download-cta:where(.astro-sle7k2hz):hover{color:var(--sl-color-text-invert);filter:brightness(1.15)}.download-cta:where(.astro-sle7k2hz) span:where(.astro-sle7k2hz):first-of-type svg{width:100%;height:100%;display:block}}@layer starlight.core{.site-title:where(.astro-idrpryed){font-size:var(--sl-text-h4);color:var(--sl-color-text-accent)}.site-title-logo:where(.astro-idrpryed){color:var(--sl-color-gray-1);height:calc(var(--sl-nav-height) - 2 * var(--sl-nav-pad-y))}.site-title-logo:where(.astro-idrpryed) svg{height:100%;width:auto;display:block}}@layer starlight.core{.social-icons:where(.astro-3ef6ksr2):after{content:"";height:2rem;border-inline-end:1px solid var(--sl-color-gray-5)}@media(min-width:50rem){:root[data-has-sidebar]{--__sidebar-pad: calc(2 * var(--sl-nav-pad-x))}:root:not([data-has-toc]){--__toc-width: 0rem}.header-grid:where(.astro-3ef6ksr2){--__sidebar-width: max(0rem, var(--sl-content-inline-start, 0rem) - var(--sl-nav-pad-x));--__main-column-fr: calc( ( 100% + var(--__sidebar-pad, 0rem) - var(--__toc-width, var(--sl-sidebar-width)) - (2 * var(--__toc-width, var(--sl-nav-pad-x))) - var(--sl-content-inline-start, 0rem) - var(--sl-content-width) ) / 2 );display:grid;grid-template-columns:minmax(calc(var(--__sidebar-width) + max(0rem,var(--__main-column-fr) - var(--sl-nav-gap))),auto) minmax(16rem,1fr) auto;align-content:center}.search-wrapper:where(.astro-3ef6ksr2){min-width:0}.search-wrapper:where(.astro-3ef6ksr2) button[data-open-modal]{height:3rem;font-size:var(--sl-text-base);max-width:28rem;padding-inline-start:1rem;padding-inline-end:.75rem}}}@layer starlight.components{.sl-link-button:where(.astro-5eunqzkt){align-items:center;border:1px solid transparent;border-radius:999rem;display:inline-flex;font-size:var(--sl-text-sm);gap:.5em;line-height:1.1875;outline-offset:.25rem;padding:.4375rem 1.125rem;text-decoration:none}.sl-link-button:where(.astro-5eunqzkt).primary{background:var(--sl-color-text-accent);border-color:var(--sl-color-text-accent);color:var(--sl-color-black)}.sl-link-button:where(.astro-5eunqzkt).primary:hover{color:var(--sl-color-black)}.sl-link-button:where(.astro-5eunqzkt).secondary{border-color:inherit;color:var(--sl-color-white)}.sl-link-button:where(.astro-5eunqzkt).minimal{color:var(--sl-color-white);padding-inline:0}.icon:where(.astro-5eunqzkt){display:inline-flex;width:1.25rem;height:1.25rem;flex-shrink:0}.icon:where(.astro-5eunqzkt) svg{width:100%;height:100%;display:block}@media(min-width:50rem){.sl-link-button:where(.astro-5eunqzkt){font-size:var(--sl-text-base);padding:.9375rem 1.25rem}}}@layer starlight.core{.hero-image:where(.astro-bbe6dxrz){object-fit:contain;width:min(47%,13.5rem);height:auto;margin-inline:auto}.copy:where(.astro-bbe6dxrz)>:where(.astro-bbe6dxrz){max-width:50ch}.hero-title:where(.astro-bbe6dxrz){font-size:clamp(var(--sl-text-3xl),calc(.25rem + 5vw),var(--sl-text-6xl));line-height:var(--sl-line-height-headings);font-weight:600;color:var(--sl-color-white)}.tagline:where(.astro-bbe6dxrz){font-size:clamp(var(--sl-text-base),calc(.0625rem + 2vw),var(--sl-text-xl));color:var(--sl-color-gray-2);max-width:50ch}.platform-icons:where(.astro-bbe6dxrz){display:inline-flex;align-items:center;gap:.5rem;color:var(--sl-color-gray-2)}.platform-icon:where(.astro-bbe6dxrz){display:inline-flex;align-items:center;justify-content:center;width:1.25rem;height:1.25rem}.platform-icon:where(.astro-bbe6dxrz) svg{width:100%;height:100%;display:block}.platform-icon-windows:where(.astro-bbe6dxrz){opacity:.2}@media(min-width:50rem){.hero-grid:where(.astro-bbe6dxrz){grid-template-columns:7fr 4fr;gap:3%;padding-block:clamp(1.25rem,calc(.5rem + 4vmin),3rem)}.hero-image:where(.astro-bbe6dxrz){order:2;width:min(67%,17rem)}}}@layer starlight.content{.sl-markdown-content :not(a,strong,em,del,span,input,code,br)+:not(a,strong,em,del,span,input,code,br,:where(.not-content *)){margin-top:var(--sl-content-gap-y)}.sl-markdown-content :not(a,strong,em,del,span,input,code,br)+:is(astro-island,astro-slot)>:not(a,strong,em,del,span,input,code,br,:where(.not-content *)):first-child{margin-top:var(--sl-content-gap-y)}.sl-markdown-content :not(h1,h2,h3,h4,h5,h6)+:is(h1,h2,h3,h4,h5,h6):not(:where(.not-content *)){margin-top:1.5em}.sl-markdown-content li+li:not(:where(.not-content *)),.sl-markdown-content dt+dt:not(:where(.not-content *)),.sl-markdown-content dt+dd:not(:where(.not-content *)),.sl-markdown-content dd+dd:not(:where(.not-content *)){margin-top:.25rem}.sl-markdown-content li:not(:where(.not-content *)){overflow-wrap:anywhere}.sl-markdown-content li>:is(:last-child:not(li,ul,ol,a,strong,em,del,span,input,code,br,script,:where(.not-content *)),:not(script):has(~script:last-child):not(:has(~:not(script)))){margin-bottom:1.25rem}.sl-markdown-content dt:not(:where(.not-content *)){font-weight:700}.sl-markdown-content dd:not(:where(.not-content *)){padding-inline-start:1rem}.sl-markdown-content :is(h1,h2,h3,h4,h5,h6):not(:where(.not-content *)){color:var(--sl-color-white);line-height:var(--sl-line-height-headings);font-weight:600}.sl-markdown-content :is(img,picture,video,canvas,svg,iframe):not(:where(.not-content *)){display:block;max-width:100%;height:auto}.sl-markdown-content h1:not(:where(.not-content *)){font-size:var(--sl-text-h1)}.sl-markdown-content h2:not(:where(.not-content *)){font-size:var(--sl-text-h2)}.sl-markdown-content h3:not(:where(.not-content *)){font-size:var(--sl-text-h3)}.sl-markdown-content h4:not(:where(.not-content *)){font-size:var(--sl-text-h4)}.sl-markdown-content h5:not(:where(.not-content *)){font-size:var(--sl-text-h5)}.sl-markdown-content h6:not(:where(.not-content *)){font-size:var(--sl-text-h6)}.sl-markdown-content a:not(:where(.not-content *)){color:var(--sl-color-text-accent)}.sl-markdown-content a:hover:not(:where(.not-content *)){color:var(--sl-color-white)}.sl-markdown-content code:not(:where(.not-content *)){background-color:var(--sl-color-bg-inline-code);margin-block:-.125rem;padding:.125rem .375rem;font-size:var(--sl-text-code-sm)}.sl-markdown-content :is(h1,h2,h3,h4,h5,h6) code{font-size:inherit}.sl-markdown-content pre:not(:where(.not-content *)){border:1px solid var(--sl-color-gray-5);padding:.75rem 1rem;font-size:var(--sl-text-code);tab-size:2}.sl-markdown-content pre code:not(:where(.not-content *)){all:unset;font-family:var(--__sl-font-mono)}.sl-markdown-content blockquote:not(:where(.not-content *)){border-inline-start:1px solid var(--sl-color-gray-5);padding-inline-start:1rem}.sl-markdown-content table:not(:where(.not-content *)){display:block;overflow:auto;border-spacing:0}.sl-markdown-content :is(th,td):not(:where(.not-content *)){border-bottom:1px solid var(--sl-color-gray-5);padding:.5rem 1rem;vertical-align:baseline}.sl-markdown-content :is(th:first-child,td:first-child):not(:where(.not-content *)){padding-inline-start:0}.sl-markdown-content :is(th:last-child,td:last-child):not(:where(.not-content *)){padding-inline-end:0}.sl-markdown-content th:not(:where(.not-content *)){color:var(--sl-color-white);font-weight:600}.sl-markdown-content th:not([align]):not(:where(.not-content *)){text-align:start}.sl-markdown-content .starlight-aside :is(th,td,hr,blockquote):not(:where(.not-content *)){border-color:var(--sl-color-gray-4)}@supports (border-color: color-mix(in srgb,var(--sl-color-asides-text-accent) 30%,transparent)){.sl-markdown-content .starlight-aside :is(th,td,hr,blockquote):not(:where(.not-content *)){border-color:color-mix(in srgb,var(--sl-color-asides-text-accent) 30%,transparent)}}@supports (border-color: color-mix(in srgb,var(--sl-color-asides-text-accent) 12%,transparent)){.sl-markdown-content .starlight-aside code:not(:where(.not-content *)){background-color:color-mix(in srgb,var(--sl-color-asides-text-accent) 12%,transparent)}}.sl-markdown-content hr:not(:where(.not-content *)){border:0;border-bottom:1px solid var(--sl-color-hairline)}.sl-markdown-content details:not(:where(.not-content *)){--sl-details-border-color: var(--sl-color-gray-5);--sl-details-border-color--hover: var(--sl-color-text-accent);border-inline-start:2px solid var(--sl-details-border-color);padding-inline-start:1rem}.sl-markdown-content details:not([open]):hover:not(:where(.not-content *)),.sl-markdown-content details:has(>summary:hover):not(:where(.not-content *)){border-color:var(--sl-details-border-color--hover)}.sl-markdown-content summary:not(:where(.not-content *)){color:var(--sl-color-white);cursor:pointer;display:block;font-weight:600;margin-inline-start:-.5rem;padding-inline-start:.5rem}.sl-markdown-content details[open]>summary:not(:where(.not-content *)){margin-bottom:1rem}.sl-markdown-content summary:not(:where(.not-content *))::marker,.sl-markdown-content summary:not(:where(.not-content *))::-webkit-details-marker{display:none}.sl-markdown-content summary:not(:where(.not-content *)):before{--sl-details-marker-size: 1.25rem;background-color:currentColor;content:"";display:inline-block;height:var(--sl-details-marker-size);width:var(--sl-details-marker-size);margin-inline:calc((var(--sl-details-marker-size) / 4) * -1) .25rem;vertical-align:middle;-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M14.8 11.3 10.6 7a1 1 0 1 0-1.4 1.5l3.5 3.5-3.5 3.5a1 1 0 0 0 0 1.4 1 1 0 0 0 .7.3 1 1 0 0 0 .7-.3l4.2-4.2a1 1 0 0 0 0-1.4Z'/%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M14.8 11.3 10.6 7a1 1 0 1 0-1.4 1.5l3.5 3.5-3.5 3.5a1 1 0 0 0 0 1.4 1 1 0 0 0 .7.3 1 1 0 0 0 .7-.3l4.2-4.2a1 1 0 0 0 0-1.4Z'/%3E%3C/svg%3E%0A");-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}@media(prefers-reduced-motion:no-preference){.sl-markdown-content summary:not(:where(.not-content *)):before{transition:transform .2s ease-in-out}}.sl-markdown-content details[open]>summary:not(:where(.not-content *)):before{transform:rotate(90deg)}[dir=rtl] .sl-markdown-content summary:not(:where(.not-content *)):before,.sl-markdown-content [dir=rtl] summary:not(:where(.not-content *)):before{transform:rotate(180deg)}.sl-markdown-content summary:not(:where(.not-content *)) p:only-child{display:inline}.sl-markdown-content .starlight-aside details:not(:where(.not-content *)){--sl-details-border-color: var(--sl-color-asides-border);--sl-details-border-color--hover: var(--sl-color-asides-text-accent)}}@layer starlight.core{[data-mobile-menu-expanded]{overflow:hidden}@media(min-width:50rem){[data-mobile-menu-expanded]{overflow:auto}}}@layer starlight.core{button:where(.astro-yrbfzory){position:fixed;top:calc((var(--sl-nav-height) - var(--sl-menu-button-size)) / 2);inset-inline-end:var(--sl-nav-pad-x);z-index:var(--sl-z-index-navbar);border:0;border-radius:50%;width:var(--sl-menu-button-size);height:var(--sl-menu-button-size);padding:.5rem;background-color:var(--sl-color-white);color:var(--sl-color-black);box-shadow:var(--sl-shadow-md);cursor:pointer}:where(.astro-yrbfzory)[aria-expanded=true] button:where(.astro-yrbfzory){background-color:var(--sl-color-gray-2);box-shadow:none}:where(.astro-yrbfzory)[aria-expanded=true] button:where(.astro-yrbfzory) .open-menu:where(.astro-yrbfzory){display:none}:where(.astro-yrbfzory):not([aria-expanded=true]) button:where(.astro-yrbfzory) .close-menu:where(.astro-yrbfzory){display:none}[data-theme=light] button:where(.astro-yrbfzory){background-color:var(--sl-color-black);color:var(--sl-color-white)}[data-theme=light] :where(.astro-yrbfzory)[aria-expanded=true] button:where(.astro-yrbfzory){background-color:var(--sl-color-gray-5)}}@layer starlight.core{.page:where(.astro-iyrf6vv4){flex-direction:column;min-height:100vh}.header:where(.astro-iyrf6vv4){z-index:var(--sl-z-index-navbar);position:fixed;inset-inline-start:0;inset-block-start:0;width:100%;height:var(--sl-nav-height);border-bottom:1px solid var(--sl-color-hairline-shade);padding:var(--sl-nav-pad-y) var(--sl-nav-pad-x);padding-inline-end:var(--sl-nav-pad-x);background-color:var(--sl-color-bg-nav)}[data-has-sidebar] .header:where(.astro-iyrf6vv4){padding-inline-end:calc(var(--sl-nav-gap) + var(--sl-nav-pad-x) + var(--sl-menu-button-size))}.sidebar-pane:where(.astro-iyrf6vv4){visibility:var(--sl-sidebar-visibility, hidden);position:fixed;z-index:var(--sl-z-index-menu);inset-block:var(--sl-nav-height) 0;inset-inline-start:0;width:100%;background-color:var(--sl-color-black);overflow-y:auto}[aria-expanded=true]~.sidebar-pane:where(.astro-iyrf6vv4){--sl-sidebar-visibility: visible}.sidebar-content:where(.astro-iyrf6vv4){height:100%;min-height:max-content;padding:1rem var(--sl-sidebar-pad-x) 0;flex-direction:column;gap:1rem}@media(min-width:50rem){.sidebar-content:where(.astro-iyrf6vv4):after{content:"";padding-bottom:1px}}.main-frame:where(.astro-iyrf6vv4){padding-top:calc(var(--sl-nav-height) + var(--sl-mobile-toc-height));padding-inline-start:var(--sl-content-inline-start)}@media(min-width:50rem){[data-has-sidebar] .header:where(.astro-iyrf6vv4){padding-inline-end:var(--sl-nav-pad-x)}.sidebar-pane:where(.astro-iyrf6vv4){--sl-sidebar-visibility: visible;width:var(--sl-sidebar-width);background-color:var(--sl-color-bg-sidebar);border-inline-end:1px solid var(--sl-color-hairline-shade)}}}@layer starlight.core{ul:where(.astro-uehw6aht){padding:0;list-style:none}a:where(.astro-uehw6aht){--pad-inline: .5rem;display:block;border-radius:.25rem;padding-block:.25rem;padding-inline:calc(1rem * var(--depth) + var(--pad-inline)) var(--pad-inline);line-height:1.25}a:where(.astro-uehw6aht)[aria-current=true]{color:var(--sl-color-text-accent)}.isMobile:where(.astro-uehw6aht) a:where(.astro-uehw6aht){--pad-inline: 1rem;display:flex;justify-content:space-between;gap:var(--pad-inline);border-top:1px solid var(--sl-color-gray-6);border-radius:0;padding-block:.5rem;color:var(--sl-color-text);font-size:var(--sl-text-sm);text-decoration:none;outline-offset:var(--sl-outline-offset-inside)}.isMobile:where(.astro-uehw6aht):first-child>li:where(.astro-uehw6aht):first-child>a:where(.astro-uehw6aht){border-top:0}.isMobile:where(.astro-uehw6aht) a:where(.astro-uehw6aht)[aria-current=true],.isMobile:where(.astro-uehw6aht) a:where(.astro-uehw6aht)[aria-current=true]:hover,.isMobile:where(.astro-uehw6aht) a:where(.astro-uehw6aht)[aria-current=true]:focus{color:var(--sl-color-white);background-color:unset}.isMobile:where(.astro-uehw6aht) a:where(.astro-uehw6aht)[aria-current=true]:after{content:"";width:1rem;background-color:var(--sl-color-text-accent);-webkit-mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAxNCAxNCc+PHBhdGggZD0nTTEwLjkxNCA0LjIwNmEuNTgzLjU4MyAwIDAgMC0uODI4IDBMNS43NCA4LjU1NyAzLjkxNCA2LjcyNmEuNTk2LjU5NiAwIDAgMC0uODI4Ljg1N2wyLjI0IDIuMjRhLjU4My41ODMgMCAwIDAgLjgyOCAwbDQuNzYtNC43NmEuNTgzLjU4MyAwIDAgMCAwLS44NTdaJy8+PC9zdmc+Cg==);mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAxNCAxNCc+PHBhdGggZD0nTTEwLjkxNCA0LjIwNmEuNTgzLjU4MyAwIDAgMC0uODI4IDBMNS43NCA4LjU1NyAzLjkxNCA2LjcyNmEuNTk2LjU5NiAwIDAgMC0uODI4Ljg1N2wyLjI0IDIuMjRhLjU4My41ODMgMCAwIDAgLjgyOCAwbDQuNzYtNC43NmEuNTgzLjU4MyAwIDAgMCAwLS44NTdaJy8+PC9zdmc+Cg==);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;flex-shrink:0}}@layer starlight.core{nav:where(.astro-2zbszx3p){position:fixed;z-index:var(--sl-z-index-toc);top:calc(var(--sl-nav-height) - 1px);inset-inline:0;border-top:1px solid var(--sl-color-gray-5);background-color:var(--sl-color-bg-nav)}@media(min-width:50rem){nav:where(.astro-2zbszx3p){inset-inline-start:var(--sl-content-inline-start, 0)}}summary:where(.astro-2zbszx3p){gap:.5rem;align-items:center;height:var(--sl-mobile-toc-height);border-bottom:1px solid var(--sl-color-hairline-shade);padding:.5rem 1rem;font-size:var(--sl-text-xs);outline-offset:var(--sl-outline-offset-inside)}summary:where(.astro-2zbszx3p)::marker,summary:where(.astro-2zbszx3p)::-webkit-details-marker{display:none}.toggle:where(.astro-2zbszx3p){flex-shrink:0;gap:1rem;align-items:center;justify-content:space-between;border:1px solid var(--sl-color-gray-5);border-radius:.5rem;padding-block:.5rem;padding-inline-start:.75rem;padding-inline-end:.5rem;line-height:1;background-color:var(--sl-color-black);user-select:none;cursor:pointer}details:where(.astro-2zbszx3p)[open] .toggle:where(.astro-2zbszx3p){color:var(--sl-color-white);border-color:var(--sl-color-accent)}details:where(.astro-2zbszx3p) .toggle:where(.astro-2zbszx3p):hover{color:var(--sl-color-white);border-color:var(--sl-color-gray-2)}[dir=rtl] .caret:where(.astro-2zbszx3p){transform:rotate(180deg)}details:where(.astro-2zbszx3p)[open] .caret:where(.astro-2zbszx3p){transform:rotate(90deg)}.display-current:where(.astro-2zbszx3p){white-space:nowrap;text-overflow:ellipsis;overflow:hidden;color:var(--sl-color-white)}.dropdown:where(.astro-2zbszx3p){--border-top: 1px;margin-top:calc(-1 * var(--border-top));border:var(--border-top) solid var(--sl-color-gray-6);border-top-color:var(--sl-color-hairline-shade);max-height:calc(85vh - var(--sl-nav-height) - var(--sl-mobile-toc-height));overflow-y:auto;background-color:var(--sl-color-black);box-shadow:var(--sl-shadow-md);overscroll-behavior:contain}}@layer starlight.core{.right-sidebar-panel:where(.astro-auw6kndz){padding:1rem var(--sl-sidebar-pad-x)}.sl-container:where(.astro-auw6kndz){width:calc(var(--sl-sidebar-width) - 2 * var(--sl-sidebar-pad-x))}.right-sidebar-panel:where(.astro-auw6kndz) h2{color:var(--sl-color-white);font-size:var(--sl-text-h5);font-weight:600;line-height:var(--sl-line-height-headings);margin-bottom:.5rem}.right-sidebar-panel:where(.astro-auw6kndz) :where(a){display:block;font-size:var(--sl-text-xs);text-decoration:none;color:var(--sl-color-gray-3);overflow-wrap:anywhere}.right-sidebar-panel:where(.astro-auw6kndz) :where(a):hover{color:var(--sl-color-white)}@media(min-width:72rem){.sl-container:where(.astro-auw6kndz){max-width:calc(((100vw - var(--sl-sidebar-width) - 2 * var(--sl-content-pad-x) - 2 * var(--sl-sidebar-pad-x)) * .25))}}}@layer starlight.core{h1:where(.astro-gldynaio){margin-top:1rem;font-size:var(--sl-text-h1);line-height:var(--sl-line-height-headings);font-weight:600;color:var(--sl-color-white)}}@layer starlight.core{.social-icons:where(.astro-22fp5ct5){display:flex;margin-inline-end:auto;gap:1rem;align-items:center;padding-block:1rem}.social-icons:where(.astro-22fp5ct5):empty{display:none}.mobile-preferences:where(.astro-22fp5ct5){justify-content:space-between;flex-wrap:wrap;border-top:1px solid var(--sl-color-gray-6);column-gap:1rem;padding:.5rem 0}}@layer starlight.core{sl-sidebar-state-persist:where(.astro-fouifdpt){display:contents}}@layer starlight.core{ul:where(.astro-j63poqv6){--sl-sidebar-item-padding-inline: .5rem;list-style:none;padding:0}li:where(.astro-j63poqv6){overflow-wrap:anywhere}ul:where(.astro-j63poqv6) ul:where(.astro-j63poqv6) li:where(.astro-j63poqv6){margin-inline-start:var(--sl-sidebar-item-padding-inline);border-inline-start:1px solid var(--sl-color-hairline-light);padding-inline-start:var(--sl-sidebar-item-padding-inline)}.large:where(.astro-j63poqv6){font-size:var(--sl-text-lg);font-weight:600;color:var(--sl-color-white)}.top-level:where(.astro-j63poqv6)>li:where(.astro-j63poqv6)+li:where(.astro-j63poqv6){margin-top:.75rem}summary:where(.astro-j63poqv6){display:flex;align-items:center;justify-content:space-between;padding:.2em var(--sl-sidebar-item-padding-inline);line-height:1.4;cursor:pointer;user-select:none}summary:where(.astro-j63poqv6)::marker,summary:where(.astro-j63poqv6)::-webkit-details-marker{display:none}.caret:where(.astro-j63poqv6){transition:transform .2s ease-in-out;flex-shrink:0}[dir=rtl] .caret:where(.astro-j63poqv6){transform:rotate(180deg)}:where(.astro-j63poqv6)[open]>summary:where(.astro-j63poqv6) .caret:where(.astro-j63poqv6){transform:rotate(90deg)}a:where(.astro-j63poqv6){display:block;border-radius:.25rem;text-decoration:none;color:var(--sl-color-gray-2);padding:.3em var(--sl-sidebar-item-padding-inline);line-height:1.4}a:where(.astro-j63poqv6):hover,a:where(.astro-j63poqv6):focus{color:var(--sl-color-white)}:where(.astro-j63poqv6)[aria-current=page],:where(.astro-j63poqv6)[aria-current=page]:hover,:where(.astro-j63poqv6)[aria-current=page]:focus{font-weight:600;color:var(--sl-color-text-invert);background-color:var(--sl-color-text-accent)}a:where(.astro-j63poqv6)>:where(.astro-j63poqv6):not(:last-child),.group-label:where(.astro-j63poqv6)>:where(.astro-j63poqv6):not(:last-child){margin-inline-end:.25em}@media(min-width:50rem){.top-level:where(.astro-j63poqv6)>li:where(.astro-j63poqv6)+li:where(.astro-j63poqv6){margin-top:.5rem}.large:where(.astro-j63poqv6){font-size:var(--sl-text-base)}a:where(.astro-j63poqv6){font-size:var(--sl-text-sm)}}}@layer starlight.core{a:where(.astro-yr4ykvqi){clip:rect(0,0,0,0);position:fixed;top:.75rem;inset-inline-start:.75rem}a:where(.astro-yr4ykvqi):focus{clip:unset;z-index:var(--sl-z-index-skiplink);display:block;padding:.5rem 1rem;text-decoration:none;color:var(--sl-color-text-invert);background-color:var(--sl-color-text-accent);box-shadow:var(--sl-shadow-lg)}}@layer starlight.core{.main-pane:where(.astro-6ptv7odt){isolation:isolate}@media(min-width:72rem){.right-sidebar-container:where(.astro-6ptv7odt){order:2;position:relative;width:calc(var(--sl-sidebar-width) + (100% - var(--sl-content-width) - var(--sl-sidebar-width)) / 2)}.right-sidebar:where(.astro-6ptv7odt){position:fixed;top:0;border-inline-start:1px solid var(--sl-color-hairline);padding-top:var(--sl-nav-height);width:100%;height:100vh;overflow-y:auto;scrollbar-width:none}.main-pane:where(.astro-6ptv7odt){width:100%}[data-has-sidebar][data-has-toc] .main-pane:where(.astro-6ptv7odt){--sl-content-margin-inline: auto 0;order:1;width:calc(var(--sl-content-width) + (100% - var(--sl-content-width) - var(--sl-sidebar-width)) / 2)}}}html:not([data-has-toc]){--sl-mobile-toc-height: 0rem}html:not([data-has-sidebar]){--sl-content-width: 67.5rem}html{scroll-padding-top:calc(1.5rem + var(--sl-nav-height) + var(--sl-mobile-toc-height))}main:where(.astro-ept3ui5y){padding:var(--sl-main-pad)}@media(min-width:50em){:where(.astro-ept3ui5y)[data-has-sidebar]{--sl-content-inline-start: var(--sl-sidebar-width)}}@media(min-width:72em){html{scroll-padding-top:calc(1.5rem + var(--sl-nav-height))}}
diff --git a/assets/vendor/ssscript-docs/_astro/logo-app-bg.CaK6FTqF_Z1HYzg2.svg b/assets/vendor/ssscript-docs/_astro/logo-app-bg.CaK6FTqF_Z1HYzg2.svg
new file mode 100644
index 0000000..c93759c
--- /dev/null
+++ b/assets/vendor/ssscript-docs/_astro/logo-app-bg.CaK6FTqF_Z1HYzg2.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/vendor/ssscript-docs/_astro/page.B1D-nYk3.js b/assets/vendor/ssscript-docs/_astro/page.B1D-nYk3.js
new file mode 100644
index 0000000..bb3de36
--- /dev/null
+++ b/assets/vendor/ssscript-docs/_astro/page.B1D-nYk3.js
@@ -0,0 +1 @@
+const v={},d=new Set,s=new WeakSet;let f=!0,h,l=!1;function g(e){l||(l=!0,f??=!1,h??="hover",p(),w(),y(),S())}function p(){for(const e of["touchstart","mousedown"])document.addEventListener(e,t=>{a(t.target,"tap")&&c(t.target.href,{ignoreSlowConnection:!0})},{passive:!0})}function w(){let e;document.body.addEventListener("focusin",n=>{a(n.target,"hover")&&t(n)},{passive:!0}),document.body.addEventListener("focusout",o,{passive:!0}),u(()=>{for(const n of document.getElementsByTagName("a"))s.has(n)||a(n,"hover")&&(s.add(n),n.addEventListener("mouseenter",t,{passive:!0}),n.addEventListener("mouseleave",o,{passive:!0}))});function t(n){const r=n.target.href;e&&clearTimeout(e),e=setTimeout(()=>{c(r)},80)}function o(){e&&(clearTimeout(e),e=0)}}function y(){let e;u(()=>{for(const t of document.getElementsByTagName("a"))s.has(t)||a(t,"viewport")&&(s.add(t),e??=L(),e.observe(t))})}function L(){const e=new WeakMap;return new IntersectionObserver((t,o)=>{for(const n of t){const r=n.target,i=e.get(r);n.isIntersecting?(i&&clearTimeout(i),e.set(r,setTimeout(()=>{o.unobserve(r),e.delete(r),c(r.href)},300))):i&&(clearTimeout(i),e.delete(r))}})}function S(){u(()=>{for(const e of document.getElementsByTagName("a"))a(e,"load")&&c(e.href)})}function c(e,t){e=e.replace(/#.*/,"");const o=t?.ignoreSlowConnection??!1;if(E(e,o))if(d.add(e),document.createElement("link").relList?.supports?.("prefetch")&&t?.with!=="fetch"){const n=document.createElement("link");n.rel="prefetch",n.setAttribute("href",e),document.head.append(n)}else{const n=new Headers;for(const[r,i]of Object.entries(v))n.set(r,i);fetch(e,{priority:"low",headers:n})}}function E(e,t){if(!navigator.onLine||!t&&m())return!1;try{const o=new URL(e,location.href);return location.origin===o.origin&&(location.pathname!==o.pathname||location.search!==o.search)&&!d.has(e)}catch{}return!1}function a(e,t){if(e?.tagName!=="A")return!1;const o=e.dataset.astroPrefetch;return o==="false"?!1:t==="tap"&&(o!=null||f)&&m()?!0:o==null&&f||o===""?t===h:o===t}function m(){if("connection"in navigator){const e=navigator.connection;return e.saveData||/2g/.test(e.effectiveType)}return!1}function u(e){e();let t=!1;document.addEventListener("astro:page-load",()=>{if(!t){t=!0;return}e()})}g();
diff --git a/assets/vendor/ssscript-docs/_astro/print.DNXP8c50.css b/assets/vendor/ssscript-docs/_astro/print.DNXP8c50.css
new file mode 100644
index 0000000..f721e68
--- /dev/null
+++ b/assets/vendor/ssscript-docs/_astro/print.DNXP8c50.css
@@ -0,0 +1 @@
+@media print{:root{--sl-color-white: hsl(224, 10%, 10%);--sl-color-gray-1: hsl(224, 14%, 16%);--sl-color-gray-2: hsl(224, 10%, 23%);--sl-color-gray-3: hsl(224, 7%, 36%);--sl-color-gray-4: hsl(224, 6%, 56%);--sl-color-gray-5: hsl(224, 6%, 77%);--sl-color-gray-6: hsl(224, 20%, 94%);--sl-color-gray-7: hsl(224, 19%, 97%);--sl-color-black: hsl(0, 0%, 100%);--sl-color-orange-high: hsl(var(--sl-hue-orange), 80%, 25%);--sl-color-orange: hsl(var(--sl-hue-orange), 90%, 60%);--sl-color-orange-low: hsl(var(--sl-hue-orange), 90%, 88%);--sl-color-green-high: hsl(var(--sl-hue-green), 80%, 22%);--sl-color-green: hsl(var(--sl-hue-green), 90%, 46%);--sl-color-green-low: hsl(var(--sl-hue-green), 85%, 90%);--sl-color-blue-high: hsl(var(--sl-hue-blue), 80%, 30%);--sl-color-blue: hsl(var(--sl-hue-blue), 90%, 60%);--sl-color-blue-low: hsl(var(--sl-hue-blue), 88%, 90%);--sl-color-purple-high: hsl(var(--sl-hue-purple), 90%, 30%);--sl-color-purple: hsl(var(--sl-hue-purple), 90%, 60%);--sl-color-purple-low: hsl(var(--sl-hue-purple), 80%, 90%);--sl-color-red-high: hsl(var(--sl-hue-red), 80%, 30%);--sl-color-red: hsl(var(--sl-hue-red), 90%, 60%);--sl-color-red-low: hsl(var(--sl-hue-red), 80%, 90%);--sl-color-accent-high: hsl(234, 80%, 30%);--sl-color-accent: hsl(234, 90%, 60%);--sl-color-accent-low: hsl(234, 88%, 90%);--sl-color-text-accent: var(--sl-color-accent);--sl-color-text-invert: var(--sl-color-black);--sl-color-bg-nav: var(--sl-color-gray-7);--sl-color-bg-sidebar: var(--sl-color-bg);--sl-color-bg-inline-code: var(--sl-color-gray-6);--sl-color-bg-accent: var(--sl-color-accent);--sl-color-hairline-light: var(--sl-color-gray-6);--sl-color-hairline-shade: var(--sl-color-gray-6);--sl-color-backdrop-overlay: hsla(225, 9%, 36%, .66);--sl-shadow-sm: none;--sl-shadow-md: none;--sl-shadow-lg: none}.print\:hidden{display:none}.print\:flex{display:flex}.print\:block{display:block}main{padding-bottom:0}main>.content-panel{padding-block-start:0}.content-panel+.content-panel{border:0}.page>header{position:relative}.page>.main-frame{padding-top:0;padding-inline-start:0}.main-pane{--sl-sidebar-width: 0px;--sl-content-width: 100%}.sl-banner{--sl-color-banner-text: var(--sl-color-white);background-color:transparent}.sl-markdown-content :is(h1,h2,h3,h4,h5,h6){break-after:avoid}.sl-markdown-content :is(p,li){orphans:2;widows:2}.sl-markdown-content pre{overflow-x:hidden;white-space:pre-wrap}.sl-markdown-content .expressive-code,.sl-markdown-content figure,.sl-markdown-content pre{break-inside:avoid}.expressive-code .frame.is-terminal .header:before{box-shadow:inset 99rem 99rem var(--sl-color-gray-5)}.expressive-code .frame.has-title:not(.is-terminal) .header{background:transparent;border-bottom:1px solid var(--sl-color-gray-6)}.expressive-code .frame.has-title:not(.is-terminal) .title{background:transparent}.expressive-code .frame.has-title:not(.is-terminal) .title:after{border-top:0}.expressive-code .copy{display:none}.sl-markdown-content code:not(:where(.not-content *)){background-color:transparent;padding:0;margin-block:unset;font-size:.9375em}.sl-badge{background:transparent;color:var(--sl-color-white)}starlight-file-tree{break-inside:avoid}starlight-file-tree .highlight{outline:3px solid var(--sl-color-accent-low);color:var(--sl-color-text);background-color:transparent}.starlight-aside{break-inside:avoid}.sl-link-button.primary{background:transparent;border-color:var(--sl-color-white);color:var(--sl-color-white)}starlight-tabs{break-inside:avoid}.sl-steps>li:after{box-shadow:inset 99rem 99rem var(--sl-color-hairline-light)}}
diff --git a/assets/vendor/ssscript-docs/favicon.svg b/assets/vendor/ssscript-docs/favicon.svg
new file mode 100644
index 0000000..1e1c79e
--- /dev/null
+++ b/assets/vendor/ssscript-docs/favicon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/content/knowledge.json b/content/knowledge.json
new file mode 100644
index 0000000..577ebd2
--- /dev/null
+++ b/content/knowledge.json
@@ -0,0 +1,201 @@
+{
+  "schemaVersion": 1,
+  "slug": "knowledge",
+  "title": "Knowledge",
+  "basePath": "knowledge",
+  "settings": {
+    "description": "Материалы о NODE.DC, агентных модулях, интеграциях, цифровых двойниках и рабочих контурах платформы.",
+    "searchPlaceholder": "Поиск",
+    "themeDefault": "dark",
+    "navTitle": "Knowledge",
+    "downloadEnabled": false,
+    "homeHref": "/"
+  },
+  "introHtml": "

Knowledge - библиотека материалов NODE.DC о платформе, агентных контурах, интеграциях и прикладных модулях. Здесь собраны не инструкции ради инструкций, а объяснения: как устроены слои системы, где появляются данные, как они попадают в задачи и какие сценарии можно собирать поверх общей инфраструктуры.

\n

Что здесь лежит

\n

Раздел помогает быстро разобраться в NODE.DC как в единой операционной платформе: от Hub, Engine и Ops до тендерного агента, интеграции с 1С, цифровых двойников, беспилотников и SEO-модуля.

\n

Как использовать

\n

Материалы можно читать как обзор архитектуры. 

\n

[button name=\"Перейти к модулям на лендинге\" link=\"/\" block=\"component-library-copy-copy-copy\" target=\"applied-modules\"]

", + "tree": [ + { + "id": "platform-overview", + "title": "NODE.DC", + "slug": "platform", + "enabled": true, + "useContent": true, + "seo": { + "title": "NODE.DC | NODE.DC Knowledge", + "description": "Обзор платформы NODE.DC: данные, процессы, агенты, Hub, Engine, Ops и прикладные контуры предприятия." + }, + "bodyHtml": "\n

NODE.DC - операционная платформа, которая связывает распределённые объекты, данные и действия в едином контуре управления. Она подключает физические источники, цифровые сервисы, бизнес-системы и прикладные модули, превращая разрозненные сигналы в воспроизводимые потоки событий.

\n

Смысл платформы

\n

В основе NODE.DC лежит модель объектов: сущности, паспорта, связи, состояния, события и допустимые действия. Эта структура даёт общую картину того, что происходит в компании, где это происходит, с чем связано и какие следующие действия доступны.

\n

Три базовых слоя

\n
  • Hub отвечает за вход, роли, группы, рабочие пространства и каталог приложений.
  • Engine собирает процессы, интеграции, обработчики данных, интерфейсы и агентные сценарии.
  • Ops принимает задачи, статусы, отчёты, согласования и результаты работы модулей.
\n

Агентный интеллектуальный слой

\n

Поверх данных работает AIS - агентный слой платформы. Он анализирует историю и текущее состояние, выявляет отклонения, формирует объяснения, предлагает действия и запускает сценарии строго в рамках прав доступа и контекста.

\n

Где применяется

\n

NODE.DC полезен там, где важно быстро перейти от наблюдения к действию: в закупках, проектном офисе, инженерных данных, производстве, строительстве, цифровых двойниках, робототехнике и интеграциях с учётными системами.

\n

[button name=\"Посмотреть платформу на лендинге\" link=\"/\" block=\"ai-modes\" target=\"platform-composition\"]

\n", + "children": [ + { + "id": "hub", + "title": "Hub", + "slug": "hub", + "enabled": true, + "useContent": true, + "seo": { + "title": "Hub | NODE.DC Knowledge", + "description": "NODE.DC Hub: единая точка входа, каталог приложений, роли, группы, доступы и рабочие пространства." + }, + "bodyHtml": "

\"\"

NODE.DC Hub - единая точка доступа к среде NODE.DC. Он показывает пользователю доступные приложения, рабочие пространства и сервисы платформы с учётом роли, группы и настроек конкретного контура.

\n

Что делает Hub

\n
  • собирает каталог приложений и микромодулей в одном интерфейсе;
  • управляет ролями, группами, отделами и правами доступа;
  • разделяет рабочие контуры для инженерных, финансовых, юридических, закупочных и производственных команд;
  • даёт администраторам понятную точку настройки платформы.
\n

Enterprise-сценарий

\n

В корпоративном контуре администратор может назначать типовые конфигурации доступа для подразделений и отдельно расширять права конкретным пользователям. За счёт этого платформа не превращается в общий склад кнопок: каждый видит только те инструменты, которые относятся к его работе.

\n

Связь с другими слоями

\n

Из Hub пользователь переходит в Engine, Ops и прикладные приложения. Все переходы сохраняют контекст прав доступа, поэтому один и тот же модуль может выглядеть по-разному для руководителя проекта, инженера, закупщика или внешнего подрядчика.

[button name=\"Посмотреть демо\" link=\"http://127.0.0.1:8124/\" block=\"feature-video\" target=\"hub-video\"]

", + "children": [] + }, + { + "id": "engine", + "title": "Engine", + "slug": "engine", + "enabled": true, + "useContent": true, + "seo": { + "title": "Engine | NODE.DC Knowledge", + "description": "NODE.DC Engine: нодовый слой для сборки процессов, интеграций, интерфейсов и агентных сценариев." + }, + "bodyHtml": "

NODE.DC Engine - рабочий слой для проектирования и запуска процессов внутри платформы. Здесь создаются интеграции сервисов, обработчики данных, диспетчерские панели, сценарии роботизации и внутренние автоматизации для бизнеса.

\n

Нодовый редактор

\n

Процессы собираются в узловом редакторе. Узлы описывают источники данных, преобразования, действия, визуализацию, проверки, внешние API и пользовательские интерфейсы. Такой подход позволяет быстро добавлять новые сценарии без переписывания всей системы.

\n

Роль ИИ-агентов

\n

Сценарий можно собрать вручную или с помощью агента: пользователь описывает задачу, а агент предлагает архитектуру решения, добавляет необходимые узлы и готовит схему для подключения к интерфейсу.

\n

Что можно собирать

\n
  • интеграции с 1С, CRM, ERP, API и webhooks;
  • операционные панели и диспетчерские интерфейсы;
  • потоки обработки документов, телеметрии и событий;
  • агентные цепочки для анализа, отбора, классификации и маршрутизации задач.
\n

Передача в Ops

\n

Результат работы Engine не остаётся схемой в редакторе. Он передаётся в операционный слой: создаёт задачи, обновляет статусы, прикладывает отчёты, запускает согласования или отдаёт данные в другой модуль.

[button name=\"Посмотреть демо\" link=\"http://127.0.0.1:8124/\" block=\"feature-video-copy\" target=\"engine-video\"]


", + "children": [] + }, + { + "id": "ops", + "title": "Ops", + "slug": "ops", + "enabled": true, + "useContent": true, + "seo": { + "title": "Ops | NODE.DC Knowledge", + "description": "NODE.DC Ops: операционный слой для задач, статусов, отчётов, инженерных данных и результатов агентов." + }, + "bodyHtml": "

NODE.DC Ops - операционный слой платформы. В него сводятся проекты, процессы, задачи, инженерные данные, статусы, отчёты, согласования и результаты работы прикладных контуров.

\n

Единая рабочая среда

\n

Ops объединяет людей, агентов и цифровые контуры предприятия. Задачи можно ставить, уточнять, декомпозировать, передавать между подразделениями, контролировать по этапам и связывать с результатами из других слоёв NODE.DC.

\n

Ассистент внутри процесса

\n

Сквозной ассистент работает не как справочная кнопка, а как интерфейс к рабочему контексту: задачам, проектным материалам, кодовой базе, инженерным данным, отчётам и действиям агентов. При наличии прав он может готовить материалы, создавать подзадачи и инициировать изменения в сервисах.

\n

Форматы представления

\n
  • проектные дашборды и карточки задач;
  • календарные планы и таблицы;
  • графики, отчёты и рабочие области;
  • просмотр BIM, STEP, STL, 3DGS, LAS и других инженерных материалов.
\n

Зачем это нужно

\n

Ops делает работу наблюдаемой: каждое действие, решение и отклонение получает место в общем контуре, а не теряется в чатах, таблицах и разрозненных файлах.

[button name=\"Посмотреть демо\" link=\"http://127.0.0.1:8124/\" block=\"feature-video-copy-copy\" target=\"ops-video\"]

", + "children": [] + } + ] + }, + { + "id": "agent-context", + "title": "Агентный контур", + "slug": "agent-context", + "enabled": true, + "useContent": true, + "seo": { + "title": "Агентный контур | NODE.DC Knowledge", + "description": "Как в NODE.DC устроена агентная автоматизация: контекст, права, задачи, данные и передача результатов между модулями." + }, + "bodyHtml": "\n

Агентный контур NODE.DC - рабочая среда для сборки, запуска и контроля цифровых агентов внутри единой операционной платформы. Здесь агентная автоматизация не является набором отдельных скриптов: она встроена в процессы, роли, данные и задачи компании.

\n

Что передаётся агентам

\n

Агентам можно отдавать повторяющиеся и трудоёмкие операции: поиск, отбор, классификацию, разбор документов, подготовку отчётов, сверку данных и запуск следующих шагов. Человек остаётся владельцем решения, а агент снимает рутину и ускоряет подготовку материалов.

\n

Контекст и права

\n

Агент работает только в доступном ему контексте. Он видит задачи, документы, модели, сервисы и историю действий в рамках настроенных прав. Это важно для enterprise-сценариев, где один и тот же процесс может касаться разных подразделений и уровней доступа.

\n

Передача результата

\n
  • результат может стать подзадачей в Ops;
  • может уйти в юридический, закупочный или инженерный модуль;
  • может запустить согласование или проверку;
  • может лечь в отчёт, карточку объекта или рабочий дашборд.
\n

Почему это инфраструктура

\n

Главная ценность агентного слоя в том, что он поднимает автоматизацию с уровня отдельного инструмента до уровня рабочей инфраструктуры. События, причины, решения и действия остаются в одном контуре и могут быть проверены позже.

\n", + "children": [] + }, + { + "id": "applied-modules", + "title": "Прикладные модули", + "slug": "modules", + "enabled": true, + "useContent": true, + "seo": { + "title": "Прикладные модули | NODE.DC Knowledge", + "description": "Прикладные модули NODE.DC: отраслевые и корпоративные контуры поверх общей платформенной инфраструктуры." + }, + "bodyHtml": "\n

Прикладные модули NODE.DC закрывают конкретные функции предприятия: закупки, тендеры, 1С, производство, строительство, цифровые двойники, беспилотники, SEO и внутренние инструменты разработки.

\n

Задача прикладного слоя

\n

Смысл модулей - адаптировать платформу под специфику компании. В одном контуре можно связать учётные системы, роли, задачи, файлы, инженерные данные, агентов, отчёты и интерфейсы без разрыва между приложениями.

\n

Что можно добавить

\n
  • модуль под отдельный отдел или процесс;
  • интеграцию с внешней системой, API, 1С, CRM или ERP;
  • операционный дашборд и рабочий интерфейс;
  • агента для поиска, анализа, сверки или подготовки материалов;
  • инструмент разработки и администрирования для внутренней команды.
\n

Единый контекст

\n

Модуль не живёт отдельно. Он подключается к ролям, данным, задачам и сквозному ассистенту NODE.DC. Поэтому результат работы тендерного агента может попасть в Ops, данные из 1С могут участвовать в закупочной проверке, а инженерная модель может быть связана с задачей, отчётом и согласованием.

\n

[button name=\"Смотреть прикладные модули\" link=\"/\" block=\"component-library-copy-copy-copy\" target=\"applied-modules\"]

\n", + "children": [ + { + "id": "tender-agent", + "title": "Тендерный агент", + "slug": "tender-agent", + "enabled": true, + "useContent": true, + "seo": { + "title": "Тендерный агент | NODE.DC Knowledge", + "description": "Как тендерный агент NODE.DC помогает искать закупки, анализировать требования, риски, документы и передавать задачи в смежные контуры." + }, + "bodyHtml": "\n

Тендерный агент NODE.DC закрывает рабочий контур тендерного отдела. В одном интерфейсе объединяются поиск и агрегация закупок, первичный отбор, AI-анализ конкретных тендеров и передача материалов в смежные модули.

\n

Что делает агент

\n
  • собирает и нормализует закупочный поток с тендерных площадок;
  • выделяет требования, ограничения, сроки, финансовые параметры и рисковые зоны;
  • сопоставляет условия закупки с внутренними данными компании;
  • готовит выжимки, чек-листы и материалы для ответственных специалистов;
  • передаёт задачи в юридический, закупочный или операционный контур.
\n

Поведенческий поиск

\n

Система учитывает действия специалиста: какие закупки он открывает, какие отклоняет, по каким признакам принимает решение. На этой базе формируются устойчивые паттерны отбора, а релевантные тендеры находятся точнее.

\n

Роль человека

\n

Специалист тендерного отдела остаётся оператором решения. Агент сокращает ручной перебор, готовит анализ и подсвечивает риски, но финальное решение, подача и коммуникация остаются под контролем команды.

\n

Связь с платформой

\n

Материалы тендера могут стать задачами в Ops, данными для юридического анализа, входом для 1С-интеграции или основанием для закупочной цепочки.

\n

[button name=\"Посмотреть демо на лендинге\" link=\"/\" block=\"component-library-copy-copy-copy\" target=\"applied-modules\"]

\n", + "children": [] + }, + { + "id": "1c-integration", + "title": "Интеграция с 1С", + "slug": "1c-integration", + "enabled": true, + "useContent": true, + "seo": { + "title": "Интеграция с 1С | NODE.DC Knowledge", + "description": "Как NODE.DC связывает 1С с задачами, агентами, закупками, документами, складами и операционными процессами." + }, + "bodyHtml": "\n

Интеграция с 1С связывает учётный контур предприятия с задачами, агентами и рабочими модулями NODE.DC. 1С остаётся источником фактов, а NODE.DC добавляет операционный, аналитический и агентный слой поверх этих данных.

\n

Какие данные подключаются

\n
  • справочники, контрагенты, номенклатура и статусы;
  • документы, счета, акты, заявки и закупочные позиции;
  • остатки, движение товаров, складские события и производственные данные;
  • связанные задачи, согласования и внутренние комментарии.
\n

Типовые сценарии

\n

Команда может использовать данные из 1С для сверки тендерных требований, контроля закупок, подготовки отчётов, запуска согласований, проверки остатков, анализа поставщиков и передачи результата в Ops.

\n

1С агент

\n

1С агент помогает не просто показать данные, а ответить на рабочий вопрос: найти документ, объяснить статус, собрать выборку, подготовить задачу или подсказать следующий шаг. При этом действия выполняются в рамках прав доступа и фиксируются в операционном контуре.

\n

Почему это важно

\n

Без интеграции учётная система часто остаётся отдельным окном. NODE.DC связывает её с процессами: данные становятся частью задач, отчётов, агентов и модулей, а не отдельной ручной проверкой.

\n", + "children": [] + }, + { + "id": "drone-management", + "title": "Управление беспилотниками", + "slug": "drone-management", + "enabled": true, + "useContent": true, + "seo": { + "title": "Управление беспилотниками | NODE.DC Knowledge", + "description": "Цифровой контур NODE.DC для беспилотных систем: телеметрия, IoT-состояния, видеопотоки, события и операторский интерфейс." + }, + "bodyHtml": "\n

В NODE.DC может быть реализован интеграционный слой для работы с беспилотными решениями. Платформа становится цифровым контуром вокруг системы управления: собирает телеметрию, анализирует состояние IoT-компонентов, обрабатывает события и помогает оператору принимать решения.

\n

Что контролирует платформа

\n
  • состояние узлов, датчиков и исполнительных компонентов;
  • параметры движения, маршруты и эксплуатационные ограничения;
  • историю событий, уведомления и отклонения;
  • видеопотоки, классификацию объектов и признаки нештатных ситуаций.
\n

ИИ-модули

\n

Отдельное направление - анализ видеопотоков, оценка окружения, выявление препятствий, контроль состояния маршрута и подготовка кратких сводок для оператора.

\n

Опыт и переносимость

\n

Подход применим к разным автономным комплексам: курьерским решениям, гусеничным наземным платформам, распределённой технике и мониторинговым сценариям. В каждом случае NODE.DC отвечает за данные, события, наблюдаемость, интерфейс и агентное сопровождение.

\n

Результат

\n

Оператор видит не набор сырых сигналов, а понятную картину: что произошло, насколько это критично, какие действия доступны и какие данные уже собраны системой.

\n", + "children": [] + }, + { + "id": "city-digital-twins", + "title": "Цифровые двойники городов", + "slug": "city-digital-twins", + "enabled": true, + "useContent": true, + "seo": { + "title": "Цифровые двойники городов | NODE.DC Knowledge", + "description": "Как NODE.DC может выступать точкой входа в городской цифровой двойник: 3DGS, карта, BIM, облака точек и единый контекст." + }, + "bodyHtml": "\n

NODE.DC может работать как вход в цифровой двойник города или крупной территории. Пользователь получает единое пространственное окружение, где обзор, аналитика и инженерный разбор связаны геопривязкой, API и общим контекстом.

\n

Три масштаба

\n

Обзорный слой

\n

3DGS-сцены дают быстрый вход внутрь локации: прогулку от третьего лица, совместное присутствие, наблюдение других участников и естественное понимание пространства.

\n

Городской слой

\n

Карта местности становится навигацией и агрегатором слоёв: транспорт, экология, инфраструктура, распределённые объекты, статусы и события.

\n

Инженерный слой

\n

BIM-модели, облака точек и технические материалы позволяют перейти к детальному анализу объекта, конструкции, помещений и инженерных систем.

\n

Единый маршрут пользователя

\n

Человек может начать с общего обзора, перейти к городской аналитике, затем открыть конкретный объект и посмотреть его инженерную структуру без разрыва пространственной логики.

\n

Связь с Ops

\n

Любое наблюдение, отклонение или задача из цифрового двойника может быть связано с карточкой в Ops, ответственным исполнителем, сроком, материалами и историей действий.

\n", + "children": [] + }, + { + "id": "industrial-contour", + "title": "Промышленный контур", + "slug": "industrial-contour", + "enabled": true, + "useContent": true, + "seo": { + "title": "Промышленный контур | NODE.DC Knowledge", + "description": "Цифровой двойник промышленного предприятия в NODE.DC: состояния цехов, оборудование, облака точек, BIM и эксплуатационные данные." + }, + "bodyHtml": "\n

Промышленный контур NODE.DC помогает хранить и сопоставлять состояния производственных помещений, оборудования и инженерной инфраструктуры во времени. Это не только визуализация, а рабочий инструмент поддержки решений.

\n

Цифровой архив состояний

\n

Регулярная фиксация состояния предприятия позволяет сравнивать цеха, оборудование и инженерные зоны за разные периоды. На этой базе можно выявлять деформации, износ, перегрузки и отклонения.

\n

Что входит

\n
  • BIM-данные, облака точек и фотореалистичные слои;
  • паспорта помещений, цехов и оборудования;
  • связь с ERP/1С, складами и производственными статусами;
  • карта-навигация для сотрудников и подрядчиков;
  • история изменений и материалы модернизации.
\n

Оптимизация процессов

\n

Когда пространственные данные связаны с производственными узлами, легче находить причины износа, перегрузок и простоев. Решение принимается не по отдельной фотографии или таблице, а по контексту объекта.

\n

Планирование модернизаций

\n

Цифровой двойник фиксирует промежуточные состояния предприятия как живую историю объекта. Это снижает риск ошибок при проектировании, ремонте, реконструкции и внедрении нового оборудования.

\n", + "children": [] + }, + { + "id": "enterprise-management", + "title": "Управление предприятием", + "slug": "enterprise-management", + "enabled": true, + "useContent": true, + "seo": { + "title": "Управление предприятием | NODE.DC Knowledge", + "description": "Ситуационный и мониторинговый режим NODE.DC для управленческого контура предприятия." + }, + "bodyHtml": "\n

Управленческий контур NODE.DC собирает в одном рабочем пространстве финансовые показатели, производственные статусы, распределённые объекты, логистику, поставщиков, отклонения и выводы агентных систем.

\n

Единое экранное пространство

\n

Вместо разрозненных отчётов формируется живая картина предприятия. Каждый блок интерфейса связан с конкретным объектом, процессом, узлом данных или рабочим полем.

\n

Что можно выводить

\n
  • финансовые и операционные показатели;
  • производственные статусы и риски;
  • состояние объектов, складов, техники и инфраструктуры;
  • логистику, поставщиков и закупочный поток;
  • аналитические сводки агентов и рекомендации по действиям.
\n

Не витрина, а рабочая проекция

\n

Ценность режима в том, что он связан с действующей архитектурой процессов. Из показателя можно перейти в задачу, из задачи - в материалы, из материалов - в ответственного, а из отклонения - в сценарий реакции.

\n

Роль руководителя

\n

Руководитель видит не только итоговый отчёт, но и причинно-следственную цепочку: от источника события до текущего статуса и следующего действия.

\n", + "children": [] + }, + { + "id": "construction-contour", + "title": "Строительный контур", + "slug": "construction-contour", + "enabled": true, + "useContent": true, + "seo": { + "title": "Строительный контур | NODE.DC Knowledge", + "description": "NODE.DC для строительства: BIM, полевые отчёты, подрядчики, дефекты, сроки, модели и операционный контроль." + }, + "bodyHtml": "\n

Строительный контур NODE.DC связывает проектные данные, площадку, подрядчиков, BIM-модели, полевые отчёты, дефекты, сроки и согласования в одной рабочей системе.

\n

Что объединяется

\n
  • BIM-модели, чертежи, облака точек и фотофиксация;
  • задачи, замечания, дефекты и исполнительная документация;
  • подрядчики, ответственные, сроки и этапы работ;
  • полевые отчёты и мобильные сценарии инспекций;
  • связь с закупками, складами и финансовыми контурами.
\n

Переход от модели к действию

\n

Инженерная модель становится не отдельным файлом, а источником рабочих действий. Элемент модели можно связать с задачей, актом, замечанием, фотографией, сроком или ответственным исполнителем.

\n

Контроль изменений

\n

Для стройки важна история: что было запланировано, что изменилось, кто согласовал, какие материалы приложены и почему задача перешла в новый статус. Ops сохраняет эту цепочку в операционном контуре.

\n

Агентное сопровождение

\n

Агенты могут готовить сводки по дефектам, искать просрочки, сравнивать отчёты, собирать материалы к совещанию и подсвечивать зоны риска.

\n", + "children": [] + }, + { + "id": "seo-module", + "title": "SEO модуль", + "slug": "seo-module", + "enabled": true, + "useContent": true, + "seo": { + "title": "SEO модуль | NODE.DC Knowledge", + "description": "SEO Farm как модуль NODE.DC: аудит сайта, Wordstat, карта ключей, редактор правок, media SEO и ручной apply через changeset." + }, + "bodyHtml": "\n

SEO модуль NODE.DC строится как локальный редакторский контур для работы с существующими сайтами. Его задача - не автоматически публиковать тексты и не забивать страницу ключами, а дать управляемый процесс для редактора, дизайнера и SEO-специалиста.

\n

Основной сценарий

\n
  1. проект сканируется как папка сайта или рабочий источник;
  2. собирается индекс страниц, секций, медиа и технических файлов;
  3. выполняется baseline audit по структуре, заголовкам, описаниям, видимым текстам и медиа;
  4. из текста извлекаются смыслы, seed-запросы и потенциальные интенты;
  5. через Wordstat собираются реальные запросы и частотность;
  6. формируется карта ключей по секциям;
  7. редактор утверждает правки, проверяет переспам и применяет изменения через changeset.
\n

Что проверяется

\n
  • title, description, h1/h2 и порядок заголовков;
  • видимый текст, секции и смысловые дубли;
  • изображения, видео, posters, alt, title, aria-label и контекст вокруг медиа;
  • риски переспама, конкурирующие смыслы, тон и ограничения по длине.
\n

Почему не автопостинг

\n

Модуль работает с рабочей копией текста. Исходный сайт не меняется до ручного Apply. Перед применением пользователь видит план, варианты правок, проверки качества и итоговый changeset.

\n

Связь с Knowledge

\n

Этот раздел Knowledge сам является хорошим кандидатом для SEO-модуля: каждая статья имеет отдельный URL, понятный заголовок, описание, структуру H2/H3 и может проходить через тот же редакторский контур.

\n", + "children": [] + } + ] + } + ] +} diff --git a/content/pages/home.json b/content/pages/home.json index a2cb284..3f87e24 100644 --- a/content/pages/home.json +++ b/content/pages/home.json @@ -16,7 +16,7 @@ { "label": "О продукте", "href": "", - "target": "index.html#features", + "target": "index.html#platform-composition", "enabled": true, "linkMode": "target", "linkTarget": "" @@ -37,10 +37,18 @@ "linkMode": "href", "linkTarget": "_blank" }, + { + "label": "Knowledge", + "href": "/knowledge/", + "target": "", + "enabled": true, + "linkMode": "href", + "linkTarget": "" + }, { "label": "Тарифы", "href": "", - "target": "index.html#pricing-wrap", + "target": "index.html#pricing-intro", "enabled": false, "linkMode": "target", "linkTarget": "" @@ -760,7 +768,7 @@ "type": "aiModes", "template": "project-composition.html", "adminLabel": "СОСТАВ ПРОЕКТА", - "anchor": null, + "anchor": "platform-composition", "content": { "heading": { "muted": "NODE.DC", @@ -894,7 +902,7 @@ "type": "featureVideo", "template": "project-video-first.html", "adminLabel": "HUB - PROJECT VIDEO - FIRST", - "anchor": "features", + "anchor": "hub-video", "content": { "windowTitle": "NDC_HUB.mp4", "videoSrc": "./assets/uploads/media/ai-modes/ndc_hub_base-mqv6lm07.mp4", @@ -1046,7 +1054,7 @@ "type": "componentLibrary", "template": "project-video-detail.html", "adminLabel": "HUB - PROJECT VIDEO - DETAIL", - "anchor": null, + "anchor": "hub-contour", "content": { "heading": { "muted": "Hub.", @@ -1196,7 +1204,7 @@ "type": "featureVideo", "template": "project-video-first.html", "adminLabel": "ENGINE - PROJECT VIDEO - FIRST", - "anchor": "features", + "anchor": "engine-video", "content": { "windowTitle": "ENGINE_HUB.mp4", "videoSrc": "./assets/uploads/media/ai-modes/ndc_engine_base-mqv6lvyr.mp4", @@ -1349,7 +1357,7 @@ "type": "componentLibrary", "template": "project-video-detail.html", "adminLabel": "ENGINE - PROJECT VIDEO - DETAIL", - "anchor": null, + "anchor": "engine-contour", "content": { "heading": { "muted": "Engine. ", @@ -1500,7 +1508,7 @@ "type": "featureVideo", "template": "project-video-first.html", "adminLabel": "OPS - PROJECT VIDEO - FIRST", - "anchor": "features", + "anchor": "ops-video", "content": { "windowTitle": "OPS_HUB.mp4", "videoSrc": "./assets/uploads/media/ai-modes/ndc_ops_blur-mqv6ss6k.mp4", @@ -1653,7 +1661,7 @@ "type": "componentLibrary", "template": "project-video-detail.html", "adminLabel": "OPS- PROJECT VIDEO - DETAIL", - "anchor": null, + "anchor": "ops-contour", "content": { "heading": { "muted": "OPS", @@ -1804,7 +1812,7 @@ "type": "componentLibrary", "template": "project-video-detail.html", "adminLabel": "МОДУЛИ- PROJECT VIDEO - DETAIL", - "anchor": null, + "anchor": "applied-modules", "content": { "heading": { "muted": "Модули. ", @@ -1975,7 +1983,7 @@ "type": "faqSection", "template": "faq.html", "adminLabel": "FAQ", - "anchor": null, + "anchor": "faq", "content": { "heading": { "muted": "Частые", @@ -2212,7 +2220,7 @@ "type": "publishCta", "template": "publish-cta.html", "adminLabel": "Финальный CTA", - "anchor": "hero", + "anchor": "final-cta", "content": { "cta": { "heading": { @@ -2295,7 +2303,7 @@ "type": "centralTextBlock", "template": "central-text-block.html", "adminLabel": "Центральный текстовый блок", - "anchor": "pricing", + "anchor": "pricing-intro", "content": { "eyebrow": "Тарифы", "heading": { @@ -2376,7 +2384,7 @@ "type": "pricingTable", "template": "pricing-table.html", "adminLabel": "Тарифы: таблица", - "anchor": "pricing-wrap", + "anchor": "pricing-table", "content": { "pricing": { "windowTitle": "Тарифы.app", @@ -2870,7 +2878,7 @@ "type": "screenshotCards", "template": "screenshot-cards.html", "adminLabel": "Карточки скриншотов", - "anchor": null, + "anchor": "screenshots", "enabled": false, "content": { "galleryItems": [ @@ -3018,7 +3026,7 @@ "type": "waitlistFiles", "template": "request-demo-txt-files.html", "adminLabel": "Запрос DEMO и TXT-файлы", - "anchor": "waitlist", + "anchor": "demo-request", "enabled": true, "content": { "form": { @@ -3536,7 +3544,7 @@ { "label": "Лист ожидания", "href": "", - "target": "index.html#waitlist", + "target": "index.html#demo-request", "enabled": false, "linkMode": "target", "linkTarget": "" @@ -3544,23 +3552,23 @@ { "label": "Тарифы", "href": "", - "target": "index.html#", + "target": "index.html#pricing-intro", "enabled": false, "linkMode": "target", "linkTarget": "" }, { "label": "Возможности", - "href": "https://nodedc.dctouch.ru/", - "target": "index.html#features", + "href": "", + "target": "index.html#applied-modules", "enabled": true, - "linkMode": "href", + "linkMode": "target", "linkTarget": "" }, { "label": "Демо", "href": "", - "target": "index.html#features", + "target": "index.html#hub-video", "enabled": true, "linkMode": "target", "linkTarget": "" diff --git a/index.html b/index.html index 22260fb..4044fb0 100644 --- a/index.html +++ b/index.html @@ -82,7 +82,7 @@ visibility: hidden; }

Платформа для цифровых контуров предприятия

Hub, Engine, Ops и прикладные модули в единой экосистеме управления, разработки и исполнения.

Полныйагентный контроль

Единый агентный слой с доступом к задачам, кодовой базе, данным, моделям и связанным сервисам.

Модульная архитектура

Подключаемые приложения, роли, контуры доступа, рабочие пространства и специализированные инструменты.

Разработка и запуск

Сборка workflow, интерфейсов и рабочих контуров с передачей результатов в операционный слой.
-
+

@@ -152,8 +152,8 @@ visibility: hidden;

-
NDC_HUB.mp4

HUBточка входа в платформу

Универсальный инструмент для ИИ-агентов в вашем NODE.DC-контуре.
Каталог приложений
Доступные модули отображаются по роли, группе и контуру предприятия.
Рабочие пространства
Проекты, отделы и enterprise-контуры разделяются по правилам доступа.
Администрирование
Пользователи, группы, роли и права управляются из единой административной зоны.
Сквозной доступ
Переход к Engine, Ops и прикладным модулям сохраняет общий контекст платформы.
-
+
NDC_HUB.mp4

HUBточка входа в платформу

Универсальный инструмент для ИИ-агентов в вашем NODE.DC-контуре.
Каталог приложений
Доступные модули отображаются по роли, группе и контуру предприятия.
Рабочие пространства
Проекты, отделы и enterprise-контуры разделяются по правилам доступа.
Администрирование
Пользователи, группы, роли и права управляются из единой административной зоны.
Сквозной доступ
Переход к Engine, Ops и прикладным модулям сохраняет общий контекст платформы.
+

@@ -227,8 +227,8 @@ Enterprise-контуры

-
ENGINE_HUB.mp4

ENGINEСлой разработки

Engine используется для сборки workflow, прикладной логики, интеграций и интерфейсов внутри NODE.DC.
Нодовый редактор
Процессы собираются из узлов, связей и готовых компонентов.
Агентная сборка
Агент может сформировать workflow по текстовому заданию.
Библиотека узлов
500+ компонентов для данных, логики, API, визуализации и внешних систем.
Запуск в контур
Результат подключается к интерфейсу и передается в Ops.
-
+
ENGINE_HUB.mp4

ENGINEСлой разработки

Engine используется для сборки workflow, прикладной логики, интеграций и интерфейсов внутри NODE.DC.
Нодовый редактор
Процессы собираются из узлов, связей и готовых компонентов.
Агентная сборка
Агент может сформировать workflow по текстовому заданию.
Библиотека узлов
500+ компонентов для данных, логики, API, визуализации и внешних систем.
Запуск в контур
Результат подключается к интерфейсу и передается в Ops.
+

@@ -301,8 +301,8 @@ Enterprise-контуры

-
OPS_HUB.mp4

OPSОперационный слой

Ops собирает задачи, статусы, отчеты, согласования, рабочие материалы и результаты агентов в едином операционном контуре.
Проектный контур
Задачи, карточки, этапы, статусы и контроль исполнения.
Рабочие представления
Канбан, таблицы, календарь, графики, диаграммы и дашборды.
Сквозной ассистент
Контекст по задачам, коду, моделям, данным и связанным сервисам.
Результаты модулей
События, отчеты и действия из Engine и прикладных модулей попадают в Ops.
-
+
OPS_HUB.mp4

OPSОперационный слой

Ops собирает задачи, статусы, отчеты, согласования, рабочие материалы и результаты агентов в едином операционном контуре.
Проектный контур
Задачи, карточки, этапы, статусы и контроль исполнения.
Рабочие представления
Канбан, таблицы, календарь, графики, диаграммы и дашборды.
Сквозной ассистент
Контекст по задачам, коду, моделям, данным и связанным сервисам.
Результаты модулей
События, отчеты и действия из Engine и прикладных модулей попадают в Ops.
+

@@ -376,7 +376,7 @@ Enterprise-контуры

-
+

@@ -485,8 +485,8 @@ Enterprise-контуры

-

Частыевопросыи ответы

Подробный обзор возможностей, логики работы и внутреннего устройства.
FAQ
NODE.DC
Что входит в NODE.DC?
NODE.DC
Зачем нужен Hub?
NODE.DC
Как связаны Hub, Engine и Ops?
NODE.DC
Что создается в Engine?
NODE.DC
Что фиксируется в Ops?
NODE.DC
Как работает сквозной ассистент?
NODE.DC
Как работают прикладные модули?
NODE.DC
Какие модули можно подключать?
NODE.DC
Поддерживаются ли инженерные форматы?
NODE.DC
Как настраиваются роли и права доступа?
NODE.DC
Можно ли подключать корпоративные системы?
NODE.DC
Где размещается NODE.DC?
NODE.DC
Как запускается пилотный контур?
NODE.DC
Чем NODE.DC отличается от набора отдельных приложений?
NODE.DC
Ответить
Что входит в NODE.DC?

NODE.DC включает Hub для входа и управления доступами, Engine для разработки workflow и прикладной логики, Ops для операционной работы, сквозного ассистента и подключаемые модули: 1C Assistant, Tender, Digital Twin, Model Viewer / Engineering Core и отраслевые приложения.

Отправлено с NODE.DC MANUAL CORE
NODE.DC
Ответить
Зачем нужен Hub?

Hub выполняет роль лаунчера и административной точки входа. В нем отображается каталог доступных приложений, рабочие пространства, роли, группы пользователей и права доступа к модулям платформы.

Отправлено с NODE.DC MANUAL CORE
NODE.DC
Ответить
Как связаны Hub, Engine и Ops?

Hub отвечает за вход, роли и доступ к приложениям. Engine используется для сборки workflow, прикладной логики, интеграций и интерфейсов. Ops принимает задачи, отчеты, статусы, результаты работы модулей и действия агентов в операционный контур.

Отправлено с NODE.DC MANUAL CORE
NODE.DC
Ответить
Что создается в Engine?

В Engine создаются workflow, интеграционные сценарии, обработчики данных, прикладная логика, интерфейсные связки и сервисные контуры. Сборка может выполняться вручную в нодовом редакторе или через ассистента по текстовому заданию.

Отправлено с NODE.DC MANUAL CORE
NODE.DC
Ответить
Что фиксируется в Ops?

В Ops фиксируются задачи, статусы, карточки, отчеты, согласования, рабочие материалы, результаты агентов и данные из подключенных модулей. Слой предназначен для контроля процессов и операционной работы.

Отправлено с NODE.DC MANUAL CORE
NODE.DC
Ответить
Как работает сквозной ассистент?

Ассистент работает как единый интерфейс к приложениям и данным платформы. В рамках прав доступа ему доступны задачи, процессы, кодовая база, проектные материалы, отчеты, инженерные модели и результаты работы агентов. Ассистент может отвечать на вопросы, декомпозировать задачи, готовить материалы и инициировать действия в связанных слоях.

Отправлено с NODE.DC MANUAL CORE
NODE.DC
Ответить
Как работают прикладные модули?

Прикладные модули подключаются к ролям, задачам, данным, рабочим пространствам и ассистенту. Модуль закрывает не отдельный экран, а рабочий контур: входные данные, обработку, действия, отчеты, согласования и передачу результата в Ops.

Отправлено с NODE.DC MANUAL CORE
NODE.DC
Ответить
Какие модули можно подключать?

Базовый набор включает Hub, Engine и Ops. Дополнительно подключаются 1C Assistant, Tender, Digital Twin, Engineering Core, интеграционные сценарии, API-модули и специализированные приложения для подразделений.

Отправлено с NODE.DC MANUAL CORE
NODE.DC
Ответить
Поддерживаются ли инженерные форматы?

Для инженерных и производственных сценариев предусмотрена работа с цифровыми моделями и техническими материалами. Поддерживаются BIM, STEP, STL, 3DGS / Gaussian Splatting, LAS/LAZ-облака точек и другие форматы, связанные с задачами, версиями и проектным контекстом.

Отправлено с NODE.DC MANUAL CORE
NODE.DC
Ответить
Как настраиваются роли и права доступа?

Права доступа задаются через Hub. Администратор может назначать роли, формировать группы, разделять контуры доступа по подразделениям и выдавать индивидуальные права на приложения, функции и рабочие области.

Отправлено с NODE.DC MANUAL CORE
NODE.DC
Ответить
Можно ли подключать корпоративные системы?

NODE.DC рассчитан на подключение внешних сервисов, API, внутренних приложений, 1C, баз данных, файловых хранилищ и корпоративных систем. Интеграционные сценарии собираются в Engine и передают результаты в Ops, прикладные модули или пользовательские интерфейсы.

Отправлено с NODE.DC MANUAL CORE
NODE.DC
Ответить
Где размещается NODE.DC?

Доступны облачные, выделенные, гибридные и enterprise-варианты размещения. Итоговая конфигурация зависит от требований к безопасности, составу модулей, интеграциям и политике хранения данных.

Отправлено с NODE.DC MANUAL CORE
NODE.DC
Ответить
Как запускается пилотный контур?

Пилотный контур формируется по составу модулей, ролей, интеграций и рабочих сценариев. Обычно подключается Hub, настраиваются базовые роли, выбирается один или несколько процессов, после чего собираются workflow, рабочие представления и отчеты.

Отправлено с NODE.DC MANUAL CORE
NODE.DC
Ответить
Чем NODE.DC отличается от набора отдельных приложений?

NODE.DC связывает приложения в единую платформенную архитектуру: общий доступ, роли, сквозной ассистент, связанные задачи, данные, workflow и операционный слой. Это снижает разрыв между разработкой, управлением и исполнением процессов.

Отправлено с NODE.DC MANUAL CORE
-

Подключить.Собрать контур. Запустить.

Единый путь от доступа к модулю до рабочего контура предприятия. Hub для входа, Engine для сборки, Ops для управления.
Модульный доступ, документация и рабочие пространства. +

Частыевопросыи ответы

Подробный обзор возможностей, логики работы и внутреннего устройства.
FAQ
NODE.DC
Что входит в NODE.DC?
NODE.DC
Зачем нужен Hub?
NODE.DC
Как связаны Hub, Engine и Ops?
NODE.DC
Что создается в Engine?
NODE.DC
Что фиксируется в Ops?
NODE.DC
Как работает сквозной ассистент?
NODE.DC
Как работают прикладные модули?
NODE.DC
Какие модули можно подключать?
NODE.DC
Поддерживаются ли инженерные форматы?
NODE.DC
Как настраиваются роли и права доступа?
NODE.DC
Можно ли подключать корпоративные системы?
NODE.DC
Где размещается NODE.DC?
NODE.DC
Как запускается пилотный контур?
NODE.DC
Чем NODE.DC отличается от набора отдельных приложений?
NODE.DC
Ответить
Что входит в NODE.DC?

NODE.DC включает Hub для входа и управления доступами, Engine для разработки workflow и прикладной логики, Ops для операционной работы, сквозного ассистента и подключаемые модули: 1C Assistant, Tender, Digital Twin, Model Viewer / Engineering Core и отраслевые приложения.

Отправлено с NODE.DC MANUAL CORE
NODE.DC
Ответить
Зачем нужен Hub?

Hub выполняет роль лаунчера и административной точки входа. В нем отображается каталог доступных приложений, рабочие пространства, роли, группы пользователей и права доступа к модулям платформы.

Отправлено с NODE.DC MANUAL CORE
NODE.DC
Ответить
Как связаны Hub, Engine и Ops?

Hub отвечает за вход, роли и доступ к приложениям. Engine используется для сборки workflow, прикладной логики, интеграций и интерфейсов. Ops принимает задачи, отчеты, статусы, результаты работы модулей и действия агентов в операционный контур.

Отправлено с NODE.DC MANUAL CORE
NODE.DC
Ответить
Что создается в Engine?

В Engine создаются workflow, интеграционные сценарии, обработчики данных, прикладная логика, интерфейсные связки и сервисные контуры. Сборка может выполняться вручную в нодовом редакторе или через ассистента по текстовому заданию.

Отправлено с NODE.DC MANUAL CORE
NODE.DC
Ответить
Что фиксируется в Ops?

В Ops фиксируются задачи, статусы, карточки, отчеты, согласования, рабочие материалы, результаты агентов и данные из подключенных модулей. Слой предназначен для контроля процессов и операционной работы.

Отправлено с NODE.DC MANUAL CORE
NODE.DC
Ответить
Как работает сквозной ассистент?

Ассистент работает как единый интерфейс к приложениям и данным платформы. В рамках прав доступа ему доступны задачи, процессы, кодовая база, проектные материалы, отчеты, инженерные модели и результаты работы агентов. Ассистент может отвечать на вопросы, декомпозировать задачи, готовить материалы и инициировать действия в связанных слоях.

Отправлено с NODE.DC MANUAL CORE
NODE.DC
Ответить
Как работают прикладные модули?

Прикладные модули подключаются к ролям, задачам, данным, рабочим пространствам и ассистенту. Модуль закрывает не отдельный экран, а рабочий контур: входные данные, обработку, действия, отчеты, согласования и передачу результата в Ops.

Отправлено с NODE.DC MANUAL CORE
NODE.DC
Ответить
Какие модули можно подключать?

Базовый набор включает Hub, Engine и Ops. Дополнительно подключаются 1C Assistant, Tender, Digital Twin, Engineering Core, интеграционные сценарии, API-модули и специализированные приложения для подразделений.

Отправлено с NODE.DC MANUAL CORE
NODE.DC
Ответить
Поддерживаются ли инженерные форматы?

Для инженерных и производственных сценариев предусмотрена работа с цифровыми моделями и техническими материалами. Поддерживаются BIM, STEP, STL, 3DGS / Gaussian Splatting, LAS/LAZ-облака точек и другие форматы, связанные с задачами, версиями и проектным контекстом.

Отправлено с NODE.DC MANUAL CORE
NODE.DC
Ответить
Как настраиваются роли и права доступа?

Права доступа задаются через Hub. Администратор может назначать роли, формировать группы, разделять контуры доступа по подразделениям и выдавать индивидуальные права на приложения, функции и рабочие области.

Отправлено с NODE.DC MANUAL CORE
NODE.DC
Ответить
Можно ли подключать корпоративные системы?

NODE.DC рассчитан на подключение внешних сервисов, API, внутренних приложений, 1C, баз данных, файловых хранилищ и корпоративных систем. Интеграционные сценарии собираются в Engine и передают результаты в Ops, прикладные модули или пользовательские интерфейсы.

Отправлено с NODE.DC MANUAL CORE
NODE.DC
Ответить
Где размещается NODE.DC?

Доступны облачные, выделенные, гибридные и enterprise-варианты размещения. Итоговая конфигурация зависит от требований к безопасности, составу модулей, интеграциям и политике хранения данных.

Отправлено с NODE.DC MANUAL CORE
NODE.DC
Ответить
Как запускается пилотный контур?

Пилотный контур формируется по составу модулей, ролей, интеграций и рабочих сценариев. Обычно подключается Hub, настраиваются базовые роли, выбирается один или несколько процессов, после чего собираются workflow, рабочие представления и отчеты.

Отправлено с NODE.DC MANUAL CORE
NODE.DC
Ответить
Чем NODE.DC отличается от набора отдельных приложений?

NODE.DC связывает приложения в единую платформенную архитектуру: общий доступ, роли, сквозной ассистент, связанные задачи, данные, workflow и операционный слой. Это снижает разрыв между разработкой, управлением и исполнением процессов.

Отправлено с NODE.DC MANUAL CORE
+

Подключить.Собрать контур. Запустить.

Единый путь от доступа к модулю до рабочего контура предприятия. Hub для входа, Engine для сборки, Ops для управления.
Модульный доступ, документация и рабочие пространства. Подключение прикладных модулей и ролей по контурам. -Закрытый инвайт для пилотных внедрений.
Запросить инвайт
Тарифы

Платформа NODE.DC для процессов, данных и агентов.

Подписки на приложение с
включённым объёмом в каждом тарифе.
Подключение локальных моделей и личных ассистентов
SELFHOST в контуре предприятий / внутри инфраструктуры NODE.DC / открытый контур при подключении моделей по API
-
Логотип NODE.DC
Selfhost платформа

Запросить DEMO

NODE.DC - платформа для задач, процессов, данных, агентов и инженерных модулей.

Заявка принята. Спасибо.

Мы скоро свяжемся.

Подать заявку?

Или оформить ранний Founder-доступ

Оформить Founder-доступ 350€
До 200 мест

Не получилось

Что-то пошло не так.
Попробуйте ещё раз чуть позже.

DCTOUCH
© NODE.DC, 2026
Иконка TXT-файла
Hub Access

Единая точка входа: каталог приложений, рабочие пространства, роли, группы и права доступа.

Иконка TXT-файла
Engine Workflows

Нодовые workflow, обработчики данных, интеграционная логика и сборка прикладных контуров.

Иконка TXT-файла
Ops Cards

Операционные карточки, статусы, согласования, отчеты агентов и результаты выполнения задач.

Иконка TXT-файла
1C Assistant

Связка с 1C, разбор документов, поиск данных, сценарии согласований и передача результата в Ops.

Иконка TXT-файла
Tender Agent

Тендерные подборки, проверка требований, документы, дедлайны и агентные отчеты по процедурам.

Иконка TXT-файла
Digital Twin

Цифровые модели объектов, версии, проектный контекст, инженерные данные и связанные рабочие процессы.

Иконка TXT-файла
Model Viewer

Просмотр BIM, STEP, STL, 3DGS, облаков точек и инженерных материалов внутри единого контура.

Иконка TXT-файла
Engineering Core

Обработка технических форматов, связка моделей с задачами, версиями, отчетами и согласованиями.

Иконка TXT-файла
MCP Gateway

Контекстный шлюз для агентов: проектные данные, инструменты, кодовая база и внешние сервисы.

Иконка TXT-файла
API Contracts

Контракты API, схемы данных, webhooks, события, интеграции и контроль совместимости между модулями.

Иконка TXT-файла
Kubernetes

Оркестрация сервисов, изоляция окружений, scaling policies, probes, secrets и управляемый rollout.

Иконка TXT-файла
Cloudflare Edge

CDN, WAF, R2-хранилище, edge routing, cache policies и защита публичного периметра.

Иконка TXT-файла
Zero Trust

Доступ по принципу least privilege: SSO, MFA, device posture, audit trail и сегментация контуров.

Иконка TXT-файла
Security Matrix

Ролевая матрица, группы, политики доступа, ограничения функций и контроль административных действий.

Иконка TXT-файла
RBAC Policies

Права на приложения, рабочие области, действия агентов, документы, отчеты и инженерные данные.

Иконка TXT-файла
Audit Log

Журнал действий пользователей, агентов и сервисов: изменения, статусы, запросы, публикации и доступы.

Иконка TXT-файла
Secrets Vault

Хранение токенов, ключей API, webhook-секретов и конфигураций интеграций в защищенном контуре.

Иконка TXT-файла
Postgres Cluster

Основная транзакционная база для проектов, ролей, задач, статусов, событий и конфигураций платформы.

Иконка TXT-файла
Redis Queue

Очереди фоновых задач, статусы выполнения, debounce событий, кэширование и быстрые агентные операции.

Иконка TXT-файла
Vector Index

Индексация проектных материалов, документации, отчетов и контекста для ассистента и поиска.

Иконка TXT-файла
Local Models

Контур локальных моделей для приватных сценариев, инженерных данных и корпоративных ограничений.

Иконка TXT-файла
Model Routing

Маршрутизация задач между облачными и локальными моделями по типу запроса, правам и стоимости.

Иконка TXT-файла
Agent Runtime

Запуск ассистентов, выполнение действий, контроль инструментов, журналирование и передача результата в Ops.

Иконка TXT-файла
Observability

Метрики, логи, трассировка, health checks, алерты и диагностика сервисов платформы.

Иконка TXT-файла
Backups

Резервные копии данных, конфигураций, файлов, моделей, журналов и сценариев восстановления.

Иконка TXT-файла
CI CD

Сборка, проверки, preview-окружения, controlled rollout, rollback и публикация клиентских модулей.

Иконка TXT-файла
Terraform

Описание инфраструктуры кодом: окружения, сети, хранилища, политики, сервисы и переменные.

Иконка TXT-файла
Object Storage

Хранилище файлов, изображений, моделей, отчетов, txt-материалов и артефактов рабочих процессов.

Иконка TXT-файла
BIM Pipeline

Загрузка BIM-моделей, версии, разметка, связи с задачами и публикация в рабочие пространства.

Иконка TXT-файла
STEP Import

Импорт STEP-моделей, технические материалы, карточки проверки и привязка к инженерным задачам.

Иконка TXT-файла
STL Review

Проверка STL-геометрии, заметки, версии, визуальный контроль и подготовка производственных материалов.

Иконка TXT-файла
3DGS Assets

Gaussian Splatting сцены, визуальные реконструкции объектов и связь с проектным контекстом.

Иконка TXT-файла
LAS LAZ Clouds

Облака точек, съемка, координатные данные, версии и инженерная привязка к задачам.

Иконка TXT-файла
Webhooks

Событийные сценарии: входящие запросы, уведомления, автоматические действия и передача статусов.

Иконка TXT-файла
Docs Portal

Документация, регламенты, инструкции, технические заметки и материалы для команд внедрения.

Иконка TXT-файла
Stack Map

Карта платформенного стека: Hub, Engine, Ops, агенты, данные, интеграции, безопасность и инфраструктура.

Иконка TXT-файла
Hub Access
.txt
Иконка TXT-файла
Engine Workflows
.txt
Иконка TXT-файла
Ops Cards
.txt
Иконка TXT-файла
1C Assistant
.txt
Иконка TXT-файла
Tender Agent
.txt
Иконка TXT-файла
Digital Twin
.txt
Иконка TXT-файла
Model Viewer
.txt
Иконка TXT-файла
Engineering Core
.txt
Иконка TXT-файла
MCP Gateway
.txt
Иконка TXT-файла
API Contracts
.txt
Иконка TXT-файла
Kubernetes
.txt
Иконка TXT-файла
Cloudflare Edge
.txt
Иконка TXT-файла
Zero Trust
.txt
Иконка TXT-файла
Security Matrix
.txt
Иконка TXT-файла
RBAC Policies
.txt
Иконка TXT-файла
Audit Log
.txt
Иконка TXT-файла
Secrets Vault
.txt
Иконка TXT-файла
Postgres Cluster
.txt
Иконка TXT-файла
Redis Queue
.txt
Иконка TXT-файла
Vector Index
.txt
Иконка TXT-файла
Local Models
.txt
Иконка TXT-файла
Model Routing
.txt
Иконка TXT-файла
Agent Runtime
.txt
Иконка TXT-файла
Observability
.txt
Иконка TXT-файла
Backups
.txt
Иконка TXT-файла
CI CD
.txt
Иконка TXT-файла
Terraform
.txt
Иконка TXT-файла
Object Storage
.txt
Иконка TXT-файла
BIM Pipeline
.txt
Иконка TXT-файла
STEP Import
.txt
Иконка TXT-файла
STL Review
.txt
Иконка TXT-файла
3DGS Assets
.txt
Иконка TXT-файла
LAS LAZ Clouds
.txt
Иконка TXT-файла
Webhooks
.txt
Иконка TXT-файла
Docs Portal
.txt
Иконка TXT-файла
Stack Map
.txt
РАНЕЕ — МАЙ 2026
Engineering Core выделен в отдельный модуль
Единый контур инженерных моделей, версий, согласований и рабочих материалов.
РАНЕЕ ИЮНЬ 2026
Knowledge Graph добавлен в состав экосистемы
Связи между задачами, агентами, кодовой базой, документами и инженерными сущностями собраны в общем графе.
СЕЙЧАС
Открыт alpha-доступ к Procurement Intelligence
Агентный контур для закупок, сопоставления условий и контроля поставок.
ДАЛЕЕ СЕНТЯБРЬ 2026
Field Ops включён в план релиза
Мобильный операционный модуль для выездных команд, инспекций, фотофиксации и полевых отчётов.
+Закрытый инвайт для пилотных внедрений.
Запросить инвайт
Тарифы

Платформа NODE.DC для процессов, данных и агентов.

Подписки на приложение с
включённым объёмом в каждом тарифе.
Подключение локальных моделей и личных ассистентов
SELFHOST в контуре предприятий / внутри инфраструктуры NODE.DC / открытый контур при подключении моделей по API
+
Логотип NODE.DC
Selfhost платформа

Запросить DEMO

NODE.DC - платформа для задач, процессов, данных, агентов и инженерных модулей.

Заявка принята. Спасибо.

Мы скоро свяжемся.

Подать заявку?

Или оформить ранний Founder-доступ

Оформить Founder-доступ 350€
До 200 мест

Не получилось

Что-то пошло не так.
Попробуйте ещё раз чуть позже.

DCTOUCH
© NODE.DC, 2026
Иконка TXT-файла
Hub Access

Единая точка входа: каталог приложений, рабочие пространства, роли, группы и права доступа.

Иконка TXT-файла
Engine Workflows

Нодовые workflow, обработчики данных, интеграционная логика и сборка прикладных контуров.

Иконка TXT-файла
Ops Cards

Операционные карточки, статусы, согласования, отчеты агентов и результаты выполнения задач.

Иконка TXT-файла
1C Assistant

Связка с 1C, разбор документов, поиск данных, сценарии согласований и передача результата в Ops.

Иконка TXT-файла
Tender Agent

Тендерные подборки, проверка требований, документы, дедлайны и агентные отчеты по процедурам.

Иконка TXT-файла
Digital Twin

Цифровые модели объектов, версии, проектный контекст, инженерные данные и связанные рабочие процессы.

Иконка TXT-файла
Model Viewer

Просмотр BIM, STEP, STL, 3DGS, облаков точек и инженерных материалов внутри единого контура.

Иконка TXT-файла
Engineering Core

Обработка технических форматов, связка моделей с задачами, версиями, отчетами и согласованиями.

Иконка TXT-файла
MCP Gateway

Контекстный шлюз для агентов: проектные данные, инструменты, кодовая база и внешние сервисы.

Иконка TXT-файла
API Contracts

Контракты API, схемы данных, webhooks, события, интеграции и контроль совместимости между модулями.

Иконка TXT-файла
Kubernetes

Оркестрация сервисов, изоляция окружений, scaling policies, probes, secrets и управляемый rollout.

Иконка TXT-файла
Cloudflare Edge

CDN, WAF, R2-хранилище, edge routing, cache policies и защита публичного периметра.

Иконка TXT-файла
Zero Trust

Доступ по принципу least privilege: SSO, MFA, device posture, audit trail и сегментация контуров.

Иконка TXT-файла
Security Matrix

Ролевая матрица, группы, политики доступа, ограничения функций и контроль административных действий.

Иконка TXT-файла
RBAC Policies

Права на приложения, рабочие области, действия агентов, документы, отчеты и инженерные данные.

Иконка TXT-файла
Audit Log

Журнал действий пользователей, агентов и сервисов: изменения, статусы, запросы, публикации и доступы.

Иконка TXT-файла
Secrets Vault

Хранение токенов, ключей API, webhook-секретов и конфигураций интеграций в защищенном контуре.

Иконка TXT-файла
Postgres Cluster

Основная транзакционная база для проектов, ролей, задач, статусов, событий и конфигураций платформы.

Иконка TXT-файла
Redis Queue

Очереди фоновых задач, статусы выполнения, debounce событий, кэширование и быстрые агентные операции.

Иконка TXT-файла
Vector Index

Индексация проектных материалов, документации, отчетов и контекста для ассистента и поиска.

Иконка TXT-файла
Local Models

Контур локальных моделей для приватных сценариев, инженерных данных и корпоративных ограничений.

Иконка TXT-файла
Model Routing

Маршрутизация задач между облачными и локальными моделями по типу запроса, правам и стоимости.

Иконка TXT-файла
Agent Runtime

Запуск ассистентов, выполнение действий, контроль инструментов, журналирование и передача результата в Ops.

Иконка TXT-файла
Observability

Метрики, логи, трассировка, health checks, алерты и диагностика сервисов платформы.

Иконка TXT-файла
Backups

Резервные копии данных, конфигураций, файлов, моделей, журналов и сценариев восстановления.

Иконка TXT-файла
CI CD

Сборка, проверки, preview-окружения, controlled rollout, rollback и публикация клиентских модулей.

Иконка TXT-файла
Terraform

Описание инфраструктуры кодом: окружения, сети, хранилища, политики, сервисы и переменные.

Иконка TXT-файла
Object Storage

Хранилище файлов, изображений, моделей, отчетов, txt-материалов и артефактов рабочих процессов.

Иконка TXT-файла
BIM Pipeline

Загрузка BIM-моделей, версии, разметка, связи с задачами и публикация в рабочие пространства.

Иконка TXT-файла
STEP Import

Импорт STEP-моделей, технические материалы, карточки проверки и привязка к инженерным задачам.

Иконка TXT-файла
STL Review

Проверка STL-геометрии, заметки, версии, визуальный контроль и подготовка производственных материалов.

Иконка TXT-файла
3DGS Assets

Gaussian Splatting сцены, визуальные реконструкции объектов и связь с проектным контекстом.

Иконка TXT-файла
LAS LAZ Clouds

Облака точек, съемка, координатные данные, версии и инженерная привязка к задачам.

Иконка TXT-файла
Webhooks

Событийные сценарии: входящие запросы, уведомления, автоматические действия и передача статусов.

Иконка TXT-файла
Docs Portal

Документация, регламенты, инструкции, технические заметки и материалы для команд внедрения.

Иконка TXT-файла
Stack Map

Карта платформенного стека: Hub, Engine, Ops, агенты, данные, интеграции, безопасность и инфраструктура.

Иконка TXT-файла
Hub Access
.txt
Иконка TXT-файла
Engine Workflows
.txt
Иконка TXT-файла
Ops Cards
.txt
Иконка TXT-файла
1C Assistant
.txt
Иконка TXT-файла
Tender Agent
.txt
Иконка TXT-файла
Digital Twin
.txt
Иконка TXT-файла
Model Viewer
.txt
Иконка TXT-файла
Engineering Core
.txt
Иконка TXT-файла
MCP Gateway
.txt
Иконка TXT-файла
API Contracts
.txt
Иконка TXT-файла
Kubernetes
.txt
Иконка TXT-файла
Cloudflare Edge
.txt
Иконка TXT-файла
Zero Trust
.txt
Иконка TXT-файла
Security Matrix
.txt
Иконка TXT-файла
RBAC Policies
.txt
Иконка TXT-файла
Audit Log
.txt
Иконка TXT-файла
Secrets Vault
.txt
Иконка TXT-файла
Postgres Cluster
.txt
Иконка TXT-файла
Redis Queue
.txt
Иконка TXT-файла
Vector Index
.txt
Иконка TXT-файла
Local Models
.txt
Иконка TXT-файла
Model Routing
.txt
Иконка TXT-файла
Agent Runtime
.txt
Иконка TXT-файла
Observability
.txt
Иконка TXT-файла
Backups
.txt
Иконка TXT-файла
CI CD
.txt
Иконка TXT-файла
Terraform
.txt
Иконка TXT-файла
Object Storage
.txt
Иконка TXT-файла
BIM Pipeline
.txt
Иконка TXT-файла
STEP Import
.txt
Иконка TXT-файла
STL Review
.txt
Иконка TXT-файла
3DGS Assets
.txt
Иконка TXT-файла
LAS LAZ Clouds
.txt
Иконка TXT-файла
Webhooks
.txt
Иконка TXT-файла
Docs Portal
.txt
Иконка TXT-файла
Stack Map
.txt
РАНЕЕ — МАЙ 2026
Engineering Core выделен в отдельный модуль
Единый контур инженерных моделей, версий, согласований и рабочих материалов.
РАНЕЕ ИЮНЬ 2026
Knowledge Graph добавлен в состав экосистемы
Связи между задачами, агентами, кодовой базой, документами и инженерными сущностями собраны в общем графе.
СЕЙЧАС
Открыт alpha-доступ к Procurement Intelligence
Агентный контур для закупок, сопоставления условий и контроля поставок.
ДАЛЕЕ СЕНТЯБРЬ 2026
Field Ops включён в план релиза
Мобильный операционный модуль для выездных команд, инспекций, фотофиксации и полевых отчётов.
diff --git a/knowledge/agent-context/index.html b/knowledge/agent-context/index.html new file mode 100644 index 0000000..80426b4 --- /dev/null +++ b/knowledge/agent-context/index.html @@ -0,0 +1,281 @@ + + + + + + Агентный контур | NODE.DC Knowledge + + + + + + + + + + + + + + + + + + + + + + + К содержанию +
+
+
+ +
+ + + + +
+
+ + + +
+
+
+ +
+
+ +
+
+
+
+

Агентный контур

+
+

Агентный контур NODE.DC - рабочая среда для сборки, запуска и контроля цифровых агентов внутри единой операционной платформы. Здесь агентная автоматизация не является набором отдельных скриптов: она встроена в процессы, роли, данные и задачи компании.

+

Что передаётся агентам

Раздел «Что передаётся агентам»
+

Агентам можно отдавать повторяющиеся и трудоёмкие операции: поиск, отбор, классификацию, разбор документов, подготовку отчётов, сверку данных и запуск следующих шагов. Человек остаётся владельцем решения, а агент снимает рутину и ускоряет подготовку материалов.

+ +

Агент работает только в доступном ему контексте. Он видит задачи, документы, модели, сервисы и историю действий в рамках настроенных прав. Это важно для enterprise-сценариев, где один и тот же процесс может касаться разных подразделений и уровней доступа.

+

Передача результата

Раздел «Передача результата»
+
  • результат может стать подзадачей в Ops;
  • может уйти в юридический, закупочный или инженерный модуль;
  • может запустить согласование или проверку;
  • может лечь в отчёт, карточку объекта или рабочий дашборд.
+

Почему это инфраструктура

Раздел «Почему это инфраструктура»
+

Главная ценность агентного слоя в том, что он поднимает автоматизацию с уровня отдельного инструмента до уровня рабочей инфраструктуры. События, причины, решения и действия остаются в одном контуре и могут быть проверены позже.

+
+
+
+
+
+
+
+
+
+ + + + + diff --git a/knowledge/index.html b/knowledge/index.html new file mode 100644 index 0000000..d48f5ba --- /dev/null +++ b/knowledge/index.html @@ -0,0 +1,276 @@ + + + + + + Knowledge + + + + + + + + + + + + + + + + + + + + + + + К содержанию +
+
+
+ +
+ + + + +
+
+ + + +
+
+
+ +
+
+ +
+
+
+
+

Knowledge

+

Knowledge - библиотека материалов NODE.DC о платформе, агентных контурах, интеграциях и прикладных модулях. Здесь собраны не инструкции ради инструкций, а объяснения: как устроены слои системы, где появляются данные, как они попадают в задачи и какие сценарии можно собирать поверх общей инфраструктуры.

+ +

Раздел помогает быстро разобраться в NODE.DC как в единой операционной платформе: от Hub, Engine и Ops до тендерного агента, интеграции с 1С, цифровых двойников, беспилотников и SEO-модуля.

+ +

Материалы можно читать как обзор архитектуры. 

+

Перейти к модулям на лендинге

  • NODE.DC — Обзор платформы NODE.DC: данные, процессы, агенты, Hub, Engine, Ops и прикладные контуры предприятия.
  • Hub — NODE.DC Hub: единая точка входа, каталог приложений, роли, группы, доступы и рабочие пространства.
  • Engine — NODE.DC Engine: нодовый слой для сборки процессов, интеграций, интерфейсов и агентных сценариев.
  • Ops — NODE.DC Ops: операционный слой для задач, статусов, отчётов, инженерных данных и результатов агентов.
  • Агентный контур — Как в NODE.DC устроена агентная автоматизация: контекст, права, задачи, данные и передача результатов между модулями.
  • Прикладные модули — Прикладные модули NODE.DC: отраслевые и корпоративные контуры поверх общей платформенной инфраструктуры.
  • Тендерный агент — Как тендерный агент NODE.DC помогает искать закупки, анализировать требования, риски, документы и передавать задачи в смежные контуры.
  • Интеграция с 1С — Как NODE.DC связывает 1С с задачами, агентами, закупками, документами, складами и операционными процессами.
  • Управление беспилотниками — Цифровой контур NODE.DC для беспилотных систем: телеметрия, IoT-состояния, видеопотоки, события и операторский интерфейс.
  • Цифровые двойники городов — Как NODE.DC может выступать точкой входа в городской цифровой двойник: 3DGS, карта, BIM, облака точек и единый контекст.
  • Промышленный контур — Цифровой двойник промышленного предприятия в NODE.DC: состояния цехов, оборудование, облака точек, BIM и эксплуатационные данные.
  • Управление предприятием — Ситуационный и мониторинговый режим NODE.DC для управленческого контура предприятия.
+
+
+
+
+
+
+
+
+ + + + + diff --git a/knowledge/modules/1c-integration/index.html b/knowledge/modules/1c-integration/index.html new file mode 100644 index 0000000..cdbf7b6 --- /dev/null +++ b/knowledge/modules/1c-integration/index.html @@ -0,0 +1,281 @@ + + + + + + Интеграция с 1С | NODE.DC Knowledge + + + + + + + + + + + + + + + + + + + + + + + К содержанию +
+
+
+ +
+ + + + +
+
+ + + +
+
+
+ +
+
+ +
+
+
+
+

Интеграция с 1С

+
+

Интеграция с 1С связывает учётный контур предприятия с задачами, агентами и рабочими модулями NODE.DC. 1С остаётся источником фактов, а NODE.DC добавляет операционный, аналитический и агентный слой поверх этих данных.

+

Какие данные подключаются

Раздел «Какие данные подключаются»
+
  • справочники, контрагенты, номенклатура и статусы;
  • документы, счета, акты, заявки и закупочные позиции;
  • остатки, движение товаров, складские события и производственные данные;
  • связанные задачи, согласования и внутренние комментарии.
+ +

Команда может использовать данные из 1С для сверки тендерных требований, контроля закупок, подготовки отчётов, запуска согласований, проверки остатков, анализа поставщиков и передачи результата в Ops.

+ +

1С агент помогает не просто показать данные, а ответить на рабочий вопрос: найти документ, объяснить статус, собрать выборку, подготовить задачу или подсказать следующий шаг. При этом действия выполняются в рамках прав доступа и фиксируются в операционном контуре.

+ +

Без интеграции учётная система часто остаётся отдельным окном. NODE.DC связывает её с процессами: данные становятся частью задач, отчётов, агентов и модулей, а не отдельной ручной проверкой.

+
+
+
+
+
+
+
+
+
+ + + + + diff --git a/knowledge/modules/city-digital-twins/index.html b/knowledge/modules/city-digital-twins/index.html new file mode 100644 index 0000000..03a038e --- /dev/null +++ b/knowledge/modules/city-digital-twins/index.html @@ -0,0 +1,284 @@ + + + + + + Цифровые двойники городов | NODE.DC Knowledge + + + + + + + + + + + + + + + + + + + + + + + К содержанию +
+
+
+ +
+ + + + +
+
+ + + +
+
+
+ +
+
+ +
+
+
+
+

Цифровые двойники городов

+
+

NODE.DC может работать как вход в цифровой двойник города или крупной территории. Пользователь получает единое пространственное окружение, где обзор, аналитика и инженерный разбор связаны геопривязкой, API и общим контекстом.

+ + +

3DGS-сцены дают быстрый вход внутрь локации: прогулку от третьего лица, совместное присутствие, наблюдение других участников и естественное понимание пространства.

+ +

Карта местности становится навигацией и агрегатором слоёв: транспорт, экология, инфраструктура, распределённые объекты, статусы и события.

+ +

BIM-модели, облака точек и технические материалы позволяют перейти к детальному анализу объекта, конструкции, помещений и инженерных систем.

+

Единый маршрут пользователя

Раздел «Единый маршрут пользователя»
+

Человек может начать с общего обзора, перейти к городской аналитике, затем открыть конкретный объект и посмотреть его инженерную структуру без разрыва пространственной логики.

+ +

Любое наблюдение, отклонение или задача из цифрового двойника может быть связано с карточкой в Ops, ответственным исполнителем, сроком, материалами и историей действий.

+
+
+
+
+
+
+
+
+
+ + + + + diff --git a/knowledge/modules/construction-contour/index.html b/knowledge/modules/construction-contour/index.html new file mode 100644 index 0000000..6d7ea38 --- /dev/null +++ b/knowledge/modules/construction-contour/index.html @@ -0,0 +1,281 @@ + + + + + + Строительный контур | NODE.DC Knowledge + + + + + + + + + + + + + + + + + + + + + + + К содержанию +
+
+
+ +
+ + + + +
+
+ + + +
+
+
+ +
+
+ +
+
+
+
+

Строительный контур

+
+

Строительный контур NODE.DC связывает проектные данные, площадку, подрядчиков, BIM-модели, полевые отчёты, дефекты, сроки и согласования в одной рабочей системе.

+ +
  • BIM-модели, чертежи, облака точек и фотофиксация;
  • задачи, замечания, дефекты и исполнительная документация;
  • подрядчики, ответственные, сроки и этапы работ;
  • полевые отчёты и мобильные сценарии инспекций;
  • связь с закупками, складами и финансовыми контурами.
+

Переход от модели к действию

Раздел «Переход от модели к действию»
+

Инженерная модель становится не отдельным файлом, а источником рабочих действий. Элемент модели можно связать с задачей, актом, замечанием, фотографией, сроком или ответственным исполнителем.

+

Контроль изменений

Раздел «Контроль изменений»
+

Для стройки важна история: что было запланировано, что изменилось, кто согласовал, какие материалы приложены и почему задача перешла в новый статус. Ops сохраняет эту цепочку в операционном контуре.

+

Агентное сопровождение

Раздел «Агентное сопровождение»
+

Агенты могут готовить сводки по дефектам, искать просрочки, сравнивать отчёты, собирать материалы к совещанию и подсвечивать зоны риска.

+
+
+
+
+
+
+
+
+
+ + + + + diff --git a/knowledge/modules/drone-management/index.html b/knowledge/modules/drone-management/index.html new file mode 100644 index 0000000..9e2c082 --- /dev/null +++ b/knowledge/modules/drone-management/index.html @@ -0,0 +1,281 @@ + + + + + + Управление беспилотниками | NODE.DC Knowledge + + + + + + + + + + + + + + + + + + + + + + + К содержанию +
+
+
+ +
+ + + + +
+
+ + + +
+
+
+ +
+
+ +
+
+
+
+

Управление беспилотниками

+
+

В NODE.DC может быть реализован интеграционный слой для работы с беспилотными решениями. Платформа становится цифровым контуром вокруг системы управления: собирает телеметрию, анализирует состояние IoT-компонентов, обрабатывает события и помогает оператору принимать решения.

+

Что контролирует платформа

Раздел «Что контролирует платформа»
+
  • состояние узлов, датчиков и исполнительных компонентов;
  • параметры движения, маршруты и эксплуатационные ограничения;
  • историю событий, уведомления и отклонения;
  • видеопотоки, классификацию объектов и признаки нештатных ситуаций.
+ +

Отдельное направление - анализ видеопотоков, оценка окружения, выявление препятствий, контроль состояния маршрута и подготовка кратких сводок для оператора.

+

Опыт и переносимость

Раздел «Опыт и переносимость»
+

Подход применим к разным автономным комплексам: курьерским решениям, гусеничным наземным платформам, распределённой технике и мониторинговым сценариям. В каждом случае NODE.DC отвечает за данные, события, наблюдаемость, интерфейс и агентное сопровождение.

+ +

Оператор видит не набор сырых сигналов, а понятную картину: что произошло, насколько это критично, какие действия доступны и какие данные уже собраны системой.

+
+
+
+
+
+
+
+
+
+ + + + + diff --git a/knowledge/modules/enterprise-management/index.html b/knowledge/modules/enterprise-management/index.html new file mode 100644 index 0000000..5289b8a --- /dev/null +++ b/knowledge/modules/enterprise-management/index.html @@ -0,0 +1,281 @@ + + + + + + Управление предприятием | NODE.DC Knowledge + + + + + + + + + + + + + + + + + + + + + + + К содержанию +
+
+
+ +
+ + + + +
+
+ + + +
+
+
+ +
+
+ +
+
+
+
+

Управление предприятием

+
+

Управленческий контур NODE.DC собирает в одном рабочем пространстве финансовые показатели, производственные статусы, распределённые объекты, логистику, поставщиков, отклонения и выводы агентных систем.

+

Единое экранное пространство

Раздел «Единое экранное пространство»
+

Вместо разрозненных отчётов формируется живая картина предприятия. Каждый блок интерфейса связан с конкретным объектом, процессом, узлом данных или рабочим полем.

+

Что можно выводить

Раздел «Что можно выводить»
+
  • финансовые и операционные показатели;
  • производственные статусы и риски;
  • состояние объектов, складов, техники и инфраструктуры;
  • логистику, поставщиков и закупочный поток;
  • аналитические сводки агентов и рекомендации по действиям.
+

Не витрина, а рабочая проекция

Раздел «Не витрина, а рабочая проекция»
+

Ценность режима в том, что он связан с действующей архитектурой процессов. Из показателя можно перейти в задачу, из задачи - в материалы, из материалов - в ответственного, а из отклонения - в сценарий реакции.

+ +

Руководитель видит не только итоговый отчёт, но и причинно-следственную цепочку: от источника события до текущего статуса и следующего действия.

+
+
+
+
+
+
+
+
+
+ + + + + diff --git a/knowledge/modules/index.html b/knowledge/modules/index.html new file mode 100644 index 0000000..9a9d991 --- /dev/null +++ b/knowledge/modules/index.html @@ -0,0 +1,280 @@ + + + + + + Прикладные модули | NODE.DC Knowledge + + + + + + + + + + + + + + + + + + + + + + + К содержанию +
+
+
+ +
+ + + + +
+
+ + + +
+
+
+ +
+
+ +
+
+
+
+

Прикладные модули

+
+

Прикладные модули NODE.DC закрывают конкретные функции предприятия: закупки, тендеры, 1С, производство, строительство, цифровые двойники, беспилотники, SEO и внутренние инструменты разработки.

+

Задача прикладного слоя

Раздел «Задача прикладного слоя»
+

Смысл модулей - адаптировать платформу под специфику компании. В одном контуре можно связать учётные системы, роли, задачи, файлы, инженерные данные, агентов, отчёты и интерфейсы без разрыва между приложениями.

+

Что можно добавить

Раздел «Что можно добавить»
+
  • модуль под отдельный отдел или процесс;
  • интеграцию с внешней системой, API, 1С, CRM или ERP;
  • операционный дашборд и рабочий интерфейс;
  • агента для поиска, анализа, сверки или подготовки материалов;
  • инструмент разработки и администрирования для внутренней команды.
+ +

Модуль не живёт отдельно. Он подключается к ролям, данным, задачам и сквозному ассистенту NODE.DC. Поэтому результат работы тендерного агента может попасть в Ops, данные из 1С могут участвовать в закупочной проверке, а инженерная модель может быть связана с задачей, отчётом и согласованием.

+

Смотреть прикладные модули

+
+
+
+
+
+
+
+
+
+ + + + + diff --git a/knowledge/modules/industrial-contour/index.html b/knowledge/modules/industrial-contour/index.html new file mode 100644 index 0000000..233315d --- /dev/null +++ b/knowledge/modules/industrial-contour/index.html @@ -0,0 +1,281 @@ + + + + + + Промышленный контур | NODE.DC Knowledge + + + + + + + + + + + + + + + + + + + + + + + К содержанию +
+
+
+ +
+ + + + +
+
+ + + +
+
+
+ +
+
+ +
+
+
+
+

Промышленный контур

+
+

Промышленный контур NODE.DC помогает хранить и сопоставлять состояния производственных помещений, оборудования и инженерной инфраструктуры во времени. Это не только визуализация, а рабочий инструмент поддержки решений.

+

Цифровой архив состояний

Раздел «Цифровой архив состояний»
+

Регулярная фиксация состояния предприятия позволяет сравнивать цеха, оборудование и инженерные зоны за разные периоды. На этой базе можно выявлять деформации, износ, перегрузки и отклонения.

+ +
  • BIM-данные, облака точек и фотореалистичные слои;
  • паспорта помещений, цехов и оборудования;
  • связь с ERP/1С, складами и производственными статусами;
  • карта-навигация для сотрудников и подрядчиков;
  • история изменений и материалы модернизации.
+

Оптимизация процессов

Раздел «Оптимизация процессов»
+

Когда пространственные данные связаны с производственными узлами, легче находить причины износа, перегрузок и простоев. Решение принимается не по отдельной фотографии или таблице, а по контексту объекта.

+

Планирование модернизаций

Раздел «Планирование модернизаций»
+

Цифровой двойник фиксирует промежуточные состояния предприятия как живую историю объекта. Это снижает риск ошибок при проектировании, ремонте, реконструкции и внедрении нового оборудования.

+
+
+
+
+
+
+
+
+
+ + + + + diff --git a/knowledge/modules/seo-module/index.html b/knowledge/modules/seo-module/index.html new file mode 100644 index 0000000..3051c55 --- /dev/null +++ b/knowledge/modules/seo-module/index.html @@ -0,0 +1,281 @@ + + + + + + SEO модуль | NODE.DC Knowledge + + + + + + + + + + + + + + + + + + + + + + + К содержанию +
+
+
+ +
+ + + + +
+
+ + + +
+
+
+ +
+
+ +
+
+
+
+

SEO модуль

+
+

SEO модуль NODE.DC строится как локальный редакторский контур для работы с существующими сайтами. Его задача - не автоматически публиковать тексты и не забивать страницу ключами, а дать управляемый процесс для редактора, дизайнера и SEO-специалиста.

+ +
  1. проект сканируется как папка сайта или рабочий источник;
  2. собирается индекс страниц, секций, медиа и технических файлов;
  3. выполняется baseline audit по структуре, заголовкам, описаниям, видимым текстам и медиа;
  4. из текста извлекаются смыслы, seed-запросы и потенциальные интенты;
  5. через Wordstat собираются реальные запросы и частотность;
  6. формируется карта ключей по секциям;
  7. редактор утверждает правки, проверяет переспам и применяет изменения через changeset.
+ +
  • title, description, h1/h2 и порядок заголовков;
  • видимый текст, секции и смысловые дубли;
  • изображения, видео, posters, alt, title, aria-label и контекст вокруг медиа;
  • риски переспама, конкурирующие смыслы, тон и ограничения по длине.
+

Почему не автопостинг

Раздел «Почему не автопостинг»
+

Модуль работает с рабочей копией текста. Исходный сайт не меняется до ручного Apply. Перед применением пользователь видит план, варианты правок, проверки качества и итоговый changeset.

+ +

Этот раздел Knowledge сам является хорошим кандидатом для SEO-модуля: каждая статья имеет отдельный URL, понятный заголовок, описание, структуру H2/H3 и может проходить через тот же редакторский контур.

+
+
+
+
+
+
+
+
+
+ + + + + diff --git a/knowledge/modules/tender-agent/index.html b/knowledge/modules/tender-agent/index.html new file mode 100644 index 0000000..eda8deb --- /dev/null +++ b/knowledge/modules/tender-agent/index.html @@ -0,0 +1,282 @@ + + + + + + Тендерный агент | NODE.DC Knowledge + + + + + + + + + + + + + + + + + + + + + + + К содержанию +
+
+
+ +
+ + + + +
+
+ + + +
+
+
+ +
+
+ +
+
+
+
+

Тендерный агент

+
+

Тендерный агент NODE.DC закрывает рабочий контур тендерного отдела. В одном интерфейсе объединяются поиск и агрегация закупок, первичный отбор, AI-анализ конкретных тендеров и передача материалов в смежные модули.

+ +
  • собирает и нормализует закупочный поток с тендерных площадок;
  • выделяет требования, ограничения, сроки, финансовые параметры и рисковые зоны;
  • сопоставляет условия закупки с внутренними данными компании;
  • готовит выжимки, чек-листы и материалы для ответственных специалистов;
  • передаёт задачи в юридический, закупочный или операционный контур.
+

Поведенческий поиск

Раздел «Поведенческий поиск»
+

Система учитывает действия специалиста: какие закупки он открывает, какие отклоняет, по каким признакам принимает решение. На этой базе формируются устойчивые паттерны отбора, а релевантные тендеры находятся точнее.

+ +

Специалист тендерного отдела остаётся оператором решения. Агент сокращает ручной перебор, готовит анализ и подсвечивает риски, но финальное решение, подача и коммуникация остаются под контролем команды.

+

Связь с платформой

Раздел «Связь с платформой»
+

Материалы тендера могут стать задачами в Ops, данными для юридического анализа, входом для 1С-интеграции или основанием для закупочной цепочки.

+

Посмотреть демо на лендинге

+
+
+
+
+
+
+
+
+
+ + + + + diff --git a/knowledge/platform/engine/index.html b/knowledge/platform/engine/index.html new file mode 100644 index 0000000..c625156 --- /dev/null +++ b/knowledge/platform/engine/index.html @@ -0,0 +1,279 @@ + + + + + + Engine | NODE.DC Knowledge + + + + + + + + + + + + + + + + + + + + + + + К содержанию +
+
+
+ +
+ + + + +
+
+ + + +
+
+
+ +
+
+ +
+
+
+
+

Engine

+

NODE.DC Engine - рабочий слой для проектирования и запуска процессов внутри платформы. Здесь создаются интеграции сервисов, обработчики данных, диспетчерские панели, сценарии роботизации и внутренние автоматизации для бизнеса.

+ +

Процессы собираются в узловом редакторе. Узлы описывают источники данных, преобразования, действия, визуализацию, проверки, внешние API и пользовательские интерфейсы. Такой подход позволяет быстро добавлять новые сценарии без переписывания всей системы.

+ +

Сценарий можно собрать вручную или с помощью агента: пользователь описывает задачу, а агент предлагает архитектуру решения, добавляет необходимые узлы и готовит схему для подключения к интерфейсу.

+

Что можно собирать

Раздел «Что можно собирать»
+
  • интеграции с 1С, CRM, ERP, API и webhooks;
  • операционные панели и диспетчерские интерфейсы;
  • потоки обработки документов, телеметрии и событий;
  • агентные цепочки для анализа, отбора, классификации и маршрутизации задач.
+ +

Результат работы Engine не остаётся схемой в редакторе. Он передаётся в операционный слой: создаёт задачи, обновляет статусы, прикладывает отчёты, запускает согласования или отдаёт данные в другой модуль.

Посмотреть демо


+
+
+
+
+
+
+
+
+ + + + + diff --git a/knowledge/platform/hub/index.html b/knowledge/platform/hub/index.html new file mode 100644 index 0000000..bad1757 --- /dev/null +++ b/knowledge/platform/hub/index.html @@ -0,0 +1,277 @@ + + + + + + Hub | NODE.DC Knowledge + + + + + + + + + + + + + + + + + + + + + + + К содержанию +
+
+
+ +
+ + + + +
+
+ + + +
+
+
+ +
+
+ +
+
+
+
+

Hub

+

NODE.DC Hub - единая точка доступа к среде NODE.DC. Он показывает пользователю доступные приложения, рабочие пространства и сервисы платформы с учётом роли, группы и настроек конкретного контура.

+ +
  • собирает каталог приложений и микромодулей в одном интерфейсе;
  • управляет ролями, группами, отделами и правами доступа;
  • разделяет рабочие контуры для инженерных, финансовых, юридических, закупочных и производственных команд;
  • даёт администраторам понятную точку настройки платформы.
+ +

В корпоративном контуре администратор может назначать типовые конфигурации доступа для подразделений и отдельно расширять права конкретным пользователям. За счёт этого платформа не превращается в общий склад кнопок: каждый видит только те инструменты, которые относятся к его работе.

+

Связь с другими слоями

Раздел «Связь с другими слоями»
+

Из Hub пользователь переходит в Engine, Ops и прикладные приложения. Все переходы сохраняют контекст прав доступа, поэтому один и тот же модуль может выглядеть по-разному для руководителя проекта, инженера, закупщика или внешнего подрядчика.

Посмотреть демо

+
+
+
+
+
+
+
+
+ + + + + diff --git a/knowledge/platform/index.html b/knowledge/platform/index.html new file mode 100644 index 0000000..0888046 --- /dev/null +++ b/knowledge/platform/index.html @@ -0,0 +1,282 @@ + + + + + + NODE.DC | NODE.DC Knowledge + + + + + + + + + + + + + + + + + + + + + + + К содержанию +
+
+
+ +
+ + + + +
+
+ + + +
+
+
+ +
+
+ +
+
+
+
+

NODE.DC

+
+

NODE.DC - операционная платформа, которая связывает распределённые объекты, данные и действия в едином контуре управления. Она подключает физические источники, цифровые сервисы, бизнес-системы и прикладные модули, превращая разрозненные сигналы в воспроизводимые потоки событий.

+ +

В основе NODE.DC лежит модель объектов: сущности, паспорта, связи, состояния, события и допустимые действия. Эта структура даёт общую картину того, что происходит в компании, где это происходит, с чем связано и какие следующие действия доступны.

+ +
  • Hub отвечает за вход, роли, группы, рабочие пространства и каталог приложений.
  • Engine собирает процессы, интеграции, обработчики данных, интерфейсы и агентные сценарии.
  • Ops принимает задачи, статусы, отчёты, согласования и результаты работы модулей.
+

Агентный интеллектуальный слой

Раздел «Агентный интеллектуальный слой»
+

Поверх данных работает AIS - агентный слой платформы. Он анализирует историю и текущее состояние, выявляет отклонения, формирует объяснения, предлагает действия и запускает сценарии строго в рамках прав доступа и контекста.

+ +

NODE.DC полезен там, где важно быстро перейти от наблюдения к действию: в закупках, проектном офисе, инженерных данных, производстве, строительстве, цифровых двойниках, робототехнике и интеграциях с учётными системами.

+

Посмотреть платформу на лендинге

+
+
+
+
+
+
+
+
+
+ + + + + diff --git a/knowledge/platform/ops/index.html b/knowledge/platform/ops/index.html new file mode 100644 index 0000000..bd2c508 --- /dev/null +++ b/knowledge/platform/ops/index.html @@ -0,0 +1,279 @@ + + + + + + Ops | NODE.DC Knowledge + + + + + + + + + + + + + + + + + + + + + + + К содержанию +
+
+
+ +
+ + + + +
+
+ + + +
+
+
+ +
+
+ +
+
+
+
+

Ops

+

NODE.DC Ops - операционный слой платформы. В него сводятся проекты, процессы, задачи, инженерные данные, статусы, отчёты, согласования и результаты работы прикладных контуров.

+

Единая рабочая среда

Раздел «Единая рабочая среда»
+

Ops объединяет людей, агентов и цифровые контуры предприятия. Задачи можно ставить, уточнять, декомпозировать, передавать между подразделениями, контролировать по этапам и связывать с результатами из других слоёв NODE.DC.

+

Ассистент внутри процесса

Раздел «Ассистент внутри процесса»
+

Сквозной ассистент работает не как справочная кнопка, а как интерфейс к рабочему контексту: задачам, проектным материалам, кодовой базе, инженерным данным, отчётам и действиям агентов. При наличии прав он может готовить материалы, создавать подзадачи и инициировать изменения в сервисах.

+

Форматы представления

Раздел «Форматы представления»
+
  • проектные дашборды и карточки задач;
  • календарные планы и таблицы;
  • графики, отчёты и рабочие области;
  • просмотр BIM, STEP, STL, 3DGS, LAS и других инженерных материалов.
+ +

Ops делает работу наблюдаемой: каждое действие, решение и отклонение получает место в общем контуре, а не теряется в чатах, таблицах и разрозненных файлах.

Посмотреть демо

+
+
+
+
+
+
+
+
+ + + + + diff --git a/package.json b/package.json index decbd9e..de573aa 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "scripts": { "extract:home": "node tools/extract-home-blocks.mjs", "render:home": "node tools/render-home.mjs", + "render:knowledge": "node tools/render-knowledge.mjs", "admin": "node tools/admin-server.mjs" } } diff --git a/sitemap.xml b/sitemap.xml index ac85f22..ca82390 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -5,4 +5,79 @@ weekly 1.0 + + https://nodedc.dctouch.ru/knowledge/ + weekly + 0.8 + + + https://nodedc.dctouch.ru/knowledge/platform/ + weekly + 0.7 + + + https://nodedc.dctouch.ru/knowledge/platform/hub/ + weekly + 0.6 + + + https://nodedc.dctouch.ru/knowledge/platform/engine/ + weekly + 0.6 + + + https://nodedc.dctouch.ru/knowledge/platform/ops/ + weekly + 0.6 + + + https://nodedc.dctouch.ru/knowledge/agent-context/ + weekly + 0.7 + + + https://nodedc.dctouch.ru/knowledge/modules/ + weekly + 0.7 + + + https://nodedc.dctouch.ru/knowledge/modules/tender-agent/ + weekly + 0.6 + + + https://nodedc.dctouch.ru/knowledge/modules/1c-integration/ + weekly + 0.6 + + + https://nodedc.dctouch.ru/knowledge/modules/drone-management/ + weekly + 0.6 + + + https://nodedc.dctouch.ru/knowledge/modules/city-digital-twins/ + weekly + 0.6 + + + https://nodedc.dctouch.ru/knowledge/modules/industrial-contour/ + weekly + 0.6 + + + https://nodedc.dctouch.ru/knowledge/modules/enterprise-management/ + weekly + 0.6 + + + https://nodedc.dctouch.ru/knowledge/modules/construction-contour/ + weekly + 0.6 + + + https://nodedc.dctouch.ru/knowledge/modules/seo-module/ + weekly + 0.6 + diff --git a/templates/pages/home/blocks/project-video-first.html b/templates/pages/home/blocks/project-video-first.html index 89220f6..2a3bab7 100644 --- a/templates/pages/home/blocks/project-video-first.html +++ b/templates/pages/home/blocks/project-video-first.html @@ -1 +1 @@ -
{{text:content.windowTitle}}

{{text:content.heading.muted}}{{text:content.heading.main}}

{{html:content.introHtml}}
{{text:content.features.0.eyebrow}}
{{html:content.features.0.bodyHtml}}
{{text:content.features.1.eyebrow}}
{{html:content.features.1.bodyHtml}}
{{text:content.features.2.eyebrow}}
{{html:content.features.2.bodyHtml}}
{{text:content.features.3.eyebrow}}
{{html:content.features.3.bodyHtml}}
+
{{text:content.windowTitle}}

{{text:content.heading.muted}}{{text:content.heading.main}}

{{html:content.introHtml}}
{{text:content.features.0.eyebrow}}
{{html:content.features.0.bodyHtml}}
{{text:content.features.1.eyebrow}}
{{html:content.features.1.bodyHtml}}
{{text:content.features.2.eyebrow}}
{{html:content.features.2.bodyHtml}}
{{text:content.features.3.eyebrow}}
{{html:content.features.3.bodyHtml}}
diff --git a/tools/admin-server.mjs b/tools/admin-server.mjs index d276445..1cddb0e 100644 --- a/tools/admin-server.mjs +++ b/tools/admin-server.mjs @@ -10,6 +10,7 @@ const repoRoot = join(dirname(fileURLToPath(import.meta.url)), ".."); const port = Number(process.env.PORT || 8090); const host = process.env.HOST || "127.0.0.1"; const pagePath = join(repoRoot, "content", "pages", "home.json"); +const knowledgePath = join(repoRoot, "content", "knowledge.json"); const blockTemplatesPath = join(repoRoot, "content", "block-templates", "home.json"); const assetRoot = join(repoRoot, "assets"); const assetTrashRoot = join(assetRoot, ".trash"); @@ -169,6 +170,45 @@ function sendJson(res, status, payload) { send(res, status, `${JSON.stringify(payload, null, 2)}\n`, "application/json; charset=utf-8"); } +function allPageBlocks(page) { + return (page.regions || []).flatMap((region) => region.blocks || []); +} + +function normalizeLandingTarget(value) { + const raw = String(value || "").trim(); + if (!raw || /^javascript:/i.test(raw) || /^(https?:)?\/\//i.test(raw) || /^(mailto:|tel:)/i.test(raw)) return ""; + const hashValue = raw.includes("#") ? raw.slice(raw.indexOf("#") + 1) : raw; + return hashValue + .replace(/^\/+/, "") + .replace(/^index\.html#?/i, "") + .replace(/^#+/, "") + .trim(); +} + +function landingTargetsForPage(page) { + return allPageBlocks(page) + .filter((block) => block.enabled !== false) + .map((block) => ({ + id: block.id, + label: block.adminLabel || block.id, + template: block.template || block.type || "", + target: normalizeLandingTarget(block.anchor), + })) + .filter((item) => item.target); +} + +function validateLandingTargets(page) { + const targets = new Map(); + + for (const item of landingTargetsForPage(page)) { + if (targets.has(item.target)) { + const first = targets.get(item.target); + throw new Error(`Target "${item.target}" уже используется в блоках "${first.label}" и "${item.label}"`); + } + targets.set(item.target, item); + } +} + async function readBodyBuffer(req) { const chunks = []; for await (const chunk of req) { @@ -377,12 +417,15 @@ function collectAssetRefsFromText(text) { } async function buildMediaUsage() { - const [pageSource, indexSource] = await Promise.all([ + const [pageSource, knowledgeSource, indexSource, knowledgeIndexSource] = await Promise.all([ readFile(pagePath, "utf8").catch(() => "{}"), + readFile(knowledgePath, "utf8").catch(() => "{}"), readFile(join(repoRoot, "index.html"), "utf8").catch(() => ""), + readFile(join(repoRoot, "knowledge", "index.html"), "utf8").catch(() => ""), ]); const pageRefs = collectAssetRefsFromValue(JSON.parse(pageSource)); - const renderedRefs = collectAssetRefsFromText(indexSource); + collectAssetRefsFromValue(JSON.parse(knowledgeSource), pageRefs); + const renderedRefs = collectAssetRefsFromText(`${indexSource}\n${knowledgeIndexSource}`); return { pageRefs, renderedRefs }; } @@ -1389,14 +1432,19 @@ function safePublicPath(urlPath) { } async function serveStatic(req, res) { - const filePath = safePublicPath(new URL(req.url, `http://${host}:${port}`).pathname); + let filePath = safePublicPath(new URL(req.url, `http://${host}:${port}`).pathname); if (!filePath) { send(res, 403, "Forbidden"); return; } try { - const fileStat = await stat(filePath); + let fileStat = await stat(filePath); + if (fileStat.isDirectory()) { + filePath = join(filePath, "index.html"); + fileStat = await stat(filePath); + } + if (!fileStat.isFile()) { send(res, 404, "Not found"); return; @@ -1462,6 +1510,18 @@ const server = createServer(async (req, res) => { return; } + if (req.method === "GET" && url.pathname === "/api/knowledge") { + send(res, 200, await readFile(knowledgePath, "utf8"), "application/json; charset=utf-8"); + return; + } + + if (req.method === "GET" && url.pathname === "/api/landing-targets") { + const page = JSON.parse(await readFile(pagePath, "utf8")); + validateLandingTargets(page); + sendJson(res, 200, { ok: true, targets: landingTargetsForPage(page) }); + return; + } + if (req.method === "GET" && url.pathname === "/api/block-templates/home") { send(res, 200, await readFile(blockTemplatesPath, "utf8"), "application/json; charset=utf-8"); return; @@ -1490,17 +1550,32 @@ const server = createServer(async (req, res) => { if (req.method === "PUT" && url.pathname === "/api/page/home") { const body = await readBody(req); const parsed = JSON.parse(body); + validateLandingTargets(parsed); await writeFile(pagePath, `${JSON.stringify(parsed, null, 2)}\n`); sendJson(res, 200, { ok: true }); return; } + if (req.method === "PUT" && url.pathname === "/api/knowledge") { + const body = await readBody(req); + const parsed = JSON.parse(body); + await writeFile(knowledgePath, `${JSON.stringify(parsed, null, 2)}\n`); + sendJson(res, 200, { ok: true }); + return; + } + if (req.method === "POST" && url.pathname === "/api/render/home") { const result = await runNodeScript("render-home.mjs"); sendJson(res, 200, { ok: true, ...result }); return; } + if (req.method === "POST" && url.pathname === "/api/render/knowledge") { + const result = await runNodeScript("render-knowledge.mjs"); + sendJson(res, 200, { ok: true, ...result }); + return; + } + if (req.method === "POST" && url.pathname === "/api/upload/asset") { const result = isMultipartRequest(req) ? await saveUploadedAssetBuffer(parseMultipartUpload(req, await readBodyBuffer(req))) diff --git a/tools/render-home.mjs b/tools/render-home.mjs index b956cc8..1383c40 100644 --- a/tools/render-home.mjs +++ b/tools/render-home.mjs @@ -4,6 +4,7 @@ import { fileURLToPath } from "node:url"; const repoRoot = join(dirname(fileURLToPath(import.meta.url)), ".."); const pagePath = join(repoRoot, "content", "pages", "home.json"); +const knowledgePath = join(repoRoot, "content", "knowledge.json"); const robotsPath = join(repoRoot, "robots.txt"); const sitemapPath = join(repoRoot, "sitemap.xml"); const templateRoot = join(repoRoot, "templates", "pages", "home"); @@ -193,6 +194,115 @@ function escapeXml(value) { .replaceAll("'", "'"); } +function stripHtml(value) { + return String(value ?? "") + .replace(/<[^>]*>/g, " ") + .replace(/\s+/g, " ") + .trim(); +} + +function normalizeLandingTarget(value) { + const raw = String(value || "").trim(); + if (!raw || /^javascript:/i.test(raw) || isExternalHref(raw)) return ""; + const hashValue = raw.includes("#") ? raw.slice(raw.indexOf("#") + 1) : raw; + return hashValue + .replace(/^\/+/, "") + .replace(/^index\.html#?/i, "") + .replace(/^#+/, "") + .trim(); +} + +function validateLandingTargets(model) { + const targets = new Map(); + + for (const block of allBlocks(model)) { + if (block.enabled === false) continue; + const target = normalizeLandingTarget(block.anchor); + if (!target) continue; + + if (targets.has(target)) { + const first = targets.get(target); + throw new Error( + `Duplicate landing target "${target}" in blocks "${first.adminLabel || first.id}" and "${block.adminLabel || block.id}"`, + ); + } + + targets.set(target, block); + } +} + +function slugify(value, fallback = "section") { + const map = { + а: "a", + б: "b", + в: "v", + г: "g", + д: "d", + е: "e", + ё: "e", + ж: "zh", + з: "z", + и: "i", + й: "y", + к: "k", + л: "l", + м: "m", + н: "n", + о: "o", + п: "p", + р: "r", + с: "s", + т: "t", + у: "u", + ф: "f", + х: "h", + ц: "c", + ч: "ch", + ш: "sh", + щ: "sch", + ъ: "", + ы: "y", + ь: "", + э: "e", + ю: "yu", + я: "ya", + }; + const safe = String(value ?? "") + .toLowerCase() + .replace(/[а-яё]/g, (char) => map[char] ?? "") + .replace(/[^a-z0-9]+/g, "-") + .replace(/^-+|-+$/g, ""); + + return safe || fallback; +} + +function collectKnowledgeUrls(source, canonical) { + let model; + try { + model = JSON.parse(source); + } catch { + return []; + } + + const basePath = String(model.basePath || "knowledge").replace(/^\/+|\/+$/g, "") || "knowledge"; + const urls = [new URL(`${basePath}/`, canonical).href]; + + function walk(nodes = [], parentSegments = []) { + nodes.forEach((node, index) => { + if (node.enabled === false) return; + const segment = slugify(node.slug || node.title || node.id, `page-${index + 1}`); + const segments = [...parentSegments, segment]; + if (node.useContent !== false && stripHtml(node.bodyHtml).length > 0) { + urls.push(new URL(`${basePath}/${segments.join("/")}/`, canonical).href); + } + if (Array.isArray(node.children)) walk(node.children, segments); + }); + } + + walk(model.tree || []); + return urls; +} + function canonicalUrl(model) { const fallback = "https://nodedc.dctouch.ru/"; const value = String(model.seo?.canonicalUrl || fallback).trim() || fallback; @@ -208,6 +318,8 @@ function canonicalUrl(model) { async function writeSeoFiles(model) { const canonical = canonicalUrl(model); const sitemapUrl = new URL("sitemap.xml", canonical).href; + const knowledgeSource = await readFile(knowledgePath, "utf8").catch(() => ""); + const knowledgeUrls = collectKnowledgeUrls(knowledgeSource, canonical); const robots = ["User-agent: *", "Allow: /", `Sitemap: ${sitemapUrl}`, ""].join("\n"); const sitemap = ` @@ -216,6 +328,15 @@ async function writeSeoFiles(model) { weekly 1.0 +${knowledgeUrls + .map( + (url) => ` + ${escapeXml(url)} + weekly + 0.7 + `, + ) + .join("\n")} `; @@ -306,6 +427,16 @@ function scopeDuplicateIds(html, scope) { return scoped; } +function htmlHasId(html, id) { + return new RegExp(`\\sid="${escapeRegExp(id)}"`).test(html); +} + +function withLandingTarget(html, block) { + const target = normalizeLandingTarget(block.anchor); + if (!target || htmlHasId(html, target)) return html; + return `${html}`; +} + async function renderBlock(block, renderCounts) { if (block.enabled === false) { return ""; @@ -316,12 +447,9 @@ async function renderBlock(block, renderCounts) { renderCounts.set(templateName, renderCount + 1); const html = renderTemplate(await readTemplate(templateName), block); + const rendered = renderCount === 0 && block.scopeIds !== true ? html : scopeDuplicateIds(html, block.id); - if (renderCount === 0 && block.scopeIds !== true) { - return html; - } - - return scopeDuplicateIds(html, block.id); + return withLandingTarget(rendered, block); } async function renderRegion(region) { @@ -367,6 +495,7 @@ async function renderSections() { applySeoDefaults(page); applySharedDemoRequest(page); applyRenderableLinks(page); +validateLandingTargets(page); let output = renderTemplate(shell, { id: page.slug, ...page }); diff --git a/tools/render-knowledge.mjs b/tools/render-knowledge.mjs new file mode 100644 index 0000000..8f90134 --- /dev/null +++ b/tools/render-knowledge.mjs @@ -0,0 +1,769 @@ +import { mkdir, readFile, writeFile } from "node:fs/promises"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; + +const repoRoot = join(dirname(fileURLToPath(import.meta.url)), ".."); +const knowledgePath = join(repoRoot, "content", "knowledge.json"); +const homePath = join(repoRoot, "content", "pages", "home.json"); +const robotsPath = join(repoRoot, "robots.txt"); +const sitemapPath = join(repoRoot, "sitemap.xml"); + +const knowledge = JSON.parse(await readFile(knowledgePath, "utf8")); +const home = JSON.parse(await readFile(homePath, "utf8").catch(() => "{}")); + +function escapeHtml(value) { + return String(value ?? "") + .replaceAll("&", "&") + .replaceAll("<", "<") + .replaceAll(">", ">"); +} + +function escapeAttr(value) { + return escapeHtml(value).replaceAll('"', """).replaceAll("'", "'"); +} + +function escapeXml(value) { + return escapeHtml(value).replaceAll('"', """).replaceAll("'", "'"); +} + +function escapeJson(value) { + return JSON.stringify(value).replaceAll("/gi, " ") + .replace(//gi, " ") + .replace(/<[^>]*>/g, " ") + .replace(/\s+/g, " ") + .trim(); +} + +function slugify(value, fallback = "section") { + const map = { + а: "a", + б: "b", + в: "v", + г: "g", + д: "d", + е: "e", + ё: "e", + ж: "zh", + з: "z", + и: "i", + й: "y", + к: "k", + л: "l", + м: "m", + н: "n", + о: "o", + п: "p", + р: "r", + с: "s", + т: "t", + у: "u", + ф: "f", + х: "h", + ц: "c", + ч: "ch", + ш: "sh", + щ: "sch", + ъ: "", + ы: "y", + ь: "", + э: "e", + ю: "yu", + я: "ya", + }; + const transliterated = String(value ?? "") + .toLowerCase() + .replace(/[а-яё]/g, (char) => map[char] ?? "") + .replace(/[^a-z0-9]+/g, "-") + .replace(/^-+|-+$/g, ""); + + return transliterated || fallback; +} + +function normalizePathSegment(node, index) { + return slugify(node.slug || node.title || node.id, `page-${index + 1}`); +} + +function publicAssetUrl(value) { + const url = String(value || "").trim(); + if (!url) return ""; + if (/^(https?:|data:|blob:|\/)/i.test(url)) return url; + if (url.startsWith("./")) return `/${url.slice(2)}`; + return `/${url.replace(/^\/+/, "")}`; +} + +function normalizeContentAssets(html) { + return String(html || "") + .replace(/\s(src|href)="\.\/assets\//g, ' $1="/assets/') + .replace(/\s(src|href)="assets\//g, ' $1="/assets/'); +} + +function decodeShortcodeAttr(value) { + return String(value ?? "") + .replaceAll(""", '"') + .replaceAll(""", '"') + .replaceAll("'", "'") + .replaceAll("'", "'") + .replaceAll("<", "<") + .replaceAll(">", ">") + .replaceAll("&", "&"); +} + +function parseShortcodeAttrs(value) { + const attrs = {}; + String(value || "").replace( + /([a-zA-Z][\w-]*)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s"']+))/g, + (match, key, doubleQuoted, singleQuoted, bare) => { + attrs[key.toLowerCase()] = decodeShortcodeAttr(doubleQuoted ?? singleQuoted ?? bare ?? ""); + return match; + }, + ); + return attrs; +} + +function normalizeKnowledgeButtonTarget(value) { + return String(value || "") + .trim() + .replace(/^#+/, "") + .replace(/^index\.html#/i, "") + .replace(/^\/?#/, ""); +} + +function normalizeKnowledgeButtonLink(value) { + return (String(value ?? "").trim() || "/").replace(/^\/+(https?:\/\/)/i, "$1").replace(/^\/+((?:mailto|tel):)/i, "$1"); +} + +function allHomeBlocks() { + return (home.regions || []).flatMap((region) => region.blocks || []); +} + +function landingBlockById(id) { + const blockId = String(id || "").trim(); + if (!blockId) return null; + return allHomeBlocks().find((block) => block.id === blockId && block.enabled !== false) || null; +} + +function landingTargetForAttrs(attrs) { + const blockId = attrs.block || attrs["block-id"] || attrs.blockid || attrs.landingblock || attrs["landing-block"]; + const blockTarget = normalizeKnowledgeButtonTarget(landingBlockById(blockId)?.anchor || ""); + return blockTarget || normalizeKnowledgeButtonTarget(attrs.target || attrs.anchor || ""); +} + +function knowledgeButtonHref(link, attrs) { + const anchor = landingTargetForAttrs(attrs); + const rawLink = normalizeKnowledgeButtonLink(link); + if (!anchor) return rawLink; + const base = rawLink.split("#")[0] || "/"; + if (/^index\.html$/i.test(base)) return `/#${anchor}`; + return `${base}#${anchor}`; +} + +function renderKnowledgeShortcodes(html) { + return String(html || "").replace(/\[button\b([^\]]*)\]/gi, (match, rawAttrs) => { + const attrs = parseShortcodeAttrs(rawAttrs); + const label = attrs.name || attrs.label || attrs.text || "Посмотреть"; + const href = knowledgeButtonHref(attrs.link || attrs.href || "/", attrs); + return `${escapeHtml(label)}`; + }); +} + +function canonicalHome() { + const fallback = "https://nodedc.dctouch.ru/"; + const value = String(home.seo?.canonicalUrl || fallback).trim() || fallback; + + try { + return new URL(value).href; + } catch { + return fallback; + } +} + +function canonicalBase() { + const url = new URL(canonicalHome()); + return `${url.origin}/`; +} + +function knowledgeBasePath() { + return String(knowledge.basePath || "knowledge").replace(/^\/+|\/+$/g, "") || "knowledge"; +} + +function nodeChildren(node) { + return Array.isArray(node.children) ? node.children : []; +} + +function nodeHasPage(node) { + return node?.enabled !== false && node.useContent !== false && stripHtml(renderKnowledgeShortcodes(node.bodyHtml || "")).length > 0; +} + +function walkNodes(nodes = knowledge.tree || [], parentSegments = [], parents = [], result = []) { + nodes.forEach((node, index) => { + if (node.enabled === false) return; + const segment = normalizePathSegment(node, index); + const segments = [...parentSegments, segment]; + const record = { + node, + parents, + segment, + segments, + urlPath: `/${knowledgeBasePath()}/${segments.join("/")}/`, + }; + result.push(record); + walkNodes(nodeChildren(node), segments, [...parents, record], result); + }); + + return result; +} + +function pageRecords() { + return walkNodes().filter((record) => nodeHasPage(record.node)); +} + +function currentAncestorIds(record) { + return new Set([record?.node?.id, ...(record?.parents || []).map((parent) => parent.node.id)].filter(Boolean)); +} + +function caretIcon(className = "caret astro-j63poqv6 astro-fr7meb3z", size = "1.25rem") { + return ``; +} + +function searchIcon() { + return ''; +} + +function anchorIcon(id, title) { + return `Раздел «${escapeHtml(title)}»`; +} + +function headingId(rawTitle, usedIds) { + const base = slugify(stripHtml(rawTitle), "section"); + let id = base; + let index = 2; + while (usedIds.has(id)) { + id = `${base}-${index}`; + index += 1; + } + usedIds.add(id); + return id; +} + +function prepareArticleHtml(html) { + const usedIds = new Set(); + const toc = []; + const normalized = renderKnowledgeShortcodes(normalizeContentAssets(html)).replace(/]*)>([\s\S]*?)<\/h\1>/gi, (match, level, attrs, inner) => { + const existingId = /\sid=(["'])(.*?)\1/i.exec(attrs); + const id = existingId?.[2] || headingId(inner, usedIds); + const title = stripHtml(inner); + if (existingId) usedIds.add(id); + toc.push({ level: Number(level), id, title }); + const nextAttrs = existingId ? attrs : `${attrs} id="${escapeAttr(id)}"`; + return `
${inner}${anchorIcon(id, title)}
`; + }); + + return { html: normalized, toc }; +} + +function renderNavRecord(record, currentIds, currentId, restoreCounter) { + const children = nodeChildren(record.node) + .map((child, index) => { + if (child.enabled === false) return ""; + const childSegment = normalizePathSegment(child, index); + return renderNavRecord( + { + node: child, + parents: [...record.parents, record], + segment: childSegment, + segments: [...record.segments, childSegment], + urlPath: `/${knowledgeBasePath()}/${[...record.segments, childSegment].join("/")}/`, + }, + currentIds, + currentId, + restoreCounter, + ); + }) + .filter(Boolean) + .join(""); + const title = escapeHtml(record.node.title || record.node.id || "Материал"); + const isCurrent = record.node.id === currentId; + const currentAttr = isCurrent ? ' aria-current="page"' : ""; + + if (!children) { + const largeClass = record.parents.length === 0 ? "large " : ""; + const href = nodeHasPage(record.node) ? record.urlPath : "#"; + return `
  • ${title}
  • `; + } + + const restoreIndex = restoreCounter.value; + restoreCounter.value += 1; + const open = currentIds.has(record.node.id) || record.parents.length === 0; + const label = nodeHasPage(record.node) + ? `${title}` + : `${title}`; + + return `
  • ${label}${caretIcon()}
      ${children}
  • `; +} + +function renderSidebar(currentRecord) { + const currentIds = currentAncestorIds(currentRecord); + const currentId = currentRecord?.node?.id || ""; + const restoreCounter = { value: 0 }; + const baseActive = currentRecord ? "" : ' aria-current="page"'; + const items = (knowledge.tree || []) + .map((node, index) => { + if (node.enabled === false) return ""; + const segment = normalizePathSegment(node, index); + return renderNavRecord( + { + node, + parents: [], + segment, + segments: [segment], + urlPath: `/${knowledgeBasePath()}/${segment}/`, + }, + currentIds, + currentId, + restoreCounter, + ); + }) + .filter(Boolean) + .join(""); + + return ``; +} + +function menuIcons() { + return ``; +} + +function renderTocItems(toc, mobile = false) { + const items = [{ level: 2, id: "_top", title: "Обзор" }, ...toc]; + return items + .map((item) => { + const depth = Math.max(0, item.level - 2); + return `
  • ${escapeHtml(item.title)}
  • `; + }) + .join(""); +} + +function renderRightSidebar(toc) { + const items = renderTocItems(toc); + const mobileItems = renderTocItems(toc, true); + return ``; +} + +function renderThemeIconsTemplate() { + return ``; +} + +function renderThemeSelect() { + return ``; +} + +function themeProviderScript() { + const defaultTheme = escapeAttr(knowledge.settings?.themeDefault || "dark"); + return ``; +} + +function interactionScript() { + return ``; +} + +function renderHeader(searchPlaceholder) { + const logoSrc = publicAssetUrl(home.staticElements?.content?.navigation?.logoSrc || home.staticElements?.content?.assets?.appIconSrc || ""); + const logoAlt = home.staticElements?.content?.navigation?.logoAlt || "NODE.DC"; + const brand = knowledge.settings?.navTitle || knowledge.title || "База знаний"; + const headerHref = knowledge.settings?.homeHref || "/"; + + return `
    +
    + +
    + + + + +
    +
    + + + ${renderThemeSelect()} +
    +
    +
    `; +} + +function pageTitle(record = null) { + if (!record) return knowledge.title || "База знаний"; + return record.node.seo?.title || record.node.title || "Материал"; +} + +function visibleTitle(record = null) { + if (!record) return knowledge.title || "База знаний"; + return record.node.title || "Материал"; +} + +function pageDescription(record = null) { + if (!record) return knowledge.settings?.description || ""; + return record.node.seo?.description || stripHtml(renderKnowledgeShortcodes(record.node.bodyHtml)).slice(0, 180); +} + +function canonicalForPath(path) { + return new URL(path.replace(/^\//, ""), canonicalBase()).href; +} + +function renderIndexCards(records) { + const topPages = records.filter((record) => record.parents.length <= 1).slice(0, 12); + if (!topPages.length) return ""; + return `

    Материалы

    `; +} + +function renderContent(record, bodyHtml) { + const title = visibleTitle(record); + return `
    +
    +
    +
    +

    ${escapeHtml(title)}

    +
    ${bodyHtml}
    +
    +
    +
    +
    +
    `; +} + +function renderPage({ record = null, bodyHtml, toc = [], searchRecords }) { + const title = pageTitle(record); + const description = pageDescription(record); + const path = record?.urlPath || `/${knowledgeBasePath()}/`; + const canonical = canonicalForPath(path); + const searchPlaceholder = knowledge.settings?.searchPlaceholder || "Поиск"; + + return ` + + + + + ${escapeHtml(title)} + + + + + + + + + + + + + + ${themeProviderScript()} + ${renderThemeIconsTemplate()} + + + + + + + + К содержанию +
    + ${renderHeader(searchPlaceholder)} + ${renderSidebar(record)} +
    +
    + ${renderRightSidebar(toc)} + ${renderContent(record, bodyHtml)} +
    +
    +
    + + ${interactionScript()} + ${searchScript()} + + +`; +} + +function searchScript() { + return ``; +} + +async function writePage(urlPath, html) { + const outputDir = join(repoRoot, urlPath.replace(/^\/+|\/+$/g, "")); + await mkdir(outputDir, { recursive: true }); + await writeFile(join(outputDir, "index.html"), html); +} + +async function writeSeoFiles(records) { + const sitemapUrls = [ + { loc: canonicalHome(), priority: "1.0" }, + { loc: canonicalForPath(`/${knowledgeBasePath()}/`), priority: "0.8" }, + ...records.map((record) => ({ loc: canonicalForPath(record.urlPath), priority: record.parents.length ? "0.6" : "0.7" })), + ]; + const sitemapUrl = new URL("sitemap.xml", canonicalHome()).href; + const robots = ["User-agent: *", "Allow: /", `Sitemap: ${sitemapUrl}`, ""].join("\n"); + const sitemap = ` + +${sitemapUrls + .map( + (item) => ` + ${escapeXml(item.loc)} + weekly + ${item.priority} + `, + ) + .join("\n")} + +`; + await writeFile(robotsPath, robots); + await writeFile(sitemapPath, sitemap); +} + +const records = pageRecords(); +const searchRecords = records.map((record) => ({ + title: record.node.title || "", + description: pageDescription(record), + url: record.urlPath, + text: stripHtml(renderKnowledgeShortcodes(record.node.bodyHtml || "")), +})); + +const indexIntro = normalizeContentAssets( + knowledge.introHtml || + `

    ${escapeHtml(knowledge.settings?.description || "Материалы NODE.DC для пользователей и поисковых систем.")}

    `, +); +const indexPrepared = prepareArticleHtml(`${indexIntro}${renderIndexCards(records)}`); +await writePage(`/${knowledgeBasePath()}/`, renderPage({ bodyHtml: indexPrepared.html, toc: indexPrepared.toc, searchRecords })); + +for (const record of records) { + const prepared = prepareArticleHtml(record.node.bodyHtml || ""); + await writePage(record.urlPath, renderPage({ record, bodyHtml: prepared.html, toc: prepared.toc, searchRecords })); +} + +await writeSeoFiles(records); +console.log(`Rendered ${records.length + 1} knowledge pages -> /${knowledgeBasePath()}/`);