<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.why2025.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Xesxen</id>
	<title>WHY2025 wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.why2025.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Xesxen"/>
	<link rel="alternate" type="text/html" href="https://wiki.why2025.org/Special:Contributions/Xesxen"/>
	<updated>2026-04-17T02:35:32Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.12</generator>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=Team:Sysadmin/Lessons_Learned&amp;diff=21497</id>
		<title>Team:Sysadmin/Lessons Learned</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=Team:Sysadmin/Lessons_Learned&amp;diff=21497"/>
		<updated>2025-12-21T14:33:01Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: Created page with &amp;quot;== Lessons learned ==  Discussed on 2025-09-08  * Past event: https://wiki.mch2022.org/Team:Sysadmin/Lessons_Learned  == General ==  * Bad: Insufficient resources (CPU/RAM). Consider a dedicated server again for next event for the more heavy services. * Bad: No budget requested. * Bad: Orga is extremely bad at planning ahead in terms of requesting resources/services. Many things had to be configured after the communicated cut-off date. * Good: Onsite server worked perfec...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Lessons learned ==&lt;br /&gt;
&lt;br /&gt;
Discussed on 2025-09-08&lt;br /&gt;
&lt;br /&gt;
* Past event: https://wiki.mch2022.org/Team:Sysadmin/Lessons_Learned&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
* Bad: Insufficient resources (CPU/RAM). Consider a dedicated server again for next event for the more heavy services.&lt;br /&gt;
* Bad: No budget requested.&lt;br /&gt;
* Bad: Orga is extremely bad at planning ahead in terms of requesting resources/services. Many things had to be configured after the communicated cut-off date.&lt;br /&gt;
* Good: Onsite server worked perfectly fine, even though it was requested after the cut-off date and we had to improvise.&lt;br /&gt;
* Improve: Better document procedures and/or create standardized forms.&lt;br /&gt;
* Bad: As mentioned last event: power can and will fail. *Definitely* get a UPS?&lt;br /&gt;
* Bad: Be more proactive in communication w/ other teams.&lt;br /&gt;
* Bad: Other orga seems harder to reach out to.&lt;br /&gt;
* Improve: Make a timeline of when to bring up services during WHY+1 early start of team. Document this on the wiki.&lt;br /&gt;
* Bad: Setting/Fixing up specifically requested things. Some topic had a tendency to stick around for multiple meetings w/ no progress in sight.&lt;br /&gt;
* Good: VPN&#039;s for Terrain DB worked for everyone as far as we know. Collaborative real-time map editing appears to have worked quite nicely.&lt;br /&gt;
* Bad: Some people apparently needed multiple certificates (concurrent connections), but wasn&#039;t mentioned to us till we were on the field (far too late). Breakdown in communication?&lt;br /&gt;
* Improve: Consider the bureaucratic/workload impact of security measures.&lt;br /&gt;
* Improve: figure out a better way to vet VPN requests (cut down on communication, delays).&lt;br /&gt;
* Improve: Figure out an LLM-policy for orga teams&lt;br /&gt;
* Improve: Further document internal procedures.&lt;br /&gt;
* Improve: Have a take-in list for all teams during the first WHY+1 orga meet.&lt;br /&gt;
* Good: A lot of memories (snaps) were collected during the event. This should prove useful for the website and Team:Info&#039;s booklet/promo next time.&lt;br /&gt;
* Improve: Visibility of the team to other orga.&lt;br /&gt;
* Improve: Get a flex working spot next time around. Yes, this costs money. It&#039;s worth it.&lt;br /&gt;
* Improve: Don&#039;t be extremely tight on finances/costs, see prior point for example.&lt;br /&gt;
&lt;br /&gt;
== Service: collabora ==&lt;br /&gt;
&lt;br /&gt;
* Bad: had tons of issues during use by other orga: black screens during initial connect, broken documents, prints missing data, copy-paste not working, etc etc&lt;br /&gt;
* Bad: this didn&#039;t seem resource-bound, machine had plenty to spare&lt;br /&gt;
&lt;br /&gt;
* Do not use this again next time.&lt;br /&gt;
&lt;br /&gt;
== Service: Grafana/MQTT ==&lt;br /&gt;
&lt;br /&gt;
* Good: More data points than ever&lt;br /&gt;
* Good: More things integrated (consumers) into the feed.&lt;br /&gt;
* Good: More data more better.&lt;br /&gt;
&lt;br /&gt;
== Service: angelsystem ==&lt;br /&gt;
&lt;br /&gt;
* Bad: barrier of responsibility needs to be made more clear.&lt;br /&gt;
&lt;br /&gt;
== Service: authentik ==&lt;br /&gt;
&lt;br /&gt;
* Improve: Next time, set up the authentication lifetime (remember me) up way earlier...&lt;br /&gt;
* Good: No complaints from our side otherwise&lt;br /&gt;
&lt;br /&gt;
== Service: Everything Kanban related ==&lt;br /&gt;
&lt;br /&gt;
* Improve: Figure out a better selection of service to host next edition. We had 3 separate options running at the end of the event.&lt;br /&gt;
* Improve: Figure out orga requirements for such software.&lt;br /&gt;
&lt;br /&gt;
* Live updating kanban boards are a must, otherwise this will lead to data corruption in some cases, and it makes meetings more chaotic if everyone has to refresh the page all the time.&lt;br /&gt;
&lt;br /&gt;
== Service: Support queue ==&lt;br /&gt;
&lt;br /&gt;
* Bad: No inter-team support ticket&lt;br /&gt;
* Bad: uses exorbitant amount of resources&lt;br /&gt;
* Bad: unintuitive UI design, not allowed to open multiple tabs&lt;br /&gt;
* Good: reliable, few issues once it was up and running&lt;br /&gt;
&lt;br /&gt;
== Service: Tickets ==&lt;br /&gt;
&lt;br /&gt;
* Bad: Not all organizational constraints were known to us ahead of time.&lt;br /&gt;
&lt;br /&gt;
== Service: Wiki ==&lt;br /&gt;
&lt;br /&gt;
* Bad: People appear to be less technical inclined. Wiki&#039;s are seen as too challenging to update.&lt;br /&gt;
* Improve: Enable the visual editor next time.&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=Meetup_After_Party_25_October_2025&amp;diff=21422</id>
		<title>Meetup After Party 25 October 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=Meetup_After_Party_25_October_2025&amp;diff=21422"/>
		<updated>2025-10-13T20:48:26Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: /* WHERE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Meeting&lt;br /&gt;
|Name=After Party, 25 October 2025&lt;br /&gt;
|StartDate=2025-10-25 13:37:00&lt;br /&gt;
|EndDate=2025-10-25 00:00:00&lt;br /&gt;
|Where=Hackalot, Eindhoven&lt;br /&gt;
}}&lt;br /&gt;
== What ==&lt;br /&gt;
An in person after party for anyone interested that made &#039;&#039;&#039;WHY2025&#039;&#039;&#039; an awesome event!&lt;br /&gt;
&lt;br /&gt;
== Program ==&lt;br /&gt;
&lt;br /&gt;
* 13:37 Doors open&lt;br /&gt;
* 14:30 Start of program&lt;br /&gt;
* 16:00 Memories and conservation&lt;br /&gt;
* approx. 19:00 food&lt;br /&gt;
&lt;br /&gt;
* Rest of time: Party&lt;br /&gt;
&lt;br /&gt;
== WHERE ==&lt;br /&gt;
The party is at Hackalot, Fransebaan 93, 5627 JP Eindhoven. This is located 6 km north of the city center. There are parking spots at the nearby Jumbo. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;The Jumbo rooftop parking lot closes after 21:00.&#039;&#039;&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
[[File:Hackalot and Jumbo P.jpg]]&lt;br /&gt;
&lt;br /&gt;
=== Public transport ===&lt;br /&gt;
From Eindhoven Centraal, you can take bus 405 until stop Artoislaan. This takes 16 minutes. The last connection is at 23:41.&lt;br /&gt;
&lt;br /&gt;
== WHO ==&lt;br /&gt;
Everyone who helped out at WHY2025 is welcome. Please note that Hackalot is limited to 128 visitors. Please add your name to the list below &#039;&#039;&#039;no later than October 18&#039;&#039;&#039;, so we know how much food/drinks to order.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! team !! Diner !! Food (tbd) Meat/Vega(n) !! Allergies/Dietary requirements&lt;br /&gt;
|-&lt;br /&gt;
{{#ask:&lt;br /&gt;
 [[namespace::UserLink]]&lt;br /&gt;
 |?team&lt;br /&gt;
 |?Diner&lt;br /&gt;
 |?Food&lt;br /&gt;
 |?Allergies&lt;br /&gt;
 |format=table&lt;br /&gt;
 |headers=show&lt;br /&gt;
 |mainlabel=Name&lt;br /&gt;
}}&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|FighterX64}} || On-site || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Stitch}} || Archive || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Ries}} || Happy Hardcore || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|killergeek}} || NOC, NUTS || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Jel}} || Info || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Manduca}} || [[Team:On-site Logistics]] || yes || Meat || - &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Manduca}}&#039;s Son || [[Team:On-site Logistics]] || yes || vegan || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Jos}} || Content || yes || Meat || - &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|MiFareLady}} || Content || yes || Meat || - &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Mack}} || [[Team:Productiehuis]] || Yes || Fooood || Geen sterke kaas (mozzarella ok)&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|a51c}} || Speaker Desk || Yes || Vega || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Peetz0r}} || Warehouse || Yes || Vega || No cheese please&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Ad}} || [[Team:Info]] || yes || Meat || - &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|eightdot}} || Noc, Nuts, Deco || yes || Meat || No Fish  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|koffiepot}} || safety || yes || Meat || - &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Boekenwuurm}} || - || - || - || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Xesxen}} || [[Team:Sysadmin]], [[Team:Warehouse]] || yes || Food || - &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|rvanlaar}} || [[Team:Warehouse]] || yes || Meat ||  + 1&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Shiz}} || On-site || yes || yes || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|JustSem}} || Bar || yes || yes || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|denz}} || Bar || yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|MrLinux}} || ROC || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Wheeze_NL}} || ROC || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|D0D0}} || ROC || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|MrUnknown}} || [[Team:NUTS]] || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Rizoom}} || Huisstijl/Flags || yes || Vega || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Erik}} || content || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Polyfloyd}} || Deco || yes || any || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Aranea}} || Onboarding || yes || any || no lactose pls   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Yawnbox}} || Press/Terrain || yes || vegan || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Firewall}} || safety || yes || any || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Winko}} || [[Team:Villages]] || yes || Meat || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Fleur}} || [[Team:Cohesion]] || yes || Vega || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Mlijn}} || [[Team:Info]] || yes || Vega || No lactose     &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|SynQ}} || [[Team:Waste]] || yes || Meat || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Emma}} || [[Team:Waste]] || yes || Meat || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|cmpxchg}} || [[Team:ROC]] || yes || Meat || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Netsmurf}} || [[Team:Projectleiding]] || yes || Meat || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Rewby}} || [[Team:NOC]] || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Dutchmartin}} || [[Team:NUTS]] || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|TangerineLop}} || [[Team:Bar]] || yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|K4T0}} || [[Team:Bar]] || yes || pescatarian || no meat &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Huubje}} || [[Team:Bar]] || yes || vegan &amp;gt; veg || lactose   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|embr}} || [[Team:Bar]] || yes || vegetarian || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|tidi}} || [[Team:Bar]] || yes || meat || -   meat ONLY&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|betsy}} || [[Team:Bar]] || yes || vegetarian || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|erincandescent}} || [[Team:Bar]] || yes || yes || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Boo75}} +1 || [[Team:Info]] || yes || no meat, yes tasty || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|JeroenDekkers}} || [[Team:Warehouse]] || yes || meat || no milk protein&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|AngelM}} || [[Hugs]] || yes || meat || no onion&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Muse}} || [[Team:Warehouse]] || yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Twi}} || [[Team:POC]] || yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Gina}} || [[Team:Terrain]] || yes || vegetarian || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Fd0}} || [[Team:Press]] || yes || low carb || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Gigawalt}} || [[Team:Press]] || yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Rox}} || [[Team:Terrain]] || yes || vega || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|IcyPalm}} || [[Team:Villages]] || yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Hans}} ||[[Team:NUTS]]|| yes || Meat || - &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Pmenke}} ||[[Team:POC]]|| yes || Meat || - &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Pieter}} ||[[Team:ROC]]|| yes || Meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Splodin}} ||[[Team:Sysadmin]]|| yes || yes || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|redlizard}} ||[[Team:Terrain]]|| yes || yes || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|hoxolotl}} ||[[Team:deco]]|| yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|konmei}} ||[[Team:Villages]][[Team:Parking]]|| yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|sirgoofy}} ||[[Team:Info]]|| yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|ReGB (Reggie)}} ||[[Team:deco]]|| yes || vega || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Dany}} || [[Team:Cohesion]]|| yes || meat || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Piiindakaas}} || [[Team:Projectleiding]] || yes || nomnom|| -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Wllm}} ||[[Team:Sysadmin]]|| yes || yes || No/Low lactose&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Nr17MetBami}} ||[[Team:Safety]]|| yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Spik-E}} ||[[Team:Deco]]|| yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|remirk}} |||| yes || vega || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Loppermann}} || [[Team:POC]] || yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Mirconnect}} || [[Team:POC]] || yes || vegetarian || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|egal}} ||[[Team:Info]]|| yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Moem}} ||[[Team:Deco]]|| yes || vega || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|SA007}} ||[[Team:Deco]]|| yes || yes || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|NancyBeers}} || PL || Yes || Anything || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|PsychiC}} ||[[Team:PartyArea]]|| yes || meat || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Zeno4ever}} ||[[Team:Permits]]|| yes || meat || -   &lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;5&amp;quot; | Total names: #TABLECOUNT &lt;br /&gt;
|}&lt;br /&gt;
-  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Seats offered===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Seats available !! Leaving from !! Time&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|remirk}} || 3 || Groningen || TBD&lt;br /&gt;
|-&lt;br /&gt;
| - || -  || - || -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Need ride===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Seats needed !! Lives in !! Remarks&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Manduca}} || 2  || Utrecht || With Son&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=Meetup_After_Party_25_October_2025&amp;diff=21410</id>
		<title>Meetup After Party 25 October 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=Meetup_After_Party_25_October_2025&amp;diff=21410"/>
		<updated>2025-10-11T14:17:36Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Meeting&lt;br /&gt;
|Name=After Party, 25 October 2025&lt;br /&gt;
|StartDate=2025-10-25 13:37:00&lt;br /&gt;
|EndDate=2025-10-25 00:00:00&lt;br /&gt;
|Where=Hackalot, Eindhoven&lt;br /&gt;
}}&lt;br /&gt;
== What ==&lt;br /&gt;
An in person after party for anyone interested that made &#039;&#039;&#039;WHY2025&#039;&#039;&#039; an awesome event!&lt;br /&gt;
&lt;br /&gt;
== Program ==&lt;br /&gt;
&lt;br /&gt;
* 13:37 Doors open&lt;br /&gt;
* 14:30 Start of program&lt;br /&gt;
* 16:00 Memories and conservation&lt;br /&gt;
* approx. 19:00 food&lt;br /&gt;
&lt;br /&gt;
* Rest of time: Party&lt;br /&gt;
&lt;br /&gt;
== WHERE ==&lt;br /&gt;
The party is at Hackalot, Fransebaan 93, 5627 JP Eindhoven. This is located 6 km north of the city center. There are parking spots at the nearby Jumbo. &lt;br /&gt;
&lt;br /&gt;
=== Public transport ===&lt;br /&gt;
From Eindhoven Centraal, you can take bus 405 until stop Artoislaan. This takes 16 minutes. The last connection is at 23:41.&lt;br /&gt;
&lt;br /&gt;
== WHO ==&lt;br /&gt;
Everyone who helped out at WHY2025 is welcome. Please note that Hackalot is limited to 128 visitors. Please add your name to the list below &#039;&#039;&#039;no later than October 18&#039;&#039;&#039;, so we know how much food/drinks to order.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! team !! Diner !! Food (tbd) Meat/Vega(n) !! Allergies/Dietary requirements&lt;br /&gt;
|-&lt;br /&gt;
{{#ask:&lt;br /&gt;
 [[namespace::UserLink]]&lt;br /&gt;
 |?team&lt;br /&gt;
 |?Diner&lt;br /&gt;
 |?Food&lt;br /&gt;
 |?Allergies&lt;br /&gt;
 |format=table&lt;br /&gt;
 |headers=show&lt;br /&gt;
 |mainlabel=Name&lt;br /&gt;
}}&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|FighterX64}} || On-site || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Stitch}} || Archive || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Ries}} || Happy Hardcore || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|killergeek}} || NOC, NUTS || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Jel}} || Info || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Manduca}} || [[Team:On-site Logistics]] || yes || Meat || - &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Manduca}}&#039;s Son || [[Team:On-site Logistics]] || yes || vegan || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Jos}} || Content || yes || Meat || - &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|MiFareLady}} || Content || yes || Meat || - &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Mack}} || [[Team:Productiehuis]] || Yes || Fooood || Geen sterke kaas (mozzarella ok)&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|a51c}} || Speaker Desk || Yes || Vega || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Peetz0r}} || Warehouse || Yes || Vega || No cheese please&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Ad}} || [[Team:Info]] || yes || Meat || - &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|eightdot}} || Noc, Nuts, Deco || yes || Meat || No Fish  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|koffiepot}} || safety || yes || Meat || - &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Boekenwuurm}} || - || - || - || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Xesxen}} || [[Team:Sysadmin]], [[Team:Warehouse]] || yes || Food || - &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|rvanlaar}} || [[Team:Warehouse]] || yes || Meat ||  + 1&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Shiz}} || On-site || yes || yes || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|JustSem}} || Bar || yes || yes || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|denz}} || Bar || yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|MrLinux}} || ROC || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Wheeze_NL}} || ROC || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|D0D0}} || ROC || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|MrUnknown}} || [[Team:NUTS]] || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Rizoom}} || Huisstijl/Flags || yes || Vega || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Erik}} || content || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Polyfloyd}} || Deco || yes || any || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Aranea}} || Onboarding || yes || any || no lactose pls   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Yawnbox}} || Press/Terrain || yes || vegan || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Firewall}} || safety || yes || any || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Winko}} || [[Team:Villages]] || yes || Meat || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Fleur}} || [[Team:Cohesion]] || yes || Vega || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Mlijn}} || [[Team:Info]] || yes || Vega || No lactose     &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|SynQ}} || [[Team:Waste]] || yes || Meat || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Emma}} || [[Team:Waste]] || yes || Meat || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|cmpxchg}} || [[Team:ROC]] || yes || Meat || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Netsmurf}} || [[Team:Projectleiding]] || yes || Meat || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Rewby}} || [[Team:NOC]] || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Dutchmartin}} || [[Team:NUTS]] || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|TangerineLop}} || [[Team:Bar]] || yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|K4T0}} || [[Team:Bar]] || yes || pescatarian || no meat &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Huubje}} || [[Team:Bar]] || yes || vegan &amp;gt; veg || lactose   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|embr}} || [[Team:Bar]] || yes || vegetarian || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|tidi}} || [[Team:Bar]] || yes || meat || -   meat ONLY&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|betsy}} || [[Team:Bar]] || yes || vegetarian || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|erincandescent}} || [[Team:Bar]] || yes || yes || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Boo75}} +1 || [[Team:Info]] || yes || no meat, yes tasty || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|JeroenDekkers}} || [[Team:Warehouse]] || yes || meat || no milk protein&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|AngelM}} || [[Hugs]] || yes || meat || no onion&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Muse}} || [[Team:Warehouse]] || yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Twi}} || [[Team:POC]] || yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Gina}} || [[Team:Terrain]] || yes || vegetarian || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Fd0}} || [[Team:Press]] || yes || low carb || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Gigawalt}} || [[Team:Press]] || yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Rox}} || [[Team:Terrain]] || yes || vega || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|IcyPalm}} || [[Team:Villages]] || yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Hans}} ||[[Team:NUTS]]|| yes || Meat || - &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Pmenke}} ||[[Team:POC]]|| yes || Meat || - &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Pieter}} ||[[Team:ROC]]|| yes || Meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Splodin}} ||[[Team:Sysadmin]]|| yes || yes || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|redlizard}} ||[[Team:Terrain]]|| yes || yes || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|hoxolotl}} ||[[Team:deco]]|| yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|konmei}} ||[[Team:Villages]][[Team:Parking]]|| yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|sirgoofy}} ||[[Team:Info]]|| yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|ReGB (Reggie)}} ||[[Team:deco]]|| yes || vega || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Dany}} || [[Team:Cohesion]]|| yes || meat || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Piiindakaas}} || [[Team:Projectleiding]] || yes || nomnom|| -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Wllm}} ||[[Team:Sysadmin]]|| yes || yes || No/Low lactose&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Nr17MetBami}} ||[[Team:Safety]]|| yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Spik-E}} ||[[Team:Deco]]|| yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|remirk}} |||| yes || vega || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Loppermann}} || [[Team:POC]] || yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Mirconnect}} || [[Team:POC]] || yes || vegetarian || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|name here}} || - || - || - || -   &lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;5&amp;quot; | Total names: #TABLECOUNT &lt;br /&gt;
|}&lt;br /&gt;
-  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Seats offered===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Seats available !! Leaving from !! Time&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|remirk}} || 3 || Groningen || TBD&lt;br /&gt;
|-&lt;br /&gt;
| - || -  || - || -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Need ride===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Seats needed !! Lives in !! Remarks&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Manduca}} || 2  || Utrecht || With Son&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=MediaWiki:Common.js&amp;diff=21409</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=MediaWiki:Common.js&amp;diff=21409"/>
		<updated>2025-10-11T14:16:30Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
function updateTableCount() {&lt;br /&gt;
	const keyword = &#039;#TABLECOUNT&#039;;&lt;br /&gt;
	const results = document.evaluate(&amp;quot;//th[contains(., \&amp;quot;&amp;quot; + keyword + &amp;quot;\&amp;quot;)]&amp;quot;, document);&lt;br /&gt;
	const items = [];&lt;br /&gt;
	while (elem = results.iterateNext()) {&lt;br /&gt;
		items.push(elem);&lt;br /&gt;
	}&lt;br /&gt;
	while (elem = items.pop()) {&lt;br /&gt;
		const table = elem.closest(&#039;table&#039;);&lt;br /&gt;
		if (!table) {&lt;br /&gt;
			continue;&lt;br /&gt;
		}&lt;br /&gt;
		elem.innerText = elem.innerText.replace(keyword, table.querySelector(&#039;tbody&#039;).childElementCount);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
function getTimeRemaining(endtime) {&lt;br /&gt;
    var t = Date.parse(endtime) - Date.parse(new Date());&lt;br /&gt;
    var seconds = Math.floor((t / 1000) % 60);&lt;br /&gt;
    var minutes = Math.floor((t / 1000 / 60) % 60);&lt;br /&gt;
    var hours = Math.floor((t / (1000 * 60 * 60)) % 24);&lt;br /&gt;
    var days = Math.floor(t / (1000 * 60 * 60 * 24));&lt;br /&gt;
    return {&lt;br /&gt;
        &#039;total&#039;: t,&lt;br /&gt;
        &#039;days&#039;: days,&lt;br /&gt;
        &#039;hours&#039;: hours,&lt;br /&gt;
        &#039;minutes&#039;: minutes,&lt;br /&gt;
        &#039;seconds&#039;: seconds&lt;br /&gt;
    };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function initializeClock(id, endtime) {&lt;br /&gt;
    var clock = document.getElementById(id);&lt;br /&gt;
    var daysSpan = clock.querySelector(&#039;.days&#039;);&lt;br /&gt;
    var hoursSpan = clock.querySelector(&#039;.hours&#039;);&lt;br /&gt;
    var minutesSpan = clock.querySelector(&#039;.minutes&#039;);&lt;br /&gt;
    var secondsSpan = clock.querySelector(&#039;.seconds&#039;);&lt;br /&gt;
&lt;br /&gt;
    function updateClock() {&lt;br /&gt;
        var t = getTimeRemaining(endtime);&lt;br /&gt;
&lt;br /&gt;
        daysSpan.innerHTML = t.days;&lt;br /&gt;
        hoursSpan.innerHTML = (&#039;0&#039; + t.hours).slice(-2);&lt;br /&gt;
        minutesSpan.innerHTML = (&#039;0&#039; + t.minutes).slice(-2);&lt;br /&gt;
        secondsSpan.innerHTML = (&#039;0&#039; + t.seconds).slice(-2);&lt;br /&gt;
&lt;br /&gt;
        if (t.total &amp;lt;= 0) {&lt;br /&gt;
            clearInterval(timeinterval);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    updateClock();&lt;br /&gt;
    var timeinterval = setInterval(updateClock, 1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* only run this on the page that there is a clock div...  */&lt;br /&gt;
