Wikipedia testwiki https://test.wikipedia.org/wiki/Main_Page MediaWiki 1.47.0-wmf.7 first-letter Media Special Talk User User talk Wikipedia Wikipedia talk File File talk MediaWiki MediaWiki talk Template Template talk Help Help talk Category Category talk Thread Thread talk Summary Summary talk Test namespace 1 Test namespace 1 talk Test namespace 2 Test namespace 2 talk Draft Draft talk Campaign Campaign talk TimedText TimedText talk Module Module talk SecurePoll SecurePoll talk CNBanner CNBanner talk Translations Translations talk Event Event talk Topic Newsletter Newsletter talk Ikipedia:Illage Ump 0 2826 747666 735778 2026-06-20T13:20:15Z User97104 72884 User97104 moved page [[Wikipedia:Village Pump]] to [[Ikipedia:Illage Ump]]: Test: H 735778 wikitext text/x-wiki == Test section == Test content, will revert to redirect to [[Wikipedia:Village pump]]. [[User:Samwalton9 (WMF)|Samwalton9 (WMF)]] ([[User talk:Samwalton9 (WMF)|talk]]) 13:06, 27 March 2026 (UTC) :Test message. [[User:Samwalton9 (WMF)|Samwalton9 (WMF)]] ([[User talk:Samwalton9 (WMF)|talk]]) 13:28, 27 March 2026 (UTC) ::Hi. [[Special:Contributions/&#126;2026-19047-84|&#126;2026-19047-84]] ([[User talk:&#126;2026-19047-84|talk]]) 13:29, 27 March 2026 (UTC) == [[Markup|markup]] section == What about another with the same title? [[User:Samwalton9 (WMF)|Samwalton9 (WMF)]] ([[User talk:Samwalton9 (WMF)|talk]]) 13:29, 27 March 2026 (UTC) :Hi, [[User:Samwalton9|Samwalton9]] ([[User talk:Samwalton9|talk]]) 13:29, 27 March 2026 (UTC) ::Test [[User:Samwalton9 (WMF)|Samwalton9 (WMF)]] ([[User talk:Samwalton9 (WMF)|talk]]) 14:32, 31 March 2026 (UTC) == "Test" section == Test. [[User:Samwalton9 (WMF)|Samwalton9 (WMF)]] ([[User talk:Samwalton9 (WMF)|talk]]) 13:37, 27 March 2026 (UTC) :A [[User:Samwalton9|Samwalton9]] ([[User talk:Samwalton9|talk]]) 13:37, 27 March 2026 (UTC) ::test [[User:Samwalton9 (WMF)|Samwalton9 (WMF)]] ([[User talk:Samwalton9 (WMF)|talk]]) 14:32, 31 March 2026 (UTC) :::test [[User:Samwalton9 (WMF)|Samwalton9 (WMF)]] ([[User talk:Samwalton9 (WMF)|talk]]) 14:32, 31 March 2026 (UTC) rmz70upckkzu57w6c6efvo0ob15m0yt News 0 92775 747688 576256 2026-06-20T14:47:33Z 97104-Test 74540 Blanked the page 747688 wikitext text/x-wiki phoiac9h4m842xq45sp7s6u21eteeq1 747689 747688 2026-06-20T14:47:36Z AutoModeratorTest 61468 Reverted edit by [[Special:Contributions/97104-Test|97104-Test]] ([[User talk:97104-Test|talk]]) to last revision by [[User:TSevener (WMF)|TSevener (WMF)]] 576256 wikitext text/x-wiki {{Short description|Disused railway locomotive depot in the West Midlands, England}} {{Use British English|date=January 2017}} {{Use dmy dates|date=January 2017}} {{Infobox Railway Depot | name = Saltley TMD | image = Saltley Depot (geograph 2326121).jpg | image_size = | caption = [[British Rail Class 31|Class 31]] and [[British Rail Class 47|Class 47]] locomotives at Saltley Depot in 1991 | location = [[Saltley]], [[Birmingham]] | coordinates = {{coord|52.4862|-1.8655|type:landmark_region:GB_scale:2000_source:Google|display=inline,title}} | grid_ref_UK = SP092875 | owner = [[British Rail]] | depotcode = SY (1973 - 2005)<ref name="TRC">{{cite web|url=http://www.therailwaycentre.com/Resource_data/AllTimeShedCodes.pdf|title=The all-time guide to UK Shed and Depot Codes|date=5 May 2006|work=TheRailwayCentre.com|access-date=19 August 2016|url-status=usurped|archive-url=https://web.archive.org/web/20131217221651/http://www.therailwaycentre.com/Resource_data/AllTimeShedCodes.pdf|archive-date=17 December 2013}}</ref> | type = [[Diesel Locomotive|Diesel]] | opened = 1868<ref name=STMDhistory>{{cite web|url=http://www.disused-stations.org.uk/features/saltley_loco_shed/index.shtml|title=Disused Stations: Saltley Locomotive Shed|work=Disused Stations|access-date=8 January 2017}}</ref> | closed = 2005 | former_depot_codes = {{ubl|21A (1948 - 31 August 1963)|2E (1 September 1963 - 5 May 1973)}} }} '''Saltley TMD''' was a [[traction maintenance depot]] located in [[Saltley]], [[Birmingham]], England. The depot was situated on the east side of the line between [[Birmingham New Street railway station|Birmingham New Street]] and [[Water Orton railway station|Water Orton]], and was near [[Saltley railway station|Saltley station]] until the station closed in 1968. The depot code was SY.<ref>{{harvnb|Webster|Greengrass|Greaves|1987|p=69}}</ref> == History == The steam loco shed closed to steam 6 March 1967, but a locomotive inspection point was built along with a few offices. From 1948 to 2008, [[British Rail Class 08|Class 08 shunters]], [[British Rail Class 11|Class 11]], [[British Rail Class 25|25]], [[British Rail Class 27|27]], [[British Rail Class 30|30]], [[British Rail Class 37|37]], [[British Rail Class 44|44]], [[British Rail Class 45|45]], [[British Rail Class 47|47]],<ref name=STMDallocation1>{{cite web|url=http://www.brdatabase.info/sites.php?page=depots&subpage=locos&id=463|title=Locomotive Depots: Saltley (Allocation)|work=BRDatabase|access-date=8 January 2017}}</ref> [[British Rail Class 20|20]], [[British Rail Class 31|31]], [[British Rail Class 40|40]], [[British Rail Class 50|50]] and [[British Rail Class 56|56]] could be seen at the depot.The loco inspection point was open until 2005 and the locomotives moved to other depots, with the last one leaving in 2008. == Present == The offices are still open and are a signing on point for DB Schenker drivers but the depot is derelict and there are no trains present. == References == {{commonscat|Saltley engine shed|Saltley TMD}} {{Reflist}} ===Sources=== *{{cite book|title=British Rail Depot Directory|year=1987|first1=Neil|last1=Webster|first2=Robert|last2=Greengrass|first3=Simon|last3=Greaves|publisher=Metro Enterprises Ltd.|isbn=9780947773076|oclc=20420397}} [[Category: Railway depots in England]] s1l97xefhg6921te9ejv1pfjwt6o19v Template:K12 10 98212 747684 728170 2026-06-20T14:08:19Z 97104-Test 74540 Replaced content with "Olleh, e" 747684 wikitext text/x-wiki Olleh, e hzs8zrk3x4l3227ll5tyas25dpb7g98 Flagtest 0 100343 747680 358748 2026-06-20T14:02:00Z User97104 72884 747680 wikitext text/x-wiki {{flag|United States}} k1y2xxzted6lwryjl6y1yj5oqpp19yo User:Petrb/huggle.yaml.js 2 105264 747803 738835 2026-06-21T10:12:23Z Petrb 15387 Updating the user configuration page... HG (3.4.14) 747803 javascript text/javascript --- # // This is a configuration of huggle, do not change it unless you know what you are doing. enable: true # // Last version of huggle that wrote into this configuration file (sanity check) version: "3.4.14 build: 4373 3.4.14-57-ge3abc7b1" report-summary: "" confirm-multiple: false confirm-talk: true confirm-self-revert: true confirm-whitelist: true # // This option will change the behaviour of automatic resolution, be careful revert-on-multiple-edits: true automatically-resolve-conflicts: true software-rollback: false enforce-months-as-headers: true history-load: true on-next: 1 delete-edits-after-revert: true skip-to-last-edit: false preferred-provider: 2 remove-oldest-queue-edits: false truncate-edits: false talkpage-freshness: 20 remove-after-trusted-edit: true # // Get original creator of every page so that you can G7 instead of reverting the page retrieve-founder: false display-title: false # // Periodically check if you received new messages and display a notification box if you get them check-tp: true manual-warning: false summary-mode: false automatic-reports: false # // HAN han-html: false han-display-user-talk: true han-display-bots: false han-display-user: true watchlist: "preferences" # // Whether edits made by same user should be grouped up together in page automatically-group: false queue-id: "default" # // Location of page (wiki page name, for example WP:Huggle) that should be displayed when you hit next and queue is empty. Leave empty for default page. page-empty-queue: "" enable-max-score: false max-score: 0 enable-min-score: false min-score: 0 automatic-refresh: true automatically-watchlist-warned-users: false shortcut-hash: "1fe2e71390a4fb66ccfaf61a290f39d0" show-warning-if-not-on-last-revision: true number-dropdown-menu-items: true insert-edits-of-rolled-user-to-queue: true # // If true you will not warn users who received a warning recently confirm-on-recent-warning: false # // If warning was sent less than N seconds ago it's considered too recent recent-warning-time-span: 120 confirm-warning-on-very-old-edits: false # // If true, the options above will not generate confirmation, but instead will be silently accepted (warning will not be sent) skip-warning-on-confirm: false queues: "User defined queue #9": filter-ignored: "exclude" filter-bots: "exclude" filter-assisted: "exclude" filter-ip: "ignore" filter-minor: "ignore" filter-new-pages: "ignore" filter-me: "exclude" nsfilter-user: "ignore" filter-talk: "exclude" filter-watched: "ignore" filter-reverts: "ignore" ignored-tags: "" required-tags: "" ignored-categories: "" required-categories: "" 4fehk6bqgkamotn0us302fqtd6wssp1 747804 747803 2026-06-21T10:12:53Z Petrb 15387 Updating the user configuration page... HG (3.4.14) 747804 javascript text/javascript --- # // This is a configuration of huggle, do not change it unless you know what you are doing. enable: true # // Last version of huggle that wrote into this configuration file (sanity check) version: "3.4.14 build: 4321 4cd5e2c8" report-summary: "" confirm-multiple: false confirm-talk: true confirm-self-revert: true confirm-whitelist: true # // This option will change the behaviour of automatic resolution, be careful revert-on-multiple-edits: true automatically-resolve-conflicts: true software-rollback: false enforce-months-as-headers: true history-load: true on-next: 1 delete-edits-after-revert: true skip-to-last-edit: false preferred-provider: 2 remove-oldest-queue-edits: false truncate-edits: false talkpage-freshness: 20 remove-after-trusted-edit: true # // Get original creator of every page so that you can G7 instead of reverting the page retrieve-founder: false display-title: false # // Periodically check if you received new messages and display a notification box if you get them check-tp: true manual-warning: false summary-mode: false automatic-reports: false # // HAN han-html: false han-display-user-talk: true han-display-bots: false han-display-user: true watchlist: "preferences" # // Whether edits made by same user should be grouped up together in page automatically-group: false queue-id: "default" # // Location of page (wiki page name, for example WP:Huggle) that should be displayed when you hit next and queue is empty. Leave empty for default page. page-empty-queue: "" enable-max-score: false max-score: 0 enable-min-score: false min-score: 0 automatic-refresh: true automatically-watchlist-warned-users: false shortcut-hash: "1fe2e71390a4fb66ccfaf61a290f39d0" show-warning-if-not-on-last-revision: true number-dropdown-menu-items: true insert-edits-of-rolled-user-to-queue: true # // If true you will not warn users who received a warning recently confirm-on-recent-warning: false # // If warning was sent less than N seconds ago it's considered too recent recent-warning-time-span: 120 confirm-warning-on-very-old-edits: false # // If true, the options above will not generate confirmation, but instead will be silently accepted (warning will not be sent) skip-warning-on-confirm: false queues: "User defined queue #9": filter-ignored: "exclude" filter-bots: "exclude" filter-assisted: "exclude" filter-ip: "ignore" filter-minor: "ignore" filter-new-pages: "ignore" filter-me: "exclude" nsfilter-user: "ignore" filter-talk: "exclude" filter-watched: "ignore" filter-reverts: "ignore" ignored-tags: "" required-tags: "" ignored-categories: "" required-categories: "" 0sjyny19ji8o8m38utd90gvjtembmw2 747805 747804 2026-06-21T10:34:08Z Petrb 15387 Updating the user configuration page... HG (3.4.14) 747805 javascript text/javascript --- # // This is a configuration of huggle, do not change it unless you know what you are doing. enable: true # // Last version of huggle that wrote into this configuration file (sanity check) version: "3.4.14 build: 4373 3.4.14-57-ge3abc7b1" report-summary: "" confirm-multiple: false confirm-talk: true confirm-self-revert: true confirm-whitelist: true # // This option will change the behaviour of automatic resolution, be careful revert-on-multiple-edits: true automatically-resolve-conflicts: true software-rollback: false enforce-months-as-headers: true history-load: true on-next: 1 delete-edits-after-revert: true skip-to-last-edit: false preferred-provider: 2 remove-oldest-queue-edits: false truncate-edits: false talkpage-freshness: 20 remove-after-trusted-edit: true # // Get original creator of every page so that you can G7 instead of reverting the page retrieve-founder: false display-title: false # // Periodically check if you received new messages and display a notification box if you get them check-tp: true manual-warning: false summary-mode: false automatic-reports: false # // HAN han-html: false han-display-user-talk: true han-display-bots: false han-display-user: true watchlist: "preferences" # // Whether edits made by same user should be grouped up together in page automatically-group: false queue-id: "default" # // Location of page (wiki page name, for example WP:Huggle) that should be displayed when you hit next and queue is empty. Leave empty for default page. page-empty-queue: "" enable-max-score: false max-score: 0 enable-min-score: false min-score: 0 automatic-refresh: true automatically-watchlist-warned-users: false shortcut-hash: "1fe2e71390a4fb66ccfaf61a290f39d0" show-warning-if-not-on-last-revision: true number-dropdown-menu-items: true insert-edits-of-rolled-user-to-queue: true # // If true you will not warn users who received a warning recently confirm-on-recent-warning: false # // If warning was sent less than N seconds ago it's considered too recent recent-warning-time-span: 120 confirm-warning-on-very-old-edits: false # // If true, the options above will not generate confirmation, but instead will be silently accepted (warning will not be sent) skip-warning-on-confirm: false queues: "User defined queue #9": filter-ignored: "exclude" filter-bots: "exclude" filter-assisted: "exclude" filter-ip: "ignore" filter-minor: "ignore" filter-new-pages: "ignore" filter-me: "exclude" nsfilter-user: "ignore" filter-talk: "exclude" filter-watched: "ignore" filter-reverts: "ignore" ignored-tags: "" required-tags: "" ignored-categories: "" required-categories: "" 4fehk6bqgkamotn0us302fqtd6wssp1 Wikipedia:Sandbox 4 107092 747754 747653 2026-06-20T21:00:50Z Cewbot 33876 Clear the sandbox. If you want to keep it longer, please test it in [[Special:MyPage/Sandbox|personal sandbox]], you can also check the revision history of the sandbox. 747754 wikitext text/x-wiki <noinclude>{{Sandbox}}</noinclude> == Please start your testing below this line == 9v37rcaxoiwjar8n3q9n7dcsjdvcyin Neon 0 119403 747794 470368 2026-06-20T22:34:44Z 97104-Test 74540 747794 wikitext text/x-wiki ''Neon'' is a chemical element with symbol Ne and atomic number Ne in period 2. It appears as a colorless gas exhibiting an orange-red glow when placed in a high voltage electric field. It is a Gas ==Chemical properties== Neon has an atomic mass of 20.17976, a boiling point of 27.104, a density of 0.9002, a melting point of 24.56, a molar heat of None, an electron configuration of lorem, and an electron affinity of ipsum. [[Category:Chemical elements]] 95b6f4mfwh84tu6hcuqkmq0gk8vu12j Ununennium 0 119510 747691 620588 2026-06-20T14:48:40Z 97104-Test 74540 747691 wikitext text/x-wiki ''Ununennium'' is a [[chemical element]] with symbol Uue and atomic number Uue in period 8. It appears as a None. It is a Solid ==Chemical properties== Ununennium has an atomic mass of 315, a boiling point of 630, a density of 3, a melting of elelelelelelelium, a molar heat of None, an electron configuration of 1s2 2s2 2p6 3s2 3p6 3d10 4s2 4p6 4d10 4f14 5s2 5p6 5d10 5f14 6s2 6p6 6d10 7s2 7p6 8s1, and an electron affinity of 63.87. [[Category:Chemical elements]] t9x5rqk3zq386zigqeju64bo1n60go5 747793 747691 2026-06-20T22:33:53Z 97104-Test 74540 Undid revision [[Special:Diff/747691|747691]] by [[Special:Contributions/97104-Test|97104-Test]] ([[User talk:97104-Test|talk]]) 747793 wikitext text/x-wiki ''Ununennium'' is a [[chemical element]] with symbol Uue and atomic number Uue in period 8. It appears as a None. It is a Solid ==Chemical properties== Ununennium has an atomic mass of 315, a boiling point of 630, a density of 3, a melting point of None, a molar heat of None, an electron configuration of 1s2 2s2 2p6 3s2 3p6 3d10 4s2 4p6 4d10 4f14 5s2 5p6 5d10 5f14 6s2 6p6 6d10 7s2 7p6 8s1, and an electron affinity of 63.87. [[Category:Chemical elements]] fhd4wqdyme03ubzleu05l0ltskc4fr1 Wikipedia:Village pump/topic list 4 146208 747798 747294 2026-06-20T23:53:02Z Cewbot 33876 [[User:Cewbot/log/20170915/configuration|Generate topic list: 9 topics]] 747798 wikitext text/x-wiki <!-- This page is auto-generated by bot. Please contact the bot operator to improve the tool. --> {| class="wikitable sortable mw-collapsible" style="float:left;" |- ! data-sort-type="number" style="font-weight: normal;" | <small>#</small> !! 💭 Title !! <span title="Count of comments">💬</span> !! <span title="Count of peoples in discussion">👥</span> !! 🙋 Last editor !! data-sort-type="isoDate" | <span title="Date/Time">🕒 <small>(UTC)</small></span> |- | style="text-align: right;" | 1 | [[Wikipedia:Village pump#Script|Script]] | style="text-align: right;" | 8 | style="text-align: right;" | 5 | style="background-color: #bbb;" | [[User:LuniZunie|LuniZunie]] | style="background-color: #bbb;" data-sort-type="isoDate" data-sort-value="2025-11-09T16:47:00.000Z" | 2025-11-09 <span style="color: blue;">16:47</span> |- | style="text-align: right;" | 2 | [[Wikipedia:Village pump#Report_concerning_Tanbiruzzammn|Report concerning Tanbiruzzammn]] | style="text-align: right;" | 2 | style="text-align: right;" | 2 | style="background-color: #bbb;" | [[User:Barras|Barras]] | style="background-color: #bbb;" data-sort-type="isoDate" data-sort-value="2025-12-09T21:45:00.000Z" | 2025-12-09 <span style="color: blue;">21:45</span> |- | style="text-align: right;" | 3 | [[Wikipedia:Village pump#Report_concerning_Bucheon|Report concerning Bucheon]] | style="text-align: right;background-color: #fcc;" | 1 | style="text-align: right;background-color: #fcc;" | 1 | style="background-color: #bbb;" | [[User:PieWriter|PieWriter]] | style="background-color: #bbb;" data-sort-type="isoDate" data-sort-value="2026-02-19T10:25:00.000Z" | 2026-02-19 <span style="color: blue;">10:25</span> |- | style="text-align: right;" | 4 | [[Wikipedia:Village pump#Versions_and_dates|Versions and dates]] | style="text-align: right;" | 2 | style="text-align: right;background-color: #fcc;" | 1 | style="background-color: #bbb;" | [[Special:Contributions/~2026-13668-13|<span style="color: #c20;">~2026-13668-13</span>]] | style="background-color: #bbb;" data-sort-type="isoDate" data-sort-value="2026-03-03T06:17:00.000Z" | 2026-03-03 <span style="color: blue;">06:17</span> |- | style="text-align: right;" | 5 | style="max-width: 24em" | <small>[[Wikipedia:Village pump#Upcoming_Wikimedia_Café_meetup_regarding_the_the_2026-2027_Wikimedia_Foundation_Annual_Plan|Upcoming Wikimedia Café meetup regarding the the 2026-2027 Wikimedia Foundation Annual Plan]]</small> | style="text-align: right;background-color: #fcc;" | 1 | style="text-align: right;background-color: #fcc;" | 1 | style="background-color: #bbb;" | [[User:Pine|Pine]] | style="background-color: #bbb;" data-sort-type="isoDate" data-sort-value="2026-03-30T03:46:00.000Z" | 2026-03-30 <span style="color: blue;">03:46</span> |- | style="text-align: right;" | 6 | [[Wikipedia:Village pump#Changes_to_electionadmin_userright|Changes to electionadmin userright]] | style="text-align: right;" | 4 | style="text-align: right;" | 4 | style="background-color: #bbb;" | [[User:Chaotic Enby|Chaotic Enby]] | style="background-color: #bbb;" data-sort-type="isoDate" data-sort-value="2026-04-23T15:22:00.000Z" | 2026-04-23 <span style="color: blue;">15:22</span> |- | style="text-align: right;" | 7 | style="max-width: 24em" | <small>[[Wikipedia:Village pump#Report_concerning_Princebarackalibarrydaddyobamaiii|Report concerning Princebarackalibarrydaddyobamaiii]]</small> | style="text-align: right;background-color: #fcc;" | 1 | style="text-align: right;background-color: #fcc;" | 1 | style="background-color: #bbb;" | [[User:MathXplore|MathXplore]] | style="background-color: #bbb;" data-sort-type="isoDate" data-sort-value="2026-05-18T12:23:00.000Z" | 2026-05-18 <span style="color: blue;">12:23</span> |- | style="text-align: right;" | 8 | style="max-width: 24em" | <small>[[Wikipedia:Village pump#May_2026_Wikimedia_Café_meetups_regarding_the_Wikimedia_Foundation_Annual_Plan|May 2026 Wikimedia Café meetups regarding the Wikimedia Foundation Annual Plan]]</small> | style="text-align: right;background-color: #fcc;" | 1 | style="text-align: right;background-color: #fcc;" | 1 | style="background-color: #bbb;" | [[User:Pine|Pine]] | style="background-color: #bbb;" data-sort-type="isoDate" data-sort-value="2026-05-21T19:54:00.000Z" | 2026-05-21 <span style="color: blue;">19:54</span> |- | style="text-align: right;" | 9 | style="max-width: 24em" | <small>[[Wikipedia:Village pump#June_2026_Wikimedia_Café_meetups_regarding_the_English_Wikipedia_Editor_Reflections_project|June 2026 Wikimedia Café meetups regarding the English Wikipedia Editor Reflections project]]</small> | style="text-align: right;background-color: #fcc;" | 1 | style="text-align: right;background-color: #fcc;" | 1 | [[User:Pine|Pine]] | data-sort-type="isoDate" data-sort-value="2026-06-15T03:56:00.000Z" | 2026-06-15 <span style="color: blue;">03:56</span> |} {| class="wikitable mw-collapsible mw-collapsed" style="float: left; margin-left: .5em;;{{#if:{{{no_time_legend|}}}|display:none;|}}" ! title="From the latest bot edit" | Legend |- | style="background-color: #efe;" | * In the last hour |- | style="background-color: #eef;" | * In the last day |- | | * In the last week |- | style="background-color: #ddd;" | * In the last month |- | style="background-color: #bbb;" | * More than one month |- ! Manual settings |- | style="max-width: 12em;" | <small>When exceptions occur,<br />please check [[User:Cewbot/log/20170915/configuration|the setting]] first.</small> |- |} {{Clear}} j0c8kuhh0899npdrfqlyi30dgw1u9kh Talk:UInt8.max 1 164563 747795 647301 2026-06-20T22:39:21Z 97104-Test 74540 747795 wikitext text/x-wiki {{UCVBVT}} {{UCVBVT}} {{UCVBVT}} {{UCVBVT}} {{UCVCL}} {{UCVBVT}} {{UCVBVT}} {{UCVBVT}} {{GA nominee|10:57, 26 February 2025 (UTC)|nominator=[[User:Hide on Rosé|Hide on Rosé]] ([[User talk:Hide on Rosé|talk]])|page=1|subtopic=Agriculture, food and drink|status=|note=|shortdesc=<strong class="error"><span class="scribunto-error mw-scribunto-error-ec2b1255">Script error: No such module &quot;GetShortDescription&quot;.</span></strong>}} {{GA nominee|10:48, 26 February 2025 (UTC)|nominator=[[User:Hide on Rosé|Hide on Rosé]] ([[User talk:Hide on Rosé|talk]])|page=1|subtopic=Art and architecture|status=|note=|shortdesc=<strong class="error"><span class="scribunto-error mw-scribunto-error-ec2b1255">Script error: No such module &quot;GetShortDescription&quot;.</span></strong>}} {{GA}} t52stawph7j8oyudbimqlq6wvsfaamr 747796 747795 2026-06-20T22:40:00Z 97104-Test 74540 747796 wikitext text/x-wiki {{UCVBVT}} {{UCVBVT}} {{UCVBVT}} {{UCVBVT}} {{UCVCL}} {{UCVBVT}} {{UCVBVT}} {{UCVBVT}} {{GA nominee|10:57, 26 February 2025 (UTC)|nominator=[[User:Hide on Rosé|Hide on Rosé]] ([[User talk:Hide on Rosé|talk]])|page=1|subtopic=Agriculture, food and drink|status=|note=|shortdesc=<strong class="error"><span class="scribunto-error mw-scribunto-error-ec2b1255">Script error: No such module &quot;GetShortDescription&quot;.</span></strong>}} {{GA nominee|10:48, 26 February 2025 (UTC)|nominator=[[User:Hide on Rosé|Hide on Rosé]] ([[User talk:Hide on Rosé|talk]])|page=1|subtopic=Art and architecture|status=|note=|shortdesc=<strong class="error"><span class="scribunto-error mw-scribunto-error-ec2b1255">Script error: No such module &quot;GetShortDescription&quot;.</span></strong>}} {{GA}} {{FA}} {{FAC}} {{FARC}} j6ywov44ebv3dmgg6yu7kvotg0ark3u GBU-57A/B MOP 0 166779 747800 721400 2026-06-21T00:06:53Z InternetArchiveBot 34092 Rescuing 2 sources and tagging 0 as dead.) #IABot (v2.0.9.5 747800 wikitext text/x-wiki {{Short description|American GPS-guided "bunker buster" bomb}} {{Use American English|date=November 2013}} {{Use dmy dates|date=June 2025}} {{Infobox weapon | name = GBU-57A/B Massive Ordnance Penetrator | image = USAF MOP test release crop.jpg | caption = GBU-57 MOP prototype | origin = United States | type = [[Bunker buster]] <!-- Type selection -->| is_ranged = | is_bladed = | is_explosive = yes | is_artillery = | is_vehicle = | is_missile = | is_UK = <!-- Service history --> | service = 2011–present<ref name="Capaccio 2013">{{Cite news |last=Capaccio |first=Tony |date=15 January 2013 |title=Boeing's 30,000-pound bunker-buster bomb improved, Pentagon says |url=https://www.seattletimes.com/business/boeingrsquos-30000-pound-bunker-buster-bomb-improved-pentagon-says/ |access-date=22 June 2025 |work=Seattle Times |location=Seattle, Washington}}</ref> | used_by = [[United States Air Force]] | wars = [[Iran–Israel war]] <!-- Production history -->| designer = | design_date = | manufacturer = [[Boeing]]<ref name="Entous & Barnes 2012" /> | unit_cost = | production_date = | number = at least 20<ref name="Scully 2025">{{Cite news |last=Scully |first=Rachel |date=17 June 2025 |title=What is a 'bunker buster' bomb? |url=https://www.thehill.com/policy/defense/5355443-trump-decision-bunker-busters-iran/ |access-date=22 June 2025 |work=[[The Hill (newspaper)|The Hill]] |quote=As of 2015, Boeing had delivered at least 20 of the bombs. While the exact size of the MOP stockpile is not known, it's understood to be relatively small. |archive-date=28 June 2025 |archive-url=https://web.archive.org/web/20250628025209/https://thehill.com/policy/defense/5355443-trump-decision-bunker-busters-iran/ |url-status=dead }}</ref> | variants = <!-- General | Munitions dropped = specifications --> | spec_label = | weight = {{cvt|27125|lb}}<ref name="Parken 2023" /> | length = {{cvt|20.5|ft|m}}<ref name="DTRA 2007">{{Cite web |last=<!--not stated--> |date=July 2007 |title=DTRA Fact Sheets |url=http://www.dtra.mil/newsservices/fact_sheets/display.cfm?fs=mop |archive-url=https://web.archive.org/web/20090223084920/http://www.dtra.mil/newsservices/fact_sheets/display.cfm?fs=mop |archive-date=23 February 2009 |access-date=17 June 2025 |publisher=[[Defense Threat Reduction Agency]] |location=Fort Belvoir, Virginia}}</ref> | width = | height = | diameter = {{cvt|31.5|in|m|2}}<ref name="DTRA 2007"/> | crew = | passengers = <!-- Ranged weapon specifications --> | cartridge = | cartridge_weight = | caliber = | barrels = | action = | rate = | velocity = | range = | max_range = | feed = | sights = <!-- Artillery specifications --> | breech = | recoil = | carriage = | elevation = | traverse = <!-- Bladed weapon specifications --> | blade_type = | hilt_type = | sheath_type = | head_type = | haft_type = <!-- Explosive specifications --> | filling = AFX-757/PBXN-114 | filling_weight = {{cvt|4590|/|752|lb}}<ref name="Parken 2023">{{Cite news |title=Our Best Look Yet At The Massive Ordnance Penetrator Bunker Buster Bomb |url=https://www.twz.com/our-best-look-yet-at-the-massive-ordnance-penetrator-bunker-buster-bomb | work=[[Popular Science]] |last=Parken |first=Oliver |date=3 May 2023 }}</ref> | detonation = | yield = <!-- Vehicle/missile specifications --> | armour = | primary_armament = | secondary_armament = | engine = | engine_power = | pw_ratio = | transmission = | payload_capacity = | suspension = | clearance = | fuel_capacity = | vehicle_range = | speed = | guidance = | steering = <!-- Missiles only --> | wingspan = | propellant = | ceiling = | altitude = | depth = | boost = | accuracy = | launch_platform = | transport = }} The '''GBU-57 series MOP''' ('''Massive Ordnance Penetrator''') is a {{convert|30000|lb|kg|adj=on}} class, {{convert|20.5|ft|4=-long|adj=mid}} [[precision-guided munition]] "[[bunker buster]]" bomb developed by [[Boeing]] for the [[United States Air Force]] (USAF).<ref name="Parken 2023" /> Composed of a BLU-127 bomb body and an integrated [[GPS/INS]] guidance package, there are seven GBU-57 variants.<ref name="Parken 2023" /> Due to its size and weight, the GBU-57 MOP can only be carried by the [[Northrop B-2 Spirit]] [[strategic bomber]],<ref name="end">{{Cite news |last=Dolzikova |first=Darya |last2=Savill |first2=Matthew |date=1 October 2024 |title=Iran vs. Israel redux: The enormous difficulties and ramifications if Israel attacks Iran's nuclear sites |url=https://thebulletin.org/2024/10/iran-vs-israel-redux-the-enormous-difficulties-and-ramifications-if-israel-attacks-irans-nuclear-sites/ |work=[[Bulletin of the Atomic Scientists]]}}</ref><ref name="cnn_mop">{{Cite news |last=Britzky |first=Haley |last2=Robinson |first2=Lou |date=18 June 2025 |title=Israel has pushed the US to use its 'bunker buster' bomb on Iran. Here's what the weapon can do |url=https://edition.cnn.com/2025/06/18/politics/bunker-buster-weapon-explained-dg |access-date=22 June 2025 |work=[[CNN]]}}</ref> although initial tests were conducted with the [[Boeing B-52 Stratofortress]].<ref name="NDTV2025" /><ref name="ASFM2025" /> The first combat use of the GBU-57 MOP came on 22 June 2025, when seven Northrop B-2 Spirit stealth bombers [[Operation Midnight Hammer|dropped]] a total of fourteen GBU-57 bombs on Iran's [[Fordow Uranium Enrichment Plant]] and [[Natanz Nuclear Facility]]. The bomb is much larger than earlier USAF [[bunker buster]]s such as the {{convert|5000|lb|kg|adj=on|-2}} [[GBU-28]] and [[GBU-37 GPS-Aided Munition|GBU-37]].<ref name="factsheet" /> ==Development and production== Bunker-busting bombs were used in the [[2003 invasion of Iraq]], but failed to penetrate deeply or achieve the desired destruction. This renewed interest in a larger bunker buster, so the [[Defense Threat Reduction Agency]] (DTRA) launched the MOP project.<ref name="factsheet">{{Cite web |date=18 November 2011 |title=Massive Ordnance Penetrator fact sheet |url=https://www.af.mil/About-Us/Fact-Sheets/Display/Article/104614/massive-ordnance-penetrator/ |access-date=22 June 2025 |website=Air Force |publisher=US Air Force}}</ref> In July 2004, USAF asked defense contractors how they might develop a 30,000-pound, precision-guided bomb that could destroy targets deep underground, in caves, or in hardened bunkers.<ref>{{Cite news | url=https://edition.cnn.com/2004/US/07/20/big.bomb/ | title='Bunker busters' may grow to 30,000 pounds | first= Barbara | last=Starr | work=[[CNN]] | date=July 20, 2004}}</ref> The USAF developed a concept for a collection of very large penetrator and blast weapons: the so-called "Big BLU" (Bomb Live Unit) collection, which includes the [[GBU-43/B MOAB]] (Massive Ordnance Air Blast) and the GBU-57 MOP. The MOP was developed by the [[Air Force Research Laboratory]] Munitions Directorate at [[Eglin Air Force Base]], and designed by [[Boeing]] to be used with the [[Northrop B-2 Spirit|B-2 Spirit]]<ref name="2025-GS-MOP" /><ref>{{Cite web |date=18 January 2007 |title=Military & Aerospace Electronics, "Air Force ready to deploy 30,000-pound 'super bomb' on stealthy B-2 jet" |url=https://www.militaryaerospace.com/home/article/16724828/air-force-ready-to-deploy-30000-pound-super-bomb-on-stealthy-b-2-jet-bomber |access-date=22 June 2025}}</ref> and the [[Northrop Grumman B-21 Raider|B-21 Raider]].<ref>{{Cite web |last=Suciu |first=Peter |date=19 May 2021 |title=BANG: The B-21 Raider Is Just Short of Unstoppable |url=https://nationalinterest.org/blog/reboot/bang-b-21-raider-just-short-unstoppable-185558 |access-date=22 June 2025 |website=The National Interest}}</ref> In March 2007, the MOP was tested in a DTRA tunnel at the [[White Sands Missile Range]] in New Mexico. In July 2007, Northrop Grumman received a $2.5 million contract to refit the USAF's B-2s, enabling the aircraft to carry two 14-ton MOPs.<ref name=deagel>{{Cite news |last=<!--not stated--> |date=19 July 2007 |title=Northrop-Grumman to Equip B-2 Bomber with Massive Ordnance Penetrator |url=https://deagel.com/news/n000002435 |access-date=22 June 2025 |agency=Prime Newswire}}</ref> Beginning in 2008, the MOP was tested under various conditions, including on [[rocket sled]]s at [[Holloman High Speed Test Track]] and from [[Boeing B-52 Stratofortress|B-52]] and [[Northrop B-2 Spirit|B-2]] [[strategic bomber]] aircraft at White Sands.<ref name="NDTV2025">{{Cite news |last=<!--not stated--> |date=17 June 2025 |title=Israel Seeks US' Bunker Buster - 14,000 Kg Bomb, To Hit Iran's Nuclear Sites |url=https://www.ndtv.com/world-news/israel-seeks-us-bunker-buster-14-000-kg-bomb-to-hit-irans-nuclear-sites-8691511 |access-date=22 June 2025 |work=NDTV World Desk |publisher=[[NDTV|New Delhi Television Ltd]] |location=New Delhi}}</ref><ref name="ASFM2025">{{Cite magazine |last=<!--not stated--> |date=2025 |title=GBU-57 MOP |url=https://www.airandspaceforces.com/weapons-platforms/gbu-57-mop/ |access-date=22 June 2025 |magazine=Air & Space Forces Magazine |publisher=Air & Space Forces Association |location=Arlington, Virginia}}</ref> In October 2009, the Pentagon had obtained permission from Congress to shift funding to accelerate the project.<ref>{{Cite news |date=October 6, 2009 |title=Is the U.S. Preparing to Bomb Iran? |url=https://abcnews.go.com/Politics/us-preparing-bomb-iran/story?id=8765343 |work=[[ABC News (United States)|ABC News]]}}</ref><ref>{{Cite web |title=Reprogramming action – prior approval |url=https://abcnews.go.com/images/Politics/reprogramming_memo_091006.pdf |access-date=22 June 2025 |website=[[ABC News (United States)|ABC News]]}}</ref> Funding delays and test-schedule changes meant the bomb would not be deployable until December 2010, six months later than planned.<ref>{{Cite news |last=Wolf |first=Jim |date=18 December 2009 |title=Pentagon delays new "bunker buster" bomb |url=https://www.reuters.com/article/idUSTRE5BH5IQ20091218 |work=Reuters}}</ref> In February 2011, Boeing received a $15 million contract for modification and increased testing.<ref>{{Cite news | url=https://www.militaryaerospace.com/defense-executive/article/16717447/boeing-steps-up-testing-of-massive-ordnance-penetrator-mop-30000-pound-bunker-busting-super-bomb | title=Boeing steps-up testing of Massive Ordnance Penetrator (MOP) 30,000-pound bunker-busting super bomb | work=Military Aerospace | date=February 9, 2011}}</ref> In April 2011, the USAF ordered eight MOPs plus supporting equipment for $28 million.<ref>Reed, John. [https://web.archive.org/web/20110413164651/http://www.dodbuzz.com/2011/04/08/usaf-getting-more-penetrating-power/ "USAF Getting More Penetrating Power."] ''DoD Buzz'', 8 April 2011.</ref> The USAF began receiving the MOP in September 2011. In February 2012, Congress approved $81.6 million to further develop and improve the weapon.<ref name="Capaccio 2013"/> In March 2012, there was an "operational stockpile" at [[Whiteman Air Force Base]].<ref>Thompson, Mark. [https://nation.time.com/2012/03/09/key-point-bunker-busters-come-in-both-small-and-large-sizes/ "Key Point: Bunker-Busters Come In Both Small and Large Sizes"] {{Webarchive|url=https://web.archive.org/web/20250619163912/https://nation.time.com/2012/03/09/key-point-bunker-busters-come-in-both-small-and-large-sizes/ |date=19 June 2025 }}. ''Time''. 9 March 2012.</ref> In 2012, the Pentagon requested $82 million to develop greater penetration power for the existing weapon.<ref name="Entous & Barnes 2012">{{Cite news |last=Entous |first=Adam |last2=Barnes |first2=Julian E. |date=28 January 2012 |title=Pentagon Seeks Mightier Bomb vs. Iran |url=https://www.wsj.com/articles/SB10001424052970203363504577187420287098692 |access-date=22 June 2025 |publisher=[[The Wall Street Journal]]}}</ref> By early 2013, the MOP had been successfully integrated onto the B-2 Spirit.<ref name="Butler2013">{{Cite magazine |last=Butler |first=Amy |date=15 February 2013 |title=Northrop, USAF Explore Diverse B-2 Weapons Options |url=http://www.aviationweek.com/Article.aspx?id=/article-xml/asd_02_15_2013_p04-02-549066.xml |url-status=dead |archive-url=https://web.archive.org/web/20130510074705/http://www.aviationweek.com/Article.aspx?id=/article-xml/asd_02_15_2013_p04-02-549066.xml |archive-date=10 May 2013 |access-date=22 June 2025 |magazine=[[Aviation Week & Space Technology]]}}</ref> At least 20 of the bombs were built and delivered to the USAF by November 2015.<ref>{{Cite news |last=Uchimiya |first=Ellen |date=June 21, 2025 |title=What to know about the MOP and the B-2, the bunker-buster bomb and plane that could be used to strike Iran |url=https://www.cbsnews.com/news/massive-ordnance-penetrator-bomb-gbu-57-b-2-bomber-iran-fordo-nuclear-facility/ |work=[[CBS News]]}}</ref> In April 2019, Boeing received a $21 million contract modification for production of more bombs.<ref>{{Cite news | url=https://www.defenseindustrydaily.com/mopping-up-the-usas-30000-pound-bomb-03172/ | title=MOPping Up: The USA’s 30,000 Pound GBU-57 Bomb | work=Defense Industry Daily | date=April 16, 2019}}</ref> In October 2019, the USAF awarded $90 million in contracts for the production of an unspecified number of case assemblies for the BLU-127C/B warhead to be used in the bomb.<ref name=updates>{{Cite news |title=Air Force Updates Massive Ordnance Penetrator Bombs Amid New Iranian Nuclear Posturing |url=https://www.twz.com/30872/air-force-updates-massive-ordnance-penetrator-bombs-amid-new-iranian-nuclear-posturing | work=[[Popular Science]] |date=13 November 2019}}</ref> ==Key components== The GBU-57 uses a BLU-127 series bomb as the explosive component. The BLU-127 series bombs feature modular design that allows for incremental improvements and future upgrades.<ref name="Parken 2023" /><ref>{{Cite web |title=Boeing GBU-57/B MOP |url=https://www.designation-systems.net/dusrm/app5/mop.html |access-date=22 June 2025 |website=www.designation-systems.net}}</ref> One variant of the BLU-127 bomb body contains {{convert|4590|lb|0}} of AFX-757 and {{convert|752|lb|0}} of PBXN-114, a [[polymer-bonded explosive]] (PBX), for a total explosive payload of {{convert|5342|lb|0}}. The PBX is optimized for controlled detonation in confined spaces. The bomb's casing is made from high-density [[Eglin steel]] alloy, engineered to survive the extreme stresses of deep penetration before detonation.<ref name="Parken 2023"/><ref name="debuglies">{{Cite web |last=admin |date=7 February 2025 |title=The Evolution and Strategic Imperative of the GBU-57/B Massive Ordnance Penetrator in Modern Warfare |url=https://debuglies.com/2025/02/07/the-evolution-and-strategic-imperative-of-the-gbu-57-b-massive-ordnance-penetrator-in-modern-warfare/ |access-date=22 June 2025 |website=debuglies.com |language=it-IT}}</ref><ref>{{Cite web |date=28 December 2012 |title=Massive Ordnance Penetrator |url=https://www.dote.osd.mil/Portals/97/pub/reports/FY2012/af/2012mop.pdf |website=www.dote.osd.mil |publisher=Air Force Programs}}</ref> The GBU-57 is a [[precision-guided munition]] equipped with an integrated [[GPS/INS]] guidance package, and therefore does not require the addition of a [[Joint Direct Attack Munition]] guidance package. This integrated system enables the bomb to strike within meters of its intended target.<ref>{{Cite web |last=AirPra |date=30 September 2023 |title=Know The Best Of The GBU-57 Massive Ordnance Penetrator |url=https://airpra.com/know-the-best-of-the-gbu-57-massive-ordnance-penetrator/ |access-date=22 June 2025}}</ref> Detonation timing is managed by the Large Penetrator Smart Fuze (LPSF), which adjusts the moment of explosion based on impact depth and the characteristics of the underground structure.<ref name="debuglies" /> In flight, the bomb is stabilized by [[grid fin]]s, which help maintain trajectory and allow for mid-course adjustments.<ref name="globalsecurity">{{Cite web |title=GBU-57/B Massive Ordnance Penetrator (MOP) |url=https://aviationweek.com/?id=/article-xml/AW_09_17_2012_p56-492712.xml |access-date=22 June 2025 |website=www.globalsecurity.org}}</ref> The GBU-57 uses grid fins as opposed to the [[Fin|planar fins]] found on most conventional bombs due to their greater control at the high [[Mach number|mach]] flight regimes the bomb operates under, as well as their ability to fold for storage in a [[Northrop B-2 Spirit|B-2]]'s [[Bomb bay|bomb bays]]. As grid fins have higher drag than planar fins at any given mach number, their size is usually decreased to compensate while maintaining maneuverability. ==Combat use== ===US airstrikes on Iranian nuclear facilities=== There has been significant debate over whether the GBU-57 Massive Ordnance Penetrator (MOP) can reliably destroy Iran’s deeply buried nuclear sites at Natanz and Fordow. The Fordow facility and the new halls under construction at Natanz are thought to lie more than 80 m underground, whereas the original Natanz enrichment plant sits roughly 20 m below the surface.<ref>{{cite web |title=America’s huge bunker-busting bomb is not sure to work in Iran |url=https://www.economist.com/graphic-detail/2025/06/18/americas-huge-bunker-busting-bomb-is-not-sure-to-work-in-iran}}</ref> The MOP is reportedly able to penetrate through about 18 m of reinforced concrete with a compressive strength of 5,000 psi.<ref name="2025-BBC-Fordo">{{Cite web |last=BBC Verify and the Visual Journalism team |date=18 June 2025 |title=Iran's secretive nuclear site that only a US bomb could hit |url=https://www.bbc.co.uk/news/resources/idt-868e3c3d-25ec-43cb-bcc0-8832464b91ca |archive-url=https://web.archive.org/web/20250620075543/https://www.bbc.co.uk/news/resources/idt-868e3c3d-25ec-43cb-bcc0-8832464b91ca |archive-date=2025-06-20 |access-date=22 June 2025 |website=BBC News |publisher=BBC |quote="The MOP’s heavy casing and weight allows it to penetrate about 18m of concrete or 61m of earth before exploding, according to analysts at Janes"}}</ref><ref>{{cite web |title=GBU-57/B Massive Ordnance Penetrator (MOP) |url=https://www.globalsecurity.org/military/systems/munitions/mop.htm}}</ref> Iranian domestic research has produced concrete exceeding 30,000 psi, a level that could sharply reduce the bomb’s effective penetration depth.<ref>{{cite web |title=America’s huge bunker-busting bomb is not sure to work in Iran |url=https://www.economist.com/graphic-detail/2025/06/18/americas-huge-bunker-busting-bomb-is-not-sure-to-work-in-iran}}</ref> Complicating matters further is the possibility of deflection or yaw caused by advanced bunker-shell construction techniques.<ref>{{cite web |title=BUNKER BUSTER BOMB Myth / MIT Prof Ted Postol & Lt Col Daniel Davis |url=https://www.youtube.com/watch?v=TriASB-F5UY}}</ref> The first combat use of the GBU-57 MOP was during the [[United States strikes on Iranian nuclear sites]] on 22 June 2025,<ref name="NYT20250622">{{Cite web |last=Cooper |first=Helene |date=21 June 2025 |title=U.S. Military Is Pulled Back Into Middle East Wars |url=https://www.nytimes.com/2025/06/21/us/politics/military-middle-east-wars.html |access-date=22 June 2025 |website=[[The New York Times]] |quote=The attack was the first time the U.S. military had used the weapon in combat.}}</ref><ref>{{Cite news |last=Allison |first=George |date=22 June 2025 |title=B-2 stealth bombers strike Iran's nuclear facilities |url=https://ukdefencejournal.org.uk/b-2-stealth-bombers-strike-irans-nuclear-facilities/ |access-date=22 June 2025 |work=UK Defence Journal}}</ref> when seven [[Northrop B-2 Spirit]] [[Stealth Bombers|stealth bombers]] dropped a total of fourteen GBU-57 bombs, twelve on the [[Fordow Uranium Enrichment Plant]] and two on the [[Natanz Nuclear Facility]].<ref name="Mongilio 2025">{{Cite news |last=Mongilio |first=Heather |last2=Lagrone |first2=Sam |date=22 June 2025 |title=Operation Midnight Hammer Drops 14 Bunker Busters in Record B-2 Strike Against Iranian Nuclear Sites |url=https://news.usni.org/2025/06/21/u-s-strikes-3-iranian-nuclear-sites-using-b-2s-sub-launched-tomahawks |access-date=22 June 2025 |work=USNI News |publisher=U.S. Naval Institute |location=Annapolis, Maryland}}</ref><ref>{{Cite web |title=U.S. Bombs Iran Live Updates: Trump Says Iran's Nuclear Sites "Completely and Totally Obliterated" in Speech |url=https://www.wsj.com/livecoverage/iran-israel-conflict-latest-news |access-date=2025-06-22 |website=WSJ |language=en-US}}</ref> According to [[Dan Caine|General Dan Caine]], Chairman of the [[Joint Chiefs of Staff|U.S Joint Chiefs of Staff]], both sites sustained severe damage.<ref>{{Cite web |title=Bombing Inflicted Severe Damage, Pentagon Says |url=https://www.wsj.com/livecoverage/iran-israel-conflict-latest-news/card/bombing-inflicted-severe-damage-pentagon-says-xe3Zg4JYmAfTXLwad7tJ |access-date=2025-06-22 |website=WSJ |language=en-US}}</ref> Darya Dolzikova, Senior Research Fellow at [[RUSI]], argues that the exact damage to the facilities is unclear.<ref>{{cite web |title=RUSI Experts React to US Strikes on Iran's Nuclear Facilities |url=https://www.rusi.org/explore-our-research/publications/commentary/rusi-experts-react-us-strikes-irans-nuclear-facilities}}</ref> Rafael Grossi, director general in [[IAEA]] said “no one, including the IAEA, is in a position to have fully assessed the underground damage at Fordow”, it is expected to be “very significant”.<ref>{{cite web |title=UN nuclear chief estimates damage to Iran’s facilities ‘very significant’ |url=https://www.aljazeera.com/news/2025/6/23/un-nuclear-chief-estimates-damage-to-irans-facilities-very-significant}}</ref> CNN reported that the strikes "did not destroy the core components" of the facilities.<ref>{{Cite web |last=Bertrand |first=Natasha |last2=Lillis |first2=Katie Bo |last3=Cohen |first3=Zachary |date=2025-06-24 |title=Exclusive: Early US intel assessment suggests strikes on Iran did not destroy nuclear sites, sources say {{!}} CNN Politics |url=https://www.cnn.com/2025/06/24/politics/intel-assessment-us-strikes-iran-nuclear-sites |access-date=2025-06-24 |website=CNN |language=en}}</ref> ==Specifications and capabilities== * '''Length''': {{convert|20.5|ft|m|1}}<ref name="DTRA 2007"/> * '''Diameter''': {{convert|31.5|in|m|1}}<ref name="DTRA 2007"/> * '''BLU-127 bomb body weight''': {{convert|27125|lb|kg|0}}<ref name="Parken 2023"/> * '''Explosive weight''': {{convert|5342|lb|0}}<ref name="Parken 2023"/> ** '''AFX-757''': {{convert|4590|lb|0}}<ref name="Parken 2023"/> ** '''PBXN-114''': {{convert|752|lb|0}}<ref name="Parken 2023"/> * '''Penetration''': (debated) There is debate regarding the penetration capabilities of the bomb. The US Air Force has said that the GBU-57 can penetrate up to {{convert|200|ft|m|abbr=on|sigfig=1}} of unspecified material before exploding.<ref name="milestone">{{Cite web |title=Future 30,000-pound bomb reaches mile stone |url=https://www.acc.af.mil/News/Features/Display/Article/204431/future-30000-pound-bomb-reaches-mile-stone/ |archive-url=https://web.archive.org/web/20231211033254/https://www.acc.af.mil/News/Features/Display/Article/204431/future-30000-pound-bomb-reaches-mile-stone/ |archive-date=11 December 2023 |website=Air Combat Command |access-date=25 June 2025 |url-status=live }}</ref> The BBC reports that analysts at [[Janes Information Services|Janes]] say the weapon can penetrate about {{convert|60|m|ft|abbr=on|order=flip}} of earth or {{convert|18|m|ft|abbr=on|order=flip|-1}} of concrete.<ref name="2025-BBC-Fordo"/> This is consistent with a separate source which suggests penetration of up to {{convert|18|m|ft|abbr=on|order=flip|-1}} into [[Concrete#Properties|reinforced concrete]] with a compressive strength of {{convert|5000|psi|MPa|abbr=on}} and {{convert|8|ft|m|abbr=on}} into {{convert|10000|psi|MPa|abbr=on}} reinforced concrete.<ref name="2025-GS-MOP">{{Cite web |title=GBU-57/B Massive Ordnance Penetrator (MOP) |url=https://www.globalsecurity.org/military/systems/munitions/mop.htm}}</ref> The MOP does not have a void-sensing fuze and detonates only after it comes to a stop, even if it has passed the target area.<ref>{{Cite web |last=Butler |first=Amy |date=17 September 2012 |title=Curbed Ambitions: Hard targets pose a near-term problem as USAF explores weapon and fuze options |url=https://archive.aviationweek.com/issue/20120917#!&pid=56 |url-access=subscription |website=[[Aviation Week]] |pages=56–58}}</ref> Operationally, the MOP can be dropped only by the [[B-2 Spirit]], which can carry up to two of the bombs. The [[B-21 Raider]] is slated to carry it.<ref>{{Cite web |last=Atlamazoglou |first=Stavros |date=16 December 2024 |title=The Massive GBU-57A/B MOP Was Built for a War with China |url=https://nationalinterest.org/blog/buzz/massive-gbu-57ab-mop-was-built-war-china-214075 |access-date=22 June 2025 |website=The National Interest}}</ref><ref name="debuglies" /> The [[B-52]] has been used during weapons testing of the MOP, but requires modifications to carry the bomb.<ref name="Parken 2023"/> ==Users== *{{Flagu|United States}} **{{Air force|United States|size=23px}} – At least 20 in service as of November 2015.<ref name="Scully 2025"/> ==Gallery== <gallery widths="250px" heights="250px" > File:Off loading of MOP cropped.jpg|MOP being offloaded in preparation for its first explosive test, 2007. File:Inside Tunnel MOP cropped.jpg|MOP underground at [[White Sands Missile Range]] before its first explosive test, 2007. File:MOP in the B-2 bomb bay.jpg|Mock up of MOP inside a bomb bay of a B-2 simulator, 2007. File:B-52 releases the MOP during a weapons test.jpg|[[B-52]] releases a MOP during a weapons test, 2009. </gallery> == Desarrollo == In 2002, [[Northrop Grumman]] and [[Lockheed Martin]] were working on the development of a 30,000-pound (13 600 kg) pump designed to penetrate the ground, named ⁇ ''Big BLU'' ⁇ , in reference to the BLU pump. &nbsp;&nbsp;But due to financial and technical difficulties the development was abandoned. Following the 2003 invasion of Iraq, analysis of sites that had been targeted by anti-bunker bombs revealed poor penetration capacity and insufficient levels of destruction. In view of this, there was renewed interest in the development of a large anti-bunker bomb. The Threat Reduction Defense Agency initiated the MOP project to meet a long-term requirement from the Air Force.<ref name="factsheet"/> 1163209: ext.cx.entrypoints.newarticle.js remove use of jquery.cookie | <nowiki>https://gerrit.wikimedia.org/r/c/mediawiki/extensions/ContentTranslation/+/1163209</nowiki> The Aerial Force of United States did not have any official recognition on the development of a bomb of big size, but prepares conceptually a penetrador massive of ''big'' size and arms of demolition, the called collection «Big Blu», that includes the bomb [[GBU-43/B MOAB|MOAB]] (''Massive Ordnance Air Burst''). The development of the MOP already was under way in the Direction of Ammunitions of the Air Force Research Laboratory, in the [[Eglin Air Force Base|Base of the Aerial Force Eglin]], [[Florida]]. The work of design and the tests also is being made by [[Boeing]]. It pretended that the bomb could be deployed in the [[Northrop B-2 Spirit|bomber B-2]], and be guided by means of [[Global Positioning System|GPS]].<ref>{{Cite web |title=Military & Aerospace Electronics, "Air Force ready to deploy 30,000-pound 'super bomb' on stealthy B-2 jet" |url=http://mae.pennnet.com/display_article/282449/32/NEWS/none/none/Air-Force-ready-to-deploy-30%2C000-pound-%27super-bomb%27-on-stealthy-B-2-jet-bomber/ |archive-url=https://web.archive.org/web/20071001000041/http://mae.pennnet.com/display_article/282449/32/NEWS/none/none/Air-Force-ready-to-deploy-30%2C000-pound-%27super-bomb%27-on-stealthy-B-2-jet-bomber/ |archive-date=1 de octubre de 2007 |access-date=13 de agosto de 2012 |dead-url=yes}}</ref> The control of flight will make by means of [[Grid fin|fins of rejilla]], in place of the conventional. 1163209: ext.cx.entrypoints.newarticle.js remove use of jquery.cookie | <nowiki>https://gerrit.wikimedia.org/r/c/mediawiki/extensions/ContentTranslation/+/1163209</nowiki> On 19 July 2007 [[Northrop Grumman]] announced an agreement of 2,5 million dollars for the reacondicionamiento of the bomber furtivo B-2. Each one of the B-2 of the Aerial Force of United States is able to spend two MOP of 14 metric tonnes each one. 1163209: ext.cx.entrypoints.newarticle.js remove use of jquery.cookie | <nowiki>https://gerrit.wikimedia.org/r/c/mediawiki/extensions/ContentTranslation/+/1163209</nowiki> ==See also== * [[Earthquake bomb]] * [[Thermobaric weapon]] ;Specific large bombs * [[BLU-82]] Daisy Cutter bomb * [[Father of All Bombs]] * [[Mother of All Bombs|GBU-43/B Mother of All Bombs]], another very large US bomb * [[Grand Slam (bomb)]] * [[T-12 Cloudmaker]] * [[Tallboy (bomb)]] * [[FAB-9000]] ==References== {{Reflist}} ==External links== {{Commons category|Massive Ordnance Penetrator}} * [https://www.af.mil/About-Us/Fact-Sheets/Display/Article/104614/massive-ordnance-penetrator/ Massive Ordnance Penetrator Fact Sheet] {{USAF equipment}} [[Category:Anti-fortification weapons]] [[Category:Boeing]] [[Category:Guided bombs of the United States]] [[Category:Military equipment introduced in the 2010s]] knzuc44wbx36i2tojsh5jwd52vs0fla User:Ponor/wAwB-worker.js 2 171632 747801 744514 2026-06-21T03:33:06Z Ponor 47975 set window.wa_diffPST=true at any time to enable pre-save transform of {{subst:___}} and signatures 747801 javascript text/javascript /* * wAwB – An in-browser application for automated editing of wiki pages. * Features: customizable regex or JavaScript search-and-replace rules, * custom JavaScript pre/post-processing functions and function libraries, * granular protection or targeting of different parts of wikitext, * a full-fledged CodeMirror editor, and options to move, delete, and protect pages. * Author: [[User:Ponor]] * Documentation: [[User:Ponor/wAwB]] * License: GNU General Public License (GPL) */ //<nowiki> mw.loader.using([ 'oojs-ui-core', 'oojs-ui-widgets', 'oojs-ui-windows', 'mediawiki.api', 'mediawiki.diff.styles', 'mediawiki.util', 'mediawiki.page.gallery.styles', 'oojs-ui.styles.icons-content', 'oojs-ui.styles.icons-interactions', 'oojs-ui.styles.icons-movement', 'oojs-ui.styles.icons-moderation', 'oojs-ui.styles.icons-editing-core', 'oojs-ui.styles.icons-editing-advanced' ]).then(function() { // ===================================================================== // 1. STATE & CONFIGURATION // ===================================================================== var SCRIPT_TIMEOUT_MS = window.wa_timeout || 5000; var FETCH_SAFETY_LIMIT = window.wa_fetchLimit || 10000; var APP_NAME = "wAwB"; var DO_TAG = false; var SUMMARY_SUFFIX = window.wa_suffix || " [[:en:User:Ponor/wAwB| #wAwB]]"; var APP_VERSION = "0.6"; var DOC_URL = window.wa_docUrl || "https://en.wikipedia.org/wiki/User:Ponor/wAwB"; document.title = window.wa_editIn || "Edit in wAwB"; var PERMS = { canSave: false, allowBot: false, saveDelay: 0 }; var IS_ADMIN = mw.config.get('wgUserGroups').includes('sysop'); var CAN_MOVE = IS_ADMIN || mw.config.get('wgUserGroups').includes('extendedmover') || mw.config.get('wgUserGroups').includes('filemover') || mw.config.get('wgUserGroups').includes('pagemover'); var WIKI = mw.config.get('wgDBname'); var SAVED_RUN = 0; var SAVED_SESSION = 0; var currentPageExists = false; var isRunning = false; var isFetching = false; var currentTitle = null; var currentVars = {}; var currentLibrary = { name: null, code: null }; var originalWikitext = ""; var currentPageSummaryAppend = ""; var currentPageSummaryOverride = null; var baseRevId = 0; var currentViewMode = 'diff'; var autoSaveTimer = null; var propNamesLoaded = false; var hasNewSources = false; var currentHeightMode = 1; // 0=25%, 1=45% (default), 2=72% var heightValues = ['25%', '45%', '72%']; // EXTERNAL RULES STATE var wikiTypos = []; var localTypos = []; // LOADING FLAG var isLoadingProject = false; // NAMESPACE ALIASES var nsIds = mw.config.get('wgNamespaceIds'); var catAliases = [], fileAliases = []; for (var key in nsIds) { if (nsIds[key] === 14) catAliases.push(key.replace(/_/g, ' ')); if (nsIds[key] === 6) fileAliases.push(key.replace(/_/g, ' ')); } catAliases.sort((a, b) => b.length - a.length); fileAliases.sort((a, b) => b.length - a.length); var REGEX_CAT_PFX = catAliases.map(mw.util.escapeRegExp).join('|'); var REGEX_FILE_PFX = fileAliases.map(mw.util.escapeRegExp).join('|'); // MASTER PROTECTION DEFINITIONS var PROTECTION_DEFS = [{ id: 'nowiki', isOn: true, label: 'Nowiki: <nowiki>', regex: /<nowiki>[\s\S]*?<\/nowiki>|<nowiki\s*\/>/gi }, { id: 'comments', isOn: true, label: 'Comments: <!' + '-- -->', regex: new RegExp('<!' + '--[\\s\\S]*?--' + '>', 'g') }, { id: 'headers', isOn: false, label: 'Headers: == Title ==', regex: /^==+[\s\S]+?==+\s*$/gm }, { id: 'templates', isOn: false, label: 'Templates: {{...}}', open: '{{', close: '}}', species: null, regex: null }, { id: 'tables', isOn: false, label: 'Tables: {|...|}', open: '\n{|', close: '\n|}', regex: null }, { id: 'images', isOn: false, label: 'Images: [[File:...|...|...]]', open: '[[', close: ']]', species: '(?:' + REGEX_FILE_PFX + ')\\s*:', regex: null }, { id: 'refs', isOn: true, label: 'Refs: <ref...', regex: /<ref[^>]*?\/>|<ref[^>]*?(?<!\/)>[\s\S]*?<\/ref>/gi }, { id: 'blocks', isOn: false, label: 'Blocks: math, gallery...', regex: null }, { id: 'categories', isOn: true, label: 'Categories: [[Category:...]]', regex: new RegExp('\\[\\[\\s*(' + REGEX_CAT_PFX + ')\\s*:[^\\]]+\\]\\]', 'giu') }, { id: 'files', isOn: true, label: 'File names: File:...', regex: new RegExp('(?<=\\[\\[\\s*:?(:?' + REGEX_FILE_PFX + ')\\s*:)[^|\\]]+' + '|^\\s*(?:' + REGEX_FILE_PFX + ')\\s*:([^\\][}{|\\n]{1,150}\\.(?:svg|png|jpe?g|gif|tiff|webp|xcf|mp3|midi|ogg|webm|flac|wav|mpe?g|pdf|djv))', 'gmiu') }, { id: 'targets', isOn: false, label: 'Targets of [[...|', regex: /(?<=\[\[:?)[^|\]]+?(?=\||\]\])/g }, { id: 'extlinks', isOn: true, label: 'External links: [...]', regex: /(?<=\[)(https?:\/\/|ftps?:\/\/|mailto:)[^\]]+(?=\])/gi }, { id: 'urls', isOn: true, label: 'URLs: http...', regex: /https?:\/\/[^\s<>[\]"'`()]+/gi } ]; // ===================================================================== // 2. CSS STYLES // ===================================================================== var styles = ` * { box-sizing: border-box; } #wa-root { font-family: sans-serif; height: 100vh; width: 100vw; overflow: hidden; display: flex; font-size: 14px; } #wa-left-panel { width: 400px; min-width: 400px; max-width: 400px; background: var(--background-color-base, #fff); border-right: 1px solid #c8ccd1; display: flex; flex-direction: column; z-index: 10; overflow-x: hidden; } #wa-left-panel h3 { color: #3f6fcf; text-align: center; margin: 12px 0 0 0; } #wa-username { color: #3f6fcf; text-align: center; margin: 2px 0; font-size: 92%; } #wa-content-area { flex: 1; padding: 10px 10px 100px 10px; overflow-y: auto; overflow-x: hidden; } #wa-right-panel { flex: 1; display: flex; flex-direction: column; height: 100%; background: var(--background-color-interactive, #eaecf0); overflow: hidden; } #wa-visual-output { flex: 0 0 45%; min-height: 0; overflow-y: auto; background: var(--background-color-base, #fff); padding: 20px; border-bottom: 1px solid #c8ccd1; } .wa-editor-header { flex: 0 0 40px; min-height: 40px; padding: 0 10px; background: var(--background-color-interactive-subtle, #f8f9fa); border-bottom: 1px solid #c8ccd1; display: flex; gap: 25px; justify-content: space-between; align-items: center; z-index: 10; } .wa-editor-header.wa-dirty { background: var(--background-color-warning-subtle, #fdf2d5); border-bottom: 1px solid #e6a700; } .wa-header-left { flex: 1; display: flex; align-items: center; gap: 5px; min-width: 0; overflow: hidden; } .wa-header-right { flex: 0 0 auto; display: flex; justify-content: flex-end; align-items: center; gap: 8px; color: var(--color-placeholder, #72777d); font-size: 0.9em; } .wa-title-link { font-weight: bold; font-size: 1.1em; color: var(--color-progressive--focus, #36c) !important; text-decoration: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; flex-shrink: 0; max-width: 40%; } .wa-title-link:hover { text-decoration: underline; } #wa-status-indicator { flex: 0 0 auto; width: 10px; height: 10px; border-radius: 50%; background-color: #00af89; cursor: help; transition: background-color 0.2s; margin-right: 2px; } #wa-status-indicator.wa-status-working { background-color: #36c; animation: wa-pulse-blue 1.5s infinite; } #wa-status-indicator.wa-status-error { background-color: #bf3c2c; } @keyframes wa-pulse-blue { 0% { opacity: 1; } 50% { opacity: 0.4; } 100% { opacity: 1; } } .wa-header-sep { border-left: 1px solid #ccc; height: 16px; flex-shrink: 0; margin: 0 2px; } #wa-summary-preview { flex-grow: 1; color: #d00; font-style: italic; white-space: nowrap; text-overflow: ellipsis; overflow-x: auto; background: transparent; border: none; outline: none; box-shadow: none; min-width: 50px; padding: 2px 5px; scrollbar-width: none; -ms-overflow-style: none; font-size: 1em; } #wa-summary-preview::-webkit-scrollbar { display: none; } #wa-summary-preview:hover { background: rgba(0, 0, 0, 0.05); cursor: text; } #wa-summary-preview:focus { background: #fff; } .wa-info-container { margin-right: 10px; } .wa-tools-container { display: flex; align-items: center; gap: 2px; } .wa-resize-container { display: flex; flex-direction: column; justify-content: center; height: 100%; margin-left: 10px; padding-left: 5px; border-left: 1px solid #ccc; } .wa-resize-btn { cursor: pointer; color: #72777d; user-select: none; width: 20px; height: 14px; display: flex; align-items: center; justify-content: center; transition: color 0.1s ease-in-out; } .wa-resize-btn:hover { color: #36c; } .wa-resize-btn.wa-resize-disabled { color: #ccc; cursor: default; } #wa-proc-header { margin-top: 15px !important; border-bottom: none !important; cursor: default; } #wa-proc-title { font-weight: bold; padding: 10px; display: block; } #wa-proc-content { padding: 0 10px 15px 10px; } #wa-editor-area { flex: 1; min-height: 0; display: flex; flex-direction: column; background: var(--background-color-base, #fff); position: relative; overflow: hidden; } #wa-editor-textarea { flex: 1; height: 100%; font-family: monospace; font-size: 13px; border: none; outline: none; padding: 10px; resize: none; width: 100%; } .cm-editor { height: 100% !important; flex: 1; } .wa-section-header { margin-top: 12px; border-bottom: 1px solid #eee; width: 100%; display: block; margin-left: 0 !important; } #wa-content-area .wa-section-header:first-child, #wa-content-area .wa-section-header.oo-ui-buttonElement-frameless:first-child { margin-top: 0; margin-left: 0 !important; } .wa-section-header > .oo-ui-buttonElement-button { text-align: left; padding: 10px 10px !important; margin: 0 !important; display: block; width: 100%; position: relative; border-left: 3px solid #3f6fcf !important; border-radius: 3px !important; background-color: transparent !important; } .wa-section-header > .oo-ui-buttonElement-button:focus { outline: none !important; } .wa-section-header .oo-ui-labelElement-label { font-weight: bold; padding-left: 0 !important; margin-left: 0 !important; color: var(--color-base, #202122); } .wa-section-header .oo-ui-indicatorElement-indicator { position: absolute; right: 10px !important; top: 50%; margin-top: -10px; left: auto !important; width: 20px; } .wa-foldable-content { display: none; padding: 10px 0; } .wa-source-options { background: var(--background-color-interactive-subtle, #f8f9fa); border: 1px solid #c8ccd1; border-top: none; padding: 8px; margin-bottom: 10px; font-size: 0.9em; } .wa-opt-row { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 5px; } .wa-opt-label { font-weight: bold; width: 100%; margin-bottom: 5px; color: var(--color-base, #202122); } .wa-opt-row > div { margin-top: 8px !important; margin-bottom: 8px !important; } .wa-rule-row { background: var(--background-color-interactive-subtle, #f8f9fa); border: 1px solid #c8ccd1; padding: 8px; margin-bottom: 8px; border-radius: 4px; display: flex; align-items: stretch; transition: background-color 0.3s; } .wa-rule-row.wa-highlight { background-color: var(--background-color-interactive, #eaecf0); border-color: #36c; } .wa-rule-controls { display: flex; flex-direction: column; justify-content: center; gap: 0px; padding-right: 4px; border-right: 1px solid #eee; margin-right: 8px; } .wa-rule-btn { margin: 0 !important; margin-right: 0 !important; margin-left: 0 !important; } .wa-rule-btn > .oo-ui-buttonElement-button { margin: 0 !important; } .wa-rule-content { flex: 1; min-width: 0; } .wa-rule-opt-row { display: flex; justify-content: space-between; align-items: center; margin-top: 5px; } #wa-ns-selector { width: 100%; margin-bottom: 10px; font-family: sans-serif; font-size: 0.9em; border: 1px solid #a2a9b1; } .wa-lib-dialog > .oo-ui-window-frame { width: 80vw !important; max-width: none !important; height: 80vh !important; max-height: none !important; } .wa-lib-editorwrapper { height: 100%; border: 1px solid #c8ccd1; position: relative; boxSizing: border-box; } .wa-page-list-raw textarea { font-family: monospace; font-size: 0.9em; white-space: pre; overflow-x: auto; } .wa-list-running textarea { background-color: var(--background-color-neutral-subtle, #f8f8f8) !important; color: var(--color-base, #202122) !important; } .wa-grid-container { display: flex; gap: 6px; margin-bottom: 10px; } .wa-grid-col { flex: 1; display: flex; flex-direction: column; gap: 6px; } .wa-grid-col .oo-ui-buttonWidget { width: 100%; } .wa-grid-col .oo-ui-buttonWidget .oo-ui-buttonElement-button { width: 100%; text-align: center; justify-content: center; } .wa-toolbar { display: flex; justify-content: flex-end; align-items: center; gap: 4px; border-bottom: 1px solid #eee; padding-bottom: 4px; margin-bottom: 4px; } .wa-list-counter { margin-right: auto; font-weight: bold; color: var(--color-subtle, #54595d); font-size: 0.9em; padding-left: 5px; } .wa-project-bar { display: flex; flex-wrap: wrap; gap: 8px; padding: 0 10px; margin: 8px 0; justify-content: center; } .wa-project-bar .oo-ui-buttonElement-button { padding-left: 36px !important; padding-right: 12px !important; font-size: 0.9em; } .wa-project-bar .oo-ui-iconElement-icon { left: 10px !important; } .wa-settings-header { font-weight: bold; color: var(--color-subtle, #54595d); margin-bottom: 8px; display: block; text-transform: uppercase; font-size: 0.9em; } .wa-setting-row { display: flex; align-items: center; margin-bottom: 6px; } .wa-bot-row { background: var(--background-color-success-subtle, #dff2eb); border: 1px solid #a5d6a7; padding: 8px; margin-bottom: 10px; border-radius: 4px; display: flex; align-items: center; justify-content: flex-start; gap: 15px; } table.diff { width: 100%; font-family: "Adwaita Mono", "Courier New", monospace } table.diff td { vertical-align: top; } table.diff tr:hover td { background-color: var(--background-color-progressive-subtle--hover, #d9e2ff); cursor: pointer; } @keyframes wa-pulse-red { 0% { box-shadow: 0 0 0 0 rgba(255, 0, 0, 0.4); border-color: #ff0000; } 70% { box-shadow: 0 0 0 6px rgba(255, 0, 0, 0); border-color: #ff0000; } 100% { box-shadow: 0 0 0 0 rgba(255, 0, 0, 0); border-color: #ff0000; } } .wa-summary-warning input { animation: wa-pulse-red 1s infinite; border-color: #ff0000 !important; } `; $('<style>').text(styles).appendTo('head'); $('body').empty(); // ===================================================================== // 3. HELPER FUNCTIONS // ===================================================================== function checkPermissions() { return new Promise(function(resolve) { var api = new mw.Api(); var projectNs = mw.config.get('wgFormattedNamespaces')[4]; var checkTitles = { 'permissions': projectNs + ':AutoWikiBrowser/CheckPageJSON', 'tag': 'MediaWiki:Tag-wAwB' }; api.get({ action: 'query', prop: 'revisions', titles: Object.values(checkTitles).join('|'), rvprop: 'content', rvslots: 'main', formatversion: 2 }).then(function(data) { var pagePerms = data.query.pages.find(p => p.title === checkTitles['permissions']); var pageTag = data.query.pages.find(p => p.title === checkTitles['tag']); DO_TAG = pageTag.missing === undefined; var userName = mw.config.get('wgUserName'); var userGroups = mw.config.get('wgUserGroups'); var isSysop = userGroups.includes('sysop'); if (!pagePerms.missing) { try { var content = pagePerms.revisions[0].slots.main.content; var json = JSON.parse(content); var inEnabledUsers = json.enabledusers && json.enabledusers.includes(userName); var inEnabledBots = json.enabledbots && json.enabledbots.includes(userName); var isBotGroup = userGroups.includes('bot'); var canSave = inEnabledUsers || inEnabledBots || isSysop; var allowBot = inEnabledBots && isBotGroup; resolve({ canSave: canSave, allowBot: allowBot, saveDelay: 0 }); } catch (e) { resolve({ canSave: false, allowBot: false, saveDelay: 0 }); } } else { var editCount = mw.config.get('wgUserEditCount'); if (editCount > 500) resolve({ canSave: true, allowBot: false, saveDelay: 20000 }); else resolve({ canSave: false, allowBot: false, saveDelay: 0 }); } }).catch(function() { resolve({ canSave: false, allowBot: false, saveDelay: 0 }); }); }); } function getUserCode(widget, globalName) { var val = widget.getValue().trim(); if (!val || val.startsWith('// Enter')) { if (window[globalName] && typeof window[globalName] === 'function') { var s = window[globalName].toString(); return s.substring(s.indexOf('{') + 1, s.lastIndexOf('}')); } return ""; } if (val.startsWith('function')) { return val.substring(val.indexOf('{') + 1, val.lastIndexOf('}')); } return val; } function normalizeLine(line) { if (!line) return null; // Pass through comments/STOP commands (trimmed) if (line.trim().startsWith('####')) return line.trim(); // Handle Title|Variables var parts = line.split('|'); var title = parts[0].trim(); if (!title) return null; // Skip if title is empty // Reassemble: Clean Title + Original Variables (preserving whitespace) var rest = parts.length > 1 ? parts.slice(1).join('|') : null; return title + (rest !== null ? '|' + rest : ''); } function getNormalizedList(text) { if (!text) return []; return text.split('\n') .map(normalizeLine) .filter(function(l) { return l !== null; }); } function getDeduplicatedList(text) { if (!text) return []; var seen = new Set(); var out = []; var lines = text.split('\n'); for (var i = 0; i < lines.length; i++) { var clean = normalizeLine(lines[i]); if (clean && !seen.has(clean)) { seen.add(clean); out.push(clean); } } return out; } function parseTypoContent(content) { if (!content) return []; try { var $wrapper = $('<body>').html(content); var rules = []; $wrapper.find('Typo:not([disabled])').each(function() { var $t = $(this); var find = $t.attr('find'); var replace = $t.attr('replace'); if (find && replace !== undefined) { rules.push({ find: find, replace: replace, regex: true, flags: 'gmu', enabled: true, isFunc: false }); } }); return rules; } catch (e) { return []; } } function updateSummaryPreview(baseText) { var base = currentPageSummaryOverride !== null ? currentPageSummaryOverride : (baseText || ""); var finalSum = base + (currentPageSummaryAppend || ""); var previewText = finalSum ? injectVars(finalSum) : ''; $('#wa-summary-preview').val(previewText); } function injectVars(text) { if (!text) return ""; return text.replace(/\$x([A-Z]|x)/g, function(match) { return currentVars[match] || match; // Swap it, or leave it alone if undefined }); } // ===================================================================== // 4. UI CONSTRUCTION // ===================================================================== checkPermissions().then(function(pState) { PERMS = pState; var $main = $('<div>').attr('id', 'wa-root').appendTo('body'); var $left = $('<div>').attr('id', 'wa-left-panel').appendTo($main); $left.append($('<h3>').append($('<a>').attr('href', DOC_URL).attr('target', '_blank').text(APP_NAME).css({ 'text-decoration': 'none', 'color': 'inherit' }))); $left.append($('<div>').attr('id', 'wa-username').append($('<a>').attr('href', mw.util.getUrl('Special:Contributions/' + mw.config.get('wgUserName'))).attr('target', '_blank').text('User: ' + mw.config.get('wgUserName')).css({ 'text-decoration': 'none', 'color': 'inherit' }))); var btnSaveProj = new OO.ui.ButtonWidget({ icon: 'download', label: 'Save project', framed: false, flags: 'progressive' }); var btnLoadProj = new OO.ui.ButtonWidget({ icon: 'upload', label: 'Load project', framed: false }); var $projBar = $('<div>').addClass('wa-project-bar').append(btnSaveProj.$element, btnLoadProj.$element); $left.append($projBar); var $fileInput = $('<input type="file" accept=".json">').hide().appendTo('body'); var $content = $('<div>').attr('id', 'wa-content-area').appendTo($left); var $right = $('<div>').attr('id', 'wa-right-panel').appendTo($main); var $editorHeader = $('<div>').addClass('wa-editor-header').appendTo($right); var $headerLeft = $('<div>').addClass('wa-header-left').appendTo($editorHeader); var $statusIndicator = $('<span>').attr('id', 'wa-status-indicator').attr('title', 'Ready').appendTo($headerLeft); var $titleLink = $('<a>').addClass('wa-title-link').text('Page content').attr('target', '_blank').appendTo($headerLeft); $('<span>').addClass('wa-header-sep').appendTo($headerLeft); var $summaryPreview = $('<input type="text">').attr('id', 'wa-summary-preview').attr('autocomplete', 'off').appendTo($headerLeft); var $headerRight = $('<div>').addClass('wa-header-right').appendTo($editorHeader); var $infoContainer = $('<span>').addClass('wa-info-container').appendTo($headerRight); var $toolsContainer = $('<div>').addClass('wa-tools-container').appendTo($headerRight); var $resizeContainer = $('<div>').addClass('wa-resize-container').appendTo($headerRight); var $adminTools = $('<div>').addClass('wa-admin-tools').hide().appendTo($toolsContainer); // Wide chevron SVGs var svgUp = '<svg xmlns="http://www.w3.org/2000/svg" width="14" height="8" viewBox="0 0 24 12"><path d="M2 10 L12 2 L22 10" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/></svg>'; var svgDown = '<svg xmlns="http://www.w3.org/2000/svg" width="14" height="8" viewBox="0 0 24 12"><path d="M2 2 L12 10 L22 2" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/></svg>'; var $btnSizeUp = $('<div>').addClass('wa-resize-btn').html(svgUp).attr('title', 'Decrease view size'); var $btnSizeDown = $('<div>').addClass('wa-resize-btn').html(svgDown).attr('title', 'Increase view size'); $resizeContainer.append($btnSizeUp, $btnSizeDown); function setPanelHeight(modeIndex) { currentHeightMode = modeIndex; if (currentHeightMode < 0) currentHeightMode = 0; if (currentHeightMode > 2) currentHeightMode = 2; $('#wa-visual-output').css('flex-basis', heightValues[currentHeightMode]); $btnSizeUp.toggleClass('wa-resize-disabled', currentHeightMode === 0); $btnSizeDown.toggleClass('wa-resize-disabled', currentHeightMode === 2); } $btnSizeUp.on('click', function() { if (!$(this).hasClass('wa-resize-disabled')) setPanelHeight(currentHeightMode - 1); }); $btnSizeDown.on('click', function() { if (!$(this).hasClass('wa-resize-disabled')) setPanelHeight(currentHeightMode + 1); }); setPanelHeight(1); if (CAN_MOVE) { var btnAdminMove = new OO.ui.ButtonWidget({ icon: 'move', title: 'Move page to $xA', disabled: true, framed: false }); $adminTools.append(btnAdminMove.$element).show(); } if (IS_ADMIN) { var btnAdminDel = new OO.ui.ButtonWidget({ icon: 'trash', title: 'Delete page', disabled: true, framed: false }); var btnAdminProt = new OO.ui.ButtonWidget({ icon: 'lock', title: 'Protect page', disabled: true, framed: false }); $adminTools.append(btnAdminDel.$element, btnAdminProt.$element).show(); } var btnManualEdit = new OO.ui.ButtonWidget({ icon: 'edit', title: 'Open in manual editor', framed: false, disabled: true }); var btnWatch = new OO.ui.ButtonWidget({ icon: 'star', title: 'Watch this page', framed: false, disabled: true, accessKey: 'w' }); $toolsContainer.append(btnManualEdit.$element, btnWatch.$element); var $visualOut = $('<div>').attr('id', 'wa-visual-output').html('<div style="color:#aaa; text-align:center; margin-top:50px;">Ready to start...</div>').prependTo($right); var $editorArea = $('<div>').attr('id', 'wa-editor-area').appendTo($right); var $textArea = $('<textarea>').attr('id', 'wa-editor-textarea').attr('placeholder', 'Page text will appear here...').appendTo($editorArea); function setStatus(msg, type) { if (!msg) msg = "Ready"; $statusIndicator.attr('title', msg).removeClass('wa-status-error wa-status-working'); if (type === 'error') $statusIndicator.addClass('wa-status-error'); if (type === 'working') $statusIndicator.addClass('wa-status-working'); } // EDITOR OBJECT var Editor = { mode: 'textarea', cmInstance: null, init: function() { var self = this; mw.loader.using(['ext.CodeMirror', 'ext.CodeMirror.mode.mediawiki']).then(function(require) { try { self.cmInstance = new(require('ext.CodeMirror'))($textArea[0], (require('ext.CodeMirror.mode.mediawiki')).mediawiki()); self.cmInstance.initialize(); self.mode = 'codemirror'; } catch (e) { console.error("CM Error", e); } }).catch(function(err) { console.error("CM Load Error:", err); }); $textArea.on('input', updateDirtyState); }, getValue: function() { return (this.mode === 'codemirror' && this.cmInstance) ? this.cmInstance.view.state.doc.toString() : $textArea.val(); }, setValue: function(text) { $textArea.val(text); if (this.mode === 'codemirror' && this.cmInstance) { this.cmInstance.view.dispatch({ changes: { from: 0, to: this.cmInstance.view.state.doc.length, insert: text } }); } else { $textArea[0].dispatchEvent(new Event('input')); } }, setDisabled: function(d) { $textArea.prop('disabled', d); if (this.mode === 'codemirror' && this.cmInstance) { this.cmInstance.view.contentDOM.contentEditable = !d; $($textArea).parent().find('.cm-editor').css('opacity', d ? 0.5 : 1); } }, scrollToLine: function(n) { if (isNaN(n)) return; if (this.mode === 'codemirror' && this.cmInstance) { var v = this.cmInstance.view; var l = v.state.doc.line(n); v.dispatch({ effects: v.constructor.scrollIntoView(l.from, { y: 'center' }), selection: { anchor: l.from } }); v.focus(); } } }; var WorkerEngine = { activeWorker: null, workerURL: null, currentLibCode: null, timeoutTimer: null, initWorker: function(libCode) { this.destroy(); // Clean up existing if any this.currentLibCode = libCode || ""; var scriptContent = this.currentLibCode + "\n\n" + ` self.onmessage = async function(e) { try { var data = e.data; var inputs = data.texts || [data.text]; var vars = data.vars; var outputs = []; // Helper to construct async functions dynamically var AsyncFunction = Object.getPrototypeOf(async function(){}).constructor; function inject(str) { if (!str) return ""; return str.replace(/\\$x([A-Z]|x)/g, function(m) { return vars[m] || ""; }); } // Returns a Promise and handles 'await' inside user code async function execUserFunc(code, currentText, currentVars, sharedObj) { if (!code || code.trim() === "") return currentText; try { var func = new AsyncFunction('text', 'vars', 'shared', code); var res = await func(currentText, currentVars, sharedObj); if (res && typeof res === 'object' && res.skip) { return { _skipSignal: true, reason: res.reason || 'Script-requested skip' }; } return (res !== undefined) ? res : currentText; } catch (err) { throw err; // or: return currentText } } var shared = {}; // Shared context for this page for (var i = 0; i < inputs.length; i++) { var text = inputs[i]; // 1. Pre-Process var preRes; if (data.preCode && data.preCode.trim() !== "") { preRes = await execUserFunc(data.preCode, text, vars, shared); } else if (typeof wAwB_Pre === 'function') { try { preRes = await wAwB_Pre(text, vars, shared); if (preRes && typeof preRes === 'object' && preRes.skip) { preRes = { _skipSignal: true, reason: preRes.reason || 'Script-requested skip' }; } } catch (err) { preRes = text; } } else { preRes = text; } if (preRes && preRes._skipSignal) { self.postMessage({ skipped: true, reason: preRes.reason }); return; } text = (preRes !== undefined) ? preRes : text; // 2. Rules Processing if (data.rules && data.rules.length > 0) { data.rules.forEach(function(rule) { var findStr = inject(rule.find); if (!findStr) return; if (rule.isFunc) { try { var userFunc = new Function('match', 'groups', 'vars', 'shared', rule.replace); text = text.replace(new RegExp(findStr, (rule.flags || 'gmu').replace(/[^gimsuvy]/g, '')), function(...args) { var match = args[0]; var groups = args.slice(1, -2); try { var res = userFunc(match, groups, vars, shared); return res !== undefined ? res : match; } catch (err) { return match; } }); } catch (e) {} } else { var repStr = inject(rule.replace).replace(/\\\\n/g, "\\n").replace(/\\\\t/g, "\\t").replace(/\\\\r/g, "\\r"); if (rule.regex) { try { var flags = (rule.flags || 'gmu').replace(/[^gimsuvy]/g, ''); text = text.replace(new RegExp(findStr, flags), repStr); } catch (e) {} } else { var finalFind = findStr.replace(/\\\\n/g, "\\n").replace(/\\\\t/g, "\\t").replace(/\\\\r/g, "\\r"); text = text.split(finalFind).join(repStr); } } }); } // 3. Post-Process var postRes; if (data.postCode && data.postCode.trim() !== "") { postRes = await execUserFunc(data.postCode, text, vars, shared); } else if (typeof wAwB_Post === 'function') { try { postRes = await wAwB_Post(text, vars, shared); if (postRes && typeof postRes === 'object' && postRes.skip) { postRes = { _skipSignal: true, reason: postRes.reason || 'Script-requested skip' }; } } catch (err) { postRes = text; } } else { postRes = text; } if (postRes && postRes._skipSignal) { self.postMessage({ skipped: true, reason: postRes.reason }); return; } text = (postRes !== undefined) ? postRes : text; outputs.push(text); } self.postMessage({ success: true, texts: outputs, summaryAppend: shared.summaryAppend, summaryOverride: shared.summaryOverride }); } catch (err) { self.postMessage({ success: false, error: err.toString() }); } }; `; var blob = new Blob([scriptContent], { type: 'application/javascript' }); this.workerURL = URL.createObjectURL(blob); this.activeWorker = new Worker(this.workerURL); }, run: function(payload) { var self = this; return new Promise(function(resolve, reject) { // Re-init if no worker exists, or if the user changed the library code if (!self.activeWorker || self.currentLibCode !== (payload.libraryCode || "")) { self.initWorker(payload.libraryCode); } if (self.timeoutTimer) clearTimeout(self.timeoutTimer); self.timeoutTimer = setTimeout(function() { self.destroy(); // Assassinate the stuck worker reject("Script timed out (" + SCRIPT_TIMEOUT_MS + "ms)."); }, SCRIPT_TIMEOUT_MS); self.activeWorker.onmessage = function(e) { clearTimeout(self.timeoutTimer); if (e.data.skipped) resolve({ skipped: true, reason: e.data.reason }); else if (e.data.success) resolve({ success: true, texts: e.data.texts, summaryAppend: e.data.summaryAppend, summaryOverride: e.data.summaryOverride }); else reject(e.data.error); }; self.activeWorker.postMessage(payload); }); }, destroy: function() { if (this.activeWorker) { this.activeWorker.terminate(); this.activeWorker = null; } if (this.workerURL) { URL.revokeObjectURL(this.workerURL); this.workerURL = null; } if (this.timeoutTimer) { clearTimeout(this.timeoutTimer); this.timeoutTimer = null; } } }; var PageProtector = { store: [], getKey: function() { var id = this.store.length.toString(); var p = ""; for (var i = 0; i < id.length; i++) { p += String.fromCharCode(0xE010 + parseInt(id[i])); } return '\uE000' + p + '\uE001'; }, protect: function(text, mode, config, templateSpecies = null) { this.store = []; var self = this; var safeRep = function(t, r) { return t.replace(r, function(m) { if (!m) return m; var key = self.getKey(); self.store.push(m); return key; }); }; var shouldProcess = function(id) { if (mode === 'target') return config === id; return config[id] === true; }; var matchedBrackets = function(text, op, cl, species = '') { var newText = "", depth = 0, start = 0, cursor = 0; var speciesRegex = species ? new RegExp(species, 'iu') : null; for (var i = 0; i < text.length; i++) { if (text[i] === op[0] && text.slice(i, i + op.length) === op) { if (depth === 0) start = i; depth++; i += op.length - 1; } else if (text[i] === cl[0] && text.slice(i, i + cl.length) === cl) { if (depth > 0) { depth--; if (depth === 0) { var chunk = text.substring(start, i + cl.length); if (!speciesRegex || speciesRegex.test(chunk)) { var key = self.getKey(); self.store.push(chunk); newText += text.substring(cursor, start) + key; } else { newText += text.substring(cursor, i + cl.length); } cursor = i + cl.length; } i += cl.length - 1; } } } newText += text.substring(cursor); return newText; }; PROTECTION_DEFS.forEach(function(def) { if (shouldProcess(def.id)) { if (def.id === 'blocks') { ['math', 'pre', 'source', 'syntaxhighlight', 'code', 'gallery'].forEach(t => text = safeRep(text, new RegExp('<' + t + '[^>]*?>[\\s\\S]*?<\\/' + t + '>|<' + t + '[^>]*?/>', 'gi'))); } else if (['templates', 'tables', 'images'].includes(def.id)) { var activeSpecies = (def.id === 'templates') ? templateSpecies : def.species; text = matchedBrackets(text, def.open, def.close, activeSpecies || ''); } else if (def.regex) { text = safeRep(text, def.regex); } } }); return text; }, restore: function(text) { var self = this; var loop = 100; while (/(\uE000[\uE010-\uE019]+\uE001)/.test(text) && loop > 0) { text = text.replace(/\uE000([\uE010-\uE019]+)\uE001/g, function(m, d) { var id = ""; for (var i = 0; i < d.length; i++) id += (d.charCodeAt(i) - 0xE010).toString(); return self.store[parseInt(id, 10)] || m; }); loop--; } return text; } }; var accordionRegistry = []; function addSection(title, $inner) { var btn = new OO.ui.ButtonWidget({ label: title, indicator: 'down', framed: false, classes: ['wa-section-header'] }); var box = $('<div>').addClass('wa-foldable-content').append($inner); var sectionObj = { btn: btn, box: box, label: title }; accordionRegistry.push(sectionObj); btn.on('click', function() { var isOpening = !box.is(':visible'); if (isOpening) { accordionRegistry.forEach(function(sec) { if (sec !== sectionObj) { sec.box.hide(); sec.btn.setIndicator('down'); } }); } box.toggle(); btn.setIndicator(box.is(':visible') ? 'up' : 'down'); }); $content.append(btn.$element, box); return sectionObj; } // WIDGETS var srcSelect = new OO.ui.DropdownInputWidget({ options: [{ data: 'cat', label: 'Category' }, { data: 'linksto', label: 'Pages linking to...' }, { data: 'linkson', label: 'Links on page...' }, { data: 'prefix', label: 'Pages with prefix...' }, { data: 'watchlist', label: 'Watchlist' }, { data: 'search', label: 'Wiki search' }, { data: 'usercontribs', label: 'User contributions' }, { data: 'pageswithprop', label: 'Pages with property' }] }); var srcInput = new OO.ui.TextInputWidget({ placeholder: 'Category...' }); var now = new Date(); var today = now.toISOString().split('T')[0]; var srcInputUser = new OO.ui.TextInputWidget({ placeholder: 'Username' }); var srcInputStartDate = new OO.ui.TextInputWidget({ value: today + 'T00:00:00', placeholder: 'ISO start date' }); var srcInputEndDate = new OO.ui.TextInputWidget({ value: today + 'T23:59:59', placeholder: 'ISO end date' }); var srcDropProp = new OO.ui.DropdownInputWidget({ options: [] }); var $optContainer = $('<div>').addClass('wa-source-options').hide(); var $optCat = $('<div>').hide(); var $optUser = $('<div>').hide(); var $optProp = $('<div>').hide(); var chkCatPages = new OO.ui.CheckboxInputWidget({ selected: true }); var chkCatSub = new OO.ui.CheckboxInputWidget({ selected: false }); var chkCatFile = new OO.ui.CheckboxInputWidget({ selected: false }); $optCat.append($('<div>').addClass('wa-opt-label').text('Include:'), new OO.ui.FieldLayout(chkCatPages, { label: 'Pages', align: 'inline' }).$element, new OO.ui.FieldLayout(chkCatSub, { label: 'Subcats', align: 'inline' }).$element, new OO.ui.FieldLayout(chkCatFile, { label: 'Files', align: 'inline' }).$element); $optUser.append(new OO.ui.FieldLayout(srcInputUser, { label: 'User', align: 'top' }).$element, new OO.ui.FieldLayout(srcInputStartDate, { label: 'Start (Older)', align: 'top' }).$element, new OO.ui.FieldLayout(srcInputEndDate, { label: 'End (Newer)', align: 'top' }).$element); $optProp.append(new OO.ui.FieldLayout(srcDropProp, { label: 'Property', align: 'top' }).$element); var $optLinks = $('<div>').hide(); var chkLinkWiki = new OO.ui.CheckboxInputWidget({ selected: true }); var chkLinkTrans = new OO.ui.CheckboxInputWidget({ selected: false }); var chkLinkImg = new OO.ui.CheckboxInputWidget({ selected: false }); var dropLinkRedir = new OO.ui.DropdownInputWidget({ options: [{ data: 'nonredirects', label: 'No redirects' }, { data: 'all', label: 'Both' }, { data: 'redirects', label: 'Redirects only' }] }); var chkLinkToRedir = new OO.ui.CheckboxInputWidget({ selected: false }); $optLinks.append($('<div>').addClass('wa-opt-label').text('What to include:'), $('<div>').addClass('wa-opt-row').append(new OO.ui.FieldLayout(chkLinkWiki, { label: 'Wikilinks', align: 'inline' }).$element, new OO.ui.FieldLayout(chkLinkTrans, { label: 'Transclusions', align: 'inline' }).$element, new OO.ui.FieldLayout(chkLinkImg, { label: 'File usage', align: 'inline' }).$element), $('<div>').addClass('wa-opt-label').text('Redirects:'), dropLinkRedir.$element, new OO.ui.FieldLayout(chkLinkToRedir, { label: 'Include links to redirects', align: 'inline' }).$element); $optContainer.append($optCat, $optLinks, $optUser, $optProp); var queryCache = {}; var lastMode = 'cat'; srcSelect.on('change', function(newMode) { if (!isLoadingProject) { if (lastMode !== 'watchlist' && lastMode !== 'usercontribs' && lastMode !== 'pageswithprop') { queryCache[lastMode] = srcInput.getValue(); } } $optContainer.hide(); $optCat.hide(); $optLinks.hide(); $optUser.hide(); $optProp.hide(); srcInput.setDisabled(false).$element.show(); if (newMode === 'cat') { $optContainer.show(); $optCat.show(); } else if (newMode === 'linksto') { $optContainer.show(); $optLinks.show(); } else if (newMode === 'usercontribs') { $optContainer.show(); $optUser.show(); srcInput.setDisabled(true).$element.hide(); } else if (newMode === 'pageswithprop') { $optContainer.show(); $optProp.show(); srcInput.setDisabled(true).$element.hide(); if (!propNamesLoaded) { new mw.Api().get({ action: 'query', list: 'pagepropnames', ppnlimit: 'max' }).then(function(d) { if (d.query && d.query.pagepropnames) { srcDropProp.setOptions(d.query.pagepropnames.map(p => ({ data: p.propname, label: p.propname }))); propNamesLoaded = true; } }); } } if (newMode === 'watchlist') { srcInput.setValue(''); srcInput.setDisabled(true); srcInput.$input.attr('placeholder', '(No query needed)'); } else if (newMode !== 'usercontribs' && newMode !== 'pageswithprop') { srcInput.setValue(queryCache[newMode] || ''); var ph = 'Query...'; if (newMode === 'cat') ph = 'Category name'; if (newMode === 'search') ph = 'Search query...'; if (newMode === 'prefix') ph = 'Page prefix...'; if (newMode === 'linksto') ph = 'Pages linking to this title...'; if (newMode === 'linkson') ph = 'Get links from this page...'; srcInput.$input.attr('placeholder', ph); } lastMode = newMode; }); srcSelect.emit('change', srcSelect.getValue()); var $nsSelect = $('<select>').attr('id', 'wa-ns-selector').attr('multiple', 'multiple').attr('size', '8'); var nsMap = mw.config.get('wgFormattedNamespaces'); for (var id in nsMap) { if (parseInt(id) >= 0) $nsSelect.append($('<option>').val(id).text(id + ': ' + (nsMap[id] || '(Main)'))); } $nsSelect.val(['0']); var btnAdd = new OO.ui.ButtonWidget({ label: 'Add to list', icon: 'add', flags: ['primary', 'progressive'] }); var $btnRow = $('<div>').css({ 'display': 'flex', 'justify-content': 'flex-end', 'margin-top': '10px' }); var $fetchStatus = $('<span>').css({ 'margin-right': '10px', 'color': '#888', 'font-size': '0.9em', 'align-self': 'center' }).hide(); $btnRow.append($fetchStatus, btnAdd.$element); addSection('Source', $('<div>').append(new OO.ui.FieldLayout(srcSelect, { label: 'Mode', align: 'top' }).$element, new OO.ui.FieldLayout(srcInput, { label: 'Query', align: 'top' }).$element, $optContainer, $('<div>').text('Namespaces:').css({ 'font-weight': 'bold', 'margin-top': '5px' }), $nsSelect, $btnRow)); var redirMode = new OO.ui.RadioSelectWidget({ items: [new OO.ui.RadioOptionWidget({ data: 'edit', label: 'Edit the redirect page (Default)' }), new OO.ui.RadioOptionWidget({ data: 'follow', label: 'Follow redirect (Edit target)' }), new OO.ui.RadioOptionWidget({ data: 'skip', label: 'Skip redirects' })] }); redirMode.selectItemByData('edit'); var radSkipExist = new OO.ui.RadioSelectWidget({ items: [new OO.ui.RadioOptionWidget({ data: 'none', label: 'Process all' }), new OO.ui.RadioOptionWidget({ data: 'missing', label: 'Skip if page does not exist' }), new OO.ui.RadioOptionWidget({ data: 'exists', label: 'Skip if page exists' })] }); radSkipExist.selectItemByData('none'); var chkSkipNoChange = new OO.ui.CheckboxInputWidget({ selected: false }); var inpSkipContains = new OO.ui.TextInputWidget({ placeholder: 'Text/Regex for Skip if FOUND' }); var togSkipContainsRegex = new OO.ui.ToggleSwitchWidget({ value: false, title: 'Use regex' }); var inpSkipNotContains = new OO.ui.TextInputWidget({ placeholder: 'Text/Regex for Skip if MISSING' }); var togSkipNotContainsRegex = new OO.ui.ToggleSwitchWidget({ value: false, title: 'Use regex' }); var inpSkipCategories = new OO.ui.TextInputWidget({ placeholder: 'Skip if in: Category1|Category2' }); var inpSkipNotCategories = new OO.ui.TextInputWidget({ placeholder: 'Skip if NOT in: Category1|Category2' }); var $settingsPanel = $('<div>') .append($('<span>').addClass('wa-settings-header').text('Redirects')) .append(redirMode.$element) .append($('<hr>').css('border-top', '1px solid #eee')) .append($('<span>').addClass('wa-settings-header').text('Skip logic')) .append(new OO.ui.FieldLayout(chkSkipNoChange, { label: 'Skip if no changes made', align: 'inline' }).$element.css('margin-bottom', '8px')) .append(radSkipExist.$element) .append($('<hr>').css('border-top', '1px solid #eee')) .append($('<span>').addClass('wa-settings-header').text('Content filters')) .append($('<div>').addClass('wa-setting-row').append(inpSkipContains.$element.css('flex', 1), togSkipContainsRegex.$element.css('margin-left', '5px'))) .append($('<div>').addClass('wa-setting-row').append(inpSkipNotContains.$element.css('flex', 1), togSkipNotContainsRegex.$element.css('margin-left', '5px'))) .append($('<hr>').css('border-top', '1px solid #eee')) .append($('<span>').addClass('wa-settings-header').text('Category filters')) .append(new OO.ui.FieldLayout(inpSkipCategories, { label: 'Blacklist', align: 'top' }).$element) .append(new OO.ui.FieldLayout(inpSkipNotCategories, { label: 'Whitelist', align: 'top' }).$element); addSection('Skip', $settingsPanel); var dropProtMode = new OO.ui.DropdownInputWidget({ options: [{ data: 'protect', label: 'Protect (Exclude)' }, { data: 'target', label: 'Target (Edit Matches Only)' }] }); var inpTemplateFilter = new OO.ui.TextInputWidget({ placeholder: 'Regex: infobox rail line|railway' }); var $templateFilterLayout = new OO.ui.FieldLayout(inpTemplateFilter, { label: 'Template filter', align: 'top' }); var $protList = $('<div>'); var protCheckboxes = {}; PROTECTION_DEFS.forEach(function(def) { var chk = new OO.ui.CheckboxInputWidget({ selected: def.isOn }); protCheckboxes[def.id] = chk; $protList.append(new OO.ui.FieldLayout(chk, { label: def.label, align: 'inline' }).$element); }); var targetRadioItems = PROTECTION_DEFS.map(function(def) { return new OO.ui.RadioOptionWidget({ data: def.id, label: def.label }); }); var radTargetSet = new OO.ui.RadioSelectWidget({ items: targetRadioItems }); var $targetList = $('<div>').hide().append(radTargetSet.$element); dropProtMode.on('change', function(mode) { if (mode === 'protect') { $protList.show(); $targetList.hide(); } else { $protList.hide(); $targetList.show(); } }); addSection('Protection', $('<div>').addClass('wa-source-options') .append(new OO.ui.FieldLayout(dropProtMode, { label: 'Mode', align: 'top' }).$element) .append($('<hr>').css('border-top', '1px solid #eee')) .append($protList).append($targetList) .append($('<div style="margin-top:10px;">').append($templateFilterLayout.$element)) ); var $rulesList = $('<div>'); var btnAddRule = new OO.ui.ButtonWidget({ label: 'Add rule', icon: 'add' }); var rulesRegistry = []; addSection('Rules', $('<div>').append($rulesList, btnAddRule.$element)); var togWikiTypos = new OO.ui.ToggleSwitchWidget({ value: false }); var lblWikiStatus = $('<div>').css({ 'font-size': '0.9em', 'color': '#888', 'margin-top': '2px' }); var btnLoadLocal = new OO.ui.ButtonWidget({ icon: 'upload', label: 'Load file', framed: false }); var btnClearLocal = new OO.ui.ButtonWidget({ icon: 'trash', title: 'Clear local', framed: false, flags: 'destructive', disabled: true }); var lblLocalStatus = $('<div>').text('No local rules').css({ 'font-size': '0.9em', 'color': '#888', 'margin-top': '2px' }); var $typoInput = $('<input type="file">').hide().appendTo('body'); var $extRulesPanel = $('<div>').addClass('wa-source-options'); $extRulesPanel.append( $('<div>').css({ 'display': 'flex', 'align-items': 'center', 'justify-content': 'space-between' }).append($('<span>').text('Project:AutoWikiBrowser/Typos').css('font-weight', 'bold'), togWikiTypos.$element), $('<div>').css('margin-bottom', '10px').append(lblWikiStatus), $('<hr>').css('border-top', '1px solid #eee'), $('<div>').append($('<div>').css({ 'display': 'flex', 'align-items': 'center' }).append($('<span>').text('Local rules (session only)').css({ 'font-weight': 'bold' }), $('<div>').css('flex', '1'), btnLoadLocal.$element, btnClearLocal.$element), lblLocalStatus) ); addSection('External rules', $extRulesPanel); var txtPreScript = new OO.ui.MultilineTextInputWidget({ rows: 6, value: '', placeholder: '// Enter JavaScript function body here.\n// Available variables: text, vars, shared\nreturn text;' }); var txtPostScript = new OO.ui.MultilineTextInputWidget({ rows: 6, value: '', placeholder: '// Enter JavaScript function body here.\n// Available variables: text, vars, shared\nreturn text;' }); var btnLoadLib = new OO.ui.ButtonWidget({ icon: 'upload', title: 'Load library (.js)', framed: false }); var btnRemoveLib = new OO.ui.ButtonWidget({ icon: 'trash', title: 'Remove library', framed: false, flags: 'destructive' }); var txtLibStatus = new OO.ui.TextInputWidget({ value: '(No library loaded)', readOnly: true }); var $libInput = $('<input type="file" accept=".js">').hide().appendTo('body'); var btnEditLib = new OO.ui.ButtonWidget({ icon: 'edit', label: 'Edit project library', framed: false }); var $scriptPanel = $('<div>').append( $('<div>').css({ 'display': 'flex', 'align-items': 'center', 'gap': '5px', 'margin-bottom': '10px' }).append($('<span>').text('JS library:').css({ 'font-weight': 'bold', 'white-space': 'nowrap' }), txtLibStatus.$element.css('flex', '1'), btnLoadLib.$element, btnRemoveLib.$element), $('<div>').css({ 'display': 'flex', 'justify-content': 'flex-end', 'margin-bottom': '10px' }).append(btnEditLib.$element), new OO.ui.FieldLayout(txtPreScript, { label: 'Pre-Process', align: 'top' }).$element, new OO.ui.FieldLayout(txtPostScript, { label: 'Post-Process', align: 'top' }).$element ); addSection('Scripts', $scriptPanel); function updateLibUI() { if (currentLibrary.code) { txtLibStatus.setValue(currentLibrary.name); btnRemoveLib.setDisabled(false); } else { txtLibStatus.setValue('(No library loaded)'); btnRemoveLib.setDisabled(true); } } updateLibUI(); function LibraryEditorDialog(config) { LibraryEditorDialog.super.call(this, config); } OO.inheritClass(LibraryEditorDialog, OO.ui.ProcessDialog); LibraryEditorDialog.static.name = 'libraryEditor'; LibraryEditorDialog.static.title = 'Edit project library'; LibraryEditorDialog.static.actions = [{ action: 'save', label: 'Save', flags: ['primary', 'progressive'] }, { label: 'Cancel', flags: 'safe' } ]; LibraryEditorDialog.prototype.initialize = function() { LibraryEditorDialog.super.prototype.initialize.call(this); this.$element.addClass('wa-lib-dialog'); // Attach our custom CSS override class this.panel = new OO.ui.PanelLayout({ padded: true, expanded: true }); this.$editorWrapper = $('<div>').addClass('wa-lib-editorwrapper'); this.panel.$element.append(this.$editorWrapper); this.$body.append(this.panel.$element); }; LibraryEditorDialog.prototype.getSetupProcess = function(data) { data = data || {}; return LibraryEditorDialog.super.prototype.getSetupProcess.call(this, data) .next(function() { var self = this; self.$editorWrapper.empty(); // Create a textarea for the MediaWiki CM wrapper to properly bind to var $libTextArea = $('<textarea>').appendTo(self.$editorWrapper); var initCode = currentLibrary.code || "// All custom library functions defined here will be passed to the worker.\n// Special functions:\n// function wAwB_Pre(text, vars, shared) { return text; }\n// function wAwB_Post(text, vars, shared) { return text; }\n"; return mw.loader.using(['ext.CodeMirror', 'ext.CodeMirror.modes']).then(function(require) { var CM = require('ext.CodeMirror'); var modes = require('ext.CodeMirror.modes'); self.cmInstance = new CM($libTextArea[0], modes.javascript()); self.cmInstance.initialize(); self.cmInstance.view.dispatch({ changes: { from: 0, insert: initCode } }); // Force CodeMirror to fill the wrapper self.$editorWrapper.find('.cm-editor').css({ height: '100%' }); }).catch(function(err) { console.error("wAwB CM Init Error:", err); }); }, this); }; LibraryEditorDialog.prototype.getActionProcess = function(action) { var dialog = this; if (action === 'save') { return new OO.ui.Process(function() { var newCode = ""; if (dialog.cmInstance) { newCode = dialog.cmInstance.view.state.doc.toString(); } if (newCode.trim() === "") { currentLibrary = { name: null, code: null }; } else { currentLibrary.code = newCode; currentLibrary.name = "custom code"; } updateLibUI(); dialog.close({ action: action }); }); } if (action === 'cancel' || !action) { return new OO.ui.Process(function() { dialog.close({ action: action }); }); } return LibraryEditorDialog.super.prototype.getActionProcess.call(this, action); }; LibraryEditorDialog.prototype.getTeardownProcess = function(data) { return LibraryEditorDialog.super.prototype.getTeardownProcess.call(this, data) .next(function() { if (this.cmInstance) { try { this.cmInstance.view.destroy(); } catch (e) {} this.cmInstance = null; } }, this); }; var windowManager = new OO.ui.WindowManager(); $('body').append(windowManager.$element); var libDialog = new LibraryEditorDialog(); windowManager.addWindows([libDialog]); btnEditLib.on('click', function() { windowManager.openWindow(libDialog); }); var togAdminEnable = new OO.ui.ToggleSwitchWidget({ value: false }); var chkMovRedirect = new OO.ui.CheckboxInputWidget({ selected: false }); var chkMovTalk = new OO.ui.CheckboxInputWidget({ selected: true }); var chkMovSub = new OO.ui.CheckboxInputWidget({ selected: false }); var chkDelTalk = new OO.ui.CheckboxInputWidget({ selected: true }); var dropProtEdit = new OO.ui.DropdownInputWidget({ options: [{ data: '', label: '(No Change)' }, { data: 'all', label: 'All' }, { data: 'autoconfirmed', label: 'Autoconfirmed' }, { data: 'sysop', label: 'Sysop' }] }); var dropProtMove = new OO.ui.DropdownInputWidget({ options: [{ data: '', label: '(No Change)' }, { data: 'all', label: 'All' }, { data: 'autoconfirmed', label: 'Autoconfirmed' }, { data: 'sysop', label: 'Sysop' }] }); var inpProtExpiry = new OO.ui.TextInputWidget({ placeholder: 'infinite / 2 days / 12 hours' }); if (CAN_MOVE || IS_ADMIN) { var $adminPanel = $('<div>').append( $('<div>').css({ 'display': 'flex', 'align-items': 'center', 'justify-content': 'flex-start', 'gap': '10px' }).append($('<span>').text('Enable page actions').css('font-weight', 'bold'), togAdminEnable.$element), $('<hr>') ); if (CAN_MOVE) { $adminPanel.append( $('<strong>').text('Move options:'), new OO.ui.FieldLayout(chkMovRedirect, { label: 'Do not create redirect', align: 'inline' }).$element, new OO.ui.FieldLayout(chkMovTalk, { label: 'Move talk page', align: 'inline' }).$element, new OO.ui.FieldLayout(chkMovSub, { label: 'Move subpages', align: 'inline' }).$element, $('<br>') ); } if (IS_ADMIN) { $adminPanel.append( $('<strong>').text('Delete options:'), new OO.ui.FieldLayout(chkDelTalk, { label: 'Delete talk page', align: 'inline' }).$element, $('<br>'), $('<strong>').text('Protect options:'), new OO.ui.FieldLayout(dropProtEdit, { label: 'Edit level', align: 'top' }).$element, new OO.ui.FieldLayout(dropProtMove, { label: 'Move level', align: 'top' }).$element, new OO.ui.FieldLayout(inpProtExpiry, { label: 'Expiry', align: 'top' }).$element ); } addSection('Page actions', $adminPanel); } var btnPower = new OO.ui.ButtonWidget({ label: 'Start', icon: 'power', flags: ['primary', 'progressive'], title: 'Start editing', accessKey: 'a' }); var btnDiff = new OO.ui.ButtonWidget({ label: 'Diff', icon: 'update', title: 'Show diff', accessKey: 'd' }); var btnSkip = new OO.ui.ButtonWidget({ label: 'Next', icon: 'next', title: 'Skip to next page', accessKey: 'n', disabled: true }); var btnPreview = new OO.ui.ButtonWidget({ label: 'Preview', icon: 'article', title: 'Preview page', accessKey: 'p' }); var btnSave = new OO.ui.ButtonWidget({ label: 'Save', icon: 'upload', flags: 'progressive', title: 'Save edit', accessKey: 's', disabled: true }); var inputSummary = new OO.ui.TextInputWidget({ placeholder: '', value: '', title: 'Enter edit summary', accessKey: 'b' }); var $sumLayout = new OO.ui.FieldLayout(inputSummary, { label: 'Edit summary', align: 'top' }).$element; $sumLayout.css('margin-bottom', '6px'); var listTextarea = new OO.ui.MultilineTextInputWidget({ rows: 15, classes: ['wa-page-list-raw'] }); var btnSort = new OO.ui.ButtonWidget({ icon: 'sortVertical', title: 'Sort list', framed: false }); var btnDedup = new OO.ui.ButtonWidget({ icon: 'funnel', title: 'Remove duplicates', framed: false }); var btnClear = new OO.ui.ButtonWidget({ icon: 'trash', title: 'Clear list', framed: false }); var btnPreParse = new OO.ui.ButtonWidget({ label: 'Pre-parse', title: 'Process list in background', icon: 'robot', framed: false }); var $listCounter = $('<span>').addClass('wa-list-counter').text('0 pages'); var togAutoSave = new OO.ui.ToggleSwitchWidget({ value: false }); var txtAutoDelay = new OO.ui.TextInputWidget({ value: '10' }); var $botRow = $('<div>').addClass('wa-bot-row').hide(); if (PERMS.allowBot) { $botRow.show().append($('<span>').css('font-weight', 'bold').text('Bot mode: '), togAutoSave.$element, $('<span>').text('Delay (s):'), txtAutoDelay.$element.css('max-width', '40px')); togAutoSave.on('change', function(v) { if (v) txtAutoDelay.setValue('10'); }); } var sortAsc = true; var $procHeader = $('<div>').addClass('wa-section-header').attr('id', 'wa-proc-header').css({ 'display': 'flex', 'justify-content': 'space-between', 'align-items': 'center' }); var $procTitle = $('<span>').attr('id', 'wa-proc-title').text('Processing'); var chkMinor = new OO.ui.CheckboxInputWidget({ selected: true, title: 'Minor edit' }); var $minorLayout = new OO.ui.FieldLayout(chkMinor, { label: 'm', align: 'inline', title: 'Minor edit' }); $minorLayout.$element.css({ 'margin-right': '15px', 'font-weight': 'normal' }); $procHeader.append($procTitle, $minorLayout.$element); var $procContent = $('<div>').attr('id', 'wa-proc-content').append( $sumLayout, $botRow, $('<div>').addClass('wa-grid-container').append( $('<div>').addClass('wa-grid-col').append(btnPower.$element), $('<div>').addClass('wa-grid-col').append(btnDiff.$element, btnSkip.$element), $('<div>').addClass('wa-grid-col').append(btnPreview.$element, btnSave.$element) ), $('<div>').addClass('wa-toolbar').append($listCounter, btnSort.$element, btnDedup.$element, btnClear.$element), listTextarea.$element, $('<div>').css({ 'margin-top': '5px' }).append(btnPreParse.$element) ); $content.append($procHeader, $procContent); var configWidgets = [ srcSelect, srcInput, srcInputUser, srcInputStartDate, srcInputEndDate, srcDropProp, chkCatPages, chkCatSub, chkCatFile, chkLinkWiki, chkLinkTrans, chkLinkImg, dropLinkRedir, chkLinkToRedir, btnAdd, redirMode, chkSkipNoChange, radSkipExist, inpSkipContains, togSkipContainsRegex, inpSkipNotContains, togSkipNotContainsRegex, inpSkipCategories, inpSkipNotCategories, dropProtMode, radTargetSet, inpTemplateFilter, btnAddRule, txtPreScript, txtPostScript, chkMovRedirect, chkMovTalk, chkMovSub, chkDelTalk, dropProtEdit, dropProtMove, inpProtExpiry, togWikiTypos, btnLoadLocal, btnClearLocal, btnPreParse ]; // ===================================================================== // 5. FUNCTION DEFINITIONS (Core Logic) // ===================================================================== function checkSummaryWarning() { var val = inputSummary.getValue(); var isBlank = !val || val.trim() === ""; if (isBlank || hasNewSources) inputSummary.$element.addClass('wa-summary-warning'); else inputSummary.$element.removeClass('wa-summary-warning'); } function renderCurrentView() { if (currentViewMode === 'preview') renderPreview(); else renderDiff(); } function toggleConfig(isLocked) { configWidgets.forEach(function(w) { if (w instanceof OO.ui.TextInputWidget || w instanceof OO.ui.MultilineTextInputWidget) { w.setReadOnly(isLocked); w.$element.css('opacity', isLocked ? 0.8 : 1); } else { w.setDisabled(isLocked); } }); $nsSelect.prop('disabled', isLocked); for (var key in protCheckboxes) protCheckboxes[key].setDisabled(isLocked); rulesRegistry.forEach(function(r) { r.find.setReadOnly(isLocked); r.rep.setReadOnly(isLocked); r.regex.setDisabled(isLocked); r.flags.setReadOnly(isLocked); r.enable.setDisabled(isLocked); r.del.setDisabled(isLocked); r.btnFunc.setDisabled(isLocked || !r.regex.getValue()); r.btnUp.setDisabled(isLocked || rulesRegistry.indexOf(r) === 0); r.btnDown.setDisabled(isLocked || rulesRegistry.indexOf(r) === rulesRegistry.length - 1); }); if (CAN_MOVE || IS_ADMIN) togAdminEnable.setDisabled(isLocked); btnLoadLib.setDisabled(isLocked); btnRemoveLib.setDisabled(isLocked || !currentLibrary.code); btnEditLib.setDisabled(isLocked); btnLoadLocal.setDisabled(isLocked); btnClearLocal.setDisabled(isLocked || localTypos.length === 0); } function updateListCount() { var val = listTextarea.getValue(); var count = val.trim() ? val.split('\n').filter(function(l) { var line = l.trim(); return line !== "" && !line.startsWith("####"); }).length : 0; $listCounter.text(count + ' pages'); } listTextarea.on('change', updateListCount); function updateDirtyState() { if (isRunning && currentTitle && Editor.getValue() !== originalWikitext) $editorHeader.addClass('wa-dirty'); else $editorHeader.removeClass('wa-dirty'); } function removeTopLine() { var l = listTextarea.getValue().split('\n'); l.shift(); listTextarea.setValue(l.join('\n')); updateListCount(); } function updateInterfaceMode() { var isAdminMode = togAdminEnable.getValue(); var pageLoaded = !!currentTitle; btnSave.setDisabled(isAdminMode || !pageLoaded || !PERMS.canSave); btnSkip.setDisabled(!pageLoaded); btnPreview.setDisabled(!pageLoaded); btnDiff.setDisabled(isAdminMode || !pageLoaded); Editor.setDisabled(isAdminMode || !pageLoaded); if (CAN_MOVE) { var allowAdmin = isAdminMode && currentPageExists; btnAdminMove.setDisabled(!(allowAdmin && currentVars['$xA'])); if (currentVars['$xA']) btnAdminMove.setTitle('Move page to ' + currentVars['$xA']); else btnAdminMove.setTitle('Move page to $xA (Variable not set)'); } if (IS_ADMIN) { var allowAdmin = isAdminMode && currentPageExists; btnAdminDel.setDisabled(!allowAdmin); btnAdminProt.setDisabled(!allowAdmin); } } function renderDiff() { $visualOut.html('<div style="color:#888; text-align:center;">Generating Diff...</div>'); var currentText = Editor.getValue(); new mw.Api().post({ 'action': 'compare', fromtitle: currentTitle, toslots: 'main', 'totext-main': currentText, slots: 'main', topst: window.wa_diffPST ? true : undefined, prop: 'diff', formatversion: 2 }).then(function(data) { var diffBody = data.compare && data.compare.bodies && data.compare.bodies.main; if (diffBody) { $visualOut.html('<h4>Diff: ' + currentTitle + '</h4><table class="diff"><colgroup><col class="diff-marker"><col class="diff-content"><col class="diff-marker"><col class="diff-content"></colgroup><tbody>' + diffBody + '</tbody></table>'); processDiffTable(); } else { $visualOut.html('<div style="color:green; text-align:center; padding-top:20px;">No Changes detected</div>'); } }); } function processDiffTable() { var rightLineNum = 0; $visualOut.find('table.diff tr').each(function() { var $tr = $(this); var $linenos = $tr.find('td.diff-lineno'); if ($linenos.length > 0) { var txt = $linenos.last().text(); var m = txt.match(/(\d+)/); if (m) rightLineNum = parseInt(m[1]); return; } if ($tr.find('.diff-addedline').length > 0 || $tr.find('.diff-context').length > 0) { $tr.attr('data-line', rightLineNum); $tr.css('cursor', 'pointer').attr('title', 'Jump to line ' + rightLineNum); rightLineNum++; } }); // Attach a single delegated click listener to the table instead of every row $visualOut.find('table.diff').on('click', 'tr[data-line]', function() { Editor.scrollToLine(parseInt($(this).attr('data-line'))); }); } function renderPreview() { $visualOut.html('<div style="color:#888; text-align:center;">Generating Preview...</div>'); new mw.Api().post({ action: 'parse', title: currentTitle, text: Editor.getValue(), prop: 'text|categorieshtml|modules|jsconfigvars', useskin: mw.config.get('skin'), disablelimitreport: true, pst: true, contentmodel: 'wikitext' }).then(function(data) { if (data.parse && data.parse.text) { var $prev = $('<div>').html(data.parse.text['*']); if (data.parse.categorieshtml) $prev.append(data.parse.categorieshtml['*']); $prev.find('a').attr('target', '_blank'); $visualOut.empty().append($prev); mw.loader.using(data.parse.modules.concat(data.parse.modulestyles, data.parse.modulescripts), function() { mw.hook('wikipage.content').fire($('.wa-visual-output .mw-parser-output')); }); } }).catch(function(err) { $visualOut.html('Error generating preview.'); alert("Preview failed: " + err); }); } async function transformPageText(rawText, title, config) { var filters = config.filters; if (filters) { var check = function(text, rule) { if (!rule || !rule.val) return false; if (rule.regex) { try { return new RegExp(rule.val, 'mu').test(text); } catch (e) { return false; } } return text.indexOf(rule.val) !== -1; }; if (filters.skipContains && filters.skipContains.val && check(rawText, filters.skipContains)) { return { skipped: true, reason: 'Contains: ' + filters.skipContains.val }; } if (filters.skipNotContains && filters.skipNotContains.val && !check(rawText, filters.skipNotContains)) { return { skipped: true, reason: 'Missing: ' + filters.skipNotContains.val }; } } var mode = config.mode; var inputs = []; var compiledSpecies = null; if (config.templateFilter) { var tFilter = config.templateFilter; if (tFilter[0] === "^") tFilter = "^\\{\\{\\s*" + tFilter.slice(1); else tFilter = "\\{\\{\\s*" + tFilter; compiledSpecies = tFilter + "(?=\\s*[|}\\n])"; } var skeleton = PageProtector.protect(rawText, mode, config.excludes, compiledSpecies); if (mode === 'target') inputs = PageProtector.store; else inputs = [skeleton]; var combinedRules = rulesRegistry.filter(r => r.isActive()).map(r => ({ find: r.find.getValue(), replace: r.rep.getValue(), regex: r.regex.getValue(), flags: r.flags.getValue(), enabled: r.isActive(), isFunc: r.isFunc() })); if (togWikiTypos.getValue()) combinedRules = combinedRules.concat(wikiTypos); if (localTypos.length > 0) combinedRules = combinedRules.concat(localTypos); var payload = { texts: inputs, vars: config.vars, preCode: getUserCode(txtPreScript, 'wAwB_Pre'), libraryCode: currentLibrary.code, rules: combinedRules, postCode: getUserCode(txtPostScript, 'wAwB_Post') }; var result = await WorkerEngine.run(payload); if (result.skipped) return { skipped: true, reason: result.reason }; var finalText = ""; if (mode === 'target') { PageProtector.store = result.texts; finalText = PageProtector.restore(skeleton); } else { finalText = PageProtector.restore(result.texts[0]); } return { skipped: false, text: finalText, summaryAppend: result.summaryAppend, summaryOverride: result.summaryOverride }; } async function processPageContent() { try { setStatus('Processing...', 'working'); var mode = dropProtMode.getValue(); var activeConfig = { mode: mode, excludes: {}, templateFilter: inpTemplateFilter.getValue().trim(), vars: currentVars, filters: { skipContains: { val: inpSkipContains.getValue(), regex: togSkipContainsRegex.getValue() }, skipNotContains: { val: inpSkipNotContains.getValue(), regex: togSkipNotContainsRegex.getValue() } } }; if (mode === 'protect') { for (var k in protCheckboxes) activeConfig.excludes[k] = protCheckboxes[k].isSelected(); } else { var sel = radTargetSet.findSelectedItem(); activeConfig.excludes = sel ? sel.getData() : null; } var res = await transformPageText(originalWikitext, currentTitle, activeConfig); if (res.skipped) { removeTopLine(); loadNextPage(); return; } currentPageSummaryAppend = res.summaryAppend || ""; currentPageSummaryOverride = res.summaryOverride || null; updateSummaryPreview(inputSummary.getValue()); if (chkSkipNoChange.isSelected() && res.text === originalWikitext) { removeTopLine(); loadNextPage(); return; } setStatus('Ready'); Editor.setValue(res.text); if (CAN_MOVE || IS_ADMIN) updateInterfaceMode(); else { Editor.setDisabled(false); btnSave.setDisabled(!PERMS.canSave); btnSkip.setDisabled(false); btnPreview.setDisabled(false); btnDiff.setDisabled(false); } updateDirtyState(); renderCurrentView(); if (PERMS.allowBot && togAutoSave.getValue()) { var delay = Math.max(0, parseInt(txtAutoDelay.getValue(), 10) || 0) * 1000; setStatus('Auto-save in ' + (delay / 1000) + 's...', 'working'); if (autoSaveTimer) clearTimeout(autoSaveTimer); autoSaveTimer = setTimeout(function() { if (isRunning && PERMS.canSave) { btnSave.emit('click'); } }, delay); } } catch (e) { setStatus('Error', 'error'); alert(e); btnPower.emit('click'); } } async function runPreParseBatch() { // 1. Toggle / Stop Logic if (isRunning) { isRunning = false; setStatus('Stopping...', 'working'); btnPreParse.setLabel('Pre-parse'); return; } // 2. Start & Deduplicate var currentVal = listTextarea.getValue(); var cleanVal = getDeduplicatedList(currentVal).join('\n'); listTextarea.setValue(cleanVal); updateListCount(); isRunning = true; toggleUI(true); // 3. Lock UI toggleUI(true); btnSkip.setDisabled(true); btnDiff.setDisabled(true); btnPreview.setDisabled(true); btnSave.setDisabled(true); Editor.setDisabled(true); btnPreParse.setLabel('Stop pre-parse'); // Inject STOP marker if not present var currentList = listTextarea.getValue().split('\n'); if (!currentList.includes('####STOP')) { currentList.push('####STOP'); listTextarea.setValue(currentList.join('\n')); } // Gather Config var activeConfig = { mode: dropProtMode.getValue(), excludes: {}, templateFilter: inpTemplateFilter.getValue().trim(), vars: {}, filters: { skipContains: { val: inpSkipContains.getValue(), regex: togSkipContainsRegex.getValue() }, skipNotContains: { val: inpSkipNotContains.getValue(), regex: togSkipNotContainsRegex.getValue() } } }; if (activeConfig.mode === 'protect') { for (var k in protCheckboxes) activeConfig.excludes[k] = protCheckboxes[k].isSelected(); } else { var sel = radTargetSet.findSelectedItem(); activeConfig.excludes = sel ? sel.getData() : null; } setStatus('Pre-parsing...', 'working'); while (isRunning) { var lines = listTextarea.getValue().split('\n'); var batchTitles = []; var stopFound = false; for (var i = 0; i < lines.length; i++) { var line = lines[i]; if (line === '####STOP') { stopFound = true; break; } if (line && !line.startsWith('####')) { var parts = line.split('|'); batchTitles.push({ fullLine: line, title: parts[0], vars: parts.slice(1) }); } if (batchTitles.length >= 50) break; } if (batchTitles.length === 0) { if (stopFound) setStatus('Pre-parse complete'); else setStatus('List empty'); break; } $listCounter.text('Fetching ' + batchTitles.length + '...'); var badCats = inpSkipCategories.getValue().split('|').map(s => s.trim()).filter(s => s); var reqCats = inpSkipNotCategories.getValue().split('|').map(s => s.trim()).filter(s => s); var api = new mw.Api(); try { var data = await api.get({ action: 'query', prop: 'revisions' + (badCats.length + reqCats.length > 0 ? '|categories' : ''), titles: batchTitles.map(t => t.title).join('|'), rvprop: 'content', rvslots: 'main', redirects: 1, cllimit: 'max' }); var pageMap = {}; if (data.query && data.query.pages) Object.values(data.query.pages).forEach(p => pageMap[p.title] = p); var redirMap = {}; if (data.query && data.query.redirects) data.query.redirects.forEach(r => redirMap[r.from] = r.to); var keptLines = []; for (var k = 0; k < batchTitles.length; k++) { var item = batchTitles[k]; var lookupTitle = redirMap[item.title] || item.title; var page = pageMap[lookupTitle]; if (!page || page.missing || page.invalid || !page.revisions || !page.revisions[0]) { console.warn("Skipping invalid/missing page:", item.title); continue; } var pageCats = new Set((page.categories || []).map(c => c.title.replace(/^[^:]+:/, '').trim())); if (badCats.some(c => pageCats.has(c))) continue; // Skip if (reqCats.length > 0 && !reqCats.some(c => pageCats.has(c))) continue; // Skip var rawText = page.revisions[0].slots.main['*']; activeConfig.vars = { '$xx': item.title }; item.vars.forEach((v, idx) => activeConfig.vars['$x' + String.fromCharCode(65 + idx)] = v); var res = await transformPageText(rawText, item.title, activeConfig); // UPDATED LOGIC: Respect "Skip if no change" checkbox if (!res.skipped && (!chkSkipNoChange.isSelected() || res.text !== rawText)) { keptLines.push(item.fullLine); } } var freshLines = listTextarea.getValue().split('\n'); var stopIndex = -1; for (var x = 0; x < freshLines.length; x++) { if (freshLines[x] === '####STOP') { stopIndex = x; break; } } if (stopIndex > -1) { var topChunk = freshLines.slice(0, stopIndex); var botChunk = freshLines.slice(stopIndex + 1); var processedSet = new Set(batchTitles.map(t => t.fullLine)); var newTop = topChunk.filter(l => !processedSet.has(l)); var newList = newTop.concat(['####STOP']).concat(botChunk).concat(keptLines); listTextarea.setValue(newList.join('\n')); updateListCount(); } } catch (e) { console.error(e); setStatus('Batch error: ' + e, 'error'); break; } } isRunning = false; toggleUI(false); WorkerEngine.destroy(); btnPreParse.setLabel('Pre-parse'); if (listTextarea.getValue().startsWith('####STOP')) setStatus('Pre-parse done!'); else setStatus('Stopped'); } btnPreParse.on('click', runPreParseBatch); function loadNextPage() { if (!isRunning) return; var allLines = listTextarea.getValue().split('\n'); var listChanged = false; var stopCommand = false; while (allLines.length > 0) { var line = allLines[0]; if (line === '####STOP') { stopCommand = true; break; } if (line.startsWith('####') || line === "") { allLines.shift(); listChanged = true; } else { break; } } if (listChanged) { listTextarea.setValue(allLines.join('\n')); updateListCount(); } if (stopCommand) { btnPower.emit('click'); setStatus("Stopped by ####STOP"); return; } if (allLines.length === 0) { btnPower.emit('click'); setStatus("Done!"); return; } var raw = allLines[0]; var parts = raw.split('|'); currentTitle = parts[0].trim(); baseRevId = 0; originalWikitext = ""; if (!currentTitle) { removeTopLine(); loadNextPage(); return; } currentVars = {}; currentVars['$xx'] = currentTitle; for (var i = 1; i < parts.length; i++) currentVars['$x' + String.fromCharCode(64 + i)] = parts[i]; currentPageSummaryAppend = ""; currentPageSummaryOverride = null; updateSummaryPreview(inputSummary.getValue()); setStatus('Loading...', 'working'); btnSave.setDisabled(true); btnPreview.setDisabled(true); btnDiff.setDisabled(true); btnSkip.setDisabled(true); Editor.setDisabled(true); $titleLink.attr('href', mw.util.getUrl(currentTitle)).text(currentTitle); $editorHeader.removeClass('wa-dirty'); $visualOut.empty(); Editor.setValue('Loading...'); $infoContainer.empty(); currentPageExists = false; btnWatch.setDisabled(true); btnManualEdit.setDisabled(true); if (CAN_MOVE || IS_ADMIN) updateInterfaceMode(); var badCats = inpSkipCategories.getValue().split('|').map(s => s.trim()).filter(s => s); var reqCats = inpSkipNotCategories.getValue().split('|').map(s => s.trim()).filter(s => s); var api = new mw.Api(); var params = { action: 'query', prop: 'revisions|info' + (badCats.length + reqCats.length > 0 ? '|categories' : ''), titles: currentTitle, rvprop: 'content|timestamp|ids', rvslots: 'main', inprop: 'watched', cllimit: 'max' }; var rMode = redirMode.findSelectedItem().getData(); if (rMode === 'follow') params.redirects = 1; return api.get(params).then(async function(data) { var pid = Object.keys(data.query.pages)[0]; var page = data.query.pages[pid]; currentPageExists = !page.missing && !page.invalid; var pageCats = new Set((page.categories || []).map(c => c.title.replace(/^[^:]+:/, '').trim())); if (badCats.some(c => pageCats.has(c))) { setStatus('Skip: cat blacklist'); removeTopLine(); loadNextPage(); return; } if (reqCats.length > 0 && !reqCats.some(c => pageCats.has(c))) { setStatus('Skip: cat whitelist'); removeTopLine(); loadNextPage(); return; } if (rMode === 'follow' && data.query.redirects) { currentTitle = page.title; $titleLink.attr('href', mw.util.getUrl(currentTitle)).text(currentTitle); mw.notify('Redirect followed to: ' + currentTitle); } if (rMode === 'skip' && page.redirect !== undefined) { removeTopLine(); loadNextPage(); return; } var skipMode = radSkipExist.findSelectedItem().getData(); if (pid === "-1") { if (skipMode === 'missing') { removeTopLine(); loadNextPage(); return; } originalWikitext = ""; baseRevId = 0; } else { if (skipMode === 'exists') { removeTopLine(); loadNextPage(); return; } originalWikitext = page.revisions[0].slots.main['*']; baseRevId = page.revisions[0].revid; } if (page.revisions && page.revisions.length > 0) { var rev = page.revisions[0]; var ts = new Date(rev.timestamp).toISOString().replace('T', ' ').substring(0, 16); $infoContainer.empty().append('Last edit: ' + ts + ' | ', $('<a>').attr('href', mw.util.getUrl(currentTitle, { action: 'history' })).attr('target', '_blank').text('history')); } btnWatch.setDisabled(!currentPageExists); btnManualEdit.setDisabled(!currentPageExists); if (page.watched !== undefined) btnWatch.setIcon('unStar'); else btnWatch.setIcon('star'); if (CAN_MOVE || IS_ADMIN) { updateInterfaceMode(); if (togAdminEnable.getValue()) { Editor.setValue(originalWikitext); renderCurrentView(); setStatus('Ready (Page actions)'); return; } } processPageContent(); }).catch(function(e) { setStatus('API error', 'error'); alert('Load error: ' + e); btnPower.emit('click'); }); } async function fetchWithContinue(api, params) { var allTitles = new Set(); var continueToken = {}; var safetyLimit = FETCH_SAFETY_LIMIT; var count = 0; isFetching = true; btnAdd.setLabel('Cancel fetch'); $fetchStatus.text('Fetching...').show(); try { while (isFetching && count < safetyLimit) { var merged = Object.assign({}, params, continueToken); var data = await api.get(merged); var batch = []; if (data.watchlistraw) batch = data.watchlistraw; else if (data.query) { if (data.query.pages) batch = Object.values(data.query.pages); else if (data.query.categorymembers) batch = data.query.categorymembers; else if (data.query.backlinks) batch = data.query.backlinks; else if (data.query.embeddedin) batch = data.query.embeddedin; else if (data.query.imageusage) batch = data.query.imageusage; else if (data.query.search) batch = data.query.search; else if (data.query.allpages) batch = data.query.allpages; else if (data.query.usercontribs) batch = data.query.usercontribs; else if (data.query.pageswithprop) batch = data.query.pageswithprop; } if (batch.length > 0) { batch.forEach(item => { if (item.title) allTitles.add(item.title); }); count = allTitles.size; $fetchStatus.text('Fetched ' + count + '...'); } if (data.continue) continueToken = data.continue; else break; } } catch (e) { alert("Fetch interrupted: " + e); } isFetching = false; btnAdd.setLabel('Add to list').setDisabled(false); $fetchStatus.text('Added ' + allTitles.size + ' pages').delay(3000).fadeOut(); if (allTitles.size > 0) { hasNewSources = true; checkSummaryWarning(); } return Array.from(allTitles); } function toggleUI(d) { if (d) { btnPower.setLabel('Stop').setIcon('power').setFlags(['destructive']); } else { btnPower.setLabel('Start').setIcon('power').clearFlags().setFlags(['primary', 'progressive']); if (PERMS.allowBot) togAutoSave.setValue(false); } toggleConfig(d); btnSort.setDisabled(d); btnDedup.setDisabled(d); btnClear.setDisabled(d); btnSaveProj.setDisabled(d); btnLoadProj.setDisabled(d); btnSkip.setDisabled(!d); btnSave.setDisabled(true); listTextarea.setReadOnly(d); if (d) listTextarea.$element.addClass('wa-list-running'); else listTextarea.$element.removeClass('wa-list-running'); } function resetPanels() { Editor.setValue(''); $titleLink.text('Page content').removeAttr('href'); $editorHeader.removeClass('wa-dirty'); setStatus('Ready'); $('#wa-summary-preview').val(''); currentTitle = null; $visualOut.html('<div style="color:#aaa; text-align:center; margin-top:50px;">Ready...</div>'); $infoContainer.empty(); btnWatch.setDisabled(true); btnManualEdit.setDisabled(true); Editor.setDisabled(true); currentPageExists = false; if (CAN_MOVE || IS_ADMIN) updateInterfaceMode(); toggleUI(false); updateListCount(); if (autoSaveTimer) clearTimeout(autoSaveTimer); } function arrayMove(arr, old_index, new_index) { if (new_index >= arr.length) { var k = new_index - arr.length + 1; while (k--) arr.push(undefined); } arr.splice(new_index, 0, arr.splice(old_index, 1)[0]); } function updateRuleButtons() { rulesRegistry.forEach(function(item, idx) { item.btnUp.setDisabled(idx === 0); item.btnDown.setDisabled(idx === rulesRegistry.length - 1); }); } function addRule() { var row = $('<div>').addClass('wa-rule-row'); var controls = $('<div>').addClass('wa-rule-controls'); var btnUp = new OO.ui.ButtonWidget({ icon: 'collapse', framed: false, title: 'Move up', classes: ['wa-rule-btn'] }); var btnDown = new OO.ui.ButtonWidget({ icon: 'expand', framed: false, title: 'Move down', classes: ['wa-rule-btn'] }); controls.append(btnUp.$element, btnDown.$element); var contentDiv = $('<div>').addClass('wa-rule-content'); var f = new OO.ui.TextInputWidget({ placeholder: 'Find' }); var r = new OO.ui.TextInputWidget({ placeholder: 'Replace' }); var reg = new OO.ui.ToggleSwitchWidget(); var fl = new OO.ui.TextInputWidget({ value: 'gmu', disabled: true }).toggle(false); var btnEnable = new OO.ui.ButtonWidget({ icon: 'power', framed: false, title: 'Toggle rule', flags: ['progressive'] }); var isRuleActive = true; var btnFunc = new OO.ui.ButtonWidget({ icon: 'code', framed: false, title: 'Toggle JS mode', disabled: true }); var isRuleFunc = false; var toggleRule = function(forceVal) { var val = (forceVal !== undefined) ? forceVal : !isRuleActive; isRuleActive = val; row.css('opacity', isRuleActive ? 1 : 0.5); if (isRuleActive) btnEnable.setFlags(['progressive']); else btnEnable.clearFlags(); }; btnEnable.on('click', function() { toggleRule(); }); var toggleFunc = function(forceVal) { var val = (forceVal !== undefined) ? forceVal : !isRuleFunc; isRuleFunc = val; if (isRuleFunc) { btnFunc.setFlags(['progressive']); r.$input.attr('placeholder', 'return match.toUpperCase();'); } else { btnFunc.clearFlags(); r.$input.attr('placeholder', 'Replace'); } }; btnFunc.on('click', function() { toggleFunc(); }); btnFunc.toggle(false); reg.on('change', function(v) { fl.setDisabled(!v); fl.toggle(v); btnFunc.setDisabled(!v); if (!v) { btnFunc.toggle(false); if (isRuleFunc) toggleFunc(false); } else btnFunc.toggle(true); }); var del = new OO.ui.ButtonWidget({ icon: 'trash', flags: 'destructive', framed: false, title: 'Delete rule', }); del.on('click', function() { row.fadeOut(200, function() { row.remove(); rulesRegistry = rulesRegistry.filter(x => x.row !== row); updateRuleButtons(); }); }); contentDiv.append(f.$element, $('<div>').css('margin-top', '3px').append(r.$element), $('<div>').addClass('wa-rule-opt-row').append($('<div>').css({ 'display': 'flex', 'align-items': 'center' }).append($('<div>').css({ 'display': 'flex', 'align-items': 'center' }).append($('<span>').text('Regex: ').css({ 'font-size': '0.8em', 'margin-right': '4px' }), reg.$element, fl.$element.css({ 'width': '50px', 'margin-left': '5px' })), btnFunc.$element.css('margin-left', '10px')), $('<div>').css('display', 'flex').append(btnEnable.$element, del.$element))); row.append(controls, contentDiv); $rulesList.append(row); var ruleItem = { row: row, find: f, rep: r, regex: reg, flags: fl, btnUp: btnUp, btnDown: btnDown, enable: btnEnable, del: del, btnFunc: btnFunc, isActive: function() { return isRuleActive; }, setActive: toggleRule, isFunc: function() { return isRuleFunc; }, setFunc: toggleFunc }; rulesRegistry.push(ruleItem); btnUp.on('click', function() { var idx = rulesRegistry.indexOf(ruleItem); if (idx > 0) { var prevRow = rulesRegistry[idx - 1].row; row.fadeOut(150, function() { row.insertBefore(prevRow).fadeIn(150).addClass('wa-highlight'); setTimeout(function() { row.removeClass('wa-highlight'); }, 500); }); arrayMove(rulesRegistry, idx, idx - 1); updateRuleButtons(); } }); btnDown.on('click', function() { var idx = rulesRegistry.indexOf(ruleItem); if (idx < rulesRegistry.length - 1) { var nextRow = rulesRegistry[idx + 1].row; row.fadeOut(150, function() { row.insertAfter(nextRow).fadeIn(150).addClass('wa-highlight'); setTimeout(function() { row.removeClass('wa-highlight'); }, 500); }); arrayMove(rulesRegistry, idx, idx + 1); updateRuleButtons(); } }); updateRuleButtons(); } btnAddRule.on('click', addRule); addRule(); togWikiTypos.on('change', function(v) { if (v) { if (wikiTypos.length > 0) lblWikiStatus.text(wikiTypos.length + ' rules loaded (Cached)'); else { lblWikiStatus.text('Fetching...'); togWikiTypos.setDisabled(true); new mw.Api().get({ action: 'query', prop: 'revisions', titles: mw.config.get('wgFormattedNamespaces')[4] + ':AutoWikiBrowser/Typos', rvprop: 'content', rvslots: 'main', formatversion: 2 }).then(function(d) { var page = d.query.pages[0]; if (!page.missing) { wikiTypos = parseTypoContent(page.revisions[0].slots.main.content); lblWikiStatus.text(wikiTypos.length + ' rules loaded'); } else { lblWikiStatus.text('Page not found'); togWikiTypos.setValue(false); } }).catch(function() { lblWikiStatus.text('Error'); togWikiTypos.setValue(false); }).always(function() { togWikiTypos.setDisabled(false); }); } } else lblWikiStatus.text('Rules inactive'); }); btnLoadLocal.on('click', function() { $typoInput.click(); }); $typoInput.on('change', function(e) { var file = e.target.files[0]; if (!file) return; var reader = new FileReader(); reader.onload = function(evt) { localTypos = parseTypoContent(evt.target.result); lblLocalStatus.text(localTypos.length + ' local rules loaded'); btnClearLocal.setDisabled(false); }; reader.readAsText(file); $typoInput.val(''); }); btnClearLocal.on('click', function() { localTypos = []; lblLocalStatus.text('No local rules'); btnClearLocal.setDisabled(true); }); btnLoadLib.on('click', function() { $libInput.click(); }); btnRemoveLib.on('click', function() { currentLibrary = { name: null, code: null }; updateLibUI(); }); $libInput.on('change', function(e) { var file = e.target.files[0]; if (!file) return; var reader = new FileReader(); reader.onload = function(evt) { currentLibrary = { name: file.name, code: evt.target.result }; updateLibUI(); }; reader.readAsText(file); $libInput.val(''); }); btnPower.on('click', function() { hasNewSources = false; checkSummaryWarning(); if (!isRunning) { if (SAVED_SESSION === 0) mw.track('stats.mediawiki_gadget_wAwB_total'); isRunning = true; toggleUI(true); loadNextPage(); } else { if (SAVED_RUN > 0) { mw.track('stats.mediawiki_gadget_wAwB_saved_total', SAVED_RUN, { wiki: WIKI }); SAVED_SESSION += SAVED_RUN; SAVED_RUN = 0; } isRunning = false; toggleUI(false); WorkerEngine.destroy(); resetPanels(); } }); inputSummary.on('change', function() { checkSummaryWarning(); if (currentTitle) { updateSummaryPreview(inputSummary.getValue()); } }); btnSkip.on('click', function() { if (Editor.getValue() === 'Loading...') return; removeTopLine(); loadNextPage(); }); btnDiff.on('click', function() { currentViewMode = 'diff'; updateDirtyState(); if (currentTitle) renderDiff(); }); btnPreview.on('click', function() { currentViewMode = 'preview'; updateDirtyState(); if (currentTitle) renderPreview(); }); btnSave.on('click', function() { if (Editor.getValue() === 'Loading...' || !currentTitle) return; if (autoSaveTimer) clearTimeout(autoSaveTimer); btnSave.setDisabled(true); setStatus('Saving...', 'working'); var effectiveDelay = PERMS.saveDelay || 0; if (effectiveDelay > 0) setStatus('Throttling (' + (effectiveDelay / 1000) + 's)...', 'working'); setTimeout(function() { if (effectiveDelay > 0) setStatus('Saving...', 'working'); var finalSum = $('#wa-summary-preview').val().trim(); var summary = finalSum + SUMMARY_SUFFIX; new mw.Api().postWithToken('csrf', { action: 'edit', title: currentTitle, text: Editor.getValue(), summary: summary, minor: chkMinor.isSelected(), baserevid: baseRevId, bot: PERMS.allowBot, watchlist: 'nochange', tags: DO_TAG ? APP_NAME : undefined }).then(function() { SAVED_RUN += 1; removeTopLine(); loadNextPage(); }).catch(function(c) { btnSave.setDisabled(false); setStatus('Save error', 'error'); alert('Save failed: ' + c); }); }, effectiveDelay); }); btnManualEdit.on('click', function() { if (Editor.getValue() === 'Loading...' || !currentTitle) return; // Calculate the final injected summary var base = currentPageSummaryOverride !== null ? currentPageSummaryOverride : inputSummary.getValue(); var finalSum = base + (currentPageSummaryAppend || ""); var translatedSummary = injectVars(finalSum); var summary = translatedSummary; // no SUMMARY_SUFFIX // Create an invisible form targeting a new tab var $form = $('<form>').attr({ method: 'POST', action: mw.util.getUrl(currentTitle, { action: 'edit' }), target: '_blank' }).hide(); // Populate it with MediaWiki's native input names $('<textarea>').attr('name', 'wpTextbox1').val(Editor.getValue()).appendTo($form); $('<input>').attr('name', 'wpSummary').val(summary).appendTo($form); if (chkMinor.isSelected()) { $('<input>').attr('name', 'wpMinoredit').val('1').appendTo($form); } // Append, fire, and destroy $form.appendTo('body').submit().remove(); }); btnWatch.on('click', function() { var isWatched = btnWatch.getIcon() === 'unStar'; new mw.Api()[isWatched ? 'unwatch' : 'watch'](currentTitle).then(function() { btnWatch.setIcon(isWatched ? 'star' : 'unStar'); mw.notify(isWatched ? 'Unwatched' : 'Watched'); }); }); btnAdd.on('click', function() { if (isFetching) { isFetching = false; btnAdd.setDisabled(true).setLabel('Cancelling...'); return; } try { var mode = srcSelect.getValue(), q = srcInput.getValue().trim(); if (mode !== 'watchlist' && mode !== 'usercontribs' && mode !== 'pageswithprop' && !q) { alert('Query empty'); return; } var nsIds = ($nsSelect.val() || []).map(v => parseInt(v)); var nsStr = nsIds.join('|'); var api = new mw.Api(), promises = []; if (mode === 'cat') promises.push(fetchWithContinue(api, { action: 'query', list: 'categorymembers', cmtitle: mw.Title.newFromText(q, 14) ? mw.Title.newFromText(q, 14).getPrefixedText() : 'Category:' + q, cmnamespace: nsStr, cmtype: (chkCatPages.isSelected() ? 'page|' : '') + (chkCatSub.isSelected() ? 'subcat|' : '') + (chkCatFile.isSelected() ? 'file' : ''), cmlimit: 'max' })); else if (mode === 'linksto') { if (chkLinkWiki.isSelected()) promises.push(fetchWithContinue(api, { action: 'query', list: 'backlinks', bltitle: q, blnamespace: nsStr, bllimit: 'max', blfilterredir: dropLinkRedir.getValue(), blredirect: chkLinkToRedir.isSelected() })); if (chkLinkTrans.isSelected()) promises.push(fetchWithContinue(api, { action: 'query', list: 'embeddedin', eititle: q, einamespace: nsStr, eilimit: 'max', eifilterredir: dropLinkRedir.getValue() })); if (chkLinkImg.isSelected()) promises.push(fetchWithContinue(api, { action: 'query', list: 'imageusage', iutitle: q, iunamespace: nsStr, iulimit: 'max', iufilterredir: dropLinkRedir.getValue() })); } else if (mode === 'linkson') promises.push(fetchWithContinue(api, { action: 'query', generator: 'links', titles: q, gplnamespace: nsStr, gpllimit: 'max', prop: 'info' })); else if (mode === 'prefix') promises.push(fetchWithContinue(api, { action: 'query', list: 'allpages', apprefix: q, apnamespace: nsIds[0] || 0, aplimit: 'max' })); else if (mode === 'watchlist') promises.push(fetchWithContinue(api, { action: 'query', list: 'watchlistraw', wrnamespace: nsStr, wrlimit: 'max' })); else if (mode === 'search') promises.push(fetchWithContinue(api, { action: 'query', list: 'search', srsearch: q, srnamespace: nsStr, srlimit: 'max' })); else if (mode === 'usercontribs') promises.push(fetchWithContinue(api, { action: 'query', list: 'usercontribs', ucuser: srcInputUser.getValue(), ucstart: srcInputStartDate.getValue(), ucend: srcInputEndDate.getValue(), ucdir: 'newer', uclimit: 'max', ucnamespace: nsStr, ucprop: 'title' })); else if (mode === 'pageswithprop') promises.push(fetchWithContinue(api, { action: 'query', list: 'pageswithprop', pwppropname: srcDropProp.getValue(), pwplimit: 'max' })); Promise.all(promises).then(function(res) { var list = new Set(); res.forEach(titles => titles.forEach(t => list.add(t))); var currentVal = listTextarea.getValue(); var newVal = Array.from(list).join('\n'); listTextarea.setValue(currentVal ? currentVal + '\n' + newVal : newVal); mw.notify('Added ' + list.size + ' pages'); }).catch(e => alert('Error: ' + e)); } catch (e) { alert("Fetch error: " + e); } }); btnSort.on('click', function() { var v = listTextarea.getValue(); if (v) { var lines = getNormalizedList(v); lines.sort((a, b) => sortAsc ? a.localeCompare(b) : b.localeCompare(a)); listTextarea.setValue(lines.join('\n')); sortAsc = !sortAsc; } }); btnDedup.on('click', function() { var v = listTextarea.getValue(); if (v) listTextarea.setValue(getDeduplicatedList(v).join('\n')); }); btnClear.on('click', function() { listTextarea.setValue(''); }); btnSaveProj.on('click', function() { try { var currentMode = srcSelect.getValue(); if (['watchlist', 'usercontribs', 'pageswithprop'].indexOf(currentMode) === -1) queryCache[currentMode] = srcInput.getValue(); var saveExcludes = {}; for (var k in protCheckboxes) saveExcludes[k] = protCheckboxes[k].isSelected(); var data = { version: APP_VERSION, library: currentLibrary, source: { activeMode: currentMode, namespaces: ($nsSelect.val() || []).map(v => parseInt(v)), modes: { cat: { query: queryCache['cat'] || '', options: { pages: chkCatPages.isSelected(), sub: chkCatSub.isSelected(), file: chkCatFile.isSelected() } }, linksto: { query: queryCache['linksto'] || '', options: { wiki: chkLinkWiki.isSelected(), trans: chkLinkTrans.isSelected(), img: chkLinkImg.isSelected(), redir: dropLinkRedir.getValue(), toRedir: chkLinkToRedir.isSelected() } }, linkson: { query: queryCache['linkson'] || '' }, prefix: { query: queryCache['prefix'] || '' }, watchlist: { query: '' }, search: { query: queryCache['search'] || '' }, usercontribs: { options: { user: srcInputUser.getValue(), start: srcInputStartDate.getValue(), end: srcInputEndDate.getValue() } }, pageswithprop: { options: { prop: srcDropProp.getValue() } } } }, settings: { redir: redirMode.findSelectedItem().getData(), skipLogic: radSkipExist.findSelectedItem().getData(), skipNoChange: chkSkipNoChange.isSelected(), minor: chkMinor.isSelected() }, filters: { contains: { val: inpSkipContains.getValue(), regex: togSkipContainsRegex.getValue() }, notContains: { val: inpSkipNotContains.getValue(), regex: togSkipNotContainsRegex.getValue() }, categories: { skip: inpSkipCategories.getValue(), require: inpSkipNotCategories.getValue() } }, rules: rulesRegistry.map(r => ({ find: r.find.getValue(), replace: r.rep.getValue(), regex: r.regex.getValue(), flags: r.flags.getValue(), enabled: r.isActive(), isFunc: r.isFunc() })), scripts: { pre: txtPreScript.getValue(), post: txtPostScript.getValue() }, processing: { summary: inputSummary.getValue(), list: listTextarea.getValue() }, protection: { mode: dropProtMode.getValue(), excludes: saveExcludes, target: (radTargetSet.findSelectedItem() || { getData: () => null }).getData(), templateFilter: inpTemplateFilter.getValue() } }; var a = document.createElement('a'); a.href = URL.createObjectURL(new Blob([JSON.stringify(data, null, 1)], { type: "application/json" })); a.download = "wawb_project.json"; a.click(); } catch (e) { alert("Save error: " + e); } }); btnLoadProj.on('click', function() { $fileInput.click(); }); $fileInput.on('change', function(e) { var file = e.target.files[0]; if (!file) return; var reader = new FileReader(); reader.onload = function(evt) { try { var data = JSON.parse(evt.target.result); isLoadingProject = true; if (data.source) { if (data.source.namespaces) $nsSelect.val(data.source.namespaces.map(String)); if (data.source.modes) { var m = data.source.modes; queryCache = {}; for (var key in m) if (m[key].query !== undefined) queryCache[key] = m[key].query; if (m.cat && m.cat.options) { chkCatPages.setSelected(m.cat.options.pages); chkCatSub.setSelected(m.cat.options.sub); chkCatFile.setSelected(m.cat.options.file); } if (m.linksto && m.linksto.options) { chkLinkWiki.setSelected(m.linksto.options.wiki); chkLinkTrans.setSelected(m.linksto.options.trans); chkLinkImg.setSelected(m.linksto.options.img); dropLinkRedir.setValue(m.linksto.options.redir); chkLinkToRedir.setSelected(m.linksto.options.toRedir); } if (m.usercontribs && m.usercontribs.options) { srcInputUser.setValue(m.usercontribs.options.user); srcInputStartDate.setValue(m.usercontribs.options.start); srcInputEndDate.setValue(m.usercontribs.options.end); } if (m.pageswithprop && m.pageswithprop.options) srcDropProp.setValue(m.pageswithprop.options.prop); } if (data.source.activeMode) { srcSelect.setValue(data.source.activeMode); isLoadingProject = false; srcSelect.emit('change', data.source.activeMode); isLoadingProject = true; } } if (data.settings) { redirMode.selectItemByData(data.settings.redir); chkSkipNoChange.setSelected(data.settings.skipNoChange); radSkipExist.selectItemByData(data.settings.skipLogic); if (data.settings.minor !== undefined) chkMinor.setSelected(data.settings.minor); } if (data.protection) { dropProtMode.setValue(data.protection.mode); for (var k in data.protection.excludes) if (protCheckboxes[k]) protCheckboxes[k].setSelected(data.protection.excludes[k]); if (data.protection.target) radTargetSet.selectItemByData(data.protection.target); if (data.protection.templateFilter) inpTemplateFilter.setValue(data.protection.templateFilter); } if (data.library) { currentLibrary = data.library; updateLibUI(); } if (data.filters) { inpSkipContains.setValue(data.filters.contains.val); togSkipContainsRegex.setValue(data.filters.contains.regex); inpSkipNotContains.setValue(data.filters.notContains.val); togSkipNotContainsRegex.setValue(data.filters.notContains.regex); } if (data.filters.categories) { inpSkipCategories.setValue(data.filters.categories.skip); inpSkipNotCategories.setValue(data.filters.categories.require); } rulesRegistry.forEach(r => r.row.remove()); rulesRegistry = []; $rulesList.empty(); if (data.rules) data.rules.forEach(r => { addRule(); var last = rulesRegistry[rulesRegistry.length - 1]; last.find.setValue(r.find); last.rep.setValue(r.replace); last.regex.setValue(r.regex); last.flags.setValue(r.flags); last.flags.setDisabled(!r.regex); last.setActive(r.enabled); if (r.isFunc) last.setFunc(true); }); if (rulesRegistry.length === 0) addRule(); if (data.scripts) { txtPreScript.setValue(data.scripts.pre); txtPostScript.setValue(data.scripts.post); } if (data.processing) { inputSummary.setValue(data.processing.summary); listTextarea.setValue(data.processing.list); } isLoadingProject = false; setStatus('Project loaded'); } catch (err) { alert("Error: " + err); } $fileInput.val(''); }; reader.readAsText(file); }); if (CAN_MOVE || IS_ADMIN) { togAdminEnable.on('change', function(val) { if (!currentTitle) { updateInterfaceMode(); return; } if (val) { Editor.setValue(originalWikitext); updateInterfaceMode(); renderDiff(); setStatus('Ready (Page actions)'); } else processPageContent(); }); } if (CAN_MOVE) { btnAdminMove.on('click', function() { if (!currentVars['$xA']) { mw.notify('Variable $xA not set', { type: 'error' }); return; } new mw.Api().postWithToken('csrf', { action: 'move', from: currentTitle, to: currentVars['$xA'], reason: inputSummary.getValue() + SUMMARY_SUFFIX, movetalk: chkMovTalk.isSelected(), movesubpages: chkMovSub.isSelected(), noredirect: chkMovRedirect.isSelected() }).then(function() { removeTopLine(); loadNextPage(); }).catch(e => alert('Move failed: ' + e)); }); } if (IS_ADMIN) { btnAdminDel.on('click', function() { new mw.Api().postWithToken('csrf', { action: 'delete', title: currentTitle, reason: inputSummary.getValue() + SUMMARY_SUFFIX }).then(function() { if (chkDelTalk.isSelected()) new mw.Api().postWithToken('csrf', { action: 'delete', title: mw.Title.newFromText(currentTitle).getTalkPage().getPrefixedText(), reason: 'Talk page of deleted page' }); removeTopLine(); loadNextPage(); }).catch(e => alert('Delete failed: ' + e)); }); btnAdminProt.on('click', function() { var protections = []; if (dropProtEdit.getValue()) protections.push('edit=' + dropProtEdit.getValue()); if (dropProtMove.getValue()) protections.push('move=' + dropProtMove.getValue()); new mw.Api().postWithToken('csrf', { action: 'protect', title: currentTitle, protections: protections.join('|'), expiry: inpProtExpiry.getValue() || 'infinite', reason: inputSummary.getValue() + SUMMARY_SUFFIX }).then(function() { removeTopLine(); loadNextPage(); }).catch(e => alert('Protect failed: ' + e)); }); } Editor.init(); resetPanels(); }); $(window).on('beforeunload', function() { return "You have unsaved work."; }); }).catch(e => console.error("wAwB Loader Error:", e)); //</nowiki> 7aca73a1vt43dj8ot4md3zzce9zs93t 747802 747801 2026-06-21T03:46:14Z Ponor 47975 throw 'assertuserfailed' when logged-out 747802 javascript text/javascript /* * wAwB – An in-browser application for automated editing of wiki pages. * Features: customizable regex or JavaScript search-and-replace rules, * custom JavaScript pre/post-processing functions and function libraries, * granular protection or targeting of different parts of wikitext, * a full-fledged CodeMirror editor, and options to move, delete, and protect pages. * Author: [[User:Ponor]] * Documentation: [[User:Ponor/wAwB]] * License: GNU General Public License (GPL) */ //<nowiki> mw.loader.using([ 'oojs-ui-core', 'oojs-ui-widgets', 'oojs-ui-windows', 'mediawiki.api', 'mediawiki.diff.styles', 'mediawiki.util', 'mediawiki.page.gallery.styles', 'oojs-ui.styles.icons-content', 'oojs-ui.styles.icons-interactions', 'oojs-ui.styles.icons-movement', 'oojs-ui.styles.icons-moderation', 'oojs-ui.styles.icons-editing-core', 'oojs-ui.styles.icons-editing-advanced' ]).then(function() { // ===================================================================== // 1. STATE & CONFIGURATION // ===================================================================== var SCRIPT_TIMEOUT_MS = window.wa_timeout || 5000; var FETCH_SAFETY_LIMIT = window.wa_fetchLimit || 10000; var APP_NAME = "wAwB"; var DO_TAG = false; var SUMMARY_SUFFIX = window.wa_suffix || " [[:en:User:Ponor/wAwB| #wAwB]]"; var APP_VERSION = "0.6"; var DOC_URL = window.wa_docUrl || "https://en.wikipedia.org/wiki/User:Ponor/wAwB"; document.title = window.wa_editIn || "Edit in wAwB"; var PERMS = { canSave: false, allowBot: false, saveDelay: 0 }; var IS_ADMIN = mw.config.get('wgUserGroups').includes('sysop'); var CAN_MOVE = IS_ADMIN || mw.config.get('wgUserGroups').includes('extendedmover') || mw.config.get('wgUserGroups').includes('filemover') || mw.config.get('wgUserGroups').includes('pagemover'); var WIKI = mw.config.get('wgDBname'); var SAVED_RUN = 0; var SAVED_SESSION = 0; var currentPageExists = false; var isRunning = false; var isFetching = false; var currentTitle = null; var currentVars = {}; var currentLibrary = { name: null, code: null }; var originalWikitext = ""; var currentPageSummaryAppend = ""; var currentPageSummaryOverride = null; var baseRevId = 0; var currentViewMode = 'diff'; var autoSaveTimer = null; var propNamesLoaded = false; var hasNewSources = false; var currentHeightMode = 1; // 0=25%, 1=45% (default), 2=72% var heightValues = ['25%', '45%', '72%']; // EXTERNAL RULES STATE var wikiTypos = []; var localTypos = []; // LOADING FLAG var isLoadingProject = false; // NAMESPACE ALIASES var nsIds = mw.config.get('wgNamespaceIds'); var catAliases = [], fileAliases = []; for (var key in nsIds) { if (nsIds[key] === 14) catAliases.push(key.replace(/_/g, ' ')); if (nsIds[key] === 6) fileAliases.push(key.replace(/_/g, ' ')); } catAliases.sort((a, b) => b.length - a.length); fileAliases.sort((a, b) => b.length - a.length); var REGEX_CAT_PFX = catAliases.map(mw.util.escapeRegExp).join('|'); var REGEX_FILE_PFX = fileAliases.map(mw.util.escapeRegExp).join('|'); // MASTER PROTECTION DEFINITIONS var PROTECTION_DEFS = [{ id: 'nowiki', isOn: true, label: 'Nowiki: <nowiki>', regex: /<nowiki>[\s\S]*?<\/nowiki>|<nowiki\s*\/>/gi }, { id: 'comments', isOn: true, label: 'Comments: <!' + '-- -->', regex: new RegExp('<!' + '--[\\s\\S]*?--' + '>', 'g') }, { id: 'headers', isOn: false, label: 'Headers: == Title ==', regex: /^==+[\s\S]+?==+\s*$/gm }, { id: 'templates', isOn: false, label: 'Templates: {{...}}', open: '{{', close: '}}', species: null, regex: null }, { id: 'tables', isOn: false, label: 'Tables: {|...|}', open: '\n{|', close: '\n|}', regex: null }, { id: 'images', isOn: false, label: 'Images: [[File:...|...|...]]', open: '[[', close: ']]', species: '(?:' + REGEX_FILE_PFX + ')\\s*:', regex: null }, { id: 'refs', isOn: true, label: 'Refs: <ref...', regex: /<ref[^>]*?\/>|<ref[^>]*?(?<!\/)>[\s\S]*?<\/ref>/gi }, { id: 'blocks', isOn: false, label: 'Blocks: math, gallery...', regex: null }, { id: 'categories', isOn: true, label: 'Categories: [[Category:...]]', regex: new RegExp('\\[\\[\\s*(' + REGEX_CAT_PFX + ')\\s*:[^\\]]+\\]\\]', 'giu') }, { id: 'files', isOn: true, label: 'File names: File:...', regex: new RegExp('(?<=\\[\\[\\s*:?(:?' + REGEX_FILE_PFX + ')\\s*:)[^|\\]]+' + '|^\\s*(?:' + REGEX_FILE_PFX + ')\\s*:([^\\][}{|\\n]{1,150}\\.(?:svg|png|jpe?g|gif|tiff|webp|xcf|mp3|midi|ogg|webm|flac|wav|mpe?g|pdf|djv))', 'gmiu') }, { id: 'targets', isOn: false, label: 'Targets of [[...|', regex: /(?<=\[\[:?)[^|\]]+?(?=\||\]\])/g }, { id: 'extlinks', isOn: true, label: 'External links: [...]', regex: /(?<=\[)(https?:\/\/|ftps?:\/\/|mailto:)[^\]]+(?=\])/gi }, { id: 'urls', isOn: true, label: 'URLs: http...', regex: /https?:\/\/[^\s<>[\]"'`()]+/gi } ]; // ===================================================================== // 2. CSS STYLES // ===================================================================== var styles = ` * { box-sizing: border-box; } #wa-root { font-family: sans-serif; height: 100vh; width: 100vw; overflow: hidden; display: flex; font-size: 14px; } #wa-left-panel { width: 400px; min-width: 400px; max-width: 400px; background: var(--background-color-base, #fff); border-right: 1px solid #c8ccd1; display: flex; flex-direction: column; z-index: 10; overflow-x: hidden; } #wa-left-panel h3 { color: #3f6fcf; text-align: center; margin: 12px 0 0 0; } #wa-username { color: #3f6fcf; text-align: center; margin: 2px 0; font-size: 92%; } #wa-content-area { flex: 1; padding: 10px 10px 100px 10px; overflow-y: auto; overflow-x: hidden; } #wa-right-panel { flex: 1; display: flex; flex-direction: column; height: 100%; background: var(--background-color-interactive, #eaecf0); overflow: hidden; } #wa-visual-output { flex: 0 0 45%; min-height: 0; overflow-y: auto; background: var(--background-color-base, #fff); padding: 20px; border-bottom: 1px solid #c8ccd1; } .wa-editor-header { flex: 0 0 40px; min-height: 40px; padding: 0 10px; background: var(--background-color-interactive-subtle, #f8f9fa); border-bottom: 1px solid #c8ccd1; display: flex; gap: 25px; justify-content: space-between; align-items: center; z-index: 10; } .wa-editor-header.wa-dirty { background: var(--background-color-warning-subtle, #fdf2d5); border-bottom: 1px solid #e6a700; } .wa-header-left { flex: 1; display: flex; align-items: center; gap: 5px; min-width: 0; overflow: hidden; } .wa-header-right { flex: 0 0 auto; display: flex; justify-content: flex-end; align-items: center; gap: 8px; color: var(--color-placeholder, #72777d); font-size: 0.9em; } .wa-title-link { font-weight: bold; font-size: 1.1em; color: var(--color-progressive--focus, #36c) !important; text-decoration: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; flex-shrink: 0; max-width: 40%; } .wa-title-link:hover { text-decoration: underline; } #wa-status-indicator { flex: 0 0 auto; width: 10px; height: 10px; border-radius: 50%; background-color: #00af89; cursor: help; transition: background-color 0.2s; margin-right: 2px; } #wa-status-indicator.wa-status-working { background-color: #36c; animation: wa-pulse-blue 1.5s infinite; } #wa-status-indicator.wa-status-error { background-color: #bf3c2c; } @keyframes wa-pulse-blue { 0% { opacity: 1; } 50% { opacity: 0.4; } 100% { opacity: 1; } } .wa-header-sep { border-left: 1px solid #ccc; height: 16px; flex-shrink: 0; margin: 0 2px; } #wa-summary-preview { flex-grow: 1; color: #d00; font-style: italic; white-space: nowrap; text-overflow: ellipsis; overflow-x: auto; background: transparent; border: none; outline: none; box-shadow: none; min-width: 50px; padding: 2px 5px; scrollbar-width: none; -ms-overflow-style: none; font-size: 1em; } #wa-summary-preview::-webkit-scrollbar { display: none; } #wa-summary-preview:hover { background: rgba(0, 0, 0, 0.05); cursor: text; } #wa-summary-preview:focus { background: #fff; } .wa-info-container { margin-right: 10px; } .wa-tools-container { display: flex; align-items: center; gap: 2px; } .wa-resize-container { display: flex; flex-direction: column; justify-content: center; height: 100%; margin-left: 10px; padding-left: 5px; border-left: 1px solid #ccc; } .wa-resize-btn { cursor: pointer; color: #72777d; user-select: none; width: 20px; height: 14px; display: flex; align-items: center; justify-content: center; transition: color 0.1s ease-in-out; } .wa-resize-btn:hover { color: #36c; } .wa-resize-btn.wa-resize-disabled { color: #ccc; cursor: default; } #wa-proc-header { margin-top: 15px !important; border-bottom: none !important; cursor: default; } #wa-proc-title { font-weight: bold; padding: 10px; display: block; } #wa-proc-content { padding: 0 10px 15px 10px; } #wa-editor-area { flex: 1; min-height: 0; display: flex; flex-direction: column; background: var(--background-color-base, #fff); position: relative; overflow: hidden; } #wa-editor-textarea { flex: 1; height: 100%; font-family: monospace; font-size: 13px; border: none; outline: none; padding: 10px; resize: none; width: 100%; } .cm-editor { height: 100% !important; flex: 1; } .wa-section-header { margin-top: 12px; border-bottom: 1px solid #eee; width: 100%; display: block; margin-left: 0 !important; } #wa-content-area .wa-section-header:first-child, #wa-content-area .wa-section-header.oo-ui-buttonElement-frameless:first-child { margin-top: 0; margin-left: 0 !important; } .wa-section-header > .oo-ui-buttonElement-button { text-align: left; padding: 10px 10px !important; margin: 0 !important; display: block; width: 100%; position: relative; border-left: 3px solid #3f6fcf !important; border-radius: 3px !important; background-color: transparent !important; } .wa-section-header > .oo-ui-buttonElement-button:focus { outline: none !important; } .wa-section-header .oo-ui-labelElement-label { font-weight: bold; padding-left: 0 !important; margin-left: 0 !important; color: var(--color-base, #202122); } .wa-section-header .oo-ui-indicatorElement-indicator { position: absolute; right: 10px !important; top: 50%; margin-top: -10px; left: auto !important; width: 20px; } .wa-foldable-content { display: none; padding: 10px 0; } .wa-source-options { background: var(--background-color-interactive-subtle, #f8f9fa); border: 1px solid #c8ccd1; border-top: none; padding: 8px; margin-bottom: 10px; font-size: 0.9em; } .wa-opt-row { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 5px; } .wa-opt-label { font-weight: bold; width: 100%; margin-bottom: 5px; color: var(--color-base, #202122); } .wa-opt-row > div { margin-top: 8px !important; margin-bottom: 8px !important; } .wa-rule-row { background: var(--background-color-interactive-subtle, #f8f9fa); border: 1px solid #c8ccd1; padding: 8px; margin-bottom: 8px; border-radius: 4px; display: flex; align-items: stretch; transition: background-color 0.3s; } .wa-rule-row.wa-highlight { background-color: var(--background-color-interactive, #eaecf0); border-color: #36c; } .wa-rule-controls { display: flex; flex-direction: column; justify-content: center; gap: 0px; padding-right: 4px; border-right: 1px solid #eee; margin-right: 8px; } .wa-rule-btn { margin: 0 !important; margin-right: 0 !important; margin-left: 0 !important; } .wa-rule-btn > .oo-ui-buttonElement-button { margin: 0 !important; } .wa-rule-content { flex: 1; min-width: 0; } .wa-rule-opt-row { display: flex; justify-content: space-between; align-items: center; margin-top: 5px; } #wa-ns-selector { width: 100%; margin-bottom: 10px; font-family: sans-serif; font-size: 0.9em; border: 1px solid #a2a9b1; } .wa-lib-dialog > .oo-ui-window-frame { width: 80vw !important; max-width: none !important; height: 80vh !important; max-height: none !important; } .wa-lib-editorwrapper { height: 100%; border: 1px solid #c8ccd1; position: relative; boxSizing: border-box; } .wa-page-list-raw textarea { font-family: monospace; font-size: 0.9em; white-space: pre; overflow-x: auto; } .wa-list-running textarea { background-color: var(--background-color-neutral-subtle, #f8f8f8) !important; color: var(--color-base, #202122) !important; } .wa-grid-container { display: flex; gap: 6px; margin-bottom: 10px; } .wa-grid-col { flex: 1; display: flex; flex-direction: column; gap: 6px; } .wa-grid-col .oo-ui-buttonWidget { width: 100%; } .wa-grid-col .oo-ui-buttonWidget .oo-ui-buttonElement-button { width: 100%; text-align: center; justify-content: center; } .wa-toolbar { display: flex; justify-content: flex-end; align-items: center; gap: 4px; border-bottom: 1px solid #eee; padding-bottom: 4px; margin-bottom: 4px; } .wa-list-counter { margin-right: auto; font-weight: bold; color: var(--color-subtle, #54595d); font-size: 0.9em; padding-left: 5px; } .wa-project-bar { display: flex; flex-wrap: wrap; gap: 8px; padding: 0 10px; margin: 8px 0; justify-content: center; } .wa-project-bar .oo-ui-buttonElement-button { padding-left: 36px !important; padding-right: 12px !important; font-size: 0.9em; } .wa-project-bar .oo-ui-iconElement-icon { left: 10px !important; } .wa-settings-header { font-weight: bold; color: var(--color-subtle, #54595d); margin-bottom: 8px; display: block; text-transform: uppercase; font-size: 0.9em; } .wa-setting-row { display: flex; align-items: center; margin-bottom: 6px; } .wa-bot-row { background: var(--background-color-success-subtle, #dff2eb); border: 1px solid #a5d6a7; padding: 8px; margin-bottom: 10px; border-radius: 4px; display: flex; align-items: center; justify-content: flex-start; gap: 15px; } table.diff { width: 100%; font-family: "Adwaita Mono", "Courier New", monospace } table.diff td { vertical-align: top; } table.diff tr:hover td { background-color: var(--background-color-progressive-subtle--hover, #d9e2ff); cursor: pointer; } @keyframes wa-pulse-red { 0% { box-shadow: 0 0 0 0 rgba(255, 0, 0, 0.4); border-color: #ff0000; } 70% { box-shadow: 0 0 0 6px rgba(255, 0, 0, 0); border-color: #ff0000; } 100% { box-shadow: 0 0 0 0 rgba(255, 0, 0, 0); border-color: #ff0000; } } .wa-summary-warning input { animation: wa-pulse-red 1s infinite; border-color: #ff0000 !important; } `; $('<style>').text(styles).appendTo('head'); $('body').empty(); // ===================================================================== // 3. HELPER FUNCTIONS // ===================================================================== function checkPermissions() { return new Promise(function(resolve) { var api = new mw.Api(); var projectNs = mw.config.get('wgFormattedNamespaces')[4]; var checkTitles = { 'permissions': projectNs + ':AutoWikiBrowser/CheckPageJSON', 'tag': 'MediaWiki:Tag-wAwB' }; api.get({ action: 'query', prop: 'revisions', titles: Object.values(checkTitles).join('|'), rvprop: 'content', rvslots: 'main', formatversion: 2 }).then(function(data) { var pagePerms = data.query.pages.find(p => p.title === checkTitles['permissions']); var pageTag = data.query.pages.find(p => p.title === checkTitles['tag']); DO_TAG = pageTag.missing === undefined; var userName = mw.config.get('wgUserName'); var userGroups = mw.config.get('wgUserGroups'); var isSysop = userGroups.includes('sysop'); if (!pagePerms.missing) { try { var content = pagePerms.revisions[0].slots.main.content; var json = JSON.parse(content); var inEnabledUsers = json.enabledusers && json.enabledusers.includes(userName); var inEnabledBots = json.enabledbots && json.enabledbots.includes(userName); var isBotGroup = userGroups.includes('bot'); var canSave = inEnabledUsers || inEnabledBots || isSysop; var allowBot = inEnabledBots && isBotGroup; resolve({ canSave: canSave, allowBot: allowBot, saveDelay: 0 }); } catch (e) { resolve({ canSave: false, allowBot: false, saveDelay: 0 }); } } else { var editCount = mw.config.get('wgUserEditCount'); if (editCount > 500) resolve({ canSave: true, allowBot: false, saveDelay: 20000 }); else resolve({ canSave: false, allowBot: false, saveDelay: 0 }); } }).catch(function() { resolve({ canSave: false, allowBot: false, saveDelay: 0 }); }); }); } function getUserCode(widget, globalName) { var val = widget.getValue().trim(); if (!val || val.startsWith('// Enter')) { if (window[globalName] && typeof window[globalName] === 'function') { var s = window[globalName].toString(); return s.substring(s.indexOf('{') + 1, s.lastIndexOf('}')); } return ""; } if (val.startsWith('function')) { return val.substring(val.indexOf('{') + 1, val.lastIndexOf('}')); } return val; } function normalizeLine(line) { if (!line) return null; // Pass through comments/STOP commands (trimmed) if (line.trim().startsWith('####')) return line.trim(); // Handle Title|Variables var parts = line.split('|'); var title = parts[0].trim(); if (!title) return null; // Skip if title is empty // Reassemble: Clean Title + Original Variables (preserving whitespace) var rest = parts.length > 1 ? parts.slice(1).join('|') : null; return title + (rest !== null ? '|' + rest : ''); } function getNormalizedList(text) { if (!text) return []; return text.split('\n') .map(normalizeLine) .filter(function(l) { return l !== null; }); } function getDeduplicatedList(text) { if (!text) return []; var seen = new Set(); var out = []; var lines = text.split('\n'); for (var i = 0; i < lines.length; i++) { var clean = normalizeLine(lines[i]); if (clean && !seen.has(clean)) { seen.add(clean); out.push(clean); } } return out; } function parseTypoContent(content) { if (!content) return []; try { var $wrapper = $('<body>').html(content); var rules = []; $wrapper.find('Typo:not([disabled])').each(function() { var $t = $(this); var find = $t.attr('find'); var replace = $t.attr('replace'); if (find && replace !== undefined) { rules.push({ find: find, replace: replace, regex: true, flags: 'gmu', enabled: true, isFunc: false }); } }); return rules; } catch (e) { return []; } } function updateSummaryPreview(baseText) { var base = currentPageSummaryOverride !== null ? currentPageSummaryOverride : (baseText || ""); var finalSum = base + (currentPageSummaryAppend || ""); var previewText = finalSum ? injectVars(finalSum) : ''; $('#wa-summary-preview').val(previewText); } function injectVars(text) { if (!text) return ""; return text.replace(/\$x([A-Z]|x)/g, function(match) { return currentVars[match] || match; // Swap it, or leave it alone if undefined }); } // ===================================================================== // 4. UI CONSTRUCTION // ===================================================================== checkPermissions().then(function(pState) { PERMS = pState; var $main = $('<div>').attr('id', 'wa-root').appendTo('body'); var $left = $('<div>').attr('id', 'wa-left-panel').appendTo($main); $left.append($('<h3>').append($('<a>').attr('href', DOC_URL).attr('target', '_blank').text(APP_NAME).css({ 'text-decoration': 'none', 'color': 'inherit' }))); $left.append($('<div>').attr('id', 'wa-username').append($('<a>').attr('href', mw.util.getUrl('Special:Contributions/' + mw.config.get('wgUserName'))).attr('target', '_blank').text('User: ' + mw.config.get('wgUserName')).css({ 'text-decoration': 'none', 'color': 'inherit' }))); var btnSaveProj = new OO.ui.ButtonWidget({ icon: 'download', label: 'Save project', framed: false, flags: 'progressive' }); var btnLoadProj = new OO.ui.ButtonWidget({ icon: 'upload', label: 'Load project', framed: false }); var $projBar = $('<div>').addClass('wa-project-bar').append(btnSaveProj.$element, btnLoadProj.$element); $left.append($projBar); var $fileInput = $('<input type="file" accept=".json">').hide().appendTo('body'); var $content = $('<div>').attr('id', 'wa-content-area').appendTo($left); var $right = $('<div>').attr('id', 'wa-right-panel').appendTo($main); var $editorHeader = $('<div>').addClass('wa-editor-header').appendTo($right); var $headerLeft = $('<div>').addClass('wa-header-left').appendTo($editorHeader); var $statusIndicator = $('<span>').attr('id', 'wa-status-indicator').attr('title', 'Ready').appendTo($headerLeft); var $titleLink = $('<a>').addClass('wa-title-link').text('Page content').attr('target', '_blank').appendTo($headerLeft); $('<span>').addClass('wa-header-sep').appendTo($headerLeft); var $summaryPreview = $('<input type="text">').attr('id', 'wa-summary-preview').attr('autocomplete', 'off').appendTo($headerLeft); var $headerRight = $('<div>').addClass('wa-header-right').appendTo($editorHeader); var $infoContainer = $('<span>').addClass('wa-info-container').appendTo($headerRight); var $toolsContainer = $('<div>').addClass('wa-tools-container').appendTo($headerRight); var $resizeContainer = $('<div>').addClass('wa-resize-container').appendTo($headerRight); var $adminTools = $('<div>').addClass('wa-admin-tools').hide().appendTo($toolsContainer); // Wide chevron SVGs var svgUp = '<svg xmlns="http://www.w3.org/2000/svg" width="14" height="8" viewBox="0 0 24 12"><path d="M2 10 L12 2 L22 10" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/></svg>'; var svgDown = '<svg xmlns="http://www.w3.org/2000/svg" width="14" height="8" viewBox="0 0 24 12"><path d="M2 2 L12 10 L22 2" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/></svg>'; var $btnSizeUp = $('<div>').addClass('wa-resize-btn').html(svgUp).attr('title', 'Decrease view size'); var $btnSizeDown = $('<div>').addClass('wa-resize-btn').html(svgDown).attr('title', 'Increase view size'); $resizeContainer.append($btnSizeUp, $btnSizeDown); function setPanelHeight(modeIndex) { currentHeightMode = modeIndex; if (currentHeightMode < 0) currentHeightMode = 0; if (currentHeightMode > 2) currentHeightMode = 2; $('#wa-visual-output').css('flex-basis', heightValues[currentHeightMode]); $btnSizeUp.toggleClass('wa-resize-disabled', currentHeightMode === 0); $btnSizeDown.toggleClass('wa-resize-disabled', currentHeightMode === 2); } $btnSizeUp.on('click', function() { if (!$(this).hasClass('wa-resize-disabled')) setPanelHeight(currentHeightMode - 1); }); $btnSizeDown.on('click', function() { if (!$(this).hasClass('wa-resize-disabled')) setPanelHeight(currentHeightMode + 1); }); setPanelHeight(1); if (CAN_MOVE) { var btnAdminMove = new OO.ui.ButtonWidget({ icon: 'move', title: 'Move page to $xA', disabled: true, framed: false }); $adminTools.append(btnAdminMove.$element).show(); } if (IS_ADMIN) { var btnAdminDel = new OO.ui.ButtonWidget({ icon: 'trash', title: 'Delete page', disabled: true, framed: false }); var btnAdminProt = new OO.ui.ButtonWidget({ icon: 'lock', title: 'Protect page', disabled: true, framed: false }); $adminTools.append(btnAdminDel.$element, btnAdminProt.$element).show(); } var btnManualEdit = new OO.ui.ButtonWidget({ icon: 'edit', title: 'Open in manual editor', framed: false, disabled: true }); var btnWatch = new OO.ui.ButtonWidget({ icon: 'star', title: 'Watch this page', framed: false, disabled: true, accessKey: 'w' }); $toolsContainer.append(btnManualEdit.$element, btnWatch.$element); var $visualOut = $('<div>').attr('id', 'wa-visual-output').html('<div style="color:#aaa; text-align:center; margin-top:50px;">Ready to start...</div>').prependTo($right); var $editorArea = $('<div>').attr('id', 'wa-editor-area').appendTo($right); var $textArea = $('<textarea>').attr('id', 'wa-editor-textarea').attr('placeholder', 'Page text will appear here...').appendTo($editorArea); function setStatus(msg, type) { if (!msg) msg = "Ready"; $statusIndicator.attr('title', msg).removeClass('wa-status-error wa-status-working'); if (type === 'error') $statusIndicator.addClass('wa-status-error'); if (type === 'working') $statusIndicator.addClass('wa-status-working'); } // EDITOR OBJECT var Editor = { mode: 'textarea', cmInstance: null, init: function() { var self = this; mw.loader.using(['ext.CodeMirror', 'ext.CodeMirror.mode.mediawiki']).then(function(require) { try { self.cmInstance = new(require('ext.CodeMirror'))($textArea[0], (require('ext.CodeMirror.mode.mediawiki')).mediawiki()); self.cmInstance.initialize(); self.mode = 'codemirror'; } catch (e) { console.error("CM Error", e); } }).catch(function(err) { console.error("CM Load Error:", err); }); $textArea.on('input', updateDirtyState); }, getValue: function() { return (this.mode === 'codemirror' && this.cmInstance) ? this.cmInstance.view.state.doc.toString() : $textArea.val(); }, setValue: function(text) { $textArea.val(text); if (this.mode === 'codemirror' && this.cmInstance) { this.cmInstance.view.dispatch({ changes: { from: 0, to: this.cmInstance.view.state.doc.length, insert: text } }); } else { $textArea[0].dispatchEvent(new Event('input')); } }, setDisabled: function(d) { $textArea.prop('disabled', d); if (this.mode === 'codemirror' && this.cmInstance) { this.cmInstance.view.contentDOM.contentEditable = !d; $($textArea).parent().find('.cm-editor').css('opacity', d ? 0.5 : 1); } }, scrollToLine: function(n) { if (isNaN(n)) return; if (this.mode === 'codemirror' && this.cmInstance) { var v = this.cmInstance.view; var l = v.state.doc.line(n); v.dispatch({ effects: v.constructor.scrollIntoView(l.from, { y: 'center' }), selection: { anchor: l.from } }); v.focus(); } } }; var WorkerEngine = { activeWorker: null, workerURL: null, currentLibCode: null, timeoutTimer: null, initWorker: function(libCode) { this.destroy(); // Clean up existing if any this.currentLibCode = libCode || ""; var scriptContent = this.currentLibCode + "\n\n" + ` self.onmessage = async function(e) { try { var data = e.data; var inputs = data.texts || [data.text]; var vars = data.vars; var outputs = []; // Helper to construct async functions dynamically var AsyncFunction = Object.getPrototypeOf(async function(){}).constructor; function inject(str) { if (!str) return ""; return str.replace(/\\$x([A-Z]|x)/g, function(m) { return vars[m] || ""; }); } // Returns a Promise and handles 'await' inside user code async function execUserFunc(code, currentText, currentVars, sharedObj) { if (!code || code.trim() === "") return currentText; try { var func = new AsyncFunction('text', 'vars', 'shared', code); var res = await func(currentText, currentVars, sharedObj); if (res && typeof res === 'object' && res.skip) { return { _skipSignal: true, reason: res.reason || 'Script-requested skip' }; } return (res !== undefined) ? res : currentText; } catch (err) { throw err; // or: return currentText } } var shared = {}; // Shared context for this page for (var i = 0; i < inputs.length; i++) { var text = inputs[i]; // 1. Pre-Process var preRes; if (data.preCode && data.preCode.trim() !== "") { preRes = await execUserFunc(data.preCode, text, vars, shared); } else if (typeof wAwB_Pre === 'function') { try { preRes = await wAwB_Pre(text, vars, shared); if (preRes && typeof preRes === 'object' && preRes.skip) { preRes = { _skipSignal: true, reason: preRes.reason || 'Script-requested skip' }; } } catch (err) { preRes = text; } } else { preRes = text; } if (preRes && preRes._skipSignal) { self.postMessage({ skipped: true, reason: preRes.reason }); return; } text = (preRes !== undefined) ? preRes : text; // 2. Rules Processing if (data.rules && data.rules.length > 0) { data.rules.forEach(function(rule) { var findStr = inject(rule.find); if (!findStr) return; if (rule.isFunc) { try { var userFunc = new Function('match', 'groups', 'vars', 'shared', rule.replace); text = text.replace(new RegExp(findStr, (rule.flags || 'gmu').replace(/[^gimsuvy]/g, '')), function(...args) { var match = args[0]; var groups = args.slice(1, -2); try { var res = userFunc(match, groups, vars, shared); return res !== undefined ? res : match; } catch (err) { return match; } }); } catch (e) {} } else { var repStr = inject(rule.replace).replace(/\\\\n/g, "\\n").replace(/\\\\t/g, "\\t").replace(/\\\\r/g, "\\r"); if (rule.regex) { try { var flags = (rule.flags || 'gmu').replace(/[^gimsuvy]/g, ''); text = text.replace(new RegExp(findStr, flags), repStr); } catch (e) {} } else { var finalFind = findStr.replace(/\\\\n/g, "\\n").replace(/\\\\t/g, "\\t").replace(/\\\\r/g, "\\r"); text = text.split(finalFind).join(repStr); } } }); } // 3. Post-Process var postRes; if (data.postCode && data.postCode.trim() !== "") { postRes = await execUserFunc(data.postCode, text, vars, shared); } else if (typeof wAwB_Post === 'function') { try { postRes = await wAwB_Post(text, vars, shared); if (postRes && typeof postRes === 'object' && postRes.skip) { postRes = { _skipSignal: true, reason: postRes.reason || 'Script-requested skip' }; } } catch (err) { postRes = text; } } else { postRes = text; } if (postRes && postRes._skipSignal) { self.postMessage({ skipped: true, reason: postRes.reason }); return; } text = (postRes !== undefined) ? postRes : text; outputs.push(text); } self.postMessage({ success: true, texts: outputs, summaryAppend: shared.summaryAppend, summaryOverride: shared.summaryOverride }); } catch (err) { self.postMessage({ success: false, error: err.toString() }); } }; `; var blob = new Blob([scriptContent], { type: 'application/javascript' }); this.workerURL = URL.createObjectURL(blob); this.activeWorker = new Worker(this.workerURL); }, run: function(payload) { var self = this; return new Promise(function(resolve, reject) { // Re-init if no worker exists, or if the user changed the library code if (!self.activeWorker || self.currentLibCode !== (payload.libraryCode || "")) { self.initWorker(payload.libraryCode); } if (self.timeoutTimer) clearTimeout(self.timeoutTimer); self.timeoutTimer = setTimeout(function() { self.destroy(); // Assassinate the stuck worker reject("Script timed out (" + SCRIPT_TIMEOUT_MS + "ms)."); }, SCRIPT_TIMEOUT_MS); self.activeWorker.onmessage = function(e) { clearTimeout(self.timeoutTimer); if (e.data.skipped) resolve({ skipped: true, reason: e.data.reason }); else if (e.data.success) resolve({ success: true, texts: e.data.texts, summaryAppend: e.data.summaryAppend, summaryOverride: e.data.summaryOverride }); else reject(e.data.error); }; self.activeWorker.postMessage(payload); }); }, destroy: function() { if (this.activeWorker) { this.activeWorker.terminate(); this.activeWorker = null; } if (this.workerURL) { URL.revokeObjectURL(this.workerURL); this.workerURL = null; } if (this.timeoutTimer) { clearTimeout(this.timeoutTimer); this.timeoutTimer = null; } } }; var PageProtector = { store: [], getKey: function() { var id = this.store.length.toString(); var p = ""; for (var i = 0; i < id.length; i++) { p += String.fromCharCode(0xE010 + parseInt(id[i])); } return '\uE000' + p + '\uE001'; }, protect: function(text, mode, config, templateSpecies = null) { this.store = []; var self = this; var safeRep = function(t, r) { return t.replace(r, function(m) { if (!m) return m; var key = self.getKey(); self.store.push(m); return key; }); }; var shouldProcess = function(id) { if (mode === 'target') return config === id; return config[id] === true; }; var matchedBrackets = function(text, op, cl, species = '') { var newText = "", depth = 0, start = 0, cursor = 0; var speciesRegex = species ? new RegExp(species, 'iu') : null; for (var i = 0; i < text.length; i++) { if (text[i] === op[0] && text.slice(i, i + op.length) === op) { if (depth === 0) start = i; depth++; i += op.length - 1; } else if (text[i] === cl[0] && text.slice(i, i + cl.length) === cl) { if (depth > 0) { depth--; if (depth === 0) { var chunk = text.substring(start, i + cl.length); if (!speciesRegex || speciesRegex.test(chunk)) { var key = self.getKey(); self.store.push(chunk); newText += text.substring(cursor, start) + key; } else { newText += text.substring(cursor, i + cl.length); } cursor = i + cl.length; } i += cl.length - 1; } } } newText += text.substring(cursor); return newText; }; PROTECTION_DEFS.forEach(function(def) { if (shouldProcess(def.id)) { if (def.id === 'blocks') { ['math', 'pre', 'source', 'syntaxhighlight', 'code', 'gallery'].forEach(t => text = safeRep(text, new RegExp('<' + t + '[^>]*?>[\\s\\S]*?<\\/' + t + '>|<' + t + '[^>]*?/>', 'gi'))); } else if (['templates', 'tables', 'images'].includes(def.id)) { var activeSpecies = (def.id === 'templates') ? templateSpecies : def.species; text = matchedBrackets(text, def.open, def.close, activeSpecies || ''); } else if (def.regex) { text = safeRep(text, def.regex); } } }); return text; }, restore: function(text) { var self = this; var loop = 100; while (/(\uE000[\uE010-\uE019]+\uE001)/.test(text) && loop > 0) { text = text.replace(/\uE000([\uE010-\uE019]+)\uE001/g, function(m, d) { var id = ""; for (var i = 0; i < d.length; i++) id += (d.charCodeAt(i) - 0xE010).toString(); return self.store[parseInt(id, 10)] || m; }); loop--; } return text; } }; var accordionRegistry = []; function addSection(title, $inner) { var btn = new OO.ui.ButtonWidget({ label: title, indicator: 'down', framed: false, classes: ['wa-section-header'] }); var box = $('<div>').addClass('wa-foldable-content').append($inner); var sectionObj = { btn: btn, box: box, label: title }; accordionRegistry.push(sectionObj); btn.on('click', function() { var isOpening = !box.is(':visible'); if (isOpening) { accordionRegistry.forEach(function(sec) { if (sec !== sectionObj) { sec.box.hide(); sec.btn.setIndicator('down'); } }); } box.toggle(); btn.setIndicator(box.is(':visible') ? 'up' : 'down'); }); $content.append(btn.$element, box); return sectionObj; } // WIDGETS var srcSelect = new OO.ui.DropdownInputWidget({ options: [{ data: 'cat', label: 'Category' }, { data: 'linksto', label: 'Pages linking to...' }, { data: 'linkson', label: 'Links on page...' }, { data: 'prefix', label: 'Pages with prefix...' }, { data: 'watchlist', label: 'Watchlist' }, { data: 'search', label: 'Wiki search' }, { data: 'usercontribs', label: 'User contributions' }, { data: 'pageswithprop', label: 'Pages with property' }] }); var srcInput = new OO.ui.TextInputWidget({ placeholder: 'Category...' }); var now = new Date(); var today = now.toISOString().split('T')[0]; var srcInputUser = new OO.ui.TextInputWidget({ placeholder: 'Username' }); var srcInputStartDate = new OO.ui.TextInputWidget({ value: today + 'T00:00:00', placeholder: 'ISO start date' }); var srcInputEndDate = new OO.ui.TextInputWidget({ value: today + 'T23:59:59', placeholder: 'ISO end date' }); var srcDropProp = new OO.ui.DropdownInputWidget({ options: [] }); var $optContainer = $('<div>').addClass('wa-source-options').hide(); var $optCat = $('<div>').hide(); var $optUser = $('<div>').hide(); var $optProp = $('<div>').hide(); var chkCatPages = new OO.ui.CheckboxInputWidget({ selected: true }); var chkCatSub = new OO.ui.CheckboxInputWidget({ selected: false }); var chkCatFile = new OO.ui.CheckboxInputWidget({ selected: false }); $optCat.append($('<div>').addClass('wa-opt-label').text('Include:'), new OO.ui.FieldLayout(chkCatPages, { label: 'Pages', align: 'inline' }).$element, new OO.ui.FieldLayout(chkCatSub, { label: 'Subcats', align: 'inline' }).$element, new OO.ui.FieldLayout(chkCatFile, { label: 'Files', align: 'inline' }).$element); $optUser.append(new OO.ui.FieldLayout(srcInputUser, { label: 'User', align: 'top' }).$element, new OO.ui.FieldLayout(srcInputStartDate, { label: 'Start (Older)', align: 'top' }).$element, new OO.ui.FieldLayout(srcInputEndDate, { label: 'End (Newer)', align: 'top' }).$element); $optProp.append(new OO.ui.FieldLayout(srcDropProp, { label: 'Property', align: 'top' }).$element); var $optLinks = $('<div>').hide(); var chkLinkWiki = new OO.ui.CheckboxInputWidget({ selected: true }); var chkLinkTrans = new OO.ui.CheckboxInputWidget({ selected: false }); var chkLinkImg = new OO.ui.CheckboxInputWidget({ selected: false }); var dropLinkRedir = new OO.ui.DropdownInputWidget({ options: [{ data: 'nonredirects', label: 'No redirects' }, { data: 'all', label: 'Both' }, { data: 'redirects', label: 'Redirects only' }] }); var chkLinkToRedir = new OO.ui.CheckboxInputWidget({ selected: false }); $optLinks.append($('<div>').addClass('wa-opt-label').text('What to include:'), $('<div>').addClass('wa-opt-row').append(new OO.ui.FieldLayout(chkLinkWiki, { label: 'Wikilinks', align: 'inline' }).$element, new OO.ui.FieldLayout(chkLinkTrans, { label: 'Transclusions', align: 'inline' }).$element, new OO.ui.FieldLayout(chkLinkImg, { label: 'File usage', align: 'inline' }).$element), $('<div>').addClass('wa-opt-label').text('Redirects:'), dropLinkRedir.$element, new OO.ui.FieldLayout(chkLinkToRedir, { label: 'Include links to redirects', align: 'inline' }).$element); $optContainer.append($optCat, $optLinks, $optUser, $optProp); var queryCache = {}; var lastMode = 'cat'; srcSelect.on('change', function(newMode) { if (!isLoadingProject) { if (lastMode !== 'watchlist' && lastMode !== 'usercontribs' && lastMode !== 'pageswithprop') { queryCache[lastMode] = srcInput.getValue(); } } $optContainer.hide(); $optCat.hide(); $optLinks.hide(); $optUser.hide(); $optProp.hide(); srcInput.setDisabled(false).$element.show(); if (newMode === 'cat') { $optContainer.show(); $optCat.show(); } else if (newMode === 'linksto') { $optContainer.show(); $optLinks.show(); } else if (newMode === 'usercontribs') { $optContainer.show(); $optUser.show(); srcInput.setDisabled(true).$element.hide(); } else if (newMode === 'pageswithprop') { $optContainer.show(); $optProp.show(); srcInput.setDisabled(true).$element.hide(); if (!propNamesLoaded) { new mw.Api().get({ action: 'query', list: 'pagepropnames', ppnlimit: 'max' }).then(function(d) { if (d.query && d.query.pagepropnames) { srcDropProp.setOptions(d.query.pagepropnames.map(p => ({ data: p.propname, label: p.propname }))); propNamesLoaded = true; } }); } } if (newMode === 'watchlist') { srcInput.setValue(''); srcInput.setDisabled(true); srcInput.$input.attr('placeholder', '(No query needed)'); } else if (newMode !== 'usercontribs' && newMode !== 'pageswithprop') { srcInput.setValue(queryCache[newMode] || ''); var ph = 'Query...'; if (newMode === 'cat') ph = 'Category name'; if (newMode === 'search') ph = 'Search query...'; if (newMode === 'prefix') ph = 'Page prefix...'; if (newMode === 'linksto') ph = 'Pages linking to this title...'; if (newMode === 'linkson') ph = 'Get links from this page...'; srcInput.$input.attr('placeholder', ph); } lastMode = newMode; }); srcSelect.emit('change', srcSelect.getValue()); var $nsSelect = $('<select>').attr('id', 'wa-ns-selector').attr('multiple', 'multiple').attr('size', '8'); var nsMap = mw.config.get('wgFormattedNamespaces'); for (var id in nsMap) { if (parseInt(id) >= 0) $nsSelect.append($('<option>').val(id).text(id + ': ' + (nsMap[id] || '(Main)'))); } $nsSelect.val(['0']); var btnAdd = new OO.ui.ButtonWidget({ label: 'Add to list', icon: 'add', flags: ['primary', 'progressive'] }); var $btnRow = $('<div>').css({ 'display': 'flex', 'justify-content': 'flex-end', 'margin-top': '10px' }); var $fetchStatus = $('<span>').css({ 'margin-right': '10px', 'color': '#888', 'font-size': '0.9em', 'align-self': 'center' }).hide(); $btnRow.append($fetchStatus, btnAdd.$element); addSection('Source', $('<div>').append(new OO.ui.FieldLayout(srcSelect, { label: 'Mode', align: 'top' }).$element, new OO.ui.FieldLayout(srcInput, { label: 'Query', align: 'top' }).$element, $optContainer, $('<div>').text('Namespaces:').css({ 'font-weight': 'bold', 'margin-top': '5px' }), $nsSelect, $btnRow)); var redirMode = new OO.ui.RadioSelectWidget({ items: [new OO.ui.RadioOptionWidget({ data: 'edit', label: 'Edit the redirect page (Default)' }), new OO.ui.RadioOptionWidget({ data: 'follow', label: 'Follow redirect (Edit target)' }), new OO.ui.RadioOptionWidget({ data: 'skip', label: 'Skip redirects' })] }); redirMode.selectItemByData('edit'); var radSkipExist = new OO.ui.RadioSelectWidget({ items: [new OO.ui.RadioOptionWidget({ data: 'none', label: 'Process all' }), new OO.ui.RadioOptionWidget({ data: 'missing', label: 'Skip if page does not exist' }), new OO.ui.RadioOptionWidget({ data: 'exists', label: 'Skip if page exists' })] }); radSkipExist.selectItemByData('none'); var chkSkipNoChange = new OO.ui.CheckboxInputWidget({ selected: false }); var inpSkipContains = new OO.ui.TextInputWidget({ placeholder: 'Text/Regex for Skip if FOUND' }); var togSkipContainsRegex = new OO.ui.ToggleSwitchWidget({ value: false, title: 'Use regex' }); var inpSkipNotContains = new OO.ui.TextInputWidget({ placeholder: 'Text/Regex for Skip if MISSING' }); var togSkipNotContainsRegex = new OO.ui.ToggleSwitchWidget({ value: false, title: 'Use regex' }); var inpSkipCategories = new OO.ui.TextInputWidget({ placeholder: 'Skip if in: Category1|Category2' }); var inpSkipNotCategories = new OO.ui.TextInputWidget({ placeholder: 'Skip if NOT in: Category1|Category2' }); var $settingsPanel = $('<div>') .append($('<span>').addClass('wa-settings-header').text('Redirects')) .append(redirMode.$element) .append($('<hr>').css('border-top', '1px solid #eee')) .append($('<span>').addClass('wa-settings-header').text('Skip logic')) .append(new OO.ui.FieldLayout(chkSkipNoChange, { label: 'Skip if no changes made', align: 'inline' }).$element.css('margin-bottom', '8px')) .append(radSkipExist.$element) .append($('<hr>').css('border-top', '1px solid #eee')) .append($('<span>').addClass('wa-settings-header').text('Content filters')) .append($('<div>').addClass('wa-setting-row').append(inpSkipContains.$element.css('flex', 1), togSkipContainsRegex.$element.css('margin-left', '5px'))) .append($('<div>').addClass('wa-setting-row').append(inpSkipNotContains.$element.css('flex', 1), togSkipNotContainsRegex.$element.css('margin-left', '5px'))) .append($('<hr>').css('border-top', '1px solid #eee')) .append($('<span>').addClass('wa-settings-header').text('Category filters')) .append(new OO.ui.FieldLayout(inpSkipCategories, { label: 'Blacklist', align: 'top' }).$element) .append(new OO.ui.FieldLayout(inpSkipNotCategories, { label: 'Whitelist', align: 'top' }).$element); addSection('Skip', $settingsPanel); var dropProtMode = new OO.ui.DropdownInputWidget({ options: [{ data: 'protect', label: 'Protect (Exclude)' }, { data: 'target', label: 'Target (Edit Matches Only)' }] }); var inpTemplateFilter = new OO.ui.TextInputWidget({ placeholder: 'Regex: infobox rail line|railway' }); var $templateFilterLayout = new OO.ui.FieldLayout(inpTemplateFilter, { label: 'Template filter', align: 'top' }); var $protList = $('<div>'); var protCheckboxes = {}; PROTECTION_DEFS.forEach(function(def) { var chk = new OO.ui.CheckboxInputWidget({ selected: def.isOn }); protCheckboxes[def.id] = chk; $protList.append(new OO.ui.FieldLayout(chk, { label: def.label, align: 'inline' }).$element); }); var targetRadioItems = PROTECTION_DEFS.map(function(def) { return new OO.ui.RadioOptionWidget({ data: def.id, label: def.label }); }); var radTargetSet = new OO.ui.RadioSelectWidget({ items: targetRadioItems }); var $targetList = $('<div>').hide().append(radTargetSet.$element); dropProtMode.on('change', function(mode) { if (mode === 'protect') { $protList.show(); $targetList.hide(); } else { $protList.hide(); $targetList.show(); } }); addSection('Protection', $('<div>').addClass('wa-source-options') .append(new OO.ui.FieldLayout(dropProtMode, { label: 'Mode', align: 'top' }).$element) .append($('<hr>').css('border-top', '1px solid #eee')) .append($protList).append($targetList) .append($('<div style="margin-top:10px;">').append($templateFilterLayout.$element)) ); var $rulesList = $('<div>'); var btnAddRule = new OO.ui.ButtonWidget({ label: 'Add rule', icon: 'add' }); var rulesRegistry = []; addSection('Rules', $('<div>').append($rulesList, btnAddRule.$element)); var togWikiTypos = new OO.ui.ToggleSwitchWidget({ value: false }); var lblWikiStatus = $('<div>').css({ 'font-size': '0.9em', 'color': '#888', 'margin-top': '2px' }); var btnLoadLocal = new OO.ui.ButtonWidget({ icon: 'upload', label: 'Load file', framed: false }); var btnClearLocal = new OO.ui.ButtonWidget({ icon: 'trash', title: 'Clear local', framed: false, flags: 'destructive', disabled: true }); var lblLocalStatus = $('<div>').text('No local rules').css({ 'font-size': '0.9em', 'color': '#888', 'margin-top': '2px' }); var $typoInput = $('<input type="file">').hide().appendTo('body'); var $extRulesPanel = $('<div>').addClass('wa-source-options'); $extRulesPanel.append( $('<div>').css({ 'display': 'flex', 'align-items': 'center', 'justify-content': 'space-between' }).append($('<span>').text('Project:AutoWikiBrowser/Typos').css('font-weight', 'bold'), togWikiTypos.$element), $('<div>').css('margin-bottom', '10px').append(lblWikiStatus), $('<hr>').css('border-top', '1px solid #eee'), $('<div>').append($('<div>').css({ 'display': 'flex', 'align-items': 'center' }).append($('<span>').text('Local rules (session only)').css({ 'font-weight': 'bold' }), $('<div>').css('flex', '1'), btnLoadLocal.$element, btnClearLocal.$element), lblLocalStatus) ); addSection('External rules', $extRulesPanel); var txtPreScript = new OO.ui.MultilineTextInputWidget({ rows: 6, value: '', placeholder: '// Enter JavaScript function body here.\n// Available variables: text, vars, shared\nreturn text;' }); var txtPostScript = new OO.ui.MultilineTextInputWidget({ rows: 6, value: '', placeholder: '// Enter JavaScript function body here.\n// Available variables: text, vars, shared\nreturn text;' }); var btnLoadLib = new OO.ui.ButtonWidget({ icon: 'upload', title: 'Load library (.js)', framed: false }); var btnRemoveLib = new OO.ui.ButtonWidget({ icon: 'trash', title: 'Remove library', framed: false, flags: 'destructive' }); var txtLibStatus = new OO.ui.TextInputWidget({ value: '(No library loaded)', readOnly: true }); var $libInput = $('<input type="file" accept=".js">').hide().appendTo('body'); var btnEditLib = new OO.ui.ButtonWidget({ icon: 'edit', label: 'Edit project library', framed: false }); var $scriptPanel = $('<div>').append( $('<div>').css({ 'display': 'flex', 'align-items': 'center', 'gap': '5px', 'margin-bottom': '10px' }).append($('<span>').text('JS library:').css({ 'font-weight': 'bold', 'white-space': 'nowrap' }), txtLibStatus.$element.css('flex', '1'), btnLoadLib.$element, btnRemoveLib.$element), $('<div>').css({ 'display': 'flex', 'justify-content': 'flex-end', 'margin-bottom': '10px' }).append(btnEditLib.$element), new OO.ui.FieldLayout(txtPreScript, { label: 'Pre-Process', align: 'top' }).$element, new OO.ui.FieldLayout(txtPostScript, { label: 'Post-Process', align: 'top' }).$element ); addSection('Scripts', $scriptPanel); function updateLibUI() { if (currentLibrary.code) { txtLibStatus.setValue(currentLibrary.name); btnRemoveLib.setDisabled(false); } else { txtLibStatus.setValue('(No library loaded)'); btnRemoveLib.setDisabled(true); } } updateLibUI(); function LibraryEditorDialog(config) { LibraryEditorDialog.super.call(this, config); } OO.inheritClass(LibraryEditorDialog, OO.ui.ProcessDialog); LibraryEditorDialog.static.name = 'libraryEditor'; LibraryEditorDialog.static.title = 'Edit project library'; LibraryEditorDialog.static.actions = [{ action: 'save', label: 'Save', flags: ['primary', 'progressive'] }, { label: 'Cancel', flags: 'safe' } ]; LibraryEditorDialog.prototype.initialize = function() { LibraryEditorDialog.super.prototype.initialize.call(this); this.$element.addClass('wa-lib-dialog'); // Attach our custom CSS override class this.panel = new OO.ui.PanelLayout({ padded: true, expanded: true }); this.$editorWrapper = $('<div>').addClass('wa-lib-editorwrapper'); this.panel.$element.append(this.$editorWrapper); this.$body.append(this.panel.$element); }; LibraryEditorDialog.prototype.getSetupProcess = function(data) { data = data || {}; return LibraryEditorDialog.super.prototype.getSetupProcess.call(this, data) .next(function() { var self = this; self.$editorWrapper.empty(); // Create a textarea for the MediaWiki CM wrapper to properly bind to var $libTextArea = $('<textarea>').appendTo(self.$editorWrapper); var initCode = currentLibrary.code || "// All custom library functions defined here will be passed to the worker.\n// Special functions:\n// function wAwB_Pre(text, vars, shared) { return text; }\n// function wAwB_Post(text, vars, shared) { return text; }\n"; return mw.loader.using(['ext.CodeMirror', 'ext.CodeMirror.modes']).then(function(require) { var CM = require('ext.CodeMirror'); var modes = require('ext.CodeMirror.modes'); self.cmInstance = new CM($libTextArea[0], modes.javascript()); self.cmInstance.initialize(); self.cmInstance.view.dispatch({ changes: { from: 0, insert: initCode } }); // Force CodeMirror to fill the wrapper self.$editorWrapper.find('.cm-editor').css({ height: '100%' }); }).catch(function(err) { console.error("wAwB CM Init Error:", err); }); }, this); }; LibraryEditorDialog.prototype.getActionProcess = function(action) { var dialog = this; if (action === 'save') { return new OO.ui.Process(function() { var newCode = ""; if (dialog.cmInstance) { newCode = dialog.cmInstance.view.state.doc.toString(); } if (newCode.trim() === "") { currentLibrary = { name: null, code: null }; } else { currentLibrary.code = newCode; currentLibrary.name = "custom code"; } updateLibUI(); dialog.close({ action: action }); }); } if (action === 'cancel' || !action) { return new OO.ui.Process(function() { dialog.close({ action: action }); }); } return LibraryEditorDialog.super.prototype.getActionProcess.call(this, action); }; LibraryEditorDialog.prototype.getTeardownProcess = function(data) { return LibraryEditorDialog.super.prototype.getTeardownProcess.call(this, data) .next(function() { if (this.cmInstance) { try { this.cmInstance.view.destroy(); } catch (e) {} this.cmInstance = null; } }, this); }; var windowManager = new OO.ui.WindowManager(); $('body').append(windowManager.$element); var libDialog = new LibraryEditorDialog(); windowManager.addWindows([libDialog]); btnEditLib.on('click', function() { windowManager.openWindow(libDialog); }); var togAdminEnable = new OO.ui.ToggleSwitchWidget({ value: false }); var chkMovRedirect = new OO.ui.CheckboxInputWidget({ selected: false }); var chkMovTalk = new OO.ui.CheckboxInputWidget({ selected: true }); var chkMovSub = new OO.ui.CheckboxInputWidget({ selected: false }); var chkDelTalk = new OO.ui.CheckboxInputWidget({ selected: true }); var dropProtEdit = new OO.ui.DropdownInputWidget({ options: [{ data: '', label: '(No Change)' }, { data: 'all', label: 'All' }, { data: 'autoconfirmed', label: 'Autoconfirmed' }, { data: 'sysop', label: 'Sysop' }] }); var dropProtMove = new OO.ui.DropdownInputWidget({ options: [{ data: '', label: '(No Change)' }, { data: 'all', label: 'All' }, { data: 'autoconfirmed', label: 'Autoconfirmed' }, { data: 'sysop', label: 'Sysop' }] }); var inpProtExpiry = new OO.ui.TextInputWidget({ placeholder: 'infinite / 2 days / 12 hours' }); if (CAN_MOVE || IS_ADMIN) { var $adminPanel = $('<div>').append( $('<div>').css({ 'display': 'flex', 'align-items': 'center', 'justify-content': 'flex-start', 'gap': '10px' }).append($('<span>').text('Enable page actions').css('font-weight', 'bold'), togAdminEnable.$element), $('<hr>') ); if (CAN_MOVE) { $adminPanel.append( $('<strong>').text('Move options:'), new OO.ui.FieldLayout(chkMovRedirect, { label: 'Do not create redirect', align: 'inline' }).$element, new OO.ui.FieldLayout(chkMovTalk, { label: 'Move talk page', align: 'inline' }).$element, new OO.ui.FieldLayout(chkMovSub, { label: 'Move subpages', align: 'inline' }).$element, $('<br>') ); } if (IS_ADMIN) { $adminPanel.append( $('<strong>').text('Delete options:'), new OO.ui.FieldLayout(chkDelTalk, { label: 'Delete talk page', align: 'inline' }).$element, $('<br>'), $('<strong>').text('Protect options:'), new OO.ui.FieldLayout(dropProtEdit, { label: 'Edit level', align: 'top' }).$element, new OO.ui.FieldLayout(dropProtMove, { label: 'Move level', align: 'top' }).$element, new OO.ui.FieldLayout(inpProtExpiry, { label: 'Expiry', align: 'top' }).$element ); } addSection('Page actions', $adminPanel); } var btnPower = new OO.ui.ButtonWidget({ label: 'Start', icon: 'power', flags: ['primary', 'progressive'], title: 'Start editing', accessKey: 'a' }); var btnDiff = new OO.ui.ButtonWidget({ label: 'Diff', icon: 'update', title: 'Show diff', accessKey: 'd' }); var btnSkip = new OO.ui.ButtonWidget({ label: 'Next', icon: 'next', title: 'Skip to next page', accessKey: 'n', disabled: true }); var btnPreview = new OO.ui.ButtonWidget({ label: 'Preview', icon: 'article', title: 'Preview page', accessKey: 'p' }); var btnSave = new OO.ui.ButtonWidget({ label: 'Save', icon: 'upload', flags: 'progressive', title: 'Save edit', accessKey: 's', disabled: true }); var inputSummary = new OO.ui.TextInputWidget({ placeholder: '', value: '', title: 'Enter edit summary', accessKey: 'b' }); var $sumLayout = new OO.ui.FieldLayout(inputSummary, { label: 'Edit summary', align: 'top' }).$element; $sumLayout.css('margin-bottom', '6px'); var listTextarea = new OO.ui.MultilineTextInputWidget({ rows: 15, classes: ['wa-page-list-raw'] }); var btnSort = new OO.ui.ButtonWidget({ icon: 'sortVertical', title: 'Sort list', framed: false }); var btnDedup = new OO.ui.ButtonWidget({ icon: 'funnel', title: 'Remove duplicates', framed: false }); var btnClear = new OO.ui.ButtonWidget({ icon: 'trash', title: 'Clear list', framed: false }); var btnPreParse = new OO.ui.ButtonWidget({ label: 'Pre-parse', title: 'Process list in background', icon: 'robot', framed: false }); var $listCounter = $('<span>').addClass('wa-list-counter').text('0 pages'); var togAutoSave = new OO.ui.ToggleSwitchWidget({ value: false }); var txtAutoDelay = new OO.ui.TextInputWidget({ value: '10' }); var $botRow = $('<div>').addClass('wa-bot-row').hide(); if (PERMS.allowBot) { $botRow.show().append($('<span>').css('font-weight', 'bold').text('Bot mode: '), togAutoSave.$element, $('<span>').text('Delay (s):'), txtAutoDelay.$element.css('max-width', '40px')); togAutoSave.on('change', function(v) { if (v) txtAutoDelay.setValue('10'); }); } var sortAsc = true; var $procHeader = $('<div>').addClass('wa-section-header').attr('id', 'wa-proc-header').css({ 'display': 'flex', 'justify-content': 'space-between', 'align-items': 'center' }); var $procTitle = $('<span>').attr('id', 'wa-proc-title').text('Processing'); var chkMinor = new OO.ui.CheckboxInputWidget({ selected: true, title: 'Minor edit' }); var $minorLayout = new OO.ui.FieldLayout(chkMinor, { label: 'm', align: 'inline', title: 'Minor edit' }); $minorLayout.$element.css({ 'margin-right': '15px', 'font-weight': 'normal' }); $procHeader.append($procTitle, $minorLayout.$element); var $procContent = $('<div>').attr('id', 'wa-proc-content').append( $sumLayout, $botRow, $('<div>').addClass('wa-grid-container').append( $('<div>').addClass('wa-grid-col').append(btnPower.$element), $('<div>').addClass('wa-grid-col').append(btnDiff.$element, btnSkip.$element), $('<div>').addClass('wa-grid-col').append(btnPreview.$element, btnSave.$element) ), $('<div>').addClass('wa-toolbar').append($listCounter, btnSort.$element, btnDedup.$element, btnClear.$element), listTextarea.$element, $('<div>').css({ 'margin-top': '5px' }).append(btnPreParse.$element) ); $content.append($procHeader, $procContent); var configWidgets = [ srcSelect, srcInput, srcInputUser, srcInputStartDate, srcInputEndDate, srcDropProp, chkCatPages, chkCatSub, chkCatFile, chkLinkWiki, chkLinkTrans, chkLinkImg, dropLinkRedir, chkLinkToRedir, btnAdd, redirMode, chkSkipNoChange, radSkipExist, inpSkipContains, togSkipContainsRegex, inpSkipNotContains, togSkipNotContainsRegex, inpSkipCategories, inpSkipNotCategories, dropProtMode, radTargetSet, inpTemplateFilter, btnAddRule, txtPreScript, txtPostScript, chkMovRedirect, chkMovTalk, chkMovSub, chkDelTalk, dropProtEdit, dropProtMove, inpProtExpiry, togWikiTypos, btnLoadLocal, btnClearLocal, btnPreParse ]; // ===================================================================== // 5. FUNCTION DEFINITIONS (Core Logic) // ===================================================================== function checkSummaryWarning() { var val = inputSummary.getValue(); var isBlank = !val || val.trim() === ""; if (isBlank || hasNewSources) inputSummary.$element.addClass('wa-summary-warning'); else inputSummary.$element.removeClass('wa-summary-warning'); } function renderCurrentView() { if (currentViewMode === 'preview') renderPreview(); else renderDiff(); } function toggleConfig(isLocked) { configWidgets.forEach(function(w) { if (w instanceof OO.ui.TextInputWidget || w instanceof OO.ui.MultilineTextInputWidget) { w.setReadOnly(isLocked); w.$element.css('opacity', isLocked ? 0.8 : 1); } else { w.setDisabled(isLocked); } }); $nsSelect.prop('disabled', isLocked); for (var key in protCheckboxes) protCheckboxes[key].setDisabled(isLocked); rulesRegistry.forEach(function(r) { r.find.setReadOnly(isLocked); r.rep.setReadOnly(isLocked); r.regex.setDisabled(isLocked); r.flags.setReadOnly(isLocked); r.enable.setDisabled(isLocked); r.del.setDisabled(isLocked); r.btnFunc.setDisabled(isLocked || !r.regex.getValue()); r.btnUp.setDisabled(isLocked || rulesRegistry.indexOf(r) === 0); r.btnDown.setDisabled(isLocked || rulesRegistry.indexOf(r) === rulesRegistry.length - 1); }); if (CAN_MOVE || IS_ADMIN) togAdminEnable.setDisabled(isLocked); btnLoadLib.setDisabled(isLocked); btnRemoveLib.setDisabled(isLocked || !currentLibrary.code); btnEditLib.setDisabled(isLocked); btnLoadLocal.setDisabled(isLocked); btnClearLocal.setDisabled(isLocked || localTypos.length === 0); } function updateListCount() { var val = listTextarea.getValue(); var count = val.trim() ? val.split('\n').filter(function(l) { var line = l.trim(); return line !== "" && !line.startsWith("####"); }).length : 0; $listCounter.text(count + ' pages'); } listTextarea.on('change', updateListCount); function updateDirtyState() { if (isRunning && currentTitle && Editor.getValue() !== originalWikitext) $editorHeader.addClass('wa-dirty'); else $editorHeader.removeClass('wa-dirty'); } function removeTopLine() { var l = listTextarea.getValue().split('\n'); l.shift(); listTextarea.setValue(l.join('\n')); updateListCount(); } function updateInterfaceMode() { var isAdminMode = togAdminEnable.getValue(); var pageLoaded = !!currentTitle; btnSave.setDisabled(isAdminMode || !pageLoaded || !PERMS.canSave); btnSkip.setDisabled(!pageLoaded); btnPreview.setDisabled(!pageLoaded); btnDiff.setDisabled(isAdminMode || !pageLoaded); Editor.setDisabled(isAdminMode || !pageLoaded); if (CAN_MOVE) { var allowAdmin = isAdminMode && currentPageExists; btnAdminMove.setDisabled(!(allowAdmin && currentVars['$xA'])); if (currentVars['$xA']) btnAdminMove.setTitle('Move page to ' + currentVars['$xA']); else btnAdminMove.setTitle('Move page to $xA (Variable not set)'); } if (IS_ADMIN) { var allowAdmin = isAdminMode && currentPageExists; btnAdminDel.setDisabled(!allowAdmin); btnAdminProt.setDisabled(!allowAdmin); } } function renderDiff() { $visualOut.html('<div style="color:#888; text-align:center;">Generating Diff...</div>'); var currentText = Editor.getValue(); new mw.Api().post({ 'action': 'compare', fromtitle: currentTitle, toslots: 'main', 'totext-main': currentText, slots: 'main', topst: window.wa_diffPST ? true : undefined, prop: 'diff', formatversion: 2 }).then(function(data) { var diffBody = data.compare && data.compare.bodies && data.compare.bodies.main; if (diffBody) { $visualOut.html('<h4>Diff: ' + currentTitle + '</h4><table class="diff"><colgroup><col class="diff-marker"><col class="diff-content"><col class="diff-marker"><col class="diff-content"></colgroup><tbody>' + diffBody + '</tbody></table>'); processDiffTable(); } else { $visualOut.html('<div style="color:green; text-align:center; padding-top:20px;">No Changes detected</div>'); } }); } function processDiffTable() { var rightLineNum = 0; $visualOut.find('table.diff tr').each(function() { var $tr = $(this); var $linenos = $tr.find('td.diff-lineno'); if ($linenos.length > 0) { var txt = $linenos.last().text(); var m = txt.match(/(\d+)/); if (m) rightLineNum = parseInt(m[1]); return; } if ($tr.find('.diff-addedline').length > 0 || $tr.find('.diff-context').length > 0) { $tr.attr('data-line', rightLineNum); $tr.css('cursor', 'pointer').attr('title', 'Jump to line ' + rightLineNum); rightLineNum++; } }); // Attach a single delegated click listener to the table instead of every row $visualOut.find('table.diff').on('click', 'tr[data-line]', function() { Editor.scrollToLine(parseInt($(this).attr('data-line'))); }); } function renderPreview() { $visualOut.html('<div style="color:#888; text-align:center;">Generating Preview...</div>'); new mw.Api().post({ action: 'parse', title: currentTitle, text: Editor.getValue(), prop: 'text|categorieshtml|modules|jsconfigvars', useskin: mw.config.get('skin'), disablelimitreport: true, pst: true, contentmodel: 'wikitext' }).then(function(data) { if (data.parse && data.parse.text) { var $prev = $('<div>').html(data.parse.text['*']); if (data.parse.categorieshtml) $prev.append(data.parse.categorieshtml['*']); $prev.find('a').attr('target', '_blank'); $visualOut.empty().append($prev); mw.loader.using(data.parse.modules.concat(data.parse.modulestyles, data.parse.modulescripts), function() { mw.hook('wikipage.content').fire($('.wa-visual-output .mw-parser-output')); }); } }).catch(function(err) { $visualOut.html('Error generating preview.'); alert("Preview failed: " + err); }); } async function transformPageText(rawText, title, config) { var filters = config.filters; if (filters) { var check = function(text, rule) { if (!rule || !rule.val) return false; if (rule.regex) { try { return new RegExp(rule.val, 'mu').test(text); } catch (e) { return false; } } return text.indexOf(rule.val) !== -1; }; if (filters.skipContains && filters.skipContains.val && check(rawText, filters.skipContains)) { return { skipped: true, reason: 'Contains: ' + filters.skipContains.val }; } if (filters.skipNotContains && filters.skipNotContains.val && !check(rawText, filters.skipNotContains)) { return { skipped: true, reason: 'Missing: ' + filters.skipNotContains.val }; } } var mode = config.mode; var inputs = []; var compiledSpecies = null; if (config.templateFilter) { var tFilter = config.templateFilter; if (tFilter[0] === "^") tFilter = "^\\{\\{\\s*" + tFilter.slice(1); else tFilter = "\\{\\{\\s*" + tFilter; compiledSpecies = tFilter + "(?=\\s*[|}\\n])"; } var skeleton = PageProtector.protect(rawText, mode, config.excludes, compiledSpecies); if (mode === 'target') inputs = PageProtector.store; else inputs = [skeleton]; var combinedRules = rulesRegistry.filter(r => r.isActive()).map(r => ({ find: r.find.getValue(), replace: r.rep.getValue(), regex: r.regex.getValue(), flags: r.flags.getValue(), enabled: r.isActive(), isFunc: r.isFunc() })); if (togWikiTypos.getValue()) combinedRules = combinedRules.concat(wikiTypos); if (localTypos.length > 0) combinedRules = combinedRules.concat(localTypos); var payload = { texts: inputs, vars: config.vars, preCode: getUserCode(txtPreScript, 'wAwB_Pre'), libraryCode: currentLibrary.code, rules: combinedRules, postCode: getUserCode(txtPostScript, 'wAwB_Post') }; var result = await WorkerEngine.run(payload); if (result.skipped) return { skipped: true, reason: result.reason }; var finalText = ""; if (mode === 'target') { PageProtector.store = result.texts; finalText = PageProtector.restore(skeleton); } else { finalText = PageProtector.restore(result.texts[0]); } return { skipped: false, text: finalText, summaryAppend: result.summaryAppend, summaryOverride: result.summaryOverride }; } async function processPageContent() { try { setStatus('Processing...', 'working'); var mode = dropProtMode.getValue(); var activeConfig = { mode: mode, excludes: {}, templateFilter: inpTemplateFilter.getValue().trim(), vars: currentVars, filters: { skipContains: { val: inpSkipContains.getValue(), regex: togSkipContainsRegex.getValue() }, skipNotContains: { val: inpSkipNotContains.getValue(), regex: togSkipNotContainsRegex.getValue() } } }; if (mode === 'protect') { for (var k in protCheckboxes) activeConfig.excludes[k] = protCheckboxes[k].isSelected(); } else { var sel = radTargetSet.findSelectedItem(); activeConfig.excludes = sel ? sel.getData() : null; } var res = await transformPageText(originalWikitext, currentTitle, activeConfig); if (res.skipped) { removeTopLine(); loadNextPage(); return; } currentPageSummaryAppend = res.summaryAppend || ""; currentPageSummaryOverride = res.summaryOverride || null; updateSummaryPreview(inputSummary.getValue()); if (chkSkipNoChange.isSelected() && res.text === originalWikitext) { removeTopLine(); loadNextPage(); return; } setStatus('Ready'); Editor.setValue(res.text); if (CAN_MOVE || IS_ADMIN) updateInterfaceMode(); else { Editor.setDisabled(false); btnSave.setDisabled(!PERMS.canSave); btnSkip.setDisabled(false); btnPreview.setDisabled(false); btnDiff.setDisabled(false); } updateDirtyState(); renderCurrentView(); if (PERMS.allowBot && togAutoSave.getValue()) { var delay = Math.max(0, parseInt(txtAutoDelay.getValue(), 10) || 0) * 1000; setStatus('Auto-save in ' + (delay / 1000) + 's...', 'working'); if (autoSaveTimer) clearTimeout(autoSaveTimer); autoSaveTimer = setTimeout(function() { if (isRunning && PERMS.canSave) { btnSave.emit('click'); } }, delay); } } catch (e) { setStatus('Error', 'error'); alert(e); btnPower.emit('click'); } } async function runPreParseBatch() { // 1. Toggle / Stop Logic if (isRunning) { isRunning = false; setStatus('Stopping...', 'working'); btnPreParse.setLabel('Pre-parse'); return; } // 2. Start & Deduplicate var currentVal = listTextarea.getValue(); var cleanVal = getDeduplicatedList(currentVal).join('\n'); listTextarea.setValue(cleanVal); updateListCount(); isRunning = true; toggleUI(true); // 3. Lock UI toggleUI(true); btnSkip.setDisabled(true); btnDiff.setDisabled(true); btnPreview.setDisabled(true); btnSave.setDisabled(true); Editor.setDisabled(true); btnPreParse.setLabel('Stop pre-parse'); // Inject STOP marker if not present var currentList = listTextarea.getValue().split('\n'); if (!currentList.includes('####STOP')) { currentList.push('####STOP'); listTextarea.setValue(currentList.join('\n')); } // Gather Config var activeConfig = { mode: dropProtMode.getValue(), excludes: {}, templateFilter: inpTemplateFilter.getValue().trim(), vars: {}, filters: { skipContains: { val: inpSkipContains.getValue(), regex: togSkipContainsRegex.getValue() }, skipNotContains: { val: inpSkipNotContains.getValue(), regex: togSkipNotContainsRegex.getValue() } } }; if (activeConfig.mode === 'protect') { for (var k in protCheckboxes) activeConfig.excludes[k] = protCheckboxes[k].isSelected(); } else { var sel = radTargetSet.findSelectedItem(); activeConfig.excludes = sel ? sel.getData() : null; } setStatus('Pre-parsing...', 'working'); while (isRunning) { var lines = listTextarea.getValue().split('\n'); var batchTitles = []; var stopFound = false; for (var i = 0; i < lines.length; i++) { var line = lines[i]; if (line === '####STOP') { stopFound = true; break; } if (line && !line.startsWith('####')) { var parts = line.split('|'); batchTitles.push({ fullLine: line, title: parts[0], vars: parts.slice(1) }); } if (batchTitles.length >= 50) break; } if (batchTitles.length === 0) { if (stopFound) setStatus('Pre-parse complete'); else setStatus('List empty'); break; } $listCounter.text('Fetching ' + batchTitles.length + '...'); var badCats = inpSkipCategories.getValue().split('|').map(s => s.trim()).filter(s => s); var reqCats = inpSkipNotCategories.getValue().split('|').map(s => s.trim()).filter(s => s); var api = new mw.Api(); try { var data = await api.get({ action: 'query', prop: 'revisions' + (badCats.length + reqCats.length > 0 ? '|categories' : ''), titles: batchTitles.map(t => t.title).join('|'), rvprop: 'content', rvslots: 'main', redirects: 1, cllimit: 'max' }); var pageMap = {}; if (data.query && data.query.pages) Object.values(data.query.pages).forEach(p => pageMap[p.title] = p); var redirMap = {}; if (data.query && data.query.redirects) data.query.redirects.forEach(r => redirMap[r.from] = r.to); var keptLines = []; for (var k = 0; k < batchTitles.length; k++) { var item = batchTitles[k]; var lookupTitle = redirMap[item.title] || item.title; var page = pageMap[lookupTitle]; if (!page || page.missing || page.invalid || !page.revisions || !page.revisions[0]) { console.warn("Skipping invalid/missing page:", item.title); continue; } var pageCats = new Set((page.categories || []).map(c => c.title.replace(/^[^:]+:/, '').trim())); if (badCats.some(c => pageCats.has(c))) continue; // Skip if (reqCats.length > 0 && !reqCats.some(c => pageCats.has(c))) continue; // Skip var rawText = page.revisions[0].slots.main['*']; activeConfig.vars = { '$xx': item.title }; item.vars.forEach((v, idx) => activeConfig.vars['$x' + String.fromCharCode(65 + idx)] = v); var res = await transformPageText(rawText, item.title, activeConfig); // UPDATED LOGIC: Respect "Skip if no change" checkbox if (!res.skipped && (!chkSkipNoChange.isSelected() || res.text !== rawText)) { keptLines.push(item.fullLine); } } var freshLines = listTextarea.getValue().split('\n'); var stopIndex = -1; for (var x = 0; x < freshLines.length; x++) { if (freshLines[x] === '####STOP') { stopIndex = x; break; } } if (stopIndex > -1) { var topChunk = freshLines.slice(0, stopIndex); var botChunk = freshLines.slice(stopIndex + 1); var processedSet = new Set(batchTitles.map(t => t.fullLine)); var newTop = topChunk.filter(l => !processedSet.has(l)); var newList = newTop.concat(['####STOP']).concat(botChunk).concat(keptLines); listTextarea.setValue(newList.join('\n')); updateListCount(); } } catch (e) { console.error(e); setStatus('Batch error: ' + e, 'error'); break; } } isRunning = false; toggleUI(false); WorkerEngine.destroy(); btnPreParse.setLabel('Pre-parse'); if (listTextarea.getValue().startsWith('####STOP')) setStatus('Pre-parse done!'); else setStatus('Stopped'); } btnPreParse.on('click', runPreParseBatch); function loadNextPage() { if (!isRunning) return; var allLines = listTextarea.getValue().split('\n'); var listChanged = false; var stopCommand = false; while (allLines.length > 0) { var line = allLines[0]; if (line === '####STOP') { stopCommand = true; break; } if (line.startsWith('####') || line === "") { allLines.shift(); listChanged = true; } else { break; } } if (listChanged) { listTextarea.setValue(allLines.join('\n')); updateListCount(); } if (stopCommand) { btnPower.emit('click'); setStatus("Stopped by ####STOP"); return; } if (allLines.length === 0) { btnPower.emit('click'); setStatus("Done!"); return; } var raw = allLines[0]; var parts = raw.split('|'); currentTitle = parts[0].trim(); baseRevId = 0; originalWikitext = ""; if (!currentTitle) { removeTopLine(); loadNextPage(); return; } currentVars = {}; currentVars['$xx'] = currentTitle; for (var i = 1; i < parts.length; i++) currentVars['$x' + String.fromCharCode(64 + i)] = parts[i]; currentPageSummaryAppend = ""; currentPageSummaryOverride = null; updateSummaryPreview(inputSummary.getValue()); setStatus('Loading...', 'working'); btnSave.setDisabled(true); btnPreview.setDisabled(true); btnDiff.setDisabled(true); btnSkip.setDisabled(true); Editor.setDisabled(true); $titleLink.attr('href', mw.util.getUrl(currentTitle)).text(currentTitle); $editorHeader.removeClass('wa-dirty'); $visualOut.empty(); Editor.setValue('Loading...'); $infoContainer.empty(); currentPageExists = false; btnWatch.setDisabled(true); btnManualEdit.setDisabled(true); if (CAN_MOVE || IS_ADMIN) updateInterfaceMode(); var badCats = inpSkipCategories.getValue().split('|').map(s => s.trim()).filter(s => s); var reqCats = inpSkipNotCategories.getValue().split('|').map(s => s.trim()).filter(s => s); var api = new mw.Api(); var params = { action: 'query', prop: 'revisions|info' + (badCats.length + reqCats.length > 0 ? '|categories' : ''), titles: currentTitle, rvprop: 'content|timestamp|ids', rvslots: 'main', inprop: 'watched', cllimit: 'max' }; var rMode = redirMode.findSelectedItem().getData(); if (rMode === 'follow') params.redirects = 1; return api.get(params).then(async function(data) { var pid = Object.keys(data.query.pages)[0]; var page = data.query.pages[pid]; currentPageExists = !page.missing && !page.invalid; var pageCats = new Set((page.categories || []).map(c => c.title.replace(/^[^:]+:/, '').trim())); if (badCats.some(c => pageCats.has(c))) { setStatus('Skip: cat blacklist'); removeTopLine(); loadNextPage(); return; } if (reqCats.length > 0 && !reqCats.some(c => pageCats.has(c))) { setStatus('Skip: cat whitelist'); removeTopLine(); loadNextPage(); return; } if (rMode === 'follow' && data.query.redirects) { currentTitle = page.title; $titleLink.attr('href', mw.util.getUrl(currentTitle)).text(currentTitle); mw.notify('Redirect followed to: ' + currentTitle); } if (rMode === 'skip' && page.redirect !== undefined) { removeTopLine(); loadNextPage(); return; } var skipMode = radSkipExist.findSelectedItem().getData(); if (pid === "-1") { if (skipMode === 'missing') { removeTopLine(); loadNextPage(); return; } originalWikitext = ""; baseRevId = 0; } else { if (skipMode === 'exists') { removeTopLine(); loadNextPage(); return; } originalWikitext = page.revisions[0].slots.main['*']; baseRevId = page.revisions[0].revid; } if (page.revisions && page.revisions.length > 0) { var rev = page.revisions[0]; var ts = new Date(rev.timestamp).toISOString().replace('T', ' ').substring(0, 16); $infoContainer.empty().append('Last edit: ' + ts + ' | ', $('<a>').attr('href', mw.util.getUrl(currentTitle, { action: 'history' })).attr('target', '_blank').text('history')); } btnWatch.setDisabled(!currentPageExists); btnManualEdit.setDisabled(!currentPageExists); if (page.watched !== undefined) btnWatch.setIcon('unStar'); else btnWatch.setIcon('star'); if (CAN_MOVE || IS_ADMIN) { updateInterfaceMode(); if (togAdminEnable.getValue()) { Editor.setValue(originalWikitext); renderCurrentView(); setStatus('Ready (Page actions)'); return; } } processPageContent(); }).catch(function(e) { setStatus('API error', 'error'); alert('Load error: ' + e); btnPower.emit('click'); }); } async function fetchWithContinue(api, params) { var allTitles = new Set(); var continueToken = {}; var safetyLimit = FETCH_SAFETY_LIMIT; var count = 0; isFetching = true; btnAdd.setLabel('Cancel fetch'); $fetchStatus.text('Fetching...').show(); try { while (isFetching && count < safetyLimit) { var merged = Object.assign({}, params, continueToken); var data = await api.get(merged); var batch = []; if (data.watchlistraw) batch = data.watchlistraw; else if (data.query) { if (data.query.pages) batch = Object.values(data.query.pages); else if (data.query.categorymembers) batch = data.query.categorymembers; else if (data.query.backlinks) batch = data.query.backlinks; else if (data.query.embeddedin) batch = data.query.embeddedin; else if (data.query.imageusage) batch = data.query.imageusage; else if (data.query.search) batch = data.query.search; else if (data.query.allpages) batch = data.query.allpages; else if (data.query.usercontribs) batch = data.query.usercontribs; else if (data.query.pageswithprop) batch = data.query.pageswithprop; } if (batch.length > 0) { batch.forEach(item => { if (item.title) allTitles.add(item.title); }); count = allTitles.size; $fetchStatus.text('Fetched ' + count + '...'); } if (data.continue) continueToken = data.continue; else break; } } catch (e) { alert("Fetch interrupted: " + e); } isFetching = false; btnAdd.setLabel('Add to list').setDisabled(false); $fetchStatus.text('Added ' + allTitles.size + ' pages').delay(3000).fadeOut(); if (allTitles.size > 0) { hasNewSources = true; checkSummaryWarning(); } return Array.from(allTitles); } function toggleUI(d) { if (d) { btnPower.setLabel('Stop').setIcon('power').setFlags(['destructive']); } else { btnPower.setLabel('Start').setIcon('power').clearFlags().setFlags(['primary', 'progressive']); if (PERMS.allowBot) togAutoSave.setValue(false); } toggleConfig(d); btnSort.setDisabled(d); btnDedup.setDisabled(d); btnClear.setDisabled(d); btnSaveProj.setDisabled(d); btnLoadProj.setDisabled(d); btnSkip.setDisabled(!d); btnSave.setDisabled(true); listTextarea.setReadOnly(d); if (d) listTextarea.$element.addClass('wa-list-running'); else listTextarea.$element.removeClass('wa-list-running'); } function resetPanels() { Editor.setValue(''); $titleLink.text('Page content').removeAttr('href'); $editorHeader.removeClass('wa-dirty'); setStatus('Ready'); $('#wa-summary-preview').val(''); currentTitle = null; $visualOut.html('<div style="color:#aaa; text-align:center; margin-top:50px;">Ready...</div>'); $infoContainer.empty(); btnWatch.setDisabled(true); btnManualEdit.setDisabled(true); Editor.setDisabled(true); currentPageExists = false; if (CAN_MOVE || IS_ADMIN) updateInterfaceMode(); toggleUI(false); updateListCount(); if (autoSaveTimer) clearTimeout(autoSaveTimer); } function arrayMove(arr, old_index, new_index) { if (new_index >= arr.length) { var k = new_index - arr.length + 1; while (k--) arr.push(undefined); } arr.splice(new_index, 0, arr.splice(old_index, 1)[0]); } function updateRuleButtons() { rulesRegistry.forEach(function(item, idx) { item.btnUp.setDisabled(idx === 0); item.btnDown.setDisabled(idx === rulesRegistry.length - 1); }); } function addRule() { var row = $('<div>').addClass('wa-rule-row'); var controls = $('<div>').addClass('wa-rule-controls'); var btnUp = new OO.ui.ButtonWidget({ icon: 'collapse', framed: false, title: 'Move up', classes: ['wa-rule-btn'] }); var btnDown = new OO.ui.ButtonWidget({ icon: 'expand', framed: false, title: 'Move down', classes: ['wa-rule-btn'] }); controls.append(btnUp.$element, btnDown.$element); var contentDiv = $('<div>').addClass('wa-rule-content'); var f = new OO.ui.TextInputWidget({ placeholder: 'Find' }); var r = new OO.ui.TextInputWidget({ placeholder: 'Replace' }); var reg = new OO.ui.ToggleSwitchWidget(); var fl = new OO.ui.TextInputWidget({ value: 'gmu', disabled: true }).toggle(false); var btnEnable = new OO.ui.ButtonWidget({ icon: 'power', framed: false, title: 'Toggle rule', flags: ['progressive'] }); var isRuleActive = true; var btnFunc = new OO.ui.ButtonWidget({ icon: 'code', framed: false, title: 'Toggle JS mode', disabled: true }); var isRuleFunc = false; var toggleRule = function(forceVal) { var val = (forceVal !== undefined) ? forceVal : !isRuleActive; isRuleActive = val; row.css('opacity', isRuleActive ? 1 : 0.5); if (isRuleActive) btnEnable.setFlags(['progressive']); else btnEnable.clearFlags(); }; btnEnable.on('click', function() { toggleRule(); }); var toggleFunc = function(forceVal) { var val = (forceVal !== undefined) ? forceVal : !isRuleFunc; isRuleFunc = val; if (isRuleFunc) { btnFunc.setFlags(['progressive']); r.$input.attr('placeholder', 'return match.toUpperCase();'); } else { btnFunc.clearFlags(); r.$input.attr('placeholder', 'Replace'); } }; btnFunc.on('click', function() { toggleFunc(); }); btnFunc.toggle(false); reg.on('change', function(v) { fl.setDisabled(!v); fl.toggle(v); btnFunc.setDisabled(!v); if (!v) { btnFunc.toggle(false); if (isRuleFunc) toggleFunc(false); } else btnFunc.toggle(true); }); var del = new OO.ui.ButtonWidget({ icon: 'trash', flags: 'destructive', framed: false, title: 'Delete rule', }); del.on('click', function() { row.fadeOut(200, function() { row.remove(); rulesRegistry = rulesRegistry.filter(x => x.row !== row); updateRuleButtons(); }); }); contentDiv.append(f.$element, $('<div>').css('margin-top', '3px').append(r.$element), $('<div>').addClass('wa-rule-opt-row').append($('<div>').css({ 'display': 'flex', 'align-items': 'center' }).append($('<div>').css({ 'display': 'flex', 'align-items': 'center' }).append($('<span>').text('Regex: ').css({ 'font-size': '0.8em', 'margin-right': '4px' }), reg.$element, fl.$element.css({ 'width': '50px', 'margin-left': '5px' })), btnFunc.$element.css('margin-left', '10px')), $('<div>').css('display', 'flex').append(btnEnable.$element, del.$element))); row.append(controls, contentDiv); $rulesList.append(row); var ruleItem = { row: row, find: f, rep: r, regex: reg, flags: fl, btnUp: btnUp, btnDown: btnDown, enable: btnEnable, del: del, btnFunc: btnFunc, isActive: function() { return isRuleActive; }, setActive: toggleRule, isFunc: function() { return isRuleFunc; }, setFunc: toggleFunc }; rulesRegistry.push(ruleItem); btnUp.on('click', function() { var idx = rulesRegistry.indexOf(ruleItem); if (idx > 0) { var prevRow = rulesRegistry[idx - 1].row; row.fadeOut(150, function() { row.insertBefore(prevRow).fadeIn(150).addClass('wa-highlight'); setTimeout(function() { row.removeClass('wa-highlight'); }, 500); }); arrayMove(rulesRegistry, idx, idx - 1); updateRuleButtons(); } }); btnDown.on('click', function() { var idx = rulesRegistry.indexOf(ruleItem); if (idx < rulesRegistry.length - 1) { var nextRow = rulesRegistry[idx + 1].row; row.fadeOut(150, function() { row.insertAfter(nextRow).fadeIn(150).addClass('wa-highlight'); setTimeout(function() { row.removeClass('wa-highlight'); }, 500); }); arrayMove(rulesRegistry, idx, idx + 1); updateRuleButtons(); } }); updateRuleButtons(); } btnAddRule.on('click', addRule); addRule(); togWikiTypos.on('change', function(v) { if (v) { if (wikiTypos.length > 0) lblWikiStatus.text(wikiTypos.length + ' rules loaded (Cached)'); else { lblWikiStatus.text('Fetching...'); togWikiTypos.setDisabled(true); new mw.Api().get({ action: 'query', prop: 'revisions', titles: mw.config.get('wgFormattedNamespaces')[4] + ':AutoWikiBrowser/Typos', rvprop: 'content', rvslots: 'main', formatversion: 2 }).then(function(d) { var page = d.query.pages[0]; if (!page.missing) { wikiTypos = parseTypoContent(page.revisions[0].slots.main.content); lblWikiStatus.text(wikiTypos.length + ' rules loaded'); } else { lblWikiStatus.text('Page not found'); togWikiTypos.setValue(false); } }).catch(function() { lblWikiStatus.text('Error'); togWikiTypos.setValue(false); }).always(function() { togWikiTypos.setDisabled(false); }); } } else lblWikiStatus.text('Rules inactive'); }); btnLoadLocal.on('click', function() { $typoInput.click(); }); $typoInput.on('change', function(e) { var file = e.target.files[0]; if (!file) return; var reader = new FileReader(); reader.onload = function(evt) { localTypos = parseTypoContent(evt.target.result); lblLocalStatus.text(localTypos.length + ' local rules loaded'); btnClearLocal.setDisabled(false); }; reader.readAsText(file); $typoInput.val(''); }); btnClearLocal.on('click', function() { localTypos = []; lblLocalStatus.text('No local rules'); btnClearLocal.setDisabled(true); }); btnLoadLib.on('click', function() { $libInput.click(); }); btnRemoveLib.on('click', function() { currentLibrary = { name: null, code: null }; updateLibUI(); }); $libInput.on('change', function(e) { var file = e.target.files[0]; if (!file) return; var reader = new FileReader(); reader.onload = function(evt) { currentLibrary = { name: file.name, code: evt.target.result }; updateLibUI(); }; reader.readAsText(file); $libInput.val(''); }); btnPower.on('click', function() { hasNewSources = false; checkSummaryWarning(); if (!isRunning) { if (SAVED_SESSION === 0) mw.track('stats.mediawiki_gadget_wAwB_total'); isRunning = true; toggleUI(true); loadNextPage(); } else { if (SAVED_RUN > 0) { mw.track('stats.mediawiki_gadget_wAwB_saved_total', SAVED_RUN, { wiki: WIKI }); SAVED_SESSION += SAVED_RUN; SAVED_RUN = 0; } isRunning = false; toggleUI(false); WorkerEngine.destroy(); resetPanels(); } }); inputSummary.on('change', function() { checkSummaryWarning(); if (currentTitle) { updateSummaryPreview(inputSummary.getValue()); } }); btnSkip.on('click', function() { if (Editor.getValue() === 'Loading...') return; removeTopLine(); loadNextPage(); }); btnDiff.on('click', function() { currentViewMode = 'diff'; updateDirtyState(); if (currentTitle) renderDiff(); }); btnPreview.on('click', function() { currentViewMode = 'preview'; updateDirtyState(); if (currentTitle) renderPreview(); }); btnSave.on('click', function() { if (Editor.getValue() === 'Loading...' || !currentTitle) return; if (autoSaveTimer) clearTimeout(autoSaveTimer); btnSave.setDisabled(true); setStatus('Saving...', 'working'); var effectiveDelay = PERMS.saveDelay || 0; if (effectiveDelay > 0) setStatus('Throttling (' + (effectiveDelay / 1000) + 's)...', 'working'); setTimeout(function() { if (effectiveDelay > 0) setStatus('Saving...', 'working'); var finalSum = $('#wa-summary-preview').val().trim(); var summary = finalSum + SUMMARY_SUFFIX; new mw.Api().postWithToken('csrf', { action: 'edit', assert: 'user', //throw 'assertuserfailed' when logged-out title: currentTitle, text: Editor.getValue(), summary: summary, minor: chkMinor.isSelected(), baserevid: baseRevId, bot: PERMS.allowBot, watchlist: 'nochange', tags: DO_TAG ? APP_NAME : undefined }).then(function() { SAVED_RUN += 1; removeTopLine(); loadNextPage(); }).catch(function(c) { btnSave.setDisabled(false); setStatus('Save error', 'error'); alert('Save failed: ' + c); }); }, effectiveDelay); }); btnManualEdit.on('click', function() { if (Editor.getValue() === 'Loading...' || !currentTitle) return; // Calculate the final injected summary var base = currentPageSummaryOverride !== null ? currentPageSummaryOverride : inputSummary.getValue(); var finalSum = base + (currentPageSummaryAppend || ""); var translatedSummary = injectVars(finalSum); var summary = translatedSummary; // no SUMMARY_SUFFIX // Create an invisible form targeting a new tab var $form = $('<form>').attr({ method: 'POST', action: mw.util.getUrl(currentTitle, { action: 'edit' }), target: '_blank' }).hide(); // Populate it with MediaWiki's native input names $('<textarea>').attr('name', 'wpTextbox1').val(Editor.getValue()).appendTo($form); $('<input>').attr('name', 'wpSummary').val(summary).appendTo($form); if (chkMinor.isSelected()) { $('<input>').attr('name', 'wpMinoredit').val('1').appendTo($form); } // Append, fire, and destroy $form.appendTo('body').submit().remove(); }); btnWatch.on('click', function() { var isWatched = btnWatch.getIcon() === 'unStar'; new mw.Api()[isWatched ? 'unwatch' : 'watch'](currentTitle).then(function() { btnWatch.setIcon(isWatched ? 'star' : 'unStar'); mw.notify(isWatched ? 'Unwatched' : 'Watched'); }); }); btnAdd.on('click', function() { if (isFetching) { isFetching = false; btnAdd.setDisabled(true).setLabel('Cancelling...'); return; } try { var mode = srcSelect.getValue(), q = srcInput.getValue().trim(); if (mode !== 'watchlist' && mode !== 'usercontribs' && mode !== 'pageswithprop' && !q) { alert('Query empty'); return; } var nsIds = ($nsSelect.val() || []).map(v => parseInt(v)); var nsStr = nsIds.join('|'); var api = new mw.Api(), promises = []; if (mode === 'cat') promises.push(fetchWithContinue(api, { action: 'query', list: 'categorymembers', cmtitle: mw.Title.newFromText(q, 14) ? mw.Title.newFromText(q, 14).getPrefixedText() : 'Category:' + q, cmnamespace: nsStr, cmtype: (chkCatPages.isSelected() ? 'page|' : '') + (chkCatSub.isSelected() ? 'subcat|' : '') + (chkCatFile.isSelected() ? 'file' : ''), cmlimit: 'max' })); else if (mode === 'linksto') { if (chkLinkWiki.isSelected()) promises.push(fetchWithContinue(api, { action: 'query', list: 'backlinks', bltitle: q, blnamespace: nsStr, bllimit: 'max', blfilterredir: dropLinkRedir.getValue(), blredirect: chkLinkToRedir.isSelected() })); if (chkLinkTrans.isSelected()) promises.push(fetchWithContinue(api, { action: 'query', list: 'embeddedin', eititle: q, einamespace: nsStr, eilimit: 'max', eifilterredir: dropLinkRedir.getValue() })); if (chkLinkImg.isSelected()) promises.push(fetchWithContinue(api, { action: 'query', list: 'imageusage', iutitle: q, iunamespace: nsStr, iulimit: 'max', iufilterredir: dropLinkRedir.getValue() })); } else if (mode === 'linkson') promises.push(fetchWithContinue(api, { action: 'query', generator: 'links', titles: q, gplnamespace: nsStr, gpllimit: 'max', prop: 'info' })); else if (mode === 'prefix') promises.push(fetchWithContinue(api, { action: 'query', list: 'allpages', apprefix: q, apnamespace: nsIds[0] || 0, aplimit: 'max' })); else if (mode === 'watchlist') promises.push(fetchWithContinue(api, { action: 'query', list: 'watchlistraw', wrnamespace: nsStr, wrlimit: 'max' })); else if (mode === 'search') promises.push(fetchWithContinue(api, { action: 'query', list: 'search', srsearch: q, srnamespace: nsStr, srlimit: 'max' })); else if (mode === 'usercontribs') promises.push(fetchWithContinue(api, { action: 'query', list: 'usercontribs', ucuser: srcInputUser.getValue(), ucstart: srcInputStartDate.getValue(), ucend: srcInputEndDate.getValue(), ucdir: 'newer', uclimit: 'max', ucnamespace: nsStr, ucprop: 'title' })); else if (mode === 'pageswithprop') promises.push(fetchWithContinue(api, { action: 'query', list: 'pageswithprop', pwppropname: srcDropProp.getValue(), pwplimit: 'max' })); Promise.all(promises).then(function(res) { var list = new Set(); res.forEach(titles => titles.forEach(t => list.add(t))); var currentVal = listTextarea.getValue(); var newVal = Array.from(list).join('\n'); listTextarea.setValue(currentVal ? currentVal + '\n' + newVal : newVal); mw.notify('Added ' + list.size + ' pages'); }).catch(e => alert('Error: ' + e)); } catch (e) { alert("Fetch error: " + e); } }); btnSort.on('click', function() { var v = listTextarea.getValue(); if (v) { var lines = getNormalizedList(v); lines.sort((a, b) => sortAsc ? a.localeCompare(b) : b.localeCompare(a)); listTextarea.setValue(lines.join('\n')); sortAsc = !sortAsc; } }); btnDedup.on('click', function() { var v = listTextarea.getValue(); if (v) listTextarea.setValue(getDeduplicatedList(v).join('\n')); }); btnClear.on('click', function() { listTextarea.setValue(''); }); btnSaveProj.on('click', function() { try { var currentMode = srcSelect.getValue(); if (['watchlist', 'usercontribs', 'pageswithprop'].indexOf(currentMode) === -1) queryCache[currentMode] = srcInput.getValue(); var saveExcludes = {}; for (var k in protCheckboxes) saveExcludes[k] = protCheckboxes[k].isSelected(); var data = { version: APP_VERSION, library: currentLibrary, source: { activeMode: currentMode, namespaces: ($nsSelect.val() || []).map(v => parseInt(v)), modes: { cat: { query: queryCache['cat'] || '', options: { pages: chkCatPages.isSelected(), sub: chkCatSub.isSelected(), file: chkCatFile.isSelected() } }, linksto: { query: queryCache['linksto'] || '', options: { wiki: chkLinkWiki.isSelected(), trans: chkLinkTrans.isSelected(), img: chkLinkImg.isSelected(), redir: dropLinkRedir.getValue(), toRedir: chkLinkToRedir.isSelected() } }, linkson: { query: queryCache['linkson'] || '' }, prefix: { query: queryCache['prefix'] || '' }, watchlist: { query: '' }, search: { query: queryCache['search'] || '' }, usercontribs: { options: { user: srcInputUser.getValue(), start: srcInputStartDate.getValue(), end: srcInputEndDate.getValue() } }, pageswithprop: { options: { prop: srcDropProp.getValue() } } } }, settings: { redir: redirMode.findSelectedItem().getData(), skipLogic: radSkipExist.findSelectedItem().getData(), skipNoChange: chkSkipNoChange.isSelected(), minor: chkMinor.isSelected() }, filters: { contains: { val: inpSkipContains.getValue(), regex: togSkipContainsRegex.getValue() }, notContains: { val: inpSkipNotContains.getValue(), regex: togSkipNotContainsRegex.getValue() }, categories: { skip: inpSkipCategories.getValue(), require: inpSkipNotCategories.getValue() } }, rules: rulesRegistry.map(r => ({ find: r.find.getValue(), replace: r.rep.getValue(), regex: r.regex.getValue(), flags: r.flags.getValue(), enabled: r.isActive(), isFunc: r.isFunc() })), scripts: { pre: txtPreScript.getValue(), post: txtPostScript.getValue() }, processing: { summary: inputSummary.getValue(), list: listTextarea.getValue() }, protection: { mode: dropProtMode.getValue(), excludes: saveExcludes, target: (radTargetSet.findSelectedItem() || { getData: () => null }).getData(), templateFilter: inpTemplateFilter.getValue() } }; var a = document.createElement('a'); a.href = URL.createObjectURL(new Blob([JSON.stringify(data, null, 1)], { type: "application/json" })); a.download = "wawb_project.json"; a.click(); } catch (e) { alert("Save error: " + e); } }); btnLoadProj.on('click', function() { $fileInput.click(); }); $fileInput.on('change', function(e) { var file = e.target.files[0]; if (!file) return; var reader = new FileReader(); reader.onload = function(evt) { try { var data = JSON.parse(evt.target.result); isLoadingProject = true; if (data.source) { if (data.source.namespaces) $nsSelect.val(data.source.namespaces.map(String)); if (data.source.modes) { var m = data.source.modes; queryCache = {}; for (var key in m) if (m[key].query !== undefined) queryCache[key] = m[key].query; if (m.cat && m.cat.options) { chkCatPages.setSelected(m.cat.options.pages); chkCatSub.setSelected(m.cat.options.sub); chkCatFile.setSelected(m.cat.options.file); } if (m.linksto && m.linksto.options) { chkLinkWiki.setSelected(m.linksto.options.wiki); chkLinkTrans.setSelected(m.linksto.options.trans); chkLinkImg.setSelected(m.linksto.options.img); dropLinkRedir.setValue(m.linksto.options.redir); chkLinkToRedir.setSelected(m.linksto.options.toRedir); } if (m.usercontribs && m.usercontribs.options) { srcInputUser.setValue(m.usercontribs.options.user); srcInputStartDate.setValue(m.usercontribs.options.start); srcInputEndDate.setValue(m.usercontribs.options.end); } if (m.pageswithprop && m.pageswithprop.options) srcDropProp.setValue(m.pageswithprop.options.prop); } if (data.source.activeMode) { srcSelect.setValue(data.source.activeMode); isLoadingProject = false; srcSelect.emit('change', data.source.activeMode); isLoadingProject = true; } } if (data.settings) { redirMode.selectItemByData(data.settings.redir); chkSkipNoChange.setSelected(data.settings.skipNoChange); radSkipExist.selectItemByData(data.settings.skipLogic); if (data.settings.minor !== undefined) chkMinor.setSelected(data.settings.minor); } if (data.protection) { dropProtMode.setValue(data.protection.mode); for (var k in data.protection.excludes) if (protCheckboxes[k]) protCheckboxes[k].setSelected(data.protection.excludes[k]); if (data.protection.target) radTargetSet.selectItemByData(data.protection.target); if (data.protection.templateFilter) inpTemplateFilter.setValue(data.protection.templateFilter); } if (data.library) { currentLibrary = data.library; updateLibUI(); } if (data.filters) { inpSkipContains.setValue(data.filters.contains.val); togSkipContainsRegex.setValue(data.filters.contains.regex); inpSkipNotContains.setValue(data.filters.notContains.val); togSkipNotContainsRegex.setValue(data.filters.notContains.regex); } if (data.filters.categories) { inpSkipCategories.setValue(data.filters.categories.skip); inpSkipNotCategories.setValue(data.filters.categories.require); } rulesRegistry.forEach(r => r.row.remove()); rulesRegistry = []; $rulesList.empty(); if (data.rules) data.rules.forEach(r => { addRule(); var last = rulesRegistry[rulesRegistry.length - 1]; last.find.setValue(r.find); last.rep.setValue(r.replace); last.regex.setValue(r.regex); last.flags.setValue(r.flags); last.flags.setDisabled(!r.regex); last.setActive(r.enabled); if (r.isFunc) last.setFunc(true); }); if (rulesRegistry.length === 0) addRule(); if (data.scripts) { txtPreScript.setValue(data.scripts.pre); txtPostScript.setValue(data.scripts.post); } if (data.processing) { inputSummary.setValue(data.processing.summary); listTextarea.setValue(data.processing.list); } isLoadingProject = false; setStatus('Project loaded'); } catch (err) { alert("Error: " + err); } $fileInput.val(''); }; reader.readAsText(file); }); if (CAN_MOVE || IS_ADMIN) { togAdminEnable.on('change', function(val) { if (!currentTitle) { updateInterfaceMode(); return; } if (val) { Editor.setValue(originalWikitext); updateInterfaceMode(); renderDiff(); setStatus('Ready (Page actions)'); } else processPageContent(); }); } if (CAN_MOVE) { btnAdminMove.on('click', function() { if (!currentVars['$xA']) { mw.notify('Variable $xA not set', { type: 'error' }); return; } new mw.Api().postWithToken('csrf', { action: 'move', assert: 'user', //throw 'assertuserfailed' when logged-out from: currentTitle, to: currentVars['$xA'], reason: inputSummary.getValue() + SUMMARY_SUFFIX, movetalk: chkMovTalk.isSelected(), movesubpages: chkMovSub.isSelected(), noredirect: chkMovRedirect.isSelected() }).then(function() { removeTopLine(); loadNextPage(); }).catch(e => alert('Move failed: ' + e)); }); } if (IS_ADMIN) { btnAdminDel.on('click', function() { new mw.Api().postWithToken('csrf', { action: 'delete', assert: 'user', //throw 'assertuserfailed' when logged-out title: currentTitle, reason: inputSummary.getValue() + SUMMARY_SUFFIX }).then(function() { if (chkDelTalk.isSelected()) new mw.Api().postWithToken('csrf', { action: 'delete', title: mw.Title.newFromText(currentTitle).getTalkPage().getPrefixedText(), reason: 'Talk page of deleted page' }); removeTopLine(); loadNextPage(); }).catch(e => alert('Delete failed: ' + e)); }); btnAdminProt.on('click', function() { var protections = []; if (dropProtEdit.getValue()) protections.push('edit=' + dropProtEdit.getValue()); if (dropProtMove.getValue()) protections.push('move=' + dropProtMove.getValue()); new mw.Api().postWithToken('csrf', { action: 'protect', assert: 'user', //throw 'assertuserfailed' when logged-out title: currentTitle, protections: protections.join('|'), expiry: inpProtExpiry.getValue() || 'infinite', reason: inputSummary.getValue() + SUMMARY_SUFFIX }).then(function() { removeTopLine(); loadNextPage(); }).catch(e => alert('Protect failed: ' + e)); }); } Editor.init(); resetPanels(); }); $(window).on('beforeunload', function() { return "You have unsaved work."; }); }).catch(e => console.error("wAwB Loader Error:", e)); //</nowiki> p4euplb3f9j6d84zkh8k8gb1fx9w62k User:Whyiseverythingalreadyused/sandbox 2 172117 747799 735769 2026-06-21T00:05:11Z Whyiseverythingalreadyused 70199 747799 wikitext text/x-wiki {{user sandbox}} [[:Category:{{random|19{{random|8|9}}|20{{random|0|1}}}}0s cars]] 0y51u28hm7ul2s8wkufopamattga2ml User:User97104 2 173974 747681 745416 2026-06-20T14:05:15Z User97104 72884 747681 wikitext text/x-wiki User97104 will make an alternate account on Test Wikipedia for testing. 4767nsgonmijz08356c4tjhb0fvdzyq 747682 747681 2026-06-20T14:05:47Z User97104 72884 747682 wikitext text/x-wiki User97104 has an alternate account on Test Wikipedia for testing. It is 97104-Test. fki1ckra5gqa485ws0ssvf6lv951r2z User:Ludo Games-T 2 175020 747753 739391 2026-06-20T17:30:05Z Ludo Games-T 73707 747753 wikitext text/x-wiki Hello, '''Ludo Games-T''' here! [[:commons:User:Ludo Games-T|Commons]] [[:en:User:Ludo Games-T|English Wikipedia]] [[:pt:Usuário:Ludo Games-T|Portuguese Wikipedia]] '''[[:simple:User:Ludo Games-T|Simple English Wikipedia]]''' [[:es:User:Ludo Games-T|Spanish Wikipedia]] '''Test Wikipedia''' [https://test2.wikipedia.org/wiki/User:Ludo_Games-T Test2 Wikipedia] [https://warper.wmflabs.org/users/8059 Wikimaps Warper] mlg0kkzavpryjsxtol5ofyemacun3j1 Mergetest1 0 176325 747758 747647 2026-06-20T21:23:37Z Trialpears 43074 [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as mergefalse ([[WP:XFDC#4.0.16|XFDcloser]]) 747758 wikitext text/x-wiki {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} 9tvp52vom14uui3vh1k6tb37d11llpy 747762 747758 2026-06-20T21:25:09Z Trialpears 43074 [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as merge ([[WP:XFDC#4.0.16|XFDcloser]]) 747762 wikitext text/x-wiki {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} jpl9jtpkc1lov00249enke8qbm38sty 747765 747762 2026-06-20T21:25:52Z Trialpears 43074 [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as mergeinto [[mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]]) 747765 wikitext text/x-wiki {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} dgd7fx5mkqvi9gl286aft1l5bbddz0y 747770 747765 2026-06-20T21:27:18Z Trialpears 43074 [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as merge into [[mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]]) 747770 wikitext text/x-wiki {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} h2aya918pzy1albki795m3jrb9plgtu 747773 747770 2026-06-20T21:33:06Z Trialpears 43074 [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as merge into [[Mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]]) 747773 wikitext text/x-wiki {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} {{Afd-merge to|Mergetest2|discussion=Mergetest1|date=18 June 2026}} cpy7kaxu4sco64ezbwkgbuzfepfyiy4 747776 747773 2026-06-20T21:33:53Z Trialpears 43074 [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as redirect to [[Mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]]) 747776 wikitext text/x-wiki #REDIRECT [[Mergetest2]] mxo6a6oy1o9qh89g0hhb2972ehz8j1j 747780 747776 2026-06-20T21:45:36Z Trialpears 43074 [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as redirect ([[WP:XFDC#4.0.16|XFDcloser]]) 747780 wikitext text/x-wiki #REDIRECT [[Mergetest2]] {{Rcat shell| {{R to related topic}} }} ggd9waar9oa4kovuuv97lz2lwt1a7fz 747790 747780 2026-06-20T21:51:46Z Trialpears 43074 [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as merge into [[Mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]]) 747790 wikitext text/x-wiki {{Afd-merge to|Mergetest2|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} #REDIRECT [[Mergetest2]] {{Rcat shell| {{R to related topic}} }} dycsw7fprakv6soxze7o6qz8cwn9ypf Talk:Mergetest1 1 176335 747756 747644 2026-06-20T21:23:37Z Trialpears 43074 Old AFD: [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as mergefalse ([[WP:XFDC#4.0.16|XFDcloser]]) 747756 wikitext text/x-wiki {{Old AfD multi |date=16 June 2026 |result='''merge''' |page=Mergetest1 |date2=16 June 2026 |result2='''Merge''' |page2=Mergetest1 |date3=16 June 2026 |result3='''Merge''' |page3=Mergetest1 |date4=16 June 2026 |result4='''Merge''' |page4=Mergetest1 |date5=16 June 2026 |result5='''Merge''' |page5=Mergetest1 |date6=16 June 2026 |result6='''Merge''' |page6=Mergetest1 |date7=16 June 2026 |result7='''Merge''' |page7=Mergetest1 |date8=16 June 2026 |result8='''Merge''' |page8=Mergetest1 |date9=16 June 2026 |result9='''Merge''' |page9=Mergetest1 |date10=16 June 2026 |result10='''Merge''' |page10=Mergetest1 |date11=16 June 2026 |result11='''Merge''' |page11=Mergetest1 |date12=16 June 2026 |result12='''Merge''' |page12=Mergetest1 |date13=16 June 2026 |result13='''Merge''' |page13=Mergetest1 |date14=16 June 2026 |result14='''Merge''' |page14=Mergetest1 |date15=16 June 2026 |result15='''Merge''' |page15=Mergetest1 |date16=16 June 2026 |result16='''Merge''' |page16=Mergetest1 |date17=16 June 2026 |result17='''Merge''' |page17=Mergetest1 |date18=16 June 2026 |result18='''Merge''' |page18=Mergetest1 |date19=16 June 2026 |result19='''Merge''' |page19=Mergetest1 |date20=16 June 2026 |result20='''Merge''' |page20=Mergetest1 |date21=16 June 2026 |result21='''Merge''' |page21=Mergetest1 |date22=16 June 2026 |result22='''Merge''' |page22=Mergetest1 |date23=16 June 2026 |result23='''Merge''' |page23=Mergetest1 |date24=16 June 2026 |result24='''Merge''' |page24=Mergetest1 |date25=16 June 2026 |result25='''Merge''' |page25=Mergetest1 |date26=16 June 2026 |result26='''Merge''' |page26=Mergetest1 |date27=16 June 2026 |result27='''Merge''' |page27=Mergetest1 |date28=16 June 2026 |result28='''Merge''' |page28=Mergetest1 |date29=16 June 2026 |result29='''Merge''' |page29=Mergetest1 |date30=16 June 2026 |result30='''Merge''' |page30=Mergetest1 |date31=16 June 2026 |result31='''Merge''' |page31=Mergetest1 |date32=16 June 2026 |result32='''Merge''' |page32=Mergetest1 |date33=16 June 2026 |result33='''Merge''' |page33=Mergetest1 |date34=16 June 2026 |result34='''Merge''' |page34=Mergetest1 |date35=16 June 2026 |result35='''Merge''' |page35=Mergetest1 |date36=16 June 2026 |result36='''Merge''' |page36=Mergetest1 |date37=16 June 2026 |result37='''Merge''' |page37=Mergetest1 |date38=16 June 2026 |result38='''Merge''' |page38=Mergetest1 |date39=16 June 2026 |result39='''Merge''' |page39=Mergetest1 |date40=16 June 2026 |result40='''Merge''' |page40=Mergetest1 |date41=16 June 2026 |result41='''Merge''' |page41=Mergetest1 |date42=16 June 2026 |result42='''Merge''' |page42=Mergetest1 |date43=16 June 2026 |result43='''Merge''' |page43=Mergetest1 |date44=18 June 2026 |result44='''Merge''' |page44=Mergetest1 (2nd nomination) |date45=18 June 2026 |result45='''Merge''' |page45=Mergetest1 (2nd nomination) |date46=18 June 2026 |result46='''Merge''' |page46=Mergetest1 (2nd nomination) |date47=18 June 2026 |result47='''Merge''' |page47=Mergetest1 (2nd nomination) |date48=18 June 2026 |result48='''Merge''' |page48=Mergetest1 (2nd nomination) |date49=18 June 2026 |result49='''Merge''' |page49=Mergetest1 (2nd nomination) |date50=18 June 2026 |result50='''Keep''' |page50=Mergetest1 (2nd nomination) |date51=18 June 2026 |result51='''Merge''' |page51=Mergetest1 (2nd nomination) |date52=18 June 2026 |result52='''Merge''' |page52=Mergetest1 (2nd nomination) |date53=18 June 2026 |result53='''Merge''' |page53=Mergetest1 (2nd nomination) |date54=18 June 2026 |result54='''Merge''' |page54=Mergetest1 (2nd nomination) |date55=18 June 2026 |result55='''Merge''' |page55=Mergetest1 (2nd nomination) |date56=18 June 2026 |result56='''Merge''' |page56=Mergetest1 (2nd nomination) |date57=18 June 2026 |result57='''Merge''' |page57=Mergetest1 (2nd nomination) |date58=18 June 2026 |result58='''Merge''' |page58=Mergetest1 (2nd nomination) |date59=18 June 2026 |result59='''Merge''' |page59=Mergetest1 (2nd nomination) |date60=18 June 2026 |result60='''Merge''' |page60=Mergetest1 (2nd nomination) |date61=18 June 2026 |result61='''Merge''' |page61=Mergetest1 (2nd nomination) |date62=18 June 2026 |result62='''Merge''' |page62=Mergetest1 (2nd nomination) |date63=18 June 2026 |result63='''Merge''' |page63=Mergetest1 (2nd nomination) |date64=18 June 2026 |result64='''Mergefalse''' |page64=Mergetest1 (2nd nomination)}} ne8l9f0wcydofhb5nk9cysob25nk4b8 747760 747756 2026-06-20T21:25:09Z Trialpears 43074 Old AFD: [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as merge ([[WP:XFDC#4.0.16|XFDcloser]]) 747760 wikitext text/x-wiki {{Old AfD multi |date=16 June 2026 |result='''merge''' |page=Mergetest1 |date2=16 June 2026 |result2='''Merge''' |page2=Mergetest1 |date3=16 June 2026 |result3='''Merge''' |page3=Mergetest1 |date4=16 June 2026 |result4='''Merge''' |page4=Mergetest1 |date5=16 June 2026 |result5='''Merge''' |page5=Mergetest1 |date6=16 June 2026 |result6='''Merge''' |page6=Mergetest1 |date7=16 June 2026 |result7='''Merge''' |page7=Mergetest1 |date8=16 June 2026 |result8='''Merge''' |page8=Mergetest1 |date9=16 June 2026 |result9='''Merge''' |page9=Mergetest1 |date10=16 June 2026 |result10='''Merge''' |page10=Mergetest1 |date11=16 June 2026 |result11='''Merge''' |page11=Mergetest1 |date12=16 June 2026 |result12='''Merge''' |page12=Mergetest1 |date13=16 June 2026 |result13='''Merge''' |page13=Mergetest1 |date14=16 June 2026 |result14='''Merge''' |page14=Mergetest1 |date15=16 June 2026 |result15='''Merge''' |page15=Mergetest1 |date16=16 June 2026 |result16='''Merge''' |page16=Mergetest1 |date17=16 June 2026 |result17='''Merge''' |page17=Mergetest1 |date18=16 June 2026 |result18='''Merge''' |page18=Mergetest1 |date19=16 June 2026 |result19='''Merge''' |page19=Mergetest1 |date20=16 June 2026 |result20='''Merge''' |page20=Mergetest1 |date21=16 June 2026 |result21='''Merge''' |page21=Mergetest1 |date22=16 June 2026 |result22='''Merge''' |page22=Mergetest1 |date23=16 June 2026 |result23='''Merge''' |page23=Mergetest1 |date24=16 June 2026 |result24='''Merge''' |page24=Mergetest1 |date25=16 June 2026 |result25='''Merge''' |page25=Mergetest1 |date26=16 June 2026 |result26='''Merge''' |page26=Mergetest1 |date27=16 June 2026 |result27='''Merge''' |page27=Mergetest1 |date28=16 June 2026 |result28='''Merge''' |page28=Mergetest1 |date29=16 June 2026 |result29='''Merge''' |page29=Mergetest1 |date30=16 June 2026 |result30='''Merge''' |page30=Mergetest1 |date31=16 June 2026 |result31='''Merge''' |page31=Mergetest1 |date32=16 June 2026 |result32='''Merge''' |page32=Mergetest1 |date33=16 June 2026 |result33='''Merge''' |page33=Mergetest1 |date34=16 June 2026 |result34='''Merge''' |page34=Mergetest1 |date35=16 June 2026 |result35='''Merge''' |page35=Mergetest1 |date36=16 June 2026 |result36='''Merge''' |page36=Mergetest1 |date37=16 June 2026 |result37='''Merge''' |page37=Mergetest1 |date38=16 June 2026 |result38='''Merge''' |page38=Mergetest1 |date39=16 June 2026 |result39='''Merge''' |page39=Mergetest1 |date40=16 June 2026 |result40='''Merge''' |page40=Mergetest1 |date41=16 June 2026 |result41='''Merge''' |page41=Mergetest1 |date42=16 June 2026 |result42='''Merge''' |page42=Mergetest1 |date43=16 June 2026 |result43='''Merge''' |page43=Mergetest1 |date44=18 June 2026 |result44='''Merge''' |page44=Mergetest1 (2nd nomination) |date45=18 June 2026 |result45='''Merge''' |page45=Mergetest1 (2nd nomination) |date46=18 June 2026 |result46='''Merge''' |page46=Mergetest1 (2nd nomination) |date47=18 June 2026 |result47='''Merge''' |page47=Mergetest1 (2nd nomination) |date48=18 June 2026 |result48='''Merge''' |page48=Mergetest1 (2nd nomination) |date49=18 June 2026 |result49='''Merge''' |page49=Mergetest1 (2nd nomination) |date50=18 June 2026 |result50='''Keep''' |page50=Mergetest1 (2nd nomination) |date51=18 June 2026 |result51='''Merge''' |page51=Mergetest1 (2nd nomination) |date52=18 June 2026 |result52='''Merge''' |page52=Mergetest1 (2nd nomination) |date53=18 June 2026 |result53='''Merge''' |page53=Mergetest1 (2nd nomination) |date54=18 June 2026 |result54='''Merge''' |page54=Mergetest1 (2nd nomination) |date55=18 June 2026 |result55='''Merge''' |page55=Mergetest1 (2nd nomination) |date56=18 June 2026 |result56='''Merge''' |page56=Mergetest1 (2nd nomination) |date57=18 June 2026 |result57='''Merge''' |page57=Mergetest1 (2nd nomination) |date58=18 June 2026 |result58='''Merge''' |page58=Mergetest1 (2nd nomination) |date59=18 June 2026 |result59='''Merge''' |page59=Mergetest1 (2nd nomination) |date60=18 June 2026 |result60='''Merge''' |page60=Mergetest1 (2nd nomination) |date61=18 June 2026 |result61='''Merge''' |page61=Mergetest1 (2nd nomination) |date62=18 June 2026 |result62='''Merge''' |page62=Mergetest1 (2nd nomination) |date63=18 June 2026 |result63='''Merge''' |page63=Mergetest1 (2nd nomination) |date64=18 June 2026 |result64='''Mergefalse''' |page64=Mergetest1 (2nd nomination) |date65=18 June 2026 |result65='''Merge''' |page65=Mergetest1 (2nd nomination)}} a2x1v7iaito9j3tqwzsaxkvgf8xh362 747764 747760 2026-06-20T21:25:52Z Trialpears 43074 Old AFD: [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as mergeinto [[mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]]) 747764 wikitext text/x-wiki {{Old AfD multi |date=16 June 2026 |result='''merge''' |page=Mergetest1 |date2=16 June 2026 |result2='''Merge''' |page2=Mergetest1 |date3=16 June 2026 |result3='''Merge''' |page3=Mergetest1 |date4=16 June 2026 |result4='''Merge''' |page4=Mergetest1 |date5=16 June 2026 |result5='''Merge''' |page5=Mergetest1 |date6=16 June 2026 |result6='''Merge''' |page6=Mergetest1 |date7=16 June 2026 |result7='''Merge''' |page7=Mergetest1 |date8=16 June 2026 |result8='''Merge''' |page8=Mergetest1 |date9=16 June 2026 |result9='''Merge''' |page9=Mergetest1 |date10=16 June 2026 |result10='''Merge''' |page10=Mergetest1 |date11=16 June 2026 |result11='''Merge''' |page11=Mergetest1 |date12=16 June 2026 |result12='''Merge''' |page12=Mergetest1 |date13=16 June 2026 |result13='''Merge''' |page13=Mergetest1 |date14=16 June 2026 |result14='''Merge''' |page14=Mergetest1 |date15=16 June 2026 |result15='''Merge''' |page15=Mergetest1 |date16=16 June 2026 |result16='''Merge''' |page16=Mergetest1 |date17=16 June 2026 |result17='''Merge''' |page17=Mergetest1 |date18=16 June 2026 |result18='''Merge''' |page18=Mergetest1 |date19=16 June 2026 |result19='''Merge''' |page19=Mergetest1 |date20=16 June 2026 |result20='''Merge''' |page20=Mergetest1 |date21=16 June 2026 |result21='''Merge''' |page21=Mergetest1 |date22=16 June 2026 |result22='''Merge''' |page22=Mergetest1 |date23=16 June 2026 |result23='''Merge''' |page23=Mergetest1 |date24=16 June 2026 |result24='''Merge''' |page24=Mergetest1 |date25=16 June 2026 |result25='''Merge''' |page25=Mergetest1 |date26=16 June 2026 |result26='''Merge''' |page26=Mergetest1 |date27=16 June 2026 |result27='''Merge''' |page27=Mergetest1 |date28=16 June 2026 |result28='''Merge''' |page28=Mergetest1 |date29=16 June 2026 |result29='''Merge''' |page29=Mergetest1 |date30=16 June 2026 |result30='''Merge''' |page30=Mergetest1 |date31=16 June 2026 |result31='''Merge''' |page31=Mergetest1 |date32=16 June 2026 |result32='''Merge''' |page32=Mergetest1 |date33=16 June 2026 |result33='''Merge''' |page33=Mergetest1 |date34=16 June 2026 |result34='''Merge''' |page34=Mergetest1 |date35=16 June 2026 |result35='''Merge''' |page35=Mergetest1 |date36=16 June 2026 |result36='''Merge''' |page36=Mergetest1 |date37=16 June 2026 |result37='''Merge''' |page37=Mergetest1 |date38=16 June 2026 |result38='''Merge''' |page38=Mergetest1 |date39=16 June 2026 |result39='''Merge''' |page39=Mergetest1 |date40=16 June 2026 |result40='''Merge''' |page40=Mergetest1 |date41=16 June 2026 |result41='''Merge''' |page41=Mergetest1 |date42=16 June 2026 |result42='''Merge''' |page42=Mergetest1 |date43=16 June 2026 |result43='''Merge''' |page43=Mergetest1 |date44=18 June 2026 |result44='''Merge''' |page44=Mergetest1 (2nd nomination) |date45=18 June 2026 |result45='''Merge''' |page45=Mergetest1 (2nd nomination) |date46=18 June 2026 |result46='''Merge''' |page46=Mergetest1 (2nd nomination) |date47=18 June 2026 |result47='''Merge''' |page47=Mergetest1 (2nd nomination) |date48=18 June 2026 |result48='''Merge''' |page48=Mergetest1 (2nd nomination) |date49=18 June 2026 |result49='''Merge''' |page49=Mergetest1 (2nd nomination) |date50=18 June 2026 |result50='''Keep''' |page50=Mergetest1 (2nd nomination) |date51=18 June 2026 |result51='''Merge''' |page51=Mergetest1 (2nd nomination) |date52=18 June 2026 |result52='''Merge''' |page52=Mergetest1 (2nd nomination) |date53=18 June 2026 |result53='''Merge''' |page53=Mergetest1 (2nd nomination) |date54=18 June 2026 |result54='''Merge''' |page54=Mergetest1 (2nd nomination) |date55=18 June 2026 |result55='''Merge''' |page55=Mergetest1 (2nd nomination) |date56=18 June 2026 |result56='''Merge''' |page56=Mergetest1 (2nd nomination) |date57=18 June 2026 |result57='''Merge''' |page57=Mergetest1 (2nd nomination) |date58=18 June 2026 |result58='''Merge''' |page58=Mergetest1 (2nd nomination) |date59=18 June 2026 |result59='''Merge''' |page59=Mergetest1 (2nd nomination) |date60=18 June 2026 |result60='''Merge''' |page60=Mergetest1 (2nd nomination) |date61=18 June 2026 |result61='''Merge''' |page61=Mergetest1 (2nd nomination) |date62=18 June 2026 |result62='''Merge''' |page62=Mergetest1 (2nd nomination) |date63=18 June 2026 |result63='''Merge''' |page63=Mergetest1 (2nd nomination) |date64=18 June 2026 |result64='''Mergefalse''' |page64=Mergetest1 (2nd nomination) |date65=18 June 2026 |result65='''Merge''' |page65=Mergetest1 (2nd nomination) |date66=18 June 2026 |result66='''Mergeinto [[mergetest2]]''' |page66=Mergetest1 (2nd nomination)}} olabp8nz7a8llhelwqmvdl1ehlnlpn0 747769 747764 2026-06-20T21:27:18Z Trialpears 43074 Old AFD: [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as merge into [[mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]]) 747769 wikitext text/x-wiki {{Old AfD multi |date=16 June 2026 |result='''merge''' |page=Mergetest1 |date2=16 June 2026 |result2='''Merge''' |page2=Mergetest1 |date3=16 June 2026 |result3='''Merge''' |page3=Mergetest1 |date4=16 June 2026 |result4='''Merge''' |page4=Mergetest1 |date5=16 June 2026 |result5='''Merge''' |page5=Mergetest1 |date6=16 June 2026 |result6='''Merge''' |page6=Mergetest1 |date7=16 June 2026 |result7='''Merge''' |page7=Mergetest1 |date8=16 June 2026 |result8='''Merge''' |page8=Mergetest1 |date9=16 June 2026 |result9='''Merge''' |page9=Mergetest1 |date10=16 June 2026 |result10='''Merge''' |page10=Mergetest1 |date11=16 June 2026 |result11='''Merge''' |page11=Mergetest1 |date12=16 June 2026 |result12='''Merge''' |page12=Mergetest1 |date13=16 June 2026 |result13='''Merge''' |page13=Mergetest1 |date14=16 June 2026 |result14='''Merge''' |page14=Mergetest1 |date15=16 June 2026 |result15='''Merge''' |page15=Mergetest1 |date16=16 June 2026 |result16='''Merge''' |page16=Mergetest1 |date17=16 June 2026 |result17='''Merge''' |page17=Mergetest1 |date18=16 June 2026 |result18='''Merge''' |page18=Mergetest1 |date19=16 June 2026 |result19='''Merge''' |page19=Mergetest1 |date20=16 June 2026 |result20='''Merge''' |page20=Mergetest1 |date21=16 June 2026 |result21='''Merge''' |page21=Mergetest1 |date22=16 June 2026 |result22='''Merge''' |page22=Mergetest1 |date23=16 June 2026 |result23='''Merge''' |page23=Mergetest1 |date24=16 June 2026 |result24='''Merge''' |page24=Mergetest1 |date25=16 June 2026 |result25='''Merge''' |page25=Mergetest1 |date26=16 June 2026 |result26='''Merge''' |page26=Mergetest1 |date27=16 June 2026 |result27='''Merge''' |page27=Mergetest1 |date28=16 June 2026 |result28='''Merge''' |page28=Mergetest1 |date29=16 June 2026 |result29='''Merge''' |page29=Mergetest1 |date30=16 June 2026 |result30='''Merge''' |page30=Mergetest1 |date31=16 June 2026 |result31='''Merge''' |page31=Mergetest1 |date32=16 June 2026 |result32='''Merge''' |page32=Mergetest1 |date33=16 June 2026 |result33='''Merge''' |page33=Mergetest1 |date34=16 June 2026 |result34='''Merge''' |page34=Mergetest1 |date35=16 June 2026 |result35='''Merge''' |page35=Mergetest1 |date36=16 June 2026 |result36='''Merge''' |page36=Mergetest1 |date37=16 June 2026 |result37='''Merge''' |page37=Mergetest1 |date38=16 June 2026 |result38='''Merge''' |page38=Mergetest1 |date39=16 June 2026 |result39='''Merge''' |page39=Mergetest1 |date40=16 June 2026 |result40='''Merge''' |page40=Mergetest1 |date41=16 June 2026 |result41='''Merge''' |page41=Mergetest1 |date42=16 June 2026 |result42='''Merge''' |page42=Mergetest1 |date43=16 June 2026 |result43='''Merge''' |page43=Mergetest1 |date44=18 June 2026 |result44='''Merge''' |page44=Mergetest1 (2nd nomination) |date45=18 June 2026 |result45='''Merge''' |page45=Mergetest1 (2nd nomination) |date46=18 June 2026 |result46='''Merge''' |page46=Mergetest1 (2nd nomination) |date47=18 June 2026 |result47='''Merge''' |page47=Mergetest1 (2nd nomination) |date48=18 June 2026 |result48='''Merge''' |page48=Mergetest1 (2nd nomination) |date49=18 June 2026 |result49='''Merge''' |page49=Mergetest1 (2nd nomination) |date50=18 June 2026 |result50='''Keep''' |page50=Mergetest1 (2nd nomination) |date51=18 June 2026 |result51='''Merge''' |page51=Mergetest1 (2nd nomination) |date52=18 June 2026 |result52='''Merge''' |page52=Mergetest1 (2nd nomination) |date53=18 June 2026 |result53='''Merge''' |page53=Mergetest1 (2nd nomination) |date54=18 June 2026 |result54='''Merge''' |page54=Mergetest1 (2nd nomination) |date55=18 June 2026 |result55='''Merge''' |page55=Mergetest1 (2nd nomination) |date56=18 June 2026 |result56='''Merge''' |page56=Mergetest1 (2nd nomination) |date57=18 June 2026 |result57='''Merge''' |page57=Mergetest1 (2nd nomination) |date58=18 June 2026 |result58='''Merge''' |page58=Mergetest1 (2nd nomination) |date59=18 June 2026 |result59='''Merge''' |page59=Mergetest1 (2nd nomination) |date60=18 June 2026 |result60='''Merge''' |page60=Mergetest1 (2nd nomination) |date61=18 June 2026 |result61='''Merge''' |page61=Mergetest1 (2nd nomination) |date62=18 June 2026 |result62='''Merge''' |page62=Mergetest1 (2nd nomination) |date63=18 June 2026 |result63='''Merge''' |page63=Mergetest1 (2nd nomination) |date64=18 June 2026 |result64='''Mergefalse''' |page64=Mergetest1 (2nd nomination) |date65=18 June 2026 |result65='''Merge''' |page65=Mergetest1 (2nd nomination) |date66=18 June 2026 |result66='''Mergeinto [[mergetest2]]''' |page66=Mergetest1 (2nd nomination) |date67=18 June 2026 |result67='''Merge into [[mergetest2]]''' |page67=Mergetest1 (2nd nomination)}} 4k0d4ufhfac3hpxo3zsomsd9v9fvq2a 747774 747769 2026-06-20T21:33:06Z Trialpears 43074 Old AFD: [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as merge into [[Mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]]) 747774 wikitext text/x-wiki {{Old AfD multi |date=16 June 2026 |result='''merge''' |page=Mergetest1 |date2=16 June 2026 |result2='''Merge''' |page2=Mergetest1 |date3=16 June 2026 |result3='''Merge''' |page3=Mergetest1 |date4=16 June 2026 |result4='''Merge''' |page4=Mergetest1 |date5=16 June 2026 |result5='''Merge''' |page5=Mergetest1 |date6=16 June 2026 |result6='''Merge''' |page6=Mergetest1 |date7=16 June 2026 |result7='''Merge''' |page7=Mergetest1 |date8=16 June 2026 |result8='''Merge''' |page8=Mergetest1 |date9=16 June 2026 |result9='''Merge''' |page9=Mergetest1 |date10=16 June 2026 |result10='''Merge''' |page10=Mergetest1 |date11=16 June 2026 |result11='''Merge''' |page11=Mergetest1 |date12=16 June 2026 |result12='''Merge''' |page12=Mergetest1 |date13=16 June 2026 |result13='''Merge''' |page13=Mergetest1 |date14=16 June 2026 |result14='''Merge''' |page14=Mergetest1 |date15=16 June 2026 |result15='''Merge''' |page15=Mergetest1 |date16=16 June 2026 |result16='''Merge''' |page16=Mergetest1 |date17=16 June 2026 |result17='''Merge''' |page17=Mergetest1 |date18=16 June 2026 |result18='''Merge''' |page18=Mergetest1 |date19=16 June 2026 |result19='''Merge''' |page19=Mergetest1 |date20=16 June 2026 |result20='''Merge''' |page20=Mergetest1 |date21=16 June 2026 |result21='''Merge''' |page21=Mergetest1 |date22=16 June 2026 |result22='''Merge''' |page22=Mergetest1 |date23=16 June 2026 |result23='''Merge''' |page23=Mergetest1 |date24=16 June 2026 |result24='''Merge''' |page24=Mergetest1 |date25=16 June 2026 |result25='''Merge''' |page25=Mergetest1 |date26=16 June 2026 |result26='''Merge''' |page26=Mergetest1 |date27=16 June 2026 |result27='''Merge''' |page27=Mergetest1 |date28=16 June 2026 |result28='''Merge''' |page28=Mergetest1 |date29=16 June 2026 |result29='''Merge''' |page29=Mergetest1 |date30=16 June 2026 |result30='''Merge''' |page30=Mergetest1 |date31=16 June 2026 |result31='''Merge''' |page31=Mergetest1 |date32=16 June 2026 |result32='''Merge''' |page32=Mergetest1 |date33=16 June 2026 |result33='''Merge''' |page33=Mergetest1 |date34=16 June 2026 |result34='''Merge''' |page34=Mergetest1 |date35=16 June 2026 |result35='''Merge''' |page35=Mergetest1 |date36=16 June 2026 |result36='''Merge''' |page36=Mergetest1 |date37=16 June 2026 |result37='''Merge''' |page37=Mergetest1 |date38=16 June 2026 |result38='''Merge''' |page38=Mergetest1 |date39=16 June 2026 |result39='''Merge''' |page39=Mergetest1 |date40=16 June 2026 |result40='''Merge''' |page40=Mergetest1 |date41=16 June 2026 |result41='''Merge''' |page41=Mergetest1 |date42=16 June 2026 |result42='''Merge''' |page42=Mergetest1 |date43=16 June 2026 |result43='''Merge''' |page43=Mergetest1 |date44=18 June 2026 |result44='''Merge''' |page44=Mergetest1 (2nd nomination) |date45=18 June 2026 |result45='''Merge''' |page45=Mergetest1 (2nd nomination) |date46=18 June 2026 |result46='''Merge''' |page46=Mergetest1 (2nd nomination) |date47=18 June 2026 |result47='''Merge''' |page47=Mergetest1 (2nd nomination) |date48=18 June 2026 |result48='''Merge''' |page48=Mergetest1 (2nd nomination) |date49=18 June 2026 |result49='''Merge''' |page49=Mergetest1 (2nd nomination) |date50=18 June 2026 |result50='''Keep''' |page50=Mergetest1 (2nd nomination) |date51=18 June 2026 |result51='''Merge''' |page51=Mergetest1 (2nd nomination) |date52=18 June 2026 |result52='''Merge''' |page52=Mergetest1 (2nd nomination) |date53=18 June 2026 |result53='''Merge''' |page53=Mergetest1 (2nd nomination) |date54=18 June 2026 |result54='''Merge''' |page54=Mergetest1 (2nd nomination) |date55=18 June 2026 |result55='''Merge''' |page55=Mergetest1 (2nd nomination) |date56=18 June 2026 |result56='''Merge''' |page56=Mergetest1 (2nd nomination) |date57=18 June 2026 |result57='''Merge''' |page57=Mergetest1 (2nd nomination) |date58=18 June 2026 |result58='''Merge''' |page58=Mergetest1 (2nd nomination) |date59=18 June 2026 |result59='''Merge''' |page59=Mergetest1 (2nd nomination) |date60=18 June 2026 |result60='''Merge''' |page60=Mergetest1 (2nd nomination) |date61=18 June 2026 |result61='''Merge''' |page61=Mergetest1 (2nd nomination) |date62=18 June 2026 |result62='''Merge''' |page62=Mergetest1 (2nd nomination) |date63=18 June 2026 |result63='''Merge''' |page63=Mergetest1 (2nd nomination) |date64=18 June 2026 |result64='''Mergefalse''' |page64=Mergetest1 (2nd nomination) |date65=18 June 2026 |result65='''Merge''' |page65=Mergetest1 (2nd nomination) |date66=18 June 2026 |result66='''Mergeinto [[mergetest2]]''' |page66=Mergetest1 (2nd nomination) |date67=18 June 2026 |result67='''Merge into [[mergetest2]]''' |page67=Mergetest1 (2nd nomination) |date68=18 June 2026 |result68='''Merge into [[Mergetest2]]''' |page68=Mergetest1 (2nd nomination)}} rdyely6jha38cspq5i1jqtf8mfoayco 747777 747774 2026-06-20T21:33:53Z Trialpears 43074 Old AFD: [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as redirect to [[Mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]]) 747777 wikitext text/x-wiki {{Old AfD multi |date=16 June 2026 |result='''merge''' |page=Mergetest1 |date2=16 June 2026 |result2='''Merge''' |page2=Mergetest1 |date3=16 June 2026 |result3='''Merge''' |page3=Mergetest1 |date4=16 June 2026 |result4='''Merge''' |page4=Mergetest1 |date5=16 June 2026 |result5='''Merge''' |page5=Mergetest1 |date6=16 June 2026 |result6='''Merge''' |page6=Mergetest1 |date7=16 June 2026 |result7='''Merge''' |page7=Mergetest1 |date8=16 June 2026 |result8='''Merge''' |page8=Mergetest1 |date9=16 June 2026 |result9='''Merge''' |page9=Mergetest1 |date10=16 June 2026 |result10='''Merge''' |page10=Mergetest1 |date11=16 June 2026 |result11='''Merge''' |page11=Mergetest1 |date12=16 June 2026 |result12='''Merge''' |page12=Mergetest1 |date13=16 June 2026 |result13='''Merge''' |page13=Mergetest1 |date14=16 June 2026 |result14='''Merge''' |page14=Mergetest1 |date15=16 June 2026 |result15='''Merge''' |page15=Mergetest1 |date16=16 June 2026 |result16='''Merge''' |page16=Mergetest1 |date17=16 June 2026 |result17='''Merge''' |page17=Mergetest1 |date18=16 June 2026 |result18='''Merge''' |page18=Mergetest1 |date19=16 June 2026 |result19='''Merge''' |page19=Mergetest1 |date20=16 June 2026 |result20='''Merge''' |page20=Mergetest1 |date21=16 June 2026 |result21='''Merge''' |page21=Mergetest1 |date22=16 June 2026 |result22='''Merge''' |page22=Mergetest1 |date23=16 June 2026 |result23='''Merge''' |page23=Mergetest1 |date24=16 June 2026 |result24='''Merge''' |page24=Mergetest1 |date25=16 June 2026 |result25='''Merge''' |page25=Mergetest1 |date26=16 June 2026 |result26='''Merge''' |page26=Mergetest1 |date27=16 June 2026 |result27='''Merge''' |page27=Mergetest1 |date28=16 June 2026 |result28='''Merge''' |page28=Mergetest1 |date29=16 June 2026 |result29='''Merge''' |page29=Mergetest1 |date30=16 June 2026 |result30='''Merge''' |page30=Mergetest1 |date31=16 June 2026 |result31='''Merge''' |page31=Mergetest1 |date32=16 June 2026 |result32='''Merge''' |page32=Mergetest1 |date33=16 June 2026 |result33='''Merge''' |page33=Mergetest1 |date34=16 June 2026 |result34='''Merge''' |page34=Mergetest1 |date35=16 June 2026 |result35='''Merge''' |page35=Mergetest1 |date36=16 June 2026 |result36='''Merge''' |page36=Mergetest1 |date37=16 June 2026 |result37='''Merge''' |page37=Mergetest1 |date38=16 June 2026 |result38='''Merge''' |page38=Mergetest1 |date39=16 June 2026 |result39='''Merge''' |page39=Mergetest1 |date40=16 June 2026 |result40='''Merge''' |page40=Mergetest1 |date41=16 June 2026 |result41='''Merge''' |page41=Mergetest1 |date42=16 June 2026 |result42='''Merge''' |page42=Mergetest1 |date43=16 June 2026 |result43='''Merge''' |page43=Mergetest1 |date44=18 June 2026 |result44='''Merge''' |page44=Mergetest1 (2nd nomination) |date45=18 June 2026 |result45='''Merge''' |page45=Mergetest1 (2nd nomination) |date46=18 June 2026 |result46='''Merge''' |page46=Mergetest1 (2nd nomination) |date47=18 June 2026 |result47='''Merge''' |page47=Mergetest1 (2nd nomination) |date48=18 June 2026 |result48='''Merge''' |page48=Mergetest1 (2nd nomination) |date49=18 June 2026 |result49='''Merge''' |page49=Mergetest1 (2nd nomination) |date50=18 June 2026 |result50='''Keep''' |page50=Mergetest1 (2nd nomination) |date51=18 June 2026 |result51='''Merge''' |page51=Mergetest1 (2nd nomination) |date52=18 June 2026 |result52='''Merge''' |page52=Mergetest1 (2nd nomination) |date53=18 June 2026 |result53='''Merge''' |page53=Mergetest1 (2nd nomination) |date54=18 June 2026 |result54='''Merge''' |page54=Mergetest1 (2nd nomination) |date55=18 June 2026 |result55='''Merge''' |page55=Mergetest1 (2nd nomination) |date56=18 June 2026 |result56='''Merge''' |page56=Mergetest1 (2nd nomination) |date57=18 June 2026 |result57='''Merge''' |page57=Mergetest1 (2nd nomination) |date58=18 June 2026 |result58='''Merge''' |page58=Mergetest1 (2nd nomination) |date59=18 June 2026 |result59='''Merge''' |page59=Mergetest1 (2nd nomination) |date60=18 June 2026 |result60='''Merge''' |page60=Mergetest1 (2nd nomination) |date61=18 June 2026 |result61='''Merge''' |page61=Mergetest1 (2nd nomination) |date62=18 June 2026 |result62='''Merge''' |page62=Mergetest1 (2nd nomination) |date63=18 June 2026 |result63='''Merge''' |page63=Mergetest1 (2nd nomination) |date64=18 June 2026 |result64='''Mergefalse''' |page64=Mergetest1 (2nd nomination) |date65=18 June 2026 |result65='''Merge''' |page65=Mergetest1 (2nd nomination) |date66=18 June 2026 |result66='''Mergeinto [[mergetest2]]''' |page66=Mergetest1 (2nd nomination) |date67=18 June 2026 |result67='''Merge into [[mergetest2]]''' |page67=Mergetest1 (2nd nomination) |date68=18 June 2026 |result68='''Merge into [[Mergetest2]]''' |page68=Mergetest1 (2nd nomination) |date69=18 June 2026 |result69='''Redirect to [[Mergetest2]]''' |page69=Mergetest1 (2nd nomination)}} 9cgmo5yp71yoq9se61jwlq4t7d5dq04 747779 747777 2026-06-20T21:45:36Z Trialpears 43074 Old AFD: [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as redirect ([[WP:XFDC#4.0.16|XFDcloser]]) 747779 wikitext text/x-wiki {{Old AfD multi |date=16 June 2026 |result='''merge''' |page=Mergetest1 |date2=16 June 2026 |result2='''Merge''' |page2=Mergetest1 |date3=16 June 2026 |result3='''Merge''' |page3=Mergetest1 |date4=16 June 2026 |result4='''Merge''' |page4=Mergetest1 |date5=16 June 2026 |result5='''Merge''' |page5=Mergetest1 |date6=16 June 2026 |result6='''Merge''' |page6=Mergetest1 |date7=16 June 2026 |result7='''Merge''' |page7=Mergetest1 |date8=16 June 2026 |result8='''Merge''' |page8=Mergetest1 |date9=16 June 2026 |result9='''Merge''' |page9=Mergetest1 |date10=16 June 2026 |result10='''Merge''' |page10=Mergetest1 |date11=16 June 2026 |result11='''Merge''' |page11=Mergetest1 |date12=16 June 2026 |result12='''Merge''' |page12=Mergetest1 |date13=16 June 2026 |result13='''Merge''' |page13=Mergetest1 |date14=16 June 2026 |result14='''Merge''' |page14=Mergetest1 |date15=16 June 2026 |result15='''Merge''' |page15=Mergetest1 |date16=16 June 2026 |result16='''Merge''' |page16=Mergetest1 |date17=16 June 2026 |result17='''Merge''' |page17=Mergetest1 |date18=16 June 2026 |result18='''Merge''' |page18=Mergetest1 |date19=16 June 2026 |result19='''Merge''' |page19=Mergetest1 |date20=16 June 2026 |result20='''Merge''' |page20=Mergetest1 |date21=16 June 2026 |result21='''Merge''' |page21=Mergetest1 |date22=16 June 2026 |result22='''Merge''' |page22=Mergetest1 |date23=16 June 2026 |result23='''Merge''' |page23=Mergetest1 |date24=16 June 2026 |result24='''Merge''' |page24=Mergetest1 |date25=16 June 2026 |result25='''Merge''' |page25=Mergetest1 |date26=16 June 2026 |result26='''Merge''' |page26=Mergetest1 |date27=16 June 2026 |result27='''Merge''' |page27=Mergetest1 |date28=16 June 2026 |result28='''Merge''' |page28=Mergetest1 |date29=16 June 2026 |result29='''Merge''' |page29=Mergetest1 |date30=16 June 2026 |result30='''Merge''' |page30=Mergetest1 |date31=16 June 2026 |result31='''Merge''' |page31=Mergetest1 |date32=16 June 2026 |result32='''Merge''' |page32=Mergetest1 |date33=16 June 2026 |result33='''Merge''' |page33=Mergetest1 |date34=16 June 2026 |result34='''Merge''' |page34=Mergetest1 |date35=16 June 2026 |result35='''Merge''' |page35=Mergetest1 |date36=16 June 2026 |result36='''Merge''' |page36=Mergetest1 |date37=16 June 2026 |result37='''Merge''' |page37=Mergetest1 |date38=16 June 2026 |result38='''Merge''' |page38=Mergetest1 |date39=16 June 2026 |result39='''Merge''' |page39=Mergetest1 |date40=16 June 2026 |result40='''Merge''' |page40=Mergetest1 |date41=16 June 2026 |result41='''Merge''' |page41=Mergetest1 |date42=16 June 2026 |result42='''Merge''' |page42=Mergetest1 |date43=16 June 2026 |result43='''Merge''' |page43=Mergetest1 |date44=18 June 2026 |result44='''Merge''' |page44=Mergetest1 (2nd nomination) |date45=18 June 2026 |result45='''Merge''' |page45=Mergetest1 (2nd nomination) |date46=18 June 2026 |result46='''Merge''' |page46=Mergetest1 (2nd nomination) |date47=18 June 2026 |result47='''Merge''' |page47=Mergetest1 (2nd nomination) |date48=18 June 2026 |result48='''Merge''' |page48=Mergetest1 (2nd nomination) |date49=18 June 2026 |result49='''Merge''' |page49=Mergetest1 (2nd nomination) |date50=18 June 2026 |result50='''Keep''' |page50=Mergetest1 (2nd nomination) |date51=18 June 2026 |result51='''Merge''' |page51=Mergetest1 (2nd nomination) |date52=18 June 2026 |result52='''Merge''' |page52=Mergetest1 (2nd nomination) |date53=18 June 2026 |result53='''Merge''' |page53=Mergetest1 (2nd nomination) |date54=18 June 2026 |result54='''Merge''' |page54=Mergetest1 (2nd nomination) |date55=18 June 2026 |result55='''Merge''' |page55=Mergetest1 (2nd nomination) |date56=18 June 2026 |result56='''Merge''' |page56=Mergetest1 (2nd nomination) |date57=18 June 2026 |result57='''Merge''' |page57=Mergetest1 (2nd nomination) |date58=18 June 2026 |result58='''Merge''' |page58=Mergetest1 (2nd nomination) |date59=18 June 2026 |result59='''Merge''' |page59=Mergetest1 (2nd nomination) |date60=18 June 2026 |result60='''Merge''' |page60=Mergetest1 (2nd nomination) |date61=18 June 2026 |result61='''Merge''' |page61=Mergetest1 (2nd nomination) |date62=18 June 2026 |result62='''Merge''' |page62=Mergetest1 (2nd nomination) |date63=18 June 2026 |result63='''Merge''' |page63=Mergetest1 (2nd nomination) |date64=18 June 2026 |result64='''Mergefalse''' |page64=Mergetest1 (2nd nomination) |date65=18 June 2026 |result65='''Merge''' |page65=Mergetest1 (2nd nomination) |date66=18 June 2026 |result66='''Mergeinto [[mergetest2]]''' |page66=Mergetest1 (2nd nomination) |date67=18 June 2026 |result67='''Merge into [[mergetest2]]''' |page67=Mergetest1 (2nd nomination) |date68=18 June 2026 |result68='''Merge into [[Mergetest2]]''' |page68=Mergetest1 (2nd nomination) |date69=18 June 2026 |result69='''Redirect to [[Mergetest2]]''' |page69=Mergetest1 (2nd nomination) |date70=18 June 2026 |result70='''Redirect''' |page70=Mergetest1 (2nd nomination)}} 20yp9zyxiymutc5p2cnm625tf91knmc 747781 747779 2026-06-20T21:47:06Z Trialpears 43074 Blanked the page 747781 wikitext text/x-wiki phoiac9h4m842xq45sp7s6u21eteeq1 747783 747781 2026-06-20T21:47:27Z Trialpears 43074 Old AFD: [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as redirect to [[Mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]]) 747783 wikitext text/x-wiki {{Old AfD multi |date=18 June 2026 |result='''redirect''' |page=Mergetest1 (2nd nomination)}} rlqio3fgya91s4gr2297y5rdkf8o8z4 747785 747783 2026-06-20T21:48:48Z Trialpears 43074 Old AFD: [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as redirect to [[Mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]]) 747785 wikitext text/x-wiki {{Old AfD multi |date=18 June 2026 |result='''redirect''' |page=Mergetest1 (2nd nomination) |date2=18 June 2026 |result2='''Redirect''' |page2=Mergetest1 (2nd nomination)}} lrbwdya4yhdharzwy9qso4aggc0aeoj 747787 747785 2026-06-20T21:51:02Z Trialpears 43074 Old AFD: [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as redirect to [[Mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]]) 747787 wikitext text/x-wiki {{Old AfD multi |date=18 June 2026 |result='''redirect''' |page=Mergetest1 (2nd nomination) |date2=18 June 2026 |result2='''Redirect''' |page2=Mergetest1 (2nd nomination) |date3=18 June 2026 |result3='''Redirect to [[Mergetest2]]''' |page3=Mergetest1 (2nd nomination)}} d8w2bmb0q17ajfchlfahvd6cq7giyow 747788 747787 2026-06-20T21:51:26Z Trialpears 43074 Blanked the page 747788 wikitext text/x-wiki phoiac9h4m842xq45sp7s6u21eteeq1 747791 747788 2026-06-20T21:51:46Z Trialpears 43074 Old AFD: [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as merge into [[Mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]]) 747791 wikitext text/x-wiki {{Old AfD multi |date=18 June 2026 |result='''merge into [[Mergetest2]]''' |page=Mergetest1 (2nd nomination)}} 3xo2sfik0i95k1r9h9phgh66ygc2t3p Talk:Mergetest2 1 176336 747757 747646 2026-06-20T21:23:37Z Trialpears 43074 [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as mergefalse ([[WP:XFDC#4.0.16|XFDcloser]]) 747757 wikitext text/x-wiki {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} d9drsaz8t3yus7tue5qp0cmkqv0852u 747761 747757 2026-06-20T21:25:09Z Trialpears 43074 [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as merge ([[WP:XFDC#4.0.16|XFDcloser]]) 747761 wikitext text/x-wiki {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} 8nta8yqask40y8x6dvrds3e9uzltogz 747766 747761 2026-06-20T21:25:52Z Trialpears 43074 [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as mergeinto [[mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]]) 747766 wikitext text/x-wiki {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} s0lbhlwrpxy9pdqo48cre4rxi9spvv9 747768 747766 2026-06-20T21:27:18Z Trialpears 43074 [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as merge into [[mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]]) 747768 wikitext text/x-wiki {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} 46xey42ykhdk9hbm5mcfb8aachey9ra 747772 747768 2026-06-20T21:33:06Z Trialpears 43074 [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as merge into [[Mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]]) 747772 wikitext text/x-wiki {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} nm3u8m8dswlnry74fczjiwjog372lg3 747792 747772 2026-06-20T21:51:46Z Trialpears 43074 [[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)]] closed as merge into [[Mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]]) 747792 wikitext text/x-wiki {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=20 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=19 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} {{Afd-merge from|Mergetest1|discussion=Mergetest1 (2nd nomination)|date=18 June 2026}} dlbbcmkudumhpospf6yu9qxn5lr1oa7 Wikipedia:Articles for deletion/Mergetest1 (2nd nomination) 4 176383 747755 747643 2026-06-20T21:23:36Z Trialpears 43074 /* Mergetest1 */ Closed as mergefalse ([[WP:XFDC#4.0.16|XFDcloser]]) 747755 wikitext text/x-wiki to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 15:56, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:21, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:23, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:32, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:35, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:37, 18 June 2026 (UTC) . [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 18:10, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:47, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:52, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:53, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:54, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:17, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:18, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:22, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:34, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:38, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:39, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:41, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:42, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:23, 20 June 2026 (UTC) ===[[:Mergetest1]]=== <div class="infobox" style="width:33%">AfDs for this article:<ul class="listify">{{Special:Prefixindex/Wikipedia:Articles for deletion/Mergetest1}}</ul></div> <noinclude>{{AFD help}}</noinclude> :{{la|Mergetest1}} – (<includeonly>[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)|View AfD]]</includeonly><noinclude>[[Wikipedia:Articles for deletion/Log/2026 June 18#{{anchorencode:Mergetest1}}|View log]]</noinclude>{{int:dot-separator}} <span class="plainlinks">[https://tools.wmflabs.org/jackbot/snottywong/cgi-bin/votecounter.cgi?page=Wikipedia:Articles_for_deletion/Mergetest1_(2nd_nomination) Stats]</span>) :({{Find sources AFD|Mergetest1}}) I propose '''merging''' to [[Mergetest2]] because Also tagging [[Mergetest3]] to make things hard. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 14:20, 18 June 2026 (UTC) lihxybogeoxx5r8b08bq9kv5b5vauz5 747759 747755 2026-06-20T21:25:08Z Trialpears 43074 /* Mergetest1 */ Closed as merge ([[WP:XFDC#4.0.16|XFDcloser]]) 747759 wikitext text/x-wiki to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 15:56, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:21, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:23, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:32, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:35, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:37, 18 June 2026 (UTC) . [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 18:10, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:47, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:52, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:53, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:54, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:17, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:18, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:22, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:34, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:38, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:39, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:41, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:42, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:23, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC) ===[[:Mergetest1]]=== <div class="infobox" style="width:33%">AfDs for this article:<ul class="listify">{{Special:Prefixindex/Wikipedia:Articles for deletion/Mergetest1}}</ul></div> <noinclude>{{AFD help}}</noinclude> :{{la|Mergetest1}} – (<includeonly>[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)|View AfD]]</includeonly><noinclude>[[Wikipedia:Articles for deletion/Log/2026 June 18#{{anchorencode:Mergetest1}}|View log]]</noinclude>{{int:dot-separator}} <span class="plainlinks">[https://tools.wmflabs.org/jackbot/snottywong/cgi-bin/votecounter.cgi?page=Wikipedia:Articles_for_deletion/Mergetest1_(2nd_nomination) Stats]</span>) :({{Find sources AFD|Mergetest1}}) I propose '''merging''' to [[Mergetest2]] because Also tagging [[Mergetest3]] to make things hard. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 14:20, 18 June 2026 (UTC) 4nu0lvjzygvfda801vr29rot0qvy58o 747763 747759 2026-06-20T21:25:51Z Trialpears 43074 /* Mergetest1 */ Closed as mergeinto [[mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]]) 747763 wikitext text/x-wiki to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 15:56, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:21, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:23, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:32, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:35, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:37, 18 June 2026 (UTC) . [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 18:10, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:47, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:52, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:53, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:54, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:17, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:18, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:22, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:34, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:38, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:39, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:41, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:42, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:23, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC) ===[[:Mergetest1]]=== <div class="infobox" style="width:33%">AfDs for this article:<ul class="listify">{{Special:Prefixindex/Wikipedia:Articles for deletion/Mergetest1}}</ul></div> <noinclude>{{AFD help}}</noinclude> :{{la|Mergetest1}} – (<includeonly>[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)|View AfD]]</includeonly><noinclude>[[Wikipedia:Articles for deletion/Log/2026 June 18#{{anchorencode:Mergetest1}}|View log]]</noinclude>{{int:dot-separator}} <span class="plainlinks">[https://tools.wmflabs.org/jackbot/snottywong/cgi-bin/votecounter.cgi?page=Wikipedia:Articles_for_deletion/Mergetest1_(2nd_nomination) Stats]</span>) :({{Find sources AFD|Mergetest1}}) I propose '''merging''' to [[Mergetest2]] because Also tagging [[Mergetest3]] to make things hard. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 14:20, 18 June 2026 (UTC) fotri0mal6kg6y187rvnxnge4k9c3xk 747767 747763 2026-06-20T21:27:17Z Trialpears 43074 /* Mergetest1 */ Closed as merge into [[mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]]) 747767 wikitext text/x-wiki to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 15:56, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:21, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:23, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:32, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:35, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:37, 18 June 2026 (UTC) . [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 18:10, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:47, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:52, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:53, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:54, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:17, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:18, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:22, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:34, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:38, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:39, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:41, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:42, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:23, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:27, 20 June 2026 (UTC) ===[[:Mergetest1]]=== <div class="infobox" style="width:33%">AfDs for this article:<ul class="listify">{{Special:Prefixindex/Wikipedia:Articles for deletion/Mergetest1}}</ul></div> <noinclude>{{AFD help}}</noinclude> :{{la|Mergetest1}} – (<includeonly>[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)|View AfD]]</includeonly><noinclude>[[Wikipedia:Articles for deletion/Log/2026 June 18#{{anchorencode:Mergetest1}}|View log]]</noinclude>{{int:dot-separator}} <span class="plainlinks">[https://tools.wmflabs.org/jackbot/snottywong/cgi-bin/votecounter.cgi?page=Wikipedia:Articles_for_deletion/Mergetest1_(2nd_nomination) Stats]</span>) :({{Find sources AFD|Mergetest1}}) I propose '''merging''' to [[Mergetest2]] because Also tagging [[Mergetest3]] to make things hard. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 14:20, 18 June 2026 (UTC) dfbl5h85xgnkrb6jdzm7il2dc45wnc0 747771 747767 2026-06-20T21:33:05Z Trialpears 43074 /* Mergetest1 */ Closed as merge into [[Mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]]) 747771 wikitext text/x-wiki to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 15:56, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:21, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:23, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:32, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:35, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:37, 18 June 2026 (UTC) . [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 18:10, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:47, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:52, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:53, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:54, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:17, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:18, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:22, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:34, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:38, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:39, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:41, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:42, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:23, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:27, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:33, 20 June 2026 (UTC) ===[[:Mergetest1]]=== <div class="infobox" style="width:33%">AfDs for this article:<ul class="listify">{{Special:Prefixindex/Wikipedia:Articles for deletion/Mergetest1}}</ul></div> <noinclude>{{AFD help}}</noinclude> :{{la|Mergetest1}} – (<includeonly>[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)|View AfD]]</includeonly><noinclude>[[Wikipedia:Articles for deletion/Log/2026 June 18#{{anchorencode:Mergetest1}}|View log]]</noinclude>{{int:dot-separator}} <span class="plainlinks">[https://tools.wmflabs.org/jackbot/snottywong/cgi-bin/votecounter.cgi?page=Wikipedia:Articles_for_deletion/Mergetest1_(2nd_nomination) Stats]</span>) :({{Find sources AFD|Mergetest1}}) I propose '''merging''' to [[Mergetest2]] because Also tagging [[Mergetest3]] to make things hard. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 14:20, 18 June 2026 (UTC) oq2rem3xtcitwtmiqe0nbv46tkuliwm 747775 747771 2026-06-20T21:33:52Z Trialpears 43074 /* Mergetest1 */ Closed as redirect to [[Mergetest2]] ([[WP:XFDC#4.0.16|XFDcloser]]) 747775 wikitext text/x-wiki to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 15:56, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:21, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:23, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:32, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:35, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:37, 18 June 2026 (UTC) . [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 18:10, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:47, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:52, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:53, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:54, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:17, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:18, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:22, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:34, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:38, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:39, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:41, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:42, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:23, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:27, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:33, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:33, 20 June 2026 (UTC) ===[[:Mergetest1]]=== <div class="infobox" style="width:33%">AfDs for this article:<ul class="listify">{{Special:Prefixindex/Wikipedia:Articles for deletion/Mergetest1}}</ul></div> <noinclude>{{AFD help}}</noinclude> :{{la|Mergetest1}} – (<includeonly>[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)|View AfD]]</includeonly><noinclude>[[Wikipedia:Articles for deletion/Log/2026 June 18#{{anchorencode:Mergetest1}}|View log]]</noinclude>{{int:dot-separator}} <span class="plainlinks">[https://tools.wmflabs.org/jackbot/snottywong/cgi-bin/votecounter.cgi?page=Wikipedia:Articles_for_deletion/Mergetest1_(2nd_nomination) Stats]</span>) :({{Find sources AFD|Mergetest1}}) I propose '''merging''' to [[Mergetest2]] because Also tagging [[Mergetest3]] to make things hard. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 14:20, 18 June 2026 (UTC) 5vpxajmby6p4op9mb4sylo4347evt28 747778 747775 2026-06-20T21:45:35Z Trialpears 43074 /* Mergetest1 */ Closed as redirect ([[WP:XFDC#4.0.16|XFDcloser]]) 747778 wikitext text/x-wiki to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 15:56, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:21, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:23, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:32, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:35, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:37, 18 June 2026 (UTC) . [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 18:10, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:47, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:52, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:53, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:54, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:17, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:18, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:22, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:34, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:38, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:39, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:41, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:42, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:23, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:27, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:33, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:33, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:45, 20 June 2026 (UTC) ===[[:Mergetest1]]=== <div class="infobox" style="width:33%">AfDs for this article:<ul class="listify">{{Special:Prefixindex/Wikipedia:Articles for deletion/Mergetest1}}</ul></div> <noinclude>{{AFD help}}</noinclude> :{{la|Mergetest1}} – (<includeonly>[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)|View AfD]]</includeonly><noinclude>[[Wikipedia:Articles for deletion/Log/2026 June 18#{{anchorencode:Mergetest1}}|View log]]</noinclude>{{int:dot-separator}} <span class="plainlinks">[https://tools.wmflabs.org/jackbot/snottywong/cgi-bin/votecounter.cgi?page=Wikipedia:Articles_for_deletion/Mergetest1_(2nd_nomination) Stats]</span>) :({{Find sources AFD|Mergetest1}}) I propose '''merging''' to [[Mergetest2]] because Also tagging [[Mergetest3]] to make things hard. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 14:20, 18 June 2026 (UTC) 2nzk64yphkhcsz2qylio0z0pfbva78b 747782 747778 2026-06-20T21:47:26Z Trialpears 43074 /* Mergetest1 */ Closed as redirect ([[WP:XFDC#4.0.16|XFDcloser]]) 747782 wikitext text/x-wiki to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 15:56, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:21, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:23, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:32, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:35, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:37, 18 June 2026 (UTC) . [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 18:10, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:47, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:52, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:53, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:54, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:17, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:18, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:22, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:34, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:38, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:39, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:41, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:42, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:23, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:27, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:33, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:33, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:45, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:47, 20 June 2026 (UTC) ===[[:Mergetest1]]=== <div class="infobox" style="width:33%">AfDs for this article:<ul class="listify">{{Special:Prefixindex/Wikipedia:Articles for deletion/Mergetest1}}</ul></div> <noinclude>{{AFD help}}</noinclude> :{{la|Mergetest1}} – (<includeonly>[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)|View AfD]]</includeonly><noinclude>[[Wikipedia:Articles for deletion/Log/2026 June 18#{{anchorencode:Mergetest1}}|View log]]</noinclude>{{int:dot-separator}} <span class="plainlinks">[https://tools.wmflabs.org/jackbot/snottywong/cgi-bin/votecounter.cgi?page=Wikipedia:Articles_for_deletion/Mergetest1_(2nd_nomination) Stats]</span>) :({{Find sources AFD|Mergetest1}}) I propose '''merging''' to [[Mergetest2]] because Also tagging [[Mergetest3]] to make things hard. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 14:20, 18 June 2026 (UTC) df7obav3i5b8xoeaoih1uainhw8wh62 747784 747782 2026-06-20T21:48:47Z Trialpears 43074 /* Mergetest1 */ Closed as redirect ([[WP:XFDC#4.0.16|XFDcloser]]) 747784 wikitext text/x-wiki to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 15:56, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:21, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:23, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:32, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:35, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:37, 18 June 2026 (UTC) . [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 18:10, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:47, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:52, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:53, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:54, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:17, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:18, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:22, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:34, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:38, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:39, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:41, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:42, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:23, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:27, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:33, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:33, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:45, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:47, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:48, 20 June 2026 (UTC) ===[[:Mergetest1]]=== <div class="infobox" style="width:33%">AfDs for this article:<ul class="listify">{{Special:Prefixindex/Wikipedia:Articles for deletion/Mergetest1}}</ul></div> <noinclude>{{AFD help}}</noinclude> :{{la|Mergetest1}} – (<includeonly>[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)|View AfD]]</includeonly><noinclude>[[Wikipedia:Articles for deletion/Log/2026 June 18#{{anchorencode:Mergetest1}}|View log]]</noinclude>{{int:dot-separator}} <span class="plainlinks">[https://tools.wmflabs.org/jackbot/snottywong/cgi-bin/votecounter.cgi?page=Wikipedia:Articles_for_deletion/Mergetest1_(2nd_nomination) Stats]</span>) :({{Find sources AFD|Mergetest1}}) I propose '''merging''' to [[Mergetest2]] because Also tagging [[Mergetest3]] to make things hard. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 14:20, 18 June 2026 (UTC) fhbs66265ljx93iih4la303t79m7etf 747786 747784 2026-06-20T21:51:02Z Trialpears 43074 /* Mergetest1 */ Closed as redirect ([[WP:XFDC#4.0.16|XFDcloser]]) 747786 wikitext text/x-wiki to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 15:56, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:21, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:23, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:32, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:35, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:37, 18 June 2026 (UTC) . [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 18:10, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:47, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:52, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:53, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:54, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:17, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:18, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:22, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:34, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:38, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:39, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:41, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:42, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:23, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:27, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:33, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:33, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:45, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:47, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:48, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:51, 20 June 2026 (UTC) ===[[:Mergetest1]]=== <div class="infobox" style="width:33%">AfDs for this article:<ul class="listify">{{Special:Prefixindex/Wikipedia:Articles for deletion/Mergetest1}}</ul></div> <noinclude>{{AFD help}}</noinclude> :{{la|Mergetest1}} – (<includeonly>[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)|View AfD]]</includeonly><noinclude>[[Wikipedia:Articles for deletion/Log/2026 June 18#{{anchorencode:Mergetest1}}|View log]]</noinclude>{{int:dot-separator}} <span class="plainlinks">[https://tools.wmflabs.org/jackbot/snottywong/cgi-bin/votecounter.cgi?page=Wikipedia:Articles_for_deletion/Mergetest1_(2nd_nomination) Stats]</span>) :({{Find sources AFD|Mergetest1}}) I propose '''merging''' to [[Mergetest2]] because Also tagging [[Mergetest3]] to make things hard. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 14:20, 18 June 2026 (UTC) sd855lmcklmqq0yrm7l2ue2ijigzcjr 747789 747786 2026-06-20T21:51:45Z Trialpears 43074 /* Mergetest1 */ Closed as merge ([[WP:XFDC#4.0.16|XFDcloser]]) 747789 wikitext text/x-wiki to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 15:56, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:21, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:23, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:32, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:35, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 16:37, 18 June 2026 (UTC) . [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 18:10, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:47, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:52, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:53, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:54, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 20:55, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:17, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:18, 18 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:22, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:34, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:38, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:39, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:41, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 19:42, 19 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:23, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:25, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:27, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:33, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:33, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:45, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:47, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:48, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:51, 20 June 2026 (UTC) to [[Mergetest2]]. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 21:51, 20 June 2026 (UTC) ===[[:Mergetest1]]=== <div class="infobox" style="width:33%">AfDs for this article:<ul class="listify">{{Special:Prefixindex/Wikipedia:Articles for deletion/Mergetest1}}</ul></div> <noinclude>{{AFD help}}</noinclude> :{{la|Mergetest1}} – (<includeonly>[[Wikipedia:Articles for deletion/Mergetest1 (2nd nomination)|View AfD]]</includeonly><noinclude>[[Wikipedia:Articles for deletion/Log/2026 June 18#{{anchorencode:Mergetest1}}|View log]]</noinclude>{{int:dot-separator}} <span class="plainlinks">[https://tools.wmflabs.org/jackbot/snottywong/cgi-bin/votecounter.cgi?page=Wikipedia:Articles_for_deletion/Mergetest1_(2nd_nomination) Stats]</span>) :({{Find sources AFD|Mergetest1}}) I propose '''merging''' to [[Mergetest2]] because Also tagging [[Mergetest3]] to make things hard. [[User:Trialpears|Trialpears]] ([[User talk:Trialpears|talk]]) 14:20, 18 June 2026 (UTC) agb58m4nuldo38dxg28s31ddxzrlzi7 Wikipedia:Village Pump 4 176406 747667 2026-06-20T13:20:15Z User97104 72884 User97104 moved page [[Wikipedia:Village Pump]] to [[Ikipedia:Illage Ump]]: Test: H 747667 wikitext text/x-wiki #REDIRECT [[Ikipedia:Illage Ump]] {{Redirect category shell| {{R from move}} }} 68kgr2gkpiza66cykpkqeck75ant9tt Template:禁制紀錄項目 10 176407 747668 2026-06-20T13:40:59Z 臺灣象象 71227 Import from the revision [[w:zh:Special:PermaLink/88096359|88096359]] of [[w:zh:模板:禁制紀錄項目]] edited by [[w:zh:Special:Contributions/1F616EMO|1F616EMO]] at 2025-07-04T23:25:32Z via [[w:zh:User:臺灣象象/transwiki-importer.js|transwiki-importer]] 747668 wikitext text/x-wiki <noinclude>{{NoteTA/MediaWiki}} {| class=wikitable ! 用戶名 !! 禁制類型 !! 禁制範圍 !! 相關討論 !! 執行者 !! 開始時間 !! 結束時間 </noinclude> |- | {{#ifeq:{{uc:{{{user|}}}}}|ZHWIKI|中文維基百科全站|<div class="plainlist"> * [[User:{{{user|Example}}}|-{<nowiki/>{{{user|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user|Example}}}|討論]] · [[Special:Contributions/{{{user|Example}}}|貢獻]] · [[Special:Logs/{{{user|Example}}}|日誌]])</div>{{#if:{{{user2|}}}| * [[User:{{{user2}}}|-{<nowiki/>{{{user2|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user2|Example}}}|討論]] · [[Special:Contributions/{{{user2|Example}}}|貢獻]] · [[Special:Logs/{{{user2|Example}}}|日誌]])</div>}}{{#if:{{{user3|}}}| * [[User:{{{user3}}}|-{<nowiki/>{{{user3|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user3|Example}}}|討論]] · [[Special:Contributions/{{{user3|Example}}}|貢獻]] · [[Special:Logs/{{{user3|Example}}}|日誌]])</div>}}{{#if:{{{user4|}}}| * [[User:{{{user4}}}|-{<nowiki/>{{{user4|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user4|Example}}}|討論]] · [[Special:Contributions/{{{user4|Example}}}|貢獻]] · [[Special:Logs/{{{user4|Example}}}|日誌]])</div>}}{{#if:{{{user5|}}}| * [[User:{{{user5}}}|-{<nowiki/>{{{user5|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user5|Example}}}|討論]] · [[Special:Contributions/{{{user5|Example}}}|貢獻]] · [[Special:Logs/{{{user5|Example}}}|日誌]])</div>}}{{#if:{{{user6|}}}| * [[User:{{{user6}}}|-{<nowiki/>{{{user6|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user6|Example}}}|討論]] · [[Special:Contributions/{{{user6|Example}}}|貢獻]] · [[Special:Logs/{{{user6|Example}}}|日誌]])</div>}}{{#if:{{{user7|}}}| * [[User:{{{user7}}}|-{<nowiki/>{{{user7|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user7|Example}}}|討論]] · [[Special:Contributions/{{{user7|Example}}}|貢獻]] · [[Special:Logs/{{{user7|Example}}}|日誌]])</div>}}{{#if:{{{user8|}}}| * [[User:{{{user8}}}|-{<nowiki/>{{{user8|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user8|Example}}}|討論]] · [[Special:Contributions/{{{user8|Example}}}|貢獻]] · [[Special:Logs/{{{user8|Example}}}|日誌]])</div>}}{{#if:{{{user8|}}}| * [[User:{{{user9}}}|-{<nowiki/>{{{user9|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user9|Example}}}|討論]] · [[Special:Contributions/{{{user9|Example}}}|貢獻]] · [[Special:Logs/{{{user9|Example}}}|日誌]])</div>}}{{#if:{{{user10|}}}| * [[User:{{{user10}}}|-{<nowiki/>{{{user10|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user10|Example}}}|討論]] · [[Special:Contributions/{{{user10|Example}}}|貢獻]] · [[Special:Logs/{{{user10|Example}}}|日誌]])</div>}} </div>}} | {{#switch:{{uc:{{{type|}}}}} | P | PBAN | PAGE | 頁 | 页 | 頁面 | 页面 | 頁面禁制 | 页面禁制 = 頁面禁制 | T | TBAN | TOPIC | 題 | 题 | 主題 | 主题 | 主題禁制 | 主题禁制 = 主題禁制 | I | IBAN | INTERACTION | 互 | 互動 | 互动 | 互動禁制 | 互动禁制 = 互動禁制 | E | EBAN | EMAIL | 郵 | 邮 | 電郵 | 电邮 | 電郵禁制 | 电邮禁制 = 電郵禁制 | R | RBAN | REVERT| 退 | 回退 | 回退禁制 | 回退限制 = 回退限制 | #default = {{{type}}} }} | {{{details|{{Error|請提供禁制範圍!}}}}} | <div class="hlist">{{#if:{{{ut|{{{UT|}}}}}}| * {{#ifexpr:{{#invoke:String|find|source={{{ut|{{{UT|}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{ut|{{{UT|}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{ut|{{{UT}}}}}}|UT]]|[[User talk:{{{ut|{{{UT}}}}}}|UT]]}}}}{{#if:{{{appeal|{{{unblock|{{{unban|}}}}}}}}}| * {{#ifexpr:{{#invoke:String|find|source={{{appeal|{{{unblock|{{{unban|}}}}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{appeal|{{{unblock|{{{unban|}}}}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{appeal|{{{unblock|{{{unban|}}}}}}}}}|申訴]]|{{#ifeq:{{NAMESPACENUMBER:{{{appeal|{{{unblock|{{{unban|}}}}}}}}}}}|2600|[[{{{appeal|{{{unblock|{{{unban|}}}}}}}}}|申訴]]|[[User talk:{{{appeal|{{{unblock|{{{unban|}}}}}}}}}|申訴]]}}}}}}{{#if:{{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}| * {{#ifexpr:{{#invoke:String|find|source={{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|AIV]]|[[Wikipedia:当前的破坏/存档/{{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|AIV]]}}}}{{#if:{{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}| * {{#ifexpr:{{#invoke:String|find|source={{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|AN3]]|[[Wikipedia:管理员布告板/编辑争议/存档/{{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|AN3]]}}}}{{#if:{{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}| * {{#ifexpr:{{#invoke:String|find|source={{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|ANM]]|[[Wikipedia:管理员布告板/其他不当行为/存档/{{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|ANM]]}}}}{{#if:{{{ctop|{{{CTOP|}}}}}}| * {{#ifexpr:{{#invoke:String|find|source={{{ctop|{{{CTOP|}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{ctop|{{{CTOP|}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{ctop|{{{CTOP|}}}}}}|CTOP]]|[[Wikipedia:高風險主題/{{{ctop|{{{CTOP|}}}}}}|CTOP]]}}}}{{#if:{{{arb|{{{ARB|}}}}}}| * {{#ifexpr:{{#invoke:String|find|source={{{arb|{{{ARB|}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{arb|{{{ARB|}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{arb|{{{ARB|}}}}}}|仲裁]]|[[Wikipedia:仲裁/請求/案件/{{{arb|{{{ARB|}}}}}}|仲裁]]}}}} {{{+links|}}}</div> | <div class="hlist"> * {{禁制紀錄項目/sysop|{{{sysop1|{{{sysop|Example}}}}}}}}{{#if:{{{sysop2|}}}| * {{禁制紀錄項目/sysop|{{{sysop2}}}}}}}{{#if:{{{sysop3|}}}| * {{禁制紀錄項目/sysop|{{{sysop3}}}}}}} </div> | {{#if:{{{start|}}}|{{#if:{{{AFdiff|}}}|[[Special:AbuseFilter/history/{{{AF|226}}}/diff/{{{AFdiff}}}|{{#time:Y"年"n"月"j"日" (D) H:i "(UTC)"|{{{start}}}}}]]|{{#time:Y"年"n"月"j"日" (D) H:i "(UTC)"|{{{start|}}}}}}}|{{Error|請提供開始時間!}}}} | <div class="plainlist">{{#if:{{{endtext|}}}{{{end|}}}| * {{{endtext|{{#time:Y"年"n"月"j"日" (D) H:i "(UTC)"|{{{end|}}}}}}}}|{{Error|請提供結束時間!}}}} {{{updates|}}}</div><noinclude> |} {{doc}} 5onzledt77v76ccipnxyzou7s8vbqo5 747669 747668 2026-06-20T13:41:31Z 臺灣象象 71227 臺灣象象 moved page [[U:臺灣象象/banlogtemplate]] to [[User:臺灣象象/banlogtemplate]] 747668 wikitext text/x-wiki <noinclude>{{NoteTA/MediaWiki}} {| class=wikitable ! 用戶名 !! 禁制類型 !! 禁制範圍 !! 相關討論 !! 執行者 !! 開始時間 !! 結束時間 </noinclude> |- | {{#ifeq:{{uc:{{{user|}}}}}|ZHWIKI|中文維基百科全站|<div class="plainlist"> * [[User:{{{user|Example}}}|-{<nowiki/>{{{user|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user|Example}}}|討論]] · [[Special:Contributions/{{{user|Example}}}|貢獻]] · [[Special:Logs/{{{user|Example}}}|日誌]])</div>{{#if:{{{user2|}}}| * [[User:{{{user2}}}|-{<nowiki/>{{{user2|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user2|Example}}}|討論]] · [[Special:Contributions/{{{user2|Example}}}|貢獻]] · [[Special:Logs/{{{user2|Example}}}|日誌]])</div>}}{{#if:{{{user3|}}}| * [[User:{{{user3}}}|-{<nowiki/>{{{user3|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user3|Example}}}|討論]] · [[Special:Contributions/{{{user3|Example}}}|貢獻]] · [[Special:Logs/{{{user3|Example}}}|日誌]])</div>}}{{#if:{{{user4|}}}| * [[User:{{{user4}}}|-{<nowiki/>{{{user4|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user4|Example}}}|討論]] · [[Special:Contributions/{{{user4|Example}}}|貢獻]] · [[Special:Logs/{{{user4|Example}}}|日誌]])</div>}}{{#if:{{{user5|}}}| * [[User:{{{user5}}}|-{<nowiki/>{{{user5|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user5|Example}}}|討論]] · [[Special:Contributions/{{{user5|Example}}}|貢獻]] · [[Special:Logs/{{{user5|Example}}}|日誌]])</div>}}{{#if:{{{user6|}}}| * [[User:{{{user6}}}|-{<nowiki/>{{{user6|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user6|Example}}}|討論]] · [[Special:Contributions/{{{user6|Example}}}|貢獻]] · [[Special:Logs/{{{user6|Example}}}|日誌]])</div>}}{{#if:{{{user7|}}}| * [[User:{{{user7}}}|-{<nowiki/>{{{user7|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user7|Example}}}|討論]] · [[Special:Contributions/{{{user7|Example}}}|貢獻]] · [[Special:Logs/{{{user7|Example}}}|日誌]])</div>}}{{#if:{{{user8|}}}| * [[User:{{{user8}}}|-{<nowiki/>{{{user8|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user8|Example}}}|討論]] · [[Special:Contributions/{{{user8|Example}}}|貢獻]] · [[Special:Logs/{{{user8|Example}}}|日誌]])</div>}}{{#if:{{{user8|}}}| * [[User:{{{user9}}}|-{<nowiki/>{{{user9|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user9|Example}}}|討論]] · [[Special:Contributions/{{{user9|Example}}}|貢獻]] · [[Special:Logs/{{{user9|Example}}}|日誌]])</div>}}{{#if:{{{user10|}}}| * [[User:{{{user10}}}|-{<nowiki/>{{{user10|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user10|Example}}}|討論]] · [[Special:Contributions/{{{user10|Example}}}|貢獻]] · [[Special:Logs/{{{user10|Example}}}|日誌]])</div>}} </div>}} | {{#switch:{{uc:{{{type|}}}}} | P | PBAN | PAGE | 頁 | 页 | 頁面 | 页面 | 頁面禁制 | 页面禁制 = 頁面禁制 | T | TBAN | TOPIC | 題 | 题 | 主題 | 主题 | 主題禁制 | 主题禁制 = 主題禁制 | I | IBAN | INTERACTION | 互 | 互動 | 互动 | 互動禁制 | 互动禁制 = 互動禁制 | E | EBAN | EMAIL | 郵 | 邮 | 電郵 | 电邮 | 電郵禁制 | 电邮禁制 = 電郵禁制 | R | RBAN | REVERT| 退 | 回退 | 回退禁制 | 回退限制 = 回退限制 | #default = {{{type}}} }} | {{{details|{{Error|請提供禁制範圍!}}}}} | <div class="hlist">{{#if:{{{ut|{{{UT|}}}}}}| * {{#ifexpr:{{#invoke:String|find|source={{{ut|{{{UT|}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{ut|{{{UT|}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{ut|{{{UT}}}}}}|UT]]|[[User talk:{{{ut|{{{UT}}}}}}|UT]]}}}}{{#if:{{{appeal|{{{unblock|{{{unban|}}}}}}}}}| * {{#ifexpr:{{#invoke:String|find|source={{{appeal|{{{unblock|{{{unban|}}}}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{appeal|{{{unblock|{{{unban|}}}}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{appeal|{{{unblock|{{{unban|}}}}}}}}}|申訴]]|{{#ifeq:{{NAMESPACENUMBER:{{{appeal|{{{unblock|{{{unban|}}}}}}}}}}}|2600|[[{{{appeal|{{{unblock|{{{unban|}}}}}}}}}|申訴]]|[[User talk:{{{appeal|{{{unblock|{{{unban|}}}}}}}}}|申訴]]}}}}}}{{#if:{{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}| * {{#ifexpr:{{#invoke:String|find|source={{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|AIV]]|[[Wikipedia:当前的破坏/存档/{{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|AIV]]}}}}{{#if:{{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}| * {{#ifexpr:{{#invoke:String|find|source={{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|AN3]]|[[Wikipedia:管理员布告板/编辑争议/存档/{{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|AN3]]}}}}{{#if:{{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}| * {{#ifexpr:{{#invoke:String|find|source={{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|ANM]]|[[Wikipedia:管理员布告板/其他不当行为/存档/{{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|ANM]]}}}}{{#if:{{{ctop|{{{CTOP|}}}}}}| * {{#ifexpr:{{#invoke:String|find|source={{{ctop|{{{CTOP|}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{ctop|{{{CTOP|}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{ctop|{{{CTOP|}}}}}}|CTOP]]|[[Wikipedia:高風險主題/{{{ctop|{{{CTOP|}}}}}}|CTOP]]}}}}{{#if:{{{arb|{{{ARB|}}}}}}| * {{#ifexpr:{{#invoke:String|find|source={{{arb|{{{ARB|}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{arb|{{{ARB|}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{arb|{{{ARB|}}}}}}|仲裁]]|[[Wikipedia:仲裁/請求/案件/{{{arb|{{{ARB|}}}}}}|仲裁]]}}}} {{{+links|}}}</div> | <div class="hlist"> * {{禁制紀錄項目/sysop|{{{sysop1|{{{sysop|Example}}}}}}}}{{#if:{{{sysop2|}}}| * {{禁制紀錄項目/sysop|{{{sysop2}}}}}}}{{#if:{{{sysop3|}}}| * {{禁制紀錄項目/sysop|{{{sysop3}}}}}}} </div> | {{#if:{{{start|}}}|{{#if:{{{AFdiff|}}}|[[Special:AbuseFilter/history/{{{AF|226}}}/diff/{{{AFdiff}}}|{{#time:Y"年"n"月"j"日" (D) H:i "(UTC)"|{{{start}}}}}]]|{{#time:Y"年"n"月"j"日" (D) H:i "(UTC)"|{{{start|}}}}}}}|{{Error|請提供開始時間!}}}} | <div class="plainlist">{{#if:{{{endtext|}}}{{{end|}}}| * {{{endtext|{{#time:Y"年"n"月"j"日" (D) H:i "(UTC)"|{{{end|}}}}}}}}|{{Error|請提供結束時間!}}}} {{{updates|}}}</div><noinclude> |} {{doc}} 5onzledt77v76ccipnxyzou7s8vbqo5 747671 747669 2026-06-20T13:43:09Z 臺灣象象 71227 臺灣象象 moved page [[User:臺灣象象/banlogtemplate]] to [[Template:Banlogtemplate]]: Test 747668 wikitext text/x-wiki <noinclude>{{NoteTA/MediaWiki}} {| class=wikitable ! 用戶名 !! 禁制類型 !! 禁制範圍 !! 相關討論 !! 執行者 !! 開始時間 !! 結束時間 </noinclude> |- | {{#ifeq:{{uc:{{{user|}}}}}|ZHWIKI|中文維基百科全站|<div class="plainlist"> * [[User:{{{user|Example}}}|-{<nowiki/>{{{user|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user|Example}}}|討論]] · [[Special:Contributions/{{{user|Example}}}|貢獻]] · [[Special:Logs/{{{user|Example}}}|日誌]])</div>{{#if:{{{user2|}}}| * [[User:{{{user2}}}|-{<nowiki/>{{{user2|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user2|Example}}}|討論]] · [[Special:Contributions/{{{user2|Example}}}|貢獻]] · [[Special:Logs/{{{user2|Example}}}|日誌]])</div>}}{{#if:{{{user3|}}}| * [[User:{{{user3}}}|-{<nowiki/>{{{user3|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user3|Example}}}|討論]] · [[Special:Contributions/{{{user3|Example}}}|貢獻]] · [[Special:Logs/{{{user3|Example}}}|日誌]])</div>}}{{#if:{{{user4|}}}| * [[User:{{{user4}}}|-{<nowiki/>{{{user4|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user4|Example}}}|討論]] · [[Special:Contributions/{{{user4|Example}}}|貢獻]] · [[Special:Logs/{{{user4|Example}}}|日誌]])</div>}}{{#if:{{{user5|}}}| * [[User:{{{user5}}}|-{<nowiki/>{{{user5|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user5|Example}}}|討論]] · [[Special:Contributions/{{{user5|Example}}}|貢獻]] · [[Special:Logs/{{{user5|Example}}}|日誌]])</div>}}{{#if:{{{user6|}}}| * [[User:{{{user6}}}|-{<nowiki/>{{{user6|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user6|Example}}}|討論]] · [[Special:Contributions/{{{user6|Example}}}|貢獻]] · [[Special:Logs/{{{user6|Example}}}|日誌]])</div>}}{{#if:{{{user7|}}}| * [[User:{{{user7}}}|-{<nowiki/>{{{user7|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user7|Example}}}|討論]] · [[Special:Contributions/{{{user7|Example}}}|貢獻]] · [[Special:Logs/{{{user7|Example}}}|日誌]])</div>}}{{#if:{{{user8|}}}| * [[User:{{{user8}}}|-{<nowiki/>{{{user8|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user8|Example}}}|討論]] · [[Special:Contributions/{{{user8|Example}}}|貢獻]] · [[Special:Logs/{{{user8|Example}}}|日誌]])</div>}}{{#if:{{{user8|}}}| * [[User:{{{user9}}}|-{<nowiki/>{{{user9|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user9|Example}}}|討論]] · [[Special:Contributions/{{{user9|Example}}}|貢獻]] · [[Special:Logs/{{{user9|Example}}}|日誌]])</div>}}{{#if:{{{user10|}}}| * [[User:{{{user10}}}|-{<nowiki/>{{{user10|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user10|Example}}}|討論]] · [[Special:Contributions/{{{user10|Example}}}|貢獻]] · [[Special:Logs/{{{user10|Example}}}|日誌]])</div>}} </div>}} | {{#switch:{{uc:{{{type|}}}}} | P | PBAN | PAGE | 頁 | 页 | 頁面 | 页面 | 頁面禁制 | 页面禁制 = 頁面禁制 | T | TBAN | TOPIC | 題 | 题 | 主題 | 主题 | 主題禁制 | 主题禁制 = 主題禁制 | I | IBAN | INTERACTION | 互 | 互動 | 互动 | 互動禁制 | 互动禁制 = 互動禁制 | E | EBAN | EMAIL | 郵 | 邮 | 電郵 | 电邮 | 電郵禁制 | 电邮禁制 = 電郵禁制 | R | RBAN | REVERT| 退 | 回退 | 回退禁制 | 回退限制 = 回退限制 | #default = {{{type}}} }} | {{{details|{{Error|請提供禁制範圍!}}}}} | <div class="hlist">{{#if:{{{ut|{{{UT|}}}}}}| * {{#ifexpr:{{#invoke:String|find|source={{{ut|{{{UT|}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{ut|{{{UT|}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{ut|{{{UT}}}}}}|UT]]|[[User talk:{{{ut|{{{UT}}}}}}|UT]]}}}}{{#if:{{{appeal|{{{unblock|{{{unban|}}}}}}}}}| * {{#ifexpr:{{#invoke:String|find|source={{{appeal|{{{unblock|{{{unban|}}}}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{appeal|{{{unblock|{{{unban|}}}}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{appeal|{{{unblock|{{{unban|}}}}}}}}}|申訴]]|{{#ifeq:{{NAMESPACENUMBER:{{{appeal|{{{unblock|{{{unban|}}}}}}}}}}}|2600|[[{{{appeal|{{{unblock|{{{unban|}}}}}}}}}|申訴]]|[[User talk:{{{appeal|{{{unblock|{{{unban|}}}}}}}}}|申訴]]}}}}}}{{#if:{{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}| * {{#ifexpr:{{#invoke:String|find|source={{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|AIV]]|[[Wikipedia:当前的破坏/存档/{{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|AIV]]}}}}{{#if:{{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}| * {{#ifexpr:{{#invoke:String|find|source={{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|AN3]]|[[Wikipedia:管理员布告板/编辑争议/存档/{{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|AN3]]}}}}{{#if:{{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}| * {{#ifexpr:{{#invoke:String|find|source={{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|ANM]]|[[Wikipedia:管理员布告板/其他不当行为/存档/{{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|ANM]]}}}}{{#if:{{{ctop|{{{CTOP|}}}}}}| * {{#ifexpr:{{#invoke:String|find|source={{{ctop|{{{CTOP|}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{ctop|{{{CTOP|}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{ctop|{{{CTOP|}}}}}}|CTOP]]|[[Wikipedia:高風險主題/{{{ctop|{{{CTOP|}}}}}}|CTOP]]}}}}{{#if:{{{arb|{{{ARB|}}}}}}| * {{#ifexpr:{{#invoke:String|find|source={{{arb|{{{ARB|}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{arb|{{{ARB|}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{arb|{{{ARB|}}}}}}|仲裁]]|[[Wikipedia:仲裁/請求/案件/{{{arb|{{{ARB|}}}}}}|仲裁]]}}}} {{{+links|}}}</div> | <div class="hlist"> * {{禁制紀錄項目/sysop|{{{sysop1|{{{sysop|Example}}}}}}}}{{#if:{{{sysop2|}}}| * {{禁制紀錄項目/sysop|{{{sysop2}}}}}}}{{#if:{{{sysop3|}}}| * {{禁制紀錄項目/sysop|{{{sysop3}}}}}}} </div> | {{#if:{{{start|}}}|{{#if:{{{AFdiff|}}}|[[Special:AbuseFilter/history/{{{AF|226}}}/diff/{{{AFdiff}}}|{{#time:Y"年"n"月"j"日" (D) H:i "(UTC)"|{{{start}}}}}]]|{{#time:Y"年"n"月"j"日" (D) H:i "(UTC)"|{{{start|}}}}}}}|{{Error|請提供開始時間!}}}} | <div class="plainlist">{{#if:{{{endtext|}}}{{{end|}}}| * {{{endtext|{{#time:Y"年"n"月"j"日" (D) H:i "(UTC)"|{{{end|}}}}}}}}|{{Error|請提供結束時間!}}}} {{{updates|}}}</div><noinclude> |} {{doc}} 5onzledt77v76ccipnxyzou7s8vbqo5 747677 747671 2026-06-20T13:50:49Z 臺灣象象 71227 臺灣象象 moved page [[Template:Banlogtemplate]] to [[Template:禁制紀錄項目]]: Test 747668 wikitext text/x-wiki <noinclude>{{NoteTA/MediaWiki}} {| class=wikitable ! 用戶名 !! 禁制類型 !! 禁制範圍 !! 相關討論 !! 執行者 !! 開始時間 !! 結束時間 </noinclude> |- | {{#ifeq:{{uc:{{{user|}}}}}|ZHWIKI|中文維基百科全站|<div class="plainlist"> * [[User:{{{user|Example}}}|-{<nowiki/>{{{user|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user|Example}}}|討論]] · [[Special:Contributions/{{{user|Example}}}|貢獻]] · [[Special:Logs/{{{user|Example}}}|日誌]])</div>{{#if:{{{user2|}}}| * [[User:{{{user2}}}|-{<nowiki/>{{{user2|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user2|Example}}}|討論]] · [[Special:Contributions/{{{user2|Example}}}|貢獻]] · [[Special:Logs/{{{user2|Example}}}|日誌]])</div>}}{{#if:{{{user3|}}}| * [[User:{{{user3}}}|-{<nowiki/>{{{user3|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user3|Example}}}|討論]] · [[Special:Contributions/{{{user3|Example}}}|貢獻]] · [[Special:Logs/{{{user3|Example}}}|日誌]])</div>}}{{#if:{{{user4|}}}| * [[User:{{{user4}}}|-{<nowiki/>{{{user4|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user4|Example}}}|討論]] · [[Special:Contributions/{{{user4|Example}}}|貢獻]] · [[Special:Logs/{{{user4|Example}}}|日誌]])</div>}}{{#if:{{{user5|}}}| * [[User:{{{user5}}}|-{<nowiki/>{{{user5|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user5|Example}}}|討論]] · [[Special:Contributions/{{{user5|Example}}}|貢獻]] · [[Special:Logs/{{{user5|Example}}}|日誌]])</div>}}{{#if:{{{user6|}}}| * [[User:{{{user6}}}|-{<nowiki/>{{{user6|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user6|Example}}}|討論]] · [[Special:Contributions/{{{user6|Example}}}|貢獻]] · [[Special:Logs/{{{user6|Example}}}|日誌]])</div>}}{{#if:{{{user7|}}}| * [[User:{{{user7}}}|-{<nowiki/>{{{user7|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user7|Example}}}|討論]] · [[Special:Contributions/{{{user7|Example}}}|貢獻]] · [[Special:Logs/{{{user7|Example}}}|日誌]])</div>}}{{#if:{{{user8|}}}| * [[User:{{{user8}}}|-{<nowiki/>{{{user8|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user8|Example}}}|討論]] · [[Special:Contributions/{{{user8|Example}}}|貢獻]] · [[Special:Logs/{{{user8|Example}}}|日誌]])</div>}}{{#if:{{{user8|}}}| * [[User:{{{user9}}}|-{<nowiki/>{{{user9|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user9|Example}}}|討論]] · [[Special:Contributions/{{{user9|Example}}}|貢獻]] · [[Special:Logs/{{{user9|Example}}}|日誌]])</div>}}{{#if:{{{user10|}}}| * [[User:{{{user10}}}|-{<nowiki/>{{{user10|Example}}}}-]]<div style="font-size:smaller;padding-left:1rem;white-space:nowrap;">([[User talk:{{{user10|Example}}}|討論]] · [[Special:Contributions/{{{user10|Example}}}|貢獻]] · [[Special:Logs/{{{user10|Example}}}|日誌]])</div>}} </div>}} | {{#switch:{{uc:{{{type|}}}}} | P | PBAN | PAGE | 頁 | 页 | 頁面 | 页面 | 頁面禁制 | 页面禁制 = 頁面禁制 | T | TBAN | TOPIC | 題 | 题 | 主題 | 主题 | 主題禁制 | 主题禁制 = 主題禁制 | I | IBAN | INTERACTION | 互 | 互動 | 互动 | 互動禁制 | 互动禁制 = 互動禁制 | E | EBAN | EMAIL | 郵 | 邮 | 電郵 | 电邮 | 電郵禁制 | 电邮禁制 = 電郵禁制 | R | RBAN | REVERT| 退 | 回退 | 回退禁制 | 回退限制 = 回退限制 | #default = {{{type}}} }} | {{{details|{{Error|請提供禁制範圍!}}}}} | <div class="hlist">{{#if:{{{ut|{{{UT|}}}}}}| * {{#ifexpr:{{#invoke:String|find|source={{{ut|{{{UT|}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{ut|{{{UT|}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{ut|{{{UT}}}}}}|UT]]|[[User talk:{{{ut|{{{UT}}}}}}|UT]]}}}}{{#if:{{{appeal|{{{unblock|{{{unban|}}}}}}}}}| * {{#ifexpr:{{#invoke:String|find|source={{{appeal|{{{unblock|{{{unban|}}}}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{appeal|{{{unblock|{{{unban|}}}}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{appeal|{{{unblock|{{{unban|}}}}}}}}}|申訴]]|{{#ifeq:{{NAMESPACENUMBER:{{{appeal|{{{unblock|{{{unban|}}}}}}}}}}}|2600|[[{{{appeal|{{{unblock|{{{unban|}}}}}}}}}|申訴]]|[[User talk:{{{appeal|{{{unblock|{{{unban|}}}}}}}}}|申訴]]}}}}}}{{#if:{{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}| * {{#ifexpr:{{#invoke:String|find|source={{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|AIV]]|[[Wikipedia:当前的破坏/存档/{{{aiv|{{{AIV|{{{vip|{{{VIP|}}}}}}}}}}}}|AIV]]}}}}{{#if:{{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}| * {{#ifexpr:{{#invoke:String|find|source={{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|AN3]]|[[Wikipedia:管理员布告板/编辑争议/存档/{{{an3|{{{AN3|{{{anew|{{{ANEW|}}}}}}}}}}}}|AN3]]}}}}{{#if:{{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}| * {{#ifexpr:{{#invoke:String|find|source={{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|ANM]]|[[Wikipedia:管理员布告板/其他不当行为/存档/{{{anm|{{{ANM|{{{ano|{{{ANO|}}}}}}}}}}}}|ANM]]}}}}{{#if:{{{ctop|{{{CTOP|}}}}}}| * {{#ifexpr:{{#invoke:String|find|source={{{ctop|{{{CTOP|}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{ctop|{{{CTOP|}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{ctop|{{{CTOP|}}}}}}|CTOP]]|[[Wikipedia:高風險主題/{{{ctop|{{{CTOP|}}}}}}|CTOP]]}}}}{{#if:{{{arb|{{{ARB|}}}}}}| * {{#ifexpr:{{#invoke:String|find|source={{{arb|{{{ARB|}}}}}}|target=^%d+$|plain=false}}+{{#invoke:String|find|source={{{arb|{{{ARB|}}}}}}|target=^%d+#.+$|plain=false}}|[[Special:Permalink/{{{arb|{{{ARB|}}}}}}|仲裁]]|[[Wikipedia:仲裁/請求/案件/{{{arb|{{{ARB|}}}}}}|仲裁]]}}}} {{{+links|}}}</div> | <div class="hlist"> * {{禁制紀錄項目/sysop|{{{sysop1|{{{sysop|Example}}}}}}}}{{#if:{{{sysop2|}}}| * {{禁制紀錄項目/sysop|{{{sysop2}}}}}}}{{#if:{{{sysop3|}}}| * {{禁制紀錄項目/sysop|{{{sysop3}}}}}}} </div> | {{#if:{{{start|}}}|{{#if:{{{AFdiff|}}}|[[Special:AbuseFilter/history/{{{AF|226}}}/diff/{{{AFdiff}}}|{{#time:Y"年"n"月"j"日" (D) H:i "(UTC)"|{{{start}}}}}]]|{{#time:Y"年"n"月"j"日" (D) H:i "(UTC)"|{{{start|}}}}}}}|{{Error|請提供開始時間!}}}} | <div class="plainlist">{{#if:{{{endtext|}}}{{{end|}}}| * {{{endtext|{{#time:Y"年"n"月"j"日" (D) H:i "(UTC)"|{{{end|}}}}}}}}|{{Error|請提供結束時間!}}}} {{{updates|}}}</div><noinclude> |} {{doc}} 5onzledt77v76ccipnxyzou7s8vbqo5 U:臺灣象象/banlogtemplate 0 176408 747670 2026-06-20T13:41:31Z 臺灣象象 71227 臺灣象象 moved page [[U:臺灣象象/banlogtemplate]] to [[User:臺灣象象/banlogtemplate]] 747670 wikitext text/x-wiki #REDIRECT [[User:臺灣象象/banlogtemplate]] {{Redirect category shell| {{R from move}} }} bv60phpap9pe1qhfak49v557w2mim0q User:臺灣象象/banlogtemplate 2 176409 747672 2026-06-20T13:43:09Z 臺灣象象 71227 臺灣象象 moved page [[User:臺灣象象/banlogtemplate]] to [[Template:Banlogtemplate]]: Test 747672 wikitext text/x-wiki #REDIRECT [[Template:Banlogtemplate]] {{Redirect category shell| {{R from move}} }} 0m30iklwd40cnbkyirxtajuyn9wum34 Banlog 0 176410 747673 2026-06-20T13:45:53Z 臺灣象象 71227 Created page with "{{User:臺灣象象/banlogtemplate |user=Example |start=200001010504 |endtext=無限期 }} {{User:臺灣象象/banlogtemplate |user=Example |start=200001012343 |end=202001022343 }} {{User:臺灣象象/banlogtemplate |user=Example |start=20000101 |end=202605080913 }} {{User:臺灣象象/banlogtemplate |user=Example |start=20000101 |end=202901020827 }} {{User:臺灣象象/banlogtemplate |user=Example |start=200001011534 |end=202606201900 }}" 747673 wikitext text/x-wiki {{User:臺灣象象/banlogtemplate |user=Example |start=200001010504 |endtext=無限期 }} {{User:臺灣象象/banlogtemplate |user=Example |start=200001012343 |end=202001022343 }} {{User:臺灣象象/banlogtemplate |user=Example |start=20000101 |end=202605080913 }} {{User:臺灣象象/banlogtemplate |user=Example |start=20000101 |end=202901020827 }} {{User:臺灣象象/banlogtemplate |user=Example |start=200001011534 |end=202606201900 }} o23zyllogv9wpbmdjsv4jrmfa7usxaa 747674 747673 2026-06-20T13:47:09Z 臺灣象象 71227 747674 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{User:臺灣象象/banlogtemplate |user=Example |start=200001010504 |endtext=無限期 }} {{User:臺灣象象/banlogtemplate |user=Example |start=200001012343 |end=202001022343 }} {{User:臺灣象象/banlogtemplate |user=Example |start=20000101 |end=202605080913 }} {{User:臺灣象象/banlogtemplate |user=Example |start=20000101 |end=202901020827 }} {{User:臺灣象象/banlogtemplate |user=Example |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] fkmdj5tbomyvlfijym031239xl2y9kx 747675 747674 2026-06-20T13:49:05Z 臺灣象象 71227 747675 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{User:臺灣象象/banlogtemplate |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{User:臺灣象象/banlogtemplate |user=Example |start=200001012343 |type=頁面禁制 |details=破壞 |sysop=Example |end=202001022343 }} {{User:臺灣象象/banlogtemplate |user=Example |start=20000101 |end=202605080913 |type=頁面禁制 |details=破壞 |sysop=Example }} {{User:臺灣象象/banlogtemplate |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202901020827 }} {{User:臺灣象象/banlogtemplate |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] njzank6u3yntznem8zipvbwijj3y3tm 747679 747675 2026-06-20T13:51:19Z 臺灣象象 71227 747679 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |start=200001012343 |type=頁面禁制 |details=破壞 |sysop=Example |end=202001022343 }} {{禁制紀錄項目 |user=Example |start=20000101 |end=202605080913 |type=頁面禁制 |details=破壞 |sysop=Example }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202901020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] 4q5et0k3qtv4zo7j78jh93e6y37ebyp 747685 747679 2026-06-20T14:38:11Z 臺灣象象 71227 臺灣象象 moved page [[User:臺灣象象/banlog]] to [[Banlog]] 747679 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |start=200001012343 |type=頁面禁制 |details=破壞 |sysop=Example |end=202001022343 }} {{禁制紀錄項目 |user=Example |start=20000101 |end=202605080913 |type=頁面禁制 |details=破壞 |sysop=Example }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202901020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] 4q5et0k3qtv4zo7j78jh93e6y37ebyp 747687 747685 2026-06-20T14:38:34Z Twelephant-bot 74539 自動存檔已過期的禁制 747687 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202901020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] aq1f1twimdk2imq5c6f05keswbknc9y 747692 747687 2026-06-20T14:58:13Z 臺灣象象 71227 Undid revisions from [[Special:diff/747687|747687]] to [[Special:diff/747685|747685]] // [[w:zh:U:1F616EMO/AdvancedRollback|AdvancedRollback]] 747692 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |start=200001012343 |type=頁面禁制 |details=破壞 |sysop=Example |end=202001022343 }} {{禁制紀錄項目 |user=Example |start=20000101 |end=202605080913 |type=頁面禁制 |details=破壞 |sysop=Example }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202901020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] 4q5et0k3qtv4zo7j78jh93e6y37ebyp 747693 747692 2026-06-20T15:05:56Z Twelephant-bot 74539 自動存檔已過期的禁制 747693 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202901020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] aq1f1twimdk2imq5c6f05keswbknc9y 747694 747693 2026-06-20T15:08:26Z 臺灣象象 71227 Undid revision [[Special:diff/747693|747693]] by [[Special:Contributions/Twelephant-bot|Twelephant-bot]] ([[User talk:Twelephant-bot|talk]]):​test // [[w:zh:U:1F616EMO/AdvancedRollback|AdvancedRollback]] 747694 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |start=200001012343 |type=頁面禁制 |details=破壞 |sysop=Example |end=202001022343 }} {{禁制紀錄項目 |user=Example |start=20000101 |end=202605080913 |type=頁面禁制 |details=破壞 |sysop=Example }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202901020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] 4q5et0k3qtv4zo7j78jh93e6y37ebyp 747695 747694 2026-06-20T15:08:44Z Twelephant-bot 74539 自動存檔已過期的禁制 747695 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202901020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] aq1f1twimdk2imq5c6f05keswbknc9y 747696 747695 2026-06-20T15:09:32Z 臺灣象象 71227 Restored revision 747692 by [[Special:Contributions/臺灣象象|臺灣象象]] ([[User talk:臺灣象象|talk]]): Test 747696 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |start=200001012343 |type=頁面禁制 |details=破壞 |sysop=Example |end=202001022343 }} {{禁制紀錄項目 |user=Example |start=20000101 |end=202605080913 |type=頁面禁制 |details=破壞 |sysop=Example }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202901020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] 4q5et0k3qtv4zo7j78jh93e6y37ebyp 747697 747696 2026-06-20T15:09:53Z Twelephant-bot 74539 自動存檔已過期的禁制 747697 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202901020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] aq1f1twimdk2imq5c6f05keswbknc9y 747698 747697 2026-06-20T15:10:33Z 臺灣象象 71227 Reverted edit(s) by [[Special:Contributions/Twelephant-bot|Twelephant-bot]] ([[User talk:Twelephant-bot|talk]]):​test // [[w:zh:U:1F616EMO/AdvancedRollback|AdvancedRollback]] 747698 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |start=200001012343 |type=頁面禁制 |details=破壞 |sysop=Example |end=202001022343 }} {{禁制紀錄項目 |user=Example |start=20000101 |end=202605080913 |type=頁面禁制 |details=破壞 |sysop=Example }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202901020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] 4q5et0k3qtv4zo7j78jh93e6y37ebyp 747699 747698 2026-06-20T15:10:45Z Twelephant-bot 74539 自動存檔已過期的禁制 747699 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202901020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] aq1f1twimdk2imq5c6f05keswbknc9y 747700 747699 2026-06-20T15:11:54Z 臺灣象象 71227 Restored revision 747696 by [[Special:Contributions/臺灣象象|臺灣象象]] ([[User talk:臺灣象象|talk]]): Test (TwinkleGlobal) 747700 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |start=200001012343 |type=頁面禁制 |details=破壞 |sysop=Example |end=202001022343 }} {{禁制紀錄項目 |user=Example |start=20000101 |end=202605080913 |type=頁面禁制 |details=破壞 |sysop=Example }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202901020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] 4q5et0k3qtv4zo7j78jh93e6y37ebyp 747701 747700 2026-06-20T15:12:05Z Twelephant-bot 74539 自動存檔已過期的禁制 747701 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202901020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] aq1f1twimdk2imq5c6f05keswbknc9y 747702 747701 2026-06-20T15:13:03Z 臺灣象象 71227 Undid revisions from [[Special:diff/747701|747701]] to [[Special:diff/747700|747700]] // [[w:zh:U:1F616EMO/AdvancedRollback|AdvancedRollback]] 747702 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |start=200001012343 |type=頁面禁制 |details=破壞 |sysop=Example |end=202001022343 }} {{禁制紀錄項目 |user=Example |start=20000101 |end=202605080913 |type=頁面禁制 |details=破壞 |sysop=Example }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202901020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] 4q5et0k3qtv4zo7j78jh93e6y37ebyp 747703 747702 2026-06-20T15:13:15Z Twelephant-bot 74539 自動存檔已過期的禁制 747703 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202901020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] aq1f1twimdk2imq5c6f05keswbknc9y 747704 747703 2026-06-20T15:14:13Z 臺灣象象 71227 Undid revisions from [[Special:diff/747703|747703]] to [[Special:diff/747702|747702]] // [[w:zh:U:1F616EMO/AdvancedRollback|AdvancedRollback]] 747704 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |start=200001012343 |type=頁面禁制 |details=破壞 |sysop=Example |end=202001022343 }} {{禁制紀錄項目 |user=Example |start=20000101 |end=202605080913 |type=頁面禁制 |details=破壞 |sysop=Example }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202901020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] 4q5et0k3qtv4zo7j78jh93e6y37ebyp 747705 747704 2026-06-20T15:14:23Z Twelephant-bot 74539 自動存檔已過期的禁制 747705 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202901020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] aq1f1twimdk2imq5c6f05keswbknc9y 747706 747705 2026-06-20T15:15:40Z 臺灣象象 71227 Reverted edit(s) by [[Special:Contributions/Twelephant-bot|Twelephant-bot]] ([[User talk:Twelephant-bot|talk]]):​test // [[w:zh:U:1F616EMO/AdvancedRollback|AdvancedRollback]] 747706 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |start=200001012343 |type=頁面禁制 |details=破壞 |sysop=Example |end=202001022343 }} {{禁制紀錄項目 |user=Example |start=20000101 |end=202605080913 |type=頁面禁制 |details=破壞 |sysop=Example }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202901020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] 4q5et0k3qtv4zo7j78jh93e6y37ebyp 747707 747706 2026-06-20T15:15:52Z Twelephant-bot 74539 自動存檔已過期的禁制 747707 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202901020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] aq1f1twimdk2imq5c6f05keswbknc9y 747708 747707 2026-06-20T15:16:55Z 臺灣象象 71227 Restored revision 747706 by [[Special:Contributions/臺灣象象|臺灣象象]] ([[User talk:臺灣象象|talk]]) (TwinkleGlobal) 747708 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |start=200001012343 |type=頁面禁制 |details=破壞 |sysop=Example |end=202001022343 }} {{禁制紀錄項目 |user=Example |start=20000101 |end=202605080913 |type=頁面禁制 |details=破壞 |sysop=Example }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202901020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] 4q5et0k3qtv4zo7j78jh93e6y37ebyp 747709 747708 2026-06-20T15:17:09Z Twelephant-bot 74539 自動存檔已過期的禁制 747709 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202901020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] aq1f1twimdk2imq5c6f05keswbknc9y 747710 747709 2026-06-20T15:19:49Z 臺灣象象 71227 Undid revisions from [[Special:diff/747709|747709]] to [[Special:diff/747708|747708]]:​test // [[w:zh:U:1F616EMO/AdvancedRollback|AdvancedRollback]] 747710 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |start=200001012343 |type=頁面禁制 |details=破壞 |sysop=Example |end=202001022343 }} {{禁制紀錄項目 |user=Example |start=20000101 |end=202605080913 |type=頁面禁制 |details=破壞 |sysop=Example }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202901020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] 4q5et0k3qtv4zo7j78jh93e6y37ebyp 747711 747710 2026-06-20T15:20:00Z Twelephant-bot 74539 自動存檔已過期的禁制 747711 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202901020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] aq1f1twimdk2imq5c6f05keswbknc9y 747712 747711 2026-06-20T15:22:59Z 臺灣象象 71227 Undid revisions from [[Special:diff/747711|747711]] to [[Special:diff/747710|747710]] // [[w:zh:U:1F616EMO/AdvancedRollback|AdvancedRollback]] 747712 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |start=200001012343 |type=頁面禁制 |details=破壞 |sysop=Example |end=202001022343 }} {{禁制紀錄項目 |user=Example |start=20000101 |end=202605080913 |type=頁面禁制 |details=破壞 |sysop=Example }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202901020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] 4q5et0k3qtv4zo7j78jh93e6y37ebyp 747713 747712 2026-06-20T15:23:09Z Twelephant-bot 74539 自動存檔已過期的禁制 747713 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202901020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] aq1f1twimdk2imq5c6f05keswbknc9y 747714 747713 2026-06-20T15:25:00Z 臺灣象象 71227 Undid revisions from [[Special:diff/747713|747713]] to [[Special:diff/747712|747712]] // [[w:zh:U:1F616EMO/AdvancedRollback|AdvancedRollback]] 747714 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |start=200001012343 |type=頁面禁制 |details=破壞 |sysop=Example |end=202001022343 }} {{禁制紀錄項目 |user=Example |start=20000101 |end=202605080913 |type=頁面禁制 |details=破壞 |sysop=Example }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202901020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] 4q5et0k3qtv4zo7j78jh93e6y37ebyp 747715 747714 2026-06-20T15:25:09Z Twelephant-bot 74539 自動存檔已過期的禁制 747715 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202901020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] aq1f1twimdk2imq5c6f05keswbknc9y 747716 747715 2026-06-20T15:26:23Z 臺灣象象 71227 Undid revisions from [[Special:diff/747715|747715]] to [[Special:diff/747714|747714]] // [[w:zh:U:1F616EMO/AdvancedRollback|AdvancedRollback]] 747716 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |start=200001012343 |type=頁面禁制 |details=破壞 |sysop=Example |end=202001022343 }} {{禁制紀錄項目 |user=Example |start=20000101 |end=202605080913 |type=頁面禁制 |details=破壞 |sysop=Example }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202901020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] 4q5et0k3qtv4zo7j78jh93e6y37ebyp 747717 747716 2026-06-20T15:26:37Z Twelephant-bot 74539 自動存檔已過期的禁制 747717 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202901020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] aq1f1twimdk2imq5c6f05keswbknc9y 747719 747717 2026-06-20T15:27:23Z 臺灣象象 71227 Undid revisions from [[Special:diff/747717|747717]] to [[Special:diff/747716|747716]] // [[w:zh:U:1F616EMO/AdvancedRollback|AdvancedRollback]] 747719 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |start=200001012343 |type=頁面禁制 |details=破壞 |sysop=Example |end=202001022343 }} {{禁制紀錄項目 |user=Example |start=20000101 |end=202605080913 |type=頁面禁制 |details=破壞 |sysop=Example }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202901020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] 4q5et0k3qtv4zo7j78jh93e6y37ebyp 747720 747719 2026-06-20T15:27:36Z Twelephant-bot 74539 自動存檔已過期的禁制 747720 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202901020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] aq1f1twimdk2imq5c6f05keswbknc9y 747722 747720 2026-06-20T15:29:50Z 臺灣象象 71227 Reverted edit(s) by [[Special:Contributions/Twelephant-bot|Twelephant-bot]] ([[User talk:Twelephant-bot|talk]]) // [[w:zh:U:1F616EMO/AdvancedRollback|AdvancedRollback]] 747722 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |start=200001012343 |type=頁面禁制 |details=破壞 |sysop=Example |end=202001022343 }} {{禁制紀錄項目 |user=Example |start=20000101 |end=202605080913 |type=頁面禁制 |details=破壞 |sysop=Example }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202901020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] 4q5et0k3qtv4zo7j78jh93e6y37ebyp 747723 747722 2026-06-20T15:30:09Z 臺灣象象 71227 747723 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |start=200001012343 |type=頁面禁制 |details=破壞 |sysop=Example |end=202101022343 }} {{禁制紀錄項目 |user=Example |start=20000101 |end=202605080913 |type=頁面禁制 |details=破壞 |sysop=Example }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202901020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] cktk58blatnebqqz461i4tolzuzpz6e 747724 747723 2026-06-20T15:30:24Z Twelephant-bot 74539 自動存檔已過期的禁制 747724 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202901020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] aq1f1twimdk2imq5c6f05keswbknc9y 747727 747724 2026-06-20T15:31:11Z 臺灣象象 71227 747727 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202401020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201900 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] hcb84yl41nhau8r1syhk1iouwl3ajr5 747728 747727 2026-06-20T15:31:38Z 臺灣象象 71227 747728 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202401020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201300 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] 407xgkzuclj30n2scej9fgv0am4rfy0 747730 747728 2026-06-20T15:33:44Z 臺灣象象 71227 747730 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202501020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201300 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] hsjghth7l919ac0e2lbn08nrvpolwnj 747732 747730 2026-06-20T15:41:16Z 臺灣象象 71227 747732 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201300 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202501020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201300 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201300 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] 3wl42kmj8biog0idkgyab0psi0xdyds 747735 747732 2026-06-20T15:42:28Z 臺灣象象 71227 747735 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201300 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202501020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201300 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201300 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202506201300 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201300 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=201406201300 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] oko4dcu3a00qxcniy2f1vzftrvdskqf 747736 747735 2026-06-20T15:42:40Z 臺灣象象 71227 747736 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201300 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202501020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201300 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201300 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202506201300 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=201406201300 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=201406201300 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] cw1j3w73e5a9zl1mr72ec5nuf3fmjm7 747740 747736 2026-06-20T15:42:56Z Twelephant-bot 74539 自動存檔已過期的禁制 747740 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] fntmle6lozz1qomrkk4soc66oj7pa3u 747741 747740 2026-06-20T15:45:05Z 臺灣象象 71227 747741 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |end=201810101010 }} {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |end=201810101010 }} {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |end=201910101010 }} {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |end=201910101010 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] 24sy67y6l358bzlif77yee8jh20a9jq 747744 747741 2026-06-20T15:46:38Z Twelephant-bot 74539 自動存檔已過期的禁制 747744 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] 34jzymeau3tl5xjwo4bvhbi9piodry7 747749 747744 2026-06-20T16:17:03Z 臺灣象象 71227 747749 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |end=200010102301 }} {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] 5fwlaaysufondly5iz55w0wyuoy9giu 747751 747749 2026-06-20T16:20:22Z Twelephant-bot 74539 自動存檔已過期的禁制 747751 wikitext text/x-wiki {{pp-protected|small=yes}} {{NoteTA/MediaWiki}} {{佈告板連結|state=collapsed}} {{shortcut|WP:BANLOG}} 此列表乃用以記載今昔實施而無法單以日誌記錄之[[WP:BAN|禁制]]。 {{clear}} == 實施中 == {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |endtext=無限期 }} |} <!-- 請在此行之上添加新項目。如有需要,可使用編輯器插入模板功能協助([[Template:禁制紀錄項目]])。 --> == [[/存檔/]] == {{/存檔}} [[Category:维基百科禁制]] palr4qa52v2kkjl4g0d6kexeiqq5tq4 Template:禁制紀錄項目/sysop 10 176411 747676 2026-06-20T13:49:35Z 臺灣象象 71227 Import from the revision [[w:zh:Special:PermaLink/88096337|88096337]] of [[w:zh:Template:禁制紀錄項目/sysop]] edited by [[w:zh:Special:Contributions/1F616EMO|1F616EMO]] at 2025-07-04T23:24:03Z via [[w:zh:User:臺灣象象/transwiki-importer.js|transwiki-importer]] 747676 wikitext text/x-wiki {{#switch:{{{1}}} |仲裁委員會|仲裁委员会=[[WP:仲裁委員會|仲裁委員會]] |#default=[[U:{{{1}}}|-{{{{1}}}}-]] }} c5o2esk5gvlhdkbownq5bpxcv4u9e6r Template:Banlogtemplate 10 176412 747678 2026-06-20T13:50:49Z 臺灣象象 71227 臺灣象象 moved page [[Template:Banlogtemplate]] to [[Template:禁制紀錄項目]]: Test 747678 wikitext text/x-wiki #REDIRECT [[Template:禁制紀錄項目]] {{Redirect category shell| {{R from move}} }} rqu4bc7ov2o8q3fnwx265nhnfzx0jfk User:97104-Test 2 176413 747683 2026-06-20T14:07:49Z 97104-Test 74540 Created page with "This is User97104's new account for testing. (See [[User:User97104]] here to verify)" 747683 wikitext text/x-wiki This is User97104's new account for testing. (See [[User:User97104]] here to verify) tecr26vx5m86aafwqsd9y7x1am6accv User:臺灣象象/banlog 2 176414 747686 2026-06-20T14:38:11Z 臺灣象象 71227 臺灣象象 moved page [[User:臺灣象象/banlog]] to [[Banlog]] 747686 wikitext text/x-wiki #REDIRECT [[Banlog]] {{Redirect category shell| {{R from move}} }} 3gsl6fbs2xrq2wcij29uinttjgifirh Talk:News 1 176415 747690 2026-06-20T14:47:55Z 97104-Test 74540 /* h */ new section 747690 wikitext text/x-wiki == h == @[[User:AutoModeratorTest|AutoModeratorTest]] [[User:97104-Test|97104-Test]] ([[User talk:97104-Test|talk]]) 14:47, 20 June 2026 (UTC) 7s4e4rfpxo5qn554ep2kmfxowj7q8xv Banlog/存檔/2020年 0 176416 747718 2026-06-20T15:26:39Z Twelephant-bot 74539 自動存檔已過期的禁制 747718 wikitext text/x-wiki <noinclude>{{Wikipedia:禁制紀錄/存檔/header}}</noinclude>{{禁制紀錄項目 |user=Example |start=200001012343 |type=頁面禁制 |details=破壞 |sysop=Example |end=202001022343 }} 0ef6kxup9gnmdwgzlchnou6omjzo7nk 747721 747718 2026-06-20T15:27:38Z Twelephant-bot 74539 自動存檔已過期的禁制 747721 wikitext text/x-wiki <noinclude>{{Wikipedia:禁制紀錄/存檔/header}}</noinclude>{{禁制紀錄項目 |user=Example |start=200001012343 |type=頁面禁制 |details=破壞 |sysop=Example |end=202001022343 }}{{禁制紀錄項目 |user=Example |start=200001012343 |type=頁面禁制 |details=破壞 |sysop=Example |end=202001022343 }} fj5mf0ydgglpj2y8zb0vj122p4euwn3 Banlog/存檔/2021年 0 176417 747725 2026-06-20T15:30:26Z Twelephant-bot 74539 自動存檔已過期的禁制 747725 wikitext text/x-wiki <noinclude>{{Wikipedia:禁制紀錄/存檔/header}}</noinclude> {{禁制紀錄項目 |user=Example |start=200001012343 |type=頁面禁制 |details=破壞 |sysop=Example |end=202101022343 }} d250iky4yxol5zih9pt3wpwfqpvs8dp Banlog/存檔/2026年 0 176418 747726 2026-06-20T15:30:27Z Twelephant-bot 74539 自動存檔已過期的禁制 747726 wikitext text/x-wiki <noinclude>{{Wikipedia:禁制紀錄/存檔/header}}</noinclude> {{禁制紀錄項目 |user=Example |start=20000101 |end=202605080913 |type=頁面禁制 |details=破壞 |sysop=Example }} jww4p0y55dqhgqmxfjrl3bktqjtgdu2 747737 747726 2026-06-20T15:42:52Z Twelephant-bot 74539 自動存檔已過期的禁制 747737 wikitext text/x-wiki <noinclude>{{Wikipedia:禁制紀錄/存檔/header}}</noinclude> {{禁制紀錄項目 |user=Example |start=20000101 |end=202605080913 |type=頁面禁制 |details=破壞 |sysop=Example }}{{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201300 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201300 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202606201300 }} pgxl1wrlg9cvdo8v0vinwtmtevo9zi1 Banlog/存檔/2024年 0 176419 747729 2026-06-20T15:31:47Z Twelephant-bot 74539 自動存檔已過期的禁制 747729 wikitext text/x-wiki <noinclude>{{Wikipedia:禁制紀錄/存檔/header}}</noinclude>{{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202401020827 }} rrct1zbsp2mke85gzh4ho7wryjbxlrg User:Twelephant-bot/task/3/config.json 2 176420 747731 2026-06-20T15:35:47Z Twelephant-bot 74539 Created page with "{"pageid":"176410", "banlogtemplate":"禁制紀錄項目", "banlogarchivepageheader":"<noinclude>{{Wikipedia:禁制紀錄/存檔/header}}</noinclude>", "banlogarchivepagetitleformat":"%s/存檔/%d年"}" 747731 json application/json { "pageid": "176410", "banlogtemplate": "禁制紀錄項目", "banlogarchivepageheader": "\u003Cnoinclude\u003E{{Wikipedia:禁制紀錄/存檔/header}}\u003C/noinclude\u003E", "banlogarchivepagetitleformat": "%s/存檔/%d年" } 25mpbu5f4tstbuw2mhtmmdds1ao8xwk 747734 747731 2026-06-20T15:41:52Z Twelephant-bot 74539 747734 json application/json { "pageid": "176410", "banlogtemplate": "禁制紀錄項目", "banlogarchivepageheader": "\u003Cnoinclude\u003E{{Banlog/header}}\u003C/noinclude\u003E", "banlogarchivepagetitleformat": "%s/存檔/%d年" } 08svvhqrlhl19t9rh3bto74coz01c8m 747748 747734 2026-06-20T16:16:17Z Twelephant-bot 74539 747748 json application/json { "pageid": "176410", "archivemainpageid": "176427", "banlogtemplate": "禁制紀錄項目", "banlogarchivepageheader": "\u003Cnoinclude\u003E{{Banlog/header}}\u003C/noinclude\u003E", "banlogarchivepagetitleformat": "%s/存檔/%d年", "banlogarchivemainpageoldformat": "!colspan=7 | %s", "banlogarchivemainpagenewformat": "\n|-\n{{%s}}" } mhc1pfwa1j8x742gtblrk2h49pjrkbr Template:Banlog/header 10 176421 747733 2026-06-20T15:41:46Z 臺灣象象 71227 Import from the revision [[w:zh:Special:PermaLink/78141345|78141345]] of [[w:zh:Wikipedia:禁制紀錄/存檔/header]] edited by [[w:zh:Special:Contributions/LuciferianThomas|LuciferianThomas]] at 2023-07-19T01:48:58Z via [[w:zh:User:臺灣象象/transwiki-importer.js|transwiki-importer]] 747733 wikitext text/x-wiki 此頁面放置已經過期或撤銷的[[維基百科:BAN|禁制]],以為存檔。關於現正施行之禁制,請見母頁面。 {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- 7f55hugybmvi59ryfq9w6rsxbt1grkr 747745 747733 2026-06-20T15:47:14Z 臺灣象象 71227 臺灣象象 moved page [[Banlog/header]] to [[Template:Banlog/header]] 747733 wikitext text/x-wiki 此頁面放置已經過期或撤銷的[[維基百科:BAN|禁制]],以為存檔。關於現正施行之禁制,請見母頁面。 {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- 7f55hugybmvi59ryfq9w6rsxbt1grkr Banlog/存檔/2025年 0 176422 747738 2026-06-20T15:42:54Z Twelephant-bot 74539 自動存檔已過期的禁制 747738 wikitext text/x-wiki <noinclude>{{Wikipedia:禁制紀錄/存檔/header}}</noinclude>{{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |start=20000101 |details=破壞 |end=202501020827 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=202506201300 }} t85byl3gx4ubk445zuehd6agcx15oiw Banlog/存檔/2014年 0 176423 747739 2026-06-20T15:42:55Z Twelephant-bot 74539 自動存檔已過期的禁制 747739 wikitext text/x-wiki <noinclude>{{Wikipedia:禁制紀錄/存檔/header}}</noinclude>{{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=201406201300 }} {{禁制紀錄項目 |user=Example |type=頁面禁制 |sysop=Example |details=破壞 |start=200001011534 |end=201406201300 }} 1vcevpfqc9lubisswobbx8td7gj877l Banlog/存檔/2018年 0 176424 747742 2026-06-20T15:46:35Z Twelephant-bot 74539 自動存檔已過期的禁制 747742 wikitext text/x-wiki <noinclude>{{Banlog/header}}</noinclude>{{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |end=201810101010 }} {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |end=201810101010 }} 1yv6k8j2iolbunhza8qdp5pyqzfq258 Banlog/存檔/2019年 0 176425 747743 2026-06-20T15:46:37Z Twelephant-bot 74539 自動存檔已過期的禁制 747743 wikitext text/x-wiki <noinclude>{{Banlog/header}}</noinclude>{{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |end=201910101010 }} {{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |end=201910101010 }} osib2imyi1cuvj5d0340adbg0a4vbvm Banlog/header 0 176426 747746 2026-06-20T15:47:14Z 臺灣象象 71227 臺灣象象 moved page [[Banlog/header]] to [[Template:Banlog/header]] 747746 wikitext text/x-wiki #REDIRECT [[Template:Banlog/header]] {{Redirect category shell| {{R from move}} }} gnlvfyq5slodhbjzca9pqgp9apprn0m Banlog/存檔 0 176427 747747 2026-06-20T16:15:35Z 臺灣象象 71227 Import from the revision [[w:zh:Special:PermaLink/90998103|90998103]] of [[w:zh:Wikipedia:禁制紀錄/存檔]] edited by [[w:zh:Special:Contributions/臺灣象象|臺灣象象]] at 2026-01-05T12:49:21Z via [[w:zh:User:臺灣象象/transwiki-importer.js|transwiki-importer]] 747747 wikitext text/x-wiki <noinclude>此頁面放置已經過期或撤銷的[[維基百科:BAN|禁制]],以為存檔。關於現正施行之禁制,請見母頁面。</noinclude> {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- ! colspan=7 | [[Wikipedia:禁制紀錄/存檔/2018年|2018年]] |- ! colspan=7 | [[Wikipedia:禁制紀錄/存檔/2019年|2019年]] |- ! colspan=7 | [[Wikipedia:禁制紀錄/存檔/2020年|2020年]] |- ! colspan=7 | [[Wikipedia:禁制紀錄/存檔/2021年|2021年]] |- ! colspan=7 | [[Wikipedia:禁制紀錄/存檔/2022年|2022年]] |- ! colspan=7 | [[Wikipedia:禁制紀錄/存檔/2023年|2023年]] |- ! colspan=7 | [[Wikipedia:禁制紀錄/存檔/2024年|2024年]] |- ! colspan=7 | [[Wikipedia:禁制紀錄/存檔/2025年|2025年]] |- !colspan=7 | [[Wikipedia:禁制紀錄/存檔/2026年|2026年]] |- {{Wikipedia:禁制紀錄/存檔/2026年}} nxo276t1dwslvahogul0iskjq3kis0h 747752 747747 2026-06-20T16:20:23Z Twelephant-bot 74539 自動更新禁制存檔列表 747752 wikitext text/x-wiki <noinclude>此頁面放置已經過期或撤銷的[[維基百科:BAN|禁制]],以為存檔。關於現正施行之禁制,請見母頁面。</noinclude> {| class="wikitable plainrowheaders sortable" style="width: 100%;" |- ! scope="col" style="width:15%" | 用戶名 ! scope="col" style="width:60px" | 禁制類型 ! scope="col" class="unsortable" style="width:30%" | 禁制說明 ! scope="col" class="unsortable" style="width:60px" | 相關討論 ! scope="col" | 執行者 ! scope="col" | 開始時間 ! scope="col" | 結束時間 |- ! colspan=7 | [[Wikipedia:禁制紀錄/存檔/2018年|2018年]] |- ! colspan=7 | [[Wikipedia:禁制紀錄/存檔/2019年|2019年]] |- ! colspan=7 | [[Wikipedia:禁制紀錄/存檔/2020年|2020年]] |- ! colspan=7 | [[Wikipedia:禁制紀錄/存檔/2021年|2021年]] |- ! colspan=7 | [[Wikipedia:禁制紀錄/存檔/2022年|2022年]] |- ! colspan=7 | [[Wikipedia:禁制紀錄/存檔/2023年|2023年]] |- ! colspan=7 | [[Wikipedia:禁制紀錄/存檔/2024年|2024年]] |- ! colspan=7 | [[Wikipedia:禁制紀錄/存檔/2025年|2025年]] |- !colspan=7 | [[Wikipedia:禁制紀錄/存檔/2026年|2026年]] |- !colspan=7 | {{Wikipedia:禁制紀錄/存檔/2026年}} |- {{Banlog/存檔/2000年}} 07k62r0ek9p6ko4inm5lbnfzhesy601 Banlog/存檔/2000年 0 176428 747750 2026-06-20T16:20:21Z Twelephant-bot 74539 自動存檔已過期的禁制 747750 wikitext text/x-wiki <noinclude>{{Banlog/header}}</noinclude>{{禁制紀錄項目 |user=Example |start=200001010504 |details=破壞 |type=頁面禁制 |sysop=Example |end=200010102301 }} 0f3tdx00ubsz5w11znzfqvphzvvuj7v Wikipedia:Good articles/ 4 176429 747797 2026-06-20T22:40:23Z 97104-Test 74540 Created page with "tewttt e ũeu" 747797 wikitext text/x-wiki tewttt e ũeu mvv0tz2e9x5nd8y1zx8f2ysmukuvd1o