<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.maceys.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lynn</id>
	<title>The Maceys in California - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.maceys.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lynn"/>
	<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Special:Contributions/Lynn"/>
	<updated>2026-08-21T08:47:40Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Videos_to_Categorize&amp;diff=1555</id>
		<title>Videos to Categorize</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Videos_to_Categorize&amp;diff=1555"/>
		<updated>2026-08-19T23:04:50Z</updated>

		<summary type="html">&lt;p&gt;Lynn: /* Comedy Reels */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Basically, collected mostly from Facebook&lt;br /&gt;
=Other=&lt;br /&gt;
*[https://www.facebook.com/reel/1896918070877276 Our Democracy is not Self-Executing - Barak Obama]&lt;br /&gt;
*[https://www.facebook.com/photo/?fbid=1259687589611873&amp;amp;set=a.236364978610811 MAGA lectures the Pope]&lt;br /&gt;
*[https://www.facebook.com/wyrmwoodgaming/reels/ Wyrmwood Desks]&lt;br /&gt;
*[https://www.facebook.com/photo/?fbid=10229664081457516&amp;amp;set=a.1293416106686 U.S. Army Spc. Jessica Kwiatkowski conducted her final walk at the Tomb of the Unknown Soldier]&lt;br /&gt;
*[https://www.facebook.com/reel/1604163537330925 Samsung Galaxy Gallery Trick]&lt;br /&gt;
*[https://www.facebook.com/reel/1289992093297656 Jeff_Kitchen Tips you&#039;ll use forever kitchen lifehacks]&lt;br /&gt;
*[https://www.facebook.com/reel/830600072651015 How to Make a Matchbox Rocket Launching Kit]&lt;br /&gt;
*[https://www.facebook.com/reel/1442913420840843 How to Make a Matchbox Rocket Launching Kit alternate]&lt;br /&gt;
*[https://www.facebook.com/reel/1417653976797687 Screw Holder]&lt;br /&gt;
*[https://www.facebook.com/reel/974657838895065 Working with Crows]&lt;br /&gt;
*[https://www.facebook.com/reel/1725454632208090 CostCo Secrets]&lt;br /&gt;
*[https://www.facebook.com/reel/26939107809077625 CostCo Codes]&lt;br /&gt;
*[https://www.facebook.com/reel/2196766471161615 More CostCo Secrets]&lt;br /&gt;
*[https://www.facebook.com/reel/1004576351959841 Crazy Bullying Story]&lt;br /&gt;
*[https://www.facebook.com/reel/2906445383040529 life hacks that taught me hacks fyp oddly satisfying]&lt;br /&gt;
*[https://www.facebook.com/reel/3755535118078227 Making a Helical Weave End-Grain Cutting Board]&lt;br /&gt;
*[https://www.facebook.com/reel/27617572864503408 Make money...sure]&lt;br /&gt;
*[https://www.facebook.com/reel/1944664502900842 Huge weather hit]&lt;br /&gt;
&lt;br /&gt;
=Animal Videos=&lt;br /&gt;
==Cat Videos==&lt;br /&gt;
*[https://www.facebook.com/reel/2343473489726404 Not Really My Mom]&lt;br /&gt;
*[https://www.facebook.com/reel/1607522897016035 Super Catio]&lt;br /&gt;
*[https://www.facebook.com/reel/1710838769931701 The Cat You Thought You Adopted VS Reality]&lt;br /&gt;
*[https://www.facebook.com/reel/1719096156091990 What if the best cat scratcher is already in your recycling bin?]&lt;br /&gt;
*[https://www.facebook.com/reel/4446758055646122 DIY String-Maze Foraging Box]&lt;br /&gt;
*[https://www.facebook.com/reel/1698098497990406 Making a DIY Cardboard Slide for My Cats Because Apparently Rent Isn’t Enough 😭]&lt;br /&gt;
*[https://www.facebook.com/reel/1557296675816427 I’ve had a long day, I ordered my favorite pizza, and I go to grab a soda for ONE SECOND... and this happens! 😤 look at his face! No regret, no shame]&lt;br /&gt;
*[https://www.facebook.com/reel/1335469508443074 Hours Later and My Cat Still Wants Another Ride 😂]&lt;br /&gt;
*[https://www.facebook.com/reel/1522751742771796 This Started with Cardboard… Now There’s an RC Truck Involved 😂]&lt;br /&gt;
*[https://www.facebook.com/reel/947946568117188 Zig zag, up-and-down garden run attached to an extra large catio that leads to a chimney that deposits the cats in a second-story catified room! 🙀 😻 🤯]&lt;br /&gt;
*[https://www.facebook.com/reel/3606014312884870 Every relationship has milestones]&lt;br /&gt;
*[https://www.facebook.com/reel/1543179097152114 peak cat happiness 😹📦💖]&lt;br /&gt;
*[https://www.facebook.com/reel/1059105029782896 Paws!]&lt;br /&gt;
*[https://www.facebook.com/reel/1593154222459375 Squirrel and Cats]&lt;br /&gt;
&lt;br /&gt;
==Dog Videos==&lt;br /&gt;
*[https://www.facebook.com/reel/971979118780786 Herding Job for Toby]&lt;br /&gt;
&lt;br /&gt;
==Other Animals==&lt;br /&gt;
*[https://www.facebook.com/reel/1482746810389943 Mule Rescue]&lt;br /&gt;
&lt;br /&gt;
=Knots=&lt;br /&gt;
*[https://www.facebook.com/reel/2355498784978802 Cuning Knot] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1611105850438712 Fishing Knots] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/3575007742677893 Weaver&#039;s Knot] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1508534257670334 Secure Knot, release in seconds] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1661314258259222 Casper Knot] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2066854954242878 Simple Quick Release Knot] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1311493904459973 Tent Knot] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1507765554252484 Swing Knot] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1288958553299389 Knot] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/987556430806466 Hang a garden pot] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/3500713510103328 Hook Knot] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1634412977596703 Knots] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2098417677402097 Secure a coil of rope] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1641290170627182 Magic Bag Knot] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2000925527133336 Several Knots] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1708828366942603 This Paracord Skill Toy Has a Wild Origin] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1369189481707800 Make a Double Globe Knot] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/905604825797315 Tips for Tying Knots in Bags] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2098417677402097 Secure a Coil of Rope] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Food Sites=&lt;br /&gt;
*[https://www.facebook.com/profile.php?id=61559353846364 Mrs. Brown&#039;s Kitchen]&lt;br /&gt;
*[https://www.facebook.com/BaileesCooking/reels/ Bailee&#039;s Kitchen]&lt;br /&gt;
*[https://www.facebook.com/DrewEats Drew Eats]&lt;br /&gt;
*[https://www.facebook.com/minoomakesstuff/reels/ Minoomakesstuff]&lt;br /&gt;
*[https://www.reddit.com/r/Old_Recipes/comments/1tv27pq/brownsville_baked_bean_suppers_50th_anniversary/?utm_source=share&amp;amp;utm_medium=web3x&amp;amp;utm_name=web3xcss&amp;amp;utm_term=1&amp;amp;utm_content=share_button Brownsville Baked Bean Suppers 50th Anniversary Cookbook]  has rhubarb custard and raisin cream pies&lt;br /&gt;
*[https://www.facebook.com/profile.php?id=61590202964496&amp;amp;sk=reels_tab Good Food]&lt;br /&gt;
*[https://www.facebook.com/ThatRecipeUS/reels/ That Recipe]&lt;br /&gt;
*[https://www.facebook.com/profile.php?id=61559716300100&amp;amp;sk=reels_tab Copycat Recipe Girl]&lt;br /&gt;
*[https://www.facebook.com/RecipePadUSA/reels/ Recipepad]&lt;br /&gt;
*[https://www.facebook.com/EatingWell/reels/ Eating Well]&lt;br /&gt;
*[https://www.facebook.com/profile.php?id=61563243821331&amp;amp;sk=reels_tab Timeless Kitchen]&lt;br /&gt;
*[https://www.facebook.com/allrecipes/reels/ AllRecipes]&lt;br /&gt;
*[https://www.facebook.com/profile.php?id=100090123292500&amp;amp;sk=reels_tab Homemade is Happiness]&lt;br /&gt;
*[https://www.facebook.com/grilloutnation/reels/ Grillnation]&lt;br /&gt;
*[https://grillnationbbq.com/?fbclid=IwY2xjawSehgVleHRuA2FlbQIxMABicmlkETFJcGhMZUcyeWpPU2Q5TGd0c3J0YwZhcHBfaWQQMjIyMDM5MTc4ODIwMDg5MgABHsLUkganMrSawpJ1vLLPuAMpfNiGBRQiw-e9Uve7_lXSkRt7N34QKshcSiFP_aem_o3dLkgKvCzeFL_tteU7k7A Grillnation Site and Recipes]&lt;br /&gt;
*[https://www.facebook.com/nellacucinatoronto/reels/ Nella Cucina]&lt;br /&gt;
&lt;br /&gt;
==Recipes and Prep==&lt;br /&gt;
&lt;br /&gt;
*[https://www.facebook.com/reel/1963049654330026 Single Piece of Fudge]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/939651802253382 Pizza Muffins]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/972652942343060 Uses Rhodes dough balls]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1500907595005624 Are You Looking For Easy One Pan Chicken Dinners]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/798531736175010 Cinnamon Mug Cake]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1313464051003089 Japanese Milk Bread Tangzhong Method]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/944659435286585 Crispy Tortilla Pizza Pockets]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2479197165928820 Making The World&#039;s Best $2 Sandwich]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/4267763946814184 COPYCAT Texas Roadhouse Rolls &amp;amp; Cinnamon Butter]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1463497038427173 Hot Dog Buns]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1293334599540360 No flour Easy Cheesy Garlic Bread]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1304125765210864 Egg and Cheese Breakfast Biscuits]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1313541620652314 Creamy Parmesan Beef Linguine with Garlic Butter Sauce]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2022862481601009 Mug Coffeecake]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/27462507376690531 Potato Rolls]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2118022202398761 National Clam Chowder Day]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/835494169153336 Best Potato Recipe]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2010854429745111 Soft Pretzels]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/988147087302148 Crispy Bacon Jalapeño Beef Tortilla Pinwheels]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/27009949785256503 Cook Mushrooms like a chef]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1398908595331143 Pizza with Potato crust]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2533078490482159 Butter Rolls]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1805002750478093 Penne Mac and Cheese]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/25803094596052947 Potato Rosti]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/853801057130573 Chocolate dessert. The trick for an incredible result]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/969269515874018 One chocolate chip cookie in one minute. This microwave recipe is perfect for those unexpected cravings or those  late night munchies]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1739808500369609 I Learned an Amazing Trick From a Friend in Italy That Everyone Should Know]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1336733791551589 4-Ingredient See’s Candies Peppermint Patties]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1315935960058548 15 Canned Biscuit Dough Hacks You Need to Try]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1636978374167768 COPYCAT Krispy Kreme Donuts]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/969773479244001 Crispy, buttery, cheesy, garlicky potatoes]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/974128358589150 Onion Ring Replacement]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/945777831426248 Upside down Hot Dog Puff Pastry]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/26644619958552833 Loaded Smash Potatoes]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/928848493269505 Sausage Stuffed Crust Breakfast Pizza 🍕🍳🙌]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2245652252842289 Sweet Potato Brownies 🍠 Fudgy &amp;amp; Healthy Dessert!]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1298941085720105 Brazilian Balla Baiana (Cocoanut Bon Bons)]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/981815101193988 Bacon Wrapped Burger Stuffed Onion Rings]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1935933047110324 Garbage Breakfast Bread]&lt;br /&gt;
*[https://www.facebook.com/reel/1967626287255381 Homemade ice cream - no machine]&lt;br /&gt;
*[https://www.facebook.com/reel/1014030807879575 Breakfast Sandwiches]&lt;br /&gt;
*[https://www.facebook.com/reel/1764067808337418 Sticky Sweet Chicken]&lt;br /&gt;
*[https://www.facebook.com/watch?v=1835800987828241 Make Your Own Sheet Pan Döner Gyro Looks really good]&lt;br /&gt;
*[https://www.facebook.com/reel/1789858525376832 Crispy Baked Accordion Potatoes with Smoky Chipotle Mayo]&lt;br /&gt;
*[https://www.facebook.com/reel/1017056087750849 Quick cinnamon dessert]&lt;br /&gt;
*[https://www.facebook.com/reel/4521568791502898 English Muffins]&lt;br /&gt;
&lt;br /&gt;
==IT Tips Sites==&lt;br /&gt;
&lt;br /&gt;
*[https://www.facebook.com/cubesitess/reels/ Cubesites]&lt;br /&gt;
&lt;br /&gt;
==IT tips Reels==&lt;br /&gt;
*[https://www.facebook.com/reel/1015655950919572 Monitor PC]&lt;br /&gt;
*[https://www.facebook.com/reel/1032250649230079 Updates Fix]&lt;br /&gt;
*[https://www.facebook.com/reel/1497571188517432 Remove Activate Windows Box]&lt;br /&gt;
*[https://www.facebook.com/reel/985964957648001 WiFi Icon Missing?]&lt;br /&gt;
*[https://www.facebook.com/reel/1028201322988625 Windows Resources]&lt;br /&gt;
*[https://www.facebook.com/reel/973692722316705 Interesting site]&lt;br /&gt;
*[https://www.facebook.com/reel/1332682748830883 Monitor info on the Taskbar]&lt;br /&gt;
*[https://www.facebook.com/reel/1008520668369344 Account review]&lt;br /&gt;
*[https://www.facebook.com/reel/1019424343878968 Slow? Scan RAM for Errors]&lt;br /&gt;
*[https://www.facebook.com/reel/2072488893329781 Par Cor Game]&lt;br /&gt;
*[https://www.facebook.com/reel/992566597019616 Shortcuts]&lt;br /&gt;
*[https://www.facebook.com/reel/945467198306984 Connecting to the internet in 1990]&lt;br /&gt;
&lt;br /&gt;
==Harry Potter==&lt;br /&gt;
*[https://www.facebook.com/reel/1444650217356254 A new era of Hogwarts begins. The HBO Original Series Trailer]&lt;br /&gt;
*[https://www.facebook.com/reel/4519025935085750 Harry Potter]&lt;br /&gt;
*[https://www.facebook.com/reel/3538806656267727 Hogwarts Sleepover]&lt;br /&gt;
*[https://www.facebook.com/reel/1515565740133809 Harry Potter Locations]&lt;br /&gt;
*[https://www.facebook.com/reel/2028926991025702 My Top 5 Harry Potter Film Locations]&lt;br /&gt;
*[https://www.facebook.com/reel/980160518119888 You, Me and Hogwarts]&lt;br /&gt;
*[https://www.facebook.com/reel/1515565740133809 Harry Potter Locations]&lt;br /&gt;
*[https://www.facebook.com/reel/2028926991025702 More Harry Potter Locations]&lt;br /&gt;
*[https://www.facebook.com/reel/1004427411921027 Philosopher&#039;s Stone Movie Magic]&lt;br /&gt;
*[https://www.facebook.com/reel/968029922606958 Harry Potter Airbnb (AR)]&lt;br /&gt;
*[https://www.facebook.com/reel/968189409259109 Harry Potter Village in Asheville NC]&lt;br /&gt;
&lt;br /&gt;
=Transportation Sites=&lt;br /&gt;
==Heavy Equipment==&lt;br /&gt;
*[https://www.youtube.com/watch?v=5F-uXBzIepA ZOOMLIONGlobalThe_World_s_Largest_4_000_ton_All_Terrain_Crane_in_the_GobiIn_the_vast_Gobi_Desert]&lt;br /&gt;
&lt;br /&gt;
==Trains==&lt;br /&gt;
*[https://www.facebook.com/reel/2337401243418335 Track Grinding]&lt;br /&gt;
===Union Pacific Big Boy 4014===&lt;br /&gt;
*[https://www.facebook.com/reel/27290534117207313 When Union Pacific announced it would return Big Boy No. 4014 to operational steam in 2019 the people who understood what that actually required said it couldn&#039;t be done at any reasonable cost or time]&lt;br /&gt;
*[https://www.facebook.com/reel/1760544665314279 Big Boy]&lt;br /&gt;
*[https://www.facebook.com/reel/1760544665314279 Big Boy Crossing Trestle]&lt;br /&gt;
*[https://www.facebook.com/reel/2088264025366132 Big Boy Painesville Ohio]&lt;br /&gt;
*[https://www.facebook.com/reel/1625957328512262 Big Boy Cleveland]&lt;br /&gt;
*[https://www.facebook.com/reel/1558806442422734 BIG BOY crossing the Fairview Trestle over Walnut Creek]&lt;br /&gt;
*[https://www.facebook.com/reel/1778707223118451 Big Boy Millcreek PA]&lt;br /&gt;
*[https://www.facebook.com/100001109935735/videos/4345001619047406/ Big Boy Westfield]&lt;br /&gt;
*[https://www.facebook.com/100002041048680/videos/1249986340368198/ Big Boy]&lt;br /&gt;
*[https://www.facebook.com/reel/1024035103491398 Big Boy Cab]&lt;br /&gt;
*[https://www.facebook.com/reel/1360156652540522 Ride on Big Boy 4014]&lt;br /&gt;
*[https://www.facebook.com/reel/26734334802929667 Big Boy is on the Move]&lt;br /&gt;
*[https://www.facebook.com/100000450798879/videos/1870954746930988/ Union Pacific 4014, stopped to visit with the traction engines]&lt;br /&gt;
*[https://www.facebook.com/100000636408456/videos/1002915548878590/ Big Boy Passing By]&lt;br /&gt;
*[https://www.facebook.com/reel/709324115608238 Big Boy Up Close]&lt;br /&gt;
*[https://www.facebook.com/100064307762144/videos/3296139737234259/ Big Boy at Belle Plain Iowa]&lt;br /&gt;
*[https://www.facebook.com/100011998517397/videos/1432347795324858/ Big Boy at Hobart Indiana]&lt;br /&gt;
*[https://www.facebook.com/1456953393/videos/2980929175571574/ Big Boy somewhere in Ohio]&lt;br /&gt;
&lt;br /&gt;
===More Steam===&lt;br /&gt;
*[https://www.facebook.com/melissa.masongrifo/videos/1014599468183012 Steam locomotive 2102]&lt;br /&gt;
*[https://www.facebook.com/reel/1671361400894330 Steam Locomotive 2102 pulling into the Jim Thorpe Station before the southbound return trip to Reading Outer Station]&lt;br /&gt;
*[https://www.facebook.com/reel/37156349300616898 Booster Engaged! Reading &amp;amp; Northern 2102 Steam Loco Accelerates Heavy Frac Sand Train]&lt;br /&gt;
*[https://www.facebook.com/100025938404192/videos/867590319141138/ Number 478 Listen for Side-rod Clank]&lt;br /&gt;
*[https://www.facebook.com/reel/1495352998907169 One of the Last Baldwin Locomotives Still Operational]&lt;br /&gt;
&lt;br /&gt;
==Planes==&lt;br /&gt;
*[https://www.facebook.com/reel/973564808388570 How Aircraft Carrier Crews Use Hand Signals for Preflight and Launch Success]&lt;br /&gt;
*[https://www.facebook.com/reel/1647499243048778 Large F-14 RC Tomcat]&lt;br /&gt;
*[https://www.facebook.com/reel/1287496379625636 Large 777 and A380 RC planes]&lt;br /&gt;
*[https://www.facebook.com/reel/1560040242485105 Giant RC A-380]&lt;br /&gt;
*[https://www.facebook.com/reel/1345001947028459 Just How Big is an Airbus A-380?]&lt;br /&gt;
*[https://www.facebook.com/reel/4275604406040409 U-2 Taxiing]&lt;br /&gt;
*[https://www.facebook.com/reel/1354088116686957 B-52 Flyover]&lt;br /&gt;
*[https://www.facebook.com/reel/990352023749240 RC Plane Crashes...Expensive]&lt;br /&gt;
*[https://www.facebook.com/reel/1676149426953416 B-1B, B-2 and B-52 4th of July flyover]&lt;br /&gt;
*[https://www.facebook.com/reel/2129508487625072 KC-135 taxi]&lt;br /&gt;
*[https://www.facebook.com/reel/1011185971800950 777 Taxi]&lt;br /&gt;
*[https://www.facebook.com/reel/1538867971206779 Ok, wing suits]&lt;br /&gt;
*[https://www.facebook.com/reel/948228918262936 747 leaving SFO]&lt;br /&gt;
*https://www.facebook.com/reel/2109118063355788 Fie bombers refilling]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Blue Angels===&lt;br /&gt;
*[https://www.facebook.com/reel/3547951735476732 Ride With Right Wing and Slot Pilots]&lt;br /&gt;
&lt;br /&gt;
===Aviation Sites===&lt;br /&gt;
*[https://www.facebook.com/FlyWithKay.Official/reels/ Flying With Kay]&lt;br /&gt;
*[https://www.facebook.com/justplanes/reels/ Just Planes]&lt;br /&gt;
&lt;br /&gt;
===Other Aviation Reels===&lt;br /&gt;
*[https://www.facebook.com/reel/1409349337907602 New AirForce One] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1640815873811278 What you&#039;re watching isn&#039;t routine maintenance it&#039;s one of the most delicate specialized processes undertaken in aircraft sustainment. A center wing box is a piece of primary structure weighing several tons] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1016338593655245 Join me for MY FIRST TIME FLYING THE SENECA into South Padre Island] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/936250662573815 Unique Moment! USAFA Cadet Flies in an F-16 Fighter Jet] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1421718035842761 Female F-35 Pilot preflight and takeoff] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1606427310656306 Wild Encounter with a Blackbird] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1801300597497548 F-22 Raptor Vectored Thrust Demo] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2057885544794819 Druk Air ATR42 600 Challenging Landing at Paro Bhutan Airport] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2225136288314658 Inside a StratoTanker] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2804188763248541 Midair Refueling] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1219164193441567 U.S. Navy MQ-25A Stingray Autonomous Refueler First Flight] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/4294399417467936 Personal jets]&lt;br /&gt;
*[https://www.facebook.com/reel/2162021424357497 A350-1000 ULR]&lt;br /&gt;
*[https://www.facebook.com/reel/2072758196987322 Tomcat comes apart after flyby]&lt;br /&gt;
*[https://www.facebook.com/reel/1899009390783998 Big vs little]&lt;br /&gt;
*[https://www.facebook.com/reel/1597650908613049 SpaceX Launch]&lt;br /&gt;
&lt;br /&gt;
===Paper Airplanes===&lt;br /&gt;
*[https://www.facebook.com/reel/2214505002649094 Super Paper Airplane]&lt;br /&gt;
*[https://www.facebook.com/reel/1613669376379784 Viral Paper Butterfly]&lt;br /&gt;
*[https://www.facebook.com/reel/2207924496647981 Paper Boomerang]&lt;br /&gt;
&lt;br /&gt;
===Automobiles===&lt;br /&gt;
*[https://www.facebook.com/reel/1591851485453133 LOWEST Mileage 1982 Corvette In The WORLD!]&lt;br /&gt;
*[https://www.facebook.com/reel/643583548095303 Cleaning]&lt;br /&gt;
*[https://www.facebook.com/photo/?fbid=555372264129323&amp;amp;set=pcb.555374104129139 We found what might be the LOWEST Mileage C3 Corvettes in the world! 1599, 293 and 33 Original Miles!]&lt;br /&gt;
*[https://www.facebook.com/reel/1196779302512183 $300,000 Ferrari 512bb Found ABANDONED In Garage For 28 YEARS!]&lt;br /&gt;
&lt;br /&gt;
===Ships and Boats===&lt;br /&gt;
*[https://www.facebook.com/reel/1610561366843684 Only actual footage of the Titanic that Exists]&lt;br /&gt;
*[https://www.facebook.com/100006582853884/videos/1011064364907875/ BAP Union from Peru]&lt;br /&gt;
*[https://www.facebook.com/reel/1738067627554290 Indonesian Long Boat Racing]&lt;br /&gt;
*[https://www.facebook.com/reel/1474105041132760 Indonesian Long Boat Racing]&lt;br /&gt;
*[https://www.facebook.com/reel/4898868423716813 Indonesian Long Boat Racing]&lt;br /&gt;
*[https://www.facebook.com/reel/926044463544920 Indonesian Long Boat Racing]&lt;br /&gt;
*[https://www.facebook.com/reel/1245949331046335 Indonesian Long Boat Racing]&lt;br /&gt;
*[https://www.facebook.com/reel/842239112287655 Indonesian Long Boat Racing]&lt;br /&gt;
*[https://www.facebook.com/reel/26778416215101021 Retired Submarines]&lt;br /&gt;
*[https://www.facebook.com/reel/1504700067936923 Training with long racing boats they usually_do this every afternoon before national events are held]&lt;br /&gt;
*[https://www.facebook.com/reel/1264306795407494 Major Naval Station]&lt;br /&gt;
&lt;br /&gt;
=Travel=&lt;br /&gt;
*[https://www.facebook.com/reel/1293402099630028 Travel Coat Suggestion for Steph]&lt;br /&gt;
*[https://www.facebook.com/reel/1309961543797978 Charlemagne stripped marble from Rome and Ravenna and shipped it north. He was building an argument.]&lt;br /&gt;
&lt;br /&gt;
==Barcelona==&lt;br /&gt;
*[https://www.facebook.com/reel/2012396462969957 Inauguration of the Jesus Christ Tower of the Basilica de la Sagrada Familia]&lt;br /&gt;
&lt;br /&gt;
==Rome==&lt;br /&gt;
*[https://www.facebook.com/photo/?fbid=574459758015772&amp;amp;set=a.353249733470110 Parthenon]&lt;br /&gt;
&lt;br /&gt;
==Gardening==&lt;br /&gt;
*[https://www.facebook.com/reel/877416251435635 8 Easy Creative Backyard Garden Ideas to Add to Your Garden To-Do List]&lt;br /&gt;
*[https://www.facebook.com/reel/1213396917444236 Planting Carrots]&lt;br /&gt;
&lt;br /&gt;
*https://www.facebook.com/reel/1498239161719947 Backyard Tomato Tower]&lt;br /&gt;
*[https://www.facebook.com/reel/1025744923223163 This hanging gutter trick fills small spaces with strawberries]&lt;br /&gt;
*[https://www.facebook.com/reel/1927458921233364 Properly Pruning Tomatoes Is Important]&lt;br /&gt;
*[https://www.facebook.com/reel/1380097593880057 2-in-1 Organic Strawberry &amp;amp; Tomato DIY Bucket Planter | Backyard Garden]&lt;br /&gt;
*[https://www.facebook.com/reel/1303228531737342 The Secret to Powerful Strawberry Growth and Heavy Harvests]&lt;br /&gt;
&lt;br /&gt;
=Miscellaneous Reel Sites=&lt;br /&gt;
*[https://www.facebook.com/profile.php?id=100063678665391&amp;amp;sk=reels_tab Organist] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/SRELECTRICA/reels/ SR Electric] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/Hesswoodworks/reels/ Hess Woodwork LLC] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/profile.php?id=61577068870824&amp;amp;sk=reels_tab RC Flight Zone] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/LordofMapsInc/reels/ Lord of Maps] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/morleykert/reels/ Morley Kert] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/davidalanarnold/reels/ David Alan Arnold] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/profile.php?id=100063678665391&amp;amp;sk=reels_tab Anna Lapwood, Organist] &amp;lt;br&amp;gt;&lt;br /&gt;
==Miscellaneous Reels==&lt;br /&gt;
*[https://www.facebook.com/reel/1012591654862280Build Your Own Water Level Indicator Overflow Alarm at Home] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1032694336373643 Star Wars Walker] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1674537880943612 Ski Aerials] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/profile.php?id=61559103970489&amp;amp;sk=reels_tab CuriousCorner] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/profile.php?id=61552901555442&amp;amp;sk=reels_tab ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/4417642935117016 Employing Crows] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/profile.php?id=61552901555442&amp;amp;sk=reels_tab B&amp;amp;R Homestead] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/profile.php?id=61584190130401&amp;amp;sk=reels_tab Legacy of World War 2] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Build/Remodel ==&lt;br /&gt;
*[https://www.facebook.com/reel/1262123016003193/?s=single_unit Secret room for Dsaughter&#039;s Birthday] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1577662106450496 Secret room for Daughter construction details] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/4239155879670911 We bought a Piece of Forest and secretly built an entire Underground Survival Bunker under Our Dream Home - Possibly AI] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2065492644324772 Bought House to Create Library] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/linnea.and.akela/reels/ Linnea &amp;amp; Akela Living off Grid]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Historic Restorations==&lt;br /&gt;
*[https://www.facebook.com/jordankamelleri/reels/ Italian Palace Restoration] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Historic Restoration Reels==&lt;br /&gt;
*[https://www.facebook.com/profile.php?id=61575333601830&amp;amp;sk=reels_tab Mansion on Waverly Hill, PA] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1709586337131235 Restoration of an Italian Palace] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/profile.php?id=61579514274963&amp;amp;sk=reels_tab Tia Weston House Restoration] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/schoolhousehomestead School house Homestead] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/profile.php?id=100089164452114&amp;amp;sk=reels_tab Yoga with Katherine] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Music and Dance=&lt;br /&gt;
*[https://www.facebook.com/reel/4195339634050317 Oh Mighty Sea - Raven Astrid]&lt;br /&gt;
*[https://www.facebook.com/reel/875601998914741 Valhalla’s Daughters - Raven Astrid]&lt;br /&gt;
*[https://www.facebook.com/reel/1523128729521191 Valhalla’s Daughters - Raven Astrid Studio]&lt;br /&gt;
*[https://www.facebook.com/reel/1487882282792798 Odin&#039;s Daughter -Raven Astrid]&lt;br /&gt;
*[https://www.facebook.com/reel/1686821589064239 Raven Astrid]&lt;br /&gt;
*[https://www.facebook.com/reel/1498483011991670 Falkirk Schools Pipe Band at the Edinburgh Tartan Parade!]&lt;br /&gt;
*[https://www.facebook.com/reel/589246857515478 Yanks Have Arrived and Looking Good]&lt;br /&gt;
*[https://www.facebook.com/reel/508256555612357 Trooping the Color Rehearsal]&lt;br /&gt;
*[https://www.facebook.com/reel/1001899535634220 The King’s Troop Royal Horse Artillery]&lt;br /&gt;
*[https://www.facebook.com/reel/1422354393240066 Hundreds of King&#039;s Guards March Back to Barracks]&lt;br /&gt;
*[https://www.facebook.com/reel/4430203767236138 The King&#039;s Company Grenadier Guards marching to the tune The British Grenadiers]&lt;br /&gt;
*[https://www.facebook.com/reel/1953025158909849 Cool pipe organ]&lt;br /&gt;
*[https://www.facebook.com/reel/27364135479923347 Bagpipe marching band]&lt;br /&gt;
&lt;br /&gt;
==Dance Tutorial==&lt;br /&gt;
*[https://www.facebook.com/reel/848758068215049 Air Walk Tutorial]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/3082164571983100 Moonwalk Tutorial]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/929015420110643 Dance Move]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1289295416163205 Polly Pocket Tutorial]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/978596075077016 Shuffle Dance for Seniors]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Comedy Reel Sites==&lt;br /&gt;
*[https://www.facebook.com/mikeandjoelleofficial Mike and Joelle - She reacts to his jokes]&lt;br /&gt;
&lt;br /&gt;
==Comedy Reels==&lt;br /&gt;
*[https://www.facebook.com/reel/1465682591521449 Not Eating that]&lt;br /&gt;
*[https://www.facebook.com/mikeandjoelleofficial A Cowboy and a Yuppy - M&amp;amp;J]&lt;br /&gt;
*[https://www.facebook.com/reel/2242704323213636 The Heavenly Hotel Mix Up a Mistaken Email Story - M&amp;amp;J]&lt;br /&gt;
*[https://www.facebook.com/reel/1529343371438063 THE HUSBAND STORE: A Hilarious Story of a Woman Trying to Find the Perfect Man]&lt;br /&gt;
*[https://www.facebook.com/reel/2217075649058666 That Punchline Came Outta Nowhere This joke has a bit of a strange set up but if you hang in there you will be rewarded]&lt;br /&gt;
*[https://www.facebook.com/reel/1001293239105756 Series of Jokes J&amp;amp;M]&lt;br /&gt;
*[https://www.facebook.com/reel/4441700866102656 Naughty Nun Sins J&amp;amp;M]&lt;br /&gt;
*[https://www.facebook.com/reel/1469055008612415 Politician Gets a Taste of His Own Medicine M&amp;amp;J]&lt;br /&gt;
*[https://www.facebook.com/reel/2024202664893515 Genius or too Far? M&amp;amp;J]&lt;br /&gt;
*[https://www.facebook.com/reel/4444002802495383 IRS Agent Gets Delt To M&amp;amp;J]&lt;br /&gt;
*[https://www.facebook.com/reel/4315155708739422 All the bears in the forest]&lt;br /&gt;
*[https://www.facebook.com/reel/4017559155203107 A Hot Nurse, A Crash… and One Angry Wife M&amp;amp;J]&lt;br /&gt;
*[https://www.facebook.com/reel/1174319417846672 An Elderly Couple&#039;s Steamy Reunion]&lt;br /&gt;
*[https://www.facebook.com/reel/1672291780692362 Winning the Lottery M&amp;amp;J]&lt;br /&gt;
*[https://www.facebook.com/reel/931829559719777 Don&#039;t Mess with Old People M&amp;amp;J]&lt;br /&gt;
*[https://www.facebook.com/reel/2633395307063098 Men who are ungrateful bastards should remember that Faries are female M&amp;amp;J]&lt;br /&gt;
*[https://www.facebook.com/reel/1480355517200308 Magic Frog M&amp;amp;J]&lt;br /&gt;
*[https://www.facebook.com/reel/1020444533973281 Flintstone joke]&lt;br /&gt;
*[https://www.facebook.com/reel/2009953397063720 Not actually comedy]&lt;br /&gt;
*[https://www.facebook.com/reel/689657843448404 Grammarian]&lt;br /&gt;
*[https://www.facebook.com/reel/1581509807034871 Triplets Tim Tom and Tat M&amp;amp;J]&lt;br /&gt;
*[https://www.facebook.com/reel/1529025918743887 Loved two girls at a Time M&amp;amp;J]&lt;br /&gt;
*[https://www.facebook.com/reel/1530433415503320 The longer you&#039;re married something&#039;s going to break M&amp;amp;J]&lt;br /&gt;
*[https://www.facebook.com/reel/1916979245521146 Bear, Rabbit 3 wishes M&amp;amp;J]&lt;br /&gt;
*[https://www.facebook.com/reel/1079087744549167 Fred and Mary M&amp;amp;J]&lt;br /&gt;
*[https://www.facebook.com/reel/1720685852465372 Lot of woman M&amp;amp;J]&lt;br /&gt;
*[https://www.facebook.com/reel/4462983230655816 They had eggs M&amp;amp;J]&lt;br /&gt;
*[https://www.facebook.com/reel/1551467769777241 Nothing to wear M&amp;amp;J]&lt;br /&gt;
&lt;br /&gt;
==Exercises for Seniors==&lt;br /&gt;
*[https://www.facebook.com/reel/1473578000363798 Low impact leg exercises]&lt;br /&gt;
*[https://www.facebook.com/reel/1630596041524516 Releasing Tension Shoulder and Lower Back]&lt;br /&gt;
*[https://www.facebook.com/reel/904737742600625 Kashifa 98 Step Complete]&lt;br /&gt;
*[https://www.facebook.com/reel/1507918704283696 Kashifa 94 Step Complete]&lt;br /&gt;
*[https://www.facebook.com/reel/847781608388421 Increase Mobility]&lt;br /&gt;
*[https://www.facebook.com/reel/931379053157159 Pilipino Martial Arts Double Sticks Spin]&lt;br /&gt;
&lt;br /&gt;
==Wellerman Song==&lt;br /&gt;
*[https://www.facebook.com/reel/2033418913950581 Nathan Evans]&lt;br /&gt;
*[https://www.youtube.com/watch?v=bNQSMTNSnUw Nathan Evans Original]&lt;br /&gt;
*[https://www.facebook.com/reel/616313924540571 Apex Predator Wolf]&lt;br /&gt;
*[https://www.facebook.com/reel/949528061328723 Navy?]&lt;br /&gt;
*[https://www.youtube.com/watch?v=90Oc9Xl5Aps The Wellerman]&lt;br /&gt;
*[https://www.facebook.com/reel/1863349521035643 The Sea Shanty]&lt;br /&gt;
*[https://www.facebook.com/reel/1332687732166252 Luminous Dreams Studio]&lt;br /&gt;
*[https://www.facebook.com/reel/1612600066508548 Jodok Cello]&lt;br /&gt;
*[https://www.facebook.com/reel/990418606824129 Raven Astrid]&lt;br /&gt;
*[https://www.facebook.com/reel/4420174908240336 Home Free]&lt;br /&gt;
*[https://www.facebook.com/reel/2480521425716593 Cat Dance Version]&lt;br /&gt;
*[https://www.facebook.com/reel/1004911148823311 There once was a pup and the pup was me and hopped in a boat and he sailed the sea]&lt;br /&gt;
*[https://www.facebook.com/reel/3991814481124801 Wellerman + Pirate of the Caribbean]&lt;br /&gt;
*[https://www.facebook.com/reel/2436476440112436 Wellerman on a pipe organ]&lt;br /&gt;
&lt;br /&gt;
=Working=&lt;br /&gt;
&lt;br /&gt;
*[https://www.facebook.com/reel/671515962019305 Mrs. Browns Kitchen Mac and Cheese ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1675457710267227 Legacy Paper Airplane] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/955266227439972 Baklava - make this homemade dessert in a fraction of the time with this deliciously easy method!] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1286415476987534 Building core strength creates longevity for senior] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/843224918373744 3 ingredient Sprite Biscuits are easy and delicious.] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1410810270872831 A cat by day, an invisibility master by night] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1319060870193378 24g protein snack pack with no shitty ingredients and is actually gut healthy] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1323909839699514 The Best Cinnamon Buns Ever] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/3943507975950488 Indonesian Boat Racing] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2172929233495608 The largest operating steam locomotive No. 4014 rolling out of Argos on its way to Philadelphia for the 4th of July celebration.] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1335557168071333 I don’t always cook 4 NY Strips, but when I do……] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2130766101074604 Cat Wall] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1489701875946936 Indonesian Boat Races] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/953242747455948 HOMEMADE FRENCH BUTTER] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1320824103516991 Linnea &amp;amp; Akela - Prep for Foundation] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/156648148130409 Linnea &amp;amp; Akela - Building House] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1221796732313335 Linnea &amp;amp; Akela - Pottery] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1040814381806937 Smoked BBQ Saltines]&lt;br /&gt;
*[https://www.facebook.com/reel/1354545919861089 Cooking hacks]&lt;br /&gt;
*[https://www.facebook.com/reel/1046043834525342 Crunch Wrap]&lt;br /&gt;
*[https://www.facebook.com/reel/2109392699993504 Crispy Onion Rings]&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1140736513653494 Linnea &amp;amp; Akela - Throwing Red Wild Clay nice] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/429352786540497 Linnea &amp;amp; Akela - Cooking] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1529944442075498 Texas Roadhouse Cinnamon Honey Butter] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/989123237039283 Insane tactical descent on a C-17 Globemaste] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1453734559543794 Nobody kicks ass without tanker gas!] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/profile.php?id=61574169873455&amp;amp;sk=reels_tab Food Parables]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/mwelab/reels/ MWE LAB]&amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1523554699305813 Fast Rope Tying Solution] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/944253801996667 Texas Roadhouse Style Rolls] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1492656702354389 Crazy Travego RV] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1270625914626049 The BEST way to UNLOCK your hips💪❤️] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1704258010617525 This spaghetti bake is my favorite dinner OF ALL TIME!!] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1728076438543055 Easy Way to Adjust Rope Tension] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1495125074864494 Not Available] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1472780141246505 Bala baiana!] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1690989845563511 Knot rope tip diy idea for you 💡 Easy knot for outdoor life] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/973951265812444  Microwave Mayo Eggs] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/973670192319707 Tricky Question M&amp;amp;J] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1266520592295360 GENIUS HEALTHY LAVA CAKE DESSERT] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2814693425567203  Beginner rope tying hack ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1292979828998405 Fried Mozzarella Balls] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1005223542478497 8 Cat Secrets That Will Blow Your Mind] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/951577590835351 Potato cheese sticks] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/991362790486295 Thick chocolate chip cookies 🍪] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/1015893467/videos/1263916912487501/ Drinking Water in Space] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1881577195864965 Inflatable Oreo’s is crazy work] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/975753868166498 Flexible stone material. For J&amp;amp;A] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/996908249694759 Luxury Pull-Out Basket] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/882740590856834 Fiber Optic Touch Sensitive Table - Wait Until This Comes to Life] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/962734489574182 Fiber Optic Wall Panels - Wait Until the Lights Turn On -New idea for the pool room] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1627197374964553 Cat Burglar Who can relate? 😂] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1293402099630028 Now you can avoid those ridiculous bag fees and pack what you want!🥳✈️ Travel for Steph] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1572472231047892 Big Boy at Beaver Iowa] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1009353108708911 The mighty Antonov AN-225 RC model begins its takeoff roll. Pure aviation greatness!] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1518149966346880 Magenta City Glide Hyperbike Likely AI] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1886506035368226 Indonesian Boat Races - You could almost water ski] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2076953626528539 Water Glide Superbike Likely AI] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/990984793659314 How big is the C-5 Galaxy?] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/984923597513308 Big Boy Rural America] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1730065128440651 Shay, Heisler, and Climax all moving together at Cass Scenic Railroad] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2944263709101255 Hawaiian roll garlic bread] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/889934707440343 Easy paper 3 blade boomerang 🪃] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1327282216014426 Hockey Stick Handling] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/4417642935117016 Crows Fight Off Hawks] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2144804796254254 What can you make with a scrap piece of 2x6?] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/880950521693753 Here’s the video of that Big Boy drone incident in Malta on 6/2/26. The drone actually ended up striking a woman who was standing by the crossing gate] &amp;lt;br&amp;gt;&lt;br /&gt;
Shop DIY Watch Club | Watchmaking Kit and Resources – DIYWATCH Club&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1001975135920206 How to make a paper glider 😍 | easy circular paper gliding airplane] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1338597888468243 Commissioned in 1915, HMS Barham was part of the Queen Elizabeth-class of battleships. Sunk 11/25/1941.] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1578861933666251 America spent $4T on the Middle East, here is what China spent $4T on] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2411709826001038 Rest in Peace Spirit Airlines] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1683222619383138 The Big Boy is not only huge but also intricate and complex] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/928848493269505 Sausage Stuffed Crust Breakfast Pizza 🍕🍳🙌] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2245652252842289 Sweet Potato Brownies 🍠 Fudgy &amp;amp; Healthy Dessert!] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/918496574570286 Bacon Egg n Cheese Tortilla Muffins] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1808176733901022 Crab stuffed onions rings are a must try] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1366815478838409 Homemade Chocolate Bar] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2134106700701112 Best Cheesy Smashed Potatoes] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1739401137493500 Sweet Potato Chocolate Ice Cream 🍠🍫🍦] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1386825736534028 Potato waffles make me so happy] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1635082471021279 160,000 doctors won&#039;t tell you this chocolate mousse secret.] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1217295157281191 Sliders, I make these every weekend] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1668123417777057 Did you know cottage cheese and bananas make the most incredible banana bread? 🍌] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1179968737494591 One Pan Chicken Bacon Cheddar Pasta] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/share/p/1CPwKaQ2SZ/?mibextid=wwXIfr Recipe for One Pan Chicken Bacon Cheddar Pasta]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*[https://www.facebook.com/reel/27718637004390428 Chuck Roast Burnt Ends] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1307059891524949 Shotgun shells!] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/26644619958552833 Loaded Smash Potatoes] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1353633956610783 Sausage egg and cheese breakfast sandwich hack] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1286914766655485 Soft Fluffy Apple Bread] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1501886931275797 Scrambled Egg Technique] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/880966151658636 The easiest and most delicious appetizer, in just 15 minutes] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1453110326137765 This healthy blueberry ice cream is ridiculously easy 🍌🫐] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*[https://www.facebook.com/reel/2023839865193885 Potato yogurt protein buns made with mashed boiled potato, eggs,] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/926804643738494 Bacon egg n cheese rice paper spiral] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1261090299341618 Did you know you can make smooth creamy homemade ice cream with just a few simple ingredients? 🍦❄️] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1244865681131117 Warm peanut butter oat mug cake made in minutes 🥜🍰] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1606173423824491 Stop overpaying—your perfect steak rub takes 2 minutes and hits harder than any store-bought blend. 🥩🔥] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/948390444410278 Onion Egg and Cheese Mini Cakes] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/4293535367563084 Ear wax plan ] &amp;lt;br&amp;gt;&lt;br /&gt;
Stability *[https://www.facebook.com/reel/1910295873006527 For Seniors who have difficulty stepping or swinging over their legs] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/4350899085168334 The feet and ankles are the foundation for stability] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1983471005582500 This is not AI, just my own fingers trying to coordinate with my brain] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/983704354357399 Don’t ignore your toes, their impairments will bring disastrous effects to functionality of every joint above them] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2003349083600506 Wellerman Plank Dance Challenge] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1560076689024194 Wellerman Plank Dance Challenge 2] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1523890485798178 When you have difficulty standing, exercise with ankle weights.] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/911352991689949 What can seniors do to ease body stiffness?] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/990289863466600 Don’t wonder why my video is repeating because until now you still haven’t workout (Wellerman)] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1306056388169394 How to maintain the functionality of fingers for fine motor skills] &amp;lt;br&amp;gt;&lt;br /&gt;
Music source &lt;br /&gt;
*[https://www.facebook.com/reel/1543560480451239 Wellerman song Strong Bass] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2220438922057693 Wellerman Performed by Bobby Bass and Big Bev] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1494318185643892 Immigrant Song (Led Zeppelin) ⚔️🏔️⚔️🏔️ Harp Twins + Volfgang Twins] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.youtube.com/watch?v=2T1lkUKyHLk Full Music Video] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1533772561603236 Wellerman Big Bev and Malinda] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1329511529238519 Kristen Taczko Electric Harp] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1963620494275307 Blue Man Group] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/916885514640060 Drunken Sailor | Sea Shant] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1473884807519888 SOUND OF SILENCE - STAIRWELL SINGING] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2458977161271304 Blue Man Group Orlando Gets it] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/931228406461696 Wellerman - Wanna learn to sing bass? Join Bass Singer Academy] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1633942754500591 Heroes in Valhalla&#039;s Hall] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2049276978985610 Anna Lapwood Finding the Sound on the Largest Organ in the World] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/958082753758409 Wellerman Plank Dance - Firemen] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1442679320872901 Wellerman on Piano] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/798325236478207 Wellerman with Music (broken?)] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/870502996010228 Step Dancing] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/956032807165140 Moonwalking at the beach ❤️👟] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1770936780953313 Learn Wellerman on Piano] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/26977380665230501 Skin Tags] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/4313326828930863 Fat Albert] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1448075293729095 F-35 Before every pilot walks to her own aircraft, we gather as one team focused, disciplined, and mission ready.] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/961826323143729 A-10 Warthog Safely Returns to Base After Being Hit by Surface-to-Air Missile] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1293881695711173 USS San Francisco (SSN-711) Suffers Devastating Bow Damage] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1418164563373182 This is absolutely insane! Imagine looking up at the sky and seeing a military pilot literally standing on top of a hovering jet fighter! 😱✈️] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/3610851522386645 F-22 suddenly roars across the sky, creating a thunder-like boom as it pushes past the sound barrier.] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2731003990598252 Falcon 9 incoming] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1545133403906078 DIY Organic Strawberry Setup with PVC Pipes &amp;amp; Automatic Watering System] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1467799144667164 Goose Landing 10/10] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1974875369900483  Massive aircraft carrier propeller was transported through Virginia Beach] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/26644619958552833 Loaded Smash Potatoes] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1733775080977343 AIR FORCE ONE: The President is escorted by the U.S. Military&#039;s most advanced fighter aircraft, including F-15E Strike Eagles and B-21 Raiders] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/968370975952911 SPOTTED: SR-72 DARKSTAR] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/3427228064108308 Another look at Saturday&#039;s booster return from the CRS NG-24 mission] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/979645768385477 Surreal view of an F-35B takeoff on an aircraft carrier] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/12955246024430160 Not Available Now] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1314871240736322 Amazing Moments of the U.S. Blue Angels] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1814208049249612 POV: You take off with the Blue Angels 👀] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1309654081044867 Thunderbirds - The best view in the house] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1645745299992898 Starship Flight 12 Captured with the new #GoProMission1 Pro] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1533695925113936 Falcon 9 booster lands on drone ship] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2180491862355305 Roman Telescope launches to space as early as September] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/27608509645401728 Thunderbirds - Happy Memorial Day US] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
==Cat stuff==&lt;br /&gt;
===Reel sites===&lt;br /&gt;
*[https://www.facebook.com/profile.php?id=61583219702027&amp;amp;sk=reels_tab House of Claws and Paws]&lt;br /&gt;
*[https://www.facebook.com/reel/1719096156091990 What if the best cat scratcher is already in your recycling bin?] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/4446758055646122 DIY String-Maze Foraging Box] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1698098497990406 Making a DIY Cardboard Slide for My Cats Because Apparently Rent Isn’t Enough 😭] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1557296675816427 I’ve had a long day, I ordered my favorite pizza, and I go to grab a soda for ONE SECOND... and this happens! 😤 look at his face! No regret, no shame] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1335469508443074 Hours Later and My Cat Still Wants Another Ride 😂] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1522751742771796 This Started with Cardboard… Now There’s an RC Truck Involved 😂] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/947946568117188 Zig zag, up-and-down garden run attached to an extra large catio that leads to a chimney that deposits the cats in a second-story catified room! 🙀 😻 🤯] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/3606014312884870 Every relationship has milestones - Catio] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1543179097152114 peak cat happiness 😹📦💖] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1875750946425511 Things I do for my human that she doesn&#039;t even realize]&lt;br /&gt;
*[https://www.facebook.com/reel/1480464783854289 Failed weekly review]&lt;br /&gt;
&lt;br /&gt;
==Dog Stuff==&lt;br /&gt;
*[https://www.facebook.com/reel/971979118780786 Dolly yarding 1,000 twin girls ready for pre lambing] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Garden==&lt;br /&gt;
*[https://www.facebook.com/reel/1498239161719947 Backyard Tomato Tower Build From Pots to Massive Harvest] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1025744923223163 This hanging gutter trick fills small spaces with strawberries] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1927458921233364 Tomatoes Need Constant Pruning] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1380097593880057 2-in-1 Organic Strawberry &amp;amp; Tomato DIY Bucket Planter] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1303228531737342 The Secret to Powerful Strawberry Growth and Heavy Harvests] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1309961543797978  Aachen Cathedral, Aachen, Germany] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1032694336373643 Starwars Walker] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/26644619958552833 Loaded Smash Potatoes] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1674537880943612 National border train 🚂Skiing] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/26778416215101021 Submarine Boneyard] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1482746810389943 Mule Rescue] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2072331206833338 Shuffle Tutorial] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*[https://www.facebook.com/reel/1708428160338278 Basic Plank Dance] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1784916782209251 If you want to Plank Dance Do This First] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2138893803572349 Wellerman / 🎹 💣🔥 Learn Piano From Scratch ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/975614778726985 Preparing Your Arms&#039; Strength (Wellerman)] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/993204880278194 How big is the C-5 Galaxy?] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2093420531516981 How to unlock the knuckles for stronger and functional hands] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1265575752409914 New Pushup Challenge (Wellerman)] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/26614550431565561 The Float Tutorial] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1017297501361462 Air Walk Tutorial] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/949957824236404 Wellerman on Piano] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2805091026493264 Solving Rubic&#039;s Cube?] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1697457768275658 Big Boy on the Move - Lincoln Nebraska] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1236553968443894 Plank Dance 15 Seconds, Slowly (Wellerman)] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2014899452758860 Best Moonwalk Video 👟 😍] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/931555232576656 Plank Dance Complete (Wellerman)] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1750422253071061 Airwalk tutorial (easy steps)] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2044859722792623 The USAF freedom flyover] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1574410588025432 Tumbler for Those That DGAF] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2179497012837206 Slickback tutorial (made easy)] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1044527205421631 Copper in the garden] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1743148136888910 Vader - Beautiful Giant of a Horse] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/956779470516720 Cats are basically potato chips with whiskers] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/jeetender.jangra.16/reels/ jeetender jangra]&lt;br /&gt;
*[https://fb.watch/HBPO7gtvCc/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HBQcsHPR_D/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HBQqaQrgeV/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HBQYTDXbxE/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HBRgvAJ49s/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HBRTmd1Qnb/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HBS3KW0wMq/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HoWh8FA5kc/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HoXznR7mP8/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/Hp0ewer-7N/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/Hp0oZIeb-E/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HoZKPMG6Xu/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/Ho_2gLK_Ub/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/Ho_pw2_Aik/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/Ho_CjKFnVL/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/Ho-Can99ZX/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/Hp07rblgr2/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/Hp1l-UDY-R/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/v/3fX1eLSRo/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/Ho_jGgqrSu/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/Ho_NhOW4Il/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/Ho-zE0iPIo/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/Ho-To0sFEO/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/Hp04F88Oaz/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/Hp0giMTQIm/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/Hp11lgjVCs/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HDbrlMi28-/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HDb7uED48T/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HD_4vaNEMI/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HBTM-5ufSY/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HBTZD9Rb8N/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HBUdLjsJmu/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HBUwQOLxgW/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HBPwVWrTts ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HFqb8ZDGf6/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HFqi6Jr2HO/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HFqkER2Scn/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HFqlYKOdzo/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HFuL0tOGP8/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HFv1kJFf47/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HFvuFhC_LM/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HC-_hnWpuh/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HDa9D4inS0/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HD_iQYbwLo/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HD_wOAgT_Z/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HD-j61YLLq/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HE0QjRoViU/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HEgDelh_c0/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HEh4FqoI7_/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HEhhcAdkdm/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HEicHPrcyI/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HEihQesQ6h/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HEitZjDM2F/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HEn3mShNF_/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HEk0QGfJeU/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HEp29EJgm6/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HEoK8eyp6W/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HEqAVw57sx/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HEs7b75A6E/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HEsDU7dr_E/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HEtOYi9hi6/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HFqb8ZDGf6/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HFqi6Jr2HO/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HFqkER2Scn/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HFqlYKOdzo/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HFuL0tOGP8/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HFv1kJFf47/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HFvuFhC_LM/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HC-_hnWpuh/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HDa9D4inS0/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HD_iQYbwLo/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HD_wOAgT_Z/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HD-j61YLLq/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HE0QjRoViU/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HEgDelh_c0/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HEh4FqoI7_/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HEhhcAdkdm/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HEicHPrcyI/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HEihQesQ6h/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HEitZjDM2F/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HEn3mShNF_/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HEk0QGfJeU/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HEp29EJgm6/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HEoK8eyp6W/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HEqAVw57sx/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
Break&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HEs7b75A6E/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
*[https://fb.watch/HEsDU7dr_E/ ] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*[https://www.facebook.com/reel/1449746333044572 Woodworker Scams the Scammers and Gifts Woman a Table]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/2101671583715221 Cliff warning]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1303762905073477 Snake rescue]&amp;lt;br&amp;gt;&lt;br /&gt;
*[https://www.facebook.com/reel/1316550876710993 Toad Rescue]&lt;br /&gt;
*[https://www.facebook.com/reel/1984849668698850 Eclipse from Spain]&lt;br /&gt;
*[https://www.facebook.com/reel/1068991502744761 Eclipse from Space]&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=User:Lynn&amp;diff=1554</id>
		<title>User:Lynn</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=User:Lynn&amp;diff=1554"/>
		<updated>2026-08-19T01:55:59Z</updated>

		<summary type="html">&lt;p&gt;Lynn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{User&lt;br /&gt;
| full name = Lynn Macey&lt;br /&gt;
| image name =&lt;br /&gt;
| hover text = lynn&lt;br /&gt;
| job title = Happily Retired&lt;br /&gt;
| organization = Working for The Family&lt;br /&gt;
| short quote = General All Around Good Guy&lt;br /&gt;
| about me = Have you got all day?&lt;br /&gt;
| about my work = I spent 45 years in high tech. Now I do it for fun.&lt;br /&gt;
| contact me = lynnmacey@gmail.com&lt;br /&gt;
| disclaimer = Only I am responsible&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
What I need to pull resolution and codec:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ffprobe -v error -select_streams v:0 -show_entries stream=width,height,codec_name -of csv=p=0 input.mp4  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fetch Termius Passkey: curl -fs https://sshid.io/lynnmacey &amp;gt;&amp;gt; ~/.ssh/authorized_keys&lt;br /&gt;
&lt;br /&gt;
Get iMatch from these guys: [https://www.photools.com/ Photools.com]&lt;br /&gt;
&lt;br /&gt;
[http://openflights.org/user/lynnmacey Lynn&#039;s Flight History]&lt;br /&gt;
&lt;br /&gt;
[[The Weekly Task List]]&lt;br /&gt;
&lt;br /&gt;
[[Home Server Applications to Try]]&lt;br /&gt;
&lt;br /&gt;
[[The Notes Collection]]&lt;br /&gt;
&lt;br /&gt;
[[Projects]]&lt;br /&gt;
&lt;br /&gt;
[[Wish List and Vendors]]&lt;br /&gt;
&lt;br /&gt;
Some places that may be useful:&lt;br /&gt;
*[https://www.virtualizationhowto.com/2026/07/how-i-organize-my-entire-home-lab-so-i-can-actually-find-anything/ How I Organize My Entire Home Lab]&lt;br /&gt;
[[Videos to Categorize]]&lt;br /&gt;
==Personal Accounts==&lt;br /&gt;
===BofA Checking===&lt;br /&gt;
Routing: 121000358&lt;br /&gt;
Account: 00126220---- add last 4 digits&lt;br /&gt;
===Venmo===&lt;br /&gt;
https://venmo.com/account/sign-in/&lt;br /&gt;
&lt;br /&gt;
 Username: @lynnmacey&lt;br /&gt;
 Password: M...&lt;br /&gt;
 Email Address: lynnmacey@gmail.com&lt;br /&gt;
&lt;br /&gt;
== Time Sensitive Information ==&lt;br /&gt;
&lt;br /&gt;
Interesting .zshrc rc file for the zsh shell. https://github.com/natelandau/dotfiles&lt;br /&gt;
&lt;br /&gt;
Some backup scripts are here https://github.com/natelandau/db_scripts&lt;br /&gt;
&lt;br /&gt;
==Movie reviews ==&lt;br /&gt;
Medieval &amp;quot;porn&amp;quot; : [https://www.youtube.com/watch?v=nTY2_NieZtw]&lt;br /&gt;
&lt;br /&gt;
Banned 1960s movies : [https://www.youtube.com/watch?v=J2CHNxk-jD0]&lt;br /&gt;
&lt;br /&gt;
13 Brutal 1970s Exploitation Films: [https://www.youtube.com/watch?v=3uBYsRYEhO0 13 Brutal 1970s Exploitation Films]&lt;br /&gt;
&lt;br /&gt;
15 Unfiltered Grindhouse Movies Hollywood Refused to Touch: [[https://www.youtube.com/watch?v=kfGhksb6Cho 15 Unfiltered Grindhouse Movies Hollywood Refused to Touch]&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=CY_e_9UoQpU 10 Movies So Wild Studios Would Never Greenlight Them Today]&lt;br /&gt;
&lt;br /&gt;
==Lynn&#039;s Flight History==&lt;br /&gt;
&lt;br /&gt;
[http://openflights.org/user/lynnmacey Lynn&#039;s Flight History]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;a href=&#039;https://openflights.org/user/lynnmacey&#039; target=&#039;_blank&#039;&amp;gt;&amp;lt;img src=&#039;https://openflights.org/banner/lynnmacey.png&#039; width=400 height=70&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I want this product for my wall: https://theflightwall.com/products/flightwall-mini-flight-tracking-led-display&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=User:Lynn&amp;diff=1553</id>
		<title>User:Lynn</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=User:Lynn&amp;diff=1553"/>
		<updated>2026-08-18T16:40:02Z</updated>

		<summary type="html">&lt;p&gt;Lynn: /* Personal Accounts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{User&lt;br /&gt;
| full name = Lynn Macey&lt;br /&gt;
| image name =&lt;br /&gt;
| hover text = lynn&lt;br /&gt;
| job title = Happily Retired&lt;br /&gt;
| organization = Working for The Family&lt;br /&gt;
| short quote = General All Around Good Guy&lt;br /&gt;
| about me = Have you got all day?&lt;br /&gt;
| about my work = I spent 45 years in high tech. Now I do it for fun.&lt;br /&gt;
| contact me = lynnmacey@gmail.com&lt;br /&gt;
| disclaimer = Only I am responsible&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Fetch Termius Passkey: curl -fs https://sshid.io/lynnmacey &amp;gt;&amp;gt; ~/.ssh/authorized_keys&lt;br /&gt;
&lt;br /&gt;
Get iMatch from these guys: [https://www.photools.com/ Photools.com]&lt;br /&gt;
&lt;br /&gt;
[http://openflights.org/user/lynnmacey Lynn&#039;s Flight History]&lt;br /&gt;
&lt;br /&gt;
[[The Weekly Task List]]&lt;br /&gt;
&lt;br /&gt;
[[Home Server Applications to Try]]&lt;br /&gt;
&lt;br /&gt;
[[The Notes Collection]]&lt;br /&gt;
&lt;br /&gt;
[[Projects]]&lt;br /&gt;
&lt;br /&gt;
[[Wish List and Vendors]]&lt;br /&gt;
&lt;br /&gt;
Some places that may be useful:&lt;br /&gt;
*[https://www.virtualizationhowto.com/2026/07/how-i-organize-my-entire-home-lab-so-i-can-actually-find-anything/ How I Organize My Entire Home Lab]&lt;br /&gt;
[[Videos to Categorize]]&lt;br /&gt;
==Personal Accounts==&lt;br /&gt;
===BofA Checking===&lt;br /&gt;
Routing: 121000358&lt;br /&gt;
Account: 00126220---- add last 4 digits&lt;br /&gt;
===Venmo===&lt;br /&gt;
https://venmo.com/account/sign-in/&lt;br /&gt;
&lt;br /&gt;
 Username: @lynnmacey&lt;br /&gt;
 Password: M...&lt;br /&gt;
 Email Address: lynnmacey@gmail.com&lt;br /&gt;
&lt;br /&gt;
== Time Sensitive Information ==&lt;br /&gt;
&lt;br /&gt;
Interesting .zshrc rc file for the zsh shell. https://github.com/natelandau/dotfiles&lt;br /&gt;
&lt;br /&gt;
Some backup scripts are here https://github.com/natelandau/db_scripts&lt;br /&gt;
&lt;br /&gt;
==Movie reviews ==&lt;br /&gt;
Medieval &amp;quot;porn&amp;quot; : [https://www.youtube.com/watch?v=nTY2_NieZtw]&lt;br /&gt;
&lt;br /&gt;
Banned 1960s movies : [https://www.youtube.com/watch?v=J2CHNxk-jD0]&lt;br /&gt;
&lt;br /&gt;
13 Brutal 1970s Exploitation Films: [https://www.youtube.com/watch?v=3uBYsRYEhO0 13 Brutal 1970s Exploitation Films]&lt;br /&gt;
&lt;br /&gt;
15 Unfiltered Grindhouse Movies Hollywood Refused to Touch: [[https://www.youtube.com/watch?v=kfGhksb6Cho 15 Unfiltered Grindhouse Movies Hollywood Refused to Touch]&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=CY_e_9UoQpU 10 Movies So Wild Studios Would Never Greenlight Them Today]&lt;br /&gt;
&lt;br /&gt;
==Lynn&#039;s Flight History==&lt;br /&gt;
&lt;br /&gt;
[http://openflights.org/user/lynnmacey Lynn&#039;s Flight History]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;a href=&#039;https://openflights.org/user/lynnmacey&#039; target=&#039;_blank&#039;&amp;gt;&amp;lt;img src=&#039;https://openflights.org/banner/lynnmacey.png&#039; width=400 height=70&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I want this product for my wall: https://theflightwall.com/products/flightwall-mini-flight-tracking-led-display&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Module:Multiple_image&amp;diff=1552</id>
		<title>Module:Multiple image</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Module:Multiple_image&amp;diff=1552"/>
		<updated>2026-08-18T01:48:11Z</updated>

		<summary type="html">&lt;p&gt;Lynn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- implements [[template:multiple image]]&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local autoscaledimages&lt;br /&gt;
local nonautoscaledimages&lt;br /&gt;
&lt;br /&gt;
local function isnotempty(s)&lt;br /&gt;
	return s and s:match( &#039;^%s*(.-)%s*$&#039; ) ~= &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function removepx(s)&lt;br /&gt;
	return tostring(s or &#039;&#039;):match(&#039;^(.*)[Pp][Xx]%s*$&#039;) or s&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getdimensions(s, w, h)&lt;br /&gt;
	if tonumber(w) and tonumber(h) then&lt;br /&gt;
		nonautoscaledimages = true&lt;br /&gt;
		return tonumber(w), tonumber(h)&lt;br /&gt;
	end&lt;br /&gt;
	local file = s and mw.title.new(&#039;File:&#039; .. mw.uri.decode(mw.ustring.gsub(s,&#039;%|.*$&#039;,&#039;&#039;), &#039;WIKI&#039;))&lt;br /&gt;
	file = file and file.file or {width = 0, height = 0}&lt;br /&gt;
	w = tonumber(file.width) or 0&lt;br /&gt;
	h = tonumber(file.height) or 0&lt;br /&gt;
	autoscaledimages = true&lt;br /&gt;
	return w, h&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderImageCell(image, width, height, link, alt, thumbtime, caption, textalign, istyle)&lt;br /&gt;
	local root = mw.html.create(&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
	local altstr = &#039;|alt=&#039; .. (alt or &#039;&#039;)&lt;br /&gt;
	local linkstr = link and (&#039;|link=&#039; .. link) or &#039;&#039;&lt;br /&gt;
	local widthstr = &#039;|&#039; .. tostring(width) .. &#039;px&#039;&lt;br /&gt;
	local thumbtimestr = &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	if isnotempty( thumbtime ) then&lt;br /&gt;
		thumbtimestr = &#039;|thumbtime=&#039; .. thumbtime&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local imagediv = root:tag(&#039;div&#039;)&lt;br /&gt;
	imagediv:addClass(&#039;thumbimage&#039;)&lt;br /&gt;
	imagediv:cssText(istyle)&lt;br /&gt;
	if( height ) then&lt;br /&gt;
		imagediv:css(&#039;height&#039;, tostring(height) .. &#039;px&#039;)&lt;br /&gt;
		imagediv:css(&#039;overflow&#039;, &#039;hidden&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	imagediv:wikitext(&#039;[[file:&#039; .. image .. widthstr .. linkstr .. altstr .. thumbtimestr .. &#039;]]&#039;)&lt;br /&gt;
	if isnotempty(caption) then&lt;br /&gt;
		local captiondiv = root:tag(&#039;div&#039;)&lt;br /&gt;
		captiondiv:addClass(&#039;thumbcaption&#039;)&lt;br /&gt;
		if isnotempty(textalign) then&lt;br /&gt;
			captiondiv:addClass(&#039;text-align-&#039; .. textalign)&lt;br /&gt;
		end&lt;br /&gt;
		captiondiv:wikitext(caption)&lt;br /&gt;
	end&lt;br /&gt;
	return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getWidth(w1, w2)&lt;br /&gt;
	local w&lt;br /&gt;
	if isnotempty(w1) then&lt;br /&gt;
		w = tonumber(w1)&lt;br /&gt;
	elseif isnotempty(w2) then&lt;br /&gt;
		w = tonumber(w2)&lt;br /&gt;
	end&lt;br /&gt;
	return w or 200&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getPerRow(pstr, ic)&lt;br /&gt;
	-- split string into array using any non-digit as a dilimiter&lt;br /&gt;
	local pr = mw.text.split(pstr or &#039;&#039;, &#039;[^%d][^%d]*&#039;)&lt;br /&gt;
	-- if split failed, assume a single row&lt;br /&gt;
	if (#pr &amp;lt; 1) then&lt;br /&gt;
		pr = {tostring(ic)}&lt;br /&gt;
	end&lt;br /&gt;
	-- convert the array of strings to an array of numbers,&lt;br /&gt;
	-- adding any implied/missing numbers at the end of the array&lt;br /&gt;
	local r = 1&lt;br /&gt;
	local thisrow = tonumber(pr[1] or ic) or ic&lt;br /&gt;
	local prownum = {}&lt;br /&gt;
	while( ic &amp;gt; 0 ) do&lt;br /&gt;
		prownum[r] = thisrow&lt;br /&gt;
		ic = ic - thisrow&lt;br /&gt;
		r = r + 1&lt;br /&gt;
		-- use the previous if the next is missing and&lt;br /&gt;
		-- make sure we don&#039;t overstep the number of images&lt;br /&gt;
		thisrow = math.min(tonumber(pr[r] or thisrow) or ic, ic)&lt;br /&gt;
	end&lt;br /&gt;
	return prownum&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMultipleImages(frame)&lt;br /&gt;
	local pargs = frame:getParent().args&lt;br /&gt;
	local args = frame.args&lt;br /&gt;
	local width = removepx(pargs[&#039;width&#039;] or &#039;&#039;)&lt;br /&gt;
	local dir = pargs[&#039;direction&#039;] or &#039;&#039;&lt;br /&gt;
	local border = pargs[&#039;border&#039;] or args[&#039;border&#039;] or &#039;&#039;&lt;br /&gt;
	local align = pargs[&#039;align&#039;] or args[&#039;align&#039;] or (border == &#039;infobox&#039; and &#039;center&#039; or &#039;&#039;)&lt;br /&gt;
	local capalign = pargs[&#039;caption_align&#039;] or args[&#039;caption_align&#039;] or &#039;&#039;&lt;br /&gt;
	local totalwidth = removepx(pargs[&#039;total_width&#039;] or args[&#039;total_width&#039;] or &#039;&#039;)&lt;br /&gt;
	local imgstyle = pargs[&#039;image_style&#039;] or args[&#039;image_style&#039;]&lt;br /&gt;
	local header = pargs[&#039;header&#039;] or pargs[&#039;title&#039;] or &#039;&#039;&lt;br /&gt;
	local footer = pargs[&#039;footer&#039;] or &#039;&#039;&lt;br /&gt;
	local imagegap = tonumber(pargs[&#039;image_gap&#039;] or &#039;1&#039;) or 1&lt;br /&gt;
	local perrow = nil&lt;br /&gt;
	local thumbclass = {&lt;br /&gt;
		[&amp;quot;left&amp;quot;] = &#039;tleft&#039;,&lt;br /&gt;
		[&amp;quot;none&amp;quot;] = &#039;tnone&#039;,&lt;br /&gt;
		[&amp;quot;center&amp;quot;] = &#039;tnone&#039;,&lt;br /&gt;
		[&amp;quot;centre&amp;quot;] = &#039;tnone&#039;,&lt;br /&gt;
		[&amp;quot;right&amp;quot;] = &#039;tright&#039;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	-- find all the nonempty images&lt;br /&gt;
	local imagenumbers = {}&lt;br /&gt;
	local imagecount = 0&lt;br /&gt;
	for k, v in pairs( pargs ) do&lt;br /&gt;
		local i = tonumber(tostring(k):match( &#039;^%s*image([%d]+)%s*$&#039; ) or &#039;0&#039;)&lt;br /&gt;
		if( i &amp;gt; 0 and isnotempty(v) ) then&lt;br /&gt;
			table.insert( imagenumbers, i)&lt;br /&gt;
			imagecount = imagecount + 1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- sort the imagenumbers&lt;br /&gt;
	table.sort(imagenumbers)&lt;br /&gt;
&lt;br /&gt;
	-- create an array with the number of images per row&lt;br /&gt;
	perrow = getPerRow(dir == &#039;vertical&#039; and &#039;1&#039; or pargs[&#039;perrow&#039;], imagecount)&lt;br /&gt;
&lt;br /&gt;
	-- compute the number of rows&lt;br /&gt;
	local rowcount = #perrow&lt;br /&gt;
&lt;br /&gt;
	-- store the image widths and compute row widths and maximum row width&lt;br /&gt;
	local heights = {}&lt;br /&gt;
	local widths = {}&lt;br /&gt;
	local widthmax = 0&lt;br /&gt;
	local widthsum = {}&lt;br /&gt;
	local k = 0&lt;br /&gt;
	for r=1,rowcount do&lt;br /&gt;
		widthsum[r] = 0&lt;br /&gt;
		for c=1,perrow[r] do&lt;br /&gt;
			k = k + 1&lt;br /&gt;
			if( k &amp;lt;= imagecount ) then&lt;br /&gt;
				local i = imagenumbers[k]&lt;br /&gt;
				if( isnotempty(totalwidth) ) then&lt;br /&gt;
					l, m = string.find(pargs[&#039;image&#039; .. i], &amp;quot;[[file:&amp;quot;)&lt;br /&gt;
					if (l ~= 0) then&lt;br /&gt;
						pargs[&#039;image&#039; .. i] = string.sub(pargs[&#039;image&#039; .. i], m + 1, len(pargs[&#039;image&#039; .. i]) - 2)&lt;br /&gt;
					end&lt;br /&gt;
					widths[k], heights[k] = getdimensions(pargs[&#039;image&#039; .. i], pargs[&#039;width&#039; .. i], pargs[&#039;height&#039; .. i])&lt;br /&gt;
				else&lt;br /&gt;
					widths[k] = getWidth(width, pargs[&#039;width&#039; .. i])&lt;br /&gt;
				end&lt;br /&gt;
				widthsum[r] = widthsum[r] + widths[k]&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		widthmax = math.max(widthmax, widthsum[r])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- make sure the gap is non-negative&lt;br /&gt;
	if imagegap &amp;lt; 0 then imagegap = 0 end&lt;br /&gt;
&lt;br /&gt;
	-- if total_width has been specified, rescale the image widths&lt;br /&gt;
	if( isnotempty(totalwidth) ) then&lt;br /&gt;
		totalwidth = tonumber(totalwidth)&lt;br /&gt;
		widthmax = 0&lt;br /&gt;
		local k = 0&lt;br /&gt;
		for r=1,rowcount do&lt;br /&gt;
			local koffset = k&lt;br /&gt;
			local tw = totalwidth - (3 + imagegap) * (perrow[r] - 1) - 12&lt;br /&gt;
			local ar = {}&lt;br /&gt;
			local arsum = 0&lt;br /&gt;
			for j=1,perrow[r] do&lt;br /&gt;
				k = k + 1&lt;br /&gt;
				if( k&amp;lt;= imagecount ) then&lt;br /&gt;
					local i = imagenumbers[k]&lt;br /&gt;
					local h = heights[k] or 0&lt;br /&gt;
					if (h &amp;gt; 0) then&lt;br /&gt;
						ar[j] = widths[k]/h&lt;br /&gt;
						heights[k] = h&lt;br /&gt;
					else&lt;br /&gt;
						ar[j] = widths[k]/100&lt;br /&gt;
					end&lt;br /&gt;
					arsum = arsum + ar[j]&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			local ht = tw/arsum&lt;br /&gt;
			local ws = 0&lt;br /&gt;
			k = koffset&lt;br /&gt;
			for j=1,perrow[r] do&lt;br /&gt;
				k = k + 1&lt;br /&gt;
				if( k&amp;lt;= imagecount ) then&lt;br /&gt;
					local i = imagenumbers[k]&lt;br /&gt;
					widths[k] = math.floor(ar[j]*ht + 0.5)&lt;br /&gt;
					ws = ws + widths[k]&lt;br /&gt;
					if heights[k] then&lt;br /&gt;
						heights[k] = math.floor(ht)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			widthsum[r] = ws&lt;br /&gt;
			widthmax = math.max(widthmax, widthsum[r])&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- start building the array of images, if there are images&lt;br /&gt;
	if( imagecount &amp;gt; 0 ) then&lt;br /&gt;
		-- compute width of outer div&lt;br /&gt;
		local bodywidth = 0&lt;br /&gt;
		for r=1,rowcount do&lt;br /&gt;
			if( widthmax == widthsum[r] ) then&lt;br /&gt;
				bodywidth = widthmax + (3 + imagegap) * (perrow[r] - 1) + 12&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		-- The body has a min-width of 100, which needs to be taken into account on specific widths&lt;br /&gt;
		bodywidth = math.max( 100, bodywidth - 8);&lt;br /&gt;
&lt;br /&gt;
		local bg = pargs[&#039;background color&#039;] or &#039;&#039;&lt;br /&gt;
		-- create the array of images&lt;br /&gt;
		local root = mw.html.create(&#039;div&#039;)&lt;br /&gt;
		root:addClass(&#039;thumb&#039;)&lt;br /&gt;
		root:addClass(&#039;tmulti&#039;)&lt;br /&gt;
		-- root:addClass(&#039;tmulti-sandbox&#039;)&lt;br /&gt;
		root:addClass(thumbclass[align] or &#039;tright&#039;)&lt;br /&gt;
&lt;br /&gt;
		if( align == &#039;center&#039; or align == &#039;centre&#039; ) then&lt;br /&gt;
			root:addClass(&#039;center&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		if( bg ~= &#039;&#039; ) then&lt;br /&gt;
			root:css(&#039;background-color&#039;, bg)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local div = root:tag(&#039;div&#039;)&lt;br /&gt;
		div:addClass(&#039;thumbinner&#039;)&lt;br /&gt;
		div:css(&#039;width&#039;, tostring(bodywidth) .. &#039;px&#039;)&lt;br /&gt;
			:css(&#039;max-width&#039;, tostring(bodywidth) .. &#039;px&#039;)&lt;br /&gt;
		if( bg ~= &#039;&#039; ) then&lt;br /&gt;
			div:css(&#039;background-color&#039;, bg)&lt;br /&gt;
		end&lt;br /&gt;
		if( border == &#039;infobox&#039; or border == &#039;none&#039;) then&lt;br /&gt;
			div:css(&#039;border&#039;, &#039;none&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		-- add the header&lt;br /&gt;
		if( isnotempty(header) ) then&lt;br /&gt;
			div:tag(&#039;div&#039;)&lt;br /&gt;
				:addClass(&#039;trow&#039;)&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					:addClass(&#039;theader&#039;)&lt;br /&gt;
					:css(&#039;text-align&#039;, pargs[&#039;header_align&#039;])&lt;br /&gt;
					:css(&#039;background-color&#039;, pargs[&#039;header_background&#039;])&lt;br /&gt;
					:wikitext(header)&lt;br /&gt;
		end&lt;br /&gt;
		-- loop through the images&lt;br /&gt;
		local k = 0&lt;br /&gt;
		for r=1,rowcount do&lt;br /&gt;
			local rowdiv = div:tag(&#039;div&#039;):addClass(&#039;trow&#039;);&lt;br /&gt;
			for j=1,perrow[r] do&lt;br /&gt;
				k = k + 1&lt;br /&gt;
				if( k &amp;lt;= imagecount ) then&lt;br /&gt;
					local imagediv = rowdiv:tag(&#039;div&#039;)&lt;br /&gt;
					imagediv:addClass(&#039;tsingle&#039;)&lt;br /&gt;
					if bg ~= &#039;&#039; then&lt;br /&gt;
						imagediv:css(&#039;background-color&#039;, bg);&lt;br /&gt;
					end&lt;br /&gt;
					if ((imagegap &amp;gt; 1) and (j &amp;lt; perrow[r])) then&lt;br /&gt;
						imagediv:css(&#039;margin-right&#039;, tostring(imagegap) .. &#039;px&#039;)&lt;br /&gt;
					end&lt;br /&gt;
					local i = imagenumbers[k]&lt;br /&gt;
					local img = pargs[&#039;image&#039; .. i]&lt;br /&gt;
					local w = widths[k]&lt;br /&gt;
					imagediv:css(&#039;width&#039;, tostring(2 + w) .. &#039;px&#039;)&lt;br /&gt;
						:css(&#039;max-width&#039;, tostring(2 + w) .. &#039;px&#039;)&lt;br /&gt;
					imagediv:wikitext(renderImageCell(img, w, heights[k],&lt;br /&gt;
						pargs[&#039;link&#039; .. i], pargs[&#039;alt&#039; .. i],&lt;br /&gt;
						pargs[&#039;thumbtime&#039; .. i], pargs[&#039;caption&#039; .. i], capalign, imgstyle))&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		-- add the footer&lt;br /&gt;
		if( isnotempty(footer) ) then&lt;br /&gt;
			local falign = string.lower(pargs[&#039;footer_align&#039;] or args[&#039;footer_align&#039;] or &#039;left&#039;)&lt;br /&gt;
			falign = (falign == &#039;centre&#039;) and &#039;center&#039; or falign&lt;br /&gt;
			div:tag(&#039;div&#039;)&lt;br /&gt;
				:addClass(&#039;trow&#039;)&lt;br /&gt;
				:css(&#039;display&#039;, (falign ~= &#039;left&#039;) and &#039;flow-root&#039; or &#039;flex&#039;)&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					:addClass(&#039;thumbcaption&#039;)&lt;br /&gt;
					:css(&#039;text-align&#039;, (falign ~= &#039;left&#039;) and falign or nil)&lt;br /&gt;
					:css(&#039;background-color&#039;, pargs[&#039;footer_background&#039;])&lt;br /&gt;
					:wikitext(footer)&lt;br /&gt;
		end&lt;br /&gt;
		return tostring(root)&lt;br /&gt;
	end&lt;br /&gt;
	return &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.render( frame )&lt;br /&gt;
	autoscaledimages = false&lt;br /&gt;
	nonautoscaledimages = false&lt;br /&gt;
&lt;br /&gt;
	return frame:extensionTag {name = &#039;templatestyles&#039;, args = {src = &#039;Multiple image/styles.css&#039;, wrapper = &amp;quot;.tmulti&amp;quot;}}&lt;br /&gt;
		.. renderMultipleImages( frame )&lt;br /&gt;
		.. (autoscaledimages and &#039;[[Category:Pages using multiple image with auto scaled images]]&#039; or &#039;&#039;)&lt;br /&gt;
		.. (nonautoscaledimages and &#039;[[Category:Pages using multiple image with manual scaled images]]&#039; or &#039;&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Living_in_Chico&amp;diff=1551</id>
		<title>Living in Chico</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Living_in_Chico&amp;diff=1551"/>
		<updated>2026-08-18T01:45:45Z</updated>

		<summary type="html">&lt;p&gt;Lynn: /* The Apartment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{PAGEBANNER:City-of-chico-banner.jpg}}&lt;br /&gt;
=Chico Writeup Related to Retirees=&lt;br /&gt;
[https://familydestinationsguide.com/town-california-affordable-retirees/ Chico Writeup Related to Retirees]&lt;br /&gt;
&lt;br /&gt;
= The Apartment =&lt;br /&gt;
{|&lt;br /&gt;
The apartment is located on the east side of town, approximately here:&lt;br /&gt;
&lt;br /&gt;
{{multiple image&lt;br /&gt;
| footer    = Players are cautioned with a yellow card and sent off with a red card.&lt;br /&gt;
| width     = 450&lt;br /&gt;
| image1    = {{#display_map:39.75224,-121.79213|zoom=100|layers=OpenStreetMap}} &lt;br /&gt;
&lt;br /&gt;
| alt1      = Chico Map&lt;br /&gt;
&lt;br /&gt;
| image2    = Condo beach.jpg&lt;br /&gt;
| width     =450&lt;br /&gt;
| alt2      = Beach at the condo&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Note that the marker is just &amp;quot;close&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The mailing address is: &lt;br /&gt;
&lt;br /&gt;
 The Maceys&lt;br /&gt;
 2580 California Park Dr #223&lt;br /&gt;
 Chico, CA 95928-4213&lt;br /&gt;
&lt;br /&gt;
WiFi quick connect:&lt;br /&gt;
&lt;br /&gt;
[[File:Macey WiFi-1024.jpeg | 150px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gym code: 25-80-17 (enter)&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
==[[Chico Apartment|Chico Apartment Details]]==&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
&lt;br /&gt;
==[[The Weekly Task List|What Lynn should be working on by day]]==&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
&lt;br /&gt;
= The House =&lt;br /&gt;
Josh and Anna&#039;s house is on the north end of town, here:&lt;br /&gt;
&lt;br /&gt;
{{#display_map:3163 Burnt Ranch Way, chico, CA&lt;br /&gt;
||width=450|height=500|zoom=100| layers=OpenStreetMap&lt;br /&gt;
}}&lt;br /&gt;
Note that the marker is just &amp;quot;close&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The mailing address is:&lt;br /&gt;
&lt;br /&gt;
 Josh &amp;amp; Anna Macey&lt;br /&gt;
 3163 Sawyers Bar Ln&lt;br /&gt;
 Chico, CA 95973&lt;br /&gt;
&lt;br /&gt;
[[Chico House|Chico House Details]]&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Module:Multiple_image&amp;diff=1550</id>
		<title>Module:Multiple image</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Module:Multiple_image&amp;diff=1550"/>
		<updated>2026-08-18T01:45:11Z</updated>

		<summary type="html">&lt;p&gt;Lynn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- implements [[template:multiple image]]&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local autoscaledimages&lt;br /&gt;
local nonautoscaledimages&lt;br /&gt;
&lt;br /&gt;
local function isnotempty(s)&lt;br /&gt;
	return s and s:match( &#039;^%s*(.-)%s*$&#039; ) ~= &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function removepx(s)&lt;br /&gt;
	return tostring(s or &#039;&#039;):match(&#039;^(.*)[Pp][Xx]%s*$&#039;) or s&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function die(s)&lt;br /&gt;
  warn(s)&lt;br /&gt;
  error()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getdimensions(s, w, h)&lt;br /&gt;
	if tonumber(w) and tonumber(h) then&lt;br /&gt;
		nonautoscaledimages = true&lt;br /&gt;
		return tonumber(w), tonumber(h)&lt;br /&gt;
	end&lt;br /&gt;
	local file = s and mw.title.new(&#039;File:&#039; .. mw.uri.decode(mw.ustring.gsub(s,&#039;%|.*$&#039;,&#039;&#039;), &#039;WIKI&#039;))&lt;br /&gt;
	file = file and file.file or {width = 0, height = 0}&lt;br /&gt;
	w = tonumber(file.width) or 0&lt;br /&gt;
	h = tonumber(file.height) or 0&lt;br /&gt;
	autoscaledimages = true&lt;br /&gt;
	return w, h&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderImageCell(image, width, height, link, alt, thumbtime, caption, textalign, istyle)&lt;br /&gt;
	local root = mw.html.create(&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
	local altstr = &#039;|alt=&#039; .. (alt or &#039;&#039;)&lt;br /&gt;
	local linkstr = link and (&#039;|link=&#039; .. link) or &#039;&#039;&lt;br /&gt;
	local widthstr = &#039;|&#039; .. tostring(width) .. &#039;px&#039;&lt;br /&gt;
	local thumbtimestr = &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	if isnotempty( thumbtime ) then&lt;br /&gt;
		thumbtimestr = &#039;|thumbtime=&#039; .. thumbtime&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local imagediv = root:tag(&#039;div&#039;)&lt;br /&gt;
	imagediv:addClass(&#039;thumbimage&#039;)&lt;br /&gt;
	imagediv:cssText(istyle)&lt;br /&gt;
	if( height ) then&lt;br /&gt;
		imagediv:css(&#039;height&#039;, tostring(height) .. &#039;px&#039;)&lt;br /&gt;
		imagediv:css(&#039;overflow&#039;, &#039;hidden&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	imagediv:wikitext(&#039;[[file:&#039; .. image .. widthstr .. linkstr .. altstr .. thumbtimestr .. &#039;]]&#039;)&lt;br /&gt;
	if isnotempty(caption) then&lt;br /&gt;
		local captiondiv = root:tag(&#039;div&#039;)&lt;br /&gt;
		captiondiv:addClass(&#039;thumbcaption&#039;)&lt;br /&gt;
		if isnotempty(textalign) then&lt;br /&gt;
			captiondiv:addClass(&#039;text-align-&#039; .. textalign)&lt;br /&gt;
		end&lt;br /&gt;
		captiondiv:wikitext(caption)&lt;br /&gt;
	end&lt;br /&gt;
	return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getWidth(w1, w2)&lt;br /&gt;
	local w&lt;br /&gt;
	if isnotempty(w1) then&lt;br /&gt;
		w = tonumber(w1)&lt;br /&gt;
	elseif isnotempty(w2) then&lt;br /&gt;
		w = tonumber(w2)&lt;br /&gt;
	end&lt;br /&gt;
	return w or 200&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getPerRow(pstr, ic)&lt;br /&gt;
	-- split string into array using any non-digit as a dilimiter&lt;br /&gt;
	local pr = mw.text.split(pstr or &#039;&#039;, &#039;[^%d][^%d]*&#039;)&lt;br /&gt;
	-- if split failed, assume a single row&lt;br /&gt;
	if (#pr &amp;lt; 1) then&lt;br /&gt;
		pr = {tostring(ic)}&lt;br /&gt;
	end&lt;br /&gt;
	-- convert the array of strings to an array of numbers,&lt;br /&gt;
	-- adding any implied/missing numbers at the end of the array&lt;br /&gt;
	local r = 1&lt;br /&gt;
	local thisrow = tonumber(pr[1] or ic) or ic&lt;br /&gt;
	local prownum = {}&lt;br /&gt;
	while( ic &amp;gt; 0 ) do&lt;br /&gt;
		prownum[r] = thisrow&lt;br /&gt;
		ic = ic - thisrow&lt;br /&gt;
		r = r + 1&lt;br /&gt;
		-- use the previous if the next is missing and&lt;br /&gt;
		-- make sure we don&#039;t overstep the number of images&lt;br /&gt;
		thisrow = math.min(tonumber(pr[r] or thisrow) or ic, ic)&lt;br /&gt;
	end&lt;br /&gt;
	return prownum&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMultipleImages(frame)&lt;br /&gt;
	local pargs = frame:getParent().args&lt;br /&gt;
	local args = frame.args&lt;br /&gt;
	local width = removepx(pargs[&#039;width&#039;] or &#039;&#039;)&lt;br /&gt;
	local dir = pargs[&#039;direction&#039;] or &#039;&#039;&lt;br /&gt;
	local border = pargs[&#039;border&#039;] or args[&#039;border&#039;] or &#039;&#039;&lt;br /&gt;
	local align = pargs[&#039;align&#039;] or args[&#039;align&#039;] or (border == &#039;infobox&#039; and &#039;center&#039; or &#039;&#039;)&lt;br /&gt;
	local capalign = pargs[&#039;caption_align&#039;] or args[&#039;caption_align&#039;] or &#039;&#039;&lt;br /&gt;
	local totalwidth = removepx(pargs[&#039;total_width&#039;] or args[&#039;total_width&#039;] or &#039;&#039;)&lt;br /&gt;
	local imgstyle = pargs[&#039;image_style&#039;] or args[&#039;image_style&#039;]&lt;br /&gt;
	local header = pargs[&#039;header&#039;] or pargs[&#039;title&#039;] or &#039;&#039;&lt;br /&gt;
	local footer = pargs[&#039;footer&#039;] or &#039;&#039;&lt;br /&gt;
	local imagegap = tonumber(pargs[&#039;image_gap&#039;] or &#039;1&#039;) or 1&lt;br /&gt;
	local perrow = nil&lt;br /&gt;
	local thumbclass = {&lt;br /&gt;
		[&amp;quot;left&amp;quot;] = &#039;tleft&#039;,&lt;br /&gt;
		[&amp;quot;none&amp;quot;] = &#039;tnone&#039;,&lt;br /&gt;
		[&amp;quot;center&amp;quot;] = &#039;tnone&#039;,&lt;br /&gt;
		[&amp;quot;centre&amp;quot;] = &#039;tnone&#039;,&lt;br /&gt;
		[&amp;quot;right&amp;quot;] = &#039;tright&#039;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	-- find all the nonempty images&lt;br /&gt;
	local imagenumbers = {}&lt;br /&gt;
	local imagecount = 0&lt;br /&gt;
	for k, v in pairs( pargs ) do&lt;br /&gt;
		local i = tonumber(tostring(k):match( &#039;^%s*image([%d]+)%s*$&#039; ) or &#039;0&#039;)&lt;br /&gt;
		if( i &amp;gt; 0 and isnotempty(v) ) then&lt;br /&gt;
			table.insert( imagenumbers, i)&lt;br /&gt;
			imagecount = imagecount + 1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- sort the imagenumbers&lt;br /&gt;
	table.sort(imagenumbers)&lt;br /&gt;
&lt;br /&gt;
	-- create an array with the number of images per row&lt;br /&gt;
	perrow = getPerRow(dir == &#039;vertical&#039; and &#039;1&#039; or pargs[&#039;perrow&#039;], imagecount)&lt;br /&gt;
&lt;br /&gt;
	-- compute the number of rows&lt;br /&gt;
	local rowcount = #perrow&lt;br /&gt;
&lt;br /&gt;
	-- store the image widths and compute row widths and maximum row width&lt;br /&gt;
	local heights = {}&lt;br /&gt;
	local widths = {}&lt;br /&gt;
	local widthmax = 0&lt;br /&gt;
	local widthsum = {}&lt;br /&gt;
	local k = 0&lt;br /&gt;
	for r=1,rowcount do&lt;br /&gt;
		widthsum[r] = 0&lt;br /&gt;
		for c=1,perrow[r] do&lt;br /&gt;
			k = k + 1&lt;br /&gt;
			if( k &amp;lt;= imagecount ) then&lt;br /&gt;
				local i = imagenumbers[k]&lt;br /&gt;
				if( isnotempty(totalwidth) ) then&lt;br /&gt;
					l, m = string.find(pargs[&#039;image&#039; .. i], &amp;quot;[[file:&amp;quot;)&lt;br /&gt;
					if (l == 1) then&lt;br /&gt;
						pargs[&#039;image&#039; .. i] = string.sub(pargs[&#039;image&#039; .. i], m + 1, len(pargs[&#039;image&#039; .. i]) - 2)&lt;br /&gt;
						die(pargs[&#039;image&#039; .. i])&lt;br /&gt;
					end&lt;br /&gt;
					widths[k], heights[k] = getdimensions(pargs[&#039;image&#039; .. i], pargs[&#039;width&#039; .. i], pargs[&#039;height&#039; .. i])&lt;br /&gt;
				else&lt;br /&gt;
					widths[k] = getWidth(width, pargs[&#039;width&#039; .. i])&lt;br /&gt;
				end&lt;br /&gt;
				widthsum[r] = widthsum[r] + widths[k]&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		widthmax = math.max(widthmax, widthsum[r])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- make sure the gap is non-negative&lt;br /&gt;
	if imagegap &amp;lt; 0 then imagegap = 0 end&lt;br /&gt;
&lt;br /&gt;
	-- if total_width has been specified, rescale the image widths&lt;br /&gt;
	if( isnotempty(totalwidth) ) then&lt;br /&gt;
		totalwidth = tonumber(totalwidth)&lt;br /&gt;
		widthmax = 0&lt;br /&gt;
		local k = 0&lt;br /&gt;
		for r=1,rowcount do&lt;br /&gt;
			local koffset = k&lt;br /&gt;
			local tw = totalwidth - (3 + imagegap) * (perrow[r] - 1) - 12&lt;br /&gt;
			local ar = {}&lt;br /&gt;
			local arsum = 0&lt;br /&gt;
			for j=1,perrow[r] do&lt;br /&gt;
				k = k + 1&lt;br /&gt;
				if( k&amp;lt;= imagecount ) then&lt;br /&gt;
					local i = imagenumbers[k]&lt;br /&gt;
					local h = heights[k] or 0&lt;br /&gt;
					if (h &amp;gt; 0) then&lt;br /&gt;
						ar[j] = widths[k]/h&lt;br /&gt;
						heights[k] = h&lt;br /&gt;
					else&lt;br /&gt;
						ar[j] = widths[k]/100&lt;br /&gt;
					end&lt;br /&gt;
					arsum = arsum + ar[j]&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			local ht = tw/arsum&lt;br /&gt;
			local ws = 0&lt;br /&gt;
			k = koffset&lt;br /&gt;
			for j=1,perrow[r] do&lt;br /&gt;
				k = k + 1&lt;br /&gt;
				if( k&amp;lt;= imagecount ) then&lt;br /&gt;
					local i = imagenumbers[k]&lt;br /&gt;
					widths[k] = math.floor(ar[j]*ht + 0.5)&lt;br /&gt;
					ws = ws + widths[k]&lt;br /&gt;
					if heights[k] then&lt;br /&gt;
						heights[k] = math.floor(ht)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			widthsum[r] = ws&lt;br /&gt;
			widthmax = math.max(widthmax, widthsum[r])&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- start building the array of images, if there are images&lt;br /&gt;
	if( imagecount &amp;gt; 0 ) then&lt;br /&gt;
		-- compute width of outer div&lt;br /&gt;
		local bodywidth = 0&lt;br /&gt;
		for r=1,rowcount do&lt;br /&gt;
			if( widthmax == widthsum[r] ) then&lt;br /&gt;
				bodywidth = widthmax + (3 + imagegap) * (perrow[r] - 1) + 12&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		-- The body has a min-width of 100, which needs to be taken into account on specific widths&lt;br /&gt;
		bodywidth = math.max( 100, bodywidth - 8);&lt;br /&gt;
&lt;br /&gt;
		local bg = pargs[&#039;background color&#039;] or &#039;&#039;&lt;br /&gt;
		-- create the array of images&lt;br /&gt;
		local root = mw.html.create(&#039;div&#039;)&lt;br /&gt;
		root:addClass(&#039;thumb&#039;)&lt;br /&gt;
		root:addClass(&#039;tmulti&#039;)&lt;br /&gt;
		-- root:addClass(&#039;tmulti-sandbox&#039;)&lt;br /&gt;
		root:addClass(thumbclass[align] or &#039;tright&#039;)&lt;br /&gt;
&lt;br /&gt;
		if( align == &#039;center&#039; or align == &#039;centre&#039; ) then&lt;br /&gt;
			root:addClass(&#039;center&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		if( bg ~= &#039;&#039; ) then&lt;br /&gt;
			root:css(&#039;background-color&#039;, bg)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local div = root:tag(&#039;div&#039;)&lt;br /&gt;
		div:addClass(&#039;thumbinner&#039;)&lt;br /&gt;
		div:css(&#039;width&#039;, tostring(bodywidth) .. &#039;px&#039;)&lt;br /&gt;
			:css(&#039;max-width&#039;, tostring(bodywidth) .. &#039;px&#039;)&lt;br /&gt;
		if( bg ~= &#039;&#039; ) then&lt;br /&gt;
			div:css(&#039;background-color&#039;, bg)&lt;br /&gt;
		end&lt;br /&gt;
		if( border == &#039;infobox&#039; or border == &#039;none&#039;) then&lt;br /&gt;
			div:css(&#039;border&#039;, &#039;none&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		-- add the header&lt;br /&gt;
		if( isnotempty(header) ) then&lt;br /&gt;
			div:tag(&#039;div&#039;)&lt;br /&gt;
				:addClass(&#039;trow&#039;)&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					:addClass(&#039;theader&#039;)&lt;br /&gt;
					:css(&#039;text-align&#039;, pargs[&#039;header_align&#039;])&lt;br /&gt;
					:css(&#039;background-color&#039;, pargs[&#039;header_background&#039;])&lt;br /&gt;
					:wikitext(header)&lt;br /&gt;
		end&lt;br /&gt;
		-- loop through the images&lt;br /&gt;
		local k = 0&lt;br /&gt;
		for r=1,rowcount do&lt;br /&gt;
			local rowdiv = div:tag(&#039;div&#039;):addClass(&#039;trow&#039;);&lt;br /&gt;
			for j=1,perrow[r] do&lt;br /&gt;
				k = k + 1&lt;br /&gt;
				if( k &amp;lt;= imagecount ) then&lt;br /&gt;
					local imagediv = rowdiv:tag(&#039;div&#039;)&lt;br /&gt;
					imagediv:addClass(&#039;tsingle&#039;)&lt;br /&gt;
					if bg ~= &#039;&#039; then&lt;br /&gt;
						imagediv:css(&#039;background-color&#039;, bg);&lt;br /&gt;
					end&lt;br /&gt;
					if ((imagegap &amp;gt; 1) and (j &amp;lt; perrow[r])) then&lt;br /&gt;
						imagediv:css(&#039;margin-right&#039;, tostring(imagegap) .. &#039;px&#039;)&lt;br /&gt;
					end&lt;br /&gt;
					local i = imagenumbers[k]&lt;br /&gt;
					local img = pargs[&#039;image&#039; .. i]&lt;br /&gt;
					local w = widths[k]&lt;br /&gt;
					imagediv:css(&#039;width&#039;, tostring(2 + w) .. &#039;px&#039;)&lt;br /&gt;
						:css(&#039;max-width&#039;, tostring(2 + w) .. &#039;px&#039;)&lt;br /&gt;
					imagediv:wikitext(renderImageCell(img, w, heights[k],&lt;br /&gt;
						pargs[&#039;link&#039; .. i], pargs[&#039;alt&#039; .. i],&lt;br /&gt;
						pargs[&#039;thumbtime&#039; .. i], pargs[&#039;caption&#039; .. i], capalign, imgstyle))&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		-- add the footer&lt;br /&gt;
		if( isnotempty(footer) ) then&lt;br /&gt;
			local falign = string.lower(pargs[&#039;footer_align&#039;] or args[&#039;footer_align&#039;] or &#039;left&#039;)&lt;br /&gt;
			falign = (falign == &#039;centre&#039;) and &#039;center&#039; or falign&lt;br /&gt;
			div:tag(&#039;div&#039;)&lt;br /&gt;
				:addClass(&#039;trow&#039;)&lt;br /&gt;
				:css(&#039;display&#039;, (falign ~= &#039;left&#039;) and &#039;flow-root&#039; or &#039;flex&#039;)&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					:addClass(&#039;thumbcaption&#039;)&lt;br /&gt;
					:css(&#039;text-align&#039;, (falign ~= &#039;left&#039;) and falign or nil)&lt;br /&gt;
					:css(&#039;background-color&#039;, pargs[&#039;footer_background&#039;])&lt;br /&gt;
					:wikitext(footer)&lt;br /&gt;
		end&lt;br /&gt;
		return tostring(root)&lt;br /&gt;
	end&lt;br /&gt;
	return &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.render( frame )&lt;br /&gt;
	autoscaledimages = false&lt;br /&gt;
	nonautoscaledimages = false&lt;br /&gt;
&lt;br /&gt;
	return frame:extensionTag {name = &#039;templatestyles&#039;, args = {src = &#039;Multiple image/styles.css&#039;, wrapper = &amp;quot;.tmulti&amp;quot;}}&lt;br /&gt;
		.. renderMultipleImages( frame )&lt;br /&gt;
		.. (autoscaledimages and &#039;[[Category:Pages using multiple image with auto scaled images]]&#039; or &#039;&#039;)&lt;br /&gt;
		.. (nonautoscaledimages and &#039;[[Category:Pages using multiple image with manual scaled images]]&#039; or &#039;&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Living_in_Chico&amp;diff=1549</id>
		<title>Living in Chico</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Living_in_Chico&amp;diff=1549"/>
		<updated>2026-08-18T01:27:51Z</updated>

		<summary type="html">&lt;p&gt;Lynn: /* The Apartment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{PAGEBANNER:City-of-chico-banner.jpg}}&lt;br /&gt;
=Chico Writeup Related to Retirees=&lt;br /&gt;
[https://familydestinationsguide.com/town-california-affordable-retirees/ Chico Writeup Related to Retirees]&lt;br /&gt;
&lt;br /&gt;
= The Apartment =&lt;br /&gt;
{|&lt;br /&gt;
The apartment is located on the east side of town, approximately here:&lt;br /&gt;
&lt;br /&gt;
{{multiple image&lt;br /&gt;
| footer    = Players are cautioned with a yellow card and sent off with a red card.&lt;br /&gt;
| width     = 450&lt;br /&gt;
| image1    = {{#display_map:39.75224,-121.79213|zoom=100|layers=OpenStreetMap}} &lt;br /&gt;
&lt;br /&gt;
| alt1      = Chico Map&lt;br /&gt;
&lt;br /&gt;
| image2    = [[file:Condo beach.jpg]]&lt;br /&gt;
| width     =450&lt;br /&gt;
| alt2      = Beach at the condo&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Note that the marker is just &amp;quot;close&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The mailing address is: &lt;br /&gt;
&lt;br /&gt;
 The Maceys&lt;br /&gt;
 2580 California Park Dr #223&lt;br /&gt;
 Chico, CA 95928-4213&lt;br /&gt;
&lt;br /&gt;
WiFi quick connect:&lt;br /&gt;
&lt;br /&gt;
[[File:Macey WiFi-1024.jpeg | 150px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gym code: 25-80-17 (enter)&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
==[[Chico Apartment|Chico Apartment Details]]==&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
&lt;br /&gt;
==[[The Weekly Task List|What Lynn should be working on by day]]==&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
&lt;br /&gt;
= The House =&lt;br /&gt;
Josh and Anna&#039;s house is on the north end of town, here:&lt;br /&gt;
&lt;br /&gt;
{{#display_map:3163 Burnt Ranch Way, chico, CA&lt;br /&gt;
||width=450|height=500|zoom=100| layers=OpenStreetMap&lt;br /&gt;
}}&lt;br /&gt;
Note that the marker is just &amp;quot;close&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The mailing address is:&lt;br /&gt;
&lt;br /&gt;
 Josh &amp;amp; Anna Macey&lt;br /&gt;
 3163 Sawyers Bar Ln&lt;br /&gt;
 Chico, CA 95973&lt;br /&gt;
&lt;br /&gt;
[[Chico House|Chico House Details]]&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Module:Multiple_image&amp;diff=1548</id>
		<title>Module:Multiple image</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Module:Multiple_image&amp;diff=1548"/>
		<updated>2026-08-18T01:26:37Z</updated>

		<summary type="html">&lt;p&gt;Lynn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- implements [[template:multiple image]]&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local autoscaledimages&lt;br /&gt;
local nonautoscaledimages&lt;br /&gt;
&lt;br /&gt;
local function isnotempty(s)&lt;br /&gt;
	return s and s:match( &#039;^%s*(.-)%s*$&#039; ) ~= &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function removepx(s)&lt;br /&gt;
	return tostring(s or &#039;&#039;):match(&#039;^(.*)[Pp][Xx]%s*$&#039;) or s&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getdimensions(s, w, h)&lt;br /&gt;
	if tonumber(w) and tonumber(h) then&lt;br /&gt;
		nonautoscaledimages = true&lt;br /&gt;
		return tonumber(w), tonumber(h)&lt;br /&gt;
	end&lt;br /&gt;
	local file = s and mw.title.new(&#039;File:&#039; .. mw.uri.decode(mw.ustring.gsub(s,&#039;%|.*$&#039;,&#039;&#039;), &#039;WIKI&#039;))&lt;br /&gt;
	file = file and file.file or {width = 0, height = 0}&lt;br /&gt;
	w = tonumber(file.width) or 0&lt;br /&gt;
	h = tonumber(file.height) or 0&lt;br /&gt;
	autoscaledimages = true&lt;br /&gt;
	return w, h&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderImageCell(image, width, height, link, alt, thumbtime, caption, textalign, istyle)&lt;br /&gt;
	local root = mw.html.create(&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
	local altstr = &#039;|alt=&#039; .. (alt or &#039;&#039;)&lt;br /&gt;
	local linkstr = link and (&#039;|link=&#039; .. link) or &#039;&#039;&lt;br /&gt;
	local widthstr = &#039;|&#039; .. tostring(width) .. &#039;px&#039;&lt;br /&gt;
	local thumbtimestr = &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	if isnotempty( thumbtime ) then&lt;br /&gt;
		thumbtimestr = &#039;|thumbtime=&#039; .. thumbtime&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local imagediv = root:tag(&#039;div&#039;)&lt;br /&gt;
	imagediv:addClass(&#039;thumbimage&#039;)&lt;br /&gt;
	imagediv:cssText(istyle)&lt;br /&gt;
	if( height ) then&lt;br /&gt;
		imagediv:css(&#039;height&#039;, tostring(height) .. &#039;px&#039;)&lt;br /&gt;
		imagediv:css(&#039;overflow&#039;, &#039;hidden&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	imagediv:wikitext(&#039;[[file:&#039; .. image .. widthstr .. linkstr .. altstr .. thumbtimestr .. &#039;]]&#039;)&lt;br /&gt;
	if isnotempty(caption) then&lt;br /&gt;
		local captiondiv = root:tag(&#039;div&#039;)&lt;br /&gt;
		captiondiv:addClass(&#039;thumbcaption&#039;)&lt;br /&gt;
		if isnotempty(textalign) then&lt;br /&gt;
			captiondiv:addClass(&#039;text-align-&#039; .. textalign)&lt;br /&gt;
		end&lt;br /&gt;
		captiondiv:wikitext(caption)&lt;br /&gt;
	end&lt;br /&gt;
	return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getWidth(w1, w2)&lt;br /&gt;
	local w&lt;br /&gt;
	if isnotempty(w1) then&lt;br /&gt;
		w = tonumber(w1)&lt;br /&gt;
	elseif isnotempty(w2) then&lt;br /&gt;
		w = tonumber(w2)&lt;br /&gt;
	end&lt;br /&gt;
	return w or 200&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getPerRow(pstr, ic)&lt;br /&gt;
	-- split string into array using any non-digit as a dilimiter&lt;br /&gt;
	local pr = mw.text.split(pstr or &#039;&#039;, &#039;[^%d][^%d]*&#039;)&lt;br /&gt;
	-- if split failed, assume a single row&lt;br /&gt;
	if (#pr &amp;lt; 1) then&lt;br /&gt;
		pr = {tostring(ic)}&lt;br /&gt;
	end&lt;br /&gt;
	-- convert the array of strings to an array of numbers,&lt;br /&gt;
	-- adding any implied/missing numbers at the end of the array&lt;br /&gt;
	local r = 1&lt;br /&gt;
	local thisrow = tonumber(pr[1] or ic) or ic&lt;br /&gt;
	local prownum = {}&lt;br /&gt;
	while( ic &amp;gt; 0 ) do&lt;br /&gt;
		prownum[r] = thisrow&lt;br /&gt;
		ic = ic - thisrow&lt;br /&gt;
		r = r + 1&lt;br /&gt;
		-- use the previous if the next is missing and&lt;br /&gt;
		-- make sure we don&#039;t overstep the number of images&lt;br /&gt;
		thisrow = math.min(tonumber(pr[r] or thisrow) or ic, ic)&lt;br /&gt;
	end&lt;br /&gt;
	return prownum&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMultipleImages(frame)&lt;br /&gt;
	local pargs = frame:getParent().args&lt;br /&gt;
	local args = frame.args&lt;br /&gt;
	local width = removepx(pargs[&#039;width&#039;] or &#039;&#039;)&lt;br /&gt;
	local dir = pargs[&#039;direction&#039;] or &#039;&#039;&lt;br /&gt;
	local border = pargs[&#039;border&#039;] or args[&#039;border&#039;] or &#039;&#039;&lt;br /&gt;
	local align = pargs[&#039;align&#039;] or args[&#039;align&#039;] or (border == &#039;infobox&#039; and &#039;center&#039; or &#039;&#039;)&lt;br /&gt;
	local capalign = pargs[&#039;caption_align&#039;] or args[&#039;caption_align&#039;] or &#039;&#039;&lt;br /&gt;
	local totalwidth = removepx(pargs[&#039;total_width&#039;] or args[&#039;total_width&#039;] or &#039;&#039;)&lt;br /&gt;
	local imgstyle = pargs[&#039;image_style&#039;] or args[&#039;image_style&#039;]&lt;br /&gt;
	local header = pargs[&#039;header&#039;] or pargs[&#039;title&#039;] or &#039;&#039;&lt;br /&gt;
	local footer = pargs[&#039;footer&#039;] or &#039;&#039;&lt;br /&gt;
	local imagegap = tonumber(pargs[&#039;image_gap&#039;] or &#039;1&#039;) or 1&lt;br /&gt;
	local perrow = nil&lt;br /&gt;
	local thumbclass = {&lt;br /&gt;
		[&amp;quot;left&amp;quot;] = &#039;tleft&#039;,&lt;br /&gt;
		[&amp;quot;none&amp;quot;] = &#039;tnone&#039;,&lt;br /&gt;
		[&amp;quot;center&amp;quot;] = &#039;tnone&#039;,&lt;br /&gt;
		[&amp;quot;centre&amp;quot;] = &#039;tnone&#039;,&lt;br /&gt;
		[&amp;quot;right&amp;quot;] = &#039;tright&#039;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	-- find all the nonempty images&lt;br /&gt;
	local imagenumbers = {}&lt;br /&gt;
	local imagecount = 0&lt;br /&gt;
	for k, v in pairs( pargs ) do&lt;br /&gt;
		local i = tonumber(tostring(k):match( &#039;^%s*image([%d]+)%s*$&#039; ) or &#039;0&#039;)&lt;br /&gt;
		if( i &amp;gt; 0 and isnotempty(v) ) then&lt;br /&gt;
			table.insert( imagenumbers, i)&lt;br /&gt;
			imagecount = imagecount + 1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- sort the imagenumbers&lt;br /&gt;
	table.sort(imagenumbers)&lt;br /&gt;
&lt;br /&gt;
	-- create an array with the number of images per row&lt;br /&gt;
	perrow = getPerRow(dir == &#039;vertical&#039; and &#039;1&#039; or pargs[&#039;perrow&#039;], imagecount)&lt;br /&gt;
&lt;br /&gt;
	-- compute the number of rows&lt;br /&gt;
	local rowcount = #perrow&lt;br /&gt;
&lt;br /&gt;
	-- store the image widths and compute row widths and maximum row width&lt;br /&gt;
	local heights = {}&lt;br /&gt;
	local widths = {}&lt;br /&gt;
	local widthmax = 0&lt;br /&gt;
	local widthsum = {}&lt;br /&gt;
	local k = 0&lt;br /&gt;
	for r=1,rowcount do&lt;br /&gt;
		widthsum[r] = 0&lt;br /&gt;
		for c=1,perrow[r] do&lt;br /&gt;
			k = k + 1&lt;br /&gt;
			if( k &amp;lt;= imagecount ) then&lt;br /&gt;
				local i = imagenumbers[k]&lt;br /&gt;
				if( isnotempty(totalwidth) ) then&lt;br /&gt;
					l, m = string.find(pargs[&#039;image&#039; .. i], &amp;quot;[[file:&amp;quot;)&lt;br /&gt;
					if (l == 1) then&lt;br /&gt;
						pargs[&#039;image&#039; .. i] = string.sub(pargs[&#039;image&#039; .. i], m + 1, len(pargs[&#039;image&#039; .. i]) - 2)&lt;br /&gt;
					end&lt;br /&gt;
					widths[k], heights[k] = getdimensions(pargs[&#039;image&#039; .. i], pargs[&#039;width&#039; .. i], pargs[&#039;height&#039; .. i])&lt;br /&gt;
				else&lt;br /&gt;
					widths[k] = getWidth(width, pargs[&#039;width&#039; .. i])&lt;br /&gt;
				end&lt;br /&gt;
				widthsum[r] = widthsum[r] + widths[k]&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		widthmax = math.max(widthmax, widthsum[r])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- make sure the gap is non-negative&lt;br /&gt;
	if imagegap &amp;lt; 0 then imagegap = 0 end&lt;br /&gt;
&lt;br /&gt;
	-- if total_width has been specified, rescale the image widths&lt;br /&gt;
	if( isnotempty(totalwidth) ) then&lt;br /&gt;
		totalwidth = tonumber(totalwidth)&lt;br /&gt;
		widthmax = 0&lt;br /&gt;
		local k = 0&lt;br /&gt;
		for r=1,rowcount do&lt;br /&gt;
			local koffset = k&lt;br /&gt;
			local tw = totalwidth - (3 + imagegap) * (perrow[r] - 1) - 12&lt;br /&gt;
			local ar = {}&lt;br /&gt;
			local arsum = 0&lt;br /&gt;
			for j=1,perrow[r] do&lt;br /&gt;
				k = k + 1&lt;br /&gt;
				if( k&amp;lt;= imagecount ) then&lt;br /&gt;
					local i = imagenumbers[k]&lt;br /&gt;
					local h = heights[k] or 0&lt;br /&gt;
					if (h &amp;gt; 0) then&lt;br /&gt;
						ar[j] = widths[k]/h&lt;br /&gt;
						heights[k] = h&lt;br /&gt;
					else&lt;br /&gt;
						ar[j] = widths[k]/100&lt;br /&gt;
					end&lt;br /&gt;
					arsum = arsum + ar[j]&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			local ht = tw/arsum&lt;br /&gt;
			local ws = 0&lt;br /&gt;
			k = koffset&lt;br /&gt;
			for j=1,perrow[r] do&lt;br /&gt;
				k = k + 1&lt;br /&gt;
				if( k&amp;lt;= imagecount ) then&lt;br /&gt;
					local i = imagenumbers[k]&lt;br /&gt;
					widths[k] = math.floor(ar[j]*ht + 0.5)&lt;br /&gt;
					ws = ws + widths[k]&lt;br /&gt;
					if heights[k] then&lt;br /&gt;
						heights[k] = math.floor(ht)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			widthsum[r] = ws&lt;br /&gt;
			widthmax = math.max(widthmax, widthsum[r])&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- start building the array of images, if there are images&lt;br /&gt;
	if( imagecount &amp;gt; 0 ) then&lt;br /&gt;
		-- compute width of outer div&lt;br /&gt;
		local bodywidth = 0&lt;br /&gt;
		for r=1,rowcount do&lt;br /&gt;
			if( widthmax == widthsum[r] ) then&lt;br /&gt;
				bodywidth = widthmax + (3 + imagegap) * (perrow[r] - 1) + 12&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		-- The body has a min-width of 100, which needs to be taken into account on specific widths&lt;br /&gt;
		bodywidth = math.max( 100, bodywidth - 8);&lt;br /&gt;
&lt;br /&gt;
		local bg = pargs[&#039;background color&#039;] or &#039;&#039;&lt;br /&gt;
		-- create the array of images&lt;br /&gt;
		local root = mw.html.create(&#039;div&#039;)&lt;br /&gt;
		root:addClass(&#039;thumb&#039;)&lt;br /&gt;
		root:addClass(&#039;tmulti&#039;)&lt;br /&gt;
		-- root:addClass(&#039;tmulti-sandbox&#039;)&lt;br /&gt;
		root:addClass(thumbclass[align] or &#039;tright&#039;)&lt;br /&gt;
&lt;br /&gt;
		if( align == &#039;center&#039; or align == &#039;centre&#039; ) then&lt;br /&gt;
			root:addClass(&#039;center&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		if( bg ~= &#039;&#039; ) then&lt;br /&gt;
			root:css(&#039;background-color&#039;, bg)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local div = root:tag(&#039;div&#039;)&lt;br /&gt;
		div:addClass(&#039;thumbinner&#039;)&lt;br /&gt;
		div:css(&#039;width&#039;, tostring(bodywidth) .. &#039;px&#039;)&lt;br /&gt;
			:css(&#039;max-width&#039;, tostring(bodywidth) .. &#039;px&#039;)&lt;br /&gt;
		if( bg ~= &#039;&#039; ) then&lt;br /&gt;
			div:css(&#039;background-color&#039;, bg)&lt;br /&gt;
		end&lt;br /&gt;
		if( border == &#039;infobox&#039; or border == &#039;none&#039;) then&lt;br /&gt;
			div:css(&#039;border&#039;, &#039;none&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		-- add the header&lt;br /&gt;
		if( isnotempty(header) ) then&lt;br /&gt;
			div:tag(&#039;div&#039;)&lt;br /&gt;
				:addClass(&#039;trow&#039;)&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					:addClass(&#039;theader&#039;)&lt;br /&gt;
					:css(&#039;text-align&#039;, pargs[&#039;header_align&#039;])&lt;br /&gt;
					:css(&#039;background-color&#039;, pargs[&#039;header_background&#039;])&lt;br /&gt;
					:wikitext(header)&lt;br /&gt;
		end&lt;br /&gt;
		-- loop through the images&lt;br /&gt;
		local k = 0&lt;br /&gt;
		for r=1,rowcount do&lt;br /&gt;
			local rowdiv = div:tag(&#039;div&#039;):addClass(&#039;trow&#039;);&lt;br /&gt;
			for j=1,perrow[r] do&lt;br /&gt;
				k = k + 1&lt;br /&gt;
				if( k &amp;lt;= imagecount ) then&lt;br /&gt;
					local imagediv = rowdiv:tag(&#039;div&#039;)&lt;br /&gt;
					imagediv:addClass(&#039;tsingle&#039;)&lt;br /&gt;
					if bg ~= &#039;&#039; then&lt;br /&gt;
						imagediv:css(&#039;background-color&#039;, bg);&lt;br /&gt;
					end&lt;br /&gt;
					if ((imagegap &amp;gt; 1) and (j &amp;lt; perrow[r])) then&lt;br /&gt;
						imagediv:css(&#039;margin-right&#039;, tostring(imagegap) .. &#039;px&#039;)&lt;br /&gt;
					end&lt;br /&gt;
					local i = imagenumbers[k]&lt;br /&gt;
					local img = pargs[&#039;image&#039; .. i]&lt;br /&gt;
					local w = widths[k]&lt;br /&gt;
					imagediv:css(&#039;width&#039;, tostring(2 + w) .. &#039;px&#039;)&lt;br /&gt;
						:css(&#039;max-width&#039;, tostring(2 + w) .. &#039;px&#039;)&lt;br /&gt;
					imagediv:wikitext(renderImageCell(img, w, heights[k],&lt;br /&gt;
						pargs[&#039;link&#039; .. i], pargs[&#039;alt&#039; .. i],&lt;br /&gt;
						pargs[&#039;thumbtime&#039; .. i], pargs[&#039;caption&#039; .. i], capalign, imgstyle))&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		-- add the footer&lt;br /&gt;
		if( isnotempty(footer) ) then&lt;br /&gt;
			local falign = string.lower(pargs[&#039;footer_align&#039;] or args[&#039;footer_align&#039;] or &#039;left&#039;)&lt;br /&gt;
			falign = (falign == &#039;centre&#039;) and &#039;center&#039; or falign&lt;br /&gt;
			div:tag(&#039;div&#039;)&lt;br /&gt;
				:addClass(&#039;trow&#039;)&lt;br /&gt;
				:css(&#039;display&#039;, (falign ~= &#039;left&#039;) and &#039;flow-root&#039; or &#039;flex&#039;)&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					:addClass(&#039;thumbcaption&#039;)&lt;br /&gt;
					:css(&#039;text-align&#039;, (falign ~= &#039;left&#039;) and falign or nil)&lt;br /&gt;
					:css(&#039;background-color&#039;, pargs[&#039;footer_background&#039;])&lt;br /&gt;
					:wikitext(footer)&lt;br /&gt;
		end&lt;br /&gt;
		return tostring(root)&lt;br /&gt;
	end&lt;br /&gt;
	return &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.render( frame )&lt;br /&gt;
	autoscaledimages = false&lt;br /&gt;
	nonautoscaledimages = false&lt;br /&gt;
&lt;br /&gt;
	return frame:extensionTag {name = &#039;templatestyles&#039;, args = {src = &#039;Multiple image/styles.css&#039;, wrapper = &amp;quot;.tmulti&amp;quot;}}&lt;br /&gt;
		.. renderMultipleImages( frame )&lt;br /&gt;
		.. (autoscaledimages and &#039;[[Category:Pages using multiple image with auto scaled images]]&#039; or &#039;&#039;)&lt;br /&gt;
		.. (nonautoscaledimages and &#039;[[Category:Pages using multiple image with manual scaled images]]&#039; or &#039;&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Module:Multiple_image&amp;diff=1547</id>
		<title>Module:Multiple image</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Module:Multiple_image&amp;diff=1547"/>
		<updated>2026-08-18T01:21:31Z</updated>

		<summary type="html">&lt;p&gt;Lynn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- implements [[template:multiple image]]&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local autoscaledimages&lt;br /&gt;
local nonautoscaledimages&lt;br /&gt;
&lt;br /&gt;
local function isnotempty(s)&lt;br /&gt;
	return s and s:match( &#039;^%s*(.-)%s*$&#039; ) ~= &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function removepx(s)&lt;br /&gt;
	return tostring(s or &#039;&#039;):match(&#039;^(.*)[Pp][Xx]%s*$&#039;) or s&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getdimensions(s, w, h)&lt;br /&gt;
	if tonumber(w) and tonumber(h) then&lt;br /&gt;
		nonautoscaledimages = true&lt;br /&gt;
		return tonumber(w), tonumber(h)&lt;br /&gt;
	end&lt;br /&gt;
	local file = s and mw.title.new(&#039;File:&#039; .. mw.uri.decode(mw.ustring.gsub(s,&#039;%|.*$&#039;,&#039;&#039;), &#039;WIKI&#039;))&lt;br /&gt;
	file = file and file.file or {width = 0, height = 0}&lt;br /&gt;
	w = tonumber(file.width) or 0&lt;br /&gt;
	h = tonumber(file.height) or 0&lt;br /&gt;
	autoscaledimages = true&lt;br /&gt;
	return w, h&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderImageCell(image, width, height, link, alt, thumbtime, caption, textalign, istyle)&lt;br /&gt;
	local root = mw.html.create(&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
	local altstr = &#039;|alt=&#039; .. (alt or &#039;&#039;)&lt;br /&gt;
	local linkstr = link and (&#039;|link=&#039; .. link) or &#039;&#039;&lt;br /&gt;
	local widthstr = &#039;|&#039; .. tostring(width) .. &#039;px&#039;&lt;br /&gt;
	local thumbtimestr = &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	if isnotempty( thumbtime ) then&lt;br /&gt;
		thumbtimestr = &#039;|thumbtime=&#039; .. thumbtime&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local imagediv = root:tag(&#039;div&#039;)&lt;br /&gt;
	imagediv:addClass(&#039;thumbimage&#039;)&lt;br /&gt;
	imagediv:cssText(istyle)&lt;br /&gt;
	if( height ) then&lt;br /&gt;
		imagediv:css(&#039;height&#039;, tostring(height) .. &#039;px&#039;)&lt;br /&gt;
		imagediv:css(&#039;overflow&#039;, &#039;hidden&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	imagediv:wikitext(&#039;[[file:&#039; .. image .. widthstr .. linkstr .. altstr .. thumbtimestr .. &#039;]]&#039;)&lt;br /&gt;
	if isnotempty(caption) then&lt;br /&gt;
		local captiondiv = root:tag(&#039;div&#039;)&lt;br /&gt;
		captiondiv:addClass(&#039;thumbcaption&#039;)&lt;br /&gt;
		if isnotempty(textalign) then&lt;br /&gt;
			captiondiv:addClass(&#039;text-align-&#039; .. textalign)&lt;br /&gt;
		end&lt;br /&gt;
		captiondiv:wikitext(caption)&lt;br /&gt;
	end&lt;br /&gt;
	return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getWidth(w1, w2)&lt;br /&gt;
	local w&lt;br /&gt;
	if isnotempty(w1) then&lt;br /&gt;
		w = tonumber(w1)&lt;br /&gt;
	elseif isnotempty(w2) then&lt;br /&gt;
		w = tonumber(w2)&lt;br /&gt;
	end&lt;br /&gt;
	return w or 200&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getPerRow(pstr, ic)&lt;br /&gt;
	-- split string into array using any non-digit as a dilimiter&lt;br /&gt;
	local pr = mw.text.split(pstr or &#039;&#039;, &#039;[^%d][^%d]*&#039;)&lt;br /&gt;
	-- if split failed, assume a single row&lt;br /&gt;
	if (#pr &amp;lt; 1) then&lt;br /&gt;
		pr = {tostring(ic)}&lt;br /&gt;
	end&lt;br /&gt;
	-- convert the array of strings to an array of numbers,&lt;br /&gt;
	-- adding any implied/missing numbers at the end of the array&lt;br /&gt;
	local r = 1&lt;br /&gt;
	local thisrow = tonumber(pr[1] or ic) or ic&lt;br /&gt;
	local prownum = {}&lt;br /&gt;
	while( ic &amp;gt; 0 ) do&lt;br /&gt;
		prownum[r] = thisrow&lt;br /&gt;
		ic = ic - thisrow&lt;br /&gt;
		r = r + 1&lt;br /&gt;
		-- use the previous if the next is missing and&lt;br /&gt;
		-- make sure we don&#039;t overstep the number of images&lt;br /&gt;
		thisrow = math.min(tonumber(pr[r] or thisrow) or ic, ic)&lt;br /&gt;
	end&lt;br /&gt;
	return prownum&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMultipleImages(frame)&lt;br /&gt;
	local pargs = frame:getParent().args&lt;br /&gt;
	local args = frame.args&lt;br /&gt;
	local width = removepx(pargs[&#039;width&#039;] or &#039;&#039;)&lt;br /&gt;
	local dir = pargs[&#039;direction&#039;] or &#039;&#039;&lt;br /&gt;
	local border = pargs[&#039;border&#039;] or args[&#039;border&#039;] or &#039;&#039;&lt;br /&gt;
	local align = pargs[&#039;align&#039;] or args[&#039;align&#039;] or (border == &#039;infobox&#039; and &#039;center&#039; or &#039;&#039;)&lt;br /&gt;
	local capalign = pargs[&#039;caption_align&#039;] or args[&#039;caption_align&#039;] or &#039;&#039;&lt;br /&gt;
	local totalwidth = removepx(pargs[&#039;total_width&#039;] or args[&#039;total_width&#039;] or &#039;&#039;)&lt;br /&gt;
	local imgstyle = pargs[&#039;image_style&#039;] or args[&#039;image_style&#039;]&lt;br /&gt;
	local header = pargs[&#039;header&#039;] or pargs[&#039;title&#039;] or &#039;&#039;&lt;br /&gt;
	local footer = pargs[&#039;footer&#039;] or &#039;&#039;&lt;br /&gt;
	local imagegap = tonumber(pargs[&#039;image_gap&#039;] or &#039;1&#039;) or 1&lt;br /&gt;
	local perrow = nil&lt;br /&gt;
	local thumbclass = {&lt;br /&gt;
		[&amp;quot;left&amp;quot;] = &#039;tleft&#039;,&lt;br /&gt;
		[&amp;quot;none&amp;quot;] = &#039;tnone&#039;,&lt;br /&gt;
		[&amp;quot;center&amp;quot;] = &#039;tnone&#039;,&lt;br /&gt;
		[&amp;quot;centre&amp;quot;] = &#039;tnone&#039;,&lt;br /&gt;
		[&amp;quot;right&amp;quot;] = &#039;tright&#039;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	-- find all the nonempty images&lt;br /&gt;
	local imagenumbers = {}&lt;br /&gt;
	local imagecount = 0&lt;br /&gt;
	for k, v in pairs( pargs ) do&lt;br /&gt;
		local i = tonumber(tostring(k):match( &#039;^%s*image([%d]+)%s*$&#039; ) or &#039;0&#039;)&lt;br /&gt;
		if( i &amp;gt; 0 and isnotempty(v) ) then&lt;br /&gt;
			table.insert( imagenumbers, i)&lt;br /&gt;
			imagecount = imagecount + 1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- sort the imagenumbers&lt;br /&gt;
	table.sort(imagenumbers)&lt;br /&gt;
&lt;br /&gt;
	-- create an array with the number of images per row&lt;br /&gt;
	perrow = getPerRow(dir == &#039;vertical&#039; and &#039;1&#039; or pargs[&#039;perrow&#039;], imagecount)&lt;br /&gt;
&lt;br /&gt;
	-- compute the number of rows&lt;br /&gt;
	local rowcount = #perrow&lt;br /&gt;
&lt;br /&gt;
	-- store the image widths and compute row widths and maximum row width&lt;br /&gt;
	local heights = {}&lt;br /&gt;
	local widths = {}&lt;br /&gt;
	local widthmax = 0&lt;br /&gt;
	local widthsum = {}&lt;br /&gt;
	local k = 0&lt;br /&gt;
	for r=1,rowcount do&lt;br /&gt;
		widthsum[r] = 0&lt;br /&gt;
		for c=1,perrow[r] do&lt;br /&gt;
			k = k + 1&lt;br /&gt;
			if( k &amp;lt;= imagecount ) then&lt;br /&gt;
				local i = imagenumbers[k]&lt;br /&gt;
				if( isnotempty(totalwidth) ) then&lt;br /&gt;
					l, m = string.find(pargs[&#039;image&#039; .. i], &amp;quot;[[file:&amp;quot;)&lt;br /&gt;
					if (l == 1) then&lt;br /&gt;
						pargs[&#039;image&#039; .. i] = string.sub(pargs[&#039;image&#039; .. i], m, len(pargs[&#039;image&#039; .. i]) - 2)&lt;br /&gt;
					end&lt;br /&gt;
					widths[k], heights[k] = getdimensions(pargs[&#039;image&#039; .. i], pargs[&#039;width&#039; .. i], pargs[&#039;height&#039; .. i])&lt;br /&gt;
				else&lt;br /&gt;
					widths[k] = getWidth(width, pargs[&#039;width&#039; .. i])&lt;br /&gt;
				end&lt;br /&gt;
				widthsum[r] = widthsum[r] + widths[k]&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		widthmax = math.max(widthmax, widthsum[r])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- make sure the gap is non-negative&lt;br /&gt;
	if imagegap &amp;lt; 0 then imagegap = 0 end&lt;br /&gt;
&lt;br /&gt;
	-- if total_width has been specified, rescale the image widths&lt;br /&gt;
	if( isnotempty(totalwidth) ) then&lt;br /&gt;
		totalwidth = tonumber(totalwidth)&lt;br /&gt;
		widthmax = 0&lt;br /&gt;
		local k = 0&lt;br /&gt;
		for r=1,rowcount do&lt;br /&gt;
			local koffset = k&lt;br /&gt;
			local tw = totalwidth - (3 + imagegap) * (perrow[r] - 1) - 12&lt;br /&gt;
			local ar = {}&lt;br /&gt;
			local arsum = 0&lt;br /&gt;
			for j=1,perrow[r] do&lt;br /&gt;
				k = k + 1&lt;br /&gt;
				if( k&amp;lt;= imagecount ) then&lt;br /&gt;
					local i = imagenumbers[k]&lt;br /&gt;
					local h = heights[k] or 0&lt;br /&gt;
					if (h &amp;gt; 0) then&lt;br /&gt;
						ar[j] = widths[k]/h&lt;br /&gt;
						heights[k] = h&lt;br /&gt;
					else&lt;br /&gt;
						ar[j] = widths[k]/100&lt;br /&gt;
					end&lt;br /&gt;
					arsum = arsum + ar[j]&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			local ht = tw/arsum&lt;br /&gt;
			local ws = 0&lt;br /&gt;
			k = koffset&lt;br /&gt;
			for j=1,perrow[r] do&lt;br /&gt;
				k = k + 1&lt;br /&gt;
				if( k&amp;lt;= imagecount ) then&lt;br /&gt;
					local i = imagenumbers[k]&lt;br /&gt;
					widths[k] = math.floor(ar[j]*ht + 0.5)&lt;br /&gt;
					ws = ws + widths[k]&lt;br /&gt;
					if heights[k] then&lt;br /&gt;
						heights[k] = math.floor(ht)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			widthsum[r] = ws&lt;br /&gt;
			widthmax = math.max(widthmax, widthsum[r])&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- start building the array of images, if there are images&lt;br /&gt;
	if( imagecount &amp;gt; 0 ) then&lt;br /&gt;
		-- compute width of outer div&lt;br /&gt;
		local bodywidth = 0&lt;br /&gt;
		for r=1,rowcount do&lt;br /&gt;
			if( widthmax == widthsum[r] ) then&lt;br /&gt;
				bodywidth = widthmax + (3 + imagegap) * (perrow[r] - 1) + 12&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		-- The body has a min-width of 100, which needs to be taken into account on specific widths&lt;br /&gt;
		bodywidth = math.max( 100, bodywidth - 8);&lt;br /&gt;
&lt;br /&gt;
		local bg = pargs[&#039;background color&#039;] or &#039;&#039;&lt;br /&gt;
		-- create the array of images&lt;br /&gt;
		local root = mw.html.create(&#039;div&#039;)&lt;br /&gt;
		root:addClass(&#039;thumb&#039;)&lt;br /&gt;
		root:addClass(&#039;tmulti&#039;)&lt;br /&gt;
		-- root:addClass(&#039;tmulti-sandbox&#039;)&lt;br /&gt;
		root:addClass(thumbclass[align] or &#039;tright&#039;)&lt;br /&gt;
&lt;br /&gt;
		if( align == &#039;center&#039; or align == &#039;centre&#039; ) then&lt;br /&gt;
			root:addClass(&#039;center&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		if( bg ~= &#039;&#039; ) then&lt;br /&gt;
			root:css(&#039;background-color&#039;, bg)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local div = root:tag(&#039;div&#039;)&lt;br /&gt;
		div:addClass(&#039;thumbinner&#039;)&lt;br /&gt;
		div:css(&#039;width&#039;, tostring(bodywidth) .. &#039;px&#039;)&lt;br /&gt;
			:css(&#039;max-width&#039;, tostring(bodywidth) .. &#039;px&#039;)&lt;br /&gt;
		if( bg ~= &#039;&#039; ) then&lt;br /&gt;
			div:css(&#039;background-color&#039;, bg)&lt;br /&gt;
		end&lt;br /&gt;
		if( border == &#039;infobox&#039; or border == &#039;none&#039;) then&lt;br /&gt;
			div:css(&#039;border&#039;, &#039;none&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		-- add the header&lt;br /&gt;
		if( isnotempty(header) ) then&lt;br /&gt;
			div:tag(&#039;div&#039;)&lt;br /&gt;
				:addClass(&#039;trow&#039;)&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					:addClass(&#039;theader&#039;)&lt;br /&gt;
					:css(&#039;text-align&#039;, pargs[&#039;header_align&#039;])&lt;br /&gt;
					:css(&#039;background-color&#039;, pargs[&#039;header_background&#039;])&lt;br /&gt;
					:wikitext(header)&lt;br /&gt;
		end&lt;br /&gt;
		-- loop through the images&lt;br /&gt;
		local k = 0&lt;br /&gt;
		for r=1,rowcount do&lt;br /&gt;
			local rowdiv = div:tag(&#039;div&#039;):addClass(&#039;trow&#039;);&lt;br /&gt;
			for j=1,perrow[r] do&lt;br /&gt;
				k = k + 1&lt;br /&gt;
				if( k &amp;lt;= imagecount ) then&lt;br /&gt;
					local imagediv = rowdiv:tag(&#039;div&#039;)&lt;br /&gt;
					imagediv:addClass(&#039;tsingle&#039;)&lt;br /&gt;
					if bg ~= &#039;&#039; then&lt;br /&gt;
						imagediv:css(&#039;background-color&#039;, bg);&lt;br /&gt;
					end&lt;br /&gt;
					if ((imagegap &amp;gt; 1) and (j &amp;lt; perrow[r])) then&lt;br /&gt;
						imagediv:css(&#039;margin-right&#039;, tostring(imagegap) .. &#039;px&#039;)&lt;br /&gt;
					end&lt;br /&gt;
					local i = imagenumbers[k]&lt;br /&gt;
					local img = pargs[&#039;image&#039; .. i]&lt;br /&gt;
					local w = widths[k]&lt;br /&gt;
					imagediv:css(&#039;width&#039;, tostring(2 + w) .. &#039;px&#039;)&lt;br /&gt;
						:css(&#039;max-width&#039;, tostring(2 + w) .. &#039;px&#039;)&lt;br /&gt;
					imagediv:wikitext(renderImageCell(img, w, heights[k],&lt;br /&gt;
						pargs[&#039;link&#039; .. i], pargs[&#039;alt&#039; .. i],&lt;br /&gt;
						pargs[&#039;thumbtime&#039; .. i], pargs[&#039;caption&#039; .. i], capalign, imgstyle))&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		-- add the footer&lt;br /&gt;
		if( isnotempty(footer) ) then&lt;br /&gt;
			local falign = string.lower(pargs[&#039;footer_align&#039;] or args[&#039;footer_align&#039;] or &#039;left&#039;)&lt;br /&gt;
			falign = (falign == &#039;centre&#039;) and &#039;center&#039; or falign&lt;br /&gt;
			div:tag(&#039;div&#039;)&lt;br /&gt;
				:addClass(&#039;trow&#039;)&lt;br /&gt;
				:css(&#039;display&#039;, (falign ~= &#039;left&#039;) and &#039;flow-root&#039; or &#039;flex&#039;)&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					:addClass(&#039;thumbcaption&#039;)&lt;br /&gt;
					:css(&#039;text-align&#039;, (falign ~= &#039;left&#039;) and falign or nil)&lt;br /&gt;
					:css(&#039;background-color&#039;, pargs[&#039;footer_background&#039;])&lt;br /&gt;
					:wikitext(footer)&lt;br /&gt;
		end&lt;br /&gt;
		return tostring(root)&lt;br /&gt;
	end&lt;br /&gt;
	return &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.render( frame )&lt;br /&gt;
	autoscaledimages = false&lt;br /&gt;
	nonautoscaledimages = false&lt;br /&gt;
&lt;br /&gt;
	return frame:extensionTag {name = &#039;templatestyles&#039;, args = {src = &#039;Multiple image/styles.css&#039;, wrapper = &amp;quot;.tmulti&amp;quot;}}&lt;br /&gt;
		.. renderMultipleImages( frame )&lt;br /&gt;
		.. (autoscaledimages and &#039;[[Category:Pages using multiple image with auto scaled images]]&#039; or &#039;&#039;)&lt;br /&gt;
		.. (nonautoscaledimages and &#039;[[Category:Pages using multiple image with manual scaled images]]&#039; or &#039;&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Module:Multiple_image&amp;diff=1546</id>
		<title>Module:Multiple image</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Module:Multiple_image&amp;diff=1546"/>
		<updated>2026-08-18T01:09:40Z</updated>

		<summary type="html">&lt;p&gt;Lynn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- implements [[template:multiple image]]&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local autoscaledimages&lt;br /&gt;
local nonautoscaledimages&lt;br /&gt;
&lt;br /&gt;
local function isnotempty(s)&lt;br /&gt;
	return s and s:match( &#039;^%s*(.-)%s*$&#039; ) ~= &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function removepx(s)&lt;br /&gt;
	return tostring(s or &#039;&#039;):match(&#039;^(.*)[Pp][Xx]%s*$&#039;) or s&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getdimensions(s, w, h)&lt;br /&gt;
	if tonumber(w) and tonumber(h) then&lt;br /&gt;
		nonautoscaledimages = true&lt;br /&gt;
		return tonumber(w), tonumber(h)&lt;br /&gt;
	end&lt;br /&gt;
	local file = s and mw.title.new(&#039;File:&#039; .. mw.uri.decode(mw.ustring.gsub(s,&#039;%|.*$&#039;,&#039;&#039;), &#039;WIKI&#039;))&lt;br /&gt;
	file = file and file.file or {width = 0, height = 0}&lt;br /&gt;
	w = tonumber(file.width) or 0&lt;br /&gt;
	h = tonumber(file.height) or 0&lt;br /&gt;
	autoscaledimages = true&lt;br /&gt;
	return w, h&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderImageCell(image, width, height, link, alt, thumbtime, caption, textalign, istyle)&lt;br /&gt;
	local root = mw.html.create(&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
	local altstr = &#039;|alt=&#039; .. (alt or &#039;&#039;)&lt;br /&gt;
	local linkstr = link and (&#039;|link=&#039; .. link) or &#039;&#039;&lt;br /&gt;
	local widthstr = &#039;|&#039; .. tostring(width) .. &#039;px&#039;&lt;br /&gt;
	local thumbtimestr = &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	if isnotempty( thumbtime ) then&lt;br /&gt;
		thumbtimestr = &#039;|thumbtime=&#039; .. thumbtime&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local imagediv = root:tag(&#039;div&#039;)&lt;br /&gt;
	imagediv:addClass(&#039;thumbimage&#039;)&lt;br /&gt;
	imagediv:cssText(istyle)&lt;br /&gt;
	if( height ) then&lt;br /&gt;
		imagediv:css(&#039;height&#039;, tostring(height) .. &#039;px&#039;)&lt;br /&gt;
		imagediv:css(&#039;overflow&#039;, &#039;hidden&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	imagediv:wikitext(&#039;[[file:&#039; .. image .. widthstr .. linkstr .. altstr .. thumbtimestr .. &#039;]]&#039;)&lt;br /&gt;
	if isnotempty(caption) then&lt;br /&gt;
		local captiondiv = root:tag(&#039;div&#039;)&lt;br /&gt;
		captiondiv:addClass(&#039;thumbcaption&#039;)&lt;br /&gt;
		if isnotempty(textalign) then&lt;br /&gt;
			captiondiv:addClass(&#039;text-align-&#039; .. textalign)&lt;br /&gt;
		end&lt;br /&gt;
		captiondiv:wikitext(caption)&lt;br /&gt;
	end&lt;br /&gt;
	return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getWidth(w1, w2)&lt;br /&gt;
	local w&lt;br /&gt;
	if isnotempty(w1) then&lt;br /&gt;
		w = tonumber(w1)&lt;br /&gt;
	elseif isnotempty(w2) then&lt;br /&gt;
		w = tonumber(w2)&lt;br /&gt;
	end&lt;br /&gt;
	return w or 200&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getPerRow(pstr, ic)&lt;br /&gt;
	-- split string into array using any non-digit as a dilimiter&lt;br /&gt;
	local pr = mw.text.split(pstr or &#039;&#039;, &#039;[^%d][^%d]*&#039;)&lt;br /&gt;
	-- if split failed, assume a single row&lt;br /&gt;
	if (#pr &amp;lt; 1) then&lt;br /&gt;
		pr = {tostring(ic)}&lt;br /&gt;
	end&lt;br /&gt;
	-- convert the array of strings to an array of numbers,&lt;br /&gt;
	-- adding any implied/missing numbers at the end of the array&lt;br /&gt;
	local r = 1&lt;br /&gt;
	local thisrow = tonumber(pr[1] or ic) or ic&lt;br /&gt;
	local prownum = {}&lt;br /&gt;
	while( ic &amp;gt; 0 ) do&lt;br /&gt;
		prownum[r] = thisrow&lt;br /&gt;
		ic = ic - thisrow&lt;br /&gt;
		r = r + 1&lt;br /&gt;
		-- use the previous if the next is missing and&lt;br /&gt;
		-- make sure we don&#039;t overstep the number of images&lt;br /&gt;
		thisrow = math.min(tonumber(pr[r] or thisrow) or ic, ic)&lt;br /&gt;
	end&lt;br /&gt;
	return prownum&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMultipleImages(frame)&lt;br /&gt;
	local pargs = frame:getParent().args&lt;br /&gt;
	local args = frame.args&lt;br /&gt;
	local width = removepx(pargs[&#039;width&#039;] or &#039;&#039;)&lt;br /&gt;
	local dir = pargs[&#039;direction&#039;] or &#039;&#039;&lt;br /&gt;
	local border = pargs[&#039;border&#039;] or args[&#039;border&#039;] or &#039;&#039;&lt;br /&gt;
	local align = pargs[&#039;align&#039;] or args[&#039;align&#039;] or (border == &#039;infobox&#039; and &#039;center&#039; or &#039;&#039;)&lt;br /&gt;
	local capalign = pargs[&#039;caption_align&#039;] or args[&#039;caption_align&#039;] or &#039;&#039;&lt;br /&gt;
	local totalwidth = removepx(pargs[&#039;total_width&#039;] or args[&#039;total_width&#039;] or &#039;&#039;)&lt;br /&gt;
	local imgstyle = pargs[&#039;image_style&#039;] or args[&#039;image_style&#039;]&lt;br /&gt;
	local header = pargs[&#039;header&#039;] or pargs[&#039;title&#039;] or &#039;&#039;&lt;br /&gt;
	local footer = pargs[&#039;footer&#039;] or &#039;&#039;&lt;br /&gt;
	local imagegap = tonumber(pargs[&#039;image_gap&#039;] or &#039;1&#039;) or 1&lt;br /&gt;
	local perrow = nil&lt;br /&gt;
	local thumbclass = {&lt;br /&gt;
		[&amp;quot;left&amp;quot;] = &#039;tleft&#039;,&lt;br /&gt;
		[&amp;quot;none&amp;quot;] = &#039;tnone&#039;,&lt;br /&gt;
		[&amp;quot;center&amp;quot;] = &#039;tnone&#039;,&lt;br /&gt;
		[&amp;quot;centre&amp;quot;] = &#039;tnone&#039;,&lt;br /&gt;
		[&amp;quot;right&amp;quot;] = &#039;tright&#039;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	-- find all the nonempty images&lt;br /&gt;
	local imagenumbers = {}&lt;br /&gt;
	local imagecount = 0&lt;br /&gt;
	for k, v in pairs( pargs ) do&lt;br /&gt;
		local i = tonumber(tostring(k):match( &#039;^%s*image([%d]+)%s*$&#039; ) or &#039;0&#039;)&lt;br /&gt;
		if( i &amp;gt; 0 and isnotempty(v) ) then&lt;br /&gt;
			table.insert( imagenumbers, i)&lt;br /&gt;
			imagecount = imagecount + 1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- sort the imagenumbers&lt;br /&gt;
	table.sort(imagenumbers)&lt;br /&gt;
&lt;br /&gt;
	-- create an array with the number of images per row&lt;br /&gt;
	perrow = getPerRow(dir == &#039;vertical&#039; and &#039;1&#039; or pargs[&#039;perrow&#039;], imagecount)&lt;br /&gt;
&lt;br /&gt;
	-- compute the number of rows&lt;br /&gt;
	local rowcount = #perrow&lt;br /&gt;
&lt;br /&gt;
	-- store the image widths and compute row widths and maximum row width&lt;br /&gt;
	local heights = {}&lt;br /&gt;
	local widths = {}&lt;br /&gt;
	local widthmax = 0&lt;br /&gt;
	local widthsum = {}&lt;br /&gt;
	local k = 0&lt;br /&gt;
	for r=1,rowcount do&lt;br /&gt;
		widthsum[r] = 0&lt;br /&gt;
		for c=1,perrow[r] do&lt;br /&gt;
			k = k + 1&lt;br /&gt;
			if( k &amp;lt;= imagecount ) then&lt;br /&gt;
				local i = imagenumbers[k]&lt;br /&gt;
				if( isnotempty(totalwidth) ) then&lt;br /&gt;
					l, m = string.find(pargs[&#039;image&#039; .. i], &amp;quot;[[file:&amp;quot;)&lt;br /&gt;
					if (l == 1) then&lt;br /&gt;
						pargs[&#039;image&#039; .. i] = string.sub(pargs[&#039;image&#039; .. i], l, len(pargs[&#039;image&#039; .. i]) - 2)&lt;br /&gt;
					end&lt;br /&gt;
					widths[k], heights[k] = getdimensions(pargs[&#039;image&#039; .. i], pargs[&#039;width&#039; .. i], pargs[&#039;height&#039; .. i])&lt;br /&gt;
				else&lt;br /&gt;
					widths[k] = getWidth(width, pargs[&#039;width&#039; .. i])&lt;br /&gt;
				end&lt;br /&gt;
				widthsum[r] = widthsum[r] + widths[k]&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		widthmax = math.max(widthmax, widthsum[r])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- make sure the gap is non-negative&lt;br /&gt;
	if imagegap &amp;lt; 0 then imagegap = 0 end&lt;br /&gt;
&lt;br /&gt;
	-- if total_width has been specified, rescale the image widths&lt;br /&gt;
	if( isnotempty(totalwidth) ) then&lt;br /&gt;
		totalwidth = tonumber(totalwidth)&lt;br /&gt;
		widthmax = 0&lt;br /&gt;
		local k = 0&lt;br /&gt;
		for r=1,rowcount do&lt;br /&gt;
			local koffset = k&lt;br /&gt;
			local tw = totalwidth - (3 + imagegap) * (perrow[r] - 1) - 12&lt;br /&gt;
			local ar = {}&lt;br /&gt;
			local arsum = 0&lt;br /&gt;
			for j=1,perrow[r] do&lt;br /&gt;
				k = k + 1&lt;br /&gt;
				if( k&amp;lt;= imagecount ) then&lt;br /&gt;
					local i = imagenumbers[k]&lt;br /&gt;
					local h = heights[k] or 0&lt;br /&gt;
					if (h &amp;gt; 0) then&lt;br /&gt;
						ar[j] = widths[k]/h&lt;br /&gt;
						heights[k] = h&lt;br /&gt;
					else&lt;br /&gt;
						ar[j] = widths[k]/100&lt;br /&gt;
					end&lt;br /&gt;
					arsum = arsum + ar[j]&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			local ht = tw/arsum&lt;br /&gt;
			local ws = 0&lt;br /&gt;
			k = koffset&lt;br /&gt;
			for j=1,perrow[r] do&lt;br /&gt;
				k = k + 1&lt;br /&gt;
				if( k&amp;lt;= imagecount ) then&lt;br /&gt;
					local i = imagenumbers[k]&lt;br /&gt;
					widths[k] = math.floor(ar[j]*ht + 0.5)&lt;br /&gt;
					ws = ws + widths[k]&lt;br /&gt;
					if heights[k] then&lt;br /&gt;
						heights[k] = math.floor(ht)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			widthsum[r] = ws&lt;br /&gt;
			widthmax = math.max(widthmax, widthsum[r])&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- start building the array of images, if there are images&lt;br /&gt;
	if( imagecount &amp;gt; 0 ) then&lt;br /&gt;
		-- compute width of outer div&lt;br /&gt;
		local bodywidth = 0&lt;br /&gt;
		for r=1,rowcount do&lt;br /&gt;
			if( widthmax == widthsum[r] ) then&lt;br /&gt;
				bodywidth = widthmax + (3 + imagegap) * (perrow[r] - 1) + 12&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		-- The body has a min-width of 100, which needs to be taken into account on specific widths&lt;br /&gt;
		bodywidth = math.max( 100, bodywidth - 8);&lt;br /&gt;
&lt;br /&gt;
		local bg = pargs[&#039;background color&#039;] or &#039;&#039;&lt;br /&gt;
		-- create the array of images&lt;br /&gt;
		local root = mw.html.create(&#039;div&#039;)&lt;br /&gt;
		root:addClass(&#039;thumb&#039;)&lt;br /&gt;
		root:addClass(&#039;tmulti&#039;)&lt;br /&gt;
		-- root:addClass(&#039;tmulti-sandbox&#039;)&lt;br /&gt;
		root:addClass(thumbclass[align] or &#039;tright&#039;)&lt;br /&gt;
&lt;br /&gt;
		if( align == &#039;center&#039; or align == &#039;centre&#039; ) then&lt;br /&gt;
			root:addClass(&#039;center&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		if( bg ~= &#039;&#039; ) then&lt;br /&gt;
			root:css(&#039;background-color&#039;, bg)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local div = root:tag(&#039;div&#039;)&lt;br /&gt;
		div:addClass(&#039;thumbinner&#039;)&lt;br /&gt;
		div:css(&#039;width&#039;, tostring(bodywidth) .. &#039;px&#039;)&lt;br /&gt;
			:css(&#039;max-width&#039;, tostring(bodywidth) .. &#039;px&#039;)&lt;br /&gt;
		if( bg ~= &#039;&#039; ) then&lt;br /&gt;
			div:css(&#039;background-color&#039;, bg)&lt;br /&gt;
		end&lt;br /&gt;
		if( border == &#039;infobox&#039; or border == &#039;none&#039;) then&lt;br /&gt;
			div:css(&#039;border&#039;, &#039;none&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		-- add the header&lt;br /&gt;
		if( isnotempty(header) ) then&lt;br /&gt;
			div:tag(&#039;div&#039;)&lt;br /&gt;
				:addClass(&#039;trow&#039;)&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					:addClass(&#039;theader&#039;)&lt;br /&gt;
					:css(&#039;text-align&#039;, pargs[&#039;header_align&#039;])&lt;br /&gt;
					:css(&#039;background-color&#039;, pargs[&#039;header_background&#039;])&lt;br /&gt;
					:wikitext(header)&lt;br /&gt;
		end&lt;br /&gt;
		-- loop through the images&lt;br /&gt;
		local k = 0&lt;br /&gt;
		for r=1,rowcount do&lt;br /&gt;
			local rowdiv = div:tag(&#039;div&#039;):addClass(&#039;trow&#039;);&lt;br /&gt;
			for j=1,perrow[r] do&lt;br /&gt;
				k = k + 1&lt;br /&gt;
				if( k &amp;lt;= imagecount ) then&lt;br /&gt;
					local imagediv = rowdiv:tag(&#039;div&#039;)&lt;br /&gt;
					imagediv:addClass(&#039;tsingle&#039;)&lt;br /&gt;
					if bg ~= &#039;&#039; then&lt;br /&gt;
						imagediv:css(&#039;background-color&#039;, bg);&lt;br /&gt;
					end&lt;br /&gt;
					if ((imagegap &amp;gt; 1) and (j &amp;lt; perrow[r])) then&lt;br /&gt;
						imagediv:css(&#039;margin-right&#039;, tostring(imagegap) .. &#039;px&#039;)&lt;br /&gt;
					end&lt;br /&gt;
					local i = imagenumbers[k]&lt;br /&gt;
					local img = pargs[&#039;image&#039; .. i]&lt;br /&gt;
					local w = widths[k]&lt;br /&gt;
					imagediv:css(&#039;width&#039;, tostring(2 + w) .. &#039;px&#039;)&lt;br /&gt;
						:css(&#039;max-width&#039;, tostring(2 + w) .. &#039;px&#039;)&lt;br /&gt;
					imagediv:wikitext(renderImageCell(img, w, heights[k],&lt;br /&gt;
						pargs[&#039;link&#039; .. i], pargs[&#039;alt&#039; .. i],&lt;br /&gt;
						pargs[&#039;thumbtime&#039; .. i], pargs[&#039;caption&#039; .. i], capalign, imgstyle))&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		-- add the footer&lt;br /&gt;
		if( isnotempty(footer) ) then&lt;br /&gt;
			local falign = string.lower(pargs[&#039;footer_align&#039;] or args[&#039;footer_align&#039;] or &#039;left&#039;)&lt;br /&gt;
			falign = (falign == &#039;centre&#039;) and &#039;center&#039; or falign&lt;br /&gt;
			div:tag(&#039;div&#039;)&lt;br /&gt;
				:addClass(&#039;trow&#039;)&lt;br /&gt;
				:css(&#039;display&#039;, (falign ~= &#039;left&#039;) and &#039;flow-root&#039; or &#039;flex&#039;)&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					:addClass(&#039;thumbcaption&#039;)&lt;br /&gt;
					:css(&#039;text-align&#039;, (falign ~= &#039;left&#039;) and falign or nil)&lt;br /&gt;
					:css(&#039;background-color&#039;, pargs[&#039;footer_background&#039;])&lt;br /&gt;
					:wikitext(footer)&lt;br /&gt;
		end&lt;br /&gt;
		return tostring(root)&lt;br /&gt;
	end&lt;br /&gt;
	return &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.render( frame )&lt;br /&gt;
	autoscaledimages = false&lt;br /&gt;
	nonautoscaledimages = false&lt;br /&gt;
&lt;br /&gt;
	return frame:extensionTag {name = &#039;templatestyles&#039;, args = {src = &#039;Multiple image/styles.css&#039;, wrapper = &amp;quot;.tmulti&amp;quot;}}&lt;br /&gt;
		.. renderMultipleImages( frame )&lt;br /&gt;
		.. (autoscaledimages and &#039;[[Category:Pages using multiple image with auto scaled images]]&#039; or &#039;&#039;)&lt;br /&gt;
		.. (nonautoscaledimages and &#039;[[Category:Pages using multiple image with manual scaled images]]&#039; or &#039;&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Module:Multiple_image&amp;diff=1545</id>
		<title>Module:Multiple image</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Module:Multiple_image&amp;diff=1545"/>
		<updated>2026-08-18T01:08:51Z</updated>

		<summary type="html">&lt;p&gt;Lynn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- implements [[template:multiple image]]&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local autoscaledimages&lt;br /&gt;
local nonautoscaledimages&lt;br /&gt;
&lt;br /&gt;
local function isnotempty(s)&lt;br /&gt;
	return s and s:match( &#039;^%s*(.-)%s*$&#039; ) ~= &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function removepx(s)&lt;br /&gt;
	return tostring(s or &#039;&#039;):match(&#039;^(.*)[Pp][Xx]%s*$&#039;) or s&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getdimensions(s, w, h)&lt;br /&gt;
	if tonumber(w) and tonumber(h) then&lt;br /&gt;
		nonautoscaledimages = true&lt;br /&gt;
		return tonumber(w), tonumber(h)&lt;br /&gt;
	end&lt;br /&gt;
	local file = s and mw.title.new(&#039;File:&#039; .. mw.uri.decode(mw.ustring.gsub(s,&#039;%|.*$&#039;,&#039;&#039;), &#039;WIKI&#039;))&lt;br /&gt;
	file = file and file.file or {width = 0, height = 0}&lt;br /&gt;
	w = tonumber(file.width) or 0&lt;br /&gt;
	h = tonumber(file.height) or 0&lt;br /&gt;
	autoscaledimages = true&lt;br /&gt;
	return w, h&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderImageCell(image, width, height, link, alt, thumbtime, caption, textalign, istyle)&lt;br /&gt;
	local root = mw.html.create(&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
	local altstr = &#039;|alt=&#039; .. (alt or &#039;&#039;)&lt;br /&gt;
	local linkstr = link and (&#039;|link=&#039; .. link) or &#039;&#039;&lt;br /&gt;
	local widthstr = &#039;|&#039; .. tostring(width) .. &#039;px&#039;&lt;br /&gt;
	local thumbtimestr = &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	if isnotempty( thumbtime ) then&lt;br /&gt;
		thumbtimestr = &#039;|thumbtime=&#039; .. thumbtime&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local imagediv = root:tag(&#039;div&#039;)&lt;br /&gt;
	imagediv:addClass(&#039;thumbimage&#039;)&lt;br /&gt;
	imagediv:cssText(istyle)&lt;br /&gt;
	if( height ) then&lt;br /&gt;
		imagediv:css(&#039;height&#039;, tostring(height) .. &#039;px&#039;)&lt;br /&gt;
		imagediv:css(&#039;overflow&#039;, &#039;hidden&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	imagediv:wikitext(&#039;[[file:&#039; .. image .. widthstr .. linkstr .. altstr .. thumbtimestr .. &#039;]]&#039;)&lt;br /&gt;
	if isnotempty(caption) then&lt;br /&gt;
		local captiondiv = root:tag(&#039;div&#039;)&lt;br /&gt;
		captiondiv:addClass(&#039;thumbcaption&#039;)&lt;br /&gt;
		if isnotempty(textalign) then&lt;br /&gt;
			captiondiv:addClass(&#039;text-align-&#039; .. textalign)&lt;br /&gt;
		end&lt;br /&gt;
		captiondiv:wikitext(caption)&lt;br /&gt;
	end&lt;br /&gt;
	return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getWidth(w1, w2)&lt;br /&gt;
	local w&lt;br /&gt;
	if isnotempty(w1) then&lt;br /&gt;
		w = tonumber(w1)&lt;br /&gt;
	elseif isnotempty(w2) then&lt;br /&gt;
		w = tonumber(w2)&lt;br /&gt;
	end&lt;br /&gt;
	return w or 200&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getPerRow(pstr, ic)&lt;br /&gt;
	-- split string into array using any non-digit as a dilimiter&lt;br /&gt;
	local pr = mw.text.split(pstr or &#039;&#039;, &#039;[^%d][^%d]*&#039;)&lt;br /&gt;
	-- if split failed, assume a single row&lt;br /&gt;
	if (#pr &amp;lt; 1) then&lt;br /&gt;
		pr = {tostring(ic)}&lt;br /&gt;
	end&lt;br /&gt;
	-- convert the array of strings to an array of numbers,&lt;br /&gt;
	-- adding any implied/missing numbers at the end of the array&lt;br /&gt;
	local r = 1&lt;br /&gt;
	local thisrow = tonumber(pr[1] or ic) or ic&lt;br /&gt;
	local prownum = {}&lt;br /&gt;
	while( ic &amp;gt; 0 ) do&lt;br /&gt;
		prownum[r] = thisrow&lt;br /&gt;
		ic = ic - thisrow&lt;br /&gt;
		r = r + 1&lt;br /&gt;
		-- use the previous if the next is missing and&lt;br /&gt;
		-- make sure we don&#039;t overstep the number of images&lt;br /&gt;
		thisrow = math.min(tonumber(pr[r] or thisrow) or ic, ic)&lt;br /&gt;
	end&lt;br /&gt;
	return prownum&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMultipleImages(frame)&lt;br /&gt;
	local pargs = frame:getParent().args&lt;br /&gt;
	local args = frame.args&lt;br /&gt;
	local width = removepx(pargs[&#039;width&#039;] or &#039;&#039;)&lt;br /&gt;
	local dir = pargs[&#039;direction&#039;] or &#039;&#039;&lt;br /&gt;
	local border = pargs[&#039;border&#039;] or args[&#039;border&#039;] or &#039;&#039;&lt;br /&gt;
	local align = pargs[&#039;align&#039;] or args[&#039;align&#039;] or (border == &#039;infobox&#039; and &#039;center&#039; or &#039;&#039;)&lt;br /&gt;
	local capalign = pargs[&#039;caption_align&#039;] or args[&#039;caption_align&#039;] or &#039;&#039;&lt;br /&gt;
	local totalwidth = removepx(pargs[&#039;total_width&#039;] or args[&#039;total_width&#039;] or &#039;&#039;)&lt;br /&gt;
	local imgstyle = pargs[&#039;image_style&#039;] or args[&#039;image_style&#039;]&lt;br /&gt;
	local header = pargs[&#039;header&#039;] or pargs[&#039;title&#039;] or &#039;&#039;&lt;br /&gt;
	local footer = pargs[&#039;footer&#039;] or &#039;&#039;&lt;br /&gt;
	local imagegap = tonumber(pargs[&#039;image_gap&#039;] or &#039;1&#039;) or 1&lt;br /&gt;
	local perrow = nil&lt;br /&gt;
	local thumbclass = {&lt;br /&gt;
		[&amp;quot;left&amp;quot;] = &#039;tleft&#039;,&lt;br /&gt;
		[&amp;quot;none&amp;quot;] = &#039;tnone&#039;,&lt;br /&gt;
		[&amp;quot;center&amp;quot;] = &#039;tnone&#039;,&lt;br /&gt;
		[&amp;quot;centre&amp;quot;] = &#039;tnone&#039;,&lt;br /&gt;
		[&amp;quot;right&amp;quot;] = &#039;tright&#039;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	-- find all the nonempty images&lt;br /&gt;
	local imagenumbers = {}&lt;br /&gt;
	local imagecount = 0&lt;br /&gt;
	for k, v in pairs( pargs ) do&lt;br /&gt;
		local i = tonumber(tostring(k):match( &#039;^%s*image([%d]+)%s*$&#039; ) or &#039;0&#039;)&lt;br /&gt;
		if( i &amp;gt; 0 and isnotempty(v) ) then&lt;br /&gt;
			table.insert( imagenumbers, i)&lt;br /&gt;
			imagecount = imagecount + 1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- sort the imagenumbers&lt;br /&gt;
	table.sort(imagenumbers)&lt;br /&gt;
&lt;br /&gt;
	-- create an array with the number of images per row&lt;br /&gt;
	perrow = getPerRow(dir == &#039;vertical&#039; and &#039;1&#039; or pargs[&#039;perrow&#039;], imagecount)&lt;br /&gt;
&lt;br /&gt;
	-- compute the number of rows&lt;br /&gt;
	local rowcount = #perrow&lt;br /&gt;
&lt;br /&gt;
	-- store the image widths and compute row widths and maximum row width&lt;br /&gt;
	local heights = {}&lt;br /&gt;
	local widths = {}&lt;br /&gt;
	local widthmax = 0&lt;br /&gt;
	local widthsum = {}&lt;br /&gt;
	local k = 0&lt;br /&gt;
	for r=1,rowcount do&lt;br /&gt;
		widthsum[r] = 0&lt;br /&gt;
		for c=1,perrow[r] do&lt;br /&gt;
			k = k + 1&lt;br /&gt;
			if( k &amp;lt;= imagecount ) then&lt;br /&gt;
				local i = imagenumbers[k]&lt;br /&gt;
				if( isnotempty(totalwidth) ) then&lt;br /&gt;
					l, m = string.find(pargs[&#039;image&#039; .. i], &amp;quot;[[File:&amp;quot;)&lt;br /&gt;
					if (l == 1) then&lt;br /&gt;
						pargs[&#039;image&#039; .. i] = string.sub(pargs[&#039;image&#039; .. i], l, len(pargs[&#039;image&#039; .. i]) - 2)&lt;br /&gt;
					end&lt;br /&gt;
					widths[k], heights[k] = getdimensions(pargs[&#039;image&#039; .. i], pargs[&#039;width&#039; .. i], pargs[&#039;height&#039; .. i])&lt;br /&gt;
				else&lt;br /&gt;
					widths[k] = getWidth(width, pargs[&#039;width&#039; .. i])&lt;br /&gt;
				end&lt;br /&gt;
				widthsum[r] = widthsum[r] + widths[k]&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		widthmax = math.max(widthmax, widthsum[r])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- make sure the gap is non-negative&lt;br /&gt;
	if imagegap &amp;lt; 0 then imagegap = 0 end&lt;br /&gt;
&lt;br /&gt;
	-- if total_width has been specified, rescale the image widths&lt;br /&gt;
	if( isnotempty(totalwidth) ) then&lt;br /&gt;
		totalwidth = tonumber(totalwidth)&lt;br /&gt;
		widthmax = 0&lt;br /&gt;
		local k = 0&lt;br /&gt;
		for r=1,rowcount do&lt;br /&gt;
			local koffset = k&lt;br /&gt;
			local tw = totalwidth - (3 + imagegap) * (perrow[r] - 1) - 12&lt;br /&gt;
			local ar = {}&lt;br /&gt;
			local arsum = 0&lt;br /&gt;
			for j=1,perrow[r] do&lt;br /&gt;
				k = k + 1&lt;br /&gt;
				if( k&amp;lt;= imagecount ) then&lt;br /&gt;
					local i = imagenumbers[k]&lt;br /&gt;
					local h = heights[k] or 0&lt;br /&gt;
					if (h &amp;gt; 0) then&lt;br /&gt;
						ar[j] = widths[k]/h&lt;br /&gt;
						heights[k] = h&lt;br /&gt;
					else&lt;br /&gt;
						ar[j] = widths[k]/100&lt;br /&gt;
					end&lt;br /&gt;
					arsum = arsum + ar[j]&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			local ht = tw/arsum&lt;br /&gt;
			local ws = 0&lt;br /&gt;
			k = koffset&lt;br /&gt;
			for j=1,perrow[r] do&lt;br /&gt;
				k = k + 1&lt;br /&gt;
				if( k&amp;lt;= imagecount ) then&lt;br /&gt;
					local i = imagenumbers[k]&lt;br /&gt;
					widths[k] = math.floor(ar[j]*ht + 0.5)&lt;br /&gt;
					ws = ws + widths[k]&lt;br /&gt;
					if heights[k] then&lt;br /&gt;
						heights[k] = math.floor(ht)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			widthsum[r] = ws&lt;br /&gt;
			widthmax = math.max(widthmax, widthsum[r])&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- start building the array of images, if there are images&lt;br /&gt;
	if( imagecount &amp;gt; 0 ) then&lt;br /&gt;
		-- compute width of outer div&lt;br /&gt;
		local bodywidth = 0&lt;br /&gt;
		for r=1,rowcount do&lt;br /&gt;
			if( widthmax == widthsum[r] ) then&lt;br /&gt;
				bodywidth = widthmax + (3 + imagegap) * (perrow[r] - 1) + 12&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		-- The body has a min-width of 100, which needs to be taken into account on specific widths&lt;br /&gt;
		bodywidth = math.max( 100, bodywidth - 8);&lt;br /&gt;
&lt;br /&gt;
		local bg = pargs[&#039;background color&#039;] or &#039;&#039;&lt;br /&gt;
		-- create the array of images&lt;br /&gt;
		local root = mw.html.create(&#039;div&#039;)&lt;br /&gt;
		root:addClass(&#039;thumb&#039;)&lt;br /&gt;
		root:addClass(&#039;tmulti&#039;)&lt;br /&gt;
		-- root:addClass(&#039;tmulti-sandbox&#039;)&lt;br /&gt;
		root:addClass(thumbclass[align] or &#039;tright&#039;)&lt;br /&gt;
&lt;br /&gt;
		if( align == &#039;center&#039; or align == &#039;centre&#039; ) then&lt;br /&gt;
			root:addClass(&#039;center&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		if( bg ~= &#039;&#039; ) then&lt;br /&gt;
			root:css(&#039;background-color&#039;, bg)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local div = root:tag(&#039;div&#039;)&lt;br /&gt;
		div:addClass(&#039;thumbinner&#039;)&lt;br /&gt;
		div:css(&#039;width&#039;, tostring(bodywidth) .. &#039;px&#039;)&lt;br /&gt;
			:css(&#039;max-width&#039;, tostring(bodywidth) .. &#039;px&#039;)&lt;br /&gt;
		if( bg ~= &#039;&#039; ) then&lt;br /&gt;
			div:css(&#039;background-color&#039;, bg)&lt;br /&gt;
		end&lt;br /&gt;
		if( border == &#039;infobox&#039; or border == &#039;none&#039;) then&lt;br /&gt;
			div:css(&#039;border&#039;, &#039;none&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		-- add the header&lt;br /&gt;
		if( isnotempty(header) ) then&lt;br /&gt;
			div:tag(&#039;div&#039;)&lt;br /&gt;
				:addClass(&#039;trow&#039;)&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					:addClass(&#039;theader&#039;)&lt;br /&gt;
					:css(&#039;text-align&#039;, pargs[&#039;header_align&#039;])&lt;br /&gt;
					:css(&#039;background-color&#039;, pargs[&#039;header_background&#039;])&lt;br /&gt;
					:wikitext(header)&lt;br /&gt;
		end&lt;br /&gt;
		-- loop through the images&lt;br /&gt;
		local k = 0&lt;br /&gt;
		for r=1,rowcount do&lt;br /&gt;
			local rowdiv = div:tag(&#039;div&#039;):addClass(&#039;trow&#039;);&lt;br /&gt;
			for j=1,perrow[r] do&lt;br /&gt;
				k = k + 1&lt;br /&gt;
				if( k &amp;lt;= imagecount ) then&lt;br /&gt;
					local imagediv = rowdiv:tag(&#039;div&#039;)&lt;br /&gt;
					imagediv:addClass(&#039;tsingle&#039;)&lt;br /&gt;
					if bg ~= &#039;&#039; then&lt;br /&gt;
						imagediv:css(&#039;background-color&#039;, bg);&lt;br /&gt;
					end&lt;br /&gt;
					if ((imagegap &amp;gt; 1) and (j &amp;lt; perrow[r])) then&lt;br /&gt;
						imagediv:css(&#039;margin-right&#039;, tostring(imagegap) .. &#039;px&#039;)&lt;br /&gt;
					end&lt;br /&gt;
					local i = imagenumbers[k]&lt;br /&gt;
					local img = pargs[&#039;image&#039; .. i]&lt;br /&gt;
					local w = widths[k]&lt;br /&gt;
					imagediv:css(&#039;width&#039;, tostring(2 + w) .. &#039;px&#039;)&lt;br /&gt;
						:css(&#039;max-width&#039;, tostring(2 + w) .. &#039;px&#039;)&lt;br /&gt;
					imagediv:wikitext(renderImageCell(img, w, heights[k],&lt;br /&gt;
						pargs[&#039;link&#039; .. i], pargs[&#039;alt&#039; .. i],&lt;br /&gt;
						pargs[&#039;thumbtime&#039; .. i], pargs[&#039;caption&#039; .. i], capalign, imgstyle))&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		-- add the footer&lt;br /&gt;
		if( isnotempty(footer) ) then&lt;br /&gt;
			local falign = string.lower(pargs[&#039;footer_align&#039;] or args[&#039;footer_align&#039;] or &#039;left&#039;)&lt;br /&gt;
			falign = (falign == &#039;centre&#039;) and &#039;center&#039; or falign&lt;br /&gt;
			div:tag(&#039;div&#039;)&lt;br /&gt;
				:addClass(&#039;trow&#039;)&lt;br /&gt;
				:css(&#039;display&#039;, (falign ~= &#039;left&#039;) and &#039;flow-root&#039; or &#039;flex&#039;)&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					:addClass(&#039;thumbcaption&#039;)&lt;br /&gt;
					:css(&#039;text-align&#039;, (falign ~= &#039;left&#039;) and falign or nil)&lt;br /&gt;
					:css(&#039;background-color&#039;, pargs[&#039;footer_background&#039;])&lt;br /&gt;
					:wikitext(footer)&lt;br /&gt;
		end&lt;br /&gt;
		return tostring(root)&lt;br /&gt;
	end&lt;br /&gt;
	return &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.render( frame )&lt;br /&gt;
	autoscaledimages = false&lt;br /&gt;
	nonautoscaledimages = false&lt;br /&gt;
&lt;br /&gt;
	return frame:extensionTag {name = &#039;templatestyles&#039;, args = {src = &#039;Multiple image/styles.css&#039;, wrapper = &amp;quot;.tmulti&amp;quot;}}&lt;br /&gt;
		.. renderMultipleImages( frame )&lt;br /&gt;
		.. (autoscaledimages and &#039;[[Category:Pages using multiple image with auto scaled images]]&#039; or &#039;&#039;)&lt;br /&gt;
		.. (nonautoscaledimages and &#039;[[Category:Pages using multiple image with manual scaled images]]&#039; or &#039;&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Module:Multiple_image&amp;diff=1544</id>
		<title>Module:Multiple image</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Module:Multiple_image&amp;diff=1544"/>
		<updated>2026-08-18T00:46:12Z</updated>

		<summary type="html">&lt;p&gt;Lynn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- implements [[template:multiple image]]&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local autoscaledimages&lt;br /&gt;
local nonautoscaledimages&lt;br /&gt;
&lt;br /&gt;
local function isnotempty(s)&lt;br /&gt;
	return s and s:match( &#039;^%s*(.-)%s*$&#039; ) ~= &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function removepx(s)&lt;br /&gt;
	return tostring(s or &#039;&#039;):match(&#039;^(.*)[Pp][Xx]%s*$&#039;) or s&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getdimensions(s, w, h)&lt;br /&gt;
	if tonumber(w) and tonumber(h) then&lt;br /&gt;
		nonautoscaledimages = true&lt;br /&gt;
		return tonumber(w), tonumber(h)&lt;br /&gt;
	end&lt;br /&gt;
	local file = s and mw.title.new(&#039;File:&#039; .. mw.uri.decode(mw.ustring.gsub(s,&#039;%|.*$&#039;,&#039;&#039;), &#039;WIKI&#039;))&lt;br /&gt;
	file = file and file.file or {width = 0, height = 0}&lt;br /&gt;
	w = tonumber(file.width) or 0&lt;br /&gt;
	h = tonumber(file.height) or 0&lt;br /&gt;
	autoscaledimages = true&lt;br /&gt;
	return w, h&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderImageCell(image, width, height, link, alt, thumbtime, caption, textalign, istyle)&lt;br /&gt;
	local root = mw.html.create(&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
	local altstr = &#039;|alt=&#039; .. (alt or &#039;&#039;)&lt;br /&gt;
	local linkstr = link and (&#039;|link=&#039; .. link) or &#039;&#039;&lt;br /&gt;
	local widthstr = &#039;|&#039; .. tostring(width) .. &#039;px&#039;&lt;br /&gt;
	local thumbtimestr = &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	if isnotempty( thumbtime ) then&lt;br /&gt;
		thumbtimestr = &#039;|thumbtime=&#039; .. thumbtime&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local imagediv = root:tag(&#039;div&#039;)&lt;br /&gt;
	imagediv:addClass(&#039;thumbimage&#039;)&lt;br /&gt;
	imagediv:cssText(istyle)&lt;br /&gt;
	if( height ) then&lt;br /&gt;
		imagediv:css(&#039;height&#039;, tostring(height) .. &#039;px&#039;)&lt;br /&gt;
		imagediv:css(&#039;overflow&#039;, &#039;hidden&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	imagediv:wikitext(&#039;[[file:&#039; .. image .. widthstr .. linkstr .. altstr .. thumbtimestr .. &#039;]]&#039;)&lt;br /&gt;
	if isnotempty(caption) then&lt;br /&gt;
		local captiondiv = root:tag(&#039;div&#039;)&lt;br /&gt;
		captiondiv:addClass(&#039;thumbcaption&#039;)&lt;br /&gt;
		if isnotempty(textalign) then&lt;br /&gt;
			captiondiv:addClass(&#039;text-align-&#039; .. textalign)&lt;br /&gt;
		end&lt;br /&gt;
		captiondiv:wikitext(caption)&lt;br /&gt;
	end&lt;br /&gt;
	return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getWidth(w1, w2)&lt;br /&gt;
	local w&lt;br /&gt;
	if isnotempty(w1) then&lt;br /&gt;
		w = tonumber(w1)&lt;br /&gt;
	elseif isnotempty(w2) then&lt;br /&gt;
		w = tonumber(w2)&lt;br /&gt;
	end&lt;br /&gt;
	return w or 200&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getPerRow(pstr, ic)&lt;br /&gt;
	-- split string into array using any non-digit as a dilimiter&lt;br /&gt;
	local pr = mw.text.split(pstr or &#039;&#039;, &#039;[^%d][^%d]*&#039;)&lt;br /&gt;
	-- if split failed, assume a single row&lt;br /&gt;
	if (#pr &amp;lt; 1) then&lt;br /&gt;
		pr = {tostring(ic)}&lt;br /&gt;
	end&lt;br /&gt;
	-- convert the array of strings to an array of numbers,&lt;br /&gt;
	-- adding any implied/missing numbers at the end of the array&lt;br /&gt;
	local r = 1&lt;br /&gt;
	local thisrow = tonumber(pr[1] or ic) or ic&lt;br /&gt;
	local prownum = {}&lt;br /&gt;
	while( ic &amp;gt; 0 ) do&lt;br /&gt;
		prownum[r] = thisrow&lt;br /&gt;
		ic = ic - thisrow&lt;br /&gt;
		r = r + 1&lt;br /&gt;
		-- use the previous if the next is missing and&lt;br /&gt;
		-- make sure we don&#039;t overstep the number of images&lt;br /&gt;
		thisrow = math.min(tonumber(pr[r] or thisrow) or ic, ic)&lt;br /&gt;
	end&lt;br /&gt;
	return prownum&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMultipleImages(frame)&lt;br /&gt;
	local pargs = frame:getParent().args&lt;br /&gt;
	local args = frame.args&lt;br /&gt;
	local width = removepx(pargs[&#039;width&#039;] or &#039;&#039;)&lt;br /&gt;
	local dir = pargs[&#039;direction&#039;] or &#039;&#039;&lt;br /&gt;
	local border = pargs[&#039;border&#039;] or args[&#039;border&#039;] or &#039;&#039;&lt;br /&gt;
	local align = pargs[&#039;align&#039;] or args[&#039;align&#039;] or (border == &#039;infobox&#039; and &#039;center&#039; or &#039;&#039;)&lt;br /&gt;
	local capalign = pargs[&#039;caption_align&#039;] or args[&#039;caption_align&#039;] or &#039;&#039;&lt;br /&gt;
	local totalwidth = removepx(pargs[&#039;total_width&#039;] or args[&#039;total_width&#039;] or &#039;&#039;)&lt;br /&gt;
	local imgstyle = pargs[&#039;image_style&#039;] or args[&#039;image_style&#039;]&lt;br /&gt;
	local header = pargs[&#039;header&#039;] or pargs[&#039;title&#039;] or &#039;&#039;&lt;br /&gt;
	local footer = pargs[&#039;footer&#039;] or &#039;&#039;&lt;br /&gt;
	local imagegap = tonumber(pargs[&#039;image_gap&#039;] or &#039;1&#039;) or 1&lt;br /&gt;
	local perrow = nil&lt;br /&gt;
	local thumbclass = {&lt;br /&gt;
		[&amp;quot;left&amp;quot;] = &#039;tleft&#039;,&lt;br /&gt;
		[&amp;quot;none&amp;quot;] = &#039;tnone&#039;,&lt;br /&gt;
		[&amp;quot;center&amp;quot;] = &#039;tnone&#039;,&lt;br /&gt;
		[&amp;quot;centre&amp;quot;] = &#039;tnone&#039;,&lt;br /&gt;
		[&amp;quot;right&amp;quot;] = &#039;tright&#039;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	-- find all the nonempty images&lt;br /&gt;
	local imagenumbers = {}&lt;br /&gt;
	local imagecount = 0&lt;br /&gt;
	for k, v in pairs( pargs ) do&lt;br /&gt;
		local i = tonumber(tostring(k):match( &#039;^%s*image([%d]+)%s*$&#039; ) or &#039;0&#039;)&lt;br /&gt;
		if( i &amp;gt; 0 and isnotempty(v) ) then&lt;br /&gt;
			table.insert( imagenumbers, i)&lt;br /&gt;
			imagecount = imagecount + 1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- sort the imagenumbers&lt;br /&gt;
	table.sort(imagenumbers)&lt;br /&gt;
&lt;br /&gt;
	-- create an array with the number of images per row&lt;br /&gt;
	perrow = getPerRow(dir == &#039;vertical&#039; and &#039;1&#039; or pargs[&#039;perrow&#039;], imagecount)&lt;br /&gt;
&lt;br /&gt;
	-- compute the number of rows&lt;br /&gt;
	local rowcount = #perrow&lt;br /&gt;
&lt;br /&gt;
	-- store the image widths and compute row widths and maximum row width&lt;br /&gt;
	local heights = {}&lt;br /&gt;
	local widths = {}&lt;br /&gt;
	local widthmax = 0&lt;br /&gt;
	local widthsum = {}&lt;br /&gt;
	local k = 0&lt;br /&gt;
	for r=1,rowcount do&lt;br /&gt;
		widthsum[r] = 0&lt;br /&gt;
		for c=1,perrow[r] do&lt;br /&gt;
			k = k + 1&lt;br /&gt;
			if( k &amp;lt;= imagecount ) then&lt;br /&gt;
				local i = imagenumbers[k]&lt;br /&gt;
				if( isnotempty(totalwidth) ) then&lt;br /&gt;
&lt;br /&gt;
					widths[k], heights[k] = getdimensions(pargs[&#039;image&#039; .. i], pargs[&#039;width&#039; .. i], pargs[&#039;height&#039; .. i])&lt;br /&gt;
				else&lt;br /&gt;
					widths[k] = getWidth(width, pargs[&#039;width&#039; .. i])&lt;br /&gt;
				end&lt;br /&gt;
				widthsum[r] = widthsum[r] + widths[k]&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		widthmax = math.max(widthmax, widthsum[r])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- make sure the gap is non-negative&lt;br /&gt;
	if imagegap &amp;lt; 0 then imagegap = 0 end&lt;br /&gt;
&lt;br /&gt;
	-- if total_width has been specified, rescale the image widths&lt;br /&gt;
	if( isnotempty(totalwidth) ) then&lt;br /&gt;
		totalwidth = tonumber(totalwidth)&lt;br /&gt;
		widthmax = 0&lt;br /&gt;
		local k = 0&lt;br /&gt;
		for r=1,rowcount do&lt;br /&gt;
			local koffset = k&lt;br /&gt;
			local tw = totalwidth - (3 + imagegap) * (perrow[r] - 1) - 12&lt;br /&gt;
			local ar = {}&lt;br /&gt;
			local arsum = 0&lt;br /&gt;
			for j=1,perrow[r] do&lt;br /&gt;
				k = k + 1&lt;br /&gt;
				if( k&amp;lt;= imagecount ) then&lt;br /&gt;
					local i = imagenumbers[k]&lt;br /&gt;
					local h = heights[k] or 0&lt;br /&gt;
					if (h &amp;gt; 0) then&lt;br /&gt;
						ar[j] = widths[k]/h&lt;br /&gt;
						heights[k] = h&lt;br /&gt;
					else&lt;br /&gt;
						ar[j] = widths[k]/100&lt;br /&gt;
					end&lt;br /&gt;
					arsum = arsum + ar[j]&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			local ht = tw/arsum&lt;br /&gt;
			local ws = 0&lt;br /&gt;
			k = koffset&lt;br /&gt;
			for j=1,perrow[r] do&lt;br /&gt;
				k = k + 1&lt;br /&gt;
				if( k&amp;lt;= imagecount ) then&lt;br /&gt;
					local i = imagenumbers[k]&lt;br /&gt;
					widths[k] = math.floor(ar[j]*ht + 0.5)&lt;br /&gt;
					ws = ws + widths[k]&lt;br /&gt;
					if heights[k] then&lt;br /&gt;
						heights[k] = math.floor(ht)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			widthsum[r] = ws&lt;br /&gt;
			widthmax = math.max(widthmax, widthsum[r])&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- start building the array of images, if there are images&lt;br /&gt;
	if( imagecount &amp;gt; 0 ) then&lt;br /&gt;
		-- compute width of outer div&lt;br /&gt;
		local bodywidth = 0&lt;br /&gt;
		for r=1,rowcount do&lt;br /&gt;
			if( widthmax == widthsum[r] ) then&lt;br /&gt;
				bodywidth = widthmax + (3 + imagegap) * (perrow[r] - 1) + 12&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		-- The body has a min-width of 100, which needs to be taken into account on specific widths&lt;br /&gt;
		bodywidth = math.max( 100, bodywidth - 8);&lt;br /&gt;
&lt;br /&gt;
		local bg = pargs[&#039;background color&#039;] or &#039;&#039;&lt;br /&gt;
		-- create the array of images&lt;br /&gt;
		local root = mw.html.create(&#039;div&#039;)&lt;br /&gt;
		root:addClass(&#039;thumb&#039;)&lt;br /&gt;
		root:addClass(&#039;tmulti&#039;)&lt;br /&gt;
		-- root:addClass(&#039;tmulti-sandbox&#039;)&lt;br /&gt;
		root:addClass(thumbclass[align] or &#039;tright&#039;)&lt;br /&gt;
&lt;br /&gt;
		if( align == &#039;center&#039; or align == &#039;centre&#039; ) then&lt;br /&gt;
			root:addClass(&#039;center&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		if( bg ~= &#039;&#039; ) then&lt;br /&gt;
			root:css(&#039;background-color&#039;, bg)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local div = root:tag(&#039;div&#039;)&lt;br /&gt;
		div:addClass(&#039;thumbinner&#039;)&lt;br /&gt;
		div:css(&#039;width&#039;, tostring(bodywidth) .. &#039;px&#039;)&lt;br /&gt;
			:css(&#039;max-width&#039;, tostring(bodywidth) .. &#039;px&#039;)&lt;br /&gt;
		if( bg ~= &#039;&#039; ) then&lt;br /&gt;
			div:css(&#039;background-color&#039;, bg)&lt;br /&gt;
		end&lt;br /&gt;
		if( border == &#039;infobox&#039; or border == &#039;none&#039;) then&lt;br /&gt;
			div:css(&#039;border&#039;, &#039;none&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		-- add the header&lt;br /&gt;
		if( isnotempty(header) ) then&lt;br /&gt;
			div:tag(&#039;div&#039;)&lt;br /&gt;
				:addClass(&#039;trow&#039;)&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					:addClass(&#039;theader&#039;)&lt;br /&gt;
					:css(&#039;text-align&#039;, pargs[&#039;header_align&#039;])&lt;br /&gt;
					:css(&#039;background-color&#039;, pargs[&#039;header_background&#039;])&lt;br /&gt;
					:wikitext(header)&lt;br /&gt;
		end&lt;br /&gt;
		-- loop through the images&lt;br /&gt;
		local k = 0&lt;br /&gt;
		for r=1,rowcount do&lt;br /&gt;
			local rowdiv = div:tag(&#039;div&#039;):addClass(&#039;trow&#039;);&lt;br /&gt;
			for j=1,perrow[r] do&lt;br /&gt;
				k = k + 1&lt;br /&gt;
				if( k &amp;lt;= imagecount ) then&lt;br /&gt;
					local imagediv = rowdiv:tag(&#039;div&#039;)&lt;br /&gt;
					imagediv:addClass(&#039;tsingle&#039;)&lt;br /&gt;
					if bg ~= &#039;&#039; then&lt;br /&gt;
						imagediv:css(&#039;background-color&#039;, bg);&lt;br /&gt;
					end&lt;br /&gt;
					if ((imagegap &amp;gt; 1) and (j &amp;lt; perrow[r])) then&lt;br /&gt;
						imagediv:css(&#039;margin-right&#039;, tostring(imagegap) .. &#039;px&#039;)&lt;br /&gt;
					end&lt;br /&gt;
					local i = imagenumbers[k]&lt;br /&gt;
					local img = pargs[&#039;image&#039; .. i]&lt;br /&gt;
					local w = widths[k]&lt;br /&gt;
					imagediv:css(&#039;width&#039;, tostring(2 + w) .. &#039;px&#039;)&lt;br /&gt;
						:css(&#039;max-width&#039;, tostring(2 + w) .. &#039;px&#039;)&lt;br /&gt;
					imagediv:wikitext(renderImageCell(img, w, heights[k],&lt;br /&gt;
						pargs[&#039;link&#039; .. i], pargs[&#039;alt&#039; .. i],&lt;br /&gt;
						pargs[&#039;thumbtime&#039; .. i], pargs[&#039;caption&#039; .. i], capalign, imgstyle))&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		-- add the footer&lt;br /&gt;
		if( isnotempty(footer) ) then&lt;br /&gt;
			local falign = string.lower(pargs[&#039;footer_align&#039;] or args[&#039;footer_align&#039;] or &#039;left&#039;)&lt;br /&gt;
			falign = (falign == &#039;centre&#039;) and &#039;center&#039; or falign&lt;br /&gt;
			div:tag(&#039;div&#039;)&lt;br /&gt;
				:addClass(&#039;trow&#039;)&lt;br /&gt;
				:css(&#039;display&#039;, (falign ~= &#039;left&#039;) and &#039;flow-root&#039; or &#039;flex&#039;)&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					:addClass(&#039;thumbcaption&#039;)&lt;br /&gt;
					:css(&#039;text-align&#039;, (falign ~= &#039;left&#039;) and falign or nil)&lt;br /&gt;
					:css(&#039;background-color&#039;, pargs[&#039;footer_background&#039;])&lt;br /&gt;
					:wikitext(footer)&lt;br /&gt;
		end&lt;br /&gt;
		return tostring(root)&lt;br /&gt;
	end&lt;br /&gt;
	return &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.render( frame )&lt;br /&gt;
	autoscaledimages = false&lt;br /&gt;
	nonautoscaledimages = false&lt;br /&gt;
&lt;br /&gt;
	return frame:extensionTag {name = &#039;templatestyles&#039;, args = {src = &#039;Multiple image/styles.css&#039;, wrapper = &amp;quot;.tmulti&amp;quot;}}&lt;br /&gt;
		.. renderMultipleImages( frame )&lt;br /&gt;
		.. (autoscaledimages and &#039;[[Category:Pages using multiple image with auto scaled images]]&#039; or &#039;&#039;)&lt;br /&gt;
		.. (nonautoscaledimages and &#039;[[Category:Pages using multiple image with manual scaled images]]&#039; or &#039;&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Module:Multiple_image&amp;diff=1543</id>
		<title>Module:Multiple image</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Module:Multiple_image&amp;diff=1543"/>
		<updated>2026-08-18T00:12:18Z</updated>

		<summary type="html">&lt;p&gt;Lynn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- implements [[template:multiple image]]&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local autoscaledimages&lt;br /&gt;
local nonautoscaledimages&lt;br /&gt;
&lt;br /&gt;
local function isnotempty(s)&lt;br /&gt;
	return s and s:match( &#039;^%s*(.-)%s*$&#039; ) ~= &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function removepx(s)&lt;br /&gt;
	return tostring(s or &#039;&#039;):match(&#039;^(.*)[Pp][Xx]%s*$&#039;) or s&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getdimensions(s, w, h)&lt;br /&gt;
	if tonumber(w) and tonumber(h) then&lt;br /&gt;
		nonautoscaledimages = true&lt;br /&gt;
		return tonumber(w), tonumber(h)&lt;br /&gt;
	end&lt;br /&gt;
	local file = s and mw.title.new(&#039;File:&#039; .. mw.uri.decode(mw.ustring.gsub(s,&#039;%|.*$&#039;,&#039;&#039;), &#039;WIKI&#039;))&lt;br /&gt;
	file = file and file.file or {width = 0, height = 0}&lt;br /&gt;
	w = tonumber(file.width) or 0&lt;br /&gt;
	h = tonumber(file.height) or 0&lt;br /&gt;
	autoscaledimages = true&lt;br /&gt;
	return w, h&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderImageCell(image, width, height, link, alt, thumbtime, caption, textalign, istyle)&lt;br /&gt;
	local root = mw.html.create(&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
	local altstr = &#039;|alt=&#039; .. (alt or &#039;&#039;)&lt;br /&gt;
	local linkstr = link and (&#039;|link=&#039; .. link) or &#039;&#039;&lt;br /&gt;
	local widthstr = &#039;|&#039; .. tostring(width) .. &#039;px&#039;&lt;br /&gt;
	local thumbtimestr = &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	if isnotempty( thumbtime ) then&lt;br /&gt;
		thumbtimestr = &#039;|thumbtime=&#039; .. thumbtime&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local imagediv = root:tag(&#039;div&#039;)&lt;br /&gt;
	imagediv:addClass(&#039;thumbimage&#039;)&lt;br /&gt;
	imagediv:cssText(istyle)&lt;br /&gt;
	if( height ) then&lt;br /&gt;
		imagediv:css(&#039;height&#039;, tostring(height) .. &#039;px&#039;)&lt;br /&gt;
		imagediv:css(&#039;overflow&#039;, &#039;hidden&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	imagediv:wikitext(&#039;[[file:&#039; .. image .. widthstr .. linkstr .. altstr .. thumbtimestr .. &#039;]]&#039;)&lt;br /&gt;
	if isnotempty(caption) then&lt;br /&gt;
		local captiondiv = root:tag(&#039;div&#039;)&lt;br /&gt;
		captiondiv:addClass(&#039;thumbcaption&#039;)&lt;br /&gt;
		if isnotempty(textalign) then&lt;br /&gt;
			captiondiv:addClass(&#039;text-align-&#039; .. textalign)&lt;br /&gt;
		end&lt;br /&gt;
		captiondiv:wikitext(caption)&lt;br /&gt;
	end&lt;br /&gt;
	return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getWidth(w1, w2)&lt;br /&gt;
	local w&lt;br /&gt;
	if isnotempty(w1) then&lt;br /&gt;
		w = tonumber(w1)&lt;br /&gt;
	elseif isnotempty(w2) then&lt;br /&gt;
		w = tonumber(w2)&lt;br /&gt;
	end&lt;br /&gt;
	return w or 200&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getPerRow(pstr, ic)&lt;br /&gt;
	-- split string into array using any non-digit as a dilimiter&lt;br /&gt;
	local pr = mw.text.split(pstr or &#039;&#039;, &#039;[^%d][^%d]*&#039;)&lt;br /&gt;
	-- if split failed, assume a single row&lt;br /&gt;
	if (#pr &amp;lt; 1) then&lt;br /&gt;
		pr = {tostring(ic)}&lt;br /&gt;
	end&lt;br /&gt;
	-- convert the array of strings to an array of numbers,&lt;br /&gt;
	-- adding any implied/missing numbers at the end of the array&lt;br /&gt;
	local r = 1&lt;br /&gt;
	local thisrow = tonumber(pr[1] or ic) or ic&lt;br /&gt;
	local prownum = {}&lt;br /&gt;
	while( ic &amp;gt; 0 ) do&lt;br /&gt;
		prownum[r] = thisrow&lt;br /&gt;
		ic = ic - thisrow&lt;br /&gt;
		r = r + 1&lt;br /&gt;
		-- use the previous if the next is missing and&lt;br /&gt;
		-- make sure we don&#039;t overstep the number of images&lt;br /&gt;
		thisrow = math.min(tonumber(pr[r] or thisrow) or ic, ic)&lt;br /&gt;
	end&lt;br /&gt;
	return prownum&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMultipleImages(frame)&lt;br /&gt;
	local pargs = frame:getParent().args&lt;br /&gt;
	local args = frame.args&lt;br /&gt;
	local width = removepx(pargs[&#039;width&#039;] or &#039;&#039;)&lt;br /&gt;
	local dir = pargs[&#039;direction&#039;] or &#039;&#039;&lt;br /&gt;
	local border = pargs[&#039;border&#039;] or args[&#039;border&#039;] or &#039;&#039;&lt;br /&gt;
	local align = pargs[&#039;align&#039;] or args[&#039;align&#039;] or (border == &#039;infobox&#039; and &#039;center&#039; or &#039;&#039;)&lt;br /&gt;
	local capalign = pargs[&#039;caption_align&#039;] or args[&#039;caption_align&#039;] or &#039;&#039;&lt;br /&gt;
	local totalwidth = removepx(pargs[&#039;total_width&#039;] or args[&#039;total_width&#039;] or &#039;&#039;)&lt;br /&gt;
	local imgstyle = pargs[&#039;image_style&#039;] or args[&#039;image_style&#039;]&lt;br /&gt;
	local header = pargs[&#039;header&#039;] or pargs[&#039;title&#039;] or &#039;&#039;&lt;br /&gt;
	local footer = pargs[&#039;footer&#039;] or &#039;&#039;&lt;br /&gt;
	local imagegap = tonumber(pargs[&#039;image_gap&#039;] or &#039;1&#039;) or 1&lt;br /&gt;
	local perrow = nil&lt;br /&gt;
	local thumbclass = {&lt;br /&gt;
		[&amp;quot;left&amp;quot;] = &#039;tleft&#039;,&lt;br /&gt;
		[&amp;quot;none&amp;quot;] = &#039;tnone&#039;,&lt;br /&gt;
		[&amp;quot;center&amp;quot;] = &#039;tnone&#039;,&lt;br /&gt;
		[&amp;quot;centre&amp;quot;] = &#039;tnone&#039;,&lt;br /&gt;
		[&amp;quot;right&amp;quot;] = &#039;tright&#039;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	-- find all the nonempty images&lt;br /&gt;
	local imagenumbers = {}&lt;br /&gt;
	local imagecount = 0&lt;br /&gt;
	for k, v in pairs( pargs ) do&lt;br /&gt;
		local i = tonumber(tostring(k):match( &#039;^%s*image([%d]+)%s*$&#039; ) or &#039;0&#039;)&lt;br /&gt;
		if( i &amp;gt; 0 and isnotempty(v) ) then&lt;br /&gt;
			table.insert( imagenumbers, i)&lt;br /&gt;
			imagecount = imagecount + 1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- sort the imagenumbers&lt;br /&gt;
	table.sort(imagenumbers)&lt;br /&gt;
&lt;br /&gt;
	-- create an array with the number of images per row&lt;br /&gt;
	perrow = getPerRow(dir == &#039;vertical&#039; and &#039;1&#039; or pargs[&#039;perrow&#039;], imagecount)&lt;br /&gt;
&lt;br /&gt;
	-- compute the number of rows&lt;br /&gt;
	local rowcount = #perrow&lt;br /&gt;
&lt;br /&gt;
	-- store the image widths and compute row widths and maximum row width&lt;br /&gt;
	local heights = {}&lt;br /&gt;
	local widths = {}&lt;br /&gt;
	local widthmax = 0&lt;br /&gt;
	local widthsum = {}&lt;br /&gt;
	local k = 0&lt;br /&gt;
	for r=1,rowcount do&lt;br /&gt;
		widthsum[r] = 0&lt;br /&gt;
		for c=1,perrow[r] do&lt;br /&gt;
			k = k + 1&lt;br /&gt;
			if( k &amp;lt;= imagecount ) then&lt;br /&gt;
				local i = imagenumbers[k]&lt;br /&gt;
				if( isnotempty(totalwidth) ) then&lt;br /&gt;
					print(&amp;quot;Image&amp;quot;, pargs[&#039;image&#039; .. i])&lt;br /&gt;
					widths[k], heights[k] = getdimensions(pargs[&#039;image&#039; .. i], pargs[&#039;width&#039; .. i], pargs[&#039;height&#039; .. i])&lt;br /&gt;
				else&lt;br /&gt;
					widths[k] = getWidth(width, pargs[&#039;width&#039; .. i])&lt;br /&gt;
				end&lt;br /&gt;
				widthsum[r] = widthsum[r] + widths[k]&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		widthmax = math.max(widthmax, widthsum[r])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- make sure the gap is non-negative&lt;br /&gt;
	if imagegap &amp;lt; 0 then imagegap = 0 end&lt;br /&gt;
&lt;br /&gt;
	-- if total_width has been specified, rescale the image widths&lt;br /&gt;
	if( isnotempty(totalwidth) ) then&lt;br /&gt;
		totalwidth = tonumber(totalwidth)&lt;br /&gt;
		widthmax = 0&lt;br /&gt;
		local k = 0&lt;br /&gt;
		for r=1,rowcount do&lt;br /&gt;
			local koffset = k&lt;br /&gt;
			local tw = totalwidth - (3 + imagegap) * (perrow[r] - 1) - 12&lt;br /&gt;
			local ar = {}&lt;br /&gt;
			local arsum = 0&lt;br /&gt;
			for j=1,perrow[r] do&lt;br /&gt;
				k = k + 1&lt;br /&gt;
				if( k&amp;lt;= imagecount ) then&lt;br /&gt;
					local i = imagenumbers[k]&lt;br /&gt;
					local h = heights[k] or 0&lt;br /&gt;
					if (h &amp;gt; 0) then&lt;br /&gt;
						ar[j] = widths[k]/h&lt;br /&gt;
						heights[k] = h&lt;br /&gt;
					else&lt;br /&gt;
						ar[j] = widths[k]/100&lt;br /&gt;
					end&lt;br /&gt;
					arsum = arsum + ar[j]&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			local ht = tw/arsum&lt;br /&gt;
			local ws = 0&lt;br /&gt;
			k = koffset&lt;br /&gt;
			for j=1,perrow[r] do&lt;br /&gt;
				k = k + 1&lt;br /&gt;
				if( k&amp;lt;= imagecount ) then&lt;br /&gt;
					local i = imagenumbers[k]&lt;br /&gt;
					widths[k] = math.floor(ar[j]*ht + 0.5)&lt;br /&gt;
					ws = ws + widths[k]&lt;br /&gt;
					if heights[k] then&lt;br /&gt;
						heights[k] = math.floor(ht)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			widthsum[r] = ws&lt;br /&gt;
			widthmax = math.max(widthmax, widthsum[r])&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- start building the array of images, if there are images&lt;br /&gt;
	if( imagecount &amp;gt; 0 ) then&lt;br /&gt;
		-- compute width of outer div&lt;br /&gt;
		local bodywidth = 0&lt;br /&gt;
		for r=1,rowcount do&lt;br /&gt;
			if( widthmax == widthsum[r] ) then&lt;br /&gt;
				bodywidth = widthmax + (3 + imagegap) * (perrow[r] - 1) + 12&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		-- The body has a min-width of 100, which needs to be taken into account on specific widths&lt;br /&gt;
		bodywidth = math.max( 100, bodywidth - 8);&lt;br /&gt;
&lt;br /&gt;
		local bg = pargs[&#039;background color&#039;] or &#039;&#039;&lt;br /&gt;
		-- create the array of images&lt;br /&gt;
		local root = mw.html.create(&#039;div&#039;)&lt;br /&gt;
		root:addClass(&#039;thumb&#039;)&lt;br /&gt;
		root:addClass(&#039;tmulti&#039;)&lt;br /&gt;
		-- root:addClass(&#039;tmulti-sandbox&#039;)&lt;br /&gt;
		root:addClass(thumbclass[align] or &#039;tright&#039;)&lt;br /&gt;
&lt;br /&gt;
		if( align == &#039;center&#039; or align == &#039;centre&#039; ) then&lt;br /&gt;
			root:addClass(&#039;center&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		if( bg ~= &#039;&#039; ) then&lt;br /&gt;
			root:css(&#039;background-color&#039;, bg)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local div = root:tag(&#039;div&#039;)&lt;br /&gt;
		div:addClass(&#039;thumbinner&#039;)&lt;br /&gt;
		div:css(&#039;width&#039;, tostring(bodywidth) .. &#039;px&#039;)&lt;br /&gt;
			:css(&#039;max-width&#039;, tostring(bodywidth) .. &#039;px&#039;)&lt;br /&gt;
		if( bg ~= &#039;&#039; ) then&lt;br /&gt;
			div:css(&#039;background-color&#039;, bg)&lt;br /&gt;
		end&lt;br /&gt;
		if( border == &#039;infobox&#039; or border == &#039;none&#039;) then&lt;br /&gt;
			div:css(&#039;border&#039;, &#039;none&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		-- add the header&lt;br /&gt;
		if( isnotempty(header) ) then&lt;br /&gt;
			div:tag(&#039;div&#039;)&lt;br /&gt;
				:addClass(&#039;trow&#039;)&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					:addClass(&#039;theader&#039;)&lt;br /&gt;
					:css(&#039;text-align&#039;, pargs[&#039;header_align&#039;])&lt;br /&gt;
					:css(&#039;background-color&#039;, pargs[&#039;header_background&#039;])&lt;br /&gt;
					:wikitext(header)&lt;br /&gt;
		end&lt;br /&gt;
		-- loop through the images&lt;br /&gt;
		local k = 0&lt;br /&gt;
		for r=1,rowcount do&lt;br /&gt;
			local rowdiv = div:tag(&#039;div&#039;):addClass(&#039;trow&#039;);&lt;br /&gt;
			for j=1,perrow[r] do&lt;br /&gt;
				k = k + 1&lt;br /&gt;
				if( k &amp;lt;= imagecount ) then&lt;br /&gt;
					local imagediv = rowdiv:tag(&#039;div&#039;)&lt;br /&gt;
					imagediv:addClass(&#039;tsingle&#039;)&lt;br /&gt;
					if bg ~= &#039;&#039; then&lt;br /&gt;
						imagediv:css(&#039;background-color&#039;, bg);&lt;br /&gt;
					end&lt;br /&gt;
					if ((imagegap &amp;gt; 1) and (j &amp;lt; perrow[r])) then&lt;br /&gt;
						imagediv:css(&#039;margin-right&#039;, tostring(imagegap) .. &#039;px&#039;)&lt;br /&gt;
					end&lt;br /&gt;
					local i = imagenumbers[k]&lt;br /&gt;
					local img = pargs[&#039;image&#039; .. i]&lt;br /&gt;
					local w = widths[k]&lt;br /&gt;
					imagediv:css(&#039;width&#039;, tostring(2 + w) .. &#039;px&#039;)&lt;br /&gt;
						:css(&#039;max-width&#039;, tostring(2 + w) .. &#039;px&#039;)&lt;br /&gt;
					imagediv:wikitext(renderImageCell(img, w, heights[k],&lt;br /&gt;
						pargs[&#039;link&#039; .. i], pargs[&#039;alt&#039; .. i],&lt;br /&gt;
						pargs[&#039;thumbtime&#039; .. i], pargs[&#039;caption&#039; .. i], capalign, imgstyle))&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		-- add the footer&lt;br /&gt;
		if( isnotempty(footer) ) then&lt;br /&gt;
			local falign = string.lower(pargs[&#039;footer_align&#039;] or args[&#039;footer_align&#039;] or &#039;left&#039;)&lt;br /&gt;
			falign = (falign == &#039;centre&#039;) and &#039;center&#039; or falign&lt;br /&gt;
			div:tag(&#039;div&#039;)&lt;br /&gt;
				:addClass(&#039;trow&#039;)&lt;br /&gt;
				:css(&#039;display&#039;, (falign ~= &#039;left&#039;) and &#039;flow-root&#039; or &#039;flex&#039;)&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					:addClass(&#039;thumbcaption&#039;)&lt;br /&gt;
					:css(&#039;text-align&#039;, (falign ~= &#039;left&#039;) and falign or nil)&lt;br /&gt;
					:css(&#039;background-color&#039;, pargs[&#039;footer_background&#039;])&lt;br /&gt;
					:wikitext(footer)&lt;br /&gt;
		end&lt;br /&gt;
		return tostring(root)&lt;br /&gt;
	end&lt;br /&gt;
	return &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.render( frame )&lt;br /&gt;
	autoscaledimages = false&lt;br /&gt;
	nonautoscaledimages = false&lt;br /&gt;
&lt;br /&gt;
	return frame:extensionTag {name = &#039;templatestyles&#039;, args = {src = &#039;Multiple image/styles.css&#039;, wrapper = &amp;quot;.tmulti&amp;quot;}}&lt;br /&gt;
		.. renderMultipleImages( frame )&lt;br /&gt;
		.. (autoscaledimages and &#039;[[Category:Pages using multiple image with auto scaled images]]&#039; or &#039;&#039;)&lt;br /&gt;
		.. (nonautoscaledimages and &#039;[[Category:Pages using multiple image with manual scaled images]]&#039; or &#039;&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Main_Page&amp;diff=1542</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Main_Page&amp;diff=1542"/>
		<updated>2026-08-17T22:56:13Z</updated>

		<summary type="html">&lt;p&gt;Lynn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
[[File:Chico_banner.webp]]&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
This is a collection of information related to, and being, &amp;quot;The Maceys&amp;quot;. It is intended to be a collection point for things that do not have a security value. We have other places to store passwords, for example.&lt;br /&gt;
&lt;br /&gt;
The primary focus is the Maceys in California who are Lynn and Bonita, their kids and kid&#039;s spouses. You will find them here:&lt;br /&gt;
{{col-float}}&lt;br /&gt;
==[[The Family Guide]]==&lt;br /&gt;
==[[What&#039;s new on Plex?]]==&lt;br /&gt;
==Quick Links==&lt;br /&gt;
==[[Chico Technical|Chico General Information]]==&lt;br /&gt;
&lt;br /&gt;
==[[San Jose General Information|San Jose General Information]]==&lt;br /&gt;
&lt;br /&gt;
==[[Technical Guides|Technical Guides]]==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{col-float-break}}&lt;br /&gt;
{{#display_map: Chico~Chico [[Living in Chico]]; San Jose~San Jose [[San Jose]]; Lake Almanor~Lake Almanor [[Lake Almanor]];Lihue~Nalu [[Hawaii Condo]]&lt;br /&gt;
|width=350|height=400|layers=OpenStreetMap}}&lt;br /&gt;
&lt;br /&gt;
{{col-float-end}}&lt;br /&gt;
==Family Locations==&lt;br /&gt;
&#039;&#039;&#039;{{Highlight|[[Living in Chico]]}}&#039;&#039;&#039; - [https://www.flightradar24.com/39.81,-122.13/9 Display Flight Radar]&lt;br /&gt;
&lt;br /&gt;
[https://adsb-chico.maceys.net/ Aircraft Localto Both Sites]&lt;br /&gt;
&lt;br /&gt;
[[San Jose Information]] - [https://www.flightradar24.com/37.37,-121.85/11 Display Flight Radar]&lt;br /&gt;
&lt;br /&gt;
[[Lake Almanor Information]] - [https://www.flightradar24.com/40.23,-120.98/10 DisplayFlight Radar]&lt;br /&gt;
[https://adsb-chico.maceys.net/1 Local Aircraft]&lt;br /&gt;
&lt;br /&gt;
[[Kauai Condotel]]&lt;br /&gt;
&lt;br /&gt;
[[Mace Companies]]&lt;br /&gt;
&lt;br /&gt;
==Special Interest==&lt;br /&gt;
[[Live Flight Radar]]&lt;br /&gt;
&lt;br /&gt;
[[ Interactive Fiction]]&lt;br /&gt;
&lt;br /&gt;
[[Cruises| Cruises Taken]]&lt;br /&gt;
&lt;br /&gt;
[[Software#Ring]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Consult the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User&#039;s Guide] for information on using the wiki software.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/postorius/lists/mediawiki-announce.lists.wikimedia.org/ MediaWiki release mailing list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Main_Page&amp;diff=1541</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Main_Page&amp;diff=1541"/>
		<updated>2026-08-17T22:55:44Z</updated>

		<summary type="html">&lt;p&gt;Lynn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
[[File:Chico_banner.webp]]&lt;br /&gt;
Hook extensions @ [[Main Page|MediaWiki.org]] &amp;gt; [[:Category:Extensions|Extensions]] &amp;gt;&lt;br /&gt;
= Introduction =&lt;br /&gt;
This is a collection of information related to, and being, &amp;quot;The Maceys&amp;quot;. It is intended to be a collection point for things that do not have a security value. We have other places to store passwords, for example.&lt;br /&gt;
&lt;br /&gt;
The primary focus is the Maceys in California who are Lynn and Bonita, their kids and kid&#039;s spouses. You will find them here:&lt;br /&gt;
{{col-float}}&lt;br /&gt;
==[[The Family Guide]]==&lt;br /&gt;
==[[What&#039;s new on Plex?]]==&lt;br /&gt;
==Quick Links==&lt;br /&gt;
==[[Chico Technical|Chico General Information]]==&lt;br /&gt;
&lt;br /&gt;
==[[San Jose General Information|San Jose General Information]]==&lt;br /&gt;
&lt;br /&gt;
==[[Technical Guides|Technical Guides]]==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{col-float-break}}&lt;br /&gt;
{{#display_map: Chico~Chico [[Living in Chico]]; San Jose~San Jose [[San Jose]]; Lake Almanor~Lake Almanor [[Lake Almanor]];Lihue~Nalu [[Hawaii Condo]]&lt;br /&gt;
|width=350|height=400|layers=OpenStreetMap}}&lt;br /&gt;
&lt;br /&gt;
{{col-float-end}}&lt;br /&gt;
==Family Locations==&lt;br /&gt;
&#039;&#039;&#039;{{Highlight|[[Living in Chico]]}}&#039;&#039;&#039; - [https://www.flightradar24.com/39.81,-122.13/9 Display Flight Radar]&lt;br /&gt;
&lt;br /&gt;
[https://adsb-chico.maceys.net/ Aircraft Localto Both Sites]&lt;br /&gt;
&lt;br /&gt;
[[San Jose Information]] - [https://www.flightradar24.com/37.37,-121.85/11 Display Flight Radar]&lt;br /&gt;
&lt;br /&gt;
[[Lake Almanor Information]] - [https://www.flightradar24.com/40.23,-120.98/10 DisplayFlight Radar]&lt;br /&gt;
[https://adsb-chico.maceys.net/1 Local Aircraft]&lt;br /&gt;
&lt;br /&gt;
[[Kauai Condotel]]&lt;br /&gt;
&lt;br /&gt;
[[Mace Companies]]&lt;br /&gt;
&lt;br /&gt;
==Special Interest==&lt;br /&gt;
[[Live Flight Radar]]&lt;br /&gt;
&lt;br /&gt;
[[ Interactive Fiction]]&lt;br /&gt;
&lt;br /&gt;
[[Cruises| Cruises Taken]]&lt;br /&gt;
&lt;br /&gt;
[[Software#Ring]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Consult the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User&#039;s Guide] for information on using the wiki software.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/postorius/lists/mediawiki-announce.lists.wikimedia.org/ MediaWiki release mailing list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Main_Page&amp;diff=1540</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Main_Page&amp;diff=1540"/>
		<updated>2026-08-17T22:55:21Z</updated>

		<summary type="html">&lt;p&gt;Lynn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
[[File:Chico_banner.webp]]&lt;br /&gt;
#* Hook extensions @ [[Main Page|MediaWiki.org]] &amp;gt; [[:Category:Extensions|Extensions]] &amp;gt;&lt;br /&gt;
= Introduction =&lt;br /&gt;
This is a collection of information related to, and being, &amp;quot;The Maceys&amp;quot;. It is intended to be a collection point for things that do not have a security value. We have other places to store passwords, for example.&lt;br /&gt;
&lt;br /&gt;
The primary focus is the Maceys in California who are Lynn and Bonita, their kids and kid&#039;s spouses. You will find them here:&lt;br /&gt;
{{col-float}}&lt;br /&gt;
==[[The Family Guide]]==&lt;br /&gt;
==[[What&#039;s new on Plex?]]==&lt;br /&gt;
==Quick Links==&lt;br /&gt;
==[[Chico Technical|Chico General Information]]==&lt;br /&gt;
&lt;br /&gt;
==[[San Jose General Information|San Jose General Information]]==&lt;br /&gt;
&lt;br /&gt;
==[[Technical Guides|Technical Guides]]==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{col-float-break}}&lt;br /&gt;
{{#display_map: Chico~Chico [[Living in Chico]]; San Jose~San Jose [[San Jose]]; Lake Almanor~Lake Almanor [[Lake Almanor]];Lihue~Nalu [[Hawaii Condo]]&lt;br /&gt;
|width=350|height=400|layers=OpenStreetMap}}&lt;br /&gt;
&lt;br /&gt;
{{col-float-end}}&lt;br /&gt;
==Family Locations==&lt;br /&gt;
&#039;&#039;&#039;{{Highlight|[[Living in Chico]]}}&#039;&#039;&#039; - [https://www.flightradar24.com/39.81,-122.13/9 Display Flight Radar]&lt;br /&gt;
&lt;br /&gt;
[https://adsb-chico.maceys.net/ Aircraft Localto Both Sites]&lt;br /&gt;
&lt;br /&gt;
[[San Jose Information]] - [https://www.flightradar24.com/37.37,-121.85/11 Display Flight Radar]&lt;br /&gt;
&lt;br /&gt;
[[Lake Almanor Information]] - [https://www.flightradar24.com/40.23,-120.98/10 DisplayFlight Radar]&lt;br /&gt;
[https://adsb-chico.maceys.net/1 Local Aircraft]&lt;br /&gt;
&lt;br /&gt;
[[Kauai Condotel]]&lt;br /&gt;
&lt;br /&gt;
[[Mace Companies]]&lt;br /&gt;
&lt;br /&gt;
==Special Interest==&lt;br /&gt;
[[Live Flight Radar]]&lt;br /&gt;
&lt;br /&gt;
[[ Interactive Fiction]]&lt;br /&gt;
&lt;br /&gt;
[[Cruises| Cruises Taken]]&lt;br /&gt;
&lt;br /&gt;
[[Software#Ring]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Consult the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User&#039;s Guide] for information on using the wiki software.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/postorius/lists/mediawiki-announce.lists.wikimedia.org/ MediaWiki release mailing list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Module:Template_link_general/config&amp;diff=1539</id>
		<title>Module:Template link general/config</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Module:Template_link_general/config&amp;diff=1539"/>
		<updated>2026-08-17T22:19:12Z</updated>

		<summary type="html">&lt;p&gt;Lynn: Created page with &amp;quot;local cfg = {}; -- Don’t touch this line.  -- The link for the “subst:” prefix when the “link subst” parameter is truthy. -- Set to “nil” to disable  the “link subst” parameter. cfg[&amp;quot;subst-link&amp;quot;] = &amp;quot;Special:MyLanguage/Help:Substitution&amp;quot;;  return cfg; -- Don’t touch this line.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local cfg = {}; -- Don’t touch this line.&lt;br /&gt;
&lt;br /&gt;
-- The link for the “subst:” prefix when the “link subst” parameter is truthy.&lt;br /&gt;
-- Set to “nil” to disable  the “link subst” parameter.&lt;br /&gt;
cfg[&amp;quot;subst-link&amp;quot;] = &amp;quot;Special:MyLanguage/Help:Substitution&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
return cfg; -- Don’t touch this line.&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Module:Template_link_general&amp;diff=1538</id>
		<title>Module:Template link general</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Module:Template_link_general&amp;diff=1538"/>
		<updated>2026-08-17T22:16:14Z</updated>

		<summary type="html">&lt;p&gt;Lynn: Created page with &amp;quot;-- This implements Template:Template link general and various other templates in its family local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs local yesno = require(&amp;#039;Module:Yesno&amp;#039;)  local cfg = mw.loadData(&amp;#039;Module:Template link general/config&amp;#039;)  local p = {}  -- Is a string non-empty? local function _ne(s) 	return s ~= nil and s ~= &amp;quot;&amp;quot; end  local nw = mw.text.nowiki  local function addTemplate(s) 	local i, _ = s:find(&amp;#039;:&amp;#039;, 1, true) 	if i == nil then 		return &amp;#039;Template...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This implements [[Template:Template link general]] and various other templates in its family&lt;br /&gt;
local getArgs = require(&#039;Module:Arguments&#039;).getArgs&lt;br /&gt;
local yesno = require(&#039;Module:Yesno&#039;)&lt;br /&gt;
&lt;br /&gt;
local cfg = mw.loadData(&#039;Module:Template link general/config&#039;)&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Is a string non-empty?&lt;br /&gt;
local function _ne(s)&lt;br /&gt;
	return s ~= nil and s ~= &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local nw = mw.text.nowiki&lt;br /&gt;
&lt;br /&gt;
local function addTemplate(s)&lt;br /&gt;
	local i, _ = s:find(&#039;:&#039;, 1, true)&lt;br /&gt;
	if i == nil then&lt;br /&gt;
		return &#039;Template:&#039; .. s&lt;br /&gt;
	end&lt;br /&gt;
	local ns = s:sub(1, i - 1)&lt;br /&gt;
	if ns == &#039;&#039; or mw.site.namespaces[ns] then&lt;br /&gt;
		return s&lt;br /&gt;
	else&lt;br /&gt;
		return &#039;Template:&#039; .. s&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function trimTemplate(s)&lt;br /&gt;
	local needle = &#039;template:&#039;&lt;br /&gt;
	if s:sub(1, needle:len()):lower() == needle then&lt;br /&gt;
		return s:sub(needle:len() + 1)&lt;br /&gt;
	else&lt;br /&gt;
		return s&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function linkTitle(args)&lt;br /&gt;
	if yesno(args.nolink) then&lt;br /&gt;
		return args[1]&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local titleObj&lt;br /&gt;
	local titlePart = &#039;[[&#039;&lt;br /&gt;
	if args[1] then&lt;br /&gt;
		-- This handles :Page and other NS&lt;br /&gt;
		titleObj = mw.title.new(args[1], &#039;Template&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		titleObj = mw.title.getCurrentTitle()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	titlePart = titlePart .. (titleObj ~= nil and titleObj.fullText or&lt;br /&gt;
				addTemplate(args[1]))&lt;br /&gt;
&lt;br /&gt;
	local textPart = args.alttext&lt;br /&gt;
	if not _ne(textPart) then&lt;br /&gt;
		if titleObj ~= nil then&lt;br /&gt;
			textPart = titleObj:inNamespace(&amp;quot;Template&amp;quot;) and args[1] or titleObj.fullText&lt;br /&gt;
		else&lt;br /&gt;
			-- redlink&lt;br /&gt;
			textPart = args[1]&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if yesno(args.brace) then&lt;br /&gt;
		textPart = nw(&#039;{{&#039;) .. textPart .. nw(&#039;}}&#039;)&lt;br /&gt;
	elseif yesno(args.braceinside) then&lt;br /&gt;
		textPart = nw(&#039;{&#039;) .. textPart .. nw(&#039;}&#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	titlePart = titlePart .. &#039;|&#039; .. textPart .. &#039;]]&#039;&lt;br /&gt;
	if yesno(args.braceinside) then&lt;br /&gt;
		titlePart = nw(&#039;{&#039;) .. titlePart .. nw(&#039;}&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	return titlePart&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = getArgs(frame, {&lt;br /&gt;
		trim = true,&lt;br /&gt;
		removeBlanks = false,&lt;br /&gt;
		frameOnly = false,&lt;br /&gt;
		wrappers = {&lt;br /&gt;
			&amp;quot;Template:Tlg&amp;quot;,&lt;br /&gt;
			&amp;quot;Template:Template link general&amp;quot;,&lt;br /&gt;
		},&lt;br /&gt;
	})&lt;br /&gt;
	return p._main(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(args)&lt;br /&gt;
	-- TemplateStyles&lt;br /&gt;
	local templateStyles = {&lt;br /&gt;
		mono   = false,&lt;br /&gt;
		nowrap = false,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local bold = yesno(args.bold) or yesno(args.boldlink) or yesno(args.boldname)&lt;br /&gt;
	local italic = yesno(args.italic) or yesno(args.italics)&lt;br /&gt;
	local dontBrace = yesno(args.brace) or yesno(args.braceinside)&lt;br /&gt;
	local code = yesno(args.code) or yesno(args.tt)&lt;br /&gt;
	local show_result = yesno(args._show_result)&lt;br /&gt;
	local expand = yesno(args._expand)&lt;br /&gt;
	local classes = {}&lt;br /&gt;
&lt;br /&gt;
	-- Build the link part&lt;br /&gt;
	local titlePart = linkTitle(args)&lt;br /&gt;
	if bold then titlePart = &amp;quot;&#039;&#039;&#039;&amp;quot; .. titlePart .. &amp;quot;&#039;&#039;&#039;&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
	if yesno(args.subst) then&lt;br /&gt;
		local substLink = cfg[&#039;subst-link&#039;]&lt;br /&gt;
		if _ne(substLink) and yesno(args[&#039;link subst&#039;]) then&lt;br /&gt;
			titlePart = &#039;[[&#039; .. substLink .. &#039;|subst]]:&#039; .. titlePart&lt;br /&gt;
		else&lt;br /&gt;
			titlePart = &#039;subst:&#039; .. titlePart&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if yesno(args.nowrapname) then&lt;br /&gt;
		templateStyles.nowrap = true&lt;br /&gt;
		titlePart = &#039;&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;&#039; .. titlePart .. &#039;&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Build the arguments&lt;br /&gt;
	local textPart = &amp;quot;&amp;quot;&lt;br /&gt;
	local textPartBuffer = &amp;quot;&amp;amp;#124;&amp;quot;&lt;br /&gt;
	local codeArguments = {}&lt;br /&gt;
	local codeArgumentsString = &amp;quot;&amp;quot;&lt;br /&gt;
	local i = 2&lt;br /&gt;
	local j = 1&lt;br /&gt;
	while args[i] do&lt;br /&gt;
		local val = args[i]&lt;br /&gt;
		if val ~= &amp;quot;&amp;quot; then&lt;br /&gt;
			if yesno(args.nowiki) then&lt;br /&gt;
				-- Unstrip nowiki tags first because calling nw on something that already contains nowiki tags will&lt;br /&gt;
				-- mangle the nowiki strip marker and result in literal UNIQ...QINU showing up&lt;br /&gt;
				val = nw(mw.text.unstripNoWiki(val))&lt;br /&gt;
			end&lt;br /&gt;
			local k, v = string.match(val, &amp;quot;(.*)=(.*)&amp;quot;)&lt;br /&gt;
			if not k then&lt;br /&gt;
				codeArguments[j] = val&lt;br /&gt;
				j = j + 1&lt;br /&gt;
			else&lt;br /&gt;
				codeArguments[k] = v&lt;br /&gt;
			end&lt;br /&gt;
			codeArgumentsString = codeArgumentsString .. textPartBuffer .. val&lt;br /&gt;
			if italic then&lt;br /&gt;
				val = &#039;&amp;lt;span style=&amp;quot;font-style:italic;&amp;quot;&amp;gt;&#039; .. val .. &#039;&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
			end&lt;br /&gt;
			textPart = textPart .. textPartBuffer .. val&lt;br /&gt;
		end&lt;br /&gt;
		i = i + 1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local tagName = nil&lt;br /&gt;
	local css = nil&lt;br /&gt;
&lt;br /&gt;
	-- final wrap&lt;br /&gt;
	local ret = titlePart .. textPart&lt;br /&gt;
	if not dontBrace then ret = nw(&#039;{{&#039;) .. ret .. nw(&#039;}}&#039;) end&lt;br /&gt;
	if yesno(args.a) then ret = nw(&#039;*&#039;) .. &#039;&amp;amp;nbsp;&#039; .. ret end&lt;br /&gt;
	if yesno(args.kbd) then&lt;br /&gt;
		tagName = &#039;kbd&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if yesno(args.mono) then&lt;br /&gt;
		templateStyles.mono = true&lt;br /&gt;
		table.insert(classes, &#039;monospaced&#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local plaincode = yesno(args.plaincode) and not code&lt;br /&gt;
	if code or plaincode then&lt;br /&gt;
		if tagName then&lt;br /&gt;
			-- kbd == true &amp;amp;&amp;amp; code == true&lt;br /&gt;
			ret = (&#039;&amp;lt;%s&amp;gt;%s&amp;lt;/%s&amp;gt;&#039;):format(tagName, ret, tagName)&lt;br /&gt;
		end&lt;br /&gt;
		tagName = &#039;code&#039;&lt;br /&gt;
		if plaincode then&lt;br /&gt;
			css = {&lt;br /&gt;
				background = &#039;transparent&#039;,&lt;br /&gt;
				border     = &#039;none&#039;,&lt;br /&gt;
				color      = &#039;var(--color-emphasized, #101418)&#039;,&lt;br /&gt;
			}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if show_result then&lt;br /&gt;
		local result = mw.getCurrentFrame():expandTemplate{title = addTemplate(args[1]), args = codeArguments}&lt;br /&gt;
		ret = ret .. &amp;quot; → &amp;quot; .. result&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if expand then&lt;br /&gt;
		local query = mw.text.encode(&#039;{{&#039; .. addTemplate(args[1]) .. string.gsub(codeArgumentsString, textPartBuffer, &amp;quot;|&amp;quot;) .. &#039;}}&#039;)&lt;br /&gt;
		local url = mw.uri.fullUrl(&#039;special:ExpandTemplates&#039;, &#039;wpInput=&#039; .. query)&lt;br /&gt;
		mw.log()&lt;br /&gt;
		ret = ret .. &amp;quot; [&amp;quot; .. tostring(url) .. &amp;quot;]&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if yesno(args.nowrap) then&lt;br /&gt;
		templateStyles.nowrap = true&lt;br /&gt;
		table.insert(classes, &#039;nowrap&#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if tagName or #classes &amp;gt; 0 or css then&lt;br /&gt;
		local span = mw.html.create(tagName or &#039;span&#039;)&lt;br /&gt;
			:addClass(table.concat(classes, &#039; &#039;))&lt;br /&gt;
			:wikitext(ret)&lt;br /&gt;
&lt;br /&gt;
		if css then&lt;br /&gt;
			span:css(css)&lt;br /&gt;
		end&lt;br /&gt;
		ret = tostring(span:allDone())&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local ts = {}&lt;br /&gt;
	if templateStyles.mono then&lt;br /&gt;
		table.insert(ts, mw.getCurrentFrame():extensionTag{&lt;br /&gt;
			name = &#039;templatestyles&#039;,&lt;br /&gt;
			args = { src = &#039;Template:Mono/styles.css&#039; }&lt;br /&gt;
		})&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if templateStyles.nowrap then&lt;br /&gt;
		table.insert(ts, mw.getCurrentFrame():extensionTag{&lt;br /&gt;
			name = &#039;templatestyles&#039;,&lt;br /&gt;
			args = { src = &#039;Template:Nowrap/styles.css&#039; }&lt;br /&gt;
		})&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if yesno(args.debug) then&lt;br /&gt;
		ret = ret .. &#039;\n&amp;lt;pre&amp;gt;&#039; .. mw.text.encode(mw.dumpObject(args)) .. &#039;&amp;lt;/pre&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return table.concat(ts) .. ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Li&amp;diff=1537</id>
		<title>Li</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Li&amp;diff=1537"/>
		<updated>2026-08-17T22:07:18Z</updated>

		<summary type="html">&lt;p&gt;Lynn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT {{Localized link}}&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Li&amp;diff=1536</id>
		<title>Li</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Li&amp;diff=1536"/>
		<updated>2026-08-17T22:07:00Z</updated>

		<summary type="html">&lt;p&gt;Lynn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT {{Template:Localized link}}&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Li&amp;diff=1535</id>
		<title>Li</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Li&amp;diff=1535"/>
		<updated>2026-08-17T22:06:47Z</updated>

		<summary type="html">&lt;p&gt;Lynn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT {{Template:Locaized link}}&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Li&amp;diff=1534</id>
		<title>Li</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Li&amp;diff=1534"/>
		<updated>2026-08-17T22:06:24Z</updated>

		<summary type="html">&lt;p&gt;Lynn: Created page with &amp;quot;#REDIRECT {{Locaized link}}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT {{Locaized link}}&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Template:Doc&amp;diff=1533</id>
		<title>Template:Doc</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Template:Doc&amp;diff=1533"/>
		<updated>2026-08-17T22:02:57Z</updated>

		<summary type="html">&lt;p&gt;Lynn: Created page with &amp;quot;#REDIRECT{{Documentation}}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT{{Documentation}}&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Template:Documentation&amp;diff=1532</id>
		<title>Template:Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Template:Documentation&amp;diff=1532"/>
		<updated>2026-08-17T22:01:01Z</updated>

		<summary type="html">&lt;p&gt;Lynn: Created page with &amp;quot;&amp;lt;noinclude&amp;gt; &amp;lt;languages/&amp;gt; &amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;{{#invoke:documentation|main|_content={{ {{#invoke:documentation|contentTitle}}}}}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt; {{documentation|content=  {{Lua|Module:Documentation}} &amp;lt;translate&amp;gt;&amp;lt;!--T:12--&amp;gt; This template automatically displays a documentation box like the one you are seeing now, of which the content is sometimes transcluded from another page.&amp;lt;/translate&amp;gt; &amp;lt;translate&amp;gt;&amp;lt;!--T:13--&amp;gt; It is intended for pages which are &amp;lt;tvar name=...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&amp;lt;languages/&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;{{#invoke:documentation|main|_content={{ {{#invoke:documentation|contentTitle}}}}}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation|content=&lt;br /&gt;
&lt;br /&gt;
{{Lua|Module:Documentation}}&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:12--&amp;gt; This template automatically displays a documentation box like the one you are seeing now, of which the content is sometimes transcluded from another page.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:13--&amp;gt; It is intended for pages which are [[&amp;lt;tvar name=1&amp;gt;Special:MyLanguage/Help:Transclusion&amp;lt;/tvar&amp;gt;|transcluded]] in other pages, i.e. templates, whether in the template namespace or not.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Usage == &amp;lt;!--T:2--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Customising display === &amp;lt;!--T:3--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:4--&amp;gt;&lt;br /&gt;
Overrides exist to customise the output in special cases:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;{{&amp;lt;/nowiki&amp;gt;documentation{{!}}&#039;&#039;&#039;heading&#039;&#039;&#039;=&amp;lt;nowiki&amp;gt;}}&amp;lt;/nowiki&amp;gt; - &amp;lt;translate&amp;gt;&amp;lt;!--T:5--&amp;gt; change the text of the &amp;quot;documentation&amp;quot; heading.&amp;lt;/translate&amp;gt; &amp;lt;translate&amp;gt;&amp;lt;!--T:10--&amp;gt; If this is set to blank, the entire heading line (including the first [edit] link) will also disappear.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Rationale == &amp;lt;!--T:6--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:7--&amp;gt; This template allows any page to use any documentation page, and makes it possible to protect templates while allowing anyone to edit the template&#039;s documentation and categories.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:8--&amp;gt; It also reduces server resources by circumventing a [[w:Wikipedia:Template limits|technical limitation of templates]] (see a [[&amp;lt;tvar name=1&amp;gt;:en:Special:Diff/69888944&amp;lt;/tvar&amp;gt;|developer&#039;s explanation]]).&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== See also == &amp;lt;!--T:9--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:14--&amp;gt; [[w:Template:Documentation subpage]]&amp;lt;/translate&amp;gt;&lt;br /&gt;
* {{tim|Documentation}}&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:11--&amp;gt; [[w:Wikipedia:Template documentation]]&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
[[Category:Formatting templates{{#translation:}}|Template documentation]]&lt;br /&gt;
[[Category:Template documentation{{#translation:}}| ]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;{{#if:{{{content|}}}|&lt;br /&gt;
[[Category:Template documentation pages{{#translation:}}]]&lt;br /&gt;
}}&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Module:Template_translation&amp;diff=1527</id>
		<title>Module:Template translation</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Module:Template_translation&amp;diff=1527"/>
		<updated>2026-08-17T21:49:22Z</updated>

		<summary type="html">&lt;p&gt;Lynn: Created page with &amp;quot;local this = {}  function this.checkLanguage(subpage, default)     --[[Check first if there&amp;#039;s an any invalid character that would cause the         mw.language.isKnownLanguageTag function() to throw an exception:         - all ASCII controls in [\000-\031\127],         - double quote (&amp;quot;), sharp sign (#), ampersand (&amp;amp;), apostrophe (&amp;#039;),         - slash (/), colon (:), semicolon (;), lower than (&amp;lt;), greater than (&amp;gt;),         - brackets and braces ([, ], {, }), pipe (|), bac...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local this = {}&lt;br /&gt;
&lt;br /&gt;
function this.checkLanguage(subpage, default)&lt;br /&gt;
    --[[Check first if there&#039;s an any invalid character that would cause the&lt;br /&gt;
        mw.language.isKnownLanguageTag function() to throw an exception:&lt;br /&gt;
        - all ASCII controls in [\000-\031\127],&lt;br /&gt;
        - double quote (&amp;quot;), sharp sign (#), ampersand (&amp;amp;), apostrophe (&#039;),&lt;br /&gt;
        - slash (/), colon (:), semicolon (;), lower than (&amp;lt;), greater than (&amp;gt;),&lt;br /&gt;
        - brackets and braces ([, ], {, }), pipe (|), backslash (\\)&lt;br /&gt;
        All other characters are accepted, including space and all non-ASCII&lt;br /&gt;
        characters (including \192, which is invalid in UTF-8).&lt;br /&gt;
    --]]&lt;br /&gt;
    if mw.language.isValidCode(subpage) and mw.language.isKnownLanguageTag(subpage)&lt;br /&gt;
    --[[However &amp;quot;SupportedLanguages&amp;quot; are too restrictive, as they discard many&lt;br /&gt;
        valid BCP47 script variants (only because MediaWiki still does not&lt;br /&gt;
        define automatic transliterators for them, e.g. &amp;quot;en-dsrt&amp;quot; or&lt;br /&gt;
        &amp;quot;fr-brai&amp;quot; for French transliteration in Braille), and country variants,&lt;br /&gt;
        (useful in localized data, even if they are no longer used for&lt;br /&gt;
        translations, such as zh-cn, also useful for legacy codes).&lt;br /&gt;
        We want to avoid matching subpagenames containing any uppercase letter,&lt;br /&gt;
        (even if they are considered valid in BCP 47, in which they are&lt;br /&gt;
        case-insensitive; they are not &amp;quot;SupportedLanguages&amp;quot; for MediaWiki, so&lt;br /&gt;
        they are not &amp;quot;KnownLanguageTags&amp;quot; for MediaWiki).&lt;br /&gt;
        To be more restrictive, we exclude tags&lt;br /&gt;
        * for specific uses in template subpages and unusable as language tags;&lt;br /&gt;
        * that is not ASCII and not a lowercase letter, minus-hyphen, or digit,&lt;br /&gt;
          or does not start by a letter or does not finish by a letter or digit;&lt;br /&gt;
        * or that has subtags with more than 8 characters between hyphens;&lt;br /&gt;
        * or that has two hyphens.&lt;br /&gt;
    --]]&lt;br /&gt;
    or  subpage ~= &amp;quot;doc&amp;quot;&lt;br /&gt;
    and subpage ~= &amp;quot;layout&amp;quot;&lt;br /&gt;
    and subpage ~= &amp;quot;button&amp;quot;&lt;br /&gt;
    and subpage ~= &amp;quot;buttons&amp;quot;&lt;br /&gt;
    and subpage ~= &amp;quot;sandbox&amp;quot;&lt;br /&gt;
    and subpage ~= &amp;quot;testcase&amp;quot;&lt;br /&gt;
    and subpage ~= &amp;quot;testcases&amp;quot;&lt;br /&gt;
    and string.find(subpage, &amp;quot;^[%l][%-%d%l]*[%d%l]$&amp;quot;) ~= nil&lt;br /&gt;
    and string.find(subpage, &amp;quot;[%d%l][%d%l][%d%l][%d%l][%d%l][%d%l][%d%l][%d%l][%d%l]&amp;quot;) == nil&lt;br /&gt;
    and string.find(subpage, &amp;quot;%-%-&amp;quot;) == nil then&lt;br /&gt;
        return subpage&lt;br /&gt;
    end&lt;br /&gt;
    -- Otherwise there&#039;s currently no known language subpage&lt;br /&gt;
    return default&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[Get the last subpage of an arbitrary page if it is a translation.&lt;br /&gt;
    To be used from templates.&lt;br /&gt;
    ]]&lt;br /&gt;
function this.getLanguageSubpage(frame)&lt;br /&gt;
	local title = frame and frame.args[1]&lt;br /&gt;
	if not title or title == &#039;&#039; then&lt;br /&gt;
		title = mw.title.getCurrentTitle()&lt;br /&gt;
	end&lt;br /&gt;
	return this._getLanguageSubpage(title)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[Get the last subpage of an arbitrary page if it is a translation.&lt;br /&gt;
    To be used from Lua.&lt;br /&gt;
    ]]&lt;br /&gt;
function this._getLanguageSubpage(title)&lt;br /&gt;
	if type(title) == &#039;string&#039; then&lt;br /&gt;
		title = mw.title.new(title)&lt;br /&gt;
	end&lt;br /&gt;
	if not title then&lt;br /&gt;
		-- invalid title&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	--[[This code does not work in all namespaces where the Translate tool works.&lt;br /&gt;
	--  It works in the main namespace on Meta because it allows subpages there&lt;br /&gt;
	--  It would not work in the main namespace of English Wikipedia (but the&lt;br /&gt;
	--  articles are monolignual on that wiki).&lt;br /&gt;
	--  On Meta-Wiki the main space uses subpages and its pages are translated.&lt;br /&gt;
	--  The Translate tool allows translatng pages in all namespaces, even if&lt;br /&gt;
	--  the namespace officially does not have subpages.&lt;br /&gt;
	--  On Meta-Wiki the Category namespace still does not have subpages enabled,&lt;br /&gt;
	--  even if they would be very useful for categorizing templates, that DO have&lt;br /&gt;
	--  subpages (for documentatio and tstboxes pages). This is a misconfiguration&lt;br /&gt;
	--  bug of Meta-Wiki. The work-around is to split the full title and then&lt;br /&gt;
	--  get the last titlepart.&lt;br /&gt;
	local subpage = title.subpageText&lt;br /&gt;
	--]]&lt;br /&gt;
	local titleparts = mw.text.split(title.fullText, &#039;/&#039;)&lt;br /&gt;
	local subpage = titleparts[#titleparts]&lt;br /&gt;
	return this.checkLanguage(subpage, &#039;&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[Get the last subpage of the current page if it is a translation.&lt;br /&gt;
    ]]&lt;br /&gt;
function this.getCurrentLanguageSubpage()&lt;br /&gt;
	return this._getLanguageSubpage(mw.title.getCurrentTitle())&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[Get the first part of the language code of the subpage, before the &#039;-&#039;.&lt;br /&gt;
--]]&lt;br /&gt;
function this.getMainLanguageSubpage()&lt;br /&gt;
	parts = mw.text.split(this.getCurrentLanguageSubpage(), &#039;-&#039;)&lt;br /&gt;
	return parts[1]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[Get the last subpage of the current frame if it is a translation.&lt;br /&gt;
    Not used locally.&lt;br /&gt;
--]]&lt;br /&gt;
function this.getFrameLanguageSubpage(frame)&lt;br /&gt;
	return this._getLanguageSubpage(frame:getParent():getTitle())&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[Get the language of the current page. Not used locally.&lt;br /&gt;
--]]&lt;br /&gt;
function this.getLanguage()&lt;br /&gt;
    local subpage = mw.title.getCurrentTitle().subpageText&lt;br /&gt;
    return this.checkLanguage(subpage, mw.language.getContentLanguage():getCode())&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[Get the language of the current frame. Not used locally.&lt;br /&gt;
--]]&lt;br /&gt;
function this.getFrameLanguage(frame)&lt;br /&gt;
    local titleparts = mw.text.split(frame:getParent():getTitle(), &#039;/&#039;)&lt;br /&gt;
    local subpage = titleparts[#titleparts]&lt;br /&gt;
    return this.checkLanguage(subpage, mw.language.getContentLanguage():getCode())&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function this.title(namespace, basepagename, subpage)&lt;br /&gt;
    local message, title&lt;br /&gt;
    local pagename = basepagename&lt;br /&gt;
    if (subpage or &#039;&#039;) ~= &#039;&#039; then&lt;br /&gt;
        pagename = pagename .. &#039;/&#039; .. subpage&lt;br /&gt;
    end&lt;br /&gt;
    local valid, title = xpcall(function()&lt;br /&gt;
            return mw.title.new(pagename, namespace) -- costly&lt;br /&gt;
        end, function(msg) -- catch undocumented exception (!?)&lt;br /&gt;
            -- thrown when namespace does not exist. The doc still&lt;br /&gt;
            -- says it should return a title, even in that case...&lt;br /&gt;
            message = msg&lt;br /&gt;
        end)&lt;br /&gt;
    if valid and title ~= nil and (title.id or 0) ~= 0 then&lt;br /&gt;
        return title&lt;br /&gt;
    end&lt;br /&gt;
    return { -- &amp;quot;pseudo&amp;quot; mw.title object with id = nil in case of error&lt;br /&gt;
        prefixedText = pagename, -- the only property we need below&lt;br /&gt;
        message = message -- only for debugging&lt;br /&gt;
    }&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[If on a translation subpage (like Foobar/de), this function returns&lt;br /&gt;
    a given template in the same language, if the translation is available.&lt;br /&gt;
    Otherwise, the template is returned in its default language, without&lt;br /&gt;
    modification.&lt;br /&gt;
    This is aimed at replacing the current implementation of Template:TNTN.&lt;br /&gt;
&lt;br /&gt;
    This version does not expand the returned template name: this solves the&lt;br /&gt;
    problem of self-recursion in TNT when translatable templates need themselves&lt;br /&gt;
    to transclude other translable templates (such as Tnavbar).&lt;br /&gt;
--]]&lt;br /&gt;
function this.getTranslatedTemplate(frame, withStatus)&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    local pagename = args[&#039;template&#039;]&lt;br /&gt;
    --[[Check whether the pagename is actually in the Template namespace, or&lt;br /&gt;
        if we&#039;re transcluding a main-namespace page.&lt;br /&gt;
        (added for backward compatibility of Template:TNT)&lt;br /&gt;
        ]]&lt;br /&gt;
    local namespace, title = args[&#039;tntns&#039;] or &#039;&#039;&lt;br /&gt;
    if namespace ~= &#039;&#039; then -- Checks for tntns parameter for custom ns.&lt;br /&gt;
        title = this.title(namespace, pagename) -- Costly&lt;br /&gt;
    else -- Supposes that set page is in ns10.&lt;br /&gt;
    	namespace = &#039;Template&#039;&lt;br /&gt;
        title = this.title(namespace, pagename) -- Costly&lt;br /&gt;
        if title.id == nil then -- not found in the Template namespace, assume the main namespace (for backward compatibility)&lt;br /&gt;
    	    namespace = &#039;&#039;&lt;br /&gt;
            title = this.title(namespace, pagename) -- Costly&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- Get the last subpage and check if it matches a known language code.&lt;br /&gt;
    local subpage = args[&#039;uselang&#039;] or &#039;&#039;&lt;br /&gt;
    if subpage == &#039;&#039; then&lt;br /&gt;
        subpage = this.getCurrentLanguageSubpage()&lt;br /&gt;
    end&lt;br /&gt;
    if subpage == &#039;&#039; then&lt;br /&gt;
        -- Check if a translation of the pagename exists in English&lt;br /&gt;
        local newtitle = this.title(namespace, pagename, &#039;en&#039;) -- Costly&lt;br /&gt;
        -- Use the translation when it exists&lt;br /&gt;
        if newtitle.id ~= nil then&lt;br /&gt;
            title = newtitle&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        -- Check if a translation of the pagename exists in that language&lt;br /&gt;
        local newtitle = this.title(namespace, pagename, subpage) -- Costly&lt;br /&gt;
        if newtitle.id == nil then&lt;br /&gt;
            -- Check if a translation of the pagename exists in English&lt;br /&gt;
            newtitle = this.title(namespace, pagename, &#039;en&#039;) -- Costly&lt;br /&gt;
        end&lt;br /&gt;
        -- Use the translation when it exists&lt;br /&gt;
        if newtitle.id ~= nil then&lt;br /&gt;
            title = newtitle&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- At this point the title should exist&lt;br /&gt;
    if withStatus then&lt;br /&gt;
    	-- status returned to Lua function below&lt;br /&gt;
        return title.prefixedText, title.id ~= nil&lt;br /&gt;
    else&lt;br /&gt;
    	-- returned directly to MediaWiki&lt;br /&gt;
        return title.prefixedText&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[If on a translation subpage (like Foobar/de), this function renders&lt;br /&gt;
    a given template in the same language, if the translation is available.&lt;br /&gt;
    Otherwise, the template is rendered in its default language, without&lt;br /&gt;
    modification.&lt;br /&gt;
    This is aimed at replacing the current implementation of Template:TNT.&lt;br /&gt;
    &lt;br /&gt;
    Note that translatable templates cannot transclude themselves other&lt;br /&gt;
    translatable templates, as it will recurse on TNT. Use TNTN instead&lt;br /&gt;
    to return only the effective template name to expand externally, with&lt;br /&gt;
    template parameters also provided externally.&lt;br /&gt;
--]]&lt;br /&gt;
function this.renderTranslatedTemplate(frame)&lt;br /&gt;
	local title, found = this.getTranslatedTemplate(frame, true)&lt;br /&gt;
    -- At this point the title should exist prior to performing the expansion&lt;br /&gt;
    -- of the template, otherwise render a red link to the missing page&lt;br /&gt;
    -- (resolved in its assumed namespace). If we don&#039;t tet this here, a&lt;br /&gt;
    -- script error would be thrown. Returning a red link is consistant with&lt;br /&gt;
    -- MediaWiki behavior when attempting to transclude inexistant templates.&lt;br /&gt;
	if not found then&lt;br /&gt;
		return &#039;[[&#039; .. title .. &#039;]]&#039;&lt;br /&gt;
	end&lt;br /&gt;
    -- Copy args pseudo-table to a proper table so we can feed it to expandTemplate.&lt;br /&gt;
    -- Then render the pagename.&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    local pargs = (frame:getParent() or {}).args&lt;br /&gt;
    local arguments = {}&lt;br /&gt;
    if (args[&#039;noshift&#039;] or &#039;&#039;) == &#039;&#039; then&lt;br /&gt;
        for k, v in pairs(pargs) do&lt;br /&gt;
            local n = tonumber(k) or 0&lt;br /&gt;
            if n &amp;lt;= 0 then -- unnumbered args&lt;br /&gt;
                arguments[k] = v&lt;br /&gt;
            elseif n &amp;gt;= 2 then -- numbered args &amp;gt;= 2 need to be shifted&lt;br /&gt;
                arguments[n - 1] = v&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    else -- special case where TNT is used as autotranslate&lt;br /&gt;
    	-- (don&#039;t shift again what is shifted in the invokation)&lt;br /&gt;
        for k, v in pairs(pargs) do&lt;br /&gt;
            arguments[k] = v&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    arguments[&#039;template&#039;] = title -- override the existing parameter of the base template name supplied with the full name of the actual template expanded&lt;br /&gt;
    arguments[&#039;tntns&#039;] = nil -- discard the specified namespace override&lt;br /&gt;
    arguments[&#039;uselang&#039;] = args[&#039;uselang&#039;] -- argument forwarded into parent frame&lt;br /&gt;
    arguments[&#039;noshift&#039;] = args[&#039;noshift&#039;] -- argument forwarded into parent frame&lt;br /&gt;
    return frame:expandTemplate{title = &#039;:&#039; .. title, args = arguments}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[A helper for mocking TNT in Special:TemplateSandbox. TNT breaks&lt;br /&gt;
    TemplateSandbox; mocking it with this method means templates won&#039;t be&lt;br /&gt;
    localized but at least TemplateSandbox substitutions will work properly.&lt;br /&gt;
    Won&#039;t work with complex uses.&lt;br /&gt;
--]]&lt;br /&gt;
function this.mockTNT(frame)&lt;br /&gt;
    local pargs = (frame:getParent() or {}).args&lt;br /&gt;
    local arguments = {}&lt;br /&gt;
    for k, v in pairs(pargs) do&lt;br /&gt;
        local n = tonumber(k) or 0&lt;br /&gt;
        if n &amp;lt;= 0 then -- unnumbered args&lt;br /&gt;
            arguments[k] = v&lt;br /&gt;
        elseif n &amp;gt;= 2 then -- numbered args &amp;gt;= 2 need to be shifted&lt;br /&gt;
            arguments[n - 1] = v&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if not pargs[1] then&lt;br /&gt;
    	return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
    return frame:expandTemplate{title = &#039;Template:&#039; .. pargs[1], args = arguments}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return this&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Module:Transclusion_count&amp;diff=1526</id>
		<title>Module:Transclusion count</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Module:Transclusion_count&amp;diff=1526"/>
		<updated>2026-08-17T21:45:14Z</updated>

		<summary type="html">&lt;p&gt;Lynn: Created page with &amp;quot;local p = {}  function p._fetch(args) 	local template = nil 	local return_value = nil  	-- Use demo parameter if it exists, otherwise use current template name 	local namespace = mw.title.getCurrentTitle().namespace 	if args[&amp;quot;demo&amp;quot;] and args[&amp;quot;demo&amp;quot;] ~= &amp;quot;&amp;quot; then 		template = mw.ustring.gsub(args[&amp;quot;demo&amp;quot;],&amp;quot;^[Tt]emplate:&amp;quot;,&amp;quot;&amp;quot;) 	elseif namespace == 10 then -- Template namespace 		template = mw.title.getCurrentTitle().text 	elseif namespace == 828 then -- Module namespace 		temp...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
function p._fetch(args)&lt;br /&gt;
	local template = nil&lt;br /&gt;
	local return_value = nil&lt;br /&gt;
&lt;br /&gt;
	-- Use demo parameter if it exists, otherwise use current template name&lt;br /&gt;
	local namespace = mw.title.getCurrentTitle().namespace&lt;br /&gt;
	if args[&amp;quot;demo&amp;quot;] and args[&amp;quot;demo&amp;quot;] ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		template = mw.ustring.gsub(args[&amp;quot;demo&amp;quot;],&amp;quot;^[Tt]emplate:&amp;quot;,&amp;quot;&amp;quot;)&lt;br /&gt;
	elseif namespace == 10 then -- Template namespace&lt;br /&gt;
		template = mw.title.getCurrentTitle().text&lt;br /&gt;
	elseif namespace == 828 then -- Module namespace&lt;br /&gt;
		template = (mw.site.namespaces[828].name .. &amp;quot;:&amp;quot; .. mw.title.getCurrentTitle().text)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- If in template or module namespace, look up count in /data&lt;br /&gt;
	if template ~= nil then&lt;br /&gt;
		namespace = mw.title.new(template, &amp;quot;Template&amp;quot;).namespace&lt;br /&gt;
		if namespace == 10 or namespace == 828 then&lt;br /&gt;
			template =  mw.ustring.gsub(template, &amp;quot;/doc$&amp;quot;, &amp;quot;&amp;quot;) -- strip /doc from end&lt;br /&gt;
			template =  mw.ustring.gsub(template, &amp;quot;/sandbox$&amp;quot;, &amp;quot;&amp;quot;) -- strip /sandbox from end&lt;br /&gt;
			local index = mw.ustring.sub(mw.title.new(template).text,1,1)&lt;br /&gt;
			local status, data = pcall(function ()&lt;br /&gt;
				return(mw.loadData(&#039;Module:Transclusion_count/data/&#039; .. (mw.ustring.find(index, &amp;quot;%a&amp;quot;) and index or &amp;quot;other&amp;quot;)))&lt;br /&gt;
			end)&lt;br /&gt;
			if status then&lt;br /&gt;
				return_value = tonumber(data[mw.ustring.gsub(template, &amp;quot; &amp;quot;, &amp;quot;_&amp;quot;)])&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- If database value doesn&#039;t exist, use value passed to template&lt;br /&gt;
	if return_value == nil and args[1] ~= nil then&lt;br /&gt;
		local arg1=mw.ustring.match(args[1], &#039;[%d,]+&#039;)&lt;br /&gt;
		if arg1 and arg1 ~= &#039;&#039; then&lt;br /&gt;
			return_value = tonumber(mw.getCurrentFrame():callParserFunction(&#039;formatnum&#039;, arg1, &#039;R&#039;))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return return_value	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.fetch(frame)&lt;br /&gt;
	return p._fetch(frame.args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Tabulate this data for [[Wikipedia:Database reports/Templates transcluded on the most pages]]&lt;br /&gt;
function p.tabulate()&lt;br /&gt;
	local list = {}&lt;br /&gt;
	for i = 65, 91 do&lt;br /&gt;
		local data = mw.loadData(&#039;Module:Transclusion count/data/&#039; .. ((i == 91) and &#039;other&#039; or string.char(i)))&lt;br /&gt;
		for name, count in pairs(data) do&lt;br /&gt;
			local title = mw.title.new(name, &amp;quot;Template&amp;quot;)&lt;br /&gt;
			table.insert(list, {title, count})&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(list, function(a, b)&lt;br /&gt;
		return (a[2] == b[2]) and (a[1] &amp;lt; b[1]) or (a[2] &amp;gt; b[2])&lt;br /&gt;
	end)&lt;br /&gt;
	local lang = mw.getContentLanguage();&lt;br /&gt;
	for i = 1, #list do&lt;br /&gt;
		local protLevel = &amp;quot;&amp;quot;&lt;br /&gt;
		local title = list[i][1]&lt;br /&gt;
		if i &amp;lt; 400 then&lt;br /&gt;
			-- Stop at 400 to avoid breaching the expensive parser function call limit&lt;br /&gt;
			protLevel = title.protectionLevels.edit[1] or &amp;quot;(unprotected)&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		list[i] = (&#039;|-\n| %d || [[%s]] || %s || %s \n&#039;):format(i, title.fullText:gsub(&#039;_&#039;, &#039; &#039;), lang:formatNum(list[i][2]), protLevel)&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat(list)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Template:Localized_link&amp;diff=1525</id>
		<title>Template:Localized link</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Template:Localized_link&amp;diff=1525"/>
		<updated>2026-08-17T21:41:29Z</updated>

		<summary type="html">&lt;p&gt;Lynn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&amp;lt;languages/&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#ifeq:{{FULLPAGENAME:{{{1}}}}}|{{FULLPAGENAME:{{translatable}}}}&amp;lt;!--self link (including translation pages)--&amp;gt;&lt;br /&gt;
  |&amp;lt;b&amp;gt;&lt;br /&gt;
}}&amp;lt;!----&amp;gt;[[Special:MyLanguage/{{{1}}}|{{#if:{{{2|}}}&lt;br /&gt;
|{{{2}}}&lt;br /&gt;
|{{{2|{{#ifexist:Translations:{{#if:{{NAMESPACE:{{{1}}}}}|{{NAMESPACE:{{{1}}}}}:}}{{PAGENAME:{{{1}}}}}/Page display title/{{PAGELANGUAGE}}&amp;lt;!--if the source page, PAGELANGUAGE returns en--&amp;gt;&lt;br /&gt;
  |{{#ifexpr:{{#if:{{{nsp|}}}|1|0}} and {{NAMESPACENUMBER:{{{1}}}}}!=0&lt;br /&gt;
    |{{#ifeq:{{PAGELANGUAGE}}|en&lt;br /&gt;
      |{{PAGENAME:{{{1}}}}}&lt;br /&gt;
      |&amp;lt;!-- check whether the string is not empty --&amp;gt;&amp;lt;!--&lt;br /&gt;
    --&amp;gt;{{#if:{{PAGENAME:{{ {{TNTN|Translations:{{#if:{{NAMESPACE:{{{1}}}}}|{{NAMESPACE:{{{1}}}}}:}}{{PAGENAME:{{{1}}}}}/Page_display_title}} }} }}&lt;br /&gt;
         |{{#ifeq:{{#invoke:string|find|{{PAGENAME:{{ {{TNTN|Translations:{{#if:{{NAMESPACE:{{{1}}}}}|{{NAMESPACE:{{{1}}}}}:}}{{PAGENAME:{{{1}}}}}/Page_display_title}} }} }}|:}}|0&lt;br /&gt;
           |{{PAGENAME:{{ {{TNTN|Translations:{{#if:{{NAMESPACE:{{{1}}}}}|{{NAMESPACE:{{{1}}}}}:}}{{PAGENAME:{{{1}}}}}/Page_display_title}} }} }}&lt;br /&gt;
           | {{#invoke:string|match|{{PAGENAME:{{ {{TNTN|Translations:{{#if:{{NAMESPACE:{{{1}}}}}|{{NAMESPACE:{{{1}}}}}:}}{{PAGENAME:{{{1}}}}}/Page_display_title}} }} }}|:(.*)}}&lt;br /&gt;
         }}&lt;br /&gt;
         |&amp;lt;!-- pass parameter to, e.g., &amp;quot;Template:LC zh&amp;quot;; check whether the string is not empty --&amp;gt;&amp;lt;!--&lt;br /&gt;
       --&amp;gt;{{#if:{{ {{TNTN|Translations:{{#if:{{NAMESPACE:{{{1}}}}}|{{NAMESPACE:{{{1}}}}}:}}{{PAGENAME:{{{1}}}}}/Page_display_title}} | nsp = 0 }}&lt;br /&gt;
           |{{ {{TNTN|Translations:{{#if:{{NAMESPACE:{{{1}}}}}|{{NAMESPACE:{{{1}}}}}:}}{{PAGENAME:{{{1}}}}}/Page_display_title}} | nsp = 0 }}&lt;br /&gt;
           |{{{1}}}&lt;br /&gt;
        }}&lt;br /&gt;
      }}&lt;br /&gt;
    }}&lt;br /&gt;
    |{{ {{TNTN|Translations:{{#if:{{NAMESPACE:{{{1}}}}}|{{NAMESPACE:{{{1}}}}}:}}{{PAGENAME:{{{1}}}}}/Page_display_title}} }}&lt;br /&gt;
  }}&lt;br /&gt;
  &amp;lt;!--if the translation page does not exist (or called from the source page), output as is--&amp;gt;&lt;br /&gt;
  |{{#if:{{{nsp|}}}&lt;br /&gt;
    |{{#if:{{PAGENAME:{{{1}}}}}&lt;br /&gt;
      |{{PAGENAME:{{{1}}}}}&lt;br /&gt;
      |{{{1}}}&lt;br /&gt;
    }}&lt;br /&gt;
    |{{{1}}}&lt;br /&gt;
  }}&lt;br /&gt;
}}&amp;lt;!--#ifexist--&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;}}}&amp;lt;!--{{{2|--&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;}}&amp;lt;!--#if:{{{2|}}}--&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;]]&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#ifeq:{{FULLPAGENAME:{{{1}}}}}|{{FULLPAGENAME:{{translatable}}}}&amp;lt;!--self link (including translation pages)--&amp;gt;&lt;br /&gt;
  |&amp;lt;/b&amp;gt;&lt;br /&gt;
}}&amp;lt;span style=&amp;quot;display:none&amp;quot;&amp;gt;[[:{{{1}}}| ]]&amp;lt;/span&amp;gt;&amp;lt;!-- T63547 --&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation|content=&lt;br /&gt;
&lt;br /&gt;
{{tsh|ll|LL}}&lt;br /&gt;
{{High-use|35000}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Purpose == &amp;lt;!--T:1--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:8--&amp;gt; This helper template can be used to link to [[&amp;lt;tvar name=1&amp;gt;Special:LanguageStats&amp;lt;/tvar&amp;gt;|translatable pages]] in the user&#039;s language.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:9--&amp;gt; It uses the special page prefix &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;Special:MyLanguage/&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt;, which checks if there is a translated version of a page in the user&#039;s language, and links to it if there is one, and links to a fallback language where available, or the default wiki language version (English in MediaWiki) if there isn&#039;t.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Usage == &amp;lt;!--T:2--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
{{Localized link/doc}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:11--&amp;gt;&lt;br /&gt;
If the &amp;quot;&amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;nsp&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt;&amp;quot; parameter is not defined, as link text this displays the full pagename (including the namespace); otherwise — if the &amp;quot;&amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;nsp&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt;&amp;quot; parameter is defined to any value the link text displays the short pagename (without the namespace).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:25--&amp;gt;&lt;br /&gt;
When linking to a section within a page, the section is not displayed in the link text.&lt;br /&gt;
&lt;br /&gt;
=== Examples of simple usage === &amp;lt;!--T:3--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
{{(}}{{!}} class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
{{!}}-&lt;br /&gt;
! &amp;lt;translate&amp;gt;&amp;lt;!--T:4--&amp;gt; Use&amp;lt;/translate&amp;gt;&lt;br /&gt;
! &amp;lt;translate&amp;gt;&amp;lt;!--T:5--&amp;gt; Becomes&amp;lt;/translate&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} {{Tlx|ll|Communication}}&lt;br /&gt;
{{!}} {{ll|Communication}}&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} {{Tlx|ll|Communication|コミュニケーション}}&lt;br /&gt;
{{!}} {{ll|Communication|コミュニケーション}}&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} {{Tlx|ll|Project:About}}&lt;br /&gt;
{{!}} {{ll|Project:About}}&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} {{Tlx|ll|Project:About#See_also}}&lt;br /&gt;
{{!}} {{ll|Project:About#See_also}}&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} {{Tlx|ll|Project:About|nsp{{=}}0}}&lt;br /&gt;
{{!}} {{ll|Project:About|nsp=0}}&lt;br /&gt;
{{!}}{{)}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Usage in translatable pages == &amp;lt;!--T:6--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:12--&amp;gt;&lt;br /&gt;
On pages prepared for translation with the &amp;lt;tvar name=1&amp;gt;{{ll|Extension:Translate|nsp=0}}&amp;lt;/tvar&amp;gt; extension, this template may be used in three ways.&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;translate&amp;gt;&amp;lt;!--T:13--&amp;gt; Substitute this template, then embed the wikilink target in a &amp;lt;tvar name=1&amp;gt;{{#tag:syntaxhighlight|{{^(}}tvar name=id{{)^}}...{{^(}}/tvar{{)^}}|lang=html|inline=1}}&amp;lt;/tvar&amp;gt;, separate from the translatable text of the link.&amp;lt;/translate&amp;gt;&lt;br /&gt;
#: &amp;lt;translate&amp;gt;&amp;lt;!--T:26--&amp;gt; For example:&amp;lt;/translate&amp;gt; {{#tag:syntaxhighlight|Learn more {{{{^(}}tvar name=1{{)^}}ll|Communication{{^(}}/tvar{{)^}}|about communication}}.|lang=html|inline=1}}&lt;br /&gt;
# &amp;lt;translate&amp;gt;&amp;lt;!--T:16--&amp;gt; If link text is the same as the name of the target page, all of the code could also be embedded into &amp;lt;tvar name=1&amp;gt;{{tag|tvar|open}}&amp;lt;/tvar&amp;gt;.&amp;lt;/translate&amp;gt;&lt;br /&gt;
#: &amp;lt;translate&amp;gt;&amp;lt;!--T:27--&amp;gt; For example:&amp;lt;/translate&amp;gt; {{#tag:syntaxhighlight|Learn more about {{^(}}tvar name=1{{)^}}&amp;lt;nowiki&amp;gt;{{ll|Communication}}&amp;lt;/nowiki&amp;gt;{{^(}}/tvar{{)^}}.|lang=html|inline=1}}&lt;br /&gt;
# &amp;lt;translate&amp;gt;&amp;lt;!--T:28--&amp;gt; For standalone links, such as in a list or table, translate only the link text if it differs from the name of the target page.&amp;lt;/translate&amp;gt; &amp;lt;translate&amp;gt;&amp;lt;!--T:15--&amp;gt; This is useful for bulleted lists of links, e.g. in the &amp;quot;See also:&amp;quot; sections.&amp;lt;/translate&amp;gt; &amp;lt;translate&amp;gt;&amp;lt;!--T:29--&amp;gt; Make sure to include the parameter name when adding translate tags inside template syntax.&amp;lt;/translate&amp;gt;&lt;br /&gt;
#: &amp;lt;translate&amp;gt;&amp;lt;!--T:30--&amp;gt; For example:&amp;lt;/translate&amp;gt;&lt;br /&gt;
::: {{#tag:syntaxhighlight|* {{((}}ll{{!}}Project:About{{))}}|lang=html|inline=1}}&lt;br /&gt;
::: {{#tag:syntaxhighlight|* {{((}}ll{{!}}Communication{{!}}2={{^(}}translate{{)^}}About communication{{^(}}/translate{{)^}}{{))}}|lang=html|inline=1}}&lt;br /&gt;
&lt;br /&gt;
== Test cases ==&lt;br /&gt;
{{Localized link/testcases}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== See also == &amp;lt;!--T:7--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* [[Template:Localized link/messagedoc]] — &amp;lt;translate&amp;gt;&amp;lt;!--T:17--&amp;gt; should be used for message documentation in translatable pages that use this template.&amp;lt;/translate&amp;gt;&lt;br /&gt;
* {{tl|Translatable template}} - &amp;lt;translate&amp;gt;&amp;lt;!--T:18--&amp;gt; alias &amp;lt;tvar name=1&amp;gt;{{tl|TNT}}&amp;lt;/tvar&amp;gt; or &amp;lt;tvar name=2&amp;gt;{{tl|tnt}}&amp;lt;/tvar&amp;gt;&amp;lt;/translate&amp;gt;&lt;br /&gt;
* {{tl|Translatable template name}} - &amp;lt;translate&amp;gt;&amp;lt;!--T:19--&amp;gt; alias &amp;lt;tvar name=1&amp;gt;{{tl|TNTN}}&amp;lt;/tvar&amp;gt; or &amp;lt;tvar name=2&amp;gt;{{tl|tntn}}&amp;lt;/tvar&amp;gt;&amp;lt;/translate&amp;gt;&lt;br /&gt;
* {{tl|Page language link}} - &amp;lt;translate&amp;gt;&amp;lt;!--T:20--&amp;gt; alias &amp;lt;tvar name=1&amp;gt;{{tl|pll}}&amp;lt;/tvar&amp;gt;&amp;lt;/translate&amp;gt; - &amp;lt;translate&amp;gt;&amp;lt;!--T:21--&amp;gt; add a link from a translatable page to another translatable page in the same language&amp;lt;/translate&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
[[Category:Internationalization templates{{#translation:}}]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Template:Div_col&amp;diff=1524</id>
		<title>Template:Div col</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Template:Div_col&amp;diff=1524"/>
		<updated>2026-08-17T21:34:55Z</updated>

		<summary type="html">&lt;p&gt;Lynn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;&amp;lt;templatestyles src=&amp;quot;Div col/styles.css&amp;quot;/&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;div class=&amp;quot;div-col {{#ifeq:{{{small|}}}|yes|div-col-small}} {{#ifeq:{{{rules|}}}|yes|div-col-rules}} {{{class|}}}&amp;quot; &amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{colwidth|}}}{{{gap|}}}{{{style|}}}|&amp;lt;!--&lt;br /&gt;
--&amp;gt;style=&amp;quot;{{#if:{{{colwidth|}}}|column-width: {{{colwidth}}};}}{{#if:{{{gap|}}}|column-gap: {{{gap}}};}}{{#if:{{{style|}}}|{{{style}}}}}&amp;quot;&amp;lt;!--&lt;br /&gt;
--&amp;gt;}}&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{content|}}}|{{{content}}}&amp;lt;/div&amp;gt;}}&amp;lt;!-- Inventory how many pages use small=yes &lt;br /&gt;
--&amp;gt;{{#ifeq:{{{small|}}}|yes|[[Category:Pages using div col with small parameter]]}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;/includeonly&amp;gt;{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using div col with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Div col]] with unknown parameter &amp;quot;_VALUE_&amp;quot;; use colwidth= to specify column size |ignoreblank=y | class | colwidth | content | gap | rules | small | style }}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Module:Documentation/i18n&amp;diff=1523</id>
		<title>Module:Documentation/i18n</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Module:Documentation/i18n&amp;diff=1523"/>
		<updated>2026-08-17T21:25:21Z</updated>

		<summary type="html">&lt;p&gt;Lynn: Created page with &amp;quot;local format = require(&amp;#039;Module:TNT&amp;#039;).format local i18n = {}  i18n[&amp;#039;cfg-error-msg-type&amp;#039;] = format(&amp;#039;I18n/Documentation&amp;#039;, &amp;#039;cfg-error-msg-type&amp;#039;) i18n[&amp;#039;cfg-error-msg-empty&amp;#039;] = format(&amp;#039;I18n/Documentation&amp;#039;, &amp;#039;cfg-error-msg-empty&amp;#039;)  -- cfg[&amp;#039;template-namespace-heading&amp;#039;] -- The heading shown in the template namespace. i18n[&amp;#039;template-namespace-heading&amp;#039;] = format(&amp;#039;I18n/Documentation&amp;#039;, &amp;#039;template-namespace-heading&amp;#039;)  -- cfg[&amp;#039;module-namespace-heading&amp;#039;] -- The heading shown in the module...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local format = require(&#039;Module:TNT&#039;).format&lt;br /&gt;
local i18n = {}&lt;br /&gt;
&lt;br /&gt;
i18n[&#039;cfg-error-msg-type&#039;] = format(&#039;I18n/Documentation&#039;, &#039;cfg-error-msg-type&#039;)&lt;br /&gt;
i18n[&#039;cfg-error-msg-empty&#039;] = format(&#039;I18n/Documentation&#039;, &#039;cfg-error-msg-empty&#039;)&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;template-namespace-heading&#039;]&lt;br /&gt;
-- The heading shown in the template namespace.&lt;br /&gt;
i18n[&#039;template-namespace-heading&#039;] = format(&#039;I18n/Documentation&#039;, &#039;template-namespace-heading&#039;)&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;module-namespace-heading&#039;]&lt;br /&gt;
-- The heading shown in the module namespace.&lt;br /&gt;
i18n[&#039;module-namespace-heading&#039;] = format(&#039;I18n/Documentation&#039;, &#039;module-namespace-heading&#039;)&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;file-namespace-heading&#039;]&lt;br /&gt;
-- The heading shown in the file namespace.&lt;br /&gt;
i18n[&#039;file-namespace-heading&#039;] = format(&#039;I18n/Documentation&#039;, &#039;file-namespace-heading&#039;)&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;other-namespaces-heading&#039;]&lt;br /&gt;
-- The heading shown in other namespaces.&lt;br /&gt;
i18n[&#039;other-namespaces-heading&#039;] = format(&#039;I18n/Documentation&#039;, &#039;other-namespaces-heading&#039;)&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;view-link-display&#039;]&lt;br /&gt;
-- The text to display for &amp;quot;view&amp;quot; links.&lt;br /&gt;
i18n[&#039;view-link-display&#039;] = format(&#039;I18n/Documentation&#039;, &#039;view-link-display&#039;)&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;edit-link-display&#039;]&lt;br /&gt;
-- The text to display for &amp;quot;edit&amp;quot; links.&lt;br /&gt;
i18n[&#039;edit-link-display&#039;] = format(&#039;I18n/Documentation&#039;, &#039;edit-link-display&#039;)&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;history-link-display&#039;]&lt;br /&gt;
-- The text to display for &amp;quot;history&amp;quot; links.&lt;br /&gt;
i18n[&#039;history-link-display&#039;] = format(&#039;I18n/Documentation&#039;, &#039;history-link-display&#039;)&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;purge-link-display&#039;]&lt;br /&gt;
-- The text to display for &amp;quot;purge&amp;quot; links.&lt;br /&gt;
i18n[&#039;purge-link-display&#039;] = format(&#039;I18n/Documentation&#039;, &#039;purge-link-display&#039;)&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;create-link-display&#039;]&lt;br /&gt;
-- The text to display for &amp;quot;create&amp;quot; links.&lt;br /&gt;
i18n[&#039;create-link-display&#039;] = format(&#039;I18n/Documentation&#039;, &#039;create-link-display&#039;)&lt;br /&gt;
&lt;br /&gt;
return i18n&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Projects&amp;diff=1522</id>
		<title>Projects</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Projects&amp;diff=1522"/>
		<updated>2026-08-17T18:20:31Z</updated>

		<summary type="html">&lt;p&gt;Lynn: /* Software Changes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
In spite of the small size of the apartment, the newness of it and that it is an apartment the opportunity to improve upon it are limited. We assume that the complex manager would not look kindly on moving walls.&lt;br /&gt;
&lt;br /&gt;
Most of the effort that I plan to make is in my room.&lt;br /&gt;
&lt;br /&gt;
To get serious, install the docker version of Openproject. For now, this will be the outline.&lt;br /&gt;
&lt;br /&gt;
==Software Changes==&lt;br /&gt;
===Upgrade Mediawiki to 1.42.x - latest===&lt;br /&gt;
&amp;lt;poem&amp;gt;&lt;br /&gt;
{{checkbox|checked}} Make all necessary backups&lt;br /&gt;
{{checkbox|checked}} Review extensions and install/update to current&lt;br /&gt;
{{checkbox|checked}} Make a snapshot&lt;br /&gt;
{{checkbox|checked}} Run the upgrade script&lt;br /&gt;
{{checkbox|checked}} Test new implementation&lt;br /&gt;
{{checkbox|checked}} Configure Traefik to point to the new wiki&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
Best laid plans and all. It was good until running the upgrade script. I decided to start from a fresh install since the wiki isn&#039;t all that large. I was careful about picking extensions and then transferred the template library. There is probably a better way than moving them one by one.&lt;br /&gt;
&lt;br /&gt;
Sticking points:&lt;br /&gt;
&amp;lt;poem&amp;gt;&lt;br /&gt;
{{checkbox|on|color=red|tick=no}} Flightradar24 doesn&#039;t work in an iframe anymore&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Implement Mediawiki page security===&lt;br /&gt;
Basically, chose one that fits.&lt;br /&gt;
&lt;br /&gt;
[https://www.mediawiki.org/wiki/Extension:Restrict_access_by_category_and_group Access by category and group]&lt;br /&gt;
&lt;br /&gt;
[https://www.mediawiki.org/wiki/Extension:PageOwnership PageOwnership is a permissions manager]&lt;br /&gt;
&lt;br /&gt;
Decided on PageOwnership.&lt;br /&gt;
&amp;lt;poem&amp;gt;&lt;br /&gt;
{{checkbox|checked}} Install and configure&lt;br /&gt;
{{checkbox|unchecked}} Figure out how to use&lt;br /&gt;
{{checkbox|unchecked}} Split wiki to public and private&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Chico Apartment==&lt;br /&gt;
Generally pretty good, but there are some areas to improve.&lt;br /&gt;
&amp;lt;poem&amp;gt;&lt;br /&gt;
{{checkbox|unchecked}} Update doorbell to current Google version from old nest&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Lynn&#039;s Room==&lt;br /&gt;
===Infrastructure===&lt;br /&gt;
There are several places that need to be cleaned up and improved. It has been a few years since this stuff went in and there have been changes. The overall goals are:&lt;br /&gt;
&lt;br /&gt;
====Repair ZimaCube====&lt;br /&gt;
&amp;lt;poem&amp;gt;&lt;br /&gt;
{{checkbox}} Depends on parts arrival&lt;br /&gt;
{{checkbox}} Disassemble Cube and replace parts&lt;br /&gt;
{{checkbox|color=red}} Test with ZimaOS.&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
I really hoped that the supplied parts would have fixed the problem. After installing them, the system displayed the same problems as before. Fortunately, Icewhale replaced the unit and it worked. Continuing on.&lt;br /&gt;
&amp;lt;poem&amp;gt;&lt;br /&gt;
{{checkbox}} Test with ZimaOS. Run for a day or so and reboot occasionally&lt;br /&gt;
{{checkbox}} Review fan noise and order quieter fans&lt;br /&gt;
{{checkbox}} Install latest TrueNAS on Cube &amp;amp; Test&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
====Upgrade ZimaCube====&lt;br /&gt;
&amp;lt;poem&amp;gt;&lt;br /&gt;
{{checkbox}} Order updated fan kit from Zima&lt;br /&gt;
{{checkbox|unchecked}} Decide which fan kit to use&lt;br /&gt;
{{checkbox|unchecked}} Install fan kit&lt;br /&gt;
{{checkbox|unchecked}} Test cooling&lt;br /&gt;
{{checkbox|unchecked}} Install case fans&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Migrate Data to Other Resources====&lt;br /&gt;
&amp;lt;poem&amp;gt;&lt;br /&gt;
{{checkbox}} Migrate data from TR004 on PC to data_0 volume on qnap&lt;br /&gt;
{{checkbox|color=red|tick=no}} Move TR004 to Intel with 4x HDD&lt;br /&gt;
&lt;br /&gt;
{{checkbox}} Move data from standalone USB drives to truenas&lt;br /&gt;
{{checkbox}} Review disks in the inventory and copy to Cube&lt;br /&gt;
{{checkbox|unchecked}} Build inventory list and recycle drives as appropriate&lt;br /&gt;
{{checkbox|unchecked}} Begin migration from Qnap to Cube. Setup rsync on cron to keep them in sync&lt;br /&gt;
{{checkbox|unchecked}} Install the Media Management utilities and Plex on the Cube&lt;br /&gt;
{{checkbox|unchecked}} Install each app and then migrate the databases from the docker versions&lt;br /&gt;
{{checkbox|unchecked}} Update Caddy and change port forwarding when it is working&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
The TR004 would not provide individual drives to pve. I picked up an inexpensive disk array that would let me put those drives up and make them available to the Truenas VM.&lt;br /&gt;
&lt;br /&gt;
====Upgrade Proxmox====&lt;br /&gt;
&amp;lt;poem&amp;gt;&lt;br /&gt;
* Preliminary&lt;br /&gt;
{{checkbox}} Review the Proxmox upgrade document&lt;br /&gt;
{{checkbox}} Do a full set of backups according to the upgrade document&lt;br /&gt;
{{checkbox}} Do an alternate set of just the data areas &lt;br /&gt;
* Upgrade hardware and Software&lt;br /&gt;
{{checkbox}} Pull the machine and clean. Add a 2TB stick in the empty slot&lt;br /&gt;
{{checkbox}} Upgrade the 1TB stick to a 2TB one&lt;br /&gt;
{{checkbox}} Download and install the latest version of Proxmox&lt;br /&gt;
{{checkbox}} Install the 14TB drives into the newly freed Qnap TR004 and attach the expansion to the Proxmox machine&lt;br /&gt;
:: {{checkbox|checked|tick=no|color=red}} The TR004 didn&#039;t work. TR004 from Qnap not free yet&lt;br /&gt;
{{checkbox}} Recreate the VMs and reload from backup&lt;br /&gt;
* Pust Upgrade&lt;br /&gt;
{{checkbox}} Create a new VM and install TrueNAS.. Create a disk pool from the Qnap moounted drives&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Update Qnap====&lt;br /&gt;
&amp;lt;poem&amp;gt;&lt;br /&gt;
{{checkbox|unchecked}} Review all storage locations looking for duplicates. &lt;br /&gt;
{{checkbox|unchecked}} Move data as appropriate to the Cube and TrueNAS instance on Proxmox.&lt;br /&gt;
{{checkbox|unchecked}} Retire Expansion for now&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Finish Migration Back to Lenovo Deskside====&lt;br /&gt;
&amp;lt;poem&amp;gt;&lt;br /&gt;
{{checkbox|unchecked}} Identify applications to move&lt;br /&gt;
{{checkbox|unchecked}} Move/reinstall applications&lt;br /&gt;
{{checkbox|unchecked}} Move data&lt;br /&gt;
{{checkbox|unchecked}} Reconfigure Dell box and reinsatll OS&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Under Desk Cleanup====&lt;br /&gt;
&amp;lt;poem&amp;gt;&lt;br /&gt;
{{checkbox}} Create and review wiring plan&lt;br /&gt;
{{checkbox}} Pull out all hardware &lt;br /&gt;
{{checkbox}} Move desk and clean and vacuum under it&lt;br /&gt;
{{checkbox}} Clean window and sill&lt;br /&gt;
{{checkbox}} Replace current switch with compact one from Bidwell (east switch)&lt;br /&gt;
{{checkbox}} Rewire removing portable USB drives. Data has moved. Setup filesharing so that mounts are consistent&lt;br /&gt;
{{checkbox}} Put the desk back and layout accordingly. Should desks be swapped?&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====West Stack Cleanup====&lt;br /&gt;
&amp;lt;poem&amp;gt;&lt;br /&gt;
{{checkbox|unchecked}} Finish armoire clean up&lt;br /&gt;
{{checkbox|unchecked}} Move desk back to have room to work&lt;br /&gt;
{{checkbox|unchecked}} Pull out all hardware &lt;br /&gt;
{{checkbox|unchecked}} Pull out armoire and shelving&lt;br /&gt;
{{checkbox}} Replace the power strip&lt;br /&gt;
{{checkbox|unchecked}} Return armoire&lt;br /&gt;
{{checkbox|unchecked}} Have wood spacer made for white stack to physically support TiVo better &lt;br /&gt;
{{checkbox|unchecked}} Put the TV and Raspberry Pi back&lt;br /&gt;
{{checkbox|unchecked}} Review placement &lt;br /&gt;
{{checkbox|unchecked}} Retire iMac mini&lt;br /&gt;
{{checkbox|unchecked}} Prewire electrical and network&lt;br /&gt;
{{checkbox|unchecked}} Install the under desk switch (west switch)&lt;br /&gt;
{{checkbox|unchecked}} Put the shelves back&lt;br /&gt;
{{checkbox|unchecked}} Reinstall remaining hardware&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Armoire Cleanup====&lt;br /&gt;
&amp;lt;poem&amp;gt;&lt;br /&gt;
{{checkbox|unchecked}} Pull drawers, one at a time, and decide what to do with stuff&lt;br /&gt;
{{checkbox|unchecked}} If it isn&#039;t being used it needs to go somewhere hint, hint&lt;br /&gt;
{{checkbox|checked|tick=no|color=green}} The collection of old phones stays&lt;br /&gt;
{{checkbox|unchecked}} Review what is under the bed to see if consolidation is possible.&lt;br /&gt;
{{checkbox|unchecked}} The top shelving has been recently visited but needs more work&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Nightstand and Electrical====&lt;br /&gt;
As with many things, deciding to do something leads inevitably to doing other things. This is a perfect example. The cords under the bed are a mess and need to be reworked to just the large power strip. I need that for the Medtronic monitor and likely for a CPAP :-( The current inadequate cord plugs in behind the nightstand. The nightstand cannot be moved when full.&lt;br /&gt;
&amp;lt;poem&amp;gt;&lt;br /&gt;
{{checkbox|unchecked}} Review boxes under the bed&lt;br /&gt;
{{checkbox|unchecked}} Empty file drawers and things on top&lt;br /&gt;
{{checkbox|unchecked}} Raise head of bed&lt;br /&gt;
{{checkbox|unchecked}} Make the necessary wiring changes&lt;br /&gt;
{{checkbox|unchecked}} Return stuff to top&lt;br /&gt;
{{checkbox|unchecked}} Reload drawers while culling extra papers&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Closet====&lt;br /&gt;
The goal would be to reduce, recycle and toss. Do I need 8 power bricks or 20 USB cables?&lt;br /&gt;
====Photos====&lt;br /&gt;
&amp;lt;poem&amp;gt;&lt;br /&gt;
{{checkbox|unchecked}} Finish scanning slides&lt;br /&gt;
{{checkbox|unchecked}} Decide which ones can be tossed or rescanned at a higher resolution&lt;br /&gt;
{{checkbox|unchecked}} Review photo negatives and scan&lt;br /&gt;
{{checkbox|unchecked}} Categorize and organize&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=User:Lynn&amp;diff=1521</id>
		<title>User:Lynn</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=User:Lynn&amp;diff=1521"/>
		<updated>2026-08-17T18:18:35Z</updated>

		<summary type="html">&lt;p&gt;Lynn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{User&lt;br /&gt;
| full name = Lynn Macey&lt;br /&gt;
| image name =&lt;br /&gt;
| hover text = lynn&lt;br /&gt;
| job title = Happily Retired&lt;br /&gt;
| organization = Working for The Family&lt;br /&gt;
| short quote = General All Around Good Guy&lt;br /&gt;
| about me = Have you got all day?&lt;br /&gt;
| about my work = I spent 45 years in high tech. Now I do it for fun.&lt;br /&gt;
| contact me = lynnmacey@gmail.com&lt;br /&gt;
| disclaimer = Only I am responsible&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Fetch Termius Passkey: curl -fs https://sshid.io/lynnmacey &amp;gt;&amp;gt; ~/.ssh/authorized_keys&lt;br /&gt;
&lt;br /&gt;
Get iMatch from these guys: [https://www.photools.com/ Photools.com]&lt;br /&gt;
&lt;br /&gt;
[http://openflights.org/user/lynnmacey Lynn&#039;s Flight History]&lt;br /&gt;
&lt;br /&gt;
[[The Weekly Task List]]&lt;br /&gt;
&lt;br /&gt;
[[Home Server Applications to Try]]&lt;br /&gt;
&lt;br /&gt;
[[The Notes Collection]]&lt;br /&gt;
&lt;br /&gt;
[[Projects]]&lt;br /&gt;
&lt;br /&gt;
[[Wish List and Vendors]]&lt;br /&gt;
&lt;br /&gt;
Some places that may be useful:&lt;br /&gt;
*[https://www.virtualizationhowto.com/2026/07/how-i-organize-my-entire-home-lab-so-i-can-actually-find-anything/ How I Organize My Entire Home Lab]&lt;br /&gt;
[[Videos to Categorize]]&lt;br /&gt;
==Personal Accounts==&lt;br /&gt;
===Venmo===&lt;br /&gt;
https://venmo.com/account/sign-in/&lt;br /&gt;
&lt;br /&gt;
 Username: @lynnmacey&lt;br /&gt;
 Password: M...&lt;br /&gt;
 Email Address: lynnmacey@gmail.com&lt;br /&gt;
&lt;br /&gt;
== Time Sensitive Information ==&lt;br /&gt;
&lt;br /&gt;
Interesting .zshrc rc file for the zsh shell. https://github.com/natelandau/dotfiles&lt;br /&gt;
&lt;br /&gt;
Some backup scripts are here https://github.com/natelandau/db_scripts&lt;br /&gt;
&lt;br /&gt;
==Movie reviews ==&lt;br /&gt;
Medieval &amp;quot;porn&amp;quot; : [https://www.youtube.com/watch?v=nTY2_NieZtw]&lt;br /&gt;
&lt;br /&gt;
Banned 1960s movies : [https://www.youtube.com/watch?v=J2CHNxk-jD0]&lt;br /&gt;
&lt;br /&gt;
13 Brutal 1970s Exploitation Films: [https://www.youtube.com/watch?v=3uBYsRYEhO0 13 Brutal 1970s Exploitation Films]&lt;br /&gt;
&lt;br /&gt;
15 Unfiltered Grindhouse Movies Hollywood Refused to Touch: [[https://www.youtube.com/watch?v=kfGhksb6Cho 15 Unfiltered Grindhouse Movies Hollywood Refused to Touch]&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=CY_e_9UoQpU 10 Movies So Wild Studios Would Never Greenlight Them Today]&lt;br /&gt;
&lt;br /&gt;
==Lynn&#039;s Flight History==&lt;br /&gt;
&lt;br /&gt;
[http://openflights.org/user/lynnmacey Lynn&#039;s Flight History]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;a href=&#039;https://openflights.org/user/lynnmacey&#039; target=&#039;_blank&#039;&amp;gt;&amp;lt;img src=&#039;https://openflights.org/banner/lynnmacey.png&#039; width=400 height=70&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I want this product for my wall: https://theflightwall.com/products/flightwall-mini-flight-tracking-led-display&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=User:Lynn&amp;diff=1520</id>
		<title>User:Lynn</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=User:Lynn&amp;diff=1520"/>
		<updated>2026-08-17T17:18:58Z</updated>

		<summary type="html">&lt;p&gt;Lynn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{User&lt;br /&gt;
| full name = Lynn Macey&lt;br /&gt;
| image name =&lt;br /&gt;
| hover text = lynn&lt;br /&gt;
| job title = Happily Retired&lt;br /&gt;
| organization = Working for The Family&lt;br /&gt;
| short quote = General All Around Good Guy&lt;br /&gt;
| about me = Have you got all day?&lt;br /&gt;
| about my work = I spent 45 years in high tech. Now I do it for fun.&lt;br /&gt;
| contact me = lynnmacey@gmail.com&lt;br /&gt;
| disclaimer = Only I am responsible&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Fetch Termius Passkey: curl -fs https://sshid.io/lynnmacey &amp;gt;&amp;gt; ~/.ssh/authorized_keys&lt;br /&gt;
&lt;br /&gt;
[http://openflights.org/user/lynnmacey Lynn&#039;s Flight History]&lt;br /&gt;
&lt;br /&gt;
[[The Weekly Task List]]&lt;br /&gt;
&lt;br /&gt;
[[Home Server Applications to Try]]&lt;br /&gt;
&lt;br /&gt;
[[The Notes Collection]]&lt;br /&gt;
&lt;br /&gt;
[[Projects]]&lt;br /&gt;
&lt;br /&gt;
[[Wish List and Vendors]]&lt;br /&gt;
&lt;br /&gt;
Some places that may be useful:&lt;br /&gt;
*[https://www.virtualizationhowto.com/2026/07/how-i-organize-my-entire-home-lab-so-i-can-actually-find-anything/ How I Organize My Entire Home Lab]&lt;br /&gt;
[[Videos to Categorize]]&lt;br /&gt;
==Personal Accounts==&lt;br /&gt;
===Venmo===&lt;br /&gt;
https://venmo.com/account/sign-in/&lt;br /&gt;
&lt;br /&gt;
 Username: @lynnmacey&lt;br /&gt;
 Password: M...&lt;br /&gt;
 Email Address: lynnmacey@gmail.com&lt;br /&gt;
&lt;br /&gt;
== Time Sensitive Information ==&lt;br /&gt;
&lt;br /&gt;
Interesting .zshrc rc file for the zsh shell. https://github.com/natelandau/dotfiles&lt;br /&gt;
&lt;br /&gt;
Some backup scripts are here https://github.com/natelandau/db_scripts&lt;br /&gt;
&lt;br /&gt;
==Movie reviews ==&lt;br /&gt;
Medieval &amp;quot;porn&amp;quot; : [https://www.youtube.com/watch?v=nTY2_NieZtw]&lt;br /&gt;
&lt;br /&gt;
Banned 1960s movies : [https://www.youtube.com/watch?v=J2CHNxk-jD0]&lt;br /&gt;
&lt;br /&gt;
13 Brutal 1970s Exploitation Films: [https://www.youtube.com/watch?v=3uBYsRYEhO0 13 Brutal 1970s Exploitation Films]&lt;br /&gt;
&lt;br /&gt;
15 Unfiltered Grindhouse Movies Hollywood Refused to Touch: [[https://www.youtube.com/watch?v=kfGhksb6Cho 15 Unfiltered Grindhouse Movies Hollywood Refused to Touch]&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/watch?v=CY_e_9UoQpU 10 Movies So Wild Studios Would Never Greenlight Them Today]&lt;br /&gt;
&lt;br /&gt;
==Lynn&#039;s Flight History==&lt;br /&gt;
&lt;br /&gt;
[http://openflights.org/user/lynnmacey Lynn&#039;s Flight History]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;a href=&#039;https://openflights.org/user/lynnmacey&#039; target=&#039;_blank&#039;&amp;gt;&amp;lt;img src=&#039;https://openflights.org/banner/lynnmacey.png&#039; width=400 height=70&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I want this product for my wall: https://theflightwall.com/products/flightwall-mini-flight-tracking-led-display&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Applications&amp;diff=1519</id>
		<title>Applications</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Applications&amp;diff=1519"/>
		<updated>2026-08-17T14:47:01Z</updated>

		<summary type="html">&lt;p&gt;Lynn: /* Local Applications */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{PAGEBANNER:Software_background.jpg}}&lt;br /&gt;
&lt;br /&gt;
==Local Applications==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Applications Installed Per Machine&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Windows !! Linux !! Mac ||Application Type !! Official !! Notes&lt;br /&gt;
|-&lt;br /&gt;
|| [[angry ip scanner]] || Y || Y || || Scan local Network || [https://angryip.org/ Angry IP Scanner] ||&lt;br /&gt;
|-&lt;br /&gt;
|| [[brave]] || Y || Y || || Secure Browser || [https://brave.com Brave] ||&lt;br /&gt;
|-&lt;br /&gt;
|| [[Calbre]] || Y || Y || || e-Book library manager || || [[calibre-web Calibre-web]] is a companion app&lt;br /&gt;
|-&lt;br /&gt;
|| [[filebot]] || Y || Y || || Video FIle Swiss Army Knife || [https://www.filebot.net/] || CLI Scripting&lt;br /&gt;
|-&lt;br /&gt;
|| [[remmina]] || N || Y || || SSH Client || [https://remmina.org/ Remmina] ||&lt;br /&gt;
|-&lt;br /&gt;
|| [[reolink]] || Y || N || ||Access Security Cameras || [https://reolink.com/software-and-manual/] ||&lt;br /&gt;
|-&lt;br /&gt;
|| [[Termius]] || N || Y || ||SSH Client || [https://termius.com/index.html Termius]||&lt;br /&gt;
|-&lt;br /&gt;
|| [[Thunderbird]] || - || Y || || E-mail and Calendar || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Application Servers==&lt;br /&gt;
There are several and even a reason why it is that way. They are listed here. These are all virtual machines, VMs, that are hosted on the main Proxmox server [[pve]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Chico Application Servers&lt;br /&gt;
|-&lt;br /&gt;
! Name !! IP !! Management !! Access !! Content Type&lt;br /&gt;
|-&lt;br /&gt;
|| [[Chico1]] || 192.168.86.31 || [https://yams.media/ Yams] || [https://portainer1.maceys.net Portainer1] || Audio and Video management with some other apps &lt;br /&gt;
|-&lt;br /&gt;
|| [[Chico3]] || 192.168.86.33 || Dockge || [https://portainer3.maceys.net Portainer3] || &lt;br /&gt;
Applications that are not available on TrueNAS or Deployrr&lt;br /&gt;
|-&lt;br /&gt;
|| [[Chico5]] || 192.168.86.35 || Apache || none || Non-Docker Apps&lt;br /&gt;
|-&lt;br /&gt;
|| [[Chico7]] || 192.168.86.37 || [https://github.com/SimpleHomelab/Deployrr Deployrr] || [https://portainer7.maceys.net Portainer7] || Most Docker Apps and Proxy Server&lt;br /&gt;
|-&lt;br /&gt;
|| [[Cube]] || 192.168.86.12 || [[http://cube.lan:81 TrueNAS]] || [https://portainer.maceys.net Portainer] || Media Management&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
See also: [[Virtual Machines]]&lt;br /&gt;
&lt;br /&gt;
==Web Applications==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Available and Supported Web Applications&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Server !! Group || Official Web Site || Description&lt;br /&gt;
|-&lt;br /&gt;
|| [https://calibre.maceys.net Calibre] || [[Chico7]] || Media || [https://calibre-ebook.com/ Calibre] ||  Comprehensive book library and management&lt;br /&gt;
|-&lt;br /&gt;
|| [https://calibre-web-auto.maceys.net Calibre-web] || [[Chico7]] || Media ||[https://github.com/janeczku/calibre-web Calibre-web] || A smaller set of books that are easily accessed on the web&lt;br /&gt;
|-&lt;br /&gt;
|| [https://radarr.maceys.net Radarr] || [[Chico1]] || Media || [https://radarr.video/ Radarr] || Movie database&lt;br /&gt;
|-&lt;br /&gt;
|| [https://sonarr.maceys.net Sonarr] || [[Chico1]] || Media || [https://sonarr.video/ Sonarr] || TV Series database&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Application Management ==&lt;br /&gt;
Having the applications is great, but quickly becomes more than a person can keep in their head. Where is the app located? What port is it served from all needs to be abstracted in order to be easily adopted. Basically, people come to the application in order to use then and not spent much time trying to find them. My adoption and use of the tools has changed over time. Docker and Docker Compose are great, but can be a challenge to work with because of their complexity. The management systems work by insulating the administrator from a lot of the details. The tradeoff is, of course, that flexibility may be limited.&lt;br /&gt;
&lt;br /&gt;
===Dockge===&lt;br /&gt;
Dockge is installed on the Cube server and is intended to consolidate Chico1 and the Plex server on Qnap.&lt;br /&gt;
&lt;br /&gt;
===Yams===&lt;br /&gt;
I started with Yams and am not really unhappy with it. It is a pretty straight from the box docker management application. Docker compose scripts can be added to a local yaml file and started from docker. Generally, after it is running, the deployrr app is used to set up a proxy so that it can be run from https://name.maceys.net where name is the application. Most of the applications here are available through deployrr. The main media applications are still here for the time being.&lt;br /&gt;
&lt;br /&gt;
The usage information for Yams is here: [https://yams.media/install/using-the-cli/ Using the Yams CLI]&lt;br /&gt;
===Deployrr===&lt;br /&gt;
Deployrr is the next generation application management tools. It combines Docker and the Traefik proxy server and wraps them into a command line application to manage the whole stack. The author has put a great deal of effort making this work. I support him with an annual subscription. At this point, unless there is a really good reason to apply some other approach, I use Deployrr&lt;br /&gt;
&lt;br /&gt;
Detailed information on Deployrr is here [https://github.com/SimpleHomelab/Deployrr Deployrr].&lt;br /&gt;
&lt;br /&gt;
Return to [[Technical Guides]]&amp;lt;br&amp;gt;&lt;br /&gt;
Return to [[Main Page]]&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Living_in_Chico&amp;diff=1518</id>
		<title>Living in Chico</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Living_in_Chico&amp;diff=1518"/>
		<updated>2026-08-17T01:26:59Z</updated>

		<summary type="html">&lt;p&gt;Lynn: /* The Apartment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{PAGEBANNER:City-of-chico-banner.jpg}}&lt;br /&gt;
=Chico Writeup Related to Retirees=&lt;br /&gt;
[https://familydestinationsguide.com/town-california-affordable-retirees/ Chico Writeup Related to Retirees]&lt;br /&gt;
&lt;br /&gt;
= The Apartment =&lt;br /&gt;
{|&lt;br /&gt;
The apartment is located on the east side of town, approximately here:&lt;br /&gt;
&lt;br /&gt;
{{multiple image&lt;br /&gt;
| footer    = Players are cautioned with a yellow card and sent off with a red card.&lt;br /&gt;
| width     = 450&lt;br /&gt;
| image1    = {{#display_map:39.75224,-121.79213|zoom=100|layers=OpenStreetMap}} &lt;br /&gt;
&lt;br /&gt;
| alt1      = Chico Map&lt;br /&gt;
&lt;br /&gt;
| image2    = Condo beach.jpg&lt;br /&gt;
| width     =450&lt;br /&gt;
| alt2      = Beach at the condo&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Note that the marker is just &amp;quot;close&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The mailing address is: &lt;br /&gt;
&lt;br /&gt;
 The Maceys&lt;br /&gt;
 2580 California Park Dr #223&lt;br /&gt;
 Chico, CA 95928-4213&lt;br /&gt;
&lt;br /&gt;
WiFi quick connect:&lt;br /&gt;
&lt;br /&gt;
[[File:Macey WiFi-1024.jpeg | 150px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gym code: 25-80-17 (enter)&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
==[[Chico Apartment|Chico Apartment Details]]==&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
&lt;br /&gt;
==[[The Weekly Task List|What Lynn should be working on by day]]==&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
&lt;br /&gt;
= The House =&lt;br /&gt;
Josh and Anna&#039;s house is on the north end of town, here:&lt;br /&gt;
&lt;br /&gt;
{{#display_map:3163 Burnt Ranch Way, chico, CA&lt;br /&gt;
||width=450|height=500|zoom=100| layers=OpenStreetMap&lt;br /&gt;
}}&lt;br /&gt;
Note that the marker is just &amp;quot;close&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The mailing address is:&lt;br /&gt;
&lt;br /&gt;
 Josh &amp;amp; Anna Macey&lt;br /&gt;
 3163 Sawyers Bar Ln&lt;br /&gt;
 Chico, CA 95973&lt;br /&gt;
&lt;br /&gt;
[[Chico House|Chico House Details]]&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Living_in_Chico&amp;diff=1517</id>
		<title>Living in Chico</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Living_in_Chico&amp;diff=1517"/>
		<updated>2026-08-17T01:25:50Z</updated>

		<summary type="html">&lt;p&gt;Lynn: /* The Apartment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{PAGEBANNER:City-of-chico-banner.jpg}}&lt;br /&gt;
=Chico Writeup Related to Retirees=&lt;br /&gt;
[https://familydestinationsguide.com/town-california-affordable-retirees/ Chico Writeup Related to Retirees]&lt;br /&gt;
&lt;br /&gt;
= The Apartment =&lt;br /&gt;
{|&lt;br /&gt;
The apartment is located on the east side of town, approximately here:&lt;br /&gt;
&lt;br /&gt;
{{multiple image&lt;br /&gt;
| footer    = Players are cautioned with a yellow card and sent off with a red card.&lt;br /&gt;
| width     = 450&lt;br /&gt;
| image1    = {{#display_map:39.75224,-121.79213|zoom=100|layers=OpenStreetMap}} &lt;br /&gt;
&lt;br /&gt;
| alt1      = Chico Map&lt;br /&gt;
&lt;br /&gt;
| image2    = Condo beach.jpg&lt;br /&gt;
| alt2      = Beach at the condo&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Note that the marker is just &amp;quot;close&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The mailing address is: &lt;br /&gt;
&lt;br /&gt;
 The Maceys&lt;br /&gt;
 2580 California Park Dr #223&lt;br /&gt;
 Chico, CA 95928-4213&lt;br /&gt;
&lt;br /&gt;
WiFi quick connect:&lt;br /&gt;
&lt;br /&gt;
[[File:Macey WiFi-1024.jpeg | 150px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gym code: 25-80-17 (enter)&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
==[[Chico Apartment|Chico Apartment Details]]==&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
&lt;br /&gt;
==[[The Weekly Task List|What Lynn should be working on by day]]==&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
&lt;br /&gt;
= The House =&lt;br /&gt;
Josh and Anna&#039;s house is on the north end of town, here:&lt;br /&gt;
&lt;br /&gt;
{{#display_map:3163 Burnt Ranch Way, chico, CA&lt;br /&gt;
||width=450|height=500|zoom=100| layers=OpenStreetMap&lt;br /&gt;
}}&lt;br /&gt;
Note that the marker is just &amp;quot;close&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The mailing address is:&lt;br /&gt;
&lt;br /&gt;
 Josh &amp;amp; Anna Macey&lt;br /&gt;
 3163 Sawyers Bar Ln&lt;br /&gt;
 Chico, CA 95973&lt;br /&gt;
&lt;br /&gt;
[[Chico House|Chico House Details]]&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Living_in_Chico&amp;diff=1516</id>
		<title>Living in Chico</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Living_in_Chico&amp;diff=1516"/>
		<updated>2026-08-17T01:25:06Z</updated>

		<summary type="html">&lt;p&gt;Lynn: /* The Apartment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{PAGEBANNER:City-of-chico-banner.jpg}}&lt;br /&gt;
=Chico Writeup Related to Retirees=&lt;br /&gt;
[https://familydestinationsguide.com/town-california-affordable-retirees/ Chico Writeup Related to Retirees]&lt;br /&gt;
&lt;br /&gt;
= The Apartment =&lt;br /&gt;
{|&lt;br /&gt;
The apartment is located on the east side of town, approximately here:&lt;br /&gt;
&lt;br /&gt;
{{multiple image&lt;br /&gt;
| footer    = Players are cautioned with a yellow card and sent off with a red card.&lt;br /&gt;
| width     = 450&lt;br /&gt;
| image1    = {{#display_map:39.75224,-121.79213||width=450|height=500|zoom=100|layers=OpenStreetMap}} &lt;br /&gt;
&lt;br /&gt;
| alt1      = Chico Map&lt;br /&gt;
&lt;br /&gt;
| image2    = Condo beach.jpg&lt;br /&gt;
| alt2      = Beach at the condo&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Note that the marker is just &amp;quot;close&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The mailing address is: &lt;br /&gt;
&lt;br /&gt;
 The Maceys&lt;br /&gt;
 2580 California Park Dr #223&lt;br /&gt;
 Chico, CA 95928-4213&lt;br /&gt;
&lt;br /&gt;
WiFi quick connect:&lt;br /&gt;
&lt;br /&gt;
[[File:Macey WiFi-1024.jpeg | 150px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gym code: 25-80-17 (enter)&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
==[[Chico Apartment|Chico Apartment Details]]==&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
&lt;br /&gt;
==[[The Weekly Task List|What Lynn should be working on by day]]==&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
&lt;br /&gt;
= The House =&lt;br /&gt;
Josh and Anna&#039;s house is on the north end of town, here:&lt;br /&gt;
&lt;br /&gt;
{{#display_map:3163 Burnt Ranch Way, chico, CA&lt;br /&gt;
||width=450|height=500|zoom=100| layers=OpenStreetMap&lt;br /&gt;
}}&lt;br /&gt;
Note that the marker is just &amp;quot;close&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The mailing address is:&lt;br /&gt;
&lt;br /&gt;
 Josh &amp;amp; Anna Macey&lt;br /&gt;
 3163 Sawyers Bar Ln&lt;br /&gt;
 Chico, CA 95973&lt;br /&gt;
&lt;br /&gt;
[[Chico House|Chico House Details]]&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Living_in_Chico&amp;diff=1515</id>
		<title>Living in Chico</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Living_in_Chico&amp;diff=1515"/>
		<updated>2026-08-17T01:24:28Z</updated>

		<summary type="html">&lt;p&gt;Lynn: /* The Apartment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{PAGEBANNER:City-of-chico-banner.jpg}}&lt;br /&gt;
=Chico Writeup Related to Retirees=&lt;br /&gt;
[https://familydestinationsguide.com/town-california-affordable-retirees/ Chico Writeup Related to Retirees]&lt;br /&gt;
&lt;br /&gt;
= The Apartment =&lt;br /&gt;
{|&lt;br /&gt;
The apartment is located on the east side of town, approximately here:&lt;br /&gt;
&lt;br /&gt;
{{multiple image&lt;br /&gt;
| footer    = Players are cautioned with a yellow card and sent off with a red card.&lt;br /&gt;
| width     = 450&lt;br /&gt;
| image1    = {{#display_map:39.75224,-121.79213&lt;br /&gt;
||width=450|height=500|zoom=100|layers=OpenStreetMap&lt;br /&gt;
}} &lt;br /&gt;
&lt;br /&gt;
| alt1      = Chico Map&lt;br /&gt;
&lt;br /&gt;
| image2    = Condo beach.jpg&lt;br /&gt;
| alt2      = Beach at the condo&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Note that the marker is just &amp;quot;close&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The mailing address is: &lt;br /&gt;
&lt;br /&gt;
 The Maceys&lt;br /&gt;
 2580 California Park Dr #223&lt;br /&gt;
 Chico, CA 95928-4213&lt;br /&gt;
&lt;br /&gt;
WiFi quick connect:&lt;br /&gt;
&lt;br /&gt;
[[File:Macey WiFi-1024.jpeg | 150px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gym code: 25-80-17 (enter)&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
==[[Chico Apartment|Chico Apartment Details]]==&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
&lt;br /&gt;
==[[The Weekly Task List|What Lynn should be working on by day]]==&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
&lt;br /&gt;
= The House =&lt;br /&gt;
Josh and Anna&#039;s house is on the north end of town, here:&lt;br /&gt;
&lt;br /&gt;
{{#display_map:3163 Burnt Ranch Way, chico, CA&lt;br /&gt;
||width=450|height=500|zoom=100| layers=OpenStreetMap&lt;br /&gt;
}}&lt;br /&gt;
Note that the marker is just &amp;quot;close&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The mailing address is:&lt;br /&gt;
&lt;br /&gt;
 Josh &amp;amp; Anna Macey&lt;br /&gt;
 3163 Sawyers Bar Ln&lt;br /&gt;
 Chico, CA 95973&lt;br /&gt;
&lt;br /&gt;
[[Chico House|Chico House Details]]&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Living_in_Chico&amp;diff=1514</id>
		<title>Living in Chico</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Living_in_Chico&amp;diff=1514"/>
		<updated>2026-08-17T01:22:31Z</updated>

		<summary type="html">&lt;p&gt;Lynn: /* The Apartment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{PAGEBANNER:City-of-chico-banner.jpg}}&lt;br /&gt;
=Chico Writeup Related to Retirees=&lt;br /&gt;
[https://familydestinationsguide.com/town-california-affordable-retirees/ Chico Writeup Related to Retirees]&lt;br /&gt;
&lt;br /&gt;
= The Apartment =&lt;br /&gt;
{|&lt;br /&gt;
The apartment is located on the east side of town, approximately here:&lt;br /&gt;
{{#display_map:39.75224,-121.79213&lt;br /&gt;
||width=450|height=500|zoom=100|layers=OpenStreetMap&lt;br /&gt;
}} &lt;br /&gt;
|| [[File:Condo beach.jpg | 500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
{{multiple image&lt;br /&gt;
| footer    = Players are cautioned with a yellow card and sent off with a red card.&lt;br /&gt;
| width     = 450&lt;br /&gt;
&lt;br /&gt;
| image1    = {{#display_map:39.75224,-121.79213&lt;br /&gt;
||width=450|height=500|zoom=100|layers=OpenStreetMap&lt;br /&gt;
}} &lt;br /&gt;
|| [[File:Condo beach.jpg | 450px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
| alt1      = Yellow cartouche&lt;br /&gt;
&lt;br /&gt;
| image2    = Condo beach.jpg&lt;br /&gt;
| alt2      = Red cartouche&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Note that the marker is just &amp;quot;close&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The mailing address is: &lt;br /&gt;
&lt;br /&gt;
 The Maceys&lt;br /&gt;
 2580 California Park Dr #223&lt;br /&gt;
 Chico, CA 95928-4213&lt;br /&gt;
&lt;br /&gt;
WiFi quick connect:&lt;br /&gt;
&lt;br /&gt;
[[File:Macey WiFi-1024.jpeg | 150px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gym code: 25-80-17 (enter)&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
==[[Chico Apartment|Chico Apartment Details]]==&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
&lt;br /&gt;
==[[The Weekly Task List|What Lynn should be working on by day]]==&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
&lt;br /&gt;
= The House =&lt;br /&gt;
Josh and Anna&#039;s house is on the north end of town, here:&lt;br /&gt;
&lt;br /&gt;
{{#display_map:3163 Burnt Ranch Way, chico, CA&lt;br /&gt;
||width=450|height=500|zoom=100| layers=OpenStreetMap&lt;br /&gt;
}}&lt;br /&gt;
Note that the marker is just &amp;quot;close&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The mailing address is:&lt;br /&gt;
&lt;br /&gt;
 Josh &amp;amp; Anna Macey&lt;br /&gt;
 3163 Sawyers Bar Ln&lt;br /&gt;
 Chico, CA 95973&lt;br /&gt;
&lt;br /&gt;
[[Chico House|Chico House Details]]&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Living_in_Chico&amp;diff=1513</id>
		<title>Living in Chico</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Living_in_Chico&amp;diff=1513"/>
		<updated>2026-08-17T01:21:05Z</updated>

		<summary type="html">&lt;p&gt;Lynn: /* The Apartment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{PAGEBANNER:City-of-chico-banner.jpg}}&lt;br /&gt;
=Chico Writeup Related to Retirees=&lt;br /&gt;
[https://familydestinationsguide.com/town-california-affordable-retirees/ Chico Writeup Related to Retirees]&lt;br /&gt;
&lt;br /&gt;
= The Apartment =&lt;br /&gt;
{|&lt;br /&gt;
The apartment is located on the east side of town, approximately here:&lt;br /&gt;
{{#display_map:39.75224,-121.79213&lt;br /&gt;
||width=450|height=500|zoom=100|layers=OpenStreetMap&lt;br /&gt;
}} &lt;br /&gt;
|| [[File:Condo beach.jpg | 500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
{{multiple image&lt;br /&gt;
| footer    = Players are cautioned with a yellow card and sent off with a red card.&lt;br /&gt;
| width     = 60&lt;br /&gt;
&lt;br /&gt;
| image1    = {{#display_map:39.75224,-121.79213&lt;br /&gt;
||width=450|height=500|zoom=100|layers=OpenStreetMap&lt;br /&gt;
}} &lt;br /&gt;
|| [[File:Condo beach.jpg | 500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
| alt1      = Yellow cartouche&lt;br /&gt;
&lt;br /&gt;
| image2    = Red card.svg&lt;br /&gt;
| alt2      = Red cartouche&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Note that the marker is just &amp;quot;close&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The mailing address is: &lt;br /&gt;
&lt;br /&gt;
 The Maceys&lt;br /&gt;
 2580 California Park Dr #223&lt;br /&gt;
 Chico, CA 95928-4213&lt;br /&gt;
&lt;br /&gt;
WiFi quick connect:&lt;br /&gt;
&lt;br /&gt;
[[File:Macey WiFi-1024.jpeg | 150px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gym code: 25-80-17 (enter)&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
==[[Chico Apartment|Chico Apartment Details]]==&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
&lt;br /&gt;
==[[The Weekly Task List|What Lynn should be working on by day]]==&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
&lt;br /&gt;
= The House =&lt;br /&gt;
Josh and Anna&#039;s house is on the north end of town, here:&lt;br /&gt;
&lt;br /&gt;
{{#display_map:3163 Burnt Ranch Way, chico, CA&lt;br /&gt;
||width=450|height=500|zoom=100| layers=OpenStreetMap&lt;br /&gt;
}}&lt;br /&gt;
Note that the marker is just &amp;quot;close&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The mailing address is:&lt;br /&gt;
&lt;br /&gt;
 Josh &amp;amp; Anna Macey&lt;br /&gt;
 3163 Sawyers Bar Ln&lt;br /&gt;
 Chico, CA 95973&lt;br /&gt;
&lt;br /&gt;
[[Chico House|Chico House Details]]&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Living_in_Chico&amp;diff=1512</id>
		<title>Living in Chico</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Living_in_Chico&amp;diff=1512"/>
		<updated>2026-08-17T01:17:20Z</updated>

		<summary type="html">&lt;p&gt;Lynn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{PAGEBANNER:City-of-chico-banner.jpg}}&lt;br /&gt;
=Chico Writeup Related to Retirees=&lt;br /&gt;
[https://familydestinationsguide.com/town-california-affordable-retirees/ Chico Writeup Related to Retirees]&lt;br /&gt;
&lt;br /&gt;
= The Apartment =&lt;br /&gt;
{|&lt;br /&gt;
The apartment is located on the east side of town, approximately here:&lt;br /&gt;
{{#display_map:39.75224,-121.79213&lt;br /&gt;
||width=450|height=500|zoom=100|layers=OpenStreetMap&lt;br /&gt;
}} &lt;br /&gt;
|| [[File:Condo beach.jpg | 500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
{{multiple image&lt;br /&gt;
| footer    = Players are cautioned with a yellow card and sent off with a red card.&lt;br /&gt;
| width     = 60&lt;br /&gt;
&lt;br /&gt;
| image1    = Yellow card.svg&lt;br /&gt;
| alt1      = Yellow cartouche&lt;br /&gt;
&lt;br /&gt;
| image2    = Red card.svg&lt;br /&gt;
| alt2      = Red cartouche&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Note that the marker is just &amp;quot;close&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The mailing address is: &lt;br /&gt;
&lt;br /&gt;
 The Maceys&lt;br /&gt;
 2580 California Park Dr #223&lt;br /&gt;
 Chico, CA 95928-4213&lt;br /&gt;
&lt;br /&gt;
WiFi quick connect:&lt;br /&gt;
&lt;br /&gt;
[[File:Macey WiFi-1024.jpeg | 150px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gym code: 25-80-17 (enter)&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
==[[Chico Apartment|Chico Apartment Details]]==&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
&lt;br /&gt;
==[[The Weekly Task List|What Lynn should be working on by day]]==&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
&lt;br /&gt;
= The House =&lt;br /&gt;
Josh and Anna&#039;s house is on the north end of town, here:&lt;br /&gt;
&lt;br /&gt;
{{#display_map:3163 Burnt Ranch Way, chico, CA&lt;br /&gt;
||width=450|height=500|zoom=100| layers=OpenStreetMap&lt;br /&gt;
}}&lt;br /&gt;
Note that the marker is just &amp;quot;close&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The mailing address is:&lt;br /&gt;
&lt;br /&gt;
 Josh &amp;amp; Anna Macey&lt;br /&gt;
 3163 Sawyers Bar Ln&lt;br /&gt;
 Chico, CA 95973&lt;br /&gt;
&lt;br /&gt;
[[Chico House|Chico House Details]]&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Template:Multiple_image/styles.css&amp;diff=1511</id>
		<title>Template:Multiple image/styles.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Template:Multiple_image/styles.css&amp;diff=1511"/>
		<updated>2026-08-17T01:14:10Z</updated>

		<summary type="html">&lt;p&gt;Lynn: Created page with &amp;quot;/* this is a block */ .thumbinner { 	display: flex; 	flex-direction: column; }  .trow { 	display: flex; 	flex-direction: row; 	clear: left; 	flex-wrap: wrap; 	width: 100%; 	box-sizing: border-box; }  /* this is a cell */ .tsingle { 	margin: 1px; 	float: left; }  .theader { 	clear: both; 	font-weight: bold; 	text-align: center; 	align-self: center; 	background-color: transparent; 	width: 100%; }  .thumbcaption { 	background-color: transparent; }  .text-align-left { 	text-...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* this is a block */&lt;br /&gt;
.thumbinner {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-direction: column;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.trow {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-direction: row;&lt;br /&gt;
	clear: left;&lt;br /&gt;
	flex-wrap: wrap;&lt;br /&gt;
	width: 100%;&lt;br /&gt;
	box-sizing: border-box;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* this is a cell */&lt;br /&gt;
.tsingle {&lt;br /&gt;
	margin: 1px;&lt;br /&gt;
	float: left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.theader {&lt;br /&gt;
	clear: both;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	text-align: center;&lt;br /&gt;
	align-self: center;&lt;br /&gt;
	background-color: transparent;&lt;br /&gt;
	width: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.thumbcaption {&lt;br /&gt;
	background-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.text-align-left {&lt;br /&gt;
	text-align: left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.text-align-right {&lt;br /&gt;
	text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.text-align-center {&lt;br /&gt;
	text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media all and ( max-width: 720px ) {&lt;br /&gt;
	.thumbinner {&lt;br /&gt;
		/* not !important usage can be removed when these are no longer inline styles&lt;br /&gt;
		inside Template:Multiple image and media query using min-width is introduced */&lt;br /&gt;
		width: 100% !important;&lt;br /&gt;
		box-sizing: border-box;&lt;br /&gt;
		max-width: none !important;&lt;br /&gt;
		align-items: center;&lt;br /&gt;
	}&lt;br /&gt;
	.trow {&lt;br /&gt;
		justify-content: center;&lt;br /&gt;
	}&lt;br /&gt;
	.tsingle {&lt;br /&gt;
		/* not !important usage can be removed when these are no longer inline styles&lt;br /&gt;
		inside Template:Multiple image and media query using min-width is introduced */&lt;br /&gt;
		float: none !important;&lt;br /&gt;
		max-width: 100% !important;&lt;br /&gt;
		box-sizing: border-box;&lt;br /&gt;
	}&lt;br /&gt;
	.trow &amp;gt; .thumbcaption {&lt;br /&gt;
		text-align: center;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Module:Multiple_image&amp;diff=1510</id>
		<title>Module:Multiple image</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Module:Multiple_image&amp;diff=1510"/>
		<updated>2026-08-17T01:12:02Z</updated>

		<summary type="html">&lt;p&gt;Lynn: Lynn moved page Module:Multiple Image to Module:Multiple image without leaving a redirect&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- implements [[template:multiple image]]&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local autoscaledimages&lt;br /&gt;
local nonautoscaledimages&lt;br /&gt;
&lt;br /&gt;
local function isnotempty(s)&lt;br /&gt;
	return s and s:match( &#039;^%s*(.-)%s*$&#039; ) ~= &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function removepx(s)&lt;br /&gt;
	return tostring(s or &#039;&#039;):match(&#039;^(.*)[Pp][Xx]%s*$&#039;) or s&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getdimensions(s, w, h)&lt;br /&gt;
	if tonumber(w) and tonumber(h) then&lt;br /&gt;
		nonautoscaledimages = true&lt;br /&gt;
		return tonumber(w), tonumber(h)&lt;br /&gt;
	end&lt;br /&gt;
	local file = s and mw.title.new(&#039;File:&#039; .. mw.uri.decode(mw.ustring.gsub(s,&#039;%|.*$&#039;,&#039;&#039;), &#039;WIKI&#039;))&lt;br /&gt;
	file = file and file.file or {width = 0, height = 0}&lt;br /&gt;
	w = tonumber(file.width) or 0&lt;br /&gt;
	h = tonumber(file.height) or 0&lt;br /&gt;
	autoscaledimages = true&lt;br /&gt;
	return w, h&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderImageCell(image, width, height, link, alt, thumbtime, caption, textalign, istyle)&lt;br /&gt;
	local root = mw.html.create(&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
	local altstr = &#039;|alt=&#039; .. (alt or &#039;&#039;)&lt;br /&gt;
	local linkstr = link and (&#039;|link=&#039; .. link) or &#039;&#039;&lt;br /&gt;
	local widthstr = &#039;|&#039; .. tostring(width) .. &#039;px&#039;&lt;br /&gt;
	local thumbtimestr = &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	if isnotempty( thumbtime ) then&lt;br /&gt;
		thumbtimestr = &#039;|thumbtime=&#039; .. thumbtime&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local imagediv = root:tag(&#039;div&#039;)&lt;br /&gt;
	imagediv:addClass(&#039;thumbimage&#039;)&lt;br /&gt;
	imagediv:cssText(istyle)&lt;br /&gt;
	if( height ) then&lt;br /&gt;
		imagediv:css(&#039;height&#039;, tostring(height) .. &#039;px&#039;)&lt;br /&gt;
		imagediv:css(&#039;overflow&#039;, &#039;hidden&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	imagediv:wikitext(&#039;[[file:&#039; .. image .. widthstr .. linkstr .. altstr .. thumbtimestr .. &#039;]]&#039;)&lt;br /&gt;
	if isnotempty(caption) then&lt;br /&gt;
		local captiondiv = root:tag(&#039;div&#039;)&lt;br /&gt;
		captiondiv:addClass(&#039;thumbcaption&#039;)&lt;br /&gt;
		if isnotempty(textalign) then&lt;br /&gt;
			captiondiv:addClass(&#039;text-align-&#039; .. textalign)&lt;br /&gt;
		end&lt;br /&gt;
		captiondiv:wikitext(caption)&lt;br /&gt;
	end&lt;br /&gt;
	return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getWidth(w1, w2)&lt;br /&gt;
	local w&lt;br /&gt;
	if isnotempty(w1) then&lt;br /&gt;
		w = tonumber(w1)&lt;br /&gt;
	elseif isnotempty(w2) then&lt;br /&gt;
		w = tonumber(w2)&lt;br /&gt;
	end&lt;br /&gt;
	return w or 200&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getPerRow(pstr, ic)&lt;br /&gt;
	-- split string into array using any non-digit as a dilimiter&lt;br /&gt;
	local pr = mw.text.split(pstr or &#039;&#039;, &#039;[^%d][^%d]*&#039;)&lt;br /&gt;
	-- if split failed, assume a single row&lt;br /&gt;
	if (#pr &amp;lt; 1) then&lt;br /&gt;
		pr = {tostring(ic)}&lt;br /&gt;
	end&lt;br /&gt;
	-- convert the array of strings to an array of numbers,&lt;br /&gt;
	-- adding any implied/missing numbers at the end of the array&lt;br /&gt;
	local r = 1&lt;br /&gt;
	local thisrow = tonumber(pr[1] or ic) or ic&lt;br /&gt;
	local prownum = {}&lt;br /&gt;
	while( ic &amp;gt; 0 ) do&lt;br /&gt;
		prownum[r] = thisrow&lt;br /&gt;
		ic = ic - thisrow&lt;br /&gt;
		r = r + 1&lt;br /&gt;
		-- use the previous if the next is missing and&lt;br /&gt;
		-- make sure we don&#039;t overstep the number of images&lt;br /&gt;
		thisrow = math.min(tonumber(pr[r] or thisrow) or ic, ic)&lt;br /&gt;
	end&lt;br /&gt;
	return prownum&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMultipleImages(frame)&lt;br /&gt;
	local pargs = frame:getParent().args&lt;br /&gt;
	local args = frame.args&lt;br /&gt;
	local width = removepx(pargs[&#039;width&#039;] or &#039;&#039;)&lt;br /&gt;
	local dir = pargs[&#039;direction&#039;] or &#039;&#039;&lt;br /&gt;
	local border = pargs[&#039;border&#039;] or args[&#039;border&#039;] or &#039;&#039;&lt;br /&gt;
	local align = pargs[&#039;align&#039;] or args[&#039;align&#039;] or (border == &#039;infobox&#039; and &#039;center&#039; or &#039;&#039;)&lt;br /&gt;
	local capalign = pargs[&#039;caption_align&#039;] or args[&#039;caption_align&#039;] or &#039;&#039;&lt;br /&gt;
	local totalwidth = removepx(pargs[&#039;total_width&#039;] or args[&#039;total_width&#039;] or &#039;&#039;)&lt;br /&gt;
	local imgstyle = pargs[&#039;image_style&#039;] or args[&#039;image_style&#039;]&lt;br /&gt;
	local header = pargs[&#039;header&#039;] or pargs[&#039;title&#039;] or &#039;&#039;&lt;br /&gt;
	local footer = pargs[&#039;footer&#039;] or &#039;&#039;&lt;br /&gt;
	local imagegap = tonumber(pargs[&#039;image_gap&#039;] or &#039;1&#039;) or 1&lt;br /&gt;
	local perrow = nil&lt;br /&gt;
	local thumbclass = {&lt;br /&gt;
		[&amp;quot;left&amp;quot;] = &#039;tleft&#039;,&lt;br /&gt;
		[&amp;quot;none&amp;quot;] = &#039;tnone&#039;,&lt;br /&gt;
		[&amp;quot;center&amp;quot;] = &#039;tnone&#039;,&lt;br /&gt;
		[&amp;quot;centre&amp;quot;] = &#039;tnone&#039;,&lt;br /&gt;
		[&amp;quot;right&amp;quot;] = &#039;tright&#039;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	-- find all the nonempty images&lt;br /&gt;
	local imagenumbers = {}&lt;br /&gt;
	local imagecount = 0&lt;br /&gt;
	for k, v in pairs( pargs ) do&lt;br /&gt;
		local i = tonumber(tostring(k):match( &#039;^%s*image([%d]+)%s*$&#039; ) or &#039;0&#039;)&lt;br /&gt;
		if( i &amp;gt; 0 and isnotempty(v) ) then&lt;br /&gt;
			table.insert( imagenumbers, i)&lt;br /&gt;
			imagecount = imagecount + 1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- sort the imagenumbers&lt;br /&gt;
	table.sort(imagenumbers)&lt;br /&gt;
&lt;br /&gt;
	-- create an array with the number of images per row&lt;br /&gt;
	perrow = getPerRow(dir == &#039;vertical&#039; and &#039;1&#039; or pargs[&#039;perrow&#039;], imagecount)&lt;br /&gt;
&lt;br /&gt;
	-- compute the number of rows&lt;br /&gt;
	local rowcount = #perrow&lt;br /&gt;
&lt;br /&gt;
	-- store the image widths and compute row widths and maximum row width&lt;br /&gt;
	local heights = {}&lt;br /&gt;
	local widths = {}&lt;br /&gt;
	local widthmax = 0&lt;br /&gt;
	local widthsum = {}&lt;br /&gt;
	local k = 0&lt;br /&gt;
	for r=1,rowcount do&lt;br /&gt;
		widthsum[r] = 0&lt;br /&gt;
		for c=1,perrow[r] do&lt;br /&gt;
			k = k + 1&lt;br /&gt;
			if( k &amp;lt;= imagecount ) then&lt;br /&gt;
				local i = imagenumbers[k]&lt;br /&gt;
				if( isnotempty(totalwidth) ) then&lt;br /&gt;
					widths[k], heights[k] = getdimensions(pargs[&#039;image&#039; .. i], pargs[&#039;width&#039; .. i], pargs[&#039;height&#039; .. i])&lt;br /&gt;
				else&lt;br /&gt;
					widths[k] = getWidth(width, pargs[&#039;width&#039; .. i])&lt;br /&gt;
				end&lt;br /&gt;
				widthsum[r] = widthsum[r] + widths[k]&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		widthmax = math.max(widthmax, widthsum[r])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- make sure the gap is non-negative&lt;br /&gt;
	if imagegap &amp;lt; 0 then imagegap = 0 end&lt;br /&gt;
&lt;br /&gt;
	-- if total_width has been specified, rescale the image widths&lt;br /&gt;
	if( isnotempty(totalwidth) ) then&lt;br /&gt;
		totalwidth = tonumber(totalwidth)&lt;br /&gt;
		widthmax = 0&lt;br /&gt;
		local k = 0&lt;br /&gt;
		for r=1,rowcount do&lt;br /&gt;
			local koffset = k&lt;br /&gt;
			local tw = totalwidth - (3 + imagegap) * (perrow[r] - 1) - 12&lt;br /&gt;
			local ar = {}&lt;br /&gt;
			local arsum = 0&lt;br /&gt;
			for j=1,perrow[r] do&lt;br /&gt;
				k = k + 1&lt;br /&gt;
				if( k&amp;lt;= imagecount ) then&lt;br /&gt;
					local i = imagenumbers[k]&lt;br /&gt;
					local h = heights[k] or 0&lt;br /&gt;
					if (h &amp;gt; 0) then&lt;br /&gt;
						ar[j] = widths[k]/h&lt;br /&gt;
						heights[k] = h&lt;br /&gt;
					else&lt;br /&gt;
						ar[j] = widths[k]/100&lt;br /&gt;
					end&lt;br /&gt;
					arsum = arsum + ar[j]&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			local ht = tw/arsum&lt;br /&gt;
			local ws = 0&lt;br /&gt;
			k = koffset&lt;br /&gt;
			for j=1,perrow[r] do&lt;br /&gt;
				k = k + 1&lt;br /&gt;
				if( k&amp;lt;= imagecount ) then&lt;br /&gt;
					local i = imagenumbers[k]&lt;br /&gt;
					widths[k] = math.floor(ar[j]*ht + 0.5)&lt;br /&gt;
					ws = ws + widths[k]&lt;br /&gt;
					if heights[k] then&lt;br /&gt;
						heights[k] = math.floor(ht)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			widthsum[r] = ws&lt;br /&gt;
			widthmax = math.max(widthmax, widthsum[r])&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- start building the array of images, if there are images&lt;br /&gt;
	if( imagecount &amp;gt; 0 ) then&lt;br /&gt;
		-- compute width of outer div&lt;br /&gt;
		local bodywidth = 0&lt;br /&gt;
		for r=1,rowcount do&lt;br /&gt;
			if( widthmax == widthsum[r] ) then&lt;br /&gt;
				bodywidth = widthmax + (3 + imagegap) * (perrow[r] - 1) + 12&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		-- The body has a min-width of 100, which needs to be taken into account on specific widths&lt;br /&gt;
		bodywidth = math.max( 100, bodywidth - 8);&lt;br /&gt;
&lt;br /&gt;
		local bg = pargs[&#039;background color&#039;] or &#039;&#039;&lt;br /&gt;
		-- create the array of images&lt;br /&gt;
		local root = mw.html.create(&#039;div&#039;)&lt;br /&gt;
		root:addClass(&#039;thumb&#039;)&lt;br /&gt;
		root:addClass(&#039;tmulti&#039;)&lt;br /&gt;
		-- root:addClass(&#039;tmulti-sandbox&#039;)&lt;br /&gt;
		root:addClass(thumbclass[align] or &#039;tright&#039;)&lt;br /&gt;
&lt;br /&gt;
		if( align == &#039;center&#039; or align == &#039;centre&#039; ) then&lt;br /&gt;
			root:addClass(&#039;center&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		if( bg ~= &#039;&#039; ) then&lt;br /&gt;
			root:css(&#039;background-color&#039;, bg)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local div = root:tag(&#039;div&#039;)&lt;br /&gt;
		div:addClass(&#039;thumbinner&#039;)&lt;br /&gt;
		div:css(&#039;width&#039;, tostring(bodywidth) .. &#039;px&#039;)&lt;br /&gt;
			:css(&#039;max-width&#039;, tostring(bodywidth) .. &#039;px&#039;)&lt;br /&gt;
		if( bg ~= &#039;&#039; ) then&lt;br /&gt;
			div:css(&#039;background-color&#039;, bg)&lt;br /&gt;
		end&lt;br /&gt;
		if( border == &#039;infobox&#039; or border == &#039;none&#039;) then&lt;br /&gt;
			div:css(&#039;border&#039;, &#039;none&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		-- add the header&lt;br /&gt;
		if( isnotempty(header) ) then&lt;br /&gt;
			div:tag(&#039;div&#039;)&lt;br /&gt;
				:addClass(&#039;trow&#039;)&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					:addClass(&#039;theader&#039;)&lt;br /&gt;
					:css(&#039;text-align&#039;, pargs[&#039;header_align&#039;])&lt;br /&gt;
					:css(&#039;background-color&#039;, pargs[&#039;header_background&#039;])&lt;br /&gt;
					:wikitext(header)&lt;br /&gt;
		end&lt;br /&gt;
		-- loop through the images&lt;br /&gt;
		local k = 0&lt;br /&gt;
		for r=1,rowcount do&lt;br /&gt;
			local rowdiv = div:tag(&#039;div&#039;):addClass(&#039;trow&#039;);&lt;br /&gt;
			for j=1,perrow[r] do&lt;br /&gt;
				k = k + 1&lt;br /&gt;
				if( k &amp;lt;= imagecount ) then&lt;br /&gt;
					local imagediv = rowdiv:tag(&#039;div&#039;)&lt;br /&gt;
					imagediv:addClass(&#039;tsingle&#039;)&lt;br /&gt;
					if bg ~= &#039;&#039; then&lt;br /&gt;
						imagediv:css(&#039;background-color&#039;, bg);&lt;br /&gt;
					end&lt;br /&gt;
					if ((imagegap &amp;gt; 1) and (j &amp;lt; perrow[r])) then&lt;br /&gt;
						imagediv:css(&#039;margin-right&#039;, tostring(imagegap) .. &#039;px&#039;)&lt;br /&gt;
					end&lt;br /&gt;
					local i = imagenumbers[k]&lt;br /&gt;
					local img = pargs[&#039;image&#039; .. i]&lt;br /&gt;
					local w = widths[k]&lt;br /&gt;
					imagediv:css(&#039;width&#039;, tostring(2 + w) .. &#039;px&#039;)&lt;br /&gt;
						:css(&#039;max-width&#039;, tostring(2 + w) .. &#039;px&#039;)&lt;br /&gt;
					imagediv:wikitext(renderImageCell(img, w, heights[k],&lt;br /&gt;
						pargs[&#039;link&#039; .. i], pargs[&#039;alt&#039; .. i],&lt;br /&gt;
						pargs[&#039;thumbtime&#039; .. i], pargs[&#039;caption&#039; .. i], capalign, imgstyle))&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		-- add the footer&lt;br /&gt;
		if( isnotempty(footer) ) then&lt;br /&gt;
			local falign = string.lower(pargs[&#039;footer_align&#039;] or args[&#039;footer_align&#039;] or &#039;left&#039;)&lt;br /&gt;
			falign = (falign == &#039;centre&#039;) and &#039;center&#039; or falign&lt;br /&gt;
			div:tag(&#039;div&#039;)&lt;br /&gt;
				:addClass(&#039;trow&#039;)&lt;br /&gt;
				:css(&#039;display&#039;, (falign ~= &#039;left&#039;) and &#039;flow-root&#039; or &#039;flex&#039;)&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					:addClass(&#039;thumbcaption&#039;)&lt;br /&gt;
					:css(&#039;text-align&#039;, (falign ~= &#039;left&#039;) and falign or nil)&lt;br /&gt;
					:css(&#039;background-color&#039;, pargs[&#039;footer_background&#039;])&lt;br /&gt;
					:wikitext(footer)&lt;br /&gt;
		end&lt;br /&gt;
		return tostring(root)&lt;br /&gt;
	end&lt;br /&gt;
	return &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.render( frame )&lt;br /&gt;
	autoscaledimages = false&lt;br /&gt;
	nonautoscaledimages = false&lt;br /&gt;
&lt;br /&gt;
	return frame:extensionTag {name = &#039;templatestyles&#039;, args = {src = &#039;Multiple image/styles.css&#039;, wrapper = &amp;quot;.tmulti&amp;quot;}}&lt;br /&gt;
		.. renderMultipleImages( frame )&lt;br /&gt;
		.. (autoscaledimages and &#039;[[Category:Pages using multiple image with auto scaled images]]&#039; or &#039;&#039;)&lt;br /&gt;
		.. (nonautoscaledimages and &#039;[[Category:Pages using multiple image with manual scaled images]]&#039; or &#039;&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Template:Multiple_image&amp;diff=1509</id>
		<title>Template:Multiple image</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Template:Multiple_image&amp;diff=1509"/>
		<updated>2026-08-17T00:39:36Z</updated>

		<summary type="html">&lt;p&gt;Lynn: Created page with &amp;quot;{{#invoke:Multiple image|render}}&amp;lt;noinclude&amp;gt;{{doc}}&amp;lt;!-- PLEASE ADD CATEGORIES AND INTERWIKIS TO THE /doc SUBPAGE, THANKS --&amp;gt;&amp;lt;/noinclude&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:Multiple image|render}}&amp;lt;noinclude&amp;gt;{{doc}}&amp;lt;!-- PLEASE ADD CATEGORIES AND INTERWIKIS TO THE /doc SUBPAGE, THANKS --&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Sandbox&amp;diff=1508</id>
		<title>Sandbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Sandbox&amp;diff=1508"/>
		<updated>2026-08-17T00:39:01Z</updated>

		<summary type="html">&lt;p&gt;Lynn: Created page with &amp;quot;{{multiple image | footer    = Players are cautioned with a yellow card and sent off with a red card. | width     = 60  | image1    = Yellow card.svg | alt1      = Yellow cartouche  | image2    = Red card.svg | alt2      = Red cartouche }}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{multiple image&lt;br /&gt;
| footer    = Players are cautioned with a yellow card and sent off with a red card.&lt;br /&gt;
| width     = 60&lt;br /&gt;
&lt;br /&gt;
| image1    = Yellow card.svg&lt;br /&gt;
| alt1      = Yellow cartouche&lt;br /&gt;
&lt;br /&gt;
| image2    = Red card.svg&lt;br /&gt;
| alt2      = Red cartouche&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Module:Multiple_image&amp;diff=1506</id>
		<title>Module:Multiple image</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Module:Multiple_image&amp;diff=1506"/>
		<updated>2026-08-17T00:35:58Z</updated>

		<summary type="html">&lt;p&gt;Lynn: Created page with &amp;quot;-- implements template:multiple image local p = {}  local autoscaledimages local nonautoscaledimages  local function isnotempty(s) 	return s and s:match( &amp;#039;^%s*(.-)%s*$&amp;#039; ) ~= &amp;#039;&amp;#039; end  local function removepx(s) 	return tostring(s or &amp;#039;&amp;#039;):match(&amp;#039;^(.*)[Pp][Xx]%s*$&amp;#039;) or s end  local function getdimensions(s, w, h) 	if tonumber(w) and tonumber(h) then 		nonautoscaledimages = true 		return tonumber(w), tonumber(h) 	end 	local file = s and mw.title.new(&amp;#039;File:&amp;#039; .. mw.uri.decod...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- implements [[template:multiple image]]&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local autoscaledimages&lt;br /&gt;
local nonautoscaledimages&lt;br /&gt;
&lt;br /&gt;
local function isnotempty(s)&lt;br /&gt;
	return s and s:match( &#039;^%s*(.-)%s*$&#039; ) ~= &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function removepx(s)&lt;br /&gt;
	return tostring(s or &#039;&#039;):match(&#039;^(.*)[Pp][Xx]%s*$&#039;) or s&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getdimensions(s, w, h)&lt;br /&gt;
	if tonumber(w) and tonumber(h) then&lt;br /&gt;
		nonautoscaledimages = true&lt;br /&gt;
		return tonumber(w), tonumber(h)&lt;br /&gt;
	end&lt;br /&gt;
	local file = s and mw.title.new(&#039;File:&#039; .. mw.uri.decode(mw.ustring.gsub(s,&#039;%|.*$&#039;,&#039;&#039;), &#039;WIKI&#039;))&lt;br /&gt;
	file = file and file.file or {width = 0, height = 0}&lt;br /&gt;
	w = tonumber(file.width) or 0&lt;br /&gt;
	h = tonumber(file.height) or 0&lt;br /&gt;
	autoscaledimages = true&lt;br /&gt;
	return w, h&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderImageCell(image, width, height, link, alt, thumbtime, caption, textalign, istyle)&lt;br /&gt;
	local root = mw.html.create(&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
	local altstr = &#039;|alt=&#039; .. (alt or &#039;&#039;)&lt;br /&gt;
	local linkstr = link and (&#039;|link=&#039; .. link) or &#039;&#039;&lt;br /&gt;
	local widthstr = &#039;|&#039; .. tostring(width) .. &#039;px&#039;&lt;br /&gt;
	local thumbtimestr = &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	if isnotempty( thumbtime ) then&lt;br /&gt;
		thumbtimestr = &#039;|thumbtime=&#039; .. thumbtime&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local imagediv = root:tag(&#039;div&#039;)&lt;br /&gt;
	imagediv:addClass(&#039;thumbimage&#039;)&lt;br /&gt;
	imagediv:cssText(istyle)&lt;br /&gt;
	if( height ) then&lt;br /&gt;
		imagediv:css(&#039;height&#039;, tostring(height) .. &#039;px&#039;)&lt;br /&gt;
		imagediv:css(&#039;overflow&#039;, &#039;hidden&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	imagediv:wikitext(&#039;[[file:&#039; .. image .. widthstr .. linkstr .. altstr .. thumbtimestr .. &#039;]]&#039;)&lt;br /&gt;
	if isnotempty(caption) then&lt;br /&gt;
		local captiondiv = root:tag(&#039;div&#039;)&lt;br /&gt;
		captiondiv:addClass(&#039;thumbcaption&#039;)&lt;br /&gt;
		if isnotempty(textalign) then&lt;br /&gt;
			captiondiv:addClass(&#039;text-align-&#039; .. textalign)&lt;br /&gt;
		end&lt;br /&gt;
		captiondiv:wikitext(caption)&lt;br /&gt;
	end&lt;br /&gt;
	return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getWidth(w1, w2)&lt;br /&gt;
	local w&lt;br /&gt;
	if isnotempty(w1) then&lt;br /&gt;
		w = tonumber(w1)&lt;br /&gt;
	elseif isnotempty(w2) then&lt;br /&gt;
		w = tonumber(w2)&lt;br /&gt;
	end&lt;br /&gt;
	return w or 200&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getPerRow(pstr, ic)&lt;br /&gt;
	-- split string into array using any non-digit as a dilimiter&lt;br /&gt;
	local pr = mw.text.split(pstr or &#039;&#039;, &#039;[^%d][^%d]*&#039;)&lt;br /&gt;
	-- if split failed, assume a single row&lt;br /&gt;
	if (#pr &amp;lt; 1) then&lt;br /&gt;
		pr = {tostring(ic)}&lt;br /&gt;
	end&lt;br /&gt;
	-- convert the array of strings to an array of numbers,&lt;br /&gt;
	-- adding any implied/missing numbers at the end of the array&lt;br /&gt;
	local r = 1&lt;br /&gt;
	local thisrow = tonumber(pr[1] or ic) or ic&lt;br /&gt;
	local prownum = {}&lt;br /&gt;
	while( ic &amp;gt; 0 ) do&lt;br /&gt;
		prownum[r] = thisrow&lt;br /&gt;
		ic = ic - thisrow&lt;br /&gt;
		r = r + 1&lt;br /&gt;
		-- use the previous if the next is missing and&lt;br /&gt;
		-- make sure we don&#039;t overstep the number of images&lt;br /&gt;
		thisrow = math.min(tonumber(pr[r] or thisrow) or ic, ic)&lt;br /&gt;
	end&lt;br /&gt;
	return prownum&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderMultipleImages(frame)&lt;br /&gt;
	local pargs = frame:getParent().args&lt;br /&gt;
	local args = frame.args&lt;br /&gt;
	local width = removepx(pargs[&#039;width&#039;] or &#039;&#039;)&lt;br /&gt;
	local dir = pargs[&#039;direction&#039;] or &#039;&#039;&lt;br /&gt;
	local border = pargs[&#039;border&#039;] or args[&#039;border&#039;] or &#039;&#039;&lt;br /&gt;
	local align = pargs[&#039;align&#039;] or args[&#039;align&#039;] or (border == &#039;infobox&#039; and &#039;center&#039; or &#039;&#039;)&lt;br /&gt;
	local capalign = pargs[&#039;caption_align&#039;] or args[&#039;caption_align&#039;] or &#039;&#039;&lt;br /&gt;
	local totalwidth = removepx(pargs[&#039;total_width&#039;] or args[&#039;total_width&#039;] or &#039;&#039;)&lt;br /&gt;
	local imgstyle = pargs[&#039;image_style&#039;] or args[&#039;image_style&#039;]&lt;br /&gt;
	local header = pargs[&#039;header&#039;] or pargs[&#039;title&#039;] or &#039;&#039;&lt;br /&gt;
	local footer = pargs[&#039;footer&#039;] or &#039;&#039;&lt;br /&gt;
	local imagegap = tonumber(pargs[&#039;image_gap&#039;] or &#039;1&#039;) or 1&lt;br /&gt;
	local perrow = nil&lt;br /&gt;
	local thumbclass = {&lt;br /&gt;
		[&amp;quot;left&amp;quot;] = &#039;tleft&#039;,&lt;br /&gt;
		[&amp;quot;none&amp;quot;] = &#039;tnone&#039;,&lt;br /&gt;
		[&amp;quot;center&amp;quot;] = &#039;tnone&#039;,&lt;br /&gt;
		[&amp;quot;centre&amp;quot;] = &#039;tnone&#039;,&lt;br /&gt;
		[&amp;quot;right&amp;quot;] = &#039;tright&#039;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	-- find all the nonempty images&lt;br /&gt;
	local imagenumbers = {}&lt;br /&gt;
	local imagecount = 0&lt;br /&gt;
	for k, v in pairs( pargs ) do&lt;br /&gt;
		local i = tonumber(tostring(k):match( &#039;^%s*image([%d]+)%s*$&#039; ) or &#039;0&#039;)&lt;br /&gt;
		if( i &amp;gt; 0 and isnotempty(v) ) then&lt;br /&gt;
			table.insert( imagenumbers, i)&lt;br /&gt;
			imagecount = imagecount + 1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- sort the imagenumbers&lt;br /&gt;
	table.sort(imagenumbers)&lt;br /&gt;
&lt;br /&gt;
	-- create an array with the number of images per row&lt;br /&gt;
	perrow = getPerRow(dir == &#039;vertical&#039; and &#039;1&#039; or pargs[&#039;perrow&#039;], imagecount)&lt;br /&gt;
&lt;br /&gt;
	-- compute the number of rows&lt;br /&gt;
	local rowcount = #perrow&lt;br /&gt;
&lt;br /&gt;
	-- store the image widths and compute row widths and maximum row width&lt;br /&gt;
	local heights = {}&lt;br /&gt;
	local widths = {}&lt;br /&gt;
	local widthmax = 0&lt;br /&gt;
	local widthsum = {}&lt;br /&gt;
	local k = 0&lt;br /&gt;
	for r=1,rowcount do&lt;br /&gt;
		widthsum[r] = 0&lt;br /&gt;
		for c=1,perrow[r] do&lt;br /&gt;
			k = k + 1&lt;br /&gt;
			if( k &amp;lt;= imagecount ) then&lt;br /&gt;
				local i = imagenumbers[k]&lt;br /&gt;
				if( isnotempty(totalwidth) ) then&lt;br /&gt;
					widths[k], heights[k] = getdimensions(pargs[&#039;image&#039; .. i], pargs[&#039;width&#039; .. i], pargs[&#039;height&#039; .. i])&lt;br /&gt;
				else&lt;br /&gt;
					widths[k] = getWidth(width, pargs[&#039;width&#039; .. i])&lt;br /&gt;
				end&lt;br /&gt;
				widthsum[r] = widthsum[r] + widths[k]&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		widthmax = math.max(widthmax, widthsum[r])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- make sure the gap is non-negative&lt;br /&gt;
	if imagegap &amp;lt; 0 then imagegap = 0 end&lt;br /&gt;
&lt;br /&gt;
	-- if total_width has been specified, rescale the image widths&lt;br /&gt;
	if( isnotempty(totalwidth) ) then&lt;br /&gt;
		totalwidth = tonumber(totalwidth)&lt;br /&gt;
		widthmax = 0&lt;br /&gt;
		local k = 0&lt;br /&gt;
		for r=1,rowcount do&lt;br /&gt;
			local koffset = k&lt;br /&gt;
			local tw = totalwidth - (3 + imagegap) * (perrow[r] - 1) - 12&lt;br /&gt;
			local ar = {}&lt;br /&gt;
			local arsum = 0&lt;br /&gt;
			for j=1,perrow[r] do&lt;br /&gt;
				k = k + 1&lt;br /&gt;
				if( k&amp;lt;= imagecount ) then&lt;br /&gt;
					local i = imagenumbers[k]&lt;br /&gt;
					local h = heights[k] or 0&lt;br /&gt;
					if (h &amp;gt; 0) then&lt;br /&gt;
						ar[j] = widths[k]/h&lt;br /&gt;
						heights[k] = h&lt;br /&gt;
					else&lt;br /&gt;
						ar[j] = widths[k]/100&lt;br /&gt;
					end&lt;br /&gt;
					arsum = arsum + ar[j]&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			local ht = tw/arsum&lt;br /&gt;
			local ws = 0&lt;br /&gt;
			k = koffset&lt;br /&gt;
			for j=1,perrow[r] do&lt;br /&gt;
				k = k + 1&lt;br /&gt;
				if( k&amp;lt;= imagecount ) then&lt;br /&gt;
					local i = imagenumbers[k]&lt;br /&gt;
					widths[k] = math.floor(ar[j]*ht + 0.5)&lt;br /&gt;
					ws = ws + widths[k]&lt;br /&gt;
					if heights[k] then&lt;br /&gt;
						heights[k] = math.floor(ht)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			widthsum[r] = ws&lt;br /&gt;
			widthmax = math.max(widthmax, widthsum[r])&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- start building the array of images, if there are images&lt;br /&gt;
	if( imagecount &amp;gt; 0 ) then&lt;br /&gt;
		-- compute width of outer div&lt;br /&gt;
		local bodywidth = 0&lt;br /&gt;
		for r=1,rowcount do&lt;br /&gt;
			if( widthmax == widthsum[r] ) then&lt;br /&gt;
				bodywidth = widthmax + (3 + imagegap) * (perrow[r] - 1) + 12&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		-- The body has a min-width of 100, which needs to be taken into account on specific widths&lt;br /&gt;
		bodywidth = math.max( 100, bodywidth - 8);&lt;br /&gt;
&lt;br /&gt;
		local bg = pargs[&#039;background color&#039;] or &#039;&#039;&lt;br /&gt;
		-- create the array of images&lt;br /&gt;
		local root = mw.html.create(&#039;div&#039;)&lt;br /&gt;
		root:addClass(&#039;thumb&#039;)&lt;br /&gt;
		root:addClass(&#039;tmulti&#039;)&lt;br /&gt;
		-- root:addClass(&#039;tmulti-sandbox&#039;)&lt;br /&gt;
		root:addClass(thumbclass[align] or &#039;tright&#039;)&lt;br /&gt;
&lt;br /&gt;
		if( align == &#039;center&#039; or align == &#039;centre&#039; ) then&lt;br /&gt;
			root:addClass(&#039;center&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		if( bg ~= &#039;&#039; ) then&lt;br /&gt;
			root:css(&#039;background-color&#039;, bg)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local div = root:tag(&#039;div&#039;)&lt;br /&gt;
		div:addClass(&#039;thumbinner&#039;)&lt;br /&gt;
		div:css(&#039;width&#039;, tostring(bodywidth) .. &#039;px&#039;)&lt;br /&gt;
			:css(&#039;max-width&#039;, tostring(bodywidth) .. &#039;px&#039;)&lt;br /&gt;
		if( bg ~= &#039;&#039; ) then&lt;br /&gt;
			div:css(&#039;background-color&#039;, bg)&lt;br /&gt;
		end&lt;br /&gt;
		if( border == &#039;infobox&#039; or border == &#039;none&#039;) then&lt;br /&gt;
			div:css(&#039;border&#039;, &#039;none&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		-- add the header&lt;br /&gt;
		if( isnotempty(header) ) then&lt;br /&gt;
			div:tag(&#039;div&#039;)&lt;br /&gt;
				:addClass(&#039;trow&#039;)&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					:addClass(&#039;theader&#039;)&lt;br /&gt;
					:css(&#039;text-align&#039;, pargs[&#039;header_align&#039;])&lt;br /&gt;
					:css(&#039;background-color&#039;, pargs[&#039;header_background&#039;])&lt;br /&gt;
					:wikitext(header)&lt;br /&gt;
		end&lt;br /&gt;
		-- loop through the images&lt;br /&gt;
		local k = 0&lt;br /&gt;
		for r=1,rowcount do&lt;br /&gt;
			local rowdiv = div:tag(&#039;div&#039;):addClass(&#039;trow&#039;);&lt;br /&gt;
			for j=1,perrow[r] do&lt;br /&gt;
				k = k + 1&lt;br /&gt;
				if( k &amp;lt;= imagecount ) then&lt;br /&gt;
					local imagediv = rowdiv:tag(&#039;div&#039;)&lt;br /&gt;
					imagediv:addClass(&#039;tsingle&#039;)&lt;br /&gt;
					if bg ~= &#039;&#039; then&lt;br /&gt;
						imagediv:css(&#039;background-color&#039;, bg);&lt;br /&gt;
					end&lt;br /&gt;
					if ((imagegap &amp;gt; 1) and (j &amp;lt; perrow[r])) then&lt;br /&gt;
						imagediv:css(&#039;margin-right&#039;, tostring(imagegap) .. &#039;px&#039;)&lt;br /&gt;
					end&lt;br /&gt;
					local i = imagenumbers[k]&lt;br /&gt;
					local img = pargs[&#039;image&#039; .. i]&lt;br /&gt;
					local w = widths[k]&lt;br /&gt;
					imagediv:css(&#039;width&#039;, tostring(2 + w) .. &#039;px&#039;)&lt;br /&gt;
						:css(&#039;max-width&#039;, tostring(2 + w) .. &#039;px&#039;)&lt;br /&gt;
					imagediv:wikitext(renderImageCell(img, w, heights[k],&lt;br /&gt;
						pargs[&#039;link&#039; .. i], pargs[&#039;alt&#039; .. i],&lt;br /&gt;
						pargs[&#039;thumbtime&#039; .. i], pargs[&#039;caption&#039; .. i], capalign, imgstyle))&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		-- add the footer&lt;br /&gt;
		if( isnotempty(footer) ) then&lt;br /&gt;
			local falign = string.lower(pargs[&#039;footer_align&#039;] or args[&#039;footer_align&#039;] or &#039;left&#039;)&lt;br /&gt;
			falign = (falign == &#039;centre&#039;) and &#039;center&#039; or falign&lt;br /&gt;
			div:tag(&#039;div&#039;)&lt;br /&gt;
				:addClass(&#039;trow&#039;)&lt;br /&gt;
				:css(&#039;display&#039;, (falign ~= &#039;left&#039;) and &#039;flow-root&#039; or &#039;flex&#039;)&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					:addClass(&#039;thumbcaption&#039;)&lt;br /&gt;
					:css(&#039;text-align&#039;, (falign ~= &#039;left&#039;) and falign or nil)&lt;br /&gt;
					:css(&#039;background-color&#039;, pargs[&#039;footer_background&#039;])&lt;br /&gt;
					:wikitext(footer)&lt;br /&gt;
		end&lt;br /&gt;
		return tostring(root)&lt;br /&gt;
	end&lt;br /&gt;
	return &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.render( frame )&lt;br /&gt;
	autoscaledimages = false&lt;br /&gt;
	nonautoscaledimages = false&lt;br /&gt;
&lt;br /&gt;
	return frame:extensionTag {name = &#039;templatestyles&#039;, args = {src = &#039;Multiple image/styles.css&#039;, wrapper = &amp;quot;.tmulti&amp;quot;}}&lt;br /&gt;
		.. renderMultipleImages( frame )&lt;br /&gt;
		.. (autoscaledimages and &#039;[[Category:Pages using multiple image with auto scaled images]]&#039; or &#039;&#039;)&lt;br /&gt;
		.. (nonautoscaledimages and &#039;[[Category:Pages using multiple image with manual scaled images]]&#039; or &#039;&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Living_in_Chico&amp;diff=1505</id>
		<title>Living in Chico</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Living_in_Chico&amp;diff=1505"/>
		<updated>2026-08-17T00:35:05Z</updated>

		<summary type="html">&lt;p&gt;Lynn: /* The Apartment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{PAGEBANNER:City-of-chico-banner.jpg}}&lt;br /&gt;
=Chico Writeup Related to Retirees=&lt;br /&gt;
[https://familydestinationsguide.com/town-california-affordable-retirees/ Chico Writeup Related to Retirees]&lt;br /&gt;
&lt;br /&gt;
= The Apartment =&lt;br /&gt;
{|&lt;br /&gt;
The apartment is located on the east side of town, approximately here:&lt;br /&gt;
{{#display_map:39.75224,-121.79213&lt;br /&gt;
||width=450|height=500|zoom=100|layers=OpenStreetMap&lt;br /&gt;
}} &lt;br /&gt;
|| [[File:Condo beach.jpg | 500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Note that the marker is just &amp;quot;close&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The mailing address is: &lt;br /&gt;
&lt;br /&gt;
 The Maceys&lt;br /&gt;
 2580 California Park Dr #223&lt;br /&gt;
 Chico, CA 95928-4213&lt;br /&gt;
&lt;br /&gt;
WiFi quick connect:&lt;br /&gt;
&lt;br /&gt;
[[File:Macey WiFi-1024.jpeg | 150px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gym code: 25-80-17 (enter)&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
==[[Chico Apartment|Chico Apartment Details]]==&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
&lt;br /&gt;
==[[The Weekly Task List|What Lynn should be working on by day]]==&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
&lt;br /&gt;
= The House =&lt;br /&gt;
Josh and Anna&#039;s house is on the north end of town, here:&lt;br /&gt;
&lt;br /&gt;
{{#display_map:3163 Burnt Ranch Way, chico, CA&lt;br /&gt;
||width=450|height=500|zoom=100| layers=OpenStreetMap&lt;br /&gt;
}}&lt;br /&gt;
Note that the marker is just &amp;quot;close&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The mailing address is:&lt;br /&gt;
&lt;br /&gt;
 Josh &amp;amp; Anna Macey&lt;br /&gt;
 3163 Sawyers Bar Ln&lt;br /&gt;
 Chico, CA 95973&lt;br /&gt;
&lt;br /&gt;
[[Chico House|Chico House Details]]&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Living_in_Chico&amp;diff=1504</id>
		<title>Living in Chico</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Living_in_Chico&amp;diff=1504"/>
		<updated>2026-08-17T00:18:09Z</updated>

		<summary type="html">&lt;p&gt;Lynn: /* The Apartment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{PAGEBANNER:City-of-chico-banner.jpg}}&lt;br /&gt;
=Chico Writeup Related to Retirees=&lt;br /&gt;
[https://familydestinationsguide.com/town-california-affordable-retirees/ Chico Writeup Related to Retirees]&lt;br /&gt;
&lt;br /&gt;
= The Apartment =&lt;br /&gt;
{|&lt;br /&gt;
The apartment is located on the east side of town, approximately here:&lt;br /&gt;
{{#display_map:39.75224,-121.79213&lt;br /&gt;
||width=450|height=500|zoom=100|layers=OpenStreetMap&lt;br /&gt;
}} || [[File:Condo beach.jpg | 500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Note that the marker is just &amp;quot;close&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The mailing address is: &lt;br /&gt;
&lt;br /&gt;
 The Maceys&lt;br /&gt;
 2580 California Park Dr #223&lt;br /&gt;
 Chico, CA 95928-4213&lt;br /&gt;
&lt;br /&gt;
WiFi quick connect:&lt;br /&gt;
&lt;br /&gt;
[[File:Macey WiFi-1024.jpeg | 150px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gym code: 25-80-17 (enter)&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
==[[Chico Apartment|Chico Apartment Details]]==&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
&lt;br /&gt;
==[[The Weekly Task List|What Lynn should be working on by day]]==&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
&lt;br /&gt;
= The House =&lt;br /&gt;
Josh and Anna&#039;s house is on the north end of town, here:&lt;br /&gt;
&lt;br /&gt;
{{#display_map:3163 Burnt Ranch Way, chico, CA&lt;br /&gt;
||width=450|height=500|zoom=100| layers=OpenStreetMap&lt;br /&gt;
}}&lt;br /&gt;
Note that the marker is just &amp;quot;close&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The mailing address is:&lt;br /&gt;
&lt;br /&gt;
 Josh &amp;amp; Anna Macey&lt;br /&gt;
 3163 Sawyers Bar Ln&lt;br /&gt;
 Chico, CA 95973&lt;br /&gt;
&lt;br /&gt;
[[Chico House|Chico House Details]]&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Living_in_Chico&amp;diff=1503</id>
		<title>Living in Chico</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Living_in_Chico&amp;diff=1503"/>
		<updated>2026-08-17T00:17:38Z</updated>

		<summary type="html">&lt;p&gt;Lynn: /* The Apartment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{PAGEBANNER:City-of-chico-banner.jpg}}&lt;br /&gt;
=Chico Writeup Related to Retirees=&lt;br /&gt;
[https://familydestinationsguide.com/town-california-affordable-retirees/ Chico Writeup Related to Retirees]&lt;br /&gt;
&lt;br /&gt;
= The Apartment =&lt;br /&gt;
{|&lt;br /&gt;
The apartment is located on the east side of town, approximately here:&lt;br /&gt;
{{#display_map:39.75224,-121.79213&lt;br /&gt;
||width=450|height=500|zoom=100|layers=OpenStreetMap&lt;br /&gt;
}} ||&lt;br /&gt;
|| [[File:Condo beach.jpg | 500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Note that the marker is just &amp;quot;close&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The mailing address is: &lt;br /&gt;
&lt;br /&gt;
 The Maceys&lt;br /&gt;
 2580 California Park Dr #223&lt;br /&gt;
 Chico, CA 95928-4213&lt;br /&gt;
&lt;br /&gt;
WiFi quick connect:&lt;br /&gt;
&lt;br /&gt;
[[File:Macey WiFi-1024.jpeg | 150px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gym code: 25-80-17 (enter)&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
==[[Chico Apartment|Chico Apartment Details]]==&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
&lt;br /&gt;
==[[The Weekly Task List|What Lynn should be working on by day]]==&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
&lt;br /&gt;
= The House =&lt;br /&gt;
Josh and Anna&#039;s house is on the north end of town, here:&lt;br /&gt;
&lt;br /&gt;
{{#display_map:3163 Burnt Ranch Way, chico, CA&lt;br /&gt;
||width=450|height=500|zoom=100| layers=OpenStreetMap&lt;br /&gt;
}}&lt;br /&gt;
Note that the marker is just &amp;quot;close&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The mailing address is:&lt;br /&gt;
&lt;br /&gt;
 Josh &amp;amp; Anna Macey&lt;br /&gt;
 3163 Sawyers Bar Ln&lt;br /&gt;
 Chico, CA 95973&lt;br /&gt;
&lt;br /&gt;
[[Chico House|Chico House Details]]&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Living_in_Chico&amp;diff=1502</id>
		<title>Living in Chico</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Living_in_Chico&amp;diff=1502"/>
		<updated>2026-08-17T00:17:05Z</updated>

		<summary type="html">&lt;p&gt;Lynn: /* The Apartment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{PAGEBANNER:City-of-chico-banner.jpg}}&lt;br /&gt;
=Chico Writeup Related to Retirees=&lt;br /&gt;
[https://familydestinationsguide.com/town-california-affordable-retirees/ Chico Writeup Related to Retirees]&lt;br /&gt;
&lt;br /&gt;
= The Apartment =&lt;br /&gt;
{|&lt;br /&gt;
The apartment is located on the east side of town, approximately here:&lt;br /&gt;
{{#display_map:39.75224,-121.79213&lt;br /&gt;
||width=450|height=500|zoom=100|layers=OpenStreetMap&lt;br /&gt;
}} ||&lt;br /&gt;
|| [[File:Condo beach.jpg 500px]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Note that the marker is just &amp;quot;close&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The mailing address is: &lt;br /&gt;
&lt;br /&gt;
 The Maceys&lt;br /&gt;
 2580 California Park Dr #223&lt;br /&gt;
 Chico, CA 95928-4213&lt;br /&gt;
&lt;br /&gt;
WiFi quick connect:&lt;br /&gt;
&lt;br /&gt;
[[File:Macey WiFi-1024.jpeg | 150px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gym code: 25-80-17 (enter)&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
==[[Chico Apartment|Chico Apartment Details]]==&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
&lt;br /&gt;
==[[The Weekly Task List|What Lynn should be working on by day]]==&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
&lt;br /&gt;
= The House =&lt;br /&gt;
Josh and Anna&#039;s house is on the north end of town, here:&lt;br /&gt;
&lt;br /&gt;
{{#display_map:3163 Burnt Ranch Way, chico, CA&lt;br /&gt;
||width=450|height=500|zoom=100| layers=OpenStreetMap&lt;br /&gt;
}}&lt;br /&gt;
Note that the marker is just &amp;quot;close&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The mailing address is:&lt;br /&gt;
&lt;br /&gt;
 Josh &amp;amp; Anna Macey&lt;br /&gt;
 3163 Sawyers Bar Ln&lt;br /&gt;
 Chico, CA 95973&lt;br /&gt;
&lt;br /&gt;
[[Chico House|Chico House Details]]&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
	<entry>
		<id>https://wiki.maceys.net/index.php?title=Living_in_Chico&amp;diff=1501</id>
		<title>Living in Chico</title>
		<link rel="alternate" type="text/html" href="https://wiki.maceys.net/index.php?title=Living_in_Chico&amp;diff=1501"/>
		<updated>2026-08-17T00:15:55Z</updated>

		<summary type="html">&lt;p&gt;Lynn: /* The Apartment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{PAGEBANNER:City-of-chico-banner.jpg}}&lt;br /&gt;
=Chico Writeup Related to Retirees=&lt;br /&gt;
[https://familydestinationsguide.com/town-california-affordable-retirees/ Chico Writeup Related to Retirees]&lt;br /&gt;
&lt;br /&gt;
= The Apartment =&lt;br /&gt;
{|&lt;br /&gt;
The apartment is located on the east side of town, approximately here:&lt;br /&gt;
{{#display_map:39.75224,-121.79213&lt;br /&gt;
||width=450|height=500|zoom=100|layers=OpenStreetMap&lt;br /&gt;
}} ||&lt;br /&gt;
|| [[File:Condo beach.jpg]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Note that the marker is just &amp;quot;close&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The mailing address is: &lt;br /&gt;
&lt;br /&gt;
 The Maceys&lt;br /&gt;
 2580 California Park Dr #223&lt;br /&gt;
 Chico, CA 95928-4213&lt;br /&gt;
&lt;br /&gt;
WiFi quick connect:&lt;br /&gt;
&lt;br /&gt;
[[File:Macey WiFi-1024.jpeg | 150px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Gym code: 25-80-17 (enter)&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
==[[Chico Apartment|Chico Apartment Details]]==&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
&lt;br /&gt;
==[[The Weekly Task List|What Lynn should be working on by day]]==&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;br /&gt;
&lt;br /&gt;
= The House =&lt;br /&gt;
Josh and Anna&#039;s house is on the north end of town, here:&lt;br /&gt;
&lt;br /&gt;
{{#display_map:3163 Burnt Ranch Way, chico, CA&lt;br /&gt;
||width=450|height=500|zoom=100| layers=OpenStreetMap&lt;br /&gt;
}}&lt;br /&gt;
Note that the marker is just &amp;quot;close&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The mailing address is:&lt;br /&gt;
&lt;br /&gt;
 Josh &amp;amp; Anna Macey&lt;br /&gt;
 3163 Sawyers Bar Ln&lt;br /&gt;
 Chico, CA 95973&lt;br /&gt;
&lt;br /&gt;
[[Chico House|Chico House Details]]&lt;br /&gt;
&lt;br /&gt;
Return to: {{Highlight|[[Main Page]]}}&lt;/div&gt;</summary>
		<author><name>Lynn</name></author>
	</entry>
</feed>