&f[$]||f["@@iterator"],typeof f=="function"?f:null)}var ne={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},P=Object.assign,be={};function ye(f,M,fe){this.props=f,this.context=M,this.refs=be,this.updater=fe||ne}ye.prototype.isReactComponent={},ye.prototype.setState=function(f,M){if(typeof f!="object"&&typeof f!="function"&&f!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,f,M,"setState")},ye.prototype.forceUpdate=function(f){this.updater.enqueueForceUpdate(this,f,"forceUpdate")};function ge(){}ge.prototype=ye.prototype;function Q(f,M,fe){this.props=f,this.context=M,this.refs=be,this.updater=fe||ne}var Te=Q.prototype=new ge;Te.constructor=Q,P(Te,ye.prototype),Te.isPureReactComponent=!0;var oe=Array.isArray;function W(){}var _={H:null,A:null,T:null,S:null},ue=Object.prototype.hasOwnProperty;function J(f,M,fe){var ie=fe.ref;return{$typeof:x,type:f,key:M,ref:ie!==void 0?ie:null,props:fe}}function he(f,M){return J(f.type,M,f.props)}function ce(f){return typeof f=="object"&&f!==null&&f.$typeof===x}function De(f){var M={"=":"=0",":":"=2"};return"$"+f.replace(/[=:]/g,function(fe){return M[fe]})}var ze=/\/+/g;function _e(f,M){return typeof f=="object"&&f!==null&&f.key!=null?De(""+f.key):M.toString(36)}function Y(f){switch(f.status){case"fulfilled":return f.value;case"rejected":throw f.reason;default:switch(typeof f.status=="string"?f.then(W,W):(f.status="pending",f.then(function(M){f.status==="pending"&&(f.status="fulfilled",f.value=M)},function(M){f.status==="pending"&&(f.status="rejected",f.reason=M)})),f.status){case"fulfilled":return f.value;case"rejected":throw f.reason}}throw f}function C(f,M,fe,ie,Ae){var we=typeof f;(we==="undefined"||we==="boolean")&&(f=null);var z=!1;if(f===null)z=!0;else switch(we){case"bigint":case"string":case"number":z=!0;break;case"object":switch(f.$typeof){case x:case d:z=!0;break;case H:return z=f._init,C(z(f._payload),M,fe,ie,Ae)}}if(z)return Ae=Ae(f),z=ie===""?"."+_e(f,0):ie,oe(Ae)?(fe="",z!=null&&(fe=z.replace(ze,"/")+"/"),C(Ae,M,fe,"",function(U){return U})):Ae!=null&&(ce(Ae)&&(Ae=he(Ae,fe+(Ae.key==null||f&&f.key===Ae.key?"":(""+Ae.key).replace(ze,"/")+"/")+z)),M.push(Ae)),1;z=0;var I=ie===""?".":ie+":";if(oe(f))for(var T=0;T>>1,de=Y[me];if(0>>1;mek(st,O))fk(M,st)?(Y[me]=M,Y[f]=O,me=f):(Y[me]=st,Y[te]=O,me=te);else if(fk(M,O))Y[me]=M,Y[f]=O,me=f;else break e}}return C}function k(Y,C){var O=Y.sortIndex-C.sortIndex;return O!==0?O:Y.id-C.id}if(x.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var L=performance;x.unstable_now=function(){return L.now()}}else{var G=Date,B=G.now();x.unstable_now=function(){return G.now()-B}}var ee=[],F=[],H=1,b=null,A=3,$=!1,ae=!1,ne=!1,P=!1,be=typeof setTimeout=="function"?setTimeout:null,ye=typeof clearTimeout=="function"?clearTimeout:null,ge=typeof setImmediate<"u"?setImmediate:null;function Q(Y){for(var C=w(F);C!==null;){if(C.callback===null)u(F);else if(C.startTime<=Y)u(F),C.sortIndex=C.expirationTime,d(ee,C);else break;C=w(F)}}function Te(Y){if(ne=!1,Q(Y),!ae)if(w(ee)!==null)ae=!0,oe||(oe=!0,ce());else{var C=w(F);C!==null&&_e(Te,C.startTime-Y)}}var oe=!1,W=-1,_=5,ue=-1;function J(){return P?!0:!(x.unstable_now()-ue<_)}function he(){if(P=!1,oe){var Y=x.unstable_now();ue=Y;var C=!0;try{e:{ae=!1,ne&&(ne=!1,ye(W),W=-1),$=!0;var O=A;try{t:{for(Q(Y),b=w(ee);b!==null&&!(b.expirationTime>Y&&J());){var me=b.callback;if(typeof me=="function"){b.callback=null,A=b.priorityLevel;var de=me(b.expirationTime<=Y);if(Y=x.unstable_now(),typeof de=="function"){b.callback=de,Q(Y),C=!0;break t}b===w(ee)&&u(ee),Q(Y)}else u(ee);b=w(ee)}if(b!==null)C=!0;else{var Ce=w(F);Ce!==null&&_e(Te,Ce.startTime-Y),C=!1}}break e}finally{b=null,A=O,$=!1}C=void 0}}finally{C?ce():oe=!1}}}var ce;if(typeof ge=="function")ce=function(){ge(he)};else if(typeof MessageChannel<"u"){var De=new MessageChannel,ze=De.port2;De.port1.onmessage=he,ce=function(){ze.postMessage(null)}}else ce=function(){be(he,0)};function _e(Y,C){W=be(function(){Y(x.unstable_now())},C)}x.unstable_IdlePriority=5,x.unstable_ImmediatePriority=1,x.unstable_LowPriority=4,x.unstable_NormalPriority=3,x.unstable_Profiling=null,x.unstable_UserBlockingPriority=2,x.unstable_cancelCallback=function(Y){Y.callback=null},x.unstable_forceFrameRate=function(Y){0>Y||125me?(Y.sortIndex=O,d(F,Y),w(ee)===null&&Y===w(F)&&(ne?(ye(W),W=-1):ne=!0,_e(Te,O-me))):(Y.sortIndex=de,d(ee,Y),ae||$||(ae=!0,oe||(oe=!0,ce()))),Y},x.unstable_shouldYield=J,x.unstable_wrapCallback=function(Y){var C=A;return function(){var O=A;A=C;try{return Y.apply(this,arguments)}finally{A=O}}}})(hu)),hu}var I0;function tb(){return I0||(I0=1,mu.exports=eb()),mu.exports}var fu={exports:{}},Kt={};/**
* @license React
* react-dom.production.js
*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/var O0;function ab(){if(O0)return Kt;O0=1;var x=Au();function d(H){var b="https://react.dev/errors/"+H;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(x)}catch(d){console.error(d)}}return x(),fu.exports=ab(),fu.exports}/**
* @license React
* react-dom-client.production.js
*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/var G0;function rb(){if(G0)return Xi;G0=1;var x=tb(),d=Au(),w=nb();function u(e){var t="https://react.dev/errors/"+e;if(1Z||(e.current=X[Z],X[Z]=null,Z--)}function le(e,t){Z++,X[Z]=e.current,e.current=t}var Ne=pe(null),He=pe(null),Oe=pe(null),Pe=pe(null);function qe(e,t){switch(le(Oe,t),le(He,e),le(Ne,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Bh(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Bh(t),e=Hh(t,e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}Se(Ne),le(Ne,e)}function $e(){Se(Ne),Se(He),Se(Oe)}function Qt(e){var t=e.memoizedState;t!==null&&(Bl._currentValue=t.memoizedState,le(Pe,e)),t=Ne.current;var n=Hh(t,e.type);t!==n&&(le(He,e),le(Ne,n))}function q(e){He.current===e&&(Se(Ne),Se(He)),Pe.current===e&&(Se(Pe),Bl._currentValue=U)}var xe,je;function tt(e){if(xe===void 0)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);xe=t&&t[1]||"",je=-1)":-1l||m[r]!==S[l]){var j=`
`+m[r].replace(" at new "," at ");return e.displayName&&j.includes("")&&(j=j.replace("",e.displayName)),j}while(1<=r&&0<=l);break}}}finally{V=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:"")?tt(n):""}function Ve(e,t){switch(e.tag){case 26:case 27:case 5:return tt(e.type);case 16:return tt("Lazy");case 13:return e.child!==t&&t!==null?tt("Suspense Fallback"):tt("Suspense");case 19:return tt("SuspenseList");case 0:case 15:return Me(e.type,!1);case 11:return Me(e.type.render,!1);case 1:return Me(e.type,!0);case 31:return tt("Activity");case 30:return tt("ViewTransition");default:return""}}function yt(e){try{var t="",n=null;do t+=Ve(e,n),n=e,e=e.return;while(e);return t}catch(r){return`
Error generating stack: `+r.message+`
`+r.stack}}var cn=Object.prototype.hasOwnProperty,dn=x.unstable_scheduleCallback,Xr=x.unstable_cancelCallback,Ql=x.unstable_shouldYield,es=x.unstable_requestPaint,vt=x.unstable_now,Ko=x.unstable_getCurrentPriorityLevel,_n=x.unstable_ImmediatePriority,ts=x.unstable_UserBlockingPriority,In=x.unstable_NormalPriority,as=x.unstable_LowPriority,ql=x.unstable_IdlePriority,Wo=x.log,Ia=x.unstable_setDisableYieldValue,On=null,Yt=null;function Oa(e){if(typeof Wo=="function"&&Ia(e),Yt&&typeof Yt.setStrictMode=="function")try{Yt.setStrictMode(On,e)}catch{}}var Jt=Math.clz32?Math.clz32:gr,Qo=Math.log,ns=Math.LN2;function gr(e){return e>>>=0,e===0?32:31-(Qo(e)/ns|0)|0}var br=256,Qa=262144,Zr=4194304;function Mt(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&-e;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function yr(e,t,n){var r=e.pendingLanes;if(r===0)return 0;var l=0,i=e.suspendedLanes,s=e.pingedLanes;e=e.warmLanes;var o=r&134217727;return o!==0?(r=o&~i,r!==0?l=Mt(r):(s&=o,s!==0?l=Mt(s):n||(n=o&~e,n!==0&&(l=Mt(n))))):(o=r&~i,o!==0?l=Mt(o):s!==0?l=Mt(s):n||(n=r&~e,n!==0&&(l=Mt(n)))),l===0?0:t!==0&&t!==l&&(t&i)===0&&(i=l&-l,n=t&-t,i>=n||i===32&&(n&4194048)!==0)?t:l}function un(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function Xl(e,t){(t&8)!==0&&(t|=t&32);var n=e.entangledLanes;if(n!==0)for(e=e.entanglements,n&=t;0n;n++)t.push(e);return t}function Pn(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function Zl(e,t,n,r,l,i){var s=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var o=e.entanglements,m=e.expirationTimes,S=e.hiddenUpdates;for(n=s&~n;0"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),da=!1;if(Gt)try{var ja={};Object.defineProperty(ja,"passive",{get:function(){da=!0}}),window.addEventListener("test",ja,ja),window.removeEventListener("test",ja,ja)}catch{da=!1}var Nt=null,Xa=null,bn=null;function xs(){if(bn)return bn;var e,t=Xa,n=t.length,r,l="value"in Nt?Nt.value:Nt.textContent,i=l.length;for(e=0;e=di),Uu=" ",Vu=!1;function Fu(e,t){switch(e){case"keyup":return Wf.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Ku(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var ol=!1;function qf(e,t){switch(e){case"compositionend":return Ku(t);case"keypress":return t.which!==32?null:(Vu=!0,Uu);case"textInput":return e=t.data,e===Uu&&Vu?null:e;default:return null}}function Xf(e,t){if(ol)return e==="compositionend"||!$o&&Fu(e,t)?(e=xs(),bn=Xa=Nt=null,ol=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function $u(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function ep(e,t){var n=$u(e);e=0;for(var r;n;){if(n.nodeType===3){if(r=e+n.textContent.length,e<=t&&r>=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=$u(n)}}function tp(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?tp(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function ap(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=ac(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=ac(e.document)}return t}function nc(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}var nx=Gt&&"documentMode"in document&&11>=document.documentMode,cl=null,rc=null,hi=null,lc=!1;function np(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;lc||cl==null||cl!==ac(r)||(r=cl,"selectionStart"in r&&nc(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),hi&&mi(hi,r)||(hi=r,r=bo(rc,"onSelect"),0>=s,l-=s,Za=1<<32-Jt(t)+l|n<Re?(At=Ee,Ee=null):At=Ee.sibling;var Ze=y(v,Ee,N[Re],R);if(Ze===null){Ee===null&&(Ee=At);break}e&&Ee&&Ze.alternate===null&&t(v,Ee),g=i(Ze,g,Re),Qe===null?ve=Ze:Qe.sibling=Ze,Qe=Ze,Ee=At}if(Re===N.length)return n(v,Ee),Ue&&kn(v,Re),ve;if(Ee===null){for(;ReRe?(At=Ee,Ee=null):At=Ee.sibling;var hr=y(v,Ee,Ze.value,R);if(hr===null){Ee===null&&(Ee=At);break}e&&Ee&&hr.alternate===null&&t(v,Ee),g=i(hr,g,Re),Qe===null?ve=hr:Qe.sibling=hr,Qe=hr,Ee=At}if(Ze.done)return n(v,Ee),Ue&&kn(v,Re),ve;if(Ee===null){for(;!Ze.done;Re++,Ze=N.next())Ze=D(v,Ze.value,R),Ze!==null&&(g=i(Ze,g,Re),Qe===null?ve=Ze:Qe.sibling=Ze,Qe=Ze);return Ue&&kn(v,Re),ve}for(Ee=r(Ee);!Ze.done;Re++,Ze=N.next())Ze=E(Ee,v,Re,Ze.value,R),Ze!==null&&(e&&(At=Ze.alternate,At!==null&&Ee.delete(At.key===null?Re:At.key)),g=i(Ze,g,Re),Qe===null?ve=Ze:Qe.sibling=Ze,Qe=Ze);return e&&Ee.forEach(function(qg){return t(v,qg)}),Ue&&kn(v,Re),ve}function Be(v,g,N,R){if(typeof N=="object"&&N!==null&&N.type===he&&N.key===null&&N.props.ref===void 0&&(N=N.props.children),typeof N=="object"&&N!==null){switch(N.$typeof){case ue:e:{for(var ve=N.key;g!==null;){if(g.key===ve){if(ve=N.type,ve===he){if(g.tag===7){n(v,g.sibling),R=l(g,N.props.children),Xn(R,N),R.return=v,v=R;break e}}else if(g.elementType===ve||typeof ve=="object"&&ve!==null&&ve.$typeof===de&&_r(ve)===g.type){n(v,g.sibling),R=l(g,N.props),Xn(R,N),R.return=v,v=R;break e}n(v,g);break}else t(v,g);g=g.sibling}N.type===he?(R=Cr(N.props.children,v.mode,R,N.key),Xn(R,N),R.return=v,v=R):(R=ks(N.type,N.key,N.props,null,v.mode,R),Xn(R,N),R.return=v,v=R)}return s(v);case J:e:{for(ve=N.key;g!==null;){if(g.key===ve)if(g.tag===4&&g.stateNode.containerInfo===N.containerInfo&&g.stateNode.implementation===N.implementation){n(v,g.sibling),R=l(g,N.children||[]),R.return=v,v=R;break e}else{n(v,g);break}else t(v,g);g=g.sibling}R=pc(N,v.mode,R),R.return=v,v=R}return s(v);case de:return N=_r(N),Be(v,g,N,R)}if(z(N))return se(v,g,N,R);if(ie(N)){if(ve=ie(N),typeof ve!="function")throw Error(u(150));return N=ve.call(N),ke(v,g,N,R)}if(typeof N.then=="function")return Be(v,g,Ms(N),R);if(N.$typeof===_e)return Be(v,g,Cs(v,N),R);Rs(v,N)}return typeof N=="string"&&N!==""||typeof N=="number"||typeof N=="bigint"?(N=""+N,g!==null&&g.tag===6?(n(v,g.sibling),R=l(g,N),R.return=v,v=R):(n(v,g),R=uc(N,v.mode,R),R.return=v,v=R),s(v)):n(v,g)}return function(v,g,N,R){try{vi=0;var ve=Be(v,g,N,R);return bl=null,ve}catch(Ee){if(Ee===gl||Ee===zs)throw Ee;var Qe=ua(29,Ee,null,v.mode);return Qe.lanes=R,Qe.return=v,Qe}finally{}}}var Or=Tp(!0),Cp=Tp(!1),Zn=!1;function kc(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function wc(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function Yn(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Jn(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,(Ye&2)!==0){var l=r.pending;return l===null?t.next=t:(t.next=l.next,l.next=t),r.pending=t,t=Ss(e),up(e,null,n),t}return vs(e,r,t,n),Ss(e)}function Si(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194048)!==0)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Gn(e,n)}}function Nc(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var l=null,i=null;if(n=n.firstBaseUpdate,n!==null){do{var s={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};i===null?l=i=s:i=i.next=s,n=n.next}while(n!==null);i===null?l=i=t:i=i.next=t}else l=i=t;n={baseState:r.baseState,firstBaseUpdate:l,lastBaseUpdate:i,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var Ec=!1;function ki(){if(Ec){var e=xl;if(e!==null)throw e}}function wi(e,t,n,r){Ec=!1;var l=e.updateQueue;Zn=!1;var i=l.firstBaseUpdate,s=l.lastBaseUpdate,o=l.shared.pending;if(o!==null){l.shared.pending=null;var m=o,S=m.next;m.next=null,s===null?i=S:s.next=S,s=m;var j=e.alternate;j!==null&&(j=j.updateQueue,o=j.lastBaseUpdate,o!==s&&(o===null?j.firstBaseUpdate=S:o.next=S,j.lastBaseUpdate=m))}if(i!==null){var D=l.baseState;s=0,j=S=m=null,o=i;do{var y=o.lane&-536870913,E=y!==o.lane;if(E?(We&y)===y:(r&y)===y){y!==0&&y===Rr&&(Ec=!0),j!==null&&(j=j.next={lane:0,tag:o.tag,payload:o.payload,callback:null,next:null});e:{var se=e,ke=o;y=t;var Be=n;switch(ke.tag){case 1:if(se=ke.payload,typeof se=="function"){D=se.call(Be,D,y);break e}D=se;break e;case 3:se.flags=se.flags&-65537|128;case 0:if(se=ke.payload,y=typeof se=="function"?se.call(Be,D,y):se,y==null)break e;D=W({},D,y);break e;case 2:Zn=!0}}y=o.callback,y!==null&&(e.flags|=64,E&&(e.flags|=8192),E=l.callbacks,E===null?l.callbacks=[y]:E.push(y))}else E={lane:y,tag:o.tag,payload:o.payload,callback:o.callback,next:null},j===null?(S=j=E,m=D):j=j.next=E,s|=y;if(o=o.next,o===null){if(o=l.shared.pending,o===null)break;E=o,o=E.next,E.next=null,l.lastBaseUpdate=E,l.shared.pending=null}}while(!0);j===null&&(m=D),l.baseState=m,l.firstBaseUpdate=S,l.lastBaseUpdate=j,i===null&&(l.shared.lanes=0),lr|=s,e.lanes=s,e.memoizedState=D}}function Ap(e,t){if(typeof e!="function")throw Error(u(191,e));e.call(t)}function zp(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;ei?i:8;var s=I.T,o={};o.types=s!==null?s.types:null,I.T=o,Kc(e,!1,t,n);try{var m=l(),S=I.S;if(S!==null&&S(o,m),m!==null&&typeof m=="object"&&typeof m.then=="function"){var j=hx(m,r);Ti(e,t,j,wa(e))}else Ti(e,t,r,wa(e))}catch(D){Ti(e,t,{then:function(){},status:"rejected",reason:D},wa())}finally{T.p=i,s!==null&&o.types!==null&&(s.types=o.types),I.T=s}}function vx(){}function Vc(e,t,n,r){if(e.tag!==5)throw Error(u(476));var l=om(e).queue;sm(e,l,t,U,n===null?vx:function(){return cm(e),n(r)})}function om(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:U,baseState:U,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:jn,lastRenderedState:U},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:jn,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function cm(e){var t=om(e);t.next===null&&(t=e.alternate.memoizedState),Ti(e,t.next.queue,{},wa())}function Fc(){return Bt(Bl)}function dm(){return St().memoizedState}function um(){return St().memoizedState}function Sx(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=wa();e=Yn(n);var r=Jn(t,e,n);r!==null&&(fa(r,t,n),Si(r,t,n)),t={cache:bc()},e.payload=t;return}t=t.return}}function kx(e,t,n){var r=wa();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},Vs(e)?mm(t,n):(n=cc(e,t,n,r),n!==null&&(fa(n,e,r),hm(n,t,r)))}function pm(e,t,n){var r=wa();Ti(e,t,n,r)}function Ti(e,t,n,r){var l={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(Vs(e))mm(t,l);else{var i=e.alternate;if(e.lanes===0&&(i===null||i.lanes===0)&&(i=t.lastRenderedReducer,i!==null))try{var s=t.lastRenderedState,o=i(s,n);if(l.hasEagerState=!0,l.eagerState=o,ba(o,s))return vs(e,t,l,0),ct===null&&ys(),!1}catch{}finally{}if(n=cc(e,t,l,r),n!==null)return fa(n,e,r),hm(n,t,r),!0}return!1}function Kc(e,t,n,r){if(r={lane:2,revertLane:_d(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},Vs(e)){if(t)throw Error(u(479))}else t=cc(e,n,r,2),t!==null&&fa(t,e,2)}function Vs(e){var t=e.alternate;return e===Ge||t!==null&&t===Ge}function mm(e,t){yl=Is=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function hm(e,t,n){if((n&4194048)!==0){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Gn(e,n)}}var Fs={readContext:Bt,use:Gs,useCallback:xt,useContext:xt,useEffect:xt,useImperativeHandle:xt,useLayoutEffect:xt,useInsertionEffect:xt,useMemo:xt,useReducer:xt,useRef:xt,useState:xt,useDebugValue:xt,useDeferredValue:xt,useTransition:xt,useSyncExternalStore:xt,useId:xt,useHostTransitionStatus:xt,useFormState:xt,useActionState:xt,useOptimistic:xt,useMemoCache:xt,useCacheRefresh:xt,useEffectEvent:xt},fm={readContext:Bt,use:Gs,useCallback:function(e,t){return aa().memoizedState=[e,t===void 0?null:t],e},useContext:Bt,useEffect:Jp,useImperativeHandle:function(e,t,n){n=n!=null?n.concat([e]):null,Hs(4194308,4,am.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Hs(4194308,4,e,t)},useInsertionEffect:function(e,t){Hs(4,2,e,t)},useMemo:function(e,t){var n=aa();t=t===void 0?null:t;var r=e();if(Pr){Oa(!0);try{e()}finally{Oa(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=aa();if(n!==void 0){var l=n(t);if(Pr){Oa(!0);try{n(t)}finally{Oa(!1)}}}else l=t;return r.memoizedState=r.baseState=l,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:l},r.queue=e,e=e.dispatch=kx.bind(null,Ge,e),[r.memoizedState,e]},useRef:function(e){var t=aa();return e={current:e},t.memoizedState=e},useState:function(e){e=Pc(e);var t=e.queue,n=pm.bind(null,Ge,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:Hc,useDeferredValue:function(e,t){var n=aa();return Uc(n,e,t)},useTransition:function(){var e=Pc(!1);return e=sm.bind(null,Ge,e.queue,!0,!1),aa().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=Ge,l=aa();if(Ue){if(n===void 0)throw Error(u(407));n=n()}else{if(n=t(),ct===null)throw Error(u(349));(We&127)!==0||Ip(r,t,n)}l.memoizedState=n;var i={value:n,getSnapshot:t};return l.queue=i,Jp(Pp.bind(null,r,i,e),[e]),r.flags|=2048,Sl(9,{destroy:void 0},Op.bind(null,r,i,n,t),null),n},useId:function(){var e=aa(),t=ct.identifierPrefix;if(Ue){var n=Ya,r=Za;n=(r&~(1<<32-Jt(r)-1)).toString(32)+n,t="_"+t+"R_"+n,n=Os++,0<\/script>",i=i.removeChild(i.firstChild);break;case"select":i=typeof r.is=="string"?s.createElement("select",{is:r.is}):s.createElement("select"),r.multiple?i.multiple=!0:r.size&&(i.size=r.size);break;default:i=typeof r.is=="string"?s.createElement(l,{is:r.is}):s.createElement(l)}}i[kt]=t,i[Dt]=r;e:for(s=t.child;s!==null;){if(s.tag===5||s.tag===6)i.appendChild(s.stateNode);else if(s.tag!==4&&s.tag!==27&&s.child!==null){s.child.return=s,s=s.child;continue}if(s===t)break e;for(;s.sibling===null;){if(s.return===null||s.return===t)break e;s=s.return}s.sibling.return=s.return,s=s.sibling}t.stateNode=i;e:switch(Ft(i,l,r),l){case"button":case"input":case"select":case"textarea":r=!!r.autoFocus;break e;case"img":r=!0;break e;default:r=!1}r&&Cn(t)}}return pt(t),t.subtreeFlags&=-33554433,rd(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&Cn(t);else{if(typeof r!="string"&&t.stateNode===null)throw Error(u(166));if(e=Oe.current,fl(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,l=It,l!==null)switch(l.tag){case 27:case 5:r=l.memoizedProps}e[kt]=t,e=!!(e.nodeValue===n||r!==null&&r.suppressHydrationWarning===!0||Ph(e.nodeValue,n)),e||Qn(t,!0)}else e=Bi(e).createTextNode(r),e[kt]=t,t.stateNode=e}return pt(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(r=fl(t),n!==null){if(e===null){if(!r)throw Error(u(318));if(e=t.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(u(557));e[kt]=t}else Ar(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;pt(t),e=!1}else n=fc(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(ya(t),t):(ya(t),null);if((t.flags&128)!==0)throw Error(u(558))}return pt(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(l=fl(t),r!==null&&r.dehydrated!==null){if(e===null){if(!l)throw Error(u(318));if(l=t.memoizedState,l=l!==null?l.dehydrated:null,!l)throw Error(u(317));l[kt]=t}else Ar(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;pt(t),l=!1}else l=fc(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=l),l=!0;if(!l)return t.flags&256?(ya(t),t):(ya(t),null)}return ya(t),(t.flags&128)!==0?(t.lanes=n,t):(n=r!==null,e=e!==null&&e.memoizedState!==null,n&&(r=t.child,l=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(l=r.alternate.memoizedState.cachePool.pool),i=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(i=r.memoizedState.cachePool.pool),i!==l&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),Zs(t,t.updateQueue),pt(t),null);case 4:return $e(),e===null&&Gd(t.stateNode.containerInfo),t.flags|=67108864,pt(t),null;case 10:return Nn(t.type),pt(t),null;case 19:if(Ac(t),r=t.memoizedState,r===null)return pt(t),null;if(l=(t.flags&128)!==0,i=r.rendering,i===null)if(l)Ai(r,!1);else{if(gt!==0||e!==null&&(e.flags&128)!==0)for(e=t.child;e!==null;){if(i=_s(e),i!==null){for(t.flags|=128,Ai(r,!1),e=i.updateQueue,t.updateQueue=e,Zs(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)pp(n,e),n=n.sibling;return Ni(t,Ut.current&1|2),Ue&&kn(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&vt()>oo&&(t.flags|=128,l=!0,Ai(r,!1),t.lanes=4194304)}else{if(!l)if(e=_s(i),e!==null){if(t.flags|=128,l=!0,e=e.updateQueue,t.updateQueue=e,Zs(t,e),Ai(r,!0),r.tail===null&&r.tailMode!=="collapsed"&&r.tailMode!=="visible"&&!i.alternate&&!Ue)return pt(t),null}else 2*vt()-r.renderingStartTime>oo&&n!==536870912&&(t.flags|=128,l=!0,Ai(r,!1),t.lanes=4194304);r.isBackwards?(i.sibling=t.child,t.child=i):(e=r.last,e!==null?e.sibling=i:t.child=i,r.last=i)}if(r.tail!==null){e=r.tail;e:{for(n=e;n!==null;){if(n.alternate!==null){n=!1;break e}n=n.sibling}n=!0}return r.rendering=e,r.tail=e.sibling,r.renderingStartTime=vt(),e.sibling=null,i=Ut.current,i=l?i&1|2:i&1,r.tailMode==="visible"||r.tailMode==="collapsed"||!n||Ue?Ni(t,i):(n=i,le(Ht,t),le(Ut,n),Zt===null&&(Zt=t)),Ue&&kn(t,r.treeForkCount),e}return pt(t),null;case 22:case 23:return ya(t),Tc(),r=t.memoizedState!==null,e!==null?e.memoizedState!==null!==r&&(t.flags|=8192):r&&(t.flags|=8192),r?(n&536870912)!==0&&(t.flags&128)===0&&(pt(t),t.subtreeFlags&6&&(t.flags|=8192)):pt(t),n=t.updateQueue,n!==null&&Zs(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),e!==null&&Se(Dr),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),Nn(jt),pt(t),null;case 25:return null;case 30:return t.flags|=33554432,pt(t),null}throw Error(u(156,t.tag))}function Ax(e,t){switch(mc(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Nn(jt),$e(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return q(t),null;case 31:if(t.memoizedState!==null){if(ya(t),t.alternate===null)throw Error(u(340));Ar()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(ya(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(u(340));Ar()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Ac(t),e=t.flags,e&65536?(t.flags=e&-65537|128,e=t.memoizedState,e!==null&&(e.rendering=null,e.tail=null),t.flags|=4,t):null;case 4:return $e(),null;case 10:return Nn(t.type),null;case 22:case 23:return ya(t),Tc(),e!==null&&Se(Dr),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return Nn(jt),null;case 25:return null;default:return null}}function Bm(e,t){switch(mc(t),t.tag){case 3:Nn(jt),$e();break;case 26:case 27:case 5:q(t);break;case 4:$e();break;case 31:t.memoizedState!==null&&ya(t);break;case 13:ya(t);break;case 19:Ac(t);break;case 10:Nn(t.type);break;case 22:case 23:ya(t),Tc(),e!==null&&Se(Dr);break;case 24:Nn(jt)}}function zi(e,t){try{var n=t.updateQueue,r=n!==null?n.lastEffect:null;if(r!==null){var l=r.next;n=l;do{if((n.tag&e)===e){r=void 0;var i=n.create,s=n.inst;r=i(),s.destroy=r}n=n.next}while(n!==l)}}catch(o){nt(t,t.return,o)}}function ar(e,t,n){try{var r=t.updateQueue,l=r!==null?r.lastEffect:null;if(l!==null){var i=l.next;r=i;do{if((r.tag&e)===e){var s=r.inst,o=s.destroy;if(o!==void 0){s.destroy=void 0,l=t;var m=n,S=o;try{S()}catch(j){nt(l,m,j)}}}r=r.next}while(r!==i)}}catch(j){nt(t,t.return,j)}}function Hm(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{zp(t,n)}catch(r){nt(e,e.return,r)}}}function Um(e,t,n){n.props=Gr(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(r){nt(e,t,r)}}function Ja(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:var l=e.stateNode,i=yn(e.memoizedProps,l);(l.ref===null||l.ref.name!==i)&&(l.ref=Xh(i)),r=l.ref;break;case 7:if(e.stateNode===null){var s=new Na(e);b(e.child,!1,yg,s,void 0,void 0),e.stateNode=s}r=e.stateNode;break;default:r=e.stateNode}typeof n=="function"?e.refCleanup=n(r):n.current=r}}catch(o){nt(e,t,o)}}function Vt(e,t){var n=e.ref,r=e.refCleanup;if(n!==null)if(typeof r=="function")try{r()}catch(l){nt(e,t,l)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n=="function")try{n(null)}catch(l){nt(e,t,l)}else n.current=null}function Ys(e,t){if((e.tag===5||e.tag===27||e.tag===6)&&e.alternate===null&&t!==null)for(var n=0;n title"))),Ft(r,t,n),r[kt]=e,wt(r),t=r;break e;case"link":if(i=p0("link","href",l).get(t+(n.href||""))){for(s=0;sBe&&(s=Be,Be=ke,ke=s);var v=ep(o,ke),g=ep(o,Be);if(v&&g&&(E.rangeCount!==1||E.anchorNode!==v.node||E.anchorOffset!==v.offset||E.focusNode!==g.node||E.focusOffset!==g.offset)){var N=D.createRange();N.setStart(v.node,v.offset),E.removeAllRanges(),ke>Be?(E.addRange(N),E.extend(g.node,g.offset)):(N.setEnd(g.node,g.offset),E.addRange(N))}}}}for(D=[],E=o;E=E.parentNode;)E.nodeType===1&&D.push({element:E,left:E.scrollLeft,top:E.scrollTop});for(typeof o.focus=="function"&&o.focus(),o=0;on?32:n,I.T=null,n=Ed,Ed=null;var i=Ka,s=rn;if(ft=0,Vr=Ka=null,rn=0,(Ye&6)!==0)throw Error(u(331));var o=Ye;if(Ye|=4,uh(i.current),oh(i,i.current,s,n),Ye=o,Oi(0,!1),Yt&&typeof Yt.onPostCommitFiberRoot=="function")try{Yt.onPostCommitFiberRoot(On,i)}catch{}return!0}finally{T.p=l,I.T=r,jh(e,t)}}function Th(e,t,n){t=Aa(n,t),t=qc(e.stateNode,t,2),e=Jn(e,t,2),e!==null&&(Pn(e,2),ln(e))}function nt(e,t,n){if(e.tag===3)Th(e,e,n);else for(;t!==null;){if(t.tag===3){Th(t,e,n);break}else if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof r.componentDidCatch=="function"&&(ir===null||!ir.has(r))){e=Aa(n,e),n=wm(2),r=Jn(t,n,2),r!==null&&(Nm(n,r,t,e),Pn(r,2),ln(r));break}}t=t.return}}function Md(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new Rx;var l=new Set;r.set(t,l)}else l=r.get(t),l===void 0&&(l=new Set,r.set(t,l));l.has(n)||(kd=!0,l.add(n),e=Hx.bind(null,e,t,n),t.then(e,e))}function Hx(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,ct===e&&(We&n)===n&&((gt===4||gt===3&&(We&62914560)===We&&300>vt()-so)&&(Ye&2)===0?Ml(e,0):io|=n,Tl===We&&(Tl=0)),ln(e)}function Ch(e,t){t===0&&(t=ls()),e=Tr(e,t),e!==null&&(Pn(e,t),ln(e))}function Ux(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Ch(e,n)}function Vx(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,l=e.memoizedState;l!==null&&(n=l.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(u(314))}r!==null&&r.delete(t),Ch(e,n)}function Fx(e,t){return dn(e,t)}var Dl=null,_l=null,Rd=!1,xo=!1,Dd=!1,or=0;function ln(e){e!==_l&&e.next===null&&(_l===null?Dl=_l=e:_l=_l.next=e),xo=!0,Rd||(Rd=!0,Wx())}function Oi(e,t){if(!Dd&&xo){Dd=!0;do for(var n=!1,r=Dl;r!==null;){if(e!==0){var l=r.pendingLanes;if(l===0)var i=0;else{var s=r.suspendedLanes,o=r.pingedLanes;i=(1<<31-Jt(42|e)+1)-1,i&=l&~(s&~o),i=i&201326741?i&201326741|1:i?i|2:0}i!==0&&(n=!0,Mh(r,i))}else i=We,i=yr(r,r===ct?i:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),(i&3)===0||un(r,i)||(n=!0,Mh(r,i));r=r.next}while(n);Dd=!1}}function Kx(){Ah()}function Ah(){xo=Rd=!1;var e=0;or!==0&&ng()&&(e=or);for(var t=vt(),n=null,r=Dl;r!==null;){var l=r.next,i=zh(r,t);i===0?(r.next=null,n===null?Dl=l:n.next=l,l===null&&(_l=n)):(n=r,(e!==0||(i&3)!==0)&&(xo=!0)),r=l}ft!==0&&ft!==5||Oi(e),or!==0&&(or=0)}function zh(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,l=e.expirationTimes,i=e.pendingLanes&-62914561;0o)break;var j=m.transferSize,D=m.initiatorType;j&&Gh(D)&&(m=m.responseEnd,s+=j*(mSo){ke.length=se;break}N=new Promise(cg.bind(N)),ke.push(N)}}}if(0"u"?null:document;function o0(e,t,n){var r=Ol;if(r&&typeof t=="string"&&t){var l=oa(t);l='link[rel="'+e+'"][href="'+l+'"]',typeof n=="string"&&(l+='[crossorigin="'+n+'"]'),s0.has(l)||(s0.add(l),e={rel:e,crossOrigin:n,href:t},r.querySelector(l)===null&&(t=r.createElement("link"),Ft(t,"link",e),wt(t),r.head.appendChild(t)))}}function Cg(e){zn.D(e),o0("dns-prefetch",e,null)}function Ag(e,t){zn.C(e,t),o0("preconnect",e,t)}function zg(e,t,n){zn.L(e,t,n);var r=Ol;if(r&&e&&t){var l='link[rel="preload"][as="'+oa(t)+'"]';t==="image"&&n&&n.imageSrcSet?(l+='[imagesrcset="'+oa(n.imageSrcSet)+'"]',typeof n.imageSizes=="string"&&(l+='[imagesizes="'+oa(n.imageSizes)+'"]')):l+='[href="'+oa(e)+'"]';var i=l;switch(t){case"style":i=Pl(e);break;case"script":i=Gl(e)}if(!(_a.has(i)||(e=W({rel:"preload",href:t==="image"&&n&&n.imageSrcSet?void 0:e,as:t},n),_a.set(i,e),r.querySelector(l)!==null||t==="style"&&r.querySelector(Ui(i))||t==="script"&&r.querySelector(Vi(i))))){var s=r.createElement("link");Ft(s,"link",e),t==="style"&&(s[Hn]=!0,s.onload=s.onerror=function(){ti(s)}),wt(s),r.head.appendChild(s)}}}function Lg(e,t){zn.m(e,t);var n=Ol;if(n&&e){var r=t&&typeof t.as=="string"?t.as:"script",l='link[rel="modulepreload"][as="'+oa(r)+'"][href="'+oa(e)+'"]',i=l;switch(r){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":i=Gl(e)}if(!_a.has(i)&&(e=W({rel:"modulepreload",href:e},t),_a.set(i,e),n.querySelector(l)===null)){switch(r){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(n.querySelector(Vi(i)))return}r=n.createElement("link"),Ft(r,"link",e),wt(r),n.head.appendChild(r)}}}function Mg(e,t,n){zn.S(e,t,n);var r=Ol;if(r&&e){var l=hn(r).hoistableStyles,i=Pl(e);t=t||"default";var s=l.get(i);if(!s){var o={loading:0,preload:null};if(s=r.querySelector(Ui(i)))o.loading=5;else{e=W({rel:"stylesheet",href:e,"data-precedence":t},n),(n=_a.get(i))&&tu(e,n);var m=s=r.createElement("link");wt(m),Ft(m,"link",e),m._p=new Promise(function(S,j){m.onload=S,m.onerror=j}),m.addEventListener("load",function(){o.loading|=1}),m.addEventListener("error",function(){o.loading|=2}),o.loading|=4,yo(s,t,r)}s={type:"stylesheet",instance:s,count:1,state:o},l.set(i,s)}}}function Rg(e,t){zn.X(e,t);var n=Ol;if(n&&e){var r=hn(n).hoistableScripts,l=Gl(e),i=r.get(l);i||(i=n.querySelector(Vi(l)),i||(e=W({src:e,async:!0},t),(t=_a.get(l))&&au(e,t),i=n.createElement("script"),wt(i),Ft(i,"link",e),n.head.appendChild(i)),i={type:"script",instance:i,count:1,state:null},r.set(l,i))}}function Dg(e,t){zn.M(e,t);var n=Ol;if(n&&e){var r=hn(n).hoistableScripts,l=Gl(e),i=r.get(l);i||(i=n.querySelector(Vi(l)),i||(e=W({src:e,async:!0,type:"module"},t),(t=_a.get(l))&&au(e,t),i=n.createElement("script"),wt(i),Ft(i,"link",e),n.head.appendChild(i)),i={type:"script",instance:i,count:1,state:null},r.set(l,i))}}function c0(e,t,n,r){var l=(l=Oe.current)?Hi(l):null;if(!l)throw Error(u(446));switch(e){case"meta":case"title":return null;case"style":return typeof n.precedence=="string"&&typeof n.href=="string"?(n=Pl(n.href),t=hn(l).hoistableStyles,r=t.get(n),r||(r={type:"style",instance:null,count:0,state:null},t.set(n,r)),r):{type:"void",instance:null,count:0,state:null};case"link":if(n.rel==="stylesheet"&&typeof n.href=="string"&&typeof n.precedence=="string"){e=Pl(n.href);var i=hn(l).hoistableStyles,s=i.get(e);if(s||(l=l.ownerDocument||l,s={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},i.set(e,s),(i=l.querySelector(Ui(e)))?i._p||(s.instance=i,s.state.loading=5):(i=_a.get(e),i||(i={rel:"preload",as:"style",href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},_a.set(e,i)),_g(l,e,i,s.state))),t&&r===null)throw Error(u(528,""));return s}if(t&&r!==null)throw Error(u(529,""));return null;case"script":return t=n.async,n=n.src,typeof n=="string"&&t&&typeof t!="function"&&typeof t!="symbol"?(n=Gl(n),t=hn(l).hoistableScripts,r=t.get(n),r||(r={type:"script",instance:null,count:0,state:null},t.set(n,r)),r):{type:"void",instance:null,count:0,state:null};default:throw Error(u(444,e))}}function Pl(e){return'href="'+oa(e)+'"'}function Ui(e){return'link[rel="stylesheet"]['+e+"]"}function d0(e){return W({},e,{"data-precedence":e.precedence,precedence:null})}function _g(e,t,n,r){if(t=e.querySelector('link[rel="preload"][as="style"]['+t+"]")){if(t[Hn]!==!0){r.loading=1;return}}else t=e.createElement("link"),t[Hn]=!0,t.onload=t.onerror=ti.bind(null,t),Ft(t,"link",n),wt(t),e.head.appendChild(t);r.preload=t,t.addEventListener("load",function(){return r.loading|=1}),t.addEventListener("error",function(){return r.loading|=2})}function Gl(e){return'[src="'+oa(e)+'"]'}function Vi(e){return"script[async]"+e}function u0(e,t,n){if(t.count++,t.instance===null)switch(t.type){case"style":var r=e.querySelector('style[data-href~="'+oa(n.href)+'"]');if(r)return t.instance=r,wt(r),r;var l=W({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement("style"),wt(r),Ft(r,"style",l),yo(r,n.precedence,e),t.instance=r;case"stylesheet":l=Pl(n.href);var i=e.querySelector(Ui(l));if(i)return t.state.loading|=4,t.instance=i,wt(i),i;r=d0(n),(l=_a.get(l))&&tu(r,l),i=(e.ownerDocument||e).createElement("link"),wt(i);var s=i;return s._p=new Promise(function(o,m){s.onload=o,s.onerror=m}),Ft(i,"link",r),t.state.loading|=4,yo(i,n.precedence,e),t.instance=i;case"script":return i=Gl(n.src),(l=e.querySelector(Vi(i)))?(t.instance=l,wt(l),l):(r=n,(l=_a.get(i))&&(r=W({},n),au(r,l)),e=e.ownerDocument||e,l=e.createElement("script"),wt(l),Ft(l,"link",r),e.head.appendChild(l),t.instance=l);case"void":return null;default:throw Error(u(443,t.type))}else t.type==="stylesheet"&&(t.state.loading&4)===0&&(r=t.instance,t.state.loading|=4,yo(r,n.precedence,e));return t.instance}function yo(e,t,n){for(var r=n.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),l=r.length?r[r.length-1]:null,i=l,s=0;s title"):null)}function Ig(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case"meta":case"title":return!0;case"style":if(typeof t.precedence!="string"||typeof t.href!="string"||t.href==="")break;return!0;case"link":if(typeof t.rel!="string"||typeof t.href!="string"||t.href===""||t.onLoad||t.onError)break;switch(t.rel){case"stylesheet":return e=t.disabled,typeof t.precedence=="string"&&e==null;default:return!0}case"script":if(t.async&&typeof t.async!="function"&&typeof t.async!="symbol"&&!t.onLoad&&!t.onError&&t.src&&typeof t.src=="string")return!0}return!1}function m0(e,t){return e==="img"&&t.src!=null&&t.src!==""&&t.onLoad==null&&t.loading!=="lazy"}function h0(e){return!(e.type==="stylesheet"&&(e.state.loading&3)===0)}function f0(e){return(e.width||100)*(e.height||100)*(typeof devicePixelRatio=="number"?devicePixelRatio:1)*.25}function x0(e,t){typeof t.decode=="function"&&(e.imgCount++,t.complete||(e.imgBytes+=f0(t),e.suspenseyImages.push(t)),e=Gg.bind(e),t.decode().then(e,e))}function Og(e,t,n,r){if(n.type==="stylesheet"&&(typeof r.media!="string"||matchMedia(r.media).matches!==!1)&&(n.state.loading&4)===0){if(n.instance===null){var l=Pl(r.href),i=t.querySelector(Ui(l));if(i){t=i._p,t!==null&&typeof t=="object"&&typeof t.then=="function"&&(e.count++,e=Fi.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=i,wt(i);return}i=t.ownerDocument||t,r=d0(r),(l=_a.get(l))&&tu(r,l),i=i.createElement("link"),wt(i);var s=i;s._p=new Promise(function(o,m){s.onload=o,s.onerror=m}),Ft(i,"link",r),n.instance=i}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&(n.state.loading&3)===0&&(e.count++,n=Fi.bind(e),t.addEventListener("load",n),t.addEventListener("error",n))}}var So=0;function Pg(e,t){return e.stylesheets&&e.count===0&&wo(e,e.stylesheets),0So?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(l)}}:null}function g0(e){if(e.count===0&&(e.imgCount===0||!e.waitingForImages)){if(e.stylesheets)wo(e,e.stylesheets);else if(e.unsuspend){var t=e.unsuspend;e.unsuspend=null,t()}}}function Fi(){this.count--,g0(this)}function Gg(){this.imgCount--,g0(this)}var ko=null;function wo(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,ko=new Map,t.forEach(Bg,e),ko=null,Fi.call(e))}function Bg(e,t){if(!(t.state.loading&4)){var n=ko.get(e);if(n)var r=n.get(null);else{n=new Map,ko.set(e,n);for(var l=e.querySelectorAll("link[data-precedence],style[data-precedence]"),i=0;i"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(x)}catch(d){console.error(d)}}return x(),pu.exports=rb(),pu.exports}var ib=lb();const sb=af(ib);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const ob=x=>x.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),nf=(...x)=>x.filter((d,w,u)=>!!d&&d.trim()!==""&&u.indexOf(d)===w).join(" ").trim();/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/var cb={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const db=p.forwardRef(({color:x="currentColor",size:d=24,strokeWidth:w=2,absoluteStrokeWidth:u,className:k="",children:L,iconNode:G,...B},ee)=>p.createElement("svg",{ref:ee,...cb,width:d,height:d,stroke:x,strokeWidth:u?Number(w)*24/Number(d):w,className:nf("lucide",k),...B},[...G.map(([F,H])=>p.createElement(F,H)),...Array.isArray(L)?L:[L]]));/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const re=(x,d)=>{const w=p.forwardRef(({className:u,...k},L)=>p.createElement(db,{ref:L,iconNode:d,className:nf(`lucide-${ob(x)}`,u),...k}));return w.displayName=`${x}`,w};/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const ub=[["path",{d:"M8 3 4 7l4 4",key:"9rb6wj"}],["path",{d:"M4 7h16",key:"6tx8e3"}],["path",{d:"m16 21 4-4-4-4",key:"siv7j2"}],["path",{d:"M20 17H4",key:"h6l3hr"}]],pb=re("ArrowLeftRight",ub);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const mb=[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]],rf=re("ArrowLeft",mb);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const hb=[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]],_o=re("ArrowRight",hb);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const fb=[["path",{d:"m15.477 12.89 1.515 8.526a.5.5 0 0 1-.81.47l-3.58-2.687a1 1 0 0 0-1.197 0l-3.586 2.686a.5.5 0 0 1-.81-.469l1.514-8.526",key:"1yiouv"}],["circle",{cx:"12",cy:"8",r:"6",key:"1vp47v"}]],Ln=re("Award",fb);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const xb=[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z",key:"ruj8y"}]],Ho=re("BookOpen",xb);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const gb=[["path",{d:"m19 21-7-4-7 4V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2v16z",key:"1fy3hk"}]],bb=re("Bookmark",gb);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const yb=[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]],Mn=re("Bot",yb);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const vb=[["path",{d:"M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z",key:"l5xja"}],["path",{d:"M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.526 5.77 4 4 0 0 1-.556 6.588A4 4 0 1 1 12 18Z",key:"ep3f8r"}],["path",{d:"M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4",key:"1p4c4q"}],["path",{d:"M17.599 6.5a3 3 0 0 0 .399-1.375",key:"tmeiqw"}],["path",{d:"M6.003 5.125A3 3 0 0 0 6.401 6.5",key:"105sqy"}],["path",{d:"M3.477 10.896a4 4 0 0 1 .585-.396",key:"ql3yin"}],["path",{d:"M19.938 10.5a4 4 0 0 1 .585.396",key:"1qfode"}],["path",{d:"M6 18a4 4 0 0 1-1.967-.516",key:"2e4loj"}],["path",{d:"M19.967 17.484A4 4 0 0 1 18 18",key:"159ez6"}]],Yi=re("Brain",vb);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Sb=[["path",{d:"m8 2 1.88 1.88",key:"fmnt4t"}],["path",{d:"M14.12 3.88 16 2",key:"qol33r"}],["path",{d:"M9 7.13v-1a3.003 3.003 0 1 1 6 0v1",key:"d7y7pr"}],["path",{d:"M12 20c-3.3 0-6-2.7-6-6v-3a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v3c0 3.3-2.7 6-6 6",key:"xs1cw7"}],["path",{d:"M12 20v-9",key:"1qisl0"}],["path",{d:"M6.53 9C4.6 8.8 3 7.1 3 5",key:"32zzws"}],["path",{d:"M6 13H2",key:"82j7cp"}],["path",{d:"M3 21c0-2.1 1.7-3.9 3.8-4",key:"4p0ekp"}],["path",{d:"M20.97 5c0 2.1-1.6 3.8-3.5 4",key:"18gb23"}],["path",{d:"M22 13h-4",key:"1jl80f"}],["path",{d:"M17.2 17c2.1.1 3.8 1.9 3.8 4",key:"k3fwyw"}]],Ji=re("Bug",Sb);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const kb=[["path",{d:"M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z",key:"1tc9qg"}],["circle",{cx:"12",cy:"13",r:"3",key:"1vg3eu"}]],wb=re("Camera",kb);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Nb=[["path",{d:"M19 17h2c.6 0 1-.4 1-1v-3c0-.9-.7-1.7-1.5-1.9C18.7 10.6 16 10 16 10s-1.3-1.4-2.2-2.3c-.5-.4-1.1-.7-1.8-.7H5c-.6 0-1.1.4-1.4.9l-1.4 2.9A3.7 3.7 0 0 0 2 12v4c0 .6.4 1 1 1h2",key:"5owen"}],["circle",{cx:"7",cy:"17",r:"2",key:"u2ysq9"}],["path",{d:"M9 17h6",key:"r8uit2"}],["circle",{cx:"17",cy:"17",r:"2",key:"axvx0g"}]],Eb=re("Car",Nb);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const jb=[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]],la=re("Check",jb);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Tb=[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]],Cb=re("ChevronDown",Tb);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Ab=[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]],lf=re("ChevronLeft",Ab);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const zb=[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]],Wt=re("ChevronRight",zb);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Lb=[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]],Mb=re("ChevronUp",Lb);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Rb=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]],Db=re("CircleAlert",Rb);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const _b=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]],bt=re("CircleCheck",_b);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Ib=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3",key:"1u773s"}],["path",{d:"M12 17h.01",key:"p32p05"}]],Lu=re("CircleHelp",Ib);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Ob=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"m15 9-6 6",key:"1uzhvr"}],["path",{d:"m9 9 6 6",key:"z0biqf"}]],sf=re("CircleX",Ob);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Pb=[["path",{d:"M20.2 6 3 11l-.9-2.4c-.3-1.1.3-2.2 1.3-2.5l13.5-4c1.1-.3 2.2.3 2.5 1.3Z",key:"1tn4o7"}],["path",{d:"m6.2 5.3 3.1 3.9",key:"iuk76l"}],["path",{d:"m12.4 3.4 3.1 4",key:"6hsd6n"}],["path",{d:"M3 11h18v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2Z",key:"ltgou9"}]],Gb=re("Clapperboard",Pb);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Bb=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polyline",{points:"12 6 12 12 16 14",key:"68esgv"}]],of=re("Clock",Bb);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Hb=[["path",{d:"M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z",key:"p7xjir"}]],Ub=re("Cloud",Hb);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Vb=[["path",{d:"m18 16 4-4-4-4",key:"1inbqp"}],["path",{d:"m6 8-4 4 4 4",key:"15zrgr"}],["path",{d:"m14.5 4-5 16",key:"e7oirm"}]],Fb=re("CodeXml",Vb);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Kb=[["path",{d:"m16.24 7.76-1.804 5.411a2 2 0 0 1-1.265 1.265L7.76 16.24l1.804-5.411a2 2 0 0 1 1.265-1.265z",key:"9ktpf1"}],["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]],Io=re("Compass",Kb);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Wb=[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]],it=re("Copy",Wb);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Qb=[["rect",{width:"16",height:"16",x:"4",y:"4",rx:"2",key:"14l7u7"}],["rect",{width:"6",height:"6",x:"9",y:"9",rx:"1",key:"5aljv4"}],["path",{d:"M15 2v2",key:"13l42r"}],["path",{d:"M15 20v2",key:"15mkzm"}],["path",{d:"M2 15h2",key:"1gxd5l"}],["path",{d:"M2 9h2",key:"1bbxkp"}],["path",{d:"M20 15h2",key:"19e6y8"}],["path",{d:"M20 9h2",key:"19tzq7"}],["path",{d:"M9 2v2",key:"165o2o"}],["path",{d:"M9 20v2",key:"i2bqo8"}]],Mu=re("Cpu",Qb);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const qb=[["path",{d:"M11.562 3.266a.5.5 0 0 1 .876 0L15.39 8.87a1 1 0 0 0 1.516.294L21.183 5.5a.5.5 0 0 1 .798.519l-2.834 10.246a1 1 0 0 1-.956.734H5.81a1 1 0 0 1-.957-.734L2.02 6.02a.5.5 0 0 1 .798-.519l4.276 3.664a1 1 0 0 0 1.516-.294z",key:"1vdc57"}],["path",{d:"M5 21h14",key:"11awu3"}]],Xb=re("Crown",qb);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Zb=[["ellipse",{cx:"12",cy:"5",rx:"9",ry:"3",key:"msslwz"}],["path",{d:"M3 5V19A9 3 0 0 0 21 19V5",key:"1wlel7"}],["path",{d:"M3 12A9 3 0 0 0 21 12",key:"mv7ke4"}]],cf=re("Database",Zb);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Yb=[["line",{x1:"12",x2:"12",y1:"2",y2:"22",key:"7eqyqh"}],["path",{d:"M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6",key:"1b0p4s"}]],Jb=re("DollarSign",Yb);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const $b=[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"7 10 12 15 17 10",key:"2ggqvy"}],["line",{x1:"12",x2:"12",y1:"15",y2:"3",key:"1vk2je"}]],Zi=re("Download",$b);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const ey=[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]],ty=re("ExternalLink",ey);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const ay=[["path",{d:"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",key:"1nclc0"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]],df=re("Eye",ay);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const ny=[["path",{d:"M4 22h14a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v4",key:"1pf5j1"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"m5 12-3 3 3 3",key:"oke12k"}],["path",{d:"m9 18 3-3-3-3",key:"112psh"}]],H0=re("FileCode2",ny);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const ry=[["path",{d:"M10 12.5 8 15l2 2.5",key:"1tg20x"}],["path",{d:"m14 12.5 2 2.5-2 2.5",key:"yinavb"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z",key:"1mlx9k"}]],U0=re("FileCode",ry);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const ly=[["path",{d:"M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z",key:"96xj49"}]],Qr=re("Flame",ly);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const iy=[["path",{d:"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z",key:"1kt360"}],["path",{d:"M12 10v6",key:"1bos4e"}],["path",{d:"m15 13-3 3-3-3",key:"6j2sf0"}]],vu=re("FolderDown",iy);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const sy=[["path",{d:"m12 14 4-4",key:"9kzdfg"}],["path",{d:"M3.34 19a10 10 0 1 1 17.32 0",key:"19p75a"}]],Ru=re("Gauge",sy);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const oy=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20",key:"13o1zl"}],["path",{d:"M2 12h20",key:"9i4pu4"}]],uf=re("Globe",oy);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const cy=[["path",{d:"M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z",key:"c3ymky"}]],dy=re("Heart",cy);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const uy=[["path",{d:"M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8",key:"5wwlr5"}],["path",{d:"M3 10a2 2 0 0 1 .709-1.528l7-5.999a2 2 0 0 1 2.582 0l7 5.999A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z",key:"1d0kgt"}]],Su=re("House",uy);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const py=[["path",{d:"m15.5 7.5 2.3 2.3a1 1 0 0 0 1.4 0l2.1-2.1a1 1 0 0 0 0-1.4L19 4",key:"g0fldk"}],["path",{d:"m21 2-9.6 9.6",key:"1j0ho8"}],["circle",{cx:"7.5",cy:"15.5",r:"5.5",key:"yqb3hr"}]],V0=re("Key",py);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const my=[["path",{d:"M20 16V7a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v9m16 0H4m16 0 1.28 2.55a1 1 0 0 1-.9 1.45H3.62a1 1 0 0 1-.9-1.45L4 16",key:"tarvll"}]],Du=re("Laptop",my);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const hy=[["path",{d:"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z",key:"zw3jo"}],["path",{d:"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12",key:"1wduqc"}],["path",{d:"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17",key:"kqbvx6"}]],$i=re("Layers",hy);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const fy=[["path",{d:"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5",key:"1gvzjb"}],["path",{d:"M9 18h6",key:"x1upvd"}],["path",{d:"M10 22h4",key:"ceow96"}]],ku=re("Lightbulb",fy);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const xy=[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]],_u=re("Lock",xy);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const gy=[["path",{d:"M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0",key:"1r0f0z"}],["circle",{cx:"12",cy:"10",r:"3",key:"ilqhr7"}]],by=re("MapPin",gy);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const yy=[["path",{d:"M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z",key:"169xi5"}],["path",{d:"M15 5.764v15",key:"1pn4in"}],["path",{d:"M9 3.236v15",key:"1uimfh"}]],wu=re("Map",yy);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const vy=[["polyline",{points:"15 3 21 3 21 9",key:"mznyad"}],["polyline",{points:"9 21 3 21 3 15",key:"1avn1i"}],["line",{x1:"21",x2:"14",y1:"3",y2:"10",key:"ota7mn"}],["line",{x1:"3",x2:"10",y1:"21",y2:"14",key:"1atl0r"}]],Sy=re("Maximize2",vy);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const ky=[["polyline",{points:"4 14 10 14 10 20",key:"11kfnr"}],["polyline",{points:"20 10 14 10 14 4",key:"rlmsce"}],["line",{x1:"14",x2:"21",y1:"10",y2:"3",key:"o5lafz"}],["line",{x1:"3",x2:"10",y1:"21",y2:"14",key:"1atl0r"}]],wy=re("Minimize2",ky);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Ny=[["path",{d:"M5 12h14",key:"1ays0h"}]],Ey=re("Minus",Ny);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const jy=[["rect",{width:"20",height:"14",x:"2",y:"3",rx:"2",key:"48i651"}],["line",{x1:"8",x2:"16",y1:"21",y2:"21",key:"1svkeh"}],["line",{x1:"12",x2:"12",y1:"17",y2:"21",key:"vw1qmm"}]],Ty=re("Monitor",jy);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Cy=[["path",{d:"M12 16h.01",key:"1drbdi"}],["path",{d:"M12 8v4",key:"1got3b"}],["path",{d:"M15.312 2a2 2 0 0 1 1.414.586l4.688 4.688A2 2 0 0 1 22 8.688v6.624a2 2 0 0 1-.586 1.414l-4.688 4.688a2 2 0 0 1-1.414.586H8.688a2 2 0 0 1-1.414-.586l-4.688-4.688A2 2 0 0 1 2 15.312V8.688a2 2 0 0 1 .586-1.414l4.688-4.688A2 2 0 0 1 8.688 2z",key:"1fd625"}]],Ay=re("OctagonAlert",Cy);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const zy=[["circle",{cx:"13.5",cy:"6.5",r:".5",fill:"currentColor",key:"1okk4w"}],["circle",{cx:"17.5",cy:"10.5",r:".5",fill:"currentColor",key:"f64h9f"}],["circle",{cx:"8.5",cy:"7.5",r:".5",fill:"currentColor",key:"fotxhn"}],["circle",{cx:"6.5",cy:"12.5",r:".5",fill:"currentColor",key:"qy21gx"}],["path",{d:"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10c.926 0 1.648-.746 1.648-1.688 0-.437-.18-.835-.437-1.125-.29-.289-.438-.652-.438-1.125a1.64 1.64 0 0 1 1.668-1.668h1.996c3.051 0 5.555-2.503 5.555-5.554C21.965 6.012 17.461 2 12 2z",key:"12rzf8"}]],Ly=re("Palette",zy);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const My=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M9 3v18",key:"fh3hqa"}],["path",{d:"m16 15-3-3 3-3",key:"14y99z"}]],Ry=re("PanelLeftClose",My);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Dy=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M9 3v18",key:"fh3hqa"}],["path",{d:"m14 9 3 3-3 3",key:"8010ee"}]],_y=re("PanelLeftOpen",Dy);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Iy=[["path",{d:"M12 20h9",key:"t2du7b"}],["path",{d:"M16.376 3.622a1 1 0 0 1 3.002 3.002L7.368 18.635a2 2 0 0 1-.855.506l-2.872.838a.5.5 0 0 1-.62-.62l.838-2.872a2 2 0 0 1 .506-.854z",key:"1ykcvy"}]],pf=re("PenLine",Iy);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Oy=[["polygon",{points:"6 3 20 12 6 21 6 3",key:"1oa8hb"}]],xa=re("Play",Oy);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Py=[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]],Gy=re("Plus",Py);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const By=[["path",{d:"M4.9 19.1C1 15.2 1 8.8 4.9 4.9",key:"1vaf9d"}],["path",{d:"M7.8 16.2c-2.3-2.3-2.3-6.1 0-8.5",key:"u1ii0m"}],["circle",{cx:"12",cy:"12",r:"2",key:"1c9p78"}],["path",{d:"M16.2 7.8c2.3 2.3 2.3 6.1 0 8.5",key:"1j5fej"}],["path",{d:"M19.1 4.9C23 8.8 23 15.1 19.1 19",key:"10b0cb"}]],mf=re("Radio",By);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Hy=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]],xu=re("RefreshCw",Hy);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Uy=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}]],Rn=re("RotateCcw",Uy);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Vy=[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]],Uo=re("Search",Vy);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Fy=[["path",{d:"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z",key:"1ffxy3"}],["path",{d:"m21.854 2.147-10.94 10.939",key:"12cjpa"}]],Vo=re("Send",Fy);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Ky=[["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}],["path",{d:"M4.5 10H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-.5",key:"tn8das"}],["path",{d:"M4.5 14H4a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-4a2 2 0 0 0-2-2h-.5",key:"1g2pve"}],["path",{d:"M6 6h.01",key:"1utrut"}],["path",{d:"M6 18h.01",key:"uhywen"}],["path",{d:"m15.7 13.4-.9-.3",key:"1jwmzr"}],["path",{d:"m9.2 10.9-.9-.3",key:"qapnim"}],["path",{d:"m10.6 15.7.3-.9",key:"quwk0k"}],["path",{d:"m13.6 15.7-.4-1",key:"cb9xp7"}],["path",{d:"m10.8 9.3-.4-1",key:"1uaiz5"}],["path",{d:"m8.3 13.6 1-.4",key:"s6srou"}],["path",{d:"m14.7 10.8 1-.4",key:"4d31cq"}],["path",{d:"m13.4 8.3-.3.9",key:"1bm987"}]],hf=re("ServerCog",Ky);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Wy=[["rect",{width:"20",height:"8",x:"2",y:"2",rx:"2",ry:"2",key:"ngkwjq"}],["rect",{width:"20",height:"8",x:"2",y:"14",rx:"2",ry:"2",key:"iecqi9"}],["line",{x1:"6",x2:"6.01",y1:"6",y2:"6",key:"16zg32"}],["line",{x1:"6",x2:"6.01",y1:"18",y2:"18",key:"nzw8ys"}]],Qy=re("Server",Wy);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const qy=[["circle",{cx:"18",cy:"5",r:"3",key:"gq8acd"}],["circle",{cx:"6",cy:"12",r:"3",key:"w7nqdw"}],["circle",{cx:"18",cy:"19",r:"3",key:"1xt0gg"}],["line",{x1:"8.59",x2:"15.42",y1:"13.51",y2:"17.49",key:"47mynk"}],["line",{x1:"15.41",x2:"8.59",y1:"6.51",y2:"10.49",key:"1n3mei"}]],ff=re("Share2",qy);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Xy=[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"M12 8v4",key:"1got3b"}],["path",{d:"M12 16h.01",key:"1drbdi"}]],Wr=re("ShieldAlert",Xy);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Zy=[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]],Nu=re("ShieldCheck",Zy);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Yy=[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]],Jy=re("Shield",Yy);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const $y=[["path",{d:"m18 14 4 4-4 4",key:"10pe0f"}],["path",{d:"m18 2 4 4-4 4",key:"pucp1d"}],["path",{d:"M2 18h1.973a4 4 0 0 0 3.3-1.7l5.454-8.6a4 4 0 0 1 3.3-1.7H22",key:"1ailkh"}],["path",{d:"M2 6h1.972a4 4 0 0 1 3.6 2.2",key:"km57vx"}],["path",{d:"M22 18h-6.041a4 4 0 0 1-3.3-1.8l-.359-.45",key:"os18l9"}]],xf=re("Shuffle",$y);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const ev=[["line",{x1:"4",x2:"4",y1:"21",y2:"14",key:"1p332r"}],["line",{x1:"4",x2:"4",y1:"10",y2:"3",key:"gb41h5"}],["line",{x1:"12",x2:"12",y1:"21",y2:"12",key:"hf2csr"}],["line",{x1:"12",x2:"12",y1:"8",y2:"3",key:"1kfi7u"}],["line",{x1:"20",x2:"20",y1:"21",y2:"16",key:"1lhrwl"}],["line",{x1:"20",x2:"20",y1:"12",y2:"3",key:"16vvfq"}],["line",{x1:"2",x2:"6",y1:"14",y2:"14",key:"1uebub"}],["line",{x1:"10",x2:"14",y1:"8",y2:"8",key:"1yglbp"}],["line",{x1:"18",x2:"22",y1:"16",y2:"16",key:"1jxqpz"}]],Fl=re("SlidersVertical",ev);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const tv=[["rect",{width:"14",height:"20",x:"5",y:"2",rx:"2",ry:"2",key:"1yt0o3"}],["path",{d:"M12 18h.01",key:"mhygvu"}]],F0=re("Smartphone",tv);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const av=[["path",{d:"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z",key:"4pj2yx"}],["path",{d:"M20 3v4",key:"1olli1"}],["path",{d:"M22 5h-4",key:"1gvqau"}],["path",{d:"M4 17v2",key:"vumght"}],["path",{d:"M5 18H3",key:"zchphs"}]],Lt=re("Sparkles",av);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const nv=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}]],rv=re("Square",nv);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const lv=[["polyline",{points:"14.5 17.5 3 6 3 3 6 3 17.5 14.5",key:"1hfsw2"}],["line",{x1:"13",x2:"19",y1:"19",y2:"13",key:"1vrmhu"}],["line",{x1:"16",x2:"20",y1:"16",y2:"20",key:"1bron3"}],["line",{x1:"19",x2:"21",y1:"21",y2:"19",key:"13pww6"}],["polyline",{points:"14.5 6.5 18 3 21 3 21 6 17.5 9.5",key:"hbey2j"}],["line",{x1:"5",x2:"9",y1:"14",y2:"18",key:"1hf58s"}],["line",{x1:"7",x2:"4",y1:"17",y2:"20",key:"pidxm4"}],["line",{x1:"3",x2:"5",y1:"19",y2:"21",key:"1pehsh"}]],Iu=re("Swords",lv);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const iv=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["circle",{cx:"12",cy:"12",r:"6",key:"1vlfrh"}],["circle",{cx:"12",cy:"12",r:"2",key:"1c9p78"}]],gf=re("Target",iv);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const sv=[["polyline",{points:"4 17 10 11 4 5",key:"akl6gq"}],["line",{x1:"12",x2:"20",y1:"19",y2:"19",key:"q2wloq"}]],Wl=re("Terminal",sv);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const ov=[["line",{x1:"10",x2:"14",y1:"2",y2:"2",key:"14vaq8"}],["line",{x1:"12",x2:"15",y1:"14",y2:"11",key:"17fdiu"}],["circle",{cx:"12",cy:"14",r:"8",key:"1e1u0o"}]],cv=re("Timer",ov);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const dv=[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]],Eu=re("Trash2",dv);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const uv=[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]],Oo=re("TriangleAlert",uv);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const pv=[["path",{d:"M6 9H4.5a2.5 2.5 0 0 1 0-5H6",key:"17hqa7"}],["path",{d:"M18 9h1.5a2.5 2.5 0 0 0 0-5H18",key:"lmptdp"}],["path",{d:"M4 22h16",key:"57wxv0"}],["path",{d:"M10 14.66V17c0 .55-.47.98-.97 1.21C7.85 18.75 7 20.24 7 22",key:"1nw9bq"}],["path",{d:"M14 14.66V17c0 .55.47.98.97 1.21C16.15 18.75 17 20.24 17 22",key:"1np0yb"}],["path",{d:"M18 2H6v7a6 6 0 0 0 12 0V2Z",key:"u46fv3"}]],Fo=re("Trophy",pv);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const mv=[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"17 8 12 3 7 8",key:"t8dd8p"}],["line",{x1:"12",x2:"12",y1:"3",y2:"15",key:"widbto"}]],gu=re("Upload",mv);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const hv=[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2",key:"975kel"}],["circle",{cx:"12",cy:"7",r:"4",key:"17ys0d"}]],ju=re("User",hv);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const fv=[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}],["path",{d:"M22 21v-2a4 4 0 0 0-3-3.87",key:"kshegd"}],["path",{d:"M16 3.13a4 4 0 0 1 0 7.75",key:"1da9ce"}]],K0=re("Users",fv);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const xv=[["path",{d:"M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z",key:"uqj9uw"}],["path",{d:"M16 9a5 5 0 0 1 0 6",key:"1q6k2b"}],["path",{d:"M19.364 18.364a9 9 0 0 0 0-12.728",key:"ijwkga"}]],Po=re("Volume2",xv);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const gv=[["path",{d:"M11 4.702a.705.705 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.705.705 0 0 0 11 19.298z",key:"uqj9uw"}],["line",{x1:"22",x2:"16",y1:"9",y2:"15",key:"1ewh16"}],["line",{x1:"16",x2:"22",y1:"9",y2:"15",key:"5ykzw1"}]],Go=re("VolumeX",gv);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const bv=[["path",{d:"M18 16.98h-5.99c-1.1 0-1.95.94-2.48 1.9A4 4 0 0 1 2 17c.01-.7.2-1.4.57-2",key:"q3hayz"}],["path",{d:"m6 17 3.13-5.78c.53-.97.1-2.18-.5-3.1a4 4 0 1 1 6.89-4.06",key:"1go1hn"}],["path",{d:"m12 6 3.13 5.73C15.66 12.7 16.9 13 18 13a4 4 0 0 1 0 8",key:"qlwsc0"}]],bf=re("Webhook",bv);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const yv=[["path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z",key:"cbrjhi"}]],Bo=re("Wrench",yv);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const vv=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],ia=re("X",vv);/**
* @license lucide-react v0.475.0 - ISC
*
* This source code is licensed under the ISC license.
* See the LICENSE file in the root directory of this source tree.
*/const Sv=[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]],Kl=re("Zap",Sv),kv=[{id:"lvl-1",levelNumber:1,chapterId:1,chapterTitle:"Kapitel 1: Erste Schritte in Lua",title:"Hallo Game Engine! Dein erster Befehl",subtitle:"Wie du mit print() Nachrichten in die Server-Konsole schreibst",language:"LUA",xpReward:50,steps:[{id:"1-1",type:"CONCEPT",badge:"NEUES KONZEPT",title:"Mit dem Spiel sprechen: print()",explanation:"Willkommen! Wir fangen ganz entspannt bei null an.\n\nWenn du möchtest, dass dein Game-Skript eine Nachricht in die Konsole (Taste F8 im Spiel) schreibt, nutzt du den Befehl `print()`. Klicke unten auf die Code-Zeile, um genau zu sehen, was jedes Zeichen macht!",analogyTip:"Denk an print() wie an eine WhatsApp-Nachricht von deinem Skript an dich: Du siehst sofort, ob dein Code lebt!",visualLines:[{code:'print("Hallo Game World!")',whatItDoes:'Gibt den Text "Hallo Game World!" direkt in der Game Engine F8-Konsole aus.',whyWeUseIt:'print() ist der Befehl, die Klammern () starten die Aktion und die Anführungszeichen "" zeigen Lua, dass es sich um Text handelt.',visualOutput:"[F8 Konsole] > Hallo Game Engine!"}],consolePreview:"Hallo Game World!",successExplanation:"Verstanden! Lass uns das direkt mit einem Klick ausprobieren."},{id:"1-2",type:"TAP_FILL",badge:"LÜCKENTEXT (TIPPEN)",title:"Baue deinen ersten print-Befehl",explanation:'Tippe unten auf den richtigen Baustein, um den Text `"Starte Server"` in der Konsole auszugeben.',codeTemplate:'___1___("Starte Server")',blanksCount:1,wordBank:["print","show","write","text"],correctWords:["print"],consolePreview:"Starte Server",successExplanation:"Stark! Mit print(...) gibst du jederzeit Nachrichten in der Konsole aus."},{id:"1-3",type:"CHOICE",badge:"KURZ-CHECK",title:'Warum brauchen wir Anführungszeichen ""?',explanation:'Schau dir diesen Befehl an: `print("Garage bereit")`.\nWarum steht `"Garage bereit"` in Anführungszeichen?',codeSnippet:'print("Garage bereit")',options:["Damit Lua erkennt, dass es normaler Text (ein sogenannter String) ist","Damit der Text in der Konsole lila leuchtet","Weil Lua sonst das Spiel beendet"],correctOptionIndex:0,successExplanation:'Genau richtig! Text heißt beim Programmieren "String" und steht immer in Anführungszeichen.'},{id:"1-4",type:"TAP_FILL",badge:"KOMPLETTIEREN",title:"Schreibe deinen eigenen Konsolen-Text",explanation:"Füge die beiden fehlenden Teile in der richtigen Reihenfolge durch Antippen ein:",codeTemplate:"___1___(___2___)",blanksCount:2,wordBank:['"Server Ready"',"print","console","123"],correctWords:["print",'"Server Ready"'],consolePreview:"Server Ready",successExplanation:"Level 1 gemeistert! Du hast deinen allerersten Lua-Befehl erfolgreich zusammengesetzt."}]},{id:"lvl-2",levelNumber:2,chapterId:1,chapterTitle:"Kapitel 1: Erste Schritte in Lua",title:"Lokale Variablen (local)",subtitle:"Wie sich dein Skript Namen und Werte im Arbeitsspeicher merkt",language:"LUA",xpReward:60,steps:[{id:"2-1",type:"CONCEPT",badge:"NEUES KONZEPT",title:"Das Gedächtnis deines Skripts: local",explanation:"Um uns Dinge wie den Spielernamen oder den Kontostand zu merken, speichern wir sie in einer **Variable**.\n\nIn Game Engine schreiben wir davor immer das Wort `local`. Klicke unten auf die beiden Zeilen, um den visuellen Ablauf zu sehen!",analogyTip:'Eine Variable ist wie ein beschrifteter Karton. Mit `local name = "Max"` klebst du das Etikett `name` auf den Karton und legst `"Max"` hinein.',visualLines:[{code:'local playerName = "Max"',whatItDoes:'Erstellt eine lokale Variable namens "playerName" und legt den Text "Max" hinein.',whyWeUseIt:'Das Wort "local" sorgt dafür, dass die Variable blitzschnell im Speicher liegt und kein anderes Skript auf dem Server stört.',visualOutput:'RAM Speicher: playerName = "Max"'},{code:"print(playerName)",whatItDoes:'Liest den Inhalt aus der Variable "playerName" und gibt ihn in der Konsole aus.',whyWeUseIt:"Hier schreiben wir KEINE Anführungszeichen um playerName, weil wir den Inhalt der Variable wollen!",visualOutput:"[F8 Konsole] > Max"}],consolePreview:"Max",successExplanation:"Super! Jetzt testen wir das direkt in einer kurzen Übung."},{id:"2-2",type:"TAP_FILL",badge:"BAUSTEINE TIPPEN",title:"Erstelle eine lokale Variable",explanation:'Speichere das Fahrzeugmodell `"sultan"` in einer lokalen Variable namens `carModel`:',codeTemplate:'___1___ ___2___ = "sultan"',blanksCount:2,wordBank:["local","carModel","print","global"],correctWords:["local","carModel"],consolePreview:'RAM: carModel -> "sultan"',successExplanation:'Perfekt! `local carModel = "sultan"` legt die Variable sauber und schnell an.'},{id:"2-3",type:"CHOICE",badge:"VERSTÄNDNIS",title:"Mit oder ohne Anführungszeichen?",explanation:"Was gibt dieser Code in der Konsole aus?",codeSnippet:`local job = "Polizist"
print(job)`,options:["Polizist (den gespeicherten Inhalt der Variable)","job (das Wort job)","Einen Fehler"],correctOptionIndex:0,successExplanation:"Richtig! Da `job` ohne Anführungszeichen in `print(job)` steht, schaut Lua in die Variable hinein und gibt `Polizist` aus."}]},{id:"lvl-3",levelNumber:3,chapterId:1,chapterTitle:"Kapitel 1: Erste Schritte in Lua",title:"Zahlen, Geld & Wahrheitswerte (true/false)",subtitle:"Mit Bargeld rechnen und Schalter auf An oder Aus stellen",language:"LUA",xpReward:70,steps:[{id:"3-1",type:"CONCEPT",badge:"DATENTYPEN",title:"Zahlen (Numbers) & Schalter (Booleans)",explanation:'Neben Text (`"String"`) gibt es zwei weitere extrem wichtige Datentypen in Game Engine:\n\n1. **Zahlen** (ohne Anführungszeichen!), z. B. `2500` für Bargeld.\n2. **Booleans** (`true` = Ja/An oder `false` = Nein/Aus), z. B. ob der Motor läuft.',visualLines:[{code:"local cash = 2500",whatItDoes:"Speichert die Zahl 2500 in der Variable cash.",whyWeUseIt:"Ohne Anführungszeichen erkennt Lua, dass es eine echte Zahl ist, mit der wir plus und minus rechnen können!",visualOutput:"Bargeld im RAM: $2500"},{code:"local engineOn = true",whatItDoes:'Stellt den Schalter "engineOn" auf true (Wahr / Eingeschaltet).',whyWeUseIt:"Ideal für Prüfungen: Ist der Motor an (true) oder aus (false)?",visualOutput:"Motor-Status: AN (true)"},{code:"cash = cash - 500",whatItDoes:"Zieht 500 von cash ab und speichert das neue Ergebnis (2000) wieder in cash.",whyWeUseIt:"So ziehst du dem Spieler z. B. beim Ausparken oder im Shop Gebühren ab.",visualOutput:"Bargeld neu: $2000 (-$500)"}],consolePreview:"Neues Bargeld: 2000 | engineOn: true",successExplanation:"Glasklar! Lass uns kurz damit rechnen."},{id:"3-2",type:"TAP_FILL",badge:"LÜCKENTEXT",title:"Schalte das Fahrzeuglicht ein",explanation:"Setze das Startgeld auf `1000` und den Licht-Schalter `lightsOn` auf wahr (`true`):",codeTemplate:`local money = ___1___
local lightsOn = ___2___`,blanksCount:2,wordBank:["1000","true",'"false"',"print"],correctWords:["1000","true"],consolePreview:"money = 1000 | lightsOn = true",successExplanation:"Perfekt! Zahlen und true/false werden niemals in Anführungszeichen gesetzt."},{id:"3-3",type:"FIX_BUG",badge:"FEHLER FINDEN",title:"Texte & Variablen verbinden mit ..",explanation:"In Lua verbindet man Text und Variablen mit **zwei Punkten** (`..`). Welche Zeile ist korrekt geschrieben?",codeSnippet:`local price = 250
-- Wie geben wir "Preis: 250" richtig aus?`,options:['print("Preis: " .. price)','print("Preis: " & price)','print("Preis: " ,+ price)'],correctOptionIndex:0,successExplanation:"Stark! Der `..` Operator klebt in Lua Texte und Variablen nahtlos aneinander."}]},{id:"lvl-4",levelNumber:4,chapterId:2,chapterTitle:"Kapitel 2: Befehle & Entscheidungen (RegisterCommand)",title:"Wie nutzt man RegisterCommand?",subtitle:"Erstelle deinen ersten eigenen Chat-Befehl wie /car oder /help in Game Engine!",language:"LUA",xpReward:90,steps:[{id:"4-1",type:"CONCEPT",badge:"GAME KERN-FUNKTION",title:"Eigene Chat-Befehle mit RegisterCommand",explanation:"Hast du dich schon mal gefragt, wie auf Multiplayer-Servern Befehle wie `/dv`, `/car` oder `/garage` im Chat funktionieren?\n\nDafür gibt es in Game Engine die eingebaute Funktion `RegisterCommand`. Klicke unten auf jede der 3 Zeilen, um ihren Aufbau Schritt für Schritt zu sehen!",analogyTip:'RegisterCommand ist wie ein Sprachassistent: Du sagst ihm erst das Codewort (z.B. "hilfe") und danach, welche Funktion er ausführen soll, sobald jemand "/hilfe" im Spiel eintippt.',visualLines:[{code:'RegisterCommand("hilfe", function(source, args)',whatItDoes:'Registriert den neuen Befehl "/hilfe" in Game Engine und startet eine Funktion, sobald er eingegeben wird.',whyWeUseIt:'Der 1. Wert ("hilfe") ist der Name des Chat-Befehls (ohne Schrägstrich!). Der 2. Teil ist die Funktion, die dann ausgeführt wird.',visualOutput:"Chat-Befehl /hilfe ist jetzt im Spiel aktiv!"},{code:' print("Willkommen auf dem Server! Drücke F1 für das Menü.")',whatItDoes:"Dieser Code im Inneren wird jedes Mal ausgeführt, wenn der Spieler /hilfe eingibt.",whyWeUseIt:'Alles zwischen "function" und "end)" gehört zu deinem Befehl.',visualOutput:"[Spieler tippt /hilfe] -> Konsole: Willkommen auf dem Server!"},{code:"end, false)",whatItDoes:'Schließt die Funktion mit "end" ab. Das "false" am Ende bedeutet: Jeder Spieler darf den Befehl nutzen (keine Admin-Sperre).',whyWeUseIt:'Würdest du statt false dort "true" hinschreiben, dürften nur Server-Admins mit speziellen ACE-Rechten den Befehl ausführen!',visualOutput:"Berechtigung: Jeder Spieler (restricted = false)"}],consolePreview:"ChatInput: /hilfe -> Willkommen auf dem Server!",successExplanation:"Jetzt weißt du genau, wie RegisterCommand aufgebaut ist! Probieren wir es direkt aus."},{id:"4-2",type:"TAP_FILL",badge:"SELBST EINSETZEN",title:"Registriere den Befehl /garage",explanation:'Tippe auf die passenden Bausteine, um einen Befehl namens `"garage"` zu registrieren:',codeTemplate:`___1___(___2___, function()
print("Garage geöffnet!")
end, false)`,blanksCount:2,wordBank:["RegisterCommand",'"garage"',"CreateCommand","true"],correctWords:["RegisterCommand",'"garage"'],consolePreview:"Spieler tippt /garage -> Garage geöffnet!",successExplanation:"Perfekt! Sobald der Spieler jetzt im Spiel `/garage` im T-Chat eingibt, läuft dein Code los."},{id:"4-3",type:"CHOICE",badge:"WIESO & WESHALB",title:'Was bewirkt das "false" ganz am Ende von RegisterCommand?',explanation:"Schau dir die letzte Zeile an: `end, false)`. Wofür steht dieses `false`?",codeSnippet:`RegisterCommand("heal", function()
-- Code
end, false)`,options:['Es bedeutet "nicht eingeschränkt" – jeder normale Spieler darf den Befehl nutzen (bei true nur Admins)',"Es schaltet den Befehl komplett aus","Es löscht den Chatverlauf"],correctOptionIndex:0,successExplanation:"Genau! Der 3. Parameter heißt `restricted` (eingeschränkt). `false` = für alle Spieler, `true` = nur für Admins."},{id:"4-4",type:"ARRANGE_LINES",badge:"ZEILEN SORTIEREN",title:"Bringe den /motor Befehl in die richtige Reihenfolge",explanation:"Tippe die 3 Code-Zeilen in der richtigen Reihenfolge von oben nach unten an:",shuffledLines:[' print("Motor wurde gestartet!")',"end, false)",'RegisterCommand("motor", function()'],correctLineOrder:['RegisterCommand("motor", function()',' print("Motor wurde gestartet!")',"end, false)"],consolePreview:"/motor -> Motor wurde gestartet!",successExplanation:"Mega! Du kannst jetzt jederzeit eigene `/befehle` in Game Engine erstellen."}]},{id:"lvl-5",levelNumber:5,chapterId:2,chapterTitle:"Kapitel 2: Befehle & Entscheidungen (RegisterCommand)",title:"Entscheidungen treffen mit if, then & else",subtitle:"Prüfe, ob ein Spieler genug Geld zum Ausparken hat",language:"LUA",xpReward:95,steps:[{id:"5-1",type:"CONCEPT",badge:"LOGIK & ENTSCHEIDUNGEN",title:"Der Türsteher im Code: if ... then ... else ... end",explanation:"Fast jedes Skript muss Bedingungen prüfen: Hat der Spieler genug Geld? Besitzt er den Autoschlüssel?\n\nDafür nutzen wir `if` (wenn), `then` (dann), `else` (sonst) und am Ende `end`. Klicke auf die Zeilen!",visualLines:[{code:"local cash = 500",whatItDoes:"Speichert 500$ als aktuelles Bargeld des Spielers.",whyWeUseIt:"Unser Ausgangswert für die Prüfung.",visualOutput:"Spieler hat $500 dabei."},{code:"if cash >= 250 then",whatItDoes:"Prüft: Ist cash größer oder gleich (>=) 250?",whyWeUseIt:'Da 500 >= 250 WAHR ist, führt Lua den Block direkt nach "then" aus.',visualOutput:"Prüfung 500 >= 250 ist WAHR (true)!"},{code:' print("Auto erfolgreich ausgeparkt!")',whatItDoes:"Wird ausgeführt, weil die Bedingung erfüllt wurde.",whyWeUseIt:"Erfolgsmeldung für den Spieler.",visualOutput:"[Konsole] > Auto erfolgreich ausgeparkt!"},{code:`else
print("Nicht genug Geld!")
end`,whatItDoes:'Der "else"-Teil wird nur ausgeführt, wenn der Spieler weniger als 250$ hätte. "end" schließt den Block.',whyWeUseIt:'In Lua muss jede if-Abfrage zwingend mit dem Wort "end" abgeschlossen werden.',visualOutput:"If-Block sauber beendet."}],consolePreview:"Auto erfolgreich ausgeparkt!",successExplanation:"Sehr gut! Jetzt setzen wir selbst eine if-Abfrage zusammen."},{id:"5-2",type:"TAP_FILL",badge:"LÜCKENTEXT",title:"Prüfe den Tankstand des Autos",explanation:"Wenn der Tank (`fuel`) größer als `0` ist, soll das Auto starten. Tippe die fehlenden Schlüsselwörter an:",codeTemplate:`___1___ fuel > 0 ___2___
print("Motor startet")
___3___`,blanksCount:3,wordBank:["if","then","end","else","local"],correctWords:["if","then","end"],consolePreview:"Motor startet",successExplanation:"Die goldene Lua-Dreifaltigkeit: `if ... then ... end` sitzt perfekt!"},{id:"5-3",type:"CHOICE",badge:"VERGLEICHS-OPERATOR",title:"Wie prüft man auf exakte Gleichheit (==)?",explanation:'In Lua setzt ein einzelnes `=` einen Wert (`job = "police"`). Welches Zeichen nutzt man in einer `if`-Abfrage, um zu prüfen, ob zwei Werte **gleich** sind?',codeSnippet:`if job ___ "police" then
print("Dienst angetreten")
end`,options:["== (Zwei Gleichheitszeichen)","= (Ein Gleichheitszeichen)","=== (Drei Gleichheitszeichen)"],correctOptionIndex:0,successExplanation:"Wichtige Regel gemeistert: `=` speichert einen Wert, `==` vergleicht zwei Werte!"}]},{id:"lvl-6",levelNumber:6,chapterId:2,chapterTitle:"Kapitel 2: Befehle & Entscheidungen (RegisterCommand)",title:"Tabellen (Tables) & Fahrzeuglisten in Lua",subtitle:"Wie man mehrere Autos mit Kennzeichen und Tankstand organisiert",language:"LUA",xpReward:110,steps:[{id:"6-1",type:"CONCEPT",badge:"LUA TABLES {}",title:"Geschweifte Klammern {} speichern ganze Listen & Objekte",explanation:"Ein einzelnes Auto hat viele Eigenschaften: Modellname, Kennzeichen und Tankstand. In Lua bündeln wir solche Daten in einer **Table** (Tabelle) mit geschweiften Klammern `{ }`.\n\nKlicke durch die Zeilen, um zu sehen, wie wir mit einem Punkt `.` auf Werte zugreifen!",visualLines:[{code:'local myCar = { model = "adder", plate = "LS 999", fuel = 85 }',whatItDoes:'Erstellt eine Tabelle "myCar" mit 3 benannten Eigenschaften (model, plate, fuel).',whyWeUseIt:"So gehören alle Infos zu diesem Fahrzeug sauber zusammen in einer einzigen Variable.",visualOutput:'Table myCar: { model="adder", plate="LS 999", fuel=85 }'},{code:'print("Kennzeichen: " .. myCar.plate)',whatItDoes:"Greift mit dem Punkt-Operator (myCar.plate) direkt auf das Kennzeichen in der Tabelle zu.",whyWeUseIt:"Mit tabellenName.eigenschaft holst du gezielt genau den Wert heraus, den du brauchst.",visualOutput:"[Konsole] > Kennzeichen: LS 999"}],consolePreview:"Kennzeichen: LS 999",successExplanation:"Tabellen sind das Herzstück von Lua! Machen wir direkt den Test."},{id:"6-2",type:"TAP_FILL",badge:"LÜCKENTEXT",title:"Lies das Modell aus der Tabelle aus",explanation:"Erstelle die Tabelle mit `{` und `}` und gib danach das `model` des Fahrzeugs aus:",codeTemplate:`local car = ___1___ model = "elegy", fuel = 100 ___2___
print(car.___3___)`,blanksCount:3,wordBank:["{","}","model","(",")"],correctWords:["{","}","model"],consolePreview:"elegy",successExplanation:"Klasse! Geschweifte Klammern `{ }` erstellen die Tabelle und `car.model` liest den Wert aus."},{id:"6-3",type:"CHOICE",badge:"LUA BESONDERHEIT",title:"Bei welcher Nummer starten Listen in Lua?",explanation:'Wenn wir eine Liste aus Autos haben: `local cars = { "sultan", "adder", "krieger" }` – welchen Index hat `"sultan"` in Lua?',codeSnippet:`local cars = { "sultan", "adder", "krieger" }
print(cars[???]) -- soll "sultan" ausgeben`,options:["Index 1 -> cars[1] (In Lua fangen Listen immer bei 1 an!)","Index 0 -> cars[0]","Index -1 -> cars[-1]"],correctOptionIndex:0,successExplanation:"Goldrichtig! Anders als in JavaScript beginnt in Lua jede Liste bei `[1]`."}]}],wv=[{id:"lvl-7",levelNumber:7,chapterId:3,chapterTitle:"Kapitel 3: Multiplayer 3D-Welt, Marker & Threads",title:"3D-Koordinaten (vector3) & Spieler-Position",subtitle:"Wie du herausfindest, wo dein Charakter in GTA V steht",language:"LUA",xpReward:120,steps:[{id:"7-1",type:"CONCEPT",badge:"GAME 3D-WELT",title:"Wo bin ich? PlayerPedId() & GetEntityCoords()",explanation:"In GTA V hat jeder Ort drei Koordinaten: **X** (Ost/West), **Y** (Nord/Süd) und **Z** (Höhe). Game Engine speichert sie als `vector3(x, y, z)`.\n\nKlicke auf die Zeilen, um zu sehen, wie wir die aktuelle Position des Spielers abfragen!",visualLines:[{code:"local garagePos = vector3(215.8, -810.1, 30.7)",whatItDoes:"Speichert den festen 3D-Punkt der Würfelpark-Garage in einer Variable.",whyWeUseIt:"vector3() ist ein blitzschneller Datentyp direkt in Game Engine für 3D-Koordinaten.",visualOutput:"Ziel-Punkt: X=215.8, Y=-810.1, Z=30.7 (Legion Square)"},{code:"local ped = PlayerPedId()",whatItDoes:"Holt die Charakter-Figur (Ped) deines eigenen Spielers.",whyWeUseIt:"Fast jede GTA-Funktion will zuerst wissen: Welche Figur meinst du? PlayerPedId() bist immer du selbst!",visualOutput:"Spieler-Figur erkannt (Entity #1024)"},{code:"local myCoords = GetEntityCoords(ped)",whatItDoes:"Liest die aktuellen X, Y, Z Koordinaten deiner Figur aus.",whyWeUseIt:"Jetzt können wir berechnen, wie weit du von der Garage entfernt bist!",visualOutput:"Deine Position: vector3(214.5, -809.2, 30.7)"}],consolePreview:"Distanz zur Garage: 1.58 Meter",successExplanation:"Perfekt! Diese 3 Zeilen brauchst du in fast jedem Client-Skript."},{id:"7-2",type:"TAP_FILL",badge:"BAUSTEINE TIPPEN",title:"Hole die Koordinaten deiner Spieler-Figur",explanation:"Tippe die beiden Game Engine APIs in die Lücken, um deine Figur und ihre Position zu lesen:",codeTemplate:`local ped = ___1___()
local coords = ___2___(ped)`,blanksCount:2,wordBank:["PlayerPedId","GetEntityCoords","GetCar","vector3"],correctWords:["PlayerPedId","GetEntityCoords"],consolePreview:"coords = vector3(214.5, -809.2, 30.7)",successExplanation:"Stark! `PlayerPedId()` + `GetEntityCoords(ped)` sitzt!"},{id:"7-3",type:"CHOICE",badge:"PROFI-TRICK",title:"Abstand berechnen mit #(posA - posB)",explanation:"Wie berechnet man in modernem Game Engine-Lua am schnellsten die Entfernung in Metern zwischen `myCoords` und `garagePos`?",codeSnippet:"local dist = #(myCoords - garagePos)",options:["Mit #(myCoords - garagePos) – das #-Zeichen berechnet die Länge zwischen zwei vector3-Punkten in Metern","Mit myCoords + garagePos","Mit print(garagePos)"],correctOptionIndex:0,successExplanation:"Genau! `#(posA - posB)` ist der schnellste Weg für Distanz-Abfragen in Game Engine."}]},{id:"lvl-8",levelNumber:8,chapterId:3,chapterTitle:"Kapitel 3: Multiplayer 3D-Welt, Marker & Threads",title:"Threads, Wait() & 3D-Marker zeichnen",subtitle:"Warum eine Schleife ohne Wait() das Spiel einfriert und wie der 0.00ms Trick funktioniert",language:"LUA",xpReward:130,steps:[{id:"8-1",type:"CONCEPT",badge:"WICHTIGSTE ENGINE REGEL",title:"CreateThread & Wait() – Der Herzschlag deines Skripts",explanation:"Ein 3D-Marker auf dem Boden muss jeden einzelnen Grafik-Frame neu gezeichnet werden. Dafür nutzen wir eine Endlosschleife (`while true do`) in einem `CreateThread`.\n\n**WICHTIG:** Jede Schleife MUSS ein `Wait()` enthalten, damit das Spiel nicht abstürzt!",visualLines:[{code:`CreateThread(function()
while true do`,whatItDoes:"Startet eine dauerhafte Hintergrund-Schleife auf dem Client.",whyWeUseIt:"Prüft fortlaufend, ob sich der Spieler der Garage nähert.",visualOutput:"Hintergrund-Loop läuft..."},{code:" local sleep = 1000",whatItDoes:"Setzt die Pause standardmäßig auf 1000 Millisekunden (1 Sekunde).",whyWeUseIt:"Solange der Spieler weit weg ist, schläft das Skript fast durchgehend -> 0.00ms CPU-Verbrauch!",visualOutput:"Resmon-Verbrauch im Leerlauf: 0.00ms"},{code:` if dist < 15.0 then
sleep = 0
DrawMarker(2, pos.x, pos.y, pos.z, ...)
end`,whatItDoes:"Ist der Spieler näher als 15m, schalten wir sleep auf 0 (jeden Frame) und zeichnen den Marker!",whyWeUseIt:"So flackert der Marker nicht, kostet aber auch keine Leistung, wenn niemand in der Nähe ist.",visualOutput:"Spieler nah (<15m) -> Lila Marker schwebt flüssig!"},{code:` Wait(sleep)
end
end)`,whatItDoes:'Pausiert die Schleife für "sleep" Millisekunden.',whyWeUseIt:"Ohne Wait() würde GTA V sofort komplett einfrieren!",visualOutput:"Zyklus sauber abgeschlossen."}],consolePreview:"Resmon: 0.00ms (Idle) -> 0.02ms (Marker aktiv)",successExplanation:"Das ist der berühmte 0.00ms Optimierungs-Trick, den jeder gute Server verlangt!"},{id:"8-2",type:"TAP_FILL",badge:"LÜCKENTEXT",title:"Baue eine sichere Thread-Schleife",explanation:"Vervollständige den Thread mit `CreateThread`, `while` und dem lebenswichtigen `Wait`:",codeTemplate:`___1___(function()
___2___ true do
___3___(1000)
end
end)`,blanksCount:3,wordBank:["CreateThread","while","Wait","Stop","if"],correctWords:["CreateThread","while","Wait"],consolePreview:"Thread läuft sicher mit 1000ms Taktung!",successExplanation:"Perfekt! Mit `Wait(1000)` läuft dein Thread absolut absturzsicher."},{id:"8-3",type:"CHOICE",badge:"ANTI-CRASH CHECK",title:"Was passiert, wenn du Wait() in einer while-true-Schleife vergisst?",explanation:'Stell dir vor, du schreibst `while true do print("Hi") end` komplett ohne `Wait()`. Was passiert in Game Engine?',options:["GTA V friert sofort komplett ein (Freeze/Crash), weil das Spiel keine Zeit mehr hat, Grafik-Frames zu berechnen","Das Skript läuft einfach doppelt so schnell","Es passiert gar nichts"],correctOptionIndex:0,successExplanation:"Richtig! Deshalb immer kontrollieren, dass vor dem Ende der `while`-Schleife ein `Wait(...)` steht."}]},{id:"lvl-9",levelNumber:9,chapterId:4,chapterTitle:"Kapitel 4: Client, Server & Netzwerk-Events",title:"RegisterNetEvent & TriggerServerEvent",subtitle:"Wie der Spieler-PC sicher mit dem Multiplayer-Server spricht",language:"LUA",xpReward:140,steps:[{id:"9-1",type:"CONCEPT",badge:"NETZWERK & ANTI-CHEAT",title:"Vom Client zum Server funken",explanation:"In Game Engine läuft **Client-Code** auf dem PC des Spielers (für Grafik, Autos, Tasten) und **Server-Code** auf dem Host-Server (für Geld, Datenbank & Anti-Cheat).\n\nDamit der Client dem Server eine Nachricht schicken kann, nutzt er `TriggerServerEvent`. Auf dem Server empfängt `RegisterNetEvent` die Nachricht!",visualLines:[{code:`-- CLIENT:
TriggerServerEvent("garage:payFee", "LS 999")`,whatItDoes:'Der Client schickt das Event "garage:payFee" mit dem Kennzeichen "LS 999" an den Server.',whyWeUseIt:"Der Client bittet den Server, die Gebühr zu prüfen und das Auto freizugeben.",visualOutput:'[Netzwerk] Client ---> Server ("garage:payFee", "LS 999")'},{code:`-- SERVER:
RegisterNetEvent("garage:payFee", function(plate)`,whatItDoes:'Der Server lauscht auf "garage:payFee" und nimmt das mitgeschickte Kennzeichen (plate) entgegen.',whyWeUseIt:"Ohne RegisterNetEvent darf kein Event über das Internet empfangen werden.",visualOutput:'Server hat Anfrage für Kennzeichen "LS 999" empfangen!'},{code:` local src = source
TriggerClientEvent("garage:spawnCar", src, plate)
end)`,whatItDoes:"Liest die Spieler-ID (source) aus und schickt die Antwort gezielt an diesen Spieler (src) zurück!",whyWeUseIt:'"source" verrät dem Server fälschungssicher, welcher Spieler das Event ausgelöst hat.',visualOutput:'[Netzwerk] Server ---> Client #src ("garage:spawnCar")'}],consolePreview:"Client -> Server -> Client Roundtrip erfolgreich!",successExplanation:"Genau so kommunizieren alle Game-Skripte zwischen Spieler und Server!"},{id:"9-2",type:"TAP_FILL",badge:"LÜCKENTEXT",title:"Sende ein Event an den Server",explanation:'Schicke vom Client aus das Event `"garage:buy"` an den Server und registriere es auf der Server-Seite:',codeTemplate:`-- Client:
___1___("garage:buy")
-- Server:
___2___("garage:buy", function()
local src = ___3___
end)`,blanksCount:3,wordBank:["TriggerServerEvent","RegisterNetEvent","source","print"],correctWords:["TriggerServerEvent","RegisterNetEvent","source"],consolePreview:"Event garage:buy von Spieler #1 empfangen!",successExplanation:"Perfekt! `TriggerServerEvent`, `RegisterNetEvent` und `source` arbeiten Hand in Hand."},{id:"9-3",type:"CHOICE",badge:"ANTI-CHEAT REGEL",title:"Warum prüfen wir Geld immer auf dem Server?",explanation:"Warum sollte niemals der Client entscheiden, ob ein Spieler genug Geld für ein Auto hat?",options:["Weil Cheater den Arbeitsspeicher auf ihrem eigenen PC manipulieren können – der Server hingegen ist vor Manipulation geschützt","Weil der Client keine Zahlen kennt","Weil if-Abfragen nur auf dem Server funktionieren"],correctOptionIndex:0,successExplanation:"Goldene Game Engine-Regel: Vertraue niemals dem Client bei Geld, Items oder Berechtigungen!"}]},{id:"lvl-10",levelNumber:10,chapterId:5,chapterTitle:"Kapitel 5: HTML, CSS & JS für In-Game NUI-Menüs",title:"HTML & Dark-Purple CSS für dein Garagen-UI",subtitle:"Wie Webseiten als durchsichtiges Overlay über GTA V gelegt werden",language:"HTML",xpReward:150,steps:[{id:"10-1",type:"CONCEPT",badge:"IN-GAME NUI DESIGN",title:"HTML baut das Gerüst, CSS macht den Dark-Lila-Look",explanation:"Jedes schicke Menü in Game Engine (Garagen, Handys, HUDs) ist in Wahrheit eine Webseite aus **HTML** und **CSS**, die über dem Spiel schwebt (`NUI`).\n\n**Wichtigste Regel:** Der `body` muss in CSS immer `background: transparent;` haben, damit man GTA V dahinter weiterhin sieht!",visualLines:[{code:`
WÜRFELPARK GARAGE
`,whatItDoes:"Erstellt eine Menü-Box (div) mit einer Überschrift (h2) und einem Klick-Button (button).",whyWeUseIt:'id="garage-menu" gibt der Box einen Namen, damit wir sie später per Code ein- und ausblenden können.',visualOutput:"HTML-Struktur mit Titel & Auspark-Button erzeugt"},{code:"body { background: transparent; overflow: hidden; }",whatItDoes:"Macht den gesamten Bildschirmhintergrund durchsichtig und blendet Scrollbalken aus.",whyWeUseIt:"Ohne transparenten Hintergrund wäre dein ganzer Bildschirm weiß und du würdest GTA V nicht mehr sehen!",visualOutput:"GTA V 3D-Welt scheint hinter dem Menü durch!"},{code:".card { background: #12121c; border: 1px solid #7c3aed; border-radius: 14px; }",whatItDoes:"Stylt die Garagen-Box dunkel (#12121c) mit einem edlen lila Rahmen (#7c3aed) und runden Ecken.",whyWeUseIt:"Sorgt für den modernen Dark/Purple-Look unseres Garagen-Menüs.",visualOutput:"Dark-Purple Glass-Box fertig gestylt!"}],livePreviewHtml:'
WÜRFELPARK GARAGE
Karin Sultan RS • Kennzeichen: LS 999
',successExplanation:"Schau dir die Live-Vorschau an – genau so entsteht ein echtes In-Game NUI!"},{id:"10-2",type:"TAP_FILL",badge:"LÜCKENTEXT",title:"Mache den NUI-Hintergrund für GTA V durchsichtig",explanation:"Tippe die richtigen CSS-Werte an, damit man das Spiel hinter dem Menü sieht und ein Auspark-Button in HTML entsteht:",codeTemplate:`body {
background: ___1___;
}
<___2___ onclick="spawn()">Ausparken`,blanksCount:2,wordBank:["transparent","button","white","div"],correctWords:["transparent","button"],livePreviewHtml:'',successExplanation:"Perfekt! `background: transparent;` ist Pflicht in jedem In-Game NUI."}]},{id:"lvl-11",levelNumber:11,chapterId:5,chapterTitle:"Kapitel 5: HTML, CSS & JS für In-Game NUI-Menüs",title:"Die NUI-Brücke: SendNUIMessage & RegisterNUICallback",subtitle:"Wie Lua das HTML-Menü öffnet und JavaScript den Klick zurück an Lua schickt",language:"JS",xpReward:165,steps:[{id:"11-1",type:"CONCEPT",badge:"LUA <-> JAVASCRIPT",title:"Wie Lua und JavaScript miteinander sprechen",explanation:'Wenn der Spieler an der Garage `[E]` drückt, muss Lua den Mauszeiger einschalten und das HTML-Menü öffnen. Und wenn er im Menü auf `"Ausparken"` klickt, schickt JavaScript das Signal zurück an Lua!\n\nKlicke durch die 3 Schritte:',visualLines:[{code:`SetNuiFocus(true, true)
SendNUIMessage({ action = "open", cars = myCars })`,whatItDoes:"Lua schaltet den Mauszeiger ein (true, true) und sendet die Fahrzeugliste an JavaScript.",whyWeUseIt:"Ohne SetNuiFocus(true, true) kann der Spieler im Menü nichts anklicken.",visualOutput:"Mauszeiger aktiv -> Datenpaket fliegt ins Browser-UI"},{code:`window.addEventListener("message", (event) => {
if (event.data.action === "open") showMenu();
});`,whatItDoes:"JavaScript fängt die Nachricht aus Lua auf und blendet das Garagen-Menü ein.",whyWeUseIt:'Alles, was SendNUIMessage aus Lua schickt, landet in JS automatisch in "event.data".',visualOutput:"UI öffnet sich auf dem Bildschirm!"},{code:`// JS sendet Klick zurück an Lua:
fetch(\`https://\${GetParentResourceName()}/spawnCar\`, {
method: "POST",
body: JSON.stringify({ plate: "LS 999" })
});`,whatItDoes:'Schickt das gewählte Kennzeichen per fetch() zurück an RegisterNUICallback("spawnCar") in Lua.',whyWeUseIt:"So erfährt dein Lua-Skript, auf welches Auto der Spieler im HTML-Menü geklickt hat!",visualOutput:"Klick übertragen -> Lua spawnt Fahrzeug [LS 999]!"}],consolePreview:"NUI Bridge: Lua -> JS (open) -> Lua (spawnCar: LS 999)",successExplanation:"Damit verstehst du das Zusammenspiel aus Lua, HTML, CSS und JavaScript!"},{id:"11-2",type:"TAP_FILL",badge:"BAUSTEINE TIPPEN",title:"Aktiviere die Maus und öffne das NUI",explanation:"Schalte in Lua zuerst den Mausfokus ein und schicke dann die Nachricht ans UI:",codeTemplate:`___1___(true, true)
___2___({ action = "open" })`,blanksCount:2,wordBank:["SetNuiFocus","SendNUIMessage","OpenHTML","MouseOn"],correctWords:["SetNuiFocus","SendNUIMessage"],consolePreview:"Maus aktiv & NUI geöffnet!",successExplanation:"Stark! Diese beiden Befehle stehen in jedem Game Engine-Menü-Skript direkt untereinander."},{id:"11-3",type:"CHOICE",badge:"FEHLER VERMEIDEN",title:"Was passiert, wenn man beim Schließen SetNuiFocus(false, false) vergisst?",explanation:"Das HTML-Menü wird ausgeblendet, aber `SetNuiFocus` steht noch auf `true, true`. Was erlebt der Spieler?",options:['Er hat einen "NUI-Lock": Der Mauszeiger klebt weiter auf dem Bildschirm und er kann seinen Charakter in GTA V nicht mehr bewegen',"Das Auto fährt rückwärts","Der Server startet neu"],correctOptionIndex:0,successExplanation:"Genau! Deshalb beim Schließen eines Menüs immer `SetNuiFocus(false, false)` aufrufen."}]},{id:"lvl-12",levelNumber:12,chapterId:6,chapterTitle:"Kapitel 6: SQL-Datenbanken (oxmysql) & Frameworks",title:"SQL & oxmysql: Fahrzeuge dauerhaft speichern",subtitle:"Wie SELECT, UPDATE und ?-Platzhalter in der Fahrzeug-Datenbank arbeiten",language:"SQL",xpReward:180,steps:[{id:"12-1",type:"CONCEPT",badge:"SQL & OXMYSQL",title:"Datenbank-Abfragen ohne Datenverlust",explanation:"Damit gekaufte Autos nach einem Server-Restart noch da sind, liegen sie in einer **SQL-Datenbank** in der Tabelle `owned_vehicles`.\n\nMit `SELECT` lesen wir Fahrzeuge aus, und mit `UPDATE` stellen wir `stored = 0` (Ausgeparkt) oder `stored = 1` (In Garage). Klicke auf die Zeilen!",visualLines:[{code:"SELECT plate, model, fuel FROM owned_vehicles WHERE owner = ?",whatItDoes:'Sucht alle Fahrzeuge aus der Tabelle "owned_vehicles", die dem Spieler (?) gehören.',whyWeUseIt:'Das Fragezeichen "?" wird von oxmysql sicher durch die Lizenz des Spielers ersetzt (Schutz vor SQL-Hackern!).',visualOutput:"SQL Ergebnis: 1. sultanrs [LS 999], 2. krieger [V8 KING]"},{code:"UPDATE owned_vehicles SET stored = 0 WHERE plate = ?",whatItDoes:"Setzt den Garagen-Status für dieses Kennzeichen auf 0 (Auf der Straße / Ausgeparkt).",whyWeUseIt:"Verhindert, dass ein Spieler dasselbe Auto 10-mal hintereinander ausparkt (Anti-Dupe)!",visualOutput:"Datenbank aktualisiert: [LS 999] -> stored = 0"}],consolePreview:"oxmysql: 2 Fahrzeuge geladen | stored = 0 gesetzt",successExplanation:"So einfach und logisch funktioniert SQL in Game Engine!"},{id:"12-2",type:"TAP_FILL",badge:"SQL BAUEN",title:"Lade alle Fahrzeuge eines Besitzers mit SELECT",explanation:"Tippe die richtigen SQL-Schlüsselwörter in die Abfrage:",codeTemplate:"___1___ * ___2___ owned_vehicles ___3___ owner = ?",blanksCount:3,wordBank:["SELECT","FROM","WHERE","DELETE","JOIN"],correctWords:["SELECT","FROM","WHERE"],consolePreview:"SQL Query OK: SELECT * FROM owned_vehicles WHERE owner = ?",successExplanation:"Klasse! `SELECT ... FROM ... WHERE ...` ist die wichtigste SQL-Abfrage überhaupt."}]},{id:"lvl-13",levelNumber:13,chapterId:6,chapterTitle:"Kapitel 6: SQL-Datenbanken (oxmysql) & Frameworks",title:"ESX, QBCore & ox_lib im Griff",subtitle:"Wie du Spieler-Akten und Bankkonten in den großen Frameworks abfragst",language:"ESX",xpReward:200,steps:[{id:"13-1",type:"CONCEPT",badge:"ESX & QBCORE",title:"Spieler-Objekt laden & Geld abziehen",explanation:"Fast jeder RP-Server nutzt **ESX** oder **QBCore**.\nBeide machen dasselbe: Du übergibst die `source` (Spieler-ID) und erhältst das Spieler-Objekt, um Job oder Bankguthaben zu prüfen. Klicke durch den Vergleich:",visualLines:[{code:`-- In ESX Legacy:
local xPlayer = ESX.GetPlayerFromId(source)
xPlayer.removeAccountMoney("bank", 250)`,whatItDoes:'Lädt den Spieler in ESX als "xPlayer" und bucht 250$ vom Bankkonto ab.',whyWeUseIt:"Standard-Weg in allen ESX-Skripten für Bezahlungen.",visualOutput:"[ESX] $250 vom Bankkonto abgebucht."},{code:`-- In QBCore:
local Player = QBCore.Functions.GetPlayer(source)
Player.Functions.RemoveMoney("bank", 250)`,whatItDoes:'Lädt den Spieler in QBCore als "Player" und bucht 250$ von der Bank ab.',whyWeUseIt:"Wenn du beide Schreibweisen kennst, kannst du jedes Skript für beide Frameworks schreiben!",visualOutput:"[QBCore] $250 vom Bankkonto abgebucht."}],consolePreview:"Multi-Framework Ready: ESX & QBCore verstanden!",successExplanation:"Stark! Du kennst jetzt beide großen Game Engine-Welten."},{id:"13-2",type:"TAP_FILL",badge:"LÜCKENTEXT",title:"Lade den Spieler in ESX & QBCore",explanation:"Setze die passenden Funktionsnamen für ESX und QBCore ein:",codeTemplate:`-- ESX:
local xPlayer = ESX.___1___(source)
-- QBCore:
local Player = QBCore.Functions.___2___(source)`,blanksCount:2,wordBank:["GetPlayerFromId","GetPlayer","CreateCar","Delete"],correctWords:["GetPlayerFromId","GetPlayer"],consolePreview:"xPlayer (ESX) & Player (QBCore) geladen!",successExplanation:"Perfekt! Damit findest du dich in jedem ESX- und QBCore-Skript sofort zurecht."}]},{id:"lvl-14",levelNumber:14,chapterId:6,chapterTitle:"Kapitel 6: SQL-Datenbanken (oxmysql) & Frameworks",title:"BOSS-LEVEL: Das komplette Garagen-System bauen",subtitle:"Kombiniere SQL, Server-Lua, NUI-JS und Client-Vehicle-Spawn zum fertigen System!",language:"FULLSTACK",isBossLevel:!0,xpReward:500,steps:[{id:"14-1",type:"CONCEPT",badge:"MEISTERSTÜCK ARCHITEKTUR",title:"Alle 5 Sprachen in einem Garagen-System vereint",explanation:"Jetzt zahlt sich alles aus, was du gelernt hast! Schau dir an, wie unser komplettes Garagen-System in 4 klaren Schritten abläuft. Klicke jede Zeile an, um den gesamten Datenfluss zu sehen:",visualLines:[{code:`-- 1. SERVER + SQL: Fahrzeuge des Spielers laden
local cars = MySQL.query.await("SELECT * FROM owned_vehicles WHERE owner = ?", { license })`,whatItDoes:"Holt alle Autos des Spielers aus der MySQL-Datenbank.",whyWeUseIt:"Damt im Menü nur die echten, eigenen Fahrzeuge angezeigt werden.",visualOutput:"Schritt 1: 3 Autos aus SQL geladen"},{code:`-- 2. CLIENT -> NUI: Maus aktivieren & HTML-Menü öffnen
SetNuiFocus(true, true)
SendNUIMessage({ action = "openGarage", vehicles = cars })`,whatItDoes:"Schickt die Fahrzeugliste an unser Dark-Purple HTML/CSS/JS-Menü.",whyWeUseIt:"Der Spieler kann jetzt mit der Maus sein Wunschauto auswählen.",visualOutput:"Schritt 2: Garagen-UI zeigt Sultan RS [LS 999]"},{code:`-- 3. SERVER + SQL: Status auf "Ausgeparkt" (stored = 0) setzen
MySQL.update.await("UPDATE owned_vehicles SET stored = 0 WHERE plate = ?", { plate })`,whatItDoes:"Markiert das Auto in der Datenbank als ausgeparkt.",whyWeUseIt:"Schützt vor Fahrzeug-Duplizierung (Anti-Dupe).",visualOutput:"Schritt 3: SQL stored = 0 für [LS 999]"},{code:`-- 4. CLIENT: Modell laden, Auto spawnen & Spieler reinsetzen
local veh = CreateVehicle(hash, 222.4, -804.2, 30.6, 160.0, true, false)
SetVehicleNumberPlateText(veh, plate)
SetPedIntoVehicle(PlayerPedId(), veh, -1)`,whatItDoes:"Spawnt das Auto in der 3D-Welt, schraubt das Kennzeichen dran und setzt dich auf den Fahrersitz (-1)!",whyWeUseIt:"Sitz -1 ist in GTA V immer der Fahrersitz.",visualOutput:"Schritt 4: Sultan RS [LS 999] gespawnt – Gute Fahrt!"}],livePreviewHtml:'
',successExplanation:"Bereit für die beiden Abschluss-Aufgaben deines Garagen-Systems?"},{id:"14-2",type:"ARRANGE_LINES",badge:"GARAGEN-ABLAUF SORTIEREN",title:"Bringe den Fahrzeug-Spawn in die richtige Reihenfolge",explanation:"Bevor ein Auto in GTA V gespawnt werden kann, muss erst das 3D-Modell geladen, dann das Auto erstellt und zuletzt der Spieler auf den Fahrersitz (`-1`) gesetzt werden:",shuffledLines:["SetPedIntoVehicle(PlayerPedId(), veh, -1)","RequestModel(hash)","local veh = CreateVehicle(hash, x, y, z, heading, true, false)"],correctLineOrder:["RequestModel(hash)","local veh = CreateVehicle(hash, x, y, z, heading, true, false)","SetPedIntoVehicle(PlayerPedId(), veh, -1)"],consolePreview:"Modell geladen -> Fahrzeug erstellt -> Spieler sitzt am Steuer!",successExplanation:"Exakt! Erst `RequestModel`, dann `CreateVehicle`, dann `SetPedIntoVehicle`."},{id:"14-3",type:"FREE_CODE",badge:"MEISTER-PRÜFUNG (SELBST CODEN)",title:"Schreibe den finalen Befehl für das Kennzeichen",explanation:"Jetzt bist du dran mit echtem Code! Setze das Kennzeichen `plate` auf das Fahrzeug `veh` mit der Game Engine API `SetVehicleNumberPlateText(veh, plate)`:",starterCode:`-- Setze das Kennzeichen "plate" auf das Fahrzeug "veh":
`,solutionCode:"SetVehicleNumberPlateText(veh, plate)",requiredSnippets:["SetVehicleNumberPlateText","veh","plate"],consolePreview:"Kennzeichen [LS 999] erfolgreich montiert!",successExplanation:"MEISTERLEISTUNG! Du hast das Boss-Level des Garagen-Systems abgeschlossen!"}]}],qr=1e4,Ro=[{id:1,title:"Kapitel 1: LUA Basics (Level 1 – 350)",subtitle:"Ausführliche Grundlagen: print(), local Variablen, Datentypen, Strings, Tabellen & 0.00ms Schleifen",language:"LUA",accentColor:"#a855f7",levelRange:[1,350]},{id:2,title:"Kapitel 2: LUA Semi Pro (Level 351 – 700)",subtitle:"RegisterCommand mit Argumenten, RegisterKeyMapping, vector3 & Distanzen, 3D Marker & Client-Server Events",language:"LUA",accentColor:"#8b5cf6",levelRange:[351,700]},{id:3,title:"Kapitel 3: LUA Pro (Level 701 – 1.100)",subtitle:"Resmon-Tuning & 0.00ms dynamic Wait(sleep), StateBags, OneSync Infinity Scope, Model Streaming & Exports",language:"LUA",accentColor:"#7c3aed",levelRange:[701,1100]},{id:4,title:"Kapitel 4: LUA Expert (Level 1.101 – 1.500)",subtitle:"Kopfzerbrechen: Metatables & OOP Klassen, Memory Leak Profiling, Coroutines, Race Conditions & Anti-Cheat",language:"LUA",accentColor:"#6d28d9",levelRange:[1101,1500]},{id:5,title:"Kapitel 5: HTML Basics (Level 1.501 – 1.750)",subtitle:"Semantische Tags, NUI Grundgerüst, div, span, Formulare, Buttons & Eingabefelder",language:"HTML",accentColor:"#c084fc",levelRange:[1501,1750]},{id:6,title:"Kapitel 6: HTML Semi Pro (Level 1.751 – 2.000)",subtitle:"NUI DOM-Struktur für Game Engine HUDs, Dialoge, Modals, SVG-Icons & Data-Attribute",language:"HTML",accentColor:"#a855f7",levelRange:[1751,2e3]},{id:7,title:"Kapitel 7: HTML Pro (Level 2.001 – 2.250)",subtitle:"Komplexe In-Game Tablets, dynamische Inventar-Raster & Webkomponenten",language:"HTML",accentColor:"#9333ea",levelRange:[2001,2250]},{id:8,title:"Kapitel 8: HTML Expert (Level 2.251 – 2.500)",subtitle:"Kopfzerbrechen: 144 FPS Rendering, minimaler DOM-Overhead, Shadow DOM & iFrame Sandboxing",language:"HTML",accentColor:"#7e22ce",levelRange:[2251,2500]},{id:9,title:"Kapitel 9: CSS Basics (Level 2.501 – 2.800)",subtitle:"Selektoren, Box-Modell, Farben, Typografie & Styling von Overlays",language:"CSS",accentColor:"#38bdf8",levelRange:[2501,2800]},{id:10,title:"Kapitel 10: CSS Semi Pro (Level 2.801 – 3.100)",subtitle:"Flexbox, CSS Grid, Glassmorphism & transparente GTA-Hintergründe",language:"CSS",accentColor:"#0284c7",levelRange:[2801,3100]},{id:11,title:"Kapitel 11: CSS Pro (Level 3.101 – 3.400)",subtitle:"@keyframes Animationen, Transitions, Responsive Skalierung (vh/vw/rem) & Custom Scrollbars",language:"CSS",accentColor:"#0369a1",levelRange:[3101,3400]},{id:12,title:"Kapitel 12: CSS Expert (Level 3.401 – 3.700)",subtitle:"Kopfzerbrechen: GPU-beschleunigte 3D-Transforms, Backdrop-Filter Performance & Design-Systeme",language:"CSS",accentColor:"#075985",levelRange:[3401,3700]},{id:13,title:"Kapitel 13: JavaScript Basics (Level 3.701 – 4.075)",subtitle:"let, const, Funktionen, Arrow Functions, Template Literals, JSON & DOM-Selektion",language:"JS",accentColor:"#facc15",levelRange:[3701,4075]},{id:14,title:"Kapitel 14: JavaScript Semi Pro (Level 4.076 – 4.450)",subtitle:'window.addEventListener("message"), fetch Callbacks zu Game Engine & Audio in NUI',language:"JS",accentColor:"#eab308",levelRange:[4076,4450]},{id:15,title:"Kapitel 15: JavaScript Pro (Level 4.451 – 4.825)",subtitle:"Async/Await, Promises, State Management für NUI-Apps & TypeScript Typisierung",language:"JS",accentColor:"#ca8a04",levelRange:[4451,4825]},{id:16,title:"Kapitel 16: JavaScript Expert (Level 4.826 – 5.200)",subtitle:"Kopfzerbrechen: Virtual DOM Reconciliation, Memory Leak Prevention bei 8h GTA Sessions & Profiling",language:"JS",accentColor:"#a16207",levelRange:[4826,5200]},{id:17,title:"Kapitel 17: SQL Basics (Level 5.201 – 5.600)",subtitle:"SELECT, INSERT, UPDATE, DELETE, WHERE & Tabellenstrukturen",language:"SQL",accentColor:"#10b981",levelRange:[5201,5600]},{id:18,title:"Kapitel 18: SQL Semi Pro (Level 5.601 – 6.000)",subtitle:"Prepared Statements mit ?, JSON-Spalten, query_async & SQL-Injection Schutz",language:"SQL",accentColor:"#059669",levelRange:[5601,6e3]},{id:19,title:"Kapitel 19: SQL Pro (Level 6.001 – 6.400)",subtitle:"Transaktionen (START TRANSACTION, COMMIT, ROLLBACK), INNER/LEFT JOINs & Indizes",language:"SQL",accentColor:"#047857",levelRange:[6001,6400]},{id:20,title:"Kapitel 20: SQL Expert (Level 6.401 – 6.800)",subtitle:"Kopfzerbrechen: Deadlock Prevention bei 300+ Spielern, Connection Pool Tuning & Batch-Updates",language:"SQL",accentColor:"#065f46",levelRange:[6401,6800]},{id:21,title:"Kapitel 21: Frameworks Basics (Level 6.801 – 7.600)",subtitle:"fxmanifest.lua (lua54, ui_page), ESX Legacy & QBCore Shared Objects, Spieler-Inventar",language:"FULLSTACK",accentColor:"#f43f5e",levelRange:[6801,7600]},{id:22,title:"Kapitel 22: Frameworks Semi Pro (Level 7.601 – 8.400)",subtitle:"ox_lib Integration (Context Menus, Notifications, Input Dialoge, Zonen, Radial Menus)",language:"FULLSTACK",accentColor:"#e11d48",levelRange:[7601,8400]},{id:23,title:"Kapitel 23: Frameworks Pro (Level 8.401 – 9.200)",subtitle:"Eigene vollständige RP-Systeme (Polizei MDT, Garagensystem, Multi-Framework Bridge)",language:"FULLSTACK",accentColor:"#be123c",levelRange:[8401,9200]},{id:24,title:"Kapitel 24: Grandmaster & Anti-Cheat (Level 9.201 – 10.000)",subtitle:"Kopfzerbrechen & Finale: Enterprise Server-Architektur, serverseitige Verifikation & 0.00ms Gesamtresmon-Garantie",language:"FULLSTACK",accentColor:"#881337",levelRange:[9201,1e4]}],yf=[...kv,...wv],W0=[{topicTitle:"Lua Variablen & Gültigkeitsbereich (local)",subtitle:"Warum globale Variablen Game Engine verlangsamen und wie man mit local Speicher spart",language:"LUA",conceptTitle:"Speicherverwaltung mit local variablenName",explanation:"In Lua 5.4 deklarierst du Variablen immer mit `local`. Globale Variablen ohne local landen im globalen `_G` Dictionary, was langsamer ist und andere Ressourcen überschreiben kann!",visualCode:`local playerName = "Alex"
local playerCash = 2500
print(playerName .. " hat $" .. playerCash)`,whatItDoes:"Erstellt zwei speichereffiziente lokale Variablen und gibt sie kombiniert in der Konsole aus.",whyWeUseIt:"local verhindert Namenskonflikte zwischen verschiedenen Skripten und ist bis zu 30% schneller.",visualOutput:"[F8 Konsole] > Alex hat $2500",tapTemplate:`___1___ fuelLevel = 85
___2___("Tank: " .. fuelLevel)`,wordBank:["local","print","global","var"],correctWords:["local","print"],advTapTemplate:`___1___ speed = 120
local isFast = speed > ___2___
___3___(isFast)`,advWordBank:["local","100","print","global","true"],advCorrectWords:["local","100","print"],choiceQuestion:"Was passiert in Game Engine, wenn du das Schlüsselwort `local` vor einer Variable weglässt?",choiceSnippet:'carModel = "adder" -- Kein local!',choiceOptions:["Die Variable landet global im Speicher (_G) und kann versehentlich andere Skripte überschreiben","Das Skript stürzt sofort mit einem Syntaxfehler ab","Die Variable wird automatisch verschlüsselt"],correctChoiceIndex:0,bugQuestion:"Finde den Bug! Warum schlägt die String-Verkettung hier fehl?",bugSnippet:`local name = "Auto"
local info = name + " ist schnell"`,bugOptions:['In Lua verbindet man Strings mit ".." (zwei Punkten) und NICHT mit "+"',"name muss großgeschrieben werden","Strings dürfen keine Leerzeichen enthalten"],correctBugIndex:0,arrangeLines:['local vehicle = "sultan"','local plate = "LS-991"','local info = vehicle .. " [" .. plate .. "]"',"print(info)"],freePrompt:"Erstelle eine lokale Variable `local maxSpeed = 240` und gib sie mit `print(maxSpeed)` aus:",freeStarter:`-- Schreibe die Variable und den print:
`,freeSolution:`local maxSpeed = 240
print(maxSpeed)`,freeRequired:["local","maxSpeed","240","print"]},{topicTitle:"Bedingungen & Logik (if, elseif, else)",subtitle:"Entscheidungen im Code treffen und Spieler-Eingaben sauber abfedern",language:"LUA",conceptTitle:"Fallunterscheidung mit if, then und else",explanation:"Mit `if bedingung then` führst du Code nur aus, wenn die Bedingung wahr ist. Wichtig: Vergleiche nutzen `==` (zwei Gleichheitszeichen) und das ungleich ist in Lua `~=`!",visualCode:`local cash = 150
local price = 100
if cash >= price then
print("Kauf erfolgreich!")
else
print("Zu wenig Geld!")
end`,whatItDoes:"Prüft, ob der Spieler genug Bargeld für einen Einkauf besitzt.",whyWeUseIt:"Verhindert, dass Spieler ohne Guthaben Items kaufen können.",visualOutput:"[F8 Konsole] > Kauf erfolgreich!",tapTemplate:`if cash >= 100 ___1___
buyItem()
___2___`,wordBank:["then","end","do","{"],correctWords:["then","end"],advTapTemplate:`___1___ health <= 0 ___2___
revivePlayer()
___3___`,advWordBank:["if","then","end","when","while"],advCorrectWords:["if","then","end"],choiceQuestion:"Wie lautet der Operator für „ungleich“ in Lua?",choiceSnippet:'if role ~= "admin" then',choiceOptions:["~= (Tilde und Gleichheitszeichen)","!= (Ausrufezeichen und Gleich)","<> (Kleiner-Größer)"],correctChoiceIndex:0,bugQuestion:"Warum meldet Lua bei diesem if-Block einen Syntaxfehler?",bugSnippet:`if money > 50
print("Reich!")
end`,bugOptions:['Hinter der Bedingung fehlt das Schlüsselwort "then"!',"money muss in Anführungszeichen stehen","print darf nicht eingerückt sein"],correctBugIndex:0,arrangeLines:["local level = 5","if level >= 10 then",' print("Meister")',"else",' print("Lehrling")',"end"],freePrompt:'Schreibe eine if-Abfrage: Wenn `speed > 130` dann `print("Zu schnell!") end`:',freeStarter:`local speed = 150
`,freeSolution:`local speed = 150
if speed > 130 then
print("Zu schnell!")
end`,freeRequired:["if","speed","then","print","end"]},{topicTitle:"Lua Tabellen als Listen & Dictionaries",subtitle:"Strukturierte Daten speichern, Arrays indizieren und mit for durchlaufen",language:"LUA",conceptTitle:"Tabellen {} sind das Schweizer Taschenmesser in Lua",explanation:"In Lua gibt es nur einen Datenstrukturtyp: Tabellen `{}`. Einzigartig in Lua: Listen beginnen bei Index `1` (nicht 0 wie in JavaScript/Python)!",visualCode:`local cars = { "sultan", "adder", "t20" }
print("Erstes Auto: " .. cars[1])
print("Anzahl Autos: " .. #cars)`,whatItDoes:"Speichert drei Fahrzeugnamen und liest das erste Element mit Index 1 sowie die Länge mit # aus.",whyWeUseIt:"Der Hash-Operator # ermittelt blitzschnell die Anzahl der Elemente in einer Liste.",visualOutput:"[F8 Konsole] > Erstes Auto: sultan | Anzahl: 3",tapTemplate:`local weapons = { "pistol", "carbine" }
print(weapons[___1___])
print(#___2___)`,wordBank:["1","weapons","0","cars"],correctWords:["1","weapons"],advTapTemplate:`local config = {
maxPlayers = 64,
pvp = ___1___
}
print(config.___2___)`,advWordBank:["true","maxPlayers","false","list"],advCorrectWords:["true","maxPlayers"],choiceQuestion:'Welchen Index hat das erste Element einer Liste `items = { "A", "B" }` in Lua?',choiceSnippet:"local first = items[1]",choiceOptions:["Index 1 (Lua zählt standardmäßig ab 1, nicht ab 0)","Index 0","Index -1"],correctChoiceIndex:0,bugQuestion:'Was gibt `#myTable` zurück, wenn `myTable = { [1] = "A", [3] = "C" }` eine Lücke bei Index 2 hat?',bugSnippet:`local myTable = { [1] = "A", [3] = "C" }
print(#myTable)`,bugOptions:["Unzuverlässige Längenwerte, weil # nur für lückenlose Sequenzen garantiert definiert ist","Immer 2","Einen Lua-Kernel-Absturz"],correctBugIndex:0,arrangeLines:["local garage = {}",'table.insert(garage, "sultan")','table.insert(garage, "kuruma")',"print(#garage)"],freePrompt:'Erstelle eine Tabelle `local tools = { "wrench", "hammer" }` und gib `print(tools[1])` aus:',freeStarter:`-- Erstelle die Tabelle:
`,freeSolution:`local tools = { "wrench", "hammer" }
print(tools[1])`,freeRequired:["local","tools","{","wrench","print"]}],Nv=[{topicTitle:"RegisterCommand & Chat-Argumente",subtitle:"Wie du Eingaben nach einem /befehl (z. B. /car sultan 100) ausliest und validierst",language:"LUA",conceptTitle:"Argumente in RegisterCommand nutzen (args[1], tonumber)",explanation:'Wenn ein Spieler `/car sultan 100` im Chat eintippt, landet `"sultan"` in `args[1]` und `"100"` (als Text!) in `args[2]`. Mit `tonumber(args[2])` wandelst du Text-Zahlen in echte Zahlen um!',visualCode:`RegisterCommand("car", function(source, args)
local model = args[1] or "adder"
local fuel = tonumber(args[2]) or 100
print("Spawne " .. model .. " mit " .. fuel .. "% Tank")
end, false)`,whatItDoes:"Liest Modellname und optionalen Tankstand aus dem Chat-Befehl aus.",whyWeUseIt:"Chat-Argumente sind immer Strings. tonumber() wandelt sie sicher in Zahlen für Berechnungen um.",visualOutput:"[Spieler tippt /car sultan 80] -> Spawne sultan mit 80% Tank",tapTemplate:`___1___("car", function(source, args)
local model = ___2___[1]
end, false)`,wordBank:["RegisterCommand","args","source","true"],correctWords:["RegisterCommand","args"],advTapTemplate:`___1___("setfuel", function(source, ___2___)
local level = ___3___(args[1]) or 100
end, false)`,advWordBank:["RegisterCommand","args","tonumber","tostring","Wait"],advCorrectWords:["RegisterCommand","args","tonumber"],choiceQuestion:"Welchen Datentyp haben alle Einträge in `args` (z. B. `args[1]`) standardmäßig?",choiceSnippet:`RegisterCommand("givecash", function(source, args)
local amount = tonumber(args[1])
end, false)`,choiceOptions:["Immer String (Text) – deshalb nutzt man tonumber(args[1]), wenn man damit rechnen will","Immer Boolean (true/false)","Immer vector3"],correctChoiceIndex:0,bugQuestion:"Finde den Bug! Warum funktioniert dieser `/dv` Befehl im Spiel NICHT?",bugSnippet:`RegisterCommand("/dv", function()
DeleteEntity(GetVehiclePedIsIn(PlayerPedId(), false))
end, false)`,bugOptions:['Im ersten Parameter darf KEIN Schrägstrich "/" stehen – es muss RegisterCommand("dv", ...) heißen!',"DeleteEntity existiert nicht","false muss großgeschrieben werden"],correctBugIndex:0,arrangeLines:['RegisterCommand("dv", function()'," local veh = GetVehiclePedIsIn(PlayerPedId(), false)"," if veh ~= 0 then DeleteEntity(veh) end","end, false)"],freePrompt:'Registriere einen Befehl `"dv"`, der `local veh = GetVehiclePedIsIn(PlayerPedId(), false)` prüft und mit `DeleteEntity(veh)` löscht:',freeStarter:`RegisterCommand("dv", function()
end, false)`,freeSolution:`RegisterCommand("dv", function()
local veh = GetVehiclePedIsIn(PlayerPedId(), false)
DeleteEntity(veh)
end, false)`,freeRequired:["RegisterCommand","dv","GetVehiclePedIsIn","DeleteEntity"]},{topicTitle:"Game Engine Keymapping & 0.00ms Hotkeys",subtitle:"Mit RegisterKeyMapping performante Tastenbelegungen ohne Schleife bauen",language:"LUA",conceptTitle:"Moderne Hotkeys statt Endlosschleifen: RegisterKeyMapping",explanation:"Statt in einer Schleife jeden Frame `IsControlJustReleased` abzufragen, verbindet `RegisterKeyMapping` einen `RegisterCommand` direkt mit einer Taste, die der Spieler in den GTA-Einstellungen ändern kann!",visualCode:`RegisterCommand("lockcar", function()
toggleCarLock()
end, false)
RegisterKeyMapping("lockcar", "Auto auf-/zuschließen", "keyboard", "L")`,whatItDoes:'Verknüpft den Befehl "lockcar" mit der Tastatur-Taste [L] bei 0.00ms Resmon-Last!',whyWeUseIt:"Verbraucht im Ruhezustand exakt 0.00ms CPU-Zeit und ist in den GTA-Optionen frei belegbar.",visualOutput:"[Taste L gedrückt] -> Auto abgeschlossen! (0.00ms Resmon)",tapTemplate:'___1___("lockcar", "Auto abschließen", "___2___", "L")',wordBank:["RegisterKeyMapping","keyboard","mouse","Wait"],correctWords:["RegisterKeyMapping","keyboard"],advTapTemplate:`___1___("engine", function() toggleEngine() ___2___, false)
___3___("engine", "Motor an/aus", "keyboard", "G")`,advWordBank:["RegisterCommand","end","RegisterKeyMapping","CreateThread","while"],advCorrectWords:["RegisterCommand","end","RegisterKeyMapping"],choiceQuestion:"Warum ist `RegisterKeyMapping` viel besser als eine `while true` Schleife für globale Hotkeys?",choiceSnippet:'RegisterKeyMapping("openMenu", "Menü öffnen", "keyboard", "F2")',choiceOptions:["Weil es im Leerlauf 0.00ms CPU verbraucht und Spieler die Taste in den GTA-Einstellungen anpassen können","Weil man damit kein Lua mehr braucht","Weil es nur auf dem Server läuft"],correctChoiceIndex:0,bugQuestion:"Finde den Fehler! Warum löst die Taste `F2` hier nichts aus?",bugSnippet:`RegisterCommand("garage_open", function() openUI() end, false)
RegisterKeyMapping("open_garage", "Garage öffnen", "keyboard", "F2")`,bugOptions:['Der Befehlsname stimmt nicht überein ("garage_open" vs. "open_garage") – beide müssen exakt gleich heißen!',"F2 ist in GTA V verboten","keyboard muss großgeschrieben werden"],correctBugIndex:0,arrangeLines:['RegisterCommand("belt", function()',' print("Sicherheitsgurt angelegt")',"end, false)",'RegisterKeyMapping("belt", "Anschnallen", "keyboard", "B")'],freePrompt:'Registriere den Befehl `"belt"` mit `RegisterCommand` und binde ihn per `RegisterKeyMapping` an `"keyboard"` Taste `"B"`:',freeStarter:`-- Schreibe RegisterCommand + RegisterKeyMapping:
`,freeSolution:`RegisterCommand("belt", function() end, false)
RegisterKeyMapping("belt", "Anschnallen", "keyboard", "B")`,freeRequired:["RegisterCommand","belt","RegisterKeyMapping","keyboard","B"]}],Ev=[{topicTitle:"StateBags & OneSync Synchronisation",subtitle:"Moderne Server-Client Datenübertragung ohne manuelle TriggerClientEvents",language:"LUA",conceptTitle:"Entity(ent).state: Moderne Replikation über StateBags",explanation:"OneSync StateBags synchronisieren Metadaten (z. B. Tankstand, Handcuffed-Status) automatisch an alle Spieler in Rendering-Reichweite, ohne dass du TriggerClientEvent() an alle senden musst!",visualCode:`local veh = GetVehiclePedIsIn(PlayerPedId(), false)
Entity(veh).state:set("fuel", 75, true)`,whatItDoes:'Setzt den StateBag-Schlüssel "fuel" auf 75 und repliziert ihn dank true an den Server & alle Clients.',whyWeUseIt:"Erspart hunderte Netzwerk-Events und sorgt für lagfreie Synchronisation bei 250+ Spielern.",visualOutput:"[StateBag Update] Entity 1042 State { fuel = 75 } an Streamingscope repliziert",tapTemplate:'Entity(veh).state:___1___("isLocked", true, ___2___)',wordBank:["set","true","get","false"],correctWords:["set","true"],advTapTemplate:`local isTrunkOpen = Entity(veh).___1___.___2___
Entity(veh).state:set("trunkOpen", not isTrunkOpen, ___3___)`,advWordBank:["state","trunkOpen","true","bag","false"],advCorrectWords:["state","trunkOpen","true"],choiceQuestion:"Was bewirkt der dritte Parameter `replicate = true` in `Entity(ent).state:set(key, value, true)`?",choiceSnippet:'Entity(veh).state:set("handcuffed", true, true)',choiceOptions:["Er repliziert die Information über OneSync an den Server und alle Spieler in der Nähe","Er löscht das Entity nach 10 Sekunden","Er friert die Physik des Fahrzeugs ein"],correctChoiceIndex:0,bugQuestion:"Warum scheitert dieser StateBag-Listener?",bugSnippet:'AddStateBagChangeHandler("fuel", null, function(bagName, key, value) end)',bugOptions:['In Lua heißt der Nullwert "nil" und nicht "null"!',"fuel muss in geschweiften Klammern stehen","AddStateBagChangeHandler existiert in Game Engine nicht"],correctBugIndex:0,arrangeLines:["local veh = GetVehiclePedIsIn(PlayerPedId(), false)","if veh ~= 0 then",' Entity(veh).state:set("neonEnabled", true, true)',"end"],freePrompt:'Setze auf einem Fahrzeug `veh` den StateBag `"speedLimit"` auf den Wert `80` mit Replikation `true`:',freeStarter:`local veh = GetVehiclePedIsIn(PlayerPedId(), false)
`,freeSolution:`local veh = GetVehiclePedIsIn(PlayerPedId(), false)
Entity(veh).state:set("speedLimit", 80, true)`,freeRequired:["Entity","veh","state:set","speedLimit","80","true"]}],jv=[{topicTitle:"Metatables, OOP & __index Vererbung (Kopfzerbrechen)",subtitle:"Echte objektorientierte Klassen und Vererbung in Lua für Enterprise Roleplay",language:"LUA",conceptTitle:"setmetatable, __index & Objekt-Instanziierung",explanation:'Lua hat von Haus aus keine "class"-Keywords. Objektorientierung entsteht durch Metatables: Wenn ein Feld in einer Instanz nicht gefunden wird, leitet die Metamфомmethode `__index` die Suche an die Vorlage (Klasse) weiter!',visualCode:`local Vehicle = {}
Vehicle.__index = Vehicle
function Vehicle.new(plate, model)
local self = setmetatable({}, Vehicle)
self.plate = plate
self.model = model
return self
end
function Vehicle:drive()
print(self.model .. " [" .. self.plate .. "] gibt Vollgas!")
end`,whatItDoes:"Erstellt eine wiederverwendbare Klasse mit Konstruktor .new() und Methode :drive() über Metatable-Delegation.",whyWeUseIt:"Spart massiv RAM bei tausenden aktiven RP-Objekten (Items, Inventare, Fahrzeuge), da Methoden nur 1x im RAM liegen.",visualOutput:"[OOP Instanz] adder [LS-1337] gibt Vollgas!",tapTemplate:`local Player = {}
Player.___1___ = Player
local self = ___2___({}, Player)`,wordBank:["__index","setmetatable","__newindex","table"],correctWords:["__index","setmetatable"],advTapTemplate:`function Account.___1___(id)
local self = setmetatable({}, Account)
self.id = id
return ___2___
___3___`,advWordBank:["new","self","end","create","class"],advCorrectWords:["new","self","end"],choiceQuestion:"Was ist der fundamentale Unterschied beim Aufruf von `obj:method()` mit Doppelpunkt statt `obj.method()` mit Punkt?",choiceSnippet:"myCar:drive() vs myCar.drive(myCar)",choiceOptions:['Der Doppelpunkt übergibt das Objekt selbst automatisch als ersten versteckten Parameter "self"',"Der Doppelpunkt führt die Methode auf dem Server aus","Es gibt gar keinen Unterschied"],correctChoiceIndex:0,bugQuestion:'Warum wirft dieser Methodenaufruf einen Fehler: "attempt to index a nil value (global self)"?',bugSnippet:`function Vehicle.brake()
self.speed = 0
end`,bugOptions:['Weil die Funktion mit Punkt "." statt Doppelpunkt ":" deklariert wurde, existiert kein implizites "self"!',"Weil brake() ein reserviertes Wort in GTA V ist","Weil speed nur String sein darf"],correctBugIndex:0,arrangeLines:["local Shop = {}","Shop.__index = Shop","function Shop.new(name) return setmetatable({name=name}, Shop) end",'function Shop:open() print("Offen: " .. self.name) end'],freePrompt:"Erstelle den OOP-Konstruktor `Player.new(source)`: `local self = setmetatable({}, Player)` und `return self`:",freeStarter:`local Player = {}
Player.__index = Player
function Player.new(source)
`,freeSolution:`local Player = {}
Player.__index = Player
function Player.new(source)
local self = setmetatable({}, Player)
self.source = source
return self
end`,freeRequired:["setmetatable","Player","return","self","end"]}],Tv=[{topicTitle:"NUI HTML5 DOM & Transparenz-Architektur",subtitle:"Wie transparente Menüs über GTA V gerendert werden, ohne das Spiel zu blockieren",language:"HTML",conceptTitle:"Transparenter Body & z-Index Layering für Game Engine",explanation:"In In-Game NUI muss der `body` transparent sein (`background: transparent`), damit man die GTA-Spielwelt hinter dem Menü sieht. Sichtbare UI-Container werden als zentrierte Card im DOM platziert!",visualCode:`
Game Engine Menü
`,whatItDoes:"Erstellt das HTML-Grundgerüst für In-Game HUDs mit transparentem Hintergrund.",whyWeUseIt:"Ohne transparenten Body wäre der gesamte GTA-Bildschirm schwarz oder weiß.",visualOutput:"[In-Game Web CEF Overlay] Transparentes UI geladen (60 FPS)",tapTemplate:`
`,wordBank:["transparent","app","white","black"],correctWords:["transparent","app"],advTapTemplate:`<___1___ class="dialog" data-action="___2___">