// Or just a plain access for comparison&lt;br /&gt;
// (no need to check exists first, it falls back to null)&lt;br /&gt;
&lt;br /&gt;
$(function () {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;Template:Countdown&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;Welcome&#039; ) {&lt;br /&gt;
        var deadline = new Date(2025, 07, 8, 13, 37, 42, 0); /* base 0 months */&lt;br /&gt;
        initializeClock(&#039;clockdiv&#039;, deadline);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;Template:BuildupCountdown&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;Welcome&#039; ) {&lt;br /&gt;
        var buildupdeadline = new Date(2025, 07, 1, 0, 0, 0, 0); /* base 0 months */&lt;br /&gt;
        initializeClock(&#039;buildupclockdiv&#039;, buildupdeadline);&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
var mqttinitstarted = false;&lt;br /&gt;
  var mqttClient = null;&lt;br /&gt;
  function initMqtt() {&lt;br /&gt;
    if(typeof mqtt == &amp;quot;undefined&amp;quot; &amp;amp;&amp;amp; !mqttinitstarted) {&lt;br /&gt;
      mqttinitstarted = true;&lt;br /&gt;
      (function(d, script) {&lt;br /&gt;
      script = d.createElement(&#039;script&#039;);&lt;br /&gt;
      script.type = &#039;text/javascript&#039;;&lt;br /&gt;
      script.async = true;&lt;br /&gt;
      script.onload = initMqttStep2;&lt;br /&gt;
      script.src = &#039;https://unpkg.com/mqtt@5.10.3/dist/mqtt.min.js&#039;;&lt;br /&gt;
      d.getElementsByTagName(&#039;head&#039;)[0].appendChild(script);&lt;br /&gt;
      }(document));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 function initMqttStep2(callback) {&lt;br /&gt;
    const url = &#039;wss://mqtt.why2025.org/&#039;&lt;br /&gt;
&lt;br /&gt;
    const options = {&lt;br /&gt;
      // Clean session&lt;br /&gt;
      clean: true,&lt;br /&gt;
      connectTimeout: 4000,&lt;br /&gt;
      // Authentication&lt;br /&gt;
      clientId: &#039;whywiki_&#039; + Math.floor(Math.random() * 9999999),&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    mqttClient = mqtt.connect(url, options);&lt;br /&gt;
    mqttClient.on(&#039;connect&#039;, function () {&lt;br /&gt;
        var feedelements = document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;);&lt;br /&gt;
        for(x = 0; x &amp;lt; feedelements.length; x++) {&lt;br /&gt;
            var elementtopic = feedelements[x].attributes[&#039;data-topic&#039;].value;&lt;br /&gt;
            mqttClient.subscribe(elementtopic);&lt;br /&gt;
            console.log(&amp;quot;MQTT sub on:&amp;quot; + elementtopic);&lt;br /&gt;
            if(feedelements[x].attributes[&#039;data-topic2&#039;] &amp;amp;&amp;amp; feedelements[x].attributes[&#039;data-topic2&#039;].value) {&lt;br /&gt;
                var elementtopic2 = feedelements[x].attributes[&#039;data-topic2&#039;].value;&lt;br /&gt;
                mqttClient.subscribe(elementtopic2);&lt;br /&gt;
                console.log(&amp;quot;MQTT sub on:&amp;quot; + elementtopic2);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Receive messages&lt;br /&gt;
        mqttClient.on(&#039;message&#039;, function (topic, message) {&lt;br /&gt;
          // message is Buffer&lt;br /&gt;
          console.log(&amp;quot;MQTT msg:&amp;quot;+message.toString())&lt;br /&gt;
          var feedelements = document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;);&lt;br /&gt;
          for(x = 0; x &amp;lt; feedelements.length; x++) {&lt;br /&gt;
            var elementtopic = feedelements[x].attributes[&#039;data-topic&#039;].value;&lt;br /&gt;
            var elementtopic2 = feedelements[x].attributes[&#039;data-topic2&#039;] ? feedelements[x].attributes[&#039;data-topic2&#039;].value : &amp;quot;null&amp;quot;;&lt;br /&gt;
            var elementOperation = feedelements[x].attributes[&#039;data-operation&#039;] ? feedelements[x].attributes[&#039;data-operation&#039;].value : &amp;quot;none&amp;quot;;&lt;br /&gt;
            var elementParams = feedelements[x].attributes[&#039;data-param&#039;] ? feedelements[x].attributes[&#039;data-param&#039;].value : &amp;quot;none&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            if(elementtopic == topic) {&lt;br /&gt;
                feedelements[x].attributes[&#039;data-value&#039;] = message.toString();&lt;br /&gt;
            }&lt;br /&gt;
            if(elementtopic2 == topic) {&lt;br /&gt;
                feedelements[x].attributes[&#039;data-value2&#039;] = message.toString();&lt;br /&gt;
            }&lt;br /&gt;
            if(elementtopic == topic || elementtopic2 == topic) {&lt;br /&gt;
                var finalValue = &amp;quot;&amp;quot;;&lt;br /&gt;
                switch(elementOperation) {&lt;br /&gt;
                case &amp;quot;json&amp;quot;:&lt;br /&gt;
                    var elementParamsArr = elementParams.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                    var displayObj = JSON.parse(feedelements[x].attributes[&#039;data-value&#039;]);&lt;br /&gt;
                    console.log(elementParamsArr);&lt;br /&gt;
&lt;br /&gt;
                    for (elementParam in elementParamsArr) {&lt;br /&gt;
                        console.log(displayObj);&lt;br /&gt;
                        console.log(elementParamsArr[elementParam]);&lt;br /&gt;
                        displayObj = displayObj[elementParamsArr[elementParam]];&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    finalValue = displayObj;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;sum&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 + feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;sub&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 - feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;mul&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 * feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;div&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 / feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                default:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;];&lt;br /&gt;
                }&lt;br /&gt;
                feedelements[x].innerText = finalValue;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Only make a MQTT connection for pages that use it.&lt;br /&gt;
  if (document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;).length &amp;gt; 0) {&lt;br /&gt;
    initMqtt();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
setTimeout(updateTableCount, 250);&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=MediaWiki:Common.js&amp;diff=21408</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=MediaWiki:Common.js&amp;diff=21408"/>
		<updated>2025-10-11T14:12:05Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
function updateTableCount() {&lt;br /&gt;
	const keyword = &#039;#TABLECOUNT&#039;;&lt;br /&gt;
	const results = document.evaluate(&amp;quot;//th[contains(., \&amp;quot;&amp;quot; + keyword + &amp;quot;\&amp;quot;)]&amp;quot;, document);&lt;br /&gt;
	const items = [];&lt;br /&gt;
	while (elem = results.iterateNext()) {&lt;br /&gt;
		items.push(elem);&lt;br /&gt;
	}&lt;br /&gt;
	while (elem = items.pop()) {&lt;br /&gt;
		const table = elem.closest(&#039;table&#039;);&lt;br /&gt;
		if (!table) {&lt;br /&gt;
			continue;&lt;br /&gt;
		}&lt;br /&gt;
		elem.innerText = elem.innerText.replace(keyword, table.querySelector(&#039;tbody&#039;).childElementCount);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
function getTimeRemaining(endtime) {&lt;br /&gt;
    var t = Date.parse(endtime) - Date.parse(new Date());&lt;br /&gt;
    var seconds = Math.floor((t / 1000) % 60);&lt;br /&gt;
    var minutes = Math.floor((t / 1000 / 60) % 60);&lt;br /&gt;
    var hours = Math.floor((t / (1000 * 60 * 60)) % 24);&lt;br /&gt;
    var days = Math.floor(t / (1000 * 60 * 60 * 24));&lt;br /&gt;
    return {&lt;br /&gt;
        &#039;total&#039;: t,&lt;br /&gt;
        &#039;days&#039;: days,&lt;br /&gt;
        &#039;hours&#039;: hours,&lt;br /&gt;
        &#039;minutes&#039;: minutes,&lt;br /&gt;
        &#039;seconds&#039;: seconds&lt;br /&gt;
    };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function initializeClock(id, endtime) {&lt;br /&gt;
    var clock = document.getElementById(id);&lt;br /&gt;
    var daysSpan = clock.querySelector(&#039;.days&#039;);&lt;br /&gt;
    var hoursSpan = clock.querySelector(&#039;.hours&#039;);&lt;br /&gt;
    var minutesSpan = clock.querySelector(&#039;.minutes&#039;);&lt;br /&gt;
    var secondsSpan = clock.querySelector(&#039;.seconds&#039;);&lt;br /&gt;
&lt;br /&gt;
    function updateClock() {&lt;br /&gt;
        var t = getTimeRemaining(endtime);&lt;br /&gt;
&lt;br /&gt;
        daysSpan.innerHTML = t.days;&lt;br /&gt;
        hoursSpan.innerHTML = (&#039;0&#039; + t.hours).slice(-2);&lt;br /&gt;
        minutesSpan.innerHTML = (&#039;0&#039; + t.minutes).slice(-2);&lt;br /&gt;
        secondsSpan.innerHTML = (&#039;0&#039; + t.seconds).slice(-2);&lt;br /&gt;
&lt;br /&gt;
        if (t.total &amp;lt;= 0) {&lt;br /&gt;
            clearInterval(timeinterval);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    updateClock();&lt;br /&gt;
    var timeinterval = setInterval(updateClock, 1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* only run this on the page that there is a clock div...  */&lt;br /&gt;
// Or just a plain access for comparison&lt;br /&gt;
// (no need to check exists first, it falls back to null)&lt;br /&gt;
&lt;br /&gt;
$(function () {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;Template:Countdown&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;Welcome&#039; ) {&lt;br /&gt;
        var deadline = new Date(2025, 07, 8, 13, 37, 42, 0); /* base 0 months */&lt;br /&gt;
        initializeClock(&#039;clockdiv&#039;, deadline);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;Template:BuildupCountdown&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;Welcome&#039; ) {&lt;br /&gt;
        var buildupdeadline = new Date(2025, 07, 1, 0, 0, 0, 0); /* base 0 months */&lt;br /&gt;
        initializeClock(&#039;buildupclockdiv&#039;, buildupdeadline);&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
var mqttinitstarted = false;&lt;br /&gt;
  var mqttClient = null;&lt;br /&gt;
  function initMqtt() {&lt;br /&gt;
    if(typeof mqtt == &amp;quot;undefined&amp;quot; &amp;amp;&amp;amp; !mqttinitstarted) {&lt;br /&gt;
      mqttinitstarted = true;&lt;br /&gt;
      (function(d, script) {&lt;br /&gt;
      script = d.createElement(&#039;script&#039;);&lt;br /&gt;
      script.type = &#039;text/javascript&#039;;&lt;br /&gt;
      script.async = true;&lt;br /&gt;
      script.onload = initMqttStep2;&lt;br /&gt;
      script.src = &#039;https://unpkg.com/mqtt@5.10.3/dist/mqtt.min.js&#039;;&lt;br /&gt;
      d.getElementsByTagName(&#039;head&#039;)[0].appendChild(script);&lt;br /&gt;
      }(document));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 function initMqttStep2(callback) {&lt;br /&gt;
    const url = &#039;wss://mqtt.why2025.org/&#039;&lt;br /&gt;
&lt;br /&gt;
    const options = {&lt;br /&gt;
      // Clean session&lt;br /&gt;
      clean: true,&lt;br /&gt;
      connectTimeout: 4000,&lt;br /&gt;
      // Authentication&lt;br /&gt;
      clientId: &#039;whywiki_&#039; + Math.floor(Math.random() * 9999999),&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    mqttClient = mqtt.connect(url, options);&lt;br /&gt;
    mqttClient.on(&#039;connect&#039;, function () {&lt;br /&gt;
        var feedelements = document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;);&lt;br /&gt;
        for(x = 0; x &amp;lt; feedelements.length; x++) {&lt;br /&gt;
            var elementtopic = feedelements[x].attributes[&#039;data-topic&#039;].value;&lt;br /&gt;
            mqttClient.subscribe(elementtopic);&lt;br /&gt;
            console.log(&amp;quot;MQTT sub on:&amp;quot; + elementtopic);&lt;br /&gt;
            if(feedelements[x].attributes[&#039;data-topic2&#039;] &amp;amp;&amp;amp; feedelements[x].attributes[&#039;data-topic2&#039;].value) {&lt;br /&gt;
                var elementtopic2 = feedelements[x].attributes[&#039;data-topic2&#039;].value;&lt;br /&gt;
                mqttClient.subscribe(elementtopic2);&lt;br /&gt;
                console.log(&amp;quot;MQTT sub on:&amp;quot; + elementtopic2);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Receive messages&lt;br /&gt;
        mqttClient.on(&#039;message&#039;, function (topic, message) {&lt;br /&gt;
          // message is Buffer&lt;br /&gt;
          console.log(&amp;quot;MQTT msg:&amp;quot;+message.toString())&lt;br /&gt;
          var feedelements = document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;);&lt;br /&gt;
          for(x = 0; x &amp;lt; feedelements.length; x++) {&lt;br /&gt;
            var elementtopic = feedelements[x].attributes[&#039;data-topic&#039;].value;&lt;br /&gt;
            var elementtopic2 = feedelements[x].attributes[&#039;data-topic2&#039;] ? feedelements[x].attributes[&#039;data-topic2&#039;].value : &amp;quot;null&amp;quot;;&lt;br /&gt;
            var elementOperation = feedelements[x].attributes[&#039;data-operation&#039;] ? feedelements[x].attributes[&#039;data-operation&#039;].value : &amp;quot;none&amp;quot;;&lt;br /&gt;
            var elementParams = feedelements[x].attributes[&#039;data-param&#039;] ? feedelements[x].attributes[&#039;data-param&#039;].value : &amp;quot;none&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            if(elementtopic == topic) {&lt;br /&gt;
                feedelements[x].attributes[&#039;data-value&#039;] = message.toString();&lt;br /&gt;
            }&lt;br /&gt;
            if(elementtopic2 == topic) {&lt;br /&gt;
                feedelements[x].attributes[&#039;data-value2&#039;] = message.toString();&lt;br /&gt;
            }&lt;br /&gt;
            if(elementtopic == topic || elementtopic2 == topic) {&lt;br /&gt;
                var finalValue = &amp;quot;&amp;quot;;&lt;br /&gt;
                switch(elementOperation) {&lt;br /&gt;
                case &amp;quot;json&amp;quot;:&lt;br /&gt;
                    var elementParamsArr = elementParams.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                    var displayObj = JSON.parse(feedelements[x].attributes[&#039;data-value&#039;]);&lt;br /&gt;
                    console.log(elementParamsArr);&lt;br /&gt;
&lt;br /&gt;
                    for (elementParam in elementParamsArr) {&lt;br /&gt;
                        console.log(displayObj);&lt;br /&gt;
                        console.log(elementParamsArr[elementParam]);&lt;br /&gt;
                        displayObj = displayObj[elementParamsArr[elementParam]];&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    finalValue = displayObj;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;sum&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 + feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;sub&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 - feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;mul&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 * feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;div&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 / feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                default:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;];&lt;br /&gt;
                }&lt;br /&gt;
                feedelements[x].innerText = finalValue;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Only make a MQTT connection for pages that use it.&lt;br /&gt;
  if (document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;).length &amp;gt; 0) {&lt;br /&gt;
    initMqtt();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
updateTableCount();&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=MediaWiki:Common.js&amp;diff=21407</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=MediaWiki:Common.js&amp;diff=21407"/>
		<updated>2025-10-11T14:10:34Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
function updateTableCount() {&lt;br /&gt;
	const keyword = &#039;#TABLECOUNT&#039;;&lt;br /&gt;
	const results = document.evaluate(&amp;quot;//th[contains(., \&amp;quot;&amp;quot; + keyword + &amp;quot;\&amp;quot;)]&amp;quot;, document);&lt;br /&gt;
	const items = [];&lt;br /&gt;
	while (elem = results.iterateNext()) {&lt;br /&gt;
		items.push(elem);&lt;br /&gt;
	}&lt;br /&gt;
	items.forEach(elem =&amp;gt; {&lt;br /&gt;
		const table = elem.closest(&#039;table&#039;);&lt;br /&gt;
		if (!table) {&lt;br /&gt;
			continue;&lt;br /&gt;
		}&lt;br /&gt;
		elem.innerText = elem.innerText.replace(keyword, table.querySelector(&#039;tbody&#039;).childElementCount);&lt;br /&gt;
	});&lt;br /&gt;
}&lt;br /&gt;
function getTimeRemaining(endtime) {&lt;br /&gt;
    var t = Date.parse(endtime) - Date.parse(new Date());&lt;br /&gt;
    var seconds = Math.floor((t / 1000) % 60);&lt;br /&gt;
    var minutes = Math.floor((t / 1000 / 60) % 60);&lt;br /&gt;
    var hours = Math.floor((t / (1000 * 60 * 60)) % 24);&lt;br /&gt;
    var days = Math.floor(t / (1000 * 60 * 60 * 24));&lt;br /&gt;
    return {&lt;br /&gt;
        &#039;total&#039;: t,&lt;br /&gt;
        &#039;days&#039;: days,&lt;br /&gt;
        &#039;hours&#039;: hours,&lt;br /&gt;
        &#039;minutes&#039;: minutes,&lt;br /&gt;
        &#039;seconds&#039;: seconds&lt;br /&gt;
    };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function initializeClock(id, endtime) {&lt;br /&gt;
    var clock = document.getElementById(id);&lt;br /&gt;
    var daysSpan = clock.querySelector(&#039;.days&#039;);&lt;br /&gt;
    var hoursSpan = clock.querySelector(&#039;.hours&#039;);&lt;br /&gt;
    var minutesSpan = clock.querySelector(&#039;.minutes&#039;);&lt;br /&gt;
    var secondsSpan = clock.querySelector(&#039;.seconds&#039;);&lt;br /&gt;
&lt;br /&gt;
    function updateClock() {&lt;br /&gt;
        var t = getTimeRemaining(endtime);&lt;br /&gt;
&lt;br /&gt;
        daysSpan.innerHTML = t.days;&lt;br /&gt;
        hoursSpan.innerHTML = (&#039;0&#039; + t.hours).slice(-2);&lt;br /&gt;
        minutesSpan.innerHTML = (&#039;0&#039; + t.minutes).slice(-2);&lt;br /&gt;
        secondsSpan.innerHTML = (&#039;0&#039; + t.seconds).slice(-2);&lt;br /&gt;
&lt;br /&gt;
        if (t.total &amp;lt;= 0) {&lt;br /&gt;
            clearInterval(timeinterval);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    updateClock();&lt;br /&gt;
    var timeinterval = setInterval(updateClock, 1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* only run this on the page that there is a clock div...  */&lt;br /&gt;
// Or just a plain access for comparison&lt;br /&gt;
// (no need to check exists first, it falls back to null)&lt;br /&gt;
&lt;br /&gt;
$(function () {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;Template:Countdown&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;Welcome&#039; ) {&lt;br /&gt;
        var deadline = new Date(2025, 07, 8, 13, 37, 42, 0); /* base 0 months */&lt;br /&gt;
        initializeClock(&#039;clockdiv&#039;, deadline);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;Template:BuildupCountdown&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;Welcome&#039; ) {&lt;br /&gt;
        var buildupdeadline = new Date(2025, 07, 1, 0, 0, 0, 0); /* base 0 months */&lt;br /&gt;
        initializeClock(&#039;buildupclockdiv&#039;, buildupdeadline);&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
var mqttinitstarted = false;&lt;br /&gt;
  var mqttClient = null;&lt;br /&gt;
  function initMqtt() {&lt;br /&gt;
    if(typeof mqtt == &amp;quot;undefined&amp;quot; &amp;amp;&amp;amp; !mqttinitstarted) {&lt;br /&gt;
      mqttinitstarted = true;&lt;br /&gt;
      (function(d, script) {&lt;br /&gt;
      script = d.createElement(&#039;script&#039;);&lt;br /&gt;
      script.type = &#039;text/javascript&#039;;&lt;br /&gt;
      script.async = true;&lt;br /&gt;
      script.onload = initMqttStep2;&lt;br /&gt;
      script.src = &#039;https://unpkg.com/mqtt@5.10.3/dist/mqtt.min.js&#039;;&lt;br /&gt;
      d.getElementsByTagName(&#039;head&#039;)[0].appendChild(script);&lt;br /&gt;
      }(document));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 function initMqttStep2(callback) {&lt;br /&gt;
    const url = &#039;wss://mqtt.why2025.org/&#039;&lt;br /&gt;
&lt;br /&gt;
    const options = {&lt;br /&gt;
      // Clean session&lt;br /&gt;
      clean: true,&lt;br /&gt;
      connectTimeout: 4000,&lt;br /&gt;
      // Authentication&lt;br /&gt;
      clientId: &#039;whywiki_&#039; + Math.floor(Math.random() * 9999999),&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    mqttClient = mqtt.connect(url, options);&lt;br /&gt;
    mqttClient.on(&#039;connect&#039;, function () {&lt;br /&gt;
        var feedelements = document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;);&lt;br /&gt;
        for(x = 0; x &amp;lt; feedelements.length; x++) {&lt;br /&gt;
            var elementtopic = feedelements[x].attributes[&#039;data-topic&#039;].value;&lt;br /&gt;
            mqttClient.subscribe(elementtopic);&lt;br /&gt;
            console.log(&amp;quot;MQTT sub on:&amp;quot; + elementtopic);&lt;br /&gt;
            if(feedelements[x].attributes[&#039;data-topic2&#039;] &amp;amp;&amp;amp; feedelements[x].attributes[&#039;data-topic2&#039;].value) {&lt;br /&gt;
                var elementtopic2 = feedelements[x].attributes[&#039;data-topic2&#039;].value;&lt;br /&gt;
                mqttClient.subscribe(elementtopic2);&lt;br /&gt;
                console.log(&amp;quot;MQTT sub on:&amp;quot; + elementtopic2);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Receive messages&lt;br /&gt;
        mqttClient.on(&#039;message&#039;, function (topic, message) {&lt;br /&gt;
          // message is Buffer&lt;br /&gt;
          console.log(&amp;quot;MQTT msg:&amp;quot;+message.toString())&lt;br /&gt;
          var feedelements = document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;);&lt;br /&gt;
          for(x = 0; x &amp;lt; feedelements.length; x++) {&lt;br /&gt;
            var elementtopic = feedelements[x].attributes[&#039;data-topic&#039;].value;&lt;br /&gt;
            var elementtopic2 = feedelements[x].attributes[&#039;data-topic2&#039;] ? feedelements[x].attributes[&#039;data-topic2&#039;].value : &amp;quot;null&amp;quot;;&lt;br /&gt;
            var elementOperation = feedelements[x].attributes[&#039;data-operation&#039;] ? feedelements[x].attributes[&#039;data-operation&#039;].value : &amp;quot;none&amp;quot;;&lt;br /&gt;
            var elementParams = feedelements[x].attributes[&#039;data-param&#039;] ? feedelements[x].attributes[&#039;data-param&#039;].value : &amp;quot;none&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            if(elementtopic == topic) {&lt;br /&gt;
                feedelements[x].attributes[&#039;data-value&#039;] = message.toString();&lt;br /&gt;
            }&lt;br /&gt;
            if(elementtopic2 == topic) {&lt;br /&gt;
                feedelements[x].attributes[&#039;data-value2&#039;] = message.toString();&lt;br /&gt;
            }&lt;br /&gt;
            if(elementtopic == topic || elementtopic2 == topic) {&lt;br /&gt;
                var finalValue = &amp;quot;&amp;quot;;&lt;br /&gt;
                switch(elementOperation) {&lt;br /&gt;
                case &amp;quot;json&amp;quot;:&lt;br /&gt;
                    var elementParamsArr = elementParams.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                    var displayObj = JSON.parse(feedelements[x].attributes[&#039;data-value&#039;]);&lt;br /&gt;
                    console.log(elementParamsArr);&lt;br /&gt;
&lt;br /&gt;
                    for (elementParam in elementParamsArr) {&lt;br /&gt;
                        console.log(displayObj);&lt;br /&gt;
                        console.log(elementParamsArr[elementParam]);&lt;br /&gt;
                        displayObj = displayObj[elementParamsArr[elementParam]];&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    finalValue = displayObj;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;sum&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 + feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;sub&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 - feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;mul&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 * feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;div&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 / feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                default:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;];&lt;br /&gt;
                }&lt;br /&gt;
                feedelements[x].innerText = finalValue;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Only make a MQTT connection for pages that use it.&lt;br /&gt;
  if (document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;).length &amp;gt; 0) {&lt;br /&gt;
    initMqtt();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
updateTableCount();&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=MediaWiki:Common.js&amp;diff=21406</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=MediaWiki:Common.js&amp;diff=21406"/>
		<updated>2025-10-11T14:09:39Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
function updateTableCount() {&lt;br /&gt;
	const keyword = &#039;#TABLECOUNT&#039;;&lt;br /&gt;
	const results = document.evaluate(&amp;quot;//th[contains(., \&amp;quot;&amp;quot; + keyword + &amp;quot;\&amp;quot;)]&amp;quot;, document);&lt;br /&gt;
	const items = [];&lt;br /&gt;
	while (elem = results.iterateNext()) {&lt;br /&gt;
		items.push(elem);&lt;br /&gt;
	}&lt;br /&gt;
	for (elem of items) {&lt;br /&gt;
		const table = elem.closest(&#039;table&#039;);&lt;br /&gt;
		if (!table) {&lt;br /&gt;
			continue;&lt;br /&gt;
		}&lt;br /&gt;
		elem.innerText = elem.innerText.replace(keyword, table.querySelector(&#039;tbody&#039;).childElementCount);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
function getTimeRemaining(endtime) {&lt;br /&gt;
    var t = Date.parse(endtime) - Date.parse(new Date());&lt;br /&gt;
    var seconds = Math.floor((t / 1000) % 60);&lt;br /&gt;
    var minutes = Math.floor((t / 1000 / 60) % 60);&lt;br /&gt;
    var hours = Math.floor((t / (1000 * 60 * 60)) % 24);&lt;br /&gt;
    var days = Math.floor(t / (1000 * 60 * 60 * 24));&lt;br /&gt;
    return {&lt;br /&gt;
        &#039;total&#039;: t,&lt;br /&gt;
        &#039;days&#039;: days,&lt;br /&gt;
        &#039;hours&#039;: hours,&lt;br /&gt;
        &#039;minutes&#039;: minutes,&lt;br /&gt;
        &#039;seconds&#039;: seconds&lt;br /&gt;
    };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function initializeClock(id, endtime) {&lt;br /&gt;
    var clock = document.getElementById(id);&lt;br /&gt;
    var daysSpan = clock.querySelector(&#039;.days&#039;);&lt;br /&gt;
    var hoursSpan = clock.querySelector(&#039;.hours&#039;);&lt;br /&gt;
    var minutesSpan = clock.querySelector(&#039;.minutes&#039;);&lt;br /&gt;
    var secondsSpan = clock.querySelector(&#039;.seconds&#039;);&lt;br /&gt;
&lt;br /&gt;
    function updateClock() {&lt;br /&gt;
        var t = getTimeRemaining(endtime);&lt;br /&gt;
&lt;br /&gt;
        daysSpan.innerHTML = t.days;&lt;br /&gt;
        hoursSpan.innerHTML = (&#039;0&#039; + t.hours).slice(-2);&lt;br /&gt;
        minutesSpan.innerHTML = (&#039;0&#039; + t.minutes).slice(-2);&lt;br /&gt;
        secondsSpan.innerHTML = (&#039;0&#039; + t.seconds).slice(-2);&lt;br /&gt;
&lt;br /&gt;
        if (t.total &amp;lt;= 0) {&lt;br /&gt;
            clearInterval(timeinterval);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    updateClock();&lt;br /&gt;
    var timeinterval = setInterval(updateClock, 1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* only run this on the page that there is a clock div...  */&lt;br /&gt;
// Or just a plain access for comparison&lt;br /&gt;
// (no need to check exists first, it falls back to null)&lt;br /&gt;
&lt;br /&gt;
$(function () {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;Template:Countdown&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;Welcome&#039; ) {&lt;br /&gt;
        var deadline = new Date(2025, 07, 8, 13, 37, 42, 0); /* base 0 months */&lt;br /&gt;
        initializeClock(&#039;clockdiv&#039;, deadline);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;Template:BuildupCountdown&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;Welcome&#039; ) {&lt;br /&gt;
        var buildupdeadline = new Date(2025, 07, 1, 0, 0, 0, 0); /* base 0 months */&lt;br /&gt;
        initializeClock(&#039;buildupclockdiv&#039;, buildupdeadline);&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
var mqttinitstarted = false;&lt;br /&gt;
  var mqttClient = null;&lt;br /&gt;
  function initMqtt() {&lt;br /&gt;
    if(typeof mqtt == &amp;quot;undefined&amp;quot; &amp;amp;&amp;amp; !mqttinitstarted) {&lt;br /&gt;
      mqttinitstarted = true;&lt;br /&gt;
      (function(d, script) {&lt;br /&gt;
      script = d.createElement(&#039;script&#039;);&lt;br /&gt;
      script.type = &#039;text/javascript&#039;;&lt;br /&gt;
      script.async = true;&lt;br /&gt;
      script.onload = initMqttStep2;&lt;br /&gt;
      script.src = &#039;https://unpkg.com/mqtt@5.10.3/dist/mqtt.min.js&#039;;&lt;br /&gt;
      d.getElementsByTagName(&#039;head&#039;)[0].appendChild(script);&lt;br /&gt;
      }(document));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 function initMqttStep2(callback) {&lt;br /&gt;
    const url = &#039;wss://mqtt.why2025.org/&#039;&lt;br /&gt;
&lt;br /&gt;
    const options = {&lt;br /&gt;
      // Clean session&lt;br /&gt;
      clean: true,&lt;br /&gt;
      connectTimeout: 4000,&lt;br /&gt;
      // Authentication&lt;br /&gt;
      clientId: &#039;whywiki_&#039; + Math.floor(Math.random() * 9999999),&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    mqttClient = mqtt.connect(url, options);&lt;br /&gt;
    mqttClient.on(&#039;connect&#039;, function () {&lt;br /&gt;
        var feedelements = document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;);&lt;br /&gt;
        for(x = 0; x &amp;lt; feedelements.length; x++) {&lt;br /&gt;
            var elementtopic = feedelements[x].attributes[&#039;data-topic&#039;].value;&lt;br /&gt;
            mqttClient.subscribe(elementtopic);&lt;br /&gt;
            console.log(&amp;quot;MQTT sub on:&amp;quot; + elementtopic);&lt;br /&gt;
            if(feedelements[x].attributes[&#039;data-topic2&#039;] &amp;amp;&amp;amp; feedelements[x].attributes[&#039;data-topic2&#039;].value) {&lt;br /&gt;
                var elementtopic2 = feedelements[x].attributes[&#039;data-topic2&#039;].value;&lt;br /&gt;
                mqttClient.subscribe(elementtopic2);&lt;br /&gt;
                console.log(&amp;quot;MQTT sub on:&amp;quot; + elementtopic2);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Receive messages&lt;br /&gt;
        mqttClient.on(&#039;message&#039;, function (topic, message) {&lt;br /&gt;
          // message is Buffer&lt;br /&gt;
          console.log(&amp;quot;MQTT msg:&amp;quot;+message.toString())&lt;br /&gt;
          var feedelements = document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;);&lt;br /&gt;
          for(x = 0; x &amp;lt; feedelements.length; x++) {&lt;br /&gt;
            var elementtopic = feedelements[x].attributes[&#039;data-topic&#039;].value;&lt;br /&gt;
            var elementtopic2 = feedelements[x].attributes[&#039;data-topic2&#039;] ? feedelements[x].attributes[&#039;data-topic2&#039;].value : &amp;quot;null&amp;quot;;&lt;br /&gt;
            var elementOperation = feedelements[x].attributes[&#039;data-operation&#039;] ? feedelements[x].attributes[&#039;data-operation&#039;].value : &amp;quot;none&amp;quot;;&lt;br /&gt;
            var elementParams = feedelements[x].attributes[&#039;data-param&#039;] ? feedelements[x].attributes[&#039;data-param&#039;].value : &amp;quot;none&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            if(elementtopic == topic) {&lt;br /&gt;
                feedelements[x].attributes[&#039;data-value&#039;] = message.toString();&lt;br /&gt;
            }&lt;br /&gt;
            if(elementtopic2 == topic) {&lt;br /&gt;
                feedelements[x].attributes[&#039;data-value2&#039;] = message.toString();&lt;br /&gt;
            }&lt;br /&gt;
            if(elementtopic == topic || elementtopic2 == topic) {&lt;br /&gt;
                var finalValue = &amp;quot;&amp;quot;;&lt;br /&gt;
                switch(elementOperation) {&lt;br /&gt;
                case &amp;quot;json&amp;quot;:&lt;br /&gt;
                    var elementParamsArr = elementParams.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                    var displayObj = JSON.parse(feedelements[x].attributes[&#039;data-value&#039;]);&lt;br /&gt;
                    console.log(elementParamsArr);&lt;br /&gt;
&lt;br /&gt;
                    for (elementParam in elementParamsArr) {&lt;br /&gt;
                        console.log(displayObj);&lt;br /&gt;
                        console.log(elementParamsArr[elementParam]);&lt;br /&gt;
                        displayObj = displayObj[elementParamsArr[elementParam]];&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    finalValue = displayObj;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;sum&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 + feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;sub&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 - feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;mul&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 * feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;div&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 / feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                default:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;];&lt;br /&gt;
                }&lt;br /&gt;
                feedelements[x].innerText = finalValue;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Only make a MQTT connection for pages that use it.&lt;br /&gt;
  if (document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;).length &amp;gt; 0) {&lt;br /&gt;
    initMqtt();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
updateTableCount();&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=MediaWiki:Common.js&amp;diff=21405</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=MediaWiki:Common.js&amp;diff=21405"/>
		<updated>2025-10-11T14:09:15Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
function updateTableCount() {&lt;br /&gt;
	const keyword = &#039;#TABLECOUNT&#039;;&lt;br /&gt;
	const results = document.evaluate(&amp;quot;//th[contains(., \&amp;quot;&amp;quot; + keyword + &amp;quot;\&amp;quot;)]`, document);&lt;br /&gt;
	const items = [];&lt;br /&gt;
	while (elem = results.iterateNext()) {&lt;br /&gt;
		items.push(elem);&lt;br /&gt;
	}&lt;br /&gt;
	for (elem of items) {&lt;br /&gt;
		const table = elem.closest(&#039;table&#039;);&lt;br /&gt;
		if (!table) {&lt;br /&gt;
			continue;&lt;br /&gt;
		}&lt;br /&gt;
		elem.innerText = elem.innerText.replace(keyword, table.querySelector(&#039;tbody&#039;).childElementCount);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
function getTimeRemaining(endtime) {&lt;br /&gt;
    var t = Date.parse(endtime) - Date.parse(new Date());&lt;br /&gt;
    var seconds = Math.floor((t / 1000) % 60);&lt;br /&gt;
    var minutes = Math.floor((t / 1000 / 60) % 60);&lt;br /&gt;
    var hours = Math.floor((t / (1000 * 60 * 60)) % 24);&lt;br /&gt;
    var days = Math.floor(t / (1000 * 60 * 60 * 24));&lt;br /&gt;
    return {&lt;br /&gt;
        &#039;total&#039;: t,&lt;br /&gt;
        &#039;days&#039;: days,&lt;br /&gt;
        &#039;hours&#039;: hours,&lt;br /&gt;
        &#039;minutes&#039;: minutes,&lt;br /&gt;
        &#039;seconds&#039;: seconds&lt;br /&gt;
    };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function initializeClock(id, endtime) {&lt;br /&gt;
    var clock = document.getElementById(id);&lt;br /&gt;
    var daysSpan = clock.querySelector(&#039;.days&#039;);&lt;br /&gt;
    var hoursSpan = clock.querySelector(&#039;.hours&#039;);&lt;br /&gt;
    var minutesSpan = clock.querySelector(&#039;.minutes&#039;);&lt;br /&gt;
    var secondsSpan = clock.querySelector(&#039;.seconds&#039;);&lt;br /&gt;
&lt;br /&gt;
    function updateClock() {&lt;br /&gt;
        var t = getTimeRemaining(endtime);&lt;br /&gt;
&lt;br /&gt;
        daysSpan.innerHTML = t.days;&lt;br /&gt;
        hoursSpan.innerHTML = (&#039;0&#039; + t.hours).slice(-2);&lt;br /&gt;
        minutesSpan.innerHTML = (&#039;0&#039; + t.minutes).slice(-2);&lt;br /&gt;
        secondsSpan.innerHTML = (&#039;0&#039; + t.seconds).slice(-2);&lt;br /&gt;
&lt;br /&gt;
        if (t.total &amp;lt;= 0) {&lt;br /&gt;
            clearInterval(timeinterval);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    updateClock();&lt;br /&gt;
    var timeinterval = setInterval(updateClock, 1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* only run this on the page that there is a clock div...  */&lt;br /&gt;
// Or just a plain access for comparison&lt;br /&gt;
// (no need to check exists first, it falls back to null)&lt;br /&gt;
&lt;br /&gt;
$(function () {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;Template:Countdown&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;Welcome&#039; ) {&lt;br /&gt;
        var deadline = new Date(2025, 07, 8, 13, 37, 42, 0); /* base 0 months */&lt;br /&gt;
        initializeClock(&#039;clockdiv&#039;, deadline);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;Template:BuildupCountdown&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;Welcome&#039; ) {&lt;br /&gt;
        var buildupdeadline = new Date(2025, 07, 1, 0, 0, 0, 0); /* base 0 months */&lt;br /&gt;
        initializeClock(&#039;buildupclockdiv&#039;, buildupdeadline);&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
var mqttinitstarted = false;&lt;br /&gt;
  var mqttClient = null;&lt;br /&gt;
  function initMqtt() {&lt;br /&gt;
    if(typeof mqtt == &amp;quot;undefined&amp;quot; &amp;amp;&amp;amp; !mqttinitstarted) {&lt;br /&gt;
      mqttinitstarted = true;&lt;br /&gt;
      (function(d, script) {&lt;br /&gt;
      script = d.createElement(&#039;script&#039;);&lt;br /&gt;
      script.type = &#039;text/javascript&#039;;&lt;br /&gt;
      script.async = true;&lt;br /&gt;
      script.onload = initMqttStep2;&lt;br /&gt;
      script.src = &#039;https://unpkg.com/mqtt@5.10.3/dist/mqtt.min.js&#039;;&lt;br /&gt;
      d.getElementsByTagName(&#039;head&#039;)[0].appendChild(script);&lt;br /&gt;
      }(document));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 function initMqttStep2(callback) {&lt;br /&gt;
    const url = &#039;wss://mqtt.why2025.org/&#039;&lt;br /&gt;
&lt;br /&gt;
    const options = {&lt;br /&gt;
      // Clean session&lt;br /&gt;
      clean: true,&lt;br /&gt;
      connectTimeout: 4000,&lt;br /&gt;
      // Authentication&lt;br /&gt;
      clientId: &#039;whywiki_&#039; + Math.floor(Math.random() * 9999999),&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    mqttClient = mqtt.connect(url, options);&lt;br /&gt;
    mqttClient.on(&#039;connect&#039;, function () {&lt;br /&gt;
        var feedelements = document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;);&lt;br /&gt;
        for(x = 0; x &amp;lt; feedelements.length; x++) {&lt;br /&gt;
            var elementtopic = feedelements[x].attributes[&#039;data-topic&#039;].value;&lt;br /&gt;
            mqttClient.subscribe(elementtopic);&lt;br /&gt;
            console.log(&amp;quot;MQTT sub on:&amp;quot; + elementtopic);&lt;br /&gt;
            if(feedelements[x].attributes[&#039;data-topic2&#039;] &amp;amp;&amp;amp; feedelements[x].attributes[&#039;data-topic2&#039;].value) {&lt;br /&gt;
                var elementtopic2 = feedelements[x].attributes[&#039;data-topic2&#039;].value;&lt;br /&gt;
                mqttClient.subscribe(elementtopic2);&lt;br /&gt;
                console.log(&amp;quot;MQTT sub on:&amp;quot; + elementtopic2);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Receive messages&lt;br /&gt;
        mqttClient.on(&#039;message&#039;, function (topic, message) {&lt;br /&gt;
          // message is Buffer&lt;br /&gt;
          console.log(&amp;quot;MQTT msg:&amp;quot;+message.toString())&lt;br /&gt;
          var feedelements = document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;);&lt;br /&gt;
          for(x = 0; x &amp;lt; feedelements.length; x++) {&lt;br /&gt;
            var elementtopic = feedelements[x].attributes[&#039;data-topic&#039;].value;&lt;br /&gt;
            var elementtopic2 = feedelements[x].attributes[&#039;data-topic2&#039;] ? feedelements[x].attributes[&#039;data-topic2&#039;].value : &amp;quot;null&amp;quot;;&lt;br /&gt;
            var elementOperation = feedelements[x].attributes[&#039;data-operation&#039;] ? feedelements[x].attributes[&#039;data-operation&#039;].value : &amp;quot;none&amp;quot;;&lt;br /&gt;
            var elementParams = feedelements[x].attributes[&#039;data-param&#039;] ? feedelements[x].attributes[&#039;data-param&#039;].value : &amp;quot;none&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            if(elementtopic == topic) {&lt;br /&gt;
                feedelements[x].attributes[&#039;data-value&#039;] = message.toString();&lt;br /&gt;
            }&lt;br /&gt;
            if(elementtopic2 == topic) {&lt;br /&gt;
                feedelements[x].attributes[&#039;data-value2&#039;] = message.toString();&lt;br /&gt;
            }&lt;br /&gt;
            if(elementtopic == topic || elementtopic2 == topic) {&lt;br /&gt;
                var finalValue = &amp;quot;&amp;quot;;&lt;br /&gt;
                switch(elementOperation) {&lt;br /&gt;
                case &amp;quot;json&amp;quot;:&lt;br /&gt;
                    var elementParamsArr = elementParams.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                    var displayObj = JSON.parse(feedelements[x].attributes[&#039;data-value&#039;]);&lt;br /&gt;
                    console.log(elementParamsArr);&lt;br /&gt;
&lt;br /&gt;
                    for (elementParam in elementParamsArr) {&lt;br /&gt;
                        console.log(displayObj);&lt;br /&gt;
                        console.log(elementParamsArr[elementParam]);&lt;br /&gt;
                        displayObj = displayObj[elementParamsArr[elementParam]];&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    finalValue = displayObj;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;sum&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 + feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;sub&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 - feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;mul&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 * feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;div&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 / feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                default:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;];&lt;br /&gt;
                }&lt;br /&gt;
                feedelements[x].innerText = finalValue;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Only make a MQTT connection for pages that use it.&lt;br /&gt;
  if (document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;).length &amp;gt; 0) {&lt;br /&gt;
    initMqtt();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
updateTableCount();&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=MediaWiki:Common.js&amp;diff=21404</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=MediaWiki:Common.js&amp;diff=21404"/>
		<updated>2025-10-11T14:08:30Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
function updateTableCount() {&lt;br /&gt;
	const keyword = &#039;#TABLECOUNT&#039;;&lt;br /&gt;
	const results = document.evaluate(`//th[contains(., &amp;quot;${keyword}&amp;quot;)]`, document);&lt;br /&gt;
	const items = [];&lt;br /&gt;
	while (elem = results.iterateNext()) {&lt;br /&gt;
		items.push(elem);&lt;br /&gt;
	}&lt;br /&gt;
	for (elem of items) {&lt;br /&gt;
		const table = elem.closest(&#039;table&#039;);&lt;br /&gt;
		if (!table) {&lt;br /&gt;
			continue;&lt;br /&gt;
		}&lt;br /&gt;
		elem.innerText = elem.innerText.replace(keyword, table.querySelector(&#039;tbody&#039;).childElementCount);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
function getTimeRemaining(endtime) {&lt;br /&gt;
    var t = Date.parse(endtime) - Date.parse(new Date());&lt;br /&gt;
    var seconds = Math.floor((t / 1000) % 60);&lt;br /&gt;
    var minutes = Math.floor((t / 1000 / 60) % 60);&lt;br /&gt;
    var hours = Math.floor((t / (1000 * 60 * 60)) % 24);&lt;br /&gt;
    var days = Math.floor(t / (1000 * 60 * 60 * 24));&lt;br /&gt;
    return {&lt;br /&gt;
        &#039;total&#039;: t,&lt;br /&gt;
        &#039;days&#039;: days,&lt;br /&gt;
        &#039;hours&#039;: hours,&lt;br /&gt;
        &#039;minutes&#039;: minutes,&lt;br /&gt;
        &#039;seconds&#039;: seconds&lt;br /&gt;
    };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function initializeClock(id, endtime) {&lt;br /&gt;
    var clock = document.getElementById(id);&lt;br /&gt;
    var daysSpan = clock.querySelector(&#039;.days&#039;);&lt;br /&gt;
    var hoursSpan = clock.querySelector(&#039;.hours&#039;);&lt;br /&gt;
    var minutesSpan = clock.querySelector(&#039;.minutes&#039;);&lt;br /&gt;
    var secondsSpan = clock.querySelector(&#039;.seconds&#039;);&lt;br /&gt;
&lt;br /&gt;
    function updateClock() {&lt;br /&gt;
        var t = getTimeRemaining(endtime);&lt;br /&gt;
&lt;br /&gt;
        daysSpan.innerHTML = t.days;&lt;br /&gt;
        hoursSpan.innerHTML = (&#039;0&#039; + t.hours).slice(-2);&lt;br /&gt;
        minutesSpan.innerHTML = (&#039;0&#039; + t.minutes).slice(-2);&lt;br /&gt;
        secondsSpan.innerHTML = (&#039;0&#039; + t.seconds).slice(-2);&lt;br /&gt;
&lt;br /&gt;
        if (t.total &amp;lt;= 0) {&lt;br /&gt;
            clearInterval(timeinterval);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    updateClock();&lt;br /&gt;
    var timeinterval = setInterval(updateClock, 1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* only run this on the page that there is a clock div...  */&lt;br /&gt;
// Or just a plain access for comparison&lt;br /&gt;
// (no need to check exists first, it falls back to null)&lt;br /&gt;
&lt;br /&gt;
$(function () {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;Template:Countdown&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;Welcome&#039; ) {&lt;br /&gt;
        var deadline = new Date(2025, 07, 8, 13, 37, 42, 0); /* base 0 months */&lt;br /&gt;
        initializeClock(&#039;clockdiv&#039;, deadline);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;Template:BuildupCountdown&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;Welcome&#039; ) {&lt;br /&gt;
        var buildupdeadline = new Date(2025, 07, 1, 0, 0, 0, 0); /* base 0 months */&lt;br /&gt;
        initializeClock(&#039;buildupclockdiv&#039;, buildupdeadline);&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
var mqttinitstarted = false;&lt;br /&gt;
  var mqttClient = null;&lt;br /&gt;
  function initMqtt() {&lt;br /&gt;
    if(typeof mqtt == &amp;quot;undefined&amp;quot; &amp;amp;&amp;amp; !mqttinitstarted) {&lt;br /&gt;
      mqttinitstarted = true;&lt;br /&gt;
      (function(d, script) {&lt;br /&gt;
      script = d.createElement(&#039;script&#039;);&lt;br /&gt;
      script.type = &#039;text/javascript&#039;;&lt;br /&gt;
      script.async = true;&lt;br /&gt;
      script.onload = initMqttStep2;&lt;br /&gt;
      script.src = &#039;https://unpkg.com/mqtt@5.10.3/dist/mqtt.min.js&#039;;&lt;br /&gt;
      d.getElementsByTagName(&#039;head&#039;)[0].appendChild(script);&lt;br /&gt;
      }(document));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 function initMqttStep2(callback) {&lt;br /&gt;
    const url = &#039;wss://mqtt.why2025.org/&#039;&lt;br /&gt;
&lt;br /&gt;
    const options = {&lt;br /&gt;
      // Clean session&lt;br /&gt;
      clean: true,&lt;br /&gt;
      connectTimeout: 4000,&lt;br /&gt;
      // Authentication&lt;br /&gt;
      clientId: &#039;whywiki_&#039; + Math.floor(Math.random() * 9999999),&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    mqttClient = mqtt.connect(url, options);&lt;br /&gt;
    mqttClient.on(&#039;connect&#039;, function () {&lt;br /&gt;
        var feedelements = document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;);&lt;br /&gt;
        for(x = 0; x &amp;lt; feedelements.length; x++) {&lt;br /&gt;
            var elementtopic = feedelements[x].attributes[&#039;data-topic&#039;].value;&lt;br /&gt;
            mqttClient.subscribe(elementtopic);&lt;br /&gt;
            console.log(&amp;quot;MQTT sub on:&amp;quot; + elementtopic);&lt;br /&gt;
            if(feedelements[x].attributes[&#039;data-topic2&#039;] &amp;amp;&amp;amp; feedelements[x].attributes[&#039;data-topic2&#039;].value) {&lt;br /&gt;
                var elementtopic2 = feedelements[x].attributes[&#039;data-topic2&#039;].value;&lt;br /&gt;
                mqttClient.subscribe(elementtopic2);&lt;br /&gt;
                console.log(&amp;quot;MQTT sub on:&amp;quot; + elementtopic2);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Receive messages&lt;br /&gt;
        mqttClient.on(&#039;message&#039;, function (topic, message) {&lt;br /&gt;
          // message is Buffer&lt;br /&gt;
          console.log(&amp;quot;MQTT msg:&amp;quot;+message.toString())&lt;br /&gt;
          var feedelements = document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;);&lt;br /&gt;
          for(x = 0; x &amp;lt; feedelements.length; x++) {&lt;br /&gt;
            var elementtopic = feedelements[x].attributes[&#039;data-topic&#039;].value;&lt;br /&gt;
            var elementtopic2 = feedelements[x].attributes[&#039;data-topic2&#039;] ? feedelements[x].attributes[&#039;data-topic2&#039;].value : &amp;quot;null&amp;quot;;&lt;br /&gt;
            var elementOperation = feedelements[x].attributes[&#039;data-operation&#039;] ? feedelements[x].attributes[&#039;data-operation&#039;].value : &amp;quot;none&amp;quot;;&lt;br /&gt;
            var elementParams = feedelements[x].attributes[&#039;data-param&#039;] ? feedelements[x].attributes[&#039;data-param&#039;].value : &amp;quot;none&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            if(elementtopic == topic) {&lt;br /&gt;
                feedelements[x].attributes[&#039;data-value&#039;] = message.toString();&lt;br /&gt;
            }&lt;br /&gt;
            if(elementtopic2 == topic) {&lt;br /&gt;
                feedelements[x].attributes[&#039;data-value2&#039;] = message.toString();&lt;br /&gt;
            }&lt;br /&gt;
            if(elementtopic == topic || elementtopic2 == topic) {&lt;br /&gt;
                var finalValue = &amp;quot;&amp;quot;;&lt;br /&gt;
                switch(elementOperation) {&lt;br /&gt;
                case &amp;quot;json&amp;quot;:&lt;br /&gt;
                    var elementParamsArr = elementParams.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                    var displayObj = JSON.parse(feedelements[x].attributes[&#039;data-value&#039;]);&lt;br /&gt;
                    console.log(elementParamsArr);&lt;br /&gt;
&lt;br /&gt;
                    for (elementParam in elementParamsArr) {&lt;br /&gt;
                        console.log(displayObj);&lt;br /&gt;
                        console.log(elementParamsArr[elementParam]);&lt;br /&gt;
                        displayObj = displayObj[elementParamsArr[elementParam]];&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    finalValue = displayObj;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;sum&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 + feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;sub&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 - feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;mul&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 * feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;div&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 / feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                default:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;];&lt;br /&gt;
                }&lt;br /&gt;
                feedelements[x].innerText = finalValue;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Only make a MQTT connection for pages that use it.&lt;br /&gt;
  if (document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;).length &amp;gt; 0) {&lt;br /&gt;
    initMqtt();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
updateTableCount();&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=MediaWiki:Common.js&amp;diff=21403</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=MediaWiki:Common.js&amp;diff=21403"/>
		<updated>2025-10-11T14:07:08Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
function getTimeRemaining(endtime) {&lt;br /&gt;
    var t = Date.parse(endtime) - Date.parse(new Date());&lt;br /&gt;
    var seconds = Math.floor((t / 1000) % 60);&lt;br /&gt;
    var minutes = Math.floor((t / 1000 / 60) % 60);&lt;br /&gt;
    var hours = Math.floor((t / (1000 * 60 * 60)) % 24);&lt;br /&gt;
    var days = Math.floor(t / (1000 * 60 * 60 * 24));&lt;br /&gt;
    return {&lt;br /&gt;
        &#039;total&#039;: t,&lt;br /&gt;
        &#039;days&#039;: days,&lt;br /&gt;
        &#039;hours&#039;: hours,&lt;br /&gt;
        &#039;minutes&#039;: minutes,&lt;br /&gt;
        &#039;seconds&#039;: seconds&lt;br /&gt;
    };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function initializeClock(id, endtime) {&lt;br /&gt;
    var clock = document.getElementById(id);&lt;br /&gt;
    var daysSpan = clock.querySelector(&#039;.days&#039;);&lt;br /&gt;
    var hoursSpan = clock.querySelector(&#039;.hours&#039;);&lt;br /&gt;
    var minutesSpan = clock.querySelector(&#039;.minutes&#039;);&lt;br /&gt;
    var secondsSpan = clock.querySelector(&#039;.seconds&#039;);&lt;br /&gt;
&lt;br /&gt;
    function updateClock() {&lt;br /&gt;
        var t = getTimeRemaining(endtime);&lt;br /&gt;
&lt;br /&gt;
        daysSpan.innerHTML = t.days;&lt;br /&gt;
        hoursSpan.innerHTML = (&#039;0&#039; + t.hours).slice(-2);&lt;br /&gt;
        minutesSpan.innerHTML = (&#039;0&#039; + t.minutes).slice(-2);&lt;br /&gt;
        secondsSpan.innerHTML = (&#039;0&#039; + t.seconds).slice(-2);&lt;br /&gt;
&lt;br /&gt;
        if (t.total &amp;lt;= 0) {&lt;br /&gt;
            clearInterval(timeinterval);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    updateClock();&lt;br /&gt;
    var timeinterval = setInterval(updateClock, 1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* only run this on the page that there is a clock div...  */&lt;br /&gt;
// Or just a plain access for comparison&lt;br /&gt;
// (no need to check exists first, it falls back to null)&lt;br /&gt;
&lt;br /&gt;
$(function () {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;Template:Countdown&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;Welcome&#039; ) {&lt;br /&gt;
        var deadline = new Date(2025, 07, 8, 13, 37, 42, 0); /* base 0 months */&lt;br /&gt;
        initializeClock(&#039;clockdiv&#039;, deadline);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;Template:BuildupCountdown&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;Welcome&#039; ) {&lt;br /&gt;
        var buildupdeadline = new Date(2025, 07, 1, 0, 0, 0, 0); /* base 0 months */&lt;br /&gt;
        initializeClock(&#039;buildupclockdiv&#039;, buildupdeadline);&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
var mqttinitstarted = false;&lt;br /&gt;
  var mqttClient = null;&lt;br /&gt;
  function initMqtt() {&lt;br /&gt;
    if(typeof mqtt == &amp;quot;undefined&amp;quot; &amp;amp;&amp;amp; !mqttinitstarted) {&lt;br /&gt;
      mqttinitstarted = true;&lt;br /&gt;
      (function(d, script) {&lt;br /&gt;
      script = d.createElement(&#039;script&#039;);&lt;br /&gt;
      script.type = &#039;text/javascript&#039;;&lt;br /&gt;
      script.async = true;&lt;br /&gt;
      script.onload = initMqttStep2;&lt;br /&gt;
      script.src = &#039;https://unpkg.com/mqtt@5.10.3/dist/mqtt.min.js&#039;;&lt;br /&gt;
      d.getElementsByTagName(&#039;head&#039;)[0].appendChild(script);&lt;br /&gt;
      }(document));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 function initMqttStep2(callback) {&lt;br /&gt;
    const url = &#039;wss://mqtt.why2025.org/&#039;&lt;br /&gt;
&lt;br /&gt;
    const options = {&lt;br /&gt;
      // Clean session&lt;br /&gt;
      clean: true,&lt;br /&gt;
      connectTimeout: 4000,&lt;br /&gt;
      // Authentication&lt;br /&gt;
      clientId: &#039;whywiki_&#039; + Math.floor(Math.random() * 9999999),&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    mqttClient = mqtt.connect(url, options);&lt;br /&gt;
    mqttClient.on(&#039;connect&#039;, function () {&lt;br /&gt;
        var feedelements = document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;);&lt;br /&gt;
        for(x = 0; x &amp;lt; feedelements.length; x++) {&lt;br /&gt;
            var elementtopic = feedelements[x].attributes[&#039;data-topic&#039;].value;&lt;br /&gt;
            mqttClient.subscribe(elementtopic);&lt;br /&gt;
            console.log(&amp;quot;MQTT sub on:&amp;quot; + elementtopic);&lt;br /&gt;
            if(feedelements[x].attributes[&#039;data-topic2&#039;] &amp;amp;&amp;amp; feedelements[x].attributes[&#039;data-topic2&#039;].value) {&lt;br /&gt;
                var elementtopic2 = feedelements[x].attributes[&#039;data-topic2&#039;].value;&lt;br /&gt;
                mqttClient.subscribe(elementtopic2);&lt;br /&gt;
                console.log(&amp;quot;MQTT sub on:&amp;quot; + elementtopic2);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Receive messages&lt;br /&gt;
        mqttClient.on(&#039;message&#039;, function (topic, message) {&lt;br /&gt;
          // message is Buffer&lt;br /&gt;
          console.log(&amp;quot;MQTT msg:&amp;quot;+message.toString())&lt;br /&gt;
          var feedelements = document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;);&lt;br /&gt;
          for(x = 0; x &amp;lt; feedelements.length; x++) {&lt;br /&gt;
            var elementtopic = feedelements[x].attributes[&#039;data-topic&#039;].value;&lt;br /&gt;
            var elementtopic2 = feedelements[x].attributes[&#039;data-topic2&#039;] ? feedelements[x].attributes[&#039;data-topic2&#039;].value : &amp;quot;null&amp;quot;;&lt;br /&gt;
            var elementOperation = feedelements[x].attributes[&#039;data-operation&#039;] ? feedelements[x].attributes[&#039;data-operation&#039;].value : &amp;quot;none&amp;quot;;&lt;br /&gt;
            var elementParams = feedelements[x].attributes[&#039;data-param&#039;] ? feedelements[x].attributes[&#039;data-param&#039;].value : &amp;quot;none&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            if(elementtopic == topic) {&lt;br /&gt;
                feedelements[x].attributes[&#039;data-value&#039;] = message.toString();&lt;br /&gt;
            }&lt;br /&gt;
            if(elementtopic2 == topic) {&lt;br /&gt;
                feedelements[x].attributes[&#039;data-value2&#039;] = message.toString();&lt;br /&gt;
            }&lt;br /&gt;
            if(elementtopic == topic || elementtopic2 == topic) {&lt;br /&gt;
                var finalValue = &amp;quot;&amp;quot;;&lt;br /&gt;
                switch(elementOperation) {&lt;br /&gt;
                case &amp;quot;json&amp;quot;:&lt;br /&gt;
                    var elementParamsArr = elementParams.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                    var displayObj = JSON.parse(feedelements[x].attributes[&#039;data-value&#039;]);&lt;br /&gt;
                    console.log(elementParamsArr);&lt;br /&gt;
&lt;br /&gt;
                    for (elementParam in elementParamsArr) {&lt;br /&gt;
                        console.log(displayObj);&lt;br /&gt;
                        console.log(elementParamsArr[elementParam]);&lt;br /&gt;
                        displayObj = displayObj[elementParamsArr[elementParam]];&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    finalValue = displayObj;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;sum&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 + feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;sub&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 - feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;mul&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 * feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;div&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 / feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                default:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;];&lt;br /&gt;
                }&lt;br /&gt;
                feedelements[x].innerText = finalValue;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Only make a MQTT connection for pages that use it.&lt;br /&gt;
  if (document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;).length &amp;gt; 0) {&lt;br /&gt;
    initMqtt();&lt;br /&gt;
  }&lt;br /&gt;
function updateTableCount() {&lt;br /&gt;
	let keyword = &#039;#TABLECOUNT&#039;;&lt;br /&gt;
	let results = document.evaluate(`//th[contains(., &amp;quot;${keyword}&amp;quot;)]`, document);&lt;br /&gt;
	let items = [];&lt;br /&gt;
	while (elem = results.iterateNext()) {&lt;br /&gt;
		items.push(elem);&lt;br /&gt;
	}&lt;br /&gt;
	for (elem of items) {&lt;br /&gt;
		let table = elem.closest(&#039;table&#039;);&lt;br /&gt;
		if (!table) {&lt;br /&gt;
			continue;&lt;br /&gt;
		}&lt;br /&gt;
		elem.innerText = elem.innerText.replace(keyword, table.querySelector(&#039;tbody&#039;).childElementCount);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
updateTableCount();&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=MediaWiki:Common.js&amp;diff=21402</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=MediaWiki:Common.js&amp;diff=21402"/>
		<updated>2025-10-11T14:06:20Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
function getTimeRemaining(endtime) {&lt;br /&gt;
    var t = Date.parse(endtime) - Date.parse(new Date());&lt;br /&gt;
    var seconds = Math.floor((t / 1000) % 60);&lt;br /&gt;
    var minutes = Math.floor((t / 1000 / 60) % 60);&lt;br /&gt;
    var hours = Math.floor((t / (1000 * 60 * 60)) % 24);&lt;br /&gt;
    var days = Math.floor(t / (1000 * 60 * 60 * 24));&lt;br /&gt;
    return {&lt;br /&gt;
        &#039;total&#039;: t,&lt;br /&gt;
        &#039;days&#039;: days,&lt;br /&gt;
        &#039;hours&#039;: hours,&lt;br /&gt;
        &#039;minutes&#039;: minutes,&lt;br /&gt;
        &#039;seconds&#039;: seconds&lt;br /&gt;
    };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function initializeClock(id, endtime) {&lt;br /&gt;
    var clock = document.getElementById(id);&lt;br /&gt;
    var daysSpan = clock.querySelector(&#039;.days&#039;);&lt;br /&gt;
    var hoursSpan = clock.querySelector(&#039;.hours&#039;);&lt;br /&gt;
    var minutesSpan = clock.querySelector(&#039;.minutes&#039;);&lt;br /&gt;
    var secondsSpan = clock.querySelector(&#039;.seconds&#039;);&lt;br /&gt;
&lt;br /&gt;
    function updateClock() {&lt;br /&gt;
        var t = getTimeRemaining(endtime);&lt;br /&gt;
&lt;br /&gt;
        daysSpan.innerHTML = t.days;&lt;br /&gt;
        hoursSpan.innerHTML = (&#039;0&#039; + t.hours).slice(-2);&lt;br /&gt;
        minutesSpan.innerHTML = (&#039;0&#039; + t.minutes).slice(-2);&lt;br /&gt;
        secondsSpan.innerHTML = (&#039;0&#039; + t.seconds).slice(-2);&lt;br /&gt;
&lt;br /&gt;
        if (t.total &amp;lt;= 0) {&lt;br /&gt;
            clearInterval(timeinterval);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    updateClock();&lt;br /&gt;
    var timeinterval = setInterval(updateClock, 1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* only run this on the page that there is a clock div...  */&lt;br /&gt;
// Or just a plain access for comparison&lt;br /&gt;
// (no need to check exists first, it falls back to null)&lt;br /&gt;
&lt;br /&gt;
$(function () {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;Template:Countdown&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;Welcome&#039; ) {&lt;br /&gt;
        var deadline = new Date(2025, 07, 8, 13, 37, 42, 0); /* base 0 months */&lt;br /&gt;
        initializeClock(&#039;clockdiv&#039;, deadline);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;Template:BuildupCountdown&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;Welcome&#039; ) {&lt;br /&gt;
        var buildupdeadline = new Date(2025, 07, 1, 0, 0, 0, 0); /* base 0 months */&lt;br /&gt;
        initializeClock(&#039;buildupclockdiv&#039;, buildupdeadline);&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
var mqttinitstarted = false;&lt;br /&gt;
  var mqttClient = null;&lt;br /&gt;
  function initMqtt() {&lt;br /&gt;
    if(typeof mqtt == &amp;quot;undefined&amp;quot; &amp;amp;&amp;amp; !mqttinitstarted) {&lt;br /&gt;
      mqttinitstarted = true;&lt;br /&gt;
      (function(d, script) {&lt;br /&gt;
      script = d.createElement(&#039;script&#039;);&lt;br /&gt;
      script.type = &#039;text/javascript&#039;;&lt;br /&gt;
      script.async = true;&lt;br /&gt;
      script.onload = initMqttStep2;&lt;br /&gt;
      script.src = &#039;https://unpkg.com/mqtt@5.10.3/dist/mqtt.min.js&#039;;&lt;br /&gt;
      d.getElementsByTagName(&#039;head&#039;)[0].appendChild(script);&lt;br /&gt;
      }(document));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 function initMqttStep2(callback) {&lt;br /&gt;
    const url = &#039;wss://mqtt.why2025.org/&#039;&lt;br /&gt;
&lt;br /&gt;
    const options = {&lt;br /&gt;
      // Clean session&lt;br /&gt;
      clean: true,&lt;br /&gt;
      connectTimeout: 4000,&lt;br /&gt;
      // Authentication&lt;br /&gt;
      clientId: &#039;whywiki_&#039; + Math.floor(Math.random() * 9999999),&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    mqttClient = mqtt.connect(url, options);&lt;br /&gt;
    mqttClient.on(&#039;connect&#039;, function () {&lt;br /&gt;
        var feedelements = document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;);&lt;br /&gt;
        for(x = 0; x &amp;lt; feedelements.length; x++) {&lt;br /&gt;
            var elementtopic = feedelements[x].attributes[&#039;data-topic&#039;].value;&lt;br /&gt;
            mqttClient.subscribe(elementtopic);&lt;br /&gt;
            console.log(&amp;quot;MQTT sub on:&amp;quot; + elementtopic);&lt;br /&gt;
            if(feedelements[x].attributes[&#039;data-topic2&#039;] &amp;amp;&amp;amp; feedelements[x].attributes[&#039;data-topic2&#039;].value) {&lt;br /&gt;
                var elementtopic2 = feedelements[x].attributes[&#039;data-topic2&#039;].value;&lt;br /&gt;
                mqttClient.subscribe(elementtopic2);&lt;br /&gt;
                console.log(&amp;quot;MQTT sub on:&amp;quot; + elementtopic2);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Receive messages&lt;br /&gt;
        mqttClient.on(&#039;message&#039;, function (topic, message) {&lt;br /&gt;
          // message is Buffer&lt;br /&gt;
          console.log(&amp;quot;MQTT msg:&amp;quot;+message.toString())&lt;br /&gt;
          var feedelements = document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;);&lt;br /&gt;
          for(x = 0; x &amp;lt; feedelements.length; x++) {&lt;br /&gt;
            var elementtopic = feedelements[x].attributes[&#039;data-topic&#039;].value;&lt;br /&gt;
            var elementtopic2 = feedelements[x].attributes[&#039;data-topic2&#039;] ? feedelements[x].attributes[&#039;data-topic2&#039;].value : &amp;quot;null&amp;quot;;&lt;br /&gt;
            var elementOperation = feedelements[x].attributes[&#039;data-operation&#039;] ? feedelements[x].attributes[&#039;data-operation&#039;].value : &amp;quot;none&amp;quot;;&lt;br /&gt;
            var elementParams = feedelements[x].attributes[&#039;data-param&#039;] ? feedelements[x].attributes[&#039;data-param&#039;].value : &amp;quot;none&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            if(elementtopic == topic) {&lt;br /&gt;
                feedelements[x].attributes[&#039;data-value&#039;] = message.toString();&lt;br /&gt;
            }&lt;br /&gt;
            if(elementtopic2 == topic) {&lt;br /&gt;
                feedelements[x].attributes[&#039;data-value2&#039;] = message.toString();&lt;br /&gt;
            }&lt;br /&gt;
            if(elementtopic == topic || elementtopic2 == topic) {&lt;br /&gt;
                var finalValue = &amp;quot;&amp;quot;;&lt;br /&gt;
                switch(elementOperation) {&lt;br /&gt;
                case &amp;quot;json&amp;quot;:&lt;br /&gt;
                    var elementParamsArr = elementParams.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                    var displayObj = JSON.parse(feedelements[x].attributes[&#039;data-value&#039;]);&lt;br /&gt;
                    console.log(elementParamsArr);&lt;br /&gt;
&lt;br /&gt;
                    for (elementParam in elementParamsArr) {&lt;br /&gt;
                        console.log(displayObj);&lt;br /&gt;
                        console.log(elementParamsArr[elementParam]);&lt;br /&gt;
                        displayObj = displayObj[elementParamsArr[elementParam]];&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    finalValue = displayObj;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;sum&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 + feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;sub&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 - feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;mul&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 * feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;div&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 / feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                default:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;];&lt;br /&gt;
                }&lt;br /&gt;
                feedelements[x].innerText = finalValue;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Only make a MQTT connection for pages that use it.&lt;br /&gt;
  if (document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;).length &amp;gt; 0) {&lt;br /&gt;
    initMqtt();&lt;br /&gt;
  }&lt;br /&gt;
function updateTableCount() {&lt;br /&gt;
try {&lt;br /&gt;
	let keyword = &#039;#TABLECOUNT&#039;;&lt;br /&gt;
	let results = document.evaluate(`//th[contains(., &amp;quot;${keyword}&amp;quot;)]`, document);&lt;br /&gt;
	let items = [];&lt;br /&gt;
	while (elem = results.iterateNext()) {&lt;br /&gt;
		items.push(elem);&lt;br /&gt;
	}&lt;br /&gt;
	for (elem of items) {&lt;br /&gt;
		let table = elem.closest(&#039;table&#039;);&lt;br /&gt;
		if (!table) {&lt;br /&gt;
			continue;&lt;br /&gt;
		}&lt;br /&gt;
		elem.innerText = elem.innerText.replace(keyword, table.querySelector(&#039;tbody&#039;).childElementCount);&lt;br /&gt;
	}&lt;br /&gt;
} catch(e) {&lt;br /&gt;
    console.error(e);&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
updateTableCount();&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=MediaWiki:Common.js&amp;diff=21401</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=MediaWiki:Common.js&amp;diff=21401"/>
		<updated>2025-10-11T14:04:52Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
function getTimeRemaining(endtime) {&lt;br /&gt;
    var t = Date.parse(endtime) - Date.parse(new Date());&lt;br /&gt;
    var seconds = Math.floor((t / 1000) % 60);&lt;br /&gt;
    var minutes = Math.floor((t / 1000 / 60) % 60);&lt;br /&gt;
    var hours = Math.floor((t / (1000 * 60 * 60)) % 24);&lt;br /&gt;
    var days = Math.floor(t / (1000 * 60 * 60 * 24));&lt;br /&gt;
    return {&lt;br /&gt;
        &#039;total&#039;: t,&lt;br /&gt;
        &#039;days&#039;: days,&lt;br /&gt;
        &#039;hours&#039;: hours,&lt;br /&gt;
        &#039;minutes&#039;: minutes,&lt;br /&gt;
        &#039;seconds&#039;: seconds&lt;br /&gt;
    };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function initializeClock(id, endtime) {&lt;br /&gt;
    var clock = document.getElementById(id);&lt;br /&gt;
    var daysSpan = clock.querySelector(&#039;.days&#039;);&lt;br /&gt;
    var hoursSpan = clock.querySelector(&#039;.hours&#039;);&lt;br /&gt;
    var minutesSpan = clock.querySelector(&#039;.minutes&#039;);&lt;br /&gt;
    var secondsSpan = clock.querySelector(&#039;.seconds&#039;);&lt;br /&gt;
&lt;br /&gt;
    function updateClock() {&lt;br /&gt;
        var t = getTimeRemaining(endtime);&lt;br /&gt;
&lt;br /&gt;
        daysSpan.innerHTML = t.days;&lt;br /&gt;
        hoursSpan.innerHTML = (&#039;0&#039; + t.hours).slice(-2);&lt;br /&gt;
        minutesSpan.innerHTML = (&#039;0&#039; + t.minutes).slice(-2);&lt;br /&gt;
        secondsSpan.innerHTML = (&#039;0&#039; + t.seconds).slice(-2);&lt;br /&gt;
&lt;br /&gt;
        if (t.total &amp;lt;= 0) {&lt;br /&gt;
            clearInterval(timeinterval);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    updateClock();&lt;br /&gt;
    var timeinterval = setInterval(updateClock, 1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* only run this on the page that there is a clock div...  */&lt;br /&gt;
// Or just a plain access for comparison&lt;br /&gt;
// (no need to check exists first, it falls back to null)&lt;br /&gt;
&lt;br /&gt;
$(function () {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;Template:Countdown&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;Welcome&#039; ) {&lt;br /&gt;
        var deadline = new Date(2025, 07, 8, 13, 37, 42, 0); /* base 0 months */&lt;br /&gt;
        initializeClock(&#039;clockdiv&#039;, deadline);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;Template:BuildupCountdown&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;Welcome&#039; ) {&lt;br /&gt;
        var buildupdeadline = new Date(2025, 07, 1, 0, 0, 0, 0); /* base 0 months */&lt;br /&gt;
        initializeClock(&#039;buildupclockdiv&#039;, buildupdeadline);&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
var mqttinitstarted = false;&lt;br /&gt;
  var mqttClient = null;&lt;br /&gt;
  function initMqtt() {&lt;br /&gt;
    if(typeof mqtt == &amp;quot;undefined&amp;quot; &amp;amp;&amp;amp; !mqttinitstarted) {&lt;br /&gt;
      mqttinitstarted = true;&lt;br /&gt;
      (function(d, script) {&lt;br /&gt;
      script = d.createElement(&#039;script&#039;);&lt;br /&gt;
      script.type = &#039;text/javascript&#039;;&lt;br /&gt;
      script.async = true;&lt;br /&gt;
      script.onload = initMqttStep2;&lt;br /&gt;
      script.src = &#039;https://unpkg.com/mqtt@5.10.3/dist/mqtt.min.js&#039;;&lt;br /&gt;
      d.getElementsByTagName(&#039;head&#039;)[0].appendChild(script);&lt;br /&gt;
      }(document));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 function initMqttStep2(callback) {&lt;br /&gt;
    const url = &#039;wss://mqtt.why2025.org/&#039;&lt;br /&gt;
&lt;br /&gt;
    const options = {&lt;br /&gt;
      // Clean session&lt;br /&gt;
      clean: true,&lt;br /&gt;
      connectTimeout: 4000,&lt;br /&gt;
      // Authentication&lt;br /&gt;
      clientId: &#039;whywiki_&#039; + Math.floor(Math.random() * 9999999),&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    mqttClient = mqtt.connect(url, options);&lt;br /&gt;
    mqttClient.on(&#039;connect&#039;, function () {&lt;br /&gt;
        var feedelements = document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;);&lt;br /&gt;
        for(x = 0; x &amp;lt; feedelements.length; x++) {&lt;br /&gt;
            var elementtopic = feedelements[x].attributes[&#039;data-topic&#039;].value;&lt;br /&gt;
            mqttClient.subscribe(elementtopic);&lt;br /&gt;
            console.log(&amp;quot;MQTT sub on:&amp;quot; + elementtopic);&lt;br /&gt;
            if(feedelements[x].attributes[&#039;data-topic2&#039;] &amp;amp;&amp;amp; feedelements[x].attributes[&#039;data-topic2&#039;].value) {&lt;br /&gt;
                var elementtopic2 = feedelements[x].attributes[&#039;data-topic2&#039;].value;&lt;br /&gt;
                mqttClient.subscribe(elementtopic2);&lt;br /&gt;
                console.log(&amp;quot;MQTT sub on:&amp;quot; + elementtopic2);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Receive messages&lt;br /&gt;
        mqttClient.on(&#039;message&#039;, function (topic, message) {&lt;br /&gt;
          // message is Buffer&lt;br /&gt;
          console.log(&amp;quot;MQTT msg:&amp;quot;+message.toString())&lt;br /&gt;
          var feedelements = document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;);&lt;br /&gt;
          for(x = 0; x &amp;lt; feedelements.length; x++) {&lt;br /&gt;
            var elementtopic = feedelements[x].attributes[&#039;data-topic&#039;].value;&lt;br /&gt;
            var elementtopic2 = feedelements[x].attributes[&#039;data-topic2&#039;] ? feedelements[x].attributes[&#039;data-topic2&#039;].value : &amp;quot;null&amp;quot;;&lt;br /&gt;
            var elementOperation = feedelements[x].attributes[&#039;data-operation&#039;] ? feedelements[x].attributes[&#039;data-operation&#039;].value : &amp;quot;none&amp;quot;;&lt;br /&gt;
            var elementParams = feedelements[x].attributes[&#039;data-param&#039;] ? feedelements[x].attributes[&#039;data-param&#039;].value : &amp;quot;none&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            if(elementtopic == topic) {&lt;br /&gt;
                feedelements[x].attributes[&#039;data-value&#039;] = message.toString();&lt;br /&gt;
            }&lt;br /&gt;
            if(elementtopic2 == topic) {&lt;br /&gt;
                feedelements[x].attributes[&#039;data-value2&#039;] = message.toString();&lt;br /&gt;
            }&lt;br /&gt;
            if(elementtopic == topic || elementtopic2 == topic) {&lt;br /&gt;
                var finalValue = &amp;quot;&amp;quot;;&lt;br /&gt;
                switch(elementOperation) {&lt;br /&gt;
                case &amp;quot;json&amp;quot;:&lt;br /&gt;
                    var elementParamsArr = elementParams.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                    var displayObj = JSON.parse(feedelements[x].attributes[&#039;data-value&#039;]);&lt;br /&gt;
                    console.log(elementParamsArr);&lt;br /&gt;
&lt;br /&gt;
                    for (elementParam in elementParamsArr) {&lt;br /&gt;
                        console.log(displayObj);&lt;br /&gt;
                        console.log(elementParamsArr[elementParam]);&lt;br /&gt;
                        displayObj = displayObj[elementParamsArr[elementParam]];&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    finalValue = displayObj;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;sum&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 + feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;sub&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 - feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;mul&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 * feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;div&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 / feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                default:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;];&lt;br /&gt;
                }&lt;br /&gt;
                feedelements[x].innerText = finalValue;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Only make a MQTT connection for pages that use it.&lt;br /&gt;
  if (document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;).length &amp;gt; 0) {&lt;br /&gt;
    initMqtt();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
try {&lt;br /&gt;
	let keyword = &#039;#TABLECOUNT&#039;;&lt;br /&gt;
	let results = document.evaluate(`//th[contains(., &amp;quot;${keyword}&amp;quot;)]`, document);&lt;br /&gt;
	let items = [];&lt;br /&gt;
	while (elem = results.iterateNext()) {&lt;br /&gt;
		items.push(elem);&lt;br /&gt;
	}&lt;br /&gt;
	for (elem of items) {&lt;br /&gt;
		let table = elem.closest(&#039;table&#039;);&lt;br /&gt;
		if (!table) {&lt;br /&gt;
			continue;&lt;br /&gt;
		}&lt;br /&gt;
		elem.innerText = elem.innerText.replace(keyword, table.querySelector(&#039;tbody&#039;).childElementCount);&lt;br /&gt;
	}&lt;br /&gt;
} catch(e) {&lt;br /&gt;
    console.error(e);&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=MediaWiki:Common.js&amp;diff=21400</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=MediaWiki:Common.js&amp;diff=21400"/>
		<updated>2025-10-11T14:04:24Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
function getTimeRemaining(endtime) {&lt;br /&gt;
    var t = Date.parse(endtime) - Date.parse(new Date());&lt;br /&gt;
    var seconds = Math.floor((t / 1000) % 60);&lt;br /&gt;
    var minutes = Math.floor((t / 1000 / 60) % 60);&lt;br /&gt;
    var hours = Math.floor((t / (1000 * 60 * 60)) % 24);&lt;br /&gt;
    var days = Math.floor(t / (1000 * 60 * 60 * 24));&lt;br /&gt;
    return {&lt;br /&gt;
        &#039;total&#039;: t,&lt;br /&gt;
        &#039;days&#039;: days,&lt;br /&gt;
        &#039;hours&#039;: hours,&lt;br /&gt;
        &#039;minutes&#039;: minutes,&lt;br /&gt;
        &#039;seconds&#039;: seconds&lt;br /&gt;
    };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function initializeClock(id, endtime) {&lt;br /&gt;
    var clock = document.getElementById(id);&lt;br /&gt;
    var daysSpan = clock.querySelector(&#039;.days&#039;);&lt;br /&gt;
    var hoursSpan = clock.querySelector(&#039;.hours&#039;);&lt;br /&gt;
    var minutesSpan = clock.querySelector(&#039;.minutes&#039;);&lt;br /&gt;
    var secondsSpan = clock.querySelector(&#039;.seconds&#039;);&lt;br /&gt;
&lt;br /&gt;
    function updateClock() {&lt;br /&gt;
        var t = getTimeRemaining(endtime);&lt;br /&gt;
&lt;br /&gt;
        daysSpan.innerHTML = t.days;&lt;br /&gt;
        hoursSpan.innerHTML = (&#039;0&#039; + t.hours).slice(-2);&lt;br /&gt;
        minutesSpan.innerHTML = (&#039;0&#039; + t.minutes).slice(-2);&lt;br /&gt;
        secondsSpan.innerHTML = (&#039;0&#039; + t.seconds).slice(-2);&lt;br /&gt;
&lt;br /&gt;
        if (t.total &amp;lt;= 0) {&lt;br /&gt;
            clearInterval(timeinterval);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    updateClock();&lt;br /&gt;
    var timeinterval = setInterval(updateClock, 1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* only run this on the page that there is a clock div...  */&lt;br /&gt;
// Or just a plain access for comparison&lt;br /&gt;
// (no need to check exists first, it falls back to null)&lt;br /&gt;
&lt;br /&gt;
$(function () {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;Template:Countdown&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;Welcome&#039; ) {&lt;br /&gt;
        var deadline = new Date(2025, 07, 8, 13, 37, 42, 0); /* base 0 months */&lt;br /&gt;
        initializeClock(&#039;clockdiv&#039;, deadline);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;Template:BuildupCountdown&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;Welcome&#039; ) {&lt;br /&gt;
        var buildupdeadline = new Date(2025, 07, 1, 0, 0, 0, 0); /* base 0 months */&lt;br /&gt;
        initializeClock(&#039;buildupclockdiv&#039;, buildupdeadline);&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
var mqttinitstarted = false;&lt;br /&gt;
  var mqttClient = null;&lt;br /&gt;
  function initMqtt() {&lt;br /&gt;
    if(typeof mqtt == &amp;quot;undefined&amp;quot; &amp;amp;&amp;amp; !mqttinitstarted) {&lt;br /&gt;
      mqttinitstarted = true;&lt;br /&gt;
      (function(d, script) {&lt;br /&gt;
      script = d.createElement(&#039;script&#039;);&lt;br /&gt;
      script.type = &#039;text/javascript&#039;;&lt;br /&gt;
      script.async = true;&lt;br /&gt;
      script.onload = initMqttStep2;&lt;br /&gt;
      script.src = &#039;https://unpkg.com/mqtt@5.10.3/dist/mqtt.min.js&#039;;&lt;br /&gt;
      d.getElementsByTagName(&#039;head&#039;)[0].appendChild(script);&lt;br /&gt;
      }(document));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 function initMqttStep2(callback) {&lt;br /&gt;
    const url = &#039;wss://mqtt.why2025.org/&#039;&lt;br /&gt;
&lt;br /&gt;
    const options = {&lt;br /&gt;
      // Clean session&lt;br /&gt;
      clean: true,&lt;br /&gt;
      connectTimeout: 4000,&lt;br /&gt;
      // Authentication&lt;br /&gt;
      clientId: &#039;whywiki_&#039; + Math.floor(Math.random() * 9999999),&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    mqttClient = mqtt.connect(url, options);&lt;br /&gt;
    mqttClient.on(&#039;connect&#039;, function () {&lt;br /&gt;
        var feedelements = document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;);&lt;br /&gt;
        for(x = 0; x &amp;lt; feedelements.length; x++) {&lt;br /&gt;
            var elementtopic = feedelements[x].attributes[&#039;data-topic&#039;].value;&lt;br /&gt;
            mqttClient.subscribe(elementtopic);&lt;br /&gt;
            console.log(&amp;quot;MQTT sub on:&amp;quot; + elementtopic);&lt;br /&gt;
            if(feedelements[x].attributes[&#039;data-topic2&#039;] &amp;amp;&amp;amp; feedelements[x].attributes[&#039;data-topic2&#039;].value) {&lt;br /&gt;
                var elementtopic2 = feedelements[x].attributes[&#039;data-topic2&#039;].value;&lt;br /&gt;
                mqttClient.subscribe(elementtopic2);&lt;br /&gt;
                console.log(&amp;quot;MQTT sub on:&amp;quot; + elementtopic2);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Receive messages&lt;br /&gt;
        mqttClient.on(&#039;message&#039;, function (topic, message) {&lt;br /&gt;
          // message is Buffer&lt;br /&gt;
          console.log(&amp;quot;MQTT msg:&amp;quot;+message.toString())&lt;br /&gt;
          var feedelements = document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;);&lt;br /&gt;
          for(x = 0; x &amp;lt; feedelements.length; x++) {&lt;br /&gt;
            var elementtopic = feedelements[x].attributes[&#039;data-topic&#039;].value;&lt;br /&gt;
            var elementtopic2 = feedelements[x].attributes[&#039;data-topic2&#039;] ? feedelements[x].attributes[&#039;data-topic2&#039;].value : &amp;quot;null&amp;quot;;&lt;br /&gt;
            var elementOperation = feedelements[x].attributes[&#039;data-operation&#039;] ? feedelements[x].attributes[&#039;data-operation&#039;].value : &amp;quot;none&amp;quot;;&lt;br /&gt;
            var elementParams = feedelements[x].attributes[&#039;data-param&#039;] ? feedelements[x].attributes[&#039;data-param&#039;].value : &amp;quot;none&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            if(elementtopic == topic) {&lt;br /&gt;
                feedelements[x].attributes[&#039;data-value&#039;] = message.toString();&lt;br /&gt;
            }&lt;br /&gt;
            if(elementtopic2 == topic) {&lt;br /&gt;
                feedelements[x].attributes[&#039;data-value2&#039;] = message.toString();&lt;br /&gt;
            }&lt;br /&gt;
            if(elementtopic == topic || elementtopic2 == topic) {&lt;br /&gt;
                var finalValue = &amp;quot;&amp;quot;;&lt;br /&gt;
                switch(elementOperation) {&lt;br /&gt;
                case &amp;quot;json&amp;quot;:&lt;br /&gt;
                    var elementParamsArr = elementParams.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                    var displayObj = JSON.parse(feedelements[x].attributes[&#039;data-value&#039;]);&lt;br /&gt;
                    console.log(elementParamsArr);&lt;br /&gt;
&lt;br /&gt;
                    for (elementParam in elementParamsArr) {&lt;br /&gt;
                        console.log(displayObj);&lt;br /&gt;
                        console.log(elementParamsArr[elementParam]);&lt;br /&gt;
                        displayObj = displayObj[elementParamsArr[elementParam]];&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    finalValue = displayObj;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;sum&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 + feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;sub&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 - feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;mul&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 * feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;div&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 / feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                default:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;];&lt;br /&gt;
                }&lt;br /&gt;
                feedelements[x].innerText = finalValue;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Only make a MQTT connection for pages that use it.&lt;br /&gt;
  if (document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;).length &amp;gt; 0) {&lt;br /&gt;
    initMqtt();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
try {&lt;br /&gt;
	const keyword = &#039;#TABLECOUNT&#039;;&lt;br /&gt;
	const results = document.evaluate(`//th[contains(., &amp;quot;${keyword}&amp;quot;)]`, document);&lt;br /&gt;
	const items = [];&lt;br /&gt;
	while (elem = results.iterateNext()) {&lt;br /&gt;
		items.push(elem);&lt;br /&gt;
	}&lt;br /&gt;
	for (elem of items) {&lt;br /&gt;
		const table = elem.closest(&#039;table&#039;);&lt;br /&gt;
		if (!table) {&lt;br /&gt;
			continue;&lt;br /&gt;
		}&lt;br /&gt;
		elem.innerText = elem.innerText.replace(keyword, table.querySelector(&#039;tbody&#039;).childElementCount);&lt;br /&gt;
	}&lt;br /&gt;
} catch(e) {&lt;br /&gt;
    console.error(e);&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=MediaWiki:Common.js&amp;diff=21399</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=MediaWiki:Common.js&amp;diff=21399"/>
		<updated>2025-10-11T14:03:01Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
function getTimeRemaining(endtime) {&lt;br /&gt;
    var t = Date.parse(endtime) - Date.parse(new Date());&lt;br /&gt;
    var seconds = Math.floor((t / 1000) % 60);&lt;br /&gt;
    var minutes = Math.floor((t / 1000 / 60) % 60);&lt;br /&gt;
    var hours = Math.floor((t / (1000 * 60 * 60)) % 24);&lt;br /&gt;
    var days = Math.floor(t / (1000 * 60 * 60 * 24));&lt;br /&gt;
    return {&lt;br /&gt;
        &#039;total&#039;: t,&lt;br /&gt;
        &#039;days&#039;: days,&lt;br /&gt;
        &#039;hours&#039;: hours,&lt;br /&gt;
        &#039;minutes&#039;: minutes,&lt;br /&gt;
        &#039;seconds&#039;: seconds&lt;br /&gt;
    };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function initializeClock(id, endtime) {&lt;br /&gt;
    var clock = document.getElementById(id);&lt;br /&gt;
    var daysSpan = clock.querySelector(&#039;.days&#039;);&lt;br /&gt;
    var hoursSpan = clock.querySelector(&#039;.hours&#039;);&lt;br /&gt;
    var minutesSpan = clock.querySelector(&#039;.minutes&#039;);&lt;br /&gt;
    var secondsSpan = clock.querySelector(&#039;.seconds&#039;);&lt;br /&gt;
&lt;br /&gt;
    function updateClock() {&lt;br /&gt;
        var t = getTimeRemaining(endtime);&lt;br /&gt;
&lt;br /&gt;
        daysSpan.innerHTML = t.days;&lt;br /&gt;
        hoursSpan.innerHTML = (&#039;0&#039; + t.hours).slice(-2);&lt;br /&gt;
        minutesSpan.innerHTML = (&#039;0&#039; + t.minutes).slice(-2);&lt;br /&gt;
        secondsSpan.innerHTML = (&#039;0&#039; + t.seconds).slice(-2);&lt;br /&gt;
&lt;br /&gt;
        if (t.total &amp;lt;= 0) {&lt;br /&gt;
            clearInterval(timeinterval);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    updateClock();&lt;br /&gt;
    var timeinterval = setInterval(updateClock, 1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* only run this on the page that there is a clock div...  */&lt;br /&gt;
// Or just a plain access for comparison&lt;br /&gt;
// (no need to check exists first, it falls back to null)&lt;br /&gt;
&lt;br /&gt;
$(function () {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;Template:Countdown&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;Welcome&#039; ) {&lt;br /&gt;
        var deadline = new Date(2025, 07, 8, 13, 37, 42, 0); /* base 0 months */&lt;br /&gt;
        initializeClock(&#039;clockdiv&#039;, deadline);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;Template:BuildupCountdown&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;Welcome&#039; ) {&lt;br /&gt;
        var buildupdeadline = new Date(2025, 07, 1, 0, 0, 0, 0); /* base 0 months */&lt;br /&gt;
        initializeClock(&#039;buildupclockdiv&#039;, buildupdeadline);&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
var mqttinitstarted = false;&lt;br /&gt;
  var mqttClient = null;&lt;br /&gt;
  function initMqtt() {&lt;br /&gt;
    if(typeof mqtt == &amp;quot;undefined&amp;quot; &amp;amp;&amp;amp; !mqttinitstarted) {&lt;br /&gt;
      mqttinitstarted = true;&lt;br /&gt;
      (function(d, script) {&lt;br /&gt;
      script = d.createElement(&#039;script&#039;);&lt;br /&gt;
      script.type = &#039;text/javascript&#039;;&lt;br /&gt;
      script.async = true;&lt;br /&gt;
      script.onload = initMqttStep2;&lt;br /&gt;
      script.src = &#039;https://unpkg.com/mqtt@5.10.3/dist/mqtt.min.js&#039;;&lt;br /&gt;
      d.getElementsByTagName(&#039;head&#039;)[0].appendChild(script);&lt;br /&gt;
      }(document));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 function initMqttStep2(callback) {&lt;br /&gt;
    const url = &#039;wss://mqtt.why2025.org/&#039;&lt;br /&gt;
&lt;br /&gt;
    const options = {&lt;br /&gt;
      // Clean session&lt;br /&gt;
      clean: true,&lt;br /&gt;
      connectTimeout: 4000,&lt;br /&gt;
      // Authentication&lt;br /&gt;
      clientId: &#039;whywiki_&#039; + Math.floor(Math.random() * 9999999),&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    mqttClient = mqtt.connect(url, options);&lt;br /&gt;
    mqttClient.on(&#039;connect&#039;, function () {&lt;br /&gt;
        var feedelements = document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;);&lt;br /&gt;
        for(x = 0; x &amp;lt; feedelements.length; x++) {&lt;br /&gt;
            var elementtopic = feedelements[x].attributes[&#039;data-topic&#039;].value;&lt;br /&gt;
            mqttClient.subscribe(elementtopic);&lt;br /&gt;
            console.log(&amp;quot;MQTT sub on:&amp;quot; + elementtopic);&lt;br /&gt;
            if(feedelements[x].attributes[&#039;data-topic2&#039;] &amp;amp;&amp;amp; feedelements[x].attributes[&#039;data-topic2&#039;].value) {&lt;br /&gt;
                var elementtopic2 = feedelements[x].attributes[&#039;data-topic2&#039;].value;&lt;br /&gt;
                mqttClient.subscribe(elementtopic2);&lt;br /&gt;
                console.log(&amp;quot;MQTT sub on:&amp;quot; + elementtopic2);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Receive messages&lt;br /&gt;
        mqttClient.on(&#039;message&#039;, function (topic, message) {&lt;br /&gt;
          // message is Buffer&lt;br /&gt;
          console.log(&amp;quot;MQTT msg:&amp;quot;+message.toString())&lt;br /&gt;
          var feedelements = document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;);&lt;br /&gt;
          for(x = 0; x &amp;lt; feedelements.length; x++) {&lt;br /&gt;
            var elementtopic = feedelements[x].attributes[&#039;data-topic&#039;].value;&lt;br /&gt;
            var elementtopic2 = feedelements[x].attributes[&#039;data-topic2&#039;] ? feedelements[x].attributes[&#039;data-topic2&#039;].value : &amp;quot;null&amp;quot;;&lt;br /&gt;
            var elementOperation = feedelements[x].attributes[&#039;data-operation&#039;] ? feedelements[x].attributes[&#039;data-operation&#039;].value : &amp;quot;none&amp;quot;;&lt;br /&gt;
            var elementParams = feedelements[x].attributes[&#039;data-param&#039;] ? feedelements[x].attributes[&#039;data-param&#039;].value : &amp;quot;none&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            if(elementtopic == topic) {&lt;br /&gt;
                feedelements[x].attributes[&#039;data-value&#039;] = message.toString();&lt;br /&gt;
            }&lt;br /&gt;
            if(elementtopic2 == topic) {&lt;br /&gt;
                feedelements[x].attributes[&#039;data-value2&#039;] = message.toString();&lt;br /&gt;
            }&lt;br /&gt;
            if(elementtopic == topic || elementtopic2 == topic) {&lt;br /&gt;
                var finalValue = &amp;quot;&amp;quot;;&lt;br /&gt;
                switch(elementOperation) {&lt;br /&gt;
                case &amp;quot;json&amp;quot;:&lt;br /&gt;
                    var elementParamsArr = elementParams.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                    var displayObj = JSON.parse(feedelements[x].attributes[&#039;data-value&#039;]);&lt;br /&gt;
                    console.log(elementParamsArr);&lt;br /&gt;
&lt;br /&gt;
                    for (elementParam in elementParamsArr) {&lt;br /&gt;
                        console.log(displayObj);&lt;br /&gt;
                        console.log(elementParamsArr[elementParam]);&lt;br /&gt;
                        displayObj = displayObj[elementParamsArr[elementParam]];&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    finalValue = displayObj;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;sum&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 + feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;sub&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 - feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;mul&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 * feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;div&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 / feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                default:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;];&lt;br /&gt;
                }&lt;br /&gt;
                feedelements[x].innerText = finalValue;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Only make a MQTT connection for pages that use it.&lt;br /&gt;
  if (document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;).length &amp;gt; 0) {&lt;br /&gt;
    initMqtt();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
try {&lt;br /&gt;
	let keyword = &#039;#TABLECOUNT&#039;;&lt;br /&gt;
	let results = document.evaluate(`//th[contains(., &amp;quot;${keyword}&amp;quot;)]`, document);&lt;br /&gt;
	let items = [];&lt;br /&gt;
	while (elem = results.iterateNext()) {&lt;br /&gt;
		items.push(elem);&lt;br /&gt;
	}&lt;br /&gt;
	for (elem of items) {&lt;br /&gt;
		let table = elem.closest(&#039;table&#039;);&lt;br /&gt;
		if (!table) {&lt;br /&gt;
			continue;&lt;br /&gt;
		}&lt;br /&gt;
		elem.innerText = elem.innerText.replace(keyword, table.querySelector(&#039;tbody&#039;).childElementCount)&lt;br /&gt;
	}&lt;br /&gt;
} catch(e) {&lt;br /&gt;
    console.error(e);&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=MediaWiki:Common.js&amp;diff=21398</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=MediaWiki:Common.js&amp;diff=21398"/>
		<updated>2025-10-11T14:02:07Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
function getTimeRemaining(endtime) {&lt;br /&gt;
    var t = Date.parse(endtime) - Date.parse(new Date());&lt;br /&gt;
    var seconds = Math.floor((t / 1000) % 60);&lt;br /&gt;
    var minutes = Math.floor((t / 1000 / 60) % 60);&lt;br /&gt;
    var hours = Math.floor((t / (1000 * 60 * 60)) % 24);&lt;br /&gt;
    var days = Math.floor(t / (1000 * 60 * 60 * 24));&lt;br /&gt;
    return {&lt;br /&gt;
        &#039;total&#039;: t,&lt;br /&gt;
        &#039;days&#039;: days,&lt;br /&gt;
        &#039;hours&#039;: hours,&lt;br /&gt;
        &#039;minutes&#039;: minutes,&lt;br /&gt;
        &#039;seconds&#039;: seconds&lt;br /&gt;
    };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function initializeClock(id, endtime) {&lt;br /&gt;
    var clock = document.getElementById(id);&lt;br /&gt;
    var daysSpan = clock.querySelector(&#039;.days&#039;);&lt;br /&gt;
    var hoursSpan = clock.querySelector(&#039;.hours&#039;);&lt;br /&gt;
    var minutesSpan = clock.querySelector(&#039;.minutes&#039;);&lt;br /&gt;
    var secondsSpan = clock.querySelector(&#039;.seconds&#039;);&lt;br /&gt;
&lt;br /&gt;
    function updateClock() {&lt;br /&gt;
        var t = getTimeRemaining(endtime);&lt;br /&gt;
&lt;br /&gt;
        daysSpan.innerHTML = t.days;&lt;br /&gt;
        hoursSpan.innerHTML = (&#039;0&#039; + t.hours).slice(-2);&lt;br /&gt;
        minutesSpan.innerHTML = (&#039;0&#039; + t.minutes).slice(-2);&lt;br /&gt;
        secondsSpan.innerHTML = (&#039;0&#039; + t.seconds).slice(-2);&lt;br /&gt;
&lt;br /&gt;
        if (t.total &amp;lt;= 0) {&lt;br /&gt;
            clearInterval(timeinterval);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    updateClock();&lt;br /&gt;
    var timeinterval = setInterval(updateClock, 1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* only run this on the page that there is a clock div...  */&lt;br /&gt;
// Or just a plain access for comparison&lt;br /&gt;
// (no need to check exists first, it falls back to null)&lt;br /&gt;
&lt;br /&gt;
$(function () {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;Template:Countdown&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;Welcome&#039; ) {&lt;br /&gt;
        var deadline = new Date(2025, 07, 8, 13, 37, 42, 0); /* base 0 months */&lt;br /&gt;
        initializeClock(&#039;clockdiv&#039;, deadline);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;Template:BuildupCountdown&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;Welcome&#039; ) {&lt;br /&gt;
        var buildupdeadline = new Date(2025, 07, 1, 0, 0, 0, 0); /* base 0 months */&lt;br /&gt;
        initializeClock(&#039;buildupclockdiv&#039;, buildupdeadline);&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
var mqttinitstarted = false;&lt;br /&gt;
  var mqttClient = null;&lt;br /&gt;
  function initMqtt() {&lt;br /&gt;
    if(typeof mqtt == &amp;quot;undefined&amp;quot; &amp;amp;&amp;amp; !mqttinitstarted) {&lt;br /&gt;
      mqttinitstarted = true;&lt;br /&gt;
      (function(d, script) {&lt;br /&gt;
      script = d.createElement(&#039;script&#039;);&lt;br /&gt;
      script.type = &#039;text/javascript&#039;;&lt;br /&gt;
      script.async = true;&lt;br /&gt;
      script.onload = initMqttStep2;&lt;br /&gt;
      script.src = &#039;https://unpkg.com/mqtt@5.10.3/dist/mqtt.min.js&#039;;&lt;br /&gt;
      d.getElementsByTagName(&#039;head&#039;)[0].appendChild(script);&lt;br /&gt;
      }(document));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 function initMqttStep2(callback) {&lt;br /&gt;
    const url = &#039;wss://mqtt.why2025.org/&#039;&lt;br /&gt;
&lt;br /&gt;
    const options = {&lt;br /&gt;
      // Clean session&lt;br /&gt;
      clean: true,&lt;br /&gt;
      connectTimeout: 4000,&lt;br /&gt;
      // Authentication&lt;br /&gt;
      clientId: &#039;whywiki_&#039; + Math.floor(Math.random() * 9999999),&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    mqttClient = mqtt.connect(url, options);&lt;br /&gt;
    mqttClient.on(&#039;connect&#039;, function () {&lt;br /&gt;
        var feedelements = document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;);&lt;br /&gt;
        for(x = 0; x &amp;lt; feedelements.length; x++) {&lt;br /&gt;
            var elementtopic = feedelements[x].attributes[&#039;data-topic&#039;].value;&lt;br /&gt;
            mqttClient.subscribe(elementtopic);&lt;br /&gt;
            console.log(&amp;quot;MQTT sub on:&amp;quot; + elementtopic);&lt;br /&gt;
            if(feedelements[x].attributes[&#039;data-topic2&#039;] &amp;amp;&amp;amp; feedelements[x].attributes[&#039;data-topic2&#039;].value) {&lt;br /&gt;
                var elementtopic2 = feedelements[x].attributes[&#039;data-topic2&#039;].value;&lt;br /&gt;
                mqttClient.subscribe(elementtopic2);&lt;br /&gt;
                console.log(&amp;quot;MQTT sub on:&amp;quot; + elementtopic2);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Receive messages&lt;br /&gt;
        mqttClient.on(&#039;message&#039;, function (topic, message) {&lt;br /&gt;
          // message is Buffer&lt;br /&gt;
          console.log(&amp;quot;MQTT msg:&amp;quot;+message.toString())&lt;br /&gt;
          var feedelements = document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;);&lt;br /&gt;
          for(x = 0; x &amp;lt; feedelements.length; x++) {&lt;br /&gt;
            var elementtopic = feedelements[x].attributes[&#039;data-topic&#039;].value;&lt;br /&gt;
            var elementtopic2 = feedelements[x].attributes[&#039;data-topic2&#039;] ? feedelements[x].attributes[&#039;data-topic2&#039;].value : &amp;quot;null&amp;quot;;&lt;br /&gt;
            var elementOperation = feedelements[x].attributes[&#039;data-operation&#039;] ? feedelements[x].attributes[&#039;data-operation&#039;].value : &amp;quot;none&amp;quot;;&lt;br /&gt;
            var elementParams = feedelements[x].attributes[&#039;data-param&#039;] ? feedelements[x].attributes[&#039;data-param&#039;].value : &amp;quot;none&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            if(elementtopic == topic) {&lt;br /&gt;
                feedelements[x].attributes[&#039;data-value&#039;] = message.toString();&lt;br /&gt;
            }&lt;br /&gt;
            if(elementtopic2 == topic) {&lt;br /&gt;
                feedelements[x].attributes[&#039;data-value2&#039;] = message.toString();&lt;br /&gt;
            }&lt;br /&gt;
            if(elementtopic == topic || elementtopic2 == topic) {&lt;br /&gt;
                var finalValue = &amp;quot;&amp;quot;;&lt;br /&gt;
                switch(elementOperation) {&lt;br /&gt;
                case &amp;quot;json&amp;quot;:&lt;br /&gt;
                    var elementParamsArr = elementParams.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                    var displayObj = JSON.parse(feedelements[x].attributes[&#039;data-value&#039;]);&lt;br /&gt;
                    console.log(elementParamsArr);&lt;br /&gt;
&lt;br /&gt;
                    for (elementParam in elementParamsArr) {&lt;br /&gt;
                        console.log(displayObj);&lt;br /&gt;
                        console.log(elementParamsArr[elementParam]);&lt;br /&gt;
                        displayObj = displayObj[elementParamsArr[elementParam]];&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    finalValue = displayObj;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;sum&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 + feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;sub&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 - feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;mul&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 * feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;div&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 / feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                default:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;];&lt;br /&gt;
                }&lt;br /&gt;
                feedelements[x].innerText = finalValue;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Only make a MQTT connection for pages that use it.&lt;br /&gt;
  if (document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;).length &amp;gt; 0) {&lt;br /&gt;
    initMqtt();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
try {&lt;br /&gt;
	const keyword = &#039;#TABLECOUNT&#039;;&lt;br /&gt;
	const results = document.evaluate(`//th[contains(., &amp;quot;${keyword}&amp;quot;)]`, document);&lt;br /&gt;
	const items = [];&lt;br /&gt;
	while (elem = results.iterateNext()) {&lt;br /&gt;
		items.push(elem);&lt;br /&gt;
	}&lt;br /&gt;
	for (elem of items) {&lt;br /&gt;
		let table = elem.closest(&#039;table&#039;);&lt;br /&gt;
		if (!table) {&lt;br /&gt;
			continue;&lt;br /&gt;
		}&lt;br /&gt;
		elem.innerText = elem.innerText.replace(keyword, table.querySelector(&#039;tbody&#039;).childElementCount)&lt;br /&gt;
	}&lt;br /&gt;
} catch(e) {&lt;br /&gt;
    console.error(e);&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=Meetup_After_Party_25_October_2025&amp;diff=21397</id>
		<title>Meetup After Party 25 October 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=Meetup_After_Party_25_October_2025&amp;diff=21397"/>
		<updated>2025-10-11T13:56:01Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Meeting&lt;br /&gt;
|Name=After Party, 25 October 2025&lt;br /&gt;
|StartDate=2025-10-25 13:37:00&lt;br /&gt;
|EndDate=2025-10-25 00:00:00&lt;br /&gt;
|Where=Hackalot, Eindhoven&lt;br /&gt;
}}&lt;br /&gt;
== What ==&lt;br /&gt;
An in person after party for anyone interested that made &#039;&#039;&#039;WHY2025&#039;&#039;&#039; an awesome event!&lt;br /&gt;
&lt;br /&gt;
== Program ==&lt;br /&gt;
&lt;br /&gt;
* 13:37 Doors open&lt;br /&gt;
* 14:30 Start of program&lt;br /&gt;
* 16:00 Memories and conservation&lt;br /&gt;
* approx. 19:00 food&lt;br /&gt;
&lt;br /&gt;
* Rest of time: Party&lt;br /&gt;
&lt;br /&gt;
== WHERE ==&lt;br /&gt;
The party is at Hackalot, Fransebaan 93, 5627 JP Eindhoven. This is located 6 km north of the city center. There are parking spots at the nearby Jumbo. &lt;br /&gt;
&lt;br /&gt;
=== Public transport ===&lt;br /&gt;
From Eindhoven Centraal, you can take bus 405 until stop Artoislaan. This takes 16 minutes. The last connection is at 23:41.&lt;br /&gt;
&lt;br /&gt;
== WHO ==&lt;br /&gt;
Everyone who helped out at WHY2025 is welcome. Please note that Hackalot is limited to 128 visitors. Please add your name to the list below &#039;&#039;&#039;no later than October 18&#039;&#039;&#039;, so we know how much food/drinks to order.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! team !! Diner !! Food (tbd) Meat/Vega(n) !! Allergies/Dietary requirements&lt;br /&gt;
|-&lt;br /&gt;
{{#ask:&lt;br /&gt;
 [[namespace::UserLink]]&lt;br /&gt;
 |?team&lt;br /&gt;
 |?Diner&lt;br /&gt;
 |?Food&lt;br /&gt;
 |?Allergies&lt;br /&gt;
 |format=table&lt;br /&gt;
 |headers=show&lt;br /&gt;
 |mainlabel=Name&lt;br /&gt;
}}&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|FighterX64}} || On-site || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Stitch}} || Archive || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Ries}} || Happy Hardcore || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|killergeek}} || NOC, NUTS || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Jel}} || Info || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Manduca}} || [[Team:On-site Logistics]] || yes || Meat || - &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Manduca}}&#039;s Son || [[Team:On-site Logistics]] || yes || vegan || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Jos}} || Content || yes || Meat || - &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|MiFareLady}} || Content || yes || Meat || - &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Mack}} || [[Team:Productiehuis]] || Yes || Fooood || Geen sterke kaas (mozzarella ok)&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|a51c}} || Speaker Desk || Yes || Vega || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Peetz0r}} || Warehouse || Yes || Vega || No cheese please&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Ad}} || [[Team:Info]] || yes || Meat || - &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|eightdot}} || Noc, Nuts, Deco || yes || Meat || No Fish  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|koffiepot}} || safety || yes || Meat || - &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Boekenwuurm}} || - || - || - || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Xesxen}} || [[Team:Sysadmin]], [[Team:Warehouse]] || yes || Food || - &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|rvanlaar}} || [[Team:Warehouse]] || yes || Meat ||  + 1&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Shiz}} || On-site || yes || yes || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|JustSem}} || Bar || yes || yes || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|denz}} || Bar || yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|MrLinux}} || ROC || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Wheeze_NL}} || ROC || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|D0D0}} || ROC || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|MrUnknown}} || [[Team:NUTS]] || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Rizoom}} || Huisstijl/Flags || yes || Vega || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Erik}} || content || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Polyfloyd}} || Deco || yes || any || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Aranea}} || Onboarding || yes || any || no lactose pls   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Yawnbox}} || Press/Terrain || yes || vegan || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Firewall}} || safety || yes || any || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Winko}} || [[Team:Villages]] || yes || Meat || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Fleur}} || [[Team:Cohesion]] || yes || Vega || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Mlijn}} || [[Team:Info]] || yes || Vega || No lactose     &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|SynQ}} || [[Team:Waste]] || yes || Meat || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Emma}} || [[Team:Waste]] || yes || Meat || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|cmpxchg}} || [[Team:ROC]] || yes || Meat || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Netsmurf}} || [[Team:Projectleiding]] || yes || Meat || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Rewby}} || [[Team:NOC]] || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Dutchmartin}} || [[Team:NUTS]] || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|TangerineLop}} || [[Team:Bar]] || yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|K4T0}} || [[Team:Bar]] || yes || pescatarian || no meat &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Huubje}} || [[Team:Bar]] || yes || vegan &amp;gt; veg || lactose   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|embr}} || [[Team:Bar]] || yes || vegetarian || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|tidi}} || [[Team:Bar]] || yes || meat || -   meat ONLY&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|betsy}} || [[Team:Bar]] || yes || vegetarian || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|erincandescent}} || [[Team:Bar]] || yes || yes || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Boo75}} +1 || [[Team:Info]] || yes || no meat, yes tasty || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|JeroenDekkers}} || [[Team:Warehouse]] || yes || meat || no milk protein&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|AngelM}} || [[Hugs]] || yes || meat || no onion&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Muse}} || [[Team:Warehouse]] || yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Twi}} || [[Team:POC]] || yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Gina}} || [[Team:Terrain]] || yes || vegetarian || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Fd0}} || [[Team:Press]] || yes || low carb || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Gigawalt}} || [[Team:Press]] || yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Rox}} || [[Team:Terrain]] || yes || vega || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|IcyPalm}} || [[Team:Villages]] || yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Hans}} ||[[Team:NUTS]]|| yes || Meat || - &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Pmenke}} ||[[Team:POC]]|| yes || Meat || - &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Pieter}} ||[[Team:ROC]]|| yes || Meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Splodin}} ||[[Team:Sysadmin]]|| yes || yes || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|redlizard}} ||[[Team:Terrain]]|| yes || yes || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|hoxolotl}} ||[[Team:deco]]|| yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|konmei}} ||[[Team:Villages]][[Team:Parking]]|| yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|sirgoofy}} ||[[Team:Info]]|| yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|ReGB (Reggie)}} ||[[Team:deco]]|| yes || vega || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Dany}} || [[Team:Cohesion]]|| yes || meat || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Piiindakaas}} || [[Team:Projectleiding]] || yes || nomnom|| -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Wllm}} ||[[Team:Sysadmin]]|| yes || yes || No/Low lactose&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Nr17MetBami}} ||[[Team:Safety]]|| yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Spik-E}} ||[[Team:Deco]]|| yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|remirk}} |||| yes || vega || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|name here}} || - || - || - || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Loppermann}} || [[Team:POC]] || yes || meat || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Mirconnect}} || [[Team:POC]] || yes || vegetarian || -&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;5&amp;quot; | Total names: #TABLECOUNT &lt;br /&gt;
|}&lt;br /&gt;
-  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Seats offered===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Seats available !! Leaving from !! Time&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|remirk}} || 3 || Groningen || TBD&lt;br /&gt;
|-&lt;br /&gt;
| - || -  || - || -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Need ride===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Seats needed !! Lives in !! Remarks&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Manduca}} || 2  || Utrecht || With Son&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=MediaWiki:Common.js&amp;diff=21396</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=MediaWiki:Common.js&amp;diff=21396"/>
		<updated>2025-10-11T13:55:23Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
function getTimeRemaining(endtime) {&lt;br /&gt;
    var t = Date.parse(endtime) - Date.parse(new Date());&lt;br /&gt;
    var seconds = Math.floor((t / 1000) % 60);&lt;br /&gt;
    var minutes = Math.floor((t / 1000 / 60) % 60);&lt;br /&gt;
    var hours = Math.floor((t / (1000 * 60 * 60)) % 24);&lt;br /&gt;
    var days = Math.floor(t / (1000 * 60 * 60 * 24));&lt;br /&gt;
    return {&lt;br /&gt;
        &#039;total&#039;: t,&lt;br /&gt;
        &#039;days&#039;: days,&lt;br /&gt;
        &#039;hours&#039;: hours,&lt;br /&gt;
        &#039;minutes&#039;: minutes,&lt;br /&gt;
        &#039;seconds&#039;: seconds&lt;br /&gt;
    };&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function initializeClock(id, endtime) {&lt;br /&gt;
    var clock = document.getElementById(id);&lt;br /&gt;
    var daysSpan = clock.querySelector(&#039;.days&#039;);&lt;br /&gt;
    var hoursSpan = clock.querySelector(&#039;.hours&#039;);&lt;br /&gt;
    var minutesSpan = clock.querySelector(&#039;.minutes&#039;);&lt;br /&gt;
    var secondsSpan = clock.querySelector(&#039;.seconds&#039;);&lt;br /&gt;
&lt;br /&gt;
    function updateClock() {&lt;br /&gt;
        var t = getTimeRemaining(endtime);&lt;br /&gt;
&lt;br /&gt;
        daysSpan.innerHTML = t.days;&lt;br /&gt;
        hoursSpan.innerHTML = (&#039;0&#039; + t.hours).slice(-2);&lt;br /&gt;
        minutesSpan.innerHTML = (&#039;0&#039; + t.minutes).slice(-2);&lt;br /&gt;
        secondsSpan.innerHTML = (&#039;0&#039; + t.seconds).slice(-2);&lt;br /&gt;
&lt;br /&gt;
        if (t.total &amp;lt;= 0) {&lt;br /&gt;
            clearInterval(timeinterval);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    updateClock();&lt;br /&gt;
    var timeinterval = setInterval(updateClock, 1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* only run this on the page that there is a clock div...  */&lt;br /&gt;
// Or just a plain access for comparison&lt;br /&gt;
// (no need to check exists first, it falls back to null)&lt;br /&gt;
&lt;br /&gt;
$(function () {&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;Template:Countdown&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;Welcome&#039; ) {&lt;br /&gt;
        var deadline = new Date(2025, 07, 8, 13, 37, 42, 0); /* base 0 months */&lt;br /&gt;
        initializeClock(&#039;clockdiv&#039;, deadline);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (mw.config.get(&#039;wgPageName&#039;) === &#039;Template:BuildupCountdown&#039; || mw.config.get(&#039;wgPageName&#039;) === &#039;Welcome&#039; ) {&lt;br /&gt;
        var buildupdeadline = new Date(2025, 07, 1, 0, 0, 0, 0); /* base 0 months */&lt;br /&gt;
        initializeClock(&#039;buildupclockdiv&#039;, buildupdeadline);&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
var mqttinitstarted = false;&lt;br /&gt;
  var mqttClient = null;&lt;br /&gt;
  function initMqtt() {&lt;br /&gt;
    if(typeof mqtt == &amp;quot;undefined&amp;quot; &amp;amp;&amp;amp; !mqttinitstarted) {&lt;br /&gt;
      mqttinitstarted = true;&lt;br /&gt;
      (function(d, script) {&lt;br /&gt;
      script = d.createElement(&#039;script&#039;);&lt;br /&gt;
      script.type = &#039;text/javascript&#039;;&lt;br /&gt;
      script.async = true;&lt;br /&gt;
      script.onload = initMqttStep2;&lt;br /&gt;
      script.src = &#039;https://unpkg.com/mqtt@5.10.3/dist/mqtt.min.js&#039;;&lt;br /&gt;
      d.getElementsByTagName(&#039;head&#039;)[0].appendChild(script);&lt;br /&gt;
      }(document));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
 function initMqttStep2(callback) {&lt;br /&gt;
    const url = &#039;wss://mqtt.why2025.org/&#039;&lt;br /&gt;
&lt;br /&gt;
    const options = {&lt;br /&gt;
      // Clean session&lt;br /&gt;
      clean: true,&lt;br /&gt;
      connectTimeout: 4000,&lt;br /&gt;
      // Authentication&lt;br /&gt;
      clientId: &#039;whywiki_&#039; + Math.floor(Math.random() * 9999999),&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    mqttClient = mqtt.connect(url, options);&lt;br /&gt;
    mqttClient.on(&#039;connect&#039;, function () {&lt;br /&gt;
        var feedelements = document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;);&lt;br /&gt;
        for(x = 0; x &amp;lt; feedelements.length; x++) {&lt;br /&gt;
            var elementtopic = feedelements[x].attributes[&#039;data-topic&#039;].value;&lt;br /&gt;
            mqttClient.subscribe(elementtopic);&lt;br /&gt;
            console.log(&amp;quot;MQTT sub on:&amp;quot; + elementtopic);&lt;br /&gt;
            if(feedelements[x].attributes[&#039;data-topic2&#039;] &amp;amp;&amp;amp; feedelements[x].attributes[&#039;data-topic2&#039;].value) {&lt;br /&gt;
                var elementtopic2 = feedelements[x].attributes[&#039;data-topic2&#039;].value;&lt;br /&gt;
                mqttClient.subscribe(elementtopic2);&lt;br /&gt;
                console.log(&amp;quot;MQTT sub on:&amp;quot; + elementtopic2);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Receive messages&lt;br /&gt;
        mqttClient.on(&#039;message&#039;, function (topic, message) {&lt;br /&gt;
          // message is Buffer&lt;br /&gt;
          console.log(&amp;quot;MQTT msg:&amp;quot;+message.toString())&lt;br /&gt;
          var feedelements = document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;);&lt;br /&gt;
          for(x = 0; x &amp;lt; feedelements.length; x++) {&lt;br /&gt;
            var elementtopic = feedelements[x].attributes[&#039;data-topic&#039;].value;&lt;br /&gt;
            var elementtopic2 = feedelements[x].attributes[&#039;data-topic2&#039;] ? feedelements[x].attributes[&#039;data-topic2&#039;].value : &amp;quot;null&amp;quot;;&lt;br /&gt;
            var elementOperation = feedelements[x].attributes[&#039;data-operation&#039;] ? feedelements[x].attributes[&#039;data-operation&#039;].value : &amp;quot;none&amp;quot;;&lt;br /&gt;
            var elementParams = feedelements[x].attributes[&#039;data-param&#039;] ? feedelements[x].attributes[&#039;data-param&#039;].value : &amp;quot;none&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            if(elementtopic == topic) {&lt;br /&gt;
                feedelements[x].attributes[&#039;data-value&#039;] = message.toString();&lt;br /&gt;
            }&lt;br /&gt;
            if(elementtopic2 == topic) {&lt;br /&gt;
                feedelements[x].attributes[&#039;data-value2&#039;] = message.toString();&lt;br /&gt;
            }&lt;br /&gt;
            if(elementtopic == topic || elementtopic2 == topic) {&lt;br /&gt;
                var finalValue = &amp;quot;&amp;quot;;&lt;br /&gt;
                switch(elementOperation) {&lt;br /&gt;
                case &amp;quot;json&amp;quot;:&lt;br /&gt;
                    var elementParamsArr = elementParams.split(&amp;quot;.&amp;quot;);&lt;br /&gt;
                    var displayObj = JSON.parse(feedelements[x].attributes[&#039;data-value&#039;]);&lt;br /&gt;
                    console.log(elementParamsArr);&lt;br /&gt;
&lt;br /&gt;
                    for (elementParam in elementParamsArr) {&lt;br /&gt;
                        console.log(displayObj);&lt;br /&gt;
                        console.log(elementParamsArr[elementParam]);&lt;br /&gt;
                        displayObj = displayObj[elementParamsArr[elementParam]];&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    finalValue = displayObj;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;sum&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 + feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;sub&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 - feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;mul&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 * feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                case &amp;quot;div&amp;quot;:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;]*1 / feedelements[x].attributes[&#039;data-value2&#039;]*1;&lt;br /&gt;
                    break;&lt;br /&gt;
                default:&lt;br /&gt;
                    finalValue = feedelements[x].attributes[&#039;data-value&#039;];&lt;br /&gt;
                }&lt;br /&gt;
                feedelements[x].innerText = finalValue;&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Only make a MQTT connection for pages that use it.&lt;br /&gt;
  if (document.getElementsByClassName(&amp;quot;mqttfeed&amp;quot;).length &amp;gt; 0) {&lt;br /&gt;
    initMqtt();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
try {&lt;br /&gt;
	const keyword = &#039;#TABLECOUNT&#039;;&lt;br /&gt;
	const results = document.evaluate(`//th[contains(., ${keyword})]`, document);&lt;br /&gt;
	while (elem = results.iterateNext()) {&lt;br /&gt;
		const table = elem.closest(&#039;table&#039;);&lt;br /&gt;
		if (!table) {&lt;br /&gt;
			continue;&lt;br /&gt;
		}&lt;br /&gt;
		elem.innerText = elem.innerText.replace(keyword, table.querySelector(&#039;tbody&#039;).childElementCount)&lt;br /&gt;
	}&lt;br /&gt;
} catch(e) {&lt;br /&gt;
    console.error(e);&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=Meetup_After_Party_25_October_2025&amp;diff=21313</id>
		<title>Meetup After Party 25 October 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=Meetup_After_Party_25_October_2025&amp;diff=21313"/>
		<updated>2025-09-23T22:59:17Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: /* WHO */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Meeting&lt;br /&gt;
|Name=After Party, 25 October 2025&lt;br /&gt;
|StartDate=2025-10-25 13:37:00&lt;br /&gt;
|EndDate=2025-10-25 00:00:00&lt;br /&gt;
|Where=Hackalot, Eindhoven&lt;br /&gt;
}}&lt;br /&gt;
== What ==&lt;br /&gt;
An in person after party for anyone interested that made &#039;&#039;&#039;WHY2025&#039;&#039;&#039; an awesome event!&lt;br /&gt;
&lt;br /&gt;
== Program ==&lt;br /&gt;
&lt;br /&gt;
* 13:37 Doors open&lt;br /&gt;
* 14:30 Start of program&lt;br /&gt;
* 16:00 Memories and conservation&lt;br /&gt;
* approx. 19:00 food&lt;br /&gt;
&lt;br /&gt;
* Rest of time: Party&lt;br /&gt;
&lt;br /&gt;
== WHO ==&lt;br /&gt;
&lt;br /&gt;
Please note that Hackalot has limited inside- and outside capacity. Be ready for a distributed main portion of the meeting. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! team !! Diner !! Food (tbd) Meat/Vega(n) !! Allergies/Dietary requirements&lt;br /&gt;
|-&lt;br /&gt;
{{#ask:&lt;br /&gt;
 [[namespace::UserLink]]&lt;br /&gt;
 |?team&lt;br /&gt;
 |?Diner&lt;br /&gt;
 |?Food&lt;br /&gt;
 |?Allergies&lt;br /&gt;
 |format=table&lt;br /&gt;
 |headers=show&lt;br /&gt;
 |mainlabel=Name&lt;br /&gt;
}}&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|FighterX64}} || On-site || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Stitch}} || Archive || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Ries}} || Happy Hardcore || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|killergeek}} || NOC, NUTS || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Jel}} || Info || yes || Meat || -  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Manduca}} || On-site || yes || Meat || - &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Jos}} || Content || yes || Meat || - &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|MiFareLady}} || Content || yes || Meat || - &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Mack}} || [[Team:Productiehuis]] || Yes || Fooood || Geen sterke kaas (mozzarella ok)&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|a51c}} || Speaker Desk || Yes || Vega || -&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Peetz0r}} || Warehouse || Yes || Vega || No cheese please&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Ad}} || Info || yes || Meat || - &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|eightdot}} || Noc, Nuts, Deco || yes || Meat || No Fish  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Boekenwuurm}} || - || - || - || -   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Xesxen}} || [[Team:Sysadmin]], [[Team:Warehouse]] || yes || Food || - &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|name here}} || - || - || - || -   &lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;5&amp;quot; | Total names: {{#ask: [[namespace::UserLink]] |format=count}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Seats offered===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Seats available !! Leaving from !! Time&lt;br /&gt;
|-&lt;br /&gt;
| - || -  || - || -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Need ride===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Seats available !! Leaving from !! Time&lt;br /&gt;
|-&lt;br /&gt;
| - || -  || - || -&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=Teamlead_Evaluation_20_September_2025&amp;diff=21298</id>
		<title>Teamlead Evaluation 20 September 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=Teamlead_Evaluation_20_September_2025&amp;diff=21298"/>
		<updated>2025-09-18T22:25:31Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: /* WHO */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Meeting&lt;br /&gt;
|Name=Teamlead Evaluation WHY2025, 20 September 2025&lt;br /&gt;
|StartDate=2025-09-20 14:00:00&lt;br /&gt;
|EndDate=2025-09-20 18:00:00&lt;br /&gt;
|Where=Bitlair, Nijverheidsweg-Noord 77&lt;br /&gt;
3812 PK Amersfoort&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Where ==&lt;br /&gt;
Bitlair Amersfoort&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nijverheidsweg-Noord 77&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3812 PK Amersfoort&lt;br /&gt;
&lt;br /&gt;
== What ==&lt;br /&gt;
A closed meeting for team leads of the core orga of WHY2025.&lt;br /&gt;
&lt;br /&gt;
We will evaluate the preparation and running of WHY2025 with the team leads of the 42 teams.&lt;br /&gt;
&lt;br /&gt;
Goal of this session:&lt;br /&gt;
&lt;br /&gt;
We have an external facilitator who will do the session with us. &lt;br /&gt;
There will be space for all the feedback on this camp and a way to &amp;quot;catch and keep&amp;quot; the succesfactors and the lessons learned for the orga of 2029.&lt;br /&gt;
&lt;br /&gt;
The programme is designed to have us connect, discuss, and evaluate what it was like to prepare and run WHY2025. We do that in order to anchor and document our lessons learned and the areas of improvement, for our successors and/or our future selves.&lt;br /&gt;
&lt;br /&gt;
We&#039;ll use facilitated formats, in three successive thematic steps:&lt;br /&gt;
&lt;br /&gt;
1. Connecting and looking back - exploring together what matters about your own experience and our shared experience of preparing and running WHY2025;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Exploring how we&#039;ve learned to lead our teams, to build on each other&#039;s strengths and responsibilities;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Lastly, we tie the strands together to anchor what knowledge and practices we cherish and want to pass on!&lt;br /&gt;
&lt;br /&gt;
Throughout the afternoon, we&#039;ll alternate from individual reflection, to sharing in pairs/triads/groups, to full-on plenary discussion. This is intended to help us think, share, listen and speak in equitable measures.&lt;br /&gt;
&lt;br /&gt;
We aim to send you home feeling positive, having shared your own insights and having taken note of others.&lt;br /&gt;
&lt;br /&gt;
== Program ==&lt;br /&gt;
&lt;br /&gt;
PLEASE don&#039;t be early!&lt;br /&gt;
&lt;br /&gt;
Bitlair is homebase for the Jonge Onderzoekers on Saturday&#039;s until 13.30.&lt;br /&gt;
&lt;br /&gt;
* 14.00 Doors open &lt;br /&gt;
* 14:30 Start of program&lt;br /&gt;
* 18:00 End of program&lt;br /&gt;
&lt;br /&gt;
* Then some food before you go home.&lt;br /&gt;
&lt;br /&gt;
== WHO ==&lt;br /&gt;
&lt;br /&gt;
This meeting is an invite only meeting for all teamleads of the WHY2025 core orga. One person per team, preferably the teamlead or their replacement. Please note that Bitlair has limited capacity.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! team !! Diner !! Food (tbd) Meat/Vega(n) !! Allergies/Dietary requirements&lt;br /&gt;
|-&lt;br /&gt;
{{#ask:&lt;br /&gt;
 [[namespace::UserLink]]&lt;br /&gt;
 |?Team&lt;br /&gt;
 |?Dinner&lt;br /&gt;
 |?Food&lt;br /&gt;
 |?Allergies&lt;br /&gt;
 |format=table&lt;br /&gt;
 |headers=show&lt;br /&gt;
 |mainlabel=Name&lt;br /&gt;
}}&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|NancyBeers}} || [[Team:Projectleiding]] || Yes || Anything || &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Wheeze_NL}} || [[Team:ROC]] || Yes || No Seafood please || &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Mack}} || [[Team:Productiehuis]] || Yes || Fooood || Geen sterke kaas (mozzarella ok)   &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Ad}} || [[Team:Info]] || Yes || Yes! || &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Manduca}} || [[Team:On-site_Logistics]] || Yes || No Seafood please || &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Pikachu}} || [[Team:Family]] || Yes || Anything || &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|a51c}} || [[Team:Content]] || Yes || Vega || &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|K4T0}} || [[Team:Bar]] [[Team:Foodcourt]]|| No || - || &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|JustSem}} || [[Team:Bar]] [[Team:Foodcourt]]|| Yes || Anything || &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Bix}} || [[Team:Productiehuis]] || Yes || Not that keen on seafood ||  &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Moem}} || [[Team:Deco]] || Yes || Vega+Fish || &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Winko}} || [[Team:Villages]] || Yes || No Seafood please || &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|CH23}} || [[Team:Warehouse]] || Yes || Vega ||&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Wido}} || [[Team:Off-site_Logistics]] || Yes || Anything ||&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Number3}} || [[Team:Projectleiding]] || No || - ||&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Boekenwuurm}} || [[Team:Projectleiding]] || Yes || Vega+Fish || &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Hp197}} || [[Team:Projectleiding]] || Yes || Yes || &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Gina}} || [[Team:Terrain]] || Yes || Vega || &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Dany}} || [[Team:Cohesion]] || Yes || Anything ||&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|SynQ}} || [[Team:Waste]] || Yes || Anything  ||&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|konmei}} || [[Team:Parking]] || Yes || Anything  ||&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Aim}} || [[Team:PartyArea]] || Yes || Anything ||&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Xenobyte}} || [[Team:PartyArea]] || Yes || Anything ||&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|HeskeZ667}} || [[Team:PartyArea/Entertainment]] || Yes || Anything ||&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|firewall}} || [[Team:Safety]] || no || - || - &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Polyfloyd}} || [[Team:Deco]] || yes || any || - &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|AK}} || [[Team:NOC]] || yes || any || - &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Xesxen}} || [[Team:Sysadmin]] || Yes || Yes || - &lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|name here}} || - || - || - || -   &lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;5&amp;quot; | Total names: {{#ask: [[namespace::UserLink]] |format=count}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Seats offered===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Seats available !! Leaving from !! Time&lt;br /&gt;
|-&lt;br /&gt;
| {{UserLink|Winko}} || 3  || Leiden || TBD&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Need ride===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Seats available !! Leaving from !! Time&lt;br /&gt;
|-&lt;br /&gt;
| - || -  || - || -&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=Team:Bar/Mugs&amp;diff=20947</id>
		<title>Team:Bar/Mugs</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=Team:Bar/Mugs&amp;diff=20947"/>
		<updated>2025-08-20T20:59:06Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: /* Affected customers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Mugs =&lt;br /&gt;
There have been reports about the [[Team:Bar/Mugs|Special WHY Mugs]] not reaching expected quality.  We are working on the issue and will update you on this page. We thank you all for your patience.&lt;br /&gt;
&lt;br /&gt;
== Issues ==&lt;br /&gt;
&lt;br /&gt;
The print seems not able to resist a dishwasher, and some reports even say a hand wash damaged the print.&lt;br /&gt;
&lt;br /&gt;
Please note that we ordered the mugs to be able to withstand dishwashing.&lt;br /&gt;
&lt;br /&gt;
Another issues, albeit minor, is that we seem to have ordered not enough mugs. Please put your name on the list below if you&#039;d like a mug as well, providing the quality is acceptable this time.&lt;br /&gt;
&lt;br /&gt;
== Solution ==&lt;br /&gt;
&lt;br /&gt;
We are reaching out to our supplier to get to the bottom of this. At this moment we don&#039;t have any updates.&lt;br /&gt;
&lt;br /&gt;
== Affected customers ==&lt;br /&gt;
&lt;br /&gt;
We believe that the failure of the print is not an isolated incident, so we&#039;d like a list of customers that have bought this mug. Please add your name (or handle, or other way to contact you) to this list.&lt;br /&gt;
&lt;br /&gt;
* denz, @denz@mastodon.nl, not failed yet &lt;br /&gt;
* Johan, @aequitas@mastodon.nl, failed after hand wash, see https://mastodon.nl/@aequitas/115033694380655129&lt;br /&gt;
* Marcel Waldvogel, @marcel@waldvogel.family, failed after dishwashing, see https://waldvogel.family/@marcel/115026868577943506&lt;br /&gt;
* Christopher Kreitz, @Romses@chaos.social, not failed yet, not yet used/washed&lt;br /&gt;
* foosel, @foosel@chaos.social, not failed yet, not yet used but hand washed&lt;br /&gt;
* Eisfunke, @eisfunke@inductive.space, not failed yet, used once, hand washed twice&lt;br /&gt;
* WoLFjuh, joffrey dash why2025mug at ne2000 dot nl, not failed, not yet washed&lt;br /&gt;
* [[User:Dynom]], @dynom@toot.community, not failed, not yet washed on the outside (only hand washed the inside)&lt;br /&gt;
* [[User:Thijs]] @thijs@hsnl.social, not failed yet but haven&#039;t cleaned the outside yet due to durability concerns&lt;br /&gt;
* [[User:Ceres-c]] abstained from washing in dishwasher due to durability concerns&lt;br /&gt;
* Snuffel, wendy at snuffel dot net, not washed or used yet.&lt;br /&gt;
* Bommlon, why2025mug at bommlon dot com, not yet washed or used&lt;br /&gt;
* [[User:Ad]], @CrazyA@mastodon.social, A 15min soak at 60°C (hot tap water) reveals peeling [[File:Mug-ad-after-15-min-soak.jpg|40px]]&lt;br /&gt;
* Spacehuhn, @Spacehuhn@chaos.social not failed yet, not yet used/washed&lt;br /&gt;
* Rickgeex, m.vangeelen@anovum.nl, washed, affected [[File:Cups_affected_WHY2025_rickgeex_%26_chocolight.jpg|32px]]&lt;br /&gt;
* Chocolight, maaike@kujenga.nl, washed, affected [[File:Cups_affected_WHY2025_rickgeex_%26_chocolight.jpg|32px]]&lt;br /&gt;
* [[User:Wombat]], @wombat@mendeddrum.org, not failed yet&lt;br /&gt;
* [[User:Ricardo]], @ricardo@xirion.net, used and handwashed three times, showing some wear already&lt;br /&gt;
* [[User:EsteVarda]], @GlitterHacker@mastodon.social, used twice, handwashed twice, tiny damage visible on close inspection&lt;br /&gt;
* [[User:myzt]], @myzt@mastodon.social, input: 2 why2025 mugs, 2 runs of dishwasher, output: 2 black mugs+microplastics&lt;br /&gt;
* [[User:Gapspark]], not failed yet, not yet used/washed. Worried as I put my other emal mugs in the dishwasher without problems.&lt;br /&gt;
* [[User:Nomaster]], dishwasher, affected &lt;br /&gt;
* [[User:Rad4day]], @rad4day@chaos.social, not failed yet, not used but hand washed&lt;br /&gt;
* [[user:bee]], 2 mugs, not used nor damaged yet (slacking paying off once again)&lt;br /&gt;
* [[User:Milk]] @catstevenssec@infosec.exchange , not affected but not tried washing yet, &lt;br /&gt;
* Mndy: not used yet, not dishwasher-washed yet.&lt;br /&gt;
* [[User:Obsidian]] @obsidian@milliways.social, not failed yet, only hand washed twice. &lt;br /&gt;
* [[User:Mlijn]] Not used and not washed yet.&lt;br /&gt;
* [[User:Mack]], Not used so not failed yet, only rinsed the inside)&lt;br /&gt;
* [[User:CH23]], 2 mugs, worried about washing them. Would normally dishwash them.&lt;br /&gt;
* [[User:pozorjed]], @pozorjed@mastodon.social Mug new in box, will leave it there.&lt;br /&gt;
* [[User:IJskimo]], Some peeling after dishwasing&lt;br /&gt;
* [[User:david]], @cosmicsmash@mastadon.social, failed parts peeling, hand-washed (luke warm, soft sponge). &lt;br /&gt;
* [[User:Dany]], &amp;lt;5 cycles of use as coffee mug with handwashing (hot water, dishwashing liquid, brush), first signs of peeling appeared. &lt;br /&gt;
* [[User:Jasper]], [[User:Marjolein]] mugs new in box, we&#039;ll steer clear of dishwasher&lt;br /&gt;
* [[User:Jel]], not yet used, not yet washed. Contact: jelco.99 on Signal&lt;br /&gt;
* [[User:Boekenwuurm]], not yet used, not yet washed, but looks like waterslide transfers already.&lt;br /&gt;
* [[User:RandomBart]] one time used, one time washed in dishwasher and painting damaged :(&lt;br /&gt;
* Sake, email: sake at euronet dot nl signal: @itsalways.42, not failed yet but haven&#039;t cleaned the outside yet due to durability concerns&lt;br /&gt;
* [[User:Sector035]] not yet used, not washed yet, too afraid of damaging it&lt;br /&gt;
* [[User:killergeek]] not yet used nor washed, still keep it in display.&lt;br /&gt;
* [[User:Xesxen]], 2 mugs, unused, not yet washed.&lt;br /&gt;
* ... You?&lt;br /&gt;
&lt;br /&gt;
== I want one too... ==&lt;br /&gt;
&lt;br /&gt;
If you still like our mugs, then put your contact info and number of mugs here. If there&#039;s enough of demand, and if the new mugs pass our quality control (which will be much more rigorous), we&#039;ll order them and contact you regarding payment and delivery. Details will follow. &lt;br /&gt;
&lt;br /&gt;
* kristen+mugsarecool at ikriz dot nl [x1]&lt;br /&gt;
* [[user:ReDNaX]] linze_edelsteen.7i [at} icloud (dot] com [1x]&lt;br /&gt;
* Iwantadishwasheresetantwhy2025mugaswell@e-bu [dot] de&lt;br /&gt;
* achtele at web dot der 1x mug please&lt;br /&gt;
* [[user:Mack]] mlombaers at freedom dot nl 2x mug please&lt;br /&gt;
* [[user:JuliJane]] why2025mug@my[dot]fqdn[dot]org, would be lovely&lt;br /&gt;
* [[user:bengoshi]] would like one mug, too :)&lt;br /&gt;
* Bas (team waste), would like a proper one...&lt;br /&gt;
&lt;br /&gt;
== Final thoughts ==&lt;br /&gt;
&lt;br /&gt;
We can&#039;t tell you yet what the solution will be, but be sure we&#039;ll be working on it.&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=Team:Sysadmin&amp;diff=20888</id>
		<title>Team:Sysadmin</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=Team:Sysadmin&amp;diff=20888"/>
		<updated>2025-08-19T18:57:29Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Team&lt;br /&gt;
|Lead=User:Xesxen&lt;br /&gt;
|Description=Team that provides most/all IT services needed to organize an event.&lt;br /&gt;
|Exclusive team=Yes&lt;br /&gt;
|Contact=sysadmin@why2025.org&lt;br /&gt;
|IRC=why2025-sysadmin&lt;br /&gt;
|team_is_essential_to_event=Show-stopper&lt;br /&gt;
|team_has_contact_info=Yes&lt;br /&gt;
|team_has_info_on_wiki=Yes&lt;br /&gt;
|team_has_planned_meetings=Yes&lt;br /&gt;
|team_has_enough_people=Yes&lt;br /&gt;
|team_needs_x_people=0&lt;br /&gt;
|team_has_drafted_budget=Yes&lt;br /&gt;
|team_has_informed_volunteer_team=Yes&lt;br /&gt;
|Projectleiding=User:Boekenwuurm&lt;br /&gt;
}}&lt;br /&gt;
==Team Members==&lt;br /&gt;
&lt;br /&gt;
{{TeamMemberEntry|User:Xesxen}}&lt;br /&gt;
{{TeamMemberEntry|User:Splodin}}&lt;br /&gt;
{{TeamMemberEntry|User:Wllm}}&lt;br /&gt;
&lt;br /&gt;
==Mail==&lt;br /&gt;
* IMAP: mail.ifcat.org port 993, SSL/TLS&lt;br /&gt;
* SMTP: mail.ifcat.org port 587, STARTTLS&lt;br /&gt;
&lt;br /&gt;
Your username includes the domain part, eg &amp;lt;handle&amp;gt;@&amp;lt;event&amp;gt;.tld&lt;br /&gt;
&lt;br /&gt;
Webmail: https://webmail.ifcat.org/&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
&lt;br /&gt;
By default all topics can be read without authentication. To publish to a topic an account is required.&lt;br /&gt;
&lt;br /&gt;
If your team would like to publish statistics to MQTT please contact sysadmin@why2025.org&lt;br /&gt;
&lt;br /&gt;
For graphing data in Grafana we support raw numeric values (without (SI) units). These simple values will be tracked in grafana with the full MQTT topic as the index name and `value` as the column name.&lt;br /&gt;
&lt;br /&gt;
For flexibility reasons you can also send a datapoint with multiple values (&amp;quot;extended format&amp;quot;), add tags to your datapoint as well as send multiple datapoints in bulk. The extended format is a simple key-value JSON dictionary, or a JSON list of these when pushing multiple datapoints in bulk.&lt;br /&gt;
&lt;br /&gt;
Examples of the extended format:&lt;br /&gt;
&lt;br /&gt;
Single datapoint:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;spacenet&amp;quot;: 123,&lt;br /&gt;
  &amp;quot;why2025&amp;quot;: 456,&lt;br /&gt;
  &amp;quot;why2025-2.5GHz&amp;quot;: 10&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Single datapoint with tags:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;tschunk club mate&amp;quot;: 100,&lt;br /&gt;
  &amp;quot;tschunk miomio mate&amp;quot;: 200,&lt;br /&gt;
  &amp;quot;tags&amp;quot;: {&lt;br /&gt;
    &amp;quot;bar&amp;quot;: &amp;quot;Main stage&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Multiple datapoints with tags:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;R&amp;quot;: 230,&lt;br /&gt;
    &amp;quot;S&amp;quot;: 232,&lt;br /&gt;
    &amp;quot;T&amp;quot;: 231,&lt;br /&gt;
    &amp;quot;tags&amp;quot;: {&lt;br /&gt;
      &amp;quot;generator&amp;quot;: &amp;quot;A&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;R&amp;quot;: 232,&lt;br /&gt;
    &amp;quot;S&amp;quot;: 229,&lt;br /&gt;
    &amp;quot;T&amp;quot;: 230,&lt;br /&gt;
    &amp;quot;tags&amp;quot;: {&lt;br /&gt;
      &amp;quot;generator&amp;quot;: &amp;quot;B&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nested dictionaries and lists are supported. Within Grafana they will be shown with a dot separator, eg { &amp;quot;test&amp;quot;: { &amp;quot;data&amp;quot;: 123 } } will yield test.data&lt;br /&gt;
&lt;br /&gt;
As for the MQTT feed itself: we prefer to assign a prefix per team or project under the `why2025/` prefix.&lt;br /&gt;
&lt;br /&gt;
Please publish data points with `retain` enabled, this will allow anyone to immediately receive the most recent data upon connecting to the MQTT server&lt;br /&gt;
&lt;br /&gt;
== OpenMetrics / Prometheus Line Procol ==&lt;br /&gt;
&lt;br /&gt;
We can also ingest OpenMetrics-compatible data at regular intervals. Let us know where we can grab the data (https://...), and we can set you up to relay this to MQTT / Grafana.&lt;br /&gt;
&lt;br /&gt;
== Nextcloud Access ==&lt;br /&gt;
&lt;br /&gt;
For accessing Nextcloud &#039;&#039;&#039;each&#039;&#039;&#039; team member will need their own personal account. Team:Sysadmin will create a main team folder (WHY2025/$TEAM) under which you&#039;ll be able to add your documents.&lt;br /&gt;
&lt;br /&gt;
When requesting Nextcloud access:&lt;br /&gt;
* If you are a team lead: for which of your team(s) you want a shared folder to be created&lt;br /&gt;
* Indicate which teams you&#039;ll need access to, and which team lead we can validate the request with.&lt;br /&gt;
* If you request accounts in bulk: let us know both the nickname and associated mail address.&lt;br /&gt;
&lt;br /&gt;
== Services == &lt;br /&gt;
&lt;br /&gt;
For requesting services: please send a mail to our team mailbox and talk to us &#039;&#039;&#039;before&#039;&#039;&#039; deciding which software to deploy.&lt;br /&gt;
&lt;br /&gt;
For suggestions: reaching out via either IRC or our team mailbox will work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; flex-wrap: wrap;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=WHY2025_logo_white.png&lt;br /&gt;
| what=WHY2025 main website&lt;br /&gt;
| url=[https://why2025.org https://why2025.org]&lt;br /&gt;
| support=[https://gitlab.com/https://gitlab.com/why2025/website/frontend Source code]&lt;br /&gt;
| maintainers=Code: Website project team, you? (PR&#039;s welcome), Hosting: Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Nextcloud.png&lt;br /&gt;
| what=Nextcloud, File sharing. Log in using your email address&lt;br /&gt;
| url=[https://cloud.ifcat.org https://cloud.ifcat.org]&lt;br /&gt;
| support=[https://nextcloud.com/support/ Documentation]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=mailman.png&lt;br /&gt;
| what=Mailman, Group mailing lists&lt;br /&gt;
| url=[https://lists.why2025.org/ lists.why2025.org]&lt;br /&gt;
| support=[http://www.list.org/users.html user guide]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Zammad.png&lt;br /&gt;
| what=Zammad, Support Ticketing System&lt;br /&gt;
| url=[https://support.why2025.org support.why2025.org]&lt;br /&gt;
| support=[https://docs.zammad.org/en/latest/]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Hedgedoc.png&lt;br /&gt;
| what=HedgeDoc, Colaborative text editing&lt;br /&gt;
| url=[https://pad.ifcat.org pad.ifcat.org]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Pretalx.png&lt;br /&gt;
| what=Pretalx, Call for Papers system&lt;br /&gt;
| url=[https://cfp.why2025.org cfp.why2025.org]&lt;br /&gt;
| support=[https://github.com/pretalx/pretalx]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Engelsystem.png&lt;br /&gt;
| what=Engelsystem Volunteer registration (soon™)&lt;br /&gt;
| url=[https://angel.why2025.org angel.why2025.org]&lt;br /&gt;
| support=[https://github.com/engelsystem/engelsystem github]&lt;br /&gt;
| maintainers=[[Team:Volunteers]], [[Team:Sysadmin]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Mediawiki.png&lt;br /&gt;
| what=Mediawiki, Wiki / Knowledge sharing system&lt;br /&gt;
| url=[https://wiki.why2025.org wiki.why2025.org]&lt;br /&gt;
| support=[https://www.mediawiki.org/wiki/Help:Contents mediawiki help]&lt;br /&gt;
| maintainers=Sysadmin, Everyone&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=jitsi.png&lt;br /&gt;
| what=Jitsi, video conferencing platform&lt;br /&gt;
| url=[https://meet.why2025.org/ meet.why2025.org]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Authentik.png&lt;br /&gt;
| what=Authentik Single Sign-On&lt;br /&gt;
| url=[http://auth.why2025.org/ auth.why2025.org]&lt;br /&gt;
| support=[https://docs.goauthentik.io/]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Wordpress.png&lt;br /&gt;
| what=Wordpress, Blogging backend for main site&lt;br /&gt;
| url=[https://why2025.org why2025.org]&lt;br /&gt;
| support=[https://wordpress.org/plugins/documentation/]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Gitlab.png&lt;br /&gt;
| what=Gitlab, Source hosting (external)&lt;br /&gt;
| url=[https://gitlab.com/why2025/ Gitlab: Why2025]&lt;br /&gt;
| support=[https://docs.gitlab.com/]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Pretix.png&lt;br /&gt;
| what=Pretix, Ticket system&lt;br /&gt;
| url=[https://tickets.why2025.org tickets.why2025.org]&lt;br /&gt;
| support=[https://pretix.eu/about/en/ pretix.eu]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Mqtt.png&lt;br /&gt;
| what=MQTT, metric broadcast system&lt;br /&gt;
| url=mqtt://mqtt.why2025.org wss://mqtt.why2025.org&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Grafana.png&lt;br /&gt;
| what=Grafana, dashboarding&lt;br /&gt;
| url=[https://stats.why2025.org stats.why2025.org]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=WHY2025_logo_white.png&lt;br /&gt;
| what=WHY2025 map&lt;br /&gt;
| url=[https://map.why2025.org map.why2025.org]&lt;br /&gt;
| support=&lt;br /&gt;
| maintainers=Dev/Bug: [[Team:Terrain]], Hosting: Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Zabbix.png&lt;br /&gt;
| what=Zabbix, Monitoring&lt;br /&gt;
| url=&lt;br /&gt;
| support=&lt;br /&gt;
| maintainers=[[User:Xesxen|Xesxen]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Openproject.png&lt;br /&gt;
| what=OpenProject, planning tool&lt;br /&gt;
| url=https://planning.why2025.org/&lt;br /&gt;
| support=&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Snappymail.png&lt;br /&gt;
| what=Webmail&lt;br /&gt;
| url=https://webmail.ifcat.org&lt;br /&gt;
| support=&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=none.png&lt;br /&gt;
| what=Mail server, IMAP/SMTP&lt;br /&gt;
| url=&lt;br /&gt;
| support=&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=none.png&lt;br /&gt;
| what=Prior event sites&lt;br /&gt;
| url=https://mch2022.org https://sha2017.org https://ohm2013.org etc&lt;br /&gt;
| support=&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=none.png&lt;br /&gt;
| what=Pretix MQTT relay&lt;br /&gt;
| url=https://gitlab.com/why2025/team-sysadmin/ticketshop2mqtt-application&lt;br /&gt;
| support=&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Team Meetings ==&lt;br /&gt;
&lt;br /&gt;
{{MeetingOverview|Team=Sysadmin}}&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=Memories&amp;diff=20467</id>
		<title>Memories</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=Memories&amp;diff=20467"/>
		<updated>2025-08-16T00:32:48Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: /* Numbers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a place to write share and save memories from WHY2025. The fun anecdotes, the shenanigans you pulled, the questionable solutions you hacked together, they weird things you overheard and more. Put photos on snaps.why2025.org and record all the awesomeness that was WHY2025 for the history books.&lt;br /&gt;
&lt;br /&gt;
== Overheard ==&lt;br /&gt;
Stuff you heard people say.&lt;br /&gt;
&lt;br /&gt;
==== Drag Race ====&lt;br /&gt;
On the Saftey-Cala radio channel, the hired security guards in a very serious an professional tone: &amp;quot;There are people on the main road driving with excessive speeds on small vehicles. Not wearing any protective gear. We will intervene&amp;quot; Turns out all the home build carts were racing each other on the Gina Straße and a speed camera was actively used to enforce speed limits.&lt;br /&gt;
&lt;br /&gt;
== Etherdiscipline ==&lt;br /&gt;
Radio shenanigans, and all things you are not really supposed to do in radio communication.&lt;br /&gt;
&lt;br /&gt;
==== Radio test ====&lt;br /&gt;
In the Safety signal app between WD-40 and Central Post: &amp;quot;Geez the Orga radio channel is very quiet. I almost wondering if my radio is broken.&amp;quot;&lt;br /&gt;
Over the radio on Orga channel:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;CP to WD-40, CP to WD-40&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;WD-40 is listening.&amp;quot; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;This is a radio test.&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;WD-40 has clear reception. Thank you!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== De geit is gemolken ====&lt;br /&gt;
On the Orga channel, out of nowhere, a message was shared:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;De geit is gemolken&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Someone chimed in with:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;De soep is op&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
As a call back to the origin of &amp;quot;de geit is gemolken&amp;quot; someone asked:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;De slager is een wat!?&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Not entirely sure what came after that.. please add!&amp;lt;br&amp;gt;&lt;br /&gt;
After these very silly remarks the channel was quiet, which was the exact right amount of shenanigans without cluttering the channel&lt;br /&gt;
&lt;br /&gt;
== Making Camp Happen ==&lt;br /&gt;
The things we did to make the event work&lt;br /&gt;
&lt;br /&gt;
==== Gate Sign Soldering ====&lt;br /&gt;
The WHY2025 sign on top of the gate had +3000 LEDs left to be soldered during buildup. This was done over the course of 3(?) days by over 5 different volunteers. Our interactions went mostly as follows:&lt;br /&gt;
* &amp;quot;Don&#039;t think. Just solder&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Operation Light Bulb ====&lt;br /&gt;
Team:Nuts delivered 7000 light bulbs to heaven for the strings of lights lighting up the terrain. Every bulb individually packed in a cardboard box. Without any organization people started helping out unpacking bulbs. Tables were rearranged to lay out out the light strings, put in a rubber gland in each of the 7000 sockets, screw in a light bulb, test the string, roll it up and put back in a crate for distribution around the field. All that happened in about two hours. The happening included multiple hackers diving into the waste paper skip compacting the little boxes and everyone having a good time.&lt;br /&gt;
&lt;br /&gt;
== Numbers ==&lt;br /&gt;
The numbers of (fun) things happend. Most of them correct, some guestimated. &lt;br /&gt;
&lt;br /&gt;
* 1 geocache on the terrain&lt;br /&gt;
* 8 crocodiles were killed by the Kroko Killer, 1 was spotted in the wild&lt;br /&gt;
* 1 purple crocodile survied (again, for 3 camps now)&lt;br /&gt;
* 2 shitty floods happend&lt;br /&gt;
* 1 hill flooded&lt;br /&gt;
* 3 rickrolls happend to all DECTs&lt;br /&gt;
* 165 post it&#039;s on PLs kanban board&lt;br /&gt;
* 52 picturesn on the photowall @ PL&lt;br /&gt;
* 1 car yeeted of the terrain by on-site logistics&lt;br /&gt;
* 2 rainbows spotted (4 if you count the doormats @ warehouse &amp;amp; PL aswel)&lt;br /&gt;
* 35 WHY signal groups per person&lt;br /&gt;
* 150 floppies got stickerd&lt;br /&gt;
* 1337 ice creams bought&lt;br /&gt;
* 1 human secret token&lt;br /&gt;
* 1 spelling error was found on the official traffic signs (WYH2025)&lt;br /&gt;
* 1 rivierkreeftje spotted&lt;br /&gt;
* 1 pallet pi(ii)ndakaas was lifted out of a rooftop tent&lt;br /&gt;
* 1 speedcamera spotted on the terrain&lt;br /&gt;
* 3 birthdays&lt;br /&gt;
* 2 blajhajs cought joyriding&lt;br /&gt;
* 3 tents wooshed or crashed during WAAI2025&lt;br /&gt;
* 1 villagetent crashed by the 5 min super rain during Windy Hackers Yearn 2025 &lt;br /&gt;
* [x] times bullshit was shouted during the cyber debat with politics&lt;br /&gt;
* 1 poweroutage&lt;br /&gt;
* 3 flat tires (1 gator, twice of a the same persons car)&lt;br /&gt;
* 1 early buildup village blown to pieces (storm)&lt;br /&gt;
* ....&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=User:BigflipBOT&amp;diff=17578</id>
		<title>User:BigflipBOT</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=User:BigflipBOT&amp;diff=17578"/>
		<updated>2025-08-04T21:35:45Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: This is not a valid radio amateur callsign&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UserInfo&lt;br /&gt;
|Bringing=Aria&#039;s tent&lt;br /&gt;
|Village=Village:NXDOMAIN&lt;br /&gt;
|DECT=6984&lt;br /&gt;
|Languages=EN, PL&lt;br /&gt;
}}&lt;br /&gt;
meow :3&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=Property:On_site_orga_contact&amp;diff=17577</id>
		<title>Property:On site orga contact</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=Property:On_site_orga_contact&amp;diff=17577"/>
		<updated>2025-08-04T21:33:54Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: Created a property of type Text&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a property of type [[Has type::Text]].&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=Property:Has_orga_contact&amp;diff=17576</id>
		<title>Property:Has orga contact</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=Property:Has_orga_contact&amp;diff=17576"/>
		<updated>2025-08-04T21:30:06Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: Created a property of type Email&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a property of type [[Has type::Email]].&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=Property:Vehicle_Name&amp;diff=17240</id>
		<title>Property:Vehicle Name</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=Property:Vehicle_Name&amp;diff=17240"/>
		<updated>2025-08-04T00:53:07Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: Created a property of type Text&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a property of type [[Has type::Text]].&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=Property:Type&amp;diff=17239</id>
		<title>Property:Type</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=Property:Type&amp;diff=17239"/>
		<updated>2025-08-04T00:53:02Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: Created a property of type Text&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a property of type [[Has type::Text]].&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=Property:Model&amp;diff=17238</id>
		<title>Property:Model</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=Property:Model&amp;diff=17238"/>
		<updated>2025-08-04T00:52:42Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: Created a property of type Text&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a property of type [[Has type::Text]].&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=Property:Kenzeigen&amp;diff=17237</id>
		<title>Property:Kenzeigen</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=Property:Kenzeigen&amp;diff=17237"/>
		<updated>2025-08-04T00:52:38Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: Created a property of type Text&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a property of type [[Has type::Text]].&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=Property:Brand&amp;diff=17236</id>
		<title>Property:Brand</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=Property:Brand&amp;diff=17236"/>
		<updated>2025-08-04T00:52:33Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: Created a property of type Text&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a property of type [[Has type::Text]].&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=Property:BoelsID&amp;diff=17235</id>
		<title>Property:BoelsID</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=Property:BoelsID&amp;diff=17235"/>
		<updated>2025-08-04T00:52:28Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: Created a property of type Text&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a property of type [[Has type::Text]].&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=User:R3mc0&amp;diff=16261</id>
		<title>User:R3mc0</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=User:R3mc0&amp;diff=16261"/>
		<updated>2025-07-30T22:15:13Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: This does not appear to be a valid callsign&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UserInfo&lt;br /&gt;
|Bringing=Diabolos , food knowledge, shogi and coriousity&lt;br /&gt;
|Village=Village:The Wolf and The Heart&lt;br /&gt;
|Working on=Project:CTF&lt;br /&gt;
|Arrival=2025-08-08&lt;br /&gt;
|Departure=2025-08-12&lt;br /&gt;
|EMail=rmbijlsma@pm.me&lt;br /&gt;
|Languages=EN ESP FR GER NL&lt;br /&gt;
|HackerSpace=HermitHive&lt;br /&gt;
|NickName={{PAGENAME}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=Program&amp;diff=15892</id>
		<title>Program</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=Program&amp;diff=15892"/>
		<updated>2025-07-29T21:04:41Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The official [https://program.why2025.org/why2025/schedule/ program] of WHY2025 offers talks on four main stages: [https://map.why2025.org/?building=27&amp;amp;building_table=buildings#maphash=18.66/52.6931294/4.7459241/-20 Andromeda], [https://map.why2025.org/?building=12&amp;amp;building_table=buildings#maphash=19/52.6908/4.745329/-20 Brachium], [https://map.why2025.org/?building=24&amp;amp;building_table=buildings#maphash=19/52.691958/4.749002/-20 Cassiopeia], and [https://map.why2025.org/?building=40&amp;amp;building_table=buildings#maphash=19/52.693746/4.748425/-20 Delphinus]! There will be workshops as well in the workshop tents [https://map.why2025.org/?building=26&amp;amp;building_table=buildings#maphash=19/52.693474/4.747889/-20 Euclid] and [https://map.why2025.org/?building=13&amp;amp;building_table=buildings#maphash=19/52.693216/4.746775/-20 Giotto].&lt;br /&gt;
&lt;br /&gt;
Besides the [https://program.why2025.org/why2025/schedule/ official program], there are a few unofficial and [[Self-organized Sessions|self organised session]] on the site as well.&lt;br /&gt;
&lt;br /&gt;
== Apps ==&lt;br /&gt;
&lt;br /&gt;
There are a few apps you can use to access our program.&lt;br /&gt;
&lt;br /&gt;
=== Giggity ===&lt;br /&gt;
&lt;br /&gt;
You can install Giggity from the [https://play.google.com/store/apps/details?id=net.gaast.giggity&amp;amp;hl=en Play Store] or from [https://f-droid.org/de/packages/net.gaast.giggity/ F-Droid] and then point it to the following URL for the official schedle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;https://program.why2025.org/why2025/schedule/export/schedule.xml&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When you want the unofficial (community organised) events as well, you can use the following (unofficial, community maintained) URL for a merged schedule:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;https://2025why.gitlab.io/schedule/merged.xml&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=MediaWiki:Sidebar&amp;diff=15107</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=MediaWiki:Sidebar&amp;diff=15107"/>
		<updated>2025-07-26T22:37:00Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
* WHY2025&lt;br /&gt;
** mainpage|Wiki Frontpage&lt;br /&gt;
** recentchanges-url | 🕐  Recent Changes&lt;br /&gt;
&lt;br /&gt;
* Visitor information&lt;br /&gt;
** FAQ|❓ &amp;amp;nbsp;FAQ&lt;br /&gt;
** Newcomers Guide|🌱 &amp;amp;nbsp;Newcomers Guide&lt;br /&gt;
** Tickets|🎫 &amp;amp;nbsp;Tickets&lt;br /&gt;
** Merch|👕 &amp;amp;nbsp;Merch&lt;br /&gt;
** Staying_informed | 📢 &amp;amp;nbsp;Staying Informed&lt;br /&gt;
** location|🚀 &amp;amp;nbsp;Location + Travel &lt;br /&gt;
** https://stats.why2025.org/dashboards|📈 &amp;amp;nbsp;Statistics&lt;br /&gt;
&lt;br /&gt;
* On the field&lt;br /&gt;
** Camprules|📜 Camp rules&lt;br /&gt;
** Angel_Guide|😇 &amp;amp;nbsp;Angels&lt;br /&gt;
** https://maps.why2025.org|🗺️ &amp;amp;nbsp;Map &lt;br /&gt;
** Facilities | 🛎️ &amp;amp;nbsp;Facilities &lt;br /&gt;
** Supermarkt|🛒 &amp;amp;nbsp;Supermarket&lt;br /&gt;
** Camping | ⛺️ &amp;amp;nbsp;Camping &lt;br /&gt;
** Villages|🏰 &amp;amp;nbsp;Villages&lt;br /&gt;
** Villagers|🤓 &amp;amp;nbsp;Villagers &lt;br /&gt;
** Cluster|🏟️ &amp;amp;nbsp;Clusters&lt;br /&gt;
** Interests | 🔬 &amp;amp;nbsp;Interests &lt;br /&gt;
** https://why2025.org/programme|🎤 &amp;amp;nbsp;Programme&lt;br /&gt;
** Self-organized_Sessions|🎓 &amp;amp;nbsp;Self-Organized Sessions &lt;br /&gt;
** Projects|🔧 &amp;amp;nbsp;Projects &lt;br /&gt;
** https://snaps.why2025.org|📸 &amp;amp;nbsp;Pictures from Orga&lt;br /&gt;
&lt;br /&gt;
* Meetings &amp;amp; Sweatshops&lt;br /&gt;
** Meetings|🏠 &amp;amp;nbsp;Meetings&lt;br /&gt;
&amp;lt;-- ** Kickoff_2024_04_06 | - Apr 06: Kickoff --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_May_2024 | - 🖥️ May 22th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** FIELDDAY_2024_06_15| - 🌲 Jun 15th: Field day --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_June_2024 | - 🖥️ June 19th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi__July_2024 | - 🖥️ July 17rd: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi__August_2024 | - 🖥️ Aug 14th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orgameet_Fallfest_2024 | - 🧩 Sept 7th: Orga Meetup --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_September_2024 | - 🖥️ Sep 11th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_October_2024 | - 🖥️ Oct 9th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_November_2024 | - 🖥️ Nov 6th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_December_2024 | - 🖥️ Dec 4th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Meet_14_December_2024 | - 🧩 Dec 14th: Orga Meetup --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_15_Januari_2025 | - 🖥️ Jan 15th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_29_Januari_2025 | - 🖥️ Jan 29th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_12_February_2025 | - 🖥️ Feb 12th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Meet_22_February_2025 | - 🧩 Feb 22nd: Orga Meetup --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_26_February_2025 | - 🖥️ Feb 26th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_12_March_2025 | - 🖥️ Mar 12th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_26_March_2025 | - 🖥️ Mar 26th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** FieldDAY_2025_04_05 | - ⛳️ April 5th: Field day --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_9_April_2025 | - 🖥️ Apr 9th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_23_April_2025 | - 🖥️ Apr 23rd: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_7_May_2025 | - 🖥️ May 7th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_21_May_2025 | 🖥️ May 21st: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_4_June_2025 | 🖥️ Jun 4th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_18_June_2025 | 🖥️ Jun 18th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Meet_21_June_2025 | 🧩 Jun 21st: Orga Meetup --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_2_July_2025 | 🖥️ Jul 2nd: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_16_July_2025 | 🖥️ Jul 16th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
** Welcome_Package_Sweatshop | 🧩 Jul 26st: Welcome Sweatshop&lt;br /&gt;
** Orga_Jitsi_30_July_2025   | 🖥️ Jul 30th: Orga Jitsi&lt;br /&gt;
** Badge_Assembly_Sweatshop  | 🧩 Aug 2nd: Badge Assembly Sweatshop&lt;br /&gt;
&lt;br /&gt;
* Organization&lt;br /&gt;
** Volunteering Guide|💪 &amp;amp;nbsp;Volunteering&lt;br /&gt;
** Vacancies|📰 &amp;amp;nbsp;Vacancies&lt;br /&gt;
** GrapicDesignIsMyPassion|✍️ &amp;amp;nbsp;Logos, designs, stickers&lt;br /&gt;
** Teams|🦄 &amp;amp;nbsp;Teams&lt;br /&gt;
** Timeline|📅 &amp;amp;nbsp;Timeline&lt;br /&gt;
&lt;br /&gt;
* Teams making it happen&lt;br /&gt;
** Team:Accessibility | Team: Accessibility&lt;br /&gt;
** Team:Badge | Team: Badge&lt;br /&gt;
** Team:Bar | Team: Bar&lt;br /&gt;
** Team:Cohesion | Team: Cohesion&lt;br /&gt;
** Team:Content | Team: Content&lt;br /&gt;
** Team:CTF | Team: CTF&lt;br /&gt;
** Team:Deco | Team: Deco&lt;br /&gt;
** Team:Entertainment | Team: Entertainment&lt;br /&gt;
** Team:Family | Team: Family&lt;br /&gt;
** Team:Finance | Team: Finance&lt;br /&gt;
** Team:Flags | Team: Flags&lt;br /&gt;
** Team:Foodcourt | Team: Foodcourt&lt;br /&gt;
** Team:Heralds | Team: Heralds&lt;br /&gt;
** Team:Huisstijl | Team: Huisstijl&lt;br /&gt;
** Team:Info | Team: Info&lt;br /&gt;
** Team:Merch | Team: Merch&lt;br /&gt;
** Team:Moebelhaus | Team: Moebelhaus&lt;br /&gt;
** Team:NOC | Team: NOC&lt;br /&gt;
** Team:NUTS | Team: NUTS&lt;br /&gt;
** Team:Off-site Logistics | Team: Off-site Logistics&lt;br /&gt;
** Team:On-site Logistics | Team: On-site Logistics&lt;br /&gt;
** Team:POC | Team: POC&lt;br /&gt;
** Team:Parking | Team: Parking&lt;br /&gt;
** Team:PartyArea | Team: PartyArea&lt;br /&gt;
** Team:Permits | Team: Permits&lt;br /&gt;
** Team:Press | Team: Press&lt;br /&gt;
** Team:Productiehuis | Team: Productiehuis&lt;br /&gt;
** Team:Projectleiding | Team: Projectleiding&lt;br /&gt;
** Team:ROC | Team: ROC&lt;br /&gt;
** Team:Safety-Fire | Team: Safety-Fire&lt;br /&gt;
** Team:Safety-First-AID | Team: Safety-First-AID&lt;br /&gt;
** Team:Safety-Security | Team: Safety-Security&lt;br /&gt;
** Team:Shuttle | Team: Shuttle&lt;br /&gt;
** Team:Speaker Desk | Team: Speaker Desk&lt;br /&gt;
** Team:Sponsors | Team: Sponsors&lt;br /&gt;
** Team:Sysadmin | Team: Sysadmin&lt;br /&gt;
** Team:Terrain | Team: Terrain&lt;br /&gt;
** Team:Ticket &amp;amp; Entrance | Team: Ticket &amp;amp; Entrance&lt;br /&gt;
** Team:Villages | Team: Villages&lt;br /&gt;
** Team:Volunteers | Team: Volunteers&lt;br /&gt;
** Team:Warehouse | Team: Warehouse&lt;br /&gt;
** Team:Waste | Team: Waste&lt;br /&gt;
&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--  old MCH2027 things--&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Lost &amp;amp; Found | Lost &amp;amp; Found --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** POIDH | 📸 POIDH --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** recentchanges-url | 🕐  Recent Changes --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- * Visitor information --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Memories|Memories --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** FAQ|❓ &amp;amp;nbsp;FAQ --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Tickets|🎫 &amp;amp;nbsp;Tickets --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Staying_informed | 📢  Staying Informed --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** location|🚀 &amp;amp;nbsp;Location + Travel --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Facilities | 🛎  Provided facilities --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Camping | ⛺️  Camping --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Villages|🏰 &amp;amp;nbsp;Villages --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Villagers|🤓 &amp;amp;nbsp; Villagers --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Interests | 🔬  Interests --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Self-organized_Sessions|🎓 &amp;amp;nbsp;Self-Organized Sessions --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Projects|🔧 &amp;amp;nbsp;Projects --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Angels|😇 &amp;amp;nbsp; Angels --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- * More on Villages --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Villages|🏰 &amp;amp;nbsp;Villages --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Villages/Map|🗺️ &amp;amp;nbsp; - Map --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Clusters|🏘️ &amp;amp;nbsp; - Clusters --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Create New&lt;br /&gt;
** Special:CreateAccount|💛 &amp;amp;nbsp; Wiki Account&lt;br /&gt;
** Form:Village|💙 &amp;amp;nbsp; Village&lt;br /&gt;
** Form:Session|💚 &amp;amp;nbsp; Self-Organized Session&lt;br /&gt;
** Form:Project |💝 &amp;amp;nbsp; Project&lt;br /&gt;
&amp;lt;!-- ** https://angel.why2025.org/login|😇 &amp;amp;nbsp; Signup as angel --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- * Information --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Volunteering Guide|💪 Volunteering --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Network | 💻 Network --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Phone |  ☎️ Phone --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Harbour | 🚤  Harbour --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Family Village | 👪 Family Zone --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Badge | 📛  Badge --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Promotion|📣 Promotion --&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=MediaWiki:Sidebar&amp;diff=15106</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=MediaWiki:Sidebar&amp;diff=15106"/>
		<updated>2025-07-26T22:36:32Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
* WHY2025&lt;br /&gt;
** mainpage|Wiki Frontpage&lt;br /&gt;
** recentchanges-url | 🕐  Recent Changes&lt;br /&gt;
&lt;br /&gt;
* Visitor information&lt;br /&gt;
** FAQ|❓ &amp;amp;nbsp;FAQ&lt;br /&gt;
** Newcomers Guide|🌱 &amp;amp;nbsp;Newcomers Guide&lt;br /&gt;
** Tickets|🎫 &amp;amp;nbsp;Tickets&lt;br /&gt;
** Merch|👕 &amp;amp;nbsp;Merch&lt;br /&gt;
** Staying_informed | 📢 &amp;amp;nbsp;Staying Informed&lt;br /&gt;
** location|🚀 &amp;amp;nbsp;Location + Travel &lt;br /&gt;
** https://stats.why2025.org/dashboards|📈 &amp;amp;nbsp;Statistics&lt;br /&gt;
&lt;br /&gt;
* On the field&lt;br /&gt;
** Camprules|📜 Camp rules&lt;br /&gt;
** Angel_Guide|😇 &amp;amp;nbsp;Angels&lt;br /&gt;
** https://maps.why2025.org|🗺️ &amp;amp;nbsp;Map &lt;br /&gt;
** Facilities | 🛎️ &amp;amp;nbsp;Facilities &lt;br /&gt;
** Supermarkt|🛒 &amp;amp;nbsp;Supermarket&lt;br /&gt;
** Camping | ⛺️ &amp;amp;nbsp;Camping &lt;br /&gt;
** Villages|🏰 &amp;amp;nbsp;Villages&lt;br /&gt;
** Villagers|🤓 &amp;amp;nbsp;Villagers &lt;br /&gt;
** Cluster|🏟️ &amp;amp;nbsp;Clusters&lt;br /&gt;
** Interests | 🔬 &amp;amp;nbsp;Interests &lt;br /&gt;
** https://why2025.org/programme|🎤 &amp;amp;nbsp;Programme&lt;br /&gt;
** Self-organized_Sessions|🎓 &amp;amp;nbsp;Self-Organized Sessions &lt;br /&gt;
** Projects|🔧 &amp;amp;nbsp;Projects &lt;br /&gt;
** https://snaps.why2025.org|📸 Orga Pictures&lt;br /&gt;
&lt;br /&gt;
* Meetings &amp;amp; Sweatshops&lt;br /&gt;
** Meetings|🏠 &amp;amp;nbsp;Meetings&lt;br /&gt;
&amp;lt;-- ** Kickoff_2024_04_06 | - Apr 06: Kickoff --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_May_2024 | - 🖥️ May 22th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** FIELDDAY_2024_06_15| - 🌲 Jun 15th: Field day --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_June_2024 | - 🖥️ June 19th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi__July_2024 | - 🖥️ July 17rd: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi__August_2024 | - 🖥️ Aug 14th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orgameet_Fallfest_2024 | - 🧩 Sept 7th: Orga Meetup --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_September_2024 | - 🖥️ Sep 11th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_October_2024 | - 🖥️ Oct 9th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_November_2024 | - 🖥️ Nov 6th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_December_2024 | - 🖥️ Dec 4th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Meet_14_December_2024 | - 🧩 Dec 14th: Orga Meetup --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_15_Januari_2025 | - 🖥️ Jan 15th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_29_Januari_2025 | - 🖥️ Jan 29th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_12_February_2025 | - 🖥️ Feb 12th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Meet_22_February_2025 | - 🧩 Feb 22nd: Orga Meetup --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_26_February_2025 | - 🖥️ Feb 26th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_12_March_2025 | - 🖥️ Mar 12th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_26_March_2025 | - 🖥️ Mar 26th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** FieldDAY_2025_04_05 | - ⛳️ April 5th: Field day --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_9_April_2025 | - 🖥️ Apr 9th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_23_April_2025 | - 🖥️ Apr 23rd: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_7_May_2025 | - 🖥️ May 7th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_21_May_2025 | 🖥️ May 21st: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_4_June_2025 | 🖥️ Jun 4th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_18_June_2025 | 🖥️ Jun 18th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Meet_21_June_2025 | 🧩 Jun 21st: Orga Meetup --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_2_July_2025 | 🖥️ Jul 2nd: Orga Jitsi --&amp;gt;&lt;br /&gt;
&amp;lt;-- ** Orga_Jitsi_16_July_2025 | 🖥️ Jul 16th: Orga Jitsi --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
** Welcome_Package_Sweatshop | 🧩 Jul 26st: Welcome Sweatshop&lt;br /&gt;
** Orga_Jitsi_30_July_2025   | 🖥️ Jul 30th: Orga Jitsi&lt;br /&gt;
** Badge_Assembly_Sweatshop  | 🧩 Aug 2nd: Badge Assembly Sweatshop&lt;br /&gt;
&lt;br /&gt;
* Organization&lt;br /&gt;
** Volunteering Guide|💪 &amp;amp;nbsp;Volunteering&lt;br /&gt;
** Vacancies|📰 &amp;amp;nbsp;Vacancies&lt;br /&gt;
** GrapicDesignIsMyPassion|✍️ &amp;amp;nbsp;Logos, designs, stickers&lt;br /&gt;
** Teams|🦄 &amp;amp;nbsp;Teams&lt;br /&gt;
** Timeline|📅 &amp;amp;nbsp;Timeline&lt;br /&gt;
&lt;br /&gt;
* Teams making it happen&lt;br /&gt;
** Team:Accessibility | Team: Accessibility&lt;br /&gt;
** Team:Badge | Team: Badge&lt;br /&gt;
** Team:Bar | Team: Bar&lt;br /&gt;
** Team:Cohesion | Team: Cohesion&lt;br /&gt;
** Team:Content | Team: Content&lt;br /&gt;
** Team:CTF | Team: CTF&lt;br /&gt;
** Team:Deco | Team: Deco&lt;br /&gt;
** Team:Entertainment | Team: Entertainment&lt;br /&gt;
** Team:Family | Team: Family&lt;br /&gt;
** Team:Finance | Team: Finance&lt;br /&gt;
** Team:Flags | Team: Flags&lt;br /&gt;
** Team:Foodcourt | Team: Foodcourt&lt;br /&gt;
** Team:Heralds | Team: Heralds&lt;br /&gt;
** Team:Huisstijl | Team: Huisstijl&lt;br /&gt;
** Team:Info | Team: Info&lt;br /&gt;
** Team:Merch | Team: Merch&lt;br /&gt;
** Team:Moebelhaus | Team: Moebelhaus&lt;br /&gt;
** Team:NOC | Team: NOC&lt;br /&gt;
** Team:NUTS | Team: NUTS&lt;br /&gt;
** Team:Off-site Logistics | Team: Off-site Logistics&lt;br /&gt;
** Team:On-site Logistics | Team: On-site Logistics&lt;br /&gt;
** Team:POC | Team: POC&lt;br /&gt;
** Team:Parking | Team: Parking&lt;br /&gt;
** Team:PartyArea | Team: PartyArea&lt;br /&gt;
** Team:Permits | Team: Permits&lt;br /&gt;
** Team:Press | Team: Press&lt;br /&gt;
** Team:Productiehuis | Team: Productiehuis&lt;br /&gt;
** Team:Projectleiding | Team: Projectleiding&lt;br /&gt;
** Team:ROC | Team: ROC&lt;br /&gt;
** Team:Safety-Fire | Team: Safety-Fire&lt;br /&gt;
** Team:Safety-First-AID | Team: Safety-First-AID&lt;br /&gt;
** Team:Safety-Security | Team: Safety-Security&lt;br /&gt;
** Team:Shuttle | Team: Shuttle&lt;br /&gt;
** Team:Speaker Desk | Team: Speaker Desk&lt;br /&gt;
** Team:Sponsors | Team: Sponsors&lt;br /&gt;
** Team:Sysadmin | Team: Sysadmin&lt;br /&gt;
** Team:Terrain | Team: Terrain&lt;br /&gt;
** Team:Ticket &amp;amp; Entrance | Team: Ticket &amp;amp; Entrance&lt;br /&gt;
** Team:Villages | Team: Villages&lt;br /&gt;
** Team:Volunteers | Team: Volunteers&lt;br /&gt;
** Team:Warehouse | Team: Warehouse&lt;br /&gt;
** Team:Waste | Team: Waste&lt;br /&gt;
&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--  old MCH2027 things--&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Lost &amp;amp; Found | Lost &amp;amp; Found --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** POIDH | 📸 POIDH --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** recentchanges-url | 🕐  Recent Changes --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- * Visitor information --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Memories|Memories --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** FAQ|❓ &amp;amp;nbsp;FAQ --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Tickets|🎫 &amp;amp;nbsp;Tickets --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Staying_informed | 📢  Staying Informed --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** location|🚀 &amp;amp;nbsp;Location + Travel --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Facilities | 🛎  Provided facilities --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Camping | ⛺️  Camping --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Villages|🏰 &amp;amp;nbsp;Villages --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Villagers|🤓 &amp;amp;nbsp; Villagers --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Interests | 🔬  Interests --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Self-organized_Sessions|🎓 &amp;amp;nbsp;Self-Organized Sessions --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Projects|🔧 &amp;amp;nbsp;Projects --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Angels|😇 &amp;amp;nbsp; Angels --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- * More on Villages --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Villages|🏰 &amp;amp;nbsp;Villages --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Villages/Map|🗺️ &amp;amp;nbsp; - Map --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Clusters|🏘️ &amp;amp;nbsp; - Clusters --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Create New&lt;br /&gt;
** Special:CreateAccount|💛 &amp;amp;nbsp; Wiki Account&lt;br /&gt;
** Form:Village|💙 &amp;amp;nbsp; Village&lt;br /&gt;
** Form:Session|💚 &amp;amp;nbsp; Self-Organized Session&lt;br /&gt;
** Form:Project |💝 &amp;amp;nbsp; Project&lt;br /&gt;
&amp;lt;!-- ** https://angel.why2025.org/login|😇 &amp;amp;nbsp; Signup as angel --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- * Information --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Volunteering Guide|💪 Volunteering --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Network | 💻 Network --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Phone |  ☎️ Phone --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Harbour | 🚤  Harbour --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Family Village | 👪 Family Zone --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Badge | 📛  Badge --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ** Promotion|📣 Promotion --&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=Team:Sysadmin&amp;diff=14825</id>
		<title>Team:Sysadmin</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=Team:Sysadmin&amp;diff=14825"/>
		<updated>2025-07-25T00:19:25Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: /* MQTT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Team&lt;br /&gt;
|Lead=User:Xesxen&lt;br /&gt;
|Description=Team that provides most/all IT services needed to organize an event.&lt;br /&gt;
|Exclusive team=Yes&lt;br /&gt;
|Contact=sysadmin@why2025.org&lt;br /&gt;
|IRC=why2025-sysadmin&lt;br /&gt;
|team_is_essential_to_event=Show-stopper&lt;br /&gt;
|team_has_contact_info=Yes&lt;br /&gt;
|team_has_info_on_wiki=Yes&lt;br /&gt;
|team_has_planned_meetings=Yes&lt;br /&gt;
|team_has_enough_people=Yes&lt;br /&gt;
|team_needs_x_people=0&lt;br /&gt;
|team_has_drafted_budget=Yes&lt;br /&gt;
|team_has_informed_volunteer_team=Yes&lt;br /&gt;
|Projectleiding=User:Boekenwuurm&lt;br /&gt;
}}&lt;br /&gt;
==Team Members==&lt;br /&gt;
&lt;br /&gt;
{{TeamMemberEntry|User:Xesxen}}&lt;br /&gt;
{{TeamMemberEntry|User:Splodin}}&lt;br /&gt;
{{TeamMemberEntry|User:Kiara}}&lt;br /&gt;
{{TeamMemberEntry|User:Wllm}}&lt;br /&gt;
==Mail==&lt;br /&gt;
* IMAP: mail.ifcat.org port 993, SSL/TLS&lt;br /&gt;
* SMTP: mail.ifcat.org port 587, STARTTLS&lt;br /&gt;
&lt;br /&gt;
Your username includes the domain part, eg &amp;lt;handle&amp;gt;@&amp;lt;event&amp;gt;.tld&lt;br /&gt;
&lt;br /&gt;
Webmail: https://webmail.ifcat.org/&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
&lt;br /&gt;
By default all topics can be read without authentication. To publish to a topic an account is required.&lt;br /&gt;
&lt;br /&gt;
If your team would like to publish statistics to MQTT please contact sysadmin@why2025.org&lt;br /&gt;
&lt;br /&gt;
For graphing data in Grafana we support raw numeric values (without (SI) units). These simple values will be tracked in grafana with the full MQTT topic as the index name and `value` as the column name.&lt;br /&gt;
&lt;br /&gt;
For flexibility reasons you can also send a datapoint with multiple values (&amp;quot;extended format&amp;quot;), add tags to your datapoint as well as send multiple datapoints in bulk. The extended format is a simple key-value JSON dictionary, or a JSON list of these when pushing multiple datapoints in bulk.&lt;br /&gt;
&lt;br /&gt;
Examples of the extended format:&lt;br /&gt;
&lt;br /&gt;
Single datapoint:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;spacenet&amp;quot;: 123,&lt;br /&gt;
  &amp;quot;why2025&amp;quot;: 456,&lt;br /&gt;
  &amp;quot;why2025-2.5GHz&amp;quot;: 10&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Single datapoint with tags:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;tschunk club mate&amp;quot;: 100,&lt;br /&gt;
  &amp;quot;tschunk miomio mate&amp;quot;: 200,&lt;br /&gt;
  &amp;quot;tags&amp;quot;: {&lt;br /&gt;
    &amp;quot;bar&amp;quot;: &amp;quot;Main stage&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Multiple datapoints with tags:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;R&amp;quot;: 230,&lt;br /&gt;
    &amp;quot;S&amp;quot;: 232,&lt;br /&gt;
    &amp;quot;T&amp;quot;: 231,&lt;br /&gt;
    &amp;quot;tags&amp;quot;: {&lt;br /&gt;
      &amp;quot;generator&amp;quot;: &amp;quot;A&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;R&amp;quot;: 232,&lt;br /&gt;
    &amp;quot;S&amp;quot;: 229,&lt;br /&gt;
    &amp;quot;T&amp;quot;: 230,&lt;br /&gt;
    &amp;quot;tags&amp;quot;: {&lt;br /&gt;
      &amp;quot;generator&amp;quot;: &amp;quot;B&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nested dictionaries and lists are supported. Within Grafana they will be shown with a dot separator, eg { &amp;quot;test&amp;quot;: { &amp;quot;data&amp;quot;: 123 } } will yield test.data&lt;br /&gt;
&lt;br /&gt;
As for the MQTT feed itself: we prefer to assign a prefix per team or project under the `why2025/` prefix.&lt;br /&gt;
&lt;br /&gt;
Please publish data points with `retain` enabled, this will allow anyone to immediately receive the most recent data upon connecting to the MQTT server&lt;br /&gt;
&lt;br /&gt;
== OpenMetrics / Prometheus Line Procol ==&lt;br /&gt;
&lt;br /&gt;
We can also ingest OpenMetrics-compatible data at regular intervals. Let us know where we can grab the data (https://...), and we can set you up to relay this to MQTT / Grafana.&lt;br /&gt;
&lt;br /&gt;
== Nextcloud Access ==&lt;br /&gt;
&lt;br /&gt;
For accessing Nextcloud &#039;&#039;&#039;each&#039;&#039;&#039; team member will need their own personal account. Team:Sysadmin will create a main team folder (WHY2025/$TEAM) under which you&#039;ll be able to add your documents.&lt;br /&gt;
&lt;br /&gt;
When requesting Nextcloud access:&lt;br /&gt;
* If you are a team lead: for which of your team(s) you want a shared folder to be created&lt;br /&gt;
* Indicate which teams you&#039;ll need access to, and which team lead we can validate the request with.&lt;br /&gt;
* If you request accounts in bulk: let us know both the nickname and associated mail address.&lt;br /&gt;
&lt;br /&gt;
== Services == &lt;br /&gt;
&lt;br /&gt;
For requesting services: please send a mail to our team mailbox and talk to us &#039;&#039;&#039;before&#039;&#039;&#039; deciding which software to deploy.&lt;br /&gt;
&lt;br /&gt;
For suggestions: reaching out via either IRC or our team mailbox will work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; flex-wrap: wrap;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=WHY2025_logo_white.png&lt;br /&gt;
| what=WHY2025 main website&lt;br /&gt;
| url=[https://why2025.org https://why2025.org]&lt;br /&gt;
| support=[https://gitlab.com/https://gitlab.com/why2025/website/frontend Source code]&lt;br /&gt;
| maintainers=Code: Website project team, you? (PR&#039;s welcome), Hosting: Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Nextcloud.png&lt;br /&gt;
| what=Nextcloud, File sharing. Log in using your email address&lt;br /&gt;
| url=[https://cloud.ifcat.org https://cloud.ifcat.org]&lt;br /&gt;
| support=[https://nextcloud.com/support/ Documentation]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=mailman.png&lt;br /&gt;
| what=Mailman, Group mailing lists&lt;br /&gt;
| url=[https://lists.why2025.org/ lists.why2025.org]&lt;br /&gt;
| support=[http://www.list.org/users.html user guide]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Zammad.png&lt;br /&gt;
| what=Zammad, Support Ticketing System&lt;br /&gt;
| url=[https://support.why2025.org support.why2025.org]&lt;br /&gt;
| support=[https://docs.zammad.org/en/latest/]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Hedgedoc.png&lt;br /&gt;
| what=HedgeDoc, Colaborative text editing&lt;br /&gt;
| url=[https://pad.ifcat.org pad.ifcat.org]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Pretalx.png&lt;br /&gt;
| what=Pretalx, Call for Papers system&lt;br /&gt;
| url=[https://cfp.why2025.org cfp.why2025.org]&lt;br /&gt;
| support=[https://github.com/pretalx/pretalx]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Engelsystem.png&lt;br /&gt;
| what=Engelsystem Volunteer registration (soon™)&lt;br /&gt;
| url=[https://angel.why2025.org angel.why2025.org]&lt;br /&gt;
| support=[https://github.com/engelsystem/engelsystem github]&lt;br /&gt;
| maintainers=[[Team:Volunteers]], [[Team:Sysadmin]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Mediawiki.png&lt;br /&gt;
| what=Mediawiki, Wiki / Knowledge sharing system&lt;br /&gt;
| url=[https://wiki.why2025.org wiki.why2025.org]&lt;br /&gt;
| support=[https://www.mediawiki.org/wiki/Help:Contents mediawiki help]&lt;br /&gt;
| maintainers=Sysadmin, Everyone&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=jitsi.png&lt;br /&gt;
| what=Jitsi, video conferencing platform&lt;br /&gt;
| url=[https://meet.why2025.org/ meet.why2025.org]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Authentik.png&lt;br /&gt;
| what=Authentik Single Sign-On&lt;br /&gt;
| url=[http://auth.why2025.org/ auth.why2025.org]&lt;br /&gt;
| support=[https://docs.goauthentik.io/]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Wordpress.png&lt;br /&gt;
| what=Wordpress, Blogging backend for main site&lt;br /&gt;
| url=[https://why2025.org why2025.org]&lt;br /&gt;
| support=[https://wordpress.org/plugins/documentation/]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Gitlab.png&lt;br /&gt;
| what=Gitlab, Source hosting (external)&lt;br /&gt;
| url=[https://gitlab.com/why2025/ Gitlab: Why2025]&lt;br /&gt;
| support=[https://docs.gitlab.com/]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Pretix.png&lt;br /&gt;
| what=Pretix, Ticket system&lt;br /&gt;
| url=[https://tickets.why2025.org tickets.why2025.org]&lt;br /&gt;
| support=[https://pretix.eu/about/en/ pretix.eu]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Mqtt.png&lt;br /&gt;
| what=MQTT, metric broadcast system&lt;br /&gt;
| url=mqtt://mqtt.why2025.org wss://mqtt.why2025.org&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Grafana.png&lt;br /&gt;
| what=Grafana, dashboarding&lt;br /&gt;
| url=[https://stats.why2025.org stats.why2025.org]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=WHY2025_logo_white.png&lt;br /&gt;
| what=WHY2025 map&lt;br /&gt;
| url=[https://map.why2025.org map.why2025.org]&lt;br /&gt;
| support=&lt;br /&gt;
| maintainers=Dev/Bug: [[Team:Terrain]], Hosting: Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Zabbix.png&lt;br /&gt;
| what=Zabbix, Monitoring&lt;br /&gt;
| url=&lt;br /&gt;
| support=&lt;br /&gt;
| maintainers=[[User:Xesxen|Xesxen]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Openproject.png&lt;br /&gt;
| what=OpenProject, planning tool&lt;br /&gt;
| url=https://planning.why2025.org/&lt;br /&gt;
| support=&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Snappymail.png&lt;br /&gt;
| what=Webmail&lt;br /&gt;
| url=https://webmail.ifcat.org&lt;br /&gt;
| support=&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=none.png&lt;br /&gt;
| what=Mail server, IMAP/SMTP&lt;br /&gt;
| url=&lt;br /&gt;
| support=&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=none.png&lt;br /&gt;
| what=Prior event sites&lt;br /&gt;
| url=https://mch2022.org https://sha2017.org https://ohm2013.org etc&lt;br /&gt;
| support=&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=none.png&lt;br /&gt;
| what=Pretix MQTT relay&lt;br /&gt;
| url=https://gitlab.com/why2025/team-sysadmin/ticketshop2mqtt-application&lt;br /&gt;
| support=&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Team Meetings ==&lt;br /&gt;
&lt;br /&gt;
{{MeetingOverview|Team=Sysadmin}}&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=Team:Sysadmin/Meeting_20250722&amp;diff=14649</id>
		<title>Team:Sysadmin/Meeting 20250722</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=Team:Sysadmin/Meeting_20250722&amp;diff=14649"/>
		<updated>2025-07-24T00:56:18Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Meeting&lt;br /&gt;
|Name=Team:Sysadmin: Final Meeting&lt;br /&gt;
|StartDate=2025/07/22 20:00:00&lt;br /&gt;
|EndDate=2025/07/22 21:00:00&lt;br /&gt;
|Where=https://meet.why2025.org/team-sysadmin&lt;br /&gt;
|Team=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
 Present: {{UserLink|Xesxen}}, {{UserLink|Splodin}}, {{UserLink|Wllm}}, {{UserLink|Boekenwuurm}} (partially)&lt;br /&gt;
 Excused: ?&lt;br /&gt;
 Absent: ?&lt;br /&gt;
&lt;br /&gt;
Agenda:&lt;br /&gt;
* Start: 20:04&lt;br /&gt;
* Note: Switching to &amp;quot;keep things going&amp;quot; mode&lt;br /&gt;
* Deploy: The Lounge + ZNC (@ Myne)&lt;br /&gt;
** Move ZNC and LDAPS behind Traefik, add ACL&#039;s&lt;br /&gt;
** No prio for now&lt;br /&gt;
* MQTT/Grafana (Splodin, but actually Xesxen)&lt;br /&gt;
** Team:CTF&lt;br /&gt;
** Team:Productiehuis (via Email, Infobeamer+Content CDN)&lt;br /&gt;
** Team:NUTS (via IRC)&lt;br /&gt;
** New and improved: Team:POC provisioned&lt;br /&gt;
* Resources: Deco on-field server&lt;br /&gt;
** Dual-core thin client 4GB RAM&lt;br /&gt;
** wLLm: HP Z240 SFF w/ i7 and 16/32GB RAM available&lt;br /&gt;
** 1U old ass crappy cisco whitelabeled dell server, C2Q, 8GB(?) DDR2, incl. rack rails.&lt;br /&gt;
** Will poke NOC on their preferences&lt;br /&gt;
* Low-Prio: Domain registry&lt;br /&gt;
** Pick this up post-event, most likely running out of time before event.&lt;br /&gt;
* Low-Prio: Restore old sites&lt;br /&gt;
** We have the data for the main OHM2013 website&lt;br /&gt;
*** We don&#039;t have the wiki at the moment, however&lt;br /&gt;
* Low-Prio: Deploy: Grafana/InfluxDB/MQTT/Pretix webhook (Splodin)&lt;br /&gt;
** Pending backups for Influx&lt;br /&gt;
* Team:Badge Hatchery =&amp;gt; IN PROGRESS&lt;br /&gt;
** Xesxen needs to set up a meeting w/ Team:Badge to finalize setup, est. on Sunday. Invite rest of team as well.&lt;br /&gt;
** Voor zondag: firmware requirement van onze kant:&lt;br /&gt;
*** TLS&lt;br /&gt;
*** Firmware on dedicated subdomain&lt;br /&gt;
*** ISRG Root X2 (Let&#039;s Encrypt)&lt;br /&gt;
*** Andere gratis ACME provider met eigen CA in mozilla chain&lt;br /&gt;
*** Eigen CA als fallback&lt;br /&gt;
*** Xesxen stuurt dadelijk een headsup.&lt;br /&gt;
* Outstanding support request &amp;amp; incoming mail/pigeons (RFC 1149 compliant)/smoke signals (Everyone)&lt;br /&gt;
** Anything noteworthy that happened last month?&lt;br /&gt;
** Anything we need to keep an eye out for?&lt;br /&gt;
** Service Request: orga image upload&lt;br /&gt;
** POS: Docker container access for pretix&lt;br /&gt;
** Main site: Set up cron sidecar for schedule&lt;br /&gt;
** A lot of small things that are too many to be named individually&lt;br /&gt;
* WVTTK (AOB)&lt;br /&gt;
** Anything needed from PL?&lt;br /&gt;
* Next meeting: Onsite \o/ (teardown planning)&lt;br /&gt;
* Meeting close @ 20:42&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=Team:Sysadmin/Meeting_20250722&amp;diff=14648</id>
		<title>Team:Sysadmin/Meeting 20250722</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=Team:Sysadmin/Meeting_20250722&amp;diff=14648"/>
		<updated>2025-07-24T00:54:09Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Meeting&lt;br /&gt;
|Name=Team:Sysadmin: Final Meeting&lt;br /&gt;
|StartDate=2025/07/22 20:00:00&lt;br /&gt;
|EndDate=2025/07/22 21:00:00&lt;br /&gt;
|Where=https://meet.why2025.org/team-sysadmin&lt;br /&gt;
|Team=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Present: Xesxen, Splodin, wLLm, Boekenwuurm (partially)&lt;br /&gt;
Excused: ?&lt;br /&gt;
Absent: ?&lt;br /&gt;
&lt;br /&gt;
Agenda:&lt;br /&gt;
* Start: 20:04&lt;br /&gt;
* Note: Switching to &amp;quot;keep things going&amp;quot; mode&lt;br /&gt;
* Deploy: The Lounge + ZNC (@ Myne)&lt;br /&gt;
** Move ZNC and LDAPS behind Traefik, add ACL&#039;s&lt;br /&gt;
** No prio for now&lt;br /&gt;
* MQTT/Grafana (Splodin, but actually Xesxen)&lt;br /&gt;
** Team:CTF&lt;br /&gt;
** Team:Productiehuis (via Email, Infobeamer+Content CDN)&lt;br /&gt;
** Team:NUTS (via IRC)&lt;br /&gt;
** New and improved: Team:POC provisioned&lt;br /&gt;
* Resources: Deco on-field server&lt;br /&gt;
** Dual-core thin client 4GB RAM&lt;br /&gt;
** wLLm: HP Z240 SFF w/ i7 and 16/32GB RAM available&lt;br /&gt;
** 1U old ass crappy cisco whitelabeled dell server, C2Q, 8GB(?) DDR2, incl. rack rails.&lt;br /&gt;
** Will poke NOC on their preferences&lt;br /&gt;
* Low-Prio: Domain registry&lt;br /&gt;
** Pick this up post-event, most likely running out of time before event.&lt;br /&gt;
* Low-Prio: Restore old sites&lt;br /&gt;
** We have the data for the main OHM2013 website&lt;br /&gt;
*** We don&#039;t have the wiki at the moment, however&lt;br /&gt;
* Low-Prio: Deploy: Grafana/InfluxDB/MQTT/Pretix webhook (Splodin)&lt;br /&gt;
** Pending backups for Influx&lt;br /&gt;
* Team:Badge Hatchery =&amp;gt; IN PROGRESS&lt;br /&gt;
** Xesxen needs to set up a meeting w/ Team:Badge to finalize setup, est. on Sunday. Invite rest of team as well.&lt;br /&gt;
** Voor zondag: firmware requirement van onze kant:&lt;br /&gt;
*** TLS&lt;br /&gt;
*** Firmware on dedicated subdomain&lt;br /&gt;
*** ISRG Root X2 (Let&#039;s Encrypt)&lt;br /&gt;
*** Andere gratis ACME provider met eigen CA in mozilla chain&lt;br /&gt;
*** Eigen CA als fallback&lt;br /&gt;
*** Xesxen stuurt dadelijk een headsup.&lt;br /&gt;
* Outstanding support request &amp;amp; incoming mail/pigeons (RFC 1149 compliant)/smoke signals (Everyone)&lt;br /&gt;
** Anything noteworthy that happened last month?&lt;br /&gt;
** Anything we need to keep an eye out for?&lt;br /&gt;
** Service Request: orga image upload&lt;br /&gt;
** POS: Docker container access for pretix&lt;br /&gt;
** Main site: Set up cron sidecar for schedule&lt;br /&gt;
** A lot of small things that are too many to be named individually&lt;br /&gt;
* WVTTK (AOB)&lt;br /&gt;
** Anything needed from PL?&lt;br /&gt;
* Next meeting: Onsite \o/ (teardown planning)&lt;br /&gt;
* Meeting close @ 20:42&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=Team:Sysadmin&amp;diff=14408</id>
		<title>Team:Sysadmin</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=Team:Sysadmin&amp;diff=14408"/>
		<updated>2025-07-22T20:11:45Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Team&lt;br /&gt;
|Lead=User:Xesxen&lt;br /&gt;
|Description=Team that provides most/all IT services needed to organize an event.&lt;br /&gt;
|Exclusive team=Yes&lt;br /&gt;
|Contact=sysadmin@why2025.org&lt;br /&gt;
|IRC=why2025-sysadmin&lt;br /&gt;
|team_is_essential_to_event=Show-stopper&lt;br /&gt;
|team_has_contact_info=Yes&lt;br /&gt;
|team_has_info_on_wiki=Yes&lt;br /&gt;
|team_has_planned_meetings=Yes&lt;br /&gt;
|team_has_enough_people=Yes&lt;br /&gt;
|team_needs_x_people=0&lt;br /&gt;
|team_has_drafted_budget=Yes&lt;br /&gt;
|team_has_informed_volunteer_team=Yes&lt;br /&gt;
|Projectleiding=User:Boekenwuurm&lt;br /&gt;
}}&lt;br /&gt;
==Team Members==&lt;br /&gt;
&lt;br /&gt;
{{TeamMemberEntry|User:Xesxen}}&lt;br /&gt;
{{TeamMemberEntry|User:Splodin}}&lt;br /&gt;
{{TeamMemberEntry|User:Kiara}}&lt;br /&gt;
{{TeamMemberEntry|User:Wllm}}&lt;br /&gt;
==Mail==&lt;br /&gt;
* IMAP: mail.ifcat.org port 993, SSL/TLS&lt;br /&gt;
* SMTP: mail.ifcat.org port 587, STARTTLS&lt;br /&gt;
&lt;br /&gt;
Your username includes the domain part, eg &amp;lt;handle&amp;gt;@&amp;lt;event&amp;gt;.tld&lt;br /&gt;
&lt;br /&gt;
Webmail: https://webmail.ifcat.org/&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
&lt;br /&gt;
By default all topics can be read without authentication. To publish to a topic an account is required.&lt;br /&gt;
&lt;br /&gt;
If your team would like to publish statistics to MQTT please contact sysadmin@why2025.org&lt;br /&gt;
&lt;br /&gt;
For graphing data in Grafana we support raw numeric values (without (SI) units). These simple values will be tracked in grafana with the full MQTT topic as the index name and `value` as the column name.&lt;br /&gt;
&lt;br /&gt;
For flexibility reasons you can also send a datapoint with multiple values (&amp;quot;extended format&amp;quot;), add tags to your datapoint as well as send multiple datapoints in bulk. The extended format is a simple key-value JSON dictionary, or a JSON list of these when pushing multiple datapoints in bulk.&lt;br /&gt;
&lt;br /&gt;
Examples of the extended format:&lt;br /&gt;
&lt;br /&gt;
Single datapoint:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;spacenet&amp;quot;: 123,&lt;br /&gt;
  &amp;quot;why2025&amp;quot;: 456,&lt;br /&gt;
  &amp;quot;why2025-2.5GHz&amp;quot;: 10&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Single datapoint with tags:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;tschunk club mate&amp;quot;: 100,&lt;br /&gt;
  &amp;quot;tschunk miomio mate&amp;quot;: 200,&lt;br /&gt;
  &amp;quot;tags&amp;quot;: {&lt;br /&gt;
    &amp;quot;bar&amp;quot;: &amp;quot;Main stage&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Multiple datapoints with tags:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;R&amp;quot;: 230,&lt;br /&gt;
    &amp;quot;S&amp;quot;: 232,&lt;br /&gt;
    &amp;quot;T&amp;quot;: 231,&lt;br /&gt;
    &amp;quot;tags&amp;quot;: {&lt;br /&gt;
      &amp;quot;generator&amp;quot;: &amp;quot;A&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;R&amp;quot;: 232,&lt;br /&gt;
    &amp;quot;S&amp;quot;: 229,&lt;br /&gt;
    &amp;quot;T&amp;quot;: 230,&lt;br /&gt;
    &amp;quot;tags&amp;quot;: {&lt;br /&gt;
      &amp;quot;generator&amp;quot;: &amp;quot;B&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please note nested lists or dictionaries within the data point, outside of the &amp;quot;tags&amp;quot; key, are not supported and will not function.&lt;br /&gt;
&lt;br /&gt;
As for the MQTT feed itself: we prefer to assign a prefix per team or project under the `why2025/` prefix.&lt;br /&gt;
&lt;br /&gt;
Please publish data points with `retain` enabled, this will allow anyone to immediately receive the most recent data upon connecting to the MQTT server&lt;br /&gt;
&lt;br /&gt;
== OpenMetrics / Prometheus Line Procol ==&lt;br /&gt;
&lt;br /&gt;
We can also ingest OpenMetrics-compatible data at regular intervals. Let us know where we can grab the data (https://...), and we can set you up to relay this to MQTT / Grafana.&lt;br /&gt;
&lt;br /&gt;
== Nextcloud Access ==&lt;br /&gt;
&lt;br /&gt;
For accessing Nextcloud &#039;&#039;&#039;each&#039;&#039;&#039; team member will need their own personal account. Team:Sysadmin will create a main team folder (WHY2025/$TEAM) under which you&#039;ll be able to add your documents.&lt;br /&gt;
&lt;br /&gt;
When requesting Nextcloud access:&lt;br /&gt;
* If you are a team lead: for which of your team(s) you want a shared folder to be created&lt;br /&gt;
* Indicate which teams you&#039;ll need access to, and which team lead we can validate the request with.&lt;br /&gt;
* If you request accounts in bulk: let us know both the nickname and associated mail address.&lt;br /&gt;
&lt;br /&gt;
== Services == &lt;br /&gt;
&lt;br /&gt;
For requesting services: please send a mail to our team mailbox and talk to us &#039;&#039;&#039;before&#039;&#039;&#039; deciding which software to deploy.&lt;br /&gt;
&lt;br /&gt;
For suggestions: reaching out via either IRC or our team mailbox will work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; flex-wrap: wrap;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=WHY2025_logo_white.png&lt;br /&gt;
| what=WHY2025 main website&lt;br /&gt;
| url=[https://why2025.org https://why2025.org]&lt;br /&gt;
| support=[https://gitlab.com/https://gitlab.com/why2025/website/frontend Source code]&lt;br /&gt;
| maintainers=Code: Website project team, you? (PR&#039;s welcome), Hosting: Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Nextcloud.png&lt;br /&gt;
| what=Nextcloud, File sharing. Log in using your email address&lt;br /&gt;
| url=[https://cloud.ifcat.org https://cloud.ifcat.org]&lt;br /&gt;
| support=[https://nextcloud.com/support/ Documentation]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=mailman.png&lt;br /&gt;
| what=Mailman, Group mailing lists&lt;br /&gt;
| url=[https://lists.why2025.org/ lists.why2025.org]&lt;br /&gt;
| support=[http://www.list.org/users.html user guide]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Zammad.png&lt;br /&gt;
| what=Zammad, Support Ticketing System&lt;br /&gt;
| url=[https://support.why2025.org support.why2025.org]&lt;br /&gt;
| support=[https://docs.zammad.org/en/latest/]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Hedgedoc.png&lt;br /&gt;
| what=HedgeDoc, Colaborative text editing&lt;br /&gt;
| url=[https://pad.ifcat.org pad.ifcat.org]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Pretalx.png&lt;br /&gt;
| what=Pretalx, Call for Papers system&lt;br /&gt;
| url=[https://cfp.why2025.org cfp.why2025.org]&lt;br /&gt;
| support=[https://github.com/pretalx/pretalx]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Engelsystem.png&lt;br /&gt;
| what=Engelsystem Volunteer registration (soon™)&lt;br /&gt;
| url=[https://angel.why2025.org angel.why2025.org]&lt;br /&gt;
| support=[https://github.com/engelsystem/engelsystem github]&lt;br /&gt;
| maintainers=[[Team:Volunteers]], [[Team:Sysadmin]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Mediawiki.png&lt;br /&gt;
| what=Mediawiki, Wiki / Knowledge sharing system&lt;br /&gt;
| url=[https://wiki.why2025.org wiki.why2025.org]&lt;br /&gt;
| support=[https://www.mediawiki.org/wiki/Help:Contents mediawiki help]&lt;br /&gt;
| maintainers=Sysadmin, Everyone&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=jitsi.png&lt;br /&gt;
| what=Jitsi, video conferencing platform&lt;br /&gt;
| url=[https://meet.why2025.org/ meet.why2025.org]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Authentik.png&lt;br /&gt;
| what=Authentik Single Sign-On&lt;br /&gt;
| url=[http://auth.why2025.org/ auth.why2025.org]&lt;br /&gt;
| support=[https://docs.goauthentik.io/]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Wordpress.png&lt;br /&gt;
| what=Wordpress, Blogging backend for main site&lt;br /&gt;
| url=[https://why2025.org why2025.org]&lt;br /&gt;
| support=[https://wordpress.org/plugins/documentation/]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Gitlab.png&lt;br /&gt;
| what=Gitlab, Source hosting (external)&lt;br /&gt;
| url=[https://gitlab.com/why2025/ Gitlab: Why2025]&lt;br /&gt;
| support=[https://docs.gitlab.com/]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Pretix.png&lt;br /&gt;
| what=Pretix, Ticket system&lt;br /&gt;
| url=[https://tickets.why2025.org tickets.why2025.org]&lt;br /&gt;
| support=[https://pretix.eu/about/en/ pretix.eu]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Mqtt.png&lt;br /&gt;
| what=MQTT, metric broadcast system&lt;br /&gt;
| url=mqtt://mqtt.why2025.org wss://mqtt.why2025.org&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Grafana.png&lt;br /&gt;
| what=Grafana, dashboarding&lt;br /&gt;
| url=[https://stats.why2025.org stats.why2025.org]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=WHY2025_logo_white.png&lt;br /&gt;
| what=WHY2025 map&lt;br /&gt;
| url=[https://map.why2025.org map.why2025.org]&lt;br /&gt;
| support=&lt;br /&gt;
| maintainers=Dev/Bug: [[Team:Terrain]], Hosting: Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Zabbix.png&lt;br /&gt;
| what=Zabbix, Monitoring&lt;br /&gt;
| url=&lt;br /&gt;
| support=&lt;br /&gt;
| maintainers=[[User:Xesxen|Xesxen]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Openproject.png&lt;br /&gt;
| what=OpenProject, planning tool&lt;br /&gt;
| url=https://planning.why2025.org/&lt;br /&gt;
| support=&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Snappymail.png&lt;br /&gt;
| what=Webmail&lt;br /&gt;
| url=https://webmail.ifcat.org&lt;br /&gt;
| support=&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=none.png&lt;br /&gt;
| what=Mail server, IMAP/SMTP&lt;br /&gt;
| url=&lt;br /&gt;
| support=&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=none.png&lt;br /&gt;
| what=Prior event sites&lt;br /&gt;
| url=https://mch2022.org https://sha2017.org https://ohm2013.org etc&lt;br /&gt;
| support=&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=none.png&lt;br /&gt;
| what=Pretix MQTT relay&lt;br /&gt;
| url=https://gitlab.com/why2025/team-sysadmin/ticketshop2mqtt-application&lt;br /&gt;
| support=&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Team Meetings ==&lt;br /&gt;
&lt;br /&gt;
{{MeetingOverview|Team=Sysadmin}}&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=Team:Sysadmin/Meeting_20250708&amp;diff=12605</id>
		<title>Team:Sysadmin/Meeting 20250708</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=Team:Sysadmin/Meeting_20250708&amp;diff=12605"/>
		<updated>2025-07-08T18:51:04Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Meeting&lt;br /&gt;
|Name=Team:Sysadmin: Regular Meeting&lt;br /&gt;
|StartDate=2025/07/08 20:00:00&lt;br /&gt;
|EndDate=2025/07/08 21:00:00&lt;br /&gt;
|Where=https://meet.why2025.org/team-sysadmin&lt;br /&gt;
|Team=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Agenda:&lt;br /&gt;
* Start: 20:01&lt;br /&gt;
* Note: Switching to &amp;quot;keep things going&amp;quot; mode next meeting&lt;br /&gt;
* Deploy: The Lounge + ZNC (@ Myne)&lt;br /&gt;
** Move ZNC and LDAPS behind Traefik, add ACL&#039;s&lt;br /&gt;
** No prio for now&lt;br /&gt;
* MQTT/Grafana (Splodin)&lt;br /&gt;
** Team:CTF&lt;br /&gt;
** Team:Productiehuis (via Email, Infobeamer+Content CDN)&lt;br /&gt;
** Team:Content (via Email, Pretalx/CFP)&lt;br /&gt;
** Team:Warehouse (in person, borrow statistics)&lt;br /&gt;
** Team:NUTS (via IRC)&lt;br /&gt;
** Angelsystem&lt;br /&gt;
** https://gitlab.com/why2025/team-sysadmin/service-prometheus2mqtt&lt;br /&gt;
** Picking this up on thursday @ Hackalot&lt;br /&gt;
* Resources: Pretalx LLM (1c, 1.5GiB)&lt;br /&gt;
** Relocate to separate VM @ bit. Reclaim these resources as needed (= move elsewhere) later if we need to scale elsewhere.&lt;br /&gt;
* Resources: Deco on-field server&lt;br /&gt;
** Figure out what hardware to deploy this thursday.&lt;br /&gt;
* Nextcloud (Splodin)&lt;br /&gt;
** Push needs to be set up&lt;br /&gt;
* Low-Prio: Domain registry&lt;br /&gt;
** Pick this up post-event, most likely running out of time before event.&lt;br /&gt;
* Low-Prio: Restore old sites&lt;br /&gt;
** We have the data for the main OHM2013 website&lt;br /&gt;
** We don&#039;t have the wiki at the moment, however&lt;br /&gt;
* Low-Prio: Deploy: Grafana/InfluxDB/MQTT/Pretix webhook (Xesxen)&lt;br /&gt;
** Pending backups for Influx&lt;br /&gt;
* Team:Badge Hatchery&lt;br /&gt;
** Borgmatic setup w/ separate Hetzner storage subaccount&lt;br /&gt;
** Ensure standard setup has been followed before going &amp;quot;live&amp;quot;&lt;br /&gt;
* Outstanding support request &amp;amp; incoming mail/pigeons (RFC 1149 compliant)/smoke signals (Everyone)&lt;br /&gt;
** Anything noteworthy that happened last month?&lt;br /&gt;
** Anything we need to keep an eye out for?&lt;br /&gt;
** Service Request: orga image upload&lt;br /&gt;
** POS: Docker container access for pretix&lt;br /&gt;
* WVTTK (AOB)&lt;br /&gt;
* Next meeting: 22 July 2025 20:00&lt;br /&gt;
* Meeting close @ 20:27&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=Project:Arcade&amp;diff=12180</id>
		<title>Project:Arcade</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=Project:Arcade&amp;diff=12180"/>
		<updated>2025-07-06T20:21:13Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Projects&lt;br /&gt;
|Name=Arcade&lt;br /&gt;
|Has project tag=arcade, video games, reverse engineering, music&lt;br /&gt;
|Has description=Bringing arcade cabinets for playing and hacking!&lt;br /&gt;
|Has website=https://nationaalvideogamemuseum.nl&lt;br /&gt;
|Located at village=Village:̸̡̛̯̳͎͔̟̠̪̲͖̦̒̆̀̈̉̒͊̚̕͝&lt;br /&gt;
}}&lt;br /&gt;
{{MapObject|Handle = buildings.16}}&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=Village:Chrz%C4%85szczy%C5%BCewoszyce&amp;diff=12179</id>
		<title>Village:Chrząszczyżewoszyce</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=Village:Chrz%C4%85szczy%C5%BCewoszyce&amp;diff=12179"/>
		<updated>2025-07-06T20:20:42Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Village&lt;br /&gt;
|Has name=Chrząszczyżewoszyce&lt;br /&gt;
|Has contact=matrix: #why2025:hackerspace.pl&lt;br /&gt;
|Has description=An amalgam of people from around Europe. FKA Cursed Computer Club, Chaos Penguin Club, etc.&lt;br /&gt;
|Village is open to newcomers=No&lt;br /&gt;
|Provides session location=No&lt;br /&gt;
|Location=52.69153, 4.74621&lt;br /&gt;
|Has orga contact=informatic@hackerspace.pl&lt;br /&gt;
|On site orga contact=TBA&lt;br /&gt;
|Village citizen count=15&lt;br /&gt;
|Village Needs power=Smaller Village (up to 2x 230V/Schuko)&lt;br /&gt;
|Village size needed=75&lt;br /&gt;
|Village hacktents num=1&lt;br /&gt;
|Village brings big stuff=No&lt;br /&gt;
}}&lt;br /&gt;
{{MapObject|Handle = villages.43}}&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=Village:Tilde.industries_and_friends&amp;diff=12178</id>
		<title>Village:Tilde.industries and friends</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=Village:Tilde.industries_and_friends&amp;diff=12178"/>
		<updated>2025-07-06T20:20:20Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Village&lt;br /&gt;
|Has name=tilde.industries and friends&lt;br /&gt;
|Has website=https://tilde.industries/&lt;br /&gt;
|Has description=The village of tilde.industries and friends. Come see us, we have tea, different types of coffee brewers, ancient board games, iron-on patches and good vibes!&lt;br /&gt;
|Provides session location=No&lt;br /&gt;
|On site orga contact=Unknown&lt;br /&gt;
|Village citizen count=15&lt;br /&gt;
|Village size needed=250&lt;br /&gt;
|Village hacktents num=2&lt;br /&gt;
}}&lt;br /&gt;
{{MapObject|Handle = villages.41}}&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=Village:DIWhy_Bar&amp;diff=12177</id>
		<title>Village:DIWhy Bar</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=Village:DIWhy_Bar&amp;diff=12177"/>
		<updated>2025-07-06T20:18:57Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Village&lt;br /&gt;
|Has name=DIWhy Bar&lt;br /&gt;
|Has website=https://holymate.nl/&lt;br /&gt;
|Has contact=Okarin&lt;br /&gt;
|Has description=This is a small community run self service bar serving homemade mate in various flavors.&lt;br /&gt;
|Part of=Arcade&lt;br /&gt;
|Has village tag=homebrew, Soda, Tap&lt;br /&gt;
|Village is open to newcomers=No&lt;br /&gt;
|Provides session location=No&lt;br /&gt;
|Has orga contact=okarin@why2025.org&lt;br /&gt;
|On site orga contact=Okarin, Probably in heaven, DECT:OKAB&lt;br /&gt;
|Village citizen count=1&lt;br /&gt;
|Village Needs power=Smaller Village (up to 2x 230V/Schuko)&lt;br /&gt;
|Village size needed=15&lt;br /&gt;
|Village hacktents num=0&lt;br /&gt;
|Village brings big stuff=No&lt;br /&gt;
|Village planning notes=Single 3x6m tent that holds a self service bar serving camp made mate.&lt;br /&gt;
}}&lt;br /&gt;
{{MapObject|Handle = villages.40}}&lt;br /&gt;
May the mate taste as sweet as at home.&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=Cluster:Cursed&amp;diff=12176</id>
		<title>Cluster:Cursed</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=Cluster:Cursed&amp;diff=12176"/>
		<updated>2025-07-06T20:18:38Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Cluster&lt;br /&gt;
|Name=Arcade&lt;br /&gt;
|Has description=A cluster for the arcade people&lt;br /&gt;
|Location=52.69256, 4.74531&lt;br /&gt;
}}&lt;br /&gt;
{{MapObject|Handle = cluster.10}}&lt;br /&gt;
A cluster for the people related or staying at the arcade.&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=Village:%C3%98l_Telecom&amp;diff=12175</id>
		<title>Village:Øl Telecom</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=Village:%C3%98l_Telecom&amp;diff=12175"/>
		<updated>2025-07-06T20:17:54Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Village&lt;br /&gt;
|Has name=Øl Telecom&lt;br /&gt;
|Has website=http://ol-tele.com&lt;br /&gt;
|Has contact=eloy on libera.chat, @eloy@hsnl.social on fedi &lt;br /&gt;
|Related to village=&lt;br /&gt;
|Provides session location=No&lt;br /&gt;
|Has orga contact=&lt;br /&gt;
|On site orga contact=&lt;br /&gt;
|Village citizen count=10&lt;br /&gt;
|Village size needed=&lt;br /&gt;
|Village hacktents num=2&lt;br /&gt;
}}&lt;br /&gt;
{{MapObject|Handle = villages.42}}&lt;br /&gt;
Providing WHølesale telecommunication services&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=Village:%CC%B8%CC%A1%CC%9B%CC%AF%CC%B3%CD%8E%CD%94%CC%9F%CC%A0%CC%AA%CC%B2%CD%96%CC%A6%CC%92%CC%86%CC%80%CC%88%CC%89%CC%92%CD%8A%CC%9A%CC%95%CD%9D&amp;diff=12173</id>
		<title>Village:̸̡̛̯̳͎͔̟̠̪̲͖̦̒̆̀̈̉̒͊̚̕͝</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=Village:%CC%B8%CC%A1%CC%9B%CC%AF%CC%B3%CD%8E%CD%94%CC%9F%CC%A0%CC%AA%CC%B2%CD%96%CC%A6%CC%92%CC%86%CC%80%CC%88%CC%89%CC%92%CD%8A%CC%9A%CC%95%CD%9D&amp;diff=12173"/>
		<updated>2025-07-06T20:11:49Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Village&lt;br /&gt;
|Has name=ZERO WIDTH NO-BREAK SPACE&lt;br /&gt;
|Has website=https://wiki.why2025.org/Village:̸̡̛̯̳͎͔̟̠̪̲͖̦̒̆̀̈̉̒͊̚̕͝&lt;br /&gt;
|Has contact=Shiz (5730)&lt;br /&gt;
|Has description=No brakes on this unicode&lt;br /&gt;
|Part of=Arcade&lt;br /&gt;
|Related to village=Village:Tilde.industries and friends, Village:Øl Telecom, Village:Chrząszczyżewoszyce, Village:DIWhy Bar&lt;br /&gt;
|Has village tag=arcade, reverse engineering, music, breaking, fixing, text rendering&lt;br /&gt;
|Village is open to newcomers=Yes&lt;br /&gt;
|Provides session location=No&lt;br /&gt;
|Location=52.69289, 4.74508&lt;br /&gt;
|Has orga contact=why@shiz.me&lt;br /&gt;
|On site orga contact=Shiz&lt;br /&gt;
|Village frab=no&lt;br /&gt;
|Village content space=no&lt;br /&gt;
|Village citizen count=12&lt;br /&gt;
|Village Needs power=Other (describe below)&lt;br /&gt;
|Village size needed=0&lt;br /&gt;
|Village hacktents num=0&lt;br /&gt;
|Village brings big stuff=No&lt;br /&gt;
|Village Special Vehicle=no&lt;br /&gt;
|Village planning notes=Located inside the Arcade 1 tent, no other specific resources needed.&lt;br /&gt;
}}&lt;br /&gt;
{{MapObject|Handle = villages.44}}&lt;br /&gt;
And a dutch hacker named Iron (the real one)&lt;br /&gt;
==TL;DR==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A collective of hardware/software/food hackers with a weird habit of finding cursed technology to break. The WHY2025 reincarnation of [https://wiki.mch2022.org/Village:Love_Live_Laugh!_Arcade_Hacking_Festival_~after_camp_ACTIVITY~_Wai-Wai!_Tent_Meeting!! Love Live Laugh! Arcade Hacking Festival ~after camp ACTIVITY~ Wai-Wai! Tent Meeting!!].&lt;br /&gt;
&lt;br /&gt;
Come discover the weird world of modern industrial game systems!&lt;br /&gt;
&lt;br /&gt;
==Equipment==&lt;br /&gt;
&lt;br /&gt;
* Cabinets for [[Project:Arcade]]&lt;br /&gt;
* Weird arcade baseboards and systems!&lt;br /&gt;
* Test &amp;amp; measurement equipment&lt;br /&gt;
** Agilent 54854A oscilloscope (20 GSa/s, 4 GHz)&lt;br /&gt;
** Tektronix 222 oscilloscope (small and cute, 10 MHz, portable, floating inputs)&lt;br /&gt;
** Tektronix TLA5202 logic analyser (68 channels, 2 GHz)&lt;br /&gt;
** Kikusui PWR800M DC power supply (0-320V, 0-12.5A, 800W)&lt;br /&gt;
* Train parts&lt;br /&gt;
** NS ICMm destination dot-matrix display&lt;br /&gt;
** NC ICMm 1st class seats?&lt;br /&gt;
* 3D printers&lt;br /&gt;
** Voron V2.4 350mm&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=User:Donk&amp;diff=12004</id>
		<title>User:Donk</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=User:Donk&amp;diff=12004"/>
		<updated>2025-07-04T12:39:01Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: Fix ASCII art?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UserInfo&lt;br /&gt;
|Village=Village:NOP&lt;br /&gt;
|Arrival=2025-08-06&lt;br /&gt;
|Departure=2025-08-13&lt;br /&gt;
|Languages=EN,DU,&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.     ／＞　　フ&lt;br /&gt;
     | 　_　_ l&lt;br /&gt;
   ／` ミ＿xノ&lt;br /&gt;
  /　　　　 |&lt;br /&gt;
 /　 ヽ　　 ﾉ&lt;br /&gt;
 │　　|　|　|つ🧀&amp;lt;-- kaas&lt;br /&gt;
／￣|　　 |　|　|&lt;br /&gt;
(＿_ヽ＿_ヽ__)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=Team:Sysadmin&amp;diff=11864</id>
		<title>Team:Sysadmin</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=Team:Sysadmin&amp;diff=11864"/>
		<updated>2025-07-02T15:29:32Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Team&lt;br /&gt;
|Lead=User:Xesxen&lt;br /&gt;
|Description=Team that provides most/all IT services needed to organize an event.&lt;br /&gt;
|Exclusive team=Yes&lt;br /&gt;
|Contact=sysadmin@why2025.org&lt;br /&gt;
|IRC=why2025-sysadmin&lt;br /&gt;
|team_is_essential_to_event=Show-stopper&lt;br /&gt;
|team_has_contact_info=Yes&lt;br /&gt;
|team_has_info_on_wiki=Yes&lt;br /&gt;
|team_has_planned_meetings=Yes&lt;br /&gt;
|team_has_enough_people=Yes&lt;br /&gt;
|team_needs_x_people=0&lt;br /&gt;
|team_has_drafted_budget=Yes&lt;br /&gt;
|team_has_informed_volunteer_team=Yes&lt;br /&gt;
|Projectleiding=User:Boekenwuurm&lt;br /&gt;
}}&lt;br /&gt;
==Team Members==&lt;br /&gt;
&lt;br /&gt;
{{TeamMemberEntry|User:Xesxen}}&lt;br /&gt;
{{TeamMemberEntry|User:Splodin}}&lt;br /&gt;
{{TeamMemberEntry|User:Kiara}}&lt;br /&gt;
{{TeamMemberEntry|User:Wllm}}&lt;br /&gt;
==Mail==&lt;br /&gt;
* IMAP: mail.ifcat.org port 993, SSL/TLS&lt;br /&gt;
* SMTP: mail.ifcat.org port 587, STARTTLS&lt;br /&gt;
&lt;br /&gt;
Your username includes the domain part, eg &amp;lt;handle&amp;gt;@&amp;lt;event&amp;gt;.tld&lt;br /&gt;
&lt;br /&gt;
Webmail: https://webmail.ifcat.org/&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
&lt;br /&gt;
By default all topics can be read without authentication. To publish to a topic an account is required.&lt;br /&gt;
&lt;br /&gt;
If your team would like to publish statistics to MQTT please contact sysadmin@why2025.org&lt;br /&gt;
&lt;br /&gt;
For graphing data in Grafana we support raw numeric values (without (SI) units). These simple values will be tracked in grafana with the full MQTT topic as the index name and `value` as the column name.&lt;br /&gt;
&lt;br /&gt;
For flexibility reasons you can also send a datapoint with multiple values (&amp;quot;extended format&amp;quot;), add tags to your datapoint as well as send multiple datapoints in bulk. The extended format is a simple key-value JSON dictionary, or a JSON list of these when pushing multiple datapoints in bulk.&lt;br /&gt;
&lt;br /&gt;
Examples of the extended format:&lt;br /&gt;
&lt;br /&gt;
Single datapoint:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;spacenet&amp;quot;: 123,&lt;br /&gt;
  &amp;quot;why2025&amp;quot;: 456,&lt;br /&gt;
  &amp;quot;why2025-2.5GHz&amp;quot;: 10&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Single datapoint with tags:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;tschunk club mate&amp;quot;: 100,&lt;br /&gt;
  &amp;quot;tschunk miomio mate&amp;quot;: 200,&lt;br /&gt;
  &amp;quot;tags&amp;quot;: {&lt;br /&gt;
    &amp;quot;bar&amp;quot;: &amp;quot;Main stage&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Multiple datapoints with tags:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;R&amp;quot;: 230,&lt;br /&gt;
    &amp;quot;S&amp;quot;: 232,&lt;br /&gt;
    &amp;quot;T&amp;quot;: 231,&lt;br /&gt;
    &amp;quot;tags&amp;quot;: {&lt;br /&gt;
      &amp;quot;generator&amp;quot;: &amp;quot;A&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;R&amp;quot;: 232,&lt;br /&gt;
    &amp;quot;S&amp;quot;: 229,&lt;br /&gt;
    &amp;quot;T&amp;quot;: 230,&lt;br /&gt;
    &amp;quot;tags&amp;quot;: {&lt;br /&gt;
      &amp;quot;generator&amp;quot;: &amp;quot;B&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please note nested lists or dictionaries within the data point, outside of the &amp;quot;tags&amp;quot; key, are not supported and will not function.&lt;br /&gt;
&lt;br /&gt;
As for the MQTT feed itself: we prefer to assign a prefix per team or project under the `why2025/` prefix.&lt;br /&gt;
&lt;br /&gt;
Please publish data points with `retain` enabled, this will allow anyone to immediately receive the most recent data upon connecting to the MQTT server&lt;br /&gt;
&lt;br /&gt;
== Nextcloud Access ==&lt;br /&gt;
&lt;br /&gt;
For accessing Nextcloud &#039;&#039;&#039;each&#039;&#039;&#039; team member will need their own personal account. Team:Sysadmin will create a main team folder (WHY2025/$TEAM) under which you&#039;ll be able to add your documents.&lt;br /&gt;
&lt;br /&gt;
When requesting Nextcloud access:&lt;br /&gt;
* If you are a team lead: for which of your team(s) you want a shared folder to be created&lt;br /&gt;
* Indicate which teams you&#039;ll need access to, and which team lead we can validate the request with.&lt;br /&gt;
* If you request accounts in bulk: let us know both the nickname and associated mail address.&lt;br /&gt;
&lt;br /&gt;
== Services == &lt;br /&gt;
&lt;br /&gt;
For requesting services: please send a mail to our team mailbox and talk to us &#039;&#039;&#039;before&#039;&#039;&#039; deciding which software to deploy.&lt;br /&gt;
&lt;br /&gt;
For suggestions: reaching out via either IRC or our team mailbox will work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: flex; flex-wrap: wrap;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=WHY2025_logo_white.png&lt;br /&gt;
| what=WHY2025 main website&lt;br /&gt;
| url=[https://why2025.org https://why2025.org]&lt;br /&gt;
| support=[https://gitlab.com/https://gitlab.com/why2025/website/frontend Source code]&lt;br /&gt;
| maintainers=Code: Website project team, you? (PR&#039;s welcome), Hosting: Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Nextcloud.png&lt;br /&gt;
| what=Nextcloud, File sharing. Log in using your email address&lt;br /&gt;
| url=[https://cloud.ifcat.org https://cloud.ifcat.org]&lt;br /&gt;
| support=[https://nextcloud.com/support/ Documentation]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=mailman.png&lt;br /&gt;
| what=Mailman, Group mailing lists&lt;br /&gt;
| url=[https://lists.why2025.org/ lists.why2025.org]&lt;br /&gt;
| support=[http://www.list.org/users.html user guide]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Zammad.png&lt;br /&gt;
| what=Zammad, Support Ticketing System&lt;br /&gt;
| url=[https://support.why2025.org support.why2025.org]&lt;br /&gt;
| support=[https://docs.zammad.org/en/latest/]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Hedgedoc.png&lt;br /&gt;
| what=HedgeDoc, Colaborative text editing&lt;br /&gt;
| url=[https://pad.ifcat.org pad.ifcat.org]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Pretalx.png&lt;br /&gt;
| what=Pretalx, Call for Papers system&lt;br /&gt;
| url=[https://cfp.why2025.org cfp.why2025.org]&lt;br /&gt;
| support=[https://github.com/pretalx/pretalx]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Engelsystem.png&lt;br /&gt;
| what=Engelsystem Volunteer registration (soon™)&lt;br /&gt;
| url=[https://angel.why2025.org angel.why2025.org]&lt;br /&gt;
| support=[https://github.com/engelsystem/engelsystem github]&lt;br /&gt;
| maintainers=[[Team:Volunteers]], [[Team:Sysadmin]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Mediawiki.png&lt;br /&gt;
| what=Mediawiki, Wiki / Knowledge sharing system&lt;br /&gt;
| url=[https://wiki.why2025.org wiki.why2025.org]&lt;br /&gt;
| support=[https://www.mediawiki.org/wiki/Help:Contents mediawiki help]&lt;br /&gt;
| maintainers=Sysadmin, Everyone&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=jitsi.png&lt;br /&gt;
| what=Jitsi, video conferencing platform&lt;br /&gt;
| url=[https://meet.why2025.org/ meet.why2025.org]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Authentik.png&lt;br /&gt;
| what=Authentik Single Sign-On&lt;br /&gt;
| url=[http://auth.why2025.org/ auth.why2025.org]&lt;br /&gt;
| support=[https://docs.goauthentik.io/]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Wordpress.png&lt;br /&gt;
| what=Wordpress, Blogging backend for main site&lt;br /&gt;
| url=[https://why2025.org why2025.org]&lt;br /&gt;
| support=[https://wordpress.org/plugins/documentation/]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Gitlab.png&lt;br /&gt;
| what=Gitlab, Source hosting (external)&lt;br /&gt;
| url=[https://gitlab.com/why2025/ Gitlab: Why2025]&lt;br /&gt;
| support=[https://docs.gitlab.com/]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Pretix.png&lt;br /&gt;
| what=Pretix, Ticket system&lt;br /&gt;
| url=[https://tickets.why2025.org tickets.why2025.org]&lt;br /&gt;
| support=[https://pretix.eu/about/en/ pretix.eu]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Mqtt.png&lt;br /&gt;
| what=MQTT, metric broadcast system&lt;br /&gt;
| url=mqtt://mqtt.why2025.org wss://mqtt.why2025.org&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Grafana.png&lt;br /&gt;
| what=Grafana, dashboarding&lt;br /&gt;
| url=[https://stats.why2025.org stats.why2025.org]&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=WHY2025_logo_white.png&lt;br /&gt;
| what=WHY2025 map&lt;br /&gt;
| url=[https://map.why2025.org map.why2025.org]&lt;br /&gt;
| support=&lt;br /&gt;
| maintainers=Dev/Bug: [[Team:Terrain]], Hosting: Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Zabbix.png&lt;br /&gt;
| what=Zabbix, Monitoring&lt;br /&gt;
| url=&lt;br /&gt;
| support=&lt;br /&gt;
| maintainers=[[User:Xesxen|Xesxen]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Openproject.png&lt;br /&gt;
| what=OpenProject, planning tool&lt;br /&gt;
| url=https://planning.why2025.org/&lt;br /&gt;
| support=&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=Snappymail.png&lt;br /&gt;
| what=Webmail&lt;br /&gt;
| url=https://webmail.ifcat.org&lt;br /&gt;
| support=&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=none.png&lt;br /&gt;
| what=Mail server, IMAP/SMTP&lt;br /&gt;
| url=&lt;br /&gt;
| support=&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=none.png&lt;br /&gt;
| what=Prior event sites&lt;br /&gt;
| url=https://mch2022.org https://sha2017.org https://ohm2013.org etc&lt;br /&gt;
| support=&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Sysadmin-Service&lt;br /&gt;
| image=none.png&lt;br /&gt;
| what=Pretix MQTT relay&lt;br /&gt;
| url=https://gitlab.com/why2025/team-sysadmin/ticketshop2mqtt-application&lt;br /&gt;
| support=&lt;br /&gt;
| maintainers=Sysadmin&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both;&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Team Meetings ==&lt;br /&gt;
&lt;br /&gt;
{{MeetingOverview|Team=Sysadmin}}&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
	<entry>
		<id>https://wiki.why2025.org/index.php?title=Team:Family/Sandbox&amp;diff=11577</id>
		<title>Team:Family/Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.why2025.org/index.php?title=Team:Family/Sandbox&amp;diff=11577"/>
		<updated>2025-06-27T09:58:05Z</updated>

		<summary type="html">&lt;p&gt;Xesxen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{FamilyZoneProject&lt;br /&gt;
|Image=Gameoflife.png Sandbox.png&lt;br /&gt;
|Lead=User:Boo75&lt;br /&gt;
|Status=idea&lt;br /&gt;
|Type=toys&lt;br /&gt;
|AgeGroup=0-3, 3-6, 6-9, 9-12&lt;br /&gt;
}}&lt;br /&gt;
TODO: Provide a brief description.&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
* TODO: Other teams needed?&lt;br /&gt;
&lt;br /&gt;
== Volunteers required ==&lt;br /&gt;
* Do you need volunteers to run this project or workshop?&lt;br /&gt;
* Can they be kids-angels (6-16 year old volunteers)?&lt;br /&gt;
&lt;br /&gt;
== Materials required ==&lt;br /&gt;
* TODO: List all materials that you need for this project.&lt;br /&gt;
&lt;br /&gt;
== Materials arranged == &lt;br /&gt;
&amp;lt;small&amp;gt;Who will provide them, and when?&amp;lt;/small&amp;gt;&lt;br /&gt;
* None&lt;br /&gt;
&lt;br /&gt;
== Status ==&lt;br /&gt;
* TODO: Buildlog...&lt;br /&gt;
&lt;br /&gt;
== Howto: Buildup ==&lt;br /&gt;
* TODO: Where to get the stuff from?&lt;br /&gt;
* TODO: How many volunteers are required?&lt;br /&gt;
* TODO: How much time is required?&lt;br /&gt;
* TODO: Provide instructions on how to set up the installation on the event site.&lt;br /&gt;
&lt;br /&gt;
== Howto: Teardown ==&lt;br /&gt;
* TODO: Throw/give away?&lt;br /&gt;
* TODO: How many volunteers are required?&lt;br /&gt;
* TODO: How much time is required?&lt;/div&gt;</summary>
		<author><name>Xesxen</name></author>
	</entry>
</feed>