<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://umamusu.wiki/Module:Game/Banners/Utils/history?feed=atom</id>
	<title>Module:Game/Banners/Utils - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://umamusu.wiki/Module:Game/Banners/Utils/history?feed=atom"/>
	<link rel="alternate" type="text/html" href="https://umamusu.wiki/Module:Game/Banners/Utils/history"/>
	<updated>2026-06-04T03:22:38Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://umamusu.wiki/w/index.php?title=Module:Game/Banners/Utils&amp;diff=41224&amp;oldid=prev</id>
		<title>GitBot: Automated from Git</title>
		<link rel="alternate" type="text/html" href="https://umamusu.wiki/w/index.php?title=Module:Game/Banners/Utils&amp;diff=41224&amp;oldid=prev"/>
		<updated>2025-10-21T22:40:21Z</updated>

		<summary type="html">&lt;p&gt;Automated from Git&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 22:40, 21 October 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l74&quot;&gt;Line 74:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 74:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;             from = &amp;quot;gacha_data&amp;quot;,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;             from = &amp;quot;gacha_data&amp;quot;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;             where = string.format(&amp;quot;id IN (%s) AND start_date &amp;gt;= %d&amp;quot;, gacha_ids_str, minTimestamp),&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;             where = string.format(&amp;quot;id IN (%s) AND start_date &amp;gt;= %d&amp;quot;, gacha_ids_str, minTimestamp),&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;             data = {&quot;id&quot;, &quot;start_date&quot;}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;             data = {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                id = &lt;/ins&gt;&quot;id&quot;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;                start_date = &lt;/ins&gt;&quot;start_date&quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;            &lt;/ins&gt;}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         }&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         }&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l80&quot;&gt;Line 80:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 83:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         local gacha_dates = {}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         local gacha_dates = {}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         for _, row in ipairs(gacha_data) do&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         for _, row in ipairs(gacha_data) do&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;             gacha_dates[row&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[1]&lt;/del&gt;] = row&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[2]&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;             gacha_dates[row&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;.id&lt;/ins&gt;] = row&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;.start_date&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         end&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         end&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>GitBot</name></author>
	</entry>
	<entry>
		<id>https://umamusu.wiki/w/index.php?title=Module:Game/Banners/Utils&amp;diff=41222&amp;oldid=prev</id>
		<title>GitBot: Automated from Git</title>
		<link rel="alternate" type="text/html" href="https://umamusu.wiki/w/index.php?title=Module:Game/Banners/Utils&amp;diff=41222&amp;oldid=prev"/>
		<updated>2025-10-21T22:14:47Z</updated>

		<summary type="html">&lt;p&gt;Automated from Git&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 22:14, 21 October 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;--[[&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    !! THIS PAGE IS MANAGED BY GITLAB !!&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    ANY EDITS TO PAGE CONTENT WILL BE OVERWRITTEN&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    TO MAKE CHANGES, PLEASE SUBMIT A MERGE REQUEST AT https://gitlab.com/umamusume-wiki/lua-modules&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;local p = {}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;local p = {}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>GitBot</name></author>
	</entry>
	<entry>
		<id>https://umamusu.wiki/w/index.php?title=Module:Game/Banners/Utils&amp;diff=41218&amp;oldid=prev</id>
		<title>GitBot: Automated from Git</title>
		<link rel="alternate" type="text/html" href="https://umamusu.wiki/w/index.php?title=Module:Game/Banners/Utils&amp;diff=41218&amp;oldid=prev"/>
		<updated>2025-10-21T22:10:58Z</updated>

		<summary type="html">&lt;p&gt;Automated from Git&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.getReleaseDates(itemIds, itemType, language)&lt;br /&gt;
    local Game = require(&amp;quot;Module:Game&amp;quot;)&lt;br /&gt;
    local Utils = require(&amp;quot;Module:Utils&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    -- Language configuration: maps language code to {queryFunction, minTimestamp}&lt;br /&gt;
    local languageConfig = {&lt;br /&gt;
        JP = { func = Game.queryMaster, minTimestamp = 1614081600 },    -- Feb 23, 2021&lt;br /&gt;
        EN = { func = Game.queryMasterEN, minTimestamp = 1750852800 },  -- Jul 25, 2025&lt;br /&gt;
        -- Add future languages here, e.g.:&lt;br /&gt;
        -- KR = { func = Game.queryMasterKR, minTimestamp = 1234567890 },&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    local config = languageConfig[language]&lt;br /&gt;
    if not config then&lt;br /&gt;
        error(string.format(&amp;quot;Unsupported language: %s. Supported languages: %s&amp;quot;,&lt;br /&gt;
            language,&lt;br /&gt;
            table.concat(Utils.getKeys(languageConfig), &amp;quot;, &amp;quot;)))&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Determine card_type for gacha query and whether to append &amp;quot;01&amp;quot; for characters&lt;br /&gt;
    local cardType = 1 -- default for playable cards&lt;br /&gt;
    local queryIds = itemIds&lt;br /&gt;
    if itemType == &amp;quot;support&amp;quot; then&lt;br /&gt;
        cardType = 2&lt;br /&gt;
    elseif itemType == &amp;quot;character&amp;quot; then&lt;br /&gt;
        cardType = 1&lt;br /&gt;
        -- For characters, append &amp;quot;01&amp;quot; to get the base card ID (e.g., &amp;quot;1001&amp;quot; -&amp;gt; &amp;quot;100101&amp;quot;)&lt;br /&gt;
        queryIds = {}&lt;br /&gt;
        for _, charId in ipairs(itemIds) do&lt;br /&gt;
            table.insert(queryIds, charId .. &amp;quot;01&amp;quot;)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local itemIdsInsert = table.concat(queryIds, &amp;quot;,&amp;quot;)&lt;br /&gt;
    local minTimestamp = config.minTimestamp&lt;br /&gt;
    local queryFunc = config.func&lt;br /&gt;
&lt;br /&gt;
    -- Step 1: Get gacha_available records for the items&lt;br /&gt;
    local gacha_available = queryFunc {&lt;br /&gt;
        from = &amp;quot;gacha_available&amp;quot;,&lt;br /&gt;
        where = string.format(&amp;quot;gacha_available.card_id IN (%s) AND gacha_available.gacha_id &amp;gt;= 30000 AND gacha_available.gacha_id &amp;lt; 40000 AND gacha_available.card_type = %d&amp;quot;, itemIdsInsert, cardType)&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    -- Step 2: Build mapping of card_id to gacha_ids&lt;br /&gt;
    local gacha_ids = {}&lt;br /&gt;
    local card_gacha_map = {}&lt;br /&gt;
    for _, row in ipairs(gacha_available) do&lt;br /&gt;
        gacha_ids[row.gacha_id] = true&lt;br /&gt;
        if not card_gacha_map[row.card_id] then&lt;br /&gt;
            card_gacha_map[row.card_id] = {}&lt;br /&gt;
        end&lt;br /&gt;
        table.insert(card_gacha_map[row.card_id], row.gacha_id)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Step 3: Get gacha_ids as array&lt;br /&gt;
    local gacha_ids_array = {}&lt;br /&gt;
    for id, _ in pairs(gacha_ids) do&lt;br /&gt;
        table.insert(gacha_ids_array, id)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Step 4: Query gacha_data and find minimum dates&lt;br /&gt;
    local releaseDates = {}&lt;br /&gt;
    if #gacha_ids_array &amp;gt; 0 then&lt;br /&gt;
        local gacha_ids_str = table.concat(gacha_ids_array, &amp;quot;,&amp;quot;)&lt;br /&gt;
        local gacha_data = queryFunc {&lt;br /&gt;
            from = &amp;quot;gacha_data&amp;quot;,&lt;br /&gt;
            where = string.format(&amp;quot;id IN (%s) AND start_date &amp;gt;= %d&amp;quot;, gacha_ids_str, minTimestamp),&lt;br /&gt;
            data = {&amp;quot;id&amp;quot;, &amp;quot;start_date&amp;quot;}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        -- Step 5: Build lookup table for gacha dates&lt;br /&gt;
        local gacha_dates = {}&lt;br /&gt;
        for _, row in ipairs(gacha_data) do&lt;br /&gt;
            gacha_dates[row[1]] = row[2]&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        -- Step 6: Find minimum date for each card&lt;br /&gt;
        for card_id, gacha_id_list in pairs(card_gacha_map) do&lt;br /&gt;
            local min_date = nil&lt;br /&gt;
            for _, gacha_id in ipairs(gacha_id_list) do&lt;br /&gt;
                local date = gacha_dates[gacha_id]&lt;br /&gt;
                if date and tonumber(date) &amp;gt;= minTimestamp and (not min_date or tonumber(date) &amp;lt; tonumber(min_date)) then&lt;br /&gt;
                    min_date = date&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            if min_date then&lt;br /&gt;
                -- For characters, map back from card ID to character ID (e.g., &amp;quot;100101&amp;quot; -&amp;gt; &amp;quot;1001&amp;quot;)&lt;br /&gt;
                if itemType == &amp;quot;character&amp;quot; then&lt;br /&gt;
                    local charId = string.sub(card_id, 1, -3) -- Remove last 2 digits&lt;br /&gt;
                    releaseDates[charId] = min_date&lt;br /&gt;
                else&lt;br /&gt;
                    releaseDates[card_id] = min_date&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return releaseDates&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>GitBot</name></author>
	</entry>
</feed>