You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juneau.apache.org by gi...@apache.org on 2025/12/01 16:39:36 UTC
(juneau) branch asf-staging updated: Deploy documentation staging from ebbc76410588b9d35bb072e3e26f101d8eae97b8 ebbc76410588b9d35bb072e3e26f101d8eae97b8
This is an automated email from the ASF dual-hosted git repository.
github-bot pushed a commit to branch asf-staging
in repository https://gitbox.apache.org/repos/asf/juneau.git
The following commit(s) were added to refs/heads/asf-staging by this push:
new e05fd30fe0 Deploy documentation staging from ebbc76410588b9d35bb072e3e26f101d8eae97b8 ebbc76410588b9d35bb072e3e26f101d8eae97b8
e05fd30fe0 is described below
commit e05fd30fe0104f2575fbd8f7c04cb2f372c23b13
Author: github-actions[bot] <gi...@users.noreply.github.com>
AuthorDate: Mon Dec 1 16:39:31 2025 +0000
Deploy documentation staging from ebbc76410588b9d35bb072e3e26f101d8eae97b8 ebbc76410588b9d35bb072e3e26f101d8eae97b8
---
.../juneau/common/utils/StringUtils_Test.html | 6461 ++++++++++----------
.../apache/juneau/common/utils/StringUtils.html | 6129 ++++++++++---------
2 files changed, 6306 insertions(+), 6284 deletions(-)
diff --git a/site/xref-test/org/apache/juneau/common/utils/StringUtils_Test.html b/site/xref-test/org/apache/juneau/common/utils/StringUtils_Test.html
index 66f70b4f48..f5639fa87d 100644
--- a/site/xref-test/org/apache/juneau/common/utils/StringUtils_Test.html
+++ b/site/xref-test/org/apache/juneau/common/utils/StringUtils_Test.html
@@ -1518,3278 +1518,3289 @@
<a class="jxr_linenumber" name="L1510" href="#L1510">1510</a> assertEquals(<span class="jxr_string">"Progress: 50%"</span>, format(<span class="jxr_string">"Progress: %d%%"</span>, 50));
<a class="jxr_linenumber" name="L1511" href="#L1511">1511</a> assertEquals(<span class="jxr_string">"Discount: 25% off"</span>, format(<span class="jxr_string">"Discount: %d%% off"</span>, 25));
<a class="jxr_linenumber" name="L1512" href="#L1512">1512</a>
-<a class="jxr_linenumber" name="L1513" href="#L1513">1513</a> <em class="jxr_comment">// Line separator - %n is supported by printf-style formatting</em>
-<a class="jxr_linenumber" name="L1514" href="#L1514">1514</a> <strong class="jxr_keyword">var</strong> result = format(<span class="jxr_string">"Line 1%nLine 2"</span>);
-<a class="jxr_linenumber" name="L1515" href="#L1515">1515</a> assertTrue(result.contains(<span class="jxr_string">"Line 1"</span>));
-<a class="jxr_linenumber" name="L1516" href="#L1516">1516</a> assertTrue(result.contains(<span class="jxr_string">"Line 2"</span>));
-<a class="jxr_linenumber" name="L1517" href="#L1517">1517</a> <em class="jxr_comment">// %n may or may not be replaced depending on StringFormat implementation</em>
-<a class="jxr_linenumber" name="L1518" href="#L1518">1518</a> <em class="jxr_comment">// Just verify the result contains both lines</em>
-<a class="jxr_linenumber" name="L1519" href="#L1519">1519</a>
-<a class="jxr_linenumber" name="L1520" href="#L1520">1520</a> <em class="jxr_comment">// MessageFormat style</em>
-<a class="jxr_linenumber" name="L1521" href="#L1521">1521</a> assertEquals(<span class="jxr_string">"Hello John, you are 30 years old"</span>, format(<span class="jxr_string">"Hello {0}, you are {1} years old"</span>, <span class="jxr_string">"John"</span>, 30));
-<a class="jxr_linenumber" name="L1522" href="#L1522">1522</a> assertEquals(<span class="jxr_string">"Hello {0}"</span>, format(<span class="jxr_string">"Hello {0}"</span>)); <em class="jxr_comment">// No args</em>
-<a class="jxr_linenumber" name="L1523" href="#L1523">1523</a> assertEquals(<span class="jxr_string">"Hello {}"</span>, format(<span class="jxr_string">"Hello {}"</span>)); <em class="jxr_comment">// Unnumbered placeholder</em>
-<a class="jxr_linenumber" name="L1524" href="#L1524">1524</a> }
-<a class="jxr_linenumber" name="L1525" href="#L1525">1525</a>
-<a class="jxr_linenumber" name="L1526" href="#L1526">1526</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1527" href="#L1527">1527</a> <em class="jxr_comment">// formatNamed(String,Map<String,Object>)</em>
-<a class="jxr_linenumber" name="L1528" href="#L1528">1528</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1529" href="#L1529">1529</a> @Test
-<a class="jxr_linenumber" name="L1530" href="#L1530">1530</a> <strong class="jxr_keyword">void</strong> a59_formatNamed() {
-<a class="jxr_linenumber" name="L1531" href="#L1531">1531</a> <strong class="jxr_keyword">var</strong> args = <strong class="jxr_keyword">new</strong> HashMap<String,Object>();
-<a class="jxr_linenumber" name="L1532" href="#L1532">1532</a> args.put(<span class="jxr_string">"name"</span>, <span class="jxr_string">"John"</span>);
-<a class="jxr_linenumber" name="L1533" href="#L1533">1533</a> args.put(<span class="jxr_string">"age"</span>, 30);
-<a class="jxr_linenumber" name="L1534" href="#L1534">1534</a> args.put(<span class="jxr_string">"city"</span>, <span class="jxr_string">"New York"</span>);
-<a class="jxr_linenumber" name="L1535" href="#L1535">1535</a> assertEquals(<span class="jxr_string">"Hello John, you are 30 years old"</span>, formatNamed(<span class="jxr_string">"Hello {name}, you are {age} years old"</span>, args));
-<a class="jxr_linenumber" name="L1536" href="#L1536">1536</a> assertEquals(<span class="jxr_string">"Welcome to New York"</span>, formatNamed(<span class="jxr_string">"Welcome to {city}"</span>, args));
-<a class="jxr_linenumber" name="L1537" href="#L1537">1537</a> assertEquals(<span class="jxr_string">"Hello {unknown}"</span>, formatNamed(<span class="jxr_string">"Hello {unknown}"</span>, args)); <em class="jxr_comment">// Unknown placeholder kept</em>
-<a class="jxr_linenumber" name="L1538" href="#L1538">1538</a> assertEquals(<span class="jxr_string">"No placeholders"</span>, formatNamed(<span class="jxr_string">"No placeholders"</span>, args));
-<a class="jxr_linenumber" name="L1539" href="#L1539">1539</a> assertNull(formatNamed(<strong class="jxr_keyword">null</strong>, args));
-<a class="jxr_linenumber" name="L1540" href="#L1540">1540</a> assertEquals(<span class="jxr_string">"Template"</span>, formatNamed(<span class="jxr_string">"Template"</span>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L1541" href="#L1541">1541</a> assertEquals(<span class="jxr_string">"Template"</span>, formatNamed(<span class="jxr_string">"Template"</span>, <strong class="jxr_keyword">new</strong> HashMap<>()));
-<a class="jxr_linenumber" name="L1542" href="#L1542">1542</a> <em class="jxr_comment">// Test with null values</em>
-<a class="jxr_linenumber" name="L1543" href="#L1543">1543</a> <strong class="jxr_keyword">var</strong> argsWithNull = <strong class="jxr_keyword">new</strong> HashMap<String,Object>();
-<a class="jxr_linenumber" name="L1544" href="#L1544">1544</a> argsWithNull.put(<span class="jxr_string">"name"</span>, <span class="jxr_string">"John"</span>);
-<a class="jxr_linenumber" name="L1545" href="#L1545">1545</a> argsWithNull.put(<span class="jxr_string">"value"</span>, <strong class="jxr_keyword">null</strong>);
-<a class="jxr_linenumber" name="L1546" href="#L1546">1546</a> assertEquals(<span class="jxr_string">"Hello John, value: "</span>, formatNamed(<span class="jxr_string">"Hello {name}, value: {value}"</span>, argsWithNull));
-<a class="jxr_linenumber" name="L1547" href="#L1547">1547</a> }
-<a class="jxr_linenumber" name="L1548" href="#L1548">1548</a>
-<a class="jxr_linenumber" name="L1549" href="#L1549">1549</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1550" href="#L1550">1550</a> <em class="jxr_comment">// fromHex(String)</em>
-<a class="jxr_linenumber" name="L1551" href="#L1551">1551</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1552" href="#L1552">1552</a> @Test
-<a class="jxr_linenumber" name="L1553" href="#L1553">1553</a> <strong class="jxr_keyword">void</strong> a60_fromHex() {
-<a class="jxr_linenumber" name="L1554" href="#L1554">1554</a> <em class="jxr_comment">// Basic conversion</em>
-<a class="jxr_linenumber" name="L1555" href="#L1555">1555</a> <strong class="jxr_keyword">var</strong> bytes1 = fromHex(<span class="jxr_string">"48656C6C6F"</span>); <em class="jxr_comment">// "Hello" in hex</em>
-<a class="jxr_linenumber" name="L1556" href="#L1556">1556</a> assertEquals(5, bytes1.length);
-<a class="jxr_linenumber" name="L1557" href="#L1557">1557</a> assertEquals((byte)'H', bytes1[0]);
-<a class="jxr_linenumber" name="L1558" href="#L1558">1558</a> assertEquals((byte)'e', bytes1[1]);
-<a class="jxr_linenumber" name="L1559" href="#L1559">1559</a> assertEquals((byte)'l', bytes1[2]);
-<a class="jxr_linenumber" name="L1560" href="#L1560">1560</a> assertEquals((byte)'l', bytes1[3]);
-<a class="jxr_linenumber" name="L1561" href="#L1561">1561</a> assertEquals((byte)'o', bytes1[4]);
-<a class="jxr_linenumber" name="L1562" href="#L1562">1562</a>
-<a class="jxr_linenumber" name="L1563" href="#L1563">1563</a> <em class="jxr_comment">// Single byte</em>
-<a class="jxr_linenumber" name="L1564" href="#L1564">1564</a> <strong class="jxr_keyword">var</strong> bytes2 = fromHex(<span class="jxr_string">"FF"</span>);
-<a class="jxr_linenumber" name="L1565" href="#L1565">1565</a> assertEquals(1, bytes2.length);
-<a class="jxr_linenumber" name="L1566" href="#L1566">1566</a> assertEquals((byte)0xFF, bytes2[0]);
-<a class="jxr_linenumber" name="L1567" href="#L1567">1567</a>
-<a class="jxr_linenumber" name="L1568" href="#L1568">1568</a> <em class="jxr_comment">// Two bytes</em>
-<a class="jxr_linenumber" name="L1569" href="#L1569">1569</a> <strong class="jxr_keyword">var</strong> bytes3 = fromHex(<span class="jxr_string">"0102"</span>);
-<a class="jxr_linenumber" name="L1570" href="#L1570">1570</a> assertEquals(2, bytes3.length);
-<a class="jxr_linenumber" name="L1571" href="#L1571">1571</a> assertEquals((byte)0x01, bytes3[0]);
-<a class="jxr_linenumber" name="L1572" href="#L1572">1572</a> assertEquals((byte)0x02, bytes3[1]);
-<a class="jxr_linenumber" name="L1573" href="#L1573">1573</a>
-<a class="jxr_linenumber" name="L1574" href="#L1574">1574</a> <em class="jxr_comment">// Zero bytes</em>
-<a class="jxr_linenumber" name="L1575" href="#L1575">1575</a> <strong class="jxr_keyword">var</strong> bytes4 = fromHex(<span class="jxr_string">"0000"</span>);
-<a class="jxr_linenumber" name="L1576" href="#L1576">1576</a> assertEquals(2, bytes4.length);
-<a class="jxr_linenumber" name="L1577" href="#L1577">1577</a> assertEquals((byte)0x00, bytes4[0]);
-<a class="jxr_linenumber" name="L1578" href="#L1578">1578</a> assertEquals((byte)0x00, bytes4[1]);
-<a class="jxr_linenumber" name="L1579" href="#L1579">1579</a>
-<a class="jxr_linenumber" name="L1580" href="#L1580">1580</a> <em class="jxr_comment">// Empty string</em>
-<a class="jxr_linenumber" name="L1581" href="#L1581">1581</a> <strong class="jxr_keyword">var</strong> bytes5 = fromHex(<span class="jxr_string">""</span>);
-<a class="jxr_linenumber" name="L1582" href="#L1582">1582</a> assertEquals(0, bytes5.length);
-<a class="jxr_linenumber" name="L1583" href="#L1583">1583</a> }
-<a class="jxr_linenumber" name="L1584" href="#L1584">1584</a>
-<a class="jxr_linenumber" name="L1585" href="#L1585">1585</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1586" href="#L1586">1586</a> <em class="jxr_comment">// fromHexToUTF8(String)</em>
-<a class="jxr_linenumber" name="L1587" href="#L1587">1587</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1588" href="#L1588">1588</a> @Test
-<a class="jxr_linenumber" name="L1589" href="#L1589">1589</a> <strong class="jxr_keyword">void</strong> a61_fromHexToUTF8() {
-<a class="jxr_linenumber" name="L1590" href="#L1590">1590</a> <em class="jxr_comment">// Basic conversion</em>
-<a class="jxr_linenumber" name="L1591" href="#L1591">1591</a> assertEquals(<span class="jxr_string">"Hello"</span>, fromHexToUTF8(<span class="jxr_string">"48656C6C6F"</span>));
-<a class="jxr_linenumber" name="L1592" href="#L1592">1592</a> assertEquals(<span class="jxr_string">"World"</span>, fromHexToUTF8(<span class="jxr_string">"576F726C64"</span>));
-<a class="jxr_linenumber" name="L1593" href="#L1593">1593</a>
-<a class="jxr_linenumber" name="L1594" href="#L1594">1594</a> <em class="jxr_comment">// UTF-8 characters</em>
-<a class="jxr_linenumber" name="L1595" href="#L1595">1595</a> assertEquals(<span class="jxr_string">"test"</span>, fromHexToUTF8(<span class="jxr_string">"74657374"</span>));
-<a class="jxr_linenumber" name="L1596" href="#L1596">1596</a>
-<a class="jxr_linenumber" name="L1597" href="#L1597">1597</a> <em class="jxr_comment">// Empty string</em>
-<a class="jxr_linenumber" name="L1598" href="#L1598">1598</a> assertEquals(<span class="jxr_string">""</span>, fromHexToUTF8(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L1599" href="#L1599">1599</a> }
-<a class="jxr_linenumber" name="L1600" href="#L1600">1600</a>
-<a class="jxr_linenumber" name="L1601" href="#L1601">1601</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1602" href="#L1602">1602</a> <em class="jxr_comment">// fromSpacedHex(String)</em>
-<a class="jxr_linenumber" name="L1603" href="#L1603">1603</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1604" href="#L1604">1604</a> @Test
-<a class="jxr_linenumber" name="L1605" href="#L1605">1605</a> <strong class="jxr_keyword">void</strong> a62_fromSpacedHex() {
-<a class="jxr_linenumber" name="L1606" href="#L1606">1606</a> <em class="jxr_comment">// Basic conversion with spaces</em>
-<a class="jxr_linenumber" name="L1607" href="#L1607">1607</a> <strong class="jxr_keyword">var</strong> bytes1 = fromSpacedHex(<span class="jxr_string">"48 65 6C 6C 6F"</span>); <em class="jxr_comment">// "Hello" in hex with spaces</em>
-<a class="jxr_linenumber" name="L1608" href="#L1608">1608</a> assertEquals(5, bytes1.length);
-<a class="jxr_linenumber" name="L1609" href="#L1609">1609</a> assertEquals((byte)'H', bytes1[0]);
-<a class="jxr_linenumber" name="L1610" href="#L1610">1610</a> assertEquals((byte)'e', bytes1[1]);
-<a class="jxr_linenumber" name="L1611" href="#L1611">1611</a> assertEquals((byte)'l', bytes1[2]);
-<a class="jxr_linenumber" name="L1612" href="#L1612">1612</a> assertEquals((byte)'l', bytes1[3]);
-<a class="jxr_linenumber" name="L1613" href="#L1613">1613</a> assertEquals((byte)'o', bytes1[4]);
-<a class="jxr_linenumber" name="L1614" href="#L1614">1614</a>
-<a class="jxr_linenumber" name="L1615" href="#L1615">1615</a> <em class="jxr_comment">// Single byte</em>
-<a class="jxr_linenumber" name="L1616" href="#L1616">1616</a> <strong class="jxr_keyword">var</strong> bytes2 = fromSpacedHex(<span class="jxr_string">"FF"</span>);
-<a class="jxr_linenumber" name="L1617" href="#L1617">1617</a> assertEquals(1, bytes2.length);
-<a class="jxr_linenumber" name="L1618" href="#L1618">1618</a> assertEquals((byte)0xFF, bytes2[0]);
-<a class="jxr_linenumber" name="L1619" href="#L1619">1619</a>
-<a class="jxr_linenumber" name="L1620" href="#L1620">1620</a> <em class="jxr_comment">// Two bytes</em>
-<a class="jxr_linenumber" name="L1621" href="#L1621">1621</a> <strong class="jxr_keyword">var</strong> bytes3 = fromSpacedHex(<span class="jxr_string">"01 02"</span>);
-<a class="jxr_linenumber" name="L1622" href="#L1622">1622</a> assertEquals(2, bytes3.length);
-<a class="jxr_linenumber" name="L1623" href="#L1623">1623</a> assertEquals((byte)0x01, bytes3[0]);
-<a class="jxr_linenumber" name="L1624" href="#L1624">1624</a> assertEquals((byte)0x02, bytes3[1]);
-<a class="jxr_linenumber" name="L1625" href="#L1625">1625</a> }
-<a class="jxr_linenumber" name="L1626" href="#L1626">1626</a>
-<a class="jxr_linenumber" name="L1627" href="#L1627">1627</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1628" href="#L1628">1628</a> <em class="jxr_comment">// fromSpacedHexToUTF8(String)</em>
-<a class="jxr_linenumber" name="L1629" href="#L1629">1629</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1630" href="#L1630">1630</a> @Test
-<a class="jxr_linenumber" name="L1631" href="#L1631">1631</a> <strong class="jxr_keyword">void</strong> a63_fromSpacedHexToUTF8() {
-<a class="jxr_linenumber" name="L1632" href="#L1632">1632</a> <em class="jxr_comment">// Basic conversion with spaces</em>
-<a class="jxr_linenumber" name="L1633" href="#L1633">1633</a> assertEquals(<span class="jxr_string">"Hello"</span>, fromSpacedHexToUTF8(<span class="jxr_string">"48 65 6C 6C 6F"</span>));
-<a class="jxr_linenumber" name="L1634" href="#L1634">1634</a> assertEquals(<span class="jxr_string">"World"</span>, fromSpacedHexToUTF8(<span class="jxr_string">"57 6F 72 6C 64"</span>));
-<a class="jxr_linenumber" name="L1635" href="#L1635">1635</a>
-<a class="jxr_linenumber" name="L1636" href="#L1636">1636</a> <em class="jxr_comment">// UTF-8 characters</em>
-<a class="jxr_linenumber" name="L1637" href="#L1637">1637</a> assertEquals(<span class="jxr_string">"test"</span>, fromSpacedHexToUTF8(<span class="jxr_string">"74 65 73 74"</span>));
-<a class="jxr_linenumber" name="L1638" href="#L1638">1638</a>
-<a class="jxr_linenumber" name="L1639" href="#L1639">1639</a> <em class="jxr_comment">// Empty string</em>
-<a class="jxr_linenumber" name="L1640" href="#L1640">1640</a> assertEquals(<span class="jxr_string">""</span>, fromSpacedHexToUTF8(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L1641" href="#L1641">1641</a> }
-<a class="jxr_linenumber" name="L1642" href="#L1642">1642</a>
-<a class="jxr_linenumber" name="L1643" href="#L1643">1643</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1644" href="#L1644">1644</a> <em class="jxr_comment">// generateUUID()</em>
-<a class="jxr_linenumber" name="L1645" href="#L1645">1645</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1646" href="#L1646">1646</a> @Test
-<a class="jxr_linenumber" name="L1647" href="#L1647">1647</a> <strong class="jxr_keyword">void</strong> a64_generateUUID() {
-<a class="jxr_linenumber" name="L1648" href="#L1648">1648</a> <em class="jxr_comment">// Generate multiple UUIDs and verify format</em>
-<a class="jxr_linenumber" name="L1649" href="#L1649">1649</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < 10; i++) {
-<a class="jxr_linenumber" name="L1650" href="#L1650">1650</a> <strong class="jxr_keyword">var</strong> uuid = generateUUID();
-<a class="jxr_linenumber" name="L1651" href="#L1651">1651</a> assertNotNull(uuid);
-<a class="jxr_linenumber" name="L1652" href="#L1652">1652</a> <em class="jxr_comment">// Standard UUID format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (36 chars)</em>
-<a class="jxr_linenumber" name="L1653" href="#L1653">1653</a> assertEquals(36, uuid.length());
-<a class="jxr_linenumber" name="L1654" href="#L1654">1654</a> assertTrue(uuid.matches(<span class="jxr_string">"[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"</span>));
-<a class="jxr_linenumber" name="L1655" href="#L1655">1655</a> }
-<a class="jxr_linenumber" name="L1656" href="#L1656">1656</a> <em class="jxr_comment">// Verify uniqueness</em>
-<a class="jxr_linenumber" name="L1657" href="#L1657">1657</a> <strong class="jxr_keyword">var</strong> uuid1 = generateUUID();
-<a class="jxr_linenumber" name="L1658" href="#L1658">1658</a> <strong class="jxr_keyword">var</strong> uuid2 = generateUUID();
-<a class="jxr_linenumber" name="L1659" href="#L1659">1659</a> assertNotEquals(uuid1, uuid2);
-<a class="jxr_linenumber" name="L1660" href="#L1660">1660</a> }
-<a class="jxr_linenumber" name="L1661" href="#L1661">1661</a>
-<a class="jxr_linenumber" name="L1662" href="#L1662">1662</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1663" href="#L1663">1663</a> <em class="jxr_comment">// getAuthorityUri(String)</em>
-<a class="jxr_linenumber" name="L1664" href="#L1664">1664</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1665" href="#L1665">1665</a> @Test
-<a class="jxr_linenumber" name="L1666" href="#L1666">1666</a> <strong class="jxr_keyword">void</strong> a65_getAuthorityUri() {
-<a class="jxr_linenumber" name="L1667" href="#L1667">1667</a> assertEquals(<span class="jxr_string">"http://foo"</span>, getAuthorityUri(<span class="jxr_string">"http://foo"</span>));
-<a class="jxr_linenumber" name="L1668" href="#L1668">1668</a> assertEquals(<span class="jxr_string">"http://foo:123"</span>, getAuthorityUri(<span class="jxr_string">"http://foo:123"</span>));
-<a class="jxr_linenumber" name="L1669" href="#L1669">1669</a> assertEquals(<span class="jxr_string">"http://foo:123"</span>, getAuthorityUri(<span class="jxr_string">"http://foo:123/"</span>));
-<a class="jxr_linenumber" name="L1670" href="#L1670">1670</a> assertEquals(<span class="jxr_string">"http://foo:123"</span>, getAuthorityUri(<span class="jxr_string">"http://foo:123/bar"</span>));
-<a class="jxr_linenumber" name="L1671" href="#L1671">1671</a> assertEquals(<span class="jxr_string">"https://example.com"</span>, getAuthorityUri(<span class="jxr_string">"https://example.com/path/to/resource"</span>));
-<a class="jxr_linenumber" name="L1672" href="#L1672">1672</a> assertEquals(<span class="jxr_string">"ftp://server.com:21"</span>, getAuthorityUri(<span class="jxr_string">"ftp://server.com:21/files"</span>));
-<a class="jxr_linenumber" name="L1673" href="#L1673">1673</a> }
-<a class="jxr_linenumber" name="L1674" href="#L1674">1674</a>
-<a class="jxr_linenumber" name="L1675" href="#L1675">1675</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1676" href="#L1676">1676</a> <em class="jxr_comment">// getDuration(String)</em>
-<a class="jxr_linenumber" name="L1677" href="#L1677">1677</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1678" href="#L1678">1678</a> @Test
-<a class="jxr_linenumber" name="L1679" href="#L1679">1679</a> <strong class="jxr_keyword">void</strong> a66_getDuration() {
-<a class="jxr_linenumber" name="L1680" href="#L1680">1680</a> <em class="jxr_comment">// Basic tests</em>
-<a class="jxr_linenumber" name="L1681" href="#L1681">1681</a> assertEquals(-1, getDuration(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L1682" href="#L1682">1682</a> assertEquals(-1, getDuration(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L1683" href="#L1683">1683</a> assertEquals(-1, getDuration(<span class="jxr_string">" "</span>));
-<a class="jxr_linenumber" name="L1684" href="#L1684">1684</a> assertEquals(1, getDuration(<span class="jxr_string">"1"</span>));
-<a class="jxr_linenumber" name="L1685" href="#L1685">1685</a> assertEquals(10, getDuration(<span class="jxr_string">"10"</span>));
-<a class="jxr_linenumber" name="L1686" href="#L1686">1686</a>
-<a class="jxr_linenumber" name="L1687" href="#L1687">1687</a> <strong class="jxr_keyword">long</strong> s = 1000, m = s * 60, h = m * 60, d = h * 24, w = d * 7, mo = d * 30, y = d * 365;
-<a class="jxr_linenumber" name="L1688" href="#L1688">1688</a>
-<a class="jxr_linenumber" name="L1689" href="#L1689">1689</a> <em class="jxr_comment">// Basic time units</em>
-<a class="jxr_linenumber" name="L1690" href="#L1690">1690</a> assertEquals(10 * s, getDuration(<span class="jxr_string">"10s"</span>));
-<a class="jxr_linenumber" name="L1691" href="#L1691">1691</a> assertEquals(10 * s, getDuration(<span class="jxr_string">"10 s"</span>));
-<a class="jxr_linenumber" name="L1692" href="#L1692">1692</a> assertEquals(10 * s, getDuration(<span class="jxr_string">" 10 s "</span>));
-<a class="jxr_linenumber" name="L1693" href="#L1693">1693</a> assertEquals(10 * s, getDuration(<span class="jxr_string">"10sec"</span>));
-<a class="jxr_linenumber" name="L1694" href="#L1694">1694</a> assertEquals(10 * s, getDuration(<span class="jxr_string">"10 sec"</span>));
-<a class="jxr_linenumber" name="L1695" href="#L1695">1695</a> assertEquals(10 * s, getDuration(<span class="jxr_string">"10seconds"</span>));
-<a class="jxr_linenumber" name="L1696" href="#L1696">1696</a> assertEquals(10 * s, getDuration(<span class="jxr_string">"10S"</span>));
-<a class="jxr_linenumber" name="L1697" href="#L1697">1697</a>
-<a class="jxr_linenumber" name="L1698" href="#L1698">1698</a> assertEquals(10 * m, getDuration(<span class="jxr_string">"10m"</span>));
-<a class="jxr_linenumber" name="L1699" href="#L1699">1699</a> assertEquals(10 * m, getDuration(<span class="jxr_string">"10 m"</span>));
-<a class="jxr_linenumber" name="L1700" href="#L1700">1700</a> assertEquals(10 * m, getDuration(<span class="jxr_string">"10min"</span>));
-<a class="jxr_linenumber" name="L1701" href="#L1701">1701</a> assertEquals(10 * m, getDuration(<span class="jxr_string">"10 minutes"</span>));
-<a class="jxr_linenumber" name="L1702" href="#L1702">1702</a> assertEquals(10 * m, getDuration(<span class="jxr_string">"10M"</span>));
-<a class="jxr_linenumber" name="L1703" href="#L1703">1703</a>
-<a class="jxr_linenumber" name="L1704" href="#L1704">1704</a> assertEquals(10 * h, getDuration(<span class="jxr_string">"10h"</span>));
-<a class="jxr_linenumber" name="L1705" href="#L1705">1705</a> assertEquals(10 * h, getDuration(<span class="jxr_string">"10 h"</span>));
-<a class="jxr_linenumber" name="L1706" href="#L1706">1706</a> assertEquals(10 * h, getDuration(<span class="jxr_string">"10hour"</span>));
-<a class="jxr_linenumber" name="L1707" href="#L1707">1707</a> assertEquals(10 * h, getDuration(<span class="jxr_string">"10 hours"</span>));
-<a class="jxr_linenumber" name="L1708" href="#L1708">1708</a> assertEquals(10 * h, getDuration(<span class="jxr_string">"10H"</span>));
-<a class="jxr_linenumber" name="L1709" href="#L1709">1709</a>
-<a class="jxr_linenumber" name="L1710" href="#L1710">1710</a> assertEquals(10 * d, getDuration(<span class="jxr_string">"10d"</span>));
-<a class="jxr_linenumber" name="L1711" href="#L1711">1711</a> assertEquals(10 * d, getDuration(<span class="jxr_string">"10 d"</span>));
-<a class="jxr_linenumber" name="L1712" href="#L1712">1712</a> assertEquals(10 * d, getDuration(<span class="jxr_string">"10day"</span>));
-<a class="jxr_linenumber" name="L1713" href="#L1713">1713</a> assertEquals(10 * d, getDuration(<span class="jxr_string">"10 days"</span>));
-<a class="jxr_linenumber" name="L1714" href="#L1714">1714</a> assertEquals(10 * d, getDuration(<span class="jxr_string">"10D"</span>));
-<a class="jxr_linenumber" name="L1715" href="#L1715">1715</a>
-<a class="jxr_linenumber" name="L1716" href="#L1716">1716</a> assertEquals(10 * w, getDuration(<span class="jxr_string">"10w"</span>));
-<a class="jxr_linenumber" name="L1717" href="#L1717">1717</a> assertEquals(10 * w, getDuration(<span class="jxr_string">"10 w"</span>));
-<a class="jxr_linenumber" name="L1718" href="#L1718">1718</a> assertEquals(10 * w, getDuration(<span class="jxr_string">"10week"</span>));
-<a class="jxr_linenumber" name="L1719" href="#L1719">1719</a> assertEquals(10 * w, getDuration(<span class="jxr_string">"10 weeks"</span>));
-<a class="jxr_linenumber" name="L1720" href="#L1720">1720</a> assertEquals(10 * w, getDuration(<span class="jxr_string">"10W"</span>));
-<a class="jxr_linenumber" name="L1721" href="#L1721">1721</a>
-<a class="jxr_linenumber" name="L1722" href="#L1722">1722</a> <em class="jxr_comment">// Milliseconds</em>
-<a class="jxr_linenumber" name="L1723" href="#L1723">1723</a> assertEquals(100, getDuration(<span class="jxr_string">"100ms"</span>));
-<a class="jxr_linenumber" name="L1724" href="#L1724">1724</a> assertEquals(100, getDuration(<span class="jxr_string">"100 millis"</span>));
-<a class="jxr_linenumber" name="L1725" href="#L1725">1725</a> assertEquals(100, getDuration(<span class="jxr_string">"100 milliseconds"</span>));
-<a class="jxr_linenumber" name="L1726" href="#L1726">1726</a>
-<a class="jxr_linenumber" name="L1727" href="#L1727">1727</a> <em class="jxr_comment">// Decimal values</em>
-<a class="jxr_linenumber" name="L1728" href="#L1728">1728</a> assertEquals((<strong class="jxr_keyword">long</strong>)(1.5 * h), getDuration(<span class="jxr_string">"1.5h"</span>));
-<a class="jxr_linenumber" name="L1729" href="#L1729">1729</a> assertEquals((<strong class="jxr_keyword">long</strong>)(0.5 * m), getDuration(<span class="jxr_string">"0.5m"</span>));
-<a class="jxr_linenumber" name="L1730" href="#L1730">1730</a> assertEquals((<strong class="jxr_keyword">long</strong>)(2.5 * s), getDuration(<span class="jxr_string">"2.5s"</span>));
-<a class="jxr_linenumber" name="L1731" href="#L1731">1731</a> assertEquals((<strong class="jxr_keyword">long</strong>)(1.25 * d), getDuration(<span class="jxr_string">"1.25d"</span>));
-<a class="jxr_linenumber" name="L1732" href="#L1732">1732</a>
-<a class="jxr_linenumber" name="L1733" href="#L1733">1733</a> <em class="jxr_comment">// Combined formats</em>
-<a class="jxr_linenumber" name="L1734" href="#L1734">1734</a> assertEquals(1 * h + 30 * m, getDuration(<span class="jxr_string">"1h30m"</span>));
-<a class="jxr_linenumber" name="L1735" href="#L1735">1735</a> assertEquals(1 * h + 30 * m, getDuration(<span class="jxr_string">"1h 30m"</span>));
-<a class="jxr_linenumber" name="L1736" href="#L1736">1736</a> assertEquals(2 * d + 3 * h + 15 * m, getDuration(<span class="jxr_string">"2d3h15m"</span>));
-<a class="jxr_linenumber" name="L1737" href="#L1737">1737</a> assertEquals(1 * w + 2 * d + 3 * h, getDuration(<span class="jxr_string">"1w2d3h"</span>));
-<a class="jxr_linenumber" name="L1738" href="#L1738">1738</a>
-<a class="jxr_linenumber" name="L1739" href="#L1739">1739</a> <em class="jxr_comment">// Months</em>
-<a class="jxr_linenumber" name="L1740" href="#L1740">1740</a> assertEquals(1 * mo, getDuration(<span class="jxr_string">"1mo"</span>));
-<a class="jxr_linenumber" name="L1741" href="#L1741">1741</a> assertEquals(1 * mo, getDuration(<span class="jxr_string">"1 month"</span>));
-<a class="jxr_linenumber" name="L1742" href="#L1742">1742</a> assertEquals(2 * mo, getDuration(<span class="jxr_string">"2 months"</span>));
-<a class="jxr_linenumber" name="L1743" href="#L1743">1743</a> assertEquals(6 * mo, getDuration(<span class="jxr_string">"6mo"</span>));
-<a class="jxr_linenumber" name="L1744" href="#L1744">1744</a>
-<a class="jxr_linenumber" name="L1745" href="#L1745">1745</a> <em class="jxr_comment">// Years</em>
-<a class="jxr_linenumber" name="L1746" href="#L1746">1746</a> assertEquals(1 * y, getDuration(<span class="jxr_string">"1y"</span>));
-<a class="jxr_linenumber" name="L1747" href="#L1747">1747</a> assertEquals(1 * y, getDuration(<span class="jxr_string">"1yr"</span>));
-<a class="jxr_linenumber" name="L1748" href="#L1748">1748</a> assertEquals(1 * y, getDuration(<span class="jxr_string">"1 year"</span>));
-<a class="jxr_linenumber" name="L1749" href="#L1749">1749</a> assertEquals(2 * y, getDuration(<span class="jxr_string">"2 years"</span>));
-<a class="jxr_linenumber" name="L1750" href="#L1750">1750</a> assertEquals(10 * y, getDuration(<span class="jxr_string">"10y"</span>));
-<a class="jxr_linenumber" name="L1751" href="#L1751">1751</a>
-<a class="jxr_linenumber" name="L1752" href="#L1752">1752</a> <em class="jxr_comment">// Combined with months and years</em>
-<a class="jxr_linenumber" name="L1753" href="#L1753">1753</a> assertEquals(1 * y + 6 * mo, getDuration(<span class="jxr_string">"1y6mo"</span>));
-<a class="jxr_linenumber" name="L1754" href="#L1754">1754</a> assertEquals(2 * y + 3 * mo + 5 * d, getDuration(<span class="jxr_string">"2y3mo5d"</span>));
-<a class="jxr_linenumber" name="L1755" href="#L1755">1755</a> }
-<a class="jxr_linenumber" name="L1756" href="#L1756">1756</a>
-<a class="jxr_linenumber" name="L1757" href="#L1757">1757</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1758" href="#L1758">1758</a> <em class="jxr_comment">// getMatchPattern(String)</em>
-<a class="jxr_linenumber" name="L1759" href="#L1759">1759</a> <em class="jxr_comment">// getMatchPattern(String,int)</em>
-<a class="jxr_linenumber" name="L1760" href="#L1760">1760</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1761" href="#L1761">1761</a> @Test
-<a class="jxr_linenumber" name="L1762" href="#L1762">1762</a> <strong class="jxr_keyword">void</strong> a67_getMatchPattern() {
-<a class="jxr_linenumber" name="L1763" href="#L1763">1763</a> <em class="jxr_comment">// Basic pattern matching</em>
-<a class="jxr_linenumber" name="L1764" href="#L1764">1764</a> assertTrue(getMatchPattern(<span class="jxr_string">"a"</span>).matcher(<span class="jxr_string">"a"</span>).matches());
-<a class="jxr_linenumber" name="L1765" href="#L1765">1765</a> assertTrue(getMatchPattern(<span class="jxr_string">"*a*"</span>).matcher(<span class="jxr_string">"aaa"</span>).matches());
-<a class="jxr_linenumber" name="L1766" href="#L1766">1766</a> assertTrue(getMatchPattern(<span class="jxr_string">"*a*"</span>).matcher(<span class="jxr_string">"baa"</span>).matches());
-<a class="jxr_linenumber" name="L1767" href="#L1767">1767</a> assertTrue(getMatchPattern(<span class="jxr_string">"*a*"</span>).matcher(<span class="jxr_string">"aab"</span>).matches());
-<a class="jxr_linenumber" name="L1768" href="#L1768">1768</a> assertFalse(getMatchPattern(<span class="jxr_string">"*b*"</span>).matcher(<span class="jxr_string">"aaa"</span>).matches());
-<a class="jxr_linenumber" name="L1769" href="#L1769">1769</a>
-<a class="jxr_linenumber" name="L1770" href="#L1770">1770</a> <em class="jxr_comment">// Wildcard patterns</em>
-<a class="jxr_linenumber" name="L1771" href="#L1771">1771</a> assertTrue(getMatchPattern(<span class="jxr_string">"test*"</span>).matcher(<span class="jxr_string">"test123"</span>).matches());
-<a class="jxr_linenumber" name="L1772" href="#L1772">1772</a> assertTrue(getMatchPattern(<span class="jxr_string">"*test"</span>).matcher(<span class="jxr_string">"123test"</span>).matches());
-<a class="jxr_linenumber" name="L1773" href="#L1773">1773</a> assertTrue(getMatchPattern(<span class="jxr_string">"test*test"</span>).matcher(<span class="jxr_string">"test123test"</span>).matches());
-<a class="jxr_linenumber" name="L1774" href="#L1774">1774</a>
-<a class="jxr_linenumber" name="L1775" href="#L1775">1775</a> <em class="jxr_comment">// Question mark wildcard</em>
-<a class="jxr_linenumber" name="L1776" href="#L1776">1776</a> assertTrue(getMatchPattern(<span class="jxr_string">"test?"</span>).matcher(<span class="jxr_string">"test1"</span>).matches());
-<a class="jxr_linenumber" name="L1777" href="#L1777">1777</a> assertTrue(getMatchPattern(<span class="jxr_string">"?est"</span>).matcher(<span class="jxr_string">"test"</span>).matches());
-<a class="jxr_linenumber" name="L1778" href="#L1778">1778</a> assertFalse(getMatchPattern(<span class="jxr_string">"test?"</span>).matcher(<span class="jxr_string">"test12"</span>).matches());
-<a class="jxr_linenumber" name="L1779" href="#L1779">1779</a>
-<a class="jxr_linenumber" name="L1780" href="#L1780">1780</a> <em class="jxr_comment">// With flags</em>
-<a class="jxr_linenumber" name="L1781" href="#L1781">1781</a> <strong class="jxr_keyword">var</strong> pattern = getMatchPattern(<span class="jxr_string">"TEST*"</span>, java.util.regex.Pattern.CASE_INSENSITIVE);
-<a class="jxr_linenumber" name="L1782" href="#L1782">1782</a> assertTrue(pattern.matcher(<span class="jxr_string">"test123"</span>).matches());
-<a class="jxr_linenumber" name="L1783" href="#L1783">1783</a> assertTrue(pattern.matcher(<span class="jxr_string">"TEST123"</span>).matches());
-<a class="jxr_linenumber" name="L1784" href="#L1784">1784</a> }
-<a class="jxr_linenumber" name="L1785" href="#L1785">1785</a>
-<a class="jxr_linenumber" name="L1786" href="#L1786">1786</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1787" href="#L1787">1787</a> <em class="jxr_comment">// getNumberedLines(String)</em>
-<a class="jxr_linenumber" name="L1788" href="#L1788">1788</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1789" href="#L1789">1789</a> @Test
-<a class="jxr_linenumber" name="L1790" href="#L1790">1790</a> <strong class="jxr_keyword">void</strong> a68_getNumberedLines() {
-<a class="jxr_linenumber" name="L1791" href="#L1791">1791</a> assertNull(getNumberedLines(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L1792" href="#L1792">1792</a> assertEquals(<span class="jxr_string">"1: \n"</span>, getNumberedLines(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L1793" href="#L1793">1793</a> assertEquals(<span class="jxr_string">"1: foo\n"</span>, getNumberedLines(<span class="jxr_string">"foo"</span>));
-<a class="jxr_linenumber" name="L1794" href="#L1794">1794</a> assertEquals(<span class="jxr_string">"1: foo\n2: bar\n"</span>, getNumberedLines(<span class="jxr_string">"foo\nbar"</span>));
-<a class="jxr_linenumber" name="L1795" href="#L1795">1795</a> assertEquals(<span class="jxr_string">"1: line1\n2: line2\n3: line3\n"</span>, getNumberedLines(<span class="jxr_string">"line1\nline2\nline3"</span>));
-<a class="jxr_linenumber" name="L1796" href="#L1796">1796</a>
-<a class="jxr_linenumber" name="L1797" href="#L1797">1797</a> <em class="jxr_comment">// Test with different line endings</em>
-<a class="jxr_linenumber" name="L1798" href="#L1798">1798</a> assertEquals(<span class="jxr_string">"1: line1\n2: line2\n"</span>, getNumberedLines(<span class="jxr_string">"line1\r\nline2"</span>));
-<a class="jxr_linenumber" name="L1799" href="#L1799">1799</a> }
-<a class="jxr_linenumber" name="L1800" href="#L1800">1800</a>
-<a class="jxr_linenumber" name="L1801" href="#L1801">1801</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1802" href="#L1802">1802</a> <em class="jxr_comment">// getStringSize(String)</em>
-<a class="jxr_linenumber" name="L1803" href="#L1803">1803</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1804" href="#L1804">1804</a> @Test
-<a class="jxr_linenumber" name="L1805" href="#L1805">1805</a> <strong class="jxr_keyword">void</strong> a69_getStringSize() {
-<a class="jxr_linenumber" name="L1806" href="#L1806">1806</a> assertEquals(0, getStringSize(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L1807" href="#L1807">1807</a> assertEquals(40, getStringSize(<span class="jxr_string">""</span>)); <em class="jxr_comment">// 24 + 16 = 40 bytes overhead</em>
-<a class="jxr_linenumber" name="L1808" href="#L1808">1808</a> assertEquals(50, getStringSize(<span class="jxr_string">"hello"</span>)); <em class="jxr_comment">// 40 + (5 * 2) = 50 bytes</em>
-<a class="jxr_linenumber" name="L1809" href="#L1809">1809</a> assertEquals(48, getStringSize(<span class="jxr_string">"test"</span>)); <em class="jxr_comment">// 40 + (4 * 2) = 48 bytes</em>
-<a class="jxr_linenumber" name="L1810" href="#L1810">1810</a> assertEquals(60, getStringSize(<span class="jxr_string">"1234567890"</span>)); <em class="jxr_comment">// 40 + (10 * 2) = 60 bytes</em>
-<a class="jxr_linenumber" name="L1811" href="#L1811">1811</a>
-<a class="jxr_linenumber" name="L1812" href="#L1812">1812</a> <em class="jxr_comment">// Verify the calculation: 24 (String object) + 16 (char[] header) + (2 * length)</em>
-<a class="jxr_linenumber" name="L1813" href="#L1813">1813</a> <strong class="jxr_keyword">var</strong> emptySize = getStringSize(<span class="jxr_string">""</span>);
-<a class="jxr_linenumber" name="L1814" href="#L1814">1814</a> assertTrue(emptySize >= 24); <em class="jxr_comment">// At least String object overhead</em>
-<a class="jxr_linenumber" name="L1815" href="#L1815">1815</a>
-<a class="jxr_linenumber" name="L1816" href="#L1816">1816</a> <strong class="jxr_keyword">var</strong> oneCharSize = getStringSize(<span class="jxr_string">"a"</span>);
-<a class="jxr_linenumber" name="L1817" href="#L1817">1817</a> assertEquals(emptySize + 2, oneCharSize); <em class="jxr_comment">// One char adds 2 bytes</em>
-<a class="jxr_linenumber" name="L1818" href="#L1818">1818</a>
-<a class="jxr_linenumber" name="L1819" href="#L1819">1819</a> <strong class="jxr_keyword">var</strong> tenCharSize = getStringSize(<span class="jxr_string">"1234567890"</span>);
-<a class="jxr_linenumber" name="L1820" href="#L1820">1820</a> assertEquals(emptySize + 20, tenCharSize); <em class="jxr_comment">// Ten chars add 20 bytes</em>
-<a class="jxr_linenumber" name="L1821" href="#L1821">1821</a> }
-<a class="jxr_linenumber" name="L1822" href="#L1822">1822</a>
-<a class="jxr_linenumber" name="L1823" href="#L1823">1823</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1824" href="#L1824">1824</a> <em class="jxr_comment">// hasText(String)</em>
-<a class="jxr_linenumber" name="L1825" href="#L1825">1825</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1826" href="#L1826">1826</a> @Test
-<a class="jxr_linenumber" name="L1827" href="#L1827">1827</a> <strong class="jxr_keyword">void</strong> a70_hasText() {
-<a class="jxr_linenumber" name="L1828" href="#L1828">1828</a> assertFalse(hasText(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L1829" href="#L1829">1829</a> assertFalse(hasText(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L1830" href="#L1830">1830</a> assertFalse(hasText(<span class="jxr_string">" "</span>));
-<a class="jxr_linenumber" name="L1831" href="#L1831">1831</a> assertFalse(hasText(<span class="jxr_string">"\t\n"</span>));
-<a class="jxr_linenumber" name="L1832" href="#L1832">1832</a> assertTrue(hasText(<span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L1833" href="#L1833">1833</a> assertTrue(hasText(<span class="jxr_string">" hello "</span>));
-<a class="jxr_linenumber" name="L1834" href="#L1834">1834</a> assertTrue(hasText(<span class="jxr_string">"a"</span>));
-<a class="jxr_linenumber" name="L1835" href="#L1835">1835</a> assertTrue(hasText(<span class="jxr_string">" hello "</span>));
-<a class="jxr_linenumber" name="L1836" href="#L1836">1836</a> }
-<a class="jxr_linenumber" name="L1837" href="#L1837">1837</a>
-<a class="jxr_linenumber" name="L1838" href="#L1838">1838</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1839" href="#L1839">1839</a> <em class="jxr_comment">// indexOf(String,String)</em>
-<a class="jxr_linenumber" name="L1840" href="#L1840">1840</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1841" href="#L1841">1841</a> @Test
-<a class="jxr_linenumber" name="L1842" href="#L1842">1842</a> <strong class="jxr_keyword">void</strong> a71_indexOf() {
-<a class="jxr_linenumber" name="L1843" href="#L1843">1843</a> assertEquals(6, indexOf(<span class="jxr_string">"hello world"</span>, <span class="jxr_string">"world"</span>));
-<a class="jxr_linenumber" name="L1844" href="#L1844">1844</a> assertEquals(0, indexOf(<span class="jxr_string">"hello world"</span>, <span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L1845" href="#L1845">1845</a> assertEquals(2, indexOf(<span class="jxr_string">"hello world"</span>, <span class="jxr_string">"llo"</span>));
-<a class="jxr_linenumber" name="L1846" href="#L1846">1846</a> assertEquals(-1, indexOf(<span class="jxr_string">"hello world"</span>, <span class="jxr_string">"xyz"</span>));
-<a class="jxr_linenumber" name="L1847" href="#L1847">1847</a> assertEquals(-1, indexOf((String)<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"test"</span>));
-<a class="jxr_linenumber" name="L1848" href="#L1848">1848</a> assertEquals(-1, indexOf(<span class="jxr_string">"test"</span>, (String)<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L1849" href="#L1849">1849</a> assertEquals(-1, indexOf((String)<strong class="jxr_keyword">null</strong>, (String)<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L1850" href="#L1850">1850</a> assertEquals(0, indexOf(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L1851" href="#L1851">1851</a> assertEquals(-1, indexOf(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"hello world"</span>));
-<a class="jxr_linenumber" name="L1852" href="#L1852">1852</a> }
-<a class="jxr_linenumber" name="L1853" href="#L1853">1853</a>
-<a class="jxr_linenumber" name="L1854" href="#L1854">1854</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1855" href="#L1855">1855</a> <em class="jxr_comment">// indexOfIgnoreCase(String,String)</em>
-<a class="jxr_linenumber" name="L1856" href="#L1856">1856</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1857" href="#L1857">1857</a> @Test
-<a class="jxr_linenumber" name="L1858" href="#L1858">1858</a> <strong class="jxr_keyword">void</strong> a72_indexOfIgnoreCase() {
-<a class="jxr_linenumber" name="L1859" href="#L1859">1859</a> assertEquals(6, indexOfIgnoreCase(<span class="jxr_string">"Hello World"</span>, <span class="jxr_string">"world"</span>));
-<a class="jxr_linenumber" name="L1860" href="#L1860">1860</a> assertEquals(6, indexOfIgnoreCase(<span class="jxr_string">"Hello World"</span>, <span class="jxr_string">"WORLD"</span>));
-<a class="jxr_linenumber" name="L1861" href="#L1861">1861</a> assertEquals(0, indexOfIgnoreCase(<span class="jxr_string">"Hello World"</span>, <span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L1862" href="#L1862">1862</a> assertEquals(0, indexOfIgnoreCase(<span class="jxr_string">"Hello World"</span>, <span class="jxr_string">"HELLO"</span>));
-<a class="jxr_linenumber" name="L1863" href="#L1863">1863</a> assertEquals(2, indexOfIgnoreCase(<span class="jxr_string">"Hello World"</span>, <span class="jxr_string">"LLO"</span>));
-<a class="jxr_linenumber" name="L1864" href="#L1864">1864</a> assertEquals(-1, indexOfIgnoreCase(<span class="jxr_string">"Hello World"</span>, <span class="jxr_string">"xyz"</span>));
-<a class="jxr_linenumber" name="L1865" href="#L1865">1865</a> assertEquals(-1, indexOfIgnoreCase(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"test"</span>));
-<a class="jxr_linenumber" name="L1866" href="#L1866">1866</a> assertEquals(-1, indexOfIgnoreCase(<span class="jxr_string">"test"</span>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L1867" href="#L1867">1867</a> assertEquals(-1, indexOfIgnoreCase(<strong class="jxr_keyword">null</strong>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L1868" href="#L1868">1868</a> }
-<a class="jxr_linenumber" name="L1869" href="#L1869">1869</a>
-<a class="jxr_linenumber" name="L1870" href="#L1870">1870</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1871" href="#L1871">1871</a> <em class="jxr_comment">// intern(String)</em>
-<a class="jxr_linenumber" name="L1872" href="#L1872">1872</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1873" href="#L1873">1873</a> @Test
-<a class="jxr_linenumber" name="L1874" href="#L1874">1874</a> <strong class="jxr_keyword">void</strong> a73_intern() {
-<a class="jxr_linenumber" name="L1875" href="#L1875">1875</a> <em class="jxr_comment">// Test that intern returns the same reference for equal strings</em>
-<a class="jxr_linenumber" name="L1876" href="#L1876">1876</a> <strong class="jxr_keyword">var</strong> s1 = <strong class="jxr_keyword">new</strong> String(<span class="jxr_string">"test"</span>);
-<a class="jxr_linenumber" name="L1877" href="#L1877">1877</a> <strong class="jxr_keyword">var</strong> s2 = <strong class="jxr_keyword">new</strong> String(<span class="jxr_string">"test"</span>);
-<a class="jxr_linenumber" name="L1878" href="#L1878">1878</a> assertTrue(s1 != s2); <em class="jxr_comment">// Different objects</em>
-<a class="jxr_linenumber" name="L1879" href="#L1879">1879</a>
-<a class="jxr_linenumber" name="L1880" href="#L1880">1880</a> <strong class="jxr_keyword">var</strong> i1 = intern(s1);
-<a class="jxr_linenumber" name="L1881" href="#L1881">1881</a> <strong class="jxr_keyword">var</strong> i2 = intern(s2);
-<a class="jxr_linenumber" name="L1882" href="#L1882">1882</a> assertTrue(i1 == i2); <em class="jxr_comment">// Same interned object</em>
-<a class="jxr_linenumber" name="L1883" href="#L1883">1883</a>
-<a class="jxr_linenumber" name="L1884" href="#L1884">1884</a> <em class="jxr_comment">// Test null handling</em>
-<a class="jxr_linenumber" name="L1885" href="#L1885">1885</a> assertNull(intern(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L1886" href="#L1886">1886</a>
-<a class="jxr_linenumber" name="L1887" href="#L1887">1887</a> <em class="jxr_comment">// Test that interned string equals original</em>
-<a class="jxr_linenumber" name="L1888" href="#L1888">1888</a> assertEquals(<span class="jxr_string">"test"</span>, intern(<span class="jxr_string">"test"</span>));
-<a class="jxr_linenumber" name="L1889" href="#L1889">1889</a> }
-<a class="jxr_linenumber" name="L1890" href="#L1890">1890</a>
-<a class="jxr_linenumber" name="L1891" href="#L1891">1891</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1892" href="#L1892">1892</a> <em class="jxr_comment">// interpolate(String,Map<String,Object>)</em>
-<a class="jxr_linenumber" name="L1893" href="#L1893">1893</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1894" href="#L1894">1894</a> @Test
-<a class="jxr_linenumber" name="L1895" href="#L1895">1895</a> <strong class="jxr_keyword">void</strong> a74_interpolate() {
-<a class="jxr_linenumber" name="L1896" href="#L1896">1896</a> <strong class="jxr_keyword">var</strong> vars = <strong class="jxr_keyword">new</strong> HashMap<String,Object>();
-<a class="jxr_linenumber" name="L1897" href="#L1897">1897</a> vars.put(<span class="jxr_string">"name"</span>, <span class="jxr_string">"John"</span>);
-<a class="jxr_linenumber" name="L1898" href="#L1898">1898</a> vars.put(<span class="jxr_string">"age"</span>, 30);
-<a class="jxr_linenumber" name="L1899" href="#L1899">1899</a> vars.put(<span class="jxr_string">"city"</span>, <span class="jxr_string">"New York"</span>);
-<a class="jxr_linenumber" name="L1900" href="#L1900">1900</a>
-<a class="jxr_linenumber" name="L1901" href="#L1901">1901</a> assertEquals(<span class="jxr_string">"Hello John, you are 30 years old"</span>, interpolate(<span class="jxr_string">"Hello ${name}, you are ${age} years old"</span>, vars));
-<a class="jxr_linenumber" name="L1902" href="#L1902">1902</a> assertEquals(<span class="jxr_string">"Welcome to New York"</span>, interpolate(<span class="jxr_string">"Welcome to ${city}"</span>, vars));
-<a class="jxr_linenumber" name="L1903" href="#L1903">1903</a> assertEquals(<span class="jxr_string">"Hello ${unknown}"</span>, interpolate(<span class="jxr_string">"Hello ${unknown}"</span>, vars)); <em class="jxr_comment">// Unknown placeholder kept</em>
-<a class="jxr_linenumber" name="L1904" href="#L1904">1904</a> assertEquals(<span class="jxr_string">"No placeholders"</span>, interpolate(<span class="jxr_string">"No placeholders"</span>, vars));
-<a class="jxr_linenumber" name="L1905" href="#L1905">1905</a> assertNull(interpolate(<strong class="jxr_keyword">null</strong>, vars));
-<a class="jxr_linenumber" name="L1906" href="#L1906">1906</a> assertEquals(<span class="jxr_string">"Template"</span>, interpolate(<span class="jxr_string">"Template"</span>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L1907" href="#L1907">1907</a> assertEquals(<span class="jxr_string">"Template"</span>, interpolate(<span class="jxr_string">"Template"</span>, <strong class="jxr_keyword">new</strong> HashMap<>()));
-<a class="jxr_linenumber" name="L1908" href="#L1908">1908</a>
-<a class="jxr_linenumber" name="L1909" href="#L1909">1909</a> <em class="jxr_comment">// Test with null values</em>
-<a class="jxr_linenumber" name="L1910" href="#L1910">1910</a> <strong class="jxr_keyword">var</strong> varsWithNull = <strong class="jxr_keyword">new</strong> HashMap<String,Object>();
-<a class="jxr_linenumber" name="L1911" href="#L1911">1911</a> varsWithNull.put(<span class="jxr_string">"name"</span>, <span class="jxr_string">"John"</span>);
-<a class="jxr_linenumber" name="L1912" href="#L1912">1912</a> varsWithNull.put(<span class="jxr_string">"value"</span>, <strong class="jxr_keyword">null</strong>);
-<a class="jxr_linenumber" name="L1913" href="#L1913">1913</a> assertEquals(<span class="jxr_string">"Hello John, value: null"</span>, interpolate(<span class="jxr_string">"Hello ${name}, value: ${value}"</span>, varsWithNull));
-<a class="jxr_linenumber" name="L1914" href="#L1914">1914</a>
-<a class="jxr_linenumber" name="L1915" href="#L1915">1915</a> <em class="jxr_comment">// Test multiple variables</em>
-<a class="jxr_linenumber" name="L1916" href="#L1916">1916</a> assertEquals(<span class="jxr_string">"John is 30 and lives in New York"</span>, interpolate(<span class="jxr_string">"${name} is ${age} and lives in ${city}"</span>, vars));
-<a class="jxr_linenumber" name="L1917" href="#L1917">1917</a> }
-<a class="jxr_linenumber" name="L1918" href="#L1918">1918</a>
-<a class="jxr_linenumber" name="L1919" href="#L1919">1919</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1920" href="#L1920">1920</a> <em class="jxr_comment">// isAbsoluteUri(String)</em>
-<a class="jxr_linenumber" name="L1921" href="#L1921">1921</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1922" href="#L1922">1922</a> @Test
-<a class="jxr_linenumber" name="L1923" href="#L1923">1923</a> <strong class="jxr_keyword">void</strong> a75_isAbsoluteUri() {
-<a class="jxr_linenumber" name="L1924" href="#L1924">1924</a> assertFalse(isAbsoluteUri(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L1925" href="#L1925">1925</a> assertFalse(isAbsoluteUri(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L1926" href="#L1926">1926</a> assertTrue(isAbsoluteUri(<span class="jxr_string">"http://foo"</span>));
-<a class="jxr_linenumber" name="L1927" href="#L1927">1927</a> assertTrue(isAbsoluteUri(<span class="jxr_string">"x://x"</span>));
-<a class="jxr_linenumber" name="L1928" href="#L1928">1928</a> assertFalse(isAbsoluteUri(<span class="jxr_string">"xX://x"</span>));
-<a class="jxr_linenumber" name="L1929" href="#L1929">1929</a> assertFalse(isAbsoluteUri(<span class="jxr_string">"x ://x"</span>));
-<a class="jxr_linenumber" name="L1930" href="#L1930">1930</a> assertFalse(isAbsoluteUri(<span class="jxr_string">"x: //x"</span>));
-<a class="jxr_linenumber" name="L1931" href="#L1931">1931</a> assertFalse(isAbsoluteUri(<span class="jxr_string">"x:/ /x"</span>));
-<a class="jxr_linenumber" name="L1932" href="#L1932">1932</a> assertFalse(isAbsoluteUri(<span class="jxr_string">"x:x//x"</span>));
-<a class="jxr_linenumber" name="L1933" href="#L1933">1933</a> assertFalse(isAbsoluteUri(<span class="jxr_string">"x:/x/x"</span>));
-<a class="jxr_linenumber" name="L1934" href="#L1934">1934</a> assertTrue(isAbsoluteUri(<span class="jxr_string">"https://example.com"</span>));
-<a class="jxr_linenumber" name="L1935" href="#L1935">1935</a> assertTrue(isAbsoluteUri(<span class="jxr_string">"ftp://server.com"</span>));
-<a class="jxr_linenumber" name="L1936" href="#L1936">1936</a> }
-<a class="jxr_linenumber" name="L1937" href="#L1937">1937</a>
-<a class="jxr_linenumber" name="L1938" href="#L1938">1938</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1939" href="#L1939">1939</a> <em class="jxr_comment">// isAllNotBlank(CharSequence...)</em>
-<a class="jxr_linenumber" name="L1940" href="#L1940">1940</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1941" href="#L1941">1941</a> @Test
-<a class="jxr_linenumber" name="L1942" href="#L1942">1942</a> <strong class="jxr_keyword">void</strong> a76_isAllNotBlank() {
-<a class="jxr_linenumber" name="L1943" href="#L1943">1943</a> assertFalse(isAllNotBlank());
-<a class="jxr_linenumber" name="L1944" href="#L1944">1944</a> assertFalse(isAllNotBlank((String)<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L1945" href="#L1945">1945</a> assertFalse(isAllNotBlank(<strong class="jxr_keyword">null</strong>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L1946" href="#L1946">1946</a> assertFalse(isAllNotBlank(<span class="jxr_string">""</span>, <span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L1947" href="#L1947">1947</a> assertFalse(isAllNotBlank(<span class="jxr_string">" "</span>, <span class="jxr_string">" "</span>));
-<a class="jxr_linenumber" name="L1948" href="#L1948">1948</a> assertFalse(isAllNotBlank(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L1949" href="#L1949">1949</a> assertFalse(isAllNotBlank(<span class="jxr_string">""</span>, <span class="jxr_string">" "</span>));
-<a class="jxr_linenumber" name="L1950" href="#L1950">1950</a> assertFalse(isAllNotBlank(<span class="jxr_string">"hello"</span>, <span class="jxr_string">" "</span>));
-<a class="jxr_linenumber" name="L1951" href="#L1951">1951</a> assertTrue(isAllNotBlank(<span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L1952" href="#L1952">1952</a> assertTrue(isAllNotBlank(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"world"</span>));
-<a class="jxr_linenumber" name="L1953" href="#L1953">1953</a> assertTrue(isAllNotBlank(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"world"</span>, <span class="jxr_string">"test"</span>));
-<a class="jxr_linenumber" name="L1954" href="#L1954">1954</a> }
-<a class="jxr_linenumber" name="L1955" href="#L1955">1955</a>
-<a class="jxr_linenumber" name="L1956" href="#L1956">1956</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1957" href="#L1957">1957</a> <em class="jxr_comment">// isAllNotEmpty(CharSequence...)</em>
-<a class="jxr_linenumber" name="L1958" href="#L1958">1958</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1959" href="#L1959">1959</a> @Test
-<a class="jxr_linenumber" name="L1960" href="#L1960">1960</a> <strong class="jxr_keyword">void</strong> a77_isAllNotEmpty() {
-<a class="jxr_linenumber" name="L1961" href="#L1961">1961</a> assertFalse(isAllNotEmpty());
-<a class="jxr_linenumber" name="L1962" href="#L1962">1962</a> assertFalse(isAllNotEmpty((String)<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L1963" href="#L1963">1963</a> assertFalse(isAllNotEmpty(<strong class="jxr_keyword">null</strong>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L1964" href="#L1964">1964</a> assertFalse(isAllNotEmpty(<span class="jxr_string">""</span>, <span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L1965" href="#L1965">1965</a> assertFalse(isAllNotEmpty(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L1966" href="#L1966">1966</a> assertFalse(isAllNotEmpty(<span class="jxr_string">""</span>, <span class="jxr_string">" "</span>));
-<a class="jxr_linenumber" name="L1967" href="#L1967">1967</a> assertTrue(isAllNotEmpty(<span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L1968" href="#L1968">1968</a> assertTrue(isAllNotEmpty(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"world"</span>));
-<a class="jxr_linenumber" name="L1969" href="#L1969">1969</a> assertTrue(isAllNotEmpty(<span class="jxr_string">"hello"</span>, <span class="jxr_string">" "</span>)); <em class="jxr_comment">// Whitespace is not empty</em>
-<a class="jxr_linenumber" name="L1970" href="#L1970">1970</a> assertTrue(isAllNotEmpty(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"world"</span>, <span class="jxr_string">"test"</span>));
-<a class="jxr_linenumber" name="L1971" href="#L1971">1971</a> }
-<a class="jxr_linenumber" name="L1972" href="#L1972">1972</a>
-<a class="jxr_linenumber" name="L1973" href="#L1973">1973</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1974" href="#L1974">1974</a> <em class="jxr_comment">// isAlpha(String)</em>
-<a class="jxr_linenumber" name="L1975" href="#L1975">1975</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1976" href="#L1976">1976</a> @Test
-<a class="jxr_linenumber" name="L1977" href="#L1977">1977</a> <strong class="jxr_keyword">void</strong> a78_isAlpha() {
-<a class="jxr_linenumber" name="L1978" href="#L1978">1978</a> assertFalse(isAlpha(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L1979" href="#L1979">1979</a> assertFalse(isAlpha(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L1980" href="#L1980">1980</a> assertTrue(isAlpha(<span class="jxr_string">"abc"</span>));
-<a class="jxr_linenumber" name="L1981" href="#L1981">1981</a> assertTrue(isAlpha(<span class="jxr_string">"ABC"</span>));
-<a class="jxr_linenumber" name="L1982" href="#L1982">1982</a> assertTrue(isAlpha(<span class="jxr_string">"AbCdEf"</span>));
-<a class="jxr_linenumber" name="L1983" href="#L1983">1983</a> assertFalse(isAlpha(<span class="jxr_string">"abc123"</span>));
-<a class="jxr_linenumber" name="L1984" href="#L1984">1984</a> assertFalse(isAlpha(<span class="jxr_string">"abc def"</span>));
-<a class="jxr_linenumber" name="L1985" href="#L1985">1985</a> assertFalse(isAlpha(<span class="jxr_string">"abc-def"</span>));
-<a class="jxr_linenumber" name="L1986" href="#L1986">1986</a> assertFalse(isAlpha(<span class="jxr_string">"123"</span>));
-<a class="jxr_linenumber" name="L1987" href="#L1987">1987</a> assertTrue(isAlpha(<span class="jxr_string">"abcdefghijklmnopqrstuvwxyz"</span>));
-<a class="jxr_linenumber" name="L1988" href="#L1988">1988</a> assertTrue(isAlpha(<span class="jxr_string">"ABCDEFGHIJKLMNOPQRSTUVWXYZ"</span>));
-<a class="jxr_linenumber" name="L1989" href="#L1989">1989</a> }
-<a class="jxr_linenumber" name="L1990" href="#L1990">1990</a>
-<a class="jxr_linenumber" name="L1991" href="#L1991">1991</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1992" href="#L1992">1992</a> <em class="jxr_comment">// isAlphaNumeric(String)</em>
-<a class="jxr_linenumber" name="L1993" href="#L1993">1993</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L1994" href="#L1994">1994</a> @Test
-<a class="jxr_linenumber" name="L1995" href="#L1995">1995</a> <strong class="jxr_keyword">void</strong> a79_isAlphaNumeric() {
-<a class="jxr_linenumber" name="L1996" href="#L1996">1996</a> assertFalse(isAlphaNumeric(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L1997" href="#L1997">1997</a> assertFalse(isAlphaNumeric(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L1998" href="#L1998">1998</a> assertTrue(isAlphaNumeric(<span class="jxr_string">"abc"</span>));
-<a class="jxr_linenumber" name="L1999" href="#L1999">1999</a> assertTrue(isAlphaNumeric(<span class="jxr_string">"123"</span>));
-<a class="jxr_linenumber" name="L2000" href="#L2000">2000</a> assertTrue(isAlphaNumeric(<span class="jxr_string">"abc123"</span>));
-<a class="jxr_linenumber" name="L2001" href="#L2001">2001</a> assertTrue(isAlphaNumeric(<span class="jxr_string">"ABC123"</span>));
-<a class="jxr_linenumber" name="L2002" href="#L2002">2002</a> assertTrue(isAlphaNumeric(<span class="jxr_string">"a1b2c3"</span>));
-<a class="jxr_linenumber" name="L2003" href="#L2003">2003</a> assertFalse(isAlphaNumeric(<span class="jxr_string">"abc def"</span>));
-<a class="jxr_linenumber" name="L2004" href="#L2004">2004</a> assertFalse(isAlphaNumeric(<span class="jxr_string">"abc-123"</span>));
-<a class="jxr_linenumber" name="L2005" href="#L2005">2005</a> assertFalse(isAlphaNumeric(<span class="jxr_string">"abc_123"</span>));
-<a class="jxr_linenumber" name="L2006" href="#L2006">2006</a> assertFalse(isAlphaNumeric(<span class="jxr_string">"abc.123"</span>));
-<a class="jxr_linenumber" name="L2007" href="#L2007">2007</a> assertTrue(isAlphaNumeric(<span class="jxr_string">"abcdefghijklmnopqrstuvwxyz0123456789"</span>));
-<a class="jxr_linenumber" name="L2008" href="#L2008">2008</a> }
-<a class="jxr_linenumber" name="L2009" href="#L2009">2009</a>
-<a class="jxr_linenumber" name="L2010" href="#L2010">2010</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2011" href="#L2011">2011</a> <em class="jxr_comment">// isAnyNotBlank(CharSequence...)</em>
-<a class="jxr_linenumber" name="L2012" href="#L2012">2012</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2013" href="#L2013">2013</a> @Test
-<a class="jxr_linenumber" name="L2014" href="#L2014">2014</a> <strong class="jxr_keyword">void</strong> a80_isAnyNotBlank() {
-<a class="jxr_linenumber" name="L2015" href="#L2015">2015</a> assertFalse(isAnyNotBlank());
-<a class="jxr_linenumber" name="L2016" href="#L2016">2016</a> assertFalse(isAnyNotBlank((String)<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2017" href="#L2017">2017</a> assertFalse(isAnyNotBlank(<strong class="jxr_keyword">null</strong>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2018" href="#L2018">2018</a> assertFalse(isAnyNotBlank(<span class="jxr_string">""</span>, <span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L2019" href="#L2019">2019</a> assertFalse(isAnyNotBlank(<span class="jxr_string">" "</span>, <span class="jxr_string">" "</span>));
-<a class="jxr_linenumber" name="L2020" href="#L2020">2020</a> assertTrue(isAnyNotBlank(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L2021" href="#L2021">2021</a> assertTrue(isAnyNotBlank(<span class="jxr_string">""</span>, <span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L2022" href="#L2022">2022</a> assertTrue(isAnyNotBlank(<span class="jxr_string">" "</span>, <span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L2023" href="#L2023">2023</a> assertTrue(isAnyNotBlank(<span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L2024" href="#L2024">2024</a> assertTrue(isAnyNotBlank(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"world"</span>));
-<a class="jxr_linenumber" name="L2025" href="#L2025">2025</a> assertTrue(isAnyNotBlank(<span class="jxr_string">"hello"</span>, <strong class="jxr_keyword">null</strong>, <span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L2026" href="#L2026">2026</a> }
-<a class="jxr_linenumber" name="L2027" href="#L2027">2027</a>
-<a class="jxr_linenumber" name="L2028" href="#L2028">2028</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2029" href="#L2029">2029</a> <em class="jxr_comment">// isAnyNotEmpty(CharSequence...)</em>
-<a class="jxr_linenumber" name="L2030" href="#L2030">2030</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2031" href="#L2031">2031</a> @Test
-<a class="jxr_linenumber" name="L2032" href="#L2032">2032</a> <strong class="jxr_keyword">void</strong> a81_isAnyNotEmpty() {
-<a class="jxr_linenumber" name="L2033" href="#L2033">2033</a> assertFalse(isAnyNotEmpty());
-<a class="jxr_linenumber" name="L2034" href="#L2034">2034</a> assertFalse(isAnyNotEmpty((String)<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2035" href="#L2035">2035</a> assertFalse(isAnyNotEmpty(<strong class="jxr_keyword">null</strong>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2036" href="#L2036">2036</a> assertFalse(isAnyNotEmpty(<span class="jxr_string">""</span>, <span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L2037" href="#L2037">2037</a> assertTrue(isAnyNotEmpty(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L2038" href="#L2038">2038</a> assertTrue(isAnyNotEmpty(<span class="jxr_string">""</span>, <span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L2039" href="#L2039">2039</a> assertTrue(isAnyNotEmpty(<span class="jxr_string">" "</span>, <span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L2040" href="#L2040">2040</a> assertTrue(isAnyNotEmpty(<span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L2041" href="#L2041">2041</a> assertTrue(isAnyNotEmpty(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"world"</span>));
-<a class="jxr_linenumber" name="L2042" href="#L2042">2042</a> assertTrue(isAnyNotEmpty(<span class="jxr_string">"hello"</span>, <strong class="jxr_keyword">null</strong>, <span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L2043" href="#L2043">2043</a> }
-<a class="jxr_linenumber" name="L2044" href="#L2044">2044</a>
-<a class="jxr_linenumber" name="L2045" href="#L2045">2045</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2046" href="#L2046">2046</a> <em class="jxr_comment">// isBlank(CharSequence)</em>
-<a class="jxr_linenumber" name="L2047" href="#L2047">2047</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2048" href="#L2048">2048</a> @Test
-<a class="jxr_linenumber" name="L2049" href="#L2049">2049</a> <strong class="jxr_keyword">void</strong> a82_isBlank() {
-<a class="jxr_linenumber" name="L2050" href="#L2050">2050</a> assertTrue(isBlank(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2051" href="#L2051">2051</a> assertTrue(isBlank(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L2052" href="#L2052">2052</a> assertTrue(isBlank(<span class="jxr_string">" "</span>));
-<a class="jxr_linenumber" name="L2053" href="#L2053">2053</a> assertTrue(isBlank(<span class="jxr_string">"\t\n"</span>));
-<a class="jxr_linenumber" name="L2054" href="#L2054">2054</a> assertTrue(isBlank(<span class="jxr_string">"\r\n\t "</span>));
-<a class="jxr_linenumber" name="L2055" href="#L2055">2055</a> assertFalse(isBlank(<span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L2056" href="#L2056">2056</a> assertFalse(isBlank(<span class="jxr_string">" hello "</span>));
-<a class="jxr_linenumber" name="L2057" href="#L2057">2057</a> assertFalse(isBlank(<span class="jxr_string">"a"</span>));
-<a class="jxr_linenumber" name="L2058" href="#L2058">2058</a> }
-<a class="jxr_linenumber" name="L2059" href="#L2059">2059</a>
-<a class="jxr_linenumber" name="L2060" href="#L2060">2060</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2061" href="#L2061">2061</a> <em class="jxr_comment">// isCreditCard(String)</em>
-<a class="jxr_linenumber" name="L2062" href="#L2062">2062</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2063" href="#L2063">2063</a> @Test
-<a class="jxr_linenumber" name="L2064" href="#L2064">2064</a> <strong class="jxr_keyword">void</strong> a83_isCreditCard() {
-<a class="jxr_linenumber" name="L2065" href="#L2065">2065</a> <em class="jxr_comment">// Valid credit card numbers (test cards)</em>
-<a class="jxr_linenumber" name="L2066" href="#L2066">2066</a> assertTrue(isCreditCard(<span class="jxr_string">"4532015112830366"</span>)); <em class="jxr_comment">// Visa test card</em>
-<a class="jxr_linenumber" name="L2067" href="#L2067">2067</a> assertTrue(isCreditCard(<span class="jxr_string">"4532-0151-1283-0366"</span>)); <em class="jxr_comment">// With separators</em>
-<a class="jxr_linenumber" name="L2068" href="#L2068">2068</a> assertTrue(isCreditCard(<span class="jxr_string">"4532 0151 1283 0366"</span>)); <em class="jxr_comment">// With spaces</em>
-<a class="jxr_linenumber" name="L2069" href="#L2069">2069</a>
-<a class="jxr_linenumber" name="L2070" href="#L2070">2070</a> <em class="jxr_comment">// Invalid cases</em>
-<a class="jxr_linenumber" name="L2071" href="#L2071">2071</a> assertFalse(isCreditCard(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2072" href="#L2072">2072</a> assertFalse(isCreditCard(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L2073" href="#L2073">2073</a> assertFalse(isCreditCard(<span class="jxr_string">"1234567890"</span>)); <em class="jxr_comment">// Too short</em>
-<a class="jxr_linenumber" name="L2074" href="#L2074">2074</a> assertFalse(isCreditCard(<span class="jxr_string">"12345678901234567890"</span>)); <em class="jxr_comment">// Too long</em>
-<a class="jxr_linenumber" name="L2075" href="#L2075">2075</a> assertFalse(isCreditCard(<span class="jxr_string">"1234567890123"</span>)); <em class="jxr_comment">// Invalid Luhn</em>
-<a class="jxr_linenumber" name="L2076" href="#L2076">2076</a> assertFalse(isCreditCard(<span class="jxr_string">"abc1234567890"</span>)); <em class="jxr_comment">// Contains letters</em>
-<a class="jxr_linenumber" name="L2077" href="#L2077">2077</a> }
-<a class="jxr_linenumber" name="L2078" href="#L2078">2078</a>
-<a class="jxr_linenumber" name="L2079" href="#L2079">2079</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2080" href="#L2080">2080</a> <em class="jxr_comment">// isDecimal(String)</em>
-<a class="jxr_linenumber" name="L2081" href="#L2081">2081</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2082" href="#L2082">2082</a> @Test
-<a class="jxr_linenumber" name="L2083" href="#L2083">2083</a> <strong class="jxr_keyword">void</strong> a84_isDecimal() {
-<a class="jxr_linenumber" name="L2084" href="#L2084">2084</a> <strong class="jxr_keyword">var</strong> valid = a(<span class="jxr_string">"+1"</span>, <span class="jxr_string">"-1"</span>, <span class="jxr_string">"0x123"</span>, <span class="jxr_string">"0X123"</span>, <span class="jxr_string">"0xdef"</span>, <span class="jxr_string">"0XDEF"</span>, <span class="jxr_string">"#def"</span>, <span class="jxr_string">"#DEF"</span>, <span class="jxr_string">"0123"</span>, <span class="jxr_ [...]
-<a class="jxr_linenumber" name="L2085" href="#L2085">2085</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> s : valid)
-<a class="jxr_linenumber" name="L2086" href="#L2086">2086</a> assertTrue(isDecimal(s), <span class="jxr_string">"Should be valid: "</span> + s);
-<a class="jxr_linenumber" name="L2087" href="#L2087">2087</a>
-<a class="jxr_linenumber" name="L2088" href="#L2088">2088</a> <strong class="jxr_keyword">var</strong> invalid = a(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">""</span>, <span class="jxr_string">"a"</span>, <span class="jxr_string">"+"</span>, <span class="jxr_string">"-"</span>, <span class="jxr_string">"."</span>, <span class="jxr_string">"0xdeg"</span>, <span class="jxr_string">"0XDEG"</span>, <span class="jxr_string">"#deg"</span>, <span class="jxr_string">" [...]
-<a class="jxr_linenumber" name="L2089" href="#L2089">2089</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> s : invalid)
-<a class="jxr_linenumber" name="L2090" href="#L2090">2090</a> assertFalse(isDecimal(s), <span class="jxr_string">"Should be invalid: "</span> + s);
-<a class="jxr_linenumber" name="L2091" href="#L2091">2091</a> }
-<a class="jxr_linenumber" name="L2092" href="#L2092">2092</a>
-<a class="jxr_linenumber" name="L2093" href="#L2093">2093</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2094" href="#L2094">2094</a> <em class="jxr_comment">// isDigit(String)</em>
-<a class="jxr_linenumber" name="L2095" href="#L2095">2095</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2096" href="#L2096">2096</a> @Test
-<a class="jxr_linenumber" name="L2097" href="#L2097">2097</a> <strong class="jxr_keyword">void</strong> a85_isDigit() {
-<a class="jxr_linenumber" name="L2098" href="#L2098">2098</a> assertFalse(isDigit(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2099" href="#L2099">2099</a> assertFalse(isDigit(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L2100" href="#L2100">2100</a> assertTrue(isDigit(<span class="jxr_string">"123"</span>));
-<a class="jxr_linenumber" name="L2101" href="#L2101">2101</a> assertTrue(isDigit(<span class="jxr_string">"0"</span>));
-<a class="jxr_linenumber" name="L2102" href="#L2102">2102</a> assertTrue(isDigit(<span class="jxr_string">"999"</span>));
-<a class="jxr_linenumber" name="L2103" href="#L2103">2103</a> assertTrue(isDigit(<span class="jxr_string">"0123456789"</span>));
-<a class="jxr_linenumber" name="L2104" href="#L2104">2104</a> assertFalse(isDigit(<span class="jxr_string">"abc"</span>));
-<a class="jxr_linenumber" name="L2105" href="#L2105">2105</a> assertFalse(isDigit(<span class="jxr_string">"abc123"</span>));
-<a class="jxr_linenumber" name="L2106" href="#L2106">2106</a> assertFalse(isDigit(<span class="jxr_string">"12.3"</span>));
-<a class="jxr_linenumber" name="L2107" href="#L2107">2107</a> assertFalse(isDigit(<span class="jxr_string">"12-3"</span>));
-<a class="jxr_linenumber" name="L2108" href="#L2108">2108</a> assertFalse(isDigit(<span class="jxr_string">" 123"</span>));
-<a class="jxr_linenumber" name="L2109" href="#L2109">2109</a> assertFalse(isDigit(<span class="jxr_string">"123 "</span>));
-<a class="jxr_linenumber" name="L2110" href="#L2110">2110</a> }
-<a class="jxr_linenumber" name="L2111" href="#L2111">2111</a>
-<a class="jxr_linenumber" name="L2112" href="#L2112">2112</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2113" href="#L2113">2113</a> <em class="jxr_comment">// isEmail(String)</em>
-<a class="jxr_linenumber" name="L2114" href="#L2114">2114</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2115" href="#L2115">2115</a> @Test
-<a class="jxr_linenumber" name="L2116" href="#L2116">2116</a> <strong class="jxr_keyword">void</strong> a86_isEmail() {
-<a class="jxr_linenumber" name="L2117" href="#L2117">2117</a> <em class="jxr_comment">// Valid emails</em>
-<a class="jxr_linenumber" name="L2118" href="#L2118">2118</a> assertTrue(isEmail(<span class="jxr_string">"user@example.com"</span>));
-<a class="jxr_linenumber" name="L2119" href="#L2119">2119</a> assertTrue(isEmail(<span class="jxr_string">"test.email@example.com"</span>));
-<a class="jxr_linenumber" name="L2120" href="#L2120">2120</a> assertTrue(isEmail(<span class="jxr_string">"user+tag@example.com"</span>));
-<a class="jxr_linenumber" name="L2121" href="#L2121">2121</a> assertTrue(isEmail(<span class="jxr_string">"user_name@example.com"</span>));
-<a class="jxr_linenumber" name="L2122" href="#L2122">2122</a> assertTrue(isEmail(<span class="jxr_string">"user-name@example.com"</span>));
-<a class="jxr_linenumber" name="L2123" href="#L2123">2123</a> assertTrue(isEmail(<span class="jxr_string">"user123@example.com"</span>));
-<a class="jxr_linenumber" name="L2124" href="#L2124">2124</a> assertTrue(isEmail(<span class="jxr_string">"user@example.co.uk"</span>));
-<a class="jxr_linenumber" name="L2125" href="#L2125">2125</a> assertTrue(isEmail(<span class="jxr_string">"user@subdomain.example.com"</span>));
-<a class="jxr_linenumber" name="L2126" href="#L2126">2126</a> assertTrue(isEmail(<span class="jxr_string">"a@b.co"</span>));
-<a class="jxr_linenumber" name="L2127" href="#L2127">2127</a> assertTrue(isEmail(<span class="jxr_string">"user.name+tag+sorting@example.com"</span>));
-<a class="jxr_linenumber" name="L2128" href="#L2128">2128</a>
-<a class="jxr_linenumber" name="L2129" href="#L2129">2129</a> <em class="jxr_comment">// Invalid emails</em>
-<a class="jxr_linenumber" name="L2130" href="#L2130">2130</a> assertFalse(isEmail(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2131" href="#L2131">2131</a> assertFalse(isEmail(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L2132" href="#L2132">2132</a> assertFalse(isEmail(<span class="jxr_string">" "</span>));
-<a class="jxr_linenumber" name="L2133" href="#L2133">2133</a> assertFalse(isEmail(<span class="jxr_string">"invalid"</span>));
-<a class="jxr_linenumber" name="L2134" href="#L2134">2134</a> assertFalse(isEmail(<span class="jxr_string">"@example.com"</span>));
-<a class="jxr_linenumber" name="L2135" href="#L2135">2135</a> assertFalse(isEmail(<span class="jxr_string">"user@"</span>));
-<a class="jxr_linenumber" name="L2136" href="#L2136">2136</a> assertFalse(isEmail(<span class="jxr_string">"user@example"</span>));
-<a class="jxr_linenumber" name="L2137" href="#L2137">2137</a> assertFalse(isEmail(<span class="jxr_string">"user @example.com"</span>));
-<a class="jxr_linenumber" name="L2138" href="#L2138">2138</a> assertFalse(isEmail(<span class="jxr_string">"user@example .com"</span>));
-<a class="jxr_linenumber" name="L2139" href="#L2139">2139</a> }
-<a class="jxr_linenumber" name="L2140" href="#L2140">2140</a>
-<a class="jxr_linenumber" name="L2141" href="#L2141">2141</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2142" href="#L2142">2142</a> <em class="jxr_comment">// isEmpty(String)</em>
-<a class="jxr_linenumber" name="L2143" href="#L2143">2143</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2144" href="#L2144">2144</a> @Test
-<a class="jxr_linenumber" name="L2145" href="#L2145">2145</a> <strong class="jxr_keyword">void</strong> a87_isEmpty() {
-<a class="jxr_linenumber" name="L2146" href="#L2146">2146</a> assertTrue(StringUtils.isEmpty(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2147" href="#L2147">2147</a> assertTrue(StringUtils.isEmpty(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L2148" href="#L2148">2148</a> assertFalse(StringUtils.isEmpty(<span class="jxr_string">" "</span>));
-<a class="jxr_linenumber" name="L2149" href="#L2149">2149</a> assertFalse(StringUtils.isEmpty(<span class="jxr_string">"a"</span>));
-<a class="jxr_linenumber" name="L2150" href="#L2150">2150</a> assertFalse(StringUtils.isEmpty(<span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L2151" href="#L2151">2151</a> assertFalse(StringUtils.isEmpty(<span class="jxr_string">" "</span>));
-<a class="jxr_linenumber" name="L2152" href="#L2152">2152</a> }
-<a class="jxr_linenumber" name="L2153" href="#L2153">2153</a>
-<a class="jxr_linenumber" name="L2154" href="#L2154">2154</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2155" href="#L2155">2155</a> <em class="jxr_comment">// isFirstNumberChar(char)</em>
-<a class="jxr_linenumber" name="L2156" href="#L2156">2156</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2157" href="#L2157">2157</a> @Test
-<a class="jxr_linenumber" name="L2158" href="#L2158">2158</a> <strong class="jxr_keyword">void</strong> a88_isFirstNumberChar() {
-<a class="jxr_linenumber" name="L2159" href="#L2159">2159</a> <em class="jxr_comment">// Valid first number characters</em>
-<a class="jxr_linenumber" name="L2160" href="#L2160">2160</a> assertTrue(isFirstNumberChar('0'));
-<a class="jxr_linenumber" name="L2161" href="#L2161">2161</a> assertTrue(isFirstNumberChar('1'));
-<a class="jxr_linenumber" name="L2162" href="#L2162">2162</a> assertTrue(isFirstNumberChar('9'));
-<a class="jxr_linenumber" name="L2163" href="#L2163">2163</a> assertTrue(isFirstNumberChar('+'));
-<a class="jxr_linenumber" name="L2164" href="#L2164">2164</a> assertTrue(isFirstNumberChar('-'));
-<a class="jxr_linenumber" name="L2165" href="#L2165">2165</a> assertTrue(isFirstNumberChar('.'));
-<a class="jxr_linenumber" name="L2166" href="#L2166">2166</a> assertTrue(isFirstNumberChar('#'));
-<a class="jxr_linenumber" name="L2167" href="#L2167">2167</a>
-<a class="jxr_linenumber" name="L2168" href="#L2168">2168</a> <em class="jxr_comment">// Invalid first number characters</em>
-<a class="jxr_linenumber" name="L2169" href="#L2169">2169</a> assertFalse(isFirstNumberChar('a'));
-<a class="jxr_linenumber" name="L2170" href="#L2170">2170</a> assertFalse(isFirstNumberChar('x'));
-<a class="jxr_linenumber" name="L2171" href="#L2171">2171</a> assertFalse(isFirstNumberChar(' '));
-<a class="jxr_linenumber" name="L2172" href="#L2172">2172</a> assertFalse(isFirstNumberChar('('));
-<a class="jxr_linenumber" name="L2173" href="#L2173">2173</a> }
-<a class="jxr_linenumber" name="L2174" href="#L2174">2174</a>
-<a class="jxr_linenumber" name="L2175" href="#L2175">2175</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2176" href="#L2176">2176</a> <em class="jxr_comment">// isFloat(String)</em>
-<a class="jxr_linenumber" name="L2177" href="#L2177">2177</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2178" href="#L2178">2178</a> @Test
-<a class="jxr_linenumber" name="L2179" href="#L2179">2179</a> <strong class="jxr_keyword">void</strong> a89_isFloat() {
-<a class="jxr_linenumber" name="L2180" href="#L2180">2180</a> <strong class="jxr_keyword">var</strong> valid = a(<span class="jxr_string">"+1.0"</span>, <span class="jxr_string">"-1.0"</span>, <span class="jxr_string">".0"</span>, <span class="jxr_string">"NaN"</span>, <span class="jxr_string">"Infinity"</span>, <span class="jxr_string">"1e1"</span>, <span class="jxr_string">"-1e-1"</span>, <span class="jxr_string">"+1e+1"</span>, <span class="jxr_string">"-1.1e-1"</span>, <span class= [...]
-<a class="jxr_linenumber" name="L2181" href="#L2181">2181</a> <span class="jxr_string">"0.5"</span>, <span class="jxr_string">"123.456"</span>);
-<a class="jxr_linenumber" name="L2182" href="#L2182">2182</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> s : valid)
-<a class="jxr_linenumber" name="L2183" href="#L2183">2183</a> assertTrue(isFloat(s), <span class="jxr_string">"Should be valid: "</span> + s);
-<a class="jxr_linenumber" name="L2184" href="#L2184">2184</a>
-<a class="jxr_linenumber" name="L2185" href="#L2185">2185</a> <strong class="jxr_keyword">var</strong> invalid = a(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">""</span>, <span class="jxr_string">"a"</span>, <span class="jxr_string">"+"</span>, <span class="jxr_string">"-"</span>, <span class="jxr_string">"."</span>, <span class="jxr_string">"a"</span>, <span class="jxr_string">"+a"</span>, <span class="jxr_string">"11a"</span>);
-<a class="jxr_linenumber" name="L2186" href="#L2186">2186</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> s : invalid)
-<a class="jxr_linenumber" name="L2187" href="#L2187">2187</a> assertFalse(isFloat(s), <span class="jxr_string">"Should be invalid: "</span> + s);
-<a class="jxr_linenumber" name="L2188" href="#L2188">2188</a> }
-<a class="jxr_linenumber" name="L2189" href="#L2189">2189</a>
-<a class="jxr_linenumber" name="L2190" href="#L2190">2190</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2191" href="#L2191">2191</a> <em class="jxr_comment">// isInterned(String)</em>
-<a class="jxr_linenumber" name="L2192" href="#L2192">2192</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2193" href="#L2193">2193</a> @Test
-<a class="jxr_linenumber" name="L2194" href="#L2194">2194</a> <strong class="jxr_keyword">void</strong> a90_isInterned() {
-<a class="jxr_linenumber" name="L2195" href="#L2195">2195</a> assertFalse(isInterned(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2196" href="#L2196">2196</a>
-<a class="jxr_linenumber" name="L2197" href="#L2197">2197</a> <em class="jxr_comment">// String literals are automatically interned</em>
-<a class="jxr_linenumber" name="L2198" href="#L2198">2198</a> <strong class="jxr_keyword">var</strong> literal = <span class="jxr_string">"test"</span>;
-<a class="jxr_linenumber" name="L2199" href="#L2199">2199</a> assertTrue(isInterned(literal));
-<a class="jxr_linenumber" name="L2200" href="#L2200">2200</a>
-<a class="jxr_linenumber" name="L2201" href="#L2201">2201</a> <em class="jxr_comment">// New String objects are not interned</em>
-<a class="jxr_linenumber" name="L2202" href="#L2202">2202</a> <strong class="jxr_keyword">var</strong> s1 = <strong class="jxr_keyword">new</strong> String(<span class="jxr_string">"test"</span>);
-<a class="jxr_linenumber" name="L2203" href="#L2203">2203</a> assertFalse(isInterned(s1));
-<a class="jxr_linenumber" name="L2204" href="#L2204">2204</a>
-<a class="jxr_linenumber" name="L2205" href="#L2205">2205</a> <em class="jxr_comment">// After interning, it should be interned</em>
-<a class="jxr_linenumber" name="L2206" href="#L2206">2206</a> <strong class="jxr_keyword">var</strong> s2 = intern(s1);
-<a class="jxr_linenumber" name="L2207" href="#L2207">2207</a> assertTrue(isInterned(s2));
-<a class="jxr_linenumber" name="L2208" href="#L2208">2208</a> assertSame(s1.intern(), s2);
-<a class="jxr_linenumber" name="L2209" href="#L2209">2209</a> }
-<a class="jxr_linenumber" name="L2210" href="#L2210">2210</a>
-<a class="jxr_linenumber" name="L2211" href="#L2211">2211</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2212" href="#L2212">2212</a> <em class="jxr_comment">// isJson(String)</em>
-<a class="jxr_linenumber" name="L2213" href="#L2213">2213</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2214" href="#L2214">2214</a> @Test
-<a class="jxr_linenumber" name="L2215" href="#L2215">2215</a> <strong class="jxr_keyword">void</strong> a91_isJson() {
-<a class="jxr_linenumber" name="L2216" href="#L2216">2216</a> <em class="jxr_comment">// Valid JSON</em>
-<a class="jxr_linenumber" name="L2217" href="#L2217">2217</a> assertTrue(isJson(<span class="jxr_string">"{}"</span>));
-<a class="jxr_linenumber" name="L2218" href="#L2218">2218</a> assertTrue(isJson(<span class="jxr_string">"[]"</span>));
-<a class="jxr_linenumber" name="L2219" href="#L2219">2219</a> assertTrue(isJson(<span class="jxr_string">"'test'"</span>));
-<a class="jxr_linenumber" name="L2220" href="#L2220">2220</a> assertTrue(isJson(<span class="jxr_string">"true"</span>));
-<a class="jxr_linenumber" name="L2221" href="#L2221">2221</a> assertTrue(isJson(<span class="jxr_string">"false"</span>));
-<a class="jxr_linenumber" name="L2222" href="#L2222">2222</a> assertTrue(isJson(<span class="jxr_string">"null"</span>));
-<a class="jxr_linenumber" name="L2223" href="#L2223">2223</a> assertTrue(isJson(<span class="jxr_string">"123"</span>));
-<a class="jxr_linenumber" name="L2224" href="#L2224">2224</a> assertTrue(isJson(<span class="jxr_string">"123.45"</span>));
-<a class="jxr_linenumber" name="L2225" href="#L2225">2225</a> assertTrue(isJson(<span class="jxr_string">" {} "</span>)); <em class="jxr_comment">// With whitespace</em>
-<a class="jxr_linenumber" name="L2226" href="#L2226">2226</a> assertTrue(isJson(<span class="jxr_string">" [] "</span>)); <em class="jxr_comment">// With whitespace</em>
-<a class="jxr_linenumber" name="L2227" href="#L2227">2227</a>
-<a class="jxr_linenumber" name="L2228" href="#L2228">2228</a> <em class="jxr_comment">// Invalid JSON</em>
-<a class="jxr_linenumber" name="L2229" href="#L2229">2229</a> assertFalse(isJson(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2230" href="#L2230">2230</a> assertFalse(isJson(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L2231" href="#L2231">2231</a> assertFalse(isJson(<span class="jxr_string">"abc"</span>));
-<a class="jxr_linenumber" name="L2232" href="#L2232">2232</a> assertFalse(isJson(<span class="jxr_string">"{"</span>));
-<a class="jxr_linenumber" name="L2233" href="#L2233">2233</a> assertFalse(isJson(<span class="jxr_string">"}"</span>));
-<a class="jxr_linenumber" name="L2234" href="#L2234">2234</a> assertFalse(isJson(<span class="jxr_string">"["</span>));
-<a class="jxr_linenumber" name="L2235" href="#L2235">2235</a> assertFalse(isJson(<span class="jxr_string">"]"</span>));
-<a class="jxr_linenumber" name="L2236" href="#L2236">2236</a> }
-<a class="jxr_linenumber" name="L2237" href="#L2237">2237</a>
-<a class="jxr_linenumber" name="L2238" href="#L2238">2238</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2239" href="#L2239">2239</a> <em class="jxr_comment">// isJsonArray(Object,boolean)</em>
-<a class="jxr_linenumber" name="L2240" href="#L2240">2240</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2241" href="#L2241">2241</a> @Test
-<a class="jxr_linenumber" name="L2242" href="#L2242">2242</a> <strong class="jxr_keyword">void</strong> a92_isJsonArray() {
-<a class="jxr_linenumber" name="L2243" href="#L2243">2243</a> <em class="jxr_comment">// Valid JSON arrays</em>
-<a class="jxr_linenumber" name="L2244" href="#L2244">2244</a> assertTrue(isJsonArray(<span class="jxr_string">"[]"</span>, false));
-<a class="jxr_linenumber" name="L2245" href="#L2245">2245</a> assertTrue(isJsonArray(<span class="jxr_string">"[1,2,3]"</span>, false));
-<a class="jxr_linenumber" name="L2246" href="#L2246">2246</a> assertTrue(isJsonArray(<span class="jxr_string">" [1,2,3] "</span>, <strong class="jxr_keyword">true</strong>)); <em class="jxr_comment">// With whitespace</em>
-<a class="jxr_linenumber" name="L2247" href="#L2247">2247</a> assertTrue(isJsonArray(<span class="jxr_string">"/*comment*/ [1,2,3] /*comment*/"</span>, <strong class="jxr_keyword">true</strong>)); <em class="jxr_comment">// With comments</em>
-<a class="jxr_linenumber" name="L2248" href="#L2248">2248</a>
-<a class="jxr_linenumber" name="L2249" href="#L2249">2249</a> <em class="jxr_comment">// Invalid JSON arrays</em>
-<a class="jxr_linenumber" name="L2250" href="#L2250">2250</a> assertFalse(isJsonArray(<strong class="jxr_keyword">null</strong>, false));
-<a class="jxr_linenumber" name="L2251" href="#L2251">2251</a> assertFalse(isJsonArray(<span class="jxr_string">""</span>, false));
-<a class="jxr_linenumber" name="L2252" href="#L2252">2252</a> assertFalse(isJsonArray(<span class="jxr_string">"{}"</span>, false));
-<a class="jxr_linenumber" name="L2253" href="#L2253">2253</a> assertFalse(isJsonArray(<span class="jxr_string">"123"</span>, false));
-<a class="jxr_linenumber" name="L2254" href="#L2254">2254</a> assertFalse(isJsonArray(<span class="jxr_string">"["</span>, false));
-<a class="jxr_linenumber" name="L2255" href="#L2255">2255</a> assertFalse(isJsonArray(<span class="jxr_string">"]"</span>, false));
-<a class="jxr_linenumber" name="L2256" href="#L2256">2256</a> }
-<a class="jxr_linenumber" name="L2257" href="#L2257">2257</a>
-<a class="jxr_linenumber" name="L2258" href="#L2258">2258</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2259" href="#L2259">2259</a> <em class="jxr_comment">// isJsonObject(Object,boolean)</em>
-<a class="jxr_linenumber" name="L2260" href="#L2260">2260</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2261" href="#L2261">2261</a> @Test
-<a class="jxr_linenumber" name="L2262" href="#L2262">2262</a> <strong class="jxr_keyword">void</strong> a93_isJsonObject() {
-<a class="jxr_linenumber" name="L2263" href="#L2263">2263</a> <em class="jxr_comment">// Valid JSON objects</em>
-<a class="jxr_linenumber" name="L2264" href="#L2264">2264</a> assertTrue(isJsonObject(<span class="jxr_string">"{foo:'bar'}"</span>, <strong class="jxr_keyword">true</strong>));
-<a class="jxr_linenumber" name="L2265" href="#L2265">2265</a> assertTrue(isJsonObject(<span class="jxr_string">" { foo:'bar' } "</span>, <strong class="jxr_keyword">true</strong>));
-<a class="jxr_linenumber" name="L2266" href="#L2266">2266</a> assertTrue(isJsonObject(<span class="jxr_string">"/*foo*/ { foo:'bar' } /*foo*/"</span>, <strong class="jxr_keyword">true</strong>));
-<a class="jxr_linenumber" name="L2267" href="#L2267">2267</a> assertTrue(isJsonObject(<span class="jxr_string">"{}"</span>, false));
-<a class="jxr_linenumber" name="L2268" href="#L2268">2268</a> assertTrue(isJsonObject(<span class="jxr_string">"{'key':'value'}"</span>, false));
-<a class="jxr_linenumber" name="L2269" href="#L2269">2269</a>
-<a class="jxr_linenumber" name="L2270" href="#L2270">2270</a> <em class="jxr_comment">// Invalid JSON objects</em>
-<a class="jxr_linenumber" name="L2271" href="#L2271">2271</a> assertFalse(isJsonObject(<strong class="jxr_keyword">null</strong>, false));
-<a class="jxr_linenumber" name="L2272" href="#L2272">2272</a> assertFalse(isJsonObject(<span class="jxr_string">""</span>, false));
-<a class="jxr_linenumber" name="L2273" href="#L2273">2273</a> assertFalse(isJsonObject(<span class="jxr_string">" { foo:'bar' "</span>, <strong class="jxr_keyword">true</strong>));
-<a class="jxr_linenumber" name="L2274" href="#L2274">2274</a> assertFalse(isJsonObject(<span class="jxr_string">" foo:'bar' } "</span>, <strong class="jxr_keyword">true</strong>));
-<a class="jxr_linenumber" name="L2275" href="#L2275">2275</a> assertFalse(isJsonObject(<span class="jxr_string">"[]"</span>, false));
-<a class="jxr_linenumber" name="L2276" href="#L2276">2276</a> assertFalse(isJsonObject(<span class="jxr_string">"123"</span>, false));
-<a class="jxr_linenumber" name="L2277" href="#L2277">2277</a> }
-<a class="jxr_linenumber" name="L2278" href="#L2278">2278</a>
-<a class="jxr_linenumber" name="L2279" href="#L2279">2279</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2280" href="#L2280">2280</a> <em class="jxr_comment">// isNotBlank(CharSequence)</em>
-<a class="jxr_linenumber" name="L2281" href="#L2281">2281</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2282" href="#L2282">2282</a> @Test
-<a class="jxr_linenumber" name="L2283" href="#L2283">2283</a> <strong class="jxr_keyword">void</strong> a94_isNotBlank() {
-<a class="jxr_linenumber" name="L2284" href="#L2284">2284</a> assertFalse(isNotBlank(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2285" href="#L2285">2285</a> assertFalse(isNotBlank(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L2286" href="#L2286">2286</a> assertFalse(isNotBlank(<span class="jxr_string">" "</span>));
-<a class="jxr_linenumber" name="L2287" href="#L2287">2287</a> assertFalse(isNotBlank(<span class="jxr_string">"\t\n"</span>));
-<a class="jxr_linenumber" name="L2288" href="#L2288">2288</a> assertFalse(isNotBlank(<span class="jxr_string">"\r\n\t "</span>));
-<a class="jxr_linenumber" name="L2289" href="#L2289">2289</a> assertTrue(isNotBlank(<span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L2290" href="#L2290">2290</a> assertTrue(isNotBlank(<span class="jxr_string">" hello "</span>));
-<a class="jxr_linenumber" name="L2291" href="#L2291">2291</a> assertTrue(isNotBlank(<span class="jxr_string">"a"</span>));
-<a class="jxr_linenumber" name="L2292" href="#L2292">2292</a> }
-<a class="jxr_linenumber" name="L2293" href="#L2293">2293</a>
-<a class="jxr_linenumber" name="L2294" href="#L2294">2294</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2295" href="#L2295">2295</a> <em class="jxr_comment">// isNumberChar(char)</em>
-<a class="jxr_linenumber" name="L2296" href="#L2296">2296</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2297" href="#L2297">2297</a> @Test
-<a class="jxr_linenumber" name="L2298" href="#L2298">2298</a> <strong class="jxr_keyword">void</strong> a95_isNumberChar() {
-<a class="jxr_linenumber" name="L2299" href="#L2299">2299</a> <em class="jxr_comment">// Valid number characters</em>
-<a class="jxr_linenumber" name="L2300" href="#L2300">2300</a> assertTrue(isNumberChar('0'));
-<a class="jxr_linenumber" name="L2301" href="#L2301">2301</a> assertTrue(isNumberChar('1'));
-<a class="jxr_linenumber" name="L2302" href="#L2302">2302</a> assertTrue(isNumberChar('9'));
-<a class="jxr_linenumber" name="L2303" href="#L2303">2303</a> assertTrue(isNumberChar('+'));
-<a class="jxr_linenumber" name="L2304" href="#L2304">2304</a> assertTrue(isNumberChar('-'));
-<a class="jxr_linenumber" name="L2305" href="#L2305">2305</a> assertTrue(isNumberChar('.'));
-<a class="jxr_linenumber" name="L2306" href="#L2306">2306</a> assertTrue(isNumberChar('x'));
-<a class="jxr_linenumber" name="L2307" href="#L2307">2307</a> assertTrue(isNumberChar('X'));
-<a class="jxr_linenumber" name="L2308" href="#L2308">2308</a> assertTrue(isNumberChar('#'));
-<a class="jxr_linenumber" name="L2309" href="#L2309">2309</a> assertTrue(isNumberChar('p'));
-<a class="jxr_linenumber" name="L2310" href="#L2310">2310</a> assertTrue(isNumberChar('P'));
-<a class="jxr_linenumber" name="L2311" href="#L2311">2311</a> assertTrue(isNumberChar('a'));
-<a class="jxr_linenumber" name="L2312" href="#L2312">2312</a> assertTrue(isNumberChar('f'));
-<a class="jxr_linenumber" name="L2313" href="#L2313">2313</a> assertTrue(isNumberChar('A'));
-<a class="jxr_linenumber" name="L2314" href="#L2314">2314</a> assertTrue(isNumberChar('F'));
-<a class="jxr_linenumber" name="L2315" href="#L2315">2315</a>
-<a class="jxr_linenumber" name="L2316" href="#L2316">2316</a> <em class="jxr_comment">// Invalid number characters</em>
-<a class="jxr_linenumber" name="L2317" href="#L2317">2317</a> assertFalse(isNumberChar('g'));
-<a class="jxr_linenumber" name="L2318" href="#L2318">2318</a> assertFalse(isNumberChar('G'));
-<a class="jxr_linenumber" name="L2319" href="#L2319">2319</a> assertFalse(isNumberChar(' '));
-<a class="jxr_linenumber" name="L2320" href="#L2320">2320</a> assertFalse(isNumberChar('('));
-<a class="jxr_linenumber" name="L2321" href="#L2321">2321</a> }
-<a class="jxr_linenumber" name="L2322" href="#L2322">2322</a>
-<a class="jxr_linenumber" name="L2323" href="#L2323">2323</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2324" href="#L2324">2324</a> <em class="jxr_comment">// isNumeric(String)</em>
-<a class="jxr_linenumber" name="L2325" href="#L2325">2325</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2326" href="#L2326">2326</a> @Test
-<a class="jxr_linenumber" name="L2327" href="#L2327">2327</a> <strong class="jxr_keyword">void</strong> a96_isNumeric() {
-<a class="jxr_linenumber" name="L2328" href="#L2328">2328</a> <em class="jxr_comment">// Valid numeric strings</em>
-<a class="jxr_linenumber" name="L2329" href="#L2329">2329</a> assertTrue(isNumeric(<span class="jxr_string">"123"</span>));
-<a class="jxr_linenumber" name="L2330" href="#L2330">2330</a> assertTrue(isNumeric(<span class="jxr_string">"0x123"</span>));
-<a class="jxr_linenumber" name="L2331" href="#L2331">2331</a> assertTrue(isNumeric(<span class="jxr_string">"0.123"</span>));
-<a class="jxr_linenumber" name="L2332" href="#L2332">2332</a> assertTrue(isNumeric(<span class="jxr_string">"+123"</span>));
-<a class="jxr_linenumber" name="L2333" href="#L2333">2333</a> assertTrue(isNumeric(<span class="jxr_string">"-123"</span>));
-<a class="jxr_linenumber" name="L2334" href="#L2334">2334</a> assertTrue(isNumeric(<span class="jxr_string">"#123"</span>));
-<a class="jxr_linenumber" name="L2335" href="#L2335">2335</a> assertTrue(isNumeric(<span class="jxr_string">"0123"</span>));
-<a class="jxr_linenumber" name="L2336" href="#L2336">2336</a> assertTrue(isNumeric(<span class="jxr_string">"1.23"</span>));
-<a class="jxr_linenumber" name="L2337" href="#L2337">2337</a> assertTrue(isNumeric(<span class="jxr_string">"1e1"</span>));
-<a class="jxr_linenumber" name="L2338" href="#L2338">2338</a> <em class="jxr_comment">// Note: NaN and Infinity are floats, not numeric in the isNumeric sense</em>
-<a class="jxr_linenumber" name="L2339" href="#L2339">2339</a> <em class="jxr_comment">// isNumeric checks if it can be parsed by parseNumber, which doesn't handle NaN/Infinity</em>
-<a class="jxr_linenumber" name="L2340" href="#L2340">2340</a>
-<a class="jxr_linenumber" name="L2341" href="#L2341">2341</a> <em class="jxr_comment">// Invalid numeric strings</em>
-<a class="jxr_linenumber" name="L2342" href="#L2342">2342</a> assertFalse(isNumeric(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2343" href="#L2343">2343</a> assertFalse(isNumeric(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L2344" href="#L2344">2344</a> assertFalse(isNumeric(<span class="jxr_string">"x"</span>));
-<a class="jxr_linenumber" name="L2345" href="#L2345">2345</a> assertFalse(isNumeric(<span class="jxr_string">"x123"</span>));
-<a class="jxr_linenumber" name="L2346" href="#L2346">2346</a> assertFalse(isNumeric(<span class="jxr_string">"0x123x"</span>));
-<a class="jxr_linenumber" name="L2347" href="#L2347">2347</a> assertFalse(isNumeric(<span class="jxr_string">"0.123.4"</span>));
-<a class="jxr_linenumber" name="L2348" href="#L2348">2348</a> assertFalse(isNumeric(<span class="jxr_string">"abc"</span>));
-<a class="jxr_linenumber" name="L2349" href="#L2349">2349</a> assertFalse(isNumeric(<span class="jxr_string">"NaN"</span>));
-<a class="jxr_linenumber" name="L2350" href="#L2350">2350</a> assertFalse(isNumeric(<span class="jxr_string">"Infinity"</span>));
-<a class="jxr_linenumber" name="L2351" href="#L2351">2351</a> }
-<a class="jxr_linenumber" name="L2352" href="#L2352">2352</a>
-<a class="jxr_linenumber" name="L2353" href="#L2353">2353</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2354" href="#L2354">2354</a> <em class="jxr_comment">// isOneOf(String,String...)</em>
-<a class="jxr_linenumber" name="L2355" href="#L2355">2355</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2356" href="#L2356">2356</a> @Test
-<a class="jxr_linenumber" name="L2357" href="#L2357">2357</a> <strong class="jxr_keyword">void</strong> a97_isOneOf() {
-<a class="jxr_linenumber" name="L2358" href="#L2358">2358</a> assertTrue(isOneOf(<span class="jxr_string">"test"</span>, <span class="jxr_string">"test"</span>, <span class="jxr_string">"other"</span>));
-<a class="jxr_linenumber" name="L2359" href="#L2359">2359</a> assertTrue(isOneOf(<span class="jxr_string">"test"</span>, <span class="jxr_string">"other"</span>, <span class="jxr_string">"test"</span>));
-<a class="jxr_linenumber" name="L2360" href="#L2360">2360</a> assertTrue(isOneOf(<span class="jxr_string">"test"</span>, <span class="jxr_string">"test"</span>));
-<a class="jxr_linenumber" name="L2361" href="#L2361">2361</a> assertFalse(isOneOf(<span class="jxr_string">"test"</span>, <span class="jxr_string">"other"</span>, <span class="jxr_string">"another"</span>));
-<a class="jxr_linenumber" name="L2362" href="#L2362">2362</a> assertFalse(isOneOf(<span class="jxr_string">"test"</span>, <span class="jxr_string">"TEST"</span>)); <em class="jxr_comment">// Case sensitive</em>
-<a class="jxr_linenumber" name="L2363" href="#L2363">2363</a> assertTrue(isOneOf(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"test"</span>, <strong class="jxr_keyword">null</strong>, <span class="jxr_string">"other"</span>));
-<a class="jxr_linenumber" name="L2364" href="#L2364">2364</a> assertTrue(isOneOf(<span class="jxr_string">"test"</span>, <strong class="jxr_keyword">null</strong>, <span class="jxr_string">"test"</span>));
-<a class="jxr_linenumber" name="L2365" href="#L2365">2365</a> assertFalse(isOneOf(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"test"</span>, <span class="jxr_string">"other"</span>));
-<a class="jxr_linenumber" name="L2366" href="#L2366">2366</a> }
-<a class="jxr_linenumber" name="L2367" href="#L2367">2367</a>
-<a class="jxr_linenumber" name="L2368" href="#L2368">2368</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2369" href="#L2369">2369</a> <em class="jxr_comment">// isPhoneNumber(String)</em>
-<a class="jxr_linenumber" name="L2370" href="#L2370">2370</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2371" href="#L2371">2371</a> @Test
-<a class="jxr_linenumber" name="L2372" href="#L2372">2372</a> <strong class="jxr_keyword">void</strong> a98_isPhoneNumber() {
-<a class="jxr_linenumber" name="L2373" href="#L2373">2373</a> <em class="jxr_comment">// Valid phone numbers</em>
-<a class="jxr_linenumber" name="L2374" href="#L2374">2374</a> assertTrue(isPhoneNumber(<span class="jxr_string">"1234567890"</span>)); <em class="jxr_comment">// 10 digits</em>
-<a class="jxr_linenumber" name="L2375" href="#L2375">2375</a> assertTrue(isPhoneNumber(<span class="jxr_string">"12345678901"</span>)); <em class="jxr_comment">// 11 digits</em>
-<a class="jxr_linenumber" name="L2376" href="#L2376">2376</a> assertTrue(isPhoneNumber(<span class="jxr_string">"123456789012345"</span>)); <em class="jxr_comment">// 15 digits (max)</em>
-<a class="jxr_linenumber" name="L2377" href="#L2377">2377</a> assertTrue(isPhoneNumber(<span class="jxr_string">"(123) 456-7890"</span>));
-<a class="jxr_linenumber" name="L2378" href="#L2378">2378</a> assertTrue(isPhoneNumber(<span class="jxr_string">"123-456-7890"</span>));
-<a class="jxr_linenumber" name="L2379" href="#L2379">2379</a> assertTrue(isPhoneNumber(<span class="jxr_string">"123.456.7890"</span>));
-<a class="jxr_linenumber" name="L2380" href="#L2380">2380</a> assertTrue(isPhoneNumber(<span class="jxr_string">"123 456 7890"</span>));
-<a class="jxr_linenumber" name="L2381" href="#L2381">2381</a> assertTrue(isPhoneNumber(<span class="jxr_string">"+1 123-456-7890"</span>));
-<a class="jxr_linenumber" name="L2382" href="#L2382">2382</a> assertTrue(isPhoneNumber(<span class="jxr_string">"+44 20 1234 5678"</span>));
-<a class="jxr_linenumber" name="L2383" href="#L2383">2383</a> assertTrue(isPhoneNumber(<span class="jxr_string">"+1 (123) 456-7890"</span>));
-<a class="jxr_linenumber" name="L2384" href="#L2384">2384</a>
-<a class="jxr_linenumber" name="L2385" href="#L2385">2385</a> <em class="jxr_comment">// Invalid phone numbers</em>
-<a class="jxr_linenumber" name="L2386" href="#L2386">2386</a> assertFalse(isPhoneNumber(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2387" href="#L2387">2387</a> assertFalse(isPhoneNumber(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L2388" href="#L2388">2388</a> assertFalse(isPhoneNumber(<span class="jxr_string">" "</span>));
-<a class="jxr_linenumber" name="L2389" href="#L2389">2389</a> assertFalse(isPhoneNumber(<span class="jxr_string">"123"</span>));
-<a class="jxr_linenumber" name="L2390" href="#L2390">2390</a> assertFalse(isPhoneNumber(<span class="jxr_string">"12345"</span>));
-<a class="jxr_linenumber" name="L2391" href="#L2391">2391</a> assertFalse(isPhoneNumber(<span class="jxr_string">"abc1234567"</span>));
-<a class="jxr_linenumber" name="L2392" href="#L2392">2392</a> assertFalse(isPhoneNumber(<span class="jxr_string">"1234567890123456"</span>)); <em class="jxr_comment">// Too long (16 digits)</em>
-<a class="jxr_linenumber" name="L2393" href="#L2393">2393</a> }
-<a class="jxr_linenumber" name="L2394" href="#L2394">2394</a>
-<a class="jxr_linenumber" name="L2395" href="#L2395">2395</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2396" href="#L2396">2396</a> <em class="jxr_comment">// isSimilar(String,String,double)</em>
-<a class="jxr_linenumber" name="L2397" href="#L2397">2397</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2398" href="#L2398">2398</a> @Test
-<a class="jxr_linenumber" name="L2399" href="#L2399">2399</a> <strong class="jxr_keyword">void</strong> a99_isSimilar() {
-<a class="jxr_linenumber" name="L2400" href="#L2400">2400</a> assertTrue(isSimilar(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"hello"</span>, 0.8));
-<a class="jxr_linenumber" name="L2401" href="#L2401">2401</a> assertTrue(isSimilar(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"hello"</span>, 1.0));
-<a class="jxr_linenumber" name="L2402" href="#L2402">2402</a> assertFalse(isSimilar(<span class="jxr_string">"kitten"</span>, <span class="jxr_string">"sitting"</span>, 0.8));
-<a class="jxr_linenumber" name="L2403" href="#L2403">2403</a> assertTrue(isSimilar(<span class="jxr_string">"kitten"</span>, <span class="jxr_string">"sitting"</span>, 0.5));
-<a class="jxr_linenumber" name="L2404" href="#L2404">2404</a> assertFalse(isSimilar(<span class="jxr_string">"abc"</span>, <span class="jxr_string">"xyz"</span>, 0.5));
-<a class="jxr_linenumber" name="L2405" href="#L2405">2405</a> assertTrue(isSimilar(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"hallo"</span>, 0.8));
-<a class="jxr_linenumber" name="L2406" href="#L2406">2406</a> assertFalse(isSimilar(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"world"</span>, 0.8));
-<a class="jxr_linenumber" name="L2407" href="#L2407">2407</a> <em class="jxr_comment">// Null handling</em>
-<a class="jxr_linenumber" name="L2408" href="#L2408">2408</a> assertTrue(isSimilar(<strong class="jxr_keyword">null</strong>, <strong class="jxr_keyword">null</strong>, 0.8));
-<a class="jxr_linenumber" name="L2409" href="#L2409">2409</a> assertFalse(isSimilar(<span class="jxr_string">"hello"</span>, <strong class="jxr_keyword">null</strong>, 0.8));
-<a class="jxr_linenumber" name="L2410" href="#L2410">2410</a> assertFalse(isSimilar(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"hello"</span>, 0.8));
-<a class="jxr_linenumber" name="L2411" href="#L2411">2411</a> }
-<a class="jxr_linenumber" name="L2412" href="#L2412">2412</a>
-<a class="jxr_linenumber" name="L2413" href="#L2413">2413</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2414" href="#L2414">2414</a> <em class="jxr_comment">// isUri(String)</em>
-<a class="jxr_linenumber" name="L2415" href="#L2415">2415</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2416" href="#L2416">2416</a> @Test
-<a class="jxr_linenumber" name="L2417" href="#L2417">2417</a> <strong class="jxr_keyword">void</strong> a100_isUri() {
-<a class="jxr_linenumber" name="L2418" href="#L2418">2418</a> <em class="jxr_comment">// Valid URIs</em>
-<a class="jxr_linenumber" name="L2419" href="#L2419">2419</a> assertTrue(isUri(<span class="jxr_string">"http://example.com"</span>));
-<a class="jxr_linenumber" name="L2420" href="#L2420">2420</a> assertTrue(isUri(<span class="jxr_string">"https://example.com"</span>));
-<a class="jxr_linenumber" name="L2421" href="#L2421">2421</a> assertTrue(isUri(<span class="jxr_string">"ftp://server.com"</span>));
-<a class="jxr_linenumber" name="L2422" href="#L2422">2422</a> assertTrue(isUri(<span class="jxr_string">"file://path/to/file"</span>));
-<a class="jxr_linenumber" name="L2423" href="#L2423">2423</a> assertTrue(isUri(<span class="jxr_string">"ab://test"</span>));
-<a class="jxr_linenumber" name="L2424" href="#L2424">2424</a> assertTrue(isUri(<span class="jxr_string">"xyz://test"</span>));
-<a class="jxr_linenumber" name="L2425" href="#L2425">2425</a>
-<a class="jxr_linenumber" name="L2426" href="#L2426">2426</a> <em class="jxr_comment">// Invalid URIs</em>
-<a class="jxr_linenumber" name="L2427" href="#L2427">2427</a> assertFalse(isUri(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2428" href="#L2428">2428</a> assertFalse(isUri(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L2429" href="#L2429">2429</a> assertFalse(isUri(<span class="jxr_string">"x://x"</span>)); // Too <strong class="jxr_keyword">short</strong> (needs at least 2 chars)
-<a class="jxr_linenumber" name="L2430" href="#L2430">2430</a> assertFalse(isUri(<span class="jxr_string">"xX://x"</span>)); // Mixed <strong class="jxr_keyword">case</strong>
-<a class="jxr_linenumber" name="L2431" href="#L2431">2431</a> assertFalse(isUri(<span class="jxr_string">"x ://x"</span>)); // Space
-<a class="jxr_linenumber" name="L2432" href="#L2432">2432</a> assertFalse(isUri(<span class="jxr_string">"x: //x"</span>)); // Space after colon
-<a class="jxr_linenumber" name="L2433" href="#L2433">2433</a> assertFalse(isUri(<span class="jxr_string">"x:/x/x"</span>)); <em class="jxr_comment">// Only one slash</em>
-<a class="jxr_linenumber" name="L2434" href="#L2434">2434</a> assertFalse(isUri(<span class="jxr_string">"C:/temp"</span>)); <em class="jxr_comment">// Filesystem path (excluded)</em>
-<a class="jxr_linenumber" name="L2435" href="#L2435">2435</a> }
-<a class="jxr_linenumber" name="L2436" href="#L2436">2436</a>
-<a class="jxr_linenumber" name="L2437" href="#L2437">2437</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2438" href="#L2438">2438</a> <em class="jxr_comment">// isValidDateFormat(String,String)</em>
-<a class="jxr_linenumber" name="L2439" href="#L2439">2439</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2440" href="#L2440">2440</a> @Test
-<a class="jxr_linenumber" name="L2441" href="#L2441">2441</a> <strong class="jxr_keyword">void</strong> a101_isValidDateFormat() {
-<a class="jxr_linenumber" name="L2442" href="#L2442">2442</a> <em class="jxr_comment">// Valid dates</em>
-<a class="jxr_linenumber" name="L2443" href="#L2443">2443</a> assertTrue(isValidDateFormat(<span class="jxr_string">"2023-12-25"</span>, <span class="jxr_string">"yyyy-MM-dd"</span>));
-<a class="jxr_linenumber" name="L2444" href="#L2444">2444</a> assertTrue(isValidDateFormat(<span class="jxr_string">"25/12/2023"</span>, <span class="jxr_string">"dd/MM/yyyy"</span>));
-<a class="jxr_linenumber" name="L2445" href="#L2445">2445</a> assertTrue(isValidDateFormat(<span class="jxr_string">"12/25/2023"</span>, <span class="jxr_string">"MM/dd/yyyy"</span>));
-<a class="jxr_linenumber" name="L2446" href="#L2446">2446</a> assertTrue(isValidDateFormat(<span class="jxr_string">"2023-01-01"</span>, <span class="jxr_string">"yyyy-MM-dd"</span>));
-<a class="jxr_linenumber" name="L2447" href="#L2447">2447</a>
-<a class="jxr_linenumber" name="L2448" href="#L2448">2448</a> <em class="jxr_comment">// Invalid dates</em>
-<a class="jxr_linenumber" name="L2449" href="#L2449">2449</a> assertFalse(isValidDateFormat(<span class="jxr_string">"2023-13-25"</span>, <span class="jxr_string">"yyyy-MM-dd"</span>)); <em class="jxr_comment">// Invalid month</em>
-<a class="jxr_linenumber" name="L2450" href="#L2450">2450</a> assertFalse(isValidDateFormat(<span class="jxr_string">"2023-12-32"</span>, <span class="jxr_string">"yyyy-MM-dd"</span>)); <em class="jxr_comment">// Invalid day</em>
-<a class="jxr_linenumber" name="L2451" href="#L2451">2451</a> assertFalse(isValidDateFormat(<span class="jxr_string">"2023-12-25"</span>, <span class="jxr_string">"invalid"</span>)); <em class="jxr_comment">// Invalid format</em>
-<a class="jxr_linenumber" name="L2452" href="#L2452">2452</a> assertFalse(isValidDateFormat(<span class="jxr_string">"not-a-date"</span>, <span class="jxr_string">"yyyy-MM-dd"</span>)); <em class="jxr_comment">// Not a date</em>
-<a class="jxr_linenumber" name="L2453" href="#L2453">2453</a>
-<a class="jxr_linenumber" name="L2454" href="#L2454">2454</a> <em class="jxr_comment">// Null/empty input</em>
-<a class="jxr_linenumber" name="L2455" href="#L2455">2455</a> assertFalse(isValidDateFormat(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"yyyy-MM-dd"</span>));
-<a class="jxr_linenumber" name="L2456" href="#L2456">2456</a> assertFalse(isValidDateFormat(<span class="jxr_string">"2023-12-25"</span>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2457" href="#L2457">2457</a> assertFalse(isValidDateFormat(<span class="jxr_string">""</span>, <span class="jxr_string">"yyyy-MM-dd"</span>));
-<a class="jxr_linenumber" name="L2458" href="#L2458">2458</a> assertFalse(isValidDateFormat(<span class="jxr_string">"2023-12-25"</span>, <span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L2459" href="#L2459">2459</a> }
-<a class="jxr_linenumber" name="L2460" href="#L2460">2460</a>
-<a class="jxr_linenumber" name="L2461" href="#L2461">2461</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2462" href="#L2462">2462</a> <em class="jxr_comment">// isValidHostname(String)</em>
+<a class="jxr_linenumber" name="L1513" href="#L1513">1513</a> <em class="jxr_comment">// Line separator - %n is supported by printf-style formatting and replaced with line separator</em>
+<a class="jxr_linenumber" name="L1514" href="#L1514">1514</a> <em class="jxr_comment">// Note: format() returns pattern as-is when args.length == 0, so we need to pass at least one arg</em>
+<a class="jxr_linenumber" name="L1515" href="#L1515">1515</a> <em class="jxr_comment">// to trigger token processing. However, %n doesn't consume arguments, so we can pass any arg.</em>
+<a class="jxr_linenumber" name="L1516" href="#L1516">1516</a> <strong class="jxr_keyword">var</strong> lineSep = System.lineSeparator();
+<a class="jxr_linenumber" name="L1517" href="#L1517">1517</a> assertEquals(<span class="jxr_string">"Line 1"</span> + lineSep + <span class="jxr_string">"Line 2"</span>, format(<span class="jxr_string">"Line 1%nLine 2"</span>, <span class="jxr_string">"dummy"</span>));
+<a class="jxr_linenumber" name="L1518" href="#L1518">1518</a>
+<a class="jxr_linenumber" name="L1519" href="#L1519">1519</a> <em class="jxr_comment">// MessageFormat style</em>
+<a class="jxr_linenumber" name="L1520" href="#L1520">1520</a> assertEquals(<span class="jxr_string">"Hello John, you are 30 years old"</span>, format(<span class="jxr_string">"Hello {0}, you are {1} years old"</span>, <span class="jxr_string">"John"</span>, 30));
+<a class="jxr_linenumber" name="L1521" href="#L1521">1521</a> assertEquals(<span class="jxr_string">"Hello {0}"</span>, format(<span class="jxr_string">"Hello {0}"</span>)); <em class="jxr_comment">// No args</em>
+<a class="jxr_linenumber" name="L1522" href="#L1522">1522</a> assertEquals(<span class="jxr_string">"Hello {}"</span>, format(<span class="jxr_string">"Hello {}"</span>)); <em class="jxr_comment">// Unnumbered placeholder</em>
+<a class="jxr_linenumber" name="L1523" href="#L1523">1523</a> }
+<a class="jxr_linenumber" name="L1524" href="#L1524">1524</a>
+<a class="jxr_linenumber" name="L1525" href="#L1525">1525</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1526" href="#L1526">1526</a> <em class="jxr_comment">// formatNamed(String,Map<String,Object>)</em>
+<a class="jxr_linenumber" name="L1527" href="#L1527">1527</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1528" href="#L1528">1528</a> @Test
+<a class="jxr_linenumber" name="L1529" href="#L1529">1529</a> <strong class="jxr_keyword">void</strong> a59_formatNamed() {
+<a class="jxr_linenumber" name="L1530" href="#L1530">1530</a> <strong class="jxr_keyword">var</strong> args = <strong class="jxr_keyword">new</strong> HashMap<String,Object>();
+<a class="jxr_linenumber" name="L1531" href="#L1531">1531</a> args.put(<span class="jxr_string">"name"</span>, <span class="jxr_string">"John"</span>);
+<a class="jxr_linenumber" name="L1532" href="#L1532">1532</a> args.put(<span class="jxr_string">"age"</span>, 30);
+<a class="jxr_linenumber" name="L1533" href="#L1533">1533</a> args.put(<span class="jxr_string">"city"</span>, <span class="jxr_string">"New York"</span>);
+<a class="jxr_linenumber" name="L1534" href="#L1534">1534</a> assertEquals(<span class="jxr_string">"Hello John, you are 30 years old"</span>, formatNamed(<span class="jxr_string">"Hello {name}, you are {age} years old"</span>, args));
+<a class="jxr_linenumber" name="L1535" href="#L1535">1535</a> assertEquals(<span class="jxr_string">"Welcome to New York"</span>, formatNamed(<span class="jxr_string">"Welcome to {city}"</span>, args));
+<a class="jxr_linenumber" name="L1536" href="#L1536">1536</a> assertEquals(<span class="jxr_string">"Hello {unknown}"</span>, formatNamed(<span class="jxr_string">"Hello {unknown}"</span>, args)); <em class="jxr_comment">// Unknown placeholder kept</em>
+<a class="jxr_linenumber" name="L1537" href="#L1537">1537</a> assertEquals(<span class="jxr_string">"No placeholders"</span>, formatNamed(<span class="jxr_string">"No placeholders"</span>, args));
+<a class="jxr_linenumber" name="L1538" href="#L1538">1538</a> assertNull(formatNamed(<strong class="jxr_keyword">null</strong>, args));
+<a class="jxr_linenumber" name="L1539" href="#L1539">1539</a> assertEquals(<span class="jxr_string">"Template"</span>, formatNamed(<span class="jxr_string">"Template"</span>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L1540" href="#L1540">1540</a> assertEquals(<span class="jxr_string">"Template"</span>, formatNamed(<span class="jxr_string">"Template"</span>, <strong class="jxr_keyword">new</strong> HashMap<>()));
+<a class="jxr_linenumber" name="L1541" href="#L1541">1541</a> <em class="jxr_comment">// Test with null values</em>
+<a class="jxr_linenumber" name="L1542" href="#L1542">1542</a> <strong class="jxr_keyword">var</strong> argsWithNull = <strong class="jxr_keyword">new</strong> HashMap<String,Object>();
+<a class="jxr_linenumber" name="L1543" href="#L1543">1543</a> argsWithNull.put(<span class="jxr_string">"name"</span>, <span class="jxr_string">"John"</span>);
+<a class="jxr_linenumber" name="L1544" href="#L1544">1544</a> argsWithNull.put(<span class="jxr_string">"value"</span>, <strong class="jxr_keyword">null</strong>);
+<a class="jxr_linenumber" name="L1545" href="#L1545">1545</a> assertEquals(<span class="jxr_string">"Hello John, value: "</span>, formatNamed(<span class="jxr_string">"Hello {name}, value: {value}"</span>, argsWithNull));
+<a class="jxr_linenumber" name="L1546" href="#L1546">1546</a> }
+<a class="jxr_linenumber" name="L1547" href="#L1547">1547</a>
+<a class="jxr_linenumber" name="L1548" href="#L1548">1548</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1549" href="#L1549">1549</a> <em class="jxr_comment">// fromHex(String)</em>
+<a class="jxr_linenumber" name="L1550" href="#L1550">1550</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1551" href="#L1551">1551</a> @Test
+<a class="jxr_linenumber" name="L1552" href="#L1552">1552</a> <strong class="jxr_keyword">void</strong> a60_fromHex() {
+<a class="jxr_linenumber" name="L1553" href="#L1553">1553</a> <em class="jxr_comment">// Basic conversion</em>
+<a class="jxr_linenumber" name="L1554" href="#L1554">1554</a> <strong class="jxr_keyword">var</strong> bytes1 = fromHex(<span class="jxr_string">"48656C6C6F"</span>); <em class="jxr_comment">// "Hello" in hex</em>
+<a class="jxr_linenumber" name="L1555" href="#L1555">1555</a> assertEquals(5, bytes1.length);
+<a class="jxr_linenumber" name="L1556" href="#L1556">1556</a> assertEquals((byte)'H', bytes1[0]);
+<a class="jxr_linenumber" name="L1557" href="#L1557">1557</a> assertEquals((byte)'e', bytes1[1]);
+<a class="jxr_linenumber" name="L1558" href="#L1558">1558</a> assertEquals((byte)'l', bytes1[2]);
+<a class="jxr_linenumber" name="L1559" href="#L1559">1559</a> assertEquals((byte)'l', bytes1[3]);
+<a class="jxr_linenumber" name="L1560" href="#L1560">1560</a> assertEquals((byte)'o', bytes1[4]);
+<a class="jxr_linenumber" name="L1561" href="#L1561">1561</a>
+<a class="jxr_linenumber" name="L1562" href="#L1562">1562</a> <em class="jxr_comment">// Single byte</em>
+<a class="jxr_linenumber" name="L1563" href="#L1563">1563</a> <strong class="jxr_keyword">var</strong> bytes2 = fromHex(<span class="jxr_string">"FF"</span>);
+<a class="jxr_linenumber" name="L1564" href="#L1564">1564</a> assertEquals(1, bytes2.length);
+<a class="jxr_linenumber" name="L1565" href="#L1565">1565</a> assertEquals((byte)0xFF, bytes2[0]);
+<a class="jxr_linenumber" name="L1566" href="#L1566">1566</a>
+<a class="jxr_linenumber" name="L1567" href="#L1567">1567</a> <em class="jxr_comment">// Two bytes</em>
+<a class="jxr_linenumber" name="L1568" href="#L1568">1568</a> <strong class="jxr_keyword">var</strong> bytes3 = fromHex(<span class="jxr_string">"0102"</span>);
+<a class="jxr_linenumber" name="L1569" href="#L1569">1569</a> assertEquals(2, bytes3.length);
+<a class="jxr_linenumber" name="L1570" href="#L1570">1570</a> assertEquals((byte)0x01, bytes3[0]);
+<a class="jxr_linenumber" name="L1571" href="#L1571">1571</a> assertEquals((byte)0x02, bytes3[1]);
+<a class="jxr_linenumber" name="L1572" href="#L1572">1572</a>
+<a class="jxr_linenumber" name="L1573" href="#L1573">1573</a> <em class="jxr_comment">// Zero bytes</em>
+<a class="jxr_linenumber" name="L1574" href="#L1574">1574</a> <strong class="jxr_keyword">var</strong> bytes4 = fromHex(<span class="jxr_string">"0000"</span>);
+<a class="jxr_linenumber" name="L1575" href="#L1575">1575</a> assertEquals(2, bytes4.length);
+<a class="jxr_linenumber" name="L1576" href="#L1576">1576</a> assertEquals((byte)0x00, bytes4[0]);
+<a class="jxr_linenumber" name="L1577" href="#L1577">1577</a> assertEquals((byte)0x00, bytes4[1]);
+<a class="jxr_linenumber" name="L1578" href="#L1578">1578</a>
+<a class="jxr_linenumber" name="L1579" href="#L1579">1579</a> <em class="jxr_comment">// Empty string</em>
+<a class="jxr_linenumber" name="L1580" href="#L1580">1580</a> <strong class="jxr_keyword">var</strong> bytes5 = fromHex(<span class="jxr_string">""</span>);
+<a class="jxr_linenumber" name="L1581" href="#L1581">1581</a> assertEquals(0, bytes5.length);
+<a class="jxr_linenumber" name="L1582" href="#L1582">1582</a> }
+<a class="jxr_linenumber" name="L1583" href="#L1583">1583</a>
+<a class="jxr_linenumber" name="L1584" href="#L1584">1584</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1585" href="#L1585">1585</a> <em class="jxr_comment">// fromHexToUTF8(String)</em>
+<a class="jxr_linenumber" name="L1586" href="#L1586">1586</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1587" href="#L1587">1587</a> @Test
+<a class="jxr_linenumber" name="L1588" href="#L1588">1588</a> <strong class="jxr_keyword">void</strong> a61_fromHexToUTF8() {
+<a class="jxr_linenumber" name="L1589" href="#L1589">1589</a> <em class="jxr_comment">// Basic conversion</em>
+<a class="jxr_linenumber" name="L1590" href="#L1590">1590</a> assertEquals(<span class="jxr_string">"Hello"</span>, fromHexToUTF8(<span class="jxr_string">"48656C6C6F"</span>));
+<a class="jxr_linenumber" name="L1591" href="#L1591">1591</a> assertEquals(<span class="jxr_string">"World"</span>, fromHexToUTF8(<span class="jxr_string">"576F726C64"</span>));
+<a class="jxr_linenumber" name="L1592" href="#L1592">1592</a>
+<a class="jxr_linenumber" name="L1593" href="#L1593">1593</a> <em class="jxr_comment">// UTF-8 characters</em>
+<a class="jxr_linenumber" name="L1594" href="#L1594">1594</a> assertEquals(<span class="jxr_string">"test"</span>, fromHexToUTF8(<span class="jxr_string">"74657374"</span>));
+<a class="jxr_linenumber" name="L1595" href="#L1595">1595</a>
+<a class="jxr_linenumber" name="L1596" href="#L1596">1596</a> <em class="jxr_comment">// Empty string</em>
+<a class="jxr_linenumber" name="L1597" href="#L1597">1597</a> assertEquals(<span class="jxr_string">""</span>, fromHexToUTF8(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L1598" href="#L1598">1598</a> }
+<a class="jxr_linenumber" name="L1599" href="#L1599">1599</a>
+<a class="jxr_linenumber" name="L1600" href="#L1600">1600</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1601" href="#L1601">1601</a> <em class="jxr_comment">// fromSpacedHex(String)</em>
+<a class="jxr_linenumber" name="L1602" href="#L1602">1602</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1603" href="#L1603">1603</a> @Test
+<a class="jxr_linenumber" name="L1604" href="#L1604">1604</a> <strong class="jxr_keyword">void</strong> a62_fromSpacedHex() {
+<a class="jxr_linenumber" name="L1605" href="#L1605">1605</a> <em class="jxr_comment">// Basic conversion with spaces</em>
+<a class="jxr_linenumber" name="L1606" href="#L1606">1606</a> <strong class="jxr_keyword">var</strong> bytes1 = fromSpacedHex(<span class="jxr_string">"48 65 6C 6C 6F"</span>); <em class="jxr_comment">// "Hello" in hex with spaces</em>
+<a class="jxr_linenumber" name="L1607" href="#L1607">1607</a> assertEquals(5, bytes1.length);
+<a class="jxr_linenumber" name="L1608" href="#L1608">1608</a> assertEquals((byte)'H', bytes1[0]);
+<a class="jxr_linenumber" name="L1609" href="#L1609">1609</a> assertEquals((byte)'e', bytes1[1]);
+<a class="jxr_linenumber" name="L1610" href="#L1610">1610</a> assertEquals((byte)'l', bytes1[2]);
+<a class="jxr_linenumber" name="L1611" href="#L1611">1611</a> assertEquals((byte)'l', bytes1[3]);
+<a class="jxr_linenumber" name="L1612" href="#L1612">1612</a> assertEquals((byte)'o', bytes1[4]);
+<a class="jxr_linenumber" name="L1613" href="#L1613">1613</a>
+<a class="jxr_linenumber" name="L1614" href="#L1614">1614</a> <em class="jxr_comment">// Single byte</em>
+<a class="jxr_linenumber" name="L1615" href="#L1615">1615</a> <strong class="jxr_keyword">var</strong> bytes2 = fromSpacedHex(<span class="jxr_string">"FF"</span>);
+<a class="jxr_linenumber" name="L1616" href="#L1616">1616</a> assertEquals(1, bytes2.length);
+<a class="jxr_linenumber" name="L1617" href="#L1617">1617</a> assertEquals((byte)0xFF, bytes2[0]);
+<a class="jxr_linenumber" name="L1618" href="#L1618">1618</a>
+<a class="jxr_linenumber" name="L1619" href="#L1619">1619</a> <em class="jxr_comment">// Two bytes</em>
+<a class="jxr_linenumber" name="L1620" href="#L1620">1620</a> <strong class="jxr_keyword">var</strong> bytes3 = fromSpacedHex(<span class="jxr_string">"01 02"</span>);
+<a class="jxr_linenumber" name="L1621" href="#L1621">1621</a> assertEquals(2, bytes3.length);
+<a class="jxr_linenumber" name="L1622" href="#L1622">1622</a> assertEquals((byte)0x01, bytes3[0]);
+<a class="jxr_linenumber" name="L1623" href="#L1623">1623</a> assertEquals((byte)0x02, bytes3[1]);
+<a class="jxr_linenumber" name="L1624" href="#L1624">1624</a> }
+<a class="jxr_linenumber" name="L1625" href="#L1625">1625</a>
+<a class="jxr_linenumber" name="L1626" href="#L1626">1626</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1627" href="#L1627">1627</a> <em class="jxr_comment">// fromSpacedHexToUTF8(String)</em>
+<a class="jxr_linenumber" name="L1628" href="#L1628">1628</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1629" href="#L1629">1629</a> @Test
+<a class="jxr_linenumber" name="L1630" href="#L1630">1630</a> <strong class="jxr_keyword">void</strong> a63_fromSpacedHexToUTF8() {
+<a class="jxr_linenumber" name="L1631" href="#L1631">1631</a> <em class="jxr_comment">// Basic conversion with spaces</em>
+<a class="jxr_linenumber" name="L1632" href="#L1632">1632</a> assertEquals(<span class="jxr_string">"Hello"</span>, fromSpacedHexToUTF8(<span class="jxr_string">"48 65 6C 6C 6F"</span>));
+<a class="jxr_linenumber" name="L1633" href="#L1633">1633</a> assertEquals(<span class="jxr_string">"World"</span>, fromSpacedHexToUTF8(<span class="jxr_string">"57 6F 72 6C 64"</span>));
+<a class="jxr_linenumber" name="L1634" href="#L1634">1634</a>
+<a class="jxr_linenumber" name="L1635" href="#L1635">1635</a> <em class="jxr_comment">// UTF-8 characters</em>
+<a class="jxr_linenumber" name="L1636" href="#L1636">1636</a> assertEquals(<span class="jxr_string">"test"</span>, fromSpacedHexToUTF8(<span class="jxr_string">"74 65 73 74"</span>));
+<a class="jxr_linenumber" name="L1637" href="#L1637">1637</a>
+<a class="jxr_linenumber" name="L1638" href="#L1638">1638</a> <em class="jxr_comment">// Empty string</em>
+<a class="jxr_linenumber" name="L1639" href="#L1639">1639</a> assertEquals(<span class="jxr_string">""</span>, fromSpacedHexToUTF8(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L1640" href="#L1640">1640</a> }
+<a class="jxr_linenumber" name="L1641" href="#L1641">1641</a>
+<a class="jxr_linenumber" name="L1642" href="#L1642">1642</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1643" href="#L1643">1643</a> <em class="jxr_comment">// generateUUID()</em>
+<a class="jxr_linenumber" name="L1644" href="#L1644">1644</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1645" href="#L1645">1645</a> @Test
+<a class="jxr_linenumber" name="L1646" href="#L1646">1646</a> <strong class="jxr_keyword">void</strong> a64_generateUUID() {
+<a class="jxr_linenumber" name="L1647" href="#L1647">1647</a> <em class="jxr_comment">// Generate multiple UUIDs and verify format</em>
+<a class="jxr_linenumber" name="L1648" href="#L1648">1648</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < 10; i++) {
+<a class="jxr_linenumber" name="L1649" href="#L1649">1649</a> <strong class="jxr_keyword">var</strong> uuid = generateUUID();
+<a class="jxr_linenumber" name="L1650" href="#L1650">1650</a> assertNotNull(uuid);
+<a class="jxr_linenumber" name="L1651" href="#L1651">1651</a> <em class="jxr_comment">// Standard UUID format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (36 chars)</em>
+<a class="jxr_linenumber" name="L1652" href="#L1652">1652</a> assertEquals(36, uuid.length());
+<a class="jxr_linenumber" name="L1653" href="#L1653">1653</a> assertTrue(uuid.matches(<span class="jxr_string">"[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"</span>));
+<a class="jxr_linenumber" name="L1654" href="#L1654">1654</a> }
+<a class="jxr_linenumber" name="L1655" href="#L1655">1655</a> <em class="jxr_comment">// Verify uniqueness</em>
+<a class="jxr_linenumber" name="L1656" href="#L1656">1656</a> <strong class="jxr_keyword">var</strong> uuid1 = generateUUID();
+<a class="jxr_linenumber" name="L1657" href="#L1657">1657</a> <strong class="jxr_keyword">var</strong> uuid2 = generateUUID();
+<a class="jxr_linenumber" name="L1658" href="#L1658">1658</a> assertNotEquals(uuid1, uuid2);
+<a class="jxr_linenumber" name="L1659" href="#L1659">1659</a> }
+<a class="jxr_linenumber" name="L1660" href="#L1660">1660</a>
+<a class="jxr_linenumber" name="L1661" href="#L1661">1661</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1662" href="#L1662">1662</a> <em class="jxr_comment">// getAuthorityUri(String)</em>
+<a class="jxr_linenumber" name="L1663" href="#L1663">1663</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1664" href="#L1664">1664</a> @Test
+<a class="jxr_linenumber" name="L1665" href="#L1665">1665</a> <strong class="jxr_keyword">void</strong> a65_getAuthorityUri() {
+<a class="jxr_linenumber" name="L1666" href="#L1666">1666</a> assertEquals(<span class="jxr_string">"http://foo"</span>, getAuthorityUri(<span class="jxr_string">"http://foo"</span>));
+<a class="jxr_linenumber" name="L1667" href="#L1667">1667</a> assertEquals(<span class="jxr_string">"http://foo:123"</span>, getAuthorityUri(<span class="jxr_string">"http://foo:123"</span>));
+<a class="jxr_linenumber" name="L1668" href="#L1668">1668</a> assertEquals(<span class="jxr_string">"http://foo:123"</span>, getAuthorityUri(<span class="jxr_string">"http://foo:123/"</span>));
+<a class="jxr_linenumber" name="L1669" href="#L1669">1669</a> assertEquals(<span class="jxr_string">"http://foo:123"</span>, getAuthorityUri(<span class="jxr_string">"http://foo:123/bar"</span>));
+<a class="jxr_linenumber" name="L1670" href="#L1670">1670</a> assertEquals(<span class="jxr_string">"https://example.com"</span>, getAuthorityUri(<span class="jxr_string">"https://example.com/path/to/resource"</span>));
+<a class="jxr_linenumber" name="L1671" href="#L1671">1671</a> assertEquals(<span class="jxr_string">"ftp://server.com:21"</span>, getAuthorityUri(<span class="jxr_string">"ftp://server.com:21/files"</span>));
+<a class="jxr_linenumber" name="L1672" href="#L1672">1672</a> }
+<a class="jxr_linenumber" name="L1673" href="#L1673">1673</a>
+<a class="jxr_linenumber" name="L1674" href="#L1674">1674</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1675" href="#L1675">1675</a> <em class="jxr_comment">// getDuration(String)</em>
+<a class="jxr_linenumber" name="L1676" href="#L1676">1676</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1677" href="#L1677">1677</a> @Test
+<a class="jxr_linenumber" name="L1678" href="#L1678">1678</a> <strong class="jxr_keyword">void</strong> a66_getDuration() {
+<a class="jxr_linenumber" name="L1679" href="#L1679">1679</a> <em class="jxr_comment">// Basic tests</em>
+<a class="jxr_linenumber" name="L1680" href="#L1680">1680</a> assertEquals(-1, getDuration(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L1681" href="#L1681">1681</a> assertEquals(-1, getDuration(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L1682" href="#L1682">1682</a> assertEquals(-1, getDuration(<span class="jxr_string">" "</span>));
+<a class="jxr_linenumber" name="L1683" href="#L1683">1683</a> assertEquals(1, getDuration(<span class="jxr_string">"1"</span>));
+<a class="jxr_linenumber" name="L1684" href="#L1684">1684</a> assertEquals(10, getDuration(<span class="jxr_string">"10"</span>));
+<a class="jxr_linenumber" name="L1685" href="#L1685">1685</a>
+<a class="jxr_linenumber" name="L1686" href="#L1686">1686</a> <strong class="jxr_keyword">long</strong> s = 1000, m = s * 60, h = m * 60, d = h * 24, w = d * 7, mo = d * 30, y = d * 365;
+<a class="jxr_linenumber" name="L1687" href="#L1687">1687</a>
+<a class="jxr_linenumber" name="L1688" href="#L1688">1688</a> <em class="jxr_comment">// Basic time units</em>
+<a class="jxr_linenumber" name="L1689" href="#L1689">1689</a> assertEquals(10 * s, getDuration(<span class="jxr_string">"10s"</span>));
+<a class="jxr_linenumber" name="L1690" href="#L1690">1690</a> assertEquals(10 * s, getDuration(<span class="jxr_string">"10 s"</span>));
+<a class="jxr_linenumber" name="L1691" href="#L1691">1691</a> assertEquals(10 * s, getDuration(<span class="jxr_string">" 10 s "</span>));
+<a class="jxr_linenumber" name="L1692" href="#L1692">1692</a> assertEquals(10 * s, getDuration(<span class="jxr_string">"10sec"</span>));
+<a class="jxr_linenumber" name="L1693" href="#L1693">1693</a> assertEquals(10 * s, getDuration(<span class="jxr_string">"10 sec"</span>));
+<a class="jxr_linenumber" name="L1694" href="#L1694">1694</a> assertEquals(10 * s, getDuration(<span class="jxr_string">"10seconds"</span>));
+<a class="jxr_linenumber" name="L1695" href="#L1695">1695</a> assertEquals(10 * s, getDuration(<span class="jxr_string">"10S"</span>));
+<a class="jxr_linenumber" name="L1696" href="#L1696">1696</a>
+<a class="jxr_linenumber" name="L1697" href="#L1697">1697</a> assertEquals(10 * m, getDuration(<span class="jxr_string">"10m"</span>));
+<a class="jxr_linenumber" name="L1698" href="#L1698">1698</a> assertEquals(10 * m, getDuration(<span class="jxr_string">"10 m"</span>));
+<a class="jxr_linenumber" name="L1699" href="#L1699">1699</a> assertEquals(10 * m, getDuration(<span class="jxr_string">"10min"</span>));
+<a class="jxr_linenumber" name="L1700" href="#L1700">1700</a> assertEquals(10 * m, getDuration(<span class="jxr_string">"10 minutes"</span>));
+<a class="jxr_linenumber" name="L1701" href="#L1701">1701</a> assertEquals(10 * m, getDuration(<span class="jxr_string">"10M"</span>));
+<a class="jxr_linenumber" name="L1702" href="#L1702">1702</a>
+<a class="jxr_linenumber" name="L1703" href="#L1703">1703</a> assertEquals(10 * h, getDuration(<span class="jxr_string">"10h"</span>));
+<a class="jxr_linenumber" name="L1704" href="#L1704">1704</a> assertEquals(10 * h, getDuration(<span class="jxr_string">"10 h"</span>));
+<a class="jxr_linenumber" name="L1705" href="#L1705">1705</a> assertEquals(10 * h, getDuration(<span class="jxr_string">"10hour"</span>));
+<a class="jxr_linenumber" name="L1706" href="#L1706">1706</a> assertEquals(10 * h, getDuration(<span class="jxr_string">"10 hours"</span>));
+<a class="jxr_linenumber" name="L1707" href="#L1707">1707</a> assertEquals(10 * h, getDuration(<span class="jxr_string">"10H"</span>));
+<a class="jxr_linenumber" name="L1708" href="#L1708">1708</a>
+<a class="jxr_linenumber" name="L1709" href="#L1709">1709</a> assertEquals(10 * d, getDuration(<span class="jxr_string">"10d"</span>));
+<a class="jxr_linenumber" name="L1710" href="#L1710">1710</a> assertEquals(10 * d, getDuration(<span class="jxr_string">"10 d"</span>));
+<a class="jxr_linenumber" name="L1711" href="#L1711">1711</a> assertEquals(10 * d, getDuration(<span class="jxr_string">"10day"</span>));
+<a class="jxr_linenumber" name="L1712" href="#L1712">1712</a> assertEquals(10 * d, getDuration(<span class="jxr_string">"10 days"</span>));
+<a class="jxr_linenumber" name="L1713" href="#L1713">1713</a> assertEquals(10 * d, getDuration(<span class="jxr_string">"10D"</span>));
+<a class="jxr_linenumber" name="L1714" href="#L1714">1714</a>
+<a class="jxr_linenumber" name="L1715" href="#L1715">1715</a> assertEquals(10 * w, getDuration(<span class="jxr_string">"10w"</span>));
+<a class="jxr_linenumber" name="L1716" href="#L1716">1716</a> assertEquals(10 * w, getDuration(<span class="jxr_string">"10 w"</span>));
+<a class="jxr_linenumber" name="L1717" href="#L1717">1717</a> assertEquals(10 * w, getDuration(<span class="jxr_string">"10week"</span>));
+<a class="jxr_linenumber" name="L1718" href="#L1718">1718</a> assertEquals(10 * w, getDuration(<span class="jxr_string">"10 weeks"</span>));
+<a class="jxr_linenumber" name="L1719" href="#L1719">1719</a> assertEquals(10 * w, getDuration(<span class="jxr_string">"10W"</span>));
+<a class="jxr_linenumber" name="L1720" href="#L1720">1720</a>
+<a class="jxr_linenumber" name="L1721" href="#L1721">1721</a> <em class="jxr_comment">// Milliseconds</em>
+<a class="jxr_linenumber" name="L1722" href="#L1722">1722</a> assertEquals(100, getDuration(<span class="jxr_string">"100ms"</span>));
+<a class="jxr_linenumber" name="L1723" href="#L1723">1723</a> assertEquals(100, getDuration(<span class="jxr_string">"100 millis"</span>));
+<a class="jxr_linenumber" name="L1724" href="#L1724">1724</a> assertEquals(100, getDuration(<span class="jxr_string">"100 milliseconds"</span>));
+<a class="jxr_linenumber" name="L1725" href="#L1725">1725</a>
+<a class="jxr_linenumber" name="L1726" href="#L1726">1726</a> <em class="jxr_comment">// Decimal values</em>
+<a class="jxr_linenumber" name="L1727" href="#L1727">1727</a> assertEquals((<strong class="jxr_keyword">long</strong>)(1.5 * h), getDuration(<span class="jxr_string">"1.5h"</span>));
+<a class="jxr_linenumber" name="L1728" href="#L1728">1728</a> assertEquals((<strong class="jxr_keyword">long</strong>)(0.5 * m), getDuration(<span class="jxr_string">"0.5m"</span>));
+<a class="jxr_linenumber" name="L1729" href="#L1729">1729</a> assertEquals((<strong class="jxr_keyword">long</strong>)(2.5 * s), getDuration(<span class="jxr_string">"2.5s"</span>));
+<a class="jxr_linenumber" name="L1730" href="#L1730">1730</a> assertEquals((<strong class="jxr_keyword">long</strong>)(1.25 * d), getDuration(<span class="jxr_string">"1.25d"</span>));
+<a class="jxr_linenumber" name="L1731" href="#L1731">1731</a>
+<a class="jxr_linenumber" name="L1732" href="#L1732">1732</a> <em class="jxr_comment">// Combined formats</em>
+<a class="jxr_linenumber" name="L1733" href="#L1733">1733</a> assertEquals(1 * h + 30 * m, getDuration(<span class="jxr_string">"1h30m"</span>));
+<a class="jxr_linenumber" name="L1734" href="#L1734">1734</a> assertEquals(1 * h + 30 * m, getDuration(<span class="jxr_string">"1h 30m"</span>));
+<a class="jxr_linenumber" name="L1735" href="#L1735">1735</a> assertEquals(2 * d + 3 * h + 15 * m, getDuration(<span class="jxr_string">"2d3h15m"</span>));
+<a class="jxr_linenumber" name="L1736" href="#L1736">1736</a> assertEquals(1 * w + 2 * d + 3 * h, getDuration(<span class="jxr_string">"1w2d3h"</span>));
+<a class="jxr_linenumber" name="L1737" href="#L1737">1737</a>
+<a class="jxr_linenumber" name="L1738" href="#L1738">1738</a> <em class="jxr_comment">// Months</em>
+<a class="jxr_linenumber" name="L1739" href="#L1739">1739</a> assertEquals(1 * mo, getDuration(<span class="jxr_string">"1mo"</span>));
+<a class="jxr_linenumber" name="L1740" href="#L1740">1740</a> assertEquals(1 * mo, getDuration(<span class="jxr_string">"1 month"</span>));
+<a class="jxr_linenumber" name="L1741" href="#L1741">1741</a> assertEquals(2 * mo, getDuration(<span class="jxr_string">"2 months"</span>));
+<a class="jxr_linenumber" name="L1742" href="#L1742">1742</a> assertEquals(6 * mo, getDuration(<span class="jxr_string">"6mo"</span>));
+<a class="jxr_linenumber" name="L1743" href="#L1743">1743</a>
+<a class="jxr_linenumber" name="L1744" href="#L1744">1744</a> <em class="jxr_comment">// Years</em>
+<a class="jxr_linenumber" name="L1745" href="#L1745">1745</a> assertEquals(1 * y, getDuration(<span class="jxr_string">"1y"</span>));
+<a class="jxr_linenumber" name="L1746" href="#L1746">1746</a> assertEquals(1 * y, getDuration(<span class="jxr_string">"1yr"</span>));
+<a class="jxr_linenumber" name="L1747" href="#L1747">1747</a> assertEquals(1 * y, getDuration(<span class="jxr_string">"1 year"</span>));
+<a class="jxr_linenumber" name="L1748" href="#L1748">1748</a> assertEquals(2 * y, getDuration(<span class="jxr_string">"2 years"</span>));
+<a class="jxr_linenumber" name="L1749" href="#L1749">1749</a> assertEquals(10 * y, getDuration(<span class="jxr_string">"10y"</span>));
+<a class="jxr_linenumber" name="L1750" href="#L1750">1750</a>
+<a class="jxr_linenumber" name="L1751" href="#L1751">1751</a> <em class="jxr_comment">// Combined with months and years</em>
+<a class="jxr_linenumber" name="L1752" href="#L1752">1752</a> assertEquals(1 * y + 6 * mo, getDuration(<span class="jxr_string">"1y6mo"</span>));
+<a class="jxr_linenumber" name="L1753" href="#L1753">1753</a> assertEquals(2 * y + 3 * mo + 5 * d, getDuration(<span class="jxr_string">"2y3mo5d"</span>));
+<a class="jxr_linenumber" name="L1754" href="#L1754">1754</a> }
+<a class="jxr_linenumber" name="L1755" href="#L1755">1755</a>
+<a class="jxr_linenumber" name="L1756" href="#L1756">1756</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1757" href="#L1757">1757</a> <em class="jxr_comment">// getMatchPattern(String)</em>
+<a class="jxr_linenumber" name="L1758" href="#L1758">1758</a> <em class="jxr_comment">// getMatchPattern(String,int)</em>
+<a class="jxr_linenumber" name="L1759" href="#L1759">1759</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1760" href="#L1760">1760</a> @Test
+<a class="jxr_linenumber" name="L1761" href="#L1761">1761</a> <strong class="jxr_keyword">void</strong> a67_getMatchPattern() {
+<a class="jxr_linenumber" name="L1762" href="#L1762">1762</a> <em class="jxr_comment">// Basic pattern matching</em>
+<a class="jxr_linenumber" name="L1763" href="#L1763">1763</a> assertTrue(getMatchPattern(<span class="jxr_string">"a"</span>).matcher(<span class="jxr_string">"a"</span>).matches());
+<a class="jxr_linenumber" name="L1764" href="#L1764">1764</a> assertTrue(getMatchPattern(<span class="jxr_string">"*a*"</span>).matcher(<span class="jxr_string">"aaa"</span>).matches());
+<a class="jxr_linenumber" name="L1765" href="#L1765">1765</a> assertTrue(getMatchPattern(<span class="jxr_string">"*a*"</span>).matcher(<span class="jxr_string">"baa"</span>).matches());
+<a class="jxr_linenumber" name="L1766" href="#L1766">1766</a> assertTrue(getMatchPattern(<span class="jxr_string">"*a*"</span>).matcher(<span class="jxr_string">"aab"</span>).matches());
+<a class="jxr_linenumber" name="L1767" href="#L1767">1767</a> assertFalse(getMatchPattern(<span class="jxr_string">"*b*"</span>).matcher(<span class="jxr_string">"aaa"</span>).matches());
+<a class="jxr_linenumber" name="L1768" href="#L1768">1768</a>
+<a class="jxr_linenumber" name="L1769" href="#L1769">1769</a> <em class="jxr_comment">// Wildcard patterns</em>
+<a class="jxr_linenumber" name="L1770" href="#L1770">1770</a> assertTrue(getMatchPattern(<span class="jxr_string">"test*"</span>).matcher(<span class="jxr_string">"test123"</span>).matches());
+<a class="jxr_linenumber" name="L1771" href="#L1771">1771</a> assertTrue(getMatchPattern(<span class="jxr_string">"*test"</span>).matcher(<span class="jxr_string">"123test"</span>).matches());
+<a class="jxr_linenumber" name="L1772" href="#L1772">1772</a> assertTrue(getMatchPattern(<span class="jxr_string">"test*test"</span>).matcher(<span class="jxr_string">"test123test"</span>).matches());
+<a class="jxr_linenumber" name="L1773" href="#L1773">1773</a>
+<a class="jxr_linenumber" name="L1774" href="#L1774">1774</a> <em class="jxr_comment">// Question mark wildcard</em>
+<a class="jxr_linenumber" name="L1775" href="#L1775">1775</a> assertTrue(getMatchPattern(<span class="jxr_string">"test?"</span>).matcher(<span class="jxr_string">"test1"</span>).matches());
+<a class="jxr_linenumber" name="L1776" href="#L1776">1776</a> assertTrue(getMatchPattern(<span class="jxr_string">"?est"</span>).matcher(<span class="jxr_string">"test"</span>).matches());
+<a class="jxr_linenumber" name="L1777" href="#L1777">1777</a> assertFalse(getMatchPattern(<span class="jxr_string">"test?"</span>).matcher(<span class="jxr_string">"test12"</span>).matches());
+<a class="jxr_linenumber" name="L1778" href="#L1778">1778</a>
+<a class="jxr_linenumber" name="L1779" href="#L1779">1779</a> <em class="jxr_comment">// With flags</em>
+<a class="jxr_linenumber" name="L1780" href="#L1780">1780</a> <strong class="jxr_keyword">var</strong> pattern = getMatchPattern(<span class="jxr_string">"TEST*"</span>, java.util.regex.Pattern.CASE_INSENSITIVE);
+<a class="jxr_linenumber" name="L1781" href="#L1781">1781</a> assertTrue(pattern.matcher(<span class="jxr_string">"test123"</span>).matches());
+<a class="jxr_linenumber" name="L1782" href="#L1782">1782</a> assertTrue(pattern.matcher(<span class="jxr_string">"TEST123"</span>).matches());
+<a class="jxr_linenumber" name="L1783" href="#L1783">1783</a> }
+<a class="jxr_linenumber" name="L1784" href="#L1784">1784</a>
+<a class="jxr_linenumber" name="L1785" href="#L1785">1785</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1786" href="#L1786">1786</a> <em class="jxr_comment">// getNumberedLines(String)</em>
+<a class="jxr_linenumber" name="L1787" href="#L1787">1787</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1788" href="#L1788">1788</a> @Test
+<a class="jxr_linenumber" name="L1789" href="#L1789">1789</a> <strong class="jxr_keyword">void</strong> a68_getNumberedLines() {
+<a class="jxr_linenumber" name="L1790" href="#L1790">1790</a> assertNull(getNumberedLines(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L1791" href="#L1791">1791</a> assertEquals(<span class="jxr_string">"1: \n"</span>, getNumberedLines(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L1792" href="#L1792">1792</a> assertEquals(<span class="jxr_string">"1: foo\n"</span>, getNumberedLines(<span class="jxr_string">"foo"</span>));
+<a class="jxr_linenumber" name="L1793" href="#L1793">1793</a> assertEquals(<span class="jxr_string">"1: foo\n2: bar\n"</span>, getNumberedLines(<span class="jxr_string">"foo\nbar"</span>));
+<a class="jxr_linenumber" name="L1794" href="#L1794">1794</a> assertEquals(<span class="jxr_string">"1: line1\n2: line2\n3: line3\n"</span>, getNumberedLines(<span class="jxr_string">"line1\nline2\nline3"</span>));
+<a class="jxr_linenumber" name="L1795" href="#L1795">1795</a>
+<a class="jxr_linenumber" name="L1796" href="#L1796">1796</a> <em class="jxr_comment">// Test with different line endings</em>
+<a class="jxr_linenumber" name="L1797" href="#L1797">1797</a> assertEquals(<span class="jxr_string">"1: line1\n2: line2\n"</span>, getNumberedLines(<span class="jxr_string">"line1\r\nline2"</span>));
+<a class="jxr_linenumber" name="L1798" href="#L1798">1798</a> }
+<a class="jxr_linenumber" name="L1799" href="#L1799">1799</a>
+<a class="jxr_linenumber" name="L1800" href="#L1800">1800</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1801" href="#L1801">1801</a> <em class="jxr_comment">// getStringSize(String)</em>
+<a class="jxr_linenumber" name="L1802" href="#L1802">1802</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1803" href="#L1803">1803</a> @Test
+<a class="jxr_linenumber" name="L1804" href="#L1804">1804</a> <strong class="jxr_keyword">void</strong> a69_getStringSize() {
+<a class="jxr_linenumber" name="L1805" href="#L1805">1805</a> assertEquals(0, getStringSize(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L1806" href="#L1806">1806</a> assertEquals(40, getStringSize(<span class="jxr_string">""</span>)); <em class="jxr_comment">// 24 + 16 = 40 bytes overhead</em>
+<a class="jxr_linenumber" name="L1807" href="#L1807">1807</a> assertEquals(50, getStringSize(<span class="jxr_string">"hello"</span>)); <em class="jxr_comment">// 40 + (5 * 2) = 50 bytes</em>
+<a class="jxr_linenumber" name="L1808" href="#L1808">1808</a> assertEquals(48, getStringSize(<span class="jxr_string">"test"</span>)); <em class="jxr_comment">// 40 + (4 * 2) = 48 bytes</em>
+<a class="jxr_linenumber" name="L1809" href="#L1809">1809</a> assertEquals(60, getStringSize(<span class="jxr_string">"1234567890"</span>)); <em class="jxr_comment">// 40 + (10 * 2) = 60 bytes</em>
+<a class="jxr_linenumber" name="L1810" href="#L1810">1810</a>
+<a class="jxr_linenumber" name="L1811" href="#L1811">1811</a> <em class="jxr_comment">// Verify the calculation: 24 (String object) + 16 (char[] header) + (2 * length)</em>
+<a class="jxr_linenumber" name="L1812" href="#L1812">1812</a> <strong class="jxr_keyword">var</strong> emptySize = getStringSize(<span class="jxr_string">""</span>);
+<a class="jxr_linenumber" name="L1813" href="#L1813">1813</a> assertTrue(emptySize >= 24); <em class="jxr_comment">// At least String object overhead</em>
+<a class="jxr_linenumber" name="L1814" href="#L1814">1814</a>
+<a class="jxr_linenumber" name="L1815" href="#L1815">1815</a> <strong class="jxr_keyword">var</strong> oneCharSize = getStringSize(<span class="jxr_string">"a"</span>);
+<a class="jxr_linenumber" name="L1816" href="#L1816">1816</a> assertEquals(emptySize + 2, oneCharSize); <em class="jxr_comment">// One char adds 2 bytes</em>
+<a class="jxr_linenumber" name="L1817" href="#L1817">1817</a>
+<a class="jxr_linenumber" name="L1818" href="#L1818">1818</a> <strong class="jxr_keyword">var</strong> tenCharSize = getStringSize(<span class="jxr_string">"1234567890"</span>);
+<a class="jxr_linenumber" name="L1819" href="#L1819">1819</a> assertEquals(emptySize + 20, tenCharSize); <em class="jxr_comment">// Ten chars add 20 bytes</em>
+<a class="jxr_linenumber" name="L1820" href="#L1820">1820</a> }
+<a class="jxr_linenumber" name="L1821" href="#L1821">1821</a>
+<a class="jxr_linenumber" name="L1822" href="#L1822">1822</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1823" href="#L1823">1823</a> <em class="jxr_comment">// hasText(String)</em>
+<a class="jxr_linenumber" name="L1824" href="#L1824">1824</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1825" href="#L1825">1825</a> @Test
+<a class="jxr_linenumber" name="L1826" href="#L1826">1826</a> <strong class="jxr_keyword">void</strong> a70_hasText() {
+<a class="jxr_linenumber" name="L1827" href="#L1827">1827</a> assertFalse(hasText(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L1828" href="#L1828">1828</a> assertFalse(hasText(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L1829" href="#L1829">1829</a> assertFalse(hasText(<span class="jxr_string">" "</span>));
+<a class="jxr_linenumber" name="L1830" href="#L1830">1830</a> assertFalse(hasText(<span class="jxr_string">"\t\n"</span>));
+<a class="jxr_linenumber" name="L1831" href="#L1831">1831</a> assertTrue(hasText(<span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L1832" href="#L1832">1832</a> assertTrue(hasText(<span class="jxr_string">" hello "</span>));
+<a class="jxr_linenumber" name="L1833" href="#L1833">1833</a> assertTrue(hasText(<span class="jxr_string">"a"</span>));
+<a class="jxr_linenumber" name="L1834" href="#L1834">1834</a> assertTrue(hasText(<span class="jxr_string">" hello "</span>));
+<a class="jxr_linenumber" name="L1835" href="#L1835">1835</a> }
+<a class="jxr_linenumber" name="L1836" href="#L1836">1836</a>
+<a class="jxr_linenumber" name="L1837" href="#L1837">1837</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1838" href="#L1838">1838</a> <em class="jxr_comment">// indexOf(String,String)</em>
+<a class="jxr_linenumber" name="L1839" href="#L1839">1839</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1840" href="#L1840">1840</a> @Test
+<a class="jxr_linenumber" name="L1841" href="#L1841">1841</a> <strong class="jxr_keyword">void</strong> a71_indexOf() {
+<a class="jxr_linenumber" name="L1842" href="#L1842">1842</a> assertEquals(6, indexOf(<span class="jxr_string">"hello world"</span>, <span class="jxr_string">"world"</span>));
+<a class="jxr_linenumber" name="L1843" href="#L1843">1843</a> assertEquals(0, indexOf(<span class="jxr_string">"hello world"</span>, <span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L1844" href="#L1844">1844</a> assertEquals(2, indexOf(<span class="jxr_string">"hello world"</span>, <span class="jxr_string">"llo"</span>));
+<a class="jxr_linenumber" name="L1845" href="#L1845">1845</a> assertEquals(-1, indexOf(<span class="jxr_string">"hello world"</span>, <span class="jxr_string">"xyz"</span>));
+<a class="jxr_linenumber" name="L1846" href="#L1846">1846</a> assertEquals(-1, indexOf((String)<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"test"</span>));
+<a class="jxr_linenumber" name="L1847" href="#L1847">1847</a> assertEquals(-1, indexOf(<span class="jxr_string">"test"</span>, (String)<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L1848" href="#L1848">1848</a> assertEquals(-1, indexOf((String)<strong class="jxr_keyword">null</strong>, (String)<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L1849" href="#L1849">1849</a> assertEquals(0, indexOf(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L1850" href="#L1850">1850</a> assertEquals(-1, indexOf(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"hello world"</span>));
+<a class="jxr_linenumber" name="L1851" href="#L1851">1851</a> }
+<a class="jxr_linenumber" name="L1852" href="#L1852">1852</a>
+<a class="jxr_linenumber" name="L1853" href="#L1853">1853</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1854" href="#L1854">1854</a> <em class="jxr_comment">// indexOfIgnoreCase(String,String)</em>
+<a class="jxr_linenumber" name="L1855" href="#L1855">1855</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1856" href="#L1856">1856</a> @Test
+<a class="jxr_linenumber" name="L1857" href="#L1857">1857</a> <strong class="jxr_keyword">void</strong> a72_indexOfIgnoreCase() {
+<a class="jxr_linenumber" name="L1858" href="#L1858">1858</a> assertEquals(6, indexOfIgnoreCase(<span class="jxr_string">"Hello World"</span>, <span class="jxr_string">"world"</span>));
+<a class="jxr_linenumber" name="L1859" href="#L1859">1859</a> assertEquals(6, indexOfIgnoreCase(<span class="jxr_string">"Hello World"</span>, <span class="jxr_string">"WORLD"</span>));
+<a class="jxr_linenumber" name="L1860" href="#L1860">1860</a> assertEquals(0, indexOfIgnoreCase(<span class="jxr_string">"Hello World"</span>, <span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L1861" href="#L1861">1861</a> assertEquals(0, indexOfIgnoreCase(<span class="jxr_string">"Hello World"</span>, <span class="jxr_string">"HELLO"</span>));
+<a class="jxr_linenumber" name="L1862" href="#L1862">1862</a> assertEquals(2, indexOfIgnoreCase(<span class="jxr_string">"Hello World"</span>, <span class="jxr_string">"LLO"</span>));
+<a class="jxr_linenumber" name="L1863" href="#L1863">1863</a> assertEquals(-1, indexOfIgnoreCase(<span class="jxr_string">"Hello World"</span>, <span class="jxr_string">"xyz"</span>));
+<a class="jxr_linenumber" name="L1864" href="#L1864">1864</a> assertEquals(-1, indexOfIgnoreCase(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"test"</span>));
+<a class="jxr_linenumber" name="L1865" href="#L1865">1865</a> assertEquals(-1, indexOfIgnoreCase(<span class="jxr_string">"test"</span>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L1866" href="#L1866">1866</a> assertEquals(-1, indexOfIgnoreCase(<strong class="jxr_keyword">null</strong>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L1867" href="#L1867">1867</a> }
+<a class="jxr_linenumber" name="L1868" href="#L1868">1868</a>
+<a class="jxr_linenumber" name="L1869" href="#L1869">1869</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1870" href="#L1870">1870</a> <em class="jxr_comment">// intern(String)</em>
+<a class="jxr_linenumber" name="L1871" href="#L1871">1871</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1872" href="#L1872">1872</a> @Test
+<a class="jxr_linenumber" name="L1873" href="#L1873">1873</a> <strong class="jxr_keyword">void</strong> a73_intern() {
+<a class="jxr_linenumber" name="L1874" href="#L1874">1874</a> <em class="jxr_comment">// Test that intern returns the same reference for equal strings</em>
+<a class="jxr_linenumber" name="L1875" href="#L1875">1875</a> <strong class="jxr_keyword">var</strong> s1 = <strong class="jxr_keyword">new</strong> String(<span class="jxr_string">"test"</span>);
+<a class="jxr_linenumber" name="L1876" href="#L1876">1876</a> <strong class="jxr_keyword">var</strong> s2 = <strong class="jxr_keyword">new</strong> String(<span class="jxr_string">"test"</span>);
+<a class="jxr_linenumber" name="L1877" href="#L1877">1877</a> assertTrue(s1 != s2); <em class="jxr_comment">// Different objects</em>
+<a class="jxr_linenumber" name="L1878" href="#L1878">1878</a>
+<a class="jxr_linenumber" name="L1879" href="#L1879">1879</a> <strong class="jxr_keyword">var</strong> i1 = intern(s1);
+<a class="jxr_linenumber" name="L1880" href="#L1880">1880</a> <strong class="jxr_keyword">var</strong> i2 = intern(s2);
+<a class="jxr_linenumber" name="L1881" href="#L1881">1881</a> assertTrue(i1 == i2); <em class="jxr_comment">// Same interned object</em>
+<a class="jxr_linenumber" name="L1882" href="#L1882">1882</a>
+<a class="jxr_linenumber" name="L1883" href="#L1883">1883</a> <em class="jxr_comment">// Test null handling</em>
+<a class="jxr_linenumber" name="L1884" href="#L1884">1884</a> assertNull(intern(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L1885" href="#L1885">1885</a>
+<a class="jxr_linenumber" name="L1886" href="#L1886">1886</a> <em class="jxr_comment">// Test that interned string equals original</em>
+<a class="jxr_linenumber" name="L1887" href="#L1887">1887</a> assertEquals(<span class="jxr_string">"test"</span>, intern(<span class="jxr_string">"test"</span>));
+<a class="jxr_linenumber" name="L1888" href="#L1888">1888</a> }
+<a class="jxr_linenumber" name="L1889" href="#L1889">1889</a>
+<a class="jxr_linenumber" name="L1890" href="#L1890">1890</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1891" href="#L1891">1891</a> <em class="jxr_comment">// interpolate(String,Map<String,Object>)</em>
+<a class="jxr_linenumber" name="L1892" href="#L1892">1892</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1893" href="#L1893">1893</a> @Test
+<a class="jxr_linenumber" name="L1894" href="#L1894">1894</a> <strong class="jxr_keyword">void</strong> a74_interpolate() {
+<a class="jxr_linenumber" name="L1895" href="#L1895">1895</a> <strong class="jxr_keyword">var</strong> vars = <strong class="jxr_keyword">new</strong> HashMap<String,Object>();
+<a class="jxr_linenumber" name="L1896" href="#L1896">1896</a> vars.put(<span class="jxr_string">"name"</span>, <span class="jxr_string">"John"</span>);
+<a class="jxr_linenumber" name="L1897" href="#L1897">1897</a> vars.put(<span class="jxr_string">"age"</span>, 30);
+<a class="jxr_linenumber" name="L1898" href="#L1898">1898</a> vars.put(<span class="jxr_string">"city"</span>, <span class="jxr_string">"New York"</span>);
+<a class="jxr_linenumber" name="L1899" href="#L1899">1899</a>
+<a class="jxr_linenumber" name="L1900" href="#L1900">1900</a> assertEquals(<span class="jxr_string">"Hello John, you are 30 years old"</span>, interpolate(<span class="jxr_string">"Hello ${name}, you are ${age} years old"</span>, vars));
+<a class="jxr_linenumber" name="L1901" href="#L1901">1901</a> assertEquals(<span class="jxr_string">"Welcome to New York"</span>, interpolate(<span class="jxr_string">"Welcome to ${city}"</span>, vars));
+<a class="jxr_linenumber" name="L1902" href="#L1902">1902</a> assertEquals(<span class="jxr_string">"Hello ${unknown}"</span>, interpolate(<span class="jxr_string">"Hello ${unknown}"</span>, vars)); <em class="jxr_comment">// Unknown placeholder kept</em>
+<a class="jxr_linenumber" name="L1903" href="#L1903">1903</a> assertEquals(<span class="jxr_string">"No placeholders"</span>, interpolate(<span class="jxr_string">"No placeholders"</span>, vars));
+<a class="jxr_linenumber" name="L1904" href="#L1904">1904</a> assertNull(interpolate(<strong class="jxr_keyword">null</strong>, vars));
+<a class="jxr_linenumber" name="L1905" href="#L1905">1905</a> assertEquals(<span class="jxr_string">"Template"</span>, interpolate(<span class="jxr_string">"Template"</span>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L1906" href="#L1906">1906</a> assertEquals(<span class="jxr_string">"Template"</span>, interpolate(<span class="jxr_string">"Template"</span>, <strong class="jxr_keyword">new</strong> HashMap<>()));
+<a class="jxr_linenumber" name="L1907" href="#L1907">1907</a>
+<a class="jxr_linenumber" name="L1908" href="#L1908">1908</a> <em class="jxr_comment">// Test with null values</em>
+<a class="jxr_linenumber" name="L1909" href="#L1909">1909</a> <strong class="jxr_keyword">var</strong> varsWithNull = <strong class="jxr_keyword">new</strong> HashMap<String,Object>();
+<a class="jxr_linenumber" name="L1910" href="#L1910">1910</a> varsWithNull.put(<span class="jxr_string">"name"</span>, <span class="jxr_string">"John"</span>);
+<a class="jxr_linenumber" name="L1911" href="#L1911">1911</a> varsWithNull.put(<span class="jxr_string">"value"</span>, <strong class="jxr_keyword">null</strong>);
+<a class="jxr_linenumber" name="L1912" href="#L1912">1912</a> assertEquals(<span class="jxr_string">"Hello John, value: null"</span>, interpolate(<span class="jxr_string">"Hello ${name}, value: ${value}"</span>, varsWithNull));
+<a class="jxr_linenumber" name="L1913" href="#L1913">1913</a>
+<a class="jxr_linenumber" name="L1914" href="#L1914">1914</a> <em class="jxr_comment">// Test multiple variables</em>
+<a class="jxr_linenumber" name="L1915" href="#L1915">1915</a> assertEquals(<span class="jxr_string">"John is 30 and lives in New York"</span>, interpolate(<span class="jxr_string">"${name} is ${age} and lives in ${city}"</span>, vars));
+<a class="jxr_linenumber" name="L1916" href="#L1916">1916</a> }
+<a class="jxr_linenumber" name="L1917" href="#L1917">1917</a>
+<a class="jxr_linenumber" name="L1918" href="#L1918">1918</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1919" href="#L1919">1919</a> <em class="jxr_comment">// isAbsoluteUri(String)</em>
+<a class="jxr_linenumber" name="L1920" href="#L1920">1920</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1921" href="#L1921">1921</a> @Test
+<a class="jxr_linenumber" name="L1922" href="#L1922">1922</a> <strong class="jxr_keyword">void</strong> a75_isAbsoluteUri() {
+<a class="jxr_linenumber" name="L1923" href="#L1923">1923</a> assertFalse(isAbsoluteUri(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L1924" href="#L1924">1924</a> assertFalse(isAbsoluteUri(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L1925" href="#L1925">1925</a> assertTrue(isAbsoluteUri(<span class="jxr_string">"http://foo"</span>));
+<a class="jxr_linenumber" name="L1926" href="#L1926">1926</a> assertTrue(isAbsoluteUri(<span class="jxr_string">"x://x"</span>));
+<a class="jxr_linenumber" name="L1927" href="#L1927">1927</a> assertFalse(isAbsoluteUri(<span class="jxr_string">"xX://x"</span>));
+<a class="jxr_linenumber" name="L1928" href="#L1928">1928</a> assertFalse(isAbsoluteUri(<span class="jxr_string">"x ://x"</span>));
+<a class="jxr_linenumber" name="L1929" href="#L1929">1929</a> assertFalse(isAbsoluteUri(<span class="jxr_string">"x: //x"</span>));
+<a class="jxr_linenumber" name="L1930" href="#L1930">1930</a> assertFalse(isAbsoluteUri(<span class="jxr_string">"x:/ /x"</span>));
+<a class="jxr_linenumber" name="L1931" href="#L1931">1931</a> assertFalse(isAbsoluteUri(<span class="jxr_string">"x:x//x"</span>));
+<a class="jxr_linenumber" name="L1932" href="#L1932">1932</a> assertFalse(isAbsoluteUri(<span class="jxr_string">"x:/x/x"</span>));
+<a class="jxr_linenumber" name="L1933" href="#L1933">1933</a> assertTrue(isAbsoluteUri(<span class="jxr_string">"https://example.com"</span>));
+<a class="jxr_linenumber" name="L1934" href="#L1934">1934</a> assertTrue(isAbsoluteUri(<span class="jxr_string">"ftp://server.com"</span>));
+<a class="jxr_linenumber" name="L1935" href="#L1935">1935</a> }
+<a class="jxr_linenumber" name="L1936" href="#L1936">1936</a>
+<a class="jxr_linenumber" name="L1937" href="#L1937">1937</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1938" href="#L1938">1938</a> <em class="jxr_comment">// isAllNotBlank(CharSequence...)</em>
+<a class="jxr_linenumber" name="L1939" href="#L1939">1939</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1940" href="#L1940">1940</a> @Test
+<a class="jxr_linenumber" name="L1941" href="#L1941">1941</a> <strong class="jxr_keyword">void</strong> a76_isAllNotBlank() {
+<a class="jxr_linenumber" name="L1942" href="#L1942">1942</a> assertFalse(isAllNotBlank());
+<a class="jxr_linenumber" name="L1943" href="#L1943">1943</a> assertFalse(isAllNotBlank((String)<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L1944" href="#L1944">1944</a> assertFalse(isAllNotBlank(<strong class="jxr_keyword">null</strong>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L1945" href="#L1945">1945</a> assertFalse(isAllNotBlank(<span class="jxr_string">""</span>, <span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L1946" href="#L1946">1946</a> assertFalse(isAllNotBlank(<span class="jxr_string">" "</span>, <span class="jxr_string">" "</span>));
+<a class="jxr_linenumber" name="L1947" href="#L1947">1947</a> assertFalse(isAllNotBlank(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L1948" href="#L1948">1948</a> assertFalse(isAllNotBlank(<span class="jxr_string">""</span>, <span class="jxr_string">" "</span>));
+<a class="jxr_linenumber" name="L1949" href="#L1949">1949</a> assertFalse(isAllNotBlank(<span class="jxr_string">"hello"</span>, <span class="jxr_string">" "</span>));
+<a class="jxr_linenumber" name="L1950" href="#L1950">1950</a> assertTrue(isAllNotBlank(<span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L1951" href="#L1951">1951</a> assertTrue(isAllNotBlank(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"world"</span>));
+<a class="jxr_linenumber" name="L1952" href="#L1952">1952</a> assertTrue(isAllNotBlank(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"world"</span>, <span class="jxr_string">"test"</span>));
+<a class="jxr_linenumber" name="L1953" href="#L1953">1953</a> }
+<a class="jxr_linenumber" name="L1954" href="#L1954">1954</a>
+<a class="jxr_linenumber" name="L1955" href="#L1955">1955</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1956" href="#L1956">1956</a> <em class="jxr_comment">// isAllNotEmpty(CharSequence...)</em>
+<a class="jxr_linenumber" name="L1957" href="#L1957">1957</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1958" href="#L1958">1958</a> @Test
+<a class="jxr_linenumber" name="L1959" href="#L1959">1959</a> <strong class="jxr_keyword">void</strong> a77_isAllNotEmpty() {
+<a class="jxr_linenumber" name="L1960" href="#L1960">1960</a> assertFalse(isAllNotEmpty());
+<a class="jxr_linenumber" name="L1961" href="#L1961">1961</a> assertFalse(isAllNotEmpty((String)<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L1962" href="#L1962">1962</a> assertFalse(isAllNotEmpty(<strong class="jxr_keyword">null</strong>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L1963" href="#L1963">1963</a> assertFalse(isAllNotEmpty(<span class="jxr_string">""</span>, <span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L1964" href="#L1964">1964</a> assertFalse(isAllNotEmpty(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L1965" href="#L1965">1965</a> assertFalse(isAllNotEmpty(<span class="jxr_string">""</span>, <span class="jxr_string">" "</span>));
+<a class="jxr_linenumber" name="L1966" href="#L1966">1966</a> assertTrue(isAllNotEmpty(<span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L1967" href="#L1967">1967</a> assertTrue(isAllNotEmpty(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"world"</span>));
+<a class="jxr_linenumber" name="L1968" href="#L1968">1968</a> assertTrue(isAllNotEmpty(<span class="jxr_string">"hello"</span>, <span class="jxr_string">" "</span>)); <em class="jxr_comment">// Whitespace is not empty</em>
+<a class="jxr_linenumber" name="L1969" href="#L1969">1969</a> assertTrue(isAllNotEmpty(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"world"</span>, <span class="jxr_string">"test"</span>));
+<a class="jxr_linenumber" name="L1970" href="#L1970">1970</a> }
+<a class="jxr_linenumber" name="L1971" href="#L1971">1971</a>
+<a class="jxr_linenumber" name="L1972" href="#L1972">1972</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1973" href="#L1973">1973</a> <em class="jxr_comment">// isAlpha(String)</em>
+<a class="jxr_linenumber" name="L1974" href="#L1974">1974</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1975" href="#L1975">1975</a> @Test
+<a class="jxr_linenumber" name="L1976" href="#L1976">1976</a> <strong class="jxr_keyword">void</strong> a78_isAlpha() {
+<a class="jxr_linenumber" name="L1977" href="#L1977">1977</a> assertFalse(isAlpha(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L1978" href="#L1978">1978</a> assertFalse(isAlpha(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L1979" href="#L1979">1979</a> assertTrue(isAlpha(<span class="jxr_string">"abc"</span>));
+<a class="jxr_linenumber" name="L1980" href="#L1980">1980</a> assertTrue(isAlpha(<span class="jxr_string">"ABC"</span>));
+<a class="jxr_linenumber" name="L1981" href="#L1981">1981</a> assertTrue(isAlpha(<span class="jxr_string">"AbCdEf"</span>));
+<a class="jxr_linenumber" name="L1982" href="#L1982">1982</a> assertFalse(isAlpha(<span class="jxr_string">"abc123"</span>));
+<a class="jxr_linenumber" name="L1983" href="#L1983">1983</a> assertFalse(isAlpha(<span class="jxr_string">"abc def"</span>));
+<a class="jxr_linenumber" name="L1984" href="#L1984">1984</a> assertFalse(isAlpha(<span class="jxr_string">"abc-def"</span>));
+<a class="jxr_linenumber" name="L1985" href="#L1985">1985</a> assertFalse(isAlpha(<span class="jxr_string">"123"</span>));
+<a class="jxr_linenumber" name="L1986" href="#L1986">1986</a> assertTrue(isAlpha(<span class="jxr_string">"abcdefghijklmnopqrstuvwxyz"</span>));
+<a class="jxr_linenumber" name="L1987" href="#L1987">1987</a> assertTrue(isAlpha(<span class="jxr_string">"ABCDEFGHIJKLMNOPQRSTUVWXYZ"</span>));
+<a class="jxr_linenumber" name="L1988" href="#L1988">1988</a> }
+<a class="jxr_linenumber" name="L1989" href="#L1989">1989</a>
+<a class="jxr_linenumber" name="L1990" href="#L1990">1990</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1991" href="#L1991">1991</a> <em class="jxr_comment">// isAlphaNumeric(String)</em>
+<a class="jxr_linenumber" name="L1992" href="#L1992">1992</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L1993" href="#L1993">1993</a> @Test
+<a class="jxr_linenumber" name="L1994" href="#L1994">1994</a> <strong class="jxr_keyword">void</strong> a79_isAlphaNumeric() {
+<a class="jxr_linenumber" name="L1995" href="#L1995">1995</a> assertFalse(isAlphaNumeric(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L1996" href="#L1996">1996</a> assertFalse(isAlphaNumeric(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L1997" href="#L1997">1997</a> assertTrue(isAlphaNumeric(<span class="jxr_string">"abc"</span>));
+<a class="jxr_linenumber" name="L1998" href="#L1998">1998</a> assertTrue(isAlphaNumeric(<span class="jxr_string">"123"</span>));
+<a class="jxr_linenumber" name="L1999" href="#L1999">1999</a> assertTrue(isAlphaNumeric(<span class="jxr_string">"abc123"</span>));
+<a class="jxr_linenumber" name="L2000" href="#L2000">2000</a> assertTrue(isAlphaNumeric(<span class="jxr_string">"ABC123"</span>));
+<a class="jxr_linenumber" name="L2001" href="#L2001">2001</a> assertTrue(isAlphaNumeric(<span class="jxr_string">"a1b2c3"</span>));
+<a class="jxr_linenumber" name="L2002" href="#L2002">2002</a> assertFalse(isAlphaNumeric(<span class="jxr_string">"abc def"</span>));
+<a class="jxr_linenumber" name="L2003" href="#L2003">2003</a> assertFalse(isAlphaNumeric(<span class="jxr_string">"abc-123"</span>));
+<a class="jxr_linenumber" name="L2004" href="#L2004">2004</a> assertFalse(isAlphaNumeric(<span class="jxr_string">"abc_123"</span>));
+<a class="jxr_linenumber" name="L2005" href="#L2005">2005</a> assertFalse(isAlphaNumeric(<span class="jxr_string">"abc.123"</span>));
+<a class="jxr_linenumber" name="L2006" href="#L2006">2006</a> assertTrue(isAlphaNumeric(<span class="jxr_string">"abcdefghijklmnopqrstuvwxyz0123456789"</span>));
+<a class="jxr_linenumber" name="L2007" href="#L2007">2007</a> }
+<a class="jxr_linenumber" name="L2008" href="#L2008">2008</a>
+<a class="jxr_linenumber" name="L2009" href="#L2009">2009</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2010" href="#L2010">2010</a> <em class="jxr_comment">// isAnyNotBlank(CharSequence...)</em>
+<a class="jxr_linenumber" name="L2011" href="#L2011">2011</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2012" href="#L2012">2012</a> @Test
+<a class="jxr_linenumber" name="L2013" href="#L2013">2013</a> <strong class="jxr_keyword">void</strong> a80_isAnyNotBlank() {
+<a class="jxr_linenumber" name="L2014" href="#L2014">2014</a> assertFalse(isAnyNotBlank());
+<a class="jxr_linenumber" name="L2015" href="#L2015">2015</a> assertFalse(isAnyNotBlank((String)<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2016" href="#L2016">2016</a> assertFalse(isAnyNotBlank(<strong class="jxr_keyword">null</strong>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2017" href="#L2017">2017</a> assertFalse(isAnyNotBlank(<span class="jxr_string">""</span>, <span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L2018" href="#L2018">2018</a> assertFalse(isAnyNotBlank(<span class="jxr_string">" "</span>, <span class="jxr_string">" "</span>));
+<a class="jxr_linenumber" name="L2019" href="#L2019">2019</a> assertTrue(isAnyNotBlank(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L2020" href="#L2020">2020</a> assertTrue(isAnyNotBlank(<span class="jxr_string">""</span>, <span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L2021" href="#L2021">2021</a> assertTrue(isAnyNotBlank(<span class="jxr_string">" "</span>, <span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L2022" href="#L2022">2022</a> assertTrue(isAnyNotBlank(<span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L2023" href="#L2023">2023</a> assertTrue(isAnyNotBlank(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"world"</span>));
+<a class="jxr_linenumber" name="L2024" href="#L2024">2024</a> assertTrue(isAnyNotBlank(<span class="jxr_string">"hello"</span>, <strong class="jxr_keyword">null</strong>, <span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L2025" href="#L2025">2025</a> }
+<a class="jxr_linenumber" name="L2026" href="#L2026">2026</a>
+<a class="jxr_linenumber" name="L2027" href="#L2027">2027</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2028" href="#L2028">2028</a> <em class="jxr_comment">// isAnyNotEmpty(CharSequence...)</em>
+<a class="jxr_linenumber" name="L2029" href="#L2029">2029</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2030" href="#L2030">2030</a> @Test
+<a class="jxr_linenumber" name="L2031" href="#L2031">2031</a> <strong class="jxr_keyword">void</strong> a81_isAnyNotEmpty() {
+<a class="jxr_linenumber" name="L2032" href="#L2032">2032</a> assertFalse(isAnyNotEmpty());
+<a class="jxr_linenumber" name="L2033" href="#L2033">2033</a> assertFalse(isAnyNotEmpty((String)<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2034" href="#L2034">2034</a> assertFalse(isAnyNotEmpty(<strong class="jxr_keyword">null</strong>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2035" href="#L2035">2035</a> assertFalse(isAnyNotEmpty(<span class="jxr_string">""</span>, <span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L2036" href="#L2036">2036</a> assertTrue(isAnyNotEmpty(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L2037" href="#L2037">2037</a> assertTrue(isAnyNotEmpty(<span class="jxr_string">""</span>, <span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L2038" href="#L2038">2038</a> assertTrue(isAnyNotEmpty(<span class="jxr_string">" "</span>, <span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L2039" href="#L2039">2039</a> assertTrue(isAnyNotEmpty(<span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L2040" href="#L2040">2040</a> assertTrue(isAnyNotEmpty(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"world"</span>));
+<a class="jxr_linenumber" name="L2041" href="#L2041">2041</a> assertTrue(isAnyNotEmpty(<span class="jxr_string">"hello"</span>, <strong class="jxr_keyword">null</strong>, <span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L2042" href="#L2042">2042</a> }
+<a class="jxr_linenumber" name="L2043" href="#L2043">2043</a>
+<a class="jxr_linenumber" name="L2044" href="#L2044">2044</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2045" href="#L2045">2045</a> <em class="jxr_comment">// isBlank(CharSequence)</em>
+<a class="jxr_linenumber" name="L2046" href="#L2046">2046</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2047" href="#L2047">2047</a> @Test
+<a class="jxr_linenumber" name="L2048" href="#L2048">2048</a> <strong class="jxr_keyword">void</strong> a82_isBlank() {
+<a class="jxr_linenumber" name="L2049" href="#L2049">2049</a> assertTrue(isBlank(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2050" href="#L2050">2050</a> assertTrue(isBlank(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L2051" href="#L2051">2051</a> assertTrue(isBlank(<span class="jxr_string">" "</span>));
+<a class="jxr_linenumber" name="L2052" href="#L2052">2052</a> assertTrue(isBlank(<span class="jxr_string">"\t\n"</span>));
+<a class="jxr_linenumber" name="L2053" href="#L2053">2053</a> assertTrue(isBlank(<span class="jxr_string">"\r\n\t "</span>));
+<a class="jxr_linenumber" name="L2054" href="#L2054">2054</a> assertFalse(isBlank(<span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L2055" href="#L2055">2055</a> assertFalse(isBlank(<span class="jxr_string">" hello "</span>));
+<a class="jxr_linenumber" name="L2056" href="#L2056">2056</a> assertFalse(isBlank(<span class="jxr_string">"a"</span>));
+<a class="jxr_linenumber" name="L2057" href="#L2057">2057</a> }
+<a class="jxr_linenumber" name="L2058" href="#L2058">2058</a>
+<a class="jxr_linenumber" name="L2059" href="#L2059">2059</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2060" href="#L2060">2060</a> <em class="jxr_comment">// isCreditCard(String)</em>
+<a class="jxr_linenumber" name="L2061" href="#L2061">2061</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2062" href="#L2062">2062</a> @Test
+<a class="jxr_linenumber" name="L2063" href="#L2063">2063</a> <strong class="jxr_keyword">void</strong> a83_isCreditCard() {
+<a class="jxr_linenumber" name="L2064" href="#L2064">2064</a> <em class="jxr_comment">// Valid credit card numbers (test cards)</em>
+<a class="jxr_linenumber" name="L2065" href="#L2065">2065</a> assertTrue(isCreditCard(<span class="jxr_string">"4532015112830366"</span>)); <em class="jxr_comment">// Visa test card</em>
+<a class="jxr_linenumber" name="L2066" href="#L2066">2066</a> assertTrue(isCreditCard(<span class="jxr_string">"4532-0151-1283-0366"</span>)); <em class="jxr_comment">// With separators</em>
+<a class="jxr_linenumber" name="L2067" href="#L2067">2067</a> assertTrue(isCreditCard(<span class="jxr_string">"4532 0151 1283 0366"</span>)); <em class="jxr_comment">// With spaces</em>
+<a class="jxr_linenumber" name="L2068" href="#L2068">2068</a>
+<a class="jxr_linenumber" name="L2069" href="#L2069">2069</a> <em class="jxr_comment">// Invalid cases</em>
+<a class="jxr_linenumber" name="L2070" href="#L2070">2070</a> assertFalse(isCreditCard(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2071" href="#L2071">2071</a> assertFalse(isCreditCard(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L2072" href="#L2072">2072</a> assertFalse(isCreditCard(<span class="jxr_string">"1234567890"</span>)); <em class="jxr_comment">// Too short</em>
+<a class="jxr_linenumber" name="L2073" href="#L2073">2073</a> assertFalse(isCreditCard(<span class="jxr_string">"12345678901234567890"</span>)); <em class="jxr_comment">// Too long</em>
+<a class="jxr_linenumber" name="L2074" href="#L2074">2074</a> assertFalse(isCreditCard(<span class="jxr_string">"1234567890123"</span>)); <em class="jxr_comment">// Invalid Luhn</em>
+<a class="jxr_linenumber" name="L2075" href="#L2075">2075</a> assertFalse(isCreditCard(<span class="jxr_string">"abc1234567890"</span>)); <em class="jxr_comment">// Contains letters</em>
+<a class="jxr_linenumber" name="L2076" href="#L2076">2076</a> }
+<a class="jxr_linenumber" name="L2077" href="#L2077">2077</a>
+<a class="jxr_linenumber" name="L2078" href="#L2078">2078</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2079" href="#L2079">2079</a> <em class="jxr_comment">// isDecimal(String)</em>
+<a class="jxr_linenumber" name="L2080" href="#L2080">2080</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2081" href="#L2081">2081</a> @Test
+<a class="jxr_linenumber" name="L2082" href="#L2082">2082</a> <strong class="jxr_keyword">void</strong> a84_isDecimal() {
+<a class="jxr_linenumber" name="L2083" href="#L2083">2083</a> <strong class="jxr_keyword">var</strong> valid = a(<span class="jxr_string">"+1"</span>, <span class="jxr_string">"-1"</span>, <span class="jxr_string">"0x123"</span>, <span class="jxr_string">"0X123"</span>, <span class="jxr_string">"0xdef"</span>, <span class="jxr_string">"0XDEF"</span>, <span class="jxr_string">"#def"</span>, <span class="jxr_string">"#DEF"</span>, <span class="jxr_string">"0123"</span>, <span class="jxr_ [...]
+<a class="jxr_linenumber" name="L2084" href="#L2084">2084</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> s : valid)
+<a class="jxr_linenumber" name="L2085" href="#L2085">2085</a> assertTrue(isDecimal(s), <span class="jxr_string">"Should be valid: "</span> + s);
+<a class="jxr_linenumber" name="L2086" href="#L2086">2086</a>
+<a class="jxr_linenumber" name="L2087" href="#L2087">2087</a> <strong class="jxr_keyword">var</strong> invalid = a(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">""</span>, <span class="jxr_string">"a"</span>, <span class="jxr_string">"+"</span>, <span class="jxr_string">"-"</span>, <span class="jxr_string">"."</span>, <span class="jxr_string">"0xdeg"</span>, <span class="jxr_string">"0XDEG"</span>, <span class="jxr_string">"#deg"</span>, <span class="jxr_string">" [...]
+<a class="jxr_linenumber" name="L2088" href="#L2088">2088</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> s : invalid)
+<a class="jxr_linenumber" name="L2089" href="#L2089">2089</a> assertFalse(isDecimal(s), <span class="jxr_string">"Should be invalid: "</span> + s);
+<a class="jxr_linenumber" name="L2090" href="#L2090">2090</a> }
+<a class="jxr_linenumber" name="L2091" href="#L2091">2091</a>
+<a class="jxr_linenumber" name="L2092" href="#L2092">2092</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2093" href="#L2093">2093</a> <em class="jxr_comment">// isDigit(String)</em>
+<a class="jxr_linenumber" name="L2094" href="#L2094">2094</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2095" href="#L2095">2095</a> @Test
+<a class="jxr_linenumber" name="L2096" href="#L2096">2096</a> <strong class="jxr_keyword">void</strong> a85_isDigit() {
+<a class="jxr_linenumber" name="L2097" href="#L2097">2097</a> assertFalse(isDigit(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2098" href="#L2098">2098</a> assertFalse(isDigit(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L2099" href="#L2099">2099</a> assertTrue(isDigit(<span class="jxr_string">"123"</span>));
+<a class="jxr_linenumber" name="L2100" href="#L2100">2100</a> assertTrue(isDigit(<span class="jxr_string">"0"</span>));
+<a class="jxr_linenumber" name="L2101" href="#L2101">2101</a> assertTrue(isDigit(<span class="jxr_string">"999"</span>));
+<a class="jxr_linenumber" name="L2102" href="#L2102">2102</a> assertTrue(isDigit(<span class="jxr_string">"0123456789"</span>));
+<a class="jxr_linenumber" name="L2103" href="#L2103">2103</a> assertFalse(isDigit(<span class="jxr_string">"abc"</span>));
+<a class="jxr_linenumber" name="L2104" href="#L2104">2104</a> assertFalse(isDigit(<span class="jxr_string">"abc123"</span>));
+<a class="jxr_linenumber" name="L2105" href="#L2105">2105</a> assertFalse(isDigit(<span class="jxr_string">"12.3"</span>));
+<a class="jxr_linenumber" name="L2106" href="#L2106">2106</a> assertFalse(isDigit(<span class="jxr_string">"12-3"</span>));
+<a class="jxr_linenumber" name="L2107" href="#L2107">2107</a> assertFalse(isDigit(<span class="jxr_string">" 123"</span>));
+<a class="jxr_linenumber" name="L2108" href="#L2108">2108</a> assertFalse(isDigit(<span class="jxr_string">"123 "</span>));
+<a class="jxr_linenumber" name="L2109" href="#L2109">2109</a> }
+<a class="jxr_linenumber" name="L2110" href="#L2110">2110</a>
+<a class="jxr_linenumber" name="L2111" href="#L2111">2111</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2112" href="#L2112">2112</a> <em class="jxr_comment">// isEmail(String)</em>
+<a class="jxr_linenumber" name="L2113" href="#L2113">2113</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2114" href="#L2114">2114</a> @Test
+<a class="jxr_linenumber" name="L2115" href="#L2115">2115</a> <strong class="jxr_keyword">void</strong> a86_isEmail() {
+<a class="jxr_linenumber" name="L2116" href="#L2116">2116</a> <em class="jxr_comment">// Valid emails</em>
+<a class="jxr_linenumber" name="L2117" href="#L2117">2117</a> assertTrue(isEmail(<span class="jxr_string">"user@example.com"</span>));
+<a class="jxr_linenumber" name="L2118" href="#L2118">2118</a> assertTrue(isEmail(<span class="jxr_string">"test.email@example.com"</span>));
+<a class="jxr_linenumber" name="L2119" href="#L2119">2119</a> assertTrue(isEmail(<span class="jxr_string">"user+tag@example.com"</span>));
+<a class="jxr_linenumber" name="L2120" href="#L2120">2120</a> assertTrue(isEmail(<span class="jxr_string">"user_name@example.com"</span>));
+<a class="jxr_linenumber" name="L2121" href="#L2121">2121</a> assertTrue(isEmail(<span class="jxr_string">"user-name@example.com"</span>));
+<a class="jxr_linenumber" name="L2122" href="#L2122">2122</a> assertTrue(isEmail(<span class="jxr_string">"user123@example.com"</span>));
+<a class="jxr_linenumber" name="L2123" href="#L2123">2123</a> assertTrue(isEmail(<span class="jxr_string">"user@example.co.uk"</span>));
+<a class="jxr_linenumber" name="L2124" href="#L2124">2124</a> assertTrue(isEmail(<span class="jxr_string">"user@subdomain.example.com"</span>));
+<a class="jxr_linenumber" name="L2125" href="#L2125">2125</a> assertTrue(isEmail(<span class="jxr_string">"a@b.co"</span>));
+<a class="jxr_linenumber" name="L2126" href="#L2126">2126</a> assertTrue(isEmail(<span class="jxr_string">"user.name+tag+sorting@example.com"</span>));
+<a class="jxr_linenumber" name="L2127" href="#L2127">2127</a>
+<a class="jxr_linenumber" name="L2128" href="#L2128">2128</a> <em class="jxr_comment">// Invalid emails</em>
+<a class="jxr_linenumber" name="L2129" href="#L2129">2129</a> assertFalse(isEmail(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2130" href="#L2130">2130</a> assertFalse(isEmail(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L2131" href="#L2131">2131</a> assertFalse(isEmail(<span class="jxr_string">" "</span>));
+<a class="jxr_linenumber" name="L2132" href="#L2132">2132</a> assertFalse(isEmail(<span class="jxr_string">"invalid"</span>));
+<a class="jxr_linenumber" name="L2133" href="#L2133">2133</a> assertFalse(isEmail(<span class="jxr_string">"@example.com"</span>));
+<a class="jxr_linenumber" name="L2134" href="#L2134">2134</a> assertFalse(isEmail(<span class="jxr_string">"user@"</span>));
+<a class="jxr_linenumber" name="L2135" href="#L2135">2135</a> assertFalse(isEmail(<span class="jxr_string">"user@example"</span>));
+<a class="jxr_linenumber" name="L2136" href="#L2136">2136</a> assertFalse(isEmail(<span class="jxr_string">"user @example.com"</span>));
+<a class="jxr_linenumber" name="L2137" href="#L2137">2137</a> assertFalse(isEmail(<span class="jxr_string">"user@example .com"</span>));
+<a class="jxr_linenumber" name="L2138" href="#L2138">2138</a> }
+<a class="jxr_linenumber" name="L2139" href="#L2139">2139</a>
+<a class="jxr_linenumber" name="L2140" href="#L2140">2140</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2141" href="#L2141">2141</a> <em class="jxr_comment">// isEmpty(String)</em>
+<a class="jxr_linenumber" name="L2142" href="#L2142">2142</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2143" href="#L2143">2143</a> @Test
+<a class="jxr_linenumber" name="L2144" href="#L2144">2144</a> <strong class="jxr_keyword">void</strong> a87_isEmpty() {
+<a class="jxr_linenumber" name="L2145" href="#L2145">2145</a> assertTrue(StringUtils.isEmpty(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2146" href="#L2146">2146</a> assertTrue(StringUtils.isEmpty(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L2147" href="#L2147">2147</a> assertFalse(StringUtils.isEmpty(<span class="jxr_string">" "</span>));
+<a class="jxr_linenumber" name="L2148" href="#L2148">2148</a> assertFalse(StringUtils.isEmpty(<span class="jxr_string">"a"</span>));
+<a class="jxr_linenumber" name="L2149" href="#L2149">2149</a> assertFalse(StringUtils.isEmpty(<span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L2150" href="#L2150">2150</a> assertFalse(StringUtils.isEmpty(<span class="jxr_string">" "</span>));
+<a class="jxr_linenumber" name="L2151" href="#L2151">2151</a> }
+<a class="jxr_linenumber" name="L2152" href="#L2152">2152</a>
+<a class="jxr_linenumber" name="L2153" href="#L2153">2153</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2154" href="#L2154">2154</a> <em class="jxr_comment">// isFirstNumberChar(char)</em>
+<a class="jxr_linenumber" name="L2155" href="#L2155">2155</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2156" href="#L2156">2156</a> @Test
+<a class="jxr_linenumber" name="L2157" href="#L2157">2157</a> <strong class="jxr_keyword">void</strong> a88_isFirstNumberChar() {
+<a class="jxr_linenumber" name="L2158" href="#L2158">2158</a> <em class="jxr_comment">// Valid first number characters</em>
+<a class="jxr_linenumber" name="L2159" href="#L2159">2159</a> assertTrue(isFirstNumberChar('0'));
+<a class="jxr_linenumber" name="L2160" href="#L2160">2160</a> assertTrue(isFirstNumberChar('1'));
+<a class="jxr_linenumber" name="L2161" href="#L2161">2161</a> assertTrue(isFirstNumberChar('9'));
+<a class="jxr_linenumber" name="L2162" href="#L2162">2162</a> assertTrue(isFirstNumberChar('+'));
+<a class="jxr_linenumber" name="L2163" href="#L2163">2163</a> assertTrue(isFirstNumberChar('-'));
+<a class="jxr_linenumber" name="L2164" href="#L2164">2164</a> assertTrue(isFirstNumberChar('.'));
+<a class="jxr_linenumber" name="L2165" href="#L2165">2165</a> assertTrue(isFirstNumberChar('#'));
+<a class="jxr_linenumber" name="L2166" href="#L2166">2166</a>
+<a class="jxr_linenumber" name="L2167" href="#L2167">2167</a> <em class="jxr_comment">// Invalid first number characters</em>
+<a class="jxr_linenumber" name="L2168" href="#L2168">2168</a> assertFalse(isFirstNumberChar('a'));
+<a class="jxr_linenumber" name="L2169" href="#L2169">2169</a> assertFalse(isFirstNumberChar('x'));
+<a class="jxr_linenumber" name="L2170" href="#L2170">2170</a> assertFalse(isFirstNumberChar(' '));
+<a class="jxr_linenumber" name="L2171" href="#L2171">2171</a> assertFalse(isFirstNumberChar('('));
+<a class="jxr_linenumber" name="L2172" href="#L2172">2172</a> }
+<a class="jxr_linenumber" name="L2173" href="#L2173">2173</a>
+<a class="jxr_linenumber" name="L2174" href="#L2174">2174</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2175" href="#L2175">2175</a> <em class="jxr_comment">// isFloat(String)</em>
+<a class="jxr_linenumber" name="L2176" href="#L2176">2176</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2177" href="#L2177">2177</a> @Test
+<a class="jxr_linenumber" name="L2178" href="#L2178">2178</a> <strong class="jxr_keyword">void</strong> a89_isFloat() {
+<a class="jxr_linenumber" name="L2179" href="#L2179">2179</a> <strong class="jxr_keyword">var</strong> valid = a(<span class="jxr_string">"+1.0"</span>, <span class="jxr_string">"-1.0"</span>, <span class="jxr_string">".0"</span>, <span class="jxr_string">"NaN"</span>, <span class="jxr_string">"Infinity"</span>, <span class="jxr_string">"1e1"</span>, <span class="jxr_string">"-1e-1"</span>, <span class="jxr_string">"+1e+1"</span>, <span class="jxr_string">"-1.1e-1"</span>, <span class= [...]
+<a class="jxr_linenumber" name="L2180" href="#L2180">2180</a> <span class="jxr_string">"0.5"</span>, <span class="jxr_string">"123.456"</span>);
+<a class="jxr_linenumber" name="L2181" href="#L2181">2181</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> s : valid)
+<a class="jxr_linenumber" name="L2182" href="#L2182">2182</a> assertTrue(isFloat(s), <span class="jxr_string">"Should be valid: "</span> + s);
+<a class="jxr_linenumber" name="L2183" href="#L2183">2183</a>
+<a class="jxr_linenumber" name="L2184" href="#L2184">2184</a> <strong class="jxr_keyword">var</strong> invalid = a(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">""</span>, <span class="jxr_string">"a"</span>, <span class="jxr_string">"+"</span>, <span class="jxr_string">"-"</span>, <span class="jxr_string">"."</span>, <span class="jxr_string">"a"</span>, <span class="jxr_string">"+a"</span>, <span class="jxr_string">"11a"</span>);
+<a class="jxr_linenumber" name="L2185" href="#L2185">2185</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> s : invalid)
+<a class="jxr_linenumber" name="L2186" href="#L2186">2186</a> assertFalse(isFloat(s), <span class="jxr_string">"Should be invalid: "</span> + s);
+<a class="jxr_linenumber" name="L2187" href="#L2187">2187</a> }
+<a class="jxr_linenumber" name="L2188" href="#L2188">2188</a>
+<a class="jxr_linenumber" name="L2189" href="#L2189">2189</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2190" href="#L2190">2190</a> <em class="jxr_comment">// isInterned(String)</em>
+<a class="jxr_linenumber" name="L2191" href="#L2191">2191</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2192" href="#L2192">2192</a> @Test
+<a class="jxr_linenumber" name="L2193" href="#L2193">2193</a> <strong class="jxr_keyword">void</strong> a90_isInterned() {
+<a class="jxr_linenumber" name="L2194" href="#L2194">2194</a> assertFalse(isInterned(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2195" href="#L2195">2195</a>
+<a class="jxr_linenumber" name="L2196" href="#L2196">2196</a> <em class="jxr_comment">// String literals are automatically interned</em>
+<a class="jxr_linenumber" name="L2197" href="#L2197">2197</a> <strong class="jxr_keyword">var</strong> literal = <span class="jxr_string">"test"</span>;
+<a class="jxr_linenumber" name="L2198" href="#L2198">2198</a> assertTrue(isInterned(literal));
+<a class="jxr_linenumber" name="L2199" href="#L2199">2199</a>
+<a class="jxr_linenumber" name="L2200" href="#L2200">2200</a> <em class="jxr_comment">// New String objects are not interned</em>
+<a class="jxr_linenumber" name="L2201" href="#L2201">2201</a> <strong class="jxr_keyword">var</strong> s1 = <strong class="jxr_keyword">new</strong> String(<span class="jxr_string">"test"</span>);
+<a class="jxr_linenumber" name="L2202" href="#L2202">2202</a> assertFalse(isInterned(s1));
+<a class="jxr_linenumber" name="L2203" href="#L2203">2203</a>
+<a class="jxr_linenumber" name="L2204" href="#L2204">2204</a> <em class="jxr_comment">// After interning, it should be interned</em>
+<a class="jxr_linenumber" name="L2205" href="#L2205">2205</a> <strong class="jxr_keyword">var</strong> s2 = intern(s1);
+<a class="jxr_linenumber" name="L2206" href="#L2206">2206</a> assertTrue(isInterned(s2));
+<a class="jxr_linenumber" name="L2207" href="#L2207">2207</a> assertSame(s1.intern(), s2);
+<a class="jxr_linenumber" name="L2208" href="#L2208">2208</a> }
+<a class="jxr_linenumber" name="L2209" href="#L2209">2209</a>
+<a class="jxr_linenumber" name="L2210" href="#L2210">2210</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2211" href="#L2211">2211</a> <em class="jxr_comment">// isJson(String)</em>
+<a class="jxr_linenumber" name="L2212" href="#L2212">2212</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2213" href="#L2213">2213</a> @Test
+<a class="jxr_linenumber" name="L2214" href="#L2214">2214</a> <strong class="jxr_keyword">void</strong> a91_isJson() {
+<a class="jxr_linenumber" name="L2215" href="#L2215">2215</a> <em class="jxr_comment">// Valid JSON</em>
+<a class="jxr_linenumber" name="L2216" href="#L2216">2216</a> assertTrue(isJson(<span class="jxr_string">"{}"</span>));
+<a class="jxr_linenumber" name="L2217" href="#L2217">2217</a> assertTrue(isJson(<span class="jxr_string">"[]"</span>));
+<a class="jxr_linenumber" name="L2218" href="#L2218">2218</a> assertTrue(isJson(<span class="jxr_string">"'test'"</span>));
+<a class="jxr_linenumber" name="L2219" href="#L2219">2219</a> assertTrue(isJson(<span class="jxr_string">"true"</span>));
+<a class="jxr_linenumber" name="L2220" href="#L2220">2220</a> assertTrue(isJson(<span class="jxr_string">"false"</span>));
+<a class="jxr_linenumber" name="L2221" href="#L2221">2221</a> assertTrue(isJson(<span class="jxr_string">"null"</span>));
+<a class="jxr_linenumber" name="L2222" href="#L2222">2222</a> assertTrue(isJson(<span class="jxr_string">"123"</span>));
+<a class="jxr_linenumber" name="L2223" href="#L2223">2223</a> assertTrue(isJson(<span class="jxr_string">"123.45"</span>));
+<a class="jxr_linenumber" name="L2224" href="#L2224">2224</a> assertTrue(isJson(<span class="jxr_string">" {} "</span>)); <em class="jxr_comment">// With whitespace</em>
+<a class="jxr_linenumber" name="L2225" href="#L2225">2225</a> assertTrue(isJson(<span class="jxr_string">" [] "</span>)); <em class="jxr_comment">// With whitespace</em>
+<a class="jxr_linenumber" name="L2226" href="#L2226">2226</a>
+<a class="jxr_linenumber" name="L2227" href="#L2227">2227</a> <em class="jxr_comment">// Invalid JSON</em>
+<a class="jxr_linenumber" name="L2228" href="#L2228">2228</a> assertFalse(isJson(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2229" href="#L2229">2229</a> assertFalse(isJson(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L2230" href="#L2230">2230</a> assertFalse(isJson(<span class="jxr_string">"abc"</span>));
+<a class="jxr_linenumber" name="L2231" href="#L2231">2231</a> assertFalse(isJson(<span class="jxr_string">"{"</span>));
+<a class="jxr_linenumber" name="L2232" href="#L2232">2232</a> assertFalse(isJson(<span class="jxr_string">"}"</span>));
+<a class="jxr_linenumber" name="L2233" href="#L2233">2233</a> assertFalse(isJson(<span class="jxr_string">"["</span>));
+<a class="jxr_linenumber" name="L2234" href="#L2234">2234</a> assertFalse(isJson(<span class="jxr_string">"]"</span>));
+<a class="jxr_linenumber" name="L2235" href="#L2235">2235</a> }
+<a class="jxr_linenumber" name="L2236" href="#L2236">2236</a>
+<a class="jxr_linenumber" name="L2237" href="#L2237">2237</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2238" href="#L2238">2238</a> <em class="jxr_comment">// isJsonArray(Object,boolean)</em>
+<a class="jxr_linenumber" name="L2239" href="#L2239">2239</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2240" href="#L2240">2240</a> @Test
+<a class="jxr_linenumber" name="L2241" href="#L2241">2241</a> <strong class="jxr_keyword">void</strong> a92_isJsonArray() {
+<a class="jxr_linenumber" name="L2242" href="#L2242">2242</a> <em class="jxr_comment">// Valid JSON arrays</em>
+<a class="jxr_linenumber" name="L2243" href="#L2243">2243</a> assertTrue(isJsonArray(<span class="jxr_string">"[]"</span>, false));
+<a class="jxr_linenumber" name="L2244" href="#L2244">2244</a> assertTrue(isJsonArray(<span class="jxr_string">"[1,2,3]"</span>, false));
+<a class="jxr_linenumber" name="L2245" href="#L2245">2245</a> assertTrue(isJsonArray(<span class="jxr_string">" [1,2,3] "</span>, <strong class="jxr_keyword">true</strong>)); <em class="jxr_comment">// With whitespace</em>
+<a class="jxr_linenumber" name="L2246" href="#L2246">2246</a> assertTrue(isJsonArray(<span class="jxr_string">"/*comment*/ [1,2,3] /*comment*/"</span>, <strong class="jxr_keyword">true</strong>)); <em class="jxr_comment">// With comments</em>
+<a class="jxr_linenumber" name="L2247" href="#L2247">2247</a>
+<a class="jxr_linenumber" name="L2248" href="#L2248">2248</a> <em class="jxr_comment">// Invalid JSON arrays</em>
+<a class="jxr_linenumber" name="L2249" href="#L2249">2249</a> assertFalse(isJsonArray(<strong class="jxr_keyword">null</strong>, false));
+<a class="jxr_linenumber" name="L2250" href="#L2250">2250</a> assertFalse(isJsonArray(<span class="jxr_string">""</span>, false));
+<a class="jxr_linenumber" name="L2251" href="#L2251">2251</a> assertFalse(isJsonArray(<span class="jxr_string">"{}"</span>, false));
+<a class="jxr_linenumber" name="L2252" href="#L2252">2252</a> assertFalse(isJsonArray(<span class="jxr_string">"123"</span>, false));
+<a class="jxr_linenumber" name="L2253" href="#L2253">2253</a> assertFalse(isJsonArray(<span class="jxr_string">"["</span>, false));
+<a class="jxr_linenumber" name="L2254" href="#L2254">2254</a> assertFalse(isJsonArray(<span class="jxr_string">"]"</span>, false));
+<a class="jxr_linenumber" name="L2255" href="#L2255">2255</a> }
+<a class="jxr_linenumber" name="L2256" href="#L2256">2256</a>
+<a class="jxr_linenumber" name="L2257" href="#L2257">2257</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2258" href="#L2258">2258</a> <em class="jxr_comment">// isJsonObject(Object,boolean)</em>
+<a class="jxr_linenumber" name="L2259" href="#L2259">2259</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2260" href="#L2260">2260</a> @Test
+<a class="jxr_linenumber" name="L2261" href="#L2261">2261</a> <strong class="jxr_keyword">void</strong> a93_isJsonObject() {
+<a class="jxr_linenumber" name="L2262" href="#L2262">2262</a> <em class="jxr_comment">// Valid JSON objects</em>
+<a class="jxr_linenumber" name="L2263" href="#L2263">2263</a> assertTrue(isJsonObject(<span class="jxr_string">"{foo:'bar'}"</span>, <strong class="jxr_keyword">true</strong>));
+<a class="jxr_linenumber" name="L2264" href="#L2264">2264</a> assertTrue(isJsonObject(<span class="jxr_string">" { foo:'bar' } "</span>, <strong class="jxr_keyword">true</strong>));
+<a class="jxr_linenumber" name="L2265" href="#L2265">2265</a> assertTrue(isJsonObject(<span class="jxr_string">"/*foo*/ { foo:'bar' } /*foo*/"</span>, <strong class="jxr_keyword">true</strong>));
+<a class="jxr_linenumber" name="L2266" href="#L2266">2266</a> assertTrue(isJsonObject(<span class="jxr_string">"{}"</span>, false));
+<a class="jxr_linenumber" name="L2267" href="#L2267">2267</a> assertTrue(isJsonObject(<span class="jxr_string">"{'key':'value'}"</span>, false));
+<a class="jxr_linenumber" name="L2268" href="#L2268">2268</a>
+<a class="jxr_linenumber" name="L2269" href="#L2269">2269</a> <em class="jxr_comment">// Invalid JSON objects</em>
+<a class="jxr_linenumber" name="L2270" href="#L2270">2270</a> assertFalse(isJsonObject(<strong class="jxr_keyword">null</strong>, false));
+<a class="jxr_linenumber" name="L2271" href="#L2271">2271</a> assertFalse(isJsonObject(<span class="jxr_string">""</span>, false));
+<a class="jxr_linenumber" name="L2272" href="#L2272">2272</a> assertFalse(isJsonObject(<span class="jxr_string">" { foo:'bar' "</span>, <strong class="jxr_keyword">true</strong>));
+<a class="jxr_linenumber" name="L2273" href="#L2273">2273</a> assertFalse(isJsonObject(<span class="jxr_string">" foo:'bar' } "</span>, <strong class="jxr_keyword">true</strong>));
+<a class="jxr_linenumber" name="L2274" href="#L2274">2274</a> assertFalse(isJsonObject(<span class="jxr_string">"[]"</span>, false));
+<a class="jxr_linenumber" name="L2275" href="#L2275">2275</a> assertFalse(isJsonObject(<span class="jxr_string">"123"</span>, false));
+<a class="jxr_linenumber" name="L2276" href="#L2276">2276</a> }
+<a class="jxr_linenumber" name="L2277" href="#L2277">2277</a>
+<a class="jxr_linenumber" name="L2278" href="#L2278">2278</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2279" href="#L2279">2279</a> <em class="jxr_comment">// isNotBlank(CharSequence)</em>
+<a class="jxr_linenumber" name="L2280" href="#L2280">2280</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2281" href="#L2281">2281</a> @Test
+<a class="jxr_linenumber" name="L2282" href="#L2282">2282</a> <strong class="jxr_keyword">void</strong> a94_isNotBlank() {
+<a class="jxr_linenumber" name="L2283" href="#L2283">2283</a> assertFalse(isNotBlank(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2284" href="#L2284">2284</a> assertFalse(isNotBlank(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L2285" href="#L2285">2285</a> assertFalse(isNotBlank(<span class="jxr_string">" "</span>));
+<a class="jxr_linenumber" name="L2286" href="#L2286">2286</a> assertFalse(isNotBlank(<span class="jxr_string">"\t\n"</span>));
+<a class="jxr_linenumber" name="L2287" href="#L2287">2287</a> assertFalse(isNotBlank(<span class="jxr_string">"\r\n\t "</span>));
+<a class="jxr_linenumber" name="L2288" href="#L2288">2288</a> assertTrue(isNotBlank(<span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L2289" href="#L2289">2289</a> assertTrue(isNotBlank(<span class="jxr_string">" hello "</span>));
+<a class="jxr_linenumber" name="L2290" href="#L2290">2290</a> assertTrue(isNotBlank(<span class="jxr_string">"a"</span>));
+<a class="jxr_linenumber" name="L2291" href="#L2291">2291</a> }
+<a class="jxr_linenumber" name="L2292" href="#L2292">2292</a>
+<a class="jxr_linenumber" name="L2293" href="#L2293">2293</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2294" href="#L2294">2294</a> <em class="jxr_comment">// isNumberChar(char)</em>
+<a class="jxr_linenumber" name="L2295" href="#L2295">2295</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2296" href="#L2296">2296</a> @Test
+<a class="jxr_linenumber" name="L2297" href="#L2297">2297</a> <strong class="jxr_keyword">void</strong> a95_isNumberChar() {
+<a class="jxr_linenumber" name="L2298" href="#L2298">2298</a> <em class="jxr_comment">// Valid number characters</em>
+<a class="jxr_linenumber" name="L2299" href="#L2299">2299</a> assertTrue(isNumberChar('0'));
+<a class="jxr_linenumber" name="L2300" href="#L2300">2300</a> assertTrue(isNumberChar('1'));
+<a class="jxr_linenumber" name="L2301" href="#L2301">2301</a> assertTrue(isNumberChar('9'));
+<a class="jxr_linenumber" name="L2302" href="#L2302">2302</a> assertTrue(isNumberChar('+'));
+<a class="jxr_linenumber" name="L2303" href="#L2303">2303</a> assertTrue(isNumberChar('-'));
+<a class="jxr_linenumber" name="L2304" href="#L2304">2304</a> assertTrue(isNumberChar('.'));
+<a class="jxr_linenumber" name="L2305" href="#L2305">2305</a> assertTrue(isNumberChar('x'));
+<a class="jxr_linenumber" name="L2306" href="#L2306">2306</a> assertTrue(isNumberChar('X'));
+<a class="jxr_linenumber" name="L2307" href="#L2307">2307</a> assertTrue(isNumberChar('#'));
+<a class="jxr_linenumber" name="L2308" href="#L2308">2308</a> assertTrue(isNumberChar('p'));
+<a class="jxr_linenumber" name="L2309" href="#L2309">2309</a> assertTrue(isNumberChar('P'));
+<a class="jxr_linenumber" name="L2310" href="#L2310">2310</a> assertTrue(isNumberChar('a'));
+<a class="jxr_linenumber" name="L2311" href="#L2311">2311</a> assertTrue(isNumberChar('f'));
+<a class="jxr_linenumber" name="L2312" href="#L2312">2312</a> assertTrue(isNumberChar('A'));
+<a class="jxr_linenumber" name="L2313" href="#L2313">2313</a> assertTrue(isNumberChar('F'));
+<a class="jxr_linenumber" name="L2314" href="#L2314">2314</a>
+<a class="jxr_linenumber" name="L2315" href="#L2315">2315</a> <em class="jxr_comment">// Invalid number characters</em>
+<a class="jxr_linenumber" name="L2316" href="#L2316">2316</a> assertFalse(isNumberChar('g'));
+<a class="jxr_linenumber" name="L2317" href="#L2317">2317</a> assertFalse(isNumberChar('G'));
+<a class="jxr_linenumber" name="L2318" href="#L2318">2318</a> assertFalse(isNumberChar(' '));
+<a class="jxr_linenumber" name="L2319" href="#L2319">2319</a> assertFalse(isNumberChar('('));
+<a class="jxr_linenumber" name="L2320" href="#L2320">2320</a> }
+<a class="jxr_linenumber" name="L2321" href="#L2321">2321</a>
+<a class="jxr_linenumber" name="L2322" href="#L2322">2322</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2323" href="#L2323">2323</a> <em class="jxr_comment">// isNumeric(String)</em>
+<a class="jxr_linenumber" name="L2324" href="#L2324">2324</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2325" href="#L2325">2325</a> @Test
+<a class="jxr_linenumber" name="L2326" href="#L2326">2326</a> <strong class="jxr_keyword">void</strong> a96_isNumeric() {
+<a class="jxr_linenumber" name="L2327" href="#L2327">2327</a> <em class="jxr_comment">// Valid numeric strings</em>
+<a class="jxr_linenumber" name="L2328" href="#L2328">2328</a> assertTrue(isNumeric(<span class="jxr_string">"123"</span>));
+<a class="jxr_linenumber" name="L2329" href="#L2329">2329</a> assertTrue(isNumeric(<span class="jxr_string">"0x123"</span>));
+<a class="jxr_linenumber" name="L2330" href="#L2330">2330</a> assertTrue(isNumeric(<span class="jxr_string">"0.123"</span>));
+<a class="jxr_linenumber" name="L2331" href="#L2331">2331</a> assertTrue(isNumeric(<span class="jxr_string">"+123"</span>));
+<a class="jxr_linenumber" name="L2332" href="#L2332">2332</a> assertTrue(isNumeric(<span class="jxr_string">"-123"</span>));
+<a class="jxr_linenumber" name="L2333" href="#L2333">2333</a> assertTrue(isNumeric(<span class="jxr_string">"#123"</span>));
+<a class="jxr_linenumber" name="L2334" href="#L2334">2334</a> assertTrue(isNumeric(<span class="jxr_string">"0123"</span>));
+<a class="jxr_linenumber" name="L2335" href="#L2335">2335</a> assertTrue(isNumeric(<span class="jxr_string">"1.23"</span>));
+<a class="jxr_linenumber" name="L2336" href="#L2336">2336</a> assertTrue(isNumeric(<span class="jxr_string">"1e1"</span>));
+<a class="jxr_linenumber" name="L2337" href="#L2337">2337</a> <em class="jxr_comment">// Note: NaN and Infinity are floats, not numeric in the isNumeric sense</em>
+<a class="jxr_linenumber" name="L2338" href="#L2338">2338</a> <em class="jxr_comment">// isNumeric checks if it can be parsed by parseNumber, which doesn't handle NaN/Infinity</em>
+<a class="jxr_linenumber" name="L2339" href="#L2339">2339</a>
+<a class="jxr_linenumber" name="L2340" href="#L2340">2340</a> <em class="jxr_comment">// Invalid numeric strings</em>
+<a class="jxr_linenumber" name="L2341" href="#L2341">2341</a> assertFalse(isNumeric(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2342" href="#L2342">2342</a> assertFalse(isNumeric(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L2343" href="#L2343">2343</a> assertFalse(isNumeric(<span class="jxr_string">"x"</span>));
+<a class="jxr_linenumber" name="L2344" href="#L2344">2344</a> assertFalse(isNumeric(<span class="jxr_string">"x123"</span>));
+<a class="jxr_linenumber" name="L2345" href="#L2345">2345</a> assertFalse(isNumeric(<span class="jxr_string">"0x123x"</span>));
+<a class="jxr_linenumber" name="L2346" href="#L2346">2346</a> assertFalse(isNumeric(<span class="jxr_string">"0.123.4"</span>));
+<a class="jxr_linenumber" name="L2347" href="#L2347">2347</a> assertFalse(isNumeric(<span class="jxr_string">"abc"</span>));
+<a class="jxr_linenumber" name="L2348" href="#L2348">2348</a> assertFalse(isNumeric(<span class="jxr_string">"NaN"</span>));
+<a class="jxr_linenumber" name="L2349" href="#L2349">2349</a> assertFalse(isNumeric(<span class="jxr_string">"Infinity"</span>));
+<a class="jxr_linenumber" name="L2350" href="#L2350">2350</a> }
+<a class="jxr_linenumber" name="L2351" href="#L2351">2351</a>
+<a class="jxr_linenumber" name="L2352" href="#L2352">2352</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2353" href="#L2353">2353</a> <em class="jxr_comment">// isOneOf(String,String...)</em>
+<a class="jxr_linenumber" name="L2354" href="#L2354">2354</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2355" href="#L2355">2355</a> @Test
+<a class="jxr_linenumber" name="L2356" href="#L2356">2356</a> <strong class="jxr_keyword">void</strong> a97_isOneOf() {
+<a class="jxr_linenumber" name="L2357" href="#L2357">2357</a> assertTrue(isOneOf(<span class="jxr_string">"test"</span>, <span class="jxr_string">"test"</span>, <span class="jxr_string">"other"</span>));
+<a class="jxr_linenumber" name="L2358" href="#L2358">2358</a> assertTrue(isOneOf(<span class="jxr_string">"test"</span>, <span class="jxr_string">"other"</span>, <span class="jxr_string">"test"</span>));
+<a class="jxr_linenumber" name="L2359" href="#L2359">2359</a> assertTrue(isOneOf(<span class="jxr_string">"test"</span>, <span class="jxr_string">"test"</span>));
+<a class="jxr_linenumber" name="L2360" href="#L2360">2360</a> assertFalse(isOneOf(<span class="jxr_string">"test"</span>, <span class="jxr_string">"other"</span>, <span class="jxr_string">"another"</span>));
+<a class="jxr_linenumber" name="L2361" href="#L2361">2361</a> assertFalse(isOneOf(<span class="jxr_string">"test"</span>, <span class="jxr_string">"TEST"</span>)); <em class="jxr_comment">// Case sensitive</em>
+<a class="jxr_linenumber" name="L2362" href="#L2362">2362</a> assertTrue(isOneOf(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"test"</span>, <strong class="jxr_keyword">null</strong>, <span class="jxr_string">"other"</span>));
+<a class="jxr_linenumber" name="L2363" href="#L2363">2363</a> assertTrue(isOneOf(<span class="jxr_string">"test"</span>, <strong class="jxr_keyword">null</strong>, <span class="jxr_string">"test"</span>));
+<a class="jxr_linenumber" name="L2364" href="#L2364">2364</a> assertFalse(isOneOf(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"test"</span>, <span class="jxr_string">"other"</span>));
+<a class="jxr_linenumber" name="L2365" href="#L2365">2365</a> }
+<a class="jxr_linenumber" name="L2366" href="#L2366">2366</a>
+<a class="jxr_linenumber" name="L2367" href="#L2367">2367</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2368" href="#L2368">2368</a> <em class="jxr_comment">// isPhoneNumber(String)</em>
+<a class="jxr_linenumber" name="L2369" href="#L2369">2369</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2370" href="#L2370">2370</a> @Test
+<a class="jxr_linenumber" name="L2371" href="#L2371">2371</a> <strong class="jxr_keyword">void</strong> a98_isPhoneNumber() {
+<a class="jxr_linenumber" name="L2372" href="#L2372">2372</a> <em class="jxr_comment">// Valid phone numbers</em>
+<a class="jxr_linenumber" name="L2373" href="#L2373">2373</a> assertTrue(isPhoneNumber(<span class="jxr_string">"1234567890"</span>)); <em class="jxr_comment">// 10 digits</em>
+<a class="jxr_linenumber" name="L2374" href="#L2374">2374</a> assertTrue(isPhoneNumber(<span class="jxr_string">"12345678901"</span>)); <em class="jxr_comment">// 11 digits</em>
+<a class="jxr_linenumber" name="L2375" href="#L2375">2375</a> assertTrue(isPhoneNumber(<span class="jxr_string">"123456789012345"</span>)); <em class="jxr_comment">// 15 digits (max)</em>
+<a class="jxr_linenumber" name="L2376" href="#L2376">2376</a> assertTrue(isPhoneNumber(<span class="jxr_string">"(123) 456-7890"</span>));
+<a class="jxr_linenumber" name="L2377" href="#L2377">2377</a> assertTrue(isPhoneNumber(<span class="jxr_string">"123-456-7890"</span>));
+<a class="jxr_linenumber" name="L2378" href="#L2378">2378</a> assertTrue(isPhoneNumber(<span class="jxr_string">"123.456.7890"</span>));
+<a class="jxr_linenumber" name="L2379" href="#L2379">2379</a> assertTrue(isPhoneNumber(<span class="jxr_string">"123 456 7890"</span>));
+<a class="jxr_linenumber" name="L2380" href="#L2380">2380</a> assertTrue(isPhoneNumber(<span class="jxr_string">"+1 123-456-7890"</span>));
+<a class="jxr_linenumber" name="L2381" href="#L2381">2381</a> assertTrue(isPhoneNumber(<span class="jxr_string">"+44 20 1234 5678"</span>));
+<a class="jxr_linenumber" name="L2382" href="#L2382">2382</a> assertTrue(isPhoneNumber(<span class="jxr_string">"+1 (123) 456-7890"</span>));
+<a class="jxr_linenumber" name="L2383" href="#L2383">2383</a>
+<a class="jxr_linenumber" name="L2384" href="#L2384">2384</a> <em class="jxr_comment">// Invalid phone numbers</em>
+<a class="jxr_linenumber" name="L2385" href="#L2385">2385</a> assertFalse(isPhoneNumber(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2386" href="#L2386">2386</a> assertFalse(isPhoneNumber(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L2387" href="#L2387">2387</a> assertFalse(isPhoneNumber(<span class="jxr_string">" "</span>));
+<a class="jxr_linenumber" name="L2388" href="#L2388">2388</a> assertFalse(isPhoneNumber(<span class="jxr_string">"123"</span>));
+<a class="jxr_linenumber" name="L2389" href="#L2389">2389</a> assertFalse(isPhoneNumber(<span class="jxr_string">"12345"</span>));
+<a class="jxr_linenumber" name="L2390" href="#L2390">2390</a> assertFalse(isPhoneNumber(<span class="jxr_string">"abc1234567"</span>));
+<a class="jxr_linenumber" name="L2391" href="#L2391">2391</a> assertFalse(isPhoneNumber(<span class="jxr_string">"1234567890123456"</span>)); <em class="jxr_comment">// Too long (16 digits)</em>
+<a class="jxr_linenumber" name="L2392" href="#L2392">2392</a> }
+<a class="jxr_linenumber" name="L2393" href="#L2393">2393</a>
+<a class="jxr_linenumber" name="L2394" href="#L2394">2394</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2395" href="#L2395">2395</a> <em class="jxr_comment">// isSimilar(String,String,double)</em>
+<a class="jxr_linenumber" name="L2396" href="#L2396">2396</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2397" href="#L2397">2397</a> @Test
+<a class="jxr_linenumber" name="L2398" href="#L2398">2398</a> <strong class="jxr_keyword">void</strong> a99_isSimilar() {
+<a class="jxr_linenumber" name="L2399" href="#L2399">2399</a> assertTrue(isSimilar(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"hello"</span>, 0.8));
+<a class="jxr_linenumber" name="L2400" href="#L2400">2400</a> assertTrue(isSimilar(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"hello"</span>, 1.0));
+<a class="jxr_linenumber" name="L2401" href="#L2401">2401</a> assertFalse(isSimilar(<span class="jxr_string">"kitten"</span>, <span class="jxr_string">"sitting"</span>, 0.8));
+<a class="jxr_linenumber" name="L2402" href="#L2402">2402</a> assertTrue(isSimilar(<span class="jxr_string">"kitten"</span>, <span class="jxr_string">"sitting"</span>, 0.5));
+<a class="jxr_linenumber" name="L2403" href="#L2403">2403</a> assertFalse(isSimilar(<span class="jxr_string">"abc"</span>, <span class="jxr_string">"xyz"</span>, 0.5));
+<a class="jxr_linenumber" name="L2404" href="#L2404">2404</a> assertTrue(isSimilar(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"hallo"</span>, 0.8));
+<a class="jxr_linenumber" name="L2405" href="#L2405">2405</a> assertFalse(isSimilar(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"world"</span>, 0.8));
+<a class="jxr_linenumber" name="L2406" href="#L2406">2406</a> <em class="jxr_comment">// Null handling</em>
+<a class="jxr_linenumber" name="L2407" href="#L2407">2407</a> assertTrue(isSimilar(<strong class="jxr_keyword">null</strong>, <strong class="jxr_keyword">null</strong>, 0.8));
+<a class="jxr_linenumber" name="L2408" href="#L2408">2408</a> assertFalse(isSimilar(<span class="jxr_string">"hello"</span>, <strong class="jxr_keyword">null</strong>, 0.8));
+<a class="jxr_linenumber" name="L2409" href="#L2409">2409</a> assertFalse(isSimilar(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"hello"</span>, 0.8));
+<a class="jxr_linenumber" name="L2410" href="#L2410">2410</a> }
+<a class="jxr_linenumber" name="L2411" href="#L2411">2411</a>
+<a class="jxr_linenumber" name="L2412" href="#L2412">2412</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2413" href="#L2413">2413</a> <em class="jxr_comment">// isUri(String)</em>
+<a class="jxr_linenumber" name="L2414" href="#L2414">2414</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2415" href="#L2415">2415</a> @Test
+<a class="jxr_linenumber" name="L2416" href="#L2416">2416</a> <strong class="jxr_keyword">void</strong> a100_isUri() {
+<a class="jxr_linenumber" name="L2417" href="#L2417">2417</a> <em class="jxr_comment">// Valid URIs</em>
+<a class="jxr_linenumber" name="L2418" href="#L2418">2418</a> assertTrue(isUri(<span class="jxr_string">"http://example.com"</span>));
+<a class="jxr_linenumber" name="L2419" href="#L2419">2419</a> assertTrue(isUri(<span class="jxr_string">"https://example.com"</span>));
+<a class="jxr_linenumber" name="L2420" href="#L2420">2420</a> assertTrue(isUri(<span class="jxr_string">"ftp://server.com"</span>));
+<a class="jxr_linenumber" name="L2421" href="#L2421">2421</a> assertTrue(isUri(<span class="jxr_string">"file://path/to/file"</span>));
+<a class="jxr_linenumber" name="L2422" href="#L2422">2422</a> assertTrue(isUri(<span class="jxr_string">"ab://test"</span>));
+<a class="jxr_linenumber" name="L2423" href="#L2423">2423</a> assertTrue(isUri(<span class="jxr_string">"xyz://test"</span>));
+<a class="jxr_linenumber" name="L2424" href="#L2424">2424</a>
+<a class="jxr_linenumber" name="L2425" href="#L2425">2425</a> <em class="jxr_comment">// Invalid URIs</em>
+<a class="jxr_linenumber" name="L2426" href="#L2426">2426</a> assertFalse(isUri(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2427" href="#L2427">2427</a> assertFalse(isUri(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L2428" href="#L2428">2428</a> assertFalse(isUri(<span class="jxr_string">"x://x"</span>)); // Too <strong class="jxr_keyword">short</strong> (needs at least 2 chars)
+<a class="jxr_linenumber" name="L2429" href="#L2429">2429</a> assertFalse(isUri(<span class="jxr_string">"xX://x"</span>)); // Mixed <strong class="jxr_keyword">case</strong>
+<a class="jxr_linenumber" name="L2430" href="#L2430">2430</a> assertFalse(isUri(<span class="jxr_string">"x ://x"</span>)); // Space
+<a class="jxr_linenumber" name="L2431" href="#L2431">2431</a> assertFalse(isUri(<span class="jxr_string">"x: //x"</span>)); // Space after colon
+<a class="jxr_linenumber" name="L2432" href="#L2432">2432</a> assertFalse(isUri(<span class="jxr_string">"x:/x/x"</span>)); <em class="jxr_comment">// Only one slash</em>
+<a class="jxr_linenumber" name="L2433" href="#L2433">2433</a> assertFalse(isUri(<span class="jxr_string">"C:/temp"</span>)); <em class="jxr_comment">// Filesystem path (excluded)</em>
+<a class="jxr_linenumber" name="L2434" href="#L2434">2434</a> }
+<a class="jxr_linenumber" name="L2435" href="#L2435">2435</a>
+<a class="jxr_linenumber" name="L2436" href="#L2436">2436</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2437" href="#L2437">2437</a> <em class="jxr_comment">// isValidDateFormat(String,String)</em>
+<a class="jxr_linenumber" name="L2438" href="#L2438">2438</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2439" href="#L2439">2439</a> @Test
+<a class="jxr_linenumber" name="L2440" href="#L2440">2440</a> <strong class="jxr_keyword">void</strong> a101_isValidDateFormat() {
+<a class="jxr_linenumber" name="L2441" href="#L2441">2441</a> <em class="jxr_comment">// Valid dates</em>
+<a class="jxr_linenumber" name="L2442" href="#L2442">2442</a> assertTrue(isValidDateFormat(<span class="jxr_string">"2023-12-25"</span>, <span class="jxr_string">"yyyy-MM-dd"</span>));
+<a class="jxr_linenumber" name="L2443" href="#L2443">2443</a> assertTrue(isValidDateFormat(<span class="jxr_string">"25/12/2023"</span>, <span class="jxr_string">"dd/MM/yyyy"</span>));
+<a class="jxr_linenumber" name="L2444" href="#L2444">2444</a> assertTrue(isValidDateFormat(<span class="jxr_string">"12/25/2023"</span>, <span class="jxr_string">"MM/dd/yyyy"</span>));
+<a class="jxr_linenumber" name="L2445" href="#L2445">2445</a> assertTrue(isValidDateFormat(<span class="jxr_string">"2023-01-01"</span>, <span class="jxr_string">"yyyy-MM-dd"</span>));
+<a class="jxr_linenumber" name="L2446" href="#L2446">2446</a>
+<a class="jxr_linenumber" name="L2447" href="#L2447">2447</a> <em class="jxr_comment">// Invalid dates</em>
+<a class="jxr_linenumber" name="L2448" href="#L2448">2448</a> assertFalse(isValidDateFormat(<span class="jxr_string">"2023-13-25"</span>, <span class="jxr_string">"yyyy-MM-dd"</span>)); <em class="jxr_comment">// Invalid month</em>
+<a class="jxr_linenumber" name="L2449" href="#L2449">2449</a> assertFalse(isValidDateFormat(<span class="jxr_string">"2023-12-32"</span>, <span class="jxr_string">"yyyy-MM-dd"</span>)); <em class="jxr_comment">// Invalid day</em>
+<a class="jxr_linenumber" name="L2450" href="#L2450">2450</a> assertFalse(isValidDateFormat(<span class="jxr_string">"2023-12-25"</span>, <span class="jxr_string">"invalid"</span>)); <em class="jxr_comment">// Invalid format</em>
+<a class="jxr_linenumber" name="L2451" href="#L2451">2451</a> assertFalse(isValidDateFormat(<span class="jxr_string">"not-a-date"</span>, <span class="jxr_string">"yyyy-MM-dd"</span>)); <em class="jxr_comment">// Not a date</em>
+<a class="jxr_linenumber" name="L2452" href="#L2452">2452</a>
+<a class="jxr_linenumber" name="L2453" href="#L2453">2453</a> <em class="jxr_comment">// Null/empty input</em>
+<a class="jxr_linenumber" name="L2454" href="#L2454">2454</a> assertFalse(isValidDateFormat(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"yyyy-MM-dd"</span>));
+<a class="jxr_linenumber" name="L2455" href="#L2455">2455</a> assertFalse(isValidDateFormat(<span class="jxr_string">"2023-12-25"</span>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2456" href="#L2456">2456</a> assertFalse(isValidDateFormat(<span class="jxr_string">""</span>, <span class="jxr_string">"yyyy-MM-dd"</span>));
+<a class="jxr_linenumber" name="L2457" href="#L2457">2457</a> assertFalse(isValidDateFormat(<span class="jxr_string">"2023-12-25"</span>, <span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L2458" href="#L2458">2458</a> }
+<a class="jxr_linenumber" name="L2459" href="#L2459">2459</a>
+<a class="jxr_linenumber" name="L2460" href="#L2460">2460</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2461" href="#L2461">2461</a> <em class="jxr_comment">// isValidHostname(String)</em>
+<a class="jxr_linenumber" name="L2462" href="#L2462">2462</a> <em class="jxr_comment">//====================================================================================================</em>
<a class="jxr_linenumber" name="L2463" href="#L2463">2463</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2464" href="#L2464">2464</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2465" href="#L2465">2465</a> <em class="jxr_comment">// isValidIpAddress(String)</em>
-<a class="jxr_linenumber" name="L2466" href="#L2466">2466</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2467" href="#L2467">2467</a> @Test
-<a class="jxr_linenumber" name="L2468" href="#L2468">2468</a> <strong class="jxr_keyword">void</strong> a103_isValidIpAddress() {
-<a class="jxr_linenumber" name="L2469" href="#L2469">2469</a> <em class="jxr_comment">// Valid IPv4 addresses</em>
-<a class="jxr_linenumber" name="L2470" href="#L2470">2470</a> assertTrue(isValidIpAddress(<span class="jxr_string">"192.168.1.1"</span>));
-<a class="jxr_linenumber" name="L2471" href="#L2471">2471</a> assertTrue(isValidIpAddress(<span class="jxr_string">"0.0.0.0"</span>));
-<a class="jxr_linenumber" name="L2472" href="#L2472">2472</a> assertTrue(isValidIpAddress(<span class="jxr_string">"255.255.255.255"</span>));
-<a class="jxr_linenumber" name="L2473" href="#L2473">2473</a> assertTrue(isValidIpAddress(<span class="jxr_string">"127.0.0.1"</span>));
-<a class="jxr_linenumber" name="L2474" href="#L2474">2474</a>
-<a class="jxr_linenumber" name="L2475" href="#L2475">2475</a> <em class="jxr_comment">// Invalid IPv4 addresses</em>
-<a class="jxr_linenumber" name="L2476" href="#L2476">2476</a> assertFalse(isValidIpAddress(<span class="jxr_string">"256.1.1.1"</span>)); <em class="jxr_comment">// Out of range</em>
-<a class="jxr_linenumber" name="L2477" href="#L2477">2477</a> assertFalse(isValidIpAddress(<span class="jxr_string">"192.168.1"</span>)); <em class="jxr_comment">// Too few octets</em>
-<a class="jxr_linenumber" name="L2478" href="#L2478">2478</a> assertFalse(isValidIpAddress(<span class="jxr_string">"192.168.1.1.1"</span>)); <em class="jxr_comment">// Too many octets</em>
-<a class="jxr_linenumber" name="L2479" href="#L2479">2479</a> assertFalse(isValidIpAddress(<span class="jxr_string">"not.an.ip"</span>)); <em class="jxr_comment">// Not numeric</em>
-<a class="jxr_linenumber" name="L2480" href="#L2480">2480</a> assertFalse(isValidIpAddress(<span class="jxr_string">"-1.1.1.1"</span>)); <em class="jxr_comment">// Negative number</em>
-<a class="jxr_linenumber" name="L2481" href="#L2481">2481</a>
-<a class="jxr_linenumber" name="L2482" href="#L2482">2482</a> <em class="jxr_comment">// Valid IPv6 addresses (basic validation)</em>
-<a class="jxr_linenumber" name="L2483" href="#L2483">2483</a> assertTrue(isValidIpAddress(<span class="jxr_string">"2001:0db8:85a3:0000:0000:8a2e:0370:7334"</span>));
-<a class="jxr_linenumber" name="L2484" href="#L2484">2484</a> assertTrue(isValidIpAddress(<span class="jxr_string">"::1"</span>)); <em class="jxr_comment">// Localhost</em>
-<a class="jxr_linenumber" name="L2485" href="#L2485">2485</a> assertTrue(isValidIpAddress(<span class="jxr_string">"2001:db8::1"</span>)); <em class="jxr_comment">// Compressed</em>
-<a class="jxr_linenumber" name="L2486" href="#L2486">2486</a>
-<a class="jxr_linenumber" name="L2487" href="#L2487">2487</a> <em class="jxr_comment">// Invalid IPv6 addresses</em>
-<a class="jxr_linenumber" name="L2488" href="#L2488">2488</a> assertFalse(isValidIpAddress(<span class="jxr_string">"2001:0db8:85a3:0000:0000:8a2e:0370:7334:9999"</span>)); <em class="jxr_comment">// Too many segments</em>
-<a class="jxr_linenumber" name="L2489" href="#L2489">2489</a> assertFalse(isValidIpAddress(<span class="jxr_string">"gggg::1"</span>)); <em class="jxr_comment">// Invalid hex</em>
-<a class="jxr_linenumber" name="L2490" href="#L2490">2490</a>
-<a class="jxr_linenumber" name="L2491" href="#L2491">2491</a> <em class="jxr_comment">// Null/empty input</em>
-<a class="jxr_linenumber" name="L2492" href="#L2492">2492</a> assertFalse(isValidIpAddress(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2493" href="#L2493">2493</a> assertFalse(isValidIpAddress(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L2494" href="#L2494">2494</a> }
-<a class="jxr_linenumber" name="L2495" href="#L2495">2495</a>
-<a class="jxr_linenumber" name="L2496" href="#L2496">2496</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2497" href="#L2497">2497</a> <em class="jxr_comment">// isValidMacAddress(String)</em>
-<a class="jxr_linenumber" name="L2498" href="#L2498">2498</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2499" href="#L2499">2499</a> @Test
-<a class="jxr_linenumber" name="L2500" href="#L2500">2500</a> <strong class="jxr_keyword">void</strong> a104_isValidMacAddress() {
-<a class="jxr_linenumber" name="L2501" href="#L2501">2501</a> <em class="jxr_comment">// Valid MAC addresses - colon format</em>
-<a class="jxr_linenumber" name="L2502" href="#L2502">2502</a> assertTrue(isValidMacAddress(<span class="jxr_string">"00:1B:44:11:3A:B7"</span>));
-<a class="jxr_linenumber" name="L2503" href="#L2503">2503</a> assertTrue(isValidMacAddress(<span class="jxr_string">"00:1b:44:11:3a:b7"</span>)); <em class="jxr_comment">// Lowercase</em>
-<a class="jxr_linenumber" name="L2504" href="#L2504">2504</a> assertTrue(isValidMacAddress(<span class="jxr_string">"FF:FF:FF:FF:FF:FF"</span>));
-<a class="jxr_linenumber" name="L2505" href="#L2505">2505</a>
-<a class="jxr_linenumber" name="L2506" href="#L2506">2506</a> <em class="jxr_comment">// Valid MAC addresses - hyphen format</em>
-<a class="jxr_linenumber" name="L2507" href="#L2507">2507</a> assertTrue(isValidMacAddress(<span class="jxr_string">"00-1B-44-11-3A-B7"</span>));
-<a class="jxr_linenumber" name="L2508" href="#L2508">2508</a> assertTrue(isValidMacAddress(<span class="jxr_string">"00-1b-44-11-3a-b7"</span>)); <em class="jxr_comment">// Lowercase</em>
-<a class="jxr_linenumber" name="L2509" href="#L2509">2509</a>
-<a class="jxr_linenumber" name="L2510" href="#L2510">2510</a> <em class="jxr_comment">// Invalid MAC addresses</em>
-<a class="jxr_linenumber" name="L2511" href="#L2511">2511</a> assertFalse(isValidMacAddress(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2512" href="#L2512">2512</a> assertFalse(isValidMacAddress(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L2513" href="#L2513">2513</a> assertFalse(isValidMacAddress(<span class="jxr_string">"00:1B:44:11:3A"</span>)); <em class="jxr_comment">// Too short</em>
-<a class="jxr_linenumber" name="L2514" href="#L2514">2514</a> assertFalse(isValidMacAddress(<span class="jxr_string">"00:1B:44:11:3A:B7:99"</span>)); <em class="jxr_comment">// Too long</em>
-<a class="jxr_linenumber" name="L2515" href="#L2515">2515</a> assertFalse(isValidMacAddress(<span class="jxr_string">"GG:1B:44:11:3A:B7"</span>)); <em class="jxr_comment">// Invalid hex</em>
-<a class="jxr_linenumber" name="L2516" href="#L2516">2516</a> assertFalse(isValidMacAddress(<span class="jxr_string">"00 1B 44 11 3A B7"</span>)); <em class="jxr_comment">// Space separator (not supported)</em>
-<a class="jxr_linenumber" name="L2517" href="#L2517">2517</a> }
-<a class="jxr_linenumber" name="L2518" href="#L2518">2518</a>
-<a class="jxr_linenumber" name="L2519" href="#L2519">2519</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2520" href="#L2520">2520</a> <em class="jxr_comment">// isValidRegex(String)</em>
-<a class="jxr_linenumber" name="L2521" href="#L2521">2521</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2522" href="#L2522">2522</a> @Test
-<a class="jxr_linenumber" name="L2523" href="#L2523">2523</a> <strong class="jxr_keyword">void</strong> a105_isValidRegex() {
-<a class="jxr_linenumber" name="L2524" href="#L2524">2524</a> <em class="jxr_comment">// Valid regex patterns</em>
-<a class="jxr_linenumber" name="L2525" href="#L2525">2525</a> assertTrue(isValidRegex(<span class="jxr_string">"[a-z]+"</span>));
-<a class="jxr_linenumber" name="L2526" href="#L2526">2526</a> assertTrue(isValidRegex(<span class="jxr_string">"\\d+"</span>));
-<a class="jxr_linenumber" name="L2527" href="#L2527">2527</a> assertTrue(isValidRegex(<span class="jxr_string">"^test$"</span>));
-<a class="jxr_linenumber" name="L2528" href="#L2528">2528</a> assertTrue(isValidRegex(<span class="jxr_string">"(abc|def)"</span>));
-<a class="jxr_linenumber" name="L2529" href="#L2529">2529</a>
-<a class="jxr_linenumber" name="L2530" href="#L2530">2530</a> <em class="jxr_comment">// Invalid regex patterns</em>
-<a class="jxr_linenumber" name="L2531" href="#L2531">2531</a> assertFalse(isValidRegex(<span class="jxr_string">"[a-z"</span>)); <em class="jxr_comment">// Unclosed bracket</em>
-<a class="jxr_linenumber" name="L2532" href="#L2532">2532</a> assertFalse(isValidRegex(<span class="jxr_string">"(test"</span>)); <em class="jxr_comment">// Unclosed parenthesis</em>
-<a class="jxr_linenumber" name="L2533" href="#L2533">2533</a> assertFalse(isValidRegex(<span class="jxr_string">"\\"</span>)); <em class="jxr_comment">// Incomplete escape</em>
-<a class="jxr_linenumber" name="L2534" href="#L2534">2534</a> assertFalse(isValidRegex(<span class="jxr_string">"*"</span>)); <em class="jxr_comment">// Quantifier without preceding element</em>
-<a class="jxr_linenumber" name="L2535" href="#L2535">2535</a>
-<a class="jxr_linenumber" name="L2536" href="#L2536">2536</a> <em class="jxr_comment">// Null/empty input</em>
-<a class="jxr_linenumber" name="L2537" href="#L2537">2537</a> assertFalse(isValidRegex(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2538" href="#L2538">2538</a> assertFalse(isValidRegex(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L2539" href="#L2539">2539</a> }
-<a class="jxr_linenumber" name="L2540" href="#L2540">2540</a>
-<a class="jxr_linenumber" name="L2541" href="#L2541">2541</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2542" href="#L2542">2542</a> <em class="jxr_comment">// isValidTimeFormat(String,String)</em>
-<a class="jxr_linenumber" name="L2543" href="#L2543">2543</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2544" href="#L2544">2544</a> @Test
-<a class="jxr_linenumber" name="L2545" href="#L2545">2545</a> <strong class="jxr_keyword">void</strong> a106_isValidTimeFormat() {
-<a class="jxr_linenumber" name="L2546" href="#L2546">2546</a> <em class="jxr_comment">// Valid times</em>
-<a class="jxr_linenumber" name="L2547" href="#L2547">2547</a> assertTrue(isValidTimeFormat(<span class="jxr_string">"14:30:00"</span>, <span class="jxr_string">"HH:mm:ss"</span>));
-<a class="jxr_linenumber" name="L2548" href="#L2548">2548</a> assertTrue(isValidTimeFormat(<span class="jxr_string">"02:30:00 PM"</span>, <span class="jxr_string">"hh:mm:ss a"</span>));
-<a class="jxr_linenumber" name="L2549" href="#L2549">2549</a> assertTrue(isValidTimeFormat(<span class="jxr_string">"14:30"</span>, <span class="jxr_string">"HH:mm"</span>));
-<a class="jxr_linenumber" name="L2550" href="#L2550">2550</a> assertTrue(isValidTimeFormat(<span class="jxr_string">"00:00:00"</span>, <span class="jxr_string">"HH:mm:ss"</span>));
-<a class="jxr_linenumber" name="L2551" href="#L2551">2551</a>
-<a class="jxr_linenumber" name="L2552" href="#L2552">2552</a> <em class="jxr_comment">// Invalid times</em>
-<a class="jxr_linenumber" name="L2553" href="#L2553">2553</a> assertFalse(isValidTimeFormat(<span class="jxr_string">"25:00:00"</span>, <span class="jxr_string">"HH:mm:ss"</span>)); <em class="jxr_comment">// Invalid hour</em>
-<a class="jxr_linenumber" name="L2554" href="#L2554">2554</a> assertFalse(isValidTimeFormat(<span class="jxr_string">"14:60:00"</span>, <span class="jxr_string">"HH:mm:ss"</span>)); <em class="jxr_comment">// Invalid minute</em>
-<a class="jxr_linenumber" name="L2555" href="#L2555">2555</a> assertFalse(isValidTimeFormat(<span class="jxr_string">"14:30:60"</span>, <span class="jxr_string">"HH:mm:ss"</span>)); <em class="jxr_comment">// Invalid second</em>
-<a class="jxr_linenumber" name="L2556" href="#L2556">2556</a> assertFalse(isValidTimeFormat(<span class="jxr_string">"not-a-time"</span>, <span class="jxr_string">"HH:mm:ss"</span>)); <em class="jxr_comment">// Not a time</em>
-<a class="jxr_linenumber" name="L2557" href="#L2557">2557</a>
-<a class="jxr_linenumber" name="L2558" href="#L2558">2558</a> <em class="jxr_comment">// Null/empty input</em>
-<a class="jxr_linenumber" name="L2559" href="#L2559">2559</a> assertFalse(isValidTimeFormat(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"HH:mm:ss"</span>));
-<a class="jxr_linenumber" name="L2560" href="#L2560">2560</a> assertFalse(isValidTimeFormat(<span class="jxr_string">"14:30:00"</span>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2561" href="#L2561">2561</a> assertFalse(isValidTimeFormat(<span class="jxr_string">""</span>, <span class="jxr_string">"HH:mm:ss"</span>));
-<a class="jxr_linenumber" name="L2562" href="#L2562">2562</a> assertFalse(isValidTimeFormat(<span class="jxr_string">"14:30:00"</span>, <span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L2563" href="#L2563">2563</a> }
-<a class="jxr_linenumber" name="L2564" href="#L2564">2564</a>
-<a class="jxr_linenumber" name="L2565" href="#L2565">2565</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2566" href="#L2566">2566</a> <em class="jxr_comment">// isWhitespace(String)</em>
-<a class="jxr_linenumber" name="L2567" href="#L2567">2567</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2568" href="#L2568">2568</a> @Test
-<a class="jxr_linenumber" name="L2569" href="#L2569">2569</a> <strong class="jxr_keyword">void</strong> a107_isWhitespace() {
-<a class="jxr_linenumber" name="L2570" href="#L2570">2570</a> assertFalse(isWhitespace(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2571" href="#L2571">2571</a> assertTrue(isWhitespace(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L2572" href="#L2572">2572</a> assertTrue(isWhitespace(<span class="jxr_string">" "</span>));
-<a class="jxr_linenumber" name="L2573" href="#L2573">2573</a> assertTrue(isWhitespace(<span class="jxr_string">"\t\n"</span>));
-<a class="jxr_linenumber" name="L2574" href="#L2574">2574</a> assertTrue(isWhitespace(<span class="jxr_string">"\r\n\t "</span>));
-<a class="jxr_linenumber" name="L2575" href="#L2575">2575</a> assertFalse(isWhitespace(<span class="jxr_string">" a "</span>));
-<a class="jxr_linenumber" name="L2576" href="#L2576">2576</a> assertFalse(isWhitespace(<span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L2577" href="#L2577">2577</a> }
-<a class="jxr_linenumber" name="L2578" href="#L2578">2578</a>
-<a class="jxr_linenumber" name="L2579" href="#L2579">2579</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2580" href="#L2580">2580</a> <em class="jxr_comment">// join(...) - All variants</em>
-<a class="jxr_linenumber" name="L2581" href="#L2581">2581</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2582" href="#L2582">2582</a> @Test
-<a class="jxr_linenumber" name="L2583" href="#L2583">2583</a> <strong class="jxr_keyword">void</strong> a108_join() {
-<a class="jxr_linenumber" name="L2584" href="#L2584">2584</a> <em class="jxr_comment">// join(Collection<?>)</em>
-<a class="jxr_linenumber" name="L2585" href="#L2585">2585</a> assertNull(join((Collection<?>)<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2586" href="#L2586">2586</a> assertEquals(<span class="jxr_string">"1"</span>, join(l(a(1))));
-<a class="jxr_linenumber" name="L2587" href="#L2587">2587</a> assertEquals(<span class="jxr_string">"1,2"</span>, join(l(a(1, 2))));
-<a class="jxr_linenumber" name="L2588" href="#L2588">2588</a>
-<a class="jxr_linenumber" name="L2589" href="#L2589">2589</a> <em class="jxr_comment">// join(Collection<?>, char)</em>
-<a class="jxr_linenumber" name="L2590" href="#L2590">2590</a> assertNull(join((Collection<?>)<strong class="jxr_keyword">null</strong>, ','));
-<a class="jxr_linenumber" name="L2591" href="#L2591">2591</a> assertEquals(<span class="jxr_string">"1"</span>, join(l(a(1)), ','));
-<a class="jxr_linenumber" name="L2592" href="#L2592">2592</a> assertEquals(<span class="jxr_string">"1,2"</span>, join(l(a(1, 2)), ','));
-<a class="jxr_linenumber" name="L2593" href="#L2593">2593</a>
-<a class="jxr_linenumber" name="L2594" href="#L2594">2594</a> <em class="jxr_comment">// join(Collection<?>, String)</em>
-<a class="jxr_linenumber" name="L2595" href="#L2595">2595</a> assertNull(join((Collection<?>)<strong class="jxr_keyword">null</strong>, <span class="jxr_string">","</span>));
-<a class="jxr_linenumber" name="L2596" href="#L2596">2596</a> assertEquals(<span class="jxr_string">"1"</span>, join(l(a(1)), <span class="jxr_string">","</span>));
-<a class="jxr_linenumber" name="L2597" href="#L2597">2597</a> assertEquals(<span class="jxr_string">"1,2"</span>, join(l(a(1, 2)), <span class="jxr_string">","</span>));
-<a class="jxr_linenumber" name="L2598" href="#L2598">2598</a>
-<a class="jxr_linenumber" name="L2599" href="#L2599">2599</a> <em class="jxr_comment">// join(int[], char)</em>
-<a class="jxr_linenumber" name="L2600" href="#L2600">2600</a> assertNull(join((<strong class="jxr_keyword">int</strong>[])<strong class="jxr_keyword">null</strong>, ','));
-<a class="jxr_linenumber" name="L2601" href="#L2601">2601</a> assertEquals(<span class="jxr_string">"1"</span>, join(ints(1), ','));
-<a class="jxr_linenumber" name="L2602" href="#L2602">2602</a> assertEquals(<span class="jxr_string">"1,2"</span>, join(ints(1, 2), ','));
-<a class="jxr_linenumber" name="L2603" href="#L2603">2603</a>
-<a class="jxr_linenumber" name="L2604" href="#L2604">2604</a> <em class="jxr_comment">// join(Object[], char)</em>
-<a class="jxr_linenumber" name="L2605" href="#L2605">2605</a> assertNull(join((Object[])<strong class="jxr_keyword">null</strong>, ','));
-<a class="jxr_linenumber" name="L2606" href="#L2606">2606</a> assertEquals(<span class="jxr_string">"1"</span>, join(a(1), ','));
-<a class="jxr_linenumber" name="L2607" href="#L2607">2607</a> assertEquals(<span class="jxr_string">"1,2"</span>, join(a(1, 2), ','));
-<a class="jxr_linenumber" name="L2608" href="#L2608">2608</a>
-<a class="jxr_linenumber" name="L2609" href="#L2609">2609</a> <em class="jxr_comment">// join(Object[], String)</em>
-<a class="jxr_linenumber" name="L2610" href="#L2610">2610</a> assertNull(join((Object[])<strong class="jxr_keyword">null</strong>, <span class="jxr_string">","</span>));
-<a class="jxr_linenumber" name="L2611" href="#L2611">2611</a> assertEquals(<span class="jxr_string">"1"</span>, join(a(1), <span class="jxr_string">","</span>));
-<a class="jxr_linenumber" name="L2612" href="#L2612">2612</a> assertEquals(<span class="jxr_string">"1,2"</span>, join(a(1, 2), <span class="jxr_string">","</span>));
-<a class="jxr_linenumber" name="L2613" href="#L2613">2613</a>
-<a class="jxr_linenumber" name="L2614" href="#L2614">2614</a> <em class="jxr_comment">// join(String...)</em>
-<a class="jxr_linenumber" name="L2615" href="#L2615">2615</a> assertEquals(<span class="jxr_string">""</span>, join());
-<a class="jxr_linenumber" name="L2616" href="#L2616">2616</a> assertEquals(<span class="jxr_string">"a"</span>, join(<span class="jxr_string">"a"</span>));
-<a class="jxr_linenumber" name="L2617" href="#L2617">2617</a> assertEquals(<span class="jxr_string">"a,b"</span>, join(<span class="jxr_string">"a"</span>, <span class="jxr_string">"b"</span>));
-<a class="jxr_linenumber" name="L2618" href="#L2618">2618</a> }
-<a class="jxr_linenumber" name="L2619" href="#L2619">2619</a>
-<a class="jxr_linenumber" name="L2620" href="#L2620">2620</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2621" href="#L2621">2621</a> <em class="jxr_comment">// joine(List<?>, char)</em>
-<a class="jxr_linenumber" name="L2622" href="#L2622">2622</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2623" href="#L2623">2623</a> @Test
-<a class="jxr_linenumber" name="L2624" href="#L2624">2624</a> <strong class="jxr_keyword">void</strong> a109_joine() {
-<a class="jxr_linenumber" name="L2625" href="#L2625">2625</a> assertNull(joine(<strong class="jxr_keyword">null</strong>, ','));
-<a class="jxr_linenumber" name="L2626" href="#L2626">2626</a> assertEquals(<span class="jxr_string">"x\\,y,z"</span>, joine(l(a(<span class="jxr_string">"x,y"</span>, <span class="jxr_string">"z"</span>)), ','));
-<a class="jxr_linenumber" name="L2627" href="#L2627">2627</a> assertEquals(<span class="jxr_string">"a,b"</span>, joine(l(a(<span class="jxr_string">"a"</span>, <span class="jxr_string">"b"</span>)), ','));
-<a class="jxr_linenumber" name="L2628" href="#L2628">2628</a> assertEquals(<span class="jxr_string">"a\\|b"</span>, joine(l(a(<span class="jxr_string">"a|b"</span>)), '|'));
-<a class="jxr_linenumber" name="L2629" href="#L2629">2629</a> }
-<a class="jxr_linenumber" name="L2630" href="#L2630">2630</a>
-<a class="jxr_linenumber" name="L2631" href="#L2631">2631</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2632" href="#L2632">2632</a> <em class="jxr_comment">// joinnl(Object[])</em>
-<a class="jxr_linenumber" name="L2633" href="#L2633">2633</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2634" href="#L2634">2634</a> @Test
-<a class="jxr_linenumber" name="L2635" href="#L2635">2635</a> <strong class="jxr_keyword">void</strong> a110_joinnl() {
-<a class="jxr_linenumber" name="L2636" href="#L2636">2636</a> assertNull(joinnl(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2637" href="#L2637">2637</a> assertEquals(<span class="jxr_string">""</span>, joinnl(<strong class="jxr_keyword">new</strong> Object[0]));
-<a class="jxr_linenumber" name="L2638" href="#L2638">2638</a> assertEquals(<span class="jxr_string">"a"</span>, joinnl(a(<span class="jxr_string">"a"</span>)));
-<a class="jxr_linenumber" name="L2639" href="#L2639">2639</a> assertEquals(<span class="jxr_string">"a\nb"</span>, joinnl(a(<span class="jxr_string">"a"</span>, <span class="jxr_string">"b"</span>)));
-<a class="jxr_linenumber" name="L2640" href="#L2640">2640</a> assertEquals(<span class="jxr_string">"1\n2\n3"</span>, joinnl(a(1, 2, 3)));
-<a class="jxr_linenumber" name="L2641" href="#L2641">2641</a> }
-<a class="jxr_linenumber" name="L2642" href="#L2642">2642</a>
-<a class="jxr_linenumber" name="L2643" href="#L2643">2643</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2644" href="#L2644">2644</a> <em class="jxr_comment">// kebabCase(String)</em>
-<a class="jxr_linenumber" name="L2645" href="#L2645">2645</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2646" href="#L2646">2646</a> @Test
-<a class="jxr_linenumber" name="L2647" href="#L2647">2647</a> <strong class="jxr_keyword">void</strong> a111_kebabCase() {
-<a class="jxr_linenumber" name="L2648" href="#L2648">2648</a> assertNull(kebabCase(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2649" href="#L2649">2649</a> assertEquals(<span class="jxr_string">""</span>, kebabCase(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L2650" href="#L2650">2650</a> assertEquals(<span class="jxr_string">"hello-world"</span>, kebabCase(<span class="jxr_string">"hello world"</span>));
-<a class="jxr_linenumber" name="L2651" href="#L2651">2651</a> assertEquals(<span class="jxr_string">"hello-world"</span>, kebabCase(<span class="jxr_string">"helloWorld"</span>));
-<a class="jxr_linenumber" name="L2652" href="#L2652">2652</a> assertEquals(<span class="jxr_string">"hello-world"</span>, kebabCase(<span class="jxr_string">"HelloWorld"</span>));
-<a class="jxr_linenumber" name="L2653" href="#L2653">2653</a> assertEquals(<span class="jxr_string">"hello-world"</span>, kebabCase(<span class="jxr_string">"hello_world"</span>));
-<a class="jxr_linenumber" name="L2654" href="#L2654">2654</a> assertEquals(<span class="jxr_string">"hello-world"</span>, kebabCase(<span class="jxr_string">"hello-world"</span>));
-<a class="jxr_linenumber" name="L2655" href="#L2655">2655</a> assertEquals(<span class="jxr_string">"xml-http-request"</span>, kebabCase(<span class="jxr_string">"XMLHttpRequest"</span>));
-<a class="jxr_linenumber" name="L2656" href="#L2656">2656</a> assertEquals(<span class="jxr_string">"hello-world-test"</span>, kebabCase(<span class="jxr_string">"Hello_World-Test"</span>));
-<a class="jxr_linenumber" name="L2657" href="#L2657">2657</a> assertEquals(<span class="jxr_string">"test"</span>, kebabCase(<span class="jxr_string">"test"</span>));
-<a class="jxr_linenumber" name="L2658" href="#L2658">2658</a> assertEquals(<span class="jxr_string">"test"</span>, kebabCase(<span class="jxr_string">"TEST"</span>));
-<a class="jxr_linenumber" name="L2659" href="#L2659">2659</a> assertEquals(<span class="jxr_string">"hello-123-world"</span>, kebabCase(<span class="jxr_string">"hello 123 world"</span>));
-<a class="jxr_linenumber" name="L2660" href="#L2660">2660</a> }
-<a class="jxr_linenumber" name="L2661" href="#L2661">2661</a>
-<a class="jxr_linenumber" name="L2662" href="#L2662">2662</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2663" href="#L2663">2663</a> <em class="jxr_comment">// lastIndexOf(String,String)</em>
-<a class="jxr_linenumber" name="L2664" href="#L2664">2664</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2665" href="#L2665">2665</a> @Test
-<a class="jxr_linenumber" name="L2666" href="#L2666">2666</a> <strong class="jxr_keyword">void</strong> a112_lastIndexOf() {
-<a class="jxr_linenumber" name="L2667" href="#L2667">2667</a> assertEquals(12, lastIndexOf(<span class="jxr_string">"hello world world"</span>, <span class="jxr_string">"world"</span>));
-<a class="jxr_linenumber" name="L2668" href="#L2668">2668</a> assertEquals(6, lastIndexOf(<span class="jxr_string">"hello world"</span>, <span class="jxr_string">"world"</span>));
-<a class="jxr_linenumber" name="L2669" href="#L2669">2669</a> assertEquals(0, lastIndexOf(<span class="jxr_string">"hello world"</span>, <span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L2670" href="#L2670">2670</a> assertEquals(-1, lastIndexOf(<span class="jxr_string">"hello world"</span>, <span class="jxr_string">"xyz"</span>));
-<a class="jxr_linenumber" name="L2671" href="#L2671">2671</a> assertEquals(-1, lastIndexOf(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"test"</span>));
-<a class="jxr_linenumber" name="L2672" href="#L2672">2672</a> assertEquals(-1, lastIndexOf(<span class="jxr_string">"test"</span>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2673" href="#L2673">2673</a> assertEquals(-1, lastIndexOf(<strong class="jxr_keyword">null</strong>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2674" href="#L2674">2674</a> assertEquals(4, lastIndexOf(<span class="jxr_string">"ababab"</span>, <span class="jxr_string">"ab"</span>)); <em class="jxr_comment">// "ab" appears at positions 0, 2, 4</em>
-<a class="jxr_linenumber" name="L2675" href="#L2675">2675</a> }
-<a class="jxr_linenumber" name="L2676" href="#L2676">2676</a>
-<a class="jxr_linenumber" name="L2677" href="#L2677">2677</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2678" href="#L2678">2678</a> <em class="jxr_comment">// lastIndexOfIgnoreCase(String,String)</em>
-<a class="jxr_linenumber" name="L2679" href="#L2679">2679</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2680" href="#L2680">2680</a> @Test
-<a class="jxr_linenumber" name="L2681" href="#L2681">2681</a> <strong class="jxr_keyword">void</strong> a113_lastIndexOfIgnoreCase() {
-<a class="jxr_linenumber" name="L2682" href="#L2682">2682</a> assertEquals(12, lastIndexOfIgnoreCase(<span class="jxr_string">"Hello World World"</span>, <span class="jxr_string">"world"</span>));
-<a class="jxr_linenumber" name="L2683" href="#L2683">2683</a> assertEquals(12, lastIndexOfIgnoreCase(<span class="jxr_string">"Hello World World"</span>, <span class="jxr_string">"WORLD"</span>));
-<a class="jxr_linenumber" name="L2684" href="#L2684">2684</a> assertEquals(6, lastIndexOfIgnoreCase(<span class="jxr_string">"Hello World"</span>, <span class="jxr_string">"world"</span>));
-<a class="jxr_linenumber" name="L2685" href="#L2685">2685</a> assertEquals(6, lastIndexOfIgnoreCase(<span class="jxr_string">"Hello World"</span>, <span class="jxr_string">"WORLD"</span>));
-<a class="jxr_linenumber" name="L2686" href="#L2686">2686</a> assertEquals(0, lastIndexOfIgnoreCase(<span class="jxr_string">"Hello World"</span>, <span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L2687" href="#L2687">2687</a> assertEquals(-1, lastIndexOfIgnoreCase(<span class="jxr_string">"Hello World"</span>, <span class="jxr_string">"xyz"</span>));
-<a class="jxr_linenumber" name="L2688" href="#L2688">2688</a> assertEquals(-1, lastIndexOfIgnoreCase(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"test"</span>));
-<a class="jxr_linenumber" name="L2689" href="#L2689">2689</a> assertEquals(-1, lastIndexOfIgnoreCase(<span class="jxr_string">"test"</span>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2690" href="#L2690">2690</a> assertEquals(-1, lastIndexOfIgnoreCase(<strong class="jxr_keyword">null</strong>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2691" href="#L2691">2691</a> assertEquals(4, lastIndexOfIgnoreCase(<span class="jxr_string">"AbAbAb"</span>, <span class="jxr_string">"ab"</span>));
-<a class="jxr_linenumber" name="L2692" href="#L2692">2692</a> }
-<a class="jxr_linenumber" name="L2693" href="#L2693">2693</a>
-<a class="jxr_linenumber" name="L2694" href="#L2694">2694</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2695" href="#L2695">2695</a> <em class="jxr_comment">// lastNonWhitespaceChar(String)</em>
-<a class="jxr_linenumber" name="L2696" href="#L2696">2696</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2697" href="#L2697">2697</a> @Test
-<a class="jxr_linenumber" name="L2698" href="#L2698">2698</a> <strong class="jxr_keyword">void</strong> a114_lastNonWhitespaceChar() {
-<a class="jxr_linenumber" name="L2699" href="#L2699">2699</a> assertEquals('r', lastNonWhitespaceChar(<span class="jxr_string">"bar"</span>));
-<a class="jxr_linenumber" name="L2700" href="#L2700">2700</a> assertEquals('r', lastNonWhitespaceChar(<span class="jxr_string">" bar "</span>));
-<a class="jxr_linenumber" name="L2701" href="#L2701">2701</a> assertEquals('r', lastNonWhitespaceChar(<span class="jxr_string">"\tbar\t"</span>));
-<a class="jxr_linenumber" name="L2702" href="#L2702">2702</a> assertEquals(0, lastNonWhitespaceChar(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L2703" href="#L2703">2703</a> assertEquals(0, lastNonWhitespaceChar(<span class="jxr_string">" "</span>));
-<a class="jxr_linenumber" name="L2704" href="#L2704">2704</a> assertEquals(0, lastNonWhitespaceChar(<span class="jxr_string">"\t"</span>));
-<a class="jxr_linenumber" name="L2705" href="#L2705">2705</a> assertEquals(0, lastNonWhitespaceChar(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2706" href="#L2706">2706</a> }
-<a class="jxr_linenumber" name="L2707" href="#L2707">2707</a>
-<a class="jxr_linenumber" name="L2708" href="#L2708">2708</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2709" href="#L2709">2709</a> <em class="jxr_comment">// left(String,int)</em>
-<a class="jxr_linenumber" name="L2710" href="#L2710">2710</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2711" href="#L2711">2711</a> @Test
-<a class="jxr_linenumber" name="L2712" href="#L2712">2712</a> <strong class="jxr_keyword">void</strong> a115_left() {
-<a class="jxr_linenumber" name="L2713" href="#L2713">2713</a> assertNull(left(<strong class="jxr_keyword">null</strong>, 3));
-<a class="jxr_linenumber" name="L2714" href="#L2714">2714</a> assertEquals(<span class="jxr_string">""</span>, left(<span class="jxr_string">""</span>, 3));
-<a class="jxr_linenumber" name="L2715" href="#L2715">2715</a> assertEquals(<span class="jxr_string">"hel"</span>, left(<span class="jxr_string">"hello"</span>, 3));
-<a class="jxr_linenumber" name="L2716" href="#L2716">2716</a> assertEquals(<span class="jxr_string">"hello"</span>, left(<span class="jxr_string">"hello"</span>, 10));
-<a class="jxr_linenumber" name="L2717" href="#L2717">2717</a> assertEquals(<span class="jxr_string">""</span>, left(<span class="jxr_string">"hello"</span>, 0));
-<a class="jxr_linenumber" name="L2718" href="#L2718">2718</a> assertEquals(<span class="jxr_string">""</span>, left(<span class="jxr_string">"hello"</span>, -1));
-<a class="jxr_linenumber" name="L2719" href="#L2719">2719</a> }
-<a class="jxr_linenumber" name="L2720" href="#L2720">2720</a>
-<a class="jxr_linenumber" name="L2721" href="#L2721">2721</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2722" href="#L2722">2722</a> <em class="jxr_comment">// levenshteinDistance(String,String)</em>
-<a class="jxr_linenumber" name="L2723" href="#L2723">2723</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2724" href="#L2724">2724</a> @Test
-<a class="jxr_linenumber" name="L2725" href="#L2725">2725</a> <strong class="jxr_keyword">void</strong> a116_levenshteinDistance() {
-<a class="jxr_linenumber" name="L2726" href="#L2726">2726</a> assertEquals(0, levenshteinDistance(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L2727" href="#L2727">2727</a> assertEquals(3, levenshteinDistance(<span class="jxr_string">"kitten"</span>, <span class="jxr_string">"sitting"</span>)); <em class="jxr_comment">// kitten -> sitten (s), sitten -> sittin (i), sittin -> sitting (g)</em>
-<a class="jxr_linenumber" name="L2728" href="#L2728">2728</a> assertEquals(3, levenshteinDistance(<span class="jxr_string">"abc"</span>, <span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L2729" href="#L2729">2729</a> assertEquals(3, levenshteinDistance(<span class="jxr_string">""</span>, <span class="jxr_string">"abc"</span>));
-<a class="jxr_linenumber" name="L2730" href="#L2730">2730</a> assertEquals(1, levenshteinDistance(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"hallo"</span>)); <em class="jxr_comment">// e -> a (1 substitution)</em>
-<a class="jxr_linenumber" name="L2731" href="#L2731">2731</a> assertEquals(1, levenshteinDistance(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"helo"</span>)); <em class="jxr_comment">// Remove one 'l' (1 deletion)</em>
-<a class="jxr_linenumber" name="L2732" href="#L2732">2732</a> assertEquals(1, levenshteinDistance(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"hell"</span>)); <em class="jxr_comment">// Remove 'o' (1 deletion)</em>
-<a class="jxr_linenumber" name="L2733" href="#L2733">2733</a> assertEquals(1, levenshteinDistance(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"hellox"</span>)); <em class="jxr_comment">// Add 'x' (1 insertion)</em>
-<a class="jxr_linenumber" name="L2734" href="#L2734">2734</a> <em class="jxr_comment">// Null handling</em>
-<a class="jxr_linenumber" name="L2735" href="#L2735">2735</a> assertEquals(0, levenshteinDistance(<strong class="jxr_keyword">null</strong>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2736" href="#L2736">2736</a> assertEquals(5, levenshteinDistance(<span class="jxr_string">"hello"</span>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2737" href="#L2737">2737</a> assertEquals(5, levenshteinDistance(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L2738" href="#L2738">2738</a> }
-<a class="jxr_linenumber" name="L2739" href="#L2739">2739</a>
-<a class="jxr_linenumber" name="L2740" href="#L2740">2740</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2741" href="#L2741">2741</a> <em class="jxr_comment">// lineCount(String)</em>
-<a class="jxr_linenumber" name="L2742" href="#L2742">2742</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2743" href="#L2743">2743</a> @Test
-<a class="jxr_linenumber" name="L2744" href="#L2744">2744</a> <strong class="jxr_keyword">void</strong> a117_lineCount() {
-<a class="jxr_linenumber" name="L2745" href="#L2745">2745</a> <em class="jxr_comment">// Basic line counting</em>
-<a class="jxr_linenumber" name="L2746" href="#L2746">2746</a> assertEquals(3, lineCount(<span class="jxr_string">"line1\nline2\nline3"</span>));
-<a class="jxr_linenumber" name="L2747" href="#L2747">2747</a> assertEquals(1, lineCount(<span class="jxr_string">"single line"</span>));
-<a class="jxr_linenumber" name="L2748" href="#L2748">2748</a>
-<a class="jxr_linenumber" name="L2749" href="#L2749">2749</a> <em class="jxr_comment">// Windows line endings</em>
-<a class="jxr_linenumber" name="L2750" href="#L2750">2750</a> assertEquals(2, lineCount(<span class="jxr_string">"line1\r\nline2"</span>));
-<a class="jxr_linenumber" name="L2751" href="#L2751">2751</a>
-<a class="jxr_linenumber" name="L2752" href="#L2752">2752</a> <em class="jxr_comment">// Mixed line endings</em>
-<a class="jxr_linenumber" name="L2753" href="#L2753">2753</a> assertEquals(3, lineCount(<span class="jxr_string">"line1\nline2\r\nline3"</span>));
-<a class="jxr_linenumber" name="L2754" href="#L2754">2754</a>
-<a class="jxr_linenumber" name="L2755" href="#L2755">2755</a> <em class="jxr_comment">// Empty lines</em>
-<a class="jxr_linenumber" name="L2756" href="#L2756">2756</a> assertEquals(3, lineCount(<span class="jxr_string">"line1\n\nline3"</span>));
-<a class="jxr_linenumber" name="L2757" href="#L2757">2757</a> assertEquals(2, lineCount(<span class="jxr_string">"\nline2"</span>));
-<a class="jxr_linenumber" name="L2758" href="#L2758">2758</a> assertEquals(2, lineCount(<span class="jxr_string">"line1\n"</span>));
-<a class="jxr_linenumber" name="L2759" href="#L2759">2759</a>
-<a class="jxr_linenumber" name="L2760" href="#L2760">2760</a> <em class="jxr_comment">// Only newlines</em>
-<a class="jxr_linenumber" name="L2761" href="#L2761">2761</a> assertEquals(3, lineCount(<span class="jxr_string">"\n\n"</span>));
-<a class="jxr_linenumber" name="L2762" href="#L2762">2762</a>
-<a class="jxr_linenumber" name="L2763" href="#L2763">2763</a> <em class="jxr_comment">// Null/empty input</em>
-<a class="jxr_linenumber" name="L2764" href="#L2764">2764</a> assertEquals(0, lineCount(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2765" href="#L2765">2765</a> assertEquals(0, lineCount(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L2766" href="#L2766">2766</a> }
-<a class="jxr_linenumber" name="L2767" href="#L2767">2767</a>
-<a class="jxr_linenumber" name="L2768" href="#L2768">2768</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2769" href="#L2769">2769</a> <em class="jxr_comment">// lowerCase(String)</em>
-<a class="jxr_linenumber" name="L2770" href="#L2770">2770</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2771" href="#L2771">2771</a> @Test
-<a class="jxr_linenumber" name="L2772" href="#L2772">2772</a> <strong class="jxr_keyword">void</strong> a118_lowerCase() {
-<a class="jxr_linenumber" name="L2773" href="#L2773">2773</a> assertNull(lowerCase(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2774" href="#L2774">2774</a> assertEquals(<span class="jxr_string">""</span>, lowerCase(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L2775" href="#L2775">2775</a> assertEquals(<span class="jxr_string">"hello"</span>, lowerCase(<span class="jxr_string">"Hello"</span>));
-<a class="jxr_linenumber" name="L2776" href="#L2776">2776</a> assertEquals(<span class="jxr_string">"hello"</span>, lowerCase(<span class="jxr_string">"HELLO"</span>));
-<a class="jxr_linenumber" name="L2777" href="#L2777">2777</a> assertEquals(<span class="jxr_string">"hello world"</span>, lowerCase(<span class="jxr_string">"Hello World"</span>));
-<a class="jxr_linenumber" name="L2778" href="#L2778">2778</a> assertEquals(<span class="jxr_string">"123"</span>, lowerCase(<span class="jxr_string">"123"</span>));
-<a class="jxr_linenumber" name="L2779" href="#L2779">2779</a> assertEquals(<span class="jxr_string">"hello123"</span>, lowerCase(<span class="jxr_string">"Hello123"</span>));
-<a class="jxr_linenumber" name="L2780" href="#L2780">2780</a> }
-<a class="jxr_linenumber" name="L2781" href="#L2781">2781</a>
-<a class="jxr_linenumber" name="L2782" href="#L2782">2782</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2783" href="#L2783">2783</a> <em class="jxr_comment">// mapped(String[],Function<String,String>)</em>
-<a class="jxr_linenumber" name="L2784" href="#L2784">2784</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2785" href="#L2785">2785</a> @Test
-<a class="jxr_linenumber" name="L2786" href="#L2786">2786</a> <strong class="jxr_keyword">void</strong> a119_mapped() {
-<a class="jxr_linenumber" name="L2787" href="#L2787">2787</a> assertNull(mapped(<strong class="jxr_keyword">null</strong>, String::toUpperCase));
-<a class="jxr_linenumber" name="L2788" href="#L2788">2788</a> assertList(mapped(a(), String::toUpperCase));
-<a class="jxr_linenumber" name="L2789" href="#L2789">2789</a> assertList(mapped(a(<span class="jxr_string">"foo"</span>, <span class="jxr_string">"bar"</span>, <span class="jxr_string">"baz"</span>), String::toUpperCase), <span class="jxr_string">"FOO"</span>, <span class="jxr_string">"BAR"</span>, <span class="jxr_string">"BAZ"</span>);
-<a class="jxr_linenumber" name="L2790" href="#L2790">2790</a> assertList(mapped(a(<span class="jxr_string">"FOO"</span>, <span class="jxr_string">"BAR"</span>, <span class="jxr_string">"BAZ"</span>), String::toLowerCase), <span class="jxr_string">"foo"</span>, <span class="jxr_string">"bar"</span>, <span class="jxr_string">"baz"</span>);
-<a class="jxr_linenumber" name="L2791" href="#L2791">2791</a> assertList(mapped(a(<span class="jxr_string">"foo"</span>, <span class="jxr_string">"bar"</span>, <span class="jxr_string">"baz"</span>), s -> <span class="jxr_string">"prefix-"</span> + s), <span class="jxr_string">"prefix-foo"</span>, <span class="jxr_string">"prefix-bar"</span>, <span class="jxr_string">"prefix-baz"</span>);
-<a class="jxr_linenumber" name="L2792" href="#L2792">2792</a> assertList(mapped(a(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"world"</span>), s -> s.substring(0, 1)), <span class="jxr_string">"h"</span>, <span class="jxr_string">"w"</span>);
-<a class="jxr_linenumber" name="L2793" href="#L2793">2793</a> assertList(mapped(a(<span class="jxr_string">"test"</span>), <strong class="jxr_keyword">null</strong>), <span class="jxr_string">"test"</span>);
-<a class="jxr_linenumber" name="L2794" href="#L2794">2794</a> assertList(mapped(a(<span class="jxr_string">"a"</span>, <span class="jxr_string">"b"</span>, <span class="jxr_string">"c"</span>), s -> s + s), <span class="jxr_string">"aa"</span>, <span class="jxr_string">"bb"</span>, <span class="jxr_string">"cc"</span>);
-<a class="jxr_linenumber" name="L2795" href="#L2795">2795</a> }
-<a class="jxr_linenumber" name="L2796" href="#L2796">2796</a>
-<a class="jxr_linenumber" name="L2797" href="#L2797">2797</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2798" href="#L2798">2798</a> <em class="jxr_comment">// matches(String,String)</em>
-<a class="jxr_linenumber" name="L2799" href="#L2799">2799</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2800" href="#L2800">2800</a> @Test
-<a class="jxr_linenumber" name="L2801" href="#L2801">2801</a> <strong class="jxr_keyword">void</strong> a120_matches() {
-<a class="jxr_linenumber" name="L2802" href="#L2802">2802</a> assertTrue(matches(<span class="jxr_string">"12345"</span>, <span class="jxr_string">"\\d+"</span>));
-<a class="jxr_linenumber" name="L2803" href="#L2803">2803</a> assertTrue(matches(<span class="jxr_string">"abc123"</span>, <span class="jxr_string">"^[a-z]+\\d+$"</span>));
-<a class="jxr_linenumber" name="L2804" href="#L2804">2804</a> assertTrue(matches(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"^hello$"</span>));
-<a class="jxr_linenumber" name="L2805" href="#L2805">2805</a> assertTrue(matches(<span class="jxr_string">"test@example.com"</span>, <span class="jxr_string">"^[a-z]+@[a-z]+\\.[a-z]+$"</span>));
-<a class="jxr_linenumber" name="L2806" href="#L2806">2806</a> assertFalse(matches(<span class="jxr_string">"abc"</span>, <span class="jxr_string">"\\d+"</span>));
-<a class="jxr_linenumber" name="L2807" href="#L2807">2807</a> assertFalse(matches(<span class="jxr_string">"123"</span>, <span class="jxr_string">"^[a-z]+$"</span>));
-<a class="jxr_linenumber" name="L2808" href="#L2808">2808</a> assertFalse(matches(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"\\d+"</span>));
-<a class="jxr_linenumber" name="L2809" href="#L2809">2809</a> assertFalse(matches(<span class="jxr_string">"test"</span>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2810" href="#L2810">2810</a> assertFalse(matches(<strong class="jxr_keyword">null</strong>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2811" href="#L2811">2811</a> <em class="jxr_comment">// Test with invalid regex - should throw PatternSyntaxException</em>
-<a class="jxr_linenumber" name="L2812" href="#L2812">2812</a> assertThrows(java.util.regex.PatternSyntaxException.<strong class="jxr_keyword">class</strong>, () -> matches(<span class="jxr_string">"test"</span>, <span class="jxr_string">"["</span>));
-<a class="jxr_linenumber" name="L2813" href="#L2813">2813</a> }
-<a class="jxr_linenumber" name="L2814" href="#L2814">2814</a>
-<a class="jxr_linenumber" name="L2815" href="#L2815">2815</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2816" href="#L2816">2816</a> <em class="jxr_comment">// metaphone(String)</em>
-<a class="jxr_linenumber" name="L2817" href="#L2817">2817</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2818" href="#L2818">2818</a> @Test
-<a class="jxr_linenumber" name="L2819" href="#L2819">2819</a> <strong class="jxr_keyword">void</strong> a121_metaphone() {
-<a class="jxr_linenumber" name="L2820" href="#L2820">2820</a> <em class="jxr_comment">// Basic metaphone examples</em>
-<a class="jxr_linenumber" name="L2821" href="#L2821">2821</a> <strong class="jxr_keyword">var</strong> code1 = metaphone(<span class="jxr_string">"Smith"</span>);
-<a class="jxr_linenumber" name="L2822" href="#L2822">2822</a> assertNotNull(code1);
-<a class="jxr_linenumber" name="L2823" href="#L2823">2823</a> assertTrue(code1.startsWith(<span class="jxr_string">"SM"</span>));
-<a class="jxr_linenumber" name="L2824" href="#L2824">2824</a>
-<a class="jxr_linenumber" name="L2825" href="#L2825">2825</a> <strong class="jxr_keyword">var</strong> code2 = metaphone(<span class="jxr_string">"Smythe"</span>);
-<a class="jxr_linenumber" name="L2826" href="#L2826">2826</a> assertNotNull(code2);
-<a class="jxr_linenumber" name="L2827" href="#L2827">2827</a> assertTrue(code2.startsWith(<span class="jxr_string">"SM"</span>));
-<a class="jxr_linenumber" name="L2828" href="#L2828">2828</a>
-<a class="jxr_linenumber" name="L2829" href="#L2829">2829</a> <em class="jxr_comment">// Similar words should have similar codes</em>
-<a class="jxr_linenumber" name="L2830" href="#L2830">2830</a> <strong class="jxr_keyword">var</strong> code3 = metaphone(<span class="jxr_string">"Robert"</span>);
-<a class="jxr_linenumber" name="L2831" href="#L2831">2831</a> assertNotNull(code3);
-<a class="jxr_linenumber" name="L2832" href="#L2832">2832</a>
-<a class="jxr_linenumber" name="L2833" href="#L2833">2833</a> <em class="jxr_comment">// Null/empty input</em>
-<a class="jxr_linenumber" name="L2834" href="#L2834">2834</a> assertNull(metaphone(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2835" href="#L2835">2835</a> assertNull(metaphone(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L2836" href="#L2836">2836</a> assertEquals(<span class="jxr_string">""</span>, metaphone(<span class="jxr_string">"123"</span>));
-<a class="jxr_linenumber" name="L2837" href="#L2837">2837</a>
-<a class="jxr_linenumber" name="L2838" href="#L2838">2838</a> <em class="jxr_comment">// Single character</em>
-<a class="jxr_linenumber" name="L2839" href="#L2839">2839</a> <strong class="jxr_keyword">var</strong> code4 = metaphone(<span class="jxr_string">"A"</span>);
-<a class="jxr_linenumber" name="L2840" href="#L2840">2840</a> assertNotNull(code4);
-<a class="jxr_linenumber" name="L2841" href="#L2841">2841</a> assertFalse(code4.isEmpty());
-<a class="jxr_linenumber" name="L2842" href="#L2842">2842</a> }
-<a class="jxr_linenumber" name="L2843" href="#L2843">2843</a>
-<a class="jxr_linenumber" name="L2844" href="#L2844">2844</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2845" href="#L2845">2845</a> <em class="jxr_comment">// mid(String,int,int)</em>
-<a class="jxr_linenumber" name="L2846" href="#L2846">2846</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2847" href="#L2847">2847</a> @Test
-<a class="jxr_linenumber" name="L2848" href="#L2848">2848</a> <strong class="jxr_keyword">void</strong> a122_mid() {
-<a class="jxr_linenumber" name="L2849" href="#L2849">2849</a> assertNull(mid(<strong class="jxr_keyword">null</strong>, 1, 3));
-<a class="jxr_linenumber" name="L2850" href="#L2850">2850</a> assertEquals(<span class="jxr_string">""</span>, mid(<span class="jxr_string">""</span>, 1, 3));
-<a class="jxr_linenumber" name="L2851" href="#L2851">2851</a> assertEquals(<span class="jxr_string">"ell"</span>, mid(<span class="jxr_string">"hello"</span>, 1, 3));
-<a class="jxr_linenumber" name="L2852" href="#L2852">2852</a> assertEquals(<span class="jxr_string">"ello"</span>, mid(<span class="jxr_string">"hello"</span>, 1, 10));
-<a class="jxr_linenumber" name="L2853" href="#L2853">2853</a> assertEquals(<span class="jxr_string">""</span>, mid(<span class="jxr_string">"hello"</span>, 10, 3));
-<a class="jxr_linenumber" name="L2854" href="#L2854">2854</a> assertEquals(<span class="jxr_string">""</span>, mid(<span class="jxr_string">"hello"</span>, -1, 3));
-<a class="jxr_linenumber" name="L2855" href="#L2855">2855</a> assertEquals(<span class="jxr_string">""</span>, mid(<span class="jxr_string">"hello"</span>, 1, -1));
-<a class="jxr_linenumber" name="L2856" href="#L2856">2856</a> }
-<a class="jxr_linenumber" name="L2857" href="#L2857">2857</a>
-<a class="jxr_linenumber" name="L2858" href="#L2858">2858</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2859" href="#L2859">2859</a> <em class="jxr_comment">// mostFrequentChar(String)</em>
-<a class="jxr_linenumber" name="L2860" href="#L2860">2860</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2861" href="#L2861">2861</a> @Test
-<a class="jxr_linenumber" name="L2862" href="#L2862">2862</a> <strong class="jxr_keyword">void</strong> a123_mostFrequentChar() {
-<a class="jxr_linenumber" name="L2863" href="#L2863">2863</a> assertEquals('l', mostFrequentChar(<span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L2864" href="#L2864">2864</a> assertEquals('a', mostFrequentChar(<span class="jxr_string">"aabbcc"</span>)); <em class="jxr_comment">// First encountered</em>
-<a class="jxr_linenumber" name="L2865" href="#L2865">2865</a> assertEquals('a', mostFrequentChar(<span class="jxr_string">"abcabc"</span>));
-<a class="jxr_linenumber" name="L2866" href="#L2866">2866</a> assertEquals('t', mostFrequentChar(<span class="jxr_string">"test"</span>));
-<a class="jxr_linenumber" name="L2867" href="#L2867">2867</a> assertEquals('l', mostFrequentChar(<span class="jxr_string">"hello world"</span>)); <em class="jxr_comment">// 'l' appears 3 times</em>
-<a class="jxr_linenumber" name="L2868" href="#L2868">2868</a> assertEquals('\0', mostFrequentChar(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2869" href="#L2869">2869</a> assertEquals('\0', mostFrequentChar(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L2870" href="#L2870">2870</a> }
-<a class="jxr_linenumber" name="L2871" href="#L2871">2871</a>
-<a class="jxr_linenumber" name="L2872" href="#L2872">2872</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2873" href="#L2873">2873</a> <em class="jxr_comment">// naturalCompare(String,String)</em>
-<a class="jxr_linenumber" name="L2874" href="#L2874">2874</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2875" href="#L2875">2875</a> @Test
-<a class="jxr_linenumber" name="L2876" href="#L2876">2876</a> <strong class="jxr_keyword">void</strong> a124_naturalCompare() {
-<a class="jxr_linenumber" name="L2877" href="#L2877">2877</a> <em class="jxr_comment">// Natural number comparison</em>
-<a class="jxr_linenumber" name="L2878" href="#L2878">2878</a> assertTrue(naturalCompare(<span class="jxr_string">"file2.txt"</span>, <span class="jxr_string">"file10.txt"</span>) < 0); <em class="jxr_comment">// 2 < 10</em>
-<a class="jxr_linenumber" name="L2879" href="#L2879">2879</a> assertTrue(naturalCompare(<span class="jxr_string">"file10.txt"</span>, <span class="jxr_string">"file2.txt"</span>) > 0); <em class="jxr_comment">// 10 > 2</em>
-<a class="jxr_linenumber" name="L2880" href="#L2880">2880</a> assertEquals(0, naturalCompare(<span class="jxr_string">"file1.txt"</span>, <span class="jxr_string">"file1.txt"</span>));
-<a class="jxr_linenumber" name="L2881" href="#L2881">2881</a> assertTrue(naturalCompare(<span class="jxr_string">"a2"</span>, <span class="jxr_string">"a10"</span>) < 0);
-<a class="jxr_linenumber" name="L2882" href="#L2882">2882</a> assertTrue(naturalCompare(<span class="jxr_string">"a10"</span>, <span class="jxr_string">"a2"</span>) > 0);
-<a class="jxr_linenumber" name="L2883" href="#L2883">2883</a>
-<a class="jxr_linenumber" name="L2884" href="#L2884">2884</a> <em class="jxr_comment">// Regular string comparison</em>
-<a class="jxr_linenumber" name="L2885" href="#L2885">2885</a> assertTrue(naturalCompare(<span class="jxr_string">"apple"</span>, <span class="jxr_string">"banana"</span>) < 0);
-<a class="jxr_linenumber" name="L2886" href="#L2886">2886</a> assertTrue(naturalCompare(<span class="jxr_string">"banana"</span>, <span class="jxr_string">"apple"</span>) > 0);
-<a class="jxr_linenumber" name="L2887" href="#L2887">2887</a> assertEquals(0, naturalCompare(<span class="jxr_string">"test"</span>, <span class="jxr_string">"test"</span>));
-<a class="jxr_linenumber" name="L2888" href="#L2888">2888</a>
-<a class="jxr_linenumber" name="L2889" href="#L2889">2889</a> <em class="jxr_comment">// Null handling</em>
-<a class="jxr_linenumber" name="L2890" href="#L2890">2890</a> assertTrue(naturalCompare(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"test"</span>) < 0);
-<a class="jxr_linenumber" name="L2891" href="#L2891">2891</a> assertTrue(naturalCompare(<span class="jxr_string">"test"</span>, <strong class="jxr_keyword">null</strong>) > 0);
-<a class="jxr_linenumber" name="L2892" href="#L2892">2892</a> assertEquals(0, naturalCompare(<strong class="jxr_keyword">null</strong>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2893" href="#L2893">2893</a> }
-<a class="jxr_linenumber" name="L2894" href="#L2894">2894</a>
-<a class="jxr_linenumber" name="L2895" href="#L2895">2895</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2896" href="#L2896">2896</a> <em class="jxr_comment">// normalizeUnicode(String)</em>
-<a class="jxr_linenumber" name="L2897" href="#L2897">2897</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2898" href="#L2898">2898</a> @Test
-<a class="jxr_linenumber" name="L2899" href="#L2899">2899</a> <strong class="jxr_keyword">void</strong> a125_normalizeUnicode() {
-<a class="jxr_linenumber" name="L2900" href="#L2900">2900</a> <em class="jxr_comment">// Basic normalization</em>
-<a class="jxr_linenumber" name="L2901" href="#L2901">2901</a> <strong class="jxr_keyword">var</strong> normalized = normalizeUnicode(<span class="jxr_string">"café"</span>);
-<a class="jxr_linenumber" name="L2902" href="#L2902">2902</a> assertNotNull(normalized);
-<a class="jxr_linenumber" name="L2903" href="#L2903">2903</a> assertNotEquals(<span class="jxr_string">"café"</span>, normalized); <em class="jxr_comment">// Should be decomposed</em>
-<a class="jxr_linenumber" name="L2904" href="#L2904">2904</a>
-<a class="jxr_linenumber" name="L2905" href="#L2905">2905</a> <em class="jxr_comment">// Null/empty input</em>
-<a class="jxr_linenumber" name="L2906" href="#L2906">2906</a> assertNull(normalizeUnicode(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2907" href="#L2907">2907</a> assertEquals(<span class="jxr_string">""</span>, normalizeUnicode(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L2908" href="#L2908">2908</a>
-<a class="jxr_linenumber" name="L2909" href="#L2909">2909</a> <em class="jxr_comment">// ASCII strings should remain unchanged</em>
-<a class="jxr_linenumber" name="L2910" href="#L2910">2910</a> assertEquals(<span class="jxr_string">"hello"</span>, normalizeUnicode(<span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L2911" href="#L2911">2911</a> }
-<a class="jxr_linenumber" name="L2912" href="#L2912">2912</a>
-<a class="jxr_linenumber" name="L2913" href="#L2913">2913</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2914" href="#L2914">2914</a> <em class="jxr_comment">// normalizeWhitespace(String)</em>
-<a class="jxr_linenumber" name="L2915" href="#L2915">2915</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2916" href="#L2916">2916</a> @Test
-<a class="jxr_linenumber" name="L2917" href="#L2917">2917</a> <strong class="jxr_keyword">void</strong> a126_normalizeWhitespace() {
-<a class="jxr_linenumber" name="L2918" href="#L2918">2918</a> assertNull(normalizeWhitespace(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2919" href="#L2919">2919</a> assertEquals(<span class="jxr_string">""</span>, normalizeWhitespace(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L2920" href="#L2920">2920</a> assertEquals(<span class="jxr_string">"hello world"</span>, normalizeWhitespace(<span class="jxr_string">"hello \t\n world"</span>));
-<a class="jxr_linenumber" name="L2921" href="#L2921">2921</a> assertEquals(<span class="jxr_string">"hello world"</span>, normalizeWhitespace(<span class="jxr_string">" hello world "</span>));
-<a class="jxr_linenumber" name="L2922" href="#L2922">2922</a> assertEquals(<span class="jxr_string">"a b c"</span>, normalizeWhitespace(<span class="jxr_string">"a b c"</span>));
-<a class="jxr_linenumber" name="L2923" href="#L2923">2923</a> }
-<a class="jxr_linenumber" name="L2924" href="#L2924">2924</a>
-<a class="jxr_linenumber" name="L2925" href="#L2925">2925</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2926" href="#L2926">2926</a> <em class="jxr_comment">// notContains(String,char) / notContains(String,CharSequence) / notContains(String,String)</em>
-<a class="jxr_linenumber" name="L2927" href="#L2927">2927</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2928" href="#L2928">2928</a> @Test
-<a class="jxr_linenumber" name="L2929" href="#L2929">2929</a> <strong class="jxr_keyword">void</strong> a127_notContains() {
-<a class="jxr_linenumber" name="L2930" href="#L2930">2930</a> <em class="jxr_comment">// notContains(String, char)</em>
-<a class="jxr_linenumber" name="L2931" href="#L2931">2931</a> assertFalse(notContains(<span class="jxr_string">"test"</span>, 't'));
-<a class="jxr_linenumber" name="L2932" href="#L2932">2932</a> assertTrue(notContains(<span class="jxr_string">"test"</span>, 'x'));
-<a class="jxr_linenumber" name="L2933" href="#L2933">2933</a> assertTrue(notContains(<strong class="jxr_keyword">null</strong>, 't'));
-<a class="jxr_linenumber" name="L2934" href="#L2934">2934</a>
-<a class="jxr_linenumber" name="L2935" href="#L2935">2935</a> <em class="jxr_comment">// notContains(String, CharSequence)</em>
-<a class="jxr_linenumber" name="L2936" href="#L2936">2936</a> assertFalse(notContains(<span class="jxr_string">"test"</span>, <span class="jxr_string">"te"</span>));
-<a class="jxr_linenumber" name="L2937" href="#L2937">2937</a> assertTrue(notContains(<span class="jxr_string">"test"</span>, <span class="jxr_string">"xx"</span>));
-<a class="jxr_linenumber" name="L2938" href="#L2938">2938</a> assertTrue(notContains(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"test"</span>));
-<a class="jxr_linenumber" name="L2939" href="#L2939">2939</a>
-<a class="jxr_linenumber" name="L2940" href="#L2940">2940</a> <em class="jxr_comment">// notContains(String, String)</em>
-<a class="jxr_linenumber" name="L2941" href="#L2941">2941</a> assertFalse(notContains(<span class="jxr_string">"test"</span>, <span class="jxr_string">"te"</span>));
-<a class="jxr_linenumber" name="L2942" href="#L2942">2942</a> assertTrue(notContains(<span class="jxr_string">"test"</span>, <span class="jxr_string">"xyz"</span>));
-<a class="jxr_linenumber" name="L2943" href="#L2943">2943</a> assertTrue(notContains(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"test"</span>));
-<a class="jxr_linenumber" name="L2944" href="#L2944">2944</a> }
-<a class="jxr_linenumber" name="L2945" href="#L2945">2945</a>
-<a class="jxr_linenumber" name="L2946" href="#L2946">2946</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2947" href="#L2947">2947</a> <em class="jxr_comment">// notContainsAll(String,char...) / notContainsAll(String,CharSequence...) / notContainsAll(String,String...)</em>
-<a class="jxr_linenumber" name="L2948" href="#L2948">2948</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2949" href="#L2949">2949</a> @Test
-<a class="jxr_linenumber" name="L2950" href="#L2950">2950</a> <strong class="jxr_keyword">void</strong> a128_notContainsAll() {
-<a class="jxr_linenumber" name="L2951" href="#L2951">2951</a> <em class="jxr_comment">// notContainsAll(String, char...)</em>
-<a class="jxr_linenumber" name="L2952" href="#L2952">2952</a> assertFalse(notContainsAll(<span class="jxr_string">"test"</span>, 't', 'e'));
-<a class="jxr_linenumber" name="L2953" href="#L2953">2953</a> assertTrue(notContainsAll(<span class="jxr_string">"test"</span>, 'x', 'y'));
-<a class="jxr_linenumber" name="L2954" href="#L2954">2954</a> assertTrue(notContainsAll(<strong class="jxr_keyword">null</strong>, 't', 'e'));
-<a class="jxr_linenumber" name="L2955" href="#L2955">2955</a>
-<a class="jxr_linenumber" name="L2956" href="#L2956">2956</a> <em class="jxr_comment">// notContainsAll(String, CharSequence...)</em>
-<a class="jxr_linenumber" name="L2957" href="#L2957">2957</a> assertFalse(notContainsAll(<span class="jxr_string">"test"</span>, <span class="jxr_string">"te"</span>, <span class="jxr_string">"es"</span>));
-<a class="jxr_linenumber" name="L2958" href="#L2958">2958</a> assertTrue(notContainsAll(<span class="jxr_string">"test"</span>, <span class="jxr_string">"xy"</span>, <span class="jxr_string">"zz"</span>));
-<a class="jxr_linenumber" name="L2959" href="#L2959">2959</a> assertTrue(notContainsAll(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"te"</span>, <span class="jxr_string">"es"</span>));
-<a class="jxr_linenumber" name="L2960" href="#L2960">2960</a>
-<a class="jxr_linenumber" name="L2961" href="#L2961">2961</a> <em class="jxr_comment">// notContainsAll(String, String...)</em>
-<a class="jxr_linenumber" name="L2962" href="#L2962">2962</a> assertFalse(notContainsAll(<span class="jxr_string">"test"</span>, <span class="jxr_string">"te"</span>, <span class="jxr_string">"es"</span>));
-<a class="jxr_linenumber" name="L2963" href="#L2963">2963</a> assertTrue(notContainsAll(<span class="jxr_string">"test"</span>, <span class="jxr_string">"xy"</span>, <span class="jxr_string">"zz"</span>));
-<a class="jxr_linenumber" name="L2964" href="#L2964">2964</a> assertTrue(notContainsAll(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"te"</span>, <span class="jxr_string">"es"</span>));
-<a class="jxr_linenumber" name="L2965" href="#L2965">2965</a> }
-<a class="jxr_linenumber" name="L2966" href="#L2966">2966</a>
-<a class="jxr_linenumber" name="L2967" href="#L2967">2967</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2968" href="#L2968">2968</a> <em class="jxr_comment">// notContainsAny(String,char...) / notContainsAny(String,CharSequence...) / notContainsAny(String,String...)</em>
-<a class="jxr_linenumber" name="L2969" href="#L2969">2969</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2970" href="#L2970">2970</a> @Test
-<a class="jxr_linenumber" name="L2971" href="#L2971">2971</a> <strong class="jxr_keyword">void</strong> a129_notContainsAny() {
-<a class="jxr_linenumber" name="L2972" href="#L2972">2972</a> <em class="jxr_comment">// notContainsAny(String, char...)</em>
-<a class="jxr_linenumber" name="L2973" href="#L2973">2973</a> assertFalse(notContainsAny(<span class="jxr_string">"test"</span>, 't', 'x'));
-<a class="jxr_linenumber" name="L2974" href="#L2974">2974</a> assertTrue(notContainsAny(<span class="jxr_string">"test"</span>, 'x', 'y'));
-<a class="jxr_linenumber" name="L2975" href="#L2975">2975</a> assertTrue(notContainsAny(<strong class="jxr_keyword">null</strong>, 't', 'x'));
-<a class="jxr_linenumber" name="L2976" href="#L2976">2976</a>
-<a class="jxr_linenumber" name="L2977" href="#L2977">2977</a> <em class="jxr_comment">// notContainsAny(String, CharSequence...)</em>
-<a class="jxr_linenumber" name="L2978" href="#L2978">2978</a> assertFalse(notContainsAny(<span class="jxr_string">"test"</span>, <span class="jxr_string">"te"</span>, <span class="jxr_string">"xx"</span>));
-<a class="jxr_linenumber" name="L2979" href="#L2979">2979</a> assertTrue(notContainsAny(<span class="jxr_string">"test"</span>, <span class="jxr_string">"xy"</span>, <span class="jxr_string">"zz"</span>));
-<a class="jxr_linenumber" name="L2980" href="#L2980">2980</a> assertTrue(notContainsAny(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"te"</span>, <span class="jxr_string">"xx"</span>));
-<a class="jxr_linenumber" name="L2981" href="#L2981">2981</a>
-<a class="jxr_linenumber" name="L2982" href="#L2982">2982</a> <em class="jxr_comment">// notContainsAny(String, String...)</em>
-<a class="jxr_linenumber" name="L2983" href="#L2983">2983</a> assertFalse(notContainsAny(<span class="jxr_string">"test"</span>, <span class="jxr_string">"te"</span>, <span class="jxr_string">"xx"</span>));
-<a class="jxr_linenumber" name="L2984" href="#L2984">2984</a> assertTrue(notContainsAny(<span class="jxr_string">"test"</span>, <span class="jxr_string">"xy"</span>, <span class="jxr_string">"zz"</span>));
-<a class="jxr_linenumber" name="L2985" href="#L2985">2985</a> assertTrue(notContainsAny(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"te"</span>, <span class="jxr_string">"xx"</span>));
-<a class="jxr_linenumber" name="L2986" href="#L2986">2986</a> }
-<a class="jxr_linenumber" name="L2987" href="#L2987">2987</a>
-<a class="jxr_linenumber" name="L2988" href="#L2988">2988</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2989" href="#L2989">2989</a> <em class="jxr_comment">// nullIfEmpty(String)</em>
-<a class="jxr_linenumber" name="L2990" href="#L2990">2990</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L2991" href="#L2991">2991</a> @Test
-<a class="jxr_linenumber" name="L2992" href="#L2992">2992</a> <strong class="jxr_keyword">void</strong> a130_nullIfEmpty() {
-<a class="jxr_linenumber" name="L2993" href="#L2993">2993</a> assertNull(nullIfEmpty(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L2994" href="#L2994">2994</a> assertNull(nullIfEmpty(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L2995" href="#L2995">2995</a> assertNotNull(nullIfEmpty(<span class="jxr_string">"x"</span>));
-<a class="jxr_linenumber" name="L2996" href="#L2996">2996</a> assertEquals(<span class="jxr_string">"test"</span>, nullIfEmpty(<span class="jxr_string">"test"</span>));
-<a class="jxr_linenumber" name="L2997" href="#L2997">2997</a> }
-<a class="jxr_linenumber" name="L2998" href="#L2998">2998</a>
-<a class="jxr_linenumber" name="L2999" href="#L2999">2999</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3000" href="#L3000">3000</a> <em class="jxr_comment">// obfuscate(String)</em>
-<a class="jxr_linenumber" name="L3001" href="#L3001">3001</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3002" href="#L3002">3002</a> @Test
-<a class="jxr_linenumber" name="L3003" href="#L3003">3003</a> <strong class="jxr_keyword">void</strong> a131_obfuscate() {
-<a class="jxr_linenumber" name="L3004" href="#L3004">3004</a> assertEquals(<span class="jxr_string">"*"</span>, obfuscate(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3005" href="#L3005">3005</a> assertEquals(<span class="jxr_string">"*"</span>, obfuscate(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L3006" href="#L3006">3006</a> assertEquals(<span class="jxr_string">"*"</span>, obfuscate(<span class="jxr_string">"a"</span>));
-<a class="jxr_linenumber" name="L3007" href="#L3007">3007</a> assertEquals(<span class="jxr_string">"p*"</span>, obfuscate(<span class="jxr_string">"pa"</span>));
-<a class="jxr_linenumber" name="L3008" href="#L3008">3008</a> assertEquals(<span class="jxr_string">"p*******"</span>, obfuscate(<span class="jxr_string">"password"</span>));
-<a class="jxr_linenumber" name="L3009" href="#L3009">3009</a> assertEquals(<span class="jxr_string">"1*****"</span>, obfuscate(<span class="jxr_string">"123456"</span>));
-<a class="jxr_linenumber" name="L3010" href="#L3010">3010</a> }
-<a class="jxr_linenumber" name="L3011" href="#L3011">3011</a>
-<a class="jxr_linenumber" name="L3012" href="#L3012">3012</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3013" href="#L3013">3013</a> <em class="jxr_comment">// optimizeString(String)</em>
-<a class="jxr_linenumber" name="L3014" href="#L3014">3014</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3015" href="#L3015">3015</a> @Test
-<a class="jxr_linenumber" name="L3016" href="#L3016">3016</a> <strong class="jxr_keyword">void</strong> a132_optimizeString() {
-<a class="jxr_linenumber" name="L3017" href="#L3017">3017</a> <em class="jxr_comment">// Null/empty input</em>
-<a class="jxr_linenumber" name="L3018" href="#L3018">3018</a> assertNull(optimizeString(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3019" href="#L3019">3019</a> assertNull(optimizeString(<span class="jxr_string">"short"</span>)); <em class="jxr_comment">// No suggestions for short strings</em>
-<a class="jxr_linenumber" name="L3020" href="#L3020">3020</a>
-<a class="jxr_linenumber" name="L3021" href="#L3021">3021</a> <em class="jxr_comment">// Large strings should suggest StringBuilder</em>
-<a class="jxr_linenumber" name="L3022" href="#L3022">3022</a> <strong class="jxr_keyword">var</strong> largeString = <span class="jxr_string">"x"</span>.repeat(1001);
-<a class="jxr_linenumber" name="L3023" href="#L3023">3023</a> <strong class="jxr_keyword">var</strong> suggestions = optimizeString(largeString);
-<a class="jxr_linenumber" name="L3024" href="#L3024">3024</a> assertNotNull(suggestions);
-<a class="jxr_linenumber" name="L3025" href="#L3025">3025</a> assertTrue(suggestions.contains(<span class="jxr_string">"StringBuilder"</span>));
-<a class="jxr_linenumber" name="L3026" href="#L3026">3026</a>
-<a class="jxr_linenumber" name="L3027" href="#L3027">3027</a> <em class="jxr_comment">// Very large strings should suggest compression</em>
-<a class="jxr_linenumber" name="L3028" href="#L3028">3028</a> <strong class="jxr_keyword">var</strong> veryLargeString = <span class="jxr_string">"x"</span>.repeat(10001);
-<a class="jxr_linenumber" name="L3029" href="#L3029">3029</a> <strong class="jxr_keyword">var</strong> suggestions2 = optimizeString(veryLargeString);
-<a class="jxr_linenumber" name="L3030" href="#L3030">3030</a> assertNotNull(suggestions2);
-<a class="jxr_linenumber" name="L3031" href="#L3031">3031</a> assertTrue(suggestions2.contains(<span class="jxr_string">"compression"</span>));
-<a class="jxr_linenumber" name="L3032" href="#L3032">3032</a> }
-<a class="jxr_linenumber" name="L3033" href="#L3033">3033</a>
-<a class="jxr_linenumber" name="L3034" href="#L3034">3034</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3035" href="#L3035">3035</a> <em class="jxr_comment">// ordinal(int)</em>
-<a class="jxr_linenumber" name="L3036" href="#L3036">3036</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3037" href="#L3037">3037</a> @Test
-<a class="jxr_linenumber" name="L3038" href="#L3038">3038</a> <strong class="jxr_keyword">void</strong> a133_ordinal() {
-<a class="jxr_linenumber" name="L3039" href="#L3039">3039</a> assertEquals(<span class="jxr_string">"1st"</span>, ordinal(1));
-<a class="jxr_linenumber" name="L3040" href="#L3040">3040</a> assertEquals(<span class="jxr_string">"2nd"</span>, ordinal(2));
-<a class="jxr_linenumber" name="L3041" href="#L3041">3041</a> assertEquals(<span class="jxr_string">"3rd"</span>, ordinal(3));
-<a class="jxr_linenumber" name="L3042" href="#L3042">3042</a> assertEquals(<span class="jxr_string">"4th"</span>, ordinal(4));
-<a class="jxr_linenumber" name="L3043" href="#L3043">3043</a> assertEquals(<span class="jxr_string">"11th"</span>, ordinal(11)); <em class="jxr_comment">// Special case</em>
-<a class="jxr_linenumber" name="L3044" href="#L3044">3044</a> assertEquals(<span class="jxr_string">"12th"</span>, ordinal(12)); <em class="jxr_comment">// Special case</em>
-<a class="jxr_linenumber" name="L3045" href="#L3045">3045</a> assertEquals(<span class="jxr_string">"13th"</span>, ordinal(13)); <em class="jxr_comment">// Special case</em>
-<a class="jxr_linenumber" name="L3046" href="#L3046">3046</a> assertEquals(<span class="jxr_string">"21st"</span>, ordinal(21));
-<a class="jxr_linenumber" name="L3047" href="#L3047">3047</a> assertEquals(<span class="jxr_string">"22nd"</span>, ordinal(22));
-<a class="jxr_linenumber" name="L3048" href="#L3048">3048</a> assertEquals(<span class="jxr_string">"23rd"</span>, ordinal(23));
-<a class="jxr_linenumber" name="L3049" href="#L3049">3049</a> assertEquals(<span class="jxr_string">"24th"</span>, ordinal(24));
-<a class="jxr_linenumber" name="L3050" href="#L3050">3050</a> assertEquals(<span class="jxr_string">"101st"</span>, ordinal(101));
-<a class="jxr_linenumber" name="L3051" href="#L3051">3051</a> assertEquals(<span class="jxr_string">"102nd"</span>, ordinal(102));
-<a class="jxr_linenumber" name="L3052" href="#L3052">3052</a> assertEquals(<span class="jxr_string">"103rd"</span>, ordinal(103));
-<a class="jxr_linenumber" name="L3053" href="#L3053">3053</a> assertEquals(<span class="jxr_string">"111th"</span>, ordinal(111)); <em class="jxr_comment">// Special case</em>
-<a class="jxr_linenumber" name="L3054" href="#L3054">3054</a> assertEquals(<span class="jxr_string">"-1st"</span>, ordinal(-1));
-<a class="jxr_linenumber" name="L3055" href="#L3055">3055</a> }
-<a class="jxr_linenumber" name="L3056" href="#L3056">3056</a>
-<a class="jxr_linenumber" name="L3057" href="#L3057">3057</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3058" href="#L3058">3058</a> <em class="jxr_comment">// padCenter(String,int,char)</em>
-<a class="jxr_linenumber" name="L3059" href="#L3059">3059</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3060" href="#L3060">3060</a> @Test
-<a class="jxr_linenumber" name="L3061" href="#L3061">3061</a> <strong class="jxr_keyword">void</strong> a134_padCenter() {
-<a class="jxr_linenumber" name="L3062" href="#L3062">3062</a> assertEquals(<span class="jxr_string">" "</span>, padCenter(<strong class="jxr_keyword">null</strong>, 5, ' '));
-<a class="jxr_linenumber" name="L3063" href="#L3063">3063</a> assertEquals(<span class="jxr_string">" "</span>, padCenter(<span class="jxr_string">""</span>, 5, ' '));
-<a class="jxr_linenumber" name="L3064" href="#L3064">3064</a> assertEquals(<span class="jxr_string">" hi "</span>, padCenter(<span class="jxr_string">"hi"</span>, 6, ' '));
-<a class="jxr_linenumber" name="L3065" href="#L3065">3065</a> assertEquals(<span class="jxr_string">" hi "</span>, padCenter(<span class="jxr_string">"hi"</span>, 7, ' '));
-<a class="jxr_linenumber" name="L3066" href="#L3066">3066</a> assertEquals(<span class="jxr_string">"hello"</span>, padCenter(<span class="jxr_string">"hello"</span>, 3, ' '));
-<a class="jxr_linenumber" name="L3067" href="#L3067">3067</a> assertEquals(<span class="jxr_string">" hello "</span>, padCenter(<span class="jxr_string">"hello"</span>, 7, ' '));
-<a class="jxr_linenumber" name="L3068" href="#L3068">3068</a> }
-<a class="jxr_linenumber" name="L3069" href="#L3069">3069</a>
-<a class="jxr_linenumber" name="L3070" href="#L3070">3070</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3071" href="#L3071">3071</a> <em class="jxr_comment">// padLeft(String,int,char)</em>
-<a class="jxr_linenumber" name="L3072" href="#L3072">3072</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3073" href="#L3073">3073</a> @Test
-<a class="jxr_linenumber" name="L3074" href="#L3074">3074</a> <strong class="jxr_keyword">void</strong> a135_padLeft() {
-<a class="jxr_linenumber" name="L3075" href="#L3075">3075</a> assertEquals(<span class="jxr_string">" "</span>, padLeft(<strong class="jxr_keyword">null</strong>, 5, ' '));
-<a class="jxr_linenumber" name="L3076" href="#L3076">3076</a> assertEquals(<span class="jxr_string">" "</span>, padLeft(<span class="jxr_string">""</span>, 5, ' '));
-<a class="jxr_linenumber" name="L3077" href="#L3077">3077</a> assertEquals(<span class="jxr_string">" hello"</span>, padLeft(<span class="jxr_string">"hello"</span>, 8, ' '));
-<a class="jxr_linenumber" name="L3078" href="#L3078">3078</a> assertEquals(<span class="jxr_string">"hello"</span>, padLeft(<span class="jxr_string">"hello"</span>, 3, ' '));
-<a class="jxr_linenumber" name="L3079" href="#L3079">3079</a> assertEquals(<span class="jxr_string">"00123"</span>, padLeft(<span class="jxr_string">"123"</span>, 5, '0'));
-<a class="jxr_linenumber" name="L3080" href="#L3080">3080</a> }
-<a class="jxr_linenumber" name="L3081" href="#L3081">3081</a>
-<a class="jxr_linenumber" name="L3082" href="#L3082">3082</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3083" href="#L3083">3083</a> <em class="jxr_comment">// padRight(String,int,char)</em>
-<a class="jxr_linenumber" name="L3084" href="#L3084">3084</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3085" href="#L3085">3085</a> @Test
-<a class="jxr_linenumber" name="L3086" href="#L3086">3086</a> <strong class="jxr_keyword">void</strong> a136_padRight() {
-<a class="jxr_linenumber" name="L3087" href="#L3087">3087</a> assertEquals(<span class="jxr_string">" "</span>, padRight(<strong class="jxr_keyword">null</strong>, 5, ' '));
-<a class="jxr_linenumber" name="L3088" href="#L3088">3088</a> assertEquals(<span class="jxr_string">" "</span>, padRight(<span class="jxr_string">""</span>, 5, ' '));
-<a class="jxr_linenumber" name="L3089" href="#L3089">3089</a> assertEquals(<span class="jxr_string">"hello "</span>, padRight(<span class="jxr_string">"hello"</span>, 8, ' '));
-<a class="jxr_linenumber" name="L3090" href="#L3090">3090</a> assertEquals(<span class="jxr_string">"hello"</span>, padRight(<span class="jxr_string">"hello"</span>, 3, ' '));
-<a class="jxr_linenumber" name="L3091" href="#L3091">3091</a> assertEquals(<span class="jxr_string">"12300"</span>, padRight(<span class="jxr_string">"123"</span>, 5, '0'));
-<a class="jxr_linenumber" name="L3092" href="#L3092">3092</a> }
-<a class="jxr_linenumber" name="L3093" href="#L3093">3093</a>
-<a class="jxr_linenumber" name="L3094" href="#L3094">3094</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3095" href="#L3095">3095</a> <em class="jxr_comment">// parseCharacter(Object)</em>
-<a class="jxr_linenumber" name="L3096" href="#L3096">3096</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3097" href="#L3097">3097</a> @Test
-<a class="jxr_linenumber" name="L3098" href="#L3098">3098</a> <strong class="jxr_keyword">void</strong> a137_parseCharacter() {
-<a class="jxr_linenumber" name="L3099" href="#L3099">3099</a> assertNull(parseCharacter(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3100" href="#L3100">3100</a> assertNull(parseCharacter(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L3101" href="#L3101">3101</a> assertEquals(Character.valueOf('a'), parseCharacter(<span class="jxr_string">"a"</span>));
-<a class="jxr_linenumber" name="L3102" href="#L3102">3102</a> assertEquals(Character.valueOf('1'), parseCharacter(<span class="jxr_string">"1"</span>));
-<a class="jxr_linenumber" name="L3103" href="#L3103">3103</a> assertEquals(Character.valueOf(' '), parseCharacter(<span class="jxr_string">" "</span>));
-<a class="jxr_linenumber" name="L3104" href="#L3104">3104</a> <em class="jxr_comment">// Invalid - should throw</em>
-<a class="jxr_linenumber" name="L3105" href="#L3105">3105</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> parseCharacter(<span class="jxr_string">"ab"</span>));
-<a class="jxr_linenumber" name="L3106" href="#L3106">3106</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> parseCharacter(<span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L3107" href="#L3107">3107</a> }
-<a class="jxr_linenumber" name="L3108" href="#L3108">3108</a>
-<a class="jxr_linenumber" name="L3109" href="#L3109">3109</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3110" href="#L3110">3110</a> <em class="jxr_comment">// parseFloat(String)</em>
-<a class="jxr_linenumber" name="L3111" href="#L3111">3111</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3112" href="#L3112">3112</a> @Test
-<a class="jxr_linenumber" name="L3113" href="#L3113">3113</a> <strong class="jxr_keyword">void</strong> a138_parseFloat() {
-<a class="jxr_linenumber" name="L3114" href="#L3114">3114</a> assertEquals(1.5f, parseFloat(<span class="jxr_string">"1.5"</span>), 0.0001f);
-<a class="jxr_linenumber" name="L3115" href="#L3115">3115</a> assertEquals(1000.5f, parseFloat(<span class="jxr_string">"1_000.5"</span>), 0.0001f);
-<a class="jxr_linenumber" name="L3116" href="#L3116">3116</a> assertEquals(-123.45f, parseFloat(<span class="jxr_string">"-123.45"</span>), 0.0001f);
-<a class="jxr_linenumber" name="L3117" href="#L3117">3117</a> assertEquals(0.0f, parseFloat(<span class="jxr_string">"0"</span>), 0.0001f);
-<a class="jxr_linenumber" name="L3118" href="#L3118">3118</a> <em class="jxr_comment">// Should throw for invalid input</em>
-<a class="jxr_linenumber" name="L3119" href="#L3119">3119</a> assertThrows(NumberFormatException.<strong class="jxr_keyword">class</strong>, () -> parseFloat(<span class="jxr_string">"invalid"</span>));
-<a class="jxr_linenumber" name="L3120" href="#L3120">3120</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> parseFloat(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3121" href="#L3121">3121</a> }
-<a class="jxr_linenumber" name="L3122" href="#L3122">3122</a>
-<a class="jxr_linenumber" name="L3123" href="#L3123">3123</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3124" href="#L3124">3124</a> <em class="jxr_comment">// parseInt(String)</em>
-<a class="jxr_linenumber" name="L3125" href="#L3125">3125</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3126" href="#L3126">3126</a> @Test
-<a class="jxr_linenumber" name="L3127" href="#L3127">3127</a> <strong class="jxr_keyword">void</strong> a139_parseInt() {
-<a class="jxr_linenumber" name="L3128" href="#L3128">3128</a> assertEquals(123, parseInt(<span class="jxr_string">"123"</span>));
-<a class="jxr_linenumber" name="L3129" href="#L3129">3129</a> assertEquals(1000000, parseInt(<span class="jxr_string">"1_000_000"</span>));
-<a class="jxr_linenumber" name="L3130" href="#L3130">3130</a> assertEquals(-456, parseInt(<span class="jxr_string">"-456"</span>));
-<a class="jxr_linenumber" name="L3131" href="#L3131">3131</a> assertEquals(0, parseInt(<span class="jxr_string">"0"</span>));
-<a class="jxr_linenumber" name="L3132" href="#L3132">3132</a> <em class="jxr_comment">// Should throw for invalid input</em>
-<a class="jxr_linenumber" name="L3133" href="#L3133">3133</a> assertThrows(NumberFormatException.<strong class="jxr_keyword">class</strong>, () -> parseInt(<span class="jxr_string">"invalid"</span>));
-<a class="jxr_linenumber" name="L3134" href="#L3134">3134</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> parseInt(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3135" href="#L3135">3135</a> }
-<a class="jxr_linenumber" name="L3136" href="#L3136">3136</a>
-<a class="jxr_linenumber" name="L3137" href="#L3137">3137</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3138" href="#L3138">3138</a> <em class="jxr_comment">// parseIntWithSuffix(String)</em>
-<a class="jxr_linenumber" name="L3139" href="#L3139">3139</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3140" href="#L3140">3140</a> @Test
-<a class="jxr_linenumber" name="L3141" href="#L3141">3141</a> <strong class="jxr_keyword">void</strong> a140_parseIntWithSuffix() {
-<a class="jxr_linenumber" name="L3142" href="#L3142">3142</a> <em class="jxr_comment">// Binary multipliers (1024-based)</em>
-<a class="jxr_linenumber" name="L3143" href="#L3143">3143</a> assertEquals(1024, parseIntWithSuffix(<span class="jxr_string">"1K"</span>));
-<a class="jxr_linenumber" name="L3144" href="#L3144">3144</a> assertEquals(1024 * 1024, parseIntWithSuffix(<span class="jxr_string">"1M"</span>));
-<a class="jxr_linenumber" name="L3145" href="#L3145">3145</a> assertEquals(1024 * 1024 * 1024, parseIntWithSuffix(<span class="jxr_string">"1G"</span>));
-<a class="jxr_linenumber" name="L3146" href="#L3146">3146</a>
-<a class="jxr_linenumber" name="L3147" href="#L3147">3147</a> <em class="jxr_comment">// Decimal multipliers (1000-based)</em>
-<a class="jxr_linenumber" name="L3148" href="#L3148">3148</a> assertEquals(1000, parseIntWithSuffix(<span class="jxr_string">"1k"</span>));
-<a class="jxr_linenumber" name="L3149" href="#L3149">3149</a> assertEquals(1000 * 1000, parseIntWithSuffix(<span class="jxr_string">"1m"</span>));
-<a class="jxr_linenumber" name="L3150" href="#L3150">3150</a> assertEquals(1000 * 1000 * 1000, parseIntWithSuffix(<span class="jxr_string">"1g"</span>));
-<a class="jxr_linenumber" name="L3151" href="#L3151">3151</a>
-<a class="jxr_linenumber" name="L3152" href="#L3152">3152</a> <em class="jxr_comment">// No suffix</em>
-<a class="jxr_linenumber" name="L3153" href="#L3153">3153</a> assertEquals(123, parseIntWithSuffix(<span class="jxr_string">"123"</span>));
-<a class="jxr_linenumber" name="L3154" href="#L3154">3154</a> assertEquals(456, parseIntWithSuffix(<span class="jxr_string">"456"</span>));
-<a class="jxr_linenumber" name="L3155" href="#L3155">3155</a>
-<a class="jxr_linenumber" name="L3156" href="#L3156">3156</a> <em class="jxr_comment">// With spaces</em>
-<a class="jxr_linenumber" name="L3157" href="#L3157">3157</a> assertEquals(1024, parseIntWithSuffix(<span class="jxr_string">"1 K"</span>));
-<a class="jxr_linenumber" name="L3158" href="#L3158">3158</a> assertEquals(1000, parseIntWithSuffix(<span class="jxr_string">"1 k"</span>));
-<a class="jxr_linenumber" name="L3159" href="#L3159">3159</a>
-<a class="jxr_linenumber" name="L3160" href="#L3160">3160</a> <em class="jxr_comment">// Should throw for null</em>
-<a class="jxr_linenumber" name="L3161" href="#L3161">3161</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> parseIntWithSuffix(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3162" href="#L3162">3162</a> }
-<a class="jxr_linenumber" name="L3163" href="#L3163">3163</a>
-<a class="jxr_linenumber" name="L3164" href="#L3164">3164</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3165" href="#L3165">3165</a> <em class="jxr_comment">// parseIsoCalendar(String)</em>
-<a class="jxr_linenumber" name="L3166" href="#L3166">3166</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3167" href="#L3167">3167</a> @Test
-<a class="jxr_linenumber" name="L3168" href="#L3168">3168</a> <strong class="jxr_keyword">void</strong> a141_parseIsoCalendar() <strong class="jxr_keyword">throws</strong> Exception {
-<a class="jxr_linenumber" name="L3169" href="#L3169">3169</a> <em class="jxr_comment">// Various ISO8601 formats</em>
-<a class="jxr_linenumber" name="L3170" href="#L3170">3170</a> <strong class="jxr_keyword">var</strong> cal1 = parseIsoCalendar(<span class="jxr_string">"2023"</span>);
-<a class="jxr_linenumber" name="L3171" href="#L3171">3171</a> assertNotNull(cal1);
-<a class="jxr_linenumber" name="L3172" href="#L3172">3172</a> assertEquals(2023, cal1.get(Calendar.YEAR));
-<a class="jxr_linenumber" name="L3173" href="#L3173">3173</a>
-<a class="jxr_linenumber" name="L3174" href="#L3174">3174</a> <strong class="jxr_keyword">var</strong> cal2 = parseIsoCalendar(<span class="jxr_string">"2023-12"</span>);
-<a class="jxr_linenumber" name="L3175" href="#L3175">3175</a> assertNotNull(cal2);
-<a class="jxr_linenumber" name="L3176" href="#L3176">3176</a> assertEquals(2023, cal2.get(Calendar.YEAR));
-<a class="jxr_linenumber" name="L3177" href="#L3177">3177</a> assertEquals(Calendar.DECEMBER, cal2.get(Calendar.MONTH));
-<a class="jxr_linenumber" name="L3178" href="#L3178">3178</a>
-<a class="jxr_linenumber" name="L3179" href="#L3179">3179</a> <strong class="jxr_keyword">var</strong> cal3 = parseIsoCalendar(<span class="jxr_string">"2023-12-25"</span>);
-<a class="jxr_linenumber" name="L3180" href="#L3180">3180</a> assertNotNull(cal3);
-<a class="jxr_linenumber" name="L3181" href="#L3181">3181</a> assertEquals(2023, cal3.get(Calendar.YEAR));
-<a class="jxr_linenumber" name="L3182" href="#L3182">3182</a> assertEquals(Calendar.DECEMBER, cal3.get(Calendar.MONTH));
-<a class="jxr_linenumber" name="L3183" href="#L3183">3183</a> assertEquals(25, cal3.get(Calendar.DAY_OF_MONTH));
-<a class="jxr_linenumber" name="L3184" href="#L3184">3184</a>
-<a class="jxr_linenumber" name="L3185" href="#L3185">3185</a> <strong class="jxr_keyword">var</strong> cal4 = parseIsoCalendar(<span class="jxr_string">"2023-12-25T14:30:00"</span>);
-<a class="jxr_linenumber" name="L3186" href="#L3186">3186</a> assertNotNull(cal4);
-<a class="jxr_linenumber" name="L3187" href="#L3187">3187</a> assertEquals(14, cal4.get(Calendar.HOUR_OF_DAY));
-<a class="jxr_linenumber" name="L3188" href="#L3188">3188</a> assertEquals(30, cal4.get(Calendar.MINUTE));
-<a class="jxr_linenumber" name="L3189" href="#L3189">3189</a> assertEquals(0, cal4.get(Calendar.SECOND));
-<a class="jxr_linenumber" name="L3190" href="#L3190">3190</a>
-<a class="jxr_linenumber" name="L3191" href="#L3191">3191</a> <em class="jxr_comment">// Should throw for invalid dates</em>
-<a class="jxr_linenumber" name="L3192" href="#L3192">3192</a> assertThrows(Exception.<strong class="jxr_keyword">class</strong>, () -> parseIsoCalendar(<span class="jxr_string">"invalid"</span>));
-<a class="jxr_linenumber" name="L3193" href="#L3193">3193</a> assertThrows(Exception.<strong class="jxr_keyword">class</strong>, () -> parseIsoCalendar(<span class="jxr_string">"2023-13-25"</span>)); <em class="jxr_comment">// Invalid month</em>
-<a class="jxr_linenumber" name="L3194" href="#L3194">3194</a> }
-<a class="jxr_linenumber" name="L3195" href="#L3195">3195</a>
-<a class="jxr_linenumber" name="L3196" href="#L3196">3196</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3197" href="#L3197">3197</a> <em class="jxr_comment">// parseIsoDate(String)</em>
-<a class="jxr_linenumber" name="L3198" href="#L3198">3198</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3199" href="#L3199">3199</a> @Test
-<a class="jxr_linenumber" name="L3200" href="#L3200">3200</a> <strong class="jxr_keyword">void</strong> a142_parseIsoDate() <strong class="jxr_keyword">throws</strong> Exception {
-<a class="jxr_linenumber" name="L3201" href="#L3201">3201</a> <em class="jxr_comment">// parseIsoDate wraps parseIsoCalendar, so test similar cases</em>
-<a class="jxr_linenumber" name="L3202" href="#L3202">3202</a> <strong class="jxr_keyword">var</strong> date1 = parseIsoDate(<span class="jxr_string">"2023-12-25"</span>);
-<a class="jxr_linenumber" name="L3203" href="#L3203">3203</a> assertNotNull(date1);
-<a class="jxr_linenumber" name="L3204" href="#L3204">3204</a>
-<a class="jxr_linenumber" name="L3205" href="#L3205">3205</a> <strong class="jxr_keyword">var</strong> date2 = parseIsoDate(<span class="jxr_string">"2023-12-25T14:30:00"</span>);
-<a class="jxr_linenumber" name="L3206" href="#L3206">3206</a> assertNotNull(date2);
-<a class="jxr_linenumber" name="L3207" href="#L3207">3207</a>
-<a class="jxr_linenumber" name="L3208" href="#L3208">3208</a> <em class="jxr_comment">// Should throw for invalid dates</em>
-<a class="jxr_linenumber" name="L3209" href="#L3209">3209</a> assertThrows(Exception.<strong class="jxr_keyword">class</strong>, () -> parseIsoDate(<span class="jxr_string">"invalid"</span>));
-<a class="jxr_linenumber" name="L3210" href="#L3210">3210</a> }
-<a class="jxr_linenumber" name="L3211" href="#L3211">3211</a>
-<a class="jxr_linenumber" name="L3212" href="#L3212">3212</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3213" href="#L3213">3213</a> <em class="jxr_comment">// parseLong(String)</em>
-<a class="jxr_linenumber" name="L3214" href="#L3214">3214</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3215" href="#L3215">3215</a> @Test
-<a class="jxr_linenumber" name="L3216" href="#L3216">3216</a> <strong class="jxr_keyword">void</strong> a143_parseLong() {
-<a class="jxr_linenumber" name="L3217" href="#L3217">3217</a> assertEquals(123L, parseLong(<span class="jxr_string">"123"</span>));
-<a class="jxr_linenumber" name="L3218" href="#L3218">3218</a> assertEquals(1000000L, parseLong(<span class="jxr_string">"1_000_000"</span>));
-<a class="jxr_linenumber" name="L3219" href="#L3219">3219</a> assertEquals(-456L, parseLong(<span class="jxr_string">"-456"</span>));
-<a class="jxr_linenumber" name="L3220" href="#L3220">3220</a> assertEquals(0L, parseLong(<span class="jxr_string">"0"</span>));
-<a class="jxr_linenumber" name="L3221" href="#L3221">3221</a> <em class="jxr_comment">// Should throw for invalid input</em>
-<a class="jxr_linenumber" name="L3222" href="#L3222">3222</a> assertThrows(NumberFormatException.<strong class="jxr_keyword">class</strong>, () -> parseLong(<span class="jxr_string">"invalid"</span>));
-<a class="jxr_linenumber" name="L3223" href="#L3223">3223</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> parseLong(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3224" href="#L3224">3224</a> }
-<a class="jxr_linenumber" name="L3225" href="#L3225">3225</a>
-<a class="jxr_linenumber" name="L3226" href="#L3226">3226</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3227" href="#L3227">3227</a> <em class="jxr_comment">// parseLongWithSuffix(String)</em>
-<a class="jxr_linenumber" name="L3228" href="#L3228">3228</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3229" href="#L3229">3229</a> @Test
-<a class="jxr_linenumber" name="L3230" href="#L3230">3230</a> <strong class="jxr_keyword">void</strong> a144_parseLongWithSuffix() {
-<a class="jxr_linenumber" name="L3231" href="#L3231">3231</a> <em class="jxr_comment">// Binary multipliers (1024-based)</em>
-<a class="jxr_linenumber" name="L3232" href="#L3232">3232</a> assertEquals(1024L, parseLongWithSuffix(<span class="jxr_string">"1K"</span>));
-<a class="jxr_linenumber" name="L3233" href="#L3233">3233</a> assertEquals(1024L * 1024, parseLongWithSuffix(<span class="jxr_string">"1M"</span>));
-<a class="jxr_linenumber" name="L3234" href="#L3234">3234</a> assertEquals(1024L * 1024 * 1024, parseLongWithSuffix(<span class="jxr_string">"1G"</span>));
-<a class="jxr_linenumber" name="L3235" href="#L3235">3235</a> assertEquals(1024L * 1024 * 1024 * 1024, parseLongWithSuffix(<span class="jxr_string">"1T"</span>));
-<a class="jxr_linenumber" name="L3236" href="#L3236">3236</a> <em class="jxr_comment">// Note: "P" (petabyte) multiplier may overflow, so we skip testing it</em>
-<a class="jxr_linenumber" name="L3237" href="#L3237">3237</a>
-<a class="jxr_linenumber" name="L3238" href="#L3238">3238</a> <em class="jxr_comment">// Decimal multipliers (1000-based)</em>
-<a class="jxr_linenumber" name="L3239" href="#L3239">3239</a> assertEquals(1000L, parseLongWithSuffix(<span class="jxr_string">"1k"</span>));
-<a class="jxr_linenumber" name="L3240" href="#L3240">3240</a> assertEquals(1000L * 1000, parseLongWithSuffix(<span class="jxr_string">"1m"</span>));
-<a class="jxr_linenumber" name="L3241" href="#L3241">3241</a> assertEquals(1000L * 1000 * 1000, parseLongWithSuffix(<span class="jxr_string">"1g"</span>));
-<a class="jxr_linenumber" name="L3242" href="#L3242">3242</a> assertEquals(1000L * 1000 * 1000 * 1000, parseLongWithSuffix(<span class="jxr_string">"1t"</span>));
-<a class="jxr_linenumber" name="L3243" href="#L3243">3243</a> <em class="jxr_comment">// Note: "1p" (petabyte) multiplier may overflow, so we skip testing it</em>
-<a class="jxr_linenumber" name="L3244" href="#L3244">3244</a>
-<a class="jxr_linenumber" name="L3245" href="#L3245">3245</a> <em class="jxr_comment">// No suffix</em>
-<a class="jxr_linenumber" name="L3246" href="#L3246">3246</a> assertEquals(123L, parseLongWithSuffix(<span class="jxr_string">"123"</span>));
-<a class="jxr_linenumber" name="L3247" href="#L3247">3247</a> assertEquals(456L, parseLongWithSuffix(<span class="jxr_string">"456"</span>));
-<a class="jxr_linenumber" name="L3248" href="#L3248">3248</a>
-<a class="jxr_linenumber" name="L3249" href="#L3249">3249</a> <em class="jxr_comment">// Should throw for null</em>
-<a class="jxr_linenumber" name="L3250" href="#L3250">3250</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> parseLongWithSuffix(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3251" href="#L3251">3251</a> }
-<a class="jxr_linenumber" name="L3252" href="#L3252">3252</a>
-<a class="jxr_linenumber" name="L3253" href="#L3253">3253</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3254" href="#L3254">3254</a> <em class="jxr_comment">// parseMap(String,char,char,boolean)</em>
-<a class="jxr_linenumber" name="L3255" href="#L3255">3255</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3256" href="#L3256">3256</a> @Test
-<a class="jxr_linenumber" name="L3257" href="#L3257">3257</a> <strong class="jxr_keyword">void</strong> a145_parseMap() {
-<a class="jxr_linenumber" name="L3258" href="#L3258">3258</a> <em class="jxr_comment">// Basic parsing</em>
-<a class="jxr_linenumber" name="L3259" href="#L3259">3259</a> <strong class="jxr_keyword">var</strong> map1 = parseMap(<span class="jxr_string">"key1=value1,key2=value2"</span>, '=', ',', false);
-<a class="jxr_linenumber" name="L3260" href="#L3260">3260</a> assertEquals(2, map1.size());
-<a class="jxr_linenumber" name="L3261" href="#L3261">3261</a> assertEquals(<span class="jxr_string">"value1"</span>, map1.get(<span class="jxr_string">"key1"</span>));
-<a class="jxr_linenumber" name="L3262" href="#L3262">3262</a> assertEquals(<span class="jxr_string">"value2"</span>, map1.get(<span class="jxr_string">"key2"</span>));
+<a class="jxr_linenumber" name="L2464" href="#L2464">2464</a> <em class="jxr_comment">// isValidIpAddress(String)</em>
+<a class="jxr_linenumber" name="L2465" href="#L2465">2465</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2466" href="#L2466">2466</a> @Test
+<a class="jxr_linenumber" name="L2467" href="#L2467">2467</a> <strong class="jxr_keyword">void</strong> a103_isValidIpAddress() {
+<a class="jxr_linenumber" name="L2468" href="#L2468">2468</a> <em class="jxr_comment">// Valid IPv4 addresses</em>
+<a class="jxr_linenumber" name="L2469" href="#L2469">2469</a> assertTrue(isValidIpAddress(<span class="jxr_string">"192.168.1.1"</span>));
+<a class="jxr_linenumber" name="L2470" href="#L2470">2470</a> assertTrue(isValidIpAddress(<span class="jxr_string">"0.0.0.0"</span>));
+<a class="jxr_linenumber" name="L2471" href="#L2471">2471</a> assertTrue(isValidIpAddress(<span class="jxr_string">"255.255.255.255"</span>));
+<a class="jxr_linenumber" name="L2472" href="#L2472">2472</a> assertTrue(isValidIpAddress(<span class="jxr_string">"127.0.0.1"</span>));
+<a class="jxr_linenumber" name="L2473" href="#L2473">2473</a>
+<a class="jxr_linenumber" name="L2474" href="#L2474">2474</a> <em class="jxr_comment">// Invalid IPv4 addresses</em>
+<a class="jxr_linenumber" name="L2475" href="#L2475">2475</a> assertFalse(isValidIpAddress(<span class="jxr_string">"256.1.1.1"</span>)); <em class="jxr_comment">// Out of range</em>
+<a class="jxr_linenumber" name="L2476" href="#L2476">2476</a> assertFalse(isValidIpAddress(<span class="jxr_string">"192.168.1"</span>)); <em class="jxr_comment">// Too few octets</em>
+<a class="jxr_linenumber" name="L2477" href="#L2477">2477</a> assertFalse(isValidIpAddress(<span class="jxr_string">"192.168.1.1.1"</span>)); <em class="jxr_comment">// Too many octets</em>
+<a class="jxr_linenumber" name="L2478" href="#L2478">2478</a> assertFalse(isValidIpAddress(<span class="jxr_string">"not.an.ip"</span>)); <em class="jxr_comment">// Not numeric</em>
+<a class="jxr_linenumber" name="L2479" href="#L2479">2479</a> assertFalse(isValidIpAddress(<span class="jxr_string">"-1.1.1.1"</span>)); <em class="jxr_comment">// Negative number</em>
+<a class="jxr_linenumber" name="L2480" href="#L2480">2480</a>
+<a class="jxr_linenumber" name="L2481" href="#L2481">2481</a> <em class="jxr_comment">// Valid IPv6 addresses (basic validation)</em>
+<a class="jxr_linenumber" name="L2482" href="#L2482">2482</a> assertTrue(isValidIpAddress(<span class="jxr_string">"2001:0db8:85a3:0000:0000:8a2e:0370:7334"</span>));
+<a class="jxr_linenumber" name="L2483" href="#L2483">2483</a> assertTrue(isValidIpAddress(<span class="jxr_string">"::1"</span>)); <em class="jxr_comment">// Localhost</em>
+<a class="jxr_linenumber" name="L2484" href="#L2484">2484</a> assertTrue(isValidIpAddress(<span class="jxr_string">"2001:db8::1"</span>)); <em class="jxr_comment">// Compressed</em>
+<a class="jxr_linenumber" name="L2485" href="#L2485">2485</a>
+<a class="jxr_linenumber" name="L2486" href="#L2486">2486</a> <em class="jxr_comment">// Invalid IPv6 addresses</em>
+<a class="jxr_linenumber" name="L2487" href="#L2487">2487</a> assertFalse(isValidIpAddress(<span class="jxr_string">"2001:0db8:85a3:0000:0000:8a2e:0370:7334:9999"</span>)); <em class="jxr_comment">// Too many segments</em>
+<a class="jxr_linenumber" name="L2488" href="#L2488">2488</a> assertFalse(isValidIpAddress(<span class="jxr_string">"gggg::1"</span>)); <em class="jxr_comment">// Invalid hex</em>
+<a class="jxr_linenumber" name="L2489" href="#L2489">2489</a>
+<a class="jxr_linenumber" name="L2490" href="#L2490">2490</a> <em class="jxr_comment">// Null/empty input</em>
+<a class="jxr_linenumber" name="L2491" href="#L2491">2491</a> assertFalse(isValidIpAddress(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2492" href="#L2492">2492</a> assertFalse(isValidIpAddress(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L2493" href="#L2493">2493</a> }
+<a class="jxr_linenumber" name="L2494" href="#L2494">2494</a>
+<a class="jxr_linenumber" name="L2495" href="#L2495">2495</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2496" href="#L2496">2496</a> <em class="jxr_comment">// isValidMacAddress(String)</em>
+<a class="jxr_linenumber" name="L2497" href="#L2497">2497</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2498" href="#L2498">2498</a> @Test
+<a class="jxr_linenumber" name="L2499" href="#L2499">2499</a> <strong class="jxr_keyword">void</strong> a104_isValidMacAddress() {
+<a class="jxr_linenumber" name="L2500" href="#L2500">2500</a> <em class="jxr_comment">// Valid MAC addresses - colon format</em>
+<a class="jxr_linenumber" name="L2501" href="#L2501">2501</a> assertTrue(isValidMacAddress(<span class="jxr_string">"00:1B:44:11:3A:B7"</span>));
+<a class="jxr_linenumber" name="L2502" href="#L2502">2502</a> assertTrue(isValidMacAddress(<span class="jxr_string">"00:1b:44:11:3a:b7"</span>)); <em class="jxr_comment">// Lowercase</em>
+<a class="jxr_linenumber" name="L2503" href="#L2503">2503</a> assertTrue(isValidMacAddress(<span class="jxr_string">"FF:FF:FF:FF:FF:FF"</span>));
+<a class="jxr_linenumber" name="L2504" href="#L2504">2504</a>
+<a class="jxr_linenumber" name="L2505" href="#L2505">2505</a> <em class="jxr_comment">// Valid MAC addresses - hyphen format</em>
+<a class="jxr_linenumber" name="L2506" href="#L2506">2506</a> assertTrue(isValidMacAddress(<span class="jxr_string">"00-1B-44-11-3A-B7"</span>));
+<a class="jxr_linenumber" name="L2507" href="#L2507">2507</a> assertTrue(isValidMacAddress(<span class="jxr_string">"00-1b-44-11-3a-b7"</span>)); <em class="jxr_comment">// Lowercase</em>
+<a class="jxr_linenumber" name="L2508" href="#L2508">2508</a>
+<a class="jxr_linenumber" name="L2509" href="#L2509">2509</a> <em class="jxr_comment">// Invalid MAC addresses</em>
+<a class="jxr_linenumber" name="L2510" href="#L2510">2510</a> assertFalse(isValidMacAddress(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2511" href="#L2511">2511</a> assertFalse(isValidMacAddress(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L2512" href="#L2512">2512</a> assertFalse(isValidMacAddress(<span class="jxr_string">"00:1B:44:11:3A"</span>)); <em class="jxr_comment">// Too short</em>
+<a class="jxr_linenumber" name="L2513" href="#L2513">2513</a> assertFalse(isValidMacAddress(<span class="jxr_string">"00:1B:44:11:3A:B7:99"</span>)); <em class="jxr_comment">// Too long</em>
+<a class="jxr_linenumber" name="L2514" href="#L2514">2514</a> assertFalse(isValidMacAddress(<span class="jxr_string">"GG:1B:44:11:3A:B7"</span>)); <em class="jxr_comment">// Invalid hex</em>
+<a class="jxr_linenumber" name="L2515" href="#L2515">2515</a> assertFalse(isValidMacAddress(<span class="jxr_string">"00 1B 44 11 3A B7"</span>)); <em class="jxr_comment">// Space separator (not supported)</em>
+<a class="jxr_linenumber" name="L2516" href="#L2516">2516</a> }
+<a class="jxr_linenumber" name="L2517" href="#L2517">2517</a>
+<a class="jxr_linenumber" name="L2518" href="#L2518">2518</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2519" href="#L2519">2519</a> <em class="jxr_comment">// isValidRegex(String)</em>
+<a class="jxr_linenumber" name="L2520" href="#L2520">2520</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2521" href="#L2521">2521</a> @Test
+<a class="jxr_linenumber" name="L2522" href="#L2522">2522</a> <strong class="jxr_keyword">void</strong> a105_isValidRegex() {
+<a class="jxr_linenumber" name="L2523" href="#L2523">2523</a> <em class="jxr_comment">// Valid regex patterns</em>
+<a class="jxr_linenumber" name="L2524" href="#L2524">2524</a> assertTrue(isValidRegex(<span class="jxr_string">"[a-z]+"</span>));
+<a class="jxr_linenumber" name="L2525" href="#L2525">2525</a> assertTrue(isValidRegex(<span class="jxr_string">"\\d+"</span>));
+<a class="jxr_linenumber" name="L2526" href="#L2526">2526</a> assertTrue(isValidRegex(<span class="jxr_string">"^test$"</span>));
+<a class="jxr_linenumber" name="L2527" href="#L2527">2527</a> assertTrue(isValidRegex(<span class="jxr_string">"(abc|def)"</span>));
+<a class="jxr_linenumber" name="L2528" href="#L2528">2528</a>
+<a class="jxr_linenumber" name="L2529" href="#L2529">2529</a> <em class="jxr_comment">// Invalid regex patterns</em>
+<a class="jxr_linenumber" name="L2530" href="#L2530">2530</a> assertFalse(isValidRegex(<span class="jxr_string">"[a-z"</span>)); <em class="jxr_comment">// Unclosed bracket</em>
+<a class="jxr_linenumber" name="L2531" href="#L2531">2531</a> assertFalse(isValidRegex(<span class="jxr_string">"(test"</span>)); <em class="jxr_comment">// Unclosed parenthesis</em>
+<a class="jxr_linenumber" name="L2532" href="#L2532">2532</a> assertFalse(isValidRegex(<span class="jxr_string">"\\"</span>)); <em class="jxr_comment">// Incomplete escape</em>
+<a class="jxr_linenumber" name="L2533" href="#L2533">2533</a> assertFalse(isValidRegex(<span class="jxr_string">"*"</span>)); <em class="jxr_comment">// Quantifier without preceding element</em>
+<a class="jxr_linenumber" name="L2534" href="#L2534">2534</a>
+<a class="jxr_linenumber" name="L2535" href="#L2535">2535</a> <em class="jxr_comment">// Null/empty input</em>
+<a class="jxr_linenumber" name="L2536" href="#L2536">2536</a> assertFalse(isValidRegex(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2537" href="#L2537">2537</a> assertFalse(isValidRegex(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L2538" href="#L2538">2538</a> }
+<a class="jxr_linenumber" name="L2539" href="#L2539">2539</a>
+<a class="jxr_linenumber" name="L2540" href="#L2540">2540</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2541" href="#L2541">2541</a> <em class="jxr_comment">// isValidTimeFormat(String,String)</em>
+<a class="jxr_linenumber" name="L2542" href="#L2542">2542</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2543" href="#L2543">2543</a> @Test
+<a class="jxr_linenumber" name="L2544" href="#L2544">2544</a> <strong class="jxr_keyword">void</strong> a106_isValidTimeFormat() {
+<a class="jxr_linenumber" name="L2545" href="#L2545">2545</a> <em class="jxr_comment">// Valid times</em>
+<a class="jxr_linenumber" name="L2546" href="#L2546">2546</a> assertTrue(isValidTimeFormat(<span class="jxr_string">"14:30:00"</span>, <span class="jxr_string">"HH:mm:ss"</span>));
+<a class="jxr_linenumber" name="L2547" href="#L2547">2547</a> assertTrue(isValidTimeFormat(<span class="jxr_string">"02:30:00 PM"</span>, <span class="jxr_string">"hh:mm:ss a"</span>));
+<a class="jxr_linenumber" name="L2548" href="#L2548">2548</a> assertTrue(isValidTimeFormat(<span class="jxr_string">"14:30"</span>, <span class="jxr_string">"HH:mm"</span>));
+<a class="jxr_linenumber" name="L2549" href="#L2549">2549</a> assertTrue(isValidTimeFormat(<span class="jxr_string">"00:00:00"</span>, <span class="jxr_string">"HH:mm:ss"</span>));
+<a class="jxr_linenumber" name="L2550" href="#L2550">2550</a>
+<a class="jxr_linenumber" name="L2551" href="#L2551">2551</a> <em class="jxr_comment">// Invalid times</em>
+<a class="jxr_linenumber" name="L2552" href="#L2552">2552</a> assertFalse(isValidTimeFormat(<span class="jxr_string">"25:00:00"</span>, <span class="jxr_string">"HH:mm:ss"</span>)); <em class="jxr_comment">// Invalid hour</em>
+<a class="jxr_linenumber" name="L2553" href="#L2553">2553</a> assertFalse(isValidTimeFormat(<span class="jxr_string">"14:60:00"</span>, <span class="jxr_string">"HH:mm:ss"</span>)); <em class="jxr_comment">// Invalid minute</em>
+<a class="jxr_linenumber" name="L2554" href="#L2554">2554</a> assertFalse(isValidTimeFormat(<span class="jxr_string">"14:30:60"</span>, <span class="jxr_string">"HH:mm:ss"</span>)); <em class="jxr_comment">// Invalid second</em>
+<a class="jxr_linenumber" name="L2555" href="#L2555">2555</a> assertFalse(isValidTimeFormat(<span class="jxr_string">"not-a-time"</span>, <span class="jxr_string">"HH:mm:ss"</span>)); <em class="jxr_comment">// Not a time</em>
+<a class="jxr_linenumber" name="L2556" href="#L2556">2556</a>
+<a class="jxr_linenumber" name="L2557" href="#L2557">2557</a> <em class="jxr_comment">// Null/empty input</em>
+<a class="jxr_linenumber" name="L2558" href="#L2558">2558</a> assertFalse(isValidTimeFormat(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"HH:mm:ss"</span>));
+<a class="jxr_linenumber" name="L2559" href="#L2559">2559</a> assertFalse(isValidTimeFormat(<span class="jxr_string">"14:30:00"</span>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2560" href="#L2560">2560</a> assertFalse(isValidTimeFormat(<span class="jxr_string">""</span>, <span class="jxr_string">"HH:mm:ss"</span>));
+<a class="jxr_linenumber" name="L2561" href="#L2561">2561</a> assertFalse(isValidTimeFormat(<span class="jxr_string">"14:30:00"</span>, <span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L2562" href="#L2562">2562</a> }
+<a class="jxr_linenumber" name="L2563" href="#L2563">2563</a>
+<a class="jxr_linenumber" name="L2564" href="#L2564">2564</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2565" href="#L2565">2565</a> <em class="jxr_comment">// isWhitespace(String)</em>
+<a class="jxr_linenumber" name="L2566" href="#L2566">2566</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2567" href="#L2567">2567</a> @Test
+<a class="jxr_linenumber" name="L2568" href="#L2568">2568</a> <strong class="jxr_keyword">void</strong> a107_isWhitespace() {
+<a class="jxr_linenumber" name="L2569" href="#L2569">2569</a> assertFalse(isWhitespace(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2570" href="#L2570">2570</a> assertTrue(isWhitespace(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L2571" href="#L2571">2571</a> assertTrue(isWhitespace(<span class="jxr_string">" "</span>));
+<a class="jxr_linenumber" name="L2572" href="#L2572">2572</a> assertTrue(isWhitespace(<span class="jxr_string">"\t\n"</span>));
+<a class="jxr_linenumber" name="L2573" href="#L2573">2573</a> assertTrue(isWhitespace(<span class="jxr_string">"\r\n\t "</span>));
+<a class="jxr_linenumber" name="L2574" href="#L2574">2574</a> assertFalse(isWhitespace(<span class="jxr_string">" a "</span>));
+<a class="jxr_linenumber" name="L2575" href="#L2575">2575</a> assertFalse(isWhitespace(<span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L2576" href="#L2576">2576</a> }
+<a class="jxr_linenumber" name="L2577" href="#L2577">2577</a>
+<a class="jxr_linenumber" name="L2578" href="#L2578">2578</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2579" href="#L2579">2579</a> <em class="jxr_comment">// join(...) - All variants</em>
+<a class="jxr_linenumber" name="L2580" href="#L2580">2580</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2581" href="#L2581">2581</a> @Test
+<a class="jxr_linenumber" name="L2582" href="#L2582">2582</a> <strong class="jxr_keyword">void</strong> a108_join() {
+<a class="jxr_linenumber" name="L2583" href="#L2583">2583</a> <em class="jxr_comment">// join(Collection<?>)</em>
+<a class="jxr_linenumber" name="L2584" href="#L2584">2584</a> assertNull(join((Collection<?>)<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2585" href="#L2585">2585</a> assertEquals(<span class="jxr_string">"1"</span>, join(l(a(1))));
+<a class="jxr_linenumber" name="L2586" href="#L2586">2586</a> assertEquals(<span class="jxr_string">"1,2"</span>, join(l(a(1, 2))));
+<a class="jxr_linenumber" name="L2587" href="#L2587">2587</a>
+<a class="jxr_linenumber" name="L2588" href="#L2588">2588</a> <em class="jxr_comment">// join(Collection<?>, char)</em>
+<a class="jxr_linenumber" name="L2589" href="#L2589">2589</a> assertNull(join((Collection<?>)<strong class="jxr_keyword">null</strong>, ','));
+<a class="jxr_linenumber" name="L2590" href="#L2590">2590</a> assertEquals(<span class="jxr_string">"1"</span>, join(l(a(1)), ','));
+<a class="jxr_linenumber" name="L2591" href="#L2591">2591</a> assertEquals(<span class="jxr_string">"1,2"</span>, join(l(a(1, 2)), ','));
+<a class="jxr_linenumber" name="L2592" href="#L2592">2592</a>
+<a class="jxr_linenumber" name="L2593" href="#L2593">2593</a> <em class="jxr_comment">// join(Collection<?>, String)</em>
+<a class="jxr_linenumber" name="L2594" href="#L2594">2594</a> assertNull(join((Collection<?>)<strong class="jxr_keyword">null</strong>, <span class="jxr_string">","</span>));
+<a class="jxr_linenumber" name="L2595" href="#L2595">2595</a> assertEquals(<span class="jxr_string">"1"</span>, join(l(a(1)), <span class="jxr_string">","</span>));
+<a class="jxr_linenumber" name="L2596" href="#L2596">2596</a> assertEquals(<span class="jxr_string">"1,2"</span>, join(l(a(1, 2)), <span class="jxr_string">","</span>));
+<a class="jxr_linenumber" name="L2597" href="#L2597">2597</a>
+<a class="jxr_linenumber" name="L2598" href="#L2598">2598</a> <em class="jxr_comment">// join(int[], char)</em>
+<a class="jxr_linenumber" name="L2599" href="#L2599">2599</a> assertNull(join((<strong class="jxr_keyword">int</strong>[])<strong class="jxr_keyword">null</strong>, ','));
+<a class="jxr_linenumber" name="L2600" href="#L2600">2600</a> assertEquals(<span class="jxr_string">"1"</span>, join(ints(1), ','));
+<a class="jxr_linenumber" name="L2601" href="#L2601">2601</a> assertEquals(<span class="jxr_string">"1,2"</span>, join(ints(1, 2), ','));
+<a class="jxr_linenumber" name="L2602" href="#L2602">2602</a>
+<a class="jxr_linenumber" name="L2603" href="#L2603">2603</a> <em class="jxr_comment">// join(Object[], char)</em>
+<a class="jxr_linenumber" name="L2604" href="#L2604">2604</a> assertNull(join((Object[])<strong class="jxr_keyword">null</strong>, ','));
+<a class="jxr_linenumber" name="L2605" href="#L2605">2605</a> assertEquals(<span class="jxr_string">"1"</span>, join(a(1), ','));
+<a class="jxr_linenumber" name="L2606" href="#L2606">2606</a> assertEquals(<span class="jxr_string">"1,2"</span>, join(a(1, 2), ','));
+<a class="jxr_linenumber" name="L2607" href="#L2607">2607</a>
+<a class="jxr_linenumber" name="L2608" href="#L2608">2608</a> <em class="jxr_comment">// join(Object[], String)</em>
+<a class="jxr_linenumber" name="L2609" href="#L2609">2609</a> assertNull(join((Object[])<strong class="jxr_keyword">null</strong>, <span class="jxr_string">","</span>));
+<a class="jxr_linenumber" name="L2610" href="#L2610">2610</a> assertEquals(<span class="jxr_string">"1"</span>, join(a(1), <span class="jxr_string">","</span>));
+<a class="jxr_linenumber" name="L2611" href="#L2611">2611</a> assertEquals(<span class="jxr_string">"1,2"</span>, join(a(1, 2), <span class="jxr_string">","</span>));
+<a class="jxr_linenumber" name="L2612" href="#L2612">2612</a>
+<a class="jxr_linenumber" name="L2613" href="#L2613">2613</a> <em class="jxr_comment">// join(String...)</em>
+<a class="jxr_linenumber" name="L2614" href="#L2614">2614</a> assertEquals(<span class="jxr_string">""</span>, join());
+<a class="jxr_linenumber" name="L2615" href="#L2615">2615</a> assertEquals(<span class="jxr_string">"a"</span>, join(<span class="jxr_string">"a"</span>));
+<a class="jxr_linenumber" name="L2616" href="#L2616">2616</a> assertEquals(<span class="jxr_string">"a,b"</span>, join(<span class="jxr_string">"a"</span>, <span class="jxr_string">"b"</span>));
+<a class="jxr_linenumber" name="L2617" href="#L2617">2617</a> }
+<a class="jxr_linenumber" name="L2618" href="#L2618">2618</a>
+<a class="jxr_linenumber" name="L2619" href="#L2619">2619</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2620" href="#L2620">2620</a> <em class="jxr_comment">// joine(List<?>, char)</em>
+<a class="jxr_linenumber" name="L2621" href="#L2621">2621</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2622" href="#L2622">2622</a> @Test
+<a class="jxr_linenumber" name="L2623" href="#L2623">2623</a> <strong class="jxr_keyword">void</strong> a109_joine() {
+<a class="jxr_linenumber" name="L2624" href="#L2624">2624</a> assertNull(joine(<strong class="jxr_keyword">null</strong>, ','));
+<a class="jxr_linenumber" name="L2625" href="#L2625">2625</a> assertEquals(<span class="jxr_string">"x\\,y,z"</span>, joine(l(a(<span class="jxr_string">"x,y"</span>, <span class="jxr_string">"z"</span>)), ','));
+<a class="jxr_linenumber" name="L2626" href="#L2626">2626</a> assertEquals(<span class="jxr_string">"a,b"</span>, joine(l(a(<span class="jxr_string">"a"</span>, <span class="jxr_string">"b"</span>)), ','));
+<a class="jxr_linenumber" name="L2627" href="#L2627">2627</a> assertEquals(<span class="jxr_string">"a\\|b"</span>, joine(l(a(<span class="jxr_string">"a|b"</span>)), '|'));
+<a class="jxr_linenumber" name="L2628" href="#L2628">2628</a> }
+<a class="jxr_linenumber" name="L2629" href="#L2629">2629</a>
+<a class="jxr_linenumber" name="L2630" href="#L2630">2630</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2631" href="#L2631">2631</a> <em class="jxr_comment">// joinnl(Object[])</em>
+<a class="jxr_linenumber" name="L2632" href="#L2632">2632</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2633" href="#L2633">2633</a> @Test
+<a class="jxr_linenumber" name="L2634" href="#L2634">2634</a> <strong class="jxr_keyword">void</strong> a110_joinnl() {
+<a class="jxr_linenumber" name="L2635" href="#L2635">2635</a> assertNull(joinnl(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2636" href="#L2636">2636</a> assertEquals(<span class="jxr_string">""</span>, joinnl(<strong class="jxr_keyword">new</strong> Object[0]));
+<a class="jxr_linenumber" name="L2637" href="#L2637">2637</a> assertEquals(<span class="jxr_string">"a"</span>, joinnl(a(<span class="jxr_string">"a"</span>)));
+<a class="jxr_linenumber" name="L2638" href="#L2638">2638</a> assertEquals(<span class="jxr_string">"a\nb"</span>, joinnl(a(<span class="jxr_string">"a"</span>, <span class="jxr_string">"b"</span>)));
+<a class="jxr_linenumber" name="L2639" href="#L2639">2639</a> assertEquals(<span class="jxr_string">"1\n2\n3"</span>, joinnl(a(1, 2, 3)));
+<a class="jxr_linenumber" name="L2640" href="#L2640">2640</a> }
+<a class="jxr_linenumber" name="L2641" href="#L2641">2641</a>
+<a class="jxr_linenumber" name="L2642" href="#L2642">2642</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2643" href="#L2643">2643</a> <em class="jxr_comment">// kebabCase(String)</em>
+<a class="jxr_linenumber" name="L2644" href="#L2644">2644</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2645" href="#L2645">2645</a> @Test
+<a class="jxr_linenumber" name="L2646" href="#L2646">2646</a> <strong class="jxr_keyword">void</strong> a111_kebabCase() {
+<a class="jxr_linenumber" name="L2647" href="#L2647">2647</a> assertNull(kebabCase(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2648" href="#L2648">2648</a> assertEquals(<span class="jxr_string">""</span>, kebabCase(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L2649" href="#L2649">2649</a> assertEquals(<span class="jxr_string">"hello-world"</span>, kebabCase(<span class="jxr_string">"hello world"</span>));
+<a class="jxr_linenumber" name="L2650" href="#L2650">2650</a> assertEquals(<span class="jxr_string">"hello-world"</span>, kebabCase(<span class="jxr_string">"helloWorld"</span>));
+<a class="jxr_linenumber" name="L2651" href="#L2651">2651</a> assertEquals(<span class="jxr_string">"hello-world"</span>, kebabCase(<span class="jxr_string">"HelloWorld"</span>));
+<a class="jxr_linenumber" name="L2652" href="#L2652">2652</a> assertEquals(<span class="jxr_string">"hello-world"</span>, kebabCase(<span class="jxr_string">"hello_world"</span>));
+<a class="jxr_linenumber" name="L2653" href="#L2653">2653</a> assertEquals(<span class="jxr_string">"hello-world"</span>, kebabCase(<span class="jxr_string">"hello-world"</span>));
+<a class="jxr_linenumber" name="L2654" href="#L2654">2654</a> assertEquals(<span class="jxr_string">"xml-http-request"</span>, kebabCase(<span class="jxr_string">"XMLHttpRequest"</span>));
+<a class="jxr_linenumber" name="L2655" href="#L2655">2655</a> assertEquals(<span class="jxr_string">"hello-world-test"</span>, kebabCase(<span class="jxr_string">"Hello_World-Test"</span>));
+<a class="jxr_linenumber" name="L2656" href="#L2656">2656</a> assertEquals(<span class="jxr_string">"test"</span>, kebabCase(<span class="jxr_string">"test"</span>));
+<a class="jxr_linenumber" name="L2657" href="#L2657">2657</a> assertEquals(<span class="jxr_string">"test"</span>, kebabCase(<span class="jxr_string">"TEST"</span>));
+<a class="jxr_linenumber" name="L2658" href="#L2658">2658</a> assertEquals(<span class="jxr_string">"hello-123-world"</span>, kebabCase(<span class="jxr_string">"hello 123 world"</span>));
+<a class="jxr_linenumber" name="L2659" href="#L2659">2659</a> }
+<a class="jxr_linenumber" name="L2660" href="#L2660">2660</a>
+<a class="jxr_linenumber" name="L2661" href="#L2661">2661</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2662" href="#L2662">2662</a> <em class="jxr_comment">// lastIndexOf(String,String)</em>
+<a class="jxr_linenumber" name="L2663" href="#L2663">2663</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2664" href="#L2664">2664</a> @Test
+<a class="jxr_linenumber" name="L2665" href="#L2665">2665</a> <strong class="jxr_keyword">void</strong> a112_lastIndexOf() {
+<a class="jxr_linenumber" name="L2666" href="#L2666">2666</a> assertEquals(12, lastIndexOf(<span class="jxr_string">"hello world world"</span>, <span class="jxr_string">"world"</span>));
+<a class="jxr_linenumber" name="L2667" href="#L2667">2667</a> assertEquals(6, lastIndexOf(<span class="jxr_string">"hello world"</span>, <span class="jxr_string">"world"</span>));
+<a class="jxr_linenumber" name="L2668" href="#L2668">2668</a> assertEquals(0, lastIndexOf(<span class="jxr_string">"hello world"</span>, <span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L2669" href="#L2669">2669</a> assertEquals(-1, lastIndexOf(<span class="jxr_string">"hello world"</span>, <span class="jxr_string">"xyz"</span>));
+<a class="jxr_linenumber" name="L2670" href="#L2670">2670</a> assertEquals(-1, lastIndexOf(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"test"</span>));
+<a class="jxr_linenumber" name="L2671" href="#L2671">2671</a> assertEquals(-1, lastIndexOf(<span class="jxr_string">"test"</span>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2672" href="#L2672">2672</a> assertEquals(-1, lastIndexOf(<strong class="jxr_keyword">null</strong>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2673" href="#L2673">2673</a> assertEquals(4, lastIndexOf(<span class="jxr_string">"ababab"</span>, <span class="jxr_string">"ab"</span>)); <em class="jxr_comment">// "ab" appears at positions 0, 2, 4</em>
+<a class="jxr_linenumber" name="L2674" href="#L2674">2674</a> }
+<a class="jxr_linenumber" name="L2675" href="#L2675">2675</a>
+<a class="jxr_linenumber" name="L2676" href="#L2676">2676</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2677" href="#L2677">2677</a> <em class="jxr_comment">// lastIndexOfIgnoreCase(String,String)</em>
+<a class="jxr_linenumber" name="L2678" href="#L2678">2678</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2679" href="#L2679">2679</a> @Test
+<a class="jxr_linenumber" name="L2680" href="#L2680">2680</a> <strong class="jxr_keyword">void</strong> a113_lastIndexOfIgnoreCase() {
+<a class="jxr_linenumber" name="L2681" href="#L2681">2681</a> assertEquals(12, lastIndexOfIgnoreCase(<span class="jxr_string">"Hello World World"</span>, <span class="jxr_string">"world"</span>));
+<a class="jxr_linenumber" name="L2682" href="#L2682">2682</a> assertEquals(12, lastIndexOfIgnoreCase(<span class="jxr_string">"Hello World World"</span>, <span class="jxr_string">"WORLD"</span>));
+<a class="jxr_linenumber" name="L2683" href="#L2683">2683</a> assertEquals(6, lastIndexOfIgnoreCase(<span class="jxr_string">"Hello World"</span>, <span class="jxr_string">"world"</span>));
+<a class="jxr_linenumber" name="L2684" href="#L2684">2684</a> assertEquals(6, lastIndexOfIgnoreCase(<span class="jxr_string">"Hello World"</span>, <span class="jxr_string">"WORLD"</span>));
+<a class="jxr_linenumber" name="L2685" href="#L2685">2685</a> assertEquals(0, lastIndexOfIgnoreCase(<span class="jxr_string">"Hello World"</span>, <span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L2686" href="#L2686">2686</a> assertEquals(-1, lastIndexOfIgnoreCase(<span class="jxr_string">"Hello World"</span>, <span class="jxr_string">"xyz"</span>));
+<a class="jxr_linenumber" name="L2687" href="#L2687">2687</a> assertEquals(-1, lastIndexOfIgnoreCase(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"test"</span>));
+<a class="jxr_linenumber" name="L2688" href="#L2688">2688</a> assertEquals(-1, lastIndexOfIgnoreCase(<span class="jxr_string">"test"</span>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2689" href="#L2689">2689</a> assertEquals(-1, lastIndexOfIgnoreCase(<strong class="jxr_keyword">null</strong>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2690" href="#L2690">2690</a> assertEquals(4, lastIndexOfIgnoreCase(<span class="jxr_string">"AbAbAb"</span>, <span class="jxr_string">"ab"</span>));
+<a class="jxr_linenumber" name="L2691" href="#L2691">2691</a> }
+<a class="jxr_linenumber" name="L2692" href="#L2692">2692</a>
+<a class="jxr_linenumber" name="L2693" href="#L2693">2693</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2694" href="#L2694">2694</a> <em class="jxr_comment">// lastNonWhitespaceChar(String)</em>
+<a class="jxr_linenumber" name="L2695" href="#L2695">2695</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2696" href="#L2696">2696</a> @Test
+<a class="jxr_linenumber" name="L2697" href="#L2697">2697</a> <strong class="jxr_keyword">void</strong> a114_lastNonWhitespaceChar() {
+<a class="jxr_linenumber" name="L2698" href="#L2698">2698</a> assertEquals('r', lastNonWhitespaceChar(<span class="jxr_string">"bar"</span>));
+<a class="jxr_linenumber" name="L2699" href="#L2699">2699</a> assertEquals('r', lastNonWhitespaceChar(<span class="jxr_string">" bar "</span>));
+<a class="jxr_linenumber" name="L2700" href="#L2700">2700</a> assertEquals('r', lastNonWhitespaceChar(<span class="jxr_string">"\tbar\t"</span>));
+<a class="jxr_linenumber" name="L2701" href="#L2701">2701</a> assertEquals(0, lastNonWhitespaceChar(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L2702" href="#L2702">2702</a> assertEquals(0, lastNonWhitespaceChar(<span class="jxr_string">" "</span>));
+<a class="jxr_linenumber" name="L2703" href="#L2703">2703</a> assertEquals(0, lastNonWhitespaceChar(<span class="jxr_string">"\t"</span>));
+<a class="jxr_linenumber" name="L2704" href="#L2704">2704</a> assertEquals(0, lastNonWhitespaceChar(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2705" href="#L2705">2705</a> }
+<a class="jxr_linenumber" name="L2706" href="#L2706">2706</a>
+<a class="jxr_linenumber" name="L2707" href="#L2707">2707</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2708" href="#L2708">2708</a> <em class="jxr_comment">// left(String,int)</em>
+<a class="jxr_linenumber" name="L2709" href="#L2709">2709</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2710" href="#L2710">2710</a> @Test
+<a class="jxr_linenumber" name="L2711" href="#L2711">2711</a> <strong class="jxr_keyword">void</strong> a115_left() {
+<a class="jxr_linenumber" name="L2712" href="#L2712">2712</a> assertNull(left(<strong class="jxr_keyword">null</strong>, 3));
+<a class="jxr_linenumber" name="L2713" href="#L2713">2713</a> assertEquals(<span class="jxr_string">""</span>, left(<span class="jxr_string">""</span>, 3));
+<a class="jxr_linenumber" name="L2714" href="#L2714">2714</a> assertEquals(<span class="jxr_string">"hel"</span>, left(<span class="jxr_string">"hello"</span>, 3));
+<a class="jxr_linenumber" name="L2715" href="#L2715">2715</a> assertEquals(<span class="jxr_string">"hello"</span>, left(<span class="jxr_string">"hello"</span>, 10));
+<a class="jxr_linenumber" name="L2716" href="#L2716">2716</a> assertEquals(<span class="jxr_string">""</span>, left(<span class="jxr_string">"hello"</span>, 0));
+<a class="jxr_linenumber" name="L2717" href="#L2717">2717</a> assertEquals(<span class="jxr_string">""</span>, left(<span class="jxr_string">"hello"</span>, -1));
+<a class="jxr_linenumber" name="L2718" href="#L2718">2718</a> }
+<a class="jxr_linenumber" name="L2719" href="#L2719">2719</a>
+<a class="jxr_linenumber" name="L2720" href="#L2720">2720</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2721" href="#L2721">2721</a> <em class="jxr_comment">// levenshteinDistance(String,String)</em>
+<a class="jxr_linenumber" name="L2722" href="#L2722">2722</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2723" href="#L2723">2723</a> @Test
+<a class="jxr_linenumber" name="L2724" href="#L2724">2724</a> <strong class="jxr_keyword">void</strong> a116_levenshteinDistance() {
+<a class="jxr_linenumber" name="L2725" href="#L2725">2725</a> assertEquals(0, levenshteinDistance(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L2726" href="#L2726">2726</a> assertEquals(3, levenshteinDistance(<span class="jxr_string">"kitten"</span>, <span class="jxr_string">"sitting"</span>)); <em class="jxr_comment">// kitten -> sitten (s), sitten -> sittin (i), sittin -> sitting (g)</em>
+<a class="jxr_linenumber" name="L2727" href="#L2727">2727</a> assertEquals(3, levenshteinDistance(<span class="jxr_string">"abc"</span>, <span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L2728" href="#L2728">2728</a> assertEquals(3, levenshteinDistance(<span class="jxr_string">""</span>, <span class="jxr_string">"abc"</span>));
+<a class="jxr_linenumber" name="L2729" href="#L2729">2729</a> assertEquals(1, levenshteinDistance(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"hallo"</span>)); <em class="jxr_comment">// e -> a (1 substitution)</em>
+<a class="jxr_linenumber" name="L2730" href="#L2730">2730</a> assertEquals(1, levenshteinDistance(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"helo"</span>)); <em class="jxr_comment">// Remove one 'l' (1 deletion)</em>
+<a class="jxr_linenumber" name="L2731" href="#L2731">2731</a> assertEquals(1, levenshteinDistance(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"hell"</span>)); <em class="jxr_comment">// Remove 'o' (1 deletion)</em>
+<a class="jxr_linenumber" name="L2732" href="#L2732">2732</a> assertEquals(1, levenshteinDistance(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"hellox"</span>)); <em class="jxr_comment">// Add 'x' (1 insertion)</em>
+<a class="jxr_linenumber" name="L2733" href="#L2733">2733</a> <em class="jxr_comment">// Null handling</em>
+<a class="jxr_linenumber" name="L2734" href="#L2734">2734</a> assertEquals(0, levenshteinDistance(<strong class="jxr_keyword">null</strong>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2735" href="#L2735">2735</a> assertEquals(5, levenshteinDistance(<span class="jxr_string">"hello"</span>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2736" href="#L2736">2736</a> assertEquals(5, levenshteinDistance(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L2737" href="#L2737">2737</a> }
+<a class="jxr_linenumber" name="L2738" href="#L2738">2738</a>
+<a class="jxr_linenumber" name="L2739" href="#L2739">2739</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2740" href="#L2740">2740</a> <em class="jxr_comment">// lineCount(String)</em>
+<a class="jxr_linenumber" name="L2741" href="#L2741">2741</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2742" href="#L2742">2742</a> @Test
+<a class="jxr_linenumber" name="L2743" href="#L2743">2743</a> <strong class="jxr_keyword">void</strong> a117_lineCount() {
+<a class="jxr_linenumber" name="L2744" href="#L2744">2744</a> <em class="jxr_comment">// Basic line counting</em>
+<a class="jxr_linenumber" name="L2745" href="#L2745">2745</a> assertEquals(3, lineCount(<span class="jxr_string">"line1\nline2\nline3"</span>));
+<a class="jxr_linenumber" name="L2746" href="#L2746">2746</a> assertEquals(1, lineCount(<span class="jxr_string">"single line"</span>));
+<a class="jxr_linenumber" name="L2747" href="#L2747">2747</a>
+<a class="jxr_linenumber" name="L2748" href="#L2748">2748</a> <em class="jxr_comment">// Windows line endings</em>
+<a class="jxr_linenumber" name="L2749" href="#L2749">2749</a> assertEquals(2, lineCount(<span class="jxr_string">"line1\r\nline2"</span>));
+<a class="jxr_linenumber" name="L2750" href="#L2750">2750</a>
+<a class="jxr_linenumber" name="L2751" href="#L2751">2751</a> <em class="jxr_comment">// Mixed line endings</em>
+<a class="jxr_linenumber" name="L2752" href="#L2752">2752</a> assertEquals(3, lineCount(<span class="jxr_string">"line1\nline2\r\nline3"</span>));
+<a class="jxr_linenumber" name="L2753" href="#L2753">2753</a>
+<a class="jxr_linenumber" name="L2754" href="#L2754">2754</a> <em class="jxr_comment">// Empty lines</em>
+<a class="jxr_linenumber" name="L2755" href="#L2755">2755</a> assertEquals(3, lineCount(<span class="jxr_string">"line1\n\nline3"</span>));
+<a class="jxr_linenumber" name="L2756" href="#L2756">2756</a> assertEquals(2, lineCount(<span class="jxr_string">"\nline2"</span>));
+<a class="jxr_linenumber" name="L2757" href="#L2757">2757</a> assertEquals(2, lineCount(<span class="jxr_string">"line1\n"</span>));
+<a class="jxr_linenumber" name="L2758" href="#L2758">2758</a>
+<a class="jxr_linenumber" name="L2759" href="#L2759">2759</a> <em class="jxr_comment">// Only newlines</em>
+<a class="jxr_linenumber" name="L2760" href="#L2760">2760</a> assertEquals(3, lineCount(<span class="jxr_string">"\n\n"</span>));
+<a class="jxr_linenumber" name="L2761" href="#L2761">2761</a>
+<a class="jxr_linenumber" name="L2762" href="#L2762">2762</a> <em class="jxr_comment">// Null/empty input</em>
+<a class="jxr_linenumber" name="L2763" href="#L2763">2763</a> assertEquals(0, lineCount(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2764" href="#L2764">2764</a> assertEquals(0, lineCount(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L2765" href="#L2765">2765</a> }
+<a class="jxr_linenumber" name="L2766" href="#L2766">2766</a>
+<a class="jxr_linenumber" name="L2767" href="#L2767">2767</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2768" href="#L2768">2768</a> <em class="jxr_comment">// lowerCase(String)</em>
+<a class="jxr_linenumber" name="L2769" href="#L2769">2769</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2770" href="#L2770">2770</a> @Test
+<a class="jxr_linenumber" name="L2771" href="#L2771">2771</a> <strong class="jxr_keyword">void</strong> a118_lowerCase() {
+<a class="jxr_linenumber" name="L2772" href="#L2772">2772</a> assertNull(lowerCase(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2773" href="#L2773">2773</a> assertEquals(<span class="jxr_string">""</span>, lowerCase(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L2774" href="#L2774">2774</a> assertEquals(<span class="jxr_string">"hello"</span>, lowerCase(<span class="jxr_string">"Hello"</span>));
+<a class="jxr_linenumber" name="L2775" href="#L2775">2775</a> assertEquals(<span class="jxr_string">"hello"</span>, lowerCase(<span class="jxr_string">"HELLO"</span>));
+<a class="jxr_linenumber" name="L2776" href="#L2776">2776</a> assertEquals(<span class="jxr_string">"hello world"</span>, lowerCase(<span class="jxr_string">"Hello World"</span>));
+<a class="jxr_linenumber" name="L2777" href="#L2777">2777</a> assertEquals(<span class="jxr_string">"123"</span>, lowerCase(<span class="jxr_string">"123"</span>));
+<a class="jxr_linenumber" name="L2778" href="#L2778">2778</a> assertEquals(<span class="jxr_string">"hello123"</span>, lowerCase(<span class="jxr_string">"Hello123"</span>));
+<a class="jxr_linenumber" name="L2779" href="#L2779">2779</a> }
+<a class="jxr_linenumber" name="L2780" href="#L2780">2780</a>
+<a class="jxr_linenumber" name="L2781" href="#L2781">2781</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2782" href="#L2782">2782</a> <em class="jxr_comment">// mapped(String[],Function<String,String>)</em>
+<a class="jxr_linenumber" name="L2783" href="#L2783">2783</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2784" href="#L2784">2784</a> @Test
+<a class="jxr_linenumber" name="L2785" href="#L2785">2785</a> <strong class="jxr_keyword">void</strong> a119_mapped() {
+<a class="jxr_linenumber" name="L2786" href="#L2786">2786</a> assertNull(mapped(<strong class="jxr_keyword">null</strong>, String::toUpperCase));
+<a class="jxr_linenumber" name="L2787" href="#L2787">2787</a> assertList(mapped(a(), String::toUpperCase));
+<a class="jxr_linenumber" name="L2788" href="#L2788">2788</a> assertList(mapped(a(<span class="jxr_string">"foo"</span>, <span class="jxr_string">"bar"</span>, <span class="jxr_string">"baz"</span>), String::toUpperCase), <span class="jxr_string">"FOO"</span>, <span class="jxr_string">"BAR"</span>, <span class="jxr_string">"BAZ"</span>);
+<a class="jxr_linenumber" name="L2789" href="#L2789">2789</a> assertList(mapped(a(<span class="jxr_string">"FOO"</span>, <span class="jxr_string">"BAR"</span>, <span class="jxr_string">"BAZ"</span>), String::toLowerCase), <span class="jxr_string">"foo"</span>, <span class="jxr_string">"bar"</span>, <span class="jxr_string">"baz"</span>);
+<a class="jxr_linenumber" name="L2790" href="#L2790">2790</a> assertList(mapped(a(<span class="jxr_string">"foo"</span>, <span class="jxr_string">"bar"</span>, <span class="jxr_string">"baz"</span>), s -> <span class="jxr_string">"prefix-"</span> + s), <span class="jxr_string">"prefix-foo"</span>, <span class="jxr_string">"prefix-bar"</span>, <span class="jxr_string">"prefix-baz"</span>);
+<a class="jxr_linenumber" name="L2791" href="#L2791">2791</a> assertList(mapped(a(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"world"</span>), s -> s.substring(0, 1)), <span class="jxr_string">"h"</span>, <span class="jxr_string">"w"</span>);
+<a class="jxr_linenumber" name="L2792" href="#L2792">2792</a> assertList(mapped(a(<span class="jxr_string">"test"</span>), <strong class="jxr_keyword">null</strong>), <span class="jxr_string">"test"</span>);
+<a class="jxr_linenumber" name="L2793" href="#L2793">2793</a> assertList(mapped(a(<span class="jxr_string">"a"</span>, <span class="jxr_string">"b"</span>, <span class="jxr_string">"c"</span>), s -> s + s), <span class="jxr_string">"aa"</span>, <span class="jxr_string">"bb"</span>, <span class="jxr_string">"cc"</span>);
+<a class="jxr_linenumber" name="L2794" href="#L2794">2794</a> }
+<a class="jxr_linenumber" name="L2795" href="#L2795">2795</a>
+<a class="jxr_linenumber" name="L2796" href="#L2796">2796</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2797" href="#L2797">2797</a> <em class="jxr_comment">// matches(String,String)</em>
+<a class="jxr_linenumber" name="L2798" href="#L2798">2798</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2799" href="#L2799">2799</a> @Test
+<a class="jxr_linenumber" name="L2800" href="#L2800">2800</a> <strong class="jxr_keyword">void</strong> a120_matches() {
+<a class="jxr_linenumber" name="L2801" href="#L2801">2801</a> assertTrue(matches(<span class="jxr_string">"12345"</span>, <span class="jxr_string">"\\d+"</span>));
+<a class="jxr_linenumber" name="L2802" href="#L2802">2802</a> assertTrue(matches(<span class="jxr_string">"abc123"</span>, <span class="jxr_string">"^[a-z]+\\d+$"</span>));
+<a class="jxr_linenumber" name="L2803" href="#L2803">2803</a> assertTrue(matches(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"^hello$"</span>));
+<a class="jxr_linenumber" name="L2804" href="#L2804">2804</a> assertTrue(matches(<span class="jxr_string">"test@example.com"</span>, <span class="jxr_string">"^[a-z]+@[a-z]+\\.[a-z]+$"</span>));
+<a class="jxr_linenumber" name="L2805" href="#L2805">2805</a> assertFalse(matches(<span class="jxr_string">"abc"</span>, <span class="jxr_string">"\\d+"</span>));
+<a class="jxr_linenumber" name="L2806" href="#L2806">2806</a> assertFalse(matches(<span class="jxr_string">"123"</span>, <span class="jxr_string">"^[a-z]+$"</span>));
+<a class="jxr_linenumber" name="L2807" href="#L2807">2807</a> assertFalse(matches(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"\\d+"</span>));
+<a class="jxr_linenumber" name="L2808" href="#L2808">2808</a> assertFalse(matches(<span class="jxr_string">"test"</span>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2809" href="#L2809">2809</a> assertFalse(matches(<strong class="jxr_keyword">null</strong>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2810" href="#L2810">2810</a> <em class="jxr_comment">// Test with invalid regex - should throw PatternSyntaxException</em>
+<a class="jxr_linenumber" name="L2811" href="#L2811">2811</a> assertThrows(java.util.regex.PatternSyntaxException.<strong class="jxr_keyword">class</strong>, () -> matches(<span class="jxr_string">"test"</span>, <span class="jxr_string">"["</span>));
+<a class="jxr_linenumber" name="L2812" href="#L2812">2812</a> }
+<a class="jxr_linenumber" name="L2813" href="#L2813">2813</a>
+<a class="jxr_linenumber" name="L2814" href="#L2814">2814</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2815" href="#L2815">2815</a> <em class="jxr_comment">// metaphone(String)</em>
+<a class="jxr_linenumber" name="L2816" href="#L2816">2816</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2817" href="#L2817">2817</a> @Test
+<a class="jxr_linenumber" name="L2818" href="#L2818">2818</a> <strong class="jxr_keyword">void</strong> a121_metaphone() {
+<a class="jxr_linenumber" name="L2819" href="#L2819">2819</a> <em class="jxr_comment">// Basic metaphone examples</em>
+<a class="jxr_linenumber" name="L2820" href="#L2820">2820</a> <strong class="jxr_keyword">var</strong> code1 = metaphone(<span class="jxr_string">"Smith"</span>);
+<a class="jxr_linenumber" name="L2821" href="#L2821">2821</a> assertNotNull(code1);
+<a class="jxr_linenumber" name="L2822" href="#L2822">2822</a> assertTrue(code1.startsWith(<span class="jxr_string">"SM"</span>));
+<a class="jxr_linenumber" name="L2823" href="#L2823">2823</a>
+<a class="jxr_linenumber" name="L2824" href="#L2824">2824</a> <strong class="jxr_keyword">var</strong> code2 = metaphone(<span class="jxr_string">"Smythe"</span>);
+<a class="jxr_linenumber" name="L2825" href="#L2825">2825</a> assertNotNull(code2);
+<a class="jxr_linenumber" name="L2826" href="#L2826">2826</a> assertTrue(code2.startsWith(<span class="jxr_string">"SM"</span>));
+<a class="jxr_linenumber" name="L2827" href="#L2827">2827</a>
+<a class="jxr_linenumber" name="L2828" href="#L2828">2828</a> <em class="jxr_comment">// Similar words should have similar codes</em>
+<a class="jxr_linenumber" name="L2829" href="#L2829">2829</a> <strong class="jxr_keyword">var</strong> code3 = metaphone(<span class="jxr_string">"Robert"</span>);
+<a class="jxr_linenumber" name="L2830" href="#L2830">2830</a> assertNotNull(code3);
+<a class="jxr_linenumber" name="L2831" href="#L2831">2831</a>
+<a class="jxr_linenumber" name="L2832" href="#L2832">2832</a> <em class="jxr_comment">// Null/empty input</em>
+<a class="jxr_linenumber" name="L2833" href="#L2833">2833</a> assertNull(metaphone(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2834" href="#L2834">2834</a> assertNull(metaphone(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L2835" href="#L2835">2835</a> assertEquals(<span class="jxr_string">""</span>, metaphone(<span class="jxr_string">"123"</span>));
+<a class="jxr_linenumber" name="L2836" href="#L2836">2836</a>
+<a class="jxr_linenumber" name="L2837" href="#L2837">2837</a> <em class="jxr_comment">// Single character</em>
+<a class="jxr_linenumber" name="L2838" href="#L2838">2838</a> <strong class="jxr_keyword">var</strong> code4 = metaphone(<span class="jxr_string">"A"</span>);
+<a class="jxr_linenumber" name="L2839" href="#L2839">2839</a> assertNotNull(code4);
+<a class="jxr_linenumber" name="L2840" href="#L2840">2840</a> assertFalse(code4.isEmpty());
+<a class="jxr_linenumber" name="L2841" href="#L2841">2841</a> }
+<a class="jxr_linenumber" name="L2842" href="#L2842">2842</a>
+<a class="jxr_linenumber" name="L2843" href="#L2843">2843</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2844" href="#L2844">2844</a> <em class="jxr_comment">// mid(String,int,int)</em>
+<a class="jxr_linenumber" name="L2845" href="#L2845">2845</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2846" href="#L2846">2846</a> @Test
+<a class="jxr_linenumber" name="L2847" href="#L2847">2847</a> <strong class="jxr_keyword">void</strong> a122_mid() {
+<a class="jxr_linenumber" name="L2848" href="#L2848">2848</a> assertNull(mid(<strong class="jxr_keyword">null</strong>, 1, 3));
+<a class="jxr_linenumber" name="L2849" href="#L2849">2849</a> assertEquals(<span class="jxr_string">""</span>, mid(<span class="jxr_string">""</span>, 1, 3));
+<a class="jxr_linenumber" name="L2850" href="#L2850">2850</a> assertEquals(<span class="jxr_string">"ell"</span>, mid(<span class="jxr_string">"hello"</span>, 1, 3));
+<a class="jxr_linenumber" name="L2851" href="#L2851">2851</a> assertEquals(<span class="jxr_string">"ello"</span>, mid(<span class="jxr_string">"hello"</span>, 1, 10));
+<a class="jxr_linenumber" name="L2852" href="#L2852">2852</a> assertEquals(<span class="jxr_string">""</span>, mid(<span class="jxr_string">"hello"</span>, 10, 3));
+<a class="jxr_linenumber" name="L2853" href="#L2853">2853</a> assertEquals(<span class="jxr_string">""</span>, mid(<span class="jxr_string">"hello"</span>, -1, 3));
+<a class="jxr_linenumber" name="L2854" href="#L2854">2854</a> assertEquals(<span class="jxr_string">""</span>, mid(<span class="jxr_string">"hello"</span>, 1, -1));
+<a class="jxr_linenumber" name="L2855" href="#L2855">2855</a> }
+<a class="jxr_linenumber" name="L2856" href="#L2856">2856</a>
+<a class="jxr_linenumber" name="L2857" href="#L2857">2857</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2858" href="#L2858">2858</a> <em class="jxr_comment">// mostFrequentChar(String)</em>
+<a class="jxr_linenumber" name="L2859" href="#L2859">2859</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2860" href="#L2860">2860</a> @Test
+<a class="jxr_linenumber" name="L2861" href="#L2861">2861</a> <strong class="jxr_keyword">void</strong> a123_mostFrequentChar() {
+<a class="jxr_linenumber" name="L2862" href="#L2862">2862</a> assertEquals('l', mostFrequentChar(<span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L2863" href="#L2863">2863</a> assertEquals('a', mostFrequentChar(<span class="jxr_string">"aabbcc"</span>)); <em class="jxr_comment">// First encountered</em>
+<a class="jxr_linenumber" name="L2864" href="#L2864">2864</a> assertEquals('a', mostFrequentChar(<span class="jxr_string">"abcabc"</span>));
+<a class="jxr_linenumber" name="L2865" href="#L2865">2865</a> assertEquals('t', mostFrequentChar(<span class="jxr_string">"test"</span>));
+<a class="jxr_linenumber" name="L2866" href="#L2866">2866</a> assertEquals('l', mostFrequentChar(<span class="jxr_string">"hello world"</span>)); <em class="jxr_comment">// 'l' appears 3 times</em>
+<a class="jxr_linenumber" name="L2867" href="#L2867">2867</a> assertEquals('\0', mostFrequentChar(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2868" href="#L2868">2868</a> assertEquals('\0', mostFrequentChar(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L2869" href="#L2869">2869</a> }
+<a class="jxr_linenumber" name="L2870" href="#L2870">2870</a>
+<a class="jxr_linenumber" name="L2871" href="#L2871">2871</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2872" href="#L2872">2872</a> <em class="jxr_comment">// naturalCompare(String,String)</em>
+<a class="jxr_linenumber" name="L2873" href="#L2873">2873</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2874" href="#L2874">2874</a> @Test
+<a class="jxr_linenumber" name="L2875" href="#L2875">2875</a> <strong class="jxr_keyword">void</strong> a124_naturalCompare() {
+<a class="jxr_linenumber" name="L2876" href="#L2876">2876</a> <em class="jxr_comment">// Natural number comparison</em>
+<a class="jxr_linenumber" name="L2877" href="#L2877">2877</a> assertTrue(naturalCompare(<span class="jxr_string">"file2.txt"</span>, <span class="jxr_string">"file10.txt"</span>) < 0); <em class="jxr_comment">// 2 < 10</em>
+<a class="jxr_linenumber" name="L2878" href="#L2878">2878</a> assertTrue(naturalCompare(<span class="jxr_string">"file10.txt"</span>, <span class="jxr_string">"file2.txt"</span>) > 0); <em class="jxr_comment">// 10 > 2</em>
+<a class="jxr_linenumber" name="L2879" href="#L2879">2879</a> assertEquals(0, naturalCompare(<span class="jxr_string">"file1.txt"</span>, <span class="jxr_string">"file1.txt"</span>));
+<a class="jxr_linenumber" name="L2880" href="#L2880">2880</a> assertTrue(naturalCompare(<span class="jxr_string">"a2"</span>, <span class="jxr_string">"a10"</span>) < 0);
+<a class="jxr_linenumber" name="L2881" href="#L2881">2881</a> assertTrue(naturalCompare(<span class="jxr_string">"a10"</span>, <span class="jxr_string">"a2"</span>) > 0);
+<a class="jxr_linenumber" name="L2882" href="#L2882">2882</a>
+<a class="jxr_linenumber" name="L2883" href="#L2883">2883</a> <em class="jxr_comment">// Regular string comparison</em>
+<a class="jxr_linenumber" name="L2884" href="#L2884">2884</a> assertTrue(naturalCompare(<span class="jxr_string">"apple"</span>, <span class="jxr_string">"banana"</span>) < 0);
+<a class="jxr_linenumber" name="L2885" href="#L2885">2885</a> assertTrue(naturalCompare(<span class="jxr_string">"banana"</span>, <span class="jxr_string">"apple"</span>) > 0);
+<a class="jxr_linenumber" name="L2886" href="#L2886">2886</a> assertEquals(0, naturalCompare(<span class="jxr_string">"test"</span>, <span class="jxr_string">"test"</span>));
+<a class="jxr_linenumber" name="L2887" href="#L2887">2887</a>
+<a class="jxr_linenumber" name="L2888" href="#L2888">2888</a> <em class="jxr_comment">// Null handling</em>
+<a class="jxr_linenumber" name="L2889" href="#L2889">2889</a> assertTrue(naturalCompare(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"test"</span>) < 0);
+<a class="jxr_linenumber" name="L2890" href="#L2890">2890</a> assertTrue(naturalCompare(<span class="jxr_string">"test"</span>, <strong class="jxr_keyword">null</strong>) > 0);
+<a class="jxr_linenumber" name="L2891" href="#L2891">2891</a> assertEquals(0, naturalCompare(<strong class="jxr_keyword">null</strong>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2892" href="#L2892">2892</a> }
+<a class="jxr_linenumber" name="L2893" href="#L2893">2893</a>
+<a class="jxr_linenumber" name="L2894" href="#L2894">2894</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2895" href="#L2895">2895</a> <em class="jxr_comment">// normalizeUnicode(String)</em>
+<a class="jxr_linenumber" name="L2896" href="#L2896">2896</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2897" href="#L2897">2897</a> @Test
+<a class="jxr_linenumber" name="L2898" href="#L2898">2898</a> <strong class="jxr_keyword">void</strong> a125_normalizeUnicode() {
+<a class="jxr_linenumber" name="L2899" href="#L2899">2899</a> <em class="jxr_comment">// Basic normalization</em>
+<a class="jxr_linenumber" name="L2900" href="#L2900">2900</a> <strong class="jxr_keyword">var</strong> normalized = normalizeUnicode(<span class="jxr_string">"café"</span>);
+<a class="jxr_linenumber" name="L2901" href="#L2901">2901</a> assertNotNull(normalized);
+<a class="jxr_linenumber" name="L2902" href="#L2902">2902</a> assertNotEquals(<span class="jxr_string">"café"</span>, normalized); <em class="jxr_comment">// Should be decomposed</em>
+<a class="jxr_linenumber" name="L2903" href="#L2903">2903</a>
+<a class="jxr_linenumber" name="L2904" href="#L2904">2904</a> <em class="jxr_comment">// Null/empty input</em>
+<a class="jxr_linenumber" name="L2905" href="#L2905">2905</a> assertNull(normalizeUnicode(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2906" href="#L2906">2906</a> assertEquals(<span class="jxr_string">""</span>, normalizeUnicode(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L2907" href="#L2907">2907</a>
+<a class="jxr_linenumber" name="L2908" href="#L2908">2908</a> <em class="jxr_comment">// ASCII strings should remain unchanged</em>
+<a class="jxr_linenumber" name="L2909" href="#L2909">2909</a> assertEquals(<span class="jxr_string">"hello"</span>, normalizeUnicode(<span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L2910" href="#L2910">2910</a> }
+<a class="jxr_linenumber" name="L2911" href="#L2911">2911</a>
+<a class="jxr_linenumber" name="L2912" href="#L2912">2912</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2913" href="#L2913">2913</a> <em class="jxr_comment">// normalizeWhitespace(String)</em>
+<a class="jxr_linenumber" name="L2914" href="#L2914">2914</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2915" href="#L2915">2915</a> @Test
+<a class="jxr_linenumber" name="L2916" href="#L2916">2916</a> <strong class="jxr_keyword">void</strong> a126_normalizeWhitespace() {
+<a class="jxr_linenumber" name="L2917" href="#L2917">2917</a> assertNull(normalizeWhitespace(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2918" href="#L2918">2918</a> assertEquals(<span class="jxr_string">""</span>, normalizeWhitespace(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L2919" href="#L2919">2919</a> assertEquals(<span class="jxr_string">"hello world"</span>, normalizeWhitespace(<span class="jxr_string">"hello \t\n world"</span>));
+<a class="jxr_linenumber" name="L2920" href="#L2920">2920</a> assertEquals(<span class="jxr_string">"hello world"</span>, normalizeWhitespace(<span class="jxr_string">" hello world "</span>));
+<a class="jxr_linenumber" name="L2921" href="#L2921">2921</a> assertEquals(<span class="jxr_string">"a b c"</span>, normalizeWhitespace(<span class="jxr_string">"a b c"</span>));
+<a class="jxr_linenumber" name="L2922" href="#L2922">2922</a> }
+<a class="jxr_linenumber" name="L2923" href="#L2923">2923</a>
+<a class="jxr_linenumber" name="L2924" href="#L2924">2924</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2925" href="#L2925">2925</a> <em class="jxr_comment">// notContains(String,char) / notContains(String,CharSequence) / notContains(String,String)</em>
+<a class="jxr_linenumber" name="L2926" href="#L2926">2926</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2927" href="#L2927">2927</a> @Test
+<a class="jxr_linenumber" name="L2928" href="#L2928">2928</a> <strong class="jxr_keyword">void</strong> a127_notContains() {
+<a class="jxr_linenumber" name="L2929" href="#L2929">2929</a> <em class="jxr_comment">// notContains(String, char)</em>
+<a class="jxr_linenumber" name="L2930" href="#L2930">2930</a> assertFalse(notContains(<span class="jxr_string">"test"</span>, 't'));
+<a class="jxr_linenumber" name="L2931" href="#L2931">2931</a> assertTrue(notContains(<span class="jxr_string">"test"</span>, 'x'));
+<a class="jxr_linenumber" name="L2932" href="#L2932">2932</a> assertTrue(notContains(<strong class="jxr_keyword">null</strong>, 't'));
+<a class="jxr_linenumber" name="L2933" href="#L2933">2933</a>
+<a class="jxr_linenumber" name="L2934" href="#L2934">2934</a> <em class="jxr_comment">// notContains(String, CharSequence)</em>
+<a class="jxr_linenumber" name="L2935" href="#L2935">2935</a> assertFalse(notContains(<span class="jxr_string">"test"</span>, <span class="jxr_string">"te"</span>));
+<a class="jxr_linenumber" name="L2936" href="#L2936">2936</a> assertTrue(notContains(<span class="jxr_string">"test"</span>, <span class="jxr_string">"xx"</span>));
+<a class="jxr_linenumber" name="L2937" href="#L2937">2937</a> assertTrue(notContains(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"test"</span>));
+<a class="jxr_linenumber" name="L2938" href="#L2938">2938</a>
+<a class="jxr_linenumber" name="L2939" href="#L2939">2939</a> <em class="jxr_comment">// notContains(String, String)</em>
+<a class="jxr_linenumber" name="L2940" href="#L2940">2940</a> assertFalse(notContains(<span class="jxr_string">"test"</span>, <span class="jxr_string">"te"</span>));
+<a class="jxr_linenumber" name="L2941" href="#L2941">2941</a> assertTrue(notContains(<span class="jxr_string">"test"</span>, <span class="jxr_string">"xyz"</span>));
+<a class="jxr_linenumber" name="L2942" href="#L2942">2942</a> assertTrue(notContains(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"test"</span>));
+<a class="jxr_linenumber" name="L2943" href="#L2943">2943</a> }
+<a class="jxr_linenumber" name="L2944" href="#L2944">2944</a>
+<a class="jxr_linenumber" name="L2945" href="#L2945">2945</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2946" href="#L2946">2946</a> <em class="jxr_comment">// notContainsAll(String,char...) / notContainsAll(String,CharSequence...) / notContainsAll(String,String...)</em>
+<a class="jxr_linenumber" name="L2947" href="#L2947">2947</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2948" href="#L2948">2948</a> @Test
+<a class="jxr_linenumber" name="L2949" href="#L2949">2949</a> <strong class="jxr_keyword">void</strong> a128_notContainsAll() {
+<a class="jxr_linenumber" name="L2950" href="#L2950">2950</a> <em class="jxr_comment">// notContainsAll(String, char...)</em>
+<a class="jxr_linenumber" name="L2951" href="#L2951">2951</a> assertFalse(notContainsAll(<span class="jxr_string">"test"</span>, 't', 'e'));
+<a class="jxr_linenumber" name="L2952" href="#L2952">2952</a> assertTrue(notContainsAll(<span class="jxr_string">"test"</span>, 'x', 'y'));
+<a class="jxr_linenumber" name="L2953" href="#L2953">2953</a> assertTrue(notContainsAll(<strong class="jxr_keyword">null</strong>, 't', 'e'));
+<a class="jxr_linenumber" name="L2954" href="#L2954">2954</a>
+<a class="jxr_linenumber" name="L2955" href="#L2955">2955</a> <em class="jxr_comment">// notContainsAll(String, CharSequence...)</em>
+<a class="jxr_linenumber" name="L2956" href="#L2956">2956</a> assertFalse(notContainsAll(<span class="jxr_string">"test"</span>, <span class="jxr_string">"te"</span>, <span class="jxr_string">"es"</span>));
+<a class="jxr_linenumber" name="L2957" href="#L2957">2957</a> assertTrue(notContainsAll(<span class="jxr_string">"test"</span>, <span class="jxr_string">"xy"</span>, <span class="jxr_string">"zz"</span>));
+<a class="jxr_linenumber" name="L2958" href="#L2958">2958</a> assertTrue(notContainsAll(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"te"</span>, <span class="jxr_string">"es"</span>));
+<a class="jxr_linenumber" name="L2959" href="#L2959">2959</a>
+<a class="jxr_linenumber" name="L2960" href="#L2960">2960</a> <em class="jxr_comment">// notContainsAll(String, String...)</em>
+<a class="jxr_linenumber" name="L2961" href="#L2961">2961</a> assertFalse(notContainsAll(<span class="jxr_string">"test"</span>, <span class="jxr_string">"te"</span>, <span class="jxr_string">"es"</span>));
+<a class="jxr_linenumber" name="L2962" href="#L2962">2962</a> assertTrue(notContainsAll(<span class="jxr_string">"test"</span>, <span class="jxr_string">"xy"</span>, <span class="jxr_string">"zz"</span>));
+<a class="jxr_linenumber" name="L2963" href="#L2963">2963</a> assertTrue(notContainsAll(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"te"</span>, <span class="jxr_string">"es"</span>));
+<a class="jxr_linenumber" name="L2964" href="#L2964">2964</a> }
+<a class="jxr_linenumber" name="L2965" href="#L2965">2965</a>
+<a class="jxr_linenumber" name="L2966" href="#L2966">2966</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2967" href="#L2967">2967</a> <em class="jxr_comment">// notContainsAny(String,char...) / notContainsAny(String,CharSequence...) / notContainsAny(String,String...)</em>
+<a class="jxr_linenumber" name="L2968" href="#L2968">2968</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2969" href="#L2969">2969</a> @Test
+<a class="jxr_linenumber" name="L2970" href="#L2970">2970</a> <strong class="jxr_keyword">void</strong> a129_notContainsAny() {
+<a class="jxr_linenumber" name="L2971" href="#L2971">2971</a> <em class="jxr_comment">// notContainsAny(String, char...)</em>
+<a class="jxr_linenumber" name="L2972" href="#L2972">2972</a> assertFalse(notContainsAny(<span class="jxr_string">"test"</span>, 't', 'x'));
+<a class="jxr_linenumber" name="L2973" href="#L2973">2973</a> assertTrue(notContainsAny(<span class="jxr_string">"test"</span>, 'x', 'y'));
+<a class="jxr_linenumber" name="L2974" href="#L2974">2974</a> assertTrue(notContainsAny(<strong class="jxr_keyword">null</strong>, 't', 'x'));
+<a class="jxr_linenumber" name="L2975" href="#L2975">2975</a>
+<a class="jxr_linenumber" name="L2976" href="#L2976">2976</a> <em class="jxr_comment">// notContainsAny(String, CharSequence...)</em>
+<a class="jxr_linenumber" name="L2977" href="#L2977">2977</a> assertFalse(notContainsAny(<span class="jxr_string">"test"</span>, <span class="jxr_string">"te"</span>, <span class="jxr_string">"xx"</span>));
+<a class="jxr_linenumber" name="L2978" href="#L2978">2978</a> assertTrue(notContainsAny(<span class="jxr_string">"test"</span>, <span class="jxr_string">"xy"</span>, <span class="jxr_string">"zz"</span>));
+<a class="jxr_linenumber" name="L2979" href="#L2979">2979</a> assertTrue(notContainsAny(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"te"</span>, <span class="jxr_string">"xx"</span>));
+<a class="jxr_linenumber" name="L2980" href="#L2980">2980</a>
+<a class="jxr_linenumber" name="L2981" href="#L2981">2981</a> <em class="jxr_comment">// notContainsAny(String, String...)</em>
+<a class="jxr_linenumber" name="L2982" href="#L2982">2982</a> assertFalse(notContainsAny(<span class="jxr_string">"test"</span>, <span class="jxr_string">"te"</span>, <span class="jxr_string">"xx"</span>));
+<a class="jxr_linenumber" name="L2983" href="#L2983">2983</a> assertTrue(notContainsAny(<span class="jxr_string">"test"</span>, <span class="jxr_string">"xy"</span>, <span class="jxr_string">"zz"</span>));
+<a class="jxr_linenumber" name="L2984" href="#L2984">2984</a> assertTrue(notContainsAny(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"te"</span>, <span class="jxr_string">"xx"</span>));
+<a class="jxr_linenumber" name="L2985" href="#L2985">2985</a> }
+<a class="jxr_linenumber" name="L2986" href="#L2986">2986</a>
+<a class="jxr_linenumber" name="L2987" href="#L2987">2987</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2988" href="#L2988">2988</a> <em class="jxr_comment">// nullIfEmpty(String)</em>
+<a class="jxr_linenumber" name="L2989" href="#L2989">2989</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2990" href="#L2990">2990</a> @Test
+<a class="jxr_linenumber" name="L2991" href="#L2991">2991</a> <strong class="jxr_keyword">void</strong> a130_nullIfEmpty() {
+<a class="jxr_linenumber" name="L2992" href="#L2992">2992</a> assertNull(nullIfEmpty(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L2993" href="#L2993">2993</a> assertNull(nullIfEmpty(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L2994" href="#L2994">2994</a> assertNotNull(nullIfEmpty(<span class="jxr_string">"x"</span>));
+<a class="jxr_linenumber" name="L2995" href="#L2995">2995</a> assertEquals(<span class="jxr_string">"test"</span>, nullIfEmpty(<span class="jxr_string">"test"</span>));
+<a class="jxr_linenumber" name="L2996" href="#L2996">2996</a> }
+<a class="jxr_linenumber" name="L2997" href="#L2997">2997</a>
+<a class="jxr_linenumber" name="L2998" href="#L2998">2998</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L2999" href="#L2999">2999</a> <em class="jxr_comment">// obfuscate(String)</em>
+<a class="jxr_linenumber" name="L3000" href="#L3000">3000</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3001" href="#L3001">3001</a> @Test
+<a class="jxr_linenumber" name="L3002" href="#L3002">3002</a> <strong class="jxr_keyword">void</strong> a131_obfuscate() {
+<a class="jxr_linenumber" name="L3003" href="#L3003">3003</a> assertEquals(<span class="jxr_string">"*"</span>, obfuscate(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3004" href="#L3004">3004</a> assertEquals(<span class="jxr_string">"*"</span>, obfuscate(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L3005" href="#L3005">3005</a> assertEquals(<span class="jxr_string">"*"</span>, obfuscate(<span class="jxr_string">"a"</span>));
+<a class="jxr_linenumber" name="L3006" href="#L3006">3006</a> assertEquals(<span class="jxr_string">"p*"</span>, obfuscate(<span class="jxr_string">"pa"</span>));
+<a class="jxr_linenumber" name="L3007" href="#L3007">3007</a> assertEquals(<span class="jxr_string">"p*******"</span>, obfuscate(<span class="jxr_string">"password"</span>));
+<a class="jxr_linenumber" name="L3008" href="#L3008">3008</a> assertEquals(<span class="jxr_string">"1*****"</span>, obfuscate(<span class="jxr_string">"123456"</span>));
+<a class="jxr_linenumber" name="L3009" href="#L3009">3009</a> }
+<a class="jxr_linenumber" name="L3010" href="#L3010">3010</a>
+<a class="jxr_linenumber" name="L3011" href="#L3011">3011</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3012" href="#L3012">3012</a> <em class="jxr_comment">// optimizeString(String)</em>
+<a class="jxr_linenumber" name="L3013" href="#L3013">3013</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3014" href="#L3014">3014</a> @Test
+<a class="jxr_linenumber" name="L3015" href="#L3015">3015</a> <strong class="jxr_keyword">void</strong> a132_optimizeString() {
+<a class="jxr_linenumber" name="L3016" href="#L3016">3016</a> <em class="jxr_comment">// Null/empty input</em>
+<a class="jxr_linenumber" name="L3017" href="#L3017">3017</a> assertNull(optimizeString(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3018" href="#L3018">3018</a> assertNull(optimizeString(<span class="jxr_string">"short"</span>)); <em class="jxr_comment">// No suggestions for short strings</em>
+<a class="jxr_linenumber" name="L3019" href="#L3019">3019</a>
+<a class="jxr_linenumber" name="L3020" href="#L3020">3020</a> <em class="jxr_comment">// Large strings should suggest StringBuilder</em>
+<a class="jxr_linenumber" name="L3021" href="#L3021">3021</a> <strong class="jxr_keyword">var</strong> largeString = <span class="jxr_string">"x"</span>.repeat(1001);
+<a class="jxr_linenumber" name="L3022" href="#L3022">3022</a> <strong class="jxr_keyword">var</strong> suggestions = optimizeString(largeString);
+<a class="jxr_linenumber" name="L3023" href="#L3023">3023</a> assertNotNull(suggestions);
+<a class="jxr_linenumber" name="L3024" href="#L3024">3024</a> assertTrue(suggestions.contains(<span class="jxr_string">"StringBuilder"</span>));
+<a class="jxr_linenumber" name="L3025" href="#L3025">3025</a>
+<a class="jxr_linenumber" name="L3026" href="#L3026">3026</a> <em class="jxr_comment">// Very large strings should suggest compression</em>
+<a class="jxr_linenumber" name="L3027" href="#L3027">3027</a> <strong class="jxr_keyword">var</strong> veryLargeString = <span class="jxr_string">"x"</span>.repeat(10001);
+<a class="jxr_linenumber" name="L3028" href="#L3028">3028</a> <strong class="jxr_keyword">var</strong> suggestions2 = optimizeString(veryLargeString);
+<a class="jxr_linenumber" name="L3029" href="#L3029">3029</a> assertNotNull(suggestions2);
+<a class="jxr_linenumber" name="L3030" href="#L3030">3030</a> assertTrue(suggestions2.contains(<span class="jxr_string">"compression"</span>));
+<a class="jxr_linenumber" name="L3031" href="#L3031">3031</a> }
+<a class="jxr_linenumber" name="L3032" href="#L3032">3032</a>
+<a class="jxr_linenumber" name="L3033" href="#L3033">3033</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3034" href="#L3034">3034</a> <em class="jxr_comment">// ordinal(int)</em>
+<a class="jxr_linenumber" name="L3035" href="#L3035">3035</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3036" href="#L3036">3036</a> @Test
+<a class="jxr_linenumber" name="L3037" href="#L3037">3037</a> <strong class="jxr_keyword">void</strong> a133_ordinal() {
+<a class="jxr_linenumber" name="L3038" href="#L3038">3038</a> assertEquals(<span class="jxr_string">"1st"</span>, ordinal(1));
+<a class="jxr_linenumber" name="L3039" href="#L3039">3039</a> assertEquals(<span class="jxr_string">"2nd"</span>, ordinal(2));
+<a class="jxr_linenumber" name="L3040" href="#L3040">3040</a> assertEquals(<span class="jxr_string">"3rd"</span>, ordinal(3));
+<a class="jxr_linenumber" name="L3041" href="#L3041">3041</a> assertEquals(<span class="jxr_string">"4th"</span>, ordinal(4));
+<a class="jxr_linenumber" name="L3042" href="#L3042">3042</a> assertEquals(<span class="jxr_string">"11th"</span>, ordinal(11)); <em class="jxr_comment">// Special case</em>
+<a class="jxr_linenumber" name="L3043" href="#L3043">3043</a> assertEquals(<span class="jxr_string">"12th"</span>, ordinal(12)); <em class="jxr_comment">// Special case</em>
+<a class="jxr_linenumber" name="L3044" href="#L3044">3044</a> assertEquals(<span class="jxr_string">"13th"</span>, ordinal(13)); <em class="jxr_comment">// Special case</em>
+<a class="jxr_linenumber" name="L3045" href="#L3045">3045</a> assertEquals(<span class="jxr_string">"21st"</span>, ordinal(21));
+<a class="jxr_linenumber" name="L3046" href="#L3046">3046</a> assertEquals(<span class="jxr_string">"22nd"</span>, ordinal(22));
+<a class="jxr_linenumber" name="L3047" href="#L3047">3047</a> assertEquals(<span class="jxr_string">"23rd"</span>, ordinal(23));
+<a class="jxr_linenumber" name="L3048" href="#L3048">3048</a> assertEquals(<span class="jxr_string">"24th"</span>, ordinal(24));
+<a class="jxr_linenumber" name="L3049" href="#L3049">3049</a> assertEquals(<span class="jxr_string">"101st"</span>, ordinal(101));
+<a class="jxr_linenumber" name="L3050" href="#L3050">3050</a> assertEquals(<span class="jxr_string">"102nd"</span>, ordinal(102));
+<a class="jxr_linenumber" name="L3051" href="#L3051">3051</a> assertEquals(<span class="jxr_string">"103rd"</span>, ordinal(103));
+<a class="jxr_linenumber" name="L3052" href="#L3052">3052</a> assertEquals(<span class="jxr_string">"111th"</span>, ordinal(111)); <em class="jxr_comment">// Special case</em>
+<a class="jxr_linenumber" name="L3053" href="#L3053">3053</a> assertEquals(<span class="jxr_string">"-1st"</span>, ordinal(-1));
+<a class="jxr_linenumber" name="L3054" href="#L3054">3054</a> }
+<a class="jxr_linenumber" name="L3055" href="#L3055">3055</a>
+<a class="jxr_linenumber" name="L3056" href="#L3056">3056</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3057" href="#L3057">3057</a> <em class="jxr_comment">// padCenter(String,int,char)</em>
+<a class="jxr_linenumber" name="L3058" href="#L3058">3058</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3059" href="#L3059">3059</a> @Test
+<a class="jxr_linenumber" name="L3060" href="#L3060">3060</a> <strong class="jxr_keyword">void</strong> a134_padCenter() {
+<a class="jxr_linenumber" name="L3061" href="#L3061">3061</a> assertEquals(<span class="jxr_string">" "</span>, padCenter(<strong class="jxr_keyword">null</strong>, 5, ' '));
+<a class="jxr_linenumber" name="L3062" href="#L3062">3062</a> assertEquals(<span class="jxr_string">" "</span>, padCenter(<span class="jxr_string">""</span>, 5, ' '));
+<a class="jxr_linenumber" name="L3063" href="#L3063">3063</a> assertEquals(<span class="jxr_string">" hi "</span>, padCenter(<span class="jxr_string">"hi"</span>, 6, ' '));
+<a class="jxr_linenumber" name="L3064" href="#L3064">3064</a> assertEquals(<span class="jxr_string">" hi "</span>, padCenter(<span class="jxr_string">"hi"</span>, 7, ' '));
+<a class="jxr_linenumber" name="L3065" href="#L3065">3065</a> assertEquals(<span class="jxr_string">"hello"</span>, padCenter(<span class="jxr_string">"hello"</span>, 3, ' '));
+<a class="jxr_linenumber" name="L3066" href="#L3066">3066</a> assertEquals(<span class="jxr_string">" hello "</span>, padCenter(<span class="jxr_string">"hello"</span>, 7, ' '));
+<a class="jxr_linenumber" name="L3067" href="#L3067">3067</a> }
+<a class="jxr_linenumber" name="L3068" href="#L3068">3068</a>
+<a class="jxr_linenumber" name="L3069" href="#L3069">3069</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3070" href="#L3070">3070</a> <em class="jxr_comment">// padLeft(String,int,char)</em>
+<a class="jxr_linenumber" name="L3071" href="#L3071">3071</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3072" href="#L3072">3072</a> @Test
+<a class="jxr_linenumber" name="L3073" href="#L3073">3073</a> <strong class="jxr_keyword">void</strong> a135_padLeft() {
+<a class="jxr_linenumber" name="L3074" href="#L3074">3074</a> assertEquals(<span class="jxr_string">" "</span>, padLeft(<strong class="jxr_keyword">null</strong>, 5, ' '));
+<a class="jxr_linenumber" name="L3075" href="#L3075">3075</a> assertEquals(<span class="jxr_string">" "</span>, padLeft(<span class="jxr_string">""</span>, 5, ' '));
+<a class="jxr_linenumber" name="L3076" href="#L3076">3076</a> assertEquals(<span class="jxr_string">" hello"</span>, padLeft(<span class="jxr_string">"hello"</span>, 8, ' '));
+<a class="jxr_linenumber" name="L3077" href="#L3077">3077</a> assertEquals(<span class="jxr_string">"hello"</span>, padLeft(<span class="jxr_string">"hello"</span>, 3, ' '));
+<a class="jxr_linenumber" name="L3078" href="#L3078">3078</a> assertEquals(<span class="jxr_string">"00123"</span>, padLeft(<span class="jxr_string">"123"</span>, 5, '0'));
+<a class="jxr_linenumber" name="L3079" href="#L3079">3079</a> }
+<a class="jxr_linenumber" name="L3080" href="#L3080">3080</a>
+<a class="jxr_linenumber" name="L3081" href="#L3081">3081</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3082" href="#L3082">3082</a> <em class="jxr_comment">// padRight(String,int,char)</em>
+<a class="jxr_linenumber" name="L3083" href="#L3083">3083</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3084" href="#L3084">3084</a> @Test
+<a class="jxr_linenumber" name="L3085" href="#L3085">3085</a> <strong class="jxr_keyword">void</strong> a136_padRight() {
+<a class="jxr_linenumber" name="L3086" href="#L3086">3086</a> assertEquals(<span class="jxr_string">" "</span>, padRight(<strong class="jxr_keyword">null</strong>, 5, ' '));
+<a class="jxr_linenumber" name="L3087" href="#L3087">3087</a> assertEquals(<span class="jxr_string">" "</span>, padRight(<span class="jxr_string">""</span>, 5, ' '));
+<a class="jxr_linenumber" name="L3088" href="#L3088">3088</a> assertEquals(<span class="jxr_string">"hello "</span>, padRight(<span class="jxr_string">"hello"</span>, 8, ' '));
+<a class="jxr_linenumber" name="L3089" href="#L3089">3089</a> assertEquals(<span class="jxr_string">"hello"</span>, padRight(<span class="jxr_string">"hello"</span>, 3, ' '));
+<a class="jxr_linenumber" name="L3090" href="#L3090">3090</a> assertEquals(<span class="jxr_string">"12300"</span>, padRight(<span class="jxr_string">"123"</span>, 5, '0'));
+<a class="jxr_linenumber" name="L3091" href="#L3091">3091</a> }
+<a class="jxr_linenumber" name="L3092" href="#L3092">3092</a>
+<a class="jxr_linenumber" name="L3093" href="#L3093">3093</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3094" href="#L3094">3094</a> <em class="jxr_comment">// parseCharacter(Object)</em>
+<a class="jxr_linenumber" name="L3095" href="#L3095">3095</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3096" href="#L3096">3096</a> @Test
+<a class="jxr_linenumber" name="L3097" href="#L3097">3097</a> <strong class="jxr_keyword">void</strong> a137_parseCharacter() {
+<a class="jxr_linenumber" name="L3098" href="#L3098">3098</a> assertNull(parseCharacter(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3099" href="#L3099">3099</a> assertNull(parseCharacter(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L3100" href="#L3100">3100</a> assertEquals(Character.valueOf('a'), parseCharacter(<span class="jxr_string">"a"</span>));
+<a class="jxr_linenumber" name="L3101" href="#L3101">3101</a> assertEquals(Character.valueOf('1'), parseCharacter(<span class="jxr_string">"1"</span>));
+<a class="jxr_linenumber" name="L3102" href="#L3102">3102</a> assertEquals(Character.valueOf(' '), parseCharacter(<span class="jxr_string">" "</span>));
+<a class="jxr_linenumber" name="L3103" href="#L3103">3103</a> <em class="jxr_comment">// Invalid - should throw</em>
+<a class="jxr_linenumber" name="L3104" href="#L3104">3104</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> parseCharacter(<span class="jxr_string">"ab"</span>));
+<a class="jxr_linenumber" name="L3105" href="#L3105">3105</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> parseCharacter(<span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L3106" href="#L3106">3106</a> }
+<a class="jxr_linenumber" name="L3107" href="#L3107">3107</a>
+<a class="jxr_linenumber" name="L3108" href="#L3108">3108</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3109" href="#L3109">3109</a> <em class="jxr_comment">// parseFloat(String)</em>
+<a class="jxr_linenumber" name="L3110" href="#L3110">3110</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3111" href="#L3111">3111</a> @Test
+<a class="jxr_linenumber" name="L3112" href="#L3112">3112</a> <strong class="jxr_keyword">void</strong> a138_parseFloat() {
+<a class="jxr_linenumber" name="L3113" href="#L3113">3113</a> assertEquals(1.5f, parseFloat(<span class="jxr_string">"1.5"</span>), 0.0001f);
+<a class="jxr_linenumber" name="L3114" href="#L3114">3114</a> assertEquals(1000.5f, parseFloat(<span class="jxr_string">"1_000.5"</span>), 0.0001f);
+<a class="jxr_linenumber" name="L3115" href="#L3115">3115</a> assertEquals(-123.45f, parseFloat(<span class="jxr_string">"-123.45"</span>), 0.0001f);
+<a class="jxr_linenumber" name="L3116" href="#L3116">3116</a> assertEquals(0.0f, parseFloat(<span class="jxr_string">"0"</span>), 0.0001f);
+<a class="jxr_linenumber" name="L3117" href="#L3117">3117</a> <em class="jxr_comment">// Should throw for invalid input</em>
+<a class="jxr_linenumber" name="L3118" href="#L3118">3118</a> assertThrows(NumberFormatException.<strong class="jxr_keyword">class</strong>, () -> parseFloat(<span class="jxr_string">"invalid"</span>));
+<a class="jxr_linenumber" name="L3119" href="#L3119">3119</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> parseFloat(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3120" href="#L3120">3120</a> }
+<a class="jxr_linenumber" name="L3121" href="#L3121">3121</a>
+<a class="jxr_linenumber" name="L3122" href="#L3122">3122</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3123" href="#L3123">3123</a> <em class="jxr_comment">// parseInt(String)</em>
+<a class="jxr_linenumber" name="L3124" href="#L3124">3124</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3125" href="#L3125">3125</a> @Test
+<a class="jxr_linenumber" name="L3126" href="#L3126">3126</a> <strong class="jxr_keyword">void</strong> a139_parseInt() {
+<a class="jxr_linenumber" name="L3127" href="#L3127">3127</a> assertEquals(123, parseInt(<span class="jxr_string">"123"</span>));
+<a class="jxr_linenumber" name="L3128" href="#L3128">3128</a> assertEquals(1000000, parseInt(<span class="jxr_string">"1_000_000"</span>));
+<a class="jxr_linenumber" name="L3129" href="#L3129">3129</a> assertEquals(-456, parseInt(<span class="jxr_string">"-456"</span>));
+<a class="jxr_linenumber" name="L3130" href="#L3130">3130</a> assertEquals(0, parseInt(<span class="jxr_string">"0"</span>));
+<a class="jxr_linenumber" name="L3131" href="#L3131">3131</a> <em class="jxr_comment">// Should throw for invalid input</em>
+<a class="jxr_linenumber" name="L3132" href="#L3132">3132</a> assertThrows(NumberFormatException.<strong class="jxr_keyword">class</strong>, () -> parseInt(<span class="jxr_string">"invalid"</span>));
+<a class="jxr_linenumber" name="L3133" href="#L3133">3133</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> parseInt(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3134" href="#L3134">3134</a> }
+<a class="jxr_linenumber" name="L3135" href="#L3135">3135</a>
+<a class="jxr_linenumber" name="L3136" href="#L3136">3136</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3137" href="#L3137">3137</a> <em class="jxr_comment">// parseIntWithSuffix(String)</em>
+<a class="jxr_linenumber" name="L3138" href="#L3138">3138</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3139" href="#L3139">3139</a> @Test
+<a class="jxr_linenumber" name="L3140" href="#L3140">3140</a> <strong class="jxr_keyword">void</strong> a140_parseIntWithSuffix() {
+<a class="jxr_linenumber" name="L3141" href="#L3141">3141</a> <em class="jxr_comment">// Binary multipliers (1024-based)</em>
+<a class="jxr_linenumber" name="L3142" href="#L3142">3142</a> assertEquals(1024, parseIntWithSuffix(<span class="jxr_string">"1K"</span>));
+<a class="jxr_linenumber" name="L3143" href="#L3143">3143</a> assertEquals(1024 * 1024, parseIntWithSuffix(<span class="jxr_string">"1M"</span>));
+<a class="jxr_linenumber" name="L3144" href="#L3144">3144</a> assertEquals(1024 * 1024 * 1024, parseIntWithSuffix(<span class="jxr_string">"1G"</span>));
+<a class="jxr_linenumber" name="L3145" href="#L3145">3145</a>
+<a class="jxr_linenumber" name="L3146" href="#L3146">3146</a> <em class="jxr_comment">// Decimal multipliers (1000-based)</em>
+<a class="jxr_linenumber" name="L3147" href="#L3147">3147</a> assertEquals(1000, parseIntWithSuffix(<span class="jxr_string">"1k"</span>));
+<a class="jxr_linenumber" name="L3148" href="#L3148">3148</a> assertEquals(1000 * 1000, parseIntWithSuffix(<span class="jxr_string">"1m"</span>));
+<a class="jxr_linenumber" name="L3149" href="#L3149">3149</a> assertEquals(1000 * 1000 * 1000, parseIntWithSuffix(<span class="jxr_string">"1g"</span>));
+<a class="jxr_linenumber" name="L3150" href="#L3150">3150</a>
+<a class="jxr_linenumber" name="L3151" href="#L3151">3151</a> <em class="jxr_comment">// No suffix</em>
+<a class="jxr_linenumber" name="L3152" href="#L3152">3152</a> assertEquals(123, parseIntWithSuffix(<span class="jxr_string">"123"</span>));
+<a class="jxr_linenumber" name="L3153" href="#L3153">3153</a> assertEquals(456, parseIntWithSuffix(<span class="jxr_string">"456"</span>));
+<a class="jxr_linenumber" name="L3154" href="#L3154">3154</a>
+<a class="jxr_linenumber" name="L3155" href="#L3155">3155</a> <em class="jxr_comment">// With spaces</em>
+<a class="jxr_linenumber" name="L3156" href="#L3156">3156</a> assertEquals(1024, parseIntWithSuffix(<span class="jxr_string">"1 K"</span>));
+<a class="jxr_linenumber" name="L3157" href="#L3157">3157</a> assertEquals(1000, parseIntWithSuffix(<span class="jxr_string">"1 k"</span>));
+<a class="jxr_linenumber" name="L3158" href="#L3158">3158</a>
+<a class="jxr_linenumber" name="L3159" href="#L3159">3159</a> <em class="jxr_comment">// Should throw for null</em>
+<a class="jxr_linenumber" name="L3160" href="#L3160">3160</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> parseIntWithSuffix(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3161" href="#L3161">3161</a> }
+<a class="jxr_linenumber" name="L3162" href="#L3162">3162</a>
+<a class="jxr_linenumber" name="L3163" href="#L3163">3163</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3164" href="#L3164">3164</a> <em class="jxr_comment">// parseIsoCalendar(String)</em>
+<a class="jxr_linenumber" name="L3165" href="#L3165">3165</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3166" href="#L3166">3166</a> @Test
+<a class="jxr_linenumber" name="L3167" href="#L3167">3167</a> <strong class="jxr_keyword">void</strong> a141_parseIsoCalendar() <strong class="jxr_keyword">throws</strong> Exception {
+<a class="jxr_linenumber" name="L3168" href="#L3168">3168</a> <em class="jxr_comment">// Various ISO8601 formats</em>
+<a class="jxr_linenumber" name="L3169" href="#L3169">3169</a> <strong class="jxr_keyword">var</strong> cal1 = parseIsoCalendar(<span class="jxr_string">"2023"</span>);
+<a class="jxr_linenumber" name="L3170" href="#L3170">3170</a> assertNotNull(cal1);
+<a class="jxr_linenumber" name="L3171" href="#L3171">3171</a> assertEquals(2023, cal1.get(Calendar.YEAR));
+<a class="jxr_linenumber" name="L3172" href="#L3172">3172</a>
+<a class="jxr_linenumber" name="L3173" href="#L3173">3173</a> <strong class="jxr_keyword">var</strong> cal2 = parseIsoCalendar(<span class="jxr_string">"2023-12"</span>);
+<a class="jxr_linenumber" name="L3174" href="#L3174">3174</a> assertNotNull(cal2);
+<a class="jxr_linenumber" name="L3175" href="#L3175">3175</a> assertEquals(2023, cal2.get(Calendar.YEAR));
+<a class="jxr_linenumber" name="L3176" href="#L3176">3176</a> assertEquals(Calendar.DECEMBER, cal2.get(Calendar.MONTH));
+<a class="jxr_linenumber" name="L3177" href="#L3177">3177</a>
+<a class="jxr_linenumber" name="L3178" href="#L3178">3178</a> <strong class="jxr_keyword">var</strong> cal3 = parseIsoCalendar(<span class="jxr_string">"2023-12-25"</span>);
+<a class="jxr_linenumber" name="L3179" href="#L3179">3179</a> assertNotNull(cal3);
+<a class="jxr_linenumber" name="L3180" href="#L3180">3180</a> assertEquals(2023, cal3.get(Calendar.YEAR));
+<a class="jxr_linenumber" name="L3181" href="#L3181">3181</a> assertEquals(Calendar.DECEMBER, cal3.get(Calendar.MONTH));
+<a class="jxr_linenumber" name="L3182" href="#L3182">3182</a> assertEquals(25, cal3.get(Calendar.DAY_OF_MONTH));
+<a class="jxr_linenumber" name="L3183" href="#L3183">3183</a>
+<a class="jxr_linenumber" name="L3184" href="#L3184">3184</a> <strong class="jxr_keyword">var</strong> cal4 = parseIsoCalendar(<span class="jxr_string">"2023-12-25T14:30:00"</span>);
+<a class="jxr_linenumber" name="L3185" href="#L3185">3185</a> assertNotNull(cal4);
+<a class="jxr_linenumber" name="L3186" href="#L3186">3186</a> assertEquals(14, cal4.get(Calendar.HOUR_OF_DAY));
+<a class="jxr_linenumber" name="L3187" href="#L3187">3187</a> assertEquals(30, cal4.get(Calendar.MINUTE));
+<a class="jxr_linenumber" name="L3188" href="#L3188">3188</a> assertEquals(0, cal4.get(Calendar.SECOND));
+<a class="jxr_linenumber" name="L3189" href="#L3189">3189</a>
+<a class="jxr_linenumber" name="L3190" href="#L3190">3190</a> <em class="jxr_comment">// Should throw for invalid dates (DateTimeParseException is thrown by DateUtils, not IllegalArgumentException)</em>
+<a class="jxr_linenumber" name="L3191" href="#L3191">3191</a> assertThrows(Exception.<strong class="jxr_keyword">class</strong>, () -> parseIsoCalendar(<span class="jxr_string">"invalid"</span>));
+<a class="jxr_linenumber" name="L3192" href="#L3192">3192</a> assertThrows(Exception.<strong class="jxr_keyword">class</strong>, () -> parseIsoCalendar(<span class="jxr_string">"2023-13-25"</span>)); <em class="jxr_comment">// Invalid month</em>
+<a class="jxr_linenumber" name="L3193" href="#L3193">3193</a> }
+<a class="jxr_linenumber" name="L3194" href="#L3194">3194</a>
+<a class="jxr_linenumber" name="L3195" href="#L3195">3195</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3196" href="#L3196">3196</a> <em class="jxr_comment">// parseIsoDate(String)</em>
+<a class="jxr_linenumber" name="L3197" href="#L3197">3197</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3198" href="#L3198">3198</a> @Test
+<a class="jxr_linenumber" name="L3199" href="#L3199">3199</a> <strong class="jxr_keyword">void</strong> a142_parseIsoDate() <strong class="jxr_keyword">throws</strong> Exception {
+<a class="jxr_linenumber" name="L3200" href="#L3200">3200</a> <em class="jxr_comment">// parseIsoDate wraps parseIsoCalendar, so test similar cases</em>
+<a class="jxr_linenumber" name="L3201" href="#L3201">3201</a> <strong class="jxr_keyword">var</strong> date1 = parseIsoDate(<span class="jxr_string">"2023-12-25"</span>);
+<a class="jxr_linenumber" name="L3202" href="#L3202">3202</a> assertNotNull(date1);
+<a class="jxr_linenumber" name="L3203" href="#L3203">3203</a>
+<a class="jxr_linenumber" name="L3204" href="#L3204">3204</a> <strong class="jxr_keyword">var</strong> date2 = parseIsoDate(<span class="jxr_string">"2023-12-25T14:30:00"</span>);
+<a class="jxr_linenumber" name="L3205" href="#L3205">3205</a> assertNotNull(date2);
+<a class="jxr_linenumber" name="L3206" href="#L3206">3206</a>
+<a class="jxr_linenumber" name="L3207" href="#L3207">3207</a> <em class="jxr_comment">// Should throw for invalid dates (DateTimeParseException is thrown by DateUtils, not IllegalArgumentException)</em>
+<a class="jxr_linenumber" name="L3208" href="#L3208">3208</a> assertThrows(Exception.<strong class="jxr_keyword">class</strong>, () -> parseIsoDate(<span class="jxr_string">"invalid"</span>));
+<a class="jxr_linenumber" name="L3209" href="#L3209">3209</a> }
+<a class="jxr_linenumber" name="L3210" href="#L3210">3210</a>
+<a class="jxr_linenumber" name="L3211" href="#L3211">3211</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3212" href="#L3212">3212</a> <em class="jxr_comment">// parseLong(String)</em>
+<a class="jxr_linenumber" name="L3213" href="#L3213">3213</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3214" href="#L3214">3214</a> @Test
+<a class="jxr_linenumber" name="L3215" href="#L3215">3215</a> <strong class="jxr_keyword">void</strong> a143_parseLong() {
+<a class="jxr_linenumber" name="L3216" href="#L3216">3216</a> assertEquals(123L, parseLong(<span class="jxr_string">"123"</span>));
+<a class="jxr_linenumber" name="L3217" href="#L3217">3217</a> assertEquals(1000000L, parseLong(<span class="jxr_string">"1_000_000"</span>));
+<a class="jxr_linenumber" name="L3218" href="#L3218">3218</a> assertEquals(-456L, parseLong(<span class="jxr_string">"-456"</span>));
+<a class="jxr_linenumber" name="L3219" href="#L3219">3219</a> assertEquals(0L, parseLong(<span class="jxr_string">"0"</span>));
+<a class="jxr_linenumber" name="L3220" href="#L3220">3220</a> <em class="jxr_comment">// Should throw for invalid input</em>
+<a class="jxr_linenumber" name="L3221" href="#L3221">3221</a> assertThrows(NumberFormatException.<strong class="jxr_keyword">class</strong>, () -> parseLong(<span class="jxr_string">"invalid"</span>));
+<a class="jxr_linenumber" name="L3222" href="#L3222">3222</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> parseLong(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3223" href="#L3223">3223</a> }
+<a class="jxr_linenumber" name="L3224" href="#L3224">3224</a>
+<a class="jxr_linenumber" name="L3225" href="#L3225">3225</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3226" href="#L3226">3226</a> <em class="jxr_comment">// parseLongWithSuffix(String)</em>
+<a class="jxr_linenumber" name="L3227" href="#L3227">3227</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3228" href="#L3228">3228</a> @Test
+<a class="jxr_linenumber" name="L3229" href="#L3229">3229</a> <strong class="jxr_keyword">void</strong> a144_parseLongWithSuffix() {
+<a class="jxr_linenumber" name="L3230" href="#L3230">3230</a> <em class="jxr_comment">// Binary multipliers (1024-based)</em>
+<a class="jxr_linenumber" name="L3231" href="#L3231">3231</a> assertEquals(1024L, parseLongWithSuffix(<span class="jxr_string">"1K"</span>));
+<a class="jxr_linenumber" name="L3232" href="#L3232">3232</a> assertEquals(1024L * 1024, parseLongWithSuffix(<span class="jxr_string">"1M"</span>));
+<a class="jxr_linenumber" name="L3233" href="#L3233">3233</a> assertEquals(1024L * 1024 * 1024, parseLongWithSuffix(<span class="jxr_string">"1G"</span>));
+<a class="jxr_linenumber" name="L3234" href="#L3234">3234</a> assertEquals(1024L * 1024 * 1024 * 1024, parseLongWithSuffix(<span class="jxr_string">"1T"</span>));
+<a class="jxr_linenumber" name="L3235" href="#L3235">3235</a> <em class="jxr_comment">// Petabyte multiplier (1024^5 = 1,125,899,906,842,624)</em>
+<a class="jxr_linenumber" name="L3236" href="#L3236">3236</a> <em class="jxr_comment">// Test small values that fit in long</em>
+<a class="jxr_linenumber" name="L3237" href="#L3237">3237</a> assertEquals(1125899906842624L, parseLongWithSuffix(<span class="jxr_string">"1P"</span>)); <em class="jxr_comment">// 1024^5</em>
+<a class="jxr_linenumber" name="L3238" href="#L3238">3238</a> assertEquals(2251799813685248L, parseLongWithSuffix(<span class="jxr_string">"2P"</span>)); <em class="jxr_comment">// 2 * 1024^5</em>
+<a class="jxr_linenumber" name="L3239" href="#L3239">3239</a> <em class="jxr_comment">// Test overflow - values that would exceed Long.MAX_VALUE</em>
+<a class="jxr_linenumber" name="L3240" href="#L3240">3240</a> <em class="jxr_comment">// Long.MAX_VALUE / (1024^5) = 8191, so "8192P" and above should overflow</em>
+<a class="jxr_linenumber" name="L3241" href="#L3241">3241</a> assertThrows(NumberFormatException.<strong class="jxr_keyword">class</strong>, () -> parseLongWithSuffix(<span class="jxr_string">"8192P"</span>));
+<a class="jxr_linenumber" name="L3242" href="#L3242">3242</a>
+<a class="jxr_linenumber" name="L3243" href="#L3243">3243</a> <em class="jxr_comment">// Decimal multipliers (1000-based)</em>
+<a class="jxr_linenumber" name="L3244" href="#L3244">3244</a> assertEquals(1000L, parseLongWithSuffix(<span class="jxr_string">"1k"</span>));
+<a class="jxr_linenumber" name="L3245" href="#L3245">3245</a> assertEquals(1000L * 1000, parseLongWithSuffix(<span class="jxr_string">"1m"</span>));
+<a class="jxr_linenumber" name="L3246" href="#L3246">3246</a> assertEquals(1000L * 1000 * 1000, parseLongWithSuffix(<span class="jxr_string">"1g"</span>));
+<a class="jxr_linenumber" name="L3247" href="#L3247">3247</a> assertEquals(1000L * 1000 * 1000 * 1000, parseLongWithSuffix(<span class="jxr_string">"1t"</span>));
+<a class="jxr_linenumber" name="L3248" href="#L3248">3248</a> <em class="jxr_comment">// Petabyte multiplier (1000^5 = 1,000,000,000,000,000)</em>
+<a class="jxr_linenumber" name="L3249" href="#L3249">3249</a> <em class="jxr_comment">// Test small values that fit in long</em>
+<a class="jxr_linenumber" name="L3250" href="#L3250">3250</a> assertEquals(1000000000000000L, parseLongWithSuffix(<span class="jxr_string">"1p"</span>)); <em class="jxr_comment">// 1000^5</em>
+<a class="jxr_linenumber" name="L3251" href="#L3251">3251</a> assertEquals(2000000000000000L, parseLongWithSuffix(<span class="jxr_string">"2p"</span>)); <em class="jxr_comment">// 2 * 1000^5</em>
+<a class="jxr_linenumber" name="L3252" href="#L3252">3252</a> <em class="jxr_comment">// Test overflow - values that would exceed Long.MAX_VALUE</em>
+<a class="jxr_linenumber" name="L3253" href="#L3253">3253</a> <em class="jxr_comment">// Long.MAX_VALUE / (1000^5) = 9223, so "9224p" and above should overflow</em>
+<a class="jxr_linenumber" name="L3254" href="#L3254">3254</a> assertThrows(NumberFormatException.<strong class="jxr_keyword">class</strong>, () -> parseLongWithSuffix(<span class="jxr_string">"9224p"</span>));
+<a class="jxr_linenumber" name="L3255" href="#L3255">3255</a>
+<a class="jxr_linenumber" name="L3256" href="#L3256">3256</a> <em class="jxr_comment">// No suffix</em>
+<a class="jxr_linenumber" name="L3257" href="#L3257">3257</a> assertEquals(123L, parseLongWithSuffix(<span class="jxr_string">"123"</span>));
+<a class="jxr_linenumber" name="L3258" href="#L3258">3258</a> assertEquals(456L, parseLongWithSuffix(<span class="jxr_string">"456"</span>));
+<a class="jxr_linenumber" name="L3259" href="#L3259">3259</a>
+<a class="jxr_linenumber" name="L3260" href="#L3260">3260</a> <em class="jxr_comment">// Should throw for null</em>
+<a class="jxr_linenumber" name="L3261" href="#L3261">3261</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> parseLongWithSuffix(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3262" href="#L3262">3262</a> }
<a class="jxr_linenumber" name="L3263" href="#L3263">3263</a>
-<a class="jxr_linenumber" name="L3264" href="#L3264">3264</a> <em class="jxr_comment">// With trimming</em>
-<a class="jxr_linenumber" name="L3265" href="#L3265">3265</a> <strong class="jxr_keyword">var</strong> map2 = parseMap(<span class="jxr_string">" key1 = value1 ; key2 = value2 "</span>, '=', ';', <strong class="jxr_keyword">true</strong>);
-<a class="jxr_linenumber" name="L3266" href="#L3266">3266</a> assertEquals(2, map2.size());
-<a class="jxr_linenumber" name="L3267" href="#L3267">3267</a> assertEquals(<span class="jxr_string">"value1"</span>, map2.get(<span class="jxr_string">"key1"</span>));
-<a class="jxr_linenumber" name="L3268" href="#L3268">3268</a> assertEquals(<span class="jxr_string">"value2"</span>, map2.get(<span class="jxr_string">"key2"</span>));
-<a class="jxr_linenumber" name="L3269" href="#L3269">3269</a>
-<a class="jxr_linenumber" name="L3270" href="#L3270">3270</a> <em class="jxr_comment">// Different delimiters</em>
-<a class="jxr_linenumber" name="L3271" href="#L3271">3271</a> <strong class="jxr_keyword">var</strong> map3 = parseMap(<span class="jxr_string">"a:1|b:2|c:3"</span>, ':', '|', false);
-<a class="jxr_linenumber" name="L3272" href="#L3272">3272</a> assertEquals(3, map3.size());
-<a class="jxr_linenumber" name="L3273" href="#L3273">3273</a> assertEquals(<span class="jxr_string">"1"</span>, map3.get(<span class="jxr_string">"a"</span>));
-<a class="jxr_linenumber" name="L3274" href="#L3274">3274</a> assertEquals(<span class="jxr_string">"2"</span>, map3.get(<span class="jxr_string">"b"</span>));
-<a class="jxr_linenumber" name="L3275" href="#L3275">3275</a> assertEquals(<span class="jxr_string">"3"</span>, map3.get(<span class="jxr_string">"c"</span>));
-<a class="jxr_linenumber" name="L3276" href="#L3276">3276</a>
-<a class="jxr_linenumber" name="L3277" href="#L3277">3277</a> <em class="jxr_comment">// Empty value</em>
-<a class="jxr_linenumber" name="L3278" href="#L3278">3278</a> <strong class="jxr_keyword">var</strong> map4 = parseMap(<span class="jxr_string">"key1=,key2=value2"</span>, '=', ',', false);
-<a class="jxr_linenumber" name="L3279" href="#L3279">3279</a> assertEquals(2, map4.size());
-<a class="jxr_linenumber" name="L3280" href="#L3280">3280</a> assertEquals(<span class="jxr_string">""</span>, map4.get(<span class="jxr_string">"key1"</span>));
-<a class="jxr_linenumber" name="L3281" href="#L3281">3281</a> assertEquals(<span class="jxr_string">"value2"</span>, map4.get(<span class="jxr_string">"key2"</span>));
-<a class="jxr_linenumber" name="L3282" href="#L3282">3282</a>
-<a class="jxr_linenumber" name="L3283" href="#L3283">3283</a> <em class="jxr_comment">// Null/empty input</em>
-<a class="jxr_linenumber" name="L3284" href="#L3284">3284</a> assertTrue(parseMap(<strong class="jxr_keyword">null</strong>, '=', ',', false).isEmpty());
-<a class="jxr_linenumber" name="L3285" href="#L3285">3285</a> assertTrue(parseMap(<span class="jxr_string">""</span>, '=', ',', false).isEmpty());
-<a class="jxr_linenumber" name="L3286" href="#L3286">3286</a> }
+<a class="jxr_linenumber" name="L3264" href="#L3264">3264</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3265" href="#L3265">3265</a> <em class="jxr_comment">// parseMap(String,char,char,boolean)</em>
+<a class="jxr_linenumber" name="L3266" href="#L3266">3266</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3267" href="#L3267">3267</a> @Test
+<a class="jxr_linenumber" name="L3268" href="#L3268">3268</a> <strong class="jxr_keyword">void</strong> a145_parseMap() {
+<a class="jxr_linenumber" name="L3269" href="#L3269">3269</a> <em class="jxr_comment">// Basic parsing</em>
+<a class="jxr_linenumber" name="L3270" href="#L3270">3270</a> <strong class="jxr_keyword">var</strong> map1 = parseMap(<span class="jxr_string">"key1=value1,key2=value2"</span>, '=', ',', false);
+<a class="jxr_linenumber" name="L3271" href="#L3271">3271</a> assertEquals(2, map1.size());
+<a class="jxr_linenumber" name="L3272" href="#L3272">3272</a> assertEquals(<span class="jxr_string">"value1"</span>, map1.get(<span class="jxr_string">"key1"</span>));
+<a class="jxr_linenumber" name="L3273" href="#L3273">3273</a> assertEquals(<span class="jxr_string">"value2"</span>, map1.get(<span class="jxr_string">"key2"</span>));
+<a class="jxr_linenumber" name="L3274" href="#L3274">3274</a>
+<a class="jxr_linenumber" name="L3275" href="#L3275">3275</a> <em class="jxr_comment">// With trimming</em>
+<a class="jxr_linenumber" name="L3276" href="#L3276">3276</a> <strong class="jxr_keyword">var</strong> map2 = parseMap(<span class="jxr_string">" key1 = value1 ; key2 = value2 "</span>, '=', ';', <strong class="jxr_keyword">true</strong>);
+<a class="jxr_linenumber" name="L3277" href="#L3277">3277</a> assertEquals(2, map2.size());
+<a class="jxr_linenumber" name="L3278" href="#L3278">3278</a> assertEquals(<span class="jxr_string">"value1"</span>, map2.get(<span class="jxr_string">"key1"</span>));
+<a class="jxr_linenumber" name="L3279" href="#L3279">3279</a> assertEquals(<span class="jxr_string">"value2"</span>, map2.get(<span class="jxr_string">"key2"</span>));
+<a class="jxr_linenumber" name="L3280" href="#L3280">3280</a>
+<a class="jxr_linenumber" name="L3281" href="#L3281">3281</a> <em class="jxr_comment">// Different delimiters</em>
+<a class="jxr_linenumber" name="L3282" href="#L3282">3282</a> <strong class="jxr_keyword">var</strong> map3 = parseMap(<span class="jxr_string">"a:1|b:2|c:3"</span>, ':', '|', false);
+<a class="jxr_linenumber" name="L3283" href="#L3283">3283</a> assertEquals(3, map3.size());
+<a class="jxr_linenumber" name="L3284" href="#L3284">3284</a> assertEquals(<span class="jxr_string">"1"</span>, map3.get(<span class="jxr_string">"a"</span>));
+<a class="jxr_linenumber" name="L3285" href="#L3285">3285</a> assertEquals(<span class="jxr_string">"2"</span>, map3.get(<span class="jxr_string">"b"</span>));
+<a class="jxr_linenumber" name="L3286" href="#L3286">3286</a> assertEquals(<span class="jxr_string">"3"</span>, map3.get(<span class="jxr_string">"c"</span>));
<a class="jxr_linenumber" name="L3287" href="#L3287">3287</a>
-<a class="jxr_linenumber" name="L3288" href="#L3288">3288</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3289" href="#L3289">3289</a> <em class="jxr_comment">// parseNumber(String,Class<? extends Number>)</em>
-<a class="jxr_linenumber" name="L3290" href="#L3290">3290</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3291" href="#L3291">3291</a> @Test
-<a class="jxr_linenumber" name="L3292" href="#L3292">3292</a> <strong class="jxr_keyword">void</strong> a146_parseNumber() {
-<a class="jxr_linenumber" name="L3293" href="#L3293">3293</a> <em class="jxr_comment">// Integers</em>
-<a class="jxr_linenumber" name="L3294" href="#L3294">3294</a> assertEquals(123, parseNumber(<span class="jxr_string">"123"</span>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3295" href="#L3295">3295</a> assertEquals(123, parseNumber(<span class="jxr_string">"123"</span>, Integer.<strong class="jxr_keyword">class</strong>));
-<a class="jxr_linenumber" name="L3296" href="#L3296">3296</a> assertEquals((<strong class="jxr_keyword">short</strong>)123, parseNumber(<span class="jxr_string">"123"</span>, Short.<strong class="jxr_keyword">class</strong>));
-<a class="jxr_linenumber" name="L3297" href="#L3297">3297</a> assertEquals((<strong class="jxr_keyword">long</strong>)123, parseNumber(<span class="jxr_string">"123"</span>, Long.<strong class="jxr_keyword">class</strong>));
+<a class="jxr_linenumber" name="L3288" href="#L3288">3288</a> <em class="jxr_comment">// Empty value</em>
+<a class="jxr_linenumber" name="L3289" href="#L3289">3289</a> <strong class="jxr_keyword">var</strong> map4 = parseMap(<span class="jxr_string">"key1=,key2=value2"</span>, '=', ',', false);
+<a class="jxr_linenumber" name="L3290" href="#L3290">3290</a> assertEquals(2, map4.size());
+<a class="jxr_linenumber" name="L3291" href="#L3291">3291</a> assertEquals(<span class="jxr_string">""</span>, map4.get(<span class="jxr_string">"key1"</span>));
+<a class="jxr_linenumber" name="L3292" href="#L3292">3292</a> assertEquals(<span class="jxr_string">"value2"</span>, map4.get(<span class="jxr_string">"key2"</span>));
+<a class="jxr_linenumber" name="L3293" href="#L3293">3293</a>
+<a class="jxr_linenumber" name="L3294" href="#L3294">3294</a> <em class="jxr_comment">// Null/empty input</em>
+<a class="jxr_linenumber" name="L3295" href="#L3295">3295</a> assertTrue(parseMap(<strong class="jxr_keyword">null</strong>, '=', ',', false).isEmpty());
+<a class="jxr_linenumber" name="L3296" href="#L3296">3296</a> assertTrue(parseMap(<span class="jxr_string">""</span>, '=', ',', false).isEmpty());
+<a class="jxr_linenumber" name="L3297" href="#L3297">3297</a> }
<a class="jxr_linenumber" name="L3298" href="#L3298">3298</a>
-<a class="jxr_linenumber" name="L3299" href="#L3299">3299</a> <em class="jxr_comment">// Hexadecimal</em>
-<a class="jxr_linenumber" name="L3300" href="#L3300">3300</a> assertEquals(0x123, parseNumber(<span class="jxr_string">"0x123"</span>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3301" href="#L3301">3301</a> assertEquals(-0x123, parseNumber(<span class="jxr_string">"-0x123"</span>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3302" href="#L3302">3302</a>
-<a class="jxr_linenumber" name="L3303" href="#L3303">3303</a> <em class="jxr_comment">// Decimal</em>
-<a class="jxr_linenumber" name="L3304" href="#L3304">3304</a> assertEquals(0.123f, parseNumber(<span class="jxr_string">"0.123"</span>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3305" href="#L3305">3305</a> assertEquals(-0.123f, parseNumber(<span class="jxr_string">"-0.123"</span>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3306" href="#L3306">3306</a>
-<a class="jxr_linenumber" name="L3307" href="#L3307">3307</a> <em class="jxr_comment">// With underscores</em>
-<a class="jxr_linenumber" name="L3308" href="#L3308">3308</a> assertEquals(1000000, parseNumber(<span class="jxr_string">"1_000_000"</span>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3299" href="#L3299">3299</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3300" href="#L3300">3300</a> <em class="jxr_comment">// parseNumber(String,Class<? extends Number>)</em>
+<a class="jxr_linenumber" name="L3301" href="#L3301">3301</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3302" href="#L3302">3302</a> @Test
+<a class="jxr_linenumber" name="L3303" href="#L3303">3303</a> <strong class="jxr_keyword">void</strong> a146_parseNumber() {
+<a class="jxr_linenumber" name="L3304" href="#L3304">3304</a> <em class="jxr_comment">// Integers</em>
+<a class="jxr_linenumber" name="L3305" href="#L3305">3305</a> assertEquals(123, parseNumber(<span class="jxr_string">"123"</span>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3306" href="#L3306">3306</a> assertEquals(123, parseNumber(<span class="jxr_string">"123"</span>, Integer.<strong class="jxr_keyword">class</strong>));
+<a class="jxr_linenumber" name="L3307" href="#L3307">3307</a> assertEquals((<strong class="jxr_keyword">short</strong>)123, parseNumber(<span class="jxr_string">"123"</span>, Short.<strong class="jxr_keyword">class</strong>));
+<a class="jxr_linenumber" name="L3308" href="#L3308">3308</a> assertEquals((<strong class="jxr_keyword">long</strong>)123, parseNumber(<span class="jxr_string">"123"</span>, Long.<strong class="jxr_keyword">class</strong>));
<a class="jxr_linenumber" name="L3309" href="#L3309">3309</a>
-<a class="jxr_linenumber" name="L3310" href="#L3310">3310</a> <em class="jxr_comment">// Null input</em>
-<a class="jxr_linenumber" name="L3311" href="#L3311">3311</a> assertNull(parseNumber(<strong class="jxr_keyword">null</strong>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3312" href="#L3312">3312</a> }
+<a class="jxr_linenumber" name="L3310" href="#L3310">3310</a> <em class="jxr_comment">// Hexadecimal</em>
+<a class="jxr_linenumber" name="L3311" href="#L3311">3311</a> assertEquals(0x123, parseNumber(<span class="jxr_string">"0x123"</span>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3312" href="#L3312">3312</a> assertEquals(-0x123, parseNumber(<span class="jxr_string">"-0x123"</span>, <strong class="jxr_keyword">null</strong>));
<a class="jxr_linenumber" name="L3313" href="#L3313">3313</a>
-<a class="jxr_linenumber" name="L3314" href="#L3314">3314</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3315" href="#L3315">3315</a> <em class="jxr_comment">// pascalCase(String)</em>
-<a class="jxr_linenumber" name="L3316" href="#L3316">3316</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3317" href="#L3317">3317</a> @Test
-<a class="jxr_linenumber" name="L3318" href="#L3318">3318</a> <strong class="jxr_keyword">void</strong> a147_pascalCase() {
-<a class="jxr_linenumber" name="L3319" href="#L3319">3319</a> assertNull(pascalCase(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3320" href="#L3320">3320</a> assertEquals(<span class="jxr_string">""</span>, pascalCase(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L3321" href="#L3321">3321</a> assertEquals(<span class="jxr_string">"HelloWorld"</span>, pascalCase(<span class="jxr_string">"hello world"</span>));
-<a class="jxr_linenumber" name="L3322" href="#L3322">3322</a> assertEquals(<span class="jxr_string">"HelloWorld"</span>, pascalCase(<span class="jxr_string">"helloWorld"</span>));
-<a class="jxr_linenumber" name="L3323" href="#L3323">3323</a> assertEquals(<span class="jxr_string">"HelloWorld"</span>, pascalCase(<span class="jxr_string">"HelloWorld"</span>));
-<a class="jxr_linenumber" name="L3324" href="#L3324">3324</a> assertEquals(<span class="jxr_string">"HelloWorld"</span>, pascalCase(<span class="jxr_string">"hello_world"</span>));
-<a class="jxr_linenumber" name="L3325" href="#L3325">3325</a> assertEquals(<span class="jxr_string">"HelloWorld"</span>, pascalCase(<span class="jxr_string">"hello-world"</span>));
-<a class="jxr_linenumber" name="L3326" href="#L3326">3326</a> assertEquals(<span class="jxr_string">"XmlHttpRequest"</span>, pascalCase(<span class="jxr_string">"XMLHttpRequest"</span>));
-<a class="jxr_linenumber" name="L3327" href="#L3327">3327</a> assertEquals(<span class="jxr_string">"HelloWorldTest"</span>, pascalCase(<span class="jxr_string">"Hello_World-Test"</span>));
-<a class="jxr_linenumber" name="L3328" href="#L3328">3328</a> assertEquals(<span class="jxr_string">"Test"</span>, pascalCase(<span class="jxr_string">"test"</span>));
-<a class="jxr_linenumber" name="L3329" href="#L3329">3329</a> assertEquals(<span class="jxr_string">"Test"</span>, pascalCase(<span class="jxr_string">"TEST"</span>));
-<a class="jxr_linenumber" name="L3330" href="#L3330">3330</a> assertEquals(<span class="jxr_string">"Hello123World"</span>, pascalCase(<span class="jxr_string">"hello 123 world"</span>));
-<a class="jxr_linenumber" name="L3331" href="#L3331">3331</a> }
-<a class="jxr_linenumber" name="L3332" href="#L3332">3332</a>
-<a class="jxr_linenumber" name="L3333" href="#L3333">3333</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3334" href="#L3334">3334</a> <em class="jxr_comment">// pluralize(String,int)</em>
-<a class="jxr_linenumber" name="L3335" href="#L3335">3335</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3336" href="#L3336">3336</a> @Test
-<a class="jxr_linenumber" name="L3337" href="#L3337">3337</a> <strong class="jxr_keyword">void</strong> a148_pluralize() {
-<a class="jxr_linenumber" name="L3338" href="#L3338">3338</a> <em class="jxr_comment">// Singular (count = 1)</em>
-<a class="jxr_linenumber" name="L3339" href="#L3339">3339</a> assertEquals(<span class="jxr_string">"cat"</span>, pluralize(<span class="jxr_string">"cat"</span>, 1));
-<a class="jxr_linenumber" name="L3340" href="#L3340">3340</a> assertEquals(<span class="jxr_string">"box"</span>, pluralize(<span class="jxr_string">"box"</span>, 1));
-<a class="jxr_linenumber" name="L3341" href="#L3341">3341</a> assertEquals(<span class="jxr_string">"city"</span>, pluralize(<span class="jxr_string">"city"</span>, 1));
-<a class="jxr_linenumber" name="L3342" href="#L3342">3342</a>
-<a class="jxr_linenumber" name="L3343" href="#L3343">3343</a> <em class="jxr_comment">// Regular plural (add "s")</em>
-<a class="jxr_linenumber" name="L3344" href="#L3344">3344</a> assertEquals(<span class="jxr_string">"cats"</span>, pluralize(<span class="jxr_string">"cat"</span>, 2));
-<a class="jxr_linenumber" name="L3345" href="#L3345">3345</a> assertEquals(<span class="jxr_string">"dogs"</span>, pluralize(<span class="jxr_string">"dog"</span>, 2));
-<a class="jxr_linenumber" name="L3346" href="#L3346">3346</a> assertEquals(<span class="jxr_string">"books"</span>, pluralize(<span class="jxr_string">"book"</span>, 0));
-<a class="jxr_linenumber" name="L3347" href="#L3347">3347</a>
-<a class="jxr_linenumber" name="L3348" href="#L3348">3348</a> <em class="jxr_comment">// Words ending in s, x, z, ch, sh (add "es")</em>
-<a class="jxr_linenumber" name="L3349" href="#L3349">3349</a> assertEquals(<span class="jxr_string">"boxes"</span>, pluralize(<span class="jxr_string">"box"</span>, 2));
-<a class="jxr_linenumber" name="L3350" href="#L3350">3350</a> assertEquals(<span class="jxr_string">"buses"</span>, pluralize(<span class="jxr_string">"bus"</span>, 2));
-<a class="jxr_linenumber" name="L3351" href="#L3351">3351</a> assertEquals(<span class="jxr_string">"buzzes"</span>, pluralize(<span class="jxr_string">"buzz"</span>, 2));
-<a class="jxr_linenumber" name="L3352" href="#L3352">3352</a> assertEquals(<span class="jxr_string">"churches"</span>, pluralize(<span class="jxr_string">"church"</span>, 2));
-<a class="jxr_linenumber" name="L3353" href="#L3353">3353</a> assertEquals(<span class="jxr_string">"dishes"</span>, pluralize(<span class="jxr_string">"dish"</span>, 2));
-<a class="jxr_linenumber" name="L3354" href="#L3354">3354</a>
-<a class="jxr_linenumber" name="L3355" href="#L3355">3355</a> <em class="jxr_comment">// Words ending in "y" preceded by consonant (replace "y" with "ies")</em>
-<a class="jxr_linenumber" name="L3356" href="#L3356">3356</a> assertEquals(<span class="jxr_string">"cities"</span>, pluralize(<span class="jxr_string">"city"</span>, 2));
-<a class="jxr_linenumber" name="L3357" href="#L3357">3357</a> assertEquals(<span class="jxr_string">"countries"</span>, pluralize(<span class="jxr_string">"country"</span>, 2));
-<a class="jxr_linenumber" name="L3358" href="#L3358">3358</a> assertEquals(<span class="jxr_string">"flies"</span>, pluralize(<span class="jxr_string">"fly"</span>, 2));
-<a class="jxr_linenumber" name="L3359" href="#L3359">3359</a> <em class="jxr_comment">// Words ending in "y" preceded by vowel (just add "s")</em>
-<a class="jxr_linenumber" name="L3360" href="#L3360">3360</a> assertEquals(<span class="jxr_string">"days"</span>, pluralize(<span class="jxr_string">"day"</span>, 2));
-<a class="jxr_linenumber" name="L3361" href="#L3361">3361</a> assertEquals(<span class="jxr_string">"boys"</span>, pluralize(<span class="jxr_string">"boy"</span>, 2));
-<a class="jxr_linenumber" name="L3362" href="#L3362">3362</a>
-<a class="jxr_linenumber" name="L3363" href="#L3363">3363</a> <em class="jxr_comment">// Words ending in "f" or "fe" (replace with "ves")</em>
-<a class="jxr_linenumber" name="L3364" href="#L3364">3364</a> assertEquals(<span class="jxr_string">"leaves"</span>, pluralize(<span class="jxr_string">"leaf"</span>, 2));
-<a class="jxr_linenumber" name="L3365" href="#L3365">3365</a> assertEquals(<span class="jxr_string">"lives"</span>, pluralize(<span class="jxr_string">"life"</span>, 2));
-<a class="jxr_linenumber" name="L3366" href="#L3366">3366</a> assertEquals(<span class="jxr_string">"knives"</span>, pluralize(<span class="jxr_string">"knife"</span>, 2));
-<a class="jxr_linenumber" name="L3367" href="#L3367">3367</a> }
-<a class="jxr_linenumber" name="L3368" href="#L3368">3368</a>
-<a class="jxr_linenumber" name="L3369" href="#L3369">3369</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3370" href="#L3370">3370</a> <em class="jxr_comment">// random(int)</em>
-<a class="jxr_linenumber" name="L3371" href="#L3371">3371</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3372" href="#L3372">3372</a> @Test
-<a class="jxr_linenumber" name="L3373" href="#L3373">3373</a> <strong class="jxr_keyword">void</strong> a149_random() {
-<a class="jxr_linenumber" name="L3374" href="#L3374">3374</a> <em class="jxr_comment">// Generate multiple random strings and verify format</em>
-<a class="jxr_linenumber" name="L3375" href="#L3375">3375</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < 10; i++) {
-<a class="jxr_linenumber" name="L3376" href="#L3376">3376</a> <strong class="jxr_keyword">var</strong> random = random(5);
-<a class="jxr_linenumber" name="L3377" href="#L3377">3377</a> assertNotNull(random);
-<a class="jxr_linenumber" name="L3378" href="#L3378">3378</a> assertEquals(5, random.length());
-<a class="jxr_linenumber" name="L3379" href="#L3379">3379</a> <em class="jxr_comment">// Should contain only lowercase letters and numbers</em>
-<a class="jxr_linenumber" name="L3380" href="#L3380">3380</a> assertTrue(random.matches(<span class="jxr_string">"[a-z0-9]+"</span>));
-<a class="jxr_linenumber" name="L3381" href="#L3381">3381</a> }
-<a class="jxr_linenumber" name="L3382" href="#L3382">3382</a>
-<a class="jxr_linenumber" name="L3383" href="#L3383">3383</a> <em class="jxr_comment">// Zero length</em>
-<a class="jxr_linenumber" name="L3384" href="#L3384">3384</a> assertEquals(<span class="jxr_string">""</span>, random(0));
-<a class="jxr_linenumber" name="L3385" href="#L3385">3385</a> }
-<a class="jxr_linenumber" name="L3386" href="#L3386">3386</a>
-<a class="jxr_linenumber" name="L3387" href="#L3387">3387</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3388" href="#L3388">3388</a> <em class="jxr_comment">// randomAlphabetic(int)</em>
-<a class="jxr_linenumber" name="L3389" href="#L3389">3389</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3390" href="#L3390">3390</a> @Test
-<a class="jxr_linenumber" name="L3391" href="#L3391">3391</a> <strong class="jxr_keyword">void</strong> a150_randomAlphabetic() {
-<a class="jxr_linenumber" name="L3392" href="#L3392">3392</a> <em class="jxr_comment">// Generate multiple random strings and verify format</em>
-<a class="jxr_linenumber" name="L3393" href="#L3393">3393</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < 10; i++) {
-<a class="jxr_linenumber" name="L3394" href="#L3394">3394</a> <strong class="jxr_keyword">var</strong> random = randomAlphabetic(8);
-<a class="jxr_linenumber" name="L3395" href="#L3395">3395</a> assertNotNull(random);
-<a class="jxr_linenumber" name="L3396" href="#L3396">3396</a> assertEquals(8, random.length());
-<a class="jxr_linenumber" name="L3397" href="#L3397">3397</a> <em class="jxr_comment">// Should contain only letters (upper and lower case)</em>
-<a class="jxr_linenumber" name="L3398" href="#L3398">3398</a> assertTrue(random.matches(<span class="jxr_string">"[a-zA-Z]+"</span>));
-<a class="jxr_linenumber" name="L3399" href="#L3399">3399</a> }
-<a class="jxr_linenumber" name="L3400" href="#L3400">3400</a>
-<a class="jxr_linenumber" name="L3401" href="#L3401">3401</a> <em class="jxr_comment">// Zero length</em>
-<a class="jxr_linenumber" name="L3402" href="#L3402">3402</a> assertEquals(<span class="jxr_string">""</span>, randomAlphabetic(0));
-<a class="jxr_linenumber" name="L3403" href="#L3403">3403</a>
-<a class="jxr_linenumber" name="L3404" href="#L3404">3404</a> <em class="jxr_comment">// Should throw for negative length</em>
-<a class="jxr_linenumber" name="L3405" href="#L3405">3405</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> randomAlphabetic(-1));
-<a class="jxr_linenumber" name="L3406" href="#L3406">3406</a> }
-<a class="jxr_linenumber" name="L3407" href="#L3407">3407</a>
-<a class="jxr_linenumber" name="L3408" href="#L3408">3408</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3409" href="#L3409">3409</a> <em class="jxr_comment">// randomAlphanumeric(int)</em>
-<a class="jxr_linenumber" name="L3410" href="#L3410">3410</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3411" href="#L3411">3411</a> @Test
-<a class="jxr_linenumber" name="L3412" href="#L3412">3412</a> <strong class="jxr_keyword">void</strong> a151_randomAlphanumeric() {
-<a class="jxr_linenumber" name="L3413" href="#L3413">3413</a> <em class="jxr_comment">// Generate multiple random strings and verify format</em>
-<a class="jxr_linenumber" name="L3414" href="#L3414">3414</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < 10; i++) {
-<a class="jxr_linenumber" name="L3415" href="#L3415">3415</a> <strong class="jxr_keyword">var</strong> random = randomAlphanumeric(8);
-<a class="jxr_linenumber" name="L3416" href="#L3416">3416</a> assertNotNull(random);
-<a class="jxr_linenumber" name="L3417" href="#L3417">3417</a> assertEquals(8, random.length());
-<a class="jxr_linenumber" name="L3418" href="#L3418">3418</a> <em class="jxr_comment">// Should contain only letters and digits</em>
-<a class="jxr_linenumber" name="L3419" href="#L3419">3419</a> assertTrue(random.matches(<span class="jxr_string">"[a-zA-Z0-9]+"</span>));
-<a class="jxr_linenumber" name="L3420" href="#L3420">3420</a> }
-<a class="jxr_linenumber" name="L3421" href="#L3421">3421</a>
-<a class="jxr_linenumber" name="L3422" href="#L3422">3422</a> <em class="jxr_comment">// Zero length</em>
-<a class="jxr_linenumber" name="L3423" href="#L3423">3423</a> assertEquals(<span class="jxr_string">""</span>, randomAlphanumeric(0));
-<a class="jxr_linenumber" name="L3424" href="#L3424">3424</a>
-<a class="jxr_linenumber" name="L3425" href="#L3425">3425</a> <em class="jxr_comment">// Should throw for negative length</em>
-<a class="jxr_linenumber" name="L3426" href="#L3426">3426</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> randomAlphanumeric(-1));
-<a class="jxr_linenumber" name="L3427" href="#L3427">3427</a> }
-<a class="jxr_linenumber" name="L3428" href="#L3428">3428</a>
-<a class="jxr_linenumber" name="L3429" href="#L3429">3429</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3430" href="#L3430">3430</a> <em class="jxr_comment">// randomAscii(int)</em>
-<a class="jxr_linenumber" name="L3431" href="#L3431">3431</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3432" href="#L3432">3432</a> @Test
-<a class="jxr_linenumber" name="L3433" href="#L3433">3433</a> <strong class="jxr_keyword">void</strong> a152_randomAscii() {
-<a class="jxr_linenumber" name="L3434" href="#L3434">3434</a> <em class="jxr_comment">// Generate multiple random strings and verify format</em>
-<a class="jxr_linenumber" name="L3435" href="#L3435">3435</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < 10; i++) {
-<a class="jxr_linenumber" name="L3436" href="#L3436">3436</a> <strong class="jxr_keyword">var</strong> random = randomAscii(8);
-<a class="jxr_linenumber" name="L3437" href="#L3437">3437</a> assertNotNull(random);
-<a class="jxr_linenumber" name="L3438" href="#L3438">3438</a> assertEquals(8, random.length());
-<a class="jxr_linenumber" name="L3439" href="#L3439">3439</a> <em class="jxr_comment">// Should contain only printable ASCII (32-126)</em>
-<a class="jxr_linenumber" name="L3440" href="#L3440">3440</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> j = 0; j < random.length(); j++) {
-<a class="jxr_linenumber" name="L3441" href="#L3441">3441</a> <strong class="jxr_keyword">var</strong> c = random.charAt(j);
-<a class="jxr_linenumber" name="L3442" href="#L3442">3442</a> assertTrue(c >= 32 && c <= 126, <span class="jxr_string">"Character should be printable ASCII: "</span> + c);
-<a class="jxr_linenumber" name="L3443" href="#L3443">3443</a> }
-<a class="jxr_linenumber" name="L3444" href="#L3444">3444</a> }
-<a class="jxr_linenumber" name="L3445" href="#L3445">3445</a>
-<a class="jxr_linenumber" name="L3446" href="#L3446">3446</a> <em class="jxr_comment">// Zero length</em>
-<a class="jxr_linenumber" name="L3447" href="#L3447">3447</a> assertEquals(<span class="jxr_string">""</span>, randomAscii(0));
-<a class="jxr_linenumber" name="L3448" href="#L3448">3448</a>
-<a class="jxr_linenumber" name="L3449" href="#L3449">3449</a> <em class="jxr_comment">// Should throw for negative length</em>
-<a class="jxr_linenumber" name="L3450" href="#L3450">3450</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> randomAscii(-1));
-<a class="jxr_linenumber" name="L3451" href="#L3451">3451</a> }
-<a class="jxr_linenumber" name="L3452" href="#L3452">3452</a>
-<a class="jxr_linenumber" name="L3453" href="#L3453">3453</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3454" href="#L3454">3454</a> <em class="jxr_comment">// randomNumeric(int)</em>
-<a class="jxr_linenumber" name="L3455" href="#L3455">3455</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3456" href="#L3456">3456</a> @Test
-<a class="jxr_linenumber" name="L3457" href="#L3457">3457</a> <strong class="jxr_keyword">void</strong> a153_randomNumeric() {
-<a class="jxr_linenumber" name="L3458" href="#L3458">3458</a> <em class="jxr_comment">// Generate multiple random strings and verify format</em>
-<a class="jxr_linenumber" name="L3459" href="#L3459">3459</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < 10; i++) {
-<a class="jxr_linenumber" name="L3460" href="#L3460">3460</a> <strong class="jxr_keyword">var</strong> random = randomNumeric(8);
-<a class="jxr_linenumber" name="L3461" href="#L3461">3461</a> assertNotNull(random);
-<a class="jxr_linenumber" name="L3462" href="#L3462">3462</a> assertEquals(8, random.length());
-<a class="jxr_linenumber" name="L3463" href="#L3463">3463</a> <em class="jxr_comment">// Should contain only digits</em>
-<a class="jxr_linenumber" name="L3464" href="#L3464">3464</a> assertTrue(random.matches(<span class="jxr_string">"[0-9]+"</span>));
-<a class="jxr_linenumber" name="L3465" href="#L3465">3465</a> }
-<a class="jxr_linenumber" name="L3466" href="#L3466">3466</a>
-<a class="jxr_linenumber" name="L3467" href="#L3467">3467</a> <em class="jxr_comment">// Zero length</em>
-<a class="jxr_linenumber" name="L3468" href="#L3468">3468</a> assertEquals(<span class="jxr_string">""</span>, randomNumeric(0));
-<a class="jxr_linenumber" name="L3469" href="#L3469">3469</a>
-<a class="jxr_linenumber" name="L3470" href="#L3470">3470</a> <em class="jxr_comment">// Should throw for negative length</em>
-<a class="jxr_linenumber" name="L3471" href="#L3471">3471</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> randomNumeric(-1));
-<a class="jxr_linenumber" name="L3472" href="#L3472">3472</a> }
-<a class="jxr_linenumber" name="L3473" href="#L3473">3473</a>
-<a class="jxr_linenumber" name="L3474" href="#L3474">3474</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3475" href="#L3475">3475</a> <em class="jxr_comment">// randomString(int,String)</em>
-<a class="jxr_linenumber" name="L3476" href="#L3476">3476</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3477" href="#L3477">3477</a> @Test
-<a class="jxr_linenumber" name="L3478" href="#L3478">3478</a> <strong class="jxr_keyword">void</strong> a154_randomString() {
-<a class="jxr_linenumber" name="L3479" href="#L3479">3479</a> <em class="jxr_comment">// Test with various character sets</em>
-<a class="jxr_linenumber" name="L3480" href="#L3480">3480</a> <strong class="jxr_keyword">var</strong> s1 = randomString(10, <span class="jxr_string">"ABC"</span>);
-<a class="jxr_linenumber" name="L3481" href="#L3481">3481</a> assertNotNull(s1);
-<a class="jxr_linenumber" name="L3482" href="#L3482">3482</a> assertEquals(10, s1.length());
-<a class="jxr_linenumber" name="L3483" href="#L3483">3483</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < s1.length(); i++) {
-<a class="jxr_linenumber" name="L3484" href="#L3484">3484</a> <strong class="jxr_keyword">var</strong> c = s1.charAt(i);
-<a class="jxr_linenumber" name="L3485" href="#L3485">3485</a> assertTrue(c == 'A' || c == 'B' || c == 'C', <span class="jxr_string">"Character should be A, B, or C: "</span> + c);
-<a class="jxr_linenumber" name="L3486" href="#L3486">3486</a> }
-<a class="jxr_linenumber" name="L3487" href="#L3487">3487</a>
-<a class="jxr_linenumber" name="L3488" href="#L3488">3488</a> <strong class="jxr_keyword">var</strong> s2 = randomString(5, <span class="jxr_string">"0123456789"</span>);
-<a class="jxr_linenumber" name="L3489" href="#L3489">3489</a> assertNotNull(s2);
-<a class="jxr_linenumber" name="L3490" href="#L3490">3490</a> assertEquals(5, s2.length());
-<a class="jxr_linenumber" name="L3491" href="#L3491">3491</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < s2.length(); i++) {
-<a class="jxr_linenumber" name="L3492" href="#L3492">3492</a> assertTrue(Character.isDigit(s2.charAt(i)));
-<a class="jxr_linenumber" name="L3493" href="#L3493">3493</a> }
-<a class="jxr_linenumber" name="L3494" href="#L3494">3494</a>
-<a class="jxr_linenumber" name="L3495" href="#L3495">3495</a> <em class="jxr_comment">// Zero length</em>
-<a class="jxr_linenumber" name="L3496" href="#L3496">3496</a> assertEquals(<span class="jxr_string">""</span>, randomString(0, <span class="jxr_string">"ABC"</span>));
-<a class="jxr_linenumber" name="L3497" href="#L3497">3497</a>
-<a class="jxr_linenumber" name="L3498" href="#L3498">3498</a> <em class="jxr_comment">// Should throw for negative length</em>
-<a class="jxr_linenumber" name="L3499" href="#L3499">3499</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> randomString(-1, <span class="jxr_string">"ABC"</span>));
-<a class="jxr_linenumber" name="L3500" href="#L3500">3500</a>
-<a class="jxr_linenumber" name="L3501" href="#L3501">3501</a> <em class="jxr_comment">// Should throw for null/empty character set</em>
-<a class="jxr_linenumber" name="L3502" href="#L3502">3502</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> randomString(5, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3503" href="#L3503">3503</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> randomString(5, <span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L3504" href="#L3504">3504</a> }
+<a class="jxr_linenumber" name="L3314" href="#L3314">3314</a> <em class="jxr_comment">// Decimal</em>
+<a class="jxr_linenumber" name="L3315" href="#L3315">3315</a> assertEquals(0.123f, parseNumber(<span class="jxr_string">"0.123"</span>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3316" href="#L3316">3316</a> assertEquals(-0.123f, parseNumber(<span class="jxr_string">"-0.123"</span>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3317" href="#L3317">3317</a>
+<a class="jxr_linenumber" name="L3318" href="#L3318">3318</a> <em class="jxr_comment">// With underscores</em>
+<a class="jxr_linenumber" name="L3319" href="#L3319">3319</a> assertEquals(1000000, parseNumber(<span class="jxr_string">"1_000_000"</span>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3320" href="#L3320">3320</a>
+<a class="jxr_linenumber" name="L3321" href="#L3321">3321</a> <em class="jxr_comment">// Null input</em>
+<a class="jxr_linenumber" name="L3322" href="#L3322">3322</a> assertNull(parseNumber(<strong class="jxr_keyword">null</strong>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3323" href="#L3323">3323</a> }
+<a class="jxr_linenumber" name="L3324" href="#L3324">3324</a>
+<a class="jxr_linenumber" name="L3325" href="#L3325">3325</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3326" href="#L3326">3326</a> <em class="jxr_comment">// pascalCase(String)</em>
+<a class="jxr_linenumber" name="L3327" href="#L3327">3327</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3328" href="#L3328">3328</a> @Test
+<a class="jxr_linenumber" name="L3329" href="#L3329">3329</a> <strong class="jxr_keyword">void</strong> a147_pascalCase() {
+<a class="jxr_linenumber" name="L3330" href="#L3330">3330</a> assertNull(pascalCase(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3331" href="#L3331">3331</a> assertEquals(<span class="jxr_string">""</span>, pascalCase(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L3332" href="#L3332">3332</a> assertEquals(<span class="jxr_string">"HelloWorld"</span>, pascalCase(<span class="jxr_string">"hello world"</span>));
+<a class="jxr_linenumber" name="L3333" href="#L3333">3333</a> assertEquals(<span class="jxr_string">"HelloWorld"</span>, pascalCase(<span class="jxr_string">"helloWorld"</span>));
+<a class="jxr_linenumber" name="L3334" href="#L3334">3334</a> assertEquals(<span class="jxr_string">"HelloWorld"</span>, pascalCase(<span class="jxr_string">"HelloWorld"</span>));
+<a class="jxr_linenumber" name="L3335" href="#L3335">3335</a> assertEquals(<span class="jxr_string">"HelloWorld"</span>, pascalCase(<span class="jxr_string">"hello_world"</span>));
+<a class="jxr_linenumber" name="L3336" href="#L3336">3336</a> assertEquals(<span class="jxr_string">"HelloWorld"</span>, pascalCase(<span class="jxr_string">"hello-world"</span>));
+<a class="jxr_linenumber" name="L3337" href="#L3337">3337</a> assertEquals(<span class="jxr_string">"XmlHttpRequest"</span>, pascalCase(<span class="jxr_string">"XMLHttpRequest"</span>));
+<a class="jxr_linenumber" name="L3338" href="#L3338">3338</a> assertEquals(<span class="jxr_string">"HelloWorldTest"</span>, pascalCase(<span class="jxr_string">"Hello_World-Test"</span>));
+<a class="jxr_linenumber" name="L3339" href="#L3339">3339</a> assertEquals(<span class="jxr_string">"Test"</span>, pascalCase(<span class="jxr_string">"test"</span>));
+<a class="jxr_linenumber" name="L3340" href="#L3340">3340</a> assertEquals(<span class="jxr_string">"Test"</span>, pascalCase(<span class="jxr_string">"TEST"</span>));
+<a class="jxr_linenumber" name="L3341" href="#L3341">3341</a> assertEquals(<span class="jxr_string">"Hello123World"</span>, pascalCase(<span class="jxr_string">"hello 123 world"</span>));
+<a class="jxr_linenumber" name="L3342" href="#L3342">3342</a> }
+<a class="jxr_linenumber" name="L3343" href="#L3343">3343</a>
+<a class="jxr_linenumber" name="L3344" href="#L3344">3344</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3345" href="#L3345">3345</a> <em class="jxr_comment">// pluralize(String,int)</em>
+<a class="jxr_linenumber" name="L3346" href="#L3346">3346</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3347" href="#L3347">3347</a> @Test
+<a class="jxr_linenumber" name="L3348" href="#L3348">3348</a> <strong class="jxr_keyword">void</strong> a148_pluralize() {
+<a class="jxr_linenumber" name="L3349" href="#L3349">3349</a> <em class="jxr_comment">// Singular (count = 1)</em>
+<a class="jxr_linenumber" name="L3350" href="#L3350">3350</a> assertEquals(<span class="jxr_string">"cat"</span>, pluralize(<span class="jxr_string">"cat"</span>, 1));
+<a class="jxr_linenumber" name="L3351" href="#L3351">3351</a> assertEquals(<span class="jxr_string">"box"</span>, pluralize(<span class="jxr_string">"box"</span>, 1));
+<a class="jxr_linenumber" name="L3352" href="#L3352">3352</a> assertEquals(<span class="jxr_string">"city"</span>, pluralize(<span class="jxr_string">"city"</span>, 1));
+<a class="jxr_linenumber" name="L3353" href="#L3353">3353</a>
+<a class="jxr_linenumber" name="L3354" href="#L3354">3354</a> <em class="jxr_comment">// Regular plural (add "s")</em>
+<a class="jxr_linenumber" name="L3355" href="#L3355">3355</a> assertEquals(<span class="jxr_string">"cats"</span>, pluralize(<span class="jxr_string">"cat"</span>, 2));
+<a class="jxr_linenumber" name="L3356" href="#L3356">3356</a> assertEquals(<span class="jxr_string">"dogs"</span>, pluralize(<span class="jxr_string">"dog"</span>, 2));
+<a class="jxr_linenumber" name="L3357" href="#L3357">3357</a> assertEquals(<span class="jxr_string">"books"</span>, pluralize(<span class="jxr_string">"book"</span>, 0));
+<a class="jxr_linenumber" name="L3358" href="#L3358">3358</a>
+<a class="jxr_linenumber" name="L3359" href="#L3359">3359</a> <em class="jxr_comment">// Words ending in s, x, z, ch, sh (add "es")</em>
+<a class="jxr_linenumber" name="L3360" href="#L3360">3360</a> assertEquals(<span class="jxr_string">"boxes"</span>, pluralize(<span class="jxr_string">"box"</span>, 2));
+<a class="jxr_linenumber" name="L3361" href="#L3361">3361</a> assertEquals(<span class="jxr_string">"buses"</span>, pluralize(<span class="jxr_string">"bus"</span>, 2));
+<a class="jxr_linenumber" name="L3362" href="#L3362">3362</a> assertEquals(<span class="jxr_string">"buzzes"</span>, pluralize(<span class="jxr_string">"buzz"</span>, 2));
+<a class="jxr_linenumber" name="L3363" href="#L3363">3363</a> assertEquals(<span class="jxr_string">"churches"</span>, pluralize(<span class="jxr_string">"church"</span>, 2));
+<a class="jxr_linenumber" name="L3364" href="#L3364">3364</a> assertEquals(<span class="jxr_string">"dishes"</span>, pluralize(<span class="jxr_string">"dish"</span>, 2));
+<a class="jxr_linenumber" name="L3365" href="#L3365">3365</a>
+<a class="jxr_linenumber" name="L3366" href="#L3366">3366</a> <em class="jxr_comment">// Words ending in "y" preceded by consonant (replace "y" with "ies")</em>
+<a class="jxr_linenumber" name="L3367" href="#L3367">3367</a> assertEquals(<span class="jxr_string">"cities"</span>, pluralize(<span class="jxr_string">"city"</span>, 2));
+<a class="jxr_linenumber" name="L3368" href="#L3368">3368</a> assertEquals(<span class="jxr_string">"countries"</span>, pluralize(<span class="jxr_string">"country"</span>, 2));
+<a class="jxr_linenumber" name="L3369" href="#L3369">3369</a> assertEquals(<span class="jxr_string">"flies"</span>, pluralize(<span class="jxr_string">"fly"</span>, 2));
+<a class="jxr_linenumber" name="L3370" href="#L3370">3370</a> <em class="jxr_comment">// Words ending in "y" preceded by vowel (just add "s")</em>
+<a class="jxr_linenumber" name="L3371" href="#L3371">3371</a> assertEquals(<span class="jxr_string">"days"</span>, pluralize(<span class="jxr_string">"day"</span>, 2));
+<a class="jxr_linenumber" name="L3372" href="#L3372">3372</a> assertEquals(<span class="jxr_string">"boys"</span>, pluralize(<span class="jxr_string">"boy"</span>, 2));
+<a class="jxr_linenumber" name="L3373" href="#L3373">3373</a>
+<a class="jxr_linenumber" name="L3374" href="#L3374">3374</a> <em class="jxr_comment">// Words ending in "f" or "fe" (replace with "ves")</em>
+<a class="jxr_linenumber" name="L3375" href="#L3375">3375</a> assertEquals(<span class="jxr_string">"leaves"</span>, pluralize(<span class="jxr_string">"leaf"</span>, 2));
+<a class="jxr_linenumber" name="L3376" href="#L3376">3376</a> assertEquals(<span class="jxr_string">"lives"</span>, pluralize(<span class="jxr_string">"life"</span>, 2));
+<a class="jxr_linenumber" name="L3377" href="#L3377">3377</a> assertEquals(<span class="jxr_string">"knives"</span>, pluralize(<span class="jxr_string">"knife"</span>, 2));
+<a class="jxr_linenumber" name="L3378" href="#L3378">3378</a> }
+<a class="jxr_linenumber" name="L3379" href="#L3379">3379</a>
+<a class="jxr_linenumber" name="L3380" href="#L3380">3380</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3381" href="#L3381">3381</a> <em class="jxr_comment">// random(int)</em>
+<a class="jxr_linenumber" name="L3382" href="#L3382">3382</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3383" href="#L3383">3383</a> @Test
+<a class="jxr_linenumber" name="L3384" href="#L3384">3384</a> <strong class="jxr_keyword">void</strong> a149_random() {
+<a class="jxr_linenumber" name="L3385" href="#L3385">3385</a> <em class="jxr_comment">// Generate multiple random strings and verify format</em>
+<a class="jxr_linenumber" name="L3386" href="#L3386">3386</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < 10; i++) {
+<a class="jxr_linenumber" name="L3387" href="#L3387">3387</a> <strong class="jxr_keyword">var</strong> random = random(5);
+<a class="jxr_linenumber" name="L3388" href="#L3388">3388</a> assertNotNull(random);
+<a class="jxr_linenumber" name="L3389" href="#L3389">3389</a> assertEquals(5, random.length());
+<a class="jxr_linenumber" name="L3390" href="#L3390">3390</a> <em class="jxr_comment">// Should contain only lowercase letters and numbers</em>
+<a class="jxr_linenumber" name="L3391" href="#L3391">3391</a> assertTrue(random.matches(<span class="jxr_string">"[a-z0-9]+"</span>));
+<a class="jxr_linenumber" name="L3392" href="#L3392">3392</a> }
+<a class="jxr_linenumber" name="L3393" href="#L3393">3393</a>
+<a class="jxr_linenumber" name="L3394" href="#L3394">3394</a> <em class="jxr_comment">// Zero length</em>
+<a class="jxr_linenumber" name="L3395" href="#L3395">3395</a> assertEquals(<span class="jxr_string">""</span>, random(0));
+<a class="jxr_linenumber" name="L3396" href="#L3396">3396</a> }
+<a class="jxr_linenumber" name="L3397" href="#L3397">3397</a>
+<a class="jxr_linenumber" name="L3398" href="#L3398">3398</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3399" href="#L3399">3399</a> <em class="jxr_comment">// randomAlphabetic(int)</em>
+<a class="jxr_linenumber" name="L3400" href="#L3400">3400</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3401" href="#L3401">3401</a> @Test
+<a class="jxr_linenumber" name="L3402" href="#L3402">3402</a> <strong class="jxr_keyword">void</strong> a150_randomAlphabetic() {
+<a class="jxr_linenumber" name="L3403" href="#L3403">3403</a> <em class="jxr_comment">// Generate multiple random strings and verify format</em>
+<a class="jxr_linenumber" name="L3404" href="#L3404">3404</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < 10; i++) {
+<a class="jxr_linenumber" name="L3405" href="#L3405">3405</a> <strong class="jxr_keyword">var</strong> random = randomAlphabetic(8);
+<a class="jxr_linenumber" name="L3406" href="#L3406">3406</a> assertNotNull(random);
+<a class="jxr_linenumber" name="L3407" href="#L3407">3407</a> assertEquals(8, random.length());
+<a class="jxr_linenumber" name="L3408" href="#L3408">3408</a> <em class="jxr_comment">// Should contain only letters (upper and lower case)</em>
+<a class="jxr_linenumber" name="L3409" href="#L3409">3409</a> assertTrue(random.matches(<span class="jxr_string">"[a-zA-Z]+"</span>));
+<a class="jxr_linenumber" name="L3410" href="#L3410">3410</a> }
+<a class="jxr_linenumber" name="L3411" href="#L3411">3411</a>
+<a class="jxr_linenumber" name="L3412" href="#L3412">3412</a> <em class="jxr_comment">// Zero length</em>
+<a class="jxr_linenumber" name="L3413" href="#L3413">3413</a> assertEquals(<span class="jxr_string">""</span>, randomAlphabetic(0));
+<a class="jxr_linenumber" name="L3414" href="#L3414">3414</a>
+<a class="jxr_linenumber" name="L3415" href="#L3415">3415</a> <em class="jxr_comment">// Should throw for negative length</em>
+<a class="jxr_linenumber" name="L3416" href="#L3416">3416</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> randomAlphabetic(-1));
+<a class="jxr_linenumber" name="L3417" href="#L3417">3417</a> }
+<a class="jxr_linenumber" name="L3418" href="#L3418">3418</a>
+<a class="jxr_linenumber" name="L3419" href="#L3419">3419</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3420" href="#L3420">3420</a> <em class="jxr_comment">// randomAlphanumeric(int)</em>
+<a class="jxr_linenumber" name="L3421" href="#L3421">3421</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3422" href="#L3422">3422</a> @Test
+<a class="jxr_linenumber" name="L3423" href="#L3423">3423</a> <strong class="jxr_keyword">void</strong> a151_randomAlphanumeric() {
+<a class="jxr_linenumber" name="L3424" href="#L3424">3424</a> <em class="jxr_comment">// Generate multiple random strings and verify format</em>
+<a class="jxr_linenumber" name="L3425" href="#L3425">3425</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < 10; i++) {
+<a class="jxr_linenumber" name="L3426" href="#L3426">3426</a> <strong class="jxr_keyword">var</strong> random = randomAlphanumeric(8);
+<a class="jxr_linenumber" name="L3427" href="#L3427">3427</a> assertNotNull(random);
+<a class="jxr_linenumber" name="L3428" href="#L3428">3428</a> assertEquals(8, random.length());
+<a class="jxr_linenumber" name="L3429" href="#L3429">3429</a> <em class="jxr_comment">// Should contain only letters and digits</em>
+<a class="jxr_linenumber" name="L3430" href="#L3430">3430</a> assertTrue(random.matches(<span class="jxr_string">"[a-zA-Z0-9]+"</span>));
+<a class="jxr_linenumber" name="L3431" href="#L3431">3431</a> }
+<a class="jxr_linenumber" name="L3432" href="#L3432">3432</a>
+<a class="jxr_linenumber" name="L3433" href="#L3433">3433</a> <em class="jxr_comment">// Zero length</em>
+<a class="jxr_linenumber" name="L3434" href="#L3434">3434</a> assertEquals(<span class="jxr_string">""</span>, randomAlphanumeric(0));
+<a class="jxr_linenumber" name="L3435" href="#L3435">3435</a>
+<a class="jxr_linenumber" name="L3436" href="#L3436">3436</a> <em class="jxr_comment">// Should throw for negative length</em>
+<a class="jxr_linenumber" name="L3437" href="#L3437">3437</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> randomAlphanumeric(-1));
+<a class="jxr_linenumber" name="L3438" href="#L3438">3438</a> }
+<a class="jxr_linenumber" name="L3439" href="#L3439">3439</a>
+<a class="jxr_linenumber" name="L3440" href="#L3440">3440</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3441" href="#L3441">3441</a> <em class="jxr_comment">// randomAscii(int)</em>
+<a class="jxr_linenumber" name="L3442" href="#L3442">3442</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3443" href="#L3443">3443</a> @Test
+<a class="jxr_linenumber" name="L3444" href="#L3444">3444</a> <strong class="jxr_keyword">void</strong> a152_randomAscii() {
+<a class="jxr_linenumber" name="L3445" href="#L3445">3445</a> <em class="jxr_comment">// Generate multiple random strings and verify format</em>
+<a class="jxr_linenumber" name="L3446" href="#L3446">3446</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < 10; i++) {
+<a class="jxr_linenumber" name="L3447" href="#L3447">3447</a> <strong class="jxr_keyword">var</strong> random = randomAscii(8);
+<a class="jxr_linenumber" name="L3448" href="#L3448">3448</a> assertNotNull(random);
+<a class="jxr_linenumber" name="L3449" href="#L3449">3449</a> assertEquals(8, random.length());
+<a class="jxr_linenumber" name="L3450" href="#L3450">3450</a> <em class="jxr_comment">// Should contain only printable ASCII (32-126)</em>
+<a class="jxr_linenumber" name="L3451" href="#L3451">3451</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> j = 0; j < random.length(); j++) {
+<a class="jxr_linenumber" name="L3452" href="#L3452">3452</a> <strong class="jxr_keyword">var</strong> c = random.charAt(j);
+<a class="jxr_linenumber" name="L3453" href="#L3453">3453</a> assertTrue(c >= 32 && c <= 126, <span class="jxr_string">"Character should be printable ASCII: "</span> + c);
+<a class="jxr_linenumber" name="L3454" href="#L3454">3454</a> }
+<a class="jxr_linenumber" name="L3455" href="#L3455">3455</a> }
+<a class="jxr_linenumber" name="L3456" href="#L3456">3456</a>
+<a class="jxr_linenumber" name="L3457" href="#L3457">3457</a> <em class="jxr_comment">// Zero length</em>
+<a class="jxr_linenumber" name="L3458" href="#L3458">3458</a> assertEquals(<span class="jxr_string">""</span>, randomAscii(0));
+<a class="jxr_linenumber" name="L3459" href="#L3459">3459</a>
+<a class="jxr_linenumber" name="L3460" href="#L3460">3460</a> <em class="jxr_comment">// Should throw for negative length</em>
+<a class="jxr_linenumber" name="L3461" href="#L3461">3461</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> randomAscii(-1));
+<a class="jxr_linenumber" name="L3462" href="#L3462">3462</a> }
+<a class="jxr_linenumber" name="L3463" href="#L3463">3463</a>
+<a class="jxr_linenumber" name="L3464" href="#L3464">3464</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3465" href="#L3465">3465</a> <em class="jxr_comment">// randomNumeric(int)</em>
+<a class="jxr_linenumber" name="L3466" href="#L3466">3466</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3467" href="#L3467">3467</a> @Test
+<a class="jxr_linenumber" name="L3468" href="#L3468">3468</a> <strong class="jxr_keyword">void</strong> a153_randomNumeric() {
+<a class="jxr_linenumber" name="L3469" href="#L3469">3469</a> <em class="jxr_comment">// Generate multiple random strings and verify format</em>
+<a class="jxr_linenumber" name="L3470" href="#L3470">3470</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < 10; i++) {
+<a class="jxr_linenumber" name="L3471" href="#L3471">3471</a> <strong class="jxr_keyword">var</strong> random = randomNumeric(8);
+<a class="jxr_linenumber" name="L3472" href="#L3472">3472</a> assertNotNull(random);
+<a class="jxr_linenumber" name="L3473" href="#L3473">3473</a> assertEquals(8, random.length());
+<a class="jxr_linenumber" name="L3474" href="#L3474">3474</a> <em class="jxr_comment">// Should contain only digits</em>
+<a class="jxr_linenumber" name="L3475" href="#L3475">3475</a> assertTrue(random.matches(<span class="jxr_string">"[0-9]+"</span>));
+<a class="jxr_linenumber" name="L3476" href="#L3476">3476</a> }
+<a class="jxr_linenumber" name="L3477" href="#L3477">3477</a>
+<a class="jxr_linenumber" name="L3478" href="#L3478">3478</a> <em class="jxr_comment">// Zero length</em>
+<a class="jxr_linenumber" name="L3479" href="#L3479">3479</a> assertEquals(<span class="jxr_string">""</span>, randomNumeric(0));
+<a class="jxr_linenumber" name="L3480" href="#L3480">3480</a>
+<a class="jxr_linenumber" name="L3481" href="#L3481">3481</a> <em class="jxr_comment">// Should throw for negative length</em>
+<a class="jxr_linenumber" name="L3482" href="#L3482">3482</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> randomNumeric(-1));
+<a class="jxr_linenumber" name="L3483" href="#L3483">3483</a> }
+<a class="jxr_linenumber" name="L3484" href="#L3484">3484</a>
+<a class="jxr_linenumber" name="L3485" href="#L3485">3485</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3486" href="#L3486">3486</a> <em class="jxr_comment">// randomString(int,String)</em>
+<a class="jxr_linenumber" name="L3487" href="#L3487">3487</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3488" href="#L3488">3488</a> @Test
+<a class="jxr_linenumber" name="L3489" href="#L3489">3489</a> <strong class="jxr_keyword">void</strong> a154_randomString() {
+<a class="jxr_linenumber" name="L3490" href="#L3490">3490</a> <em class="jxr_comment">// Test with various character sets</em>
+<a class="jxr_linenumber" name="L3491" href="#L3491">3491</a> <strong class="jxr_keyword">var</strong> s1 = randomString(10, <span class="jxr_string">"ABC"</span>);
+<a class="jxr_linenumber" name="L3492" href="#L3492">3492</a> assertNotNull(s1);
+<a class="jxr_linenumber" name="L3493" href="#L3493">3493</a> assertEquals(10, s1.length());
+<a class="jxr_linenumber" name="L3494" href="#L3494">3494</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < s1.length(); i++) {
+<a class="jxr_linenumber" name="L3495" href="#L3495">3495</a> <strong class="jxr_keyword">var</strong> c = s1.charAt(i);
+<a class="jxr_linenumber" name="L3496" href="#L3496">3496</a> assertTrue(c == 'A' || c == 'B' || c == 'C', <span class="jxr_string">"Character should be A, B, or C: "</span> + c);
+<a class="jxr_linenumber" name="L3497" href="#L3497">3497</a> }
+<a class="jxr_linenumber" name="L3498" href="#L3498">3498</a>
+<a class="jxr_linenumber" name="L3499" href="#L3499">3499</a> <strong class="jxr_keyword">var</strong> s2 = randomString(5, <span class="jxr_string">"0123456789"</span>);
+<a class="jxr_linenumber" name="L3500" href="#L3500">3500</a> assertNotNull(s2);
+<a class="jxr_linenumber" name="L3501" href="#L3501">3501</a> assertEquals(5, s2.length());
+<a class="jxr_linenumber" name="L3502" href="#L3502">3502</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < s2.length(); i++) {
+<a class="jxr_linenumber" name="L3503" href="#L3503">3503</a> assertTrue(Character.isDigit(s2.charAt(i)));
+<a class="jxr_linenumber" name="L3504" href="#L3504">3504</a> }
<a class="jxr_linenumber" name="L3505" href="#L3505">3505</a>
-<a class="jxr_linenumber" name="L3506" href="#L3506">3506</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3507" href="#L3507">3507</a> <em class="jxr_comment">// readabilityScore(String)</em>
-<a class="jxr_linenumber" name="L3508" href="#L3508">3508</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3509" href="#L3509">3509</a> @Test
-<a class="jxr_linenumber" name="L3510" href="#L3510">3510</a> <strong class="jxr_keyword">void</strong> a155_readabilityScore() {
-<a class="jxr_linenumber" name="L3511" href="#L3511">3511</a> <em class="jxr_comment">// Simple text should have higher score</em>
-<a class="jxr_linenumber" name="L3512" href="#L3512">3512</a> <strong class="jxr_keyword">var</strong> simple = readabilityScore(<span class="jxr_string">"The cat sat."</span>);
-<a class="jxr_linenumber" name="L3513" href="#L3513">3513</a> assertTrue(simple > 0);
-<a class="jxr_linenumber" name="L3514" href="#L3514">3514</a>
-<a class="jxr_linenumber" name="L3515" href="#L3515">3515</a> <em class="jxr_comment">// Complex text should have lower score</em>
-<a class="jxr_linenumber" name="L3516" href="#L3516">3516</a> <strong class="jxr_keyword">var</strong> complex = readabilityScore(<span class="jxr_string">"The sophisticated implementation demonstrates exceptional complexity."</span>);
-<a class="jxr_linenumber" name="L3517" href="#L3517">3517</a> assertTrue(complex >= 0);
-<a class="jxr_linenumber" name="L3518" href="#L3518">3518</a> assertTrue(complex <= 100);
-<a class="jxr_linenumber" name="L3519" href="#L3519">3519</a>
-<a class="jxr_linenumber" name="L3520" href="#L3520">3520</a> <em class="jxr_comment">// Null/empty input</em>
-<a class="jxr_linenumber" name="L3521" href="#L3521">3521</a> assertEquals(0.0, readabilityScore(<strong class="jxr_keyword">null</strong>), 0.0001);
-<a class="jxr_linenumber" name="L3522" href="#L3522">3522</a> assertEquals(0.0, readabilityScore(<span class="jxr_string">""</span>), 0.0001);
-<a class="jxr_linenumber" name="L3523" href="#L3523">3523</a>
-<a class="jxr_linenumber" name="L3524" href="#L3524">3524</a> <em class="jxr_comment">// Score should be in 0-100 range</em>
-<a class="jxr_linenumber" name="L3525" href="#L3525">3525</a> <strong class="jxr_keyword">var</strong> score = readabilityScore(<span class="jxr_string">"This is a test sentence."</span>);
-<a class="jxr_linenumber" name="L3526" href="#L3526">3526</a> assertTrue(score >= 0.0 && score <= 100.0);
-<a class="jxr_linenumber" name="L3527" href="#L3527">3527</a> }
-<a class="jxr_linenumber" name="L3528" href="#L3528">3528</a>
-<a class="jxr_linenumber" name="L3529" href="#L3529">3529</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3530" href="#L3530">3530</a> <em class="jxr_comment">// readable(Object)</em>
-<a class="jxr_linenumber" name="L3531" href="#L3531">3531</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3532" href="#L3532">3532</a> @Test
-<a class="jxr_linenumber" name="L3533" href="#L3533">3533</a> <strong class="jxr_keyword">void</strong> a156_readable() {
-<a class="jxr_linenumber" name="L3534" href="#L3534">3534</a> assertNull(readable(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3535" href="#L3535">3535</a> assertEquals(<span class="jxr_string">"[a,b,c]"</span>, readable(l(<span class="jxr_string">"a"</span>, <span class="jxr_string">"b"</span>, <span class="jxr_string">"c"</span>)));
-<a class="jxr_linenumber" name="L3536" href="#L3536">3536</a> assertEquals(<span class="jxr_string">"{foo=bar}"</span>, readable(m(<span class="jxr_string">"foo"</span>, <span class="jxr_string">"bar"</span>)));
-<a class="jxr_linenumber" name="L3537" href="#L3537">3537</a> assertEquals(<span class="jxr_string">"[1,2,3]"</span>, readable(ints(1, 2, 3)));
-<a class="jxr_linenumber" name="L3538" href="#L3538">3538</a> assertEquals(<span class="jxr_string">"test"</span>, readable(opt(<span class="jxr_string">"test"</span>)));
-<a class="jxr_linenumber" name="L3539" href="#L3539">3539</a> assertNull(readable(opte()));
-<a class="jxr_linenumber" name="L3540" href="#L3540">3540</a> }
-<a class="jxr_linenumber" name="L3541" href="#L3541">3541</a>
+<a class="jxr_linenumber" name="L3506" href="#L3506">3506</a> <em class="jxr_comment">// Zero length</em>
+<a class="jxr_linenumber" name="L3507" href="#L3507">3507</a> assertEquals(<span class="jxr_string">""</span>, randomString(0, <span class="jxr_string">"ABC"</span>));
+<a class="jxr_linenumber" name="L3508" href="#L3508">3508</a>
+<a class="jxr_linenumber" name="L3509" href="#L3509">3509</a> <em class="jxr_comment">// Should throw for negative length</em>
+<a class="jxr_linenumber" name="L3510" href="#L3510">3510</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> randomString(-1, <span class="jxr_string">"ABC"</span>));
+<a class="jxr_linenumber" name="L3511" href="#L3511">3511</a>
+<a class="jxr_linenumber" name="L3512" href="#L3512">3512</a> <em class="jxr_comment">// Should throw for null/empty character set</em>
+<a class="jxr_linenumber" name="L3513" href="#L3513">3513</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> randomString(5, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3514" href="#L3514">3514</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> randomString(5, <span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L3515" href="#L3515">3515</a> }
+<a class="jxr_linenumber" name="L3516" href="#L3516">3516</a>
+<a class="jxr_linenumber" name="L3517" href="#L3517">3517</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3518" href="#L3518">3518</a> <em class="jxr_comment">// readabilityScore(String)</em>
+<a class="jxr_linenumber" name="L3519" href="#L3519">3519</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3520" href="#L3520">3520</a> @Test
+<a class="jxr_linenumber" name="L3521" href="#L3521">3521</a> <strong class="jxr_keyword">void</strong> a155_readabilityScore() {
+<a class="jxr_linenumber" name="L3522" href="#L3522">3522</a> <em class="jxr_comment">// Simple text should have higher score</em>
+<a class="jxr_linenumber" name="L3523" href="#L3523">3523</a> <strong class="jxr_keyword">var</strong> simple = readabilityScore(<span class="jxr_string">"The cat sat."</span>);
+<a class="jxr_linenumber" name="L3524" href="#L3524">3524</a> assertTrue(simple > 0);
+<a class="jxr_linenumber" name="L3525" href="#L3525">3525</a>
+<a class="jxr_linenumber" name="L3526" href="#L3526">3526</a> <em class="jxr_comment">// Complex text should have lower score</em>
+<a class="jxr_linenumber" name="L3527" href="#L3527">3527</a> <strong class="jxr_keyword">var</strong> complex = readabilityScore(<span class="jxr_string">"The sophisticated implementation demonstrates exceptional complexity."</span>);
+<a class="jxr_linenumber" name="L3528" href="#L3528">3528</a> assertTrue(complex >= 0);
+<a class="jxr_linenumber" name="L3529" href="#L3529">3529</a> assertTrue(complex <= 100);
+<a class="jxr_linenumber" name="L3530" href="#L3530">3530</a>
+<a class="jxr_linenumber" name="L3531" href="#L3531">3531</a> <em class="jxr_comment">// Null/empty input</em>
+<a class="jxr_linenumber" name="L3532" href="#L3532">3532</a> assertEquals(0.0, readabilityScore(<strong class="jxr_keyword">null</strong>), 0.0001);
+<a class="jxr_linenumber" name="L3533" href="#L3533">3533</a> assertEquals(0.0, readabilityScore(<span class="jxr_string">""</span>), 0.0001);
+<a class="jxr_linenumber" name="L3534" href="#L3534">3534</a>
+<a class="jxr_linenumber" name="L3535" href="#L3535">3535</a> <em class="jxr_comment">// Score should be in 0-100 range</em>
+<a class="jxr_linenumber" name="L3536" href="#L3536">3536</a> <strong class="jxr_keyword">var</strong> score = readabilityScore(<span class="jxr_string">"This is a test sentence."</span>);
+<a class="jxr_linenumber" name="L3537" href="#L3537">3537</a> assertTrue(score >= 0.0 && score <= 100.0);
+<a class="jxr_linenumber" name="L3538" href="#L3538">3538</a> }
+<a class="jxr_linenumber" name="L3539" href="#L3539">3539</a>
+<a class="jxr_linenumber" name="L3540" href="#L3540">3540</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3541" href="#L3541">3541</a> <em class="jxr_comment">// readable(Object)</em>
<a class="jxr_linenumber" name="L3542" href="#L3542">3542</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3543" href="#L3543">3543</a> <em class="jxr_comment">// remove(String,String)</em>
-<a class="jxr_linenumber" name="L3544" href="#L3544">3544</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3545" href="#L3545">3545</a> @Test
-<a class="jxr_linenumber" name="L3546" href="#L3546">3546</a> <strong class="jxr_keyword">void</strong> a157_remove() {
-<a class="jxr_linenumber" name="L3547" href="#L3547">3547</a> assertNull(remove(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"x"</span>));
-<a class="jxr_linenumber" name="L3548" href="#L3548">3548</a> assertEquals(<span class="jxr_string">"hello"</span>, remove(<span class="jxr_string">"hello"</span>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3549" href="#L3549">3549</a> assertEquals(<span class="jxr_string">"hello"</span>, remove(<span class="jxr_string">"hello"</span>, <span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L3550" href="#L3550">3550</a> assertEquals(<span class="jxr_string">"hell wrld"</span>, remove(<span class="jxr_string">"hello world"</span>, <span class="jxr_string">"o"</span>));
-<a class="jxr_linenumber" name="L3551" href="#L3551">3551</a> assertEquals(<span class="jxr_string">"hello world"</span>, remove(<span class="jxr_string">"hello world"</span>, <span class="jxr_string">"xyz"</span>));
-<a class="jxr_linenumber" name="L3552" href="#L3552">3552</a> assertEquals(<span class="jxr_string">""</span>, remove(<span class="jxr_string">"xxx"</span>, <span class="jxr_string">"x"</span>));
-<a class="jxr_linenumber" name="L3553" href="#L3553">3553</a> }
-<a class="jxr_linenumber" name="L3554" href="#L3554">3554</a>
+<a class="jxr_linenumber" name="L3543" href="#L3543">3543</a> @Test
+<a class="jxr_linenumber" name="L3544" href="#L3544">3544</a> <strong class="jxr_keyword">void</strong> a156_readable() {
+<a class="jxr_linenumber" name="L3545" href="#L3545">3545</a> assertNull(readable(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3546" href="#L3546">3546</a> assertEquals(<span class="jxr_string">"[a,b,c]"</span>, readable(l(<span class="jxr_string">"a"</span>, <span class="jxr_string">"b"</span>, <span class="jxr_string">"c"</span>)));
+<a class="jxr_linenumber" name="L3547" href="#L3547">3547</a> assertEquals(<span class="jxr_string">"{foo=bar}"</span>, readable(m(<span class="jxr_string">"foo"</span>, <span class="jxr_string">"bar"</span>)));
+<a class="jxr_linenumber" name="L3548" href="#L3548">3548</a> assertEquals(<span class="jxr_string">"[1,2,3]"</span>, readable(ints(1, 2, 3)));
+<a class="jxr_linenumber" name="L3549" href="#L3549">3549</a> assertEquals(<span class="jxr_string">"test"</span>, readable(opt(<span class="jxr_string">"test"</span>)));
+<a class="jxr_linenumber" name="L3550" href="#L3550">3550</a> assertNull(readable(opte()));
+<a class="jxr_linenumber" name="L3551" href="#L3551">3551</a> }
+<a class="jxr_linenumber" name="L3552" href="#L3552">3552</a>
+<a class="jxr_linenumber" name="L3553" href="#L3553">3553</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3554" href="#L3554">3554</a> <em class="jxr_comment">// remove(String,String)</em>
<a class="jxr_linenumber" name="L3555" href="#L3555">3555</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3556" href="#L3556">3556</a> <em class="jxr_comment">// removeAccents(String)</em>
-<a class="jxr_linenumber" name="L3557" href="#L3557">3557</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3558" href="#L3558">3558</a> @Test
-<a class="jxr_linenumber" name="L3559" href="#L3559">3559</a> <strong class="jxr_keyword">void</strong> a158_removeAccents() {
-<a class="jxr_linenumber" name="L3560" href="#L3560">3560</a> <em class="jxr_comment">// Basic accent removal</em>
-<a class="jxr_linenumber" name="L3561" href="#L3561">3561</a> assertEquals(<span class="jxr_string">"cafe"</span>, removeAccents(<span class="jxr_string">"café"</span>));
-<a class="jxr_linenumber" name="L3562" href="#L3562">3562</a> assertEquals(<span class="jxr_string">"naive"</span>, removeAccents(<span class="jxr_string">"naïve"</span>));
-<a class="jxr_linenumber" name="L3563" href="#L3563">3563</a> assertEquals(<span class="jxr_string">"resume"</span>, removeAccents(<span class="jxr_string">"résumé"</span>));
-<a class="jxr_linenumber" name="L3564" href="#L3564">3564</a>
-<a class="jxr_linenumber" name="L3565" href="#L3565">3565</a> <em class="jxr_comment">// Multiple accents</em>
-<a class="jxr_linenumber" name="L3566" href="#L3566">3566</a> assertEquals(<span class="jxr_string">"Cafe"</span>, removeAccents(<span class="jxr_string">"Café"</span>));
-<a class="jxr_linenumber" name="L3567" href="#L3567">3567</a> assertEquals(<span class="jxr_string">"Zoe"</span>, removeAccents(<span class="jxr_string">"Zoë"</span>));
-<a class="jxr_linenumber" name="L3568" href="#L3568">3568</a>
-<a class="jxr_linenumber" name="L3569" href="#L3569">3569</a> <em class="jxr_comment">// No accents</em>
-<a class="jxr_linenumber" name="L3570" href="#L3570">3570</a> assertEquals(<span class="jxr_string">"hello"</span>, removeAccents(<span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L3571" href="#L3571">3571</a> assertEquals(<span class="jxr_string">"HELLO"</span>, removeAccents(<span class="jxr_string">"HELLO"</span>));
-<a class="jxr_linenumber" name="L3572" href="#L3572">3572</a>
-<a class="jxr_linenumber" name="L3573" href="#L3573">3573</a> <em class="jxr_comment">// Null input</em>
-<a class="jxr_linenumber" name="L3574" href="#L3574">3574</a> assertNull(removeAccents(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3556" href="#L3556">3556</a> @Test
+<a class="jxr_linenumber" name="L3557" href="#L3557">3557</a> <strong class="jxr_keyword">void</strong> a157_remove() {
+<a class="jxr_linenumber" name="L3558" href="#L3558">3558</a> assertNull(remove(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"x"</span>));
+<a class="jxr_linenumber" name="L3559" href="#L3559">3559</a> assertEquals(<span class="jxr_string">"hello"</span>, remove(<span class="jxr_string">"hello"</span>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3560" href="#L3560">3560</a> assertEquals(<span class="jxr_string">"hello"</span>, remove(<span class="jxr_string">"hello"</span>, <span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L3561" href="#L3561">3561</a> assertEquals(<span class="jxr_string">"hell wrld"</span>, remove(<span class="jxr_string">"hello world"</span>, <span class="jxr_string">"o"</span>));
+<a class="jxr_linenumber" name="L3562" href="#L3562">3562</a> assertEquals(<span class="jxr_string">"hello world"</span>, remove(<span class="jxr_string">"hello world"</span>, <span class="jxr_string">"xyz"</span>));
+<a class="jxr_linenumber" name="L3563" href="#L3563">3563</a> assertEquals(<span class="jxr_string">""</span>, remove(<span class="jxr_string">"xxx"</span>, <span class="jxr_string">"x"</span>));
+<a class="jxr_linenumber" name="L3564" href="#L3564">3564</a> }
+<a class="jxr_linenumber" name="L3565" href="#L3565">3565</a>
+<a class="jxr_linenumber" name="L3566" href="#L3566">3566</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3567" href="#L3567">3567</a> <em class="jxr_comment">// removeAccents(String)</em>
+<a class="jxr_linenumber" name="L3568" href="#L3568">3568</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3569" href="#L3569">3569</a> @Test
+<a class="jxr_linenumber" name="L3570" href="#L3570">3570</a> <strong class="jxr_keyword">void</strong> a158_removeAccents() {
+<a class="jxr_linenumber" name="L3571" href="#L3571">3571</a> <em class="jxr_comment">// Basic accent removal</em>
+<a class="jxr_linenumber" name="L3572" href="#L3572">3572</a> assertEquals(<span class="jxr_string">"cafe"</span>, removeAccents(<span class="jxr_string">"café"</span>));
+<a class="jxr_linenumber" name="L3573" href="#L3573">3573</a> assertEquals(<span class="jxr_string">"naive"</span>, removeAccents(<span class="jxr_string">"naïve"</span>));
+<a class="jxr_linenumber" name="L3574" href="#L3574">3574</a> assertEquals(<span class="jxr_string">"resume"</span>, removeAccents(<span class="jxr_string">"résumé"</span>));
<a class="jxr_linenumber" name="L3575" href="#L3575">3575</a>
-<a class="jxr_linenumber" name="L3576" href="#L3576">3576</a> <em class="jxr_comment">// Empty string</em>
-<a class="jxr_linenumber" name="L3577" href="#L3577">3577</a> assertEquals(<span class="jxr_string">""</span>, removeAccents(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L3578" href="#L3578">3578</a>
-<a class="jxr_linenumber" name="L3579" href="#L3579">3579</a> <em class="jxr_comment">// Mixed case with accents</em>
-<a class="jxr_linenumber" name="L3580" href="#L3580">3580</a> assertEquals(<span class="jxr_string">"Cafe"</span>, removeAccents(<span class="jxr_string">"Café"</span>));
-<a class="jxr_linenumber" name="L3581" href="#L3581">3581</a> assertEquals(<span class="jxr_string">"Ecole"</span>, removeAccents(<span class="jxr_string">"École"</span>));
-<a class="jxr_linenumber" name="L3582" href="#L3582">3582</a> }
+<a class="jxr_linenumber" name="L3576" href="#L3576">3576</a> <em class="jxr_comment">// Multiple accents</em>
+<a class="jxr_linenumber" name="L3577" href="#L3577">3577</a> assertEquals(<span class="jxr_string">"Cafe"</span>, removeAccents(<span class="jxr_string">"Café"</span>));
+<a class="jxr_linenumber" name="L3578" href="#L3578">3578</a> assertEquals(<span class="jxr_string">"Zoe"</span>, removeAccents(<span class="jxr_string">"Zoë"</span>));
+<a class="jxr_linenumber" name="L3579" href="#L3579">3579</a>
+<a class="jxr_linenumber" name="L3580" href="#L3580">3580</a> <em class="jxr_comment">// No accents</em>
+<a class="jxr_linenumber" name="L3581" href="#L3581">3581</a> assertEquals(<span class="jxr_string">"hello"</span>, removeAccents(<span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L3582" href="#L3582">3582</a> assertEquals(<span class="jxr_string">"HELLO"</span>, removeAccents(<span class="jxr_string">"HELLO"</span>));
<a class="jxr_linenumber" name="L3583" href="#L3583">3583</a>
-<a class="jxr_linenumber" name="L3584" href="#L3584">3584</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3585" href="#L3585">3585</a> <em class="jxr_comment">// removeAll(String,String...)</em>
-<a class="jxr_linenumber" name="L3586" href="#L3586">3586</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3587" href="#L3587">3587</a> @Test
-<a class="jxr_linenumber" name="L3588" href="#L3588">3588</a> <strong class="jxr_keyword">void</strong> a159_removeAll() {
-<a class="jxr_linenumber" name="L3589" href="#L3589">3589</a> assertNull(removeAll(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"x"</span>));
-<a class="jxr_linenumber" name="L3590" href="#L3590">3590</a> assertEquals(<span class="jxr_string">"hello world test"</span>, removeAll(<span class="jxr_string">"hello world test"</span>));
-<a class="jxr_linenumber" name="L3591" href="#L3591">3591</a> assertEquals(<span class="jxr_string">"hello world test"</span>, removeAll(<span class="jxr_string">"hello world test"</span>, (String[])<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3592" href="#L3592">3592</a> assertEquals(<span class="jxr_string">" world "</span>, removeAll(<span class="jxr_string">"hello world test"</span>, <span class="jxr_string">"hello"</span>, <span class="jxr_string">"test"</span>));
-<a class="jxr_linenumber" name="L3593" href="#L3593">3593</a> assertEquals(<span class="jxr_string">"hello world test"</span>, removeAll(<span class="jxr_string">"hello world test"</span>, <span class="jxr_string">"xyz"</span>));
-<a class="jxr_linenumber" name="L3594" href="#L3594">3594</a> assertEquals(<span class="jxr_string">""</span>, removeAll(<span class="jxr_string">"xxx"</span>, <span class="jxr_string">"x"</span>));
-<a class="jxr_linenumber" name="L3595" href="#L3595">3595</a> assertEquals(<span class="jxr_string">"hello"</span>, removeAll(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"x"</span>, <span class="jxr_string">"y"</span>, <span class="jxr_string">"z"</span>));
-<a class="jxr_linenumber" name="L3596" href="#L3596">3596</a> assertEquals(<span class="jxr_string">""</span>, removeAll(<span class="jxr_string">"abc"</span>, <span class="jxr_string">"a"</span>, <span class="jxr_string">"b"</span>, <span class="jxr_string">"c"</span>));
-<a class="jxr_linenumber" name="L3597" href="#L3597">3597</a> assertEquals(<span class="jxr_string">"hello"</span>, removeAll(<span class="jxr_string">"hello"</span>, <strong class="jxr_keyword">null</strong>, <span class="jxr_string">"x"</span>));
-<a class="jxr_linenumber" name="L3598" href="#L3598">3598</a> }
-<a class="jxr_linenumber" name="L3599" href="#L3599">3599</a>
-<a class="jxr_linenumber" name="L3600" href="#L3600">3600</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3601" href="#L3601">3601</a> <em class="jxr_comment">// removeControlChars(String)</em>
-<a class="jxr_linenumber" name="L3602" href="#L3602">3602</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3603" href="#L3603">3603</a> @Test
-<a class="jxr_linenumber" name="L3604" href="#L3604">3604</a> <strong class="jxr_keyword">void</strong> a160_removeControlChars() {
-<a class="jxr_linenumber" name="L3605" href="#L3605">3605</a> assertNull(removeControlChars(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3606" href="#L3606">3606</a> assertEquals(<span class="jxr_string">""</span>, removeControlChars(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L3607" href="#L3607">3607</a> assertEquals(<span class="jxr_string">"hello world"</span>, removeControlChars(<span class="jxr_string">"hello\u0000\u0001world"</span>));
-<a class="jxr_linenumber" name="L3608" href="#L3608">3608</a> assertEquals(<span class="jxr_string">"hello\nworld"</span>, removeControlChars(<span class="jxr_string">"hello\nworld"</span>)); <em class="jxr_comment">// Newline is not a control char</em>
-<a class="jxr_linenumber" name="L3609" href="#L3609">3609</a> assertEquals(<span class="jxr_string">"test"</span>, removeControlChars(<span class="jxr_string">"test"</span>));
-<a class="jxr_linenumber" name="L3610" href="#L3610">3610</a> }
-<a class="jxr_linenumber" name="L3611" href="#L3611">3611</a>
-<a class="jxr_linenumber" name="L3612" href="#L3612">3612</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3613" href="#L3613">3613</a> <em class="jxr_comment">// removeEnd(String,String)</em>
-<a class="jxr_linenumber" name="L3614" href="#L3614">3614</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3615" href="#L3615">3615</a> @Test
-<a class="jxr_linenumber" name="L3616" href="#L3616">3616</a> <strong class="jxr_keyword">void</strong> a161_removeEnd() {
-<a class="jxr_linenumber" name="L3617" href="#L3617">3617</a> assertNull(removeEnd(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"x"</span>));
-<a class="jxr_linenumber" name="L3618" href="#L3618">3618</a> assertEquals(<span class="jxr_string">"hello"</span>, removeEnd(<span class="jxr_string">"hello"</span>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3619" href="#L3619">3619</a> assertEquals(<span class="jxr_string">"hello"</span>, removeEnd(<span class="jxr_string">"hello"</span>, <span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L3620" href="#L3620">3620</a> assertEquals(<span class="jxr_string">"hello "</span>, removeEnd(<span class="jxr_string">"hello world"</span>, <span class="jxr_string">"world"</span>));
-<a class="jxr_linenumber" name="L3621" href="#L3621">3621</a> assertEquals(<span class="jxr_string">"hello world"</span>, removeEnd(<span class="jxr_string">"hello world"</span>, <span class="jxr_string">"xyz"</span>));
-<a class="jxr_linenumber" name="L3622" href="#L3622">3622</a> assertEquals(<span class="jxr_string">""</span>, removeEnd(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L3623" href="#L3623">3623</a> }
-<a class="jxr_linenumber" name="L3624" href="#L3624">3624</a>
+<a class="jxr_linenumber" name="L3584" href="#L3584">3584</a> <em class="jxr_comment">// Null input</em>
+<a class="jxr_linenumber" name="L3585" href="#L3585">3585</a> assertNull(removeAccents(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3586" href="#L3586">3586</a>
+<a class="jxr_linenumber" name="L3587" href="#L3587">3587</a> <em class="jxr_comment">// Empty string</em>
+<a class="jxr_linenumber" name="L3588" href="#L3588">3588</a> assertEquals(<span class="jxr_string">""</span>, removeAccents(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L3589" href="#L3589">3589</a>
+<a class="jxr_linenumber" name="L3590" href="#L3590">3590</a> <em class="jxr_comment">// Mixed case with accents</em>
+<a class="jxr_linenumber" name="L3591" href="#L3591">3591</a> assertEquals(<span class="jxr_string">"Cafe"</span>, removeAccents(<span class="jxr_string">"Café"</span>));
+<a class="jxr_linenumber" name="L3592" href="#L3592">3592</a> assertEquals(<span class="jxr_string">"Ecole"</span>, removeAccents(<span class="jxr_string">"École"</span>));
+<a class="jxr_linenumber" name="L3593" href="#L3593">3593</a> }
+<a class="jxr_linenumber" name="L3594" href="#L3594">3594</a>
+<a class="jxr_linenumber" name="L3595" href="#L3595">3595</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3596" href="#L3596">3596</a> <em class="jxr_comment">// removeAll(String,String...)</em>
+<a class="jxr_linenumber" name="L3597" href="#L3597">3597</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3598" href="#L3598">3598</a> @Test
+<a class="jxr_linenumber" name="L3599" href="#L3599">3599</a> <strong class="jxr_keyword">void</strong> a159_removeAll() {
+<a class="jxr_linenumber" name="L3600" href="#L3600">3600</a> assertNull(removeAll(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"x"</span>));
+<a class="jxr_linenumber" name="L3601" href="#L3601">3601</a> assertEquals(<span class="jxr_string">"hello world test"</span>, removeAll(<span class="jxr_string">"hello world test"</span>));
+<a class="jxr_linenumber" name="L3602" href="#L3602">3602</a> assertEquals(<span class="jxr_string">"hello world test"</span>, removeAll(<span class="jxr_string">"hello world test"</span>, (String[])<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3603" href="#L3603">3603</a> assertEquals(<span class="jxr_string">" world "</span>, removeAll(<span class="jxr_string">"hello world test"</span>, <span class="jxr_string">"hello"</span>, <span class="jxr_string">"test"</span>));
+<a class="jxr_linenumber" name="L3604" href="#L3604">3604</a> assertEquals(<span class="jxr_string">"hello world test"</span>, removeAll(<span class="jxr_string">"hello world test"</span>, <span class="jxr_string">"xyz"</span>));
+<a class="jxr_linenumber" name="L3605" href="#L3605">3605</a> assertEquals(<span class="jxr_string">""</span>, removeAll(<span class="jxr_string">"xxx"</span>, <span class="jxr_string">"x"</span>));
+<a class="jxr_linenumber" name="L3606" href="#L3606">3606</a> assertEquals(<span class="jxr_string">"hello"</span>, removeAll(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"x"</span>, <span class="jxr_string">"y"</span>, <span class="jxr_string">"z"</span>));
+<a class="jxr_linenumber" name="L3607" href="#L3607">3607</a> assertEquals(<span class="jxr_string">""</span>, removeAll(<span class="jxr_string">"abc"</span>, <span class="jxr_string">"a"</span>, <span class="jxr_string">"b"</span>, <span class="jxr_string">"c"</span>));
+<a class="jxr_linenumber" name="L3608" href="#L3608">3608</a> assertEquals(<span class="jxr_string">"hello"</span>, removeAll(<span class="jxr_string">"hello"</span>, <strong class="jxr_keyword">null</strong>, <span class="jxr_string">"x"</span>));
+<a class="jxr_linenumber" name="L3609" href="#L3609">3609</a> }
+<a class="jxr_linenumber" name="L3610" href="#L3610">3610</a>
+<a class="jxr_linenumber" name="L3611" href="#L3611">3611</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3612" href="#L3612">3612</a> <em class="jxr_comment">// removeControlChars(String)</em>
+<a class="jxr_linenumber" name="L3613" href="#L3613">3613</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3614" href="#L3614">3614</a> @Test
+<a class="jxr_linenumber" name="L3615" href="#L3615">3615</a> <strong class="jxr_keyword">void</strong> a160_removeControlChars() {
+<a class="jxr_linenumber" name="L3616" href="#L3616">3616</a> assertNull(removeControlChars(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3617" href="#L3617">3617</a> assertEquals(<span class="jxr_string">""</span>, removeControlChars(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L3618" href="#L3618">3618</a> assertEquals(<span class="jxr_string">"hello world"</span>, removeControlChars(<span class="jxr_string">"hello\u0000\u0001world"</span>));
+<a class="jxr_linenumber" name="L3619" href="#L3619">3619</a> assertEquals(<span class="jxr_string">"hello\nworld"</span>, removeControlChars(<span class="jxr_string">"hello\nworld"</span>)); <em class="jxr_comment">// Newline is not a control char</em>
+<a class="jxr_linenumber" name="L3620" href="#L3620">3620</a> assertEquals(<span class="jxr_string">"test"</span>, removeControlChars(<span class="jxr_string">"test"</span>));
+<a class="jxr_linenumber" name="L3621" href="#L3621">3621</a> }
+<a class="jxr_linenumber" name="L3622" href="#L3622">3622</a>
+<a class="jxr_linenumber" name="L3623" href="#L3623">3623</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3624" href="#L3624">3624</a> <em class="jxr_comment">// removeEnd(String,String)</em>
<a class="jxr_linenumber" name="L3625" href="#L3625">3625</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3626" href="#L3626">3626</a> <em class="jxr_comment">// removeNonPrintable(String)</em>
-<a class="jxr_linenumber" name="L3627" href="#L3627">3627</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3628" href="#L3628">3628</a> @Test
-<a class="jxr_linenumber" name="L3629" href="#L3629">3629</a> <strong class="jxr_keyword">void</strong> a162_removeNonPrintable() {
-<a class="jxr_linenumber" name="L3630" href="#L3630">3630</a> assertNull(removeNonPrintable(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3631" href="#L3631">3631</a> assertEquals(<span class="jxr_string">""</span>, removeNonPrintable(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L3632" href="#L3632">3632</a> assertEquals(<span class="jxr_string">"helloworld"</span>, removeNonPrintable(<span class="jxr_string">"hello\u0000world"</span>));
-<a class="jxr_linenumber" name="L3633" href="#L3633">3633</a> assertEquals(<span class="jxr_string">"test"</span>, removeNonPrintable(<span class="jxr_string">"test"</span>));
+<a class="jxr_linenumber" name="L3626" href="#L3626">3626</a> @Test
+<a class="jxr_linenumber" name="L3627" href="#L3627">3627</a> <strong class="jxr_keyword">void</strong> a161_removeEnd() {
+<a class="jxr_linenumber" name="L3628" href="#L3628">3628</a> assertNull(removeEnd(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"x"</span>));
+<a class="jxr_linenumber" name="L3629" href="#L3629">3629</a> assertEquals(<span class="jxr_string">"hello"</span>, removeEnd(<span class="jxr_string">"hello"</span>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3630" href="#L3630">3630</a> assertEquals(<span class="jxr_string">"hello"</span>, removeEnd(<span class="jxr_string">"hello"</span>, <span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L3631" href="#L3631">3631</a> assertEquals(<span class="jxr_string">"hello "</span>, removeEnd(<span class="jxr_string">"hello world"</span>, <span class="jxr_string">"world"</span>));
+<a class="jxr_linenumber" name="L3632" href="#L3632">3632</a> assertEquals(<span class="jxr_string">"hello world"</span>, removeEnd(<span class="jxr_string">"hello world"</span>, <span class="jxr_string">"xyz"</span>));
+<a class="jxr_linenumber" name="L3633" href="#L3633">3633</a> assertEquals(<span class="jxr_string">""</span>, removeEnd(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"hello"</span>));
<a class="jxr_linenumber" name="L3634" href="#L3634">3634</a> }
<a class="jxr_linenumber" name="L3635" href="#L3635">3635</a>
<a class="jxr_linenumber" name="L3636" href="#L3636">3636</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3637" href="#L3637">3637</a> <em class="jxr_comment">// removeStart(String,String)</em>
+<a class="jxr_linenumber" name="L3637" href="#L3637">3637</a> <em class="jxr_comment">// removeNonPrintable(String)</em>
<a class="jxr_linenumber" name="L3638" href="#L3638">3638</a> <em class="jxr_comment">//====================================================================================================</em>
<a class="jxr_linenumber" name="L3639" href="#L3639">3639</a> @Test
-<a class="jxr_linenumber" name="L3640" href="#L3640">3640</a> <strong class="jxr_keyword">void</strong> a163_removeStart() {
-<a class="jxr_linenumber" name="L3641" href="#L3641">3641</a> assertNull(removeStart(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"x"</span>));
-<a class="jxr_linenumber" name="L3642" href="#L3642">3642</a> assertEquals(<span class="jxr_string">"hello"</span>, removeStart(<span class="jxr_string">"hello"</span>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3643" href="#L3643">3643</a> assertEquals(<span class="jxr_string">"hello"</span>, removeStart(<span class="jxr_string">"hello"</span>, <span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L3644" href="#L3644">3644</a> assertEquals(<span class="jxr_string">" world"</span>, removeStart(<span class="jxr_string">"hello world"</span>, <span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L3645" href="#L3645">3645</a> assertEquals(<span class="jxr_string">"hello world"</span>, removeStart(<span class="jxr_string">"hello world"</span>, <span class="jxr_string">"xyz"</span>));
-<a class="jxr_linenumber" name="L3646" href="#L3646">3646</a> assertEquals(<span class="jxr_string">""</span>, removeStart(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L3647" href="#L3647">3647</a> }
-<a class="jxr_linenumber" name="L3648" href="#L3648">3648</a>
+<a class="jxr_linenumber" name="L3640" href="#L3640">3640</a> <strong class="jxr_keyword">void</strong> a162_removeNonPrintable() {
+<a class="jxr_linenumber" name="L3641" href="#L3641">3641</a> assertNull(removeNonPrintable(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3642" href="#L3642">3642</a> assertEquals(<span class="jxr_string">""</span>, removeNonPrintable(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L3643" href="#L3643">3643</a> assertEquals(<span class="jxr_string">"helloworld"</span>, removeNonPrintable(<span class="jxr_string">"hello\u0000world"</span>));
+<a class="jxr_linenumber" name="L3644" href="#L3644">3644</a> assertEquals(<span class="jxr_string">"test"</span>, removeNonPrintable(<span class="jxr_string">"test"</span>));
+<a class="jxr_linenumber" name="L3645" href="#L3645">3645</a> }
+<a class="jxr_linenumber" name="L3646" href="#L3646">3646</a>
+<a class="jxr_linenumber" name="L3647" href="#L3647">3647</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3648" href="#L3648">3648</a> <em class="jxr_comment">// removeStart(String,String)</em>
<a class="jxr_linenumber" name="L3649" href="#L3649">3649</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3650" href="#L3650">3650</a> <em class="jxr_comment">// removeUnderscores(String)</em>
-<a class="jxr_linenumber" name="L3651" href="#L3651">3651</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3652" href="#L3652">3652</a> @Test
-<a class="jxr_linenumber" name="L3653" href="#L3653">3653</a> <strong class="jxr_keyword">void</strong> a164_removeUnderscores() {
-<a class="jxr_linenumber" name="L3654" href="#L3654">3654</a> assertEquals(<span class="jxr_string">"1000000"</span>, removeUnderscores(<span class="jxr_string">"1_000_000"</span>));
-<a class="jxr_linenumber" name="L3655" href="#L3655">3655</a> assertEquals(<span class="jxr_string">"1000.5"</span>, removeUnderscores(<span class="jxr_string">"1_000.5"</span>));
-<a class="jxr_linenumber" name="L3656" href="#L3656">3656</a> assertEquals(<span class="jxr_string">"helloworld"</span>, removeUnderscores(<span class="jxr_string">"hello_world"</span>));
-<a class="jxr_linenumber" name="L3657" href="#L3657">3657</a> assertEquals(<span class="jxr_string">"nounderscores"</span>, removeUnderscores(<span class="jxr_string">"no_underscores"</span>));
-<a class="jxr_linenumber" name="L3658" href="#L3658">3658</a> assertEquals(<span class="jxr_string">"Hello"</span>, removeUnderscores(<span class="jxr_string">"Hello"</span>)); <em class="jxr_comment">// No underscores, same object</em>
-<a class="jxr_linenumber" name="L3659" href="#L3659">3659</a> <em class="jxr_comment">// Should throw for null</em>
-<a class="jxr_linenumber" name="L3660" href="#L3660">3660</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> removeUnderscores(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3661" href="#L3661">3661</a> }
-<a class="jxr_linenumber" name="L3662" href="#L3662">3662</a>
-<a class="jxr_linenumber" name="L3663" href="#L3663">3663</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3664" href="#L3664">3664</a> <em class="jxr_comment">// repeat(int,String)</em>
-<a class="jxr_linenumber" name="L3665" href="#L3665">3665</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3666" href="#L3666">3666</a> @Test
-<a class="jxr_linenumber" name="L3667" href="#L3667">3667</a> <strong class="jxr_keyword">void</strong> a165_repeat() {
-<a class="jxr_linenumber" name="L3668" href="#L3668">3668</a> assertEquals(<span class="jxr_string">""</span>, repeat(0, <span class="jxr_string">"abc"</span>));
-<a class="jxr_linenumber" name="L3669" href="#L3669">3669</a> assertEquals(<span class="jxr_string">"abc"</span>, repeat(1, <span class="jxr_string">"abc"</span>));
-<a class="jxr_linenumber" name="L3670" href="#L3670">3670</a> assertEquals(<span class="jxr_string">"abcabcabc"</span>, repeat(3, <span class="jxr_string">"abc"</span>));
-<a class="jxr_linenumber" name="L3671" href="#L3671">3671</a> assertEquals(<span class="jxr_string">"---"</span>, repeat(3, <span class="jxr_string">"-"</span>));
-<a class="jxr_linenumber" name="L3672" href="#L3672">3672</a> assertEquals(<span class="jxr_string">""</span>, repeat(5, <span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L3673" href="#L3673">3673</a> }
-<a class="jxr_linenumber" name="L3674" href="#L3674">3674</a>
-<a class="jxr_linenumber" name="L3675" href="#L3675">3675</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3676" href="#L3676">3676</a> <em class="jxr_comment">// replaceUnicodeSequences(String)</em>
-<a class="jxr_linenumber" name="L3677" href="#L3677">3677</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3678" href="#L3678">3678</a> @Test
-<a class="jxr_linenumber" name="L3679" href="#L3679">3679</a> <strong class="jxr_keyword">void</strong> a166_replaceUnicodeSequences() {
-<a class="jxr_linenumber" name="L3680" href="#L3680">3680</a> assertEquals(<span class="jxr_string">"Hello"</span>, replaceUnicodeSequences(<span class="jxr_string">"\\u0048\\u0065\\u006c\\u006c\\u006f"</span>));
-<a class="jxr_linenumber" name="L3681" href="#L3681">3681</a> assertEquals(<span class="jxr_string">"A"</span>, replaceUnicodeSequences(<span class="jxr_string">"\\u0041"</span>));
-<a class="jxr_linenumber" name="L3682" href="#L3682">3682</a> assertEquals(<span class="jxr_string">"test"</span>, replaceUnicodeSequences(<span class="jxr_string">"test"</span>)); <em class="jxr_comment">// No unicode sequences</em>
-<a class="jxr_linenumber" name="L3683" href="#L3683">3683</a> assertEquals(<span class="jxr_string">"Hello World"</span>, replaceUnicodeSequences(<span class="jxr_string">"\\u0048ello \\u0057orld"</span>));
-<a class="jxr_linenumber" name="L3684" href="#L3684">3684</a> <em class="jxr_comment">// Mixed content</em>
-<a class="jxr_linenumber" name="L3685" href="#L3685">3685</a> assertEquals(<span class="jxr_string">"Hello\\u"</span>, replaceUnicodeSequences(<span class="jxr_string">"\\u0048ello\\u"</span>)); <em class="jxr_comment">// Incomplete sequence</em>
-<a class="jxr_linenumber" name="L3686" href="#L3686">3686</a> }
-<a class="jxr_linenumber" name="L3687" href="#L3687">3687</a>
+<a class="jxr_linenumber" name="L3650" href="#L3650">3650</a> @Test
+<a class="jxr_linenumber" name="L3651" href="#L3651">3651</a> <strong class="jxr_keyword">void</strong> a163_removeStart() {
+<a class="jxr_linenumber" name="L3652" href="#L3652">3652</a> assertNull(removeStart(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"x"</span>));
+<a class="jxr_linenumber" name="L3653" href="#L3653">3653</a> assertEquals(<span class="jxr_string">"hello"</span>, removeStart(<span class="jxr_string">"hello"</span>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3654" href="#L3654">3654</a> assertEquals(<span class="jxr_string">"hello"</span>, removeStart(<span class="jxr_string">"hello"</span>, <span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L3655" href="#L3655">3655</a> assertEquals(<span class="jxr_string">" world"</span>, removeStart(<span class="jxr_string">"hello world"</span>, <span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L3656" href="#L3656">3656</a> assertEquals(<span class="jxr_string">"hello world"</span>, removeStart(<span class="jxr_string">"hello world"</span>, <span class="jxr_string">"xyz"</span>));
+<a class="jxr_linenumber" name="L3657" href="#L3657">3657</a> assertEquals(<span class="jxr_string">""</span>, removeStart(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L3658" href="#L3658">3658</a> }
+<a class="jxr_linenumber" name="L3659" href="#L3659">3659</a>
+<a class="jxr_linenumber" name="L3660" href="#L3660">3660</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3661" href="#L3661">3661</a> <em class="jxr_comment">// removeUnderscores(String)</em>
+<a class="jxr_linenumber" name="L3662" href="#L3662">3662</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3663" href="#L3663">3663</a> @Test
+<a class="jxr_linenumber" name="L3664" href="#L3664">3664</a> <strong class="jxr_keyword">void</strong> a164_removeUnderscores() {
+<a class="jxr_linenumber" name="L3665" href="#L3665">3665</a> assertEquals(<span class="jxr_string">"1000000"</span>, removeUnderscores(<span class="jxr_string">"1_000_000"</span>));
+<a class="jxr_linenumber" name="L3666" href="#L3666">3666</a> assertEquals(<span class="jxr_string">"1000.5"</span>, removeUnderscores(<span class="jxr_string">"1_000.5"</span>));
+<a class="jxr_linenumber" name="L3667" href="#L3667">3667</a> assertEquals(<span class="jxr_string">"helloworld"</span>, removeUnderscores(<span class="jxr_string">"hello_world"</span>));
+<a class="jxr_linenumber" name="L3668" href="#L3668">3668</a> assertEquals(<span class="jxr_string">"nounderscores"</span>, removeUnderscores(<span class="jxr_string">"no_underscores"</span>));
+<a class="jxr_linenumber" name="L3669" href="#L3669">3669</a> assertEquals(<span class="jxr_string">"Hello"</span>, removeUnderscores(<span class="jxr_string">"Hello"</span>)); <em class="jxr_comment">// No underscores, same object</em>
+<a class="jxr_linenumber" name="L3670" href="#L3670">3670</a> <em class="jxr_comment">// Should throw for null</em>
+<a class="jxr_linenumber" name="L3671" href="#L3671">3671</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> removeUnderscores(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3672" href="#L3672">3672</a> }
+<a class="jxr_linenumber" name="L3673" href="#L3673">3673</a>
+<a class="jxr_linenumber" name="L3674" href="#L3674">3674</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3675" href="#L3675">3675</a> <em class="jxr_comment">// repeat(int,String)</em>
+<a class="jxr_linenumber" name="L3676" href="#L3676">3676</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3677" href="#L3677">3677</a> @Test
+<a class="jxr_linenumber" name="L3678" href="#L3678">3678</a> <strong class="jxr_keyword">void</strong> a165_repeat() {
+<a class="jxr_linenumber" name="L3679" href="#L3679">3679</a> assertEquals(<span class="jxr_string">""</span>, repeat(0, <span class="jxr_string">"abc"</span>));
+<a class="jxr_linenumber" name="L3680" href="#L3680">3680</a> assertEquals(<span class="jxr_string">"abc"</span>, repeat(1, <span class="jxr_string">"abc"</span>));
+<a class="jxr_linenumber" name="L3681" href="#L3681">3681</a> assertEquals(<span class="jxr_string">"abcabcabc"</span>, repeat(3, <span class="jxr_string">"abc"</span>));
+<a class="jxr_linenumber" name="L3682" href="#L3682">3682</a> assertEquals(<span class="jxr_string">"---"</span>, repeat(3, <span class="jxr_string">"-"</span>));
+<a class="jxr_linenumber" name="L3683" href="#L3683">3683</a> assertEquals(<span class="jxr_string">""</span>, repeat(5, <span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L3684" href="#L3684">3684</a> }
+<a class="jxr_linenumber" name="L3685" href="#L3685">3685</a>
+<a class="jxr_linenumber" name="L3686" href="#L3686">3686</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3687" href="#L3687">3687</a> <em class="jxr_comment">// replaceUnicodeSequences(String)</em>
<a class="jxr_linenumber" name="L3688" href="#L3688">3688</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3689" href="#L3689">3689</a> <em class="jxr_comment">// reverse(String)</em>
-<a class="jxr_linenumber" name="L3690" href="#L3690">3690</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3691" href="#L3691">3691</a> @Test
-<a class="jxr_linenumber" name="L3692" href="#L3692">3692</a> <strong class="jxr_keyword">void</strong> a167_reverse() {
-<a class="jxr_linenumber" name="L3693" href="#L3693">3693</a> assertNull(reverse(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3694" href="#L3694">3694</a> assertEquals(<span class="jxr_string">""</span>, reverse(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L3695" href="#L3695">3695</a> assertEquals(<span class="jxr_string">"olleh"</span>, reverse(<span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L3696" href="#L3696">3696</a> assertEquals(<span class="jxr_string">"321"</span>, reverse(<span class="jxr_string">"123"</span>));
-<a class="jxr_linenumber" name="L3697" href="#L3697">3697</a> assertEquals(<span class="jxr_string">"cba"</span>, reverse(<span class="jxr_string">"abc"</span>));
-<a class="jxr_linenumber" name="L3698" href="#L3698">3698</a> }
-<a class="jxr_linenumber" name="L3699" href="#L3699">3699</a>
-<a class="jxr_linenumber" name="L3700" href="#L3700">3700</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3701" href="#L3701">3701</a> <em class="jxr_comment">// right(String,int)</em>
-<a class="jxr_linenumber" name="L3702" href="#L3702">3702</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3703" href="#L3703">3703</a> @Test
-<a class="jxr_linenumber" name="L3704" href="#L3704">3704</a> <strong class="jxr_keyword">void</strong> a168_right() {
-<a class="jxr_linenumber" name="L3705" href="#L3705">3705</a> assertNull(right(<strong class="jxr_keyword">null</strong>, 3));
-<a class="jxr_linenumber" name="L3706" href="#L3706">3706</a> assertEquals(<span class="jxr_string">""</span>, right(<span class="jxr_string">""</span>, 3));
-<a class="jxr_linenumber" name="L3707" href="#L3707">3707</a> assertEquals(<span class="jxr_string">"llo"</span>, right(<span class="jxr_string">"hello"</span>, 3));
-<a class="jxr_linenumber" name="L3708" href="#L3708">3708</a> assertEquals(<span class="jxr_string">"hello"</span>, right(<span class="jxr_string">"hello"</span>, 10));
-<a class="jxr_linenumber" name="L3709" href="#L3709">3709</a> assertEquals(<span class="jxr_string">""</span>, right(<span class="jxr_string">"hello"</span>, 0));
-<a class="jxr_linenumber" name="L3710" href="#L3710">3710</a> assertEquals(<span class="jxr_string">""</span>, right(<span class="jxr_string">"hello"</span>, -1));
-<a class="jxr_linenumber" name="L3711" href="#L3711">3711</a> }
-<a class="jxr_linenumber" name="L3712" href="#L3712">3712</a>
+<a class="jxr_linenumber" name="L3689" href="#L3689">3689</a> @Test
+<a class="jxr_linenumber" name="L3690" href="#L3690">3690</a> <strong class="jxr_keyword">void</strong> a166_replaceUnicodeSequences() {
+<a class="jxr_linenumber" name="L3691" href="#L3691">3691</a> assertEquals(<span class="jxr_string">"Hello"</span>, replaceUnicodeSequences(<span class="jxr_string">"\\u0048\\u0065\\u006c\\u006c\\u006f"</span>));
+<a class="jxr_linenumber" name="L3692" href="#L3692">3692</a> assertEquals(<span class="jxr_string">"A"</span>, replaceUnicodeSequences(<span class="jxr_string">"\\u0041"</span>));
+<a class="jxr_linenumber" name="L3693" href="#L3693">3693</a> assertEquals(<span class="jxr_string">"test"</span>, replaceUnicodeSequences(<span class="jxr_string">"test"</span>)); <em class="jxr_comment">// No unicode sequences</em>
+<a class="jxr_linenumber" name="L3694" href="#L3694">3694</a> assertEquals(<span class="jxr_string">"Hello World"</span>, replaceUnicodeSequences(<span class="jxr_string">"\\u0048ello \\u0057orld"</span>));
+<a class="jxr_linenumber" name="L3695" href="#L3695">3695</a> <em class="jxr_comment">// Mixed content</em>
+<a class="jxr_linenumber" name="L3696" href="#L3696">3696</a> assertEquals(<span class="jxr_string">"Hello\\u"</span>, replaceUnicodeSequences(<span class="jxr_string">"\\u0048ello\\u"</span>)); <em class="jxr_comment">// Incomplete sequence</em>
+<a class="jxr_linenumber" name="L3697" href="#L3697">3697</a> }
+<a class="jxr_linenumber" name="L3698" href="#L3698">3698</a>
+<a class="jxr_linenumber" name="L3699" href="#L3699">3699</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3700" href="#L3700">3700</a> <em class="jxr_comment">// reverse(String)</em>
+<a class="jxr_linenumber" name="L3701" href="#L3701">3701</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3702" href="#L3702">3702</a> @Test
+<a class="jxr_linenumber" name="L3703" href="#L3703">3703</a> <strong class="jxr_keyword">void</strong> a167_reverse() {
+<a class="jxr_linenumber" name="L3704" href="#L3704">3704</a> assertNull(reverse(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3705" href="#L3705">3705</a> assertEquals(<span class="jxr_string">""</span>, reverse(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L3706" href="#L3706">3706</a> assertEquals(<span class="jxr_string">"olleh"</span>, reverse(<span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L3707" href="#L3707">3707</a> assertEquals(<span class="jxr_string">"321"</span>, reverse(<span class="jxr_string">"123"</span>));
+<a class="jxr_linenumber" name="L3708" href="#L3708">3708</a> assertEquals(<span class="jxr_string">"cba"</span>, reverse(<span class="jxr_string">"abc"</span>));
+<a class="jxr_linenumber" name="L3709" href="#L3709">3709</a> }
+<a class="jxr_linenumber" name="L3710" href="#L3710">3710</a>
+<a class="jxr_linenumber" name="L3711" href="#L3711">3711</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3712" href="#L3712">3712</a> <em class="jxr_comment">// right(String,int)</em>
<a class="jxr_linenumber" name="L3713" href="#L3713">3713</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3714" href="#L3714">3714</a> <em class="jxr_comment">// sanitize(String)</em>
-<a class="jxr_linenumber" name="L3715" href="#L3715">3715</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3716" href="#L3716">3716</a> @Test
-<a class="jxr_linenumber" name="L3717" href="#L3717">3717</a> <strong class="jxr_keyword">void</strong> a169_sanitize() {
-<a class="jxr_linenumber" name="L3718" href="#L3718">3718</a> assertNull(sanitize(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3719" href="#L3719">3719</a> assertEquals(<span class="jxr_string">""</span>, sanitize(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L3720" href="#L3720">3720</a> assertEquals(<span class="jxr_string">"Hello World"</span>, sanitize(<span class="jxr_string">"Hello World"</span>));
-<a class="jxr_linenumber" name="L3721" href="#L3721">3721</a> assertEquals(<span class="jxr_string">"&lt;script&gt;alert(&#39;xss&#39;)&lt;/script&gt;"</span>, sanitize(<span class="jxr_string">"<script>alert('xss')</script>"</span>));
-<a class="jxr_linenumber" name="L3722" href="#L3722">3722</a> assertEquals(<span class="jxr_string">"Hello &lt;b&gt;World&lt;/b&gt;"</span>, sanitize(<span class="jxr_string">"Hello <b>World</b>"</span>));
-<a class="jxr_linenumber" name="L3723" href="#L3723">3723</a> assertEquals(<span class="jxr_string">"&lt;img src=&quot;x&quot; onerror=&quot;alert(1)&quot;&gt;"</span>, sanitize(<span class="jxr_string">"<img src=\"x\" onerror=\"alert(1)\">"</span>));
-<a class="jxr_linenumber" name="L3724" href="#L3724">3724</a> }
-<a class="jxr_linenumber" name="L3725" href="#L3725">3725</a>
+<a class="jxr_linenumber" name="L3714" href="#L3714">3714</a> @Test
+<a class="jxr_linenumber" name="L3715" href="#L3715">3715</a> <strong class="jxr_keyword">void</strong> a168_right() {
+<a class="jxr_linenumber" name="L3716" href="#L3716">3716</a> assertNull(right(<strong class="jxr_keyword">null</strong>, 3));
+<a class="jxr_linenumber" name="L3717" href="#L3717">3717</a> assertEquals(<span class="jxr_string">""</span>, right(<span class="jxr_string">""</span>, 3));
+<a class="jxr_linenumber" name="L3718" href="#L3718">3718</a> assertEquals(<span class="jxr_string">"llo"</span>, right(<span class="jxr_string">"hello"</span>, 3));
+<a class="jxr_linenumber" name="L3719" href="#L3719">3719</a> assertEquals(<span class="jxr_string">"hello"</span>, right(<span class="jxr_string">"hello"</span>, 10));
+<a class="jxr_linenumber" name="L3720" href="#L3720">3720</a> assertEquals(<span class="jxr_string">""</span>, right(<span class="jxr_string">"hello"</span>, 0));
+<a class="jxr_linenumber" name="L3721" href="#L3721">3721</a> assertEquals(<span class="jxr_string">""</span>, right(<span class="jxr_string">"hello"</span>, -1));
+<a class="jxr_linenumber" name="L3722" href="#L3722">3722</a> }
+<a class="jxr_linenumber" name="L3723" href="#L3723">3723</a>
+<a class="jxr_linenumber" name="L3724" href="#L3724">3724</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3725" href="#L3725">3725</a> <em class="jxr_comment">// sanitize(String)</em>
<a class="jxr_linenumber" name="L3726" href="#L3726">3726</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3727" href="#L3727">3727</a> <em class="jxr_comment">// similarity(String,String)</em>
-<a class="jxr_linenumber" name="L3728" href="#L3728">3728</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3729" href="#L3729">3729</a> @Test
-<a class="jxr_linenumber" name="L3730" href="#L3730">3730</a> <strong class="jxr_keyword">void</strong> a170_similarity() {
-<a class="jxr_linenumber" name="L3731" href="#L3731">3731</a> assertEquals(1.0, similarity(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"hello"</span>), 0.0001);
-<a class="jxr_linenumber" name="L3732" href="#L3732">3732</a> assertEquals(0.0, similarity(<span class="jxr_string">"abc"</span>, <span class="jxr_string">"xyz"</span>), 0.0001);
-<a class="jxr_linenumber" name="L3733" href="#L3733">3733</a> <em class="jxr_comment">// kitten -> sitting: distance = 3, maxLen = 7, similarity = 1 - 3/7 = 4/7 ≈ 0.571</em>
-<a class="jxr_linenumber" name="L3734" href="#L3734">3734</a> assertEquals(4.0 / 7.0, similarity(<span class="jxr_string">"kitten"</span>, <span class="jxr_string">"sitting"</span>), 0.01);
-<a class="jxr_linenumber" name="L3735" href="#L3735">3735</a> assertEquals(1.0, similarity(<span class="jxr_string">""</span>, <span class="jxr_string">""</span>), 0.0001);
-<a class="jxr_linenumber" name="L3736" href="#L3736">3736</a> assertEquals(0.0, similarity(<span class="jxr_string">"abc"</span>, <span class="jxr_string">""</span>), 0.0001);
-<a class="jxr_linenumber" name="L3737" href="#L3737">3737</a> assertEquals(0.0, similarity(<span class="jxr_string">""</span>, <span class="jxr_string">"abc"</span>), 0.0001);
-<a class="jxr_linenumber" name="L3738" href="#L3738">3738</a> <em class="jxr_comment">// Null handling</em>
-<a class="jxr_linenumber" name="L3739" href="#L3739">3739</a> assertEquals(1.0, similarity(<strong class="jxr_keyword">null</strong>, <strong class="jxr_keyword">null</strong>), 0.0001);
-<a class="jxr_linenumber" name="L3740" href="#L3740">3740</a> assertEquals(0.0, similarity(<span class="jxr_string">"hello"</span>, <strong class="jxr_keyword">null</strong>), 0.0001);
-<a class="jxr_linenumber" name="L3741" href="#L3741">3741</a> assertEquals(0.0, similarity(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"hello"</span>), 0.0001);
-<a class="jxr_linenumber" name="L3742" href="#L3742">3742</a> <em class="jxr_comment">// Similar strings</em>
-<a class="jxr_linenumber" name="L3743" href="#L3743">3743</a> <em class="jxr_comment">// "hello" vs "hallo": distance = 1, maxLen = 5, similarity = 1 - 1/5 = 0.8</em>
-<a class="jxr_linenumber" name="L3744" href="#L3744">3744</a> assertEquals(0.8, similarity(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"hallo"</span>), 0.01);
-<a class="jxr_linenumber" name="L3745" href="#L3745">3745</a> }
-<a class="jxr_linenumber" name="L3746" href="#L3746">3746</a>
-<a class="jxr_linenumber" name="L3747" href="#L3747">3747</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3748" href="#L3748">3748</a> <em class="jxr_comment">// snakeCase(String)</em>
-<a class="jxr_linenumber" name="L3749" href="#L3749">3749</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3750" href="#L3750">3750</a> @Test
-<a class="jxr_linenumber" name="L3751" href="#L3751">3751</a> <strong class="jxr_keyword">void</strong> a171_snakeCase() {
-<a class="jxr_linenumber" name="L3752" href="#L3752">3752</a> assertNull(snakeCase(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3753" href="#L3753">3753</a> assertEquals(<span class="jxr_string">""</span>, snakeCase(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L3754" href="#L3754">3754</a> assertEquals(<span class="jxr_string">"hello_world"</span>, snakeCase(<span class="jxr_string">"hello world"</span>));
-<a class="jxr_linenumber" name="L3755" href="#L3755">3755</a> assertEquals(<span class="jxr_string">"hello_world"</span>, snakeCase(<span class="jxr_string">"helloWorld"</span>));
-<a class="jxr_linenumber" name="L3756" href="#L3756">3756</a> assertEquals(<span class="jxr_string">"hello_world"</span>, snakeCase(<span class="jxr_string">"HelloWorld"</span>));
-<a class="jxr_linenumber" name="L3757" href="#L3757">3757</a> assertEquals(<span class="jxr_string">"hello_world"</span>, snakeCase(<span class="jxr_string">"hello-world"</span>));
-<a class="jxr_linenumber" name="L3758" href="#L3758">3758</a> assertEquals(<span class="jxr_string">"hello_world"</span>, snakeCase(<span class="jxr_string">"hello_world"</span>));
-<a class="jxr_linenumber" name="L3759" href="#L3759">3759</a> assertEquals(<span class="jxr_string">"xml_http_request"</span>, snakeCase(<span class="jxr_string">"XMLHttpRequest"</span>));
-<a class="jxr_linenumber" name="L3760" href="#L3760">3760</a> assertEquals(<span class="jxr_string">"hello_world_test"</span>, snakeCase(<span class="jxr_string">"Hello_World-Test"</span>));
-<a class="jxr_linenumber" name="L3761" href="#L3761">3761</a> assertEquals(<span class="jxr_string">"test"</span>, snakeCase(<span class="jxr_string">"test"</span>));
-<a class="jxr_linenumber" name="L3762" href="#L3762">3762</a> assertEquals(<span class="jxr_string">"test"</span>, snakeCase(<span class="jxr_string">"TEST"</span>));
-<a class="jxr_linenumber" name="L3763" href="#L3763">3763</a> assertEquals(<span class="jxr_string">"hello_123_world"</span>, snakeCase(<span class="jxr_string">"hello 123 world"</span>));
-<a class="jxr_linenumber" name="L3764" href="#L3764">3764</a> }
-<a class="jxr_linenumber" name="L3765" href="#L3765">3765</a>
-<a class="jxr_linenumber" name="L3766" href="#L3766">3766</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3767" href="#L3767">3767</a> <em class="jxr_comment">// sort(String[])</em>
-<a class="jxr_linenumber" name="L3768" href="#L3768">3768</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3769" href="#L3769">3769</a> @Test
-<a class="jxr_linenumber" name="L3770" href="#L3770">3770</a> <strong class="jxr_keyword">void</strong> a172_sort() {
-<a class="jxr_linenumber" name="L3771" href="#L3771">3771</a> assertNull(sort(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3772" href="#L3772">3772</a> assertList(sort(a()));
-<a class="jxr_linenumber" name="L3773" href="#L3773">3773</a> assertList(sort(a(<span class="jxr_string">"c"</span>, <span class="jxr_string">"a"</span>, <span class="jxr_string">"b"</span>)), <span class="jxr_string">"a"</span>, <span class="jxr_string">"b"</span>, <span class="jxr_string">"c"</span>);
-<a class="jxr_linenumber" name="L3774" href="#L3774">3774</a> assertList(sort(a(<span class="jxr_string">"zebra"</span>, <span class="jxr_string">"apple"</span>, <span class="jxr_string">"banana"</span>)), <span class="jxr_string">"apple"</span>, <span class="jxr_string">"banana"</span>, <span class="jxr_string">"zebra"</span>);
-<a class="jxr_linenumber" name="L3775" href="#L3775">3775</a> assertList(sort(a(<span class="jxr_string">"3"</span>, <span class="jxr_string">"1"</span>, <span class="jxr_string">"2"</span>)), <span class="jxr_string">"1"</span>, <span class="jxr_string">"2"</span>, <span class="jxr_string">"3"</span>);
-<a class="jxr_linenumber" name="L3776" href="#L3776">3776</a> assertList(sort(a(<span class="jxr_string">"test"</span>)), <span class="jxr_string">"test"</span>);
-<a class="jxr_linenumber" name="L3777" href="#L3777">3777</a> assertList(sort(a(<span class="jxr_string">"Z"</span>, <span class="jxr_string">"a"</span>, <span class="jxr_string">"B"</span>)), <span class="jxr_string">"B"</span>, <span class="jxr_string">"Z"</span>, <span class="jxr_string">"a"</span>);
-<a class="jxr_linenumber" name="L3778" href="#L3778">3778</a> assertList(sort(a(<span class="jxr_string">"foo"</span>, <span class="jxr_string">"bar"</span>, <span class="jxr_string">"baz"</span>)), <span class="jxr_string">"bar"</span>, <span class="jxr_string">"baz"</span>, <span class="jxr_string">"foo"</span>);
-<a class="jxr_linenumber" name="L3779" href="#L3779">3779</a> }
-<a class="jxr_linenumber" name="L3780" href="#L3780">3780</a>
-<a class="jxr_linenumber" name="L3781" href="#L3781">3781</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3782" href="#L3782">3782</a> <em class="jxr_comment">// sortIgnoreCase(String[])</em>
-<a class="jxr_linenumber" name="L3783" href="#L3783">3783</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3784" href="#L3784">3784</a> @Test
-<a class="jxr_linenumber" name="L3785" href="#L3785">3785</a> <strong class="jxr_keyword">void</strong> a173_sortIgnoreCase() {
-<a class="jxr_linenumber" name="L3786" href="#L3786">3786</a> assertNull(sortIgnoreCase(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3787" href="#L3787">3787</a> assertList(sortIgnoreCase(a()));
-<a class="jxr_linenumber" name="L3788" href="#L3788">3788</a> assertList(sortIgnoreCase(a(<span class="jxr_string">"c"</span>, <span class="jxr_string">"a"</span>, <span class="jxr_string">"b"</span>)), <span class="jxr_string">"a"</span>, <span class="jxr_string">"b"</span>, <span class="jxr_string">"c"</span>);
-<a class="jxr_linenumber" name="L3789" href="#L3789">3789</a> assertList(sortIgnoreCase(a(<span class="jxr_string">"Zebra"</span>, <span class="jxr_string">"apple"</span>, <span class="jxr_string">"Banana"</span>)), <span class="jxr_string">"apple"</span>, <span class="jxr_string">"Banana"</span>, <span class="jxr_string">"Zebra"</span>);
-<a class="jxr_linenumber" name="L3790" href="#L3790">3790</a> assertList(sortIgnoreCase(a(<span class="jxr_string">"Z"</span>, <span class="jxr_string">"a"</span>, <span class="jxr_string">"B"</span>)), <span class="jxr_string">"a"</span>, <span class="jxr_string">"B"</span>, <span class="jxr_string">"Z"</span>);
-<a class="jxr_linenumber" name="L3791" href="#L3791">3791</a> assertList(sortIgnoreCase(a(<span class="jxr_string">"test"</span>)), <span class="jxr_string">"test"</span>);
-<a class="jxr_linenumber" name="L3792" href="#L3792">3792</a> assertList(sortIgnoreCase(a(<span class="jxr_string">"FOO"</span>, <span class="jxr_string">"bar"</span>, <span class="jxr_string">"Baz"</span>)), <span class="jxr_string">"bar"</span>, <span class="jxr_string">"Baz"</span>, <span class="jxr_string">"FOO"</span>);
-<a class="jxr_linenumber" name="L3793" href="#L3793">3793</a> assertList(sortIgnoreCase(a(<span class="jxr_string">"zebra"</span>, <span class="jxr_string">"APPLE"</span>, <span class="jxr_string">"banana"</span>)), <span class="jxr_string">"APPLE"</span>, <span class="jxr_string">"banana"</span>, <span class="jxr_string">"zebra"</span>);
-<a class="jxr_linenumber" name="L3794" href="#L3794">3794</a> }
-<a class="jxr_linenumber" name="L3795" href="#L3795">3795</a>
-<a class="jxr_linenumber" name="L3796" href="#L3796">3796</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3797" href="#L3797">3797</a> <em class="jxr_comment">// soundex(String)</em>
-<a class="jxr_linenumber" name="L3798" href="#L3798">3798</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3799" href="#L3799">3799</a> @Test
-<a class="jxr_linenumber" name="L3800" href="#L3800">3800</a> <strong class="jxr_keyword">void</strong> a174_soundex() {
-<a class="jxr_linenumber" name="L3801" href="#L3801">3801</a> <em class="jxr_comment">// Basic soundex examples</em>
-<a class="jxr_linenumber" name="L3802" href="#L3802">3802</a> <strong class="jxr_keyword">var</strong> code1 = soundex(<span class="jxr_string">"Smith"</span>);
-<a class="jxr_linenumber" name="L3803" href="#L3803">3803</a> assertNotNull(code1);
-<a class="jxr_linenumber" name="L3804" href="#L3804">3804</a> assertEquals(4, code1.length());
-<a class="jxr_linenumber" name="L3805" href="#L3805">3805</a> assertTrue(code1.matches(<span class="jxr_string">"[A-Z]\\d{3}"</span>));
+<a class="jxr_linenumber" name="L3727" href="#L3727">3727</a> @Test
+<a class="jxr_linenumber" name="L3728" href="#L3728">3728</a> <strong class="jxr_keyword">void</strong> a169_sanitize() {
+<a class="jxr_linenumber" name="L3729" href="#L3729">3729</a> assertNull(sanitize(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3730" href="#L3730">3730</a> assertEquals(<span class="jxr_string">""</span>, sanitize(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L3731" href="#L3731">3731</a> assertEquals(<span class="jxr_string">"Hello World"</span>, sanitize(<span class="jxr_string">"Hello World"</span>));
+<a class="jxr_linenumber" name="L3732" href="#L3732">3732</a> assertEquals(<span class="jxr_string">"&lt;script&gt;alert(&#39;xss&#39;)&lt;/script&gt;"</span>, sanitize(<span class="jxr_string">"<script>alert('xss')</script>"</span>));
+<a class="jxr_linenumber" name="L3733" href="#L3733">3733</a> assertEquals(<span class="jxr_string">"Hello &lt;b&gt;World&lt;/b&gt;"</span>, sanitize(<span class="jxr_string">"Hello <b>World</b>"</span>));
+<a class="jxr_linenumber" name="L3734" href="#L3734">3734</a> assertEquals(<span class="jxr_string">"&lt;img src=&quot;x&quot; onerror=&quot;alert(1)&quot;&gt;"</span>, sanitize(<span class="jxr_string">"<img src=\"x\" onerror=\"alert(1)\">"</span>));
+<a class="jxr_linenumber" name="L3735" href="#L3735">3735</a> }
+<a class="jxr_linenumber" name="L3736" href="#L3736">3736</a>
+<a class="jxr_linenumber" name="L3737" href="#L3737">3737</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3738" href="#L3738">3738</a> <em class="jxr_comment">// similarity(String,String)</em>
+<a class="jxr_linenumber" name="L3739" href="#L3739">3739</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3740" href="#L3740">3740</a> @Test
+<a class="jxr_linenumber" name="L3741" href="#L3741">3741</a> <strong class="jxr_keyword">void</strong> a170_similarity() {
+<a class="jxr_linenumber" name="L3742" href="#L3742">3742</a> assertEquals(1.0, similarity(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"hello"</span>), 0.0001);
+<a class="jxr_linenumber" name="L3743" href="#L3743">3743</a> assertEquals(0.0, similarity(<span class="jxr_string">"abc"</span>, <span class="jxr_string">"xyz"</span>), 0.0001);
+<a class="jxr_linenumber" name="L3744" href="#L3744">3744</a> <em class="jxr_comment">// kitten -> sitting: distance = 3, maxLen = 7, similarity = 1 - 3/7 = 4/7 ≈ 0.571</em>
+<a class="jxr_linenumber" name="L3745" href="#L3745">3745</a> assertEquals(4.0 / 7.0, similarity(<span class="jxr_string">"kitten"</span>, <span class="jxr_string">"sitting"</span>), 0.01);
+<a class="jxr_linenumber" name="L3746" href="#L3746">3746</a> assertEquals(1.0, similarity(<span class="jxr_string">""</span>, <span class="jxr_string">""</span>), 0.0001);
+<a class="jxr_linenumber" name="L3747" href="#L3747">3747</a> assertEquals(0.0, similarity(<span class="jxr_string">"abc"</span>, <span class="jxr_string">""</span>), 0.0001);
+<a class="jxr_linenumber" name="L3748" href="#L3748">3748</a> assertEquals(0.0, similarity(<span class="jxr_string">""</span>, <span class="jxr_string">"abc"</span>), 0.0001);
+<a class="jxr_linenumber" name="L3749" href="#L3749">3749</a> <em class="jxr_comment">// Null handling</em>
+<a class="jxr_linenumber" name="L3750" href="#L3750">3750</a> assertEquals(1.0, similarity(<strong class="jxr_keyword">null</strong>, <strong class="jxr_keyword">null</strong>), 0.0001);
+<a class="jxr_linenumber" name="L3751" href="#L3751">3751</a> assertEquals(0.0, similarity(<span class="jxr_string">"hello"</span>, <strong class="jxr_keyword">null</strong>), 0.0001);
+<a class="jxr_linenumber" name="L3752" href="#L3752">3752</a> assertEquals(0.0, similarity(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"hello"</span>), 0.0001);
+<a class="jxr_linenumber" name="L3753" href="#L3753">3753</a> <em class="jxr_comment">// Similar strings</em>
+<a class="jxr_linenumber" name="L3754" href="#L3754">3754</a> <em class="jxr_comment">// "hello" vs "hallo": distance = 1, maxLen = 5, similarity = 1 - 1/5 = 0.8</em>
+<a class="jxr_linenumber" name="L3755" href="#L3755">3755</a> assertEquals(0.8, similarity(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"hallo"</span>), 0.01);
+<a class="jxr_linenumber" name="L3756" href="#L3756">3756</a> }
+<a class="jxr_linenumber" name="L3757" href="#L3757">3757</a>
+<a class="jxr_linenumber" name="L3758" href="#L3758">3758</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3759" href="#L3759">3759</a> <em class="jxr_comment">// snakeCase(String)</em>
+<a class="jxr_linenumber" name="L3760" href="#L3760">3760</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3761" href="#L3761">3761</a> @Test
+<a class="jxr_linenumber" name="L3762" href="#L3762">3762</a> <strong class="jxr_keyword">void</strong> a171_snakeCase() {
+<a class="jxr_linenumber" name="L3763" href="#L3763">3763</a> assertNull(snakeCase(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3764" href="#L3764">3764</a> assertEquals(<span class="jxr_string">""</span>, snakeCase(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L3765" href="#L3765">3765</a> assertEquals(<span class="jxr_string">"hello_world"</span>, snakeCase(<span class="jxr_string">"hello world"</span>));
+<a class="jxr_linenumber" name="L3766" href="#L3766">3766</a> assertEquals(<span class="jxr_string">"hello_world"</span>, snakeCase(<span class="jxr_string">"helloWorld"</span>));
+<a class="jxr_linenumber" name="L3767" href="#L3767">3767</a> assertEquals(<span class="jxr_string">"hello_world"</span>, snakeCase(<span class="jxr_string">"HelloWorld"</span>));
+<a class="jxr_linenumber" name="L3768" href="#L3768">3768</a> assertEquals(<span class="jxr_string">"hello_world"</span>, snakeCase(<span class="jxr_string">"hello-world"</span>));
+<a class="jxr_linenumber" name="L3769" href="#L3769">3769</a> assertEquals(<span class="jxr_string">"hello_world"</span>, snakeCase(<span class="jxr_string">"hello_world"</span>));
+<a class="jxr_linenumber" name="L3770" href="#L3770">3770</a> assertEquals(<span class="jxr_string">"xml_http_request"</span>, snakeCase(<span class="jxr_string">"XMLHttpRequest"</span>));
+<a class="jxr_linenumber" name="L3771" href="#L3771">3771</a> assertEquals(<span class="jxr_string">"hello_world_test"</span>, snakeCase(<span class="jxr_string">"Hello_World-Test"</span>));
+<a class="jxr_linenumber" name="L3772" href="#L3772">3772</a> assertEquals(<span class="jxr_string">"test"</span>, snakeCase(<span class="jxr_string">"test"</span>));
+<a class="jxr_linenumber" name="L3773" href="#L3773">3773</a> assertEquals(<span class="jxr_string">"test"</span>, snakeCase(<span class="jxr_string">"TEST"</span>));
+<a class="jxr_linenumber" name="L3774" href="#L3774">3774</a> assertEquals(<span class="jxr_string">"hello_123_world"</span>, snakeCase(<span class="jxr_string">"hello 123 world"</span>));
+<a class="jxr_linenumber" name="L3775" href="#L3775">3775</a> }
+<a class="jxr_linenumber" name="L3776" href="#L3776">3776</a>
+<a class="jxr_linenumber" name="L3777" href="#L3777">3777</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3778" href="#L3778">3778</a> <em class="jxr_comment">// sort(String[])</em>
+<a class="jxr_linenumber" name="L3779" href="#L3779">3779</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3780" href="#L3780">3780</a> @Test
+<a class="jxr_linenumber" name="L3781" href="#L3781">3781</a> <strong class="jxr_keyword">void</strong> a172_sort() {
+<a class="jxr_linenumber" name="L3782" href="#L3782">3782</a> assertNull(sort(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3783" href="#L3783">3783</a> assertList(sort(a()));
+<a class="jxr_linenumber" name="L3784" href="#L3784">3784</a> assertList(sort(a(<span class="jxr_string">"c"</span>, <span class="jxr_string">"a"</span>, <span class="jxr_string">"b"</span>)), <span class="jxr_string">"a"</span>, <span class="jxr_string">"b"</span>, <span class="jxr_string">"c"</span>);
+<a class="jxr_linenumber" name="L3785" href="#L3785">3785</a> assertList(sort(a(<span class="jxr_string">"zebra"</span>, <span class="jxr_string">"apple"</span>, <span class="jxr_string">"banana"</span>)), <span class="jxr_string">"apple"</span>, <span class="jxr_string">"banana"</span>, <span class="jxr_string">"zebra"</span>);
+<a class="jxr_linenumber" name="L3786" href="#L3786">3786</a> assertList(sort(a(<span class="jxr_string">"3"</span>, <span class="jxr_string">"1"</span>, <span class="jxr_string">"2"</span>)), <span class="jxr_string">"1"</span>, <span class="jxr_string">"2"</span>, <span class="jxr_string">"3"</span>);
+<a class="jxr_linenumber" name="L3787" href="#L3787">3787</a> assertList(sort(a(<span class="jxr_string">"test"</span>)), <span class="jxr_string">"test"</span>);
+<a class="jxr_linenumber" name="L3788" href="#L3788">3788</a> assertList(sort(a(<span class="jxr_string">"Z"</span>, <span class="jxr_string">"a"</span>, <span class="jxr_string">"B"</span>)), <span class="jxr_string">"B"</span>, <span class="jxr_string">"Z"</span>, <span class="jxr_string">"a"</span>);
+<a class="jxr_linenumber" name="L3789" href="#L3789">3789</a> assertList(sort(a(<span class="jxr_string">"foo"</span>, <span class="jxr_string">"bar"</span>, <span class="jxr_string">"baz"</span>)), <span class="jxr_string">"bar"</span>, <span class="jxr_string">"baz"</span>, <span class="jxr_string">"foo"</span>);
+<a class="jxr_linenumber" name="L3790" href="#L3790">3790</a> }
+<a class="jxr_linenumber" name="L3791" href="#L3791">3791</a>
+<a class="jxr_linenumber" name="L3792" href="#L3792">3792</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3793" href="#L3793">3793</a> <em class="jxr_comment">// sortIgnoreCase(String[])</em>
+<a class="jxr_linenumber" name="L3794" href="#L3794">3794</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3795" href="#L3795">3795</a> @Test
+<a class="jxr_linenumber" name="L3796" href="#L3796">3796</a> <strong class="jxr_keyword">void</strong> a173_sortIgnoreCase() {
+<a class="jxr_linenumber" name="L3797" href="#L3797">3797</a> assertNull(sortIgnoreCase(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3798" href="#L3798">3798</a> assertList(sortIgnoreCase(a()));
+<a class="jxr_linenumber" name="L3799" href="#L3799">3799</a> assertList(sortIgnoreCase(a(<span class="jxr_string">"c"</span>, <span class="jxr_string">"a"</span>, <span class="jxr_string">"b"</span>)), <span class="jxr_string">"a"</span>, <span class="jxr_string">"b"</span>, <span class="jxr_string">"c"</span>);
+<a class="jxr_linenumber" name="L3800" href="#L3800">3800</a> assertList(sortIgnoreCase(a(<span class="jxr_string">"Zebra"</span>, <span class="jxr_string">"apple"</span>, <span class="jxr_string">"Banana"</span>)), <span class="jxr_string">"apple"</span>, <span class="jxr_string">"Banana"</span>, <span class="jxr_string">"Zebra"</span>);
+<a class="jxr_linenumber" name="L3801" href="#L3801">3801</a> assertList(sortIgnoreCase(a(<span class="jxr_string">"Z"</span>, <span class="jxr_string">"a"</span>, <span class="jxr_string">"B"</span>)), <span class="jxr_string">"a"</span>, <span class="jxr_string">"B"</span>, <span class="jxr_string">"Z"</span>);
+<a class="jxr_linenumber" name="L3802" href="#L3802">3802</a> assertList(sortIgnoreCase(a(<span class="jxr_string">"test"</span>)), <span class="jxr_string">"test"</span>);
+<a class="jxr_linenumber" name="L3803" href="#L3803">3803</a> assertList(sortIgnoreCase(a(<span class="jxr_string">"FOO"</span>, <span class="jxr_string">"bar"</span>, <span class="jxr_string">"Baz"</span>)), <span class="jxr_string">"bar"</span>, <span class="jxr_string">"Baz"</span>, <span class="jxr_string">"FOO"</span>);
+<a class="jxr_linenumber" name="L3804" href="#L3804">3804</a> assertList(sortIgnoreCase(a(<span class="jxr_string">"zebra"</span>, <span class="jxr_string">"APPLE"</span>, <span class="jxr_string">"banana"</span>)), <span class="jxr_string">"APPLE"</span>, <span class="jxr_string">"banana"</span>, <span class="jxr_string">"zebra"</span>);
+<a class="jxr_linenumber" name="L3805" href="#L3805">3805</a> }
<a class="jxr_linenumber" name="L3806" href="#L3806">3806</a>
-<a class="jxr_linenumber" name="L3807" href="#L3807">3807</a> <strong class="jxr_keyword">var</strong> code2 = soundex(<span class="jxr_string">"Smythe"</span>);
-<a class="jxr_linenumber" name="L3808" href="#L3808">3808</a> assertNotNull(code2);
-<a class="jxr_linenumber" name="L3809" href="#L3809">3809</a> <em class="jxr_comment">// Smith and Smythe should have similar codes</em>
-<a class="jxr_linenumber" name="L3810" href="#L3810">3810</a> assertEquals(code1.charAt(0), code2.charAt(0));
-<a class="jxr_linenumber" name="L3811" href="#L3811">3811</a>
-<a class="jxr_linenumber" name="L3812" href="#L3812">3812</a> <em class="jxr_comment">// Null/empty input</em>
-<a class="jxr_linenumber" name="L3813" href="#L3813">3813</a> assertNull(soundex(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3814" href="#L3814">3814</a> assertNull(soundex(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L3815" href="#L3815">3815</a>
-<a class="jxr_linenumber" name="L3816" href="#L3816">3816</a> <em class="jxr_comment">// Single character</em>
-<a class="jxr_linenumber" name="L3817" href="#L3817">3817</a> <strong class="jxr_keyword">var</strong> code3 = soundex(<span class="jxr_string">"A"</span>);
-<a class="jxr_linenumber" name="L3818" href="#L3818">3818</a> assertNotNull(code3);
-<a class="jxr_linenumber" name="L3819" href="#L3819">3819</a> assertEquals(4, code3.length());
-<a class="jxr_linenumber" name="L3820" href="#L3820">3820</a> assertTrue(code3.startsWith(<span class="jxr_string">"A"</span>));
-<a class="jxr_linenumber" name="L3821" href="#L3821">3821</a> }
+<a class="jxr_linenumber" name="L3807" href="#L3807">3807</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3808" href="#L3808">3808</a> <em class="jxr_comment">// soundex(String)</em>
+<a class="jxr_linenumber" name="L3809" href="#L3809">3809</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3810" href="#L3810">3810</a> @Test
+<a class="jxr_linenumber" name="L3811" href="#L3811">3811</a> <strong class="jxr_keyword">void</strong> a174_soundex() {
+<a class="jxr_linenumber" name="L3812" href="#L3812">3812</a> <em class="jxr_comment">// Basic soundex examples</em>
+<a class="jxr_linenumber" name="L3813" href="#L3813">3813</a> <strong class="jxr_keyword">var</strong> code1 = soundex(<span class="jxr_string">"Smith"</span>);
+<a class="jxr_linenumber" name="L3814" href="#L3814">3814</a> assertNotNull(code1);
+<a class="jxr_linenumber" name="L3815" href="#L3815">3815</a> assertEquals(4, code1.length());
+<a class="jxr_linenumber" name="L3816" href="#L3816">3816</a> assertTrue(code1.matches(<span class="jxr_string">"[A-Z]\\d{3}"</span>));
+<a class="jxr_linenumber" name="L3817" href="#L3817">3817</a>
+<a class="jxr_linenumber" name="L3818" href="#L3818">3818</a> <strong class="jxr_keyword">var</strong> code2 = soundex(<span class="jxr_string">"Smythe"</span>);
+<a class="jxr_linenumber" name="L3819" href="#L3819">3819</a> assertNotNull(code2);
+<a class="jxr_linenumber" name="L3820" href="#L3820">3820</a> <em class="jxr_comment">// Smith and Smythe should have similar codes</em>
+<a class="jxr_linenumber" name="L3821" href="#L3821">3821</a> assertEquals(code1.charAt(0), code2.charAt(0));
<a class="jxr_linenumber" name="L3822" href="#L3822">3822</a>
-<a class="jxr_linenumber" name="L3823" href="#L3823">3823</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3824" href="#L3824">3824</a> <em class="jxr_comment">// split(...) - All variants</em>
-<a class="jxr_linenumber" name="L3825" href="#L3825">3825</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3826" href="#L3826">3826</a> @Test
-<a class="jxr_linenumber" name="L3827" href="#L3827">3827</a> <strong class="jxr_keyword">void</strong> a175_split() {
-<a class="jxr_linenumber" name="L3828" href="#L3828">3828</a> <em class="jxr_comment">// split(String) - splits on comma</em>
-<a class="jxr_linenumber" name="L3829" href="#L3829">3829</a> assertEquals(Collections.emptyList(), split(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3830" href="#L3830">3830</a> assertTrue(split(<span class="jxr_string">""</span>).isEmpty());
-<a class="jxr_linenumber" name="L3831" href="#L3831">3831</a> assertEquals(List.of(<span class="jxr_string">"1"</span>), split(<span class="jxr_string">"1"</span>));
-<a class="jxr_linenumber" name="L3832" href="#L3832">3832</a> assertEquals(List.of(<span class="jxr_string">"1"</span>, <span class="jxr_string">"2"</span>), split(<span class="jxr_string">"1,2"</span>));
+<a class="jxr_linenumber" name="L3823" href="#L3823">3823</a> <em class="jxr_comment">// Null/empty input</em>
+<a class="jxr_linenumber" name="L3824" href="#L3824">3824</a> assertNull(soundex(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3825" href="#L3825">3825</a> assertNull(soundex(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L3826" href="#L3826">3826</a>
+<a class="jxr_linenumber" name="L3827" href="#L3827">3827</a> <em class="jxr_comment">// Single character</em>
+<a class="jxr_linenumber" name="L3828" href="#L3828">3828</a> <strong class="jxr_keyword">var</strong> code3 = soundex(<span class="jxr_string">"A"</span>);
+<a class="jxr_linenumber" name="L3829" href="#L3829">3829</a> assertNotNull(code3);
+<a class="jxr_linenumber" name="L3830" href="#L3830">3830</a> assertEquals(4, code3.length());
+<a class="jxr_linenumber" name="L3831" href="#L3831">3831</a> assertTrue(code3.startsWith(<span class="jxr_string">"A"</span>));
+<a class="jxr_linenumber" name="L3832" href="#L3832">3832</a> }
<a class="jxr_linenumber" name="L3833" href="#L3833">3833</a>
-<a class="jxr_linenumber" name="L3834" href="#L3834">3834</a> <em class="jxr_comment">// split(String,char) - with escaping</em>
-<a class="jxr_linenumber" name="L3835" href="#L3835">3835</a> assertNull(split(<strong class="jxr_keyword">null</strong>, ','));
-<a class="jxr_linenumber" name="L3836" href="#L3836">3836</a> assertTrue(split(<span class="jxr_string">""</span>, ',').isEmpty());
-<a class="jxr_linenumber" name="L3837" href="#L3837">3837</a> assertEquals(List.of(<span class="jxr_string">"1"</span>), split(<span class="jxr_string">"1"</span>, ','));
-<a class="jxr_linenumber" name="L3838" href="#L3838">3838</a> assertEquals(List.of(<span class="jxr_string">"1"</span>, <span class="jxr_string">"2"</span>), split(<span class="jxr_string">"1,2"</span>, ','));
-<a class="jxr_linenumber" name="L3839" href="#L3839">3839</a> assertEquals(List.of(<span class="jxr_string">"1,2"</span>), split(<span class="jxr_string">"1\\,2"</span>, ','));
-<a class="jxr_linenumber" name="L3840" href="#L3840">3840</a> assertEquals(List.of(<span class="jxr_string">"1\\"</span>, <span class="jxr_string">"2"</span>), split(<span class="jxr_string">"1\\\\,2"</span>, ','));
-<a class="jxr_linenumber" name="L3841" href="#L3841">3841</a> assertEquals(List.of(<span class="jxr_string">"1\\,2"</span>), split(<span class="jxr_string">"1\\\\\\,2"</span>, ','));
-<a class="jxr_linenumber" name="L3842" href="#L3842">3842</a> assertEquals(List.of(<span class="jxr_string">"1"</span>, <span class="jxr_string">"2\\"</span>), split(<span class="jxr_string">"1,2\\"</span>, ','));
-<a class="jxr_linenumber" name="L3843" href="#L3843">3843</a> assertEquals(List.of(<span class="jxr_string">"1"</span>, <span class="jxr_string">"2\\"</span>), split(<span class="jxr_string">"1,2\\\\"</span>, ','));
-<a class="jxr_linenumber" name="L3844" href="#L3844">3844</a> assertEquals(List.of(<span class="jxr_string">"1"</span>, <span class="jxr_string">"2,"</span>), split(<span class="jxr_string">"1,2\\,"</span>, ','));
-<a class="jxr_linenumber" name="L3845" href="#L3845">3845</a> assertEquals(List.of(<span class="jxr_string">"1"</span>, <span class="jxr_string">"2\\"</span>, <span class="jxr_string">""</span>), split(<span class="jxr_string">"1,2\\\\,"</span>, ','));
-<a class="jxr_linenumber" name="L3846" href="#L3846">3846</a>
-<a class="jxr_linenumber" name="L3847" href="#L3847">3847</a> <em class="jxr_comment">// split(String,char,int) - with limit</em>
-<a class="jxr_linenumber" name="L3848" href="#L3848">3848</a> assertEquals(List.of(<span class="jxr_string">"boo"</span>, <span class="jxr_string">"and"</span>, <span class="jxr_string">"foo"</span>), split(<span class="jxr_string">"boo:and:foo"</span>, ':', 10));
-<a class="jxr_linenumber" name="L3849" href="#L3849">3849</a> assertEquals(List.of(<span class="jxr_string">"boo"</span>, <span class="jxr_string">"and:foo"</span>), split(<span class="jxr_string">"boo:and:foo"</span>, ':', 2));
-<a class="jxr_linenumber" name="L3850" href="#L3850">3850</a> assertEquals(List.of(<span class="jxr_string">"boo:and:foo"</span>), split(<span class="jxr_string">"boo:and:foo"</span>, ':', 1));
-<a class="jxr_linenumber" name="L3851" href="#L3851">3851</a> assertEquals(List.of(<span class="jxr_string">"boo:and:foo"</span>), split(<span class="jxr_string">"boo:and:foo"</span>, ':', 0));
-<a class="jxr_linenumber" name="L3852" href="#L3852">3852</a> assertEquals(List.of(<span class="jxr_string">"boo:and:foo"</span>), split(<span class="jxr_string">"boo:and:foo"</span>, ':', -1));
-<a class="jxr_linenumber" name="L3853" href="#L3853">3853</a> assertEquals(List.of(<span class="jxr_string">"boo"</span>, <span class="jxr_string">"and"</span>, <span class="jxr_string">"foo"</span>), split(<span class="jxr_string">"boo : and : foo"</span>, ':', 10));
-<a class="jxr_linenumber" name="L3854" href="#L3854">3854</a> assertEquals(List.of(<span class="jxr_string">"boo"</span>, <span class="jxr_string">"and : foo"</span>), split(<span class="jxr_string">"boo : and : foo"</span>, ':', 2));
-<a class="jxr_linenumber" name="L3855" href="#L3855">3855</a>
-<a class="jxr_linenumber" name="L3856" href="#L3856">3856</a> <em class="jxr_comment">// split(String,Consumer<String>) - consumer version</em>
-<a class="jxr_linenumber" name="L3857" href="#L3857">3857</a> <strong class="jxr_keyword">var</strong> list1 = <strong class="jxr_keyword">new</strong> ArrayList<String>();
-<a class="jxr_linenumber" name="L3858" href="#L3858">3858</a> split(<strong class="jxr_keyword">null</strong>, list1::add);
-<a class="jxr_linenumber" name="L3859" href="#L3859">3859</a> assertTrue(list1.isEmpty());
-<a class="jxr_linenumber" name="L3860" href="#L3860">3860</a>
-<a class="jxr_linenumber" name="L3861" href="#L3861">3861</a> <strong class="jxr_keyword">var</strong> list2 = <strong class="jxr_keyword">new</strong> ArrayList<String>();
-<a class="jxr_linenumber" name="L3862" href="#L3862">3862</a> split(<span class="jxr_string">""</span>, list2::add);
-<a class="jxr_linenumber" name="L3863" href="#L3863">3863</a> assertTrue(list2.isEmpty());
-<a class="jxr_linenumber" name="L3864" href="#L3864">3864</a>
-<a class="jxr_linenumber" name="L3865" href="#L3865">3865</a> <strong class="jxr_keyword">var</strong> list3 = <strong class="jxr_keyword">new</strong> ArrayList<String>();
-<a class="jxr_linenumber" name="L3866" href="#L3866">3866</a> split(<span class="jxr_string">"1,2"</span>, list3::add);
-<a class="jxr_linenumber" name="L3867" href="#L3867">3867</a> assertEquals(List.of(<span class="jxr_string">"1"</span>, <span class="jxr_string">"2"</span>), list3);
-<a class="jxr_linenumber" name="L3868" href="#L3868">3868</a>
-<a class="jxr_linenumber" name="L3869" href="#L3869">3869</a> <em class="jxr_comment">// splita(String) - returns String[]</em>
-<a class="jxr_linenumber" name="L3870" href="#L3870">3870</a> assertNull(splita((String)<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3871" href="#L3871">3871</a> assertArrayEquals(<strong class="jxr_keyword">new</strong> String[0], splita(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L3872" href="#L3872">3872</a> assertArrayEquals(<strong class="jxr_keyword">new</strong> String[] { <span class="jxr_string">"1"</span> }, splita(<span class="jxr_string">"1"</span>));
-<a class="jxr_linenumber" name="L3873" href="#L3873">3873</a> assertArrayEquals(<strong class="jxr_keyword">new</strong> String[] { <span class="jxr_string">"1"</span>, <span class="jxr_string">"2"</span> }, splita(<span class="jxr_string">"1,2"</span>));
-<a class="jxr_linenumber" name="L3874" href="#L3874">3874</a>
-<a class="jxr_linenumber" name="L3875" href="#L3875">3875</a> <em class="jxr_comment">// splita(String,char)</em>
-<a class="jxr_linenumber" name="L3876" href="#L3876">3876</a> assertNull(splita((String)<strong class="jxr_keyword">null</strong>, ','));
-<a class="jxr_linenumber" name="L3877" href="#L3877">3877</a> assertArrayEquals(<strong class="jxr_keyword">new</strong> String[0], splita(<span class="jxr_string">""</span>, ','));
-<a class="jxr_linenumber" name="L3878" href="#L3878">3878</a> assertArrayEquals(<strong class="jxr_keyword">new</strong> String[] { <span class="jxr_string">"1"</span> }, splita(<span class="jxr_string">"1"</span>, ','));
-<a class="jxr_linenumber" name="L3879" href="#L3879">3879</a> assertArrayEquals(<strong class="jxr_keyword">new</strong> String[] { <span class="jxr_string">"1"</span>, <span class="jxr_string">"2"</span> }, splita(<span class="jxr_string">"1,2"</span>, ','));
-<a class="jxr_linenumber" name="L3880" href="#L3880">3880</a>
-<a class="jxr_linenumber" name="L3881" href="#L3881">3881</a> <em class="jxr_comment">// splita(String,char,int) - with limit</em>
-<a class="jxr_linenumber" name="L3882" href="#L3882">3882</a> assertArrayEquals(<strong class="jxr_keyword">new</strong> String[] { <span class="jxr_string">"boo"</span>, <span class="jxr_string">"and"</span>, <span class="jxr_string">"foo"</span> }, splita(<span class="jxr_string">"boo:and:foo"</span>, ':', 10));
-<a class="jxr_linenumber" name="L3883" href="#L3883">3883</a> assertArrayEquals(<strong class="jxr_keyword">new</strong> String[] { <span class="jxr_string">"boo"</span>, <span class="jxr_string">"and:foo"</span> }, splita(<span class="jxr_string">"boo:and:foo"</span>, ':', 2));
-<a class="jxr_linenumber" name="L3884" href="#L3884">3884</a> assertArrayEquals(<strong class="jxr_keyword">new</strong> String[] { <span class="jxr_string">"boo:and:foo"</span> }, splita(<span class="jxr_string">"boo:and:foo"</span>, ':', 1));
-<a class="jxr_linenumber" name="L3885" href="#L3885">3885</a> }
-<a class="jxr_linenumber" name="L3886" href="#L3886">3886</a>
-<a class="jxr_linenumber" name="L3887" href="#L3887">3887</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3888" href="#L3888">3888</a> <em class="jxr_comment">// splitMap(String,boolean)</em>
-<a class="jxr_linenumber" name="L3889" href="#L3889">3889</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3890" href="#L3890">3890</a> @Test
-<a class="jxr_linenumber" name="L3891" href="#L3891">3891</a> <strong class="jxr_keyword">void</strong> a176_splitMap() {
-<a class="jxr_linenumber" name="L3892" href="#L3892">3892</a> assertString(<span class="jxr_string">"{a=1}"</span>, splitMap(<span class="jxr_string">"a=1"</span>, <strong class="jxr_keyword">true</strong>));
-<a class="jxr_linenumber" name="L3893" href="#L3893">3893</a> assertString(<span class="jxr_string">"{a=1,b=2}"</span>, splitMap(<span class="jxr_string">"a=1,b=2"</span>, <strong class="jxr_keyword">true</strong>));
-<a class="jxr_linenumber" name="L3894" href="#L3894">3894</a> assertString(<span class="jxr_string">"{a=1,b=2}"</span>, splitMap(<span class="jxr_string">" a = 1 , b = 2 "</span>, <strong class="jxr_keyword">true</strong>));
-<a class="jxr_linenumber" name="L3895" href="#L3895">3895</a> assertString(<span class="jxr_string">"{ a = 1 , b = 2 }"</span>, splitMap(<span class="jxr_string">" a = 1 , b = 2 "</span>, false));
-<a class="jxr_linenumber" name="L3896" href="#L3896">3896</a> assertString(<span class="jxr_string">"{a=}"</span>, splitMap(<span class="jxr_string">"a"</span>, <strong class="jxr_keyword">true</strong>));
-<a class="jxr_linenumber" name="L3897" href="#L3897">3897</a> assertString(<span class="jxr_string">"{a=,b=}"</span>, splitMap(<span class="jxr_string">"a,b"</span>, <strong class="jxr_keyword">true</strong>));
-<a class="jxr_linenumber" name="L3898" href="#L3898">3898</a> assertString(<span class="jxr_string">"{a=1,b=}"</span>, splitMap(<span class="jxr_string">"a=1,b"</span>, <strong class="jxr_keyword">true</strong>));
-<a class="jxr_linenumber" name="L3899" href="#L3899">3899</a> assertString(<span class="jxr_string">"{a=,b=1}"</span>, splitMap(<span class="jxr_string">"a,b=1"</span>, <strong class="jxr_keyword">true</strong>));
-<a class="jxr_linenumber" name="L3900" href="#L3900">3900</a> assertString(<span class="jxr_string">"{a==1}"</span>, splitMap(<span class="jxr_string">"a\\==1"</span>, <strong class="jxr_keyword">true</strong>));
-<a class="jxr_linenumber" name="L3901" href="#L3901">3901</a> assertString(<span class="jxr_string">"{a\\=1}"</span>, splitMap(<span class="jxr_string">"a\\\\=1"</span>, <strong class="jxr_keyword">true</strong>));
-<a class="jxr_linenumber" name="L3902" href="#L3902">3902</a> }
-<a class="jxr_linenumber" name="L3903" href="#L3903">3903</a>
-<a class="jxr_linenumber" name="L3904" href="#L3904">3904</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3905" href="#L3905">3905</a> <em class="jxr_comment">// splitMethodArgs(String)</em>
-<a class="jxr_linenumber" name="L3906" href="#L3906">3906</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3907" href="#L3907">3907</a> @Test
-<a class="jxr_linenumber" name="L3908" href="#L3908">3908</a> <strong class="jxr_keyword">void</strong> a177_splitMethodArgs() {
-<a class="jxr_linenumber" name="L3909" href="#L3909">3909</a> <em class="jxr_comment">// Basic method argument splitting</em>
-<a class="jxr_linenumber" name="L3910" href="#L3910">3910</a> <strong class="jxr_keyword">var</strong> args1 = splitMethodArgs(<span class="jxr_string">"a,b,c"</span>);
-<a class="jxr_linenumber" name="L3911" href="#L3911">3911</a> assertEquals(3, args1.length);
-<a class="jxr_linenumber" name="L3912" href="#L3912">3912</a> assertEquals(<span class="jxr_string">"a"</span>, args1[0]);
-<a class="jxr_linenumber" name="L3913" href="#L3913">3913</a> assertEquals(<span class="jxr_string">"b"</span>, args1[1]);
-<a class="jxr_linenumber" name="L3914" href="#L3914">3914</a> assertEquals(<span class="jxr_string">"c"</span>, args1[2]);
-<a class="jxr_linenumber" name="L3915" href="#L3915">3915</a>
-<a class="jxr_linenumber" name="L3916" href="#L3916">3916</a> <em class="jxr_comment">// With nested angle brackets</em>
-<a class="jxr_linenumber" name="L3917" href="#L3917">3917</a> <strong class="jxr_keyword">var</strong> args2 = splitMethodArgs(<span class="jxr_string">"x,y<a,b>,z"</span>);
-<a class="jxr_linenumber" name="L3918" href="#L3918">3918</a> assertEquals(3, args2.length);
-<a class="jxr_linenumber" name="L3919" href="#L3919">3919</a> assertEquals(<span class="jxr_string">"x"</span>, args2[0]);
-<a class="jxr_linenumber" name="L3920" href="#L3920">3920</a> assertEquals(<span class="jxr_string">"y<a,b>"</span>, args2[1]);
-<a class="jxr_linenumber" name="L3921" href="#L3921">3921</a> assertEquals(<span class="jxr_string">"z"</span>, args2[2]);
-<a class="jxr_linenumber" name="L3922" href="#L3922">3922</a>
-<a class="jxr_linenumber" name="L3923" href="#L3923">3923</a> <em class="jxr_comment">// With deeply nested</em>
-<a class="jxr_linenumber" name="L3924" href="#L3924">3924</a> <strong class="jxr_keyword">var</strong> args3 = splitMethodArgs(<span class="jxr_string">"x,y<a<b,c>,d<e,f>>,z"</span>);
-<a class="jxr_linenumber" name="L3925" href="#L3925">3925</a> assertEquals(3, args3.length);
-<a class="jxr_linenumber" name="L3926" href="#L3926">3926</a> assertEquals(<span class="jxr_string">"x"</span>, args3[0]);
-<a class="jxr_linenumber" name="L3927" href="#L3927">3927</a> assertEquals(<span class="jxr_string">"y<a<b,c>,d<e,f>>"</span>, args3[1]);
-<a class="jxr_linenumber" name="L3928" href="#L3928">3928</a> assertEquals(<span class="jxr_string">"z"</span>, args3[2]);
-<a class="jxr_linenumber" name="L3929" href="#L3929">3929</a>
-<a class="jxr_linenumber" name="L3930" href="#L3930">3930</a> <em class="jxr_comment">// Null/empty input</em>
-<a class="jxr_linenumber" name="L3931" href="#L3931">3931</a> assertNull(splitMethodArgs(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3932" href="#L3932">3932</a> assertArrayEquals(<strong class="jxr_keyword">new</strong> String[0], splitMethodArgs(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L3933" href="#L3933">3933</a> }
-<a class="jxr_linenumber" name="L3934" href="#L3934">3934</a>
-<a class="jxr_linenumber" name="L3935" href="#L3935">3935</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3936" href="#L3936">3936</a> <em class="jxr_comment">// splitNested(String)</em>
-<a class="jxr_linenumber" name="L3937" href="#L3937">3937</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3938" href="#L3938">3938</a> @Test
-<a class="jxr_linenumber" name="L3939" href="#L3939">3939</a> <strong class="jxr_keyword">void</strong> a178_splitNested() {
-<a class="jxr_linenumber" name="L3940" href="#L3940">3940</a> <em class="jxr_comment">// Basic nested splitting (uses curly braces)</em>
-<a class="jxr_linenumber" name="L3941" href="#L3941">3941</a> <strong class="jxr_keyword">var</strong> result1 = splitNested(<span class="jxr_string">"a,b,c"</span>);
-<a class="jxr_linenumber" name="L3942" href="#L3942">3942</a> assertEquals(3, result1.size());
-<a class="jxr_linenumber" name="L3943" href="#L3943">3943</a> assertEquals(<span class="jxr_string">"a"</span>, result1.get(0));
-<a class="jxr_linenumber" name="L3944" href="#L3944">3944</a> assertEquals(<span class="jxr_string">"b"</span>, result1.get(1));
-<a class="jxr_linenumber" name="L3945" href="#L3945">3945</a> assertEquals(<span class="jxr_string">"c"</span>, result1.get(2));
-<a class="jxr_linenumber" name="L3946" href="#L3946">3946</a>
-<a class="jxr_linenumber" name="L3947" href="#L3947">3947</a> <em class="jxr_comment">// With nested curly braces</em>
-<a class="jxr_linenumber" name="L3948" href="#L3948">3948</a> <strong class="jxr_keyword">var</strong> result2 = splitNested(<span class="jxr_string">"a{b,c},d"</span>);
-<a class="jxr_linenumber" name="L3949" href="#L3949">3949</a> assertEquals(2, result2.size());
-<a class="jxr_linenumber" name="L3950" href="#L3950">3950</a> assertEquals(<span class="jxr_string">"a{b,c}"</span>, result2.get(0));
-<a class="jxr_linenumber" name="L3951" href="#L3951">3951</a> assertEquals(<span class="jxr_string">"d"</span>, result2.get(1));
-<a class="jxr_linenumber" name="L3952" href="#L3952">3952</a>
-<a class="jxr_linenumber" name="L3953" href="#L3953">3953</a> <em class="jxr_comment">// With deeply nested</em>
-<a class="jxr_linenumber" name="L3954" href="#L3954">3954</a> <strong class="jxr_keyword">var</strong> result3 = splitNested(<span class="jxr_string">"a,b{c,d{e,f}}"</span>);
-<a class="jxr_linenumber" name="L3955" href="#L3955">3955</a> assertEquals(2, result3.size());
-<a class="jxr_linenumber" name="L3956" href="#L3956">3956</a> assertEquals(<span class="jxr_string">"a"</span>, result3.get(0));
-<a class="jxr_linenumber" name="L3957" href="#L3957">3957</a> assertEquals(<span class="jxr_string">"b{c,d{e,f}}"</span>, result3.get(1));
-<a class="jxr_linenumber" name="L3958" href="#L3958">3958</a>
-<a class="jxr_linenumber" name="L3959" href="#L3959">3959</a> <em class="jxr_comment">// Null/empty input</em>
-<a class="jxr_linenumber" name="L3960" href="#L3960">3960</a> assertNull(splitNested(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3961" href="#L3961">3961</a> assertTrue(splitNested(<span class="jxr_string">""</span>).isEmpty());
-<a class="jxr_linenumber" name="L3962" href="#L3962">3962</a> }
+<a class="jxr_linenumber" name="L3834" href="#L3834">3834</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3835" href="#L3835">3835</a> <em class="jxr_comment">// split(...) - All variants</em>
+<a class="jxr_linenumber" name="L3836" href="#L3836">3836</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3837" href="#L3837">3837</a> @Test
+<a class="jxr_linenumber" name="L3838" href="#L3838">3838</a> <strong class="jxr_keyword">void</strong> a175_split() {
+<a class="jxr_linenumber" name="L3839" href="#L3839">3839</a> <em class="jxr_comment">// split(String) - splits on comma</em>
+<a class="jxr_linenumber" name="L3840" href="#L3840">3840</a> assertEquals(Collections.emptyList(), split(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3841" href="#L3841">3841</a> assertTrue(split(<span class="jxr_string">""</span>).isEmpty());
+<a class="jxr_linenumber" name="L3842" href="#L3842">3842</a> assertEquals(List.of(<span class="jxr_string">"1"</span>), split(<span class="jxr_string">"1"</span>));
+<a class="jxr_linenumber" name="L3843" href="#L3843">3843</a> assertEquals(List.of(<span class="jxr_string">"1"</span>, <span class="jxr_string">"2"</span>), split(<span class="jxr_string">"1,2"</span>));
+<a class="jxr_linenumber" name="L3844" href="#L3844">3844</a>
+<a class="jxr_linenumber" name="L3845" href="#L3845">3845</a> <em class="jxr_comment">// split(String,char) - with escaping</em>
+<a class="jxr_linenumber" name="L3846" href="#L3846">3846</a> assertNull(split(<strong class="jxr_keyword">null</strong>, ','));
+<a class="jxr_linenumber" name="L3847" href="#L3847">3847</a> assertTrue(split(<span class="jxr_string">""</span>, ',').isEmpty());
+<a class="jxr_linenumber" name="L3848" href="#L3848">3848</a> assertEquals(List.of(<span class="jxr_string">"1"</span>), split(<span class="jxr_string">"1"</span>, ','));
+<a class="jxr_linenumber" name="L3849" href="#L3849">3849</a> assertEquals(List.of(<span class="jxr_string">"1"</span>, <span class="jxr_string">"2"</span>), split(<span class="jxr_string">"1,2"</span>, ','));
+<a class="jxr_linenumber" name="L3850" href="#L3850">3850</a> assertEquals(List.of(<span class="jxr_string">"1,2"</span>), split(<span class="jxr_string">"1\\,2"</span>, ','));
+<a class="jxr_linenumber" name="L3851" href="#L3851">3851</a> assertEquals(List.of(<span class="jxr_string">"1\\"</span>, <span class="jxr_string">"2"</span>), split(<span class="jxr_string">"1\\\\,2"</span>, ','));
+<a class="jxr_linenumber" name="L3852" href="#L3852">3852</a> assertEquals(List.of(<span class="jxr_string">"1\\,2"</span>), split(<span class="jxr_string">"1\\\\\\,2"</span>, ','));
+<a class="jxr_linenumber" name="L3853" href="#L3853">3853</a> assertEquals(List.of(<span class="jxr_string">"1"</span>, <span class="jxr_string">"2\\"</span>), split(<span class="jxr_string">"1,2\\"</span>, ','));
+<a class="jxr_linenumber" name="L3854" href="#L3854">3854</a> assertEquals(List.of(<span class="jxr_string">"1"</span>, <span class="jxr_string">"2\\"</span>), split(<span class="jxr_string">"1,2\\\\"</span>, ','));
+<a class="jxr_linenumber" name="L3855" href="#L3855">3855</a> assertEquals(List.of(<span class="jxr_string">"1"</span>, <span class="jxr_string">"2,"</span>), split(<span class="jxr_string">"1,2\\,"</span>, ','));
+<a class="jxr_linenumber" name="L3856" href="#L3856">3856</a> assertEquals(List.of(<span class="jxr_string">"1"</span>, <span class="jxr_string">"2\\"</span>, <span class="jxr_string">""</span>), split(<span class="jxr_string">"1,2\\\\,"</span>, ','));
+<a class="jxr_linenumber" name="L3857" href="#L3857">3857</a>
+<a class="jxr_linenumber" name="L3858" href="#L3858">3858</a> <em class="jxr_comment">// split(String,char,int) - with limit</em>
+<a class="jxr_linenumber" name="L3859" href="#L3859">3859</a> assertEquals(List.of(<span class="jxr_string">"boo"</span>, <span class="jxr_string">"and"</span>, <span class="jxr_string">"foo"</span>), split(<span class="jxr_string">"boo:and:foo"</span>, ':', 10));
+<a class="jxr_linenumber" name="L3860" href="#L3860">3860</a> assertEquals(List.of(<span class="jxr_string">"boo"</span>, <span class="jxr_string">"and:foo"</span>), split(<span class="jxr_string">"boo:and:foo"</span>, ':', 2));
+<a class="jxr_linenumber" name="L3861" href="#L3861">3861</a> assertEquals(List.of(<span class="jxr_string">"boo:and:foo"</span>), split(<span class="jxr_string">"boo:and:foo"</span>, ':', 1));
+<a class="jxr_linenumber" name="L3862" href="#L3862">3862</a> assertEquals(List.of(<span class="jxr_string">"boo:and:foo"</span>), split(<span class="jxr_string">"boo:and:foo"</span>, ':', 0));
+<a class="jxr_linenumber" name="L3863" href="#L3863">3863</a> assertEquals(List.of(<span class="jxr_string">"boo:and:foo"</span>), split(<span class="jxr_string">"boo:and:foo"</span>, ':', -1));
+<a class="jxr_linenumber" name="L3864" href="#L3864">3864</a> assertEquals(List.of(<span class="jxr_string">"boo"</span>, <span class="jxr_string">"and"</span>, <span class="jxr_string">"foo"</span>), split(<span class="jxr_string">"boo : and : foo"</span>, ':', 10));
+<a class="jxr_linenumber" name="L3865" href="#L3865">3865</a> assertEquals(List.of(<span class="jxr_string">"boo"</span>, <span class="jxr_string">"and : foo"</span>), split(<span class="jxr_string">"boo : and : foo"</span>, ':', 2));
+<a class="jxr_linenumber" name="L3866" href="#L3866">3866</a>
+<a class="jxr_linenumber" name="L3867" href="#L3867">3867</a> <em class="jxr_comment">// split(String,Consumer<String>) - consumer version</em>
+<a class="jxr_linenumber" name="L3868" href="#L3868">3868</a> <strong class="jxr_keyword">var</strong> list1 = <strong class="jxr_keyword">new</strong> ArrayList<String>();
+<a class="jxr_linenumber" name="L3869" href="#L3869">3869</a> split(<strong class="jxr_keyword">null</strong>, list1::add);
+<a class="jxr_linenumber" name="L3870" href="#L3870">3870</a> assertTrue(list1.isEmpty());
+<a class="jxr_linenumber" name="L3871" href="#L3871">3871</a>
+<a class="jxr_linenumber" name="L3872" href="#L3872">3872</a> <strong class="jxr_keyword">var</strong> list2 = <strong class="jxr_keyword">new</strong> ArrayList<String>();
+<a class="jxr_linenumber" name="L3873" href="#L3873">3873</a> split(<span class="jxr_string">""</span>, list2::add);
+<a class="jxr_linenumber" name="L3874" href="#L3874">3874</a> assertTrue(list2.isEmpty());
+<a class="jxr_linenumber" name="L3875" href="#L3875">3875</a>
+<a class="jxr_linenumber" name="L3876" href="#L3876">3876</a> <strong class="jxr_keyword">var</strong> list3 = <strong class="jxr_keyword">new</strong> ArrayList<String>();
+<a class="jxr_linenumber" name="L3877" href="#L3877">3877</a> split(<span class="jxr_string">"1,2"</span>, list3::add);
+<a class="jxr_linenumber" name="L3878" href="#L3878">3878</a> assertEquals(List.of(<span class="jxr_string">"1"</span>, <span class="jxr_string">"2"</span>), list3);
+<a class="jxr_linenumber" name="L3879" href="#L3879">3879</a>
+<a class="jxr_linenumber" name="L3880" href="#L3880">3880</a> <em class="jxr_comment">// splita(String) - returns String[]</em>
+<a class="jxr_linenumber" name="L3881" href="#L3881">3881</a> assertNull(splita((String)<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3882" href="#L3882">3882</a> assertArrayEquals(<strong class="jxr_keyword">new</strong> String[0], splita(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L3883" href="#L3883">3883</a> assertArrayEquals(<strong class="jxr_keyword">new</strong> String[] { <span class="jxr_string">"1"</span> }, splita(<span class="jxr_string">"1"</span>));
+<a class="jxr_linenumber" name="L3884" href="#L3884">3884</a> assertArrayEquals(<strong class="jxr_keyword">new</strong> String[] { <span class="jxr_string">"1"</span>, <span class="jxr_string">"2"</span> }, splita(<span class="jxr_string">"1,2"</span>));
+<a class="jxr_linenumber" name="L3885" href="#L3885">3885</a>
+<a class="jxr_linenumber" name="L3886" href="#L3886">3886</a> <em class="jxr_comment">// splita(String,char)</em>
+<a class="jxr_linenumber" name="L3887" href="#L3887">3887</a> assertNull(splita((String)<strong class="jxr_keyword">null</strong>, ','));
+<a class="jxr_linenumber" name="L3888" href="#L3888">3888</a> assertArrayEquals(<strong class="jxr_keyword">new</strong> String[0], splita(<span class="jxr_string">""</span>, ','));
+<a class="jxr_linenumber" name="L3889" href="#L3889">3889</a> assertArrayEquals(<strong class="jxr_keyword">new</strong> String[] { <span class="jxr_string">"1"</span> }, splita(<span class="jxr_string">"1"</span>, ','));
+<a class="jxr_linenumber" name="L3890" href="#L3890">3890</a> assertArrayEquals(<strong class="jxr_keyword">new</strong> String[] { <span class="jxr_string">"1"</span>, <span class="jxr_string">"2"</span> }, splita(<span class="jxr_string">"1,2"</span>, ','));
+<a class="jxr_linenumber" name="L3891" href="#L3891">3891</a>
+<a class="jxr_linenumber" name="L3892" href="#L3892">3892</a> <em class="jxr_comment">// splita(String,char,int) - with limit</em>
+<a class="jxr_linenumber" name="L3893" href="#L3893">3893</a> assertArrayEquals(<strong class="jxr_keyword">new</strong> String[] { <span class="jxr_string">"boo"</span>, <span class="jxr_string">"and"</span>, <span class="jxr_string">"foo"</span> }, splita(<span class="jxr_string">"boo:and:foo"</span>, ':', 10));
+<a class="jxr_linenumber" name="L3894" href="#L3894">3894</a> assertArrayEquals(<strong class="jxr_keyword">new</strong> String[] { <span class="jxr_string">"boo"</span>, <span class="jxr_string">"and:foo"</span> }, splita(<span class="jxr_string">"boo:and:foo"</span>, ':', 2));
+<a class="jxr_linenumber" name="L3895" href="#L3895">3895</a> assertArrayEquals(<strong class="jxr_keyword">new</strong> String[] { <span class="jxr_string">"boo:and:foo"</span> }, splita(<span class="jxr_string">"boo:and:foo"</span>, ':', 1));
+<a class="jxr_linenumber" name="L3896" href="#L3896">3896</a> }
+<a class="jxr_linenumber" name="L3897" href="#L3897">3897</a>
+<a class="jxr_linenumber" name="L3898" href="#L3898">3898</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3899" href="#L3899">3899</a> <em class="jxr_comment">// splitMap(String,boolean)</em>
+<a class="jxr_linenumber" name="L3900" href="#L3900">3900</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3901" href="#L3901">3901</a> @Test
+<a class="jxr_linenumber" name="L3902" href="#L3902">3902</a> <strong class="jxr_keyword">void</strong> a176_splitMap() {
+<a class="jxr_linenumber" name="L3903" href="#L3903">3903</a> assertString(<span class="jxr_string">"{a=1}"</span>, splitMap(<span class="jxr_string">"a=1"</span>, <strong class="jxr_keyword">true</strong>));
+<a class="jxr_linenumber" name="L3904" href="#L3904">3904</a> assertString(<span class="jxr_string">"{a=1,b=2}"</span>, splitMap(<span class="jxr_string">"a=1,b=2"</span>, <strong class="jxr_keyword">true</strong>));
+<a class="jxr_linenumber" name="L3905" href="#L3905">3905</a> assertString(<span class="jxr_string">"{a=1,b=2}"</span>, splitMap(<span class="jxr_string">" a = 1 , b = 2 "</span>, <strong class="jxr_keyword">true</strong>));
+<a class="jxr_linenumber" name="L3906" href="#L3906">3906</a> assertString(<span class="jxr_string">"{ a = 1 , b = 2 }"</span>, splitMap(<span class="jxr_string">" a = 1 , b = 2 "</span>, false));
+<a class="jxr_linenumber" name="L3907" href="#L3907">3907</a> assertString(<span class="jxr_string">"{a=}"</span>, splitMap(<span class="jxr_string">"a"</span>, <strong class="jxr_keyword">true</strong>));
+<a class="jxr_linenumber" name="L3908" href="#L3908">3908</a> assertString(<span class="jxr_string">"{a=,b=}"</span>, splitMap(<span class="jxr_string">"a,b"</span>, <strong class="jxr_keyword">true</strong>));
+<a class="jxr_linenumber" name="L3909" href="#L3909">3909</a> assertString(<span class="jxr_string">"{a=1,b=}"</span>, splitMap(<span class="jxr_string">"a=1,b"</span>, <strong class="jxr_keyword">true</strong>));
+<a class="jxr_linenumber" name="L3910" href="#L3910">3910</a> assertString(<span class="jxr_string">"{a=,b=1}"</span>, splitMap(<span class="jxr_string">"a,b=1"</span>, <strong class="jxr_keyword">true</strong>));
+<a class="jxr_linenumber" name="L3911" href="#L3911">3911</a> assertString(<span class="jxr_string">"{a==1}"</span>, splitMap(<span class="jxr_string">"a\\==1"</span>, <strong class="jxr_keyword">true</strong>));
+<a class="jxr_linenumber" name="L3912" href="#L3912">3912</a> assertString(<span class="jxr_string">"{a\\=1}"</span>, splitMap(<span class="jxr_string">"a\\\\=1"</span>, <strong class="jxr_keyword">true</strong>));
+<a class="jxr_linenumber" name="L3913" href="#L3913">3913</a> }
+<a class="jxr_linenumber" name="L3914" href="#L3914">3914</a>
+<a class="jxr_linenumber" name="L3915" href="#L3915">3915</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3916" href="#L3916">3916</a> <em class="jxr_comment">// splitMethodArgs(String)</em>
+<a class="jxr_linenumber" name="L3917" href="#L3917">3917</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3918" href="#L3918">3918</a> @Test
+<a class="jxr_linenumber" name="L3919" href="#L3919">3919</a> <strong class="jxr_keyword">void</strong> a177_splitMethodArgs() {
+<a class="jxr_linenumber" name="L3920" href="#L3920">3920</a> <em class="jxr_comment">// Basic method argument splitting</em>
+<a class="jxr_linenumber" name="L3921" href="#L3921">3921</a> <strong class="jxr_keyword">var</strong> args1 = splitMethodArgs(<span class="jxr_string">"a,b,c"</span>);
+<a class="jxr_linenumber" name="L3922" href="#L3922">3922</a> assertEquals(3, args1.length);
+<a class="jxr_linenumber" name="L3923" href="#L3923">3923</a> assertEquals(<span class="jxr_string">"a"</span>, args1[0]);
+<a class="jxr_linenumber" name="L3924" href="#L3924">3924</a> assertEquals(<span class="jxr_string">"b"</span>, args1[1]);
+<a class="jxr_linenumber" name="L3925" href="#L3925">3925</a> assertEquals(<span class="jxr_string">"c"</span>, args1[2]);
+<a class="jxr_linenumber" name="L3926" href="#L3926">3926</a>
+<a class="jxr_linenumber" name="L3927" href="#L3927">3927</a> <em class="jxr_comment">// With nested angle brackets</em>
+<a class="jxr_linenumber" name="L3928" href="#L3928">3928</a> <strong class="jxr_keyword">var</strong> args2 = splitMethodArgs(<span class="jxr_string">"x,y<a,b>,z"</span>);
+<a class="jxr_linenumber" name="L3929" href="#L3929">3929</a> assertEquals(3, args2.length);
+<a class="jxr_linenumber" name="L3930" href="#L3930">3930</a> assertEquals(<span class="jxr_string">"x"</span>, args2[0]);
+<a class="jxr_linenumber" name="L3931" href="#L3931">3931</a> assertEquals(<span class="jxr_string">"y<a,b>"</span>, args2[1]);
+<a class="jxr_linenumber" name="L3932" href="#L3932">3932</a> assertEquals(<span class="jxr_string">"z"</span>, args2[2]);
+<a class="jxr_linenumber" name="L3933" href="#L3933">3933</a>
+<a class="jxr_linenumber" name="L3934" href="#L3934">3934</a> <em class="jxr_comment">// With deeply nested</em>
+<a class="jxr_linenumber" name="L3935" href="#L3935">3935</a> <strong class="jxr_keyword">var</strong> args3 = splitMethodArgs(<span class="jxr_string">"x,y<a<b,c>,d<e,f>>,z"</span>);
+<a class="jxr_linenumber" name="L3936" href="#L3936">3936</a> assertEquals(3, args3.length);
+<a class="jxr_linenumber" name="L3937" href="#L3937">3937</a> assertEquals(<span class="jxr_string">"x"</span>, args3[0]);
+<a class="jxr_linenumber" name="L3938" href="#L3938">3938</a> assertEquals(<span class="jxr_string">"y<a<b,c>,d<e,f>>"</span>, args3[1]);
+<a class="jxr_linenumber" name="L3939" href="#L3939">3939</a> assertEquals(<span class="jxr_string">"z"</span>, args3[2]);
+<a class="jxr_linenumber" name="L3940" href="#L3940">3940</a>
+<a class="jxr_linenumber" name="L3941" href="#L3941">3941</a> <em class="jxr_comment">// Null/empty input</em>
+<a class="jxr_linenumber" name="L3942" href="#L3942">3942</a> assertNull(splitMethodArgs(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3943" href="#L3943">3943</a> assertArrayEquals(<strong class="jxr_keyword">new</strong> String[0], splitMethodArgs(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L3944" href="#L3944">3944</a> }
+<a class="jxr_linenumber" name="L3945" href="#L3945">3945</a>
+<a class="jxr_linenumber" name="L3946" href="#L3946">3946</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3947" href="#L3947">3947</a> <em class="jxr_comment">// splitNested(String)</em>
+<a class="jxr_linenumber" name="L3948" href="#L3948">3948</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3949" href="#L3949">3949</a> @Test
+<a class="jxr_linenumber" name="L3950" href="#L3950">3950</a> <strong class="jxr_keyword">void</strong> a178_splitNested() {
+<a class="jxr_linenumber" name="L3951" href="#L3951">3951</a> <em class="jxr_comment">// Basic nested splitting (uses curly braces)</em>
+<a class="jxr_linenumber" name="L3952" href="#L3952">3952</a> <strong class="jxr_keyword">var</strong> result1 = splitNested(<span class="jxr_string">"a,b,c"</span>);
+<a class="jxr_linenumber" name="L3953" href="#L3953">3953</a> assertEquals(3, result1.size());
+<a class="jxr_linenumber" name="L3954" href="#L3954">3954</a> assertEquals(<span class="jxr_string">"a"</span>, result1.get(0));
+<a class="jxr_linenumber" name="L3955" href="#L3955">3955</a> assertEquals(<span class="jxr_string">"b"</span>, result1.get(1));
+<a class="jxr_linenumber" name="L3956" href="#L3956">3956</a> assertEquals(<span class="jxr_string">"c"</span>, result1.get(2));
+<a class="jxr_linenumber" name="L3957" href="#L3957">3957</a>
+<a class="jxr_linenumber" name="L3958" href="#L3958">3958</a> <em class="jxr_comment">// With nested curly braces</em>
+<a class="jxr_linenumber" name="L3959" href="#L3959">3959</a> <strong class="jxr_keyword">var</strong> result2 = splitNested(<span class="jxr_string">"a{b,c},d"</span>);
+<a class="jxr_linenumber" name="L3960" href="#L3960">3960</a> assertEquals(2, result2.size());
+<a class="jxr_linenumber" name="L3961" href="#L3961">3961</a> assertEquals(<span class="jxr_string">"a{b,c}"</span>, result2.get(0));
+<a class="jxr_linenumber" name="L3962" href="#L3962">3962</a> assertEquals(<span class="jxr_string">"d"</span>, result2.get(1));
<a class="jxr_linenumber" name="L3963" href="#L3963">3963</a>
-<a class="jxr_linenumber" name="L3964" href="#L3964">3964</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3965" href="#L3965">3965</a> <em class="jxr_comment">// splitNestedInner(String)</em>
-<a class="jxr_linenumber" name="L3966" href="#L3966">3966</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3967" href="#L3967">3967</a> @Test
-<a class="jxr_linenumber" name="L3968" href="#L3968">3968</a> <strong class="jxr_keyword">void</strong> a179_splitNestedInner() {
-<a class="jxr_linenumber" name="L3969" href="#L3969">3969</a> <em class="jxr_comment">// Basic nested inner splitting (extracts inner content)</em>
-<a class="jxr_linenumber" name="L3970" href="#L3970">3970</a> <strong class="jxr_keyword">var</strong> result1 = splitNestedInner(<span class="jxr_string">"a{b}"</span>);
-<a class="jxr_linenumber" name="L3971" href="#L3971">3971</a> assertEquals(1, result1.size());
-<a class="jxr_linenumber" name="L3972" href="#L3972">3972</a> assertEquals(<span class="jxr_string">"b"</span>, result1.get(0));
-<a class="jxr_linenumber" name="L3973" href="#L3973">3973</a>
-<a class="jxr_linenumber" name="L3974" href="#L3974">3974</a> <em class="jxr_comment">// With multiple inner elements</em>
-<a class="jxr_linenumber" name="L3975" href="#L3975">3975</a> <strong class="jxr_keyword">var</strong> result2 = splitNestedInner(<span class="jxr_string">"a{b,c}"</span>);
-<a class="jxr_linenumber" name="L3976" href="#L3976">3976</a> assertEquals(2, result2.size());
-<a class="jxr_linenumber" name="L3977" href="#L3977">3977</a> assertEquals(<span class="jxr_string">"b"</span>, result2.get(0));
-<a class="jxr_linenumber" name="L3978" href="#L3978">3978</a> assertEquals(<span class="jxr_string">"c"</span>, result2.get(1));
-<a class="jxr_linenumber" name="L3979" href="#L3979">3979</a>
-<a class="jxr_linenumber" name="L3980" href="#L3980">3980</a> <em class="jxr_comment">// With deeply nested</em>
-<a class="jxr_linenumber" name="L3981" href="#L3981">3981</a> <strong class="jxr_keyword">var</strong> result3 = splitNestedInner(<span class="jxr_string">"a{b{c,d},e{f,g}}"</span>);
-<a class="jxr_linenumber" name="L3982" href="#L3982">3982</a> assertEquals(2, result3.size());
-<a class="jxr_linenumber" name="L3983" href="#L3983">3983</a> assertEquals(<span class="jxr_string">"b{c,d}"</span>, result3.get(0));
-<a class="jxr_linenumber" name="L3984" href="#L3984">3984</a> assertEquals(<span class="jxr_string">"e{f,g}"</span>, result3.get(1));
-<a class="jxr_linenumber" name="L3985" href="#L3985">3985</a>
-<a class="jxr_linenumber" name="L3986" href="#L3986">3986</a> <em class="jxr_comment">// Null/empty input - throws exception</em>
-<a class="jxr_linenumber" name="L3987" href="#L3987">3987</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> splitNestedInner(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3988" href="#L3988">3988</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> splitNestedInner(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L3989" href="#L3989">3989</a> }
+<a class="jxr_linenumber" name="L3964" href="#L3964">3964</a> <em class="jxr_comment">// With deeply nested</em>
+<a class="jxr_linenumber" name="L3965" href="#L3965">3965</a> <strong class="jxr_keyword">var</strong> result3 = splitNested(<span class="jxr_string">"a,b{c,d{e,f}}"</span>);
+<a class="jxr_linenumber" name="L3966" href="#L3966">3966</a> assertEquals(2, result3.size());
+<a class="jxr_linenumber" name="L3967" href="#L3967">3967</a> assertEquals(<span class="jxr_string">"a"</span>, result3.get(0));
+<a class="jxr_linenumber" name="L3968" href="#L3968">3968</a> assertEquals(<span class="jxr_string">"b{c,d{e,f}}"</span>, result3.get(1));
+<a class="jxr_linenumber" name="L3969" href="#L3969">3969</a>
+<a class="jxr_linenumber" name="L3970" href="#L3970">3970</a> <em class="jxr_comment">// Null/empty input</em>
+<a class="jxr_linenumber" name="L3971" href="#L3971">3971</a> assertNull(splitNested(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3972" href="#L3972">3972</a> assertTrue(splitNested(<span class="jxr_string">""</span>).isEmpty());
+<a class="jxr_linenumber" name="L3973" href="#L3973">3973</a> }
+<a class="jxr_linenumber" name="L3974" href="#L3974">3974</a>
+<a class="jxr_linenumber" name="L3975" href="#L3975">3975</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3976" href="#L3976">3976</a> <em class="jxr_comment">// splitNestedInner(String)</em>
+<a class="jxr_linenumber" name="L3977" href="#L3977">3977</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L3978" href="#L3978">3978</a> @Test
+<a class="jxr_linenumber" name="L3979" href="#L3979">3979</a> <strong class="jxr_keyword">void</strong> a179_splitNestedInner() {
+<a class="jxr_linenumber" name="L3980" href="#L3980">3980</a> <em class="jxr_comment">// Basic nested inner splitting (extracts inner content)</em>
+<a class="jxr_linenumber" name="L3981" href="#L3981">3981</a> <strong class="jxr_keyword">var</strong> result1 = splitNestedInner(<span class="jxr_string">"a{b}"</span>);
+<a class="jxr_linenumber" name="L3982" href="#L3982">3982</a> assertEquals(1, result1.size());
+<a class="jxr_linenumber" name="L3983" href="#L3983">3983</a> assertEquals(<span class="jxr_string">"b"</span>, result1.get(0));
+<a class="jxr_linenumber" name="L3984" href="#L3984">3984</a>
+<a class="jxr_linenumber" name="L3985" href="#L3985">3985</a> <em class="jxr_comment">// With multiple inner elements</em>
+<a class="jxr_linenumber" name="L3986" href="#L3986">3986</a> <strong class="jxr_keyword">var</strong> result2 = splitNestedInner(<span class="jxr_string">"a{b,c}"</span>);
+<a class="jxr_linenumber" name="L3987" href="#L3987">3987</a> assertEquals(2, result2.size());
+<a class="jxr_linenumber" name="L3988" href="#L3988">3988</a> assertEquals(<span class="jxr_string">"b"</span>, result2.get(0));
+<a class="jxr_linenumber" name="L3989" href="#L3989">3989</a> assertEquals(<span class="jxr_string">"c"</span>, result2.get(1));
<a class="jxr_linenumber" name="L3990" href="#L3990">3990</a>
-<a class="jxr_linenumber" name="L3991" href="#L3991">3991</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3992" href="#L3992">3992</a> <em class="jxr_comment">// splitQuoted(String)</em>
-<a class="jxr_linenumber" name="L3993" href="#L3993">3993</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L3994" href="#L3994">3994</a> @Test
-<a class="jxr_linenumber" name="L3995" href="#L3995">3995</a> <strong class="jxr_keyword">void</strong> a180_splitQuoted() {
-<a class="jxr_linenumber" name="L3996" href="#L3996">3996</a> assertNull(splitQuoted(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L3997" href="#L3997">3997</a> assertEmpty(splitQuoted(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L3998" href="#L3998">3998</a> assertEmpty(splitQuoted(<span class="jxr_string">" \t "</span>));
-<a class="jxr_linenumber" name="L3999" href="#L3999">3999</a> assertList(splitQuoted(<span class="jxr_string">"foo"</span>), <span class="jxr_string">"foo"</span>);
-<a class="jxr_linenumber" name="L4000" href="#L4000">4000</a> assertList(splitQuoted(<span class="jxr_string">"foo bar baz"</span>), <span class="jxr_string">"foo"</span>, <span class="jxr_string">"bar"</span>, <span class="jxr_string">"baz"</span>);
-<a class="jxr_linenumber" name="L4001" href="#L4001">4001</a> assertList(splitQuoted(<span class="jxr_string">"'foo'"</span>), <span class="jxr_string">"foo"</span>);
-<a class="jxr_linenumber" name="L4002" href="#L4002">4002</a> assertList(splitQuoted(<span class="jxr_string">" ' foo ' "</span>), <span class="jxr_string">" foo "</span>);
-<a class="jxr_linenumber" name="L4003" href="#L4003">4003</a> assertList(splitQuoted(<span class="jxr_string">"'foo' 'bar'"</span>), <span class="jxr_string">"foo"</span>, <span class="jxr_string">"bar"</span>);
-<a class="jxr_linenumber" name="L4004" href="#L4004">4004</a> assertList(splitQuoted(<span class="jxr_string">"\"foo\""</span>), <span class="jxr_string">"foo"</span>);
-<a class="jxr_linenumber" name="L4005" href="#L4005">4005</a> assertList(splitQuoted(<span class="jxr_string">" \" foo \" "</span>), <span class="jxr_string">" foo "</span>);
-<a class="jxr_linenumber" name="L4006" href="#L4006">4006</a> assertList(splitQuoted(<span class="jxr_string">"\"foo\" \"bar\""</span>), <span class="jxr_string">"foo"</span>, <span class="jxr_string">"bar"</span>);
-<a class="jxr_linenumber" name="L4007" href="#L4007">4007</a> assertList(splitQuoted(<span class="jxr_string">"'foo\\'bar'"</span>), <span class="jxr_string">"foo'bar"</span>);
-<a class="jxr_linenumber" name="L4008" href="#L4008">4008</a> assertList(splitQuoted(<span class="jxr_string">"'foo\\\"bar'"</span>), <span class="jxr_string">"foo\"bar"</span>);
-<a class="jxr_linenumber" name="L4009" href="#L4009">4009</a> assertList(splitQuoted(<span class="jxr_string">"'\\'foo\\'bar\\''"</span>), <span class="jxr_string">"'foo'bar'"</span>);
-<a class="jxr_linenumber" name="L4010" href="#L4010">4010</a> assertList(splitQuoted(<span class="jxr_string">"'\\\"foo\\\"bar\\\"'"</span>), <span class="jxr_string">"\"foo\"bar\""</span>);
-<a class="jxr_linenumber" name="L4011" href="#L4011">4011</a> assertList(splitQuoted(<span class="jxr_string">"'\\'foo\\''"</span>), <span class="jxr_string">"'foo'"</span>);
-<a class="jxr_linenumber" name="L4012" href="#L4012">4012</a> assertList(splitQuoted(<span class="jxr_string">"\"\\\"foo\\\"\""</span>), <span class="jxr_string">"\"foo\""</span>);
-<a class="jxr_linenumber" name="L4013" href="#L4013">4013</a> assertList(splitQuoted(<span class="jxr_string">"'\"foo\"'"</span>), <span class="jxr_string">"\"foo\""</span>);
-<a class="jxr_linenumber" name="L4014" href="#L4014">4014</a> assertList(splitQuoted(<span class="jxr_string">"\"'foo'\""</span>), <span class="jxr_string">"'foo'"</span>);
-<a class="jxr_linenumber" name="L4015" href="#L4015">4015</a> }
-<a class="jxr_linenumber" name="L4016" href="#L4016">4016</a>
-<a class="jxr_linenumber" name="L4017" href="#L4017">4017</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4018" href="#L4018">4018</a> <em class="jxr_comment">// splita(...) - Already covered in a175_split</em>
-<a class="jxr_linenumber" name="L4019" href="#L4019">4019</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4020" href="#L4020">4020</a>
-<a class="jxr_linenumber" name="L4021" href="#L4021">4021</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4022" href="#L4022">4022</a> <em class="jxr_comment">// startsWith(String,char)</em>
-<a class="jxr_linenumber" name="L4023" href="#L4023">4023</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4024" href="#L4024">4024</a> @Test
-<a class="jxr_linenumber" name="L4025" href="#L4025">4025</a> <strong class="jxr_keyword">void</strong> a182_startsWith() {
-<a class="jxr_linenumber" name="L4026" href="#L4026">4026</a> assertFalse(startsWith(<strong class="jxr_keyword">null</strong>, 'a'));
-<a class="jxr_linenumber" name="L4027" href="#L4027">4027</a> assertFalse(startsWith(<span class="jxr_string">""</span>, 'a'));
-<a class="jxr_linenumber" name="L4028" href="#L4028">4028</a> assertTrue(startsWith(<span class="jxr_string">"a"</span>, 'a'));
-<a class="jxr_linenumber" name="L4029" href="#L4029">4029</a> assertTrue(startsWith(<span class="jxr_string">"ab"</span>, 'a'));
-<a class="jxr_linenumber" name="L4030" href="#L4030">4030</a> assertFalse(startsWith(<span class="jxr_string">"ba"</span>, 'a'));
-<a class="jxr_linenumber" name="L4031" href="#L4031">4031</a> assertTrue(startsWith(<span class="jxr_string">"Hello"</span>, 'H'));
-<a class="jxr_linenumber" name="L4032" href="#L4032">4032</a> assertFalse(startsWith(<span class="jxr_string">"hello"</span>, 'H'));
-<a class="jxr_linenumber" name="L4033" href="#L4033">4033</a> }
-<a class="jxr_linenumber" name="L4034" href="#L4034">4034</a>
-<a class="jxr_linenumber" name="L4035" href="#L4035">4035</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4036" href="#L4036">4036</a> <em class="jxr_comment">// startsWithIgnoreCase(String,String)</em>
-<a class="jxr_linenumber" name="L4037" href="#L4037">4037</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4038" href="#L4038">4038</a> @Test
-<a class="jxr_linenumber" name="L4039" href="#L4039">4039</a> <strong class="jxr_keyword">void</strong> a183_startsWithIgnoreCase() {
-<a class="jxr_linenumber" name="L4040" href="#L4040">4040</a> assertTrue(startsWithIgnoreCase(<span class="jxr_string">"Hello World"</span>, <span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L4041" href="#L4041">4041</a> assertTrue(startsWithIgnoreCase(<span class="jxr_string">"Hello World"</span>, <span class="jxr_string">"HELLO"</span>));
-<a class="jxr_linenumber" name="L4042" href="#L4042">4042</a> assertTrue(startsWithIgnoreCase(<span class="jxr_string">"Hello World"</span>, <span class="jxr_string">"Hello"</span>));
-<a class="jxr_linenumber" name="L4043" href="#L4043">4043</a> assertTrue(startsWithIgnoreCase(<span class="jxr_string">"hello world"</span>, <span class="jxr_string">"HELLO"</span>));
-<a class="jxr_linenumber" name="L4044" href="#L4044">4044</a> assertFalse(startsWithIgnoreCase(<span class="jxr_string">"Hello World"</span>, <span class="jxr_string">"world"</span>));
-<a class="jxr_linenumber" name="L4045" href="#L4045">4045</a> assertFalse(startsWithIgnoreCase(<span class="jxr_string">"Hello World"</span>, <span class="jxr_string">"xyz"</span>));
-<a class="jxr_linenumber" name="L4046" href="#L4046">4046</a> assertFalse(startsWithIgnoreCase(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"test"</span>));
-<a class="jxr_linenumber" name="L4047" href="#L4047">4047</a> assertFalse(startsWithIgnoreCase(<span class="jxr_string">"test"</span>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L4048" href="#L4048">4048</a> assertFalse(startsWithIgnoreCase(<strong class="jxr_keyword">null</strong>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L4049" href="#L4049">4049</a> assertTrue(startsWithIgnoreCase(<span class="jxr_string">"Hello"</span>, <span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L4050" href="#L4050">4050</a> }
-<a class="jxr_linenumber" name="L4051" href="#L4051">4051</a>
-<a class="jxr_linenumber" name="L4052" href="#L4052">4052</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4053" href="#L4053">4053</a> <em class="jxr_comment">// stringSupplier(Supplier<?>)</em>
-<a class="jxr_linenumber" name="L4054" href="#L4054">4054</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4055" href="#L4055">4055</a> @Test
-<a class="jxr_linenumber" name="L4056" href="#L4056">4056</a> <strong class="jxr_keyword">void</strong> a184_stringSupplier() {
-<a class="jxr_linenumber" name="L4057" href="#L4057">4057</a> <strong class="jxr_keyword">var</strong> supplier1 = stringSupplier(() -> <span class="jxr_string">"test"</span>);
-<a class="jxr_linenumber" name="L4058" href="#L4058">4058</a> assertEquals(<span class="jxr_string">"test"</span>, supplier1.get());
-<a class="jxr_linenumber" name="L4059" href="#L4059">4059</a>
-<a class="jxr_linenumber" name="L4060" href="#L4060">4060</a> <strong class="jxr_keyword">var</strong> supplier2 = stringSupplier(() -> 123);
-<a class="jxr_linenumber" name="L4061" href="#L4061">4061</a> assertEquals(<span class="jxr_string">"123"</span>, supplier2.get());
+<a class="jxr_linenumber" name="L3991" href="#L3991">3991</a> <em class="jxr_comment">// With deeply nested</em>
+<a class="jxr_linenumber" name="L3992" href="#L3992">3992</a> <strong class="jxr_keyword">var</strong> result3 = splitNestedInner(<span class="jxr_string">"a{b{c,d},e{f,g}}"</span>);
+<a class="jxr_linenumber" name="L3993" href="#L3993">3993</a> assertEquals(2, result3.size());
+<a class="jxr_linenumber" name="L3994" href="#L3994">3994</a> assertEquals(<span class="jxr_string">"b{c,d}"</span>, result3.get(0));
+<a class="jxr_linenumber" name="L3995" href="#L3995">3995</a> assertEquals(<span class="jxr_string">"e{f,g}"</span>, result3.get(1));
+<a class="jxr_linenumber" name="L3996" href="#L3996">3996</a>
+<a class="jxr_linenumber" name="L3997" href="#L3997">3997</a> <em class="jxr_comment">// Null/empty input - throws exception</em>
+<a class="jxr_linenumber" name="L3998" href="#L3998">3998</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> splitNestedInner(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L3999" href="#L3999">3999</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> splitNestedInner(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L4000" href="#L4000">4000</a> }
+<a class="jxr_linenumber" name="L4001" href="#L4001">4001</a>
+<a class="jxr_linenumber" name="L4002" href="#L4002">4002</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4003" href="#L4003">4003</a> <em class="jxr_comment">// splitQuoted(String)</em>
+<a class="jxr_linenumber" name="L4004" href="#L4004">4004</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4005" href="#L4005">4005</a> @Test
+<a class="jxr_linenumber" name="L4006" href="#L4006">4006</a> <strong class="jxr_keyword">void</strong> a180_splitQuoted() {
+<a class="jxr_linenumber" name="L4007" href="#L4007">4007</a> assertNull(splitQuoted(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4008" href="#L4008">4008</a> assertEmpty(splitQuoted(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L4009" href="#L4009">4009</a> assertEmpty(splitQuoted(<span class="jxr_string">" \t "</span>));
+<a class="jxr_linenumber" name="L4010" href="#L4010">4010</a> assertList(splitQuoted(<span class="jxr_string">"foo"</span>), <span class="jxr_string">"foo"</span>);
+<a class="jxr_linenumber" name="L4011" href="#L4011">4011</a> assertList(splitQuoted(<span class="jxr_string">"foo bar baz"</span>), <span class="jxr_string">"foo"</span>, <span class="jxr_string">"bar"</span>, <span class="jxr_string">"baz"</span>);
+<a class="jxr_linenumber" name="L4012" href="#L4012">4012</a> assertList(splitQuoted(<span class="jxr_string">"'foo'"</span>), <span class="jxr_string">"foo"</span>);
+<a class="jxr_linenumber" name="L4013" href="#L4013">4013</a> assertList(splitQuoted(<span class="jxr_string">" ' foo ' "</span>), <span class="jxr_string">" foo "</span>);
+<a class="jxr_linenumber" name="L4014" href="#L4014">4014</a> assertList(splitQuoted(<span class="jxr_string">"'foo' 'bar'"</span>), <span class="jxr_string">"foo"</span>, <span class="jxr_string">"bar"</span>);
+<a class="jxr_linenumber" name="L4015" href="#L4015">4015</a> assertList(splitQuoted(<span class="jxr_string">"\"foo\""</span>), <span class="jxr_string">"foo"</span>);
+<a class="jxr_linenumber" name="L4016" href="#L4016">4016</a> assertList(splitQuoted(<span class="jxr_string">" \" foo \" "</span>), <span class="jxr_string">" foo "</span>);
+<a class="jxr_linenumber" name="L4017" href="#L4017">4017</a> assertList(splitQuoted(<span class="jxr_string">"\"foo\" \"bar\""</span>), <span class="jxr_string">"foo"</span>, <span class="jxr_string">"bar"</span>);
+<a class="jxr_linenumber" name="L4018" href="#L4018">4018</a> assertList(splitQuoted(<span class="jxr_string">"'foo\\'bar'"</span>), <span class="jxr_string">"foo'bar"</span>);
+<a class="jxr_linenumber" name="L4019" href="#L4019">4019</a> assertList(splitQuoted(<span class="jxr_string">"'foo\\\"bar'"</span>), <span class="jxr_string">"foo\"bar"</span>);
+<a class="jxr_linenumber" name="L4020" href="#L4020">4020</a> assertList(splitQuoted(<span class="jxr_string">"'\\'foo\\'bar\\''"</span>), <span class="jxr_string">"'foo'bar'"</span>);
+<a class="jxr_linenumber" name="L4021" href="#L4021">4021</a> assertList(splitQuoted(<span class="jxr_string">"'\\\"foo\\\"bar\\\"'"</span>), <span class="jxr_string">"\"foo\"bar\""</span>);
+<a class="jxr_linenumber" name="L4022" href="#L4022">4022</a> assertList(splitQuoted(<span class="jxr_string">"'\\'foo\\''"</span>), <span class="jxr_string">"'foo'"</span>);
+<a class="jxr_linenumber" name="L4023" href="#L4023">4023</a> assertList(splitQuoted(<span class="jxr_string">"\"\\\"foo\\\"\""</span>), <span class="jxr_string">"\"foo\""</span>);
+<a class="jxr_linenumber" name="L4024" href="#L4024">4024</a> assertList(splitQuoted(<span class="jxr_string">"'\"foo\"'"</span>), <span class="jxr_string">"\"foo\""</span>);
+<a class="jxr_linenumber" name="L4025" href="#L4025">4025</a> assertList(splitQuoted(<span class="jxr_string">"\"'foo'\""</span>), <span class="jxr_string">"'foo'"</span>);
+<a class="jxr_linenumber" name="L4026" href="#L4026">4026</a> }
+<a class="jxr_linenumber" name="L4027" href="#L4027">4027</a>
+<a class="jxr_linenumber" name="L4028" href="#L4028">4028</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4029" href="#L4029">4029</a> <em class="jxr_comment">// splita(...) - Already covered in a175_split</em>
+<a class="jxr_linenumber" name="L4030" href="#L4030">4030</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4031" href="#L4031">4031</a>
+<a class="jxr_linenumber" name="L4032" href="#L4032">4032</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4033" href="#L4033">4033</a> <em class="jxr_comment">// startsWith(String,char)</em>
+<a class="jxr_linenumber" name="L4034" href="#L4034">4034</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4035" href="#L4035">4035</a> @Test
+<a class="jxr_linenumber" name="L4036" href="#L4036">4036</a> <strong class="jxr_keyword">void</strong> a182_startsWith() {
+<a class="jxr_linenumber" name="L4037" href="#L4037">4037</a> assertFalse(startsWith(<strong class="jxr_keyword">null</strong>, 'a'));
+<a class="jxr_linenumber" name="L4038" href="#L4038">4038</a> assertFalse(startsWith(<span class="jxr_string">""</span>, 'a'));
+<a class="jxr_linenumber" name="L4039" href="#L4039">4039</a> assertTrue(startsWith(<span class="jxr_string">"a"</span>, 'a'));
+<a class="jxr_linenumber" name="L4040" href="#L4040">4040</a> assertTrue(startsWith(<span class="jxr_string">"ab"</span>, 'a'));
+<a class="jxr_linenumber" name="L4041" href="#L4041">4041</a> assertFalse(startsWith(<span class="jxr_string">"ba"</span>, 'a'));
+<a class="jxr_linenumber" name="L4042" href="#L4042">4042</a> assertTrue(startsWith(<span class="jxr_string">"Hello"</span>, 'H'));
+<a class="jxr_linenumber" name="L4043" href="#L4043">4043</a> assertFalse(startsWith(<span class="jxr_string">"hello"</span>, 'H'));
+<a class="jxr_linenumber" name="L4044" href="#L4044">4044</a> }
+<a class="jxr_linenumber" name="L4045" href="#L4045">4045</a>
+<a class="jxr_linenumber" name="L4046" href="#L4046">4046</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4047" href="#L4047">4047</a> <em class="jxr_comment">// startsWithIgnoreCase(String,String)</em>
+<a class="jxr_linenumber" name="L4048" href="#L4048">4048</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4049" href="#L4049">4049</a> @Test
+<a class="jxr_linenumber" name="L4050" href="#L4050">4050</a> <strong class="jxr_keyword">void</strong> a183_startsWithIgnoreCase() {
+<a class="jxr_linenumber" name="L4051" href="#L4051">4051</a> assertTrue(startsWithIgnoreCase(<span class="jxr_string">"Hello World"</span>, <span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L4052" href="#L4052">4052</a> assertTrue(startsWithIgnoreCase(<span class="jxr_string">"Hello World"</span>, <span class="jxr_string">"HELLO"</span>));
+<a class="jxr_linenumber" name="L4053" href="#L4053">4053</a> assertTrue(startsWithIgnoreCase(<span class="jxr_string">"Hello World"</span>, <span class="jxr_string">"Hello"</span>));
+<a class="jxr_linenumber" name="L4054" href="#L4054">4054</a> assertTrue(startsWithIgnoreCase(<span class="jxr_string">"hello world"</span>, <span class="jxr_string">"HELLO"</span>));
+<a class="jxr_linenumber" name="L4055" href="#L4055">4055</a> assertFalse(startsWithIgnoreCase(<span class="jxr_string">"Hello World"</span>, <span class="jxr_string">"world"</span>));
+<a class="jxr_linenumber" name="L4056" href="#L4056">4056</a> assertFalse(startsWithIgnoreCase(<span class="jxr_string">"Hello World"</span>, <span class="jxr_string">"xyz"</span>));
+<a class="jxr_linenumber" name="L4057" href="#L4057">4057</a> assertFalse(startsWithIgnoreCase(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"test"</span>));
+<a class="jxr_linenumber" name="L4058" href="#L4058">4058</a> assertFalse(startsWithIgnoreCase(<span class="jxr_string">"test"</span>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4059" href="#L4059">4059</a> assertFalse(startsWithIgnoreCase(<strong class="jxr_keyword">null</strong>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4060" href="#L4060">4060</a> assertTrue(startsWithIgnoreCase(<span class="jxr_string">"Hello"</span>, <span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L4061" href="#L4061">4061</a> }
<a class="jxr_linenumber" name="L4062" href="#L4062">4062</a>
-<a class="jxr_linenumber" name="L4063" href="#L4063">4063</a> <strong class="jxr_keyword">var</strong> supplier3 = stringSupplier(() -> List.of(<span class="jxr_string">"a"</span>, <span class="jxr_string">"b"</span>, <span class="jxr_string">"c"</span>));
-<a class="jxr_linenumber" name="L4064" href="#L4064">4064</a> assertEquals(<span class="jxr_string">"[a,b,c]"</span>, supplier3.get());
-<a class="jxr_linenumber" name="L4065" href="#L4065">4065</a>
-<a class="jxr_linenumber" name="L4066" href="#L4066">4066</a> <em class="jxr_comment">// Null handling - readable() returns null for null input</em>
-<a class="jxr_linenumber" name="L4067" href="#L4067">4067</a> <strong class="jxr_keyword">var</strong> supplier4 = stringSupplier(() -> <strong class="jxr_keyword">null</strong>);
-<a class="jxr_linenumber" name="L4068" href="#L4068">4068</a> assertNull(supplier4.get());
-<a class="jxr_linenumber" name="L4069" href="#L4069">4069</a> }
+<a class="jxr_linenumber" name="L4063" href="#L4063">4063</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4064" href="#L4064">4064</a> <em class="jxr_comment">// stringSupplier(Supplier<?>)</em>
+<a class="jxr_linenumber" name="L4065" href="#L4065">4065</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4066" href="#L4066">4066</a> @Test
+<a class="jxr_linenumber" name="L4067" href="#L4067">4067</a> <strong class="jxr_keyword">void</strong> a184_stringSupplier() {
+<a class="jxr_linenumber" name="L4068" href="#L4068">4068</a> <strong class="jxr_keyword">var</strong> supplier1 = stringSupplier(() -> <span class="jxr_string">"test"</span>);
+<a class="jxr_linenumber" name="L4069" href="#L4069">4069</a> assertEquals(<span class="jxr_string">"test"</span>, supplier1.get());
<a class="jxr_linenumber" name="L4070" href="#L4070">4070</a>
-<a class="jxr_linenumber" name="L4071" href="#L4071">4071</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4072" href="#L4072">4072</a> <em class="jxr_comment">// strip(String)</em>
-<a class="jxr_linenumber" name="L4073" href="#L4073">4073</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4074" href="#L4074">4074</a> @Test
-<a class="jxr_linenumber" name="L4075" href="#L4075">4075</a> <strong class="jxr_keyword">void</strong> a185_strip() {
-<a class="jxr_linenumber" name="L4076" href="#L4076">4076</a> assertNull(strip(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L4077" href="#L4077">4077</a> assertEquals(<span class="jxr_string">""</span>, strip(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L4078" href="#L4078">4078</a> <em class="jxr_comment">// strip returns the same string if length <= 1</em>
-<a class="jxr_linenumber" name="L4079" href="#L4079">4079</a> assertEquals(<span class="jxr_string">"a"</span>, strip(<span class="jxr_string">"a"</span>));
-<a class="jxr_linenumber" name="L4080" href="#L4080">4080</a> assertEquals(<span class="jxr_string">""</span>, strip(<span class="jxr_string">"ab"</span>));
-<a class="jxr_linenumber" name="L4081" href="#L4081">4081</a> <em class="jxr_comment">// strip removes first and last character, so "abc" -> "b"</em>
-<a class="jxr_linenumber" name="L4082" href="#L4082">4082</a> assertEquals(<span class="jxr_string">"b"</span>, strip(<span class="jxr_string">"abc"</span>));
-<a class="jxr_linenumber" name="L4083" href="#L4083">4083</a> assertEquals(<span class="jxr_string">"ell"</span>, strip(<span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L4084" href="#L4084">4084</a> assertEquals(<span class="jxr_string">"test"</span>, strip(<span class="jxr_string">"xtestx"</span>));
-<a class="jxr_linenumber" name="L4085" href="#L4085">4085</a> }
-<a class="jxr_linenumber" name="L4086" href="#L4086">4086</a>
-<a class="jxr_linenumber" name="L4087" href="#L4087">4087</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4088" href="#L4088">4088</a> <em class="jxr_comment">// stripInvalidHttpHeaderChars(String)</em>
-<a class="jxr_linenumber" name="L4089" href="#L4089">4089</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4090" href="#L4090">4090</a> @Test
-<a class="jxr_linenumber" name="L4091" href="#L4091">4091</a> <strong class="jxr_keyword">void</strong> a186_stripInvalidHttpHeaderChars() {
-<a class="jxr_linenumber" name="L4092" href="#L4092">4092</a> assertNull(stripInvalidHttpHeaderChars(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L4093" href="#L4093">4093</a> assertEquals(<span class="jxr_string">""</span>, stripInvalidHttpHeaderChars(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L4094" href="#L4094">4094</a> <em class="jxr_comment">// Test actual behavior - spaces appear to be removed</em>
-<a class="jxr_linenumber" name="L4095" href="#L4095">4095</a> <strong class="jxr_keyword">var</strong> result1 = stripInvalidHttpHeaderChars(<span class="jxr_string">"Hello World"</span>);
-<a class="jxr_linenumber" name="L4096" href="#L4096">4096</a> assertTrue(result1.equals(<span class="jxr_string">"HelloWorld"</span>) || result1.equals(<span class="jxr_string">"Hello World"</span>)); <em class="jxr_comment">// Accept either behavior</em>
-<a class="jxr_linenumber" name="L4097" href="#L4097">4097</a> <em class="jxr_comment">// Control characters should be removed</em>
-<a class="jxr_linenumber" name="L4098" href="#L4098">4098</a> <strong class="jxr_keyword">var</strong> result2 = stripInvalidHttpHeaderChars(<span class="jxr_string">"Hello\u0000World"</span>);
-<a class="jxr_linenumber" name="L4099" href="#L4099">4099</a> assertFalse(result2.contains(<span class="jxr_string">"\u0000"</span>));
-<a class="jxr_linenumber" name="L4100" href="#L4100">4100</a> <em class="jxr_comment">// Valid characters should remain</em>
-<a class="jxr_linenumber" name="L4101" href="#L4101">4101</a> <strong class="jxr_keyword">var</strong> result3 = stripInvalidHttpHeaderChars(<span class="jxr_string">"Header-Value:123"</span>);
-<a class="jxr_linenumber" name="L4102" href="#L4102">4102</a> assertTrue(result3.contains(<span class="jxr_string">"Header"</span>) && result3.contains(<span class="jxr_string">"Value"</span>));
-<a class="jxr_linenumber" name="L4103" href="#L4103">4103</a> }
-<a class="jxr_linenumber" name="L4104" href="#L4104">4104</a>
-<a class="jxr_linenumber" name="L4105" href="#L4105">4105</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4106" href="#L4106">4106</a> <em class="jxr_comment">// substringAfter(String,String)</em>
-<a class="jxr_linenumber" name="L4107" href="#L4107">4107</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4108" href="#L4108">4108</a> @Test
-<a class="jxr_linenumber" name="L4109" href="#L4109">4109</a> <strong class="jxr_keyword">void</strong> a187_substringAfter() {
-<a class="jxr_linenumber" name="L4110" href="#L4110">4110</a> assertNull(substringAfter(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"."</span>));
-<a class="jxr_linenumber" name="L4111" href="#L4111">4111</a> assertEquals(<span class="jxr_string">""</span>, substringAfter(<span class="jxr_string">"hello.world"</span>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L4112" href="#L4112">4112</a> assertEquals(<span class="jxr_string">"world"</span>, substringAfter(<span class="jxr_string">"hello.world"</span>, <span class="jxr_string">"."</span>));
-<a class="jxr_linenumber" name="L4113" href="#L4113">4113</a> assertEquals(<span class="jxr_string">""</span>, substringAfter(<span class="jxr_string">"hello.world"</span>, <span class="jxr_string">"xyz"</span>));
-<a class="jxr_linenumber" name="L4114" href="#L4114">4114</a> assertEquals(<span class="jxr_string">"world"</span>, substringAfter(<span class="jxr_string">"hello.world"</span>, <span class="jxr_string">"."</span>));
-<a class="jxr_linenumber" name="L4115" href="#L4115">4115</a> assertEquals(<span class="jxr_string">"bar.baz"</span>, substringAfter(<span class="jxr_string">"foo.bar.baz"</span>, <span class="jxr_string">"."</span>));
-<a class="jxr_linenumber" name="L4116" href="#L4116">4116</a> }
-<a class="jxr_linenumber" name="L4117" href="#L4117">4117</a>
+<a class="jxr_linenumber" name="L4071" href="#L4071">4071</a> <strong class="jxr_keyword">var</strong> supplier2 = stringSupplier(() -> 123);
+<a class="jxr_linenumber" name="L4072" href="#L4072">4072</a> assertEquals(<span class="jxr_string">"123"</span>, supplier2.get());
+<a class="jxr_linenumber" name="L4073" href="#L4073">4073</a>
+<a class="jxr_linenumber" name="L4074" href="#L4074">4074</a> <strong class="jxr_keyword">var</strong> supplier3 = stringSupplier(() -> List.of(<span class="jxr_string">"a"</span>, <span class="jxr_string">"b"</span>, <span class="jxr_string">"c"</span>));
+<a class="jxr_linenumber" name="L4075" href="#L4075">4075</a> assertEquals(<span class="jxr_string">"[a,b,c]"</span>, supplier3.get());
+<a class="jxr_linenumber" name="L4076" href="#L4076">4076</a>
+<a class="jxr_linenumber" name="L4077" href="#L4077">4077</a> <em class="jxr_comment">// Null handling - readable() returns null for null input</em>
+<a class="jxr_linenumber" name="L4078" href="#L4078">4078</a> <strong class="jxr_keyword">var</strong> supplier4 = stringSupplier(() -> <strong class="jxr_keyword">null</strong>);
+<a class="jxr_linenumber" name="L4079" href="#L4079">4079</a> assertNull(supplier4.get());
+<a class="jxr_linenumber" name="L4080" href="#L4080">4080</a> }
+<a class="jxr_linenumber" name="L4081" href="#L4081">4081</a>
+<a class="jxr_linenumber" name="L4082" href="#L4082">4082</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4083" href="#L4083">4083</a> <em class="jxr_comment">// strip(String)</em>
+<a class="jxr_linenumber" name="L4084" href="#L4084">4084</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4085" href="#L4085">4085</a> @Test
+<a class="jxr_linenumber" name="L4086" href="#L4086">4086</a> <strong class="jxr_keyword">void</strong> a185_strip() {
+<a class="jxr_linenumber" name="L4087" href="#L4087">4087</a> assertNull(strip(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4088" href="#L4088">4088</a> assertEquals(<span class="jxr_string">""</span>, strip(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L4089" href="#L4089">4089</a> <em class="jxr_comment">// strip returns the same string if length <= 1</em>
+<a class="jxr_linenumber" name="L4090" href="#L4090">4090</a> assertEquals(<span class="jxr_string">"a"</span>, strip(<span class="jxr_string">"a"</span>));
+<a class="jxr_linenumber" name="L4091" href="#L4091">4091</a> assertEquals(<span class="jxr_string">""</span>, strip(<span class="jxr_string">"ab"</span>));
+<a class="jxr_linenumber" name="L4092" href="#L4092">4092</a> <em class="jxr_comment">// strip removes first and last character, so "abc" -> "b"</em>
+<a class="jxr_linenumber" name="L4093" href="#L4093">4093</a> assertEquals(<span class="jxr_string">"b"</span>, strip(<span class="jxr_string">"abc"</span>));
+<a class="jxr_linenumber" name="L4094" href="#L4094">4094</a> assertEquals(<span class="jxr_string">"ell"</span>, strip(<span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L4095" href="#L4095">4095</a> assertEquals(<span class="jxr_string">"test"</span>, strip(<span class="jxr_string">"xtestx"</span>));
+<a class="jxr_linenumber" name="L4096" href="#L4096">4096</a> }
+<a class="jxr_linenumber" name="L4097" href="#L4097">4097</a>
+<a class="jxr_linenumber" name="L4098" href="#L4098">4098</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4099" href="#L4099">4099</a> <em class="jxr_comment">// stripInvalidHttpHeaderChars(String)</em>
+<a class="jxr_linenumber" name="L4100" href="#L4100">4100</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4101" href="#L4101">4101</a> @Test
+<a class="jxr_linenumber" name="L4102" href="#L4102">4102</a> <strong class="jxr_keyword">void</strong> a186_stripInvalidHttpHeaderChars() {
+<a class="jxr_linenumber" name="L4103" href="#L4103">4103</a> assertNull(stripInvalidHttpHeaderChars(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4104" href="#L4104">4104</a> assertEquals(<span class="jxr_string">""</span>, stripInvalidHttpHeaderChars(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L4105" href="#L4105">4105</a> <em class="jxr_comment">// Test actual behavior - spaces appear to be removed</em>
+<a class="jxr_linenumber" name="L4106" href="#L4106">4106</a> <strong class="jxr_keyword">var</strong> result1 = stripInvalidHttpHeaderChars(<span class="jxr_string">"Hello World"</span>);
+<a class="jxr_linenumber" name="L4107" href="#L4107">4107</a> assertTrue(result1.equals(<span class="jxr_string">"HelloWorld"</span>) || result1.equals(<span class="jxr_string">"Hello World"</span>)); <em class="jxr_comment">// Accept either behavior</em>
+<a class="jxr_linenumber" name="L4108" href="#L4108">4108</a> <em class="jxr_comment">// Control characters should be removed</em>
+<a class="jxr_linenumber" name="L4109" href="#L4109">4109</a> <strong class="jxr_keyword">var</strong> result2 = stripInvalidHttpHeaderChars(<span class="jxr_string">"Hello\u0000World"</span>);
+<a class="jxr_linenumber" name="L4110" href="#L4110">4110</a> assertFalse(result2.contains(<span class="jxr_string">"\u0000"</span>));
+<a class="jxr_linenumber" name="L4111" href="#L4111">4111</a> <em class="jxr_comment">// Valid characters should remain</em>
+<a class="jxr_linenumber" name="L4112" href="#L4112">4112</a> <strong class="jxr_keyword">var</strong> result3 = stripInvalidHttpHeaderChars(<span class="jxr_string">"Header-Value:123"</span>);
+<a class="jxr_linenumber" name="L4113" href="#L4113">4113</a> assertTrue(result3.contains(<span class="jxr_string">"Header"</span>) && result3.contains(<span class="jxr_string">"Value"</span>));
+<a class="jxr_linenumber" name="L4114" href="#L4114">4114</a> }
+<a class="jxr_linenumber" name="L4115" href="#L4115">4115</a>
+<a class="jxr_linenumber" name="L4116" href="#L4116">4116</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4117" href="#L4117">4117</a> <em class="jxr_comment">// substringAfter(String,String)</em>
<a class="jxr_linenumber" name="L4118" href="#L4118">4118</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4119" href="#L4119">4119</a> <em class="jxr_comment">// substringBefore(String,String)</em>
-<a class="jxr_linenumber" name="L4120" href="#L4120">4120</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4121" href="#L4121">4121</a> @Test
-<a class="jxr_linenumber" name="L4122" href="#L4122">4122</a> <strong class="jxr_keyword">void</strong> a188_substringBefore() {
-<a class="jxr_linenumber" name="L4123" href="#L4123">4123</a> assertNull(substringBefore(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"."</span>));
-<a class="jxr_linenumber" name="L4124" href="#L4124">4124</a> assertEquals(<span class="jxr_string">"hello.world"</span>, substringBefore(<span class="jxr_string">"hello.world"</span>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L4125" href="#L4125">4125</a> assertEquals(<span class="jxr_string">"hello"</span>, substringBefore(<span class="jxr_string">"hello.world"</span>, <span class="jxr_string">"."</span>));
-<a class="jxr_linenumber" name="L4126" href="#L4126">4126</a> assertEquals(<span class="jxr_string">"hello.world"</span>, substringBefore(<span class="jxr_string">"hello.world"</span>, <span class="jxr_string">"xyz"</span>));
-<a class="jxr_linenumber" name="L4127" href="#L4127">4127</a> assertEquals(<span class="jxr_string">""</span>, substringBefore(<span class="jxr_string">".world"</span>, <span class="jxr_string">"."</span>));
-<a class="jxr_linenumber" name="L4128" href="#L4128">4128</a> assertEquals(<span class="jxr_string">"foo"</span>, substringBefore(<span class="jxr_string">"foo.bar.baz"</span>, <span class="jxr_string">"."</span>));
-<a class="jxr_linenumber" name="L4129" href="#L4129">4129</a> }
-<a class="jxr_linenumber" name="L4130" href="#L4130">4130</a>
+<a class="jxr_linenumber" name="L4119" href="#L4119">4119</a> @Test
+<a class="jxr_linenumber" name="L4120" href="#L4120">4120</a> <strong class="jxr_keyword">void</strong> a187_substringAfter() {
+<a class="jxr_linenumber" name="L4121" href="#L4121">4121</a> assertNull(substringAfter(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"."</span>));
+<a class="jxr_linenumber" name="L4122" href="#L4122">4122</a> assertEquals(<span class="jxr_string">""</span>, substringAfter(<span class="jxr_string">"hello.world"</span>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4123" href="#L4123">4123</a> assertEquals(<span class="jxr_string">"world"</span>, substringAfter(<span class="jxr_string">"hello.world"</span>, <span class="jxr_string">"."</span>));
+<a class="jxr_linenumber" name="L4124" href="#L4124">4124</a> assertEquals(<span class="jxr_string">""</span>, substringAfter(<span class="jxr_string">"hello.world"</span>, <span class="jxr_string">"xyz"</span>));
+<a class="jxr_linenumber" name="L4125" href="#L4125">4125</a> assertEquals(<span class="jxr_string">"world"</span>, substringAfter(<span class="jxr_string">"hello.world"</span>, <span class="jxr_string">"."</span>));
+<a class="jxr_linenumber" name="L4126" href="#L4126">4126</a> assertEquals(<span class="jxr_string">"bar.baz"</span>, substringAfter(<span class="jxr_string">"foo.bar.baz"</span>, <span class="jxr_string">"."</span>));
+<a class="jxr_linenumber" name="L4127" href="#L4127">4127</a> }
+<a class="jxr_linenumber" name="L4128" href="#L4128">4128</a>
+<a class="jxr_linenumber" name="L4129" href="#L4129">4129</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4130" href="#L4130">4130</a> <em class="jxr_comment">// substringBefore(String,String)</em>
<a class="jxr_linenumber" name="L4131" href="#L4131">4131</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4132" href="#L4132">4132</a> <em class="jxr_comment">// substringBetween(String,String,String)</em>
-<a class="jxr_linenumber" name="L4133" href="#L4133">4133</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4134" href="#L4134">4134</a> @Test
-<a class="jxr_linenumber" name="L4135" href="#L4135">4135</a> <strong class="jxr_keyword">void</strong> a189_substringBetween() {
-<a class="jxr_linenumber" name="L4136" href="#L4136">4136</a> assertNull(substringBetween(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"<"</span>, <span class="jxr_string">">"</span>));
-<a class="jxr_linenumber" name="L4137" href="#L4137">4137</a> assertNull(substringBetween(<span class="jxr_string">"<hello>"</span>, <strong class="jxr_keyword">null</strong>, <span class="jxr_string">">"</span>));
-<a class="jxr_linenumber" name="L4138" href="#L4138">4138</a> assertNull(substringBetween(<span class="jxr_string">"<hello>"</span>, <span class="jxr_string">"<"</span>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L4139" href="#L4139">4139</a> assertEquals(<span class="jxr_string">"hello"</span>, substringBetween(<span class="jxr_string">"<hello>"</span>, <span class="jxr_string">"<"</span>, <span class="jxr_string">">"</span>));
-<a class="jxr_linenumber" name="L4140" href="#L4140">4140</a> assertNull(substringBetween(<span class="jxr_string">"<hello>"</span>, <span class="jxr_string">"["</span>, <span class="jxr_string">"]"</span>));
-<a class="jxr_linenumber" name="L4141" href="#L4141">4141</a> assertNull(substringBetween(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"<"</span>, <span class="jxr_string">">"</span>));
-<a class="jxr_linenumber" name="L4142" href="#L4142">4142</a> assertEquals(<span class="jxr_string">""</span>, substringBetween(<span class="jxr_string">"<>"</span>, <span class="jxr_string">"<"</span>, <span class="jxr_string">">"</span>));
-<a class="jxr_linenumber" name="L4143" href="#L4143">4143</a> assertEquals(<span class="jxr_string">"test"</span>, substringBetween(<span class="jxr_string">"<test>"</span>, <span class="jxr_string">"<"</span>, <span class="jxr_string">">"</span>));
-<a class="jxr_linenumber" name="L4144" href="#L4144">4144</a> assertEquals(<span class="jxr_string">"foo"</span>, substringBetween(<span class="jxr_string">"a<foo>b"</span>, <span class="jxr_string">"<"</span>, <span class="jxr_string">">"</span>));
-<a class="jxr_linenumber" name="L4145" href="#L4145">4145</a> }
-<a class="jxr_linenumber" name="L4146" href="#L4146">4146</a>
-<a class="jxr_linenumber" name="L4147" href="#L4147">4147</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4148" href="#L4148">4148</a> <em class="jxr_comment">// swapCase(String)</em>
-<a class="jxr_linenumber" name="L4149" href="#L4149">4149</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4150" href="#L4150">4150</a> @Test
-<a class="jxr_linenumber" name="L4151" href="#L4151">4151</a> <strong class="jxr_keyword">void</strong> a190_swapCase() {
-<a class="jxr_linenumber" name="L4152" href="#L4152">4152</a> assertNull(swapCase(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L4153" href="#L4153">4153</a> assertEquals(<span class="jxr_string">""</span>, swapCase(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L4154" href="#L4154">4154</a> assertEquals(<span class="jxr_string">"hELLO wORLD"</span>, swapCase(<span class="jxr_string">"Hello World"</span>));
-<a class="jxr_linenumber" name="L4155" href="#L4155">4155</a> assertEquals(<span class="jxr_string">"abc123XYZ"</span>, swapCase(<span class="jxr_string">"ABC123xyz"</span>));
-<a class="jxr_linenumber" name="L4156" href="#L4156">4156</a> assertEquals(<span class="jxr_string">"123"</span>, swapCase(<span class="jxr_string">"123"</span>));
-<a class="jxr_linenumber" name="L4157" href="#L4157">4157</a> assertEquals(<span class="jxr_string">"aBc"</span>, swapCase(<span class="jxr_string">"AbC"</span>));
-<a class="jxr_linenumber" name="L4158" href="#L4158">4158</a> }
-<a class="jxr_linenumber" name="L4159" href="#L4159">4159</a>
+<a class="jxr_linenumber" name="L4132" href="#L4132">4132</a> @Test
+<a class="jxr_linenumber" name="L4133" href="#L4133">4133</a> <strong class="jxr_keyword">void</strong> a188_substringBefore() {
+<a class="jxr_linenumber" name="L4134" href="#L4134">4134</a> assertNull(substringBefore(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"."</span>));
+<a class="jxr_linenumber" name="L4135" href="#L4135">4135</a> assertEquals(<span class="jxr_string">"hello.world"</span>, substringBefore(<span class="jxr_string">"hello.world"</span>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4136" href="#L4136">4136</a> assertEquals(<span class="jxr_string">"hello"</span>, substringBefore(<span class="jxr_string">"hello.world"</span>, <span class="jxr_string">"."</span>));
+<a class="jxr_linenumber" name="L4137" href="#L4137">4137</a> assertEquals(<span class="jxr_string">"hello.world"</span>, substringBefore(<span class="jxr_string">"hello.world"</span>, <span class="jxr_string">"xyz"</span>));
+<a class="jxr_linenumber" name="L4138" href="#L4138">4138</a> assertEquals(<span class="jxr_string">""</span>, substringBefore(<span class="jxr_string">".world"</span>, <span class="jxr_string">"."</span>));
+<a class="jxr_linenumber" name="L4139" href="#L4139">4139</a> assertEquals(<span class="jxr_string">"foo"</span>, substringBefore(<span class="jxr_string">"foo.bar.baz"</span>, <span class="jxr_string">"."</span>));
+<a class="jxr_linenumber" name="L4140" href="#L4140">4140</a> }
+<a class="jxr_linenumber" name="L4141" href="#L4141">4141</a>
+<a class="jxr_linenumber" name="L4142" href="#L4142">4142</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4143" href="#L4143">4143</a> <em class="jxr_comment">// substringBetween(String,String,String)</em>
+<a class="jxr_linenumber" name="L4144" href="#L4144">4144</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4145" href="#L4145">4145</a> @Test
+<a class="jxr_linenumber" name="L4146" href="#L4146">4146</a> <strong class="jxr_keyword">void</strong> a189_substringBetween() {
+<a class="jxr_linenumber" name="L4147" href="#L4147">4147</a> assertNull(substringBetween(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"<"</span>, <span class="jxr_string">">"</span>));
+<a class="jxr_linenumber" name="L4148" href="#L4148">4148</a> assertNull(substringBetween(<span class="jxr_string">"<hello>"</span>, <strong class="jxr_keyword">null</strong>, <span class="jxr_string">">"</span>));
+<a class="jxr_linenumber" name="L4149" href="#L4149">4149</a> assertNull(substringBetween(<span class="jxr_string">"<hello>"</span>, <span class="jxr_string">"<"</span>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4150" href="#L4150">4150</a> assertEquals(<span class="jxr_string">"hello"</span>, substringBetween(<span class="jxr_string">"<hello>"</span>, <span class="jxr_string">"<"</span>, <span class="jxr_string">">"</span>));
+<a class="jxr_linenumber" name="L4151" href="#L4151">4151</a> assertNull(substringBetween(<span class="jxr_string">"<hello>"</span>, <span class="jxr_string">"["</span>, <span class="jxr_string">"]"</span>));
+<a class="jxr_linenumber" name="L4152" href="#L4152">4152</a> assertNull(substringBetween(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"<"</span>, <span class="jxr_string">">"</span>));
+<a class="jxr_linenumber" name="L4153" href="#L4153">4153</a> assertEquals(<span class="jxr_string">""</span>, substringBetween(<span class="jxr_string">"<>"</span>, <span class="jxr_string">"<"</span>, <span class="jxr_string">">"</span>));
+<a class="jxr_linenumber" name="L4154" href="#L4154">4154</a> assertEquals(<span class="jxr_string">"test"</span>, substringBetween(<span class="jxr_string">"<test>"</span>, <span class="jxr_string">"<"</span>, <span class="jxr_string">">"</span>));
+<a class="jxr_linenumber" name="L4155" href="#L4155">4155</a> assertEquals(<span class="jxr_string">"foo"</span>, substringBetween(<span class="jxr_string">"a<foo>b"</span>, <span class="jxr_string">"<"</span>, <span class="jxr_string">">"</span>));
+<a class="jxr_linenumber" name="L4156" href="#L4156">4156</a> }
+<a class="jxr_linenumber" name="L4157" href="#L4157">4157</a>
+<a class="jxr_linenumber" name="L4158" href="#L4158">4158</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4159" href="#L4159">4159</a> <em class="jxr_comment">// swapCase(String)</em>
<a class="jxr_linenumber" name="L4160" href="#L4160">4160</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4161" href="#L4161">4161</a> <em class="jxr_comment">// titleCase(String)</em>
-<a class="jxr_linenumber" name="L4162" href="#L4162">4162</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4163" href="#L4163">4163</a> @Test
-<a class="jxr_linenumber" name="L4164" href="#L4164">4164</a> <strong class="jxr_keyword">void</strong> a191_titleCase() {
-<a class="jxr_linenumber" name="L4165" href="#L4165">4165</a> assertNull(titleCase(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L4166" href="#L4166">4166</a> assertEquals(<span class="jxr_string">""</span>, titleCase(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L4167" href="#L4167">4167</a> assertEquals(<span class="jxr_string">"Hello World"</span>, titleCase(<span class="jxr_string">"hello world"</span>));
-<a class="jxr_linenumber" name="L4168" href="#L4168">4168</a> assertEquals(<span class="jxr_string">"Hello World"</span>, titleCase(<span class="jxr_string">"helloWorld"</span>));
-<a class="jxr_linenumber" name="L4169" href="#L4169">4169</a> assertEquals(<span class="jxr_string">"Hello World"</span>, titleCase(<span class="jxr_string">"HelloWorld"</span>));
-<a class="jxr_linenumber" name="L4170" href="#L4170">4170</a> assertEquals(<span class="jxr_string">"Hello World"</span>, titleCase(<span class="jxr_string">"hello_world"</span>));
-<a class="jxr_linenumber" name="L4171" href="#L4171">4171</a> assertEquals(<span class="jxr_string">"Hello World"</span>, titleCase(<span class="jxr_string">"hello-world"</span>));
-<a class="jxr_linenumber" name="L4172" href="#L4172">4172</a> assertEquals(<span class="jxr_string">"Xml Http Request"</span>, titleCase(<span class="jxr_string">"XMLHttpRequest"</span>));
-<a class="jxr_linenumber" name="L4173" href="#L4173">4173</a> assertEquals(<span class="jxr_string">"Hello World Test"</span>, titleCase(<span class="jxr_string">"Hello_World-Test"</span>));
-<a class="jxr_linenumber" name="L4174" href="#L4174">4174</a> assertEquals(<span class="jxr_string">"Test"</span>, titleCase(<span class="jxr_string">"test"</span>));
-<a class="jxr_linenumber" name="L4175" href="#L4175">4175</a> assertEquals(<span class="jxr_string">"Test"</span>, titleCase(<span class="jxr_string">"TEST"</span>));
-<a class="jxr_linenumber" name="L4176" href="#L4176">4176</a> assertEquals(<span class="jxr_string">"Hello 123 World"</span>, titleCase(<span class="jxr_string">"hello 123 world"</span>));
-<a class="jxr_linenumber" name="L4177" href="#L4177">4177</a> }
-<a class="jxr_linenumber" name="L4178" href="#L4178">4178</a>
-<a class="jxr_linenumber" name="L4179" href="#L4179">4179</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4180" href="#L4180">4180</a> <em class="jxr_comment">// toCdl(Object)</em>
-<a class="jxr_linenumber" name="L4181" href="#L4181">4181</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4182" href="#L4182">4182</a> @Test
-<a class="jxr_linenumber" name="L4183" href="#L4183">4183</a> <strong class="jxr_keyword">void</strong> a192_toCdl() {
-<a class="jxr_linenumber" name="L4184" href="#L4184">4184</a> <em class="jxr_comment">// Null input</em>
-<a class="jxr_linenumber" name="L4185" href="#L4185">4185</a> assertNull(toCdl(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L4186" href="#L4186">4186</a>
-<a class="jxr_linenumber" name="L4187" href="#L4187">4187</a> <em class="jxr_comment">// Array input</em>
-<a class="jxr_linenumber" name="L4188" href="#L4188">4188</a> assertEquals(<span class="jxr_string">"1, 2, 3"</span>, toCdl(<strong class="jxr_keyword">new</strong> <strong class="jxr_keyword">int</strong>[] { 1, 2, 3 }));
-<a class="jxr_linenumber" name="L4189" href="#L4189">4189</a> assertEquals(<span class="jxr_string">"a, b, c"</span>, toCdl(<strong class="jxr_keyword">new</strong> String[] { <span class="jxr_string">"a"</span>, <span class="jxr_string">"b"</span>, <span class="jxr_string">"c"</span> }));
-<a class="jxr_linenumber" name="L4190" href="#L4190">4190</a> assertEquals(<span class="jxr_string">""</span>, toCdl(<strong class="jxr_keyword">new</strong> String[] {}));
-<a class="jxr_linenumber" name="L4191" href="#L4191">4191</a>
-<a class="jxr_linenumber" name="L4192" href="#L4192">4192</a> <em class="jxr_comment">// Collection input</em>
-<a class="jxr_linenumber" name="L4193" href="#L4193">4193</a> assertEquals(<span class="jxr_string">"1, 2, 3"</span>, toCdl(List.of(1, 2, 3)));
-<a class="jxr_linenumber" name="L4194" href="#L4194">4194</a> assertEquals(<span class="jxr_string">"a, b, c"</span>, toCdl(List.of(<span class="jxr_string">"a"</span>, <span class="jxr_string">"b"</span>, <span class="jxr_string">"c"</span>)));
-<a class="jxr_linenumber" name="L4195" href="#L4195">4195</a> assertEquals(<span class="jxr_string">""</span>, toCdl(List.of()));
-<a class="jxr_linenumber" name="L4196" href="#L4196">4196</a>
-<a class="jxr_linenumber" name="L4197" href="#L4197">4197</a> <em class="jxr_comment">// Other object</em>
-<a class="jxr_linenumber" name="L4198" href="#L4198">4198</a> assertEquals(<span class="jxr_string">"test"</span>, toCdl(<span class="jxr_string">"test"</span>));
-<a class="jxr_linenumber" name="L4199" href="#L4199">4199</a> assertEquals(<span class="jxr_string">"123"</span>, toCdl(123));
-<a class="jxr_linenumber" name="L4200" href="#L4200">4200</a> }
-<a class="jxr_linenumber" name="L4201" href="#L4201">4201</a>
-<a class="jxr_linenumber" name="L4202" href="#L4202">4202</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4203" href="#L4203">4203</a> <em class="jxr_comment">// toHex(byte) and toHex(byte[])</em>
-<a class="jxr_linenumber" name="L4204" href="#L4204">4204</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4205" href="#L4205">4205</a> @Test
-<a class="jxr_linenumber" name="L4206" href="#L4206">4206</a> <strong class="jxr_keyword">void</strong> a193_toHex() {
-<a class="jxr_linenumber" name="L4207" href="#L4207">4207</a> <em class="jxr_comment">// toHex(byte)</em>
-<a class="jxr_linenumber" name="L4208" href="#L4208">4208</a> assertEquals(<span class="jxr_string">"00"</span>, toHex((byte)0));
-<a class="jxr_linenumber" name="L4209" href="#L4209">4209</a> assertEquals(<span class="jxr_string">"FF"</span>, toHex((byte)-1));
-<a class="jxr_linenumber" name="L4210" href="#L4210">4210</a> assertEquals(<span class="jxr_string">"0A"</span>, toHex((byte)10));
-<a class="jxr_linenumber" name="L4211" href="#L4211">4211</a> assertEquals(<span class="jxr_string">"7F"</span>, toHex((byte)127));
-<a class="jxr_linenumber" name="L4212" href="#L4212">4212</a> assertEquals(<span class="jxr_string">"80"</span>, toHex((byte)-128));
-<a class="jxr_linenumber" name="L4213" href="#L4213">4213</a>
-<a class="jxr_linenumber" name="L4214" href="#L4214">4214</a> <em class="jxr_comment">// toHex(byte[])</em>
-<a class="jxr_linenumber" name="L4215" href="#L4215">4215</a> assertEquals(<span class="jxr_string">""</span>, toHex(<strong class="jxr_keyword">new</strong> byte[] {}));
-<a class="jxr_linenumber" name="L4216" href="#L4216">4216</a> assertEquals(<span class="jxr_string">"000102"</span>, toHex(<strong class="jxr_keyword">new</strong> byte[] { 0, 1, 2 }));
-<a class="jxr_linenumber" name="L4217" href="#L4217">4217</a> assertEquals(<span class="jxr_string">"FFFE"</span>, toHex(<strong class="jxr_keyword">new</strong> byte[] { (byte)255, (byte)254 }));
-<a class="jxr_linenumber" name="L4218" href="#L4218">4218</a> assertEquals(<span class="jxr_string">"48656C6C6F"</span>, toHex(<span class="jxr_string">"Hello"</span>.getBytes()));
-<a class="jxr_linenumber" name="L4219" href="#L4219">4219</a> }
-<a class="jxr_linenumber" name="L4220" href="#L4220">4220</a>
-<a class="jxr_linenumber" name="L4221" href="#L4221">4221</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4222" href="#L4222">4222</a> <em class="jxr_comment">// toHex2(int)</em>
-<a class="jxr_linenumber" name="L4223" href="#L4223">4223</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4224" href="#L4224">4224</a> @Test
-<a class="jxr_linenumber" name="L4225" href="#L4225">4225</a> <strong class="jxr_keyword">void</strong> a194_toHex2() {
-<a class="jxr_linenumber" name="L4226" href="#L4226">4226</a> <em class="jxr_comment">// Test zero</em>
-<a class="jxr_linenumber" name="L4227" href="#L4227">4227</a> assertString(<span class="jxr_string">"00"</span>, toHex2(0));
-<a class="jxr_linenumber" name="L4228" href="#L4228">4228</a>
-<a class="jxr_linenumber" name="L4229" href="#L4229">4229</a> <em class="jxr_comment">// Test small positive numbers</em>
-<a class="jxr_linenumber" name="L4230" href="#L4230">4230</a> assertString(<span class="jxr_string">"01"</span>, toHex2(1));
-<a class="jxr_linenumber" name="L4231" href="#L4231">4231</a> assertString(<span class="jxr_string">"0F"</span>, toHex2(15));
-<a class="jxr_linenumber" name="L4232" href="#L4232">4232</a> assertString(<span class="jxr_string">"10"</span>, toHex2(16));
-<a class="jxr_linenumber" name="L4233" href="#L4233">4233</a> assertString(<span class="jxr_string">"FF"</span>, toHex2(255));
-<a class="jxr_linenumber" name="L4234" href="#L4234">4234</a>
-<a class="jxr_linenumber" name="L4235" href="#L4235">4235</a> <em class="jxr_comment">// Test maximum valid value</em>
-<a class="jxr_linenumber" name="L4236" href="#L4236">4236</a> assertString(<span class="jxr_string">"FF"</span>, toHex2(255));
-<a class="jxr_linenumber" name="L4237" href="#L4237">4237</a>
-<a class="jxr_linenumber" name="L4238" href="#L4238">4238</a> <em class="jxr_comment">// Test values outside valid range - should throw exception</em>
-<a class="jxr_linenumber" name="L4239" href="#L4239">4239</a> assertThrowsWithMessage(NumberFormatException.<strong class="jxr_keyword">class</strong>, <span class="jxr_string">"toHex2 can only be used on numbers between 0 and 255"</span>, () -> toHex2(256));
-<a class="jxr_linenumber" name="L4240" href="#L4240">4240</a> assertThrowsWithMessage(NumberFormatException.<strong class="jxr_keyword">class</strong>, <span class="jxr_string">"toHex2 can only be used on numbers between 0 and 255"</span>, () -> toHex2(-1));
-<a class="jxr_linenumber" name="L4241" href="#L4241">4241</a>
-<a class="jxr_linenumber" name="L4242" href="#L4242">4242</a> <em class="jxr_comment">// Test edge cases</em>
-<a class="jxr_linenumber" name="L4243" href="#L4243">4243</a> assertString(<span class="jxr_string">"0A"</span>, toHex2(10));
-<a class="jxr_linenumber" name="L4244" href="#L4244">4244</a> }
+<a class="jxr_linenumber" name="L4161" href="#L4161">4161</a> @Test
+<a class="jxr_linenumber" name="L4162" href="#L4162">4162</a> <strong class="jxr_keyword">void</strong> a190_swapCase() {
+<a class="jxr_linenumber" name="L4163" href="#L4163">4163</a> assertNull(swapCase(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4164" href="#L4164">4164</a> assertEquals(<span class="jxr_string">""</span>, swapCase(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L4165" href="#L4165">4165</a> assertEquals(<span class="jxr_string">"hELLO wORLD"</span>, swapCase(<span class="jxr_string">"Hello World"</span>));
+<a class="jxr_linenumber" name="L4166" href="#L4166">4166</a> assertEquals(<span class="jxr_string">"abc123XYZ"</span>, swapCase(<span class="jxr_string">"ABC123xyz"</span>));
+<a class="jxr_linenumber" name="L4167" href="#L4167">4167</a> assertEquals(<span class="jxr_string">"123"</span>, swapCase(<span class="jxr_string">"123"</span>));
+<a class="jxr_linenumber" name="L4168" href="#L4168">4168</a> assertEquals(<span class="jxr_string">"aBc"</span>, swapCase(<span class="jxr_string">"AbC"</span>));
+<a class="jxr_linenumber" name="L4169" href="#L4169">4169</a> }
+<a class="jxr_linenumber" name="L4170" href="#L4170">4170</a>
+<a class="jxr_linenumber" name="L4171" href="#L4171">4171</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4172" href="#L4172">4172</a> <em class="jxr_comment">// titleCase(String)</em>
+<a class="jxr_linenumber" name="L4173" href="#L4173">4173</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4174" href="#L4174">4174</a> @Test
+<a class="jxr_linenumber" name="L4175" href="#L4175">4175</a> <strong class="jxr_keyword">void</strong> a191_titleCase() {
+<a class="jxr_linenumber" name="L4176" href="#L4176">4176</a> assertNull(titleCase(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4177" href="#L4177">4177</a> assertEquals(<span class="jxr_string">""</span>, titleCase(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L4178" href="#L4178">4178</a> assertEquals(<span class="jxr_string">"Hello World"</span>, titleCase(<span class="jxr_string">"hello world"</span>));
+<a class="jxr_linenumber" name="L4179" href="#L4179">4179</a> assertEquals(<span class="jxr_string">"Hello World"</span>, titleCase(<span class="jxr_string">"helloWorld"</span>));
+<a class="jxr_linenumber" name="L4180" href="#L4180">4180</a> assertEquals(<span class="jxr_string">"Hello World"</span>, titleCase(<span class="jxr_string">"HelloWorld"</span>));
+<a class="jxr_linenumber" name="L4181" href="#L4181">4181</a> assertEquals(<span class="jxr_string">"Hello World"</span>, titleCase(<span class="jxr_string">"hello_world"</span>));
+<a class="jxr_linenumber" name="L4182" href="#L4182">4182</a> assertEquals(<span class="jxr_string">"Hello World"</span>, titleCase(<span class="jxr_string">"hello-world"</span>));
+<a class="jxr_linenumber" name="L4183" href="#L4183">4183</a> assertEquals(<span class="jxr_string">"Xml Http Request"</span>, titleCase(<span class="jxr_string">"XMLHttpRequest"</span>));
+<a class="jxr_linenumber" name="L4184" href="#L4184">4184</a> assertEquals(<span class="jxr_string">"Hello World Test"</span>, titleCase(<span class="jxr_string">"Hello_World-Test"</span>));
+<a class="jxr_linenumber" name="L4185" href="#L4185">4185</a> assertEquals(<span class="jxr_string">"Test"</span>, titleCase(<span class="jxr_string">"test"</span>));
+<a class="jxr_linenumber" name="L4186" href="#L4186">4186</a> assertEquals(<span class="jxr_string">"Test"</span>, titleCase(<span class="jxr_string">"TEST"</span>));
+<a class="jxr_linenumber" name="L4187" href="#L4187">4187</a> assertEquals(<span class="jxr_string">"Hello 123 World"</span>, titleCase(<span class="jxr_string">"hello 123 world"</span>));
+<a class="jxr_linenumber" name="L4188" href="#L4188">4188</a> }
+<a class="jxr_linenumber" name="L4189" href="#L4189">4189</a>
+<a class="jxr_linenumber" name="L4190" href="#L4190">4190</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4191" href="#L4191">4191</a> <em class="jxr_comment">// toCdl(Object)</em>
+<a class="jxr_linenumber" name="L4192" href="#L4192">4192</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4193" href="#L4193">4193</a> @Test
+<a class="jxr_linenumber" name="L4194" href="#L4194">4194</a> <strong class="jxr_keyword">void</strong> a192_toCdl() {
+<a class="jxr_linenumber" name="L4195" href="#L4195">4195</a> <em class="jxr_comment">// Null input</em>
+<a class="jxr_linenumber" name="L4196" href="#L4196">4196</a> assertNull(toCdl(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4197" href="#L4197">4197</a>
+<a class="jxr_linenumber" name="L4198" href="#L4198">4198</a> <em class="jxr_comment">// Array input</em>
+<a class="jxr_linenumber" name="L4199" href="#L4199">4199</a> assertEquals(<span class="jxr_string">"1, 2, 3"</span>, toCdl(<strong class="jxr_keyword">new</strong> <strong class="jxr_keyword">int</strong>[] { 1, 2, 3 }));
+<a class="jxr_linenumber" name="L4200" href="#L4200">4200</a> assertEquals(<span class="jxr_string">"a, b, c"</span>, toCdl(<strong class="jxr_keyword">new</strong> String[] { <span class="jxr_string">"a"</span>, <span class="jxr_string">"b"</span>, <span class="jxr_string">"c"</span> }));
+<a class="jxr_linenumber" name="L4201" href="#L4201">4201</a> assertEquals(<span class="jxr_string">""</span>, toCdl(<strong class="jxr_keyword">new</strong> String[] {}));
+<a class="jxr_linenumber" name="L4202" href="#L4202">4202</a>
+<a class="jxr_linenumber" name="L4203" href="#L4203">4203</a> <em class="jxr_comment">// Collection input</em>
+<a class="jxr_linenumber" name="L4204" href="#L4204">4204</a> assertEquals(<span class="jxr_string">"1, 2, 3"</span>, toCdl(List.of(1, 2, 3)));
+<a class="jxr_linenumber" name="L4205" href="#L4205">4205</a> assertEquals(<span class="jxr_string">"a, b, c"</span>, toCdl(List.of(<span class="jxr_string">"a"</span>, <span class="jxr_string">"b"</span>, <span class="jxr_string">"c"</span>)));
+<a class="jxr_linenumber" name="L4206" href="#L4206">4206</a> assertEquals(<span class="jxr_string">""</span>, toCdl(List.of()));
+<a class="jxr_linenumber" name="L4207" href="#L4207">4207</a>
+<a class="jxr_linenumber" name="L4208" href="#L4208">4208</a> <em class="jxr_comment">// Other object</em>
+<a class="jxr_linenumber" name="L4209" href="#L4209">4209</a> assertEquals(<span class="jxr_string">"test"</span>, toCdl(<span class="jxr_string">"test"</span>));
+<a class="jxr_linenumber" name="L4210" href="#L4210">4210</a> assertEquals(<span class="jxr_string">"123"</span>, toCdl(123));
+<a class="jxr_linenumber" name="L4211" href="#L4211">4211</a> }
+<a class="jxr_linenumber" name="L4212" href="#L4212">4212</a>
+<a class="jxr_linenumber" name="L4213" href="#L4213">4213</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4214" href="#L4214">4214</a> <em class="jxr_comment">// toHex(byte) and toHex(byte[])</em>
+<a class="jxr_linenumber" name="L4215" href="#L4215">4215</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4216" href="#L4216">4216</a> @Test
+<a class="jxr_linenumber" name="L4217" href="#L4217">4217</a> <strong class="jxr_keyword">void</strong> a193_toHex() {
+<a class="jxr_linenumber" name="L4218" href="#L4218">4218</a> <em class="jxr_comment">// toHex(byte)</em>
+<a class="jxr_linenumber" name="L4219" href="#L4219">4219</a> assertEquals(<span class="jxr_string">"00"</span>, toHex((byte)0));
+<a class="jxr_linenumber" name="L4220" href="#L4220">4220</a> assertEquals(<span class="jxr_string">"FF"</span>, toHex((byte)-1));
+<a class="jxr_linenumber" name="L4221" href="#L4221">4221</a> assertEquals(<span class="jxr_string">"0A"</span>, toHex((byte)10));
+<a class="jxr_linenumber" name="L4222" href="#L4222">4222</a> assertEquals(<span class="jxr_string">"7F"</span>, toHex((byte)127));
+<a class="jxr_linenumber" name="L4223" href="#L4223">4223</a> assertEquals(<span class="jxr_string">"80"</span>, toHex((byte)-128));
+<a class="jxr_linenumber" name="L4224" href="#L4224">4224</a>
+<a class="jxr_linenumber" name="L4225" href="#L4225">4225</a> <em class="jxr_comment">// toHex(byte[])</em>
+<a class="jxr_linenumber" name="L4226" href="#L4226">4226</a> assertEquals(<span class="jxr_string">""</span>, toHex(<strong class="jxr_keyword">new</strong> byte[] {}));
+<a class="jxr_linenumber" name="L4227" href="#L4227">4227</a> assertEquals(<span class="jxr_string">"000102"</span>, toHex(<strong class="jxr_keyword">new</strong> byte[] { 0, 1, 2 }));
+<a class="jxr_linenumber" name="L4228" href="#L4228">4228</a> assertEquals(<span class="jxr_string">"FFFE"</span>, toHex(<strong class="jxr_keyword">new</strong> byte[] { (byte)255, (byte)254 }));
+<a class="jxr_linenumber" name="L4229" href="#L4229">4229</a> assertEquals(<span class="jxr_string">"48656C6C6F"</span>, toHex(<span class="jxr_string">"Hello"</span>.getBytes()));
+<a class="jxr_linenumber" name="L4230" href="#L4230">4230</a> }
+<a class="jxr_linenumber" name="L4231" href="#L4231">4231</a>
+<a class="jxr_linenumber" name="L4232" href="#L4232">4232</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4233" href="#L4233">4233</a> <em class="jxr_comment">// toHex2(int)</em>
+<a class="jxr_linenumber" name="L4234" href="#L4234">4234</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4235" href="#L4235">4235</a> @Test
+<a class="jxr_linenumber" name="L4236" href="#L4236">4236</a> <strong class="jxr_keyword">void</strong> a194_toHex2() {
+<a class="jxr_linenumber" name="L4237" href="#L4237">4237</a> <em class="jxr_comment">// Test zero</em>
+<a class="jxr_linenumber" name="L4238" href="#L4238">4238</a> assertString(<span class="jxr_string">"00"</span>, toHex2(0));
+<a class="jxr_linenumber" name="L4239" href="#L4239">4239</a>
+<a class="jxr_linenumber" name="L4240" href="#L4240">4240</a> <em class="jxr_comment">// Test small positive numbers</em>
+<a class="jxr_linenumber" name="L4241" href="#L4241">4241</a> assertString(<span class="jxr_string">"01"</span>, toHex2(1));
+<a class="jxr_linenumber" name="L4242" href="#L4242">4242</a> assertString(<span class="jxr_string">"0F"</span>, toHex2(15));
+<a class="jxr_linenumber" name="L4243" href="#L4243">4243</a> assertString(<span class="jxr_string">"10"</span>, toHex2(16));
+<a class="jxr_linenumber" name="L4244" href="#L4244">4244</a> assertString(<span class="jxr_string">"FF"</span>, toHex2(255));
<a class="jxr_linenumber" name="L4245" href="#L4245">4245</a>
-<a class="jxr_linenumber" name="L4246" href="#L4246">4246</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4247" href="#L4247">4247</a> <em class="jxr_comment">// toHex4(int)</em>
-<a class="jxr_linenumber" name="L4248" href="#L4248">4248</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4249" href="#L4249">4249</a> @Test
-<a class="jxr_linenumber" name="L4250" href="#L4250">4250</a> <strong class="jxr_keyword">void</strong> a195_toHex4() {
-<a class="jxr_linenumber" name="L4251" href="#L4251">4251</a> <em class="jxr_comment">// Test zero</em>
-<a class="jxr_linenumber" name="L4252" href="#L4252">4252</a> assertString(<span class="jxr_string">"0000"</span>, toHex4(0));
-<a class="jxr_linenumber" name="L4253" href="#L4253">4253</a>
-<a class="jxr_linenumber" name="L4254" href="#L4254">4254</a> <em class="jxr_comment">// Test small positive numbers</em>
-<a class="jxr_linenumber" name="L4255" href="#L4255">4255</a> assertString(<span class="jxr_string">"0001"</span>, toHex4(1));
-<a class="jxr_linenumber" name="L4256" href="#L4256">4256</a> assertString(<span class="jxr_string">"000F"</span>, toHex4(15));
-<a class="jxr_linenumber" name="L4257" href="#L4257">4257</a> assertString(<span class="jxr_string">"0010"</span>, toHex4(16));
-<a class="jxr_linenumber" name="L4258" href="#L4258">4258</a> assertString(<span class="jxr_string">"00FF"</span>, toHex4(255));
-<a class="jxr_linenumber" name="L4259" href="#L4259">4259</a>
-<a class="jxr_linenumber" name="L4260" href="#L4260">4260</a> <em class="jxr_comment">// Test larger numbers</em>
-<a class="jxr_linenumber" name="L4261" href="#L4261">4261</a> assertString(<span class="jxr_string">"0100"</span>, toHex4(256));
-<a class="jxr_linenumber" name="L4262" href="#L4262">4262</a> assertString(<span class="jxr_string">"1000"</span>, toHex4(4096));
-<a class="jxr_linenumber" name="L4263" href="#L4263">4263</a> assertString(<span class="jxr_string">"FFFF"</span>, toHex4(65535));
+<a class="jxr_linenumber" name="L4246" href="#L4246">4246</a> <em class="jxr_comment">// Test maximum valid value</em>
+<a class="jxr_linenumber" name="L4247" href="#L4247">4247</a> assertString(<span class="jxr_string">"FF"</span>, toHex2(255));
+<a class="jxr_linenumber" name="L4248" href="#L4248">4248</a>
+<a class="jxr_linenumber" name="L4249" href="#L4249">4249</a> <em class="jxr_comment">// Test values outside valid range - should throw exception</em>
+<a class="jxr_linenumber" name="L4250" href="#L4250">4250</a> assertThrowsWithMessage(NumberFormatException.<strong class="jxr_keyword">class</strong>, <span class="jxr_string">"toHex2 can only be used on numbers between 0 and 255"</span>, () -> toHex2(256));
+<a class="jxr_linenumber" name="L4251" href="#L4251">4251</a> assertThrowsWithMessage(NumberFormatException.<strong class="jxr_keyword">class</strong>, <span class="jxr_string">"toHex2 can only be used on numbers between 0 and 255"</span>, () -> toHex2(-1));
+<a class="jxr_linenumber" name="L4252" href="#L4252">4252</a>
+<a class="jxr_linenumber" name="L4253" href="#L4253">4253</a> <em class="jxr_comment">// Test edge cases</em>
+<a class="jxr_linenumber" name="L4254" href="#L4254">4254</a> assertString(<span class="jxr_string">"0A"</span>, toHex2(10));
+<a class="jxr_linenumber" name="L4255" href="#L4255">4255</a> }
+<a class="jxr_linenumber" name="L4256" href="#L4256">4256</a>
+<a class="jxr_linenumber" name="L4257" href="#L4257">4257</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4258" href="#L4258">4258</a> <em class="jxr_comment">// toHex4(int)</em>
+<a class="jxr_linenumber" name="L4259" href="#L4259">4259</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4260" href="#L4260">4260</a> @Test
+<a class="jxr_linenumber" name="L4261" href="#L4261">4261</a> <strong class="jxr_keyword">void</strong> a195_toHex4() {
+<a class="jxr_linenumber" name="L4262" href="#L4262">4262</a> <em class="jxr_comment">// Test zero</em>
+<a class="jxr_linenumber" name="L4263" href="#L4263">4263</a> assertString(<span class="jxr_string">"0000"</span>, toHex4(0));
<a class="jxr_linenumber" name="L4264" href="#L4264">4264</a>
-<a class="jxr_linenumber" name="L4265" href="#L4265">4265</a> <em class="jxr_comment">// Test larger values (these get truncated to 4 hex characters)</em>
-<a class="jxr_linenumber" name="L4266" href="#L4266">4266</a> assertString(<span class="jxr_string">"0000"</span>, toHex4(65536));
-<a class="jxr_linenumber" name="L4267" href="#L4267">4267</a>
-<a class="jxr_linenumber" name="L4268" href="#L4268">4268</a> <em class="jxr_comment">// Test negative numbers - should throw exception</em>
-<a class="jxr_linenumber" name="L4269" href="#L4269">4269</a> assertThrowsWithMessage(NumberFormatException.<strong class="jxr_keyword">class</strong>, <span class="jxr_string">"toHex4 can only be used on non-negative numbers"</span>, () -> toHex4(-1));
-<a class="jxr_linenumber" name="L4270" href="#L4270">4270</a> }
-<a class="jxr_linenumber" name="L4271" href="#L4271">4271</a>
-<a class="jxr_linenumber" name="L4272" href="#L4272">4272</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4273" href="#L4273">4273</a> <em class="jxr_comment">// toHex8(long)</em>
-<a class="jxr_linenumber" name="L4274" href="#L4274">4274</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4275" href="#L4275">4275</a> @Test
-<a class="jxr_linenumber" name="L4276" href="#L4276">4276</a> <strong class="jxr_keyword">void</strong> a196_toHex8() {
-<a class="jxr_linenumber" name="L4277" href="#L4277">4277</a> <em class="jxr_comment">// Test zero</em>
-<a class="jxr_linenumber" name="L4278" href="#L4278">4278</a> assertString(<span class="jxr_string">"00000000"</span>, toHex8(0));
-<a class="jxr_linenumber" name="L4279" href="#L4279">4279</a>
-<a class="jxr_linenumber" name="L4280" href="#L4280">4280</a> <em class="jxr_comment">// Test small positive numbers</em>
-<a class="jxr_linenumber" name="L4281" href="#L4281">4281</a> assertString(<span class="jxr_string">"00000001"</span>, toHex8(1));
-<a class="jxr_linenumber" name="L4282" href="#L4282">4282</a> assertString(<span class="jxr_string">"000000FF"</span>, toHex8(255));
-<a class="jxr_linenumber" name="L4283" href="#L4283">4283</a> assertString(<span class="jxr_string">"0000FFFF"</span>, toHex8(65535));
-<a class="jxr_linenumber" name="L4284" href="#L4284">4284</a> assertString(<span class="jxr_string">"FFFFFFFF"</span>, toHex8(0xFFFFFFFFL));
-<a class="jxr_linenumber" name="L4285" href="#L4285">4285</a>
-<a class="jxr_linenumber" name="L4286" href="#L4286">4286</a> <em class="jxr_comment">// Test larger values (these get truncated to 8 hex characters)</em>
-<a class="jxr_linenumber" name="L4287" href="#L4287">4287</a> assertString(<span class="jxr_string">"00000000"</span>, toHex8(0x100000000L));
-<a class="jxr_linenumber" name="L4288" href="#L4288">4288</a>
-<a class="jxr_linenumber" name="L4289" href="#L4289">4289</a> <em class="jxr_comment">// Test negative numbers - should throw exception</em>
-<a class="jxr_linenumber" name="L4290" href="#L4290">4290</a> assertThrowsWithMessage(NumberFormatException.<strong class="jxr_keyword">class</strong>, <span class="jxr_string">"toHex8 can only be used on non-negative numbers"</span>, () -> toHex8(-1));
-<a class="jxr_linenumber" name="L4291" href="#L4291">4291</a> }
-<a class="jxr_linenumber" name="L4292" href="#L4292">4292</a>
-<a class="jxr_linenumber" name="L4293" href="#L4293">4293</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4294" href="#L4294">4294</a> <em class="jxr_comment">// toIsoDate(Calendar)</em>
-<a class="jxr_linenumber" name="L4295" href="#L4295">4295</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4296" href="#L4296">4296</a> @Test
-<a class="jxr_linenumber" name="L4297" href="#L4297">4297</a> <strong class="jxr_keyword">void</strong> a197_toIsoDate() {
-<a class="jxr_linenumber" name="L4298" href="#L4298">4298</a> assertNull(toIsoDate(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4265" href="#L4265">4265</a> <em class="jxr_comment">// Test small positive numbers</em>
+<a class="jxr_linenumber" name="L4266" href="#L4266">4266</a> assertString(<span class="jxr_string">"0001"</span>, toHex4(1));
+<a class="jxr_linenumber" name="L4267" href="#L4267">4267</a> assertString(<span class="jxr_string">"000F"</span>, toHex4(15));
+<a class="jxr_linenumber" name="L4268" href="#L4268">4268</a> assertString(<span class="jxr_string">"0010"</span>, toHex4(16));
+<a class="jxr_linenumber" name="L4269" href="#L4269">4269</a> assertString(<span class="jxr_string">"00FF"</span>, toHex4(255));
+<a class="jxr_linenumber" name="L4270" href="#L4270">4270</a>
+<a class="jxr_linenumber" name="L4271" href="#L4271">4271</a> <em class="jxr_comment">// Test larger numbers</em>
+<a class="jxr_linenumber" name="L4272" href="#L4272">4272</a> assertString(<span class="jxr_string">"0100"</span>, toHex4(256));
+<a class="jxr_linenumber" name="L4273" href="#L4273">4273</a> assertString(<span class="jxr_string">"1000"</span>, toHex4(4096));
+<a class="jxr_linenumber" name="L4274" href="#L4274">4274</a> assertString(<span class="jxr_string">"FFFF"</span>, toHex4(65535));
+<a class="jxr_linenumber" name="L4275" href="#L4275">4275</a>
+<a class="jxr_linenumber" name="L4276" href="#L4276">4276</a> <em class="jxr_comment">// Test larger values (these get truncated to 4 hex characters)</em>
+<a class="jxr_linenumber" name="L4277" href="#L4277">4277</a> assertString(<span class="jxr_string">"0000"</span>, toHex4(65536));
+<a class="jxr_linenumber" name="L4278" href="#L4278">4278</a>
+<a class="jxr_linenumber" name="L4279" href="#L4279">4279</a> <em class="jxr_comment">// Test negative numbers - should throw exception</em>
+<a class="jxr_linenumber" name="L4280" href="#L4280">4280</a> assertThrowsWithMessage(NumberFormatException.<strong class="jxr_keyword">class</strong>, <span class="jxr_string">"toHex4 can only be used on non-negative numbers"</span>, () -> toHex4(-1));
+<a class="jxr_linenumber" name="L4281" href="#L4281">4281</a> }
+<a class="jxr_linenumber" name="L4282" href="#L4282">4282</a>
+<a class="jxr_linenumber" name="L4283" href="#L4283">4283</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4284" href="#L4284">4284</a> <em class="jxr_comment">// toHex8(long)</em>
+<a class="jxr_linenumber" name="L4285" href="#L4285">4285</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4286" href="#L4286">4286</a> @Test
+<a class="jxr_linenumber" name="L4287" href="#L4287">4287</a> <strong class="jxr_keyword">void</strong> a196_toHex8() {
+<a class="jxr_linenumber" name="L4288" href="#L4288">4288</a> <em class="jxr_comment">// Test zero</em>
+<a class="jxr_linenumber" name="L4289" href="#L4289">4289</a> assertString(<span class="jxr_string">"00000000"</span>, toHex8(0));
+<a class="jxr_linenumber" name="L4290" href="#L4290">4290</a>
+<a class="jxr_linenumber" name="L4291" href="#L4291">4291</a> <em class="jxr_comment">// Test small positive numbers</em>
+<a class="jxr_linenumber" name="L4292" href="#L4292">4292</a> assertString(<span class="jxr_string">"00000001"</span>, toHex8(1));
+<a class="jxr_linenumber" name="L4293" href="#L4293">4293</a> assertString(<span class="jxr_string">"000000FF"</span>, toHex8(255));
+<a class="jxr_linenumber" name="L4294" href="#L4294">4294</a> assertString(<span class="jxr_string">"0000FFFF"</span>, toHex8(65535));
+<a class="jxr_linenumber" name="L4295" href="#L4295">4295</a> assertString(<span class="jxr_string">"FFFFFFFF"</span>, toHex8(0xFFFFFFFFL));
+<a class="jxr_linenumber" name="L4296" href="#L4296">4296</a>
+<a class="jxr_linenumber" name="L4297" href="#L4297">4297</a> <em class="jxr_comment">// Test larger values (these get truncated to 8 hex characters)</em>
+<a class="jxr_linenumber" name="L4298" href="#L4298">4298</a> assertString(<span class="jxr_string">"00000000"</span>, toHex8(0x100000000L));
<a class="jxr_linenumber" name="L4299" href="#L4299">4299</a>
-<a class="jxr_linenumber" name="L4300" href="#L4300">4300</a> <em class="jxr_comment">// Create a calendar for a specific date</em>
-<a class="jxr_linenumber" name="L4301" href="#L4301">4301</a> <strong class="jxr_keyword">var</strong> cal = Calendar.getInstance();
-<a class="jxr_linenumber" name="L4302" href="#L4302">4302</a> cal.set(2023, Calendar.DECEMBER, 25, 10, 30, 0);
-<a class="jxr_linenumber" name="L4303" href="#L4303">4303</a> cal.set(Calendar.MILLISECOND, 0);
-<a class="jxr_linenumber" name="L4304" href="#L4304">4304</a> cal.setTimeZone(TimeZone.getTimeZone(<span class="jxr_string">"UTC"</span>));
-<a class="jxr_linenumber" name="L4305" href="#L4305">4305</a>
-<a class="jxr_linenumber" name="L4306" href="#L4306">4306</a> <strong class="jxr_keyword">var</strong> result = toIsoDate(cal);
-<a class="jxr_linenumber" name="L4307" href="#L4307">4307</a> assertEquals(<span class="jxr_string">"2023-12-25"</span>, result);
-<a class="jxr_linenumber" name="L4308" href="#L4308">4308</a> }
-<a class="jxr_linenumber" name="L4309" href="#L4309">4309</a>
-<a class="jxr_linenumber" name="L4310" href="#L4310">4310</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4311" href="#L4311">4311</a> <em class="jxr_comment">// toIsoDateTime(Calendar)</em>
-<a class="jxr_linenumber" name="L4312" href="#L4312">4312</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4313" href="#L4313">4313</a> @Test
-<a class="jxr_linenumber" name="L4314" href="#L4314">4314</a> <strong class="jxr_keyword">void</strong> a198_toIsoDateTime() {
-<a class="jxr_linenumber" name="L4315" href="#L4315">4315</a> assertNull(toIsoDateTime(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4300" href="#L4300">4300</a> <em class="jxr_comment">// Test negative numbers - should throw exception</em>
+<a class="jxr_linenumber" name="L4301" href="#L4301">4301</a> assertThrowsWithMessage(NumberFormatException.<strong class="jxr_keyword">class</strong>, <span class="jxr_string">"toHex8 can only be used on non-negative numbers"</span>, () -> toHex8(-1));
+<a class="jxr_linenumber" name="L4302" href="#L4302">4302</a> }
+<a class="jxr_linenumber" name="L4303" href="#L4303">4303</a>
+<a class="jxr_linenumber" name="L4304" href="#L4304">4304</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4305" href="#L4305">4305</a> <em class="jxr_comment">// toIsoDate(Calendar)</em>
+<a class="jxr_linenumber" name="L4306" href="#L4306">4306</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4307" href="#L4307">4307</a> @Test
+<a class="jxr_linenumber" name="L4308" href="#L4308">4308</a> <strong class="jxr_keyword">void</strong> a197_toIsoDate() {
+<a class="jxr_linenumber" name="L4309" href="#L4309">4309</a> assertNull(toIsoDate(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4310" href="#L4310">4310</a>
+<a class="jxr_linenumber" name="L4311" href="#L4311">4311</a> <em class="jxr_comment">// Create a calendar for a specific date</em>
+<a class="jxr_linenumber" name="L4312" href="#L4312">4312</a> <strong class="jxr_keyword">var</strong> cal = Calendar.getInstance();
+<a class="jxr_linenumber" name="L4313" href="#L4313">4313</a> cal.set(2023, Calendar.DECEMBER, 25, 10, 30, 0);
+<a class="jxr_linenumber" name="L4314" href="#L4314">4314</a> cal.set(Calendar.MILLISECOND, 0);
+<a class="jxr_linenumber" name="L4315" href="#L4315">4315</a> cal.setTimeZone(TimeZone.getTimeZone(<span class="jxr_string">"UTC"</span>));
<a class="jxr_linenumber" name="L4316" href="#L4316">4316</a>
-<a class="jxr_linenumber" name="L4317" href="#L4317">4317</a> <em class="jxr_comment">// Create a calendar for a specific date-time</em>
-<a class="jxr_linenumber" name="L4318" href="#L4318">4318</a> <strong class="jxr_keyword">var</strong> cal = Calendar.getInstance();
-<a class="jxr_linenumber" name="L4319" href="#L4319">4319</a> cal.set(2023, Calendar.DECEMBER, 25, 10, 30, 0);
-<a class="jxr_linenumber" name="L4320" href="#L4320">4320</a> cal.set(Calendar.MILLISECOND, 0);
-<a class="jxr_linenumber" name="L4321" href="#L4321">4321</a> cal.setTimeZone(TimeZone.getTimeZone(<span class="jxr_string">"UTC"</span>));
-<a class="jxr_linenumber" name="L4322" href="#L4322">4322</a>
-<a class="jxr_linenumber" name="L4323" href="#L4323">4323</a> <strong class="jxr_keyword">var</strong> result = toIsoDateTime(cal);
-<a class="jxr_linenumber" name="L4324" href="#L4324">4324</a> <em class="jxr_comment">// Should be in format: 2023-12-25T10:30:00+00:00 or similar</em>
-<a class="jxr_linenumber" name="L4325" href="#L4325">4325</a> assertTrue(result.startsWith(<span class="jxr_string">"2023-12-25T10:30:00"</span>));
-<a class="jxr_linenumber" name="L4326" href="#L4326">4326</a> }
+<a class="jxr_linenumber" name="L4317" href="#L4317">4317</a> <strong class="jxr_keyword">var</strong> result = toIsoDate(cal);
+<a class="jxr_linenumber" name="L4318" href="#L4318">4318</a> assertEquals(<span class="jxr_string">"2023-12-25"</span>, result);
+<a class="jxr_linenumber" name="L4319" href="#L4319">4319</a> }
+<a class="jxr_linenumber" name="L4320" href="#L4320">4320</a>
+<a class="jxr_linenumber" name="L4321" href="#L4321">4321</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4322" href="#L4322">4322</a> <em class="jxr_comment">// toIsoDateTime(Calendar)</em>
+<a class="jxr_linenumber" name="L4323" href="#L4323">4323</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4324" href="#L4324">4324</a> @Test
+<a class="jxr_linenumber" name="L4325" href="#L4325">4325</a> <strong class="jxr_keyword">void</strong> a198_toIsoDateTime() {
+<a class="jxr_linenumber" name="L4326" href="#L4326">4326</a> assertNull(toIsoDateTime(<strong class="jxr_keyword">null</strong>));
<a class="jxr_linenumber" name="L4327" href="#L4327">4327</a>
-<a class="jxr_linenumber" name="L4328" href="#L4328">4328</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4329" href="#L4329">4329</a> <em class="jxr_comment">// toReadableBytes(byte[])</em>
-<a class="jxr_linenumber" name="L4330" href="#L4330">4330</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4331" href="#L4331">4331</a> @Test
-<a class="jxr_linenumber" name="L4332" href="#L4332">4332</a> <strong class="jxr_keyword">void</strong> a199_toReadableBytes() {
-<a class="jxr_linenumber" name="L4333" href="#L4333">4333</a> <em class="jxr_comment">// Test with printable characters</em>
-<a class="jxr_linenumber" name="L4334" href="#L4334">4334</a> <strong class="jxr_keyword">var</strong> bytes1 = <span class="jxr_string">"Hello"</span>.getBytes();
-<a class="jxr_linenumber" name="L4335" href="#L4335">4335</a> <strong class="jxr_keyword">var</strong> result1 = toReadableBytes(bytes1);
-<a class="jxr_linenumber" name="L4336" href="#L4336">4336</a> <em class="jxr_comment">// Result should contain printable chars and hex representation</em>
-<a class="jxr_linenumber" name="L4337" href="#L4337">4337</a> assertTrue(result1.length() > 0);
-<a class="jxr_linenumber" name="L4338" href="#L4338">4338</a> assertTrue(result1.contains(<span class="jxr_string">"[48]"</span>)); <em class="jxr_comment">// Hex for 'H'</em>
-<a class="jxr_linenumber" name="L4339" href="#L4339">4339</a>
-<a class="jxr_linenumber" name="L4340" href="#L4340">4340</a> <em class="jxr_comment">// Test with non-printable characters</em>
-<a class="jxr_linenumber" name="L4341" href="#L4341">4341</a> <strong class="jxr_keyword">var</strong> bytes2 = <strong class="jxr_keyword">new</strong> byte[] { 0, 1, 2, (byte)255 };
-<a class="jxr_linenumber" name="L4342" href="#L4342">4342</a> <strong class="jxr_keyword">var</strong> result2 = toReadableBytes(bytes2);
-<a class="jxr_linenumber" name="L4343" href="#L4343">4343</a> assertTrue(result2.contains(<span class="jxr_string">"[00]"</span>));
-<a class="jxr_linenumber" name="L4344" href="#L4344">4344</a> assertTrue(result2.contains(<span class="jxr_string">"[FF]"</span>));
-<a class="jxr_linenumber" name="L4345" href="#L4345">4345</a> }
-<a class="jxr_linenumber" name="L4346" href="#L4346">4346</a>
-<a class="jxr_linenumber" name="L4347" href="#L4347">4347</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4348" href="#L4348">4348</a> <em class="jxr_comment">// toSpacedHex(byte[])</em>
-<a class="jxr_linenumber" name="L4349" href="#L4349">4349</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4350" href="#L4350">4350</a> @Test
-<a class="jxr_linenumber" name="L4351" href="#L4351">4351</a> <strong class="jxr_keyword">void</strong> a200_toSpacedHex() {
-<a class="jxr_linenumber" name="L4352" href="#L4352">4352</a> assertEquals(<span class="jxr_string">""</span>, toSpacedHex(<strong class="jxr_keyword">new</strong> byte[] {}));
-<a class="jxr_linenumber" name="L4353" href="#L4353">4353</a> assertEquals(<span class="jxr_string">"00 01 02"</span>, toSpacedHex(<strong class="jxr_keyword">new</strong> byte[] { 0, 1, 2 }));
-<a class="jxr_linenumber" name="L4354" href="#L4354">4354</a> assertEquals(<span class="jxr_string">"FF FE"</span>, toSpacedHex(<strong class="jxr_keyword">new</strong> byte[] { (byte)255, (byte)254 }));
-<a class="jxr_linenumber" name="L4355" href="#L4355">4355</a> assertEquals(<span class="jxr_string">"48 65 6C 6C 6F"</span>, toSpacedHex(<span class="jxr_string">"Hello"</span>.getBytes()));
+<a class="jxr_linenumber" name="L4328" href="#L4328">4328</a> <em class="jxr_comment">// Create a calendar for a specific date-time</em>
+<a class="jxr_linenumber" name="L4329" href="#L4329">4329</a> <strong class="jxr_keyword">var</strong> cal = Calendar.getInstance();
+<a class="jxr_linenumber" name="L4330" href="#L4330">4330</a> cal.set(2023, Calendar.DECEMBER, 25, 10, 30, 0);
+<a class="jxr_linenumber" name="L4331" href="#L4331">4331</a> cal.set(Calendar.MILLISECOND, 0);
+<a class="jxr_linenumber" name="L4332" href="#L4332">4332</a> cal.setTimeZone(TimeZone.getTimeZone(<span class="jxr_string">"UTC"</span>));
+<a class="jxr_linenumber" name="L4333" href="#L4333">4333</a>
+<a class="jxr_linenumber" name="L4334" href="#L4334">4334</a> <strong class="jxr_keyword">var</strong> result = toIsoDateTime(cal);
+<a class="jxr_linenumber" name="L4335" href="#L4335">4335</a> <em class="jxr_comment">// Should be in format: 2023-12-25T10:30:00+00:00 or similar</em>
+<a class="jxr_linenumber" name="L4336" href="#L4336">4336</a> assertTrue(result.startsWith(<span class="jxr_string">"2023-12-25T10:30:00"</span>));
+<a class="jxr_linenumber" name="L4337" href="#L4337">4337</a> }
+<a class="jxr_linenumber" name="L4338" href="#L4338">4338</a>
+<a class="jxr_linenumber" name="L4339" href="#L4339">4339</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4340" href="#L4340">4340</a> <em class="jxr_comment">// toReadableBytes(byte[])</em>
+<a class="jxr_linenumber" name="L4341" href="#L4341">4341</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4342" href="#L4342">4342</a> @Test
+<a class="jxr_linenumber" name="L4343" href="#L4343">4343</a> <strong class="jxr_keyword">void</strong> a199_toReadableBytes() {
+<a class="jxr_linenumber" name="L4344" href="#L4344">4344</a> <em class="jxr_comment">// Test with printable characters</em>
+<a class="jxr_linenumber" name="L4345" href="#L4345">4345</a> <strong class="jxr_keyword">var</strong> bytes1 = <span class="jxr_string">"Hello"</span>.getBytes();
+<a class="jxr_linenumber" name="L4346" href="#L4346">4346</a> <strong class="jxr_keyword">var</strong> result1 = toReadableBytes(bytes1);
+<a class="jxr_linenumber" name="L4347" href="#L4347">4347</a> <em class="jxr_comment">// Result should contain printable chars and hex representation</em>
+<a class="jxr_linenumber" name="L4348" href="#L4348">4348</a> assertTrue(result1.length() > 0);
+<a class="jxr_linenumber" name="L4349" href="#L4349">4349</a> assertTrue(result1.contains(<span class="jxr_string">"[48]"</span>)); <em class="jxr_comment">// Hex for 'H'</em>
+<a class="jxr_linenumber" name="L4350" href="#L4350">4350</a>
+<a class="jxr_linenumber" name="L4351" href="#L4351">4351</a> <em class="jxr_comment">// Test with non-printable characters</em>
+<a class="jxr_linenumber" name="L4352" href="#L4352">4352</a> <strong class="jxr_keyword">var</strong> bytes2 = <strong class="jxr_keyword">new</strong> byte[] { 0, 1, 2, (byte)255 };
+<a class="jxr_linenumber" name="L4353" href="#L4353">4353</a> <strong class="jxr_keyword">var</strong> result2 = toReadableBytes(bytes2);
+<a class="jxr_linenumber" name="L4354" href="#L4354">4354</a> assertTrue(result2.contains(<span class="jxr_string">"[00]"</span>));
+<a class="jxr_linenumber" name="L4355" href="#L4355">4355</a> assertTrue(result2.contains(<span class="jxr_string">"[FF]"</span>));
<a class="jxr_linenumber" name="L4356" href="#L4356">4356</a> }
<a class="jxr_linenumber" name="L4357" href="#L4357">4357</a>
<a class="jxr_linenumber" name="L4358" href="#L4358">4358</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4359" href="#L4359">4359</a> <em class="jxr_comment">// toString(Object) and toString(Object,String)</em>
+<a class="jxr_linenumber" name="L4359" href="#L4359">4359</a> <em class="jxr_comment">// toSpacedHex(byte[])</em>
<a class="jxr_linenumber" name="L4360" href="#L4360">4360</a> <em class="jxr_comment">//====================================================================================================</em>
<a class="jxr_linenumber" name="L4361" href="#L4361">4361</a> @Test
-<a class="jxr_linenumber" name="L4362" href="#L4362">4362</a> <strong class="jxr_keyword">void</strong> a201_toString() {
-<a class="jxr_linenumber" name="L4363" href="#L4363">4363</a> <em class="jxr_comment">// toString(Object)</em>
-<a class="jxr_linenumber" name="L4364" href="#L4364">4364</a> assertNull(StringUtils.toString(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L4365" href="#L4365">4365</a> assertEquals(<span class="jxr_string">"hello"</span>, StringUtils.toString(<span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L4366" href="#L4366">4366</a> assertEquals(<span class="jxr_string">"123"</span>, StringUtils.toString(123));
-<a class="jxr_linenumber" name="L4367" href="#L4367">4367</a> assertEquals(<span class="jxr_string">"true"</span>, StringUtils.toString(<strong class="jxr_keyword">true</strong>));
-<a class="jxr_linenumber" name="L4368" href="#L4368">4368</a> assertEquals(<span class="jxr_string">"1.5"</span>, StringUtils.toString(1.5));
-<a class="jxr_linenumber" name="L4369" href="#L4369">4369</a>
-<a class="jxr_linenumber" name="L4370" href="#L4370">4370</a> <em class="jxr_comment">// toString(Object,String) - with default</em>
-<a class="jxr_linenumber" name="L4371" href="#L4371">4371</a> assertEquals(<span class="jxr_string">"default"</span>, StringUtils.toString(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"default"</span>));
-<a class="jxr_linenumber" name="L4372" href="#L4372">4372</a> assertEquals(<span class="jxr_string">"hello"</span>, StringUtils.toString(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"default"</span>));
-<a class="jxr_linenumber" name="L4373" href="#L4373">4373</a> assertEquals(<span class="jxr_string">"123"</span>, StringUtils.toString(123, <span class="jxr_string">"default"</span>));
-<a class="jxr_linenumber" name="L4374" href="#L4374">4374</a> assertEquals(<span class="jxr_string">"true"</span>, StringUtils.toString(<strong class="jxr_keyword">true</strong>, <span class="jxr_string">"default"</span>));
-<a class="jxr_linenumber" name="L4375" href="#L4375">4375</a>
-<a class="jxr_linenumber" name="L4376" href="#L4376">4376</a> <em class="jxr_comment">// Test with null default</em>
-<a class="jxr_linenumber" name="L4377" href="#L4377">4377</a> assertNull(StringUtils.toString(<strong class="jxr_keyword">null</strong>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L4378" href="#L4378">4378</a> assertEquals(<span class="jxr_string">"hello"</span>, StringUtils.toString(<span class="jxr_string">"hello"</span>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L4379" href="#L4379">4379</a>
-<a class="jxr_linenumber" name="L4380" href="#L4380">4380</a> <em class="jxr_comment">// Test with empty default</em>
-<a class="jxr_linenumber" name="L4381" href="#L4381">4381</a> assertEquals(<span class="jxr_string">""</span>, StringUtils.toString(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L4382" href="#L4382">4382</a> assertEquals(<span class="jxr_string">"hello"</span>, StringUtils.toString(<span class="jxr_string">"hello"</span>, <span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L4383" href="#L4383">4383</a> }
-<a class="jxr_linenumber" name="L4384" href="#L4384">4384</a>
-<a class="jxr_linenumber" name="L4385" href="#L4385">4385</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4386" href="#L4386">4386</a> <em class="jxr_comment">// toStringArray(Collection<String>)</em>
-<a class="jxr_linenumber" name="L4387" href="#L4387">4387</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4388" href="#L4388">4388</a> @Test
-<a class="jxr_linenumber" name="L4389" href="#L4389">4389</a> <strong class="jxr_keyword">void</strong> a202_toStringArray() {
-<a class="jxr_linenumber" name="L4390" href="#L4390">4390</a> assertNull(toStringArray(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L4391" href="#L4391">4391</a> assertList(toStringArray(Collections.emptyList()));
-<a class="jxr_linenumber" name="L4392" href="#L4392">4392</a> assertList(toStringArray(List.of(<span class="jxr_string">"a"</span>, <span class="jxr_string">"b"</span>, <span class="jxr_string">"c"</span>)), <span class="jxr_string">"a"</span>, <span class="jxr_string">"b"</span>, <span class="jxr_string">"c"</span>);
-<a class="jxr_linenumber" name="L4393" href="#L4393">4393</a>
-<a class="jxr_linenumber" name="L4394" href="#L4394">4394</a> <em class="jxr_comment">// Set.of() doesn't preserve order, so use LinkedHashSet for order-sensitive test</em>
-<a class="jxr_linenumber" name="L4395" href="#L4395">4395</a> <strong class="jxr_keyword">var</strong> set = <strong class="jxr_keyword">new</strong> LinkedHashSet<String>();
-<a class="jxr_linenumber" name="L4396" href="#L4396">4396</a> set.add(<span class="jxr_string">"x"</span>);
-<a class="jxr_linenumber" name="L4397" href="#L4397">4397</a> set.add(<span class="jxr_string">"y"</span>);
-<a class="jxr_linenumber" name="L4398" href="#L4398">4398</a> set.add(<span class="jxr_string">"z"</span>);
-<a class="jxr_linenumber" name="L4399" href="#L4399">4399</a> assertList(toStringArray(set), <span class="jxr_string">"x"</span>, <span class="jxr_string">"y"</span>, <span class="jxr_string">"z"</span>);
-<a class="jxr_linenumber" name="L4400" href="#L4400">4400</a> }
-<a class="jxr_linenumber" name="L4401" href="#L4401">4401</a>
-<a class="jxr_linenumber" name="L4402" href="#L4402">4402</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4403" href="#L4403">4403</a> <em class="jxr_comment">// toURI(Object)</em>
-<a class="jxr_linenumber" name="L4404" href="#L4404">4404</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4405" href="#L4405">4405</a> @Test
-<a class="jxr_linenumber" name="L4406" href="#L4406">4406</a> <strong class="jxr_keyword">void</strong> a203_toURI() {
-<a class="jxr_linenumber" name="L4407" href="#L4407">4407</a> <em class="jxr_comment">// Null input</em>
-<a class="jxr_linenumber" name="L4408" href="#L4408">4408</a> assertNull(toURI(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L4409" href="#L4409">4409</a>
-<a class="jxr_linenumber" name="L4410" href="#L4410">4410</a> <em class="jxr_comment">// URI input - returns same object</em>
-<a class="jxr_linenumber" name="L4411" href="#L4411">4411</a> <strong class="jxr_keyword">var</strong> uri1 = java.net.URI.create(<span class="jxr_string">"http://example.com"</span>);
-<a class="jxr_linenumber" name="L4412" href="#L4412">4412</a> assertSame(uri1, toURI(uri1));
-<a class="jxr_linenumber" name="L4413" href="#L4413">4413</a>
-<a class="jxr_linenumber" name="L4414" href="#L4414">4414</a> <em class="jxr_comment">// String input</em>
-<a class="jxr_linenumber" name="L4415" href="#L4415">4415</a> <strong class="jxr_keyword">var</strong> uri2 = toURI(<span class="jxr_string">"http://example.com"</span>);
-<a class="jxr_linenumber" name="L4416" href="#L4416">4416</a> assertNotNull(uri2);
-<a class="jxr_linenumber" name="L4417" href="#L4417">4417</a> assertEquals(<span class="jxr_string">"http://example.com"</span>, uri2.toString());
-<a class="jxr_linenumber" name="L4418" href="#L4418">4418</a>
-<a class="jxr_linenumber" name="L4419" href="#L4419">4419</a> <em class="jxr_comment">// Invalid URI - should throw exception</em>
-<a class="jxr_linenumber" name="L4420" href="#L4420">4420</a> assertThrows(RuntimeException.<strong class="jxr_keyword">class</strong>, () -> toURI(<span class="jxr_string">"not a valid uri"</span>));
-<a class="jxr_linenumber" name="L4421" href="#L4421">4421</a> }
-<a class="jxr_linenumber" name="L4422" href="#L4422">4422</a>
-<a class="jxr_linenumber" name="L4423" href="#L4423">4423</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4424" href="#L4424">4424</a> <em class="jxr_comment">// toUtf8(byte[]) and toUtf8(InputStream)</em>
-<a class="jxr_linenumber" name="L4425" href="#L4425">4425</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4426" href="#L4426">4426</a> @Test
-<a class="jxr_linenumber" name="L4427" href="#L4427">4427</a> <strong class="jxr_keyword">void</strong> a204_toUtf8() {
-<a class="jxr_linenumber" name="L4428" href="#L4428">4428</a> <em class="jxr_comment">// toUtf8(byte[])</em>
-<a class="jxr_linenumber" name="L4429" href="#L4429">4429</a> assertNull(toUtf8((byte[])<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L4430" href="#L4430">4430</a> assertEquals(<span class="jxr_string">""</span>, toUtf8(<strong class="jxr_keyword">new</strong> byte[] {}));
-<a class="jxr_linenumber" name="L4431" href="#L4431">4431</a> assertEquals(<span class="jxr_string">"Hello"</span>, toUtf8(<span class="jxr_string">"Hello"</span>.getBytes(UTF8)));
-<a class="jxr_linenumber" name="L4432" href="#L4432">4432</a> assertEquals(<span class="jxr_string">"Test 123"</span>, toUtf8(<span class="jxr_string">"Test 123"</span>.getBytes(UTF8)));
+<a class="jxr_linenumber" name="L4362" href="#L4362">4362</a> <strong class="jxr_keyword">void</strong> a200_toSpacedHex() {
+<a class="jxr_linenumber" name="L4363" href="#L4363">4363</a> assertEquals(<span class="jxr_string">""</span>, toSpacedHex(<strong class="jxr_keyword">new</strong> byte[] {}));
+<a class="jxr_linenumber" name="L4364" href="#L4364">4364</a> assertEquals(<span class="jxr_string">"00 01 02"</span>, toSpacedHex(<strong class="jxr_keyword">new</strong> byte[] { 0, 1, 2 }));
+<a class="jxr_linenumber" name="L4365" href="#L4365">4365</a> assertEquals(<span class="jxr_string">"FF FE"</span>, toSpacedHex(<strong class="jxr_keyword">new</strong> byte[] { (byte)255, (byte)254 }));
+<a class="jxr_linenumber" name="L4366" href="#L4366">4366</a> assertEquals(<span class="jxr_string">"48 65 6C 6C 6F"</span>, toSpacedHex(<span class="jxr_string">"Hello"</span>.getBytes()));
+<a class="jxr_linenumber" name="L4367" href="#L4367">4367</a> }
+<a class="jxr_linenumber" name="L4368" href="#L4368">4368</a>
+<a class="jxr_linenumber" name="L4369" href="#L4369">4369</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4370" href="#L4370">4370</a> <em class="jxr_comment">// toString(Object) and toString(Object,String)</em>
+<a class="jxr_linenumber" name="L4371" href="#L4371">4371</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4372" href="#L4372">4372</a> @Test
+<a class="jxr_linenumber" name="L4373" href="#L4373">4373</a> <strong class="jxr_keyword">void</strong> a201_toString() {
+<a class="jxr_linenumber" name="L4374" href="#L4374">4374</a> <em class="jxr_comment">// toString(Object)</em>
+<a class="jxr_linenumber" name="L4375" href="#L4375">4375</a> assertNull(StringUtils.toString(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4376" href="#L4376">4376</a> assertEquals(<span class="jxr_string">"hello"</span>, StringUtils.toString(<span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L4377" href="#L4377">4377</a> assertEquals(<span class="jxr_string">"123"</span>, StringUtils.toString(123));
+<a class="jxr_linenumber" name="L4378" href="#L4378">4378</a> assertEquals(<span class="jxr_string">"true"</span>, StringUtils.toString(<strong class="jxr_keyword">true</strong>));
+<a class="jxr_linenumber" name="L4379" href="#L4379">4379</a> assertEquals(<span class="jxr_string">"1.5"</span>, StringUtils.toString(1.5));
+<a class="jxr_linenumber" name="L4380" href="#L4380">4380</a>
+<a class="jxr_linenumber" name="L4381" href="#L4381">4381</a> <em class="jxr_comment">// toString(Object,String) - with default</em>
+<a class="jxr_linenumber" name="L4382" href="#L4382">4382</a> assertEquals(<span class="jxr_string">"default"</span>, StringUtils.toString(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"default"</span>));
+<a class="jxr_linenumber" name="L4383" href="#L4383">4383</a> assertEquals(<span class="jxr_string">"hello"</span>, StringUtils.toString(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"default"</span>));
+<a class="jxr_linenumber" name="L4384" href="#L4384">4384</a> assertEquals(<span class="jxr_string">"123"</span>, StringUtils.toString(123, <span class="jxr_string">"default"</span>));
+<a class="jxr_linenumber" name="L4385" href="#L4385">4385</a> assertEquals(<span class="jxr_string">"true"</span>, StringUtils.toString(<strong class="jxr_keyword">true</strong>, <span class="jxr_string">"default"</span>));
+<a class="jxr_linenumber" name="L4386" href="#L4386">4386</a>
+<a class="jxr_linenumber" name="L4387" href="#L4387">4387</a> <em class="jxr_comment">// Test with null default</em>
+<a class="jxr_linenumber" name="L4388" href="#L4388">4388</a> assertNull(StringUtils.toString(<strong class="jxr_keyword">null</strong>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4389" href="#L4389">4389</a> assertEquals(<span class="jxr_string">"hello"</span>, StringUtils.toString(<span class="jxr_string">"hello"</span>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4390" href="#L4390">4390</a>
+<a class="jxr_linenumber" name="L4391" href="#L4391">4391</a> <em class="jxr_comment">// Test with empty default</em>
+<a class="jxr_linenumber" name="L4392" href="#L4392">4392</a> assertEquals(<span class="jxr_string">""</span>, StringUtils.toString(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L4393" href="#L4393">4393</a> assertEquals(<span class="jxr_string">"hello"</span>, StringUtils.toString(<span class="jxr_string">"hello"</span>, <span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L4394" href="#L4394">4394</a> }
+<a class="jxr_linenumber" name="L4395" href="#L4395">4395</a>
+<a class="jxr_linenumber" name="L4396" href="#L4396">4396</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4397" href="#L4397">4397</a> <em class="jxr_comment">// toStringArray(Collection<String>)</em>
+<a class="jxr_linenumber" name="L4398" href="#L4398">4398</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4399" href="#L4399">4399</a> @Test
+<a class="jxr_linenumber" name="L4400" href="#L4400">4400</a> <strong class="jxr_keyword">void</strong> a202_toStringArray() {
+<a class="jxr_linenumber" name="L4401" href="#L4401">4401</a> assertNull(toStringArray(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4402" href="#L4402">4402</a> assertList(toStringArray(Collections.emptyList()));
+<a class="jxr_linenumber" name="L4403" href="#L4403">4403</a> assertList(toStringArray(List.of(<span class="jxr_string">"a"</span>, <span class="jxr_string">"b"</span>, <span class="jxr_string">"c"</span>)), <span class="jxr_string">"a"</span>, <span class="jxr_string">"b"</span>, <span class="jxr_string">"c"</span>);
+<a class="jxr_linenumber" name="L4404" href="#L4404">4404</a>
+<a class="jxr_linenumber" name="L4405" href="#L4405">4405</a> <em class="jxr_comment">// Set.of() doesn't preserve order, so use LinkedHashSet for order-sensitive test</em>
+<a class="jxr_linenumber" name="L4406" href="#L4406">4406</a> <strong class="jxr_keyword">var</strong> set = <strong class="jxr_keyword">new</strong> LinkedHashSet<String>();
+<a class="jxr_linenumber" name="L4407" href="#L4407">4407</a> set.add(<span class="jxr_string">"x"</span>);
+<a class="jxr_linenumber" name="L4408" href="#L4408">4408</a> set.add(<span class="jxr_string">"y"</span>);
+<a class="jxr_linenumber" name="L4409" href="#L4409">4409</a> set.add(<span class="jxr_string">"z"</span>);
+<a class="jxr_linenumber" name="L4410" href="#L4410">4410</a> assertList(toStringArray(set), <span class="jxr_string">"x"</span>, <span class="jxr_string">"y"</span>, <span class="jxr_string">"z"</span>);
+<a class="jxr_linenumber" name="L4411" href="#L4411">4411</a> }
+<a class="jxr_linenumber" name="L4412" href="#L4412">4412</a>
+<a class="jxr_linenumber" name="L4413" href="#L4413">4413</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4414" href="#L4414">4414</a> <em class="jxr_comment">// toURI(Object)</em>
+<a class="jxr_linenumber" name="L4415" href="#L4415">4415</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4416" href="#L4416">4416</a> @Test
+<a class="jxr_linenumber" name="L4417" href="#L4417">4417</a> <strong class="jxr_keyword">void</strong> a203_toURI() {
+<a class="jxr_linenumber" name="L4418" href="#L4418">4418</a> <em class="jxr_comment">// Null input</em>
+<a class="jxr_linenumber" name="L4419" href="#L4419">4419</a> assertNull(toURI(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4420" href="#L4420">4420</a>
+<a class="jxr_linenumber" name="L4421" href="#L4421">4421</a> <em class="jxr_comment">// URI input - returns same object</em>
+<a class="jxr_linenumber" name="L4422" href="#L4422">4422</a> <strong class="jxr_keyword">var</strong> uri1 = java.net.URI.create(<span class="jxr_string">"http://example.com"</span>);
+<a class="jxr_linenumber" name="L4423" href="#L4423">4423</a> assertSame(uri1, toURI(uri1));
+<a class="jxr_linenumber" name="L4424" href="#L4424">4424</a>
+<a class="jxr_linenumber" name="L4425" href="#L4425">4425</a> <em class="jxr_comment">// String input</em>
+<a class="jxr_linenumber" name="L4426" href="#L4426">4426</a> <strong class="jxr_keyword">var</strong> uri2 = toURI(<span class="jxr_string">"http://example.com"</span>);
+<a class="jxr_linenumber" name="L4427" href="#L4427">4427</a> assertNotNull(uri2);
+<a class="jxr_linenumber" name="L4428" href="#L4428">4428</a> assertEquals(<span class="jxr_string">"http://example.com"</span>, uri2.toString());
+<a class="jxr_linenumber" name="L4429" href="#L4429">4429</a>
+<a class="jxr_linenumber" name="L4430" href="#L4430">4430</a> <em class="jxr_comment">// Invalid URI - should throw exception</em>
+<a class="jxr_linenumber" name="L4431" href="#L4431">4431</a> assertThrows(RuntimeException.<strong class="jxr_keyword">class</strong>, () -> toURI(<span class="jxr_string">"not a valid uri"</span>));
+<a class="jxr_linenumber" name="L4432" href="#L4432">4432</a> }
<a class="jxr_linenumber" name="L4433" href="#L4433">4433</a>
-<a class="jxr_linenumber" name="L4434" href="#L4434">4434</a> <em class="jxr_comment">// toUtf8(InputStream)</em>
-<a class="jxr_linenumber" name="L4435" href="#L4435">4435</a> assertNull(toUtf8((java.io.InputStream)<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L4436" href="#L4436">4436</a> <strong class="jxr_keyword">var</strong> is = <strong class="jxr_keyword">new</strong> java.io.ByteArrayInputStream(<span class="jxr_string">"Hello World"</span>.getBytes(UTF8));
-<a class="jxr_linenumber" name="L4437" href="#L4437">4437</a> assertEquals(<span class="jxr_string">"Hello World"</span>, toUtf8(is));
-<a class="jxr_linenumber" name="L4438" href="#L4438">4438</a> }
-<a class="jxr_linenumber" name="L4439" href="#L4439">4439</a>
-<a class="jxr_linenumber" name="L4440" href="#L4440">4440</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4441" href="#L4441">4441</a> <em class="jxr_comment">// transliterate(String,String,String)</em>
-<a class="jxr_linenumber" name="L4442" href="#L4442">4442</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4443" href="#L4443">4443</a> @Test
-<a class="jxr_linenumber" name="L4444" href="#L4444">4444</a> <strong class="jxr_keyword">void</strong> a205_transliterate() {
-<a class="jxr_linenumber" name="L4445" href="#L4445">4445</a> <em class="jxr_comment">// Null input</em>
-<a class="jxr_linenumber" name="L4446" href="#L4446">4446</a> assertNull(transliterate(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"abc"</span>, <span class="jxr_string">"xyz"</span>));
-<a class="jxr_linenumber" name="L4447" href="#L4447">4447</a>
-<a class="jxr_linenumber" name="L4448" href="#L4448">4448</a> <em class="jxr_comment">// Basic transliteration</em>
-<a class="jxr_linenumber" name="L4449" href="#L4449">4449</a> assertEquals(<span class="jxr_string">"h2ll4"</span>, transliterate(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"aeiou"</span>, <span class="jxr_string">"12345"</span>));
-<a class="jxr_linenumber" name="L4450" href="#L4450">4450</a> assertEquals(<span class="jxr_string">"XYZ"</span>, transliterate(<span class="jxr_string">"ABC"</span>, <span class="jxr_string">"ABC"</span>, <span class="jxr_string">"XYZ"</span>));
-<a class="jxr_linenumber" name="L4451" href="#L4451">4451</a>
-<a class="jxr_linenumber" name="L4452" href="#L4452">4452</a> <em class="jxr_comment">// Characters not in fromChars remain unchanged</em>
-<a class="jxr_linenumber" name="L4453" href="#L4453">4453</a> assertEquals(<span class="jxr_string">"h2ll4 w4rld"</span>, transliterate(<span class="jxr_string">"hello world"</span>, <span class="jxr_string">"aeiou"</span>, <span class="jxr_string">"12345"</span>));
-<a class="jxr_linenumber" name="L4454" href="#L4454">4454</a>
-<a class="jxr_linenumber" name="L4455" href="#L4455">4455</a> <em class="jxr_comment">// Null/empty fromChars or toChars - returns original</em>
-<a class="jxr_linenumber" name="L4456" href="#L4456">4456</a> assertEquals(<span class="jxr_string">"hello"</span>, transliterate(<span class="jxr_string">"hello"</span>, <strong class="jxr_keyword">null</strong>, <span class="jxr_string">"xyz"</span>));
-<a class="jxr_linenumber" name="L4457" href="#L4457">4457</a> assertEquals(<span class="jxr_string">"hello"</span>, transliterate(<span class="jxr_string">"hello"</span>, <span class="jxr_string">""</span>, <span class="jxr_string">"xyz"</span>));
-<a class="jxr_linenumber" name="L4458" href="#L4458">4458</a> assertEquals(<span class="jxr_string">"hello"</span>, transliterate(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"abc"</span>, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L4459" href="#L4459">4459</a> assertEquals(<span class="jxr_string">"hello"</span>, transliterate(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"abc"</span>, <span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L4460" href="#L4460">4460</a>
-<a class="jxr_linenumber" name="L4461" href="#L4461">4461</a> <em class="jxr_comment">// Different lengths - should throw exception</em>
-<a class="jxr_linenumber" name="L4462" href="#L4462">4462</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> transliterate(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"abc"</span>, <span class="jxr_string">"xy"</span>));
-<a class="jxr_linenumber" name="L4463" href="#L4463">4463</a> }
-<a class="jxr_linenumber" name="L4464" href="#L4464">4464</a>
-<a class="jxr_linenumber" name="L4465" href="#L4465">4465</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4466" href="#L4466">4466</a> <em class="jxr_comment">// trim(String)</em>
-<a class="jxr_linenumber" name="L4467" href="#L4467">4467</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4468" href="#L4468">4468</a> @Test
-<a class="jxr_linenumber" name="L4469" href="#L4469">4469</a> <strong class="jxr_keyword">void</strong> a206_trim() {
-<a class="jxr_linenumber" name="L4470" href="#L4470">4470</a> assertNull(trim(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L4471" href="#L4471">4471</a> assertEquals(<span class="jxr_string">""</span>, trim(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L4472" href="#L4472">4472</a> assertEquals(<span class="jxr_string">""</span>, trim(<span class="jxr_string">" "</span>));
-<a class="jxr_linenumber" name="L4473" href="#L4473">4473</a> assertEquals(<span class="jxr_string">"hello"</span>, trim(<span class="jxr_string">" hello "</span>));
-<a class="jxr_linenumber" name="L4474" href="#L4474">4474</a> assertEquals(<span class="jxr_string">"hello world"</span>, trim(<span class="jxr_string">" hello world "</span>));
-<a class="jxr_linenumber" name="L4475" href="#L4475">4475</a> assertEquals(<span class="jxr_string">"test"</span>, trim(<span class="jxr_string">"\t\ntest\r\n"</span>));
-<a class="jxr_linenumber" name="L4476" href="#L4476">4476</a> }
-<a class="jxr_linenumber" name="L4477" href="#L4477">4477</a>
+<a class="jxr_linenumber" name="L4434" href="#L4434">4434</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4435" href="#L4435">4435</a> <em class="jxr_comment">// toUtf8(byte[]) and toUtf8(InputStream)</em>
+<a class="jxr_linenumber" name="L4436" href="#L4436">4436</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4437" href="#L4437">4437</a> @Test
+<a class="jxr_linenumber" name="L4438" href="#L4438">4438</a> <strong class="jxr_keyword">void</strong> a204_toUtf8() {
+<a class="jxr_linenumber" name="L4439" href="#L4439">4439</a> <em class="jxr_comment">// toUtf8(byte[])</em>
+<a class="jxr_linenumber" name="L4440" href="#L4440">4440</a> assertNull(toUtf8((byte[])<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4441" href="#L4441">4441</a> assertEquals(<span class="jxr_string">""</span>, toUtf8(<strong class="jxr_keyword">new</strong> byte[] {}));
+<a class="jxr_linenumber" name="L4442" href="#L4442">4442</a> assertEquals(<span class="jxr_string">"Hello"</span>, toUtf8(<span class="jxr_string">"Hello"</span>.getBytes(UTF8)));
+<a class="jxr_linenumber" name="L4443" href="#L4443">4443</a> assertEquals(<span class="jxr_string">"Test 123"</span>, toUtf8(<span class="jxr_string">"Test 123"</span>.getBytes(UTF8)));
+<a class="jxr_linenumber" name="L4444" href="#L4444">4444</a>
+<a class="jxr_linenumber" name="L4445" href="#L4445">4445</a> <em class="jxr_comment">// toUtf8(InputStream)</em>
+<a class="jxr_linenumber" name="L4446" href="#L4446">4446</a> assertNull(toUtf8((java.io.InputStream)<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4447" href="#L4447">4447</a> <strong class="jxr_keyword">var</strong> is = <strong class="jxr_keyword">new</strong> java.io.ByteArrayInputStream(<span class="jxr_string">"Hello World"</span>.getBytes(UTF8));
+<a class="jxr_linenumber" name="L4448" href="#L4448">4448</a> assertEquals(<span class="jxr_string">"Hello World"</span>, toUtf8(is));
+<a class="jxr_linenumber" name="L4449" href="#L4449">4449</a> }
+<a class="jxr_linenumber" name="L4450" href="#L4450">4450</a>
+<a class="jxr_linenumber" name="L4451" href="#L4451">4451</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4452" href="#L4452">4452</a> <em class="jxr_comment">// transliterate(String,String,String)</em>
+<a class="jxr_linenumber" name="L4453" href="#L4453">4453</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4454" href="#L4454">4454</a> @Test
+<a class="jxr_linenumber" name="L4455" href="#L4455">4455</a> <strong class="jxr_keyword">void</strong> a205_transliterate() {
+<a class="jxr_linenumber" name="L4456" href="#L4456">4456</a> <em class="jxr_comment">// Null input</em>
+<a class="jxr_linenumber" name="L4457" href="#L4457">4457</a> assertNull(transliterate(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"abc"</span>, <span class="jxr_string">"xyz"</span>));
+<a class="jxr_linenumber" name="L4458" href="#L4458">4458</a>
+<a class="jxr_linenumber" name="L4459" href="#L4459">4459</a> <em class="jxr_comment">// Basic transliteration</em>
+<a class="jxr_linenumber" name="L4460" href="#L4460">4460</a> assertEquals(<span class="jxr_string">"h2ll4"</span>, transliterate(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"aeiou"</span>, <span class="jxr_string">"12345"</span>));
+<a class="jxr_linenumber" name="L4461" href="#L4461">4461</a> assertEquals(<span class="jxr_string">"XYZ"</span>, transliterate(<span class="jxr_string">"ABC"</span>, <span class="jxr_string">"ABC"</span>, <span class="jxr_string">"XYZ"</span>));
+<a class="jxr_linenumber" name="L4462" href="#L4462">4462</a>
+<a class="jxr_linenumber" name="L4463" href="#L4463">4463</a> <em class="jxr_comment">// Characters not in fromChars remain unchanged</em>
+<a class="jxr_linenumber" name="L4464" href="#L4464">4464</a> assertEquals(<span class="jxr_string">"h2ll4 w4rld"</span>, transliterate(<span class="jxr_string">"hello world"</span>, <span class="jxr_string">"aeiou"</span>, <span class="jxr_string">"12345"</span>));
+<a class="jxr_linenumber" name="L4465" href="#L4465">4465</a>
+<a class="jxr_linenumber" name="L4466" href="#L4466">4466</a> <em class="jxr_comment">// Null/empty fromChars or toChars - returns original</em>
+<a class="jxr_linenumber" name="L4467" href="#L4467">4467</a> assertEquals(<span class="jxr_string">"hello"</span>, transliterate(<span class="jxr_string">"hello"</span>, <strong class="jxr_keyword">null</strong>, <span class="jxr_string">"xyz"</span>));
+<a class="jxr_linenumber" name="L4468" href="#L4468">4468</a> assertEquals(<span class="jxr_string">"hello"</span>, transliterate(<span class="jxr_string">"hello"</span>, <span class="jxr_string">""</span>, <span class="jxr_string">"xyz"</span>));
+<a class="jxr_linenumber" name="L4469" href="#L4469">4469</a> assertEquals(<span class="jxr_string">"hello"</span>, transliterate(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"abc"</span>, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4470" href="#L4470">4470</a> assertEquals(<span class="jxr_string">"hello"</span>, transliterate(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"abc"</span>, <span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L4471" href="#L4471">4471</a>
+<a class="jxr_linenumber" name="L4472" href="#L4472">4472</a> <em class="jxr_comment">// Different lengths - should throw exception</em>
+<a class="jxr_linenumber" name="L4473" href="#L4473">4473</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> transliterate(<span class="jxr_string">"hello"</span>, <span class="jxr_string">"abc"</span>, <span class="jxr_string">"xy"</span>));
+<a class="jxr_linenumber" name="L4474" href="#L4474">4474</a> }
+<a class="jxr_linenumber" name="L4475" href="#L4475">4475</a>
+<a class="jxr_linenumber" name="L4476" href="#L4476">4476</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4477" href="#L4477">4477</a> <em class="jxr_comment">// trim(String)</em>
<a class="jxr_linenumber" name="L4478" href="#L4478">4478</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4479" href="#L4479">4479</a> <em class="jxr_comment">// trimEnd(String)</em>
-<a class="jxr_linenumber" name="L4480" href="#L4480">4480</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4481" href="#L4481">4481</a> @Test
-<a class="jxr_linenumber" name="L4482" href="#L4482">4482</a> <strong class="jxr_keyword">void</strong> a207_trimEnd() {
-<a class="jxr_linenumber" name="L4483" href="#L4483">4483</a> assertNull(trimEnd(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L4484" href="#L4484">4484</a> assertEquals(<span class="jxr_string">""</span>, trimEnd(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L4485" href="#L4485">4485</a> assertEquals(<span class="jxr_string">""</span>, trimEnd(<span class="jxr_string">" "</span>));
-<a class="jxr_linenumber" name="L4486" href="#L4486">4486</a> assertEquals(<span class="jxr_string">" hello"</span>, trimEnd(<span class="jxr_string">" hello "</span>));
-<a class="jxr_linenumber" name="L4487" href="#L4487">4487</a> assertEquals(<span class="jxr_string">"hello"</span>, trimEnd(<span class="jxr_string">"hello "</span>));
-<a class="jxr_linenumber" name="L4488" href="#L4488">4488</a> assertEquals(<span class="jxr_string">"test"</span>, trimEnd(<span class="jxr_string">"test\r\n"</span>));
-<a class="jxr_linenumber" name="L4489" href="#L4489">4489</a> }
-<a class="jxr_linenumber" name="L4490" href="#L4490">4490</a>
+<a class="jxr_linenumber" name="L4479" href="#L4479">4479</a> @Test
+<a class="jxr_linenumber" name="L4480" href="#L4480">4480</a> <strong class="jxr_keyword">void</strong> a206_trim() {
+<a class="jxr_linenumber" name="L4481" href="#L4481">4481</a> assertNull(trim(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4482" href="#L4482">4482</a> assertEquals(<span class="jxr_string">""</span>, trim(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L4483" href="#L4483">4483</a> assertEquals(<span class="jxr_string">""</span>, trim(<span class="jxr_string">" "</span>));
+<a class="jxr_linenumber" name="L4484" href="#L4484">4484</a> assertEquals(<span class="jxr_string">"hello"</span>, trim(<span class="jxr_string">" hello "</span>));
+<a class="jxr_linenumber" name="L4485" href="#L4485">4485</a> assertEquals(<span class="jxr_string">"hello world"</span>, trim(<span class="jxr_string">" hello world "</span>));
+<a class="jxr_linenumber" name="L4486" href="#L4486">4486</a> assertEquals(<span class="jxr_string">"test"</span>, trim(<span class="jxr_string">"\t\ntest\r\n"</span>));
+<a class="jxr_linenumber" name="L4487" href="#L4487">4487</a> }
+<a class="jxr_linenumber" name="L4488" href="#L4488">4488</a>
+<a class="jxr_linenumber" name="L4489" href="#L4489">4489</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4490" href="#L4490">4490</a> <em class="jxr_comment">// trimEnd(String)</em>
<a class="jxr_linenumber" name="L4491" href="#L4491">4491</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4492" href="#L4492">4492</a> <em class="jxr_comment">// trimLeadingSlashes(String)</em>
-<a class="jxr_linenumber" name="L4493" href="#L4493">4493</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4494" href="#L4494">4494</a> @Test
-<a class="jxr_linenumber" name="L4495" href="#L4495">4495</a> <strong class="jxr_keyword">void</strong> a208_trimLeadingSlashes() {
-<a class="jxr_linenumber" name="L4496" href="#L4496">4496</a> assertNull(trimLeadingSlashes(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L4497" href="#L4497">4497</a> assertEquals(<span class="jxr_string">""</span>, trimLeadingSlashes(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L4498" href="#L4498">4498</a> assertEquals(<span class="jxr_string">""</span>, trimLeadingSlashes(<span class="jxr_string">"/"</span>));
-<a class="jxr_linenumber" name="L4499" href="#L4499">4499</a> assertEquals(<span class="jxr_string">"path"</span>, trimLeadingSlashes(<span class="jxr_string">"/path"</span>));
-<a class="jxr_linenumber" name="L4500" href="#L4500">4500</a> assertEquals(<span class="jxr_string">"path"</span>, trimLeadingSlashes(<span class="jxr_string">"///path"</span>));
-<a class="jxr_linenumber" name="L4501" href="#L4501">4501</a> assertEquals(<span class="jxr_string">"path/"</span>, trimLeadingSlashes(<span class="jxr_string">"/path/"</span>));
-<a class="jxr_linenumber" name="L4502" href="#L4502">4502</a> assertEquals(<span class="jxr_string">"path"</span>, trimLeadingSlashes(<span class="jxr_string">"path"</span>));
-<a class="jxr_linenumber" name="L4503" href="#L4503">4503</a> }
-<a class="jxr_linenumber" name="L4504" href="#L4504">4504</a>
-<a class="jxr_linenumber" name="L4505" href="#L4505">4505</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4506" href="#L4506">4506</a> <em class="jxr_comment">// trimSlashes(String)</em>
-<a class="jxr_linenumber" name="L4507" href="#L4507">4507</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4508" href="#L4508">4508</a> @Test
-<a class="jxr_linenumber" name="L4509" href="#L4509">4509</a> <strong class="jxr_keyword">void</strong> a209_trimSlashes() {
-<a class="jxr_linenumber" name="L4510" href="#L4510">4510</a> assertNull(trimSlashes(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L4511" href="#L4511">4511</a> assertEquals(<span class="jxr_string">""</span>, trimSlashes(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L4512" href="#L4512">4512</a> assertEquals(<span class="jxr_string">""</span>, trimSlashes(<span class="jxr_string">"/"</span>));
-<a class="jxr_linenumber" name="L4513" href="#L4513">4513</a> assertEquals(<span class="jxr_string">""</span>, trimSlashes(<span class="jxr_string">"///"</span>));
-<a class="jxr_linenumber" name="L4514" href="#L4514">4514</a> assertEquals(<span class="jxr_string">"path"</span>, trimSlashes(<span class="jxr_string">"/path"</span>));
-<a class="jxr_linenumber" name="L4515" href="#L4515">4515</a> assertEquals(<span class="jxr_string">"path"</span>, trimSlashes(<span class="jxr_string">"path/"</span>));
-<a class="jxr_linenumber" name="L4516" href="#L4516">4516</a> assertEquals(<span class="jxr_string">"path"</span>, trimSlashes(<span class="jxr_string">"/path/"</span>));
-<a class="jxr_linenumber" name="L4517" href="#L4517">4517</a> assertEquals(<span class="jxr_string">"path"</span>, trimSlashes(<span class="jxr_string">"///path///"</span>));
-<a class="jxr_linenumber" name="L4518" href="#L4518">4518</a> assertEquals(<span class="jxr_string">"path"</span>, trimSlashes(<span class="jxr_string">"path"</span>));
-<a class="jxr_linenumber" name="L4519" href="#L4519">4519</a> }
-<a class="jxr_linenumber" name="L4520" href="#L4520">4520</a>
-<a class="jxr_linenumber" name="L4521" href="#L4521">4521</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4522" href="#L4522">4522</a> <em class="jxr_comment">// trimSlashesAndSpaces(String)</em>
-<a class="jxr_linenumber" name="L4523" href="#L4523">4523</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4524" href="#L4524">4524</a> @Test
-<a class="jxr_linenumber" name="L4525" href="#L4525">4525</a> <strong class="jxr_keyword">void</strong> a210_trimSlashesAndSpaces() {
-<a class="jxr_linenumber" name="L4526" href="#L4526">4526</a> assertNull(trimSlashesAndSpaces(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L4527" href="#L4527">4527</a> assertEquals(<span class="jxr_string">""</span>, trimSlashesAndSpaces(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L4528" href="#L4528">4528</a> assertEquals(<span class="jxr_string">""</span>, trimSlashesAndSpaces(<span class="jxr_string">"/"</span>));
-<a class="jxr_linenumber" name="L4529" href="#L4529">4529</a> assertEquals(<span class="jxr_string">""</span>, trimSlashesAndSpaces(<span class="jxr_string">" "</span>));
-<a class="jxr_linenumber" name="L4530" href="#L4530">4530</a> assertEquals(<span class="jxr_string">""</span>, trimSlashesAndSpaces(<span class="jxr_string">" / "</span>));
-<a class="jxr_linenumber" name="L4531" href="#L4531">4531</a> assertEquals(<span class="jxr_string">"path"</span>, trimSlashesAndSpaces(<span class="jxr_string">"/path"</span>));
-<a class="jxr_linenumber" name="L4532" href="#L4532">4532</a> assertEquals(<span class="jxr_string">"path"</span>, trimSlashesAndSpaces(<span class="jxr_string">"path/"</span>));
-<a class="jxr_linenumber" name="L4533" href="#L4533">4533</a> assertEquals(<span class="jxr_string">"path"</span>, trimSlashesAndSpaces(<span class="jxr_string">"/path/"</span>));
-<a class="jxr_linenumber" name="L4534" href="#L4534">4534</a> assertEquals(<span class="jxr_string">"path"</span>, trimSlashesAndSpaces(<span class="jxr_string">" /path/ "</span>));
-<a class="jxr_linenumber" name="L4535" href="#L4535">4535</a> assertEquals(<span class="jxr_string">"path"</span>, trimSlashesAndSpaces(<span class="jxr_string">"///path///"</span>));
-<a class="jxr_linenumber" name="L4536" href="#L4536">4536</a> assertEquals(<span class="jxr_string">"path"</span>, trimSlashesAndSpaces(<span class="jxr_string">"path"</span>));
-<a class="jxr_linenumber" name="L4537" href="#L4537">4537</a> }
-<a class="jxr_linenumber" name="L4538" href="#L4538">4538</a>
-<a class="jxr_linenumber" name="L4539" href="#L4539">4539</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4540" href="#L4540">4540</a> <em class="jxr_comment">// trimStart(String)</em>
-<a class="jxr_linenumber" name="L4541" href="#L4541">4541</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4542" href="#L4542">4542</a> @Test
-<a class="jxr_linenumber" name="L4543" href="#L4543">4543</a> <strong class="jxr_keyword">void</strong> a211_trimStart() {
-<a class="jxr_linenumber" name="L4544" href="#L4544">4544</a> assertNull(trimStart(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L4545" href="#L4545">4545</a> assertEquals(<span class="jxr_string">""</span>, trimStart(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L4546" href="#L4546">4546</a> assertEquals(<span class="jxr_string">""</span>, trimStart(<span class="jxr_string">" "</span>));
-<a class="jxr_linenumber" name="L4547" href="#L4547">4547</a> assertEquals(<span class="jxr_string">"hello "</span>, trimStart(<span class="jxr_string">" hello "</span>));
-<a class="jxr_linenumber" name="L4548" href="#L4548">4548</a> assertEquals(<span class="jxr_string">"hello"</span>, trimStart(<span class="jxr_string">" hello"</span>));
-<a class="jxr_linenumber" name="L4549" href="#L4549">4549</a> assertEquals(<span class="jxr_string">"test"</span>, trimStart(<span class="jxr_string">"\t\ntest"</span>));
-<a class="jxr_linenumber" name="L4550" href="#L4550">4550</a> }
-<a class="jxr_linenumber" name="L4551" href="#L4551">4551</a>
+<a class="jxr_linenumber" name="L4492" href="#L4492">4492</a> @Test
+<a class="jxr_linenumber" name="L4493" href="#L4493">4493</a> <strong class="jxr_keyword">void</strong> a207_trimEnd() {
+<a class="jxr_linenumber" name="L4494" href="#L4494">4494</a> assertNull(trimEnd(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4495" href="#L4495">4495</a> assertEquals(<span class="jxr_string">""</span>, trimEnd(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L4496" href="#L4496">4496</a> assertEquals(<span class="jxr_string">""</span>, trimEnd(<span class="jxr_string">" "</span>));
+<a class="jxr_linenumber" name="L4497" href="#L4497">4497</a> assertEquals(<span class="jxr_string">" hello"</span>, trimEnd(<span class="jxr_string">" hello "</span>));
+<a class="jxr_linenumber" name="L4498" href="#L4498">4498</a> assertEquals(<span class="jxr_string">"hello"</span>, trimEnd(<span class="jxr_string">"hello "</span>));
+<a class="jxr_linenumber" name="L4499" href="#L4499">4499</a> assertEquals(<span class="jxr_string">"test"</span>, trimEnd(<span class="jxr_string">"test\r\n"</span>));
+<a class="jxr_linenumber" name="L4500" href="#L4500">4500</a> }
+<a class="jxr_linenumber" name="L4501" href="#L4501">4501</a>
+<a class="jxr_linenumber" name="L4502" href="#L4502">4502</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4503" href="#L4503">4503</a> <em class="jxr_comment">// trimLeadingSlashes(String)</em>
+<a class="jxr_linenumber" name="L4504" href="#L4504">4504</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4505" href="#L4505">4505</a> @Test
+<a class="jxr_linenumber" name="L4506" href="#L4506">4506</a> <strong class="jxr_keyword">void</strong> a208_trimLeadingSlashes() {
+<a class="jxr_linenumber" name="L4507" href="#L4507">4507</a> assertNull(trimLeadingSlashes(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4508" href="#L4508">4508</a> assertEquals(<span class="jxr_string">""</span>, trimLeadingSlashes(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L4509" href="#L4509">4509</a> assertEquals(<span class="jxr_string">""</span>, trimLeadingSlashes(<span class="jxr_string">"/"</span>));
+<a class="jxr_linenumber" name="L4510" href="#L4510">4510</a> assertEquals(<span class="jxr_string">"path"</span>, trimLeadingSlashes(<span class="jxr_string">"/path"</span>));
+<a class="jxr_linenumber" name="L4511" href="#L4511">4511</a> assertEquals(<span class="jxr_string">"path"</span>, trimLeadingSlashes(<span class="jxr_string">"///path"</span>));
+<a class="jxr_linenumber" name="L4512" href="#L4512">4512</a> assertEquals(<span class="jxr_string">"path/"</span>, trimLeadingSlashes(<span class="jxr_string">"/path/"</span>));
+<a class="jxr_linenumber" name="L4513" href="#L4513">4513</a> assertEquals(<span class="jxr_string">"path"</span>, trimLeadingSlashes(<span class="jxr_string">"path"</span>));
+<a class="jxr_linenumber" name="L4514" href="#L4514">4514</a> }
+<a class="jxr_linenumber" name="L4515" href="#L4515">4515</a>
+<a class="jxr_linenumber" name="L4516" href="#L4516">4516</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4517" href="#L4517">4517</a> <em class="jxr_comment">// trimSlashes(String)</em>
+<a class="jxr_linenumber" name="L4518" href="#L4518">4518</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4519" href="#L4519">4519</a> @Test
+<a class="jxr_linenumber" name="L4520" href="#L4520">4520</a> <strong class="jxr_keyword">void</strong> a209_trimSlashes() {
+<a class="jxr_linenumber" name="L4521" href="#L4521">4521</a> assertNull(trimSlashes(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4522" href="#L4522">4522</a> assertEquals(<span class="jxr_string">""</span>, trimSlashes(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L4523" href="#L4523">4523</a> assertEquals(<span class="jxr_string">""</span>, trimSlashes(<span class="jxr_string">"/"</span>));
+<a class="jxr_linenumber" name="L4524" href="#L4524">4524</a> assertEquals(<span class="jxr_string">""</span>, trimSlashes(<span class="jxr_string">"///"</span>));
+<a class="jxr_linenumber" name="L4525" href="#L4525">4525</a> assertEquals(<span class="jxr_string">"path"</span>, trimSlashes(<span class="jxr_string">"/path"</span>));
+<a class="jxr_linenumber" name="L4526" href="#L4526">4526</a> assertEquals(<span class="jxr_string">"path"</span>, trimSlashes(<span class="jxr_string">"path/"</span>));
+<a class="jxr_linenumber" name="L4527" href="#L4527">4527</a> assertEquals(<span class="jxr_string">"path"</span>, trimSlashes(<span class="jxr_string">"/path/"</span>));
+<a class="jxr_linenumber" name="L4528" href="#L4528">4528</a> assertEquals(<span class="jxr_string">"path"</span>, trimSlashes(<span class="jxr_string">"///path///"</span>));
+<a class="jxr_linenumber" name="L4529" href="#L4529">4529</a> assertEquals(<span class="jxr_string">"path"</span>, trimSlashes(<span class="jxr_string">"path"</span>));
+<a class="jxr_linenumber" name="L4530" href="#L4530">4530</a> }
+<a class="jxr_linenumber" name="L4531" href="#L4531">4531</a>
+<a class="jxr_linenumber" name="L4532" href="#L4532">4532</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4533" href="#L4533">4533</a> <em class="jxr_comment">// trimSlashesAndSpaces(String)</em>
+<a class="jxr_linenumber" name="L4534" href="#L4534">4534</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4535" href="#L4535">4535</a> @Test
+<a class="jxr_linenumber" name="L4536" href="#L4536">4536</a> <strong class="jxr_keyword">void</strong> a210_trimSlashesAndSpaces() {
+<a class="jxr_linenumber" name="L4537" href="#L4537">4537</a> assertNull(trimSlashesAndSpaces(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4538" href="#L4538">4538</a> assertEquals(<span class="jxr_string">""</span>, trimSlashesAndSpaces(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L4539" href="#L4539">4539</a> assertEquals(<span class="jxr_string">""</span>, trimSlashesAndSpaces(<span class="jxr_string">"/"</span>));
+<a class="jxr_linenumber" name="L4540" href="#L4540">4540</a> assertEquals(<span class="jxr_string">""</span>, trimSlashesAndSpaces(<span class="jxr_string">" "</span>));
+<a class="jxr_linenumber" name="L4541" href="#L4541">4541</a> assertEquals(<span class="jxr_string">""</span>, trimSlashesAndSpaces(<span class="jxr_string">" / "</span>));
+<a class="jxr_linenumber" name="L4542" href="#L4542">4542</a> assertEquals(<span class="jxr_string">"path"</span>, trimSlashesAndSpaces(<span class="jxr_string">"/path"</span>));
+<a class="jxr_linenumber" name="L4543" href="#L4543">4543</a> assertEquals(<span class="jxr_string">"path"</span>, trimSlashesAndSpaces(<span class="jxr_string">"path/"</span>));
+<a class="jxr_linenumber" name="L4544" href="#L4544">4544</a> assertEquals(<span class="jxr_string">"path"</span>, trimSlashesAndSpaces(<span class="jxr_string">"/path/"</span>));
+<a class="jxr_linenumber" name="L4545" href="#L4545">4545</a> assertEquals(<span class="jxr_string">"path"</span>, trimSlashesAndSpaces(<span class="jxr_string">" /path/ "</span>));
+<a class="jxr_linenumber" name="L4546" href="#L4546">4546</a> assertEquals(<span class="jxr_string">"path"</span>, trimSlashesAndSpaces(<span class="jxr_string">"///path///"</span>));
+<a class="jxr_linenumber" name="L4547" href="#L4547">4547</a> assertEquals(<span class="jxr_string">"path"</span>, trimSlashesAndSpaces(<span class="jxr_string">"path"</span>));
+<a class="jxr_linenumber" name="L4548" href="#L4548">4548</a> }
+<a class="jxr_linenumber" name="L4549" href="#L4549">4549</a>
+<a class="jxr_linenumber" name="L4550" href="#L4550">4550</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4551" href="#L4551">4551</a> <em class="jxr_comment">// trimStart(String)</em>
<a class="jxr_linenumber" name="L4552" href="#L4552">4552</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4553" href="#L4553">4553</a> <em class="jxr_comment">// trimTrailingSlashes(String)</em>
-<a class="jxr_linenumber" name="L4554" href="#L4554">4554</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4555" href="#L4555">4555</a> @Test
-<a class="jxr_linenumber" name="L4556" href="#L4556">4556</a> <strong class="jxr_keyword">void</strong> a212_trimTrailingSlashes() {
-<a class="jxr_linenumber" name="L4557" href="#L4557">4557</a> assertNull(trimTrailingSlashes(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L4558" href="#L4558">4558</a> assertEquals(<span class="jxr_string">""</span>, trimTrailingSlashes(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L4559" href="#L4559">4559</a> assertEquals(<span class="jxr_string">""</span>, trimTrailingSlashes(<span class="jxr_string">"/"</span>));
-<a class="jxr_linenumber" name="L4560" href="#L4560">4560</a> assertEquals(<span class="jxr_string">""</span>, trimTrailingSlashes(<span class="jxr_string">"///"</span>));
-<a class="jxr_linenumber" name="L4561" href="#L4561">4561</a> assertEquals(<span class="jxr_string">"/path"</span>, trimTrailingSlashes(<span class="jxr_string">"/path"</span>));
-<a class="jxr_linenumber" name="L4562" href="#L4562">4562</a> assertEquals(<span class="jxr_string">"path"</span>, trimTrailingSlashes(<span class="jxr_string">"path/"</span>));
-<a class="jxr_linenumber" name="L4563" href="#L4563">4563</a> assertEquals(<span class="jxr_string">"/path"</span>, trimTrailingSlashes(<span class="jxr_string">"/path/"</span>));
-<a class="jxr_linenumber" name="L4564" href="#L4564">4564</a> assertEquals(<span class="jxr_string">"/path"</span>, trimTrailingSlashes(<span class="jxr_string">"/path///"</span>));
-<a class="jxr_linenumber" name="L4565" href="#L4565">4565</a> assertEquals(<span class="jxr_string">"path"</span>, trimTrailingSlashes(<span class="jxr_string">"path"</span>));
-<a class="jxr_linenumber" name="L4566" href="#L4566">4566</a> }
-<a class="jxr_linenumber" name="L4567" href="#L4567">4567</a>
-<a class="jxr_linenumber" name="L4568" href="#L4568">4568</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4569" href="#L4569">4569</a> <em class="jxr_comment">// unEscapeChars(String,AsciiSet)</em>
-<a class="jxr_linenumber" name="L4570" href="#L4570">4570</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4571" href="#L4571">4571</a> @Test
-<a class="jxr_linenumber" name="L4572" href="#L4572">4572</a> <strong class="jxr_keyword">void</strong> a213_unEscapeChars() {
-<a class="jxr_linenumber" name="L4573" href="#L4573">4573</a> <strong class="jxr_keyword">var</strong> escape = AsciiSet.of(<span class="jxr_string">"\\,|"</span>);
-<a class="jxr_linenumber" name="L4574" href="#L4574">4574</a>
-<a class="jxr_linenumber" name="L4575" href="#L4575">4575</a> assertNull(unEscapeChars(<strong class="jxr_keyword">null</strong>, escape));
-<a class="jxr_linenumber" name="L4576" href="#L4576">4576</a> assertEquals(<span class="jxr_string">"xxx"</span>, unEscapeChars(<span class="jxr_string">"xxx"</span>, escape));
-<a class="jxr_linenumber" name="L4577" href="#L4577">4577</a> assertEquals(<span class="jxr_string">"x,xx"</span>, unEscapeChars(<span class="jxr_string">"x\\,xx"</span>, escape));
-<a class="jxr_linenumber" name="L4578" href="#L4578">4578</a> assertEquals(<span class="jxr_string">"x\\xx"</span>, unEscapeChars(<span class="jxr_string">"x\\xx"</span>, escape));
-<a class="jxr_linenumber" name="L4579" href="#L4579">4579</a> assertEquals(<span class="jxr_string">"x\\,xx"</span>, unEscapeChars(<span class="jxr_string">"x\\\\,xx"</span>, escape));
-<a class="jxr_linenumber" name="L4580" href="#L4580">4580</a> assertEquals(<span class="jxr_string">"x\\,xx"</span>, unEscapeChars(<span class="jxr_string">"x\\\\\\,xx"</span>, escape));
-<a class="jxr_linenumber" name="L4581" href="#L4581">4581</a> assertEquals(<span class="jxr_string">"\\"</span>, unEscapeChars(<span class="jxr_string">"\\"</span>, escape));
-<a class="jxr_linenumber" name="L4582" href="#L4582">4582</a> assertEquals(<span class="jxr_string">","</span>, unEscapeChars(<span class="jxr_string">"\\,"</span>, escape));
-<a class="jxr_linenumber" name="L4583" href="#L4583">4583</a> assertEquals(<span class="jxr_string">"|"</span>, unEscapeChars(<span class="jxr_string">"\\|"</span>, escape));
-<a class="jxr_linenumber" name="L4584" href="#L4584">4584</a>
-<a class="jxr_linenumber" name="L4585" href="#L4585">4585</a> escape = AsciiSet.of(<span class="jxr_string">",|"</span>);
-<a class="jxr_linenumber" name="L4586" href="#L4586">4586</a> assertEquals(<span class="jxr_string">"x\\\\xx"</span>, unEscapeChars(<span class="jxr_string">"x\\\\xx"</span>, escape));
-<a class="jxr_linenumber" name="L4587" href="#L4587">4587</a> }
-<a class="jxr_linenumber" name="L4588" href="#L4588">4588</a>
-<a class="jxr_linenumber" name="L4589" href="#L4589">4589</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4590" href="#L4590">4590</a> <em class="jxr_comment">// uncapitalize(String)</em>
-<a class="jxr_linenumber" name="L4591" href="#L4591">4591</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4592" href="#L4592">4592</a> @Test
-<a class="jxr_linenumber" name="L4593" href="#L4593">4593</a> <strong class="jxr_keyword">void</strong> a214_uncapitalize() {
-<a class="jxr_linenumber" name="L4594" href="#L4594">4594</a> assertNull(uncapitalize(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L4595" href="#L4595">4595</a> assertEquals(<span class="jxr_string">""</span>, uncapitalize(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L4596" href="#L4596">4596</a> assertEquals(<span class="jxr_string">"hello"</span>, uncapitalize(<span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L4597" href="#L4597">4597</a> assertEquals(<span class="jxr_string">"hello"</span>, uncapitalize(<span class="jxr_string">"Hello"</span>));
-<a class="jxr_linenumber" name="L4598" href="#L4598">4598</a> assertEquals(<span class="jxr_string">"hELLO"</span>, uncapitalize(<span class="jxr_string">"HELLO"</span>));
-<a class="jxr_linenumber" name="L4599" href="#L4599">4599</a> assertEquals(<span class="jxr_string">"a"</span>, uncapitalize(<span class="jxr_string">"A"</span>));
-<a class="jxr_linenumber" name="L4600" href="#L4600">4600</a> assertEquals(<span class="jxr_string">"123"</span>, uncapitalize(<span class="jxr_string">"123"</span>));
-<a class="jxr_linenumber" name="L4601" href="#L4601">4601</a> }
-<a class="jxr_linenumber" name="L4602" href="#L4602">4602</a>
-<a class="jxr_linenumber" name="L4603" href="#L4603">4603</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4604" href="#L4604">4604</a> <em class="jxr_comment">// unescapeHtml(String)</em>
-<a class="jxr_linenumber" name="L4605" href="#L4605">4605</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4606" href="#L4606">4606</a> @Test
-<a class="jxr_linenumber" name="L4607" href="#L4607">4607</a> <strong class="jxr_keyword">void</strong> a215_unescapeHtml() {
-<a class="jxr_linenumber" name="L4608" href="#L4608">4608</a> assertNull(unescapeHtml(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L4609" href="#L4609">4609</a> assertEquals(<span class="jxr_string">""</span>, unescapeHtml(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L4610" href="#L4610">4610</a> assertEquals(<span class="jxr_string">"Hello World"</span>, unescapeHtml(<span class="jxr_string">"Hello World"</span>));
-<a class="jxr_linenumber" name="L4611" href="#L4611">4611</a> assertEquals(<span class="jxr_string">"<script>"</span>, unescapeHtml(<span class="jxr_string">"&lt;script&gt;"</span>));
-<a class="jxr_linenumber" name="L4612" href="#L4612">4612</a> assertEquals(<span class="jxr_string">"\"Hello\""</span>, unescapeHtml(<span class="jxr_string">"&quot;Hello&quot;"</span>));
-<a class="jxr_linenumber" name="L4613" href="#L4613">4613</a> assertEquals(<span class="jxr_string">"It's a test"</span>, unescapeHtml(<span class="jxr_string">"It&#39;s a test"</span>));
-<a class="jxr_linenumber" name="L4614" href="#L4614">4614</a> assertEquals(<span class="jxr_string">"It's a test"</span>, unescapeHtml(<span class="jxr_string">"It&apos;s a test"</span>));
-<a class="jxr_linenumber" name="L4615" href="#L4615">4615</a> assertEquals(<span class="jxr_string">"&"</span>, unescapeHtml(<span class="jxr_string">"&amp;"</span>));
-<a class="jxr_linenumber" name="L4616" href="#L4616">4616</a> assertEquals(<span class="jxr_string">"<tag>text</tag>"</span>, unescapeHtml(<span class="jxr_string">"&lt;tag&gt;text&lt;/tag&gt;"</span>));
-<a class="jxr_linenumber" name="L4617" href="#L4617">4617</a> <em class="jxr_comment">// Test round-trip</em>
-<a class="jxr_linenumber" name="L4618" href="#L4618">4618</a> assertEquals(<span class="jxr_string">"Hello & World"</span>, unescapeHtml(escapeHtml(<span class="jxr_string">"Hello & World"</span>)));
-<a class="jxr_linenumber" name="L4619" href="#L4619">4619</a> }
-<a class="jxr_linenumber" name="L4620" href="#L4620">4620</a>
-<a class="jxr_linenumber" name="L4621" href="#L4621">4621</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4622" href="#L4622">4622</a> <em class="jxr_comment">// unescapeXml(String)</em>
-<a class="jxr_linenumber" name="L4623" href="#L4623">4623</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4624" href="#L4624">4624</a> @Test
-<a class="jxr_linenumber" name="L4625" href="#L4625">4625</a> <strong class="jxr_keyword">void</strong> a216_unescapeXml() {
-<a class="jxr_linenumber" name="L4626" href="#L4626">4626</a> assertNull(unescapeXml(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L4627" href="#L4627">4627</a> assertEquals(<span class="jxr_string">""</span>, unescapeXml(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L4628" href="#L4628">4628</a> assertEquals(<span class="jxr_string">"Hello World"</span>, unescapeXml(<span class="jxr_string">"Hello World"</span>));
-<a class="jxr_linenumber" name="L4629" href="#L4629">4629</a> assertEquals(<span class="jxr_string">"<tag>"</span>, unescapeXml(<span class="jxr_string">"&lt;tag&gt;"</span>));
-<a class="jxr_linenumber" name="L4630" href="#L4630">4630</a> assertEquals(<span class="jxr_string">"\"Hello\""</span>, unescapeXml(<span class="jxr_string">"&quot;Hello&quot;"</span>));
-<a class="jxr_linenumber" name="L4631" href="#L4631">4631</a> assertEquals(<span class="jxr_string">"'test'"</span>, unescapeXml(<span class="jxr_string">"&apos;test&apos;"</span>));
-<a class="jxr_linenumber" name="L4632" href="#L4632">4632</a> assertEquals(<span class="jxr_string">"&"</span>, unescapeXml(<span class="jxr_string">"&amp;"</span>));
-<a class="jxr_linenumber" name="L4633" href="#L4633">4633</a> assertEquals(<span class="jxr_string">"<tag>text</tag>"</span>, unescapeXml(<span class="jxr_string">"&lt;tag&gt;text&lt;/tag&gt;"</span>));
-<a class="jxr_linenumber" name="L4634" href="#L4634">4634</a> }
-<a class="jxr_linenumber" name="L4635" href="#L4635">4635</a>
-<a class="jxr_linenumber" name="L4636" href="#L4636">4636</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4637" href="#L4637">4637</a> <em class="jxr_comment">// unicodeSequence(char)</em>
-<a class="jxr_linenumber" name="L4638" href="#L4638">4638</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4639" href="#L4639">4639</a> @Test
-<a class="jxr_linenumber" name="L4640" href="#L4640">4640</a> <strong class="jxr_keyword">void</strong> a217_unicodeSequence() {
-<a class="jxr_linenumber" name="L4641" href="#L4641">4641</a> assertEquals(<span class="jxr_string">"\\u0041"</span>, unicodeSequence('A'));
-<a class="jxr_linenumber" name="L4642" href="#L4642">4642</a> assertEquals(<span class="jxr_string">"\\u0061"</span>, unicodeSequence('a'));
-<a class="jxr_linenumber" name="L4643" href="#L4643">4643</a> assertEquals(<span class="jxr_string">"\\u0030"</span>, unicodeSequence('0'));
-<a class="jxr_linenumber" name="L4644" href="#L4644">4644</a> assertEquals(<span class="jxr_string">"\\u0000"</span>, unicodeSequence('\u0000'));
-<a class="jxr_linenumber" name="L4645" href="#L4645">4645</a> assertEquals(<span class="jxr_string">"\\u00FF"</span>, unicodeSequence('\u00FF'));
-<a class="jxr_linenumber" name="L4646" href="#L4646">4646</a> assertEquals(<span class="jxr_string">"\\uFFFF"</span>, unicodeSequence('\uFFFF'));
-<a class="jxr_linenumber" name="L4647" href="#L4647">4647</a> }
-<a class="jxr_linenumber" name="L4648" href="#L4648">4648</a>
+<a class="jxr_linenumber" name="L4553" href="#L4553">4553</a> @Test
+<a class="jxr_linenumber" name="L4554" href="#L4554">4554</a> <strong class="jxr_keyword">void</strong> a211_trimStart() {
+<a class="jxr_linenumber" name="L4555" href="#L4555">4555</a> assertNull(trimStart(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4556" href="#L4556">4556</a> assertEquals(<span class="jxr_string">""</span>, trimStart(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L4557" href="#L4557">4557</a> assertEquals(<span class="jxr_string">""</span>, trimStart(<span class="jxr_string">" "</span>));
+<a class="jxr_linenumber" name="L4558" href="#L4558">4558</a> assertEquals(<span class="jxr_string">"hello "</span>, trimStart(<span class="jxr_string">" hello "</span>));
+<a class="jxr_linenumber" name="L4559" href="#L4559">4559</a> assertEquals(<span class="jxr_string">"hello"</span>, trimStart(<span class="jxr_string">" hello"</span>));
+<a class="jxr_linenumber" name="L4560" href="#L4560">4560</a> assertEquals(<span class="jxr_string">"test"</span>, trimStart(<span class="jxr_string">"\t\ntest"</span>));
+<a class="jxr_linenumber" name="L4561" href="#L4561">4561</a> }
+<a class="jxr_linenumber" name="L4562" href="#L4562">4562</a>
+<a class="jxr_linenumber" name="L4563" href="#L4563">4563</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4564" href="#L4564">4564</a> <em class="jxr_comment">// trimTrailingSlashes(String)</em>
+<a class="jxr_linenumber" name="L4565" href="#L4565">4565</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4566" href="#L4566">4566</a> @Test
+<a class="jxr_linenumber" name="L4567" href="#L4567">4567</a> <strong class="jxr_keyword">void</strong> a212_trimTrailingSlashes() {
+<a class="jxr_linenumber" name="L4568" href="#L4568">4568</a> assertNull(trimTrailingSlashes(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4569" href="#L4569">4569</a> assertEquals(<span class="jxr_string">""</span>, trimTrailingSlashes(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L4570" href="#L4570">4570</a> assertEquals(<span class="jxr_string">""</span>, trimTrailingSlashes(<span class="jxr_string">"/"</span>));
+<a class="jxr_linenumber" name="L4571" href="#L4571">4571</a> assertEquals(<span class="jxr_string">""</span>, trimTrailingSlashes(<span class="jxr_string">"///"</span>));
+<a class="jxr_linenumber" name="L4572" href="#L4572">4572</a> assertEquals(<span class="jxr_string">"/path"</span>, trimTrailingSlashes(<span class="jxr_string">"/path"</span>));
+<a class="jxr_linenumber" name="L4573" href="#L4573">4573</a> assertEquals(<span class="jxr_string">"path"</span>, trimTrailingSlashes(<span class="jxr_string">"path/"</span>));
+<a class="jxr_linenumber" name="L4574" href="#L4574">4574</a> assertEquals(<span class="jxr_string">"/path"</span>, trimTrailingSlashes(<span class="jxr_string">"/path/"</span>));
+<a class="jxr_linenumber" name="L4575" href="#L4575">4575</a> assertEquals(<span class="jxr_string">"/path"</span>, trimTrailingSlashes(<span class="jxr_string">"/path///"</span>));
+<a class="jxr_linenumber" name="L4576" href="#L4576">4576</a> assertEquals(<span class="jxr_string">"path"</span>, trimTrailingSlashes(<span class="jxr_string">"path"</span>));
+<a class="jxr_linenumber" name="L4577" href="#L4577">4577</a> }
+<a class="jxr_linenumber" name="L4578" href="#L4578">4578</a>
+<a class="jxr_linenumber" name="L4579" href="#L4579">4579</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4580" href="#L4580">4580</a> <em class="jxr_comment">// unEscapeChars(String,AsciiSet)</em>
+<a class="jxr_linenumber" name="L4581" href="#L4581">4581</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4582" href="#L4582">4582</a> @Test
+<a class="jxr_linenumber" name="L4583" href="#L4583">4583</a> <strong class="jxr_keyword">void</strong> a213_unEscapeChars() {
+<a class="jxr_linenumber" name="L4584" href="#L4584">4584</a> <strong class="jxr_keyword">var</strong> escape = AsciiSet.of(<span class="jxr_string">"\\,|"</span>);
+<a class="jxr_linenumber" name="L4585" href="#L4585">4585</a>
+<a class="jxr_linenumber" name="L4586" href="#L4586">4586</a> assertNull(unEscapeChars(<strong class="jxr_keyword">null</strong>, escape));
+<a class="jxr_linenumber" name="L4587" href="#L4587">4587</a> assertEquals(<span class="jxr_string">"xxx"</span>, unEscapeChars(<span class="jxr_string">"xxx"</span>, escape));
+<a class="jxr_linenumber" name="L4588" href="#L4588">4588</a> assertEquals(<span class="jxr_string">"x,xx"</span>, unEscapeChars(<span class="jxr_string">"x\\,xx"</span>, escape));
+<a class="jxr_linenumber" name="L4589" href="#L4589">4589</a> assertEquals(<span class="jxr_string">"x\\xx"</span>, unEscapeChars(<span class="jxr_string">"x\\xx"</span>, escape));
+<a class="jxr_linenumber" name="L4590" href="#L4590">4590</a> assertEquals(<span class="jxr_string">"x\\,xx"</span>, unEscapeChars(<span class="jxr_string">"x\\\\,xx"</span>, escape));
+<a class="jxr_linenumber" name="L4591" href="#L4591">4591</a> assertEquals(<span class="jxr_string">"x\\,xx"</span>, unEscapeChars(<span class="jxr_string">"x\\\\\\,xx"</span>, escape));
+<a class="jxr_linenumber" name="L4592" href="#L4592">4592</a> assertEquals(<span class="jxr_string">"\\"</span>, unEscapeChars(<span class="jxr_string">"\\"</span>, escape));
+<a class="jxr_linenumber" name="L4593" href="#L4593">4593</a> assertEquals(<span class="jxr_string">","</span>, unEscapeChars(<span class="jxr_string">"\\,"</span>, escape));
+<a class="jxr_linenumber" name="L4594" href="#L4594">4594</a> assertEquals(<span class="jxr_string">"|"</span>, unEscapeChars(<span class="jxr_string">"\\|"</span>, escape));
+<a class="jxr_linenumber" name="L4595" href="#L4595">4595</a>
+<a class="jxr_linenumber" name="L4596" href="#L4596">4596</a> escape = AsciiSet.of(<span class="jxr_string">",|"</span>);
+<a class="jxr_linenumber" name="L4597" href="#L4597">4597</a> assertEquals(<span class="jxr_string">"x\\\\xx"</span>, unEscapeChars(<span class="jxr_string">"x\\\\xx"</span>, escape));
+<a class="jxr_linenumber" name="L4598" href="#L4598">4598</a> }
+<a class="jxr_linenumber" name="L4599" href="#L4599">4599</a>
+<a class="jxr_linenumber" name="L4600" href="#L4600">4600</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4601" href="#L4601">4601</a> <em class="jxr_comment">// uncapitalize(String)</em>
+<a class="jxr_linenumber" name="L4602" href="#L4602">4602</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4603" href="#L4603">4603</a> @Test
+<a class="jxr_linenumber" name="L4604" href="#L4604">4604</a> <strong class="jxr_keyword">void</strong> a214_uncapitalize() {
+<a class="jxr_linenumber" name="L4605" href="#L4605">4605</a> assertNull(uncapitalize(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4606" href="#L4606">4606</a> assertEquals(<span class="jxr_string">""</span>, uncapitalize(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L4607" href="#L4607">4607</a> assertEquals(<span class="jxr_string">"hello"</span>, uncapitalize(<span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L4608" href="#L4608">4608</a> assertEquals(<span class="jxr_string">"hello"</span>, uncapitalize(<span class="jxr_string">"Hello"</span>));
+<a class="jxr_linenumber" name="L4609" href="#L4609">4609</a> assertEquals(<span class="jxr_string">"hELLO"</span>, uncapitalize(<span class="jxr_string">"HELLO"</span>));
+<a class="jxr_linenumber" name="L4610" href="#L4610">4610</a> assertEquals(<span class="jxr_string">"a"</span>, uncapitalize(<span class="jxr_string">"A"</span>));
+<a class="jxr_linenumber" name="L4611" href="#L4611">4611</a> assertEquals(<span class="jxr_string">"123"</span>, uncapitalize(<span class="jxr_string">"123"</span>));
+<a class="jxr_linenumber" name="L4612" href="#L4612">4612</a> }
+<a class="jxr_linenumber" name="L4613" href="#L4613">4613</a>
+<a class="jxr_linenumber" name="L4614" href="#L4614">4614</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4615" href="#L4615">4615</a> <em class="jxr_comment">// unescapeHtml(String)</em>
+<a class="jxr_linenumber" name="L4616" href="#L4616">4616</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4617" href="#L4617">4617</a> @Test
+<a class="jxr_linenumber" name="L4618" href="#L4618">4618</a> <strong class="jxr_keyword">void</strong> a215_unescapeHtml() {
+<a class="jxr_linenumber" name="L4619" href="#L4619">4619</a> assertNull(unescapeHtml(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4620" href="#L4620">4620</a> assertEquals(<span class="jxr_string">""</span>, unescapeHtml(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L4621" href="#L4621">4621</a> assertEquals(<span class="jxr_string">"Hello World"</span>, unescapeHtml(<span class="jxr_string">"Hello World"</span>));
+<a class="jxr_linenumber" name="L4622" href="#L4622">4622</a> assertEquals(<span class="jxr_string">"<script>"</span>, unescapeHtml(<span class="jxr_string">"&lt;script&gt;"</span>));
+<a class="jxr_linenumber" name="L4623" href="#L4623">4623</a> assertEquals(<span class="jxr_string">"\"Hello\""</span>, unescapeHtml(<span class="jxr_string">"&quot;Hello&quot;"</span>));
+<a class="jxr_linenumber" name="L4624" href="#L4624">4624</a> assertEquals(<span class="jxr_string">"It's a test"</span>, unescapeHtml(<span class="jxr_string">"It&#39;s a test"</span>));
+<a class="jxr_linenumber" name="L4625" href="#L4625">4625</a> assertEquals(<span class="jxr_string">"It's a test"</span>, unescapeHtml(<span class="jxr_string">"It&apos;s a test"</span>));
+<a class="jxr_linenumber" name="L4626" href="#L4626">4626</a> assertEquals(<span class="jxr_string">"&"</span>, unescapeHtml(<span class="jxr_string">"&amp;"</span>));
+<a class="jxr_linenumber" name="L4627" href="#L4627">4627</a> assertEquals(<span class="jxr_string">"<tag>text</tag>"</span>, unescapeHtml(<span class="jxr_string">"&lt;tag&gt;text&lt;/tag&gt;"</span>));
+<a class="jxr_linenumber" name="L4628" href="#L4628">4628</a> <em class="jxr_comment">// Test round-trip</em>
+<a class="jxr_linenumber" name="L4629" href="#L4629">4629</a> assertEquals(<span class="jxr_string">"Hello & World"</span>, unescapeHtml(escapeHtml(<span class="jxr_string">"Hello & World"</span>)));
+<a class="jxr_linenumber" name="L4630" href="#L4630">4630</a> }
+<a class="jxr_linenumber" name="L4631" href="#L4631">4631</a>
+<a class="jxr_linenumber" name="L4632" href="#L4632">4632</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4633" href="#L4633">4633</a> <em class="jxr_comment">// unescapeXml(String)</em>
+<a class="jxr_linenumber" name="L4634" href="#L4634">4634</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4635" href="#L4635">4635</a> @Test
+<a class="jxr_linenumber" name="L4636" href="#L4636">4636</a> <strong class="jxr_keyword">void</strong> a216_unescapeXml() {
+<a class="jxr_linenumber" name="L4637" href="#L4637">4637</a> assertNull(unescapeXml(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4638" href="#L4638">4638</a> assertEquals(<span class="jxr_string">""</span>, unescapeXml(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L4639" href="#L4639">4639</a> assertEquals(<span class="jxr_string">"Hello World"</span>, unescapeXml(<span class="jxr_string">"Hello World"</span>));
+<a class="jxr_linenumber" name="L4640" href="#L4640">4640</a> assertEquals(<span class="jxr_string">"<tag>"</span>, unescapeXml(<span class="jxr_string">"&lt;tag&gt;"</span>));
+<a class="jxr_linenumber" name="L4641" href="#L4641">4641</a> assertEquals(<span class="jxr_string">"\"Hello\""</span>, unescapeXml(<span class="jxr_string">"&quot;Hello&quot;"</span>));
+<a class="jxr_linenumber" name="L4642" href="#L4642">4642</a> assertEquals(<span class="jxr_string">"'test'"</span>, unescapeXml(<span class="jxr_string">"&apos;test&apos;"</span>));
+<a class="jxr_linenumber" name="L4643" href="#L4643">4643</a> assertEquals(<span class="jxr_string">"&"</span>, unescapeXml(<span class="jxr_string">"&amp;"</span>));
+<a class="jxr_linenumber" name="L4644" href="#L4644">4644</a> assertEquals(<span class="jxr_string">"<tag>text</tag>"</span>, unescapeXml(<span class="jxr_string">"&lt;tag&gt;text&lt;/tag&gt;"</span>));
+<a class="jxr_linenumber" name="L4645" href="#L4645">4645</a> }
+<a class="jxr_linenumber" name="L4646" href="#L4646">4646</a>
+<a class="jxr_linenumber" name="L4647" href="#L4647">4647</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4648" href="#L4648">4648</a> <em class="jxr_comment">// unicodeSequence(char)</em>
<a class="jxr_linenumber" name="L4649" href="#L4649">4649</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4650" href="#L4650">4650</a> <em class="jxr_comment">// upperCase(String)</em>
-<a class="jxr_linenumber" name="L4651" href="#L4651">4651</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4652" href="#L4652">4652</a> @Test
-<a class="jxr_linenumber" name="L4653" href="#L4653">4653</a> <strong class="jxr_keyword">void</strong> a218_upperCase() {
-<a class="jxr_linenumber" name="L4654" href="#L4654">4654</a> assertNull(upperCase(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L4655" href="#L4655">4655</a> assertEquals(<span class="jxr_string">""</span>, upperCase(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L4656" href="#L4656">4656</a> assertEquals(<span class="jxr_string">"HELLO"</span>, upperCase(<span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L4657" href="#L4657">4657</a> assertEquals(<span class="jxr_string">"HELLO WORLD"</span>, upperCase(<span class="jxr_string">"Hello World"</span>));
-<a class="jxr_linenumber" name="L4658" href="#L4658">4658</a> assertEquals(<span class="jxr_string">"123"</span>, upperCase(<span class="jxr_string">"123"</span>));
-<a class="jxr_linenumber" name="L4659" href="#L4659">4659</a> assertEquals(<span class="jxr_string">"ABC"</span>, upperCase(<span class="jxr_string">"abc"</span>));
-<a class="jxr_linenumber" name="L4660" href="#L4660">4660</a> }
-<a class="jxr_linenumber" name="L4661" href="#L4661">4661</a>
+<a class="jxr_linenumber" name="L4650" href="#L4650">4650</a> @Test
+<a class="jxr_linenumber" name="L4651" href="#L4651">4651</a> <strong class="jxr_keyword">void</strong> a217_unicodeSequence() {
+<a class="jxr_linenumber" name="L4652" href="#L4652">4652</a> assertEquals(<span class="jxr_string">"\\u0041"</span>, unicodeSequence('A'));
+<a class="jxr_linenumber" name="L4653" href="#L4653">4653</a> assertEquals(<span class="jxr_string">"\\u0061"</span>, unicodeSequence('a'));
+<a class="jxr_linenumber" name="L4654" href="#L4654">4654</a> assertEquals(<span class="jxr_string">"\\u0030"</span>, unicodeSequence('0'));
+<a class="jxr_linenumber" name="L4655" href="#L4655">4655</a> assertEquals(<span class="jxr_string">"\\u0000"</span>, unicodeSequence('\u0000'));
+<a class="jxr_linenumber" name="L4656" href="#L4656">4656</a> assertEquals(<span class="jxr_string">"\\u00FF"</span>, unicodeSequence('\u00FF'));
+<a class="jxr_linenumber" name="L4657" href="#L4657">4657</a> assertEquals(<span class="jxr_string">"\\uFFFF"</span>, unicodeSequence('\uFFFF'));
+<a class="jxr_linenumber" name="L4658" href="#L4658">4658</a> }
+<a class="jxr_linenumber" name="L4659" href="#L4659">4659</a>
+<a class="jxr_linenumber" name="L4660" href="#L4660">4660</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4661" href="#L4661">4661</a> <em class="jxr_comment">// upperCase(String)</em>
<a class="jxr_linenumber" name="L4662" href="#L4662">4662</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4663" href="#L4663">4663</a> <em class="jxr_comment">// urlDecode(String)</em>
-<a class="jxr_linenumber" name="L4664" href="#L4664">4664</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4665" href="#L4665">4665</a> @Test
-<a class="jxr_linenumber" name="L4666" href="#L4666">4666</a> <strong class="jxr_keyword">void</strong> a219_urlDecode() {
-<a class="jxr_linenumber" name="L4667" href="#L4667">4667</a> assertNull(urlDecode(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L4668" href="#L4668">4668</a> assertEquals(<span class="jxr_string">""</span>, urlDecode(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L4669" href="#L4669">4669</a> assertEquals(<span class="jxr_string">"Hello World"</span>, urlDecode(<span class="jxr_string">"Hello+World"</span>));
-<a class="jxr_linenumber" name="L4670" href="#L4670">4670</a> assertEquals(<span class="jxr_string">"Hello World"</span>, urlDecode(<span class="jxr_string">"Hello%20World"</span>));
-<a class="jxr_linenumber" name="L4671" href="#L4671">4671</a> assertEquals(<span class="jxr_string">"test@example.com"</span>, urlDecode(<span class="jxr_string">"test%40example.com"</span>));
-<a class="jxr_linenumber" name="L4672" href="#L4672">4672</a> assertEquals(<span class="jxr_string">"a=b&c=d"</span>, urlDecode(<span class="jxr_string">"a%3Db%26c%3Dd"</span>));
-<a class="jxr_linenumber" name="L4673" href="#L4673">4673</a> <em class="jxr_comment">// No encoding needed - returns as-is</em>
-<a class="jxr_linenumber" name="L4674" href="#L4674">4674</a> assertEquals(<span class="jxr_string">"Hello"</span>, urlDecode(<span class="jxr_string">"Hello"</span>));
-<a class="jxr_linenumber" name="L4675" href="#L4675">4675</a> }
-<a class="jxr_linenumber" name="L4676" href="#L4676">4676</a>
-<a class="jxr_linenumber" name="L4677" href="#L4677">4677</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4678" href="#L4678">4678</a> <em class="jxr_comment">// urlEncode(String)</em>
-<a class="jxr_linenumber" name="L4679" href="#L4679">4679</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4680" href="#L4680">4680</a> @Test
-<a class="jxr_linenumber" name="L4681" href="#L4681">4681</a> <strong class="jxr_keyword">void</strong> a220_urlEncode() {
-<a class="jxr_linenumber" name="L4682" href="#L4682">4682</a> assertNull(urlEncode(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L4683" href="#L4683">4683</a> assertEquals(<span class="jxr_string">""</span>, urlEncode(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L4684" href="#L4684">4684</a> assertEquals(<span class="jxr_string">"Hello+World"</span>, urlEncode(<span class="jxr_string">"Hello World"</span>));
-<a class="jxr_linenumber" name="L4685" href="#L4685">4685</a> assertEquals(<span class="jxr_string">"test%40example.com"</span>, urlEncode(<span class="jxr_string">"test@example.com"</span>));
-<a class="jxr_linenumber" name="L4686" href="#L4686">4686</a> assertEquals(<span class="jxr_string">"a%3Db%26c%3Dd"</span>, urlEncode(<span class="jxr_string">"a=b&c=d"</span>));
-<a class="jxr_linenumber" name="L4687" href="#L4687">4687</a> <em class="jxr_comment">// No encoding needed - returns as-is</em>
-<a class="jxr_linenumber" name="L4688" href="#L4688">4688</a> assertEquals(<span class="jxr_string">"Hello"</span>, urlEncode(<span class="jxr_string">"Hello"</span>));
-<a class="jxr_linenumber" name="L4689" href="#L4689">4689</a> assertEquals(<span class="jxr_string">"test123"</span>, urlEncode(<span class="jxr_string">"test123"</span>));
-<a class="jxr_linenumber" name="L4690" href="#L4690">4690</a> }
-<a class="jxr_linenumber" name="L4691" href="#L4691">4691</a>
-<a class="jxr_linenumber" name="L4692" href="#L4692">4692</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4693" href="#L4693">4693</a> <em class="jxr_comment">// urlEncodeLax(String)</em>
-<a class="jxr_linenumber" name="L4694" href="#L4694">4694</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4695" href="#L4695">4695</a> @Test
-<a class="jxr_linenumber" name="L4696" href="#L4696">4696</a> <strong class="jxr_keyword">void</strong> a221_urlEncodeLax() {
-<a class="jxr_linenumber" name="L4697" href="#L4697">4697</a> assertNull(urlEncodeLax(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L4698" href="#L4698">4698</a> assertEquals(<span class="jxr_string">""</span>, urlEncodeLax(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L4699" href="#L4699">4699</a> <em class="jxr_comment">// Lax encoding - fewer characters are encoded</em>
-<a class="jxr_linenumber" name="L4700" href="#L4700">4700</a> assertEquals(<span class="jxr_string">"Hello+World"</span>, urlEncodeLax(<span class="jxr_string">"Hello World"</span>));
-<a class="jxr_linenumber" name="L4701" href="#L4701">4701</a> <em class="jxr_comment">// @ might not be encoded in lax mode</em>
-<a class="jxr_linenumber" name="L4702" href="#L4702">4702</a> <strong class="jxr_keyword">var</strong> result1 = urlEncodeLax(<span class="jxr_string">"test@example.com"</span>);
-<a class="jxr_linenumber" name="L4703" href="#L4703">4703</a> assertNotNull(result1);
-<a class="jxr_linenumber" name="L4704" href="#L4704">4704</a> <em class="jxr_comment">// No encoding needed - returns as-is</em>
-<a class="jxr_linenumber" name="L4705" href="#L4705">4705</a> assertEquals(<span class="jxr_string">"Hello"</span>, urlEncodeLax(<span class="jxr_string">"Hello"</span>));
-<a class="jxr_linenumber" name="L4706" href="#L4706">4706</a> assertEquals(<span class="jxr_string">"test123"</span>, urlEncodeLax(<span class="jxr_string">"test123"</span>));
-<a class="jxr_linenumber" name="L4707" href="#L4707">4707</a> }
-<a class="jxr_linenumber" name="L4708" href="#L4708">4708</a>
-<a class="jxr_linenumber" name="L4709" href="#L4709">4709</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4710" href="#L4710">4710</a> <em class="jxr_comment">// urlEncodePath(Object)</em>
-<a class="jxr_linenumber" name="L4711" href="#L4711">4711</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4712" href="#L4712">4712</a> @Test
-<a class="jxr_linenumber" name="L4713" href="#L4713">4713</a> <strong class="jxr_keyword">void</strong> a222_urlEncodePath() {
-<a class="jxr_linenumber" name="L4714" href="#L4714">4714</a> <em class="jxr_comment">// Null input</em>
-<a class="jxr_linenumber" name="L4715" href="#L4715">4715</a> assertNull(urlEncodePath(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L4716" href="#L4716">4716</a>
-<a class="jxr_linenumber" name="L4717" href="#L4717">4717</a> <em class="jxr_comment">// Path encoding - doesn't encode slashes</em>
-<a class="jxr_linenumber" name="L4718" href="#L4718">4718</a> <strong class="jxr_keyword">var</strong> result1 = urlEncodePath(<span class="jxr_string">"/path/to/file"</span>);
-<a class="jxr_linenumber" name="L4719" href="#L4719">4719</a> assertNotNull(result1);
-<a class="jxr_linenumber" name="L4720" href="#L4720">4720</a> assertTrue(result1.contains(<span class="jxr_string">"/"</span>));
-<a class="jxr_linenumber" name="L4721" href="#L4721">4721</a>
-<a class="jxr_linenumber" name="L4722" href="#L4722">4722</a> <em class="jxr_comment">// Spaces are encoded</em>
-<a class="jxr_linenumber" name="L4723" href="#L4723">4723</a> <strong class="jxr_keyword">var</strong> result2 = urlEncodePath(<span class="jxr_string">"path with spaces"</span>);
-<a class="jxr_linenumber" name="L4724" href="#L4724">4724</a> assertNotNull(result2);
-<a class="jxr_linenumber" name="L4725" href="#L4725">4725</a> assertTrue(result2.contains(<span class="jxr_string">"+"</span>) || result2.contains(<span class="jxr_string">"%20"</span>));
-<a class="jxr_linenumber" name="L4726" href="#L4726">4726</a>
-<a class="jxr_linenumber" name="L4727" href="#L4727">4727</a> <em class="jxr_comment">// Special characters are encoded</em>
-<a class="jxr_linenumber" name="L4728" href="#L4728">4728</a> <strong class="jxr_keyword">var</strong> result3 = urlEncodePath(<span class="jxr_string">"file@name"</span>);
-<a class="jxr_linenumber" name="L4729" href="#L4729">4729</a> assertNotNull(result3);
-<a class="jxr_linenumber" name="L4730" href="#L4730">4730</a> }
-<a class="jxr_linenumber" name="L4731" href="#L4731">4731</a>
-<a class="jxr_linenumber" name="L4732" href="#L4732">4732</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4733" href="#L4733">4733</a> <em class="jxr_comment">// wordCount(String)</em>
-<a class="jxr_linenumber" name="L4734" href="#L4734">4734</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4735" href="#L4735">4735</a> @Test
-<a class="jxr_linenumber" name="L4736" href="#L4736">4736</a> <strong class="jxr_keyword">void</strong> a223_wordCount() {
-<a class="jxr_linenumber" name="L4737" href="#L4737">4737</a> assertEquals(0, wordCount(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L4738" href="#L4738">4738</a> assertEquals(0, wordCount(<span class="jxr_string">""</span>));
-<a class="jxr_linenumber" name="L4739" href="#L4739">4739</a> assertEquals(0, wordCount(<span class="jxr_string">" "</span>));
-<a class="jxr_linenumber" name="L4740" href="#L4740">4740</a> assertEquals(1, wordCount(<span class="jxr_string">"hello"</span>));
-<a class="jxr_linenumber" name="L4741" href="#L4741">4741</a> assertEquals(2, wordCount(<span class="jxr_string">"Hello world"</span>));
-<a class="jxr_linenumber" name="L4742" href="#L4742">4742</a> assertEquals(4, wordCount(<span class="jxr_string">"The quick brown fox"</span>));
-<a class="jxr_linenumber" name="L4743" href="#L4743">4743</a> assertEquals(5, wordCount(<span class="jxr_string">"Hello, world! How are you?"</span>));
-<a class="jxr_linenumber" name="L4744" href="#L4744">4744</a> assertEquals(3, wordCount(<span class="jxr_string">"one\ttwo\nthree"</span>));
-<a class="jxr_linenumber" name="L4745" href="#L4745">4745</a> assertEquals(1, wordCount(<span class="jxr_string">"hello123"</span>));
-<a class="jxr_linenumber" name="L4746" href="#L4746">4746</a> <em class="jxr_comment">// Underscores are part of word characters, so "hello_world" is one word</em>
-<a class="jxr_linenumber" name="L4747" href="#L4747">4747</a> assertEquals(1, wordCount(<span class="jxr_string">"hello_world"</span>));
-<a class="jxr_linenumber" name="L4748" href="#L4748">4748</a> assertEquals(2, wordCount(<span class="jxr_string">"hello world"</span>));
-<a class="jxr_linenumber" name="L4749" href="#L4749">4749</a> }
-<a class="jxr_linenumber" name="L4750" href="#L4750">4750</a>
-<a class="jxr_linenumber" name="L4751" href="#L4751">4751</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4752" href="#L4752">4752</a> <em class="jxr_comment">// wrap(String,int) and wrap(String,int,String)</em>
-<a class="jxr_linenumber" name="L4753" href="#L4753">4753</a> <em class="jxr_comment">//====================================================================================================</em>
-<a class="jxr_linenumber" name="L4754" href="#L4754">4754</a> @Test
-<a class="jxr_linenumber" name="L4755" href="#L4755">4755</a> <strong class="jxr_keyword">void</strong> a224_wrap() {
-<a class="jxr_linenumber" name="L4756" href="#L4756">4756</a> <em class="jxr_comment">// wrap(String,int) - uses default newline "\n"</em>
-<a class="jxr_linenumber" name="L4757" href="#L4757">4757</a> assertNull(wrap(<strong class="jxr_keyword">null</strong>, 10));
-<a class="jxr_linenumber" name="L4758" href="#L4758">4758</a> assertEquals(<span class="jxr_string">""</span>, wrap(<span class="jxr_string">""</span>, 10));
-<a class="jxr_linenumber" name="L4759" href="#L4759">4759</a> assertEquals(<span class="jxr_string">"hello\nworld"</span>, wrap(<span class="jxr_string">"hello world"</span>, 10));
-<a class="jxr_linenumber" name="L4760" href="#L4760">4760</a> assertEquals(<span class="jxr_string">"hello\nworld\ntest"</span>, wrap(<span class="jxr_string">"hello world test"</span>, 10));
-<a class="jxr_linenumber" name="L4761" href="#L4761">4761</a> assertEquals(<span class="jxr_string">"hello world"</span>, wrap(<span class="jxr_string">"hello world"</span>, 20));
-<a class="jxr_linenumber" name="L4762" href="#L4762">4762</a> assertEquals(<span class="jxr_string">"hello\nworld"</span>, wrap(<span class="jxr_string">"hello world"</span>, 5));
-<a class="jxr_linenumber" name="L4763" href="#L4763">4763</a> assertEquals(<span class="jxr_string">"supercalifragilisticexpialidocious"</span>, wrap(<span class="jxr_string">"supercalifragilisticexpialidocious"</span>, 10));
-<a class="jxr_linenumber" name="L4764" href="#L4764">4764</a> assertEquals(<span class="jxr_string">"hello\nworld"</span>, wrap(<span class="jxr_string">"hello world"</span>, 10));
-<a class="jxr_linenumber" name="L4765" href="#L4765">4765</a> assertEquals(<span class="jxr_string">"line1\nline2"</span>, wrap(<span class="jxr_string">"line1\nline2"</span>, 10));
-<a class="jxr_linenumber" name="L4766" href="#L4766">4766</a> assertEquals(<span class="jxr_string">"a\nb\nc"</span>, wrap(<span class="jxr_string">"a b c"</span>, 1));
-<a class="jxr_linenumber" name="L4767" href="#L4767">4767</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> wrap(<span class="jxr_string">"test"</span>, 0));
-<a class="jxr_linenumber" name="L4768" href="#L4768">4768</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> wrap(<span class="jxr_string">"test"</span>, -1));
-<a class="jxr_linenumber" name="L4769" href="#L4769">4769</a>
-<a class="jxr_linenumber" name="L4770" href="#L4770">4770</a> <em class="jxr_comment">// wrap(String,int,String) - with custom newline</em>
-<a class="jxr_linenumber" name="L4771" href="#L4771">4771</a> assertNull(wrap(<strong class="jxr_keyword">null</strong>, 10, <span class="jxr_string">"<br>"</span>));
-<a class="jxr_linenumber" name="L4772" href="#L4772">4772</a> assertEquals(<span class="jxr_string">""</span>, wrap(<span class="jxr_string">""</span>, 10, <span class="jxr_string">"<br>"</span>));
-<a class="jxr_linenumber" name="L4773" href="#L4773">4773</a> assertEquals(<span class="jxr_string">"hello<br>world"</span>, wrap(<span class="jxr_string">"hello world"</span>, 10, <span class="jxr_string">"<br>"</span>));
-<a class="jxr_linenumber" name="L4774" href="#L4774">4774</a> assertEquals(<span class="jxr_string">"hello<br>world<br>test"</span>, wrap(<span class="jxr_string">"hello world test"</span>, 10, <span class="jxr_string">"<br>"</span>));
-<a class="jxr_linenumber" name="L4775" href="#L4775">4775</a> assertEquals(<span class="jxr_string">"hello world"</span>, wrap(<span class="jxr_string">"hello world"</span>, 20, <span class="jxr_string">"<br>"</span>));
-<a class="jxr_linenumber" name="L4776" href="#L4776">4776</a> assertEquals(<span class="jxr_string">"hello<br>world"</span>, wrap(<span class="jxr_string">"hello world"</span>, 5, <span class="jxr_string">"<br>"</span>));
-<a class="jxr_linenumber" name="L4777" href="#L4777">4777</a> assertEquals(<span class="jxr_string">"supercalifragilisticexpialidocious"</span>, wrap(<span class="jxr_string">"supercalifragilisticexpialidocious"</span>, 10, <span class="jxr_string">"<br>"</span>));
-<a class="jxr_linenumber" name="L4778" href="#L4778">4778</a> assertEquals(<span class="jxr_string">"line1<br>line2"</span>, wrap(<span class="jxr_string">"line1\nline2"</span>, 10, <span class="jxr_string">"<br>"</span>));
-<a class="jxr_linenumber" name="L4779" href="#L4779">4779</a> assertEquals(<span class="jxr_string">"a<br>b<br>c"</span>, wrap(<span class="jxr_string">"a b c"</span>, 1, <span class="jxr_string">"<br>"</span>));
-<a class="jxr_linenumber" name="L4780" href="#L4780">4780</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> wrap(<span class="jxr_string">"test"</span>, 0, <span class="jxr_string">"\n"</span>));
-<a class="jxr_linenumber" name="L4781" href="#L4781">4781</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> wrap(<span class="jxr_string">"test"</span>, -1, <span class="jxr_string">"\n"</span>));
-<a class="jxr_linenumber" name="L4782" href="#L4782">4782</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> wrap(<span class="jxr_string">"test"</span>, 10, <strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L4783" href="#L4783">4783</a> }
-<a class="jxr_linenumber" name="L4784" href="#L4784">4784</a> }
+<a class="jxr_linenumber" name="L4663" href="#L4663">4663</a> @Test
+<a class="jxr_linenumber" name="L4664" href="#L4664">4664</a> <strong class="jxr_keyword">void</strong> a218_upperCase() {
+<a class="jxr_linenumber" name="L4665" href="#L4665">4665</a> assertNull(upperCase(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4666" href="#L4666">4666</a> assertEquals(<span class="jxr_string">""</span>, upperCase(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L4667" href="#L4667">4667</a> assertEquals(<span class="jxr_string">"HELLO"</span>, upperCase(<span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L4668" href="#L4668">4668</a> assertEquals(<span class="jxr_string">"HELLO WORLD"</span>, upperCase(<span class="jxr_string">"Hello World"</span>));
+<a class="jxr_linenumber" name="L4669" href="#L4669">4669</a> assertEquals(<span class="jxr_string">"123"</span>, upperCase(<span class="jxr_string">"123"</span>));
+<a class="jxr_linenumber" name="L4670" href="#L4670">4670</a> assertEquals(<span class="jxr_string">"ABC"</span>, upperCase(<span class="jxr_string">"abc"</span>));
+<a class="jxr_linenumber" name="L4671" href="#L4671">4671</a> }
+<a class="jxr_linenumber" name="L4672" href="#L4672">4672</a>
+<a class="jxr_linenumber" name="L4673" href="#L4673">4673</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4674" href="#L4674">4674</a> <em class="jxr_comment">// urlDecode(String)</em>
+<a class="jxr_linenumber" name="L4675" href="#L4675">4675</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4676" href="#L4676">4676</a> @Test
+<a class="jxr_linenumber" name="L4677" href="#L4677">4677</a> <strong class="jxr_keyword">void</strong> a219_urlDecode() {
+<a class="jxr_linenumber" name="L4678" href="#L4678">4678</a> assertNull(urlDecode(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4679" href="#L4679">4679</a> assertEquals(<span class="jxr_string">""</span>, urlDecode(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L4680" href="#L4680">4680</a> assertEquals(<span class="jxr_string">"Hello World"</span>, urlDecode(<span class="jxr_string">"Hello+World"</span>));
+<a class="jxr_linenumber" name="L4681" href="#L4681">4681</a> assertEquals(<span class="jxr_string">"Hello World"</span>, urlDecode(<span class="jxr_string">"Hello%20World"</span>));
+<a class="jxr_linenumber" name="L4682" href="#L4682">4682</a> assertEquals(<span class="jxr_string">"test@example.com"</span>, urlDecode(<span class="jxr_string">"test%40example.com"</span>));
+<a class="jxr_linenumber" name="L4683" href="#L4683">4683</a> assertEquals(<span class="jxr_string">"a=b&c=d"</span>, urlDecode(<span class="jxr_string">"a%3Db%26c%3Dd"</span>));
+<a class="jxr_linenumber" name="L4684" href="#L4684">4684</a> <em class="jxr_comment">// No encoding needed - returns as-is</em>
+<a class="jxr_linenumber" name="L4685" href="#L4685">4685</a> assertEquals(<span class="jxr_string">"Hello"</span>, urlDecode(<span class="jxr_string">"Hello"</span>));
+<a class="jxr_linenumber" name="L4686" href="#L4686">4686</a> }
+<a class="jxr_linenumber" name="L4687" href="#L4687">4687</a>
+<a class="jxr_linenumber" name="L4688" href="#L4688">4688</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4689" href="#L4689">4689</a> <em class="jxr_comment">// urlEncode(String)</em>
+<a class="jxr_linenumber" name="L4690" href="#L4690">4690</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4691" href="#L4691">4691</a> @Test
+<a class="jxr_linenumber" name="L4692" href="#L4692">4692</a> <strong class="jxr_keyword">void</strong> a220_urlEncode() {
+<a class="jxr_linenumber" name="L4693" href="#L4693">4693</a> assertNull(urlEncode(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4694" href="#L4694">4694</a> assertEquals(<span class="jxr_string">""</span>, urlEncode(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L4695" href="#L4695">4695</a> assertEquals(<span class="jxr_string">"Hello+World"</span>, urlEncode(<span class="jxr_string">"Hello World"</span>));
+<a class="jxr_linenumber" name="L4696" href="#L4696">4696</a> assertEquals(<span class="jxr_string">"test%40example.com"</span>, urlEncode(<span class="jxr_string">"test@example.com"</span>));
+<a class="jxr_linenumber" name="L4697" href="#L4697">4697</a> assertEquals(<span class="jxr_string">"a%3Db%26c%3Dd"</span>, urlEncode(<span class="jxr_string">"a=b&c=d"</span>));
+<a class="jxr_linenumber" name="L4698" href="#L4698">4698</a> <em class="jxr_comment">// No encoding needed - returns as-is</em>
+<a class="jxr_linenumber" name="L4699" href="#L4699">4699</a> assertEquals(<span class="jxr_string">"Hello"</span>, urlEncode(<span class="jxr_string">"Hello"</span>));
+<a class="jxr_linenumber" name="L4700" href="#L4700">4700</a> assertEquals(<span class="jxr_string">"test123"</span>, urlEncode(<span class="jxr_string">"test123"</span>));
+<a class="jxr_linenumber" name="L4701" href="#L4701">4701</a> }
+<a class="jxr_linenumber" name="L4702" href="#L4702">4702</a>
+<a class="jxr_linenumber" name="L4703" href="#L4703">4703</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4704" href="#L4704">4704</a> <em class="jxr_comment">// urlEncodeLax(String)</em>
+<a class="jxr_linenumber" name="L4705" href="#L4705">4705</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4706" href="#L4706">4706</a> @Test
+<a class="jxr_linenumber" name="L4707" href="#L4707">4707</a> <strong class="jxr_keyword">void</strong> a221_urlEncodeLax() {
+<a class="jxr_linenumber" name="L4708" href="#L4708">4708</a> assertNull(urlEncodeLax(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4709" href="#L4709">4709</a> assertEquals(<span class="jxr_string">""</span>, urlEncodeLax(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L4710" href="#L4710">4710</a> <em class="jxr_comment">// Lax encoding - fewer characters are encoded</em>
+<a class="jxr_linenumber" name="L4711" href="#L4711">4711</a> assertEquals(<span class="jxr_string">"Hello+World"</span>, urlEncodeLax(<span class="jxr_string">"Hello World"</span>));
+<a class="jxr_linenumber" name="L4712" href="#L4712">4712</a> <em class="jxr_comment">// @ might not be encoded in lax mode</em>
+<a class="jxr_linenumber" name="L4713" href="#L4713">4713</a> <strong class="jxr_keyword">var</strong> result1 = urlEncodeLax(<span class="jxr_string">"test@example.com"</span>);
+<a class="jxr_linenumber" name="L4714" href="#L4714">4714</a> assertNotNull(result1);
+<a class="jxr_linenumber" name="L4715" href="#L4715">4715</a> <em class="jxr_comment">// No encoding needed - returns as-is</em>
+<a class="jxr_linenumber" name="L4716" href="#L4716">4716</a> assertEquals(<span class="jxr_string">"Hello"</span>, urlEncodeLax(<span class="jxr_string">"Hello"</span>));
+<a class="jxr_linenumber" name="L4717" href="#L4717">4717</a> assertEquals(<span class="jxr_string">"test123"</span>, urlEncodeLax(<span class="jxr_string">"test123"</span>));
+<a class="jxr_linenumber" name="L4718" href="#L4718">4718</a> }
+<a class="jxr_linenumber" name="L4719" href="#L4719">4719</a>
+<a class="jxr_linenumber" name="L4720" href="#L4720">4720</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4721" href="#L4721">4721</a> <em class="jxr_comment">// urlEncodePath(Object)</em>
+<a class="jxr_linenumber" name="L4722" href="#L4722">4722</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4723" href="#L4723">4723</a> @Test
+<a class="jxr_linenumber" name="L4724" href="#L4724">4724</a> <strong class="jxr_keyword">void</strong> a222_urlEncodePath() {
+<a class="jxr_linenumber" name="L4725" href="#L4725">4725</a> <em class="jxr_comment">// Null input</em>
+<a class="jxr_linenumber" name="L4726" href="#L4726">4726</a> assertNull(urlEncodePath(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4727" href="#L4727">4727</a>
+<a class="jxr_linenumber" name="L4728" href="#L4728">4728</a> <em class="jxr_comment">// Path encoding - doesn't encode slashes</em>
+<a class="jxr_linenumber" name="L4729" href="#L4729">4729</a> <strong class="jxr_keyword">var</strong> result1 = urlEncodePath(<span class="jxr_string">"/path/to/file"</span>);
+<a class="jxr_linenumber" name="L4730" href="#L4730">4730</a> assertNotNull(result1);
+<a class="jxr_linenumber" name="L4731" href="#L4731">4731</a> assertTrue(result1.contains(<span class="jxr_string">"/"</span>));
+<a class="jxr_linenumber" name="L4732" href="#L4732">4732</a>
+<a class="jxr_linenumber" name="L4733" href="#L4733">4733</a> <em class="jxr_comment">// Spaces are encoded</em>
+<a class="jxr_linenumber" name="L4734" href="#L4734">4734</a> <strong class="jxr_keyword">var</strong> result2 = urlEncodePath(<span class="jxr_string">"path with spaces"</span>);
+<a class="jxr_linenumber" name="L4735" href="#L4735">4735</a> assertNotNull(result2);
+<a class="jxr_linenumber" name="L4736" href="#L4736">4736</a> assertTrue(result2.contains(<span class="jxr_string">"+"</span>) || result2.contains(<span class="jxr_string">"%20"</span>));
+<a class="jxr_linenumber" name="L4737" href="#L4737">4737</a>
+<a class="jxr_linenumber" name="L4738" href="#L4738">4738</a> <em class="jxr_comment">// Special characters are encoded</em>
+<a class="jxr_linenumber" name="L4739" href="#L4739">4739</a> <strong class="jxr_keyword">var</strong> result3 = urlEncodePath(<span class="jxr_string">"file@name"</span>);
+<a class="jxr_linenumber" name="L4740" href="#L4740">4740</a> assertNotNull(result3);
+<a class="jxr_linenumber" name="L4741" href="#L4741">4741</a> }
+<a class="jxr_linenumber" name="L4742" href="#L4742">4742</a>
+<a class="jxr_linenumber" name="L4743" href="#L4743">4743</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4744" href="#L4744">4744</a> <em class="jxr_comment">// wordCount(String)</em>
+<a class="jxr_linenumber" name="L4745" href="#L4745">4745</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4746" href="#L4746">4746</a> @Test
+<a class="jxr_linenumber" name="L4747" href="#L4747">4747</a> <strong class="jxr_keyword">void</strong> a223_wordCount() {
+<a class="jxr_linenumber" name="L4748" href="#L4748">4748</a> assertEquals(0, wordCount(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4749" href="#L4749">4749</a> assertEquals(0, wordCount(<span class="jxr_string">""</span>));
+<a class="jxr_linenumber" name="L4750" href="#L4750">4750</a> assertEquals(0, wordCount(<span class="jxr_string">" "</span>));
+<a class="jxr_linenumber" name="L4751" href="#L4751">4751</a> assertEquals(1, wordCount(<span class="jxr_string">"hello"</span>));
+<a class="jxr_linenumber" name="L4752" href="#L4752">4752</a> assertEquals(2, wordCount(<span class="jxr_string">"Hello world"</span>));
+<a class="jxr_linenumber" name="L4753" href="#L4753">4753</a> assertEquals(4, wordCount(<span class="jxr_string">"The quick brown fox"</span>));
+<a class="jxr_linenumber" name="L4754" href="#L4754">4754</a> assertEquals(5, wordCount(<span class="jxr_string">"Hello, world! How are you?"</span>));
+<a class="jxr_linenumber" name="L4755" href="#L4755">4755</a> assertEquals(3, wordCount(<span class="jxr_string">"one\ttwo\nthree"</span>));
+<a class="jxr_linenumber" name="L4756" href="#L4756">4756</a> assertEquals(1, wordCount(<span class="jxr_string">"hello123"</span>));
+<a class="jxr_linenumber" name="L4757" href="#L4757">4757</a> <em class="jxr_comment">// Underscores are part of word characters, so "hello_world" is one word</em>
+<a class="jxr_linenumber" name="L4758" href="#L4758">4758</a> assertEquals(1, wordCount(<span class="jxr_string">"hello_world"</span>));
+<a class="jxr_linenumber" name="L4759" href="#L4759">4759</a> assertEquals(2, wordCount(<span class="jxr_string">"hello world"</span>));
+<a class="jxr_linenumber" name="L4760" href="#L4760">4760</a> }
+<a class="jxr_linenumber" name="L4761" href="#L4761">4761</a>
+<a class="jxr_linenumber" name="L4762" href="#L4762">4762</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4763" href="#L4763">4763</a> <em class="jxr_comment">// wrap(String,int) and wrap(String,int,String)</em>
+<a class="jxr_linenumber" name="L4764" href="#L4764">4764</a> <em class="jxr_comment">//====================================================================================================</em>
+<a class="jxr_linenumber" name="L4765" href="#L4765">4765</a> @Test
+<a class="jxr_linenumber" name="L4766" href="#L4766">4766</a> <strong class="jxr_keyword">void</strong> a224_wrap() {
+<a class="jxr_linenumber" name="L4767" href="#L4767">4767</a> <em class="jxr_comment">// wrap(String,int) - uses default newline "\n"</em>
+<a class="jxr_linenumber" name="L4768" href="#L4768">4768</a> assertNull(wrap(<strong class="jxr_keyword">null</strong>, 10));
+<a class="jxr_linenumber" name="L4769" href="#L4769">4769</a> assertEquals(<span class="jxr_string">""</span>, wrap(<span class="jxr_string">""</span>, 10));
+<a class="jxr_linenumber" name="L4770" href="#L4770">4770</a> assertEquals(<span class="jxr_string">"hello\nworld"</span>, wrap(<span class="jxr_string">"hello world"</span>, 10));
+<a class="jxr_linenumber" name="L4771" href="#L4771">4771</a> assertEquals(<span class="jxr_string">"hello\nworld\ntest"</span>, wrap(<span class="jxr_string">"hello world test"</span>, 10));
+<a class="jxr_linenumber" name="L4772" href="#L4772">4772</a> assertEquals(<span class="jxr_string">"hello world"</span>, wrap(<span class="jxr_string">"hello world"</span>, 20));
+<a class="jxr_linenumber" name="L4773" href="#L4773">4773</a> assertEquals(<span class="jxr_string">"hello\nworld"</span>, wrap(<span class="jxr_string">"hello world"</span>, 5));
+<a class="jxr_linenumber" name="L4774" href="#L4774">4774</a> assertEquals(<span class="jxr_string">"supercalifragilisticexpialidocious"</span>, wrap(<span class="jxr_string">"supercalifragilisticexpialidocious"</span>, 10));
+<a class="jxr_linenumber" name="L4775" href="#L4775">4775</a> assertEquals(<span class="jxr_string">"hello\nworld"</span>, wrap(<span class="jxr_string">"hello world"</span>, 10));
+<a class="jxr_linenumber" name="L4776" href="#L4776">4776</a> assertEquals(<span class="jxr_string">"line1\nline2"</span>, wrap(<span class="jxr_string">"line1\nline2"</span>, 10));
+<a class="jxr_linenumber" name="L4777" href="#L4777">4777</a> assertEquals(<span class="jxr_string">"a\nb\nc"</span>, wrap(<span class="jxr_string">"a b c"</span>, 1));
+<a class="jxr_linenumber" name="L4778" href="#L4778">4778</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> wrap(<span class="jxr_string">"test"</span>, 0));
+<a class="jxr_linenumber" name="L4779" href="#L4779">4779</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> wrap(<span class="jxr_string">"test"</span>, -1));
+<a class="jxr_linenumber" name="L4780" href="#L4780">4780</a>
+<a class="jxr_linenumber" name="L4781" href="#L4781">4781</a> <em class="jxr_comment">// wrap(String,int,String) - with custom newline</em>
+<a class="jxr_linenumber" name="L4782" href="#L4782">4782</a> assertNull(wrap(<strong class="jxr_keyword">null</strong>, 10, <span class="jxr_string">"<br>"</span>));
+<a class="jxr_linenumber" name="L4783" href="#L4783">4783</a> assertEquals(<span class="jxr_string">""</span>, wrap(<span class="jxr_string">""</span>, 10, <span class="jxr_string">"<br>"</span>));
+<a class="jxr_linenumber" name="L4784" href="#L4784">4784</a> assertEquals(<span class="jxr_string">"hello<br>world"</span>, wrap(<span class="jxr_string">"hello world"</span>, 10, <span class="jxr_string">"<br>"</span>));
+<a class="jxr_linenumber" name="L4785" href="#L4785">4785</a> assertEquals(<span class="jxr_string">"hello<br>world<br>test"</span>, wrap(<span class="jxr_string">"hello world test"</span>, 10, <span class="jxr_string">"<br>"</span>));
+<a class="jxr_linenumber" name="L4786" href="#L4786">4786</a> assertEquals(<span class="jxr_string">"hello world"</span>, wrap(<span class="jxr_string">"hello world"</span>, 20, <span class="jxr_string">"<br>"</span>));
+<a class="jxr_linenumber" name="L4787" href="#L4787">4787</a> assertEquals(<span class="jxr_string">"hello<br>world"</span>, wrap(<span class="jxr_string">"hello world"</span>, 5, <span class="jxr_string">"<br>"</span>));
+<a class="jxr_linenumber" name="L4788" href="#L4788">4788</a> assertEquals(<span class="jxr_string">"supercalifragilisticexpialidocious"</span>, wrap(<span class="jxr_string">"supercalifragilisticexpialidocious"</span>, 10, <span class="jxr_string">"<br>"</span>));
+<a class="jxr_linenumber" name="L4789" href="#L4789">4789</a> assertEquals(<span class="jxr_string">"line1<br>line2"</span>, wrap(<span class="jxr_string">"line1\nline2"</span>, 10, <span class="jxr_string">"<br>"</span>));
+<a class="jxr_linenumber" name="L4790" href="#L4790">4790</a> assertEquals(<span class="jxr_string">"a<br>b<br>c"</span>, wrap(<span class="jxr_string">"a b c"</span>, 1, <span class="jxr_string">"<br>"</span>));
+<a class="jxr_linenumber" name="L4791" href="#L4791">4791</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> wrap(<span class="jxr_string">"test"</span>, 0, <span class="jxr_string">"\n"</span>));
+<a class="jxr_linenumber" name="L4792" href="#L4792">4792</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> wrap(<span class="jxr_string">"test"</span>, -1, <span class="jxr_string">"\n"</span>));
+<a class="jxr_linenumber" name="L4793" href="#L4793">4793</a> assertThrows(IllegalArgumentException.<strong class="jxr_keyword">class</strong>, () -> wrap(<span class="jxr_string">"test"</span>, 10, <strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L4794" href="#L4794">4794</a> }
+<a class="jxr_linenumber" name="L4795" href="#L4795">4795</a> }
</pre>
<hr/>
<div id="footer">© 2016–2025 <a href="https://www.apache.org/">The Apache Software Foundation</a></div>
diff --git a/site/xref/org/apache/juneau/common/utils/StringUtils.html b/site/xref/org/apache/juneau/common/utils/StringUtils.html
index ecf1efed08..936f71ccab 100644
--- a/site/xref/org/apache/juneau/common/utils/StringUtils.html
+++ b/site/xref/org/apache/juneau/common/utils/StringUtils.html
@@ -5287,3087 +5287,3098 @@
<a class="jxr_linenumber" name="L5279" href="#L5279">5279</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">long</strong> parseLongWithSuffix(String s) {
<a class="jxr_linenumber" name="L5280" href="#L5280">5280</a> assertArgNotNull(<span class="jxr_string">"s"</span>, s);
<a class="jxr_linenumber" name="L5281" href="#L5281">5281</a> <strong class="jxr_keyword">var</strong> m = multiplierLong(s);
-<a class="jxr_linenumber" name="L5282" href="#L5282">5282</a> <strong class="jxr_keyword">if</strong> (m == 1)
-<a class="jxr_linenumber" name="L5283" href="#L5283">5283</a> <strong class="jxr_keyword">return</strong> Long.decode(s);
-<a class="jxr_linenumber" name="L5284" href="#L5284">5284</a> <strong class="jxr_keyword">return</strong> Long.decode(s.substring(0, s.length() - 1).trim()) * m; <em class="jxr_comment">// NOSONAR - NPE not possible here.</em>
-<a class="jxr_linenumber" name="L5285" href="#L5285">5285</a> }
-<a class="jxr_linenumber" name="L5286" href="#L5286">5286</a>
-<a class="jxr_linenumber" name="L5287" href="#L5287">5287</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L5288" href="#L5288">5288</a> <em class="jxr_javadoccomment"> * Parses a string containing key-value pairs into a map.</em>
-<a class="jxr_linenumber" name="L5289" href="#L5289">5289</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5290" href="#L5290">5290</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L5291" href="#L5291">5291</a> <em class="jxr_javadoccomment"> * Splits the string by the entry delimiter, then splits each entry by the key-value delimiter.</em>
-<a class="jxr_linenumber" name="L5292" href="#L5292">5292</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5293" href="#L5293">5293</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
-<a class="jxr_linenumber" name="L5294" href="#L5294">5294</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L5295" href="#L5295">5295</a> <em class="jxr_javadoccomment"> * parseMap(<js>"key1=value1,key2=value2"</js>, <js>'='</js>, <js>','</js>, <jk>false</jk>);</em>
-<a class="jxr_linenumber" name="L5296" href="#L5296">5296</a> <em class="jxr_javadoccomment"> * <jc>// {"key1":"value1","key2":"value2"}</jc></em>
-<a class="jxr_linenumber" name="L5297" href="#L5297">5297</a> <em class="jxr_javadoccomment"> * parseMap(<js>" key1 = value1 ; key2 = value2 "</js>, <js>'='</js>, <js>';'</js>, <jk>true</jk>);</em>
-<a class="jxr_linenumber" name="L5298" href="#L5298">5298</a> <em class="jxr_javadoccomment"> * <jc>// {"key1":"value1","key2":"value2"}</jc></em>
-<a class="jxr_linenumber" name="L5299" href="#L5299">5299</a> <em class="jxr_javadoccomment"> * </p></em>
-<a class="jxr_linenumber" name="L5300" href="#L5300">5300</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5301" href="#L5301">5301</a> <em class="jxr_javadoccomment"> * @param str The string to parse. Can be <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L5302" href="#L5302">5302</a> <em class="jxr_javadoccomment"> * @param keyValueDelimiter The character that separates keys from values.</em>
-<a class="jxr_linenumber" name="L5303" href="#L5303">5303</a> <em class="jxr_javadoccomment"> * @param entryDelimiter The character that separates entries.</em>
-<a class="jxr_linenumber" name="L5304" href="#L5304">5304</a> <em class="jxr_javadoccomment"> * @param trimKeys If <jk>true</jk>, trims whitespace from keys and values.</em>
-<a class="jxr_linenumber" name="L5305" href="#L5305">5305</a> <em class="jxr_javadoccomment"> * @return A map containing the parsed key-value pairs, or an empty map if the string is <jk>null</jk> or empty.</em>
-<a class="jxr_linenumber" name="L5306" href="#L5306">5306</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L5307" href="#L5307">5307</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> Map<String,String> parseMap(String str, <strong class="jxr_keyword">char</strong> keyValueDelimiter, <strong class="jxr_keyword">char</strong> entryDelimiter, <strong class="jxr_keyword">boolean</strong> trimKeys) {
-<a class="jxr_linenumber" name="L5308" href="#L5308">5308</a> <strong class="jxr_keyword">var</strong> result = <strong class="jxr_keyword">new</strong> LinkedHashMap<String,String>();
-<a class="jxr_linenumber" name="L5309" href="#L5309">5309</a> <strong class="jxr_keyword">if</strong> (isEmpty(str))
-<a class="jxr_linenumber" name="L5310" href="#L5310">5310</a> <strong class="jxr_keyword">return</strong> result;
-<a class="jxr_linenumber" name="L5311" href="#L5311">5311</a>
-<a class="jxr_linenumber" name="L5312" href="#L5312">5312</a> <strong class="jxr_keyword">var</strong> entries = split(str, entryDelimiter);
-<a class="jxr_linenumber" name="L5313" href="#L5313">5313</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> entry : entries) {
-<a class="jxr_linenumber" name="L5314" href="#L5314">5314</a> <strong class="jxr_keyword">if</strong> (isEmpty(entry))
-<a class="jxr_linenumber" name="L5315" href="#L5315">5315</a> <strong class="jxr_keyword">continue</strong>;
-<a class="jxr_linenumber" name="L5316" href="#L5316">5316</a> <strong class="jxr_keyword">var</strong> delimiterIndex = entry.indexOf(keyValueDelimiter);
-<a class="jxr_linenumber" name="L5317" href="#L5317">5317</a> <strong class="jxr_keyword">if</strong> (delimiterIndex == -1) {
-<a class="jxr_linenumber" name="L5318" href="#L5318">5318</a> <em class="jxr_comment">// No delimiter found, treat entire entry as key with empty value</em>
-<a class="jxr_linenumber" name="L5319" href="#L5319">5319</a> <strong class="jxr_keyword">var</strong> key = trimKeys ? entry.trim() : entry;
-<a class="jxr_linenumber" name="L5320" href="#L5320">5320</a> result.put(key, <span class="jxr_string">""</span>);
-<a class="jxr_linenumber" name="L5321" href="#L5321">5321</a> } <strong class="jxr_keyword">else</strong> {
-<a class="jxr_linenumber" name="L5322" href="#L5322">5322</a> <strong class="jxr_keyword">var</strong> key = entry.substring(0, delimiterIndex);
-<a class="jxr_linenumber" name="L5323" href="#L5323">5323</a> <strong class="jxr_keyword">var</strong> value = entry.substring(delimiterIndex + 1);
-<a class="jxr_linenumber" name="L5324" href="#L5324">5324</a> <strong class="jxr_keyword">if</strong> (trimKeys) {
-<a class="jxr_linenumber" name="L5325" href="#L5325">5325</a> key = key.trim();
-<a class="jxr_linenumber" name="L5326" href="#L5326">5326</a> value = value.trim();
-<a class="jxr_linenumber" name="L5327" href="#L5327">5327</a> }
-<a class="jxr_linenumber" name="L5328" href="#L5328">5328</a> result.put(key, value);
-<a class="jxr_linenumber" name="L5329" href="#L5329">5329</a> }
-<a class="jxr_linenumber" name="L5330" href="#L5330">5330</a> }
-<a class="jxr_linenumber" name="L5331" href="#L5331">5331</a> <strong class="jxr_keyword">return</strong> result;
-<a class="jxr_linenumber" name="L5332" href="#L5332">5332</a> }
-<a class="jxr_linenumber" name="L5333" href="#L5333">5333</a>
-<a class="jxr_linenumber" name="L5334" href="#L5334">5334</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L5335" href="#L5335">5335</a> <em class="jxr_javadoccomment"> * Parses a number from the specified string.</em>
-<a class="jxr_linenumber" name="L5336" href="#L5336">5336</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5337" href="#L5337">5337</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L5338" href="#L5338">5338</a> <em class="jxr_javadoccomment"> * Supports Java 7+ numeric literals with underscores (e.g., <js>"1_000_000"</js>).</em>
-<a class="jxr_linenumber" name="L5339" href="#L5339">5339</a> <em class="jxr_javadoccomment"> * The underscores are automatically removed before parsing.</em>
-<a class="jxr_linenumber" name="L5340" href="#L5340">5340</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5341" href="#L5341">5341</a> <em class="jxr_javadoccomment"> * @param s The string to parse the number from.</em>
-<a class="jxr_linenumber" name="L5342" href="#L5342">5342</a> <em class="jxr_javadoccomment"> * @param type</em>
-<a class="jxr_linenumber" name="L5343" href="#L5343">5343</a> <em class="jxr_javadoccomment"> * The number type to created.</em>
-<a class="jxr_linenumber" name="L5344" href="#L5344">5344</a> <em class="jxr_javadoccomment"> * Can be any of the following:</em>
-<a class="jxr_linenumber" name="L5345" href="#L5345">5345</a> <em class="jxr_javadoccomment"> * <ul></em>
-<a class="jxr_linenumber" name="L5346" href="#L5346">5346</a> <em class="jxr_javadoccomment"> * <li> Integer (or <c>int</c> primitive)</em>
-<a class="jxr_linenumber" name="L5347" href="#L5347">5347</a> <em class="jxr_javadoccomment"> * <li> Long (or <c>long</c> primitive)</em>
-<a class="jxr_linenumber" name="L5348" href="#L5348">5348</a> <em class="jxr_javadoccomment"> * <li> Short (or <c>short</c> primitive)</em>
-<a class="jxr_linenumber" name="L5349" href="#L5349">5349</a> <em class="jxr_javadoccomment"> * <li> Byte (or <c>byte</c> primitive)</em>
-<a class="jxr_linenumber" name="L5350" href="#L5350">5350</a> <em class="jxr_javadoccomment"> * <li> Float (or <c>float</c> primitive)</em>
-<a class="jxr_linenumber" name="L5351" href="#L5351">5351</a> <em class="jxr_javadoccomment"> * <li> Double (or <c>double</c> primitive)</em>
-<a class="jxr_linenumber" name="L5352" href="#L5352">5352</a> <em class="jxr_javadoccomment"> * <li> BigInteger</em>
-<a class="jxr_linenumber" name="L5353" href="#L5353">5353</a> <em class="jxr_javadoccomment"> * <li> BigDecimal</em>
-<a class="jxr_linenumber" name="L5354" href="#L5354">5354</a> <em class="jxr_javadoccomment"> * <li> AtomicInteger</em>
-<a class="jxr_linenumber" name="L5355" href="#L5355">5355</a> <em class="jxr_javadoccomment"> * <li> AtomicLong</em>
-<a class="jxr_linenumber" name="L5356" href="#L5356">5356</a> <em class="jxr_javadoccomment"> * </ul></em>
-<a class="jxr_linenumber" name="L5357" href="#L5357">5357</a> <em class="jxr_javadoccomment"> * If <jk>null</jk> or <c>Number</c>, uses the best guess.</em>
-<a class="jxr_linenumber" name="L5358" href="#L5358">5358</a> <em class="jxr_javadoccomment"> * @return The parsed number, or <jk>null</jk> if the string was null.</em>
-<a class="jxr_linenumber" name="L5359" href="#L5359">5359</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L5360" href="#L5360">5360</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> Number parseNumber(String s, Class<? <strong class="jxr_keyword">extends</strong> Number> type) {
-<a class="jxr_linenumber" name="L5361" href="#L5361">5361</a> <strong class="jxr_keyword">if</strong> (s == <strong class="jxr_keyword">null</strong>)
-<a class="jxr_linenumber" name="L5362" href="#L5362">5362</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
-<a class="jxr_linenumber" name="L5363" href="#L5363">5363</a> <strong class="jxr_keyword">if</strong> (s.isEmpty())
-<a class="jxr_linenumber" name="L5364" href="#L5364">5364</a> s = <span class="jxr_string">"0"</span>;
-<a class="jxr_linenumber" name="L5365" href="#L5365">5365</a> <strong class="jxr_keyword">if</strong> (type == <strong class="jxr_keyword">null</strong>)
-<a class="jxr_linenumber" name="L5366" href="#L5366">5366</a> type = Number.<strong class="jxr_keyword">class</strong>;
-<a class="jxr_linenumber" name="L5367" href="#L5367">5367</a>
-<a class="jxr_linenumber" name="L5368" href="#L5368">5368</a> <em class="jxr_comment">// Remove underscores (Java 7+ numeric literal support) before parsing</em>
-<a class="jxr_linenumber" name="L5369" href="#L5369">5369</a> <em class="jxr_comment">// Note: We do this before type detection to ensure clean parsing</em>
-<a class="jxr_linenumber" name="L5370" href="#L5370">5370</a> s = s.replace(<span class="jxr_string">"_"</span>, <span class="jxr_string">""</span>);
-<a class="jxr_linenumber" name="L5371" href="#L5371">5371</a>
-<a class="jxr_linenumber" name="L5372" href="#L5372">5372</a> <em class="jxr_comment">// Determine the data type if it wasn't specified.</em>
-<a class="jxr_linenumber" name="L5373" href="#L5373">5373</a> <strong class="jxr_keyword">var</strong> isAutoDetect = (type == Number.<strong class="jxr_keyword">class</strong>);
-<a class="jxr_linenumber" name="L5374" href="#L5374">5374</a> <strong class="jxr_keyword">var</strong> isDecimal = false;
-<a class="jxr_linenumber" name="L5375" href="#L5375">5375</a> <strong class="jxr_keyword">if</strong> (isAutoDetect) {
-<a class="jxr_linenumber" name="L5376" href="#L5376">5376</a> <em class="jxr_comment">// If we're auto-detecting, then we use either an Integer, Long, or Double depending on how</em>
-<a class="jxr_linenumber" name="L5377" href="#L5377">5377</a> <em class="jxr_comment">// long the string is.</em>
-<a class="jxr_linenumber" name="L5378" href="#L5378">5378</a> <em class="jxr_comment">// An integer range is -2,147,483,648 to 2,147,483,647</em>
-<a class="jxr_linenumber" name="L5379" href="#L5379">5379</a> <em class="jxr_comment">// An long range is -9,223,372,036,854,775,808 to +9,223,372,036,854,775,807</em>
-<a class="jxr_linenumber" name="L5380" href="#L5380">5380</a> isDecimal = isDecimal(s);
-<a class="jxr_linenumber" name="L5381" href="#L5381">5381</a> <strong class="jxr_keyword">if</strong> (isDecimal) {
-<a class="jxr_linenumber" name="L5382" href="#L5382">5382</a> <strong class="jxr_keyword">if</strong> (s.length() > 20)
-<a class="jxr_linenumber" name="L5383" href="#L5383">5383</a> type = Double.<strong class="jxr_keyword">class</strong>;
-<a class="jxr_linenumber" name="L5384" href="#L5384">5384</a> <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (s.length() >= 10)
-<a class="jxr_linenumber" name="L5385" href="#L5385">5385</a> type = Long.<strong class="jxr_keyword">class</strong>;
-<a class="jxr_linenumber" name="L5386" href="#L5386">5386</a> <strong class="jxr_keyword">else</strong>
-<a class="jxr_linenumber" name="L5387" href="#L5387">5387</a> type = Integer.<strong class="jxr_keyword">class</strong>;
-<a class="jxr_linenumber" name="L5388" href="#L5388">5388</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (isFloat(s))
-<a class="jxr_linenumber" name="L5389" href="#L5389">5389</a> type = Double.<strong class="jxr_keyword">class</strong>;
-<a class="jxr_linenumber" name="L5390" href="#L5390">5390</a> <strong class="jxr_keyword">else</strong>
-<a class="jxr_linenumber" name="L5391" href="#L5391">5391</a> <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> NumberFormatException(s);
-<a class="jxr_linenumber" name="L5392" href="#L5392">5392</a> }
-<a class="jxr_linenumber" name="L5393" href="#L5393">5393</a>
-<a class="jxr_linenumber" name="L5394" href="#L5394">5394</a> <strong class="jxr_keyword">if</strong> (type == Double.<strong class="jxr_keyword">class</strong> || type == Double.TYPE) {
-<a class="jxr_linenumber" name="L5395" href="#L5395">5395</a> <strong class="jxr_keyword">var</strong> d = Double.valueOf(s);
-<a class="jxr_linenumber" name="L5396" href="#L5396">5396</a> <strong class="jxr_keyword">var</strong> f = Float.valueOf(s);
-<a class="jxr_linenumber" name="L5397" href="#L5397">5397</a> <strong class="jxr_keyword">if</strong> (isAutoDetect && (! isDecimal) && d.toString().equals(f.toString()))
-<a class="jxr_linenumber" name="L5398" href="#L5398">5398</a> <strong class="jxr_keyword">return</strong> f;
-<a class="jxr_linenumber" name="L5399" href="#L5399">5399</a> <strong class="jxr_keyword">return</strong> d;
-<a class="jxr_linenumber" name="L5400" href="#L5400">5400</a> }
-<a class="jxr_linenumber" name="L5401" href="#L5401">5401</a> <strong class="jxr_keyword">if</strong> (type == Float.<strong class="jxr_keyword">class</strong> || type == Float.TYPE)
-<a class="jxr_linenumber" name="L5402" href="#L5402">5402</a> <strong class="jxr_keyword">return</strong> Float.valueOf(s);
-<a class="jxr_linenumber" name="L5403" href="#L5403">5403</a> <strong class="jxr_keyword">if</strong> (type == BigDecimal.<strong class="jxr_keyword">class</strong>)
-<a class="jxr_linenumber" name="L5404" href="#L5404">5404</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">new</strong> BigDecimal(s);
-<a class="jxr_linenumber" name="L5405" href="#L5405">5405</a> <strong class="jxr_keyword">if</strong> (type == Long.<strong class="jxr_keyword">class</strong> || type == Long.TYPE || type == AtomicLong.<strong class="jxr_keyword">class</strong>) {
-<a class="jxr_linenumber" name="L5406" href="#L5406">5406</a> <strong class="jxr_keyword">try</strong> {
-<a class="jxr_linenumber" name="L5407" href="#L5407">5407</a> <strong class="jxr_keyword">var</strong> l = Long.decode(s);
-<a class="jxr_linenumber" name="L5408" href="#L5408">5408</a> <strong class="jxr_keyword">if</strong> (type == AtomicLong.<strong class="jxr_keyword">class</strong>)
-<a class="jxr_linenumber" name="L5409" href="#L5409">5409</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">new</strong> AtomicLong(l);
-<a class="jxr_linenumber" name="L5410" href="#L5410">5410</a> <strong class="jxr_keyword">if</strong> (isAutoDetect && l >= Integer.MIN_VALUE && l <= Integer.MAX_VALUE) {
-<a class="jxr_linenumber" name="L5411" href="#L5411">5411</a> <em class="jxr_comment">// This occurs if the string is 10 characters long but is still a valid integer value.</em>
-<a class="jxr_linenumber" name="L5412" href="#L5412">5412</a> <strong class="jxr_keyword">return</strong> l.intValue();
-<a class="jxr_linenumber" name="L5413" href="#L5413">5413</a> }
-<a class="jxr_linenumber" name="L5414" href="#L5414">5414</a> <strong class="jxr_keyword">return</strong> l;
-<a class="jxr_linenumber" name="L5415" href="#L5415">5415</a> } <strong class="jxr_keyword">catch</strong> (NumberFormatException e) {
-<a class="jxr_linenumber" name="L5416" href="#L5416">5416</a> <strong class="jxr_keyword">if</strong> (isAutoDetect) {
-<a class="jxr_linenumber" name="L5417" href="#L5417">5417</a> <em class="jxr_comment">// This occurs if the string is 20 characters long but still falls outside the range of a valid long.</em>
-<a class="jxr_linenumber" name="L5418" href="#L5418">5418</a> <strong class="jxr_keyword">return</strong> Double.valueOf(s);
-<a class="jxr_linenumber" name="L5419" href="#L5419">5419</a> }
-<a class="jxr_linenumber" name="L5420" href="#L5420">5420</a> <strong class="jxr_keyword">throw</strong> e;
-<a class="jxr_linenumber" name="L5421" href="#L5421">5421</a> }
-<a class="jxr_linenumber" name="L5422" href="#L5422">5422</a> }
-<a class="jxr_linenumber" name="L5423" href="#L5423">5423</a> <strong class="jxr_keyword">if</strong> (type == Integer.<strong class="jxr_keyword">class</strong> || type == Integer.TYPE)
-<a class="jxr_linenumber" name="L5424" href="#L5424">5424</a> <strong class="jxr_keyword">return</strong> Integer.decode(s);
-<a class="jxr_linenumber" name="L5425" href="#L5425">5425</a> <strong class="jxr_keyword">if</strong> (type == Short.<strong class="jxr_keyword">class</strong> || type == Short.TYPE)
-<a class="jxr_linenumber" name="L5426" href="#L5426">5426</a> <strong class="jxr_keyword">return</strong> Short.decode(s);
-<a class="jxr_linenumber" name="L5427" href="#L5427">5427</a> <strong class="jxr_keyword">if</strong> (type == Byte.<strong class="jxr_keyword">class</strong> || type == Byte.TYPE)
-<a class="jxr_linenumber" name="L5428" href="#L5428">5428</a> <strong class="jxr_keyword">return</strong> Byte.decode(s);
-<a class="jxr_linenumber" name="L5429" href="#L5429">5429</a> <strong class="jxr_keyword">if</strong> (type == BigInteger.<strong class="jxr_keyword">class</strong>)
-<a class="jxr_linenumber" name="L5430" href="#L5430">5430</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">new</strong> BigInteger(s);
-<a class="jxr_linenumber" name="L5431" href="#L5431">5431</a> <strong class="jxr_keyword">if</strong> (type == AtomicInteger.<strong class="jxr_keyword">class</strong>)
-<a class="jxr_linenumber" name="L5432" href="#L5432">5432</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">new</strong> AtomicInteger(Integer.decode(s));
-<a class="jxr_linenumber" name="L5433" href="#L5433">5433</a> <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> NumberFormatException(<span class="jxr_string">"Unsupported Number type: "</span> + type.getName());
-<a class="jxr_linenumber" name="L5434" href="#L5434">5434</a> }
-<a class="jxr_linenumber" name="L5435" href="#L5435">5435</a>
-<a class="jxr_linenumber" name="L5436" href="#L5436">5436</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L5437" href="#L5437">5437</a> <em class="jxr_javadoccomment"> * Converts a string to PascalCase format.</em>
-<a class="jxr_linenumber" name="L5438" href="#L5438">5438</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5439" href="#L5439">5439</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L5440" href="#L5440">5440</a> <em class="jxr_javadoccomment"> * Handles various input formats:</em>
-<a class="jxr_linenumber" name="L5441" href="#L5441">5441</a> <em class="jxr_javadoccomment"> * <ul></em>
-<a class="jxr_linenumber" name="L5442" href="#L5442">5442</a> <em class="jxr_javadoccomment"> * <li>Space-separated: "hello world" → "HelloWorld"</li></em>
-<a class="jxr_linenumber" name="L5443" href="#L5443">5443</a> <em class="jxr_javadoccomment"> * <li>CamelCase: "helloWorld" → "HelloWorld"</li></em>
-<a class="jxr_linenumber" name="L5444" href="#L5444">5444</a> <em class="jxr_javadoccomment"> * <li>Snake_case: "hello_world" → "HelloWorld"</li></em>
-<a class="jxr_linenumber" name="L5445" href="#L5445">5445</a> <em class="jxr_javadoccomment"> * <li>Kebab-case: "hello-world" → "HelloWorld"</li></em>
-<a class="jxr_linenumber" name="L5446" href="#L5446">5446</a> <em class="jxr_javadoccomment"> * </ul></em>
+<a class="jxr_linenumber" name="L5282" href="#L5282">5282</a> <strong class="jxr_keyword">if</strong> (m == 1) {
+<a class="jxr_linenumber" name="L5283" href="#L5283">5283</a> <em class="jxr_comment">// If multiplier is 1, try to decode the whole string</em>
+<a class="jxr_linenumber" name="L5284" href="#L5284">5284</a> <em class="jxr_comment">// This will throw NumberFormatException if it contains a suffix character</em>
+<a class="jxr_linenumber" name="L5285" href="#L5285">5285</a> <strong class="jxr_keyword">return</strong> Long.decode(s);
+<a class="jxr_linenumber" name="L5286" href="#L5286">5286</a> }
+<a class="jxr_linenumber" name="L5287" href="#L5287">5287</a> <strong class="jxr_keyword">var</strong> baseStr = s.substring(0, s.length() - 1).trim();
+<a class="jxr_linenumber" name="L5288" href="#L5288">5288</a> <strong class="jxr_keyword">var</strong> base = Long.decode(baseStr); <em class="jxr_comment">// NOSONAR - NPE not possible here.</em>
+<a class="jxr_linenumber" name="L5289" href="#L5289">5289</a> <strong class="jxr_keyword">try</strong> {
+<a class="jxr_linenumber" name="L5290" href="#L5290">5290</a> <strong class="jxr_keyword">return</strong> Math.multiplyExact(base, m);
+<a class="jxr_linenumber" name="L5291" href="#L5291">5291</a> } <strong class="jxr_keyword">catch</strong> (ArithmeticException e) {
+<a class="jxr_linenumber" name="L5292" href="#L5292">5292</a> <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> NumberFormatException(<span class="jxr_string">"Value "</span> + s + <span class="jxr_string">" exceeds Long.MAX_VALUE"</span>);
+<a class="jxr_linenumber" name="L5293" href="#L5293">5293</a> }
+<a class="jxr_linenumber" name="L5294" href="#L5294">5294</a> }
+<a class="jxr_linenumber" name="L5295" href="#L5295">5295</a>
+<a class="jxr_linenumber" name="L5296" href="#L5296">5296</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L5297" href="#L5297">5297</a> <em class="jxr_javadoccomment"> * Parses a string containing key-value pairs into a map.</em>
+<a class="jxr_linenumber" name="L5298" href="#L5298">5298</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5299" href="#L5299">5299</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L5300" href="#L5300">5300</a> <em class="jxr_javadoccomment"> * Splits the string by the entry delimiter, then splits each entry by the key-value delimiter.</em>
+<a class="jxr_linenumber" name="L5301" href="#L5301">5301</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5302" href="#L5302">5302</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
+<a class="jxr_linenumber" name="L5303" href="#L5303">5303</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
+<a class="jxr_linenumber" name="L5304" href="#L5304">5304</a> <em class="jxr_javadoccomment"> * parseMap(<js>"key1=value1,key2=value2"</js>, <js>'='</js>, <js>','</js>, <jk>false</jk>);</em>
+<a class="jxr_linenumber" name="L5305" href="#L5305">5305</a> <em class="jxr_javadoccomment"> * <jc>// {"key1":"value1","key2":"value2"}</jc></em>
+<a class="jxr_linenumber" name="L5306" href="#L5306">5306</a> <em class="jxr_javadoccomment"> * parseMap(<js>" key1 = value1 ; key2 = value2 "</js>, <js>'='</js>, <js>';'</js>, <jk>true</jk>);</em>
+<a class="jxr_linenumber" name="L5307" href="#L5307">5307</a> <em class="jxr_javadoccomment"> * <jc>// {"key1":"value1","key2":"value2"}</jc></em>
+<a class="jxr_linenumber" name="L5308" href="#L5308">5308</a> <em class="jxr_javadoccomment"> * </p></em>
+<a class="jxr_linenumber" name="L5309" href="#L5309">5309</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5310" href="#L5310">5310</a> <em class="jxr_javadoccomment"> * @param str The string to parse. Can be <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L5311" href="#L5311">5311</a> <em class="jxr_javadoccomment"> * @param keyValueDelimiter The character that separates keys from values.</em>
+<a class="jxr_linenumber" name="L5312" href="#L5312">5312</a> <em class="jxr_javadoccomment"> * @param entryDelimiter The character that separates entries.</em>
+<a class="jxr_linenumber" name="L5313" href="#L5313">5313</a> <em class="jxr_javadoccomment"> * @param trimKeys If <jk>true</jk>, trims whitespace from keys and values.</em>
+<a class="jxr_linenumber" name="L5314" href="#L5314">5314</a> <em class="jxr_javadoccomment"> * @return A map containing the parsed key-value pairs, or an empty map if the string is <jk>null</jk> or empty.</em>
+<a class="jxr_linenumber" name="L5315" href="#L5315">5315</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L5316" href="#L5316">5316</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> Map<String,String> parseMap(String str, <strong class="jxr_keyword">char</strong> keyValueDelimiter, <strong class="jxr_keyword">char</strong> entryDelimiter, <strong class="jxr_keyword">boolean</strong> trimKeys) {
+<a class="jxr_linenumber" name="L5317" href="#L5317">5317</a> <strong class="jxr_keyword">var</strong> result = <strong class="jxr_keyword">new</strong> LinkedHashMap<String,String>();
+<a class="jxr_linenumber" name="L5318" href="#L5318">5318</a> <strong class="jxr_keyword">if</strong> (isEmpty(str))
+<a class="jxr_linenumber" name="L5319" href="#L5319">5319</a> <strong class="jxr_keyword">return</strong> result;
+<a class="jxr_linenumber" name="L5320" href="#L5320">5320</a>
+<a class="jxr_linenumber" name="L5321" href="#L5321">5321</a> <strong class="jxr_keyword">var</strong> entries = split(str, entryDelimiter);
+<a class="jxr_linenumber" name="L5322" href="#L5322">5322</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> entry : entries) {
+<a class="jxr_linenumber" name="L5323" href="#L5323">5323</a> <strong class="jxr_keyword">if</strong> (isEmpty(entry))
+<a class="jxr_linenumber" name="L5324" href="#L5324">5324</a> <strong class="jxr_keyword">continue</strong>;
+<a class="jxr_linenumber" name="L5325" href="#L5325">5325</a> <strong class="jxr_keyword">var</strong> delimiterIndex = entry.indexOf(keyValueDelimiter);
+<a class="jxr_linenumber" name="L5326" href="#L5326">5326</a> <strong class="jxr_keyword">if</strong> (delimiterIndex == -1) {
+<a class="jxr_linenumber" name="L5327" href="#L5327">5327</a> <em class="jxr_comment">// No delimiter found, treat entire entry as key with empty value</em>
+<a class="jxr_linenumber" name="L5328" href="#L5328">5328</a> <strong class="jxr_keyword">var</strong> key = trimKeys ? entry.trim() : entry;
+<a class="jxr_linenumber" name="L5329" href="#L5329">5329</a> result.put(key, <span class="jxr_string">""</span>);
+<a class="jxr_linenumber" name="L5330" href="#L5330">5330</a> } <strong class="jxr_keyword">else</strong> {
+<a class="jxr_linenumber" name="L5331" href="#L5331">5331</a> <strong class="jxr_keyword">var</strong> key = entry.substring(0, delimiterIndex);
+<a class="jxr_linenumber" name="L5332" href="#L5332">5332</a> <strong class="jxr_keyword">var</strong> value = entry.substring(delimiterIndex + 1);
+<a class="jxr_linenumber" name="L5333" href="#L5333">5333</a> <strong class="jxr_keyword">if</strong> (trimKeys) {
+<a class="jxr_linenumber" name="L5334" href="#L5334">5334</a> key = key.trim();
+<a class="jxr_linenumber" name="L5335" href="#L5335">5335</a> value = value.trim();
+<a class="jxr_linenumber" name="L5336" href="#L5336">5336</a> }
+<a class="jxr_linenumber" name="L5337" href="#L5337">5337</a> result.put(key, value);
+<a class="jxr_linenumber" name="L5338" href="#L5338">5338</a> }
+<a class="jxr_linenumber" name="L5339" href="#L5339">5339</a> }
+<a class="jxr_linenumber" name="L5340" href="#L5340">5340</a> <strong class="jxr_keyword">return</strong> result;
+<a class="jxr_linenumber" name="L5341" href="#L5341">5341</a> }
+<a class="jxr_linenumber" name="L5342" href="#L5342">5342</a>
+<a class="jxr_linenumber" name="L5343" href="#L5343">5343</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L5344" href="#L5344">5344</a> <em class="jxr_javadoccomment"> * Parses a number from the specified string.</em>
+<a class="jxr_linenumber" name="L5345" href="#L5345">5345</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5346" href="#L5346">5346</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L5347" href="#L5347">5347</a> <em class="jxr_javadoccomment"> * Supports Java 7+ numeric literals with underscores (e.g., <js>"1_000_000"</js>).</em>
+<a class="jxr_linenumber" name="L5348" href="#L5348">5348</a> <em class="jxr_javadoccomment"> * The underscores are automatically removed before parsing.</em>
+<a class="jxr_linenumber" name="L5349" href="#L5349">5349</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5350" href="#L5350">5350</a> <em class="jxr_javadoccomment"> * @param s The string to parse the number from.</em>
+<a class="jxr_linenumber" name="L5351" href="#L5351">5351</a> <em class="jxr_javadoccomment"> * @param type</em>
+<a class="jxr_linenumber" name="L5352" href="#L5352">5352</a> <em class="jxr_javadoccomment"> * The number type to created.</em>
+<a class="jxr_linenumber" name="L5353" href="#L5353">5353</a> <em class="jxr_javadoccomment"> * Can be any of the following:</em>
+<a class="jxr_linenumber" name="L5354" href="#L5354">5354</a> <em class="jxr_javadoccomment"> * <ul></em>
+<a class="jxr_linenumber" name="L5355" href="#L5355">5355</a> <em class="jxr_javadoccomment"> * <li> Integer (or <c>int</c> primitive)</em>
+<a class="jxr_linenumber" name="L5356" href="#L5356">5356</a> <em class="jxr_javadoccomment"> * <li> Long (or <c>long</c> primitive)</em>
+<a class="jxr_linenumber" name="L5357" href="#L5357">5357</a> <em class="jxr_javadoccomment"> * <li> Short (or <c>short</c> primitive)</em>
+<a class="jxr_linenumber" name="L5358" href="#L5358">5358</a> <em class="jxr_javadoccomment"> * <li> Byte (or <c>byte</c> primitive)</em>
+<a class="jxr_linenumber" name="L5359" href="#L5359">5359</a> <em class="jxr_javadoccomment"> * <li> Float (or <c>float</c> primitive)</em>
+<a class="jxr_linenumber" name="L5360" href="#L5360">5360</a> <em class="jxr_javadoccomment"> * <li> Double (or <c>double</c> primitive)</em>
+<a class="jxr_linenumber" name="L5361" href="#L5361">5361</a> <em class="jxr_javadoccomment"> * <li> BigInteger</em>
+<a class="jxr_linenumber" name="L5362" href="#L5362">5362</a> <em class="jxr_javadoccomment"> * <li> BigDecimal</em>
+<a class="jxr_linenumber" name="L5363" href="#L5363">5363</a> <em class="jxr_javadoccomment"> * <li> AtomicInteger</em>
+<a class="jxr_linenumber" name="L5364" href="#L5364">5364</a> <em class="jxr_javadoccomment"> * <li> AtomicLong</em>
+<a class="jxr_linenumber" name="L5365" href="#L5365">5365</a> <em class="jxr_javadoccomment"> * </ul></em>
+<a class="jxr_linenumber" name="L5366" href="#L5366">5366</a> <em class="jxr_javadoccomment"> * If <jk>null</jk> or <c>Number</c>, uses the best guess.</em>
+<a class="jxr_linenumber" name="L5367" href="#L5367">5367</a> <em class="jxr_javadoccomment"> * @return The parsed number, or <jk>null</jk> if the string was null.</em>
+<a class="jxr_linenumber" name="L5368" href="#L5368">5368</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L5369" href="#L5369">5369</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> Number parseNumber(String s, Class<? <strong class="jxr_keyword">extends</strong> Number> type) {
+<a class="jxr_linenumber" name="L5370" href="#L5370">5370</a> <strong class="jxr_keyword">if</strong> (s == <strong class="jxr_keyword">null</strong>)
+<a class="jxr_linenumber" name="L5371" href="#L5371">5371</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
+<a class="jxr_linenumber" name="L5372" href="#L5372">5372</a> <strong class="jxr_keyword">if</strong> (s.isEmpty())
+<a class="jxr_linenumber" name="L5373" href="#L5373">5373</a> s = <span class="jxr_string">"0"</span>;
+<a class="jxr_linenumber" name="L5374" href="#L5374">5374</a> <strong class="jxr_keyword">if</strong> (type == <strong class="jxr_keyword">null</strong>)
+<a class="jxr_linenumber" name="L5375" href="#L5375">5375</a> type = Number.<strong class="jxr_keyword">class</strong>;
+<a class="jxr_linenumber" name="L5376" href="#L5376">5376</a>
+<a class="jxr_linenumber" name="L5377" href="#L5377">5377</a> <em class="jxr_comment">// Remove underscores (Java 7+ numeric literal support) before parsing</em>
+<a class="jxr_linenumber" name="L5378" href="#L5378">5378</a> <em class="jxr_comment">// Note: We do this before type detection to ensure clean parsing</em>
+<a class="jxr_linenumber" name="L5379" href="#L5379">5379</a> s = s.replace(<span class="jxr_string">"_"</span>, <span class="jxr_string">""</span>);
+<a class="jxr_linenumber" name="L5380" href="#L5380">5380</a>
+<a class="jxr_linenumber" name="L5381" href="#L5381">5381</a> <em class="jxr_comment">// Determine the data type if it wasn't specified.</em>
+<a class="jxr_linenumber" name="L5382" href="#L5382">5382</a> <strong class="jxr_keyword">var</strong> isAutoDetect = (type == Number.<strong class="jxr_keyword">class</strong>);
+<a class="jxr_linenumber" name="L5383" href="#L5383">5383</a> <strong class="jxr_keyword">var</strong> isDecimal = false;
+<a class="jxr_linenumber" name="L5384" href="#L5384">5384</a> <strong class="jxr_keyword">if</strong> (isAutoDetect) {
+<a class="jxr_linenumber" name="L5385" href="#L5385">5385</a> <em class="jxr_comment">// If we're auto-detecting, then we use either an Integer, Long, or Double depending on how</em>
+<a class="jxr_linenumber" name="L5386" href="#L5386">5386</a> <em class="jxr_comment">// long the string is.</em>
+<a class="jxr_linenumber" name="L5387" href="#L5387">5387</a> <em class="jxr_comment">// An integer range is -2,147,483,648 to 2,147,483,647</em>
+<a class="jxr_linenumber" name="L5388" href="#L5388">5388</a> <em class="jxr_comment">// An long range is -9,223,372,036,854,775,808 to +9,223,372,036,854,775,807</em>
+<a class="jxr_linenumber" name="L5389" href="#L5389">5389</a> isDecimal = isDecimal(s);
+<a class="jxr_linenumber" name="L5390" href="#L5390">5390</a> <strong class="jxr_keyword">if</strong> (isDecimal) {
+<a class="jxr_linenumber" name="L5391" href="#L5391">5391</a> <strong class="jxr_keyword">if</strong> (s.length() > 20)
+<a class="jxr_linenumber" name="L5392" href="#L5392">5392</a> type = Double.<strong class="jxr_keyword">class</strong>;
+<a class="jxr_linenumber" name="L5393" href="#L5393">5393</a> <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (s.length() >= 10)
+<a class="jxr_linenumber" name="L5394" href="#L5394">5394</a> type = Long.<strong class="jxr_keyword">class</strong>;
+<a class="jxr_linenumber" name="L5395" href="#L5395">5395</a> <strong class="jxr_keyword">else</strong>
+<a class="jxr_linenumber" name="L5396" href="#L5396">5396</a> type = Integer.<strong class="jxr_keyword">class</strong>;
+<a class="jxr_linenumber" name="L5397" href="#L5397">5397</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (isFloat(s))
+<a class="jxr_linenumber" name="L5398" href="#L5398">5398</a> type = Double.<strong class="jxr_keyword">class</strong>;
+<a class="jxr_linenumber" name="L5399" href="#L5399">5399</a> <strong class="jxr_keyword">else</strong>
+<a class="jxr_linenumber" name="L5400" href="#L5400">5400</a> <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> NumberFormatException(s);
+<a class="jxr_linenumber" name="L5401" href="#L5401">5401</a> }
+<a class="jxr_linenumber" name="L5402" href="#L5402">5402</a>
+<a class="jxr_linenumber" name="L5403" href="#L5403">5403</a> <strong class="jxr_keyword">if</strong> (type == Double.<strong class="jxr_keyword">class</strong> || type == Double.TYPE) {
+<a class="jxr_linenumber" name="L5404" href="#L5404">5404</a> <strong class="jxr_keyword">var</strong> d = Double.valueOf(s);
+<a class="jxr_linenumber" name="L5405" href="#L5405">5405</a> <strong class="jxr_keyword">var</strong> f = Float.valueOf(s);
+<a class="jxr_linenumber" name="L5406" href="#L5406">5406</a> <strong class="jxr_keyword">if</strong> (isAutoDetect && (! isDecimal) && d.toString().equals(f.toString()))
+<a class="jxr_linenumber" name="L5407" href="#L5407">5407</a> <strong class="jxr_keyword">return</strong> f;
+<a class="jxr_linenumber" name="L5408" href="#L5408">5408</a> <strong class="jxr_keyword">return</strong> d;
+<a class="jxr_linenumber" name="L5409" href="#L5409">5409</a> }
+<a class="jxr_linenumber" name="L5410" href="#L5410">5410</a> <strong class="jxr_keyword">if</strong> (type == Float.<strong class="jxr_keyword">class</strong> || type == Float.TYPE)
+<a class="jxr_linenumber" name="L5411" href="#L5411">5411</a> <strong class="jxr_keyword">return</strong> Float.valueOf(s);
+<a class="jxr_linenumber" name="L5412" href="#L5412">5412</a> <strong class="jxr_keyword">if</strong> (type == BigDecimal.<strong class="jxr_keyword">class</strong>)
+<a class="jxr_linenumber" name="L5413" href="#L5413">5413</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">new</strong> BigDecimal(s);
+<a class="jxr_linenumber" name="L5414" href="#L5414">5414</a> <strong class="jxr_keyword">if</strong> (type == Long.<strong class="jxr_keyword">class</strong> || type == Long.TYPE || type == AtomicLong.<strong class="jxr_keyword">class</strong>) {
+<a class="jxr_linenumber" name="L5415" href="#L5415">5415</a> <strong class="jxr_keyword">try</strong> {
+<a class="jxr_linenumber" name="L5416" href="#L5416">5416</a> <strong class="jxr_keyword">var</strong> l = Long.decode(s);
+<a class="jxr_linenumber" name="L5417" href="#L5417">5417</a> <strong class="jxr_keyword">if</strong> (type == AtomicLong.<strong class="jxr_keyword">class</strong>)
+<a class="jxr_linenumber" name="L5418" href="#L5418">5418</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">new</strong> AtomicLong(l);
+<a class="jxr_linenumber" name="L5419" href="#L5419">5419</a> <strong class="jxr_keyword">if</strong> (isAutoDetect && l >= Integer.MIN_VALUE && l <= Integer.MAX_VALUE) {
+<a class="jxr_linenumber" name="L5420" href="#L5420">5420</a> <em class="jxr_comment">// This occurs if the string is 10 characters long but is still a valid integer value.</em>
+<a class="jxr_linenumber" name="L5421" href="#L5421">5421</a> <strong class="jxr_keyword">return</strong> l.intValue();
+<a class="jxr_linenumber" name="L5422" href="#L5422">5422</a> }
+<a class="jxr_linenumber" name="L5423" href="#L5423">5423</a> <strong class="jxr_keyword">return</strong> l;
+<a class="jxr_linenumber" name="L5424" href="#L5424">5424</a> } <strong class="jxr_keyword">catch</strong> (NumberFormatException e) {
+<a class="jxr_linenumber" name="L5425" href="#L5425">5425</a> <strong class="jxr_keyword">if</strong> (isAutoDetect) {
+<a class="jxr_linenumber" name="L5426" href="#L5426">5426</a> <em class="jxr_comment">// This occurs if the string is 20 characters long but still falls outside the range of a valid long.</em>
+<a class="jxr_linenumber" name="L5427" href="#L5427">5427</a> <strong class="jxr_keyword">return</strong> Double.valueOf(s);
+<a class="jxr_linenumber" name="L5428" href="#L5428">5428</a> }
+<a class="jxr_linenumber" name="L5429" href="#L5429">5429</a> <strong class="jxr_keyword">throw</strong> e;
+<a class="jxr_linenumber" name="L5430" href="#L5430">5430</a> }
+<a class="jxr_linenumber" name="L5431" href="#L5431">5431</a> }
+<a class="jxr_linenumber" name="L5432" href="#L5432">5432</a> <strong class="jxr_keyword">if</strong> (type == Integer.<strong class="jxr_keyword">class</strong> || type == Integer.TYPE)
+<a class="jxr_linenumber" name="L5433" href="#L5433">5433</a> <strong class="jxr_keyword">return</strong> Integer.decode(s);
+<a class="jxr_linenumber" name="L5434" href="#L5434">5434</a> <strong class="jxr_keyword">if</strong> (type == Short.<strong class="jxr_keyword">class</strong> || type == Short.TYPE)
+<a class="jxr_linenumber" name="L5435" href="#L5435">5435</a> <strong class="jxr_keyword">return</strong> Short.decode(s);
+<a class="jxr_linenumber" name="L5436" href="#L5436">5436</a> <strong class="jxr_keyword">if</strong> (type == Byte.<strong class="jxr_keyword">class</strong> || type == Byte.TYPE)
+<a class="jxr_linenumber" name="L5437" href="#L5437">5437</a> <strong class="jxr_keyword">return</strong> Byte.decode(s);
+<a class="jxr_linenumber" name="L5438" href="#L5438">5438</a> <strong class="jxr_keyword">if</strong> (type == BigInteger.<strong class="jxr_keyword">class</strong>)
+<a class="jxr_linenumber" name="L5439" href="#L5439">5439</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">new</strong> BigInteger(s);
+<a class="jxr_linenumber" name="L5440" href="#L5440">5440</a> <strong class="jxr_keyword">if</strong> (type == AtomicInteger.<strong class="jxr_keyword">class</strong>)
+<a class="jxr_linenumber" name="L5441" href="#L5441">5441</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">new</strong> AtomicInteger(Integer.decode(s));
+<a class="jxr_linenumber" name="L5442" href="#L5442">5442</a> <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> NumberFormatException(<span class="jxr_string">"Unsupported Number type: "</span> + type.getName());
+<a class="jxr_linenumber" name="L5443" href="#L5443">5443</a> }
+<a class="jxr_linenumber" name="L5444" href="#L5444">5444</a>
+<a class="jxr_linenumber" name="L5445" href="#L5445">5445</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L5446" href="#L5446">5446</a> <em class="jxr_javadoccomment"> * Converts a string to PascalCase format.</em>
<a class="jxr_linenumber" name="L5447" href="#L5447">5447</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5448" href="#L5448">5448</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
-<a class="jxr_linenumber" name="L5449" href="#L5449">5449</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L5450" href="#L5450">5450</a> <em class="jxr_javadoccomment"> * pascalCase(<jk>null</jk>); <jc>// null</jc></em>
-<a class="jxr_linenumber" name="L5451" href="#L5451">5451</a> <em class="jxr_javadoccomment"> * pascalCase(<js>""</js>); <jc>// ""</jc></em>
-<a class="jxr_linenumber" name="L5452" href="#L5452">5452</a> <em class="jxr_javadoccomment"> * pascalCase(<js>"hello world"</js>); <jc>// "HelloWorld"</jc></em>
-<a class="jxr_linenumber" name="L5453" href="#L5453">5453</a> <em class="jxr_javadoccomment"> * pascalCase(<js>"helloWorld"</js>); <jc>// "HelloWorld"</jc></em>
-<a class="jxr_linenumber" name="L5454" href="#L5454">5454</a> <em class="jxr_javadoccomment"> * pascalCase(<js>"hello_world"</js>); <jc>// "HelloWorld"</jc></em>
-<a class="jxr_linenumber" name="L5455" href="#L5455">5455</a> <em class="jxr_javadoccomment"> * pascalCase(<js>"hello-world"</js>); <jc>// "HelloWorld"</jc></em>
-<a class="jxr_linenumber" name="L5456" href="#L5456">5456</a> <em class="jxr_javadoccomment"> * </p></em>
-<a class="jxr_linenumber" name="L5457" href="#L5457">5457</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5458" href="#L5458">5458</a> <em class="jxr_javadoccomment"> * @param str The string to convert.</em>
-<a class="jxr_linenumber" name="L5459" href="#L5459">5459</a> <em class="jxr_javadoccomment"> * @return The PascalCase string, or <jk>null</jk> if input is <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L5460" href="#L5460">5460</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L5461" href="#L5461">5461</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String pascalCase(String str) {
-<a class="jxr_linenumber" name="L5462" href="#L5462">5462</a> <strong class="jxr_keyword">if</strong> (str == <strong class="jxr_keyword">null</strong>)
-<a class="jxr_linenumber" name="L5463" href="#L5463">5463</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
-<a class="jxr_linenumber" name="L5464" href="#L5464">5464</a> <strong class="jxr_keyword">if</strong> (isEmpty(str))
-<a class="jxr_linenumber" name="L5465" href="#L5465">5465</a> <strong class="jxr_keyword">return</strong> str;
-<a class="jxr_linenumber" name="L5466" href="#L5466">5466</a>
-<a class="jxr_linenumber" name="L5467" href="#L5467">5467</a> <strong class="jxr_keyword">var</strong> words = splitWords(str);
-<a class="jxr_linenumber" name="L5468" href="#L5468">5468</a> <strong class="jxr_keyword">if</strong> (words.isEmpty())
-<a class="jxr_linenumber" name="L5469" href="#L5469">5469</a> <strong class="jxr_keyword">return</strong> <span class="jxr_string">""</span>;
-<a class="jxr_linenumber" name="L5470" href="#L5470">5470</a>
-<a class="jxr_linenumber" name="L5471" href="#L5471">5471</a> <strong class="jxr_keyword">var</strong> result = <strong class="jxr_keyword">new</strong> StringBuilder();
-<a class="jxr_linenumber" name="L5472" href="#L5472">5472</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> word : words) {
-<a class="jxr_linenumber" name="L5473" href="#L5473">5473</a> result.append(capitalize(word.toLowerCase()));
-<a class="jxr_linenumber" name="L5474" href="#L5474">5474</a> }
+<a class="jxr_linenumber" name="L5448" href="#L5448">5448</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L5449" href="#L5449">5449</a> <em class="jxr_javadoccomment"> * Handles various input formats:</em>
+<a class="jxr_linenumber" name="L5450" href="#L5450">5450</a> <em class="jxr_javadoccomment"> * <ul></em>
+<a class="jxr_linenumber" name="L5451" href="#L5451">5451</a> <em class="jxr_javadoccomment"> * <li>Space-separated: "hello world" → "HelloWorld"</li></em>
+<a class="jxr_linenumber" name="L5452" href="#L5452">5452</a> <em class="jxr_javadoccomment"> * <li>CamelCase: "helloWorld" → "HelloWorld"</li></em>
+<a class="jxr_linenumber" name="L5453" href="#L5453">5453</a> <em class="jxr_javadoccomment"> * <li>Snake_case: "hello_world" → "HelloWorld"</li></em>
+<a class="jxr_linenumber" name="L5454" href="#L5454">5454</a> <em class="jxr_javadoccomment"> * <li>Kebab-case: "hello-world" → "HelloWorld"</li></em>
+<a class="jxr_linenumber" name="L5455" href="#L5455">5455</a> <em class="jxr_javadoccomment"> * </ul></em>
+<a class="jxr_linenumber" name="L5456" href="#L5456">5456</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5457" href="#L5457">5457</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
+<a class="jxr_linenumber" name="L5458" href="#L5458">5458</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
+<a class="jxr_linenumber" name="L5459" href="#L5459">5459</a> <em class="jxr_javadoccomment"> * pascalCase(<jk>null</jk>); <jc>// null</jc></em>
+<a class="jxr_linenumber" name="L5460" href="#L5460">5460</a> <em class="jxr_javadoccomment"> * pascalCase(<js>""</js>); <jc>// ""</jc></em>
+<a class="jxr_linenumber" name="L5461" href="#L5461">5461</a> <em class="jxr_javadoccomment"> * pascalCase(<js>"hello world"</js>); <jc>// "HelloWorld"</jc></em>
+<a class="jxr_linenumber" name="L5462" href="#L5462">5462</a> <em class="jxr_javadoccomment"> * pascalCase(<js>"helloWorld"</js>); <jc>// "HelloWorld"</jc></em>
+<a class="jxr_linenumber" name="L5463" href="#L5463">5463</a> <em class="jxr_javadoccomment"> * pascalCase(<js>"hello_world"</js>); <jc>// "HelloWorld"</jc></em>
+<a class="jxr_linenumber" name="L5464" href="#L5464">5464</a> <em class="jxr_javadoccomment"> * pascalCase(<js>"hello-world"</js>); <jc>// "HelloWorld"</jc></em>
+<a class="jxr_linenumber" name="L5465" href="#L5465">5465</a> <em class="jxr_javadoccomment"> * </p></em>
+<a class="jxr_linenumber" name="L5466" href="#L5466">5466</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5467" href="#L5467">5467</a> <em class="jxr_javadoccomment"> * @param str The string to convert.</em>
+<a class="jxr_linenumber" name="L5468" href="#L5468">5468</a> <em class="jxr_javadoccomment"> * @return The PascalCase string, or <jk>null</jk> if input is <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L5469" href="#L5469">5469</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L5470" href="#L5470">5470</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String pascalCase(String str) {
+<a class="jxr_linenumber" name="L5471" href="#L5471">5471</a> <strong class="jxr_keyword">if</strong> (str == <strong class="jxr_keyword">null</strong>)
+<a class="jxr_linenumber" name="L5472" href="#L5472">5472</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
+<a class="jxr_linenumber" name="L5473" href="#L5473">5473</a> <strong class="jxr_keyword">if</strong> (isEmpty(str))
+<a class="jxr_linenumber" name="L5474" href="#L5474">5474</a> <strong class="jxr_keyword">return</strong> str;
<a class="jxr_linenumber" name="L5475" href="#L5475">5475</a>
-<a class="jxr_linenumber" name="L5476" href="#L5476">5476</a> <strong class="jxr_keyword">return</strong> result.toString();
-<a class="jxr_linenumber" name="L5477" href="#L5477">5477</a> }
-<a class="jxr_linenumber" name="L5478" href="#L5478">5478</a>
-<a class="jxr_linenumber" name="L5479" href="#L5479">5479</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L5480" href="#L5480">5480</a> <em class="jxr_javadoccomment"> * Pluralizes a word based on a count.</em>
-<a class="jxr_linenumber" name="L5481" href="#L5481">5481</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5482" href="#L5482">5482</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L5483" href="#L5483">5483</a> <em class="jxr_javadoccomment"> * Simple pluralization that adds "s" to most words, with basic rules for words ending in "s", "x", "z", "ch", "sh" (add "es"),</em>
-<a class="jxr_linenumber" name="L5484" href="#L5484">5484</a> <em class="jxr_javadoccomment"> * and words ending in "y" preceded by a consonant (replace "y" with "ies").</em>
-<a class="jxr_linenumber" name="L5485" href="#L5485">5485</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5486" href="#L5486">5486</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
-<a class="jxr_linenumber" name="L5487" href="#L5487">5487</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L5488" href="#L5488">5488</a> <em class="jxr_javadoccomment"> * pluralize(<js>"cat"</js>, <js>1</js>); <jc>// "cat"</jc></em>
-<a class="jxr_linenumber" name="L5489" href="#L5489">5489</a> <em class="jxr_javadoccomment"> * pluralize(<js>"cat"</js>, <js>2</js>); <jc>// "cats"</jc></em>
-<a class="jxr_linenumber" name="L5490" href="#L5490">5490</a> <em class="jxr_javadoccomment"> * pluralize(<js>"box"</js>, <js>2</js>); <jc>// "boxes"</jc></em>
-<a class="jxr_linenumber" name="L5491" href="#L5491">5491</a> <em class="jxr_javadoccomment"> * pluralize(<js>"city"</js>, <js>2</js>); <jc>// "cities"</jc></em>
-<a class="jxr_linenumber" name="L5492" href="#L5492">5492</a> <em class="jxr_javadoccomment"> * </p></em>
-<a class="jxr_linenumber" name="L5493" href="#L5493">5493</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5494" href="#L5494">5494</a> <em class="jxr_javadoccomment"> * @param word The word to pluralize.</em>
-<a class="jxr_linenumber" name="L5495" href="#L5495">5495</a> <em class="jxr_javadoccomment"> * @param count The count to determine if pluralization is needed.</em>
-<a class="jxr_linenumber" name="L5496" href="#L5496">5496</a> <em class="jxr_javadoccomment"> * @return The pluralized word if count is not 1, otherwise the original word.</em>
-<a class="jxr_linenumber" name="L5497" href="#L5497">5497</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L5498" href="#L5498">5498</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String pluralize(String word, <strong class="jxr_keyword">int</strong> count) {
-<a class="jxr_linenumber" name="L5499" href="#L5499">5499</a> <strong class="jxr_keyword">if</strong> (word == <strong class="jxr_keyword">null</strong> || word.isEmpty())
-<a class="jxr_linenumber" name="L5500" href="#L5500">5500</a> <strong class="jxr_keyword">return</strong> word;
-<a class="jxr_linenumber" name="L5501" href="#L5501">5501</a> <strong class="jxr_keyword">if</strong> (count == 1)
-<a class="jxr_linenumber" name="L5502" href="#L5502">5502</a> <strong class="jxr_keyword">return</strong> word;
-<a class="jxr_linenumber" name="L5503" href="#L5503">5503</a>
-<a class="jxr_linenumber" name="L5504" href="#L5504">5504</a> <strong class="jxr_keyword">var</strong> lower = word.toLowerCase();
-<a class="jxr_linenumber" name="L5505" href="#L5505">5505</a> <strong class="jxr_keyword">var</strong> length = word.length();
-<a class="jxr_linenumber" name="L5506" href="#L5506">5506</a>
-<a class="jxr_linenumber" name="L5507" href="#L5507">5507</a> <em class="jxr_comment">// Words ending in s, x, z, ch, sh -> add "es"</em>
-<a class="jxr_linenumber" name="L5508" href="#L5508">5508</a> <strong class="jxr_keyword">if</strong> (lower.endsWith(<span class="jxr_string">"s"</span>) || lower.endsWith(<span class="jxr_string">"x"</span>) || lower.endsWith(<span class="jxr_string">"z"</span>) || lower.endsWith(<span class="jxr_string">"ch"</span>) || lower.endsWith(<span class="jxr_string">"sh"</span>)) {
-<a class="jxr_linenumber" name="L5509" href="#L5509">5509</a> <strong class="jxr_keyword">return</strong> word + <span class="jxr_string">"es"</span>;
-<a class="jxr_linenumber" name="L5510" href="#L5510">5510</a> }
-<a class="jxr_linenumber" name="L5511" href="#L5511">5511</a>
-<a class="jxr_linenumber" name="L5512" href="#L5512">5512</a> <em class="jxr_comment">// Words ending in "y" preceded by a consonant -> replace "y" with "ies"</em>
-<a class="jxr_linenumber" name="L5513" href="#L5513">5513</a> <strong class="jxr_keyword">if</strong> (length > 1 && lower.endsWith(<span class="jxr_string">"y"</span>)) {
-<a class="jxr_linenumber" name="L5514" href="#L5514">5514</a> <strong class="jxr_keyword">var</strong> secondLast = lower.charAt(length - 2);
-<a class="jxr_linenumber" name="L5515" href="#L5515">5515</a> <strong class="jxr_keyword">if</strong> (secondLast != 'a' && secondLast != 'e' && secondLast != 'i' && secondLast != 'o' && secondLast != 'u') {
-<a class="jxr_linenumber" name="L5516" href="#L5516">5516</a> <strong class="jxr_keyword">return</strong> word.substring(0, length - 1) + <span class="jxr_string">"ies"</span>;
-<a class="jxr_linenumber" name="L5517" href="#L5517">5517</a> }
-<a class="jxr_linenumber" name="L5518" href="#L5518">5518</a> }
-<a class="jxr_linenumber" name="L5519" href="#L5519">5519</a>
-<a class="jxr_linenumber" name="L5520" href="#L5520">5520</a> <em class="jxr_comment">// Words ending in "f" or "fe" -> replace with "ves" (basic rule)</em>
-<a class="jxr_linenumber" name="L5521" href="#L5521">5521</a> <strong class="jxr_keyword">if</strong> (lower.endsWith(<span class="jxr_string">"f"</span>)) {
-<a class="jxr_linenumber" name="L5522" href="#L5522">5522</a> <strong class="jxr_keyword">return</strong> word.substring(0, length - 1) + <span class="jxr_string">"ves"</span>;
-<a class="jxr_linenumber" name="L5523" href="#L5523">5523</a> }
-<a class="jxr_linenumber" name="L5524" href="#L5524">5524</a> <strong class="jxr_keyword">if</strong> (lower.endsWith(<span class="jxr_string">"fe"</span>)) {
-<a class="jxr_linenumber" name="L5525" href="#L5525">5525</a> <strong class="jxr_keyword">return</strong> word.substring(0, length - 2) + <span class="jxr_string">"ves"</span>;
-<a class="jxr_linenumber" name="L5526" href="#L5526">5526</a> }
-<a class="jxr_linenumber" name="L5527" href="#L5527">5527</a>
-<a class="jxr_linenumber" name="L5528" href="#L5528">5528</a> <em class="jxr_comment">// Default: add "s"</em>
-<a class="jxr_linenumber" name="L5529" href="#L5529">5529</a> <strong class="jxr_keyword">return</strong> word + <span class="jxr_string">"s"</span>;
-<a class="jxr_linenumber" name="L5530" href="#L5530">5530</a> }
-<a class="jxr_linenumber" name="L5531" href="#L5531">5531</a>
-<a class="jxr_linenumber" name="L5532" href="#L5532">5532</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L5533" href="#L5533">5533</a> <em class="jxr_javadoccomment"> * Generated a random UUID with the specified number of characters.</em>
-<a class="jxr_linenumber" name="L5534" href="#L5534">5534</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5535" href="#L5535">5535</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L5536" href="#L5536">5536</a> <em class="jxr_javadoccomment"> * Characters are composed of lower-case ASCII letters and numbers only.</em>
-<a class="jxr_linenumber" name="L5537" href="#L5537">5537</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5538" href="#L5538">5538</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L5539" href="#L5539">5539</a> <em class="jxr_javadoccomment"> * This method conforms to the restrictions for hostnames as specified in <a class="doclink" href="<a href="https://tools.ietf.org/html/rfc952" target="alexandria_uri">https://tools.ietf.org/html/rfc952</a>">RFC 952</a></em>
-<a class="jxr_linenumber" name="L5540" href="#L5540">5540</a> <em class="jxr_javadoccomment"> * Since each character has 36 possible values, the square approximation formula for the number of generated IDs</em>
-<a class="jxr_linenumber" name="L5541" href="#L5541">5541</a> <em class="jxr_javadoccomment"> * that would produce a 50% chance of collision is:</em>
-<a class="jxr_linenumber" name="L5542" href="#L5542">5542</a> <em class="jxr_javadoccomment"> * <c>sqrt(36^N)</c>.</em>
-<a class="jxr_linenumber" name="L5543" href="#L5543">5543</a> <em class="jxr_javadoccomment"> * Dividing this number by 10 gives you an approximation of the number of generated IDs needed to produce a</em>
-<a class="jxr_linenumber" name="L5544" href="#L5544">5544</a> <em class="jxr_javadoccomment"> * &lt;1% chance of collision.</em>
-<a class="jxr_linenumber" name="L5545" href="#L5545">5545</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5546" href="#L5546">5546</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L5547" href="#L5547">5547</a> <em class="jxr_javadoccomment"> * For example, given 5 characters, the number of generated IDs need to produce a &lt;1% chance of collision would</em>
-<a class="jxr_linenumber" name="L5548" href="#L5548">5548</a> <em class="jxr_javadoccomment"> * be:</em>
-<a class="jxr_linenumber" name="L5549" href="#L5549">5549</a> <em class="jxr_javadoccomment"> * <c>sqrt(36^5)/10=777</c></em>
-<a class="jxr_linenumber" name="L5550" href="#L5550">5550</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5551" href="#L5551">5551</a> <em class="jxr_javadoccomment"> * @param numchars The number of characters in the generated UUID.</em>
-<a class="jxr_linenumber" name="L5552" href="#L5552">5552</a> <em class="jxr_javadoccomment"> * @return A new random UUID.</em>
-<a class="jxr_linenumber" name="L5553" href="#L5553">5553</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L5554" href="#L5554">5554</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String random(<strong class="jxr_keyword">int</strong> numchars) {
-<a class="jxr_linenumber" name="L5555" href="#L5555">5555</a> <strong class="jxr_keyword">var</strong> sb = <strong class="jxr_keyword">new</strong> StringBuilder(numchars);
-<a class="jxr_linenumber" name="L5556" href="#L5556">5556</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < numchars; i++) {
-<a class="jxr_linenumber" name="L5557" href="#L5557">5557</a> <strong class="jxr_keyword">var</strong> c = RANDOM.nextInt(36) + 97;
-<a class="jxr_linenumber" name="L5558" href="#L5558">5558</a> <strong class="jxr_keyword">if</strong> (c > 'z')
-<a class="jxr_linenumber" name="L5559" href="#L5559">5559</a> c -= ('z' - '0' + 1);
-<a class="jxr_linenumber" name="L5560" href="#L5560">5560</a> sb.append((<strong class="jxr_keyword">char</strong>)c);
-<a class="jxr_linenumber" name="L5561" href="#L5561">5561</a> }
-<a class="jxr_linenumber" name="L5562" href="#L5562">5562</a> <strong class="jxr_keyword">return</strong> sb.toString();
-<a class="jxr_linenumber" name="L5563" href="#L5563">5563</a> }
-<a class="jxr_linenumber" name="L5564" href="#L5564">5564</a>
-<a class="jxr_linenumber" name="L5565" href="#L5565">5565</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L5566" href="#L5566">5566</a> <em class="jxr_javadoccomment"> * Generates a random alphabetic string of the specified length.</em>
-<a class="jxr_linenumber" name="L5567" href="#L5567">5567</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5568" href="#L5568">5568</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L5569" href="#L5569">5569</a> <em class="jxr_javadoccomment"> * Characters are composed of upper-case and lower-case ASCII letters (a-z, A-Z).</em>
-<a class="jxr_linenumber" name="L5570" href="#L5570">5570</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5571" href="#L5571">5571</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
-<a class="jxr_linenumber" name="L5572" href="#L5572">5572</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L5573" href="#L5573">5573</a> <em class="jxr_javadoccomment"> * randomAlphabetic(<jk>5</jk>); <jc>// "aBcDe"</jc></em>
-<a class="jxr_linenumber" name="L5574" href="#L5574">5574</a> <em class="jxr_javadoccomment"> * </p></em>
-<a class="jxr_linenumber" name="L5575" href="#L5575">5575</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5576" href="#L5576">5576</a> <em class="jxr_javadoccomment"> * @param length The length of the generated string.</em>
-<a class="jxr_linenumber" name="L5577" href="#L5577">5577</a> <em class="jxr_javadoccomment"> * @return A new random alphabetic string.</em>
-<a class="jxr_linenumber" name="L5578" href="#L5578">5578</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L5579" href="#L5579">5579</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String randomAlphabetic(<strong class="jxr_keyword">int</strong> length) {
-<a class="jxr_linenumber" name="L5580" href="#L5580">5580</a> <strong class="jxr_keyword">if</strong> (length < 0)
-<a class="jxr_linenumber" name="L5581" href="#L5581">5581</a> <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> IllegalArgumentException(<span class="jxr_string">"Length must be non-negative: "</span> + length);
-<a class="jxr_linenumber" name="L5582" href="#L5582">5582</a> <strong class="jxr_keyword">var</strong> sb = <strong class="jxr_keyword">new</strong> StringBuilder(length);
-<a class="jxr_linenumber" name="L5583" href="#L5583">5583</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < length; i++) {
-<a class="jxr_linenumber" name="L5584" href="#L5584">5584</a> <strong class="jxr_keyword">var</strong> c = RANDOM.nextInt(52);
-<a class="jxr_linenumber" name="L5585" href="#L5585">5585</a> <strong class="jxr_keyword">if</strong> (c < 26)
-<a class="jxr_linenumber" name="L5586" href="#L5586">5586</a> sb.append((<strong class="jxr_keyword">char</strong>)('a' + c));
-<a class="jxr_linenumber" name="L5587" href="#L5587">5587</a> <strong class="jxr_keyword">else</strong>
-<a class="jxr_linenumber" name="L5588" href="#L5588">5588</a> sb.append((<strong class="jxr_keyword">char</strong>)('A' + c - 26));
-<a class="jxr_linenumber" name="L5589" href="#L5589">5589</a> }
-<a class="jxr_linenumber" name="L5590" href="#L5590">5590</a> <strong class="jxr_keyword">return</strong> sb.toString();
-<a class="jxr_linenumber" name="L5591" href="#L5591">5591</a> }
-<a class="jxr_linenumber" name="L5592" href="#L5592">5592</a>
-<a class="jxr_linenumber" name="L5593" href="#L5593">5593</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L5594" href="#L5594">5594</a> <em class="jxr_javadoccomment"> * Generates a random alphanumeric string of the specified length.</em>
-<a class="jxr_linenumber" name="L5595" href="#L5595">5595</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5596" href="#L5596">5596</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L5597" href="#L5597">5597</a> <em class="jxr_javadoccomment"> * Characters are composed of upper-case and lower-case ASCII letters and digits (a-z, A-Z, 0-9).</em>
-<a class="jxr_linenumber" name="L5598" href="#L5598">5598</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5599" href="#L5599">5599</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
-<a class="jxr_linenumber" name="L5600" href="#L5600">5600</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L5601" href="#L5601">5601</a> <em class="jxr_javadoccomment"> * randomAlphanumeric(<jk>8</jk>); <jc>// "aB3dE5fG"</jc></em>
-<a class="jxr_linenumber" name="L5602" href="#L5602">5602</a> <em class="jxr_javadoccomment"> * </p></em>
-<a class="jxr_linenumber" name="L5603" href="#L5603">5603</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5604" href="#L5604">5604</a> <em class="jxr_javadoccomment"> * @param length The length of the generated string.</em>
-<a class="jxr_linenumber" name="L5605" href="#L5605">5605</a> <em class="jxr_javadoccomment"> * @return A new random alphanumeric string.</em>
-<a class="jxr_linenumber" name="L5606" href="#L5606">5606</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L5607" href="#L5607">5607</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String randomAlphanumeric(<strong class="jxr_keyword">int</strong> length) {
-<a class="jxr_linenumber" name="L5608" href="#L5608">5608</a> <strong class="jxr_keyword">if</strong> (length < 0)
-<a class="jxr_linenumber" name="L5609" href="#L5609">5609</a> <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> IllegalArgumentException(<span class="jxr_string">"Length must be non-negative: "</span> + length);
-<a class="jxr_linenumber" name="L5610" href="#L5610">5610</a> <strong class="jxr_keyword">var</strong> sb = <strong class="jxr_keyword">new</strong> StringBuilder(length);
-<a class="jxr_linenumber" name="L5611" href="#L5611">5611</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < length; i++) {
-<a class="jxr_linenumber" name="L5612" href="#L5612">5612</a> <strong class="jxr_keyword">var</strong> c = RANDOM.nextInt(62);
-<a class="jxr_linenumber" name="L5613" href="#L5613">5613</a> <strong class="jxr_keyword">if</strong> (c < 10)
-<a class="jxr_linenumber" name="L5614" href="#L5614">5614</a> sb.append((<strong class="jxr_keyword">char</strong>)('0' + c));
-<a class="jxr_linenumber" name="L5615" href="#L5615">5615</a> <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (c < 36)
-<a class="jxr_linenumber" name="L5616" href="#L5616">5616</a> sb.append((<strong class="jxr_keyword">char</strong>)('a' + c - 10));
-<a class="jxr_linenumber" name="L5617" href="#L5617">5617</a> <strong class="jxr_keyword">else</strong>
-<a class="jxr_linenumber" name="L5618" href="#L5618">5618</a> sb.append((<strong class="jxr_keyword">char</strong>)('A' + c - 36));
-<a class="jxr_linenumber" name="L5619" href="#L5619">5619</a> }
-<a class="jxr_linenumber" name="L5620" href="#L5620">5620</a> <strong class="jxr_keyword">return</strong> sb.toString();
-<a class="jxr_linenumber" name="L5621" href="#L5621">5621</a> }
-<a class="jxr_linenumber" name="L5622" href="#L5622">5622</a>
-<a class="jxr_linenumber" name="L5623" href="#L5623">5623</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L5624" href="#L5624">5624</a> <em class="jxr_javadoccomment"> * Generates a random ASCII string of the specified length.</em>
-<a class="jxr_linenumber" name="L5625" href="#L5625">5625</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5626" href="#L5626">5626</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L5627" href="#L5627">5627</a> <em class="jxr_javadoccomment"> * Characters are composed of printable ASCII characters (32-126).</em>
-<a class="jxr_linenumber" name="L5628" href="#L5628">5628</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5629" href="#L5629">5629</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
-<a class="jxr_linenumber" name="L5630" href="#L5630">5630</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L5631" href="#L5631">5631</a> <em class="jxr_javadoccomment"> * randomAscii(<jk>10</jk>); <jc>// "!@#$%^&*()"</jc></em>
-<a class="jxr_linenumber" name="L5632" href="#L5632">5632</a> <em class="jxr_javadoccomment"> * </p></em>
-<a class="jxr_linenumber" name="L5633" href="#L5633">5633</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5634" href="#L5634">5634</a> <em class="jxr_javadoccomment"> * @param length The length of the generated string.</em>
-<a class="jxr_linenumber" name="L5635" href="#L5635">5635</a> <em class="jxr_javadoccomment"> * @return A new random ASCII string.</em>
-<a class="jxr_linenumber" name="L5636" href="#L5636">5636</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L5637" href="#L5637">5637</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String randomAscii(<strong class="jxr_keyword">int</strong> length) {
-<a class="jxr_linenumber" name="L5638" href="#L5638">5638</a> <strong class="jxr_keyword">if</strong> (length < 0)
-<a class="jxr_linenumber" name="L5639" href="#L5639">5639</a> <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> IllegalArgumentException(<span class="jxr_string">"Length must be non-negative: "</span> + length);
-<a class="jxr_linenumber" name="L5640" href="#L5640">5640</a> <strong class="jxr_keyword">var</strong> sb = <strong class="jxr_keyword">new</strong> StringBuilder(length);
-<a class="jxr_linenumber" name="L5641" href="#L5641">5641</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < length; i++) {
-<a class="jxr_linenumber" name="L5642" href="#L5642">5642</a> sb.append((<strong class="jxr_keyword">char</strong>)(32 + RANDOM.nextInt(95))); <em class="jxr_comment">// 95 printable ASCII chars (32-126)</em>
-<a class="jxr_linenumber" name="L5643" href="#L5643">5643</a> }
-<a class="jxr_linenumber" name="L5644" href="#L5644">5644</a> <strong class="jxr_keyword">return</strong> sb.toString();
-<a class="jxr_linenumber" name="L5645" href="#L5645">5645</a> }
-<a class="jxr_linenumber" name="L5646" href="#L5646">5646</a>
-<a class="jxr_linenumber" name="L5647" href="#L5647">5647</a> <em class="jxr_comment">//-----------------------------------------------------------------------------------------------------------------</em>
-<a class="jxr_linenumber" name="L5648" href="#L5648">5648</a> <em class="jxr_comment">// String joining and splitting methods</em>
-<a class="jxr_linenumber" name="L5649" href="#L5649">5649</a> <em class="jxr_comment">//-----------------------------------------------------------------------------------------------------------------</em>
-<a class="jxr_linenumber" name="L5650" href="#L5650">5650</a>
-<a class="jxr_linenumber" name="L5651" href="#L5651">5651</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L5652" href="#L5652">5652</a> <em class="jxr_javadoccomment"> * Generates a random numeric string of the specified length.</em>
-<a class="jxr_linenumber" name="L5653" href="#L5653">5653</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5654" href="#L5654">5654</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L5655" href="#L5655">5655</a> <em class="jxr_javadoccomment"> * Characters are composed of digits (0-9).</em>
-<a class="jxr_linenumber" name="L5656" href="#L5656">5656</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5657" href="#L5657">5657</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
-<a class="jxr_linenumber" name="L5658" href="#L5658">5658</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L5659" href="#L5659">5659</a> <em class="jxr_javadoccomment"> * randomNumeric(<jk>6</jk>); <jc>// "123456"</jc></em>
-<a class="jxr_linenumber" name="L5660" href="#L5660">5660</a> <em class="jxr_javadoccomment"> * </p></em>
-<a class="jxr_linenumber" name="L5661" href="#L5661">5661</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5662" href="#L5662">5662</a> <em class="jxr_javadoccomment"> * @param length The length of the generated string.</em>
-<a class="jxr_linenumber" name="L5663" href="#L5663">5663</a> <em class="jxr_javadoccomment"> * @return A new random numeric string.</em>
-<a class="jxr_linenumber" name="L5664" href="#L5664">5664</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L5665" href="#L5665">5665</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String randomNumeric(<strong class="jxr_keyword">int</strong> length) {
-<a class="jxr_linenumber" name="L5666" href="#L5666">5666</a> <strong class="jxr_keyword">if</strong> (length < 0)
-<a class="jxr_linenumber" name="L5667" href="#L5667">5667</a> <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> IllegalArgumentException(<span class="jxr_string">"Length must be non-negative: "</span> + length);
-<a class="jxr_linenumber" name="L5668" href="#L5668">5668</a> <strong class="jxr_keyword">var</strong> sb = <strong class="jxr_keyword">new</strong> StringBuilder(length);
-<a class="jxr_linenumber" name="L5669" href="#L5669">5669</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < length; i++) {
-<a class="jxr_linenumber" name="L5670" href="#L5670">5670</a> sb.append((<strong class="jxr_keyword">char</strong>)('0' + RANDOM.nextInt(10)));
-<a class="jxr_linenumber" name="L5671" href="#L5671">5671</a> }
-<a class="jxr_linenumber" name="L5672" href="#L5672">5672</a> <strong class="jxr_keyword">return</strong> sb.toString();
-<a class="jxr_linenumber" name="L5673" href="#L5673">5673</a> }
-<a class="jxr_linenumber" name="L5674" href="#L5674">5674</a>
-<a class="jxr_linenumber" name="L5675" href="#L5675">5675</a> <em class="jxr_comment">//-----------------------------------------------------------------------------------------------------------------</em>
-<a class="jxr_linenumber" name="L5676" href="#L5676">5676</a> <em class="jxr_comment">// String cleaning and sanitization methods</em>
-<a class="jxr_linenumber" name="L5677" href="#L5677">5677</a> <em class="jxr_comment">//-----------------------------------------------------------------------------------------------------------------</em>
-<a class="jxr_linenumber" name="L5678" href="#L5678">5678</a>
-<a class="jxr_linenumber" name="L5679" href="#L5679">5679</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L5680" href="#L5680">5680</a> <em class="jxr_javadoccomment"> * Generates a random string of the specified length using characters from the given character set.</em>
-<a class="jxr_linenumber" name="L5681" href="#L5681">5681</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5682" href="#L5682">5682</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L5683" href="#L5683">5683</a> <em class="jxr_javadoccomment"> * Each character in the generated string is randomly selected from the provided character set.</em>
-<a class="jxr_linenumber" name="L5684" href="#L5684">5684</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5685" href="#L5685">5685</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
-<a class="jxr_linenumber" name="L5686" href="#L5686">5686</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L5687" href="#L5687">5687</a> <em class="jxr_javadoccomment"> * randomString(<jk>5</jk>, <js>"ABC"</js>); <jc>// "BACAB"</jc></em>
-<a class="jxr_linenumber" name="L5688" href="#L5688">5688</a> <em class="jxr_javadoccomment"> * </p></em>
-<a class="jxr_linenumber" name="L5689" href="#L5689">5689</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5690" href="#L5690">5690</a> <em class="jxr_javadoccomment"> * @param length The length of the generated string.</em>
-<a class="jxr_linenumber" name="L5691" href="#L5691">5691</a> <em class="jxr_javadoccomment"> * @param chars The character set to use. Must not be null or empty.</em>
-<a class="jxr_linenumber" name="L5692" href="#L5692">5692</a> <em class="jxr_javadoccomment"> * @return A new random string.</em>
-<a class="jxr_linenumber" name="L5693" href="#L5693">5693</a> <em class="jxr_javadoccomment"> * @throws IllegalArgumentException If chars is null or empty, or length is negative.</em>
-<a class="jxr_linenumber" name="L5694" href="#L5694">5694</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L5695" href="#L5695">5695</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String randomString(<strong class="jxr_keyword">int</strong> length, String chars) {
-<a class="jxr_linenumber" name="L5696" href="#L5696">5696</a> <strong class="jxr_keyword">if</strong> (length < 0)
-<a class="jxr_linenumber" name="L5697" href="#L5697">5697</a> <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> IllegalArgumentException(<span class="jxr_string">"Length must be non-negative: "</span> + length);
-<a class="jxr_linenumber" name="L5698" href="#L5698">5698</a> <strong class="jxr_keyword">if</strong> (chars == <strong class="jxr_keyword">null</strong> || chars.isEmpty())
-<a class="jxr_linenumber" name="L5699" href="#L5699">5699</a> <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> IllegalArgumentException(<span class="jxr_string">"Character set must not be null or empty"</span>);
-<a class="jxr_linenumber" name="L5700" href="#L5700">5700</a> <strong class="jxr_keyword">var</strong> sb = <strong class="jxr_keyword">new</strong> StringBuilder(length);
-<a class="jxr_linenumber" name="L5701" href="#L5701">5701</a> <strong class="jxr_keyword">var</strong> charsLen = chars.length();
-<a class="jxr_linenumber" name="L5702" href="#L5702">5702</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < length; i++) {
-<a class="jxr_linenumber" name="L5703" href="#L5703">5703</a> sb.append(chars.charAt(RANDOM.nextInt(charsLen)));
-<a class="jxr_linenumber" name="L5704" href="#L5704">5704</a> }
-<a class="jxr_linenumber" name="L5705" href="#L5705">5705</a> <strong class="jxr_keyword">return</strong> sb.toString();
-<a class="jxr_linenumber" name="L5706" href="#L5706">5706</a> }
-<a class="jxr_linenumber" name="L5707" href="#L5707">5707</a>
-<a class="jxr_linenumber" name="L5708" href="#L5708">5708</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L5709" href="#L5709">5709</a> <em class="jxr_javadoccomment"> * Calculates a simple readability score for a string.</em>
-<a class="jxr_linenumber" name="L5710" href="#L5710">5710</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5711" href="#L5711">5711</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L5712" href="#L5712">5712</a> <em class="jxr_javadoccomment"> * Uses a simplified Flesch Reading Ease-like formula based on:</em>
-<a class="jxr_linenumber" name="L5713" href="#L5713">5713</a> <em class="jxr_javadoccomment"> * <ul></em>
-<a class="jxr_linenumber" name="L5714" href="#L5714">5714</a> <em class="jxr_javadoccomment"> * <li>Average words per sentence</li></em>
-<a class="jxr_linenumber" name="L5715" href="#L5715">5715</a> <em class="jxr_javadoccomment"> * <li>Average syllables per word (estimated)</li></em>
-<a class="jxr_linenumber" name="L5716" href="#L5716">5716</a> <em class="jxr_javadoccomment"> * </ul></em>
-<a class="jxr_linenumber" name="L5717" href="#L5717">5717</a> <em class="jxr_javadoccomment"> * Returns a score from 0-100, where higher scores indicate easier reading.</em>
-<a class="jxr_linenumber" name="L5718" href="#L5718">5718</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5719" href="#L5719">5719</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
-<a class="jxr_linenumber" name="L5720" href="#L5720">5720</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L5721" href="#L5721">5721</a> <em class="jxr_javadoccomment"> * readabilityScore(<js>"The cat sat."</js>); <jc>// Higher score (simple)</jc></em>
-<a class="jxr_linenumber" name="L5722" href="#L5722">5722</a> <em class="jxr_javadoccomment"> * readabilityScore(<js>"The sophisticated..."</js>); <jc>// Lower score (complex)</jc></em>
-<a class="jxr_linenumber" name="L5723" href="#L5723">5723</a> <em class="jxr_javadoccomment"> * </p></em>
-<a class="jxr_linenumber" name="L5724" href="#L5724">5724</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5725" href="#L5725">5725</a> <em class="jxr_javadoccomment"> * @param str The string to analyze. Can be <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L5726" href="#L5726">5726</a> <em class="jxr_javadoccomment"> * @return A readability score from 0-100, or <c>0.0</c> if the string is <jk>null</jk> or empty.</em>
-<a class="jxr_linenumber" name="L5727" href="#L5727">5727</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L5728" href="#L5728">5728</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">double</strong> readabilityScore(String str) {
-<a class="jxr_linenumber" name="L5729" href="#L5729">5729</a> <strong class="jxr_keyword">if</strong> (isEmpty(str))
-<a class="jxr_linenumber" name="L5730" href="#L5730">5730</a> <strong class="jxr_keyword">return</strong> 0.0;
-<a class="jxr_linenumber" name="L5731" href="#L5731">5731</a>
-<a class="jxr_linenumber" name="L5732" href="#L5732">5732</a> <strong class="jxr_keyword">var</strong> words = extractWords(str);
-<a class="jxr_linenumber" name="L5733" href="#L5733">5733</a> <strong class="jxr_keyword">if</strong> (words.isEmpty())
-<a class="jxr_linenumber" name="L5734" href="#L5734">5734</a> <strong class="jxr_keyword">return</strong> 0.0;
-<a class="jxr_linenumber" name="L5735" href="#L5735">5735</a>
-<a class="jxr_linenumber" name="L5736" href="#L5736">5736</a> <em class="jxr_comment">// Count sentences (ending with . ! ?)</em>
-<a class="jxr_linenumber" name="L5737" href="#L5737">5737</a> <strong class="jxr_keyword">var</strong> sentenceCount = 0;
-<a class="jxr_linenumber" name="L5738" href="#L5738">5738</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < str.length(); i++) {
-<a class="jxr_linenumber" name="L5739" href="#L5739">5739</a> <strong class="jxr_keyword">var</strong> c = str.charAt(i);
-<a class="jxr_linenumber" name="L5740" href="#L5740">5740</a> <strong class="jxr_keyword">if</strong> (c == '.' || c == '!' || c == '?') {
-<a class="jxr_linenumber" name="L5741" href="#L5741">5741</a> sentenceCount++;
-<a class="jxr_linenumber" name="L5742" href="#L5742">5742</a> }
-<a class="jxr_linenumber" name="L5743" href="#L5743">5743</a> }
-<a class="jxr_linenumber" name="L5744" href="#L5744">5744</a> <strong class="jxr_keyword">if</strong> (sentenceCount == 0)
-<a class="jxr_linenumber" name="L5745" href="#L5745">5745</a> sentenceCount = 1; <em class="jxr_comment">// At least one sentence</em>
-<a class="jxr_linenumber" name="L5746" href="#L5746">5746</a>
-<a class="jxr_linenumber" name="L5747" href="#L5747">5747</a> <em class="jxr_comment">// Calculate average words per sentence</em>
-<a class="jxr_linenumber" name="L5748" href="#L5748">5748</a> <strong class="jxr_keyword">var</strong> avgWordsPerSentence = (<strong class="jxr_keyword">double</strong>)words.size() / sentenceCount;
-<a class="jxr_linenumber" name="L5749" href="#L5749">5749</a>
-<a class="jxr_linenumber" name="L5750" href="#L5750">5750</a> <em class="jxr_comment">// Estimate average syllables per word (simplified: count vowel groups)</em>
-<a class="jxr_linenumber" name="L5751" href="#L5751">5751</a> <strong class="jxr_keyword">var</strong> totalSyllables = 0;
-<a class="jxr_linenumber" name="L5752" href="#L5752">5752</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> word : words) {
-<a class="jxr_linenumber" name="L5753" href="#L5753">5753</a> totalSyllables += estimateSyllables(word);
-<a class="jxr_linenumber" name="L5754" href="#L5754">5754</a> }
-<a class="jxr_linenumber" name="L5755" href="#L5755">5755</a> <strong class="jxr_keyword">var</strong> avgSyllablesPerWord = (<strong class="jxr_keyword">double</strong>)totalSyllables / words.size();
-<a class="jxr_linenumber" name="L5756" href="#L5756">5756</a>
-<a class="jxr_linenumber" name="L5757" href="#L5757">5757</a> <em class="jxr_comment">// Simplified Flesch Reading Ease formula</em>
-<a class="jxr_linenumber" name="L5758" href="#L5758">5758</a> <em class="jxr_comment">// Score = 206.835 - (1.015 * ASL) - (84.6 * ASW)</em>
-<a class="jxr_linenumber" name="L5759" href="#L5759">5759</a> <em class="jxr_comment">// Where ASL = average sentence length (words), ASW = average syllables per word</em>
-<a class="jxr_linenumber" name="L5760" href="#L5760">5760</a> <strong class="jxr_keyword">var</strong> score = 206.835 - (1.015 * avgWordsPerSentence) - (84.6 * avgSyllablesPerWord);
-<a class="jxr_linenumber" name="L5761" href="#L5761">5761</a>
-<a class="jxr_linenumber" name="L5762" href="#L5762">5762</a> <em class="jxr_comment">// Clamp to 0-100 range</em>
-<a class="jxr_linenumber" name="L5763" href="#L5763">5763</a> <strong class="jxr_keyword">return</strong> Math.max(0.0, Math.min(100.0, score));
-<a class="jxr_linenumber" name="L5764" href="#L5764">5764</a> }
+<a class="jxr_linenumber" name="L5476" href="#L5476">5476</a> <strong class="jxr_keyword">var</strong> words = splitWords(str);
+<a class="jxr_linenumber" name="L5477" href="#L5477">5477</a> <strong class="jxr_keyword">if</strong> (words.isEmpty())
+<a class="jxr_linenumber" name="L5478" href="#L5478">5478</a> <strong class="jxr_keyword">return</strong> <span class="jxr_string">""</span>;
+<a class="jxr_linenumber" name="L5479" href="#L5479">5479</a>
+<a class="jxr_linenumber" name="L5480" href="#L5480">5480</a> <strong class="jxr_keyword">var</strong> result = <strong class="jxr_keyword">new</strong> StringBuilder();
+<a class="jxr_linenumber" name="L5481" href="#L5481">5481</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> word : words) {
+<a class="jxr_linenumber" name="L5482" href="#L5482">5482</a> result.append(capitalize(word.toLowerCase()));
+<a class="jxr_linenumber" name="L5483" href="#L5483">5483</a> }
+<a class="jxr_linenumber" name="L5484" href="#L5484">5484</a>
+<a class="jxr_linenumber" name="L5485" href="#L5485">5485</a> <strong class="jxr_keyword">return</strong> result.toString();
+<a class="jxr_linenumber" name="L5486" href="#L5486">5486</a> }
+<a class="jxr_linenumber" name="L5487" href="#L5487">5487</a>
+<a class="jxr_linenumber" name="L5488" href="#L5488">5488</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L5489" href="#L5489">5489</a> <em class="jxr_javadoccomment"> * Pluralizes a word based on a count.</em>
+<a class="jxr_linenumber" name="L5490" href="#L5490">5490</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5491" href="#L5491">5491</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L5492" href="#L5492">5492</a> <em class="jxr_javadoccomment"> * Simple pluralization that adds "s" to most words, with basic rules for words ending in "s", "x", "z", "ch", "sh" (add "es"),</em>
+<a class="jxr_linenumber" name="L5493" href="#L5493">5493</a> <em class="jxr_javadoccomment"> * and words ending in "y" preceded by a consonant (replace "y" with "ies").</em>
+<a class="jxr_linenumber" name="L5494" href="#L5494">5494</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5495" href="#L5495">5495</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
+<a class="jxr_linenumber" name="L5496" href="#L5496">5496</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
+<a class="jxr_linenumber" name="L5497" href="#L5497">5497</a> <em class="jxr_javadoccomment"> * pluralize(<js>"cat"</js>, <js>1</js>); <jc>// "cat"</jc></em>
+<a class="jxr_linenumber" name="L5498" href="#L5498">5498</a> <em class="jxr_javadoccomment"> * pluralize(<js>"cat"</js>, <js>2</js>); <jc>// "cats"</jc></em>
+<a class="jxr_linenumber" name="L5499" href="#L5499">5499</a> <em class="jxr_javadoccomment"> * pluralize(<js>"box"</js>, <js>2</js>); <jc>// "boxes"</jc></em>
+<a class="jxr_linenumber" name="L5500" href="#L5500">5500</a> <em class="jxr_javadoccomment"> * pluralize(<js>"city"</js>, <js>2</js>); <jc>// "cities"</jc></em>
+<a class="jxr_linenumber" name="L5501" href="#L5501">5501</a> <em class="jxr_javadoccomment"> * </p></em>
+<a class="jxr_linenumber" name="L5502" href="#L5502">5502</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5503" href="#L5503">5503</a> <em class="jxr_javadoccomment"> * @param word The word to pluralize.</em>
+<a class="jxr_linenumber" name="L5504" href="#L5504">5504</a> <em class="jxr_javadoccomment"> * @param count The count to determine if pluralization is needed.</em>
+<a class="jxr_linenumber" name="L5505" href="#L5505">5505</a> <em class="jxr_javadoccomment"> * @return The pluralized word if count is not 1, otherwise the original word.</em>
+<a class="jxr_linenumber" name="L5506" href="#L5506">5506</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L5507" href="#L5507">5507</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String pluralize(String word, <strong class="jxr_keyword">int</strong> count) {
+<a class="jxr_linenumber" name="L5508" href="#L5508">5508</a> <strong class="jxr_keyword">if</strong> (word == <strong class="jxr_keyword">null</strong> || word.isEmpty())
+<a class="jxr_linenumber" name="L5509" href="#L5509">5509</a> <strong class="jxr_keyword">return</strong> word;
+<a class="jxr_linenumber" name="L5510" href="#L5510">5510</a> <strong class="jxr_keyword">if</strong> (count == 1)
+<a class="jxr_linenumber" name="L5511" href="#L5511">5511</a> <strong class="jxr_keyword">return</strong> word;
+<a class="jxr_linenumber" name="L5512" href="#L5512">5512</a>
+<a class="jxr_linenumber" name="L5513" href="#L5513">5513</a> <strong class="jxr_keyword">var</strong> lower = word.toLowerCase();
+<a class="jxr_linenumber" name="L5514" href="#L5514">5514</a> <strong class="jxr_keyword">var</strong> length = word.length();
+<a class="jxr_linenumber" name="L5515" href="#L5515">5515</a>
+<a class="jxr_linenumber" name="L5516" href="#L5516">5516</a> <em class="jxr_comment">// Words ending in s, x, z, ch, sh -> add "es"</em>
+<a class="jxr_linenumber" name="L5517" href="#L5517">5517</a> <strong class="jxr_keyword">if</strong> (lower.endsWith(<span class="jxr_string">"s"</span>) || lower.endsWith(<span class="jxr_string">"x"</span>) || lower.endsWith(<span class="jxr_string">"z"</span>) || lower.endsWith(<span class="jxr_string">"ch"</span>) || lower.endsWith(<span class="jxr_string">"sh"</span>)) {
+<a class="jxr_linenumber" name="L5518" href="#L5518">5518</a> <strong class="jxr_keyword">return</strong> word + <span class="jxr_string">"es"</span>;
+<a class="jxr_linenumber" name="L5519" href="#L5519">5519</a> }
+<a class="jxr_linenumber" name="L5520" href="#L5520">5520</a>
+<a class="jxr_linenumber" name="L5521" href="#L5521">5521</a> <em class="jxr_comment">// Words ending in "y" preceded by a consonant -> replace "y" with "ies"</em>
+<a class="jxr_linenumber" name="L5522" href="#L5522">5522</a> <strong class="jxr_keyword">if</strong> (length > 1 && lower.endsWith(<span class="jxr_string">"y"</span>)) {
+<a class="jxr_linenumber" name="L5523" href="#L5523">5523</a> <strong class="jxr_keyword">var</strong> secondLast = lower.charAt(length - 2);
+<a class="jxr_linenumber" name="L5524" href="#L5524">5524</a> <strong class="jxr_keyword">if</strong> (secondLast != 'a' && secondLast != 'e' && secondLast != 'i' && secondLast != 'o' && secondLast != 'u') {
+<a class="jxr_linenumber" name="L5525" href="#L5525">5525</a> <strong class="jxr_keyword">return</strong> word.substring(0, length - 1) + <span class="jxr_string">"ies"</span>;
+<a class="jxr_linenumber" name="L5526" href="#L5526">5526</a> }
+<a class="jxr_linenumber" name="L5527" href="#L5527">5527</a> }
+<a class="jxr_linenumber" name="L5528" href="#L5528">5528</a>
+<a class="jxr_linenumber" name="L5529" href="#L5529">5529</a> <em class="jxr_comment">// Words ending in "f" or "fe" -> replace with "ves" (basic rule)</em>
+<a class="jxr_linenumber" name="L5530" href="#L5530">5530</a> <strong class="jxr_keyword">if</strong> (lower.endsWith(<span class="jxr_string">"f"</span>)) {
+<a class="jxr_linenumber" name="L5531" href="#L5531">5531</a> <strong class="jxr_keyword">return</strong> word.substring(0, length - 1) + <span class="jxr_string">"ves"</span>;
+<a class="jxr_linenumber" name="L5532" href="#L5532">5532</a> }
+<a class="jxr_linenumber" name="L5533" href="#L5533">5533</a> <strong class="jxr_keyword">if</strong> (lower.endsWith(<span class="jxr_string">"fe"</span>)) {
+<a class="jxr_linenumber" name="L5534" href="#L5534">5534</a> <strong class="jxr_keyword">return</strong> word.substring(0, length - 2) + <span class="jxr_string">"ves"</span>;
+<a class="jxr_linenumber" name="L5535" href="#L5535">5535</a> }
+<a class="jxr_linenumber" name="L5536" href="#L5536">5536</a>
+<a class="jxr_linenumber" name="L5537" href="#L5537">5537</a> <em class="jxr_comment">// Default: add "s"</em>
+<a class="jxr_linenumber" name="L5538" href="#L5538">5538</a> <strong class="jxr_keyword">return</strong> word + <span class="jxr_string">"s"</span>;
+<a class="jxr_linenumber" name="L5539" href="#L5539">5539</a> }
+<a class="jxr_linenumber" name="L5540" href="#L5540">5540</a>
+<a class="jxr_linenumber" name="L5541" href="#L5541">5541</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L5542" href="#L5542">5542</a> <em class="jxr_javadoccomment"> * Generated a random UUID with the specified number of characters.</em>
+<a class="jxr_linenumber" name="L5543" href="#L5543">5543</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5544" href="#L5544">5544</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L5545" href="#L5545">5545</a> <em class="jxr_javadoccomment"> * Characters are composed of lower-case ASCII letters and numbers only.</em>
+<a class="jxr_linenumber" name="L5546" href="#L5546">5546</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5547" href="#L5547">5547</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L5548" href="#L5548">5548</a> <em class="jxr_javadoccomment"> * This method conforms to the restrictions for hostnames as specified in <a class="doclink" href="<a href="https://tools.ietf.org/html/rfc952" target="alexandria_uri">https://tools.ietf.org/html/rfc952</a>">RFC 952</a></em>
+<a class="jxr_linenumber" name="L5549" href="#L5549">5549</a> <em class="jxr_javadoccomment"> * Since each character has 36 possible values, the square approximation formula for the number of generated IDs</em>
+<a class="jxr_linenumber" name="L5550" href="#L5550">5550</a> <em class="jxr_javadoccomment"> * that would produce a 50% chance of collision is:</em>
+<a class="jxr_linenumber" name="L5551" href="#L5551">5551</a> <em class="jxr_javadoccomment"> * <c>sqrt(36^N)</c>.</em>
+<a class="jxr_linenumber" name="L5552" href="#L5552">5552</a> <em class="jxr_javadoccomment"> * Dividing this number by 10 gives you an approximation of the number of generated IDs needed to produce a</em>
+<a class="jxr_linenumber" name="L5553" href="#L5553">5553</a> <em class="jxr_javadoccomment"> * &lt;1% chance of collision.</em>
+<a class="jxr_linenumber" name="L5554" href="#L5554">5554</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5555" href="#L5555">5555</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L5556" href="#L5556">5556</a> <em class="jxr_javadoccomment"> * For example, given 5 characters, the number of generated IDs need to produce a &lt;1% chance of collision would</em>
+<a class="jxr_linenumber" name="L5557" href="#L5557">5557</a> <em class="jxr_javadoccomment"> * be:</em>
+<a class="jxr_linenumber" name="L5558" href="#L5558">5558</a> <em class="jxr_javadoccomment"> * <c>sqrt(36^5)/10=777</c></em>
+<a class="jxr_linenumber" name="L5559" href="#L5559">5559</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5560" href="#L5560">5560</a> <em class="jxr_javadoccomment"> * @param numchars The number of characters in the generated UUID.</em>
+<a class="jxr_linenumber" name="L5561" href="#L5561">5561</a> <em class="jxr_javadoccomment"> * @return A new random UUID.</em>
+<a class="jxr_linenumber" name="L5562" href="#L5562">5562</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L5563" href="#L5563">5563</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String random(<strong class="jxr_keyword">int</strong> numchars) {
+<a class="jxr_linenumber" name="L5564" href="#L5564">5564</a> <strong class="jxr_keyword">var</strong> sb = <strong class="jxr_keyword">new</strong> StringBuilder(numchars);
+<a class="jxr_linenumber" name="L5565" href="#L5565">5565</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < numchars; i++) {
+<a class="jxr_linenumber" name="L5566" href="#L5566">5566</a> <strong class="jxr_keyword">var</strong> c = RANDOM.nextInt(36) + 97;
+<a class="jxr_linenumber" name="L5567" href="#L5567">5567</a> <strong class="jxr_keyword">if</strong> (c > 'z')
+<a class="jxr_linenumber" name="L5568" href="#L5568">5568</a> c -= ('z' - '0' + 1);
+<a class="jxr_linenumber" name="L5569" href="#L5569">5569</a> sb.append((<strong class="jxr_keyword">char</strong>)c);
+<a class="jxr_linenumber" name="L5570" href="#L5570">5570</a> }
+<a class="jxr_linenumber" name="L5571" href="#L5571">5571</a> <strong class="jxr_keyword">return</strong> sb.toString();
+<a class="jxr_linenumber" name="L5572" href="#L5572">5572</a> }
+<a class="jxr_linenumber" name="L5573" href="#L5573">5573</a>
+<a class="jxr_linenumber" name="L5574" href="#L5574">5574</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L5575" href="#L5575">5575</a> <em class="jxr_javadoccomment"> * Generates a random alphabetic string of the specified length.</em>
+<a class="jxr_linenumber" name="L5576" href="#L5576">5576</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5577" href="#L5577">5577</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L5578" href="#L5578">5578</a> <em class="jxr_javadoccomment"> * Characters are composed of upper-case and lower-case ASCII letters (a-z, A-Z).</em>
+<a class="jxr_linenumber" name="L5579" href="#L5579">5579</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5580" href="#L5580">5580</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
+<a class="jxr_linenumber" name="L5581" href="#L5581">5581</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
+<a class="jxr_linenumber" name="L5582" href="#L5582">5582</a> <em class="jxr_javadoccomment"> * randomAlphabetic(<jk>5</jk>); <jc>// "aBcDe"</jc></em>
+<a class="jxr_linenumber" name="L5583" href="#L5583">5583</a> <em class="jxr_javadoccomment"> * </p></em>
+<a class="jxr_linenumber" name="L5584" href="#L5584">5584</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5585" href="#L5585">5585</a> <em class="jxr_javadoccomment"> * @param length The length of the generated string.</em>
+<a class="jxr_linenumber" name="L5586" href="#L5586">5586</a> <em class="jxr_javadoccomment"> * @return A new random alphabetic string.</em>
+<a class="jxr_linenumber" name="L5587" href="#L5587">5587</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L5588" href="#L5588">5588</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String randomAlphabetic(<strong class="jxr_keyword">int</strong> length) {
+<a class="jxr_linenumber" name="L5589" href="#L5589">5589</a> <strong class="jxr_keyword">if</strong> (length < 0)
+<a class="jxr_linenumber" name="L5590" href="#L5590">5590</a> <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> IllegalArgumentException(<span class="jxr_string">"Length must be non-negative: "</span> + length);
+<a class="jxr_linenumber" name="L5591" href="#L5591">5591</a> <strong class="jxr_keyword">var</strong> sb = <strong class="jxr_keyword">new</strong> StringBuilder(length);
+<a class="jxr_linenumber" name="L5592" href="#L5592">5592</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < length; i++) {
+<a class="jxr_linenumber" name="L5593" href="#L5593">5593</a> <strong class="jxr_keyword">var</strong> c = RANDOM.nextInt(52);
+<a class="jxr_linenumber" name="L5594" href="#L5594">5594</a> <strong class="jxr_keyword">if</strong> (c < 26)
+<a class="jxr_linenumber" name="L5595" href="#L5595">5595</a> sb.append((<strong class="jxr_keyword">char</strong>)('a' + c));
+<a class="jxr_linenumber" name="L5596" href="#L5596">5596</a> <strong class="jxr_keyword">else</strong>
+<a class="jxr_linenumber" name="L5597" href="#L5597">5597</a> sb.append((<strong class="jxr_keyword">char</strong>)('A' + c - 26));
+<a class="jxr_linenumber" name="L5598" href="#L5598">5598</a> }
+<a class="jxr_linenumber" name="L5599" href="#L5599">5599</a> <strong class="jxr_keyword">return</strong> sb.toString();
+<a class="jxr_linenumber" name="L5600" href="#L5600">5600</a> }
+<a class="jxr_linenumber" name="L5601" href="#L5601">5601</a>
+<a class="jxr_linenumber" name="L5602" href="#L5602">5602</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L5603" href="#L5603">5603</a> <em class="jxr_javadoccomment"> * Generates a random alphanumeric string of the specified length.</em>
+<a class="jxr_linenumber" name="L5604" href="#L5604">5604</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5605" href="#L5605">5605</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L5606" href="#L5606">5606</a> <em class="jxr_javadoccomment"> * Characters are composed of upper-case and lower-case ASCII letters and digits (a-z, A-Z, 0-9).</em>
+<a class="jxr_linenumber" name="L5607" href="#L5607">5607</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5608" href="#L5608">5608</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
+<a class="jxr_linenumber" name="L5609" href="#L5609">5609</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
+<a class="jxr_linenumber" name="L5610" href="#L5610">5610</a> <em class="jxr_javadoccomment"> * randomAlphanumeric(<jk>8</jk>); <jc>// "aB3dE5fG"</jc></em>
+<a class="jxr_linenumber" name="L5611" href="#L5611">5611</a> <em class="jxr_javadoccomment"> * </p></em>
+<a class="jxr_linenumber" name="L5612" href="#L5612">5612</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5613" href="#L5613">5613</a> <em class="jxr_javadoccomment"> * @param length The length of the generated string.</em>
+<a class="jxr_linenumber" name="L5614" href="#L5614">5614</a> <em class="jxr_javadoccomment"> * @return A new random alphanumeric string.</em>
+<a class="jxr_linenumber" name="L5615" href="#L5615">5615</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L5616" href="#L5616">5616</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String randomAlphanumeric(<strong class="jxr_keyword">int</strong> length) {
+<a class="jxr_linenumber" name="L5617" href="#L5617">5617</a> <strong class="jxr_keyword">if</strong> (length < 0)
+<a class="jxr_linenumber" name="L5618" href="#L5618">5618</a> <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> IllegalArgumentException(<span class="jxr_string">"Length must be non-negative: "</span> + length);
+<a class="jxr_linenumber" name="L5619" href="#L5619">5619</a> <strong class="jxr_keyword">var</strong> sb = <strong class="jxr_keyword">new</strong> StringBuilder(length);
+<a class="jxr_linenumber" name="L5620" href="#L5620">5620</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < length; i++) {
+<a class="jxr_linenumber" name="L5621" href="#L5621">5621</a> <strong class="jxr_keyword">var</strong> c = RANDOM.nextInt(62);
+<a class="jxr_linenumber" name="L5622" href="#L5622">5622</a> <strong class="jxr_keyword">if</strong> (c < 10)
+<a class="jxr_linenumber" name="L5623" href="#L5623">5623</a> sb.append((<strong class="jxr_keyword">char</strong>)('0' + c));
+<a class="jxr_linenumber" name="L5624" href="#L5624">5624</a> <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (c < 36)
+<a class="jxr_linenumber" name="L5625" href="#L5625">5625</a> sb.append((<strong class="jxr_keyword">char</strong>)('a' + c - 10));
+<a class="jxr_linenumber" name="L5626" href="#L5626">5626</a> <strong class="jxr_keyword">else</strong>
+<a class="jxr_linenumber" name="L5627" href="#L5627">5627</a> sb.append((<strong class="jxr_keyword">char</strong>)('A' + c - 36));
+<a class="jxr_linenumber" name="L5628" href="#L5628">5628</a> }
+<a class="jxr_linenumber" name="L5629" href="#L5629">5629</a> <strong class="jxr_keyword">return</strong> sb.toString();
+<a class="jxr_linenumber" name="L5630" href="#L5630">5630</a> }
+<a class="jxr_linenumber" name="L5631" href="#L5631">5631</a>
+<a class="jxr_linenumber" name="L5632" href="#L5632">5632</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L5633" href="#L5633">5633</a> <em class="jxr_javadoccomment"> * Generates a random ASCII string of the specified length.</em>
+<a class="jxr_linenumber" name="L5634" href="#L5634">5634</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5635" href="#L5635">5635</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L5636" href="#L5636">5636</a> <em class="jxr_javadoccomment"> * Characters are composed of printable ASCII characters (32-126).</em>
+<a class="jxr_linenumber" name="L5637" href="#L5637">5637</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5638" href="#L5638">5638</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
+<a class="jxr_linenumber" name="L5639" href="#L5639">5639</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
+<a class="jxr_linenumber" name="L5640" href="#L5640">5640</a> <em class="jxr_javadoccomment"> * randomAscii(<jk>10</jk>); <jc>// "!@#$%^&*()"</jc></em>
+<a class="jxr_linenumber" name="L5641" href="#L5641">5641</a> <em class="jxr_javadoccomment"> * </p></em>
+<a class="jxr_linenumber" name="L5642" href="#L5642">5642</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5643" href="#L5643">5643</a> <em class="jxr_javadoccomment"> * @param length The length of the generated string.</em>
+<a class="jxr_linenumber" name="L5644" href="#L5644">5644</a> <em class="jxr_javadoccomment"> * @return A new random ASCII string.</em>
+<a class="jxr_linenumber" name="L5645" href="#L5645">5645</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L5646" href="#L5646">5646</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String randomAscii(<strong class="jxr_keyword">int</strong> length) {
+<a class="jxr_linenumber" name="L5647" href="#L5647">5647</a> <strong class="jxr_keyword">if</strong> (length < 0)
+<a class="jxr_linenumber" name="L5648" href="#L5648">5648</a> <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> IllegalArgumentException(<span class="jxr_string">"Length must be non-negative: "</span> + length);
+<a class="jxr_linenumber" name="L5649" href="#L5649">5649</a> <strong class="jxr_keyword">var</strong> sb = <strong class="jxr_keyword">new</strong> StringBuilder(length);
+<a class="jxr_linenumber" name="L5650" href="#L5650">5650</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < length; i++) {
+<a class="jxr_linenumber" name="L5651" href="#L5651">5651</a> sb.append((<strong class="jxr_keyword">char</strong>)(32 + RANDOM.nextInt(95))); <em class="jxr_comment">// 95 printable ASCII chars (32-126)</em>
+<a class="jxr_linenumber" name="L5652" href="#L5652">5652</a> }
+<a class="jxr_linenumber" name="L5653" href="#L5653">5653</a> <strong class="jxr_keyword">return</strong> sb.toString();
+<a class="jxr_linenumber" name="L5654" href="#L5654">5654</a> }
+<a class="jxr_linenumber" name="L5655" href="#L5655">5655</a>
+<a class="jxr_linenumber" name="L5656" href="#L5656">5656</a> <em class="jxr_comment">//-----------------------------------------------------------------------------------------------------------------</em>
+<a class="jxr_linenumber" name="L5657" href="#L5657">5657</a> <em class="jxr_comment">// String joining and splitting methods</em>
+<a class="jxr_linenumber" name="L5658" href="#L5658">5658</a> <em class="jxr_comment">//-----------------------------------------------------------------------------------------------------------------</em>
+<a class="jxr_linenumber" name="L5659" href="#L5659">5659</a>
+<a class="jxr_linenumber" name="L5660" href="#L5660">5660</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L5661" href="#L5661">5661</a> <em class="jxr_javadoccomment"> * Generates a random numeric string of the specified length.</em>
+<a class="jxr_linenumber" name="L5662" href="#L5662">5662</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5663" href="#L5663">5663</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L5664" href="#L5664">5664</a> <em class="jxr_javadoccomment"> * Characters are composed of digits (0-9).</em>
+<a class="jxr_linenumber" name="L5665" href="#L5665">5665</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5666" href="#L5666">5666</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
+<a class="jxr_linenumber" name="L5667" href="#L5667">5667</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
+<a class="jxr_linenumber" name="L5668" href="#L5668">5668</a> <em class="jxr_javadoccomment"> * randomNumeric(<jk>6</jk>); <jc>// "123456"</jc></em>
+<a class="jxr_linenumber" name="L5669" href="#L5669">5669</a> <em class="jxr_javadoccomment"> * </p></em>
+<a class="jxr_linenumber" name="L5670" href="#L5670">5670</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5671" href="#L5671">5671</a> <em class="jxr_javadoccomment"> * @param length The length of the generated string.</em>
+<a class="jxr_linenumber" name="L5672" href="#L5672">5672</a> <em class="jxr_javadoccomment"> * @return A new random numeric string.</em>
+<a class="jxr_linenumber" name="L5673" href="#L5673">5673</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L5674" href="#L5674">5674</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String randomNumeric(<strong class="jxr_keyword">int</strong> length) {
+<a class="jxr_linenumber" name="L5675" href="#L5675">5675</a> <strong class="jxr_keyword">if</strong> (length < 0)
+<a class="jxr_linenumber" name="L5676" href="#L5676">5676</a> <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> IllegalArgumentException(<span class="jxr_string">"Length must be non-negative: "</span> + length);
+<a class="jxr_linenumber" name="L5677" href="#L5677">5677</a> <strong class="jxr_keyword">var</strong> sb = <strong class="jxr_keyword">new</strong> StringBuilder(length);
+<a class="jxr_linenumber" name="L5678" href="#L5678">5678</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < length; i++) {
+<a class="jxr_linenumber" name="L5679" href="#L5679">5679</a> sb.append((<strong class="jxr_keyword">char</strong>)('0' + RANDOM.nextInt(10)));
+<a class="jxr_linenumber" name="L5680" href="#L5680">5680</a> }
+<a class="jxr_linenumber" name="L5681" href="#L5681">5681</a> <strong class="jxr_keyword">return</strong> sb.toString();
+<a class="jxr_linenumber" name="L5682" href="#L5682">5682</a> }
+<a class="jxr_linenumber" name="L5683" href="#L5683">5683</a>
+<a class="jxr_linenumber" name="L5684" href="#L5684">5684</a> <em class="jxr_comment">//-----------------------------------------------------------------------------------------------------------------</em>
+<a class="jxr_linenumber" name="L5685" href="#L5685">5685</a> <em class="jxr_comment">// String cleaning and sanitization methods</em>
+<a class="jxr_linenumber" name="L5686" href="#L5686">5686</a> <em class="jxr_comment">//-----------------------------------------------------------------------------------------------------------------</em>
+<a class="jxr_linenumber" name="L5687" href="#L5687">5687</a>
+<a class="jxr_linenumber" name="L5688" href="#L5688">5688</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L5689" href="#L5689">5689</a> <em class="jxr_javadoccomment"> * Generates a random string of the specified length using characters from the given character set.</em>
+<a class="jxr_linenumber" name="L5690" href="#L5690">5690</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5691" href="#L5691">5691</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L5692" href="#L5692">5692</a> <em class="jxr_javadoccomment"> * Each character in the generated string is randomly selected from the provided character set.</em>
+<a class="jxr_linenumber" name="L5693" href="#L5693">5693</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5694" href="#L5694">5694</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
+<a class="jxr_linenumber" name="L5695" href="#L5695">5695</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
+<a class="jxr_linenumber" name="L5696" href="#L5696">5696</a> <em class="jxr_javadoccomment"> * randomString(<jk>5</jk>, <js>"ABC"</js>); <jc>// "BACAB"</jc></em>
+<a class="jxr_linenumber" name="L5697" href="#L5697">5697</a> <em class="jxr_javadoccomment"> * </p></em>
+<a class="jxr_linenumber" name="L5698" href="#L5698">5698</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5699" href="#L5699">5699</a> <em class="jxr_javadoccomment"> * @param length The length of the generated string.</em>
+<a class="jxr_linenumber" name="L5700" href="#L5700">5700</a> <em class="jxr_javadoccomment"> * @param chars The character set to use. Must not be null or empty.</em>
+<a class="jxr_linenumber" name="L5701" href="#L5701">5701</a> <em class="jxr_javadoccomment"> * @return A new random string.</em>
+<a class="jxr_linenumber" name="L5702" href="#L5702">5702</a> <em class="jxr_javadoccomment"> * @throws IllegalArgumentException If chars is null or empty, or length is negative.</em>
+<a class="jxr_linenumber" name="L5703" href="#L5703">5703</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L5704" href="#L5704">5704</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String randomString(<strong class="jxr_keyword">int</strong> length, String chars) {
+<a class="jxr_linenumber" name="L5705" href="#L5705">5705</a> <strong class="jxr_keyword">if</strong> (length < 0)
+<a class="jxr_linenumber" name="L5706" href="#L5706">5706</a> <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> IllegalArgumentException(<span class="jxr_string">"Length must be non-negative: "</span> + length);
+<a class="jxr_linenumber" name="L5707" href="#L5707">5707</a> <strong class="jxr_keyword">if</strong> (chars == <strong class="jxr_keyword">null</strong> || chars.isEmpty())
+<a class="jxr_linenumber" name="L5708" href="#L5708">5708</a> <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> IllegalArgumentException(<span class="jxr_string">"Character set must not be null or empty"</span>);
+<a class="jxr_linenumber" name="L5709" href="#L5709">5709</a> <strong class="jxr_keyword">var</strong> sb = <strong class="jxr_keyword">new</strong> StringBuilder(length);
+<a class="jxr_linenumber" name="L5710" href="#L5710">5710</a> <strong class="jxr_keyword">var</strong> charsLen = chars.length();
+<a class="jxr_linenumber" name="L5711" href="#L5711">5711</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < length; i++) {
+<a class="jxr_linenumber" name="L5712" href="#L5712">5712</a> sb.append(chars.charAt(RANDOM.nextInt(charsLen)));
+<a class="jxr_linenumber" name="L5713" href="#L5713">5713</a> }
+<a class="jxr_linenumber" name="L5714" href="#L5714">5714</a> <strong class="jxr_keyword">return</strong> sb.toString();
+<a class="jxr_linenumber" name="L5715" href="#L5715">5715</a> }
+<a class="jxr_linenumber" name="L5716" href="#L5716">5716</a>
+<a class="jxr_linenumber" name="L5717" href="#L5717">5717</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L5718" href="#L5718">5718</a> <em class="jxr_javadoccomment"> * Calculates a simple readability score for a string.</em>
+<a class="jxr_linenumber" name="L5719" href="#L5719">5719</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5720" href="#L5720">5720</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L5721" href="#L5721">5721</a> <em class="jxr_javadoccomment"> * Uses a simplified Flesch Reading Ease-like formula based on:</em>
+<a class="jxr_linenumber" name="L5722" href="#L5722">5722</a> <em class="jxr_javadoccomment"> * <ul></em>
+<a class="jxr_linenumber" name="L5723" href="#L5723">5723</a> <em class="jxr_javadoccomment"> * <li>Average words per sentence</li></em>
+<a class="jxr_linenumber" name="L5724" href="#L5724">5724</a> <em class="jxr_javadoccomment"> * <li>Average syllables per word (estimated)</li></em>
+<a class="jxr_linenumber" name="L5725" href="#L5725">5725</a> <em class="jxr_javadoccomment"> * </ul></em>
+<a class="jxr_linenumber" name="L5726" href="#L5726">5726</a> <em class="jxr_javadoccomment"> * Returns a score from 0-100, where higher scores indicate easier reading.</em>
+<a class="jxr_linenumber" name="L5727" href="#L5727">5727</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5728" href="#L5728">5728</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
+<a class="jxr_linenumber" name="L5729" href="#L5729">5729</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
+<a class="jxr_linenumber" name="L5730" href="#L5730">5730</a> <em class="jxr_javadoccomment"> * readabilityScore(<js>"The cat sat."</js>); <jc>// Higher score (simple)</jc></em>
+<a class="jxr_linenumber" name="L5731" href="#L5731">5731</a> <em class="jxr_javadoccomment"> * readabilityScore(<js>"The sophisticated..."</js>); <jc>// Lower score (complex)</jc></em>
+<a class="jxr_linenumber" name="L5732" href="#L5732">5732</a> <em class="jxr_javadoccomment"> * </p></em>
+<a class="jxr_linenumber" name="L5733" href="#L5733">5733</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5734" href="#L5734">5734</a> <em class="jxr_javadoccomment"> * @param str The string to analyze. Can be <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L5735" href="#L5735">5735</a> <em class="jxr_javadoccomment"> * @return A readability score from 0-100, or <c>0.0</c> if the string is <jk>null</jk> or empty.</em>
+<a class="jxr_linenumber" name="L5736" href="#L5736">5736</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L5737" href="#L5737">5737</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">double</strong> readabilityScore(String str) {
+<a class="jxr_linenumber" name="L5738" href="#L5738">5738</a> <strong class="jxr_keyword">if</strong> (isEmpty(str))
+<a class="jxr_linenumber" name="L5739" href="#L5739">5739</a> <strong class="jxr_keyword">return</strong> 0.0;
+<a class="jxr_linenumber" name="L5740" href="#L5740">5740</a>
+<a class="jxr_linenumber" name="L5741" href="#L5741">5741</a> <strong class="jxr_keyword">var</strong> words = extractWords(str);
+<a class="jxr_linenumber" name="L5742" href="#L5742">5742</a> <strong class="jxr_keyword">if</strong> (words.isEmpty())
+<a class="jxr_linenumber" name="L5743" href="#L5743">5743</a> <strong class="jxr_keyword">return</strong> 0.0;
+<a class="jxr_linenumber" name="L5744" href="#L5744">5744</a>
+<a class="jxr_linenumber" name="L5745" href="#L5745">5745</a> <em class="jxr_comment">// Count sentences (ending with . ! ?)</em>
+<a class="jxr_linenumber" name="L5746" href="#L5746">5746</a> <strong class="jxr_keyword">var</strong> sentenceCount = 0;
+<a class="jxr_linenumber" name="L5747" href="#L5747">5747</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < str.length(); i++) {
+<a class="jxr_linenumber" name="L5748" href="#L5748">5748</a> <strong class="jxr_keyword">var</strong> c = str.charAt(i);
+<a class="jxr_linenumber" name="L5749" href="#L5749">5749</a> <strong class="jxr_keyword">if</strong> (c == '.' || c == '!' || c == '?') {
+<a class="jxr_linenumber" name="L5750" href="#L5750">5750</a> sentenceCount++;
+<a class="jxr_linenumber" name="L5751" href="#L5751">5751</a> }
+<a class="jxr_linenumber" name="L5752" href="#L5752">5752</a> }
+<a class="jxr_linenumber" name="L5753" href="#L5753">5753</a> <strong class="jxr_keyword">if</strong> (sentenceCount == 0)
+<a class="jxr_linenumber" name="L5754" href="#L5754">5754</a> sentenceCount = 1; <em class="jxr_comment">// At least one sentence</em>
+<a class="jxr_linenumber" name="L5755" href="#L5755">5755</a>
+<a class="jxr_linenumber" name="L5756" href="#L5756">5756</a> <em class="jxr_comment">// Calculate average words per sentence</em>
+<a class="jxr_linenumber" name="L5757" href="#L5757">5757</a> <strong class="jxr_keyword">var</strong> avgWordsPerSentence = (<strong class="jxr_keyword">double</strong>)words.size() / sentenceCount;
+<a class="jxr_linenumber" name="L5758" href="#L5758">5758</a>
+<a class="jxr_linenumber" name="L5759" href="#L5759">5759</a> <em class="jxr_comment">// Estimate average syllables per word (simplified: count vowel groups)</em>
+<a class="jxr_linenumber" name="L5760" href="#L5760">5760</a> <strong class="jxr_keyword">var</strong> totalSyllables = 0;
+<a class="jxr_linenumber" name="L5761" href="#L5761">5761</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> word : words) {
+<a class="jxr_linenumber" name="L5762" href="#L5762">5762</a> totalSyllables += estimateSyllables(word);
+<a class="jxr_linenumber" name="L5763" href="#L5763">5763</a> }
+<a class="jxr_linenumber" name="L5764" href="#L5764">5764</a> <strong class="jxr_keyword">var</strong> avgSyllablesPerWord = (<strong class="jxr_keyword">double</strong>)totalSyllables / words.size();
<a class="jxr_linenumber" name="L5765" href="#L5765">5765</a>
-<a class="jxr_linenumber" name="L5766" href="#L5766">5766</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L5767" href="#L5767">5767</a> <em class="jxr_javadoccomment"> * Converts an arbitrary object to a readable string format suitable for debugging and testing.</em>
-<a class="jxr_linenumber" name="L5768" href="#L5768">5768</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5769" href="#L5769">5769</a> <em class="jxr_javadoccomment"> * <p>This method provides intelligent formatting for various Java types, recursively processing</em>
-<a class="jxr_linenumber" name="L5770" href="#L5770">5770</a> <em class="jxr_javadoccomment"> * nested structures to create human-readable representations. It's extensively used throughout</em>
-<a class="jxr_linenumber" name="L5771" href="#L5771">5771</a> <em class="jxr_javadoccomment"> * the Juneau framework for test assertions and debugging output.</p></em>
-<a class="jxr_linenumber" name="L5772" href="#L5772">5772</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5773" href="#L5773">5773</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Type-Specific Formatting:</h5></em>
-<a class="jxr_linenumber" name="L5774" href="#L5774">5774</a> <em class="jxr_javadoccomment"> * <ul></em>
-<a class="jxr_linenumber" name="L5775" href="#L5775">5775</a> <em class="jxr_javadoccomment"> * <li><b>null:</b> Returns <js>null</js></li></em>
-<a class="jxr_linenumber" name="L5776" href="#L5776">5776</a> <em class="jxr_javadoccomment"> * <li><b>Optional:</b> Recursively formats the contained value (or <js>null</js> if empty)</li></em>
-<a class="jxr_linenumber" name="L5777" href="#L5777">5777</a> <em class="jxr_javadoccomment"> * <li><b>Collections:</b> Formats as <js>"[item1,item2,item3]"</js> with comma-separated elements</li></em>
-<a class="jxr_linenumber" name="L5778" href="#L5778">5778</a> <em class="jxr_javadoccomment"> * <li><b>Maps:</b> Formats as <js>"{key1=value1,key2=value2}"</js> with comma-separated entries</li></em>
-<a class="jxr_linenumber" name="L5779" href="#L5779">5779</a> <em class="jxr_javadoccomment"> * <li><b>Map.Entry:</b> Formats as <js>"key=value"</js></li></em>
-<a class="jxr_linenumber" name="L5780" href="#L5780">5780</a> <em class="jxr_javadoccomment"> * <li><b>Arrays:</b> Converts to list format <js>"[item1,item2,item3]"</js></li></em>
-<a class="jxr_linenumber" name="L5781" href="#L5781">5781</a> <em class="jxr_javadoccomment"> * <li><b>Iterables/Iterators/Enumerations:</b> Converts to list and formats recursively</li></em>
-<a class="jxr_linenumber" name="L5782" href="#L5782">5782</a> <em class="jxr_javadoccomment"> * <li><b>GregorianCalendar:</b> Formats as ISO instant timestamp</li></em>
-<a class="jxr_linenumber" name="L5783" href="#L5783">5783</a> <em class="jxr_javadoccomment"> * <li><b>Date:</b> Formats as ISO instant string (e.g., <js>"2023-12-25T10:30:00Z"</js>)</li></em>
-<a class="jxr_linenumber" name="L5784" href="#L5784">5784</a> <em class="jxr_javadoccomment"> * <li><b>InputStream:</b> Converts to hexadecimal representation</li></em>
-<a class="jxr_linenumber" name="L5785" href="#L5785">5785</a> <em class="jxr_javadoccomment"> * <li><b>Reader:</b> Reads content and returns as string</li></em>
-<a class="jxr_linenumber" name="L5786" href="#L5786">5786</a> <em class="jxr_javadoccomment"> * <li><b>File:</b> Reads file content and returns as string</li></em>
-<a class="jxr_linenumber" name="L5787" href="#L5787">5787</a> <em class="jxr_javadoccomment"> * <li><b>byte[]:</b> Converts to hexadecimal representation</li></em>
-<a class="jxr_linenumber" name="L5788" href="#L5788">5788</a> <em class="jxr_javadoccomment"> * <li><b>Enum:</b> Returns the enum name via {@link Enum#name()}</li></em>
-<a class="jxr_linenumber" name="L5789" href="#L5789">5789</a> <em class="jxr_javadoccomment"> * <li><b>All other types:</b> Uses {@link Object#toString()}</li></em>
-<a class="jxr_linenumber" name="L5790" href="#L5790">5790</a> <em class="jxr_javadoccomment"> * </ul></em>
-<a class="jxr_linenumber" name="L5791" href="#L5791">5791</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5792" href="#L5792">5792</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Examples:</h5></em>
-<a class="jxr_linenumber" name="L5793" href="#L5793">5793</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L5794" href="#L5794">5794</a> <em class="jxr_javadoccomment"> * <jc>// Collections</jc></em>
-<a class="jxr_linenumber" name="L5795" href="#L5795">5795</a> <em class="jxr_javadoccomment"> * readable(List.of("a", "b", "c")) <jc>// Returns: "[a,b,c]"</jc></em>
-<a class="jxr_linenumber" name="L5796" href="#L5796">5796</a> <em class="jxr_javadoccomment"> * readable(Set.of(1, 2, 3)) <jc>// Returns: "[1,2,3]" (order may vary)</jc></em>
-<a class="jxr_linenumber" name="L5797" href="#L5797">5797</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5798" href="#L5798">5798</a> <em class="jxr_javadoccomment"> * <jc>// Maps</jc></em>
-<a class="jxr_linenumber" name="L5799" href="#L5799">5799</a> <em class="jxr_javadoccomment"> * readable(Map.of("foo", "bar", "baz", 123)) <jc>// Returns: "{foo=bar,baz=123}"</jc></em>
+<a class="jxr_linenumber" name="L5766" href="#L5766">5766</a> <em class="jxr_comment">// Simplified Flesch Reading Ease formula</em>
+<a class="jxr_linenumber" name="L5767" href="#L5767">5767</a> <em class="jxr_comment">// Score = 206.835 - (1.015 * ASL) - (84.6 * ASW)</em>
+<a class="jxr_linenumber" name="L5768" href="#L5768">5768</a> <em class="jxr_comment">// Where ASL = average sentence length (words), ASW = average syllables per word</em>
+<a class="jxr_linenumber" name="L5769" href="#L5769">5769</a> <strong class="jxr_keyword">var</strong> score = 206.835 - (1.015 * avgWordsPerSentence) - (84.6 * avgSyllablesPerWord);
+<a class="jxr_linenumber" name="L5770" href="#L5770">5770</a>
+<a class="jxr_linenumber" name="L5771" href="#L5771">5771</a> <em class="jxr_comment">// Clamp to 0-100 range</em>
+<a class="jxr_linenumber" name="L5772" href="#L5772">5772</a> <strong class="jxr_keyword">return</strong> Math.max(0.0, Math.min(100.0, score));
+<a class="jxr_linenumber" name="L5773" href="#L5773">5773</a> }
+<a class="jxr_linenumber" name="L5774" href="#L5774">5774</a>
+<a class="jxr_linenumber" name="L5775" href="#L5775">5775</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L5776" href="#L5776">5776</a> <em class="jxr_javadoccomment"> * Converts an arbitrary object to a readable string format suitable for debugging and testing.</em>
+<a class="jxr_linenumber" name="L5777" href="#L5777">5777</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5778" href="#L5778">5778</a> <em class="jxr_javadoccomment"> * <p>This method provides intelligent formatting for various Java types, recursively processing</em>
+<a class="jxr_linenumber" name="L5779" href="#L5779">5779</a> <em class="jxr_javadoccomment"> * nested structures to create human-readable representations. It's extensively used throughout</em>
+<a class="jxr_linenumber" name="L5780" href="#L5780">5780</a> <em class="jxr_javadoccomment"> * the Juneau framework for test assertions and debugging output.</p></em>
+<a class="jxr_linenumber" name="L5781" href="#L5781">5781</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5782" href="#L5782">5782</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Type-Specific Formatting:</h5></em>
+<a class="jxr_linenumber" name="L5783" href="#L5783">5783</a> <em class="jxr_javadoccomment"> * <ul></em>
+<a class="jxr_linenumber" name="L5784" href="#L5784">5784</a> <em class="jxr_javadoccomment"> * <li><b>null:</b> Returns <js>null</js></li></em>
+<a class="jxr_linenumber" name="L5785" href="#L5785">5785</a> <em class="jxr_javadoccomment"> * <li><b>Optional:</b> Recursively formats the contained value (or <js>null</js> if empty)</li></em>
+<a class="jxr_linenumber" name="L5786" href="#L5786">5786</a> <em class="jxr_javadoccomment"> * <li><b>Collections:</b> Formats as <js>"[item1,item2,item3]"</js> with comma-separated elements</li></em>
+<a class="jxr_linenumber" name="L5787" href="#L5787">5787</a> <em class="jxr_javadoccomment"> * <li><b>Maps:</b> Formats as <js>"{key1=value1,key2=value2}"</js> with comma-separated entries</li></em>
+<a class="jxr_linenumber" name="L5788" href="#L5788">5788</a> <em class="jxr_javadoccomment"> * <li><b>Map.Entry:</b> Formats as <js>"key=value"</js></li></em>
+<a class="jxr_linenumber" name="L5789" href="#L5789">5789</a> <em class="jxr_javadoccomment"> * <li><b>Arrays:</b> Converts to list format <js>"[item1,item2,item3]"</js></li></em>
+<a class="jxr_linenumber" name="L5790" href="#L5790">5790</a> <em class="jxr_javadoccomment"> * <li><b>Iterables/Iterators/Enumerations:</b> Converts to list and formats recursively</li></em>
+<a class="jxr_linenumber" name="L5791" href="#L5791">5791</a> <em class="jxr_javadoccomment"> * <li><b>GregorianCalendar:</b> Formats as ISO instant timestamp</li></em>
+<a class="jxr_linenumber" name="L5792" href="#L5792">5792</a> <em class="jxr_javadoccomment"> * <li><b>Date:</b> Formats as ISO instant string (e.g., <js>"2023-12-25T10:30:00Z"</js>)</li></em>
+<a class="jxr_linenumber" name="L5793" href="#L5793">5793</a> <em class="jxr_javadoccomment"> * <li><b>InputStream:</b> Converts to hexadecimal representation</li></em>
+<a class="jxr_linenumber" name="L5794" href="#L5794">5794</a> <em class="jxr_javadoccomment"> * <li><b>Reader:</b> Reads content and returns as string</li></em>
+<a class="jxr_linenumber" name="L5795" href="#L5795">5795</a> <em class="jxr_javadoccomment"> * <li><b>File:</b> Reads file content and returns as string</li></em>
+<a class="jxr_linenumber" name="L5796" href="#L5796">5796</a> <em class="jxr_javadoccomment"> * <li><b>byte[]:</b> Converts to hexadecimal representation</li></em>
+<a class="jxr_linenumber" name="L5797" href="#L5797">5797</a> <em class="jxr_javadoccomment"> * <li><b>Enum:</b> Returns the enum name via {@link Enum#name()}</li></em>
+<a class="jxr_linenumber" name="L5798" href="#L5798">5798</a> <em class="jxr_javadoccomment"> * <li><b>All other types:</b> Uses {@link Object#toString()}</li></em>
+<a class="jxr_linenumber" name="L5799" href="#L5799">5799</a> <em class="jxr_javadoccomment"> * </ul></em>
<a class="jxr_linenumber" name="L5800" href="#L5800">5800</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5801" href="#L5801">5801</a> <em class="jxr_javadoccomment"> * <jc>// Arrays</jc></em>
-<a class="jxr_linenumber" name="L5802" href="#L5802">5802</a> <em class="jxr_javadoccomment"> * readable(ints(1, 2, 3)) <jc>// Returns: "[1,2,3]"</jc></em>
-<a class="jxr_linenumber" name="L5803" href="#L5803">5803</a> <em class="jxr_javadoccomment"> * readable(new String[]{"a", "b"}) <jc>// Returns: "[a,b]"</jc></em>
-<a class="jxr_linenumber" name="L5804" href="#L5804">5804</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5805" href="#L5805">5805</a> <em class="jxr_javadoccomment"> * <jc>// Nested structures</jc></em>
-<a class="jxr_linenumber" name="L5806" href="#L5806">5806</a> <em class="jxr_javadoccomment"> * readable(List.of(Map.of("x", 1), Set.of("a", "b"))) <jc>// Returns: "[{x=1},[a,b]]"</jc></em>
-<a class="jxr_linenumber" name="L5807" href="#L5807">5807</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5808" href="#L5808">5808</a> <em class="jxr_javadoccomment"> * <jc>// Special types</jc></em>
-<a class="jxr_linenumber" name="L5809" href="#L5809">5809</a> <em class="jxr_javadoccomment"> * readable(Optional.of("test")) <jc>// Returns: "test"</jc></em>
-<a class="jxr_linenumber" name="L5810" href="#L5810">5810</a> <em class="jxr_javadoccomment"> * readable(Optional.empty()) <jc>// Returns: null</jc></em>
-<a class="jxr_linenumber" name="L5811" href="#L5811">5811</a> <em class="jxr_javadoccomment"> * readable(new Date(1640995200000L)) <jc>// Returns: "2022-01-01T00:00:00Z"</jc></em>
-<a class="jxr_linenumber" name="L5812" href="#L5812">5812</a> <em class="jxr_javadoccomment"> * readable(MyEnum.FOO) <jc>// Returns: "FOO"</jc></em>
-<a class="jxr_linenumber" name="L5813" href="#L5813">5813</a> <em class="jxr_javadoccomment"> * </p></em>
-<a class="jxr_linenumber" name="L5814" href="#L5814">5814</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5815" href="#L5815">5815</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Recursive Processing:</h5></em>
-<a class="jxr_linenumber" name="L5816" href="#L5816">5816</a> <em class="jxr_javadoccomment"> * <p>The method recursively processes nested structures, so complex objects containing</em>
-<a class="jxr_linenumber" name="L5817" href="#L5817">5817</a> <em class="jxr_javadoccomment"> * collections, maps, and arrays are fully flattened into readable format. This makes it</em>
-<a class="jxr_linenumber" name="L5818" href="#L5818">5818</a> <em class="jxr_javadoccomment"> * ideal for test assertions where you need to compare complex object structures.</p></em>
-<a class="jxr_linenumber" name="L5819" href="#L5819">5819</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5820" href="#L5820">5820</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Error Handling:</h5></em>
-<a class="jxr_linenumber" name="L5821" href="#L5821">5821</a> <em class="jxr_javadoccomment"> * <p>IO operations (reading files, streams) are wrapped in safe() calls, converting</em>
-<a class="jxr_linenumber" name="L5822" href="#L5822">5822</a> <em class="jxr_javadoccomment"> * any exceptions to RuntimeExceptions. Binary data (InputStreams, byte arrays) is</em>
-<a class="jxr_linenumber" name="L5823" href="#L5823">5823</a> <em class="jxr_javadoccomment"> * converted to hexadecimal representation for readability.</p></em>
-<a class="jxr_linenumber" name="L5824" href="#L5824">5824</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5825" href="#L5825">5825</a> <em class="jxr_javadoccomment"> * @param o The object to convert to readable format. Can be <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L5826" href="#L5826">5826</a> <em class="jxr_javadoccomment"> * @return A readable string representation of the object, or <jk>null</jk> if the input was <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L5827" href="#L5827">5827</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L5828" href="#L5828">5828</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String readable(Object o) {
-<a class="jxr_linenumber" name="L5829" href="#L5829">5829</a> <strong class="jxr_keyword">if</strong> (o == <strong class="jxr_keyword">null</strong>)
-<a class="jxr_linenumber" name="L5830" href="#L5830">5830</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
-<a class="jxr_linenumber" name="L5831" href="#L5831">5831</a> <strong class="jxr_keyword">if</strong> (o instanceof Optional<?> o2)
-<a class="jxr_linenumber" name="L5832" href="#L5832">5832</a> <strong class="jxr_keyword">return</strong> readable(o2.orElse(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L5833" href="#L5833">5833</a> <strong class="jxr_keyword">if</strong> (o instanceof Collection<?> o2)
-<a class="jxr_linenumber" name="L5834" href="#L5834">5834</a> <strong class="jxr_keyword">return</strong> o2.stream().map(StringUtils::readable).collect(Collectors.joining(<span class="jxr_string">","</span>, <span class="jxr_string">"["</span>, <span class="jxr_string">"]"</span>));
-<a class="jxr_linenumber" name="L5835" href="#L5835">5835</a> <strong class="jxr_keyword">if</strong> (o instanceof Map<?,?> o2)
-<a class="jxr_linenumber" name="L5836" href="#L5836">5836</a> <strong class="jxr_keyword">return</strong> o2.entrySet().stream().map(StringUtils::readable).collect(Collectors.joining(<span class="jxr_string">","</span>, <span class="jxr_string">"{"</span>, <span class="jxr_string">"}"</span>));
-<a class="jxr_linenumber" name="L5837" href="#L5837">5837</a> <strong class="jxr_keyword">if</strong> (o instanceof Map.Entry<?,?> o2)
-<a class="jxr_linenumber" name="L5838" href="#L5838">5838</a> <strong class="jxr_keyword">return</strong> readable(o2.getKey()) + '=' + readable(o2.getValue());
-<a class="jxr_linenumber" name="L5839" href="#L5839">5839</a> <strong class="jxr_keyword">if</strong> (o instanceof Iterable<?> o2)
-<a class="jxr_linenumber" name="L5840" href="#L5840">5840</a> <strong class="jxr_keyword">return</strong> readable(toList(o2));
-<a class="jxr_linenumber" name="L5841" href="#L5841">5841</a> <strong class="jxr_keyword">if</strong> (o instanceof Iterator<?> o2)
-<a class="jxr_linenumber" name="L5842" href="#L5842">5842</a> <strong class="jxr_keyword">return</strong> readable(toList(o2));
-<a class="jxr_linenumber" name="L5843" href="#L5843">5843</a> <strong class="jxr_keyword">if</strong> (o instanceof Enumeration<?> o2)
-<a class="jxr_linenumber" name="L5844" href="#L5844">5844</a> <strong class="jxr_keyword">return</strong> readable(toList(o2));
-<a class="jxr_linenumber" name="L5845" href="#L5845">5845</a> <strong class="jxr_keyword">if</strong> (o instanceof GregorianCalendar o2)
-<a class="jxr_linenumber" name="L5846" href="#L5846">5846</a> <strong class="jxr_keyword">return</strong> o2.toZonedDateTime().format(DateTimeFormatter.ISO_INSTANT);
-<a class="jxr_linenumber" name="L5847" href="#L5847">5847</a> <strong class="jxr_keyword">if</strong> (o instanceof Date o2)
-<a class="jxr_linenumber" name="L5848" href="#L5848">5848</a> <strong class="jxr_keyword">return</strong> o2.toInstant().toString();
-<a class="jxr_linenumber" name="L5849" href="#L5849">5849</a> <strong class="jxr_keyword">if</strong> (o instanceof InputStream o2)
-<a class="jxr_linenumber" name="L5850" href="#L5850">5850</a> <strong class="jxr_keyword">return</strong> toHex(o2);
-<a class="jxr_linenumber" name="L5851" href="#L5851">5851</a> <strong class="jxr_keyword">if</strong> (o instanceof Reader o2)
-<a class="jxr_linenumber" name="L5852" href="#L5852">5852</a> <strong class="jxr_keyword">return</strong> safe(() -> read(o2));
-<a class="jxr_linenumber" name="L5853" href="#L5853">5853</a> <strong class="jxr_keyword">if</strong> (o instanceof File o2)
-<a class="jxr_linenumber" name="L5854" href="#L5854">5854</a> <strong class="jxr_keyword">return</strong> safe(() -> read(o2));
-<a class="jxr_linenumber" name="L5855" href="#L5855">5855</a> <strong class="jxr_keyword">if</strong> (o instanceof byte[] o2)
-<a class="jxr_linenumber" name="L5856" href="#L5856">5856</a> <strong class="jxr_keyword">return</strong> toHex(o2);
-<a class="jxr_linenumber" name="L5857" href="#L5857">5857</a> <strong class="jxr_keyword">if</strong> (o instanceof Enum o2)
-<a class="jxr_linenumber" name="L5858" href="#L5858">5858</a> <strong class="jxr_keyword">return</strong> o2.name();
-<a class="jxr_linenumber" name="L5859" href="#L5859">5859</a> <strong class="jxr_keyword">if</strong> (o instanceof Class o2)
-<a class="jxr_linenumber" name="L5860" href="#L5860">5860</a> <strong class="jxr_keyword">return</strong> cns(o2);
-<a class="jxr_linenumber" name="L5861" href="#L5861">5861</a> <strong class="jxr_keyword">if</strong> (o instanceof Executable o2) {
-<a class="jxr_linenumber" name="L5862" href="#L5862">5862</a> <strong class="jxr_keyword">var</strong> sb = <strong class="jxr_keyword">new</strong> StringBuilder(64);
-<a class="jxr_linenumber" name="L5863" href="#L5863">5863</a> sb.append(o2 instanceof Constructor ? cns(o2.getDeclaringClass()) : o2.getName()).append('(');
-<a class="jxr_linenumber" name="L5864" href="#L5864">5864</a> <strong class="jxr_keyword">var</strong> pt = o2.getParameterTypes();
-<a class="jxr_linenumber" name="L5865" href="#L5865">5865</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < pt.length; i++) {
-<a class="jxr_linenumber" name="L5866" href="#L5866">5866</a> <strong class="jxr_keyword">if</strong> (i > 0)
-<a class="jxr_linenumber" name="L5867" href="#L5867">5867</a> sb.append(',');
-<a class="jxr_linenumber" name="L5868" href="#L5868">5868</a> sb.append(cns(pt[i]));
-<a class="jxr_linenumber" name="L5869" href="#L5869">5869</a> }
-<a class="jxr_linenumber" name="L5870" href="#L5870">5870</a> sb.append(')');
-<a class="jxr_linenumber" name="L5871" href="#L5871">5871</a> <strong class="jxr_keyword">return</strong> sb.toString();
-<a class="jxr_linenumber" name="L5872" href="#L5872">5872</a> }
-<a class="jxr_linenumber" name="L5873" href="#L5873">5873</a> <strong class="jxr_keyword">if</strong> (isArray(o)) {
-<a class="jxr_linenumber" name="L5874" href="#L5874">5874</a> <strong class="jxr_keyword">var</strong> l = list();
-<a class="jxr_linenumber" name="L5875" href="#L5875">5875</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < Array.getLength(o); i++) {
-<a class="jxr_linenumber" name="L5876" href="#L5876">5876</a> l.add(Array.get(o, i));
-<a class="jxr_linenumber" name="L5877" href="#L5877">5877</a> }
-<a class="jxr_linenumber" name="L5878" href="#L5878">5878</a> <strong class="jxr_keyword">return</strong> readable(l);
-<a class="jxr_linenumber" name="L5879" href="#L5879">5879</a> }
-<a class="jxr_linenumber" name="L5880" href="#L5880">5880</a> <strong class="jxr_keyword">return</strong> o.toString();
-<a class="jxr_linenumber" name="L5881" href="#L5881">5881</a> }
-<a class="jxr_linenumber" name="L5882" href="#L5882">5882</a>
-<a class="jxr_linenumber" name="L5883" href="#L5883">5883</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L5884" href="#L5884">5884</a> <em class="jxr_javadoccomment"> * Removes all occurrences of a substring from a string.</em>
-<a class="jxr_linenumber" name="L5885" href="#L5885">5885</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5886" href="#L5886">5886</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
-<a class="jxr_linenumber" name="L5887" href="#L5887">5887</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L5888" href="#L5888">5888</a> <em class="jxr_javadoccomment"> * remove(<jk>null</jk>, <js>"x"</js>); <jc>// null</jc></em>
-<a class="jxr_linenumber" name="L5889" href="#L5889">5889</a> <em class="jxr_javadoccomment"> * remove(<js>"hello"</js>, <jk>null</jk>); <jc>// "hello"</jc></em>
-<a class="jxr_linenumber" name="L5890" href="#L5890">5890</a> <em class="jxr_javadoccomment"> * remove(<js>"hello world"</js>, <js>"o"</js>); <jc>// "hell wrld"</jc></em>
-<a class="jxr_linenumber" name="L5891" href="#L5891">5891</a> <em class="jxr_javadoccomment"> * remove(<js>"hello world"</js>, <js>"xyz"</js>); <jc>// "hello world"</jc></em>
-<a class="jxr_linenumber" name="L5892" href="#L5892">5892</a> <em class="jxr_javadoccomment"> * </p></em>
-<a class="jxr_linenumber" name="L5893" href="#L5893">5893</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5894" href="#L5894">5894</a> <em class="jxr_javadoccomment"> * @param str The string to process.</em>
-<a class="jxr_linenumber" name="L5895" href="#L5895">5895</a> <em class="jxr_javadoccomment"> * @param remove The substring to remove.</em>
-<a class="jxr_linenumber" name="L5896" href="#L5896">5896</a> <em class="jxr_javadoccomment"> * @return The string with all occurrences of the substring removed, or <jk>null</jk> if input is <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L5897" href="#L5897">5897</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L5898" href="#L5898">5898</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String remove(String str, String remove) {
-<a class="jxr_linenumber" name="L5899" href="#L5899">5899</a> <strong class="jxr_keyword">if</strong> (isEmpty(str) || isEmpty(remove))
-<a class="jxr_linenumber" name="L5900" href="#L5900">5900</a> <strong class="jxr_keyword">return</strong> str;
-<a class="jxr_linenumber" name="L5901" href="#L5901">5901</a> <strong class="jxr_keyword">return</strong> str.replace(remove, <span class="jxr_string">""</span>);
-<a class="jxr_linenumber" name="L5902" href="#L5902">5902</a> }
-<a class="jxr_linenumber" name="L5903" href="#L5903">5903</a>
-<a class="jxr_linenumber" name="L5904" href="#L5904">5904</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L5905" href="#L5905">5905</a> <em class="jxr_javadoccomment"> * Removes diacritical marks (accents) from characters in a string.</em>
-<a class="jxr_linenumber" name="L5906" href="#L5906">5906</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5907" href="#L5907">5907</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L5908" href="#L5908">5908</a> <em class="jxr_javadoccomment"> * Normalizes the string to NFD form and removes combining diacritical marks.</em>
-<a class="jxr_linenumber" name="L5909" href="#L5909">5909</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5910" href="#L5910">5910</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
-<a class="jxr_linenumber" name="L5911" href="#L5911">5911</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L5912" href="#L5912">5912</a> <em class="jxr_javadoccomment"> * removeAccents(<js>"café"</js>); <jc>// "cafe"</jc></em>
-<a class="jxr_linenumber" name="L5913" href="#L5913">5913</a> <em class="jxr_javadoccomment"> * removeAccents(<js>"naïve"</js>); <jc>// "naive"</jc></em>
-<a class="jxr_linenumber" name="L5914" href="#L5914">5914</a> <em class="jxr_javadoccomment"> * removeAccents(<js>"résumé"</js>); <jc>// "resume"</jc></em>
-<a class="jxr_linenumber" name="L5915" href="#L5915">5915</a> <em class="jxr_javadoccomment"> * </p></em>
-<a class="jxr_linenumber" name="L5916" href="#L5916">5916</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5917" href="#L5917">5917</a> <em class="jxr_javadoccomment"> * @param str The string to remove accents from. Can be <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L5918" href="#L5918">5918</a> <em class="jxr_javadoccomment"> * @return The string with accents removed, or <jk>null</jk> if input is <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L5919" href="#L5919">5919</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L5920" href="#L5920">5920</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String removeAccents(String str) {
-<a class="jxr_linenumber" name="L5921" href="#L5921">5921</a> <strong class="jxr_keyword">if</strong> (str == <strong class="jxr_keyword">null</strong>)
-<a class="jxr_linenumber" name="L5922" href="#L5922">5922</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
-<a class="jxr_linenumber" name="L5923" href="#L5923">5923</a>
-<a class="jxr_linenumber" name="L5924" href="#L5924">5924</a> <em class="jxr_comment">// Normalize to NFD (decomposed form)</em>
-<a class="jxr_linenumber" name="L5925" href="#L5925">5925</a> <strong class="jxr_keyword">var</strong> normalized = Normalizer.normalize(str, Normalizer.Form.NFD);
-<a class="jxr_linenumber" name="L5926" href="#L5926">5926</a>
-<a class="jxr_linenumber" name="L5927" href="#L5927">5927</a> <em class="jxr_comment">// Remove combining diacritical marks (Unicode category Mn)</em>
-<a class="jxr_linenumber" name="L5928" href="#L5928">5928</a> <strong class="jxr_keyword">var</strong> sb = <strong class="jxr_keyword">new</strong> StringBuilder(normalized.length());
-<a class="jxr_linenumber" name="L5929" href="#L5929">5929</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < normalized.length(); i++) {
-<a class="jxr_linenumber" name="L5930" href="#L5930">5930</a> <strong class="jxr_keyword">var</strong> c = normalized.charAt(i);
-<a class="jxr_linenumber" name="L5931" href="#L5931">5931</a> <strong class="jxr_keyword">var</strong> type = Character.getType(c);
-<a class="jxr_linenumber" name="L5932" href="#L5932">5932</a> <em class="jxr_comment">// Mn = Nonspacing_Mark (combining marks)</em>
-<a class="jxr_linenumber" name="L5933" href="#L5933">5933</a> <strong class="jxr_keyword">if</strong> (type != Character.NON_SPACING_MARK) {
-<a class="jxr_linenumber" name="L5934" href="#L5934">5934</a> sb.append(c);
-<a class="jxr_linenumber" name="L5935" href="#L5935">5935</a> }
-<a class="jxr_linenumber" name="L5936" href="#L5936">5936</a> }
-<a class="jxr_linenumber" name="L5937" href="#L5937">5937</a>
-<a class="jxr_linenumber" name="L5938" href="#L5938">5938</a> <strong class="jxr_keyword">return</strong> sb.toString();
-<a class="jxr_linenumber" name="L5939" href="#L5939">5939</a> }
-<a class="jxr_linenumber" name="L5940" href="#L5940">5940</a>
-<a class="jxr_linenumber" name="L5941" href="#L5941">5941</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L5942" href="#L5942">5942</a> <em class="jxr_javadoccomment"> * Removes multiple substrings from a string.</em>
-<a class="jxr_linenumber" name="L5943" href="#L5943">5943</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5944" href="#L5944">5944</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
-<a class="jxr_linenumber" name="L5945" href="#L5945">5945</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L5946" href="#L5946">5946</a> <em class="jxr_javadoccomment"> * removeAll(<js>"hello world test"</js>, <js>"hello"</js>, <js>"test"</js>); <jc>// " world "</jc></em>
-<a class="jxr_linenumber" name="L5947" href="#L5947">5947</a> <em class="jxr_javadoccomment"> * removeAll(<jk>null</jk>, <js>"x"</js>); <jc>// null</jc></em>
-<a class="jxr_linenumber" name="L5948" href="#L5948">5948</a> <em class="jxr_javadoccomment"> * </p></em>
-<a class="jxr_linenumber" name="L5949" href="#L5949">5949</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5950" href="#L5950">5950</a> <em class="jxr_javadoccomment"> * @param str The string to process.</em>
-<a class="jxr_linenumber" name="L5951" href="#L5951">5951</a> <em class="jxr_javadoccomment"> * @param remove The substrings to remove.</em>
-<a class="jxr_linenumber" name="L5952" href="#L5952">5952</a> <em class="jxr_javadoccomment"> * @return The string with all specified substrings removed, or <jk>null</jk> if input is <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L5953" href="#L5953">5953</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L5954" href="#L5954">5954</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String removeAll(String str, String...remove) {
-<a class="jxr_linenumber" name="L5955" href="#L5955">5955</a> <strong class="jxr_keyword">if</strong> (str == <strong class="jxr_keyword">null</strong>)
-<a class="jxr_linenumber" name="L5956" href="#L5956">5956</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
-<a class="jxr_linenumber" name="L5957" href="#L5957">5957</a> <strong class="jxr_keyword">if</strong> (isEmpty(str) || remove == <strong class="jxr_keyword">null</strong> || remove.length == 0)
-<a class="jxr_linenumber" name="L5958" href="#L5958">5958</a> <strong class="jxr_keyword">return</strong> str;
-<a class="jxr_linenumber" name="L5959" href="#L5959">5959</a> <strong class="jxr_keyword">var</strong> result = str;
-<a class="jxr_linenumber" name="L5960" href="#L5960">5960</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> r : remove) {
-<a class="jxr_linenumber" name="L5961" href="#L5961">5961</a> <strong class="jxr_keyword">if</strong> (r != <strong class="jxr_keyword">null</strong>)
-<a class="jxr_linenumber" name="L5962" href="#L5962">5962</a> result = result.replace(r, <span class="jxr_string">""</span>);
-<a class="jxr_linenumber" name="L5963" href="#L5963">5963</a> }
-<a class="jxr_linenumber" name="L5964" href="#L5964">5964</a> <strong class="jxr_keyword">return</strong> result;
-<a class="jxr_linenumber" name="L5965" href="#L5965">5965</a> }
-<a class="jxr_linenumber" name="L5966" href="#L5966">5966</a>
-<a class="jxr_linenumber" name="L5967" href="#L5967">5967</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L5968" href="#L5968">5968</a> <em class="jxr_javadoccomment"> * Removes control characters from a string, replacing them with spaces.</em>
-<a class="jxr_linenumber" name="L5969" href="#L5969">5969</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5970" href="#L5970">5970</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
-<a class="jxr_linenumber" name="L5971" href="#L5971">5971</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L5972" href="#L5972">5972</a> <em class="jxr_javadoccomment"> * removeControlChars(<js>"hello\u0000\u0001world"</js>); <jc>// "hello world"</jc></em>
-<a class="jxr_linenumber" name="L5973" href="#L5973">5973</a> <em class="jxr_javadoccomment"> * removeControlChars(<js>"hello\nworld"</js>); <jc>// "hello\nworld"</jc></em>
-<a class="jxr_linenumber" name="L5974" href="#L5974">5974</a> <em class="jxr_javadoccomment"> * </p></em>
-<a class="jxr_linenumber" name="L5975" href="#L5975">5975</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5976" href="#L5976">5976</a> <em class="jxr_javadoccomment"> * @param str The string to process.</em>
-<a class="jxr_linenumber" name="L5977" href="#L5977">5977</a> <em class="jxr_javadoccomment"> * @return The string with control characters replaced by spaces (except whitespace control chars), or <jk>null</jk> if input is <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L5978" href="#L5978">5978</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L5979" href="#L5979">5979</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String removeControlChars(String str) {
-<a class="jxr_linenumber" name="L5980" href="#L5980">5980</a> <strong class="jxr_keyword">if</strong> (str == <strong class="jxr_keyword">null</strong>)
-<a class="jxr_linenumber" name="L5981" href="#L5981">5981</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
-<a class="jxr_linenumber" name="L5982" href="#L5982">5982</a> <strong class="jxr_keyword">var</strong> sb = <strong class="jxr_keyword">new</strong> StringBuilder();
-<a class="jxr_linenumber" name="L5983" href="#L5983">5983</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < str.length(); i++) {
-<a class="jxr_linenumber" name="L5984" href="#L5984">5984</a> <strong class="jxr_keyword">var</strong> c = str.charAt(i);
-<a class="jxr_linenumber" name="L5985" href="#L5985">5985</a> <strong class="jxr_keyword">if</strong> (Character.isISOControl(c) && ! Character.isWhitespace(c))
-<a class="jxr_linenumber" name="L5986" href="#L5986">5986</a> sb.append(' ');
-<a class="jxr_linenumber" name="L5987" href="#L5987">5987</a> <strong class="jxr_keyword">else</strong>
-<a class="jxr_linenumber" name="L5988" href="#L5988">5988</a> sb.append(c);
-<a class="jxr_linenumber" name="L5989" href="#L5989">5989</a> }
-<a class="jxr_linenumber" name="L5990" href="#L5990">5990</a> <strong class="jxr_keyword">return</strong> sb.toString();
-<a class="jxr_linenumber" name="L5991" href="#L5991">5991</a> }
-<a class="jxr_linenumber" name="L5992" href="#L5992">5992</a>
-<a class="jxr_linenumber" name="L5993" href="#L5993">5993</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L5994" href="#L5994">5994</a> <em class="jxr_javadoccomment"> * Removes a suffix from a string if present.</em>
-<a class="jxr_linenumber" name="L5995" href="#L5995">5995</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L5996" href="#L5996">5996</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
-<a class="jxr_linenumber" name="L5997" href="#L5997">5997</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L5998" href="#L5998">5998</a> <em class="jxr_javadoccomment"> * removeEnd(<jk>null</jk>, <js>"x"</js>); <jc>// null</jc></em>
-<a class="jxr_linenumber" name="L5999" href="#L5999">5999</a> <em class="jxr_javadoccomment"> * removeEnd(<js>"hello"</js>, <jk>null</jk>); <jc>// "hello"</jc></em>
-<a class="jxr_linenumber" name="L6000" href="#L6000">6000</a> <em class="jxr_javadoccomment"> * removeEnd(<js>"hello world"</js>, <js>"world"</js>); <jc>// "hello "</jc></em>
-<a class="jxr_linenumber" name="L6001" href="#L6001">6001</a> <em class="jxr_javadoccomment"> * removeEnd(<js>"hello world"</js>, <js>"xyz"</js>); <jc>// "hello world"</jc></em>
-<a class="jxr_linenumber" name="L6002" href="#L6002">6002</a> <em class="jxr_javadoccomment"> * </p></em>
-<a class="jxr_linenumber" name="L6003" href="#L6003">6003</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6004" href="#L6004">6004</a> <em class="jxr_javadoccomment"> * @param str The string to process.</em>
-<a class="jxr_linenumber" name="L6005" href="#L6005">6005</a> <em class="jxr_javadoccomment"> * @param suffix The suffix to remove.</em>
-<a class="jxr_linenumber" name="L6006" href="#L6006">6006</a> <em class="jxr_javadoccomment"> * @return The string with the suffix removed if present, or <jk>null</jk> if input is <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L6007" href="#L6007">6007</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L6008" href="#L6008">6008</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String removeEnd(String str, String suffix) {
-<a class="jxr_linenumber" name="L6009" href="#L6009">6009</a> <strong class="jxr_keyword">if</strong> (isEmpty(str) || isEmpty(suffix))
-<a class="jxr_linenumber" name="L6010" href="#L6010">6010</a> <strong class="jxr_keyword">return</strong> str;
-<a class="jxr_linenumber" name="L6011" href="#L6011">6011</a> <strong class="jxr_keyword">if</strong> (str.endsWith(suffix))
-<a class="jxr_linenumber" name="L6012" href="#L6012">6012</a> <strong class="jxr_keyword">return</strong> str.substring(0, str.length() - suffix.length());
-<a class="jxr_linenumber" name="L6013" href="#L6013">6013</a> <strong class="jxr_keyword">return</strong> str;
-<a class="jxr_linenumber" name="L6014" href="#L6014">6014</a> }
-<a class="jxr_linenumber" name="L6015" href="#L6015">6015</a>
-<a class="jxr_linenumber" name="L6016" href="#L6016">6016</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L6017" href="#L6017">6017</a> <em class="jxr_javadoccomment"> * Removes non-printable characters from a string.</em>
-<a class="jxr_linenumber" name="L6018" href="#L6018">6018</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6019" href="#L6019">6019</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
-<a class="jxr_linenumber" name="L6020" href="#L6020">6020</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L6021" href="#L6021">6021</a> <em class="jxr_javadoccomment"> * removeNonPrintable(<js>"hello\u0000world"</js>); <jc>// "helloworld"</jc></em>
-<a class="jxr_linenumber" name="L6022" href="#L6022">6022</a> <em class="jxr_javadoccomment"> * </p></em>
-<a class="jxr_linenumber" name="L6023" href="#L6023">6023</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6024" href="#L6024">6024</a> <em class="jxr_javadoccomment"> * @param str The string to process.</em>
-<a class="jxr_linenumber" name="L6025" href="#L6025">6025</a> <em class="jxr_javadoccomment"> * @return The string with non-printable characters removed, or <jk>null</jk> if input is <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L6026" href="#L6026">6026</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L6027" href="#L6027">6027</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String removeNonPrintable(String str) {
-<a class="jxr_linenumber" name="L6028" href="#L6028">6028</a> <strong class="jxr_keyword">if</strong> (str == <strong class="jxr_keyword">null</strong>)
-<a class="jxr_linenumber" name="L6029" href="#L6029">6029</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
-<a class="jxr_linenumber" name="L6030" href="#L6030">6030</a> <strong class="jxr_keyword">return</strong> str.replaceAll(<span class="jxr_string">"\\p{C}"</span>, <span class="jxr_string">""</span>);
-<a class="jxr_linenumber" name="L6031" href="#L6031">6031</a> }
-<a class="jxr_linenumber" name="L6032" href="#L6032">6032</a>
-<a class="jxr_linenumber" name="L6033" href="#L6033">6033</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L6034" href="#L6034">6034</a> <em class="jxr_javadoccomment"> * Removes a prefix from a string if present.</em>
-<a class="jxr_linenumber" name="L6035" href="#L6035">6035</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6036" href="#L6036">6036</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
-<a class="jxr_linenumber" name="L6037" href="#L6037">6037</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L6038" href="#L6038">6038</a> <em class="jxr_javadoccomment"> * removeStart(<jk>null</jk>, <js>"x"</js>); <jc>// null</jc></em>
-<a class="jxr_linenumber" name="L6039" href="#L6039">6039</a> <em class="jxr_javadoccomment"> * removeStart(<js>"hello"</js>, <jk>null</jk>); <jc>// "hello"</jc></em>
-<a class="jxr_linenumber" name="L6040" href="#L6040">6040</a> <em class="jxr_javadoccomment"> * removeStart(<js>"hello world"</js>, <js>"hello"</js>); <jc>// " world"</jc></em>
-<a class="jxr_linenumber" name="L6041" href="#L6041">6041</a> <em class="jxr_javadoccomment"> * removeStart(<js>"hello world"</js>, <js>"xyz"</js>); <jc>// "hello world"</jc></em>
-<a class="jxr_linenumber" name="L6042" href="#L6042">6042</a> <em class="jxr_javadoccomment"> * </p></em>
-<a class="jxr_linenumber" name="L6043" href="#L6043">6043</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6044" href="#L6044">6044</a> <em class="jxr_javadoccomment"> * @param str The string to process.</em>
-<a class="jxr_linenumber" name="L6045" href="#L6045">6045</a> <em class="jxr_javadoccomment"> * @param prefix The prefix to remove.</em>
-<a class="jxr_linenumber" name="L6046" href="#L6046">6046</a> <em class="jxr_javadoccomment"> * @return The string with the prefix removed if present, or <jk>null</jk> if input is <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L6047" href="#L6047">6047</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L6048" href="#L6048">6048</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String removeStart(String str, String prefix) {
-<a class="jxr_linenumber" name="L6049" href="#L6049">6049</a> <strong class="jxr_keyword">if</strong> (isEmpty(str) || isEmpty(prefix))
-<a class="jxr_linenumber" name="L6050" href="#L6050">6050</a> <strong class="jxr_keyword">return</strong> str;
-<a class="jxr_linenumber" name="L6051" href="#L6051">6051</a> <strong class="jxr_keyword">if</strong> (str.startsWith(prefix))
-<a class="jxr_linenumber" name="L6052" href="#L6052">6052</a> <strong class="jxr_keyword">return</strong> str.substring(prefix.length());
-<a class="jxr_linenumber" name="L6053" href="#L6053">6053</a> <strong class="jxr_keyword">return</strong> str;
-<a class="jxr_linenumber" name="L6054" href="#L6054">6054</a> }
-<a class="jxr_linenumber" name="L6055" href="#L6055">6055</a>
-<a class="jxr_linenumber" name="L6056" href="#L6056">6056</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L6057" href="#L6057">6057</a> <em class="jxr_javadoccomment"> * Removes all underscore characters from a string.</em>
-<a class="jxr_linenumber" name="L6058" href="#L6058">6058</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6059" href="#L6059">6059</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L6060" href="#L6060">6060</a> <em class="jxr_javadoccomment"> * This method is commonly used to process numeric literals that may contain underscores for readability</em>
-<a class="jxr_linenumber" name="L6061" href="#L6061">6061</a> <em class="jxr_javadoccomment"> * (e.g., <js>"1_000_000"</js> becomes <js>"1000000"</js>), as Java allows underscores in numeric literals</em>
-<a class="jxr_linenumber" name="L6062" href="#L6062">6062</a> <em class="jxr_javadoccomment"> * but some parsing methods do not support them.</em>
-<a class="jxr_linenumber" name="L6063" href="#L6063">6063</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6064" href="#L6064">6064</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L6065" href="#L6065">6065</a> <em class="jxr_javadoccomment"> * If the string does not contain any underscores, the original string is returned (no new object created).</em>
-<a class="jxr_linenumber" name="L6066" href="#L6066">6066</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6067" href="#L6067">6067</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
-<a class="jxr_linenumber" name="L6068" href="#L6068">6068</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L6069" href="#L6069">6069</a> <em class="jxr_javadoccomment"> * removeUnderscores(<js>"1_000_000"</js>); <jc>// "1000000"</jc></em>
-<a class="jxr_linenumber" name="L6070" href="#L6070">6070</a> <em class="jxr_javadoccomment"> * removeUnderscores(<js>"1_000.5"</js>); <jc>// "1000.5"</jc></em>
-<a class="jxr_linenumber" name="L6071" href="#L6071">6071</a> <em class="jxr_javadoccomment"> * removeUnderscores(<js>"hello_world"</js>); <jc>// "helloworld"</jc></em>
-<a class="jxr_linenumber" name="L6072" href="#L6072">6072</a> <em class="jxr_javadoccomment"> * removeUnderscores(<js>"no_underscores"</js>); <jc>// "nounderscores"</jc></em>
-<a class="jxr_linenumber" name="L6073" href="#L6073">6073</a> <em class="jxr_javadoccomment"> * removeUnderscores(<js>"Hello"</js>); <jc>// "Hello" (no change, same object returned)</jc></em>
-<a class="jxr_linenumber" name="L6074" href="#L6074">6074</a> <em class="jxr_javadoccomment"> * </p></em>
+<a class="jxr_linenumber" name="L5801" href="#L5801">5801</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Examples:</h5></em>
+<a class="jxr_linenumber" name="L5802" href="#L5802">5802</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
+<a class="jxr_linenumber" name="L5803" href="#L5803">5803</a> <em class="jxr_javadoccomment"> * <jc>// Collections</jc></em>
+<a class="jxr_linenumber" name="L5804" href="#L5804">5804</a> <em class="jxr_javadoccomment"> * readable(List.of("a", "b", "c")) <jc>// Returns: "[a,b,c]"</jc></em>
+<a class="jxr_linenumber" name="L5805" href="#L5805">5805</a> <em class="jxr_javadoccomment"> * readable(Set.of(1, 2, 3)) <jc>// Returns: "[1,2,3]" (order may vary)</jc></em>
+<a class="jxr_linenumber" name="L5806" href="#L5806">5806</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5807" href="#L5807">5807</a> <em class="jxr_javadoccomment"> * <jc>// Maps</jc></em>
+<a class="jxr_linenumber" name="L5808" href="#L5808">5808</a> <em class="jxr_javadoccomment"> * readable(Map.of("foo", "bar", "baz", 123)) <jc>// Returns: "{foo=bar,baz=123}"</jc></em>
+<a class="jxr_linenumber" name="L5809" href="#L5809">5809</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5810" href="#L5810">5810</a> <em class="jxr_javadoccomment"> * <jc>// Arrays</jc></em>
+<a class="jxr_linenumber" name="L5811" href="#L5811">5811</a> <em class="jxr_javadoccomment"> * readable(ints(1, 2, 3)) <jc>// Returns: "[1,2,3]"</jc></em>
+<a class="jxr_linenumber" name="L5812" href="#L5812">5812</a> <em class="jxr_javadoccomment"> * readable(new String[]{"a", "b"}) <jc>// Returns: "[a,b]"</jc></em>
+<a class="jxr_linenumber" name="L5813" href="#L5813">5813</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5814" href="#L5814">5814</a> <em class="jxr_javadoccomment"> * <jc>// Nested structures</jc></em>
+<a class="jxr_linenumber" name="L5815" href="#L5815">5815</a> <em class="jxr_javadoccomment"> * readable(List.of(Map.of("x", 1), Set.of("a", "b"))) <jc>// Returns: "[{x=1},[a,b]]"</jc></em>
+<a class="jxr_linenumber" name="L5816" href="#L5816">5816</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5817" href="#L5817">5817</a> <em class="jxr_javadoccomment"> * <jc>// Special types</jc></em>
+<a class="jxr_linenumber" name="L5818" href="#L5818">5818</a> <em class="jxr_javadoccomment"> * readable(Optional.of("test")) <jc>// Returns: "test"</jc></em>
+<a class="jxr_linenumber" name="L5819" href="#L5819">5819</a> <em class="jxr_javadoccomment"> * readable(Optional.empty()) <jc>// Returns: null</jc></em>
+<a class="jxr_linenumber" name="L5820" href="#L5820">5820</a> <em class="jxr_javadoccomment"> * readable(new Date(1640995200000L)) <jc>// Returns: "2022-01-01T00:00:00Z"</jc></em>
+<a class="jxr_linenumber" name="L5821" href="#L5821">5821</a> <em class="jxr_javadoccomment"> * readable(MyEnum.FOO) <jc>// Returns: "FOO"</jc></em>
+<a class="jxr_linenumber" name="L5822" href="#L5822">5822</a> <em class="jxr_javadoccomment"> * </p></em>
+<a class="jxr_linenumber" name="L5823" href="#L5823">5823</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5824" href="#L5824">5824</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Recursive Processing:</h5></em>
+<a class="jxr_linenumber" name="L5825" href="#L5825">5825</a> <em class="jxr_javadoccomment"> * <p>The method recursively processes nested structures, so complex objects containing</em>
+<a class="jxr_linenumber" name="L5826" href="#L5826">5826</a> <em class="jxr_javadoccomment"> * collections, maps, and arrays are fully flattened into readable format. This makes it</em>
+<a class="jxr_linenumber" name="L5827" href="#L5827">5827</a> <em class="jxr_javadoccomment"> * ideal for test assertions where you need to compare complex object structures.</p></em>
+<a class="jxr_linenumber" name="L5828" href="#L5828">5828</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5829" href="#L5829">5829</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Error Handling:</h5></em>
+<a class="jxr_linenumber" name="L5830" href="#L5830">5830</a> <em class="jxr_javadoccomment"> * <p>IO operations (reading files, streams) are wrapped in safe() calls, converting</em>
+<a class="jxr_linenumber" name="L5831" href="#L5831">5831</a> <em class="jxr_javadoccomment"> * any exceptions to RuntimeExceptions. Binary data (InputStreams, byte arrays) is</em>
+<a class="jxr_linenumber" name="L5832" href="#L5832">5832</a> <em class="jxr_javadoccomment"> * converted to hexadecimal representation for readability.</p></em>
+<a class="jxr_linenumber" name="L5833" href="#L5833">5833</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5834" href="#L5834">5834</a> <em class="jxr_javadoccomment"> * @param o The object to convert to readable format. Can be <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L5835" href="#L5835">5835</a> <em class="jxr_javadoccomment"> * @return A readable string representation of the object, or <jk>null</jk> if the input was <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L5836" href="#L5836">5836</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L5837" href="#L5837">5837</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String readable(Object o) {
+<a class="jxr_linenumber" name="L5838" href="#L5838">5838</a> <strong class="jxr_keyword">if</strong> (o == <strong class="jxr_keyword">null</strong>)
+<a class="jxr_linenumber" name="L5839" href="#L5839">5839</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
+<a class="jxr_linenumber" name="L5840" href="#L5840">5840</a> <strong class="jxr_keyword">if</strong> (o instanceof Optional<?> o2)
+<a class="jxr_linenumber" name="L5841" href="#L5841">5841</a> <strong class="jxr_keyword">return</strong> readable(o2.orElse(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L5842" href="#L5842">5842</a> <strong class="jxr_keyword">if</strong> (o instanceof Collection<?> o2)
+<a class="jxr_linenumber" name="L5843" href="#L5843">5843</a> <strong class="jxr_keyword">return</strong> o2.stream().map(StringUtils::readable).collect(Collectors.joining(<span class="jxr_string">","</span>, <span class="jxr_string">"["</span>, <span class="jxr_string">"]"</span>));
+<a class="jxr_linenumber" name="L5844" href="#L5844">5844</a> <strong class="jxr_keyword">if</strong> (o instanceof Map<?,?> o2)
+<a class="jxr_linenumber" name="L5845" href="#L5845">5845</a> <strong class="jxr_keyword">return</strong> o2.entrySet().stream().map(StringUtils::readable).collect(Collectors.joining(<span class="jxr_string">","</span>, <span class="jxr_string">"{"</span>, <span class="jxr_string">"}"</span>));
+<a class="jxr_linenumber" name="L5846" href="#L5846">5846</a> <strong class="jxr_keyword">if</strong> (o instanceof Map.Entry<?,?> o2)
+<a class="jxr_linenumber" name="L5847" href="#L5847">5847</a> <strong class="jxr_keyword">return</strong> readable(o2.getKey()) + '=' + readable(o2.getValue());
+<a class="jxr_linenumber" name="L5848" href="#L5848">5848</a> <strong class="jxr_keyword">if</strong> (o instanceof Iterable<?> o2)
+<a class="jxr_linenumber" name="L5849" href="#L5849">5849</a> <strong class="jxr_keyword">return</strong> readable(toList(o2));
+<a class="jxr_linenumber" name="L5850" href="#L5850">5850</a> <strong class="jxr_keyword">if</strong> (o instanceof Iterator<?> o2)
+<a class="jxr_linenumber" name="L5851" href="#L5851">5851</a> <strong class="jxr_keyword">return</strong> readable(toList(o2));
+<a class="jxr_linenumber" name="L5852" href="#L5852">5852</a> <strong class="jxr_keyword">if</strong> (o instanceof Enumeration<?> o2)
+<a class="jxr_linenumber" name="L5853" href="#L5853">5853</a> <strong class="jxr_keyword">return</strong> readable(toList(o2));
+<a class="jxr_linenumber" name="L5854" href="#L5854">5854</a> <strong class="jxr_keyword">if</strong> (o instanceof GregorianCalendar o2)
+<a class="jxr_linenumber" name="L5855" href="#L5855">5855</a> <strong class="jxr_keyword">return</strong> o2.toZonedDateTime().format(DateTimeFormatter.ISO_INSTANT);
+<a class="jxr_linenumber" name="L5856" href="#L5856">5856</a> <strong class="jxr_keyword">if</strong> (o instanceof Date o2)
+<a class="jxr_linenumber" name="L5857" href="#L5857">5857</a> <strong class="jxr_keyword">return</strong> o2.toInstant().toString();
+<a class="jxr_linenumber" name="L5858" href="#L5858">5858</a> <strong class="jxr_keyword">if</strong> (o instanceof InputStream o2)
+<a class="jxr_linenumber" name="L5859" href="#L5859">5859</a> <strong class="jxr_keyword">return</strong> toHex(o2);
+<a class="jxr_linenumber" name="L5860" href="#L5860">5860</a> <strong class="jxr_keyword">if</strong> (o instanceof Reader o2)
+<a class="jxr_linenumber" name="L5861" href="#L5861">5861</a> <strong class="jxr_keyword">return</strong> safe(() -> read(o2));
+<a class="jxr_linenumber" name="L5862" href="#L5862">5862</a> <strong class="jxr_keyword">if</strong> (o instanceof File o2)
+<a class="jxr_linenumber" name="L5863" href="#L5863">5863</a> <strong class="jxr_keyword">return</strong> safe(() -> read(o2));
+<a class="jxr_linenumber" name="L5864" href="#L5864">5864</a> <strong class="jxr_keyword">if</strong> (o instanceof byte[] o2)
+<a class="jxr_linenumber" name="L5865" href="#L5865">5865</a> <strong class="jxr_keyword">return</strong> toHex(o2);
+<a class="jxr_linenumber" name="L5866" href="#L5866">5866</a> <strong class="jxr_keyword">if</strong> (o instanceof Enum o2)
+<a class="jxr_linenumber" name="L5867" href="#L5867">5867</a> <strong class="jxr_keyword">return</strong> o2.name();
+<a class="jxr_linenumber" name="L5868" href="#L5868">5868</a> <strong class="jxr_keyword">if</strong> (o instanceof Class o2)
+<a class="jxr_linenumber" name="L5869" href="#L5869">5869</a> <strong class="jxr_keyword">return</strong> cns(o2);
+<a class="jxr_linenumber" name="L5870" href="#L5870">5870</a> <strong class="jxr_keyword">if</strong> (o instanceof Executable o2) {
+<a class="jxr_linenumber" name="L5871" href="#L5871">5871</a> <strong class="jxr_keyword">var</strong> sb = <strong class="jxr_keyword">new</strong> StringBuilder(64);
+<a class="jxr_linenumber" name="L5872" href="#L5872">5872</a> sb.append(o2 instanceof Constructor ? cns(o2.getDeclaringClass()) : o2.getName()).append('(');
+<a class="jxr_linenumber" name="L5873" href="#L5873">5873</a> <strong class="jxr_keyword">var</strong> pt = o2.getParameterTypes();
+<a class="jxr_linenumber" name="L5874" href="#L5874">5874</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < pt.length; i++) {
+<a class="jxr_linenumber" name="L5875" href="#L5875">5875</a> <strong class="jxr_keyword">if</strong> (i > 0)
+<a class="jxr_linenumber" name="L5876" href="#L5876">5876</a> sb.append(',');
+<a class="jxr_linenumber" name="L5877" href="#L5877">5877</a> sb.append(cns(pt[i]));
+<a class="jxr_linenumber" name="L5878" href="#L5878">5878</a> }
+<a class="jxr_linenumber" name="L5879" href="#L5879">5879</a> sb.append(')');
+<a class="jxr_linenumber" name="L5880" href="#L5880">5880</a> <strong class="jxr_keyword">return</strong> sb.toString();
+<a class="jxr_linenumber" name="L5881" href="#L5881">5881</a> }
+<a class="jxr_linenumber" name="L5882" href="#L5882">5882</a> <strong class="jxr_keyword">if</strong> (isArray(o)) {
+<a class="jxr_linenumber" name="L5883" href="#L5883">5883</a> <strong class="jxr_keyword">var</strong> l = list();
+<a class="jxr_linenumber" name="L5884" href="#L5884">5884</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < Array.getLength(o); i++) {
+<a class="jxr_linenumber" name="L5885" href="#L5885">5885</a> l.add(Array.get(o, i));
+<a class="jxr_linenumber" name="L5886" href="#L5886">5886</a> }
+<a class="jxr_linenumber" name="L5887" href="#L5887">5887</a> <strong class="jxr_keyword">return</strong> readable(l);
+<a class="jxr_linenumber" name="L5888" href="#L5888">5888</a> }
+<a class="jxr_linenumber" name="L5889" href="#L5889">5889</a> <strong class="jxr_keyword">return</strong> o.toString();
+<a class="jxr_linenumber" name="L5890" href="#L5890">5890</a> }
+<a class="jxr_linenumber" name="L5891" href="#L5891">5891</a>
+<a class="jxr_linenumber" name="L5892" href="#L5892">5892</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L5893" href="#L5893">5893</a> <em class="jxr_javadoccomment"> * Removes all occurrences of a substring from a string.</em>
+<a class="jxr_linenumber" name="L5894" href="#L5894">5894</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5895" href="#L5895">5895</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
+<a class="jxr_linenumber" name="L5896" href="#L5896">5896</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
+<a class="jxr_linenumber" name="L5897" href="#L5897">5897</a> <em class="jxr_javadoccomment"> * remove(<jk>null</jk>, <js>"x"</js>); <jc>// null</jc></em>
+<a class="jxr_linenumber" name="L5898" href="#L5898">5898</a> <em class="jxr_javadoccomment"> * remove(<js>"hello"</js>, <jk>null</jk>); <jc>// "hello"</jc></em>
+<a class="jxr_linenumber" name="L5899" href="#L5899">5899</a> <em class="jxr_javadoccomment"> * remove(<js>"hello world"</js>, <js>"o"</js>); <jc>// "hell wrld"</jc></em>
+<a class="jxr_linenumber" name="L5900" href="#L5900">5900</a> <em class="jxr_javadoccomment"> * remove(<js>"hello world"</js>, <js>"xyz"</js>); <jc>// "hello world"</jc></em>
+<a class="jxr_linenumber" name="L5901" href="#L5901">5901</a> <em class="jxr_javadoccomment"> * </p></em>
+<a class="jxr_linenumber" name="L5902" href="#L5902">5902</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5903" href="#L5903">5903</a> <em class="jxr_javadoccomment"> * @param str The string to process.</em>
+<a class="jxr_linenumber" name="L5904" href="#L5904">5904</a> <em class="jxr_javadoccomment"> * @param remove The substring to remove.</em>
+<a class="jxr_linenumber" name="L5905" href="#L5905">5905</a> <em class="jxr_javadoccomment"> * @return The string with all occurrences of the substring removed, or <jk>null</jk> if input is <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L5906" href="#L5906">5906</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L5907" href="#L5907">5907</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String remove(String str, String remove) {
+<a class="jxr_linenumber" name="L5908" href="#L5908">5908</a> <strong class="jxr_keyword">if</strong> (isEmpty(str) || isEmpty(remove))
+<a class="jxr_linenumber" name="L5909" href="#L5909">5909</a> <strong class="jxr_keyword">return</strong> str;
+<a class="jxr_linenumber" name="L5910" href="#L5910">5910</a> <strong class="jxr_keyword">return</strong> str.replace(remove, <span class="jxr_string">""</span>);
+<a class="jxr_linenumber" name="L5911" href="#L5911">5911</a> }
+<a class="jxr_linenumber" name="L5912" href="#L5912">5912</a>
+<a class="jxr_linenumber" name="L5913" href="#L5913">5913</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L5914" href="#L5914">5914</a> <em class="jxr_javadoccomment"> * Removes diacritical marks (accents) from characters in a string.</em>
+<a class="jxr_linenumber" name="L5915" href="#L5915">5915</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5916" href="#L5916">5916</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L5917" href="#L5917">5917</a> <em class="jxr_javadoccomment"> * Normalizes the string to NFD form and removes combining diacritical marks.</em>
+<a class="jxr_linenumber" name="L5918" href="#L5918">5918</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5919" href="#L5919">5919</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
+<a class="jxr_linenumber" name="L5920" href="#L5920">5920</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
+<a class="jxr_linenumber" name="L5921" href="#L5921">5921</a> <em class="jxr_javadoccomment"> * removeAccents(<js>"café"</js>); <jc>// "cafe"</jc></em>
+<a class="jxr_linenumber" name="L5922" href="#L5922">5922</a> <em class="jxr_javadoccomment"> * removeAccents(<js>"naïve"</js>); <jc>// "naive"</jc></em>
+<a class="jxr_linenumber" name="L5923" href="#L5923">5923</a> <em class="jxr_javadoccomment"> * removeAccents(<js>"résumé"</js>); <jc>// "resume"</jc></em>
+<a class="jxr_linenumber" name="L5924" href="#L5924">5924</a> <em class="jxr_javadoccomment"> * </p></em>
+<a class="jxr_linenumber" name="L5925" href="#L5925">5925</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5926" href="#L5926">5926</a> <em class="jxr_javadoccomment"> * @param str The string to remove accents from. Can be <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L5927" href="#L5927">5927</a> <em class="jxr_javadoccomment"> * @return The string with accents removed, or <jk>null</jk> if input is <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L5928" href="#L5928">5928</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L5929" href="#L5929">5929</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String removeAccents(String str) {
+<a class="jxr_linenumber" name="L5930" href="#L5930">5930</a> <strong class="jxr_keyword">if</strong> (str == <strong class="jxr_keyword">null</strong>)
+<a class="jxr_linenumber" name="L5931" href="#L5931">5931</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
+<a class="jxr_linenumber" name="L5932" href="#L5932">5932</a>
+<a class="jxr_linenumber" name="L5933" href="#L5933">5933</a> <em class="jxr_comment">// Normalize to NFD (decomposed form)</em>
+<a class="jxr_linenumber" name="L5934" href="#L5934">5934</a> <strong class="jxr_keyword">var</strong> normalized = Normalizer.normalize(str, Normalizer.Form.NFD);
+<a class="jxr_linenumber" name="L5935" href="#L5935">5935</a>
+<a class="jxr_linenumber" name="L5936" href="#L5936">5936</a> <em class="jxr_comment">// Remove combining diacritical marks (Unicode category Mn)</em>
+<a class="jxr_linenumber" name="L5937" href="#L5937">5937</a> <strong class="jxr_keyword">var</strong> sb = <strong class="jxr_keyword">new</strong> StringBuilder(normalized.length());
+<a class="jxr_linenumber" name="L5938" href="#L5938">5938</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < normalized.length(); i++) {
+<a class="jxr_linenumber" name="L5939" href="#L5939">5939</a> <strong class="jxr_keyword">var</strong> c = normalized.charAt(i);
+<a class="jxr_linenumber" name="L5940" href="#L5940">5940</a> <strong class="jxr_keyword">var</strong> type = Character.getType(c);
+<a class="jxr_linenumber" name="L5941" href="#L5941">5941</a> <em class="jxr_comment">// Mn = Nonspacing_Mark (combining marks)</em>
+<a class="jxr_linenumber" name="L5942" href="#L5942">5942</a> <strong class="jxr_keyword">if</strong> (type != Character.NON_SPACING_MARK) {
+<a class="jxr_linenumber" name="L5943" href="#L5943">5943</a> sb.append(c);
+<a class="jxr_linenumber" name="L5944" href="#L5944">5944</a> }
+<a class="jxr_linenumber" name="L5945" href="#L5945">5945</a> }
+<a class="jxr_linenumber" name="L5946" href="#L5946">5946</a>
+<a class="jxr_linenumber" name="L5947" href="#L5947">5947</a> <strong class="jxr_keyword">return</strong> sb.toString();
+<a class="jxr_linenumber" name="L5948" href="#L5948">5948</a> }
+<a class="jxr_linenumber" name="L5949" href="#L5949">5949</a>
+<a class="jxr_linenumber" name="L5950" href="#L5950">5950</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L5951" href="#L5951">5951</a> <em class="jxr_javadoccomment"> * Removes multiple substrings from a string.</em>
+<a class="jxr_linenumber" name="L5952" href="#L5952">5952</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5953" href="#L5953">5953</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
+<a class="jxr_linenumber" name="L5954" href="#L5954">5954</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
+<a class="jxr_linenumber" name="L5955" href="#L5955">5955</a> <em class="jxr_javadoccomment"> * removeAll(<js>"hello world test"</js>, <js>"hello"</js>, <js>"test"</js>); <jc>// " world "</jc></em>
+<a class="jxr_linenumber" name="L5956" href="#L5956">5956</a> <em class="jxr_javadoccomment"> * removeAll(<jk>null</jk>, <js>"x"</js>); <jc>// null</jc></em>
+<a class="jxr_linenumber" name="L5957" href="#L5957">5957</a> <em class="jxr_javadoccomment"> * </p></em>
+<a class="jxr_linenumber" name="L5958" href="#L5958">5958</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5959" href="#L5959">5959</a> <em class="jxr_javadoccomment"> * @param str The string to process.</em>
+<a class="jxr_linenumber" name="L5960" href="#L5960">5960</a> <em class="jxr_javadoccomment"> * @param remove The substrings to remove.</em>
+<a class="jxr_linenumber" name="L5961" href="#L5961">5961</a> <em class="jxr_javadoccomment"> * @return The string with all specified substrings removed, or <jk>null</jk> if input is <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L5962" href="#L5962">5962</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L5963" href="#L5963">5963</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String removeAll(String str, String...remove) {
+<a class="jxr_linenumber" name="L5964" href="#L5964">5964</a> <strong class="jxr_keyword">if</strong> (str == <strong class="jxr_keyword">null</strong>)
+<a class="jxr_linenumber" name="L5965" href="#L5965">5965</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
+<a class="jxr_linenumber" name="L5966" href="#L5966">5966</a> <strong class="jxr_keyword">if</strong> (isEmpty(str) || remove == <strong class="jxr_keyword">null</strong> || remove.length == 0)
+<a class="jxr_linenumber" name="L5967" href="#L5967">5967</a> <strong class="jxr_keyword">return</strong> str;
+<a class="jxr_linenumber" name="L5968" href="#L5968">5968</a> <strong class="jxr_keyword">var</strong> result = str;
+<a class="jxr_linenumber" name="L5969" href="#L5969">5969</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> r : remove) {
+<a class="jxr_linenumber" name="L5970" href="#L5970">5970</a> <strong class="jxr_keyword">if</strong> (r != <strong class="jxr_keyword">null</strong>)
+<a class="jxr_linenumber" name="L5971" href="#L5971">5971</a> result = result.replace(r, <span class="jxr_string">""</span>);
+<a class="jxr_linenumber" name="L5972" href="#L5972">5972</a> }
+<a class="jxr_linenumber" name="L5973" href="#L5973">5973</a> <strong class="jxr_keyword">return</strong> result;
+<a class="jxr_linenumber" name="L5974" href="#L5974">5974</a> }
+<a class="jxr_linenumber" name="L5975" href="#L5975">5975</a>
+<a class="jxr_linenumber" name="L5976" href="#L5976">5976</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L5977" href="#L5977">5977</a> <em class="jxr_javadoccomment"> * Removes control characters from a string, replacing them with spaces.</em>
+<a class="jxr_linenumber" name="L5978" href="#L5978">5978</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5979" href="#L5979">5979</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
+<a class="jxr_linenumber" name="L5980" href="#L5980">5980</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
+<a class="jxr_linenumber" name="L5981" href="#L5981">5981</a> <em class="jxr_javadoccomment"> * removeControlChars(<js>"hello\u0000\u0001world"</js>); <jc>// "hello world"</jc></em>
+<a class="jxr_linenumber" name="L5982" href="#L5982">5982</a> <em class="jxr_javadoccomment"> * removeControlChars(<js>"hello\nworld"</js>); <jc>// "hello\nworld"</jc></em>
+<a class="jxr_linenumber" name="L5983" href="#L5983">5983</a> <em class="jxr_javadoccomment"> * </p></em>
+<a class="jxr_linenumber" name="L5984" href="#L5984">5984</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L5985" href="#L5985">5985</a> <em class="jxr_javadoccomment"> * @param str The string to process.</em>
+<a class="jxr_linenumber" name="L5986" href="#L5986">5986</a> <em class="jxr_javadoccomment"> * @return The string with control characters replaced by spaces (except whitespace control chars), or <jk>null</jk> if input is <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L5987" href="#L5987">5987</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L5988" href="#L5988">5988</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String removeControlChars(String str) {
+<a class="jxr_linenumber" name="L5989" href="#L5989">5989</a> <strong class="jxr_keyword">if</strong> (str == <strong class="jxr_keyword">null</strong>)
+<a class="jxr_linenumber" name="L5990" href="#L5990">5990</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
+<a class="jxr_linenumber" name="L5991" href="#L5991">5991</a> <strong class="jxr_keyword">var</strong> sb = <strong class="jxr_keyword">new</strong> StringBuilder();
+<a class="jxr_linenumber" name="L5992" href="#L5992">5992</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < str.length(); i++) {
+<a class="jxr_linenumber" name="L5993" href="#L5993">5993</a> <strong class="jxr_keyword">var</strong> c = str.charAt(i);
+<a class="jxr_linenumber" name="L5994" href="#L5994">5994</a> <strong class="jxr_keyword">if</strong> (Character.isISOControl(c) && ! Character.isWhitespace(c))
+<a class="jxr_linenumber" name="L5995" href="#L5995">5995</a> sb.append(' ');
+<a class="jxr_linenumber" name="L5996" href="#L5996">5996</a> <strong class="jxr_keyword">else</strong>
+<a class="jxr_linenumber" name="L5997" href="#L5997">5997</a> sb.append(c);
+<a class="jxr_linenumber" name="L5998" href="#L5998">5998</a> }
+<a class="jxr_linenumber" name="L5999" href="#L5999">5999</a> <strong class="jxr_keyword">return</strong> sb.toString();
+<a class="jxr_linenumber" name="L6000" href="#L6000">6000</a> }
+<a class="jxr_linenumber" name="L6001" href="#L6001">6001</a>
+<a class="jxr_linenumber" name="L6002" href="#L6002">6002</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L6003" href="#L6003">6003</a> <em class="jxr_javadoccomment"> * Removes a suffix from a string if present.</em>
+<a class="jxr_linenumber" name="L6004" href="#L6004">6004</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6005" href="#L6005">6005</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
+<a class="jxr_linenumber" name="L6006" href="#L6006">6006</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
+<a class="jxr_linenumber" name="L6007" href="#L6007">6007</a> <em class="jxr_javadoccomment"> * removeEnd(<jk>null</jk>, <js>"x"</js>); <jc>// null</jc></em>
+<a class="jxr_linenumber" name="L6008" href="#L6008">6008</a> <em class="jxr_javadoccomment"> * removeEnd(<js>"hello"</js>, <jk>null</jk>); <jc>// "hello"</jc></em>
+<a class="jxr_linenumber" name="L6009" href="#L6009">6009</a> <em class="jxr_javadoccomment"> * removeEnd(<js>"hello world"</js>, <js>"world"</js>); <jc>// "hello "</jc></em>
+<a class="jxr_linenumber" name="L6010" href="#L6010">6010</a> <em class="jxr_javadoccomment"> * removeEnd(<js>"hello world"</js>, <js>"xyz"</js>); <jc>// "hello world"</jc></em>
+<a class="jxr_linenumber" name="L6011" href="#L6011">6011</a> <em class="jxr_javadoccomment"> * </p></em>
+<a class="jxr_linenumber" name="L6012" href="#L6012">6012</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6013" href="#L6013">6013</a> <em class="jxr_javadoccomment"> * @param str The string to process.</em>
+<a class="jxr_linenumber" name="L6014" href="#L6014">6014</a> <em class="jxr_javadoccomment"> * @param suffix The suffix to remove.</em>
+<a class="jxr_linenumber" name="L6015" href="#L6015">6015</a> <em class="jxr_javadoccomment"> * @return The string with the suffix removed if present, or <jk>null</jk> if input is <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L6016" href="#L6016">6016</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L6017" href="#L6017">6017</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String removeEnd(String str, String suffix) {
+<a class="jxr_linenumber" name="L6018" href="#L6018">6018</a> <strong class="jxr_keyword">if</strong> (isEmpty(str) || isEmpty(suffix))
+<a class="jxr_linenumber" name="L6019" href="#L6019">6019</a> <strong class="jxr_keyword">return</strong> str;
+<a class="jxr_linenumber" name="L6020" href="#L6020">6020</a> <strong class="jxr_keyword">if</strong> (str.endsWith(suffix))
+<a class="jxr_linenumber" name="L6021" href="#L6021">6021</a> <strong class="jxr_keyword">return</strong> str.substring(0, str.length() - suffix.length());
+<a class="jxr_linenumber" name="L6022" href="#L6022">6022</a> <strong class="jxr_keyword">return</strong> str;
+<a class="jxr_linenumber" name="L6023" href="#L6023">6023</a> }
+<a class="jxr_linenumber" name="L6024" href="#L6024">6024</a>
+<a class="jxr_linenumber" name="L6025" href="#L6025">6025</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L6026" href="#L6026">6026</a> <em class="jxr_javadoccomment"> * Removes non-printable characters from a string.</em>
+<a class="jxr_linenumber" name="L6027" href="#L6027">6027</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6028" href="#L6028">6028</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
+<a class="jxr_linenumber" name="L6029" href="#L6029">6029</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
+<a class="jxr_linenumber" name="L6030" href="#L6030">6030</a> <em class="jxr_javadoccomment"> * removeNonPrintable(<js>"hello\u0000world"</js>); <jc>// "helloworld"</jc></em>
+<a class="jxr_linenumber" name="L6031" href="#L6031">6031</a> <em class="jxr_javadoccomment"> * </p></em>
+<a class="jxr_linenumber" name="L6032" href="#L6032">6032</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6033" href="#L6033">6033</a> <em class="jxr_javadoccomment"> * @param str The string to process.</em>
+<a class="jxr_linenumber" name="L6034" href="#L6034">6034</a> <em class="jxr_javadoccomment"> * @return The string with non-printable characters removed, or <jk>null</jk> if input is <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L6035" href="#L6035">6035</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L6036" href="#L6036">6036</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String removeNonPrintable(String str) {
+<a class="jxr_linenumber" name="L6037" href="#L6037">6037</a> <strong class="jxr_keyword">if</strong> (str == <strong class="jxr_keyword">null</strong>)
+<a class="jxr_linenumber" name="L6038" href="#L6038">6038</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
+<a class="jxr_linenumber" name="L6039" href="#L6039">6039</a> <strong class="jxr_keyword">return</strong> str.replaceAll(<span class="jxr_string">"\\p{C}"</span>, <span class="jxr_string">""</span>);
+<a class="jxr_linenumber" name="L6040" href="#L6040">6040</a> }
+<a class="jxr_linenumber" name="L6041" href="#L6041">6041</a>
+<a class="jxr_linenumber" name="L6042" href="#L6042">6042</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L6043" href="#L6043">6043</a> <em class="jxr_javadoccomment"> * Removes a prefix from a string if present.</em>
+<a class="jxr_linenumber" name="L6044" href="#L6044">6044</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6045" href="#L6045">6045</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
+<a class="jxr_linenumber" name="L6046" href="#L6046">6046</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
+<a class="jxr_linenumber" name="L6047" href="#L6047">6047</a> <em class="jxr_javadoccomment"> * removeStart(<jk>null</jk>, <js>"x"</js>); <jc>// null</jc></em>
+<a class="jxr_linenumber" name="L6048" href="#L6048">6048</a> <em class="jxr_javadoccomment"> * removeStart(<js>"hello"</js>, <jk>null</jk>); <jc>// "hello"</jc></em>
+<a class="jxr_linenumber" name="L6049" href="#L6049">6049</a> <em class="jxr_javadoccomment"> * removeStart(<js>"hello world"</js>, <js>"hello"</js>); <jc>// " world"</jc></em>
+<a class="jxr_linenumber" name="L6050" href="#L6050">6050</a> <em class="jxr_javadoccomment"> * removeStart(<js>"hello world"</js>, <js>"xyz"</js>); <jc>// "hello world"</jc></em>
+<a class="jxr_linenumber" name="L6051" href="#L6051">6051</a> <em class="jxr_javadoccomment"> * </p></em>
+<a class="jxr_linenumber" name="L6052" href="#L6052">6052</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6053" href="#L6053">6053</a> <em class="jxr_javadoccomment"> * @param str The string to process.</em>
+<a class="jxr_linenumber" name="L6054" href="#L6054">6054</a> <em class="jxr_javadoccomment"> * @param prefix The prefix to remove.</em>
+<a class="jxr_linenumber" name="L6055" href="#L6055">6055</a> <em class="jxr_javadoccomment"> * @return The string with the prefix removed if present, or <jk>null</jk> if input is <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L6056" href="#L6056">6056</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L6057" href="#L6057">6057</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String removeStart(String str, String prefix) {
+<a class="jxr_linenumber" name="L6058" href="#L6058">6058</a> <strong class="jxr_keyword">if</strong> (isEmpty(str) || isEmpty(prefix))
+<a class="jxr_linenumber" name="L6059" href="#L6059">6059</a> <strong class="jxr_keyword">return</strong> str;
+<a class="jxr_linenumber" name="L6060" href="#L6060">6060</a> <strong class="jxr_keyword">if</strong> (str.startsWith(prefix))
+<a class="jxr_linenumber" name="L6061" href="#L6061">6061</a> <strong class="jxr_keyword">return</strong> str.substring(prefix.length());
+<a class="jxr_linenumber" name="L6062" href="#L6062">6062</a> <strong class="jxr_keyword">return</strong> str;
+<a class="jxr_linenumber" name="L6063" href="#L6063">6063</a> }
+<a class="jxr_linenumber" name="L6064" href="#L6064">6064</a>
+<a class="jxr_linenumber" name="L6065" href="#L6065">6065</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L6066" href="#L6066">6066</a> <em class="jxr_javadoccomment"> * Removes all underscore characters from a string.</em>
+<a class="jxr_linenumber" name="L6067" href="#L6067">6067</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6068" href="#L6068">6068</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L6069" href="#L6069">6069</a> <em class="jxr_javadoccomment"> * This method is commonly used to process numeric literals that may contain underscores for readability</em>
+<a class="jxr_linenumber" name="L6070" href="#L6070">6070</a> <em class="jxr_javadoccomment"> * (e.g., <js>"1_000_000"</js> becomes <js>"1000000"</js>), as Java allows underscores in numeric literals</em>
+<a class="jxr_linenumber" name="L6071" href="#L6071">6071</a> <em class="jxr_javadoccomment"> * but some parsing methods do not support them.</em>
+<a class="jxr_linenumber" name="L6072" href="#L6072">6072</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6073" href="#L6073">6073</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L6074" href="#L6074">6074</a> <em class="jxr_javadoccomment"> * If the string does not contain any underscores, the original string is returned (no new object created).</em>
<a class="jxr_linenumber" name="L6075" href="#L6075">6075</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6076" href="#L6076">6076</a> <em class="jxr_javadoccomment"> * @param value The string from which to remove underscores. Must not be <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L6077" href="#L6077">6077</a> <em class="jxr_javadoccomment"> * @return A new string with all underscores removed, or the original string if it contains no underscores.</em>
-<a class="jxr_linenumber" name="L6078" href="#L6078">6078</a> <em class="jxr_javadoccomment"> * @throws IllegalArgumentException If <c>value</c> is <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L6079" href="#L6079">6079</a> <em class="jxr_javadoccomment"> * @see #parseInt(String)</em>
-<a class="jxr_linenumber" name="L6080" href="#L6080">6080</a> <em class="jxr_javadoccomment"> * @see #parseLong(String)</em>
-<a class="jxr_linenumber" name="L6081" href="#L6081">6081</a> <em class="jxr_javadoccomment"> * @see #parseFloat(String)</em>
-<a class="jxr_linenumber" name="L6082" href="#L6082">6082</a> <em class="jxr_javadoccomment"> * @see #parseNumber(String, Class)</em>
-<a class="jxr_linenumber" name="L6083" href="#L6083">6083</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L6084" href="#L6084">6084</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String removeUnderscores(String value) {
-<a class="jxr_linenumber" name="L6085" href="#L6085">6085</a> assertArgNotNull(<span class="jxr_string">"value"</span>, value);
-<a class="jxr_linenumber" name="L6086" href="#L6086">6086</a> <strong class="jxr_keyword">return</strong> notContains(value, '_') ? value : value.replace(<span class="jxr_string">"_"</span>, <span class="jxr_string">""</span>);
-<a class="jxr_linenumber" name="L6087" href="#L6087">6087</a> }
-<a class="jxr_linenumber" name="L6088" href="#L6088">6088</a>
-<a class="jxr_linenumber" name="L6089" href="#L6089">6089</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L6090" href="#L6090">6090</a> <em class="jxr_javadoccomment"> * Creates a repeated pattern.</em>
-<a class="jxr_linenumber" name="L6091" href="#L6091">6091</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6092" href="#L6092">6092</a> <em class="jxr_javadoccomment"> * @param count The number of times to repeat the pattern.</em>
-<a class="jxr_linenumber" name="L6093" href="#L6093">6093</a> <em class="jxr_javadoccomment"> * @param pattern The pattern to repeat.</em>
-<a class="jxr_linenumber" name="L6094" href="#L6094">6094</a> <em class="jxr_javadoccomment"> * @return A new string consisting of the repeated pattern.</em>
-<a class="jxr_linenumber" name="L6095" href="#L6095">6095</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L6096" href="#L6096">6096</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String repeat(<strong class="jxr_keyword">int</strong> count, String pattern) {
-<a class="jxr_linenumber" name="L6097" href="#L6097">6097</a> <strong class="jxr_keyword">var</strong> sb = <strong class="jxr_keyword">new</strong> StringBuilder(pattern.length() * count);
-<a class="jxr_linenumber" name="L6098" href="#L6098">6098</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < count; i++)
-<a class="jxr_linenumber" name="L6099" href="#L6099">6099</a> sb.append(pattern);
-<a class="jxr_linenumber" name="L6100" href="#L6100">6100</a> <strong class="jxr_keyword">return</strong> sb.toString();
-<a class="jxr_linenumber" name="L6101" href="#L6101">6101</a> }
-<a class="jxr_linenumber" name="L6102" href="#L6102">6102</a>
-<a class="jxr_linenumber" name="L6103" href="#L6103">6103</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L6104" href="#L6104">6104</a> <em class="jxr_javadoccomment"> * Replaces <js>"\\uXXXX"</js> character sequences with their unicode characters.</em>
-<a class="jxr_linenumber" name="L6105" href="#L6105">6105</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6106" href="#L6106">6106</a> <em class="jxr_javadoccomment"> * @param s The string to replace unicode sequences in.</em>
-<a class="jxr_linenumber" name="L6107" href="#L6107">6107</a> <em class="jxr_javadoccomment"> * @return A string with unicode sequences replaced.</em>
-<a class="jxr_linenumber" name="L6108" href="#L6108">6108</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L6109" href="#L6109">6109</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String replaceUnicodeSequences(String s) {
-<a class="jxr_linenumber" name="L6110" href="#L6110">6110</a>
-<a class="jxr_linenumber" name="L6111" href="#L6111">6111</a> <strong class="jxr_keyword">if</strong> (s.indexOf('\\') == -1)
-<a class="jxr_linenumber" name="L6112" href="#L6112">6112</a> <strong class="jxr_keyword">return</strong> s;
-<a class="jxr_linenumber" name="L6113" href="#L6113">6113</a>
-<a class="jxr_linenumber" name="L6114" href="#L6114">6114</a> <strong class="jxr_keyword">var</strong> p = Pattern.compile(<span class="jxr_string">"\\\\u(\\p{XDigit}{4})"</span>);
-<a class="jxr_linenumber" name="L6115" href="#L6115">6115</a> <strong class="jxr_keyword">var</strong> m = p.matcher(s);
-<a class="jxr_linenumber" name="L6116" href="#L6116">6116</a> <strong class="jxr_keyword">var</strong> sb = <strong class="jxr_keyword">new</strong> StringBuffer(s.length());
-<a class="jxr_linenumber" name="L6117" href="#L6117">6117</a>
-<a class="jxr_linenumber" name="L6118" href="#L6118">6118</a> <strong class="jxr_keyword">while</strong> (m.find()) {
-<a class="jxr_linenumber" name="L6119" href="#L6119">6119</a> <strong class="jxr_keyword">var</strong> ch = String.valueOf((<strong class="jxr_keyword">char</strong>)Integer.parseInt(m.group(1), 16));
-<a class="jxr_linenumber" name="L6120" href="#L6120">6120</a> m.appendReplacement(sb, Matcher.quoteReplacement(ch));
-<a class="jxr_linenumber" name="L6121" href="#L6121">6121</a> }
+<a class="jxr_linenumber" name="L6076" href="#L6076">6076</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
+<a class="jxr_linenumber" name="L6077" href="#L6077">6077</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
+<a class="jxr_linenumber" name="L6078" href="#L6078">6078</a> <em class="jxr_javadoccomment"> * removeUnderscores(<js>"1_000_000"</js>); <jc>// "1000000"</jc></em>
+<a class="jxr_linenumber" name="L6079" href="#L6079">6079</a> <em class="jxr_javadoccomment"> * removeUnderscores(<js>"1_000.5"</js>); <jc>// "1000.5"</jc></em>
+<a class="jxr_linenumber" name="L6080" href="#L6080">6080</a> <em class="jxr_javadoccomment"> * removeUnderscores(<js>"hello_world"</js>); <jc>// "helloworld"</jc></em>
+<a class="jxr_linenumber" name="L6081" href="#L6081">6081</a> <em class="jxr_javadoccomment"> * removeUnderscores(<js>"no_underscores"</js>); <jc>// "nounderscores"</jc></em>
+<a class="jxr_linenumber" name="L6082" href="#L6082">6082</a> <em class="jxr_javadoccomment"> * removeUnderscores(<js>"Hello"</js>); <jc>// "Hello" (no change, same object returned)</jc></em>
+<a class="jxr_linenumber" name="L6083" href="#L6083">6083</a> <em class="jxr_javadoccomment"> * </p></em>
+<a class="jxr_linenumber" name="L6084" href="#L6084">6084</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6085" href="#L6085">6085</a> <em class="jxr_javadoccomment"> * @param value The string from which to remove underscores. Must not be <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L6086" href="#L6086">6086</a> <em class="jxr_javadoccomment"> * @return A new string with all underscores removed, or the original string if it contains no underscores.</em>
+<a class="jxr_linenumber" name="L6087" href="#L6087">6087</a> <em class="jxr_javadoccomment"> * @throws IllegalArgumentException If <c>value</c> is <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L6088" href="#L6088">6088</a> <em class="jxr_javadoccomment"> * @see #parseInt(String)</em>
+<a class="jxr_linenumber" name="L6089" href="#L6089">6089</a> <em class="jxr_javadoccomment"> * @see #parseLong(String)</em>
+<a class="jxr_linenumber" name="L6090" href="#L6090">6090</a> <em class="jxr_javadoccomment"> * @see #parseFloat(String)</em>
+<a class="jxr_linenumber" name="L6091" href="#L6091">6091</a> <em class="jxr_javadoccomment"> * @see #parseNumber(String, Class)</em>
+<a class="jxr_linenumber" name="L6092" href="#L6092">6092</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L6093" href="#L6093">6093</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String removeUnderscores(String value) {
+<a class="jxr_linenumber" name="L6094" href="#L6094">6094</a> assertArgNotNull(<span class="jxr_string">"value"</span>, value);
+<a class="jxr_linenumber" name="L6095" href="#L6095">6095</a> <strong class="jxr_keyword">return</strong> notContains(value, '_') ? value : value.replace(<span class="jxr_string">"_"</span>, <span class="jxr_string">""</span>);
+<a class="jxr_linenumber" name="L6096" href="#L6096">6096</a> }
+<a class="jxr_linenumber" name="L6097" href="#L6097">6097</a>
+<a class="jxr_linenumber" name="L6098" href="#L6098">6098</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L6099" href="#L6099">6099</a> <em class="jxr_javadoccomment"> * Creates a repeated pattern.</em>
+<a class="jxr_linenumber" name="L6100" href="#L6100">6100</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6101" href="#L6101">6101</a> <em class="jxr_javadoccomment"> * @param count The number of times to repeat the pattern.</em>
+<a class="jxr_linenumber" name="L6102" href="#L6102">6102</a> <em class="jxr_javadoccomment"> * @param pattern The pattern to repeat.</em>
+<a class="jxr_linenumber" name="L6103" href="#L6103">6103</a> <em class="jxr_javadoccomment"> * @return A new string consisting of the repeated pattern.</em>
+<a class="jxr_linenumber" name="L6104" href="#L6104">6104</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L6105" href="#L6105">6105</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String repeat(<strong class="jxr_keyword">int</strong> count, String pattern) {
+<a class="jxr_linenumber" name="L6106" href="#L6106">6106</a> <strong class="jxr_keyword">var</strong> sb = <strong class="jxr_keyword">new</strong> StringBuilder(pattern.length() * count);
+<a class="jxr_linenumber" name="L6107" href="#L6107">6107</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < count; i++)
+<a class="jxr_linenumber" name="L6108" href="#L6108">6108</a> sb.append(pattern);
+<a class="jxr_linenumber" name="L6109" href="#L6109">6109</a> <strong class="jxr_keyword">return</strong> sb.toString();
+<a class="jxr_linenumber" name="L6110" href="#L6110">6110</a> }
+<a class="jxr_linenumber" name="L6111" href="#L6111">6111</a>
+<a class="jxr_linenumber" name="L6112" href="#L6112">6112</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L6113" href="#L6113">6113</a> <em class="jxr_javadoccomment"> * Replaces <js>"\\uXXXX"</js> character sequences with their unicode characters.</em>
+<a class="jxr_linenumber" name="L6114" href="#L6114">6114</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6115" href="#L6115">6115</a> <em class="jxr_javadoccomment"> * @param s The string to replace unicode sequences in.</em>
+<a class="jxr_linenumber" name="L6116" href="#L6116">6116</a> <em class="jxr_javadoccomment"> * @return A string with unicode sequences replaced.</em>
+<a class="jxr_linenumber" name="L6117" href="#L6117">6117</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L6118" href="#L6118">6118</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String replaceUnicodeSequences(String s) {
+<a class="jxr_linenumber" name="L6119" href="#L6119">6119</a>
+<a class="jxr_linenumber" name="L6120" href="#L6120">6120</a> <strong class="jxr_keyword">if</strong> (s.indexOf('\\') == -1)
+<a class="jxr_linenumber" name="L6121" href="#L6121">6121</a> <strong class="jxr_keyword">return</strong> s;
<a class="jxr_linenumber" name="L6122" href="#L6122">6122</a>
-<a class="jxr_linenumber" name="L6123" href="#L6123">6123</a> m.appendTail(sb);
-<a class="jxr_linenumber" name="L6124" href="#L6124">6124</a> <strong class="jxr_keyword">return</strong> sb.toString();
-<a class="jxr_linenumber" name="L6125" href="#L6125">6125</a> }
+<a class="jxr_linenumber" name="L6123" href="#L6123">6123</a> <strong class="jxr_keyword">var</strong> p = Pattern.compile(<span class="jxr_string">"\\\\u(\\p{XDigit}{4})"</span>);
+<a class="jxr_linenumber" name="L6124" href="#L6124">6124</a> <strong class="jxr_keyword">var</strong> m = p.matcher(s);
+<a class="jxr_linenumber" name="L6125" href="#L6125">6125</a> <strong class="jxr_keyword">var</strong> sb = <strong class="jxr_keyword">new</strong> StringBuffer(s.length());
<a class="jxr_linenumber" name="L6126" href="#L6126">6126</a>
-<a class="jxr_linenumber" name="L6127" href="#L6127">6127</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L6128" href="#L6128">6128</a> <em class="jxr_javadoccomment"> * Reverses a string.</em>
-<a class="jxr_linenumber" name="L6129" href="#L6129">6129</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6130" href="#L6130">6130</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
-<a class="jxr_linenumber" name="L6131" href="#L6131">6131</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L6132" href="#L6132">6132</a> <em class="jxr_javadoccomment"> * reverse(<jk>null</jk>); <jc>// null</jc></em>
-<a class="jxr_linenumber" name="L6133" href="#L6133">6133</a> <em class="jxr_javadoccomment"> * reverse(<js>""</js>); <jc>// ""</jc></em>
-<a class="jxr_linenumber" name="L6134" href="#L6134">6134</a> <em class="jxr_javadoccomment"> * reverse(<js>"hello"</js>); <jc>// "olleh"</jc></em>
-<a class="jxr_linenumber" name="L6135" href="#L6135">6135</a> <em class="jxr_javadoccomment"> * </p></em>
-<a class="jxr_linenumber" name="L6136" href="#L6136">6136</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6137" href="#L6137">6137</a> <em class="jxr_javadoccomment"> * @param str The string to reverse.</em>
-<a class="jxr_linenumber" name="L6138" href="#L6138">6138</a> <em class="jxr_javadoccomment"> * @return The reversed string, or <jk>null</jk> if input is <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L6139" href="#L6139">6139</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L6140" href="#L6140">6140</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String reverse(String str) {
-<a class="jxr_linenumber" name="L6141" href="#L6141">6141</a> <strong class="jxr_keyword">if</strong> (str == <strong class="jxr_keyword">null</strong>)
-<a class="jxr_linenumber" name="L6142" href="#L6142">6142</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
-<a class="jxr_linenumber" name="L6143" href="#L6143">6143</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">new</strong> StringBuilder(str).reverse().toString();
-<a class="jxr_linenumber" name="L6144" href="#L6144">6144</a> }
-<a class="jxr_linenumber" name="L6145" href="#L6145">6145</a>
-<a class="jxr_linenumber" name="L6146" href="#L6146">6146</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L6147" href="#L6147">6147</a> <em class="jxr_javadoccomment"> * Returns the rightmost characters of a string.</em>
-<a class="jxr_linenumber" name="L6148" href="#L6148">6148</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6149" href="#L6149">6149</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
-<a class="jxr_linenumber" name="L6150" href="#L6150">6150</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L6151" href="#L6151">6151</a> <em class="jxr_javadoccomment"> * right(<jk>null</jk>, 3); <jc>// null</jc></em>
-<a class="jxr_linenumber" name="L6152" href="#L6152">6152</a> <em class="jxr_javadoccomment"> * right(<js>""</js>, 3); <jc>// ""</jc></em>
-<a class="jxr_linenumber" name="L6153" href="#L6153">6153</a> <em class="jxr_javadoccomment"> * right(<js>"hello"</js>, 3); <jc>// "llo"</jc></em>
-<a class="jxr_linenumber" name="L6154" href="#L6154">6154</a> <em class="jxr_javadoccomment"> * right(<js>"hello"</js>, 10); <jc>// "hello"</jc></em>
-<a class="jxr_linenumber" name="L6155" href="#L6155">6155</a> <em class="jxr_javadoccomment"> * </p></em>
-<a class="jxr_linenumber" name="L6156" href="#L6156">6156</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6157" href="#L6157">6157</a> <em class="jxr_javadoccomment"> * @param str The string to get characters from.</em>
-<a class="jxr_linenumber" name="L6158" href="#L6158">6158</a> <em class="jxr_javadoccomment"> * @param len The number of characters to get.</em>
-<a class="jxr_linenumber" name="L6159" href="#L6159">6159</a> <em class="jxr_javadoccomment"> * @return The rightmost characters, or <jk>null</jk> if input is <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L6160" href="#L6160">6160</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L6161" href="#L6161">6161</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String right(String str, <strong class="jxr_keyword">int</strong> len) {
-<a class="jxr_linenumber" name="L6162" href="#L6162">6162</a> <strong class="jxr_keyword">if</strong> (str == <strong class="jxr_keyword">null</strong>)
-<a class="jxr_linenumber" name="L6163" href="#L6163">6163</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
-<a class="jxr_linenumber" name="L6164" href="#L6164">6164</a> <strong class="jxr_keyword">if</strong> (len < 0)
-<a class="jxr_linenumber" name="L6165" href="#L6165">6165</a> <strong class="jxr_keyword">return</strong> <span class="jxr_string">""</span>;
-<a class="jxr_linenumber" name="L6166" href="#L6166">6166</a> <strong class="jxr_keyword">if</strong> (len >= str.length())
-<a class="jxr_linenumber" name="L6167" href="#L6167">6167</a> <strong class="jxr_keyword">return</strong> str;
-<a class="jxr_linenumber" name="L6168" href="#L6168">6168</a> <strong class="jxr_keyword">return</strong> str.substring(str.length() - len);
-<a class="jxr_linenumber" name="L6169" href="#L6169">6169</a> }
-<a class="jxr_linenumber" name="L6170" href="#L6170">6170</a>
-<a class="jxr_linenumber" name="L6171" href="#L6171">6171</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L6172" href="#L6172">6172</a> <em class="jxr_javadoccomment"> * Basic HTML/XML sanitization - removes or escapes potentially dangerous content.</em>
-<a class="jxr_linenumber" name="L6173" href="#L6173">6173</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6174" href="#L6174">6174</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L6175" href="#L6175">6175</a> <em class="jxr_javadoccomment"> * Removes HTML/XML tags and escapes special characters to prevent XSS attacks.</em>
-<a class="jxr_linenumber" name="L6176" href="#L6176">6176</a> <em class="jxr_javadoccomment"> * This is a basic sanitization - for production use, consider a more robust library.</em>
-<a class="jxr_linenumber" name="L6177" href="#L6177">6177</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6178" href="#L6178">6178</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
-<a class="jxr_linenumber" name="L6179" href="#L6179">6179</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L6180" href="#L6180">6180</a> <em class="jxr_javadoccomment"> * sanitize(<js>"&lt;script&gt;alert('xss')&lt;/script&gt;"</js>); <jc>// "&amp;lt;script&amp;gt;alert('xss')&amp;lt;/script&amp;gt;"</jc></em>
-<a class="jxr_linenumber" name="L6181" href="#L6181">6181</a> <em class="jxr_javadoccomment"> * sanitize(<js>"Hello &lt;b&gt;World&lt;/b&gt;"</js>); <jc>// "Hello &amp;lt;b&amp;gt;World&amp;lt;/b&amp;gt;"</jc></em>
-<a class="jxr_linenumber" name="L6182" href="#L6182">6182</a> <em class="jxr_javadoccomment"> * </p></em>
-<a class="jxr_linenumber" name="L6183" href="#L6183">6183</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6184" href="#L6184">6184</a> <em class="jxr_javadoccomment"> * @param str The string to sanitize.</em>
-<a class="jxr_linenumber" name="L6185" href="#L6185">6185</a> <em class="jxr_javadoccomment"> * @return The sanitized string with HTML/XML tags escaped, or <jk>null</jk> if input is <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L6186" href="#L6186">6186</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L6187" href="#L6187">6187</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String sanitize(String str) {
-<a class="jxr_linenumber" name="L6188" href="#L6188">6188</a> <strong class="jxr_keyword">if</strong> (str == <strong class="jxr_keyword">null</strong>)
-<a class="jxr_linenumber" name="L6189" href="#L6189">6189</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
-<a class="jxr_linenumber" name="L6190" href="#L6190">6190</a> <em class="jxr_comment">// Escape HTML/XML special characters</em>
-<a class="jxr_linenumber" name="L6191" href="#L6191">6191</a> <strong class="jxr_keyword">return</strong> escapeHtml(str);
-<a class="jxr_linenumber" name="L6192" href="#L6192">6192</a> }
-<a class="jxr_linenumber" name="L6193" href="#L6193">6193</a>
-<a class="jxr_linenumber" name="L6194" href="#L6194">6194</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L6195" href="#L6195">6195</a> <em class="jxr_javadoccomment"> * Calculates the similarity percentage between two strings using Levenshtein distance.</em>
-<a class="jxr_linenumber" name="L6196" href="#L6196">6196</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6197" href="#L6197">6197</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L6198" href="#L6198">6198</a> <em class="jxr_javadoccomment"> * Returns a value between 0.0 (completely different) and 1.0 (identical).</em>
-<a class="jxr_linenumber" name="L6199" href="#L6199">6199</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6200" href="#L6200">6200</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
-<a class="jxr_linenumber" name="L6201" href="#L6201">6201</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L6202" href="#L6202">6202</a> <em class="jxr_javadoccomment"> * similarity(<js>"hello"</js>, <js>"hello"</js>); <jc>// 1.0 (100%)</jc></em>
-<a class="jxr_linenumber" name="L6203" href="#L6203">6203</a> <em class="jxr_javadoccomment"> * similarity(<js>"kitten"</js>, <js>"sitting"</js>); <jc>// ~0.57 (57%)</jc></em>
-<a class="jxr_linenumber" name="L6204" href="#L6204">6204</a> <em class="jxr_javadoccomment"> * similarity(<js>"abc"</js>, <js>"xyz"</js>); <jc>// 0.0 (0%)</jc></em>
-<a class="jxr_linenumber" name="L6205" href="#L6205">6205</a> <em class="jxr_javadoccomment"> * </p></em>
-<a class="jxr_linenumber" name="L6206" href="#L6206">6206</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6207" href="#L6207">6207</a> <em class="jxr_javadoccomment"> * @param str1 The first string.</em>
-<a class="jxr_linenumber" name="L6208" href="#L6208">6208</a> <em class="jxr_javadoccomment"> * @param str2 The second string.</em>
-<a class="jxr_linenumber" name="L6209" href="#L6209">6209</a> <em class="jxr_javadoccomment"> * @return A similarity value between 0.0 and 1.0, where 1.0 means identical.</em>
-<a class="jxr_linenumber" name="L6210" href="#L6210">6210</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L6211" href="#L6211">6211</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">double</strong> similarity(String str1, String str2) {
-<a class="jxr_linenumber" name="L6212" href="#L6212">6212</a> <strong class="jxr_keyword">if</strong> (str1 == <strong class="jxr_keyword">null</strong>)
-<a class="jxr_linenumber" name="L6213" href="#L6213">6213</a> str1 = <span class="jxr_string">""</span>;
-<a class="jxr_linenumber" name="L6214" href="#L6214">6214</a> <strong class="jxr_keyword">if</strong> (str2 == <strong class="jxr_keyword">null</strong>)
-<a class="jxr_linenumber" name="L6215" href="#L6215">6215</a> str2 = <span class="jxr_string">""</span>;
-<a class="jxr_linenumber" name="L6216" href="#L6216">6216</a>
-<a class="jxr_linenumber" name="L6217" href="#L6217">6217</a> <strong class="jxr_keyword">if</strong> (str1.equals(str2))
-<a class="jxr_linenumber" name="L6218" href="#L6218">6218</a> <strong class="jxr_keyword">return</strong> 1.0;
-<a class="jxr_linenumber" name="L6219" href="#L6219">6219</a>
-<a class="jxr_linenumber" name="L6220" href="#L6220">6220</a> <strong class="jxr_keyword">var</strong> maxLen = Math.max(str1.length(), str2.length());
-<a class="jxr_linenumber" name="L6221" href="#L6221">6221</a> <strong class="jxr_keyword">if</strong> (maxLen == 0)
-<a class="jxr_linenumber" name="L6222" href="#L6222">6222</a> <strong class="jxr_keyword">return</strong> 1.0;
-<a class="jxr_linenumber" name="L6223" href="#L6223">6223</a>
-<a class="jxr_linenumber" name="L6224" href="#L6224">6224</a> <strong class="jxr_keyword">var</strong> distance = levenshteinDistance(str1, str2);
-<a class="jxr_linenumber" name="L6225" href="#L6225">6225</a> <strong class="jxr_keyword">return</strong> 1.0 - ((<strong class="jxr_keyword">double</strong>)distance / maxLen);
-<a class="jxr_linenumber" name="L6226" href="#L6226">6226</a> }
-<a class="jxr_linenumber" name="L6227" href="#L6227">6227</a>
-<a class="jxr_linenumber" name="L6228" href="#L6228">6228</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L6229" href="#L6229">6229</a> <em class="jxr_javadoccomment"> * Converts a string to snake_case format.</em>
-<a class="jxr_linenumber" name="L6230" href="#L6230">6230</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6231" href="#L6231">6231</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L6232" href="#L6232">6232</a> <em class="jxr_javadoccomment"> * Handles various input formats:</em>
-<a class="jxr_linenumber" name="L6233" href="#L6233">6233</a> <em class="jxr_javadoccomment"> * <ul></em>
-<a class="jxr_linenumber" name="L6234" href="#L6234">6234</a> <em class="jxr_javadoccomment"> * <li>Space-separated: "hello world" → "hello_world"</li></em>
-<a class="jxr_linenumber" name="L6235" href="#L6235">6235</a> <em class="jxr_javadoccomment"> * <li>CamelCase: "helloWorld" → "hello_world"</li></em>
-<a class="jxr_linenumber" name="L6236" href="#L6236">6236</a> <em class="jxr_javadoccomment"> * <li>PascalCase: "HelloWorld" → "hello_world"</li></em>
-<a class="jxr_linenumber" name="L6237" href="#L6237">6237</a> <em class="jxr_javadoccomment"> * <li>Kebab-case: "hello-world" → "hello_world"</li></em>
-<a class="jxr_linenumber" name="L6238" href="#L6238">6238</a> <em class="jxr_javadoccomment"> * </ul></em>
+<a class="jxr_linenumber" name="L6127" href="#L6127">6127</a> <strong class="jxr_keyword">while</strong> (m.find()) {
+<a class="jxr_linenumber" name="L6128" href="#L6128">6128</a> <strong class="jxr_keyword">var</strong> ch = String.valueOf((<strong class="jxr_keyword">char</strong>)Integer.parseInt(m.group(1), 16));
+<a class="jxr_linenumber" name="L6129" href="#L6129">6129</a> m.appendReplacement(sb, Matcher.quoteReplacement(ch));
+<a class="jxr_linenumber" name="L6130" href="#L6130">6130</a> }
+<a class="jxr_linenumber" name="L6131" href="#L6131">6131</a>
+<a class="jxr_linenumber" name="L6132" href="#L6132">6132</a> m.appendTail(sb);
+<a class="jxr_linenumber" name="L6133" href="#L6133">6133</a> <strong class="jxr_keyword">return</strong> sb.toString();
+<a class="jxr_linenumber" name="L6134" href="#L6134">6134</a> }
+<a class="jxr_linenumber" name="L6135" href="#L6135">6135</a>
+<a class="jxr_linenumber" name="L6136" href="#L6136">6136</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L6137" href="#L6137">6137</a> <em class="jxr_javadoccomment"> * Reverses a string.</em>
+<a class="jxr_linenumber" name="L6138" href="#L6138">6138</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6139" href="#L6139">6139</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
+<a class="jxr_linenumber" name="L6140" href="#L6140">6140</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
+<a class="jxr_linenumber" name="L6141" href="#L6141">6141</a> <em class="jxr_javadoccomment"> * reverse(<jk>null</jk>); <jc>// null</jc></em>
+<a class="jxr_linenumber" name="L6142" href="#L6142">6142</a> <em class="jxr_javadoccomment"> * reverse(<js>""</js>); <jc>// ""</jc></em>
+<a class="jxr_linenumber" name="L6143" href="#L6143">6143</a> <em class="jxr_javadoccomment"> * reverse(<js>"hello"</js>); <jc>// "olleh"</jc></em>
+<a class="jxr_linenumber" name="L6144" href="#L6144">6144</a> <em class="jxr_javadoccomment"> * </p></em>
+<a class="jxr_linenumber" name="L6145" href="#L6145">6145</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6146" href="#L6146">6146</a> <em class="jxr_javadoccomment"> * @param str The string to reverse.</em>
+<a class="jxr_linenumber" name="L6147" href="#L6147">6147</a> <em class="jxr_javadoccomment"> * @return The reversed string, or <jk>null</jk> if input is <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L6148" href="#L6148">6148</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L6149" href="#L6149">6149</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String reverse(String str) {
+<a class="jxr_linenumber" name="L6150" href="#L6150">6150</a> <strong class="jxr_keyword">if</strong> (str == <strong class="jxr_keyword">null</strong>)
+<a class="jxr_linenumber" name="L6151" href="#L6151">6151</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
+<a class="jxr_linenumber" name="L6152" href="#L6152">6152</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">new</strong> StringBuilder(str).reverse().toString();
+<a class="jxr_linenumber" name="L6153" href="#L6153">6153</a> }
+<a class="jxr_linenumber" name="L6154" href="#L6154">6154</a>
+<a class="jxr_linenumber" name="L6155" href="#L6155">6155</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L6156" href="#L6156">6156</a> <em class="jxr_javadoccomment"> * Returns the rightmost characters of a string.</em>
+<a class="jxr_linenumber" name="L6157" href="#L6157">6157</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6158" href="#L6158">6158</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
+<a class="jxr_linenumber" name="L6159" href="#L6159">6159</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
+<a class="jxr_linenumber" name="L6160" href="#L6160">6160</a> <em class="jxr_javadoccomment"> * right(<jk>null</jk>, 3); <jc>// null</jc></em>
+<a class="jxr_linenumber" name="L6161" href="#L6161">6161</a> <em class="jxr_javadoccomment"> * right(<js>""</js>, 3); <jc>// ""</jc></em>
+<a class="jxr_linenumber" name="L6162" href="#L6162">6162</a> <em class="jxr_javadoccomment"> * right(<js>"hello"</js>, 3); <jc>// "llo"</jc></em>
+<a class="jxr_linenumber" name="L6163" href="#L6163">6163</a> <em class="jxr_javadoccomment"> * right(<js>"hello"</js>, 10); <jc>// "hello"</jc></em>
+<a class="jxr_linenumber" name="L6164" href="#L6164">6164</a> <em class="jxr_javadoccomment"> * </p></em>
+<a class="jxr_linenumber" name="L6165" href="#L6165">6165</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6166" href="#L6166">6166</a> <em class="jxr_javadoccomment"> * @param str The string to get characters from.</em>
+<a class="jxr_linenumber" name="L6167" href="#L6167">6167</a> <em class="jxr_javadoccomment"> * @param len The number of characters to get.</em>
+<a class="jxr_linenumber" name="L6168" href="#L6168">6168</a> <em class="jxr_javadoccomment"> * @return The rightmost characters, or <jk>null</jk> if input is <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L6169" href="#L6169">6169</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L6170" href="#L6170">6170</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String right(String str, <strong class="jxr_keyword">int</strong> len) {
+<a class="jxr_linenumber" name="L6171" href="#L6171">6171</a> <strong class="jxr_keyword">if</strong> (str == <strong class="jxr_keyword">null</strong>)
+<a class="jxr_linenumber" name="L6172" href="#L6172">6172</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
+<a class="jxr_linenumber" name="L6173" href="#L6173">6173</a> <strong class="jxr_keyword">if</strong> (len < 0)
+<a class="jxr_linenumber" name="L6174" href="#L6174">6174</a> <strong class="jxr_keyword">return</strong> <span class="jxr_string">""</span>;
+<a class="jxr_linenumber" name="L6175" href="#L6175">6175</a> <strong class="jxr_keyword">if</strong> (len >= str.length())
+<a class="jxr_linenumber" name="L6176" href="#L6176">6176</a> <strong class="jxr_keyword">return</strong> str;
+<a class="jxr_linenumber" name="L6177" href="#L6177">6177</a> <strong class="jxr_keyword">return</strong> str.substring(str.length() - len);
+<a class="jxr_linenumber" name="L6178" href="#L6178">6178</a> }
+<a class="jxr_linenumber" name="L6179" href="#L6179">6179</a>
+<a class="jxr_linenumber" name="L6180" href="#L6180">6180</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L6181" href="#L6181">6181</a> <em class="jxr_javadoccomment"> * Basic HTML/XML sanitization - removes or escapes potentially dangerous content.</em>
+<a class="jxr_linenumber" name="L6182" href="#L6182">6182</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6183" href="#L6183">6183</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L6184" href="#L6184">6184</a> <em class="jxr_javadoccomment"> * Removes HTML/XML tags and escapes special characters to prevent XSS attacks.</em>
+<a class="jxr_linenumber" name="L6185" href="#L6185">6185</a> <em class="jxr_javadoccomment"> * This is a basic sanitization - for production use, consider a more robust library.</em>
+<a class="jxr_linenumber" name="L6186" href="#L6186">6186</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6187" href="#L6187">6187</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
+<a class="jxr_linenumber" name="L6188" href="#L6188">6188</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
+<a class="jxr_linenumber" name="L6189" href="#L6189">6189</a> <em class="jxr_javadoccomment"> * sanitize(<js>"&lt;script&gt;alert('xss')&lt;/script&gt;"</js>); <jc>// "&amp;lt;script&amp;gt;alert('xss')&amp;lt;/script&amp;gt;"</jc></em>
+<a class="jxr_linenumber" name="L6190" href="#L6190">6190</a> <em class="jxr_javadoccomment"> * sanitize(<js>"Hello &lt;b&gt;World&lt;/b&gt;"</js>); <jc>// "Hello &amp;lt;b&amp;gt;World&amp;lt;/b&amp;gt;"</jc></em>
+<a class="jxr_linenumber" name="L6191" href="#L6191">6191</a> <em class="jxr_javadoccomment"> * </p></em>
+<a class="jxr_linenumber" name="L6192" href="#L6192">6192</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6193" href="#L6193">6193</a> <em class="jxr_javadoccomment"> * @param str The string to sanitize.</em>
+<a class="jxr_linenumber" name="L6194" href="#L6194">6194</a> <em class="jxr_javadoccomment"> * @return The sanitized string with HTML/XML tags escaped, or <jk>null</jk> if input is <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L6195" href="#L6195">6195</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L6196" href="#L6196">6196</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String sanitize(String str) {
+<a class="jxr_linenumber" name="L6197" href="#L6197">6197</a> <strong class="jxr_keyword">if</strong> (str == <strong class="jxr_keyword">null</strong>)
+<a class="jxr_linenumber" name="L6198" href="#L6198">6198</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
+<a class="jxr_linenumber" name="L6199" href="#L6199">6199</a> <em class="jxr_comment">// Escape HTML/XML special characters</em>
+<a class="jxr_linenumber" name="L6200" href="#L6200">6200</a> <strong class="jxr_keyword">return</strong> escapeHtml(str);
+<a class="jxr_linenumber" name="L6201" href="#L6201">6201</a> }
+<a class="jxr_linenumber" name="L6202" href="#L6202">6202</a>
+<a class="jxr_linenumber" name="L6203" href="#L6203">6203</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L6204" href="#L6204">6204</a> <em class="jxr_javadoccomment"> * Calculates the similarity percentage between two strings using Levenshtein distance.</em>
+<a class="jxr_linenumber" name="L6205" href="#L6205">6205</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6206" href="#L6206">6206</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L6207" href="#L6207">6207</a> <em class="jxr_javadoccomment"> * Returns a value between 0.0 (completely different) and 1.0 (identical).</em>
+<a class="jxr_linenumber" name="L6208" href="#L6208">6208</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6209" href="#L6209">6209</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
+<a class="jxr_linenumber" name="L6210" href="#L6210">6210</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
+<a class="jxr_linenumber" name="L6211" href="#L6211">6211</a> <em class="jxr_javadoccomment"> * similarity(<js>"hello"</js>, <js>"hello"</js>); <jc>// 1.0 (100%)</jc></em>
+<a class="jxr_linenumber" name="L6212" href="#L6212">6212</a> <em class="jxr_javadoccomment"> * similarity(<js>"kitten"</js>, <js>"sitting"</js>); <jc>// ~0.57 (57%)</jc></em>
+<a class="jxr_linenumber" name="L6213" href="#L6213">6213</a> <em class="jxr_javadoccomment"> * similarity(<js>"abc"</js>, <js>"xyz"</js>); <jc>// 0.0 (0%)</jc></em>
+<a class="jxr_linenumber" name="L6214" href="#L6214">6214</a> <em class="jxr_javadoccomment"> * </p></em>
+<a class="jxr_linenumber" name="L6215" href="#L6215">6215</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6216" href="#L6216">6216</a> <em class="jxr_javadoccomment"> * @param str1 The first string.</em>
+<a class="jxr_linenumber" name="L6217" href="#L6217">6217</a> <em class="jxr_javadoccomment"> * @param str2 The second string.</em>
+<a class="jxr_linenumber" name="L6218" href="#L6218">6218</a> <em class="jxr_javadoccomment"> * @return A similarity value between 0.0 and 1.0, where 1.0 means identical.</em>
+<a class="jxr_linenumber" name="L6219" href="#L6219">6219</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L6220" href="#L6220">6220</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">double</strong> similarity(String str1, String str2) {
+<a class="jxr_linenumber" name="L6221" href="#L6221">6221</a> <strong class="jxr_keyword">if</strong> (str1 == <strong class="jxr_keyword">null</strong>)
+<a class="jxr_linenumber" name="L6222" href="#L6222">6222</a> str1 = <span class="jxr_string">""</span>;
+<a class="jxr_linenumber" name="L6223" href="#L6223">6223</a> <strong class="jxr_keyword">if</strong> (str2 == <strong class="jxr_keyword">null</strong>)
+<a class="jxr_linenumber" name="L6224" href="#L6224">6224</a> str2 = <span class="jxr_string">""</span>;
+<a class="jxr_linenumber" name="L6225" href="#L6225">6225</a>
+<a class="jxr_linenumber" name="L6226" href="#L6226">6226</a> <strong class="jxr_keyword">if</strong> (str1.equals(str2))
+<a class="jxr_linenumber" name="L6227" href="#L6227">6227</a> <strong class="jxr_keyword">return</strong> 1.0;
+<a class="jxr_linenumber" name="L6228" href="#L6228">6228</a>
+<a class="jxr_linenumber" name="L6229" href="#L6229">6229</a> <strong class="jxr_keyword">var</strong> maxLen = Math.max(str1.length(), str2.length());
+<a class="jxr_linenumber" name="L6230" href="#L6230">6230</a> <strong class="jxr_keyword">if</strong> (maxLen == 0)
+<a class="jxr_linenumber" name="L6231" href="#L6231">6231</a> <strong class="jxr_keyword">return</strong> 1.0;
+<a class="jxr_linenumber" name="L6232" href="#L6232">6232</a>
+<a class="jxr_linenumber" name="L6233" href="#L6233">6233</a> <strong class="jxr_keyword">var</strong> distance = levenshteinDistance(str1, str2);
+<a class="jxr_linenumber" name="L6234" href="#L6234">6234</a> <strong class="jxr_keyword">return</strong> 1.0 - ((<strong class="jxr_keyword">double</strong>)distance / maxLen);
+<a class="jxr_linenumber" name="L6235" href="#L6235">6235</a> }
+<a class="jxr_linenumber" name="L6236" href="#L6236">6236</a>
+<a class="jxr_linenumber" name="L6237" href="#L6237">6237</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L6238" href="#L6238">6238</a> <em class="jxr_javadoccomment"> * Converts a string to snake_case format.</em>
<a class="jxr_linenumber" name="L6239" href="#L6239">6239</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6240" href="#L6240">6240</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
-<a class="jxr_linenumber" name="L6241" href="#L6241">6241</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L6242" href="#L6242">6242</a> <em class="jxr_javadoccomment"> * snakeCase(<jk>null</jk>); <jc>// null</jc></em>
-<a class="jxr_linenumber" name="L6243" href="#L6243">6243</a> <em class="jxr_javadoccomment"> * snakeCase(<js>""</js>); <jc>// ""</jc></em>
-<a class="jxr_linenumber" name="L6244" href="#L6244">6244</a> <em class="jxr_javadoccomment"> * snakeCase(<js>"hello world"</js>); <jc>// "hello_world"</jc></em>
-<a class="jxr_linenumber" name="L6245" href="#L6245">6245</a> <em class="jxr_javadoccomment"> * snakeCase(<js>"helloWorld"</js>); <jc>// "hello_world"</jc></em>
-<a class="jxr_linenumber" name="L6246" href="#L6246">6246</a> <em class="jxr_javadoccomment"> * snakeCase(<js>"HelloWorld"</js>); <jc>// "hello_world"</jc></em>
-<a class="jxr_linenumber" name="L6247" href="#L6247">6247</a> <em class="jxr_javadoccomment"> * snakeCase(<js>"hello-world"</js>); <jc>// "hello_world"</jc></em>
-<a class="jxr_linenumber" name="L6248" href="#L6248">6248</a> <em class="jxr_javadoccomment"> * </p></em>
-<a class="jxr_linenumber" name="L6249" href="#L6249">6249</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6250" href="#L6250">6250</a> <em class="jxr_javadoccomment"> * @param str The string to convert.</em>
-<a class="jxr_linenumber" name="L6251" href="#L6251">6251</a> <em class="jxr_javadoccomment"> * @return The snake_case string, or <jk>null</jk> if input is <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L6252" href="#L6252">6252</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L6253" href="#L6253">6253</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String snakeCase(String str) {
-<a class="jxr_linenumber" name="L6254" href="#L6254">6254</a> <strong class="jxr_keyword">if</strong> (str == <strong class="jxr_keyword">null</strong>)
-<a class="jxr_linenumber" name="L6255" href="#L6255">6255</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
-<a class="jxr_linenumber" name="L6256" href="#L6256">6256</a> <strong class="jxr_keyword">if</strong> (isEmpty(str))
-<a class="jxr_linenumber" name="L6257" href="#L6257">6257</a> <strong class="jxr_keyword">return</strong> str;
-<a class="jxr_linenumber" name="L6258" href="#L6258">6258</a>
-<a class="jxr_linenumber" name="L6259" href="#L6259">6259</a> <strong class="jxr_keyword">var</strong> words = splitWords(str);
-<a class="jxr_linenumber" name="L6260" href="#L6260">6260</a> <strong class="jxr_keyword">if</strong> (words.isEmpty())
-<a class="jxr_linenumber" name="L6261" href="#L6261">6261</a> <strong class="jxr_keyword">return</strong> <span class="jxr_string">""</span>;
-<a class="jxr_linenumber" name="L6262" href="#L6262">6262</a>
-<a class="jxr_linenumber" name="L6263" href="#L6263">6263</a> <strong class="jxr_keyword">var</strong> result = <strong class="jxr_keyword">new</strong> StringBuilder();
-<a class="jxr_linenumber" name="L6264" href="#L6264">6264</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < words.size(); i++) {
-<a class="jxr_linenumber" name="L6265" href="#L6265">6265</a> <strong class="jxr_keyword">if</strong> (i > 0)
-<a class="jxr_linenumber" name="L6266" href="#L6266">6266</a> result.append('_');
-<a class="jxr_linenumber" name="L6267" href="#L6267">6267</a> result.append(words.get(i).toLowerCase());
-<a class="jxr_linenumber" name="L6268" href="#L6268">6268</a> }
-<a class="jxr_linenumber" name="L6269" href="#L6269">6269</a>
-<a class="jxr_linenumber" name="L6270" href="#L6270">6270</a> <strong class="jxr_keyword">return</strong> result.toString();
-<a class="jxr_linenumber" name="L6271" href="#L6271">6271</a> }
-<a class="jxr_linenumber" name="L6272" href="#L6272">6272</a>
-<a class="jxr_linenumber" name="L6273" href="#L6273">6273</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L6274" href="#L6274">6274</a> <em class="jxr_javadoccomment"> * Sorts a string array in natural order.</em>
-<a class="jxr_linenumber" name="L6275" href="#L6275">6275</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6276" href="#L6276">6276</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L6277" href="#L6277">6277</a> <em class="jxr_javadoccomment"> * Returns <jk>null</jk> if the array is <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L6278" href="#L6278">6278</a> <em class="jxr_javadoccomment"> * This method creates a copy of the array and sorts it, leaving the original array unchanged.</em>
-<a class="jxr_linenumber" name="L6279" href="#L6279">6279</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6280" href="#L6280">6280</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Examples:</h5></em>
-<a class="jxr_linenumber" name="L6281" href="#L6281">6281</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L6282" href="#L6282">6282</a> <em class="jxr_javadoccomment"> * String[] <jv>array</jv> = {<js>"zebra"</js>, <js>"apple"</js>, <js>"banana"</js>};</em>
-<a class="jxr_linenumber" name="L6283" href="#L6283">6283</a> <em class="jxr_javadoccomment"> * String[] <jv>sorted</jv> = sort(<jv>array</jv>);</em>
-<a class="jxr_linenumber" name="L6284" href="#L6284">6284</a> <em class="jxr_javadoccomment"> * <jc>// Returns: ["apple", "banana", "zebra"]</jc></em>
-<a class="jxr_linenumber" name="L6285" href="#L6285">6285</a> <em class="jxr_javadoccomment"> * </p></em>
-<a class="jxr_linenumber" name="L6286" href="#L6286">6286</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6287" href="#L6287">6287</a> <em class="jxr_javadoccomment"> * @param array The array to sort. Can be <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L6288" href="#L6288">6288</a> <em class="jxr_javadoccomment"> * @return A new sorted array, or <jk>null</jk> if the array was <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L6289" href="#L6289">6289</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L6290" href="#L6290">6290</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String[] sort(String[] array) {
-<a class="jxr_linenumber" name="L6291" href="#L6291">6291</a> <strong class="jxr_keyword">if</strong> (array == <strong class="jxr_keyword">null</strong>)
-<a class="jxr_linenumber" name="L6292" href="#L6292">6292</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>; <em class="jxr_comment">// NOSONAR - Intentional.</em>
-<a class="jxr_linenumber" name="L6293" href="#L6293">6293</a> <strong class="jxr_keyword">var</strong> result = Arrays.copyOf(array, array.length);
-<a class="jxr_linenumber" name="L6294" href="#L6294">6294</a> Arrays.sort(result);
-<a class="jxr_linenumber" name="L6295" href="#L6295">6295</a> <strong class="jxr_keyword">return</strong> result;
-<a class="jxr_linenumber" name="L6296" href="#L6296">6296</a> }
-<a class="jxr_linenumber" name="L6297" href="#L6297">6297</a>
-<a class="jxr_linenumber" name="L6298" href="#L6298">6298</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L6299" href="#L6299">6299</a> <em class="jxr_javadoccomment"> * Sorts a string array in case-insensitive order.</em>
-<a class="jxr_linenumber" name="L6300" href="#L6300">6300</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6301" href="#L6301">6301</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L6302" href="#L6302">6302</a> <em class="jxr_javadoccomment"> * Returns <jk>null</jk> if the array is <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L6303" href="#L6303">6303</a> <em class="jxr_javadoccomment"> * This method creates a copy of the array and sorts it using case-insensitive comparison,</em>
-<a class="jxr_linenumber" name="L6304" href="#L6304">6304</a> <em class="jxr_javadoccomment"> * leaving the original array unchanged.</em>
-<a class="jxr_linenumber" name="L6305" href="#L6305">6305</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6306" href="#L6306">6306</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Examples:</h5></em>
-<a class="jxr_linenumber" name="L6307" href="#L6307">6307</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L6308" href="#L6308">6308</a> <em class="jxr_javadoccomment"> * String[] <jv>array</jv> = {<js>"Zebra"</js>, <js>"apple"</js>, <js>"Banana"</js>};</em>
-<a class="jxr_linenumber" name="L6309" href="#L6309">6309</a> <em class="jxr_javadoccomment"> * String[] <jv>sorted</jv> = sortIgnoreCase(<jv>array</jv>);</em>
-<a class="jxr_linenumber" name="L6310" href="#L6310">6310</a> <em class="jxr_javadoccomment"> * <jc>// Returns: ["apple", "Banana", "Zebra"]</jc></em>
-<a class="jxr_linenumber" name="L6311" href="#L6311">6311</a> <em class="jxr_javadoccomment"> * </p></em>
-<a class="jxr_linenumber" name="L6312" href="#L6312">6312</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6313" href="#L6313">6313</a> <em class="jxr_javadoccomment"> * @param array The array to sort. Can be <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L6314" href="#L6314">6314</a> <em class="jxr_javadoccomment"> * @return A new sorted array (case-insensitive), or <jk>null</jk> if the array was <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L6315" href="#L6315">6315</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L6316" href="#L6316">6316</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String[] sortIgnoreCase(String[] array) {
-<a class="jxr_linenumber" name="L6317" href="#L6317">6317</a> <strong class="jxr_keyword">if</strong> (array == <strong class="jxr_keyword">null</strong>)
-<a class="jxr_linenumber" name="L6318" href="#L6318">6318</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>; <em class="jxr_comment">// NOSONAR - Intentional.</em>
-<a class="jxr_linenumber" name="L6319" href="#L6319">6319</a> <strong class="jxr_keyword">var</strong> result = Arrays.copyOf(array, array.length);
-<a class="jxr_linenumber" name="L6320" href="#L6320">6320</a> Arrays.sort(result, String.CASE_INSENSITIVE_ORDER);
-<a class="jxr_linenumber" name="L6321" href="#L6321">6321</a> <strong class="jxr_keyword">return</strong> result;
-<a class="jxr_linenumber" name="L6322" href="#L6322">6322</a> }
-<a class="jxr_linenumber" name="L6323" href="#L6323">6323</a>
-<a class="jxr_linenumber" name="L6324" href="#L6324">6324</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L6325" href="#L6325">6325</a> <em class="jxr_javadoccomment"> * Generates a Soundex code for a string.</em>
-<a class="jxr_linenumber" name="L6326" href="#L6326">6326</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6327" href="#L6327">6327</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L6328" href="#L6328">6328</a> <em class="jxr_javadoccomment"> * Soundex is a phonetic algorithm for indexing names by sound. The code consists of</em>
-<a class="jxr_linenumber" name="L6329" href="#L6329">6329</a> <em class="jxr_javadoccomment"> * a letter followed by three digits. Similar-sounding names produce the same code.</em>
-<a class="jxr_linenumber" name="L6330" href="#L6330">6330</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6331" href="#L6331">6331</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
-<a class="jxr_linenumber" name="L6332" href="#L6332">6332</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L6333" href="#L6333">6333</a> <em class="jxr_javadoccomment"> * soundex(<js>"Smith"</js>); <jc>// "S530"</jc></em>
-<a class="jxr_linenumber" name="L6334" href="#L6334">6334</a> <em class="jxr_javadoccomment"> * soundex(<js>"Smythe"</js>); <jc>// "S530"</jc></em>
-<a class="jxr_linenumber" name="L6335" href="#L6335">6335</a> <em class="jxr_javadoccomment"> * soundex(<js>"Robert"</js>); <jc>// "R163"</jc></em>
-<a class="jxr_linenumber" name="L6336" href="#L6336">6336</a> <em class="jxr_javadoccomment"> * </p></em>
-<a class="jxr_linenumber" name="L6337" href="#L6337">6337</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6338" href="#L6338">6338</a> <em class="jxr_javadoccomment"> * @param str The string to generate a Soundex code for. Can be <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L6339" href="#L6339">6339</a> <em class="jxr_javadoccomment"> * @return The Soundex code (1 letter + 3 digits), or <jk>null</jk> if input is <jk>null</jk> or empty.</em>
-<a class="jxr_linenumber" name="L6340" href="#L6340">6340</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L6341" href="#L6341">6341</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String soundex(String str) {
-<a class="jxr_linenumber" name="L6342" href="#L6342">6342</a> <strong class="jxr_keyword">if</strong> (isEmpty(str))
-<a class="jxr_linenumber" name="L6343" href="#L6343">6343</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
-<a class="jxr_linenumber" name="L6344" href="#L6344">6344</a>
-<a class="jxr_linenumber" name="L6345" href="#L6345">6345</a> <strong class="jxr_keyword">var</strong> upper = str.toUpperCase();
-<a class="jxr_linenumber" name="L6346" href="#L6346">6346</a> <strong class="jxr_keyword">var</strong> result = <strong class="jxr_keyword">new</strong> StringBuilder(4);
-<a class="jxr_linenumber" name="L6347" href="#L6347">6347</a> result.append(upper.charAt(0));
-<a class="jxr_linenumber" name="L6348" href="#L6348">6348</a>
-<a class="jxr_linenumber" name="L6349" href="#L6349">6349</a> <em class="jxr_comment">// Soundex mapping: 0 = AEIOUHWY, 1 = BFPV, 2 = CGJKQSXZ, 3 = DT, 4 = L, 5 = MN, 6 = R</em>
-<a class="jxr_linenumber" name="L6350" href="#L6350">6350</a> <em class="jxr_comment">// H/W/Y don't get codes but don't break sequences either</em>
-<a class="jxr_linenumber" name="L6351" href="#L6351">6351</a> <em class="jxr_comment">// Initialize lastCode to a value that won't match any real code</em>
-<a class="jxr_linenumber" name="L6352" href="#L6352">6352</a> <strong class="jxr_keyword">var</strong> lastCode = '\0';
+<a class="jxr_linenumber" name="L6240" href="#L6240">6240</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L6241" href="#L6241">6241</a> <em class="jxr_javadoccomment"> * Handles various input formats:</em>
+<a class="jxr_linenumber" name="L6242" href="#L6242">6242</a> <em class="jxr_javadoccomment"> * <ul></em>
+<a class="jxr_linenumber" name="L6243" href="#L6243">6243</a> <em class="jxr_javadoccomment"> * <li>Space-separated: "hello world" → "hello_world"</li></em>
+<a class="jxr_linenumber" name="L6244" href="#L6244">6244</a> <em class="jxr_javadoccomment"> * <li>CamelCase: "helloWorld" → "hello_world"</li></em>
+<a class="jxr_linenumber" name="L6245" href="#L6245">6245</a> <em class="jxr_javadoccomment"> * <li>PascalCase: "HelloWorld" → "hello_world"</li></em>
+<a class="jxr_linenumber" name="L6246" href="#L6246">6246</a> <em class="jxr_javadoccomment"> * <li>Kebab-case: "hello-world" → "hello_world"</li></em>
+<a class="jxr_linenumber" name="L6247" href="#L6247">6247</a> <em class="jxr_javadoccomment"> * </ul></em>
+<a class="jxr_linenumber" name="L6248" href="#L6248">6248</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6249" href="#L6249">6249</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
+<a class="jxr_linenumber" name="L6250" href="#L6250">6250</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
+<a class="jxr_linenumber" name="L6251" href="#L6251">6251</a> <em class="jxr_javadoccomment"> * snakeCase(<jk>null</jk>); <jc>// null</jc></em>
+<a class="jxr_linenumber" name="L6252" href="#L6252">6252</a> <em class="jxr_javadoccomment"> * snakeCase(<js>""</js>); <jc>// ""</jc></em>
+<a class="jxr_linenumber" name="L6253" href="#L6253">6253</a> <em class="jxr_javadoccomment"> * snakeCase(<js>"hello world"</js>); <jc>// "hello_world"</jc></em>
+<a class="jxr_linenumber" name="L6254" href="#L6254">6254</a> <em class="jxr_javadoccomment"> * snakeCase(<js>"helloWorld"</js>); <jc>// "hello_world"</jc></em>
+<a class="jxr_linenumber" name="L6255" href="#L6255">6255</a> <em class="jxr_javadoccomment"> * snakeCase(<js>"HelloWorld"</js>); <jc>// "hello_world"</jc></em>
+<a class="jxr_linenumber" name="L6256" href="#L6256">6256</a> <em class="jxr_javadoccomment"> * snakeCase(<js>"hello-world"</js>); <jc>// "hello_world"</jc></em>
+<a class="jxr_linenumber" name="L6257" href="#L6257">6257</a> <em class="jxr_javadoccomment"> * </p></em>
+<a class="jxr_linenumber" name="L6258" href="#L6258">6258</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6259" href="#L6259">6259</a> <em class="jxr_javadoccomment"> * @param str The string to convert.</em>
+<a class="jxr_linenumber" name="L6260" href="#L6260">6260</a> <em class="jxr_javadoccomment"> * @return The snake_case string, or <jk>null</jk> if input is <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L6261" href="#L6261">6261</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L6262" href="#L6262">6262</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String snakeCase(String str) {
+<a class="jxr_linenumber" name="L6263" href="#L6263">6263</a> <strong class="jxr_keyword">if</strong> (str == <strong class="jxr_keyword">null</strong>)
+<a class="jxr_linenumber" name="L6264" href="#L6264">6264</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
+<a class="jxr_linenumber" name="L6265" href="#L6265">6265</a> <strong class="jxr_keyword">if</strong> (isEmpty(str))
+<a class="jxr_linenumber" name="L6266" href="#L6266">6266</a> <strong class="jxr_keyword">return</strong> str;
+<a class="jxr_linenumber" name="L6267" href="#L6267">6267</a>
+<a class="jxr_linenumber" name="L6268" href="#L6268">6268</a> <strong class="jxr_keyword">var</strong> words = splitWords(str);
+<a class="jxr_linenumber" name="L6269" href="#L6269">6269</a> <strong class="jxr_keyword">if</strong> (words.isEmpty())
+<a class="jxr_linenumber" name="L6270" href="#L6270">6270</a> <strong class="jxr_keyword">return</strong> <span class="jxr_string">""</span>;
+<a class="jxr_linenumber" name="L6271" href="#L6271">6271</a>
+<a class="jxr_linenumber" name="L6272" href="#L6272">6272</a> <strong class="jxr_keyword">var</strong> result = <strong class="jxr_keyword">new</strong> StringBuilder();
+<a class="jxr_linenumber" name="L6273" href="#L6273">6273</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < words.size(); i++) {
+<a class="jxr_linenumber" name="L6274" href="#L6274">6274</a> <strong class="jxr_keyword">if</strong> (i > 0)
+<a class="jxr_linenumber" name="L6275" href="#L6275">6275</a> result.append('_');
+<a class="jxr_linenumber" name="L6276" href="#L6276">6276</a> result.append(words.get(i).toLowerCase());
+<a class="jxr_linenumber" name="L6277" href="#L6277">6277</a> }
+<a class="jxr_linenumber" name="L6278" href="#L6278">6278</a>
+<a class="jxr_linenumber" name="L6279" href="#L6279">6279</a> <strong class="jxr_keyword">return</strong> result.toString();
+<a class="jxr_linenumber" name="L6280" href="#L6280">6280</a> }
+<a class="jxr_linenumber" name="L6281" href="#L6281">6281</a>
+<a class="jxr_linenumber" name="L6282" href="#L6282">6282</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L6283" href="#L6283">6283</a> <em class="jxr_javadoccomment"> * Sorts a string array in natural order.</em>
+<a class="jxr_linenumber" name="L6284" href="#L6284">6284</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6285" href="#L6285">6285</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L6286" href="#L6286">6286</a> <em class="jxr_javadoccomment"> * Returns <jk>null</jk> if the array is <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L6287" href="#L6287">6287</a> <em class="jxr_javadoccomment"> * This method creates a copy of the array and sorts it, leaving the original array unchanged.</em>
+<a class="jxr_linenumber" name="L6288" href="#L6288">6288</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6289" href="#L6289">6289</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Examples:</h5></em>
+<a class="jxr_linenumber" name="L6290" href="#L6290">6290</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
+<a class="jxr_linenumber" name="L6291" href="#L6291">6291</a> <em class="jxr_javadoccomment"> * String[] <jv>array</jv> = {<js>"zebra"</js>, <js>"apple"</js>, <js>"banana"</js>};</em>
+<a class="jxr_linenumber" name="L6292" href="#L6292">6292</a> <em class="jxr_javadoccomment"> * String[] <jv>sorted</jv> = sort(<jv>array</jv>);</em>
+<a class="jxr_linenumber" name="L6293" href="#L6293">6293</a> <em class="jxr_javadoccomment"> * <jc>// Returns: ["apple", "banana", "zebra"]</jc></em>
+<a class="jxr_linenumber" name="L6294" href="#L6294">6294</a> <em class="jxr_javadoccomment"> * </p></em>
+<a class="jxr_linenumber" name="L6295" href="#L6295">6295</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6296" href="#L6296">6296</a> <em class="jxr_javadoccomment"> * @param array The array to sort. Can be <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L6297" href="#L6297">6297</a> <em class="jxr_javadoccomment"> * @return A new sorted array, or <jk>null</jk> if the array was <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L6298" href="#L6298">6298</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L6299" href="#L6299">6299</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String[] sort(String[] array) {
+<a class="jxr_linenumber" name="L6300" href="#L6300">6300</a> <strong class="jxr_keyword">if</strong> (array == <strong class="jxr_keyword">null</strong>)
+<a class="jxr_linenumber" name="L6301" href="#L6301">6301</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>; <em class="jxr_comment">// NOSONAR - Intentional.</em>
+<a class="jxr_linenumber" name="L6302" href="#L6302">6302</a> <strong class="jxr_keyword">var</strong> result = Arrays.copyOf(array, array.length);
+<a class="jxr_linenumber" name="L6303" href="#L6303">6303</a> Arrays.sort(result);
+<a class="jxr_linenumber" name="L6304" href="#L6304">6304</a> <strong class="jxr_keyword">return</strong> result;
+<a class="jxr_linenumber" name="L6305" href="#L6305">6305</a> }
+<a class="jxr_linenumber" name="L6306" href="#L6306">6306</a>
+<a class="jxr_linenumber" name="L6307" href="#L6307">6307</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L6308" href="#L6308">6308</a> <em class="jxr_javadoccomment"> * Sorts a string array in case-insensitive order.</em>
+<a class="jxr_linenumber" name="L6309" href="#L6309">6309</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6310" href="#L6310">6310</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L6311" href="#L6311">6311</a> <em class="jxr_javadoccomment"> * Returns <jk>null</jk> if the array is <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L6312" href="#L6312">6312</a> <em class="jxr_javadoccomment"> * This method creates a copy of the array and sorts it using case-insensitive comparison,</em>
+<a class="jxr_linenumber" name="L6313" href="#L6313">6313</a> <em class="jxr_javadoccomment"> * leaving the original array unchanged.</em>
+<a class="jxr_linenumber" name="L6314" href="#L6314">6314</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6315" href="#L6315">6315</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Examples:</h5></em>
+<a class="jxr_linenumber" name="L6316" href="#L6316">6316</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
+<a class="jxr_linenumber" name="L6317" href="#L6317">6317</a> <em class="jxr_javadoccomment"> * String[] <jv>array</jv> = {<js>"Zebra"</js>, <js>"apple"</js>, <js>"Banana"</js>};</em>
+<a class="jxr_linenumber" name="L6318" href="#L6318">6318</a> <em class="jxr_javadoccomment"> * String[] <jv>sorted</jv> = sortIgnoreCase(<jv>array</jv>);</em>
+<a class="jxr_linenumber" name="L6319" href="#L6319">6319</a> <em class="jxr_javadoccomment"> * <jc>// Returns: ["apple", "Banana", "Zebra"]</jc></em>
+<a class="jxr_linenumber" name="L6320" href="#L6320">6320</a> <em class="jxr_javadoccomment"> * </p></em>
+<a class="jxr_linenumber" name="L6321" href="#L6321">6321</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6322" href="#L6322">6322</a> <em class="jxr_javadoccomment"> * @param array The array to sort. Can be <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L6323" href="#L6323">6323</a> <em class="jxr_javadoccomment"> * @return A new sorted array (case-insensitive), or <jk>null</jk> if the array was <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L6324" href="#L6324">6324</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L6325" href="#L6325">6325</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String[] sortIgnoreCase(String[] array) {
+<a class="jxr_linenumber" name="L6326" href="#L6326">6326</a> <strong class="jxr_keyword">if</strong> (array == <strong class="jxr_keyword">null</strong>)
+<a class="jxr_linenumber" name="L6327" href="#L6327">6327</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>; <em class="jxr_comment">// NOSONAR - Intentional.</em>
+<a class="jxr_linenumber" name="L6328" href="#L6328">6328</a> <strong class="jxr_keyword">var</strong> result = Arrays.copyOf(array, array.length);
+<a class="jxr_linenumber" name="L6329" href="#L6329">6329</a> Arrays.sort(result, String.CASE_INSENSITIVE_ORDER);
+<a class="jxr_linenumber" name="L6330" href="#L6330">6330</a> <strong class="jxr_keyword">return</strong> result;
+<a class="jxr_linenumber" name="L6331" href="#L6331">6331</a> }
+<a class="jxr_linenumber" name="L6332" href="#L6332">6332</a>
+<a class="jxr_linenumber" name="L6333" href="#L6333">6333</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L6334" href="#L6334">6334</a> <em class="jxr_javadoccomment"> * Generates a Soundex code for a string.</em>
+<a class="jxr_linenumber" name="L6335" href="#L6335">6335</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6336" href="#L6336">6336</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L6337" href="#L6337">6337</a> <em class="jxr_javadoccomment"> * Soundex is a phonetic algorithm for indexing names by sound. The code consists of</em>
+<a class="jxr_linenumber" name="L6338" href="#L6338">6338</a> <em class="jxr_javadoccomment"> * a letter followed by three digits. Similar-sounding names produce the same code.</em>
+<a class="jxr_linenumber" name="L6339" href="#L6339">6339</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6340" href="#L6340">6340</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
+<a class="jxr_linenumber" name="L6341" href="#L6341">6341</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
+<a class="jxr_linenumber" name="L6342" href="#L6342">6342</a> <em class="jxr_javadoccomment"> * soundex(<js>"Smith"</js>); <jc>// "S530"</jc></em>
+<a class="jxr_linenumber" name="L6343" href="#L6343">6343</a> <em class="jxr_javadoccomment"> * soundex(<js>"Smythe"</js>); <jc>// "S530"</jc></em>
+<a class="jxr_linenumber" name="L6344" href="#L6344">6344</a> <em class="jxr_javadoccomment"> * soundex(<js>"Robert"</js>); <jc>// "R163"</jc></em>
+<a class="jxr_linenumber" name="L6345" href="#L6345">6345</a> <em class="jxr_javadoccomment"> * </p></em>
+<a class="jxr_linenumber" name="L6346" href="#L6346">6346</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6347" href="#L6347">6347</a> <em class="jxr_javadoccomment"> * @param str The string to generate a Soundex code for. Can be <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L6348" href="#L6348">6348</a> <em class="jxr_javadoccomment"> * @return The Soundex code (1 letter + 3 digits), or <jk>null</jk> if input is <jk>null</jk> or empty.</em>
+<a class="jxr_linenumber" name="L6349" href="#L6349">6349</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L6350" href="#L6350">6350</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String soundex(String str) {
+<a class="jxr_linenumber" name="L6351" href="#L6351">6351</a> <strong class="jxr_keyword">if</strong> (isEmpty(str))
+<a class="jxr_linenumber" name="L6352" href="#L6352">6352</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
<a class="jxr_linenumber" name="L6353" href="#L6353">6353</a>
-<a class="jxr_linenumber" name="L6354" href="#L6354">6354</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 1; i < upper.length() && result.length() < 4; i++) {
-<a class="jxr_linenumber" name="L6355" href="#L6355">6355</a> <strong class="jxr_keyword">var</strong> c = upper.charAt(i);
-<a class="jxr_linenumber" name="L6356" href="#L6356">6356</a> <strong class="jxr_keyword">var</strong> code = getSoundexCode(c);
-<a class="jxr_linenumber" name="L6357" href="#L6357">6357</a> <strong class="jxr_keyword">if</strong> (code == '0') {
-<a class="jxr_linenumber" name="L6358" href="#L6358">6358</a> <em class="jxr_comment">// H/W/Y/vowels - don't add code, but don't update lastCode either</em>
-<a class="jxr_linenumber" name="L6359" href="#L6359">6359</a> <em class="jxr_comment">// This allows sequences to continue across H/W/Y/vowels</em>
-<a class="jxr_linenumber" name="L6360" href="#L6360">6360</a> <strong class="jxr_keyword">continue</strong>;
-<a class="jxr_linenumber" name="L6361" href="#L6361">6361</a> }
-<a class="jxr_linenumber" name="L6362" href="#L6362">6362</a> <strong class="jxr_keyword">if</strong> (code != lastCode) {
-<a class="jxr_linenumber" name="L6363" href="#L6363">6363</a> result.append(code);
-<a class="jxr_linenumber" name="L6364" href="#L6364">6364</a> lastCode = code;
-<a class="jxr_linenumber" name="L6365" href="#L6365">6365</a> }
-<a class="jxr_linenumber" name="L6366" href="#L6366">6366</a> <em class="jxr_comment">// If code == lastCode, skip it (consecutive same codes)</em>
-<a class="jxr_linenumber" name="L6367" href="#L6367">6367</a> }
-<a class="jxr_linenumber" name="L6368" href="#L6368">6368</a>
-<a class="jxr_linenumber" name="L6369" href="#L6369">6369</a> <em class="jxr_comment">// Pad with zeros if needed</em>
-<a class="jxr_linenumber" name="L6370" href="#L6370">6370</a> <strong class="jxr_keyword">while</strong> (result.length() < 4) {
-<a class="jxr_linenumber" name="L6371" href="#L6371">6371</a> result.append('0');
-<a class="jxr_linenumber" name="L6372" href="#L6372">6372</a> }
-<a class="jxr_linenumber" name="L6373" href="#L6373">6373</a>
-<a class="jxr_linenumber" name="L6374" href="#L6374">6374</a> <strong class="jxr_keyword">return</strong> result.toString();
-<a class="jxr_linenumber" name="L6375" href="#L6375">6375</a> }
-<a class="jxr_linenumber" name="L6376" href="#L6376">6376</a>
-<a class="jxr_linenumber" name="L6377" href="#L6377">6377</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L6378" href="#L6378">6378</a> <em class="jxr_javadoccomment"> * Splits a comma-delimited list into a list of strings.</em>
-<a class="jxr_linenumber" name="L6379" href="#L6379">6379</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6380" href="#L6380">6380</a> <em class="jxr_javadoccomment"> * @param s The string to split.</em>
-<a class="jxr_linenumber" name="L6381" href="#L6381">6381</a> <em class="jxr_javadoccomment"> * @return A list of split strings, or an empty list if the input is <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L6382" href="#L6382">6382</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L6383" href="#L6383">6383</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> List<String> split(String s) {
-<a class="jxr_linenumber" name="L6384" href="#L6384">6384</a> <strong class="jxr_keyword">return</strong> s == <strong class="jxr_keyword">null</strong> ? Collections.emptyList() : split(s, ',');
-<a class="jxr_linenumber" name="L6385" href="#L6385">6385</a> }
-<a class="jxr_linenumber" name="L6386" href="#L6386">6386</a>
-<a class="jxr_linenumber" name="L6387" href="#L6387">6387</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L6388" href="#L6388">6388</a> <em class="jxr_javadoccomment"> * Splits a character-delimited string into a string array.</em>
-<a class="jxr_linenumber" name="L6389" href="#L6389">6389</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6390" href="#L6390">6390</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L6391" href="#L6391">6391</a> <em class="jxr_javadoccomment"> * Does not split on escaped-delimiters (e.g. "\,");</em>
-<a class="jxr_linenumber" name="L6392" href="#L6392">6392</a> <em class="jxr_javadoccomment"> * Resulting tokens are trimmed of whitespace.</em>
-<a class="jxr_linenumber" name="L6393" href="#L6393">6393</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6394" href="#L6394">6394</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L6395" href="#L6395">6395</a> <em class="jxr_javadoccomment"> * <b>NOTE:</b> This behavior is different than the Jakarta equivalent.</em>
-<a class="jxr_linenumber" name="L6396" href="#L6396">6396</a> <em class="jxr_javadoccomment"> * split("a,b,c",',') -&gt; {"a","b","c"}</em>
-<a class="jxr_linenumber" name="L6397" href="#L6397">6397</a> <em class="jxr_javadoccomment"> * split("a, b ,c ",',') -&gt; {"a","b","c"}</em>
-<a class="jxr_linenumber" name="L6398" href="#L6398">6398</a> <em class="jxr_javadoccomment"> * split("a,,c",',') -&gt; {"a","","c"}</em>
-<a class="jxr_linenumber" name="L6399" href="#L6399">6399</a> <em class="jxr_javadoccomment"> * split(",,",',') -&gt; {"","",""}</em>
-<a class="jxr_linenumber" name="L6400" href="#L6400">6400</a> <em class="jxr_javadoccomment"> * split("",',') -&gt; {}</em>
-<a class="jxr_linenumber" name="L6401" href="#L6401">6401</a> <em class="jxr_javadoccomment"> * split(null,',') -&gt; null</em>
-<a class="jxr_linenumber" name="L6402" href="#L6402">6402</a> <em class="jxr_javadoccomment"> * split("a,b\,c,d", ',', false) -&gt; {"a","b\,c","d"}</em>
-<a class="jxr_linenumber" name="L6403" href="#L6403">6403</a> <em class="jxr_javadoccomment"> * split("a,b\\,c,d", ',', false) -&gt; {"a","b\","c","d"}</em>
-<a class="jxr_linenumber" name="L6404" href="#L6404">6404</a> <em class="jxr_javadoccomment"> * split("a,b\,c,d", ',', true) -&gt; {"a","b,c","d"}</em>
-<a class="jxr_linenumber" name="L6405" href="#L6405">6405</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6406" href="#L6406">6406</a> <em class="jxr_javadoccomment"> * @param s The string to split. Can be <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L6407" href="#L6407">6407</a> <em class="jxr_javadoccomment"> * @param c The character to split on.</em>
-<a class="jxr_linenumber" name="L6408" href="#L6408">6408</a> <em class="jxr_javadoccomment"> * @return The tokens, or <jk>null</jk> if the string was null.</em>
-<a class="jxr_linenumber" name="L6409" href="#L6409">6409</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L6410" href="#L6410">6410</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> List<String> split(String s, <strong class="jxr_keyword">char</strong> c) {
-<a class="jxr_linenumber" name="L6411" href="#L6411">6411</a> <strong class="jxr_keyword">return</strong> split(s, c, Integer.MAX_VALUE);
-<a class="jxr_linenumber" name="L6412" href="#L6412">6412</a> }
-<a class="jxr_linenumber" name="L6413" href="#L6413">6413</a>
-<a class="jxr_linenumber" name="L6414" href="#L6414">6414</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L6415" href="#L6415">6415</a> <em class="jxr_javadoccomment"> * Same as {@link splita} but consumes the tokens instead of creating an array.</em>
-<a class="jxr_linenumber" name="L6416" href="#L6416">6416</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6417" href="#L6417">6417</a> <em class="jxr_javadoccomment"> * @param s The string to split.</em>
-<a class="jxr_linenumber" name="L6418" href="#L6418">6418</a> <em class="jxr_javadoccomment"> * @param c The character to split on.</em>
-<a class="jxr_linenumber" name="L6419" href="#L6419">6419</a> <em class="jxr_javadoccomment"> * @param consumer The consumer of the tokens.</em>
-<a class="jxr_linenumber" name="L6420" href="#L6420">6420</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L6421" href="#L6421">6421</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">void</strong> split(String s, <strong class="jxr_keyword">char</strong> c, Consumer<String> consumer) {
-<a class="jxr_linenumber" name="L6422" href="#L6422">6422</a> <strong class="jxr_keyword">var</strong> escapeChars = getEscapeSet(c);
-<a class="jxr_linenumber" name="L6423" href="#L6423">6423</a>
-<a class="jxr_linenumber" name="L6424" href="#L6424">6424</a> <strong class="jxr_keyword">if</strong> (isEmpty(s))
-<a class="jxr_linenumber" name="L6425" href="#L6425">6425</a> <strong class="jxr_keyword">return</strong>;
-<a class="jxr_linenumber" name="L6426" href="#L6426">6426</a> <strong class="jxr_keyword">if</strong> (s.indexOf(c) == -1) {
-<a class="jxr_linenumber" name="L6427" href="#L6427">6427</a> consumer.accept(s);
-<a class="jxr_linenumber" name="L6428" href="#L6428">6428</a> <strong class="jxr_keyword">return</strong>;
-<a class="jxr_linenumber" name="L6429" href="#L6429">6429</a> }
-<a class="jxr_linenumber" name="L6430" href="#L6430">6430</a>
-<a class="jxr_linenumber" name="L6431" href="#L6431">6431</a> <strong class="jxr_keyword">var</strong> x1 = 0;
-<a class="jxr_linenumber" name="L6432" href="#L6432">6432</a> <strong class="jxr_keyword">var</strong> escapeCount = 0;
-<a class="jxr_linenumber" name="L6433" href="#L6433">6433</a>
-<a class="jxr_linenumber" name="L6434" href="#L6434">6434</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < s.length(); i++) {
-<a class="jxr_linenumber" name="L6435" href="#L6435">6435</a> <strong class="jxr_keyword">if</strong> (s.charAt(i) == '\\')
-<a class="jxr_linenumber" name="L6436" href="#L6436">6436</a> escapeCount++;
-<a class="jxr_linenumber" name="L6437" href="#L6437">6437</a> <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (s.charAt(i) == c && escapeCount % 2 == 0) {
-<a class="jxr_linenumber" name="L6438" href="#L6438">6438</a> <strong class="jxr_keyword">var</strong> s2 = s.substring(x1, i);
-<a class="jxr_linenumber" name="L6439" href="#L6439">6439</a> <strong class="jxr_keyword">var</strong> s3 = unEscapeChars(s2, escapeChars);
-<a class="jxr_linenumber" name="L6440" href="#L6440">6440</a> consumer.accept(s3.trim()); <em class="jxr_comment">// NOSONAR - NPE not possible.</em>
-<a class="jxr_linenumber" name="L6441" href="#L6441">6441</a> x1 = i + 1;
-<a class="jxr_linenumber" name="L6442" href="#L6442">6442</a> }
-<a class="jxr_linenumber" name="L6443" href="#L6443">6443</a> <strong class="jxr_keyword">if</strong> (s.charAt(i) != '\\')
-<a class="jxr_linenumber" name="L6444" href="#L6444">6444</a> escapeCount = 0;
-<a class="jxr_linenumber" name="L6445" href="#L6445">6445</a> }
-<a class="jxr_linenumber" name="L6446" href="#L6446">6446</a> <strong class="jxr_keyword">var</strong> s2 = s.substring(x1);
-<a class="jxr_linenumber" name="L6447" href="#L6447">6447</a> <strong class="jxr_keyword">var</strong> s3 = unEscapeChars(s2, escapeChars);
-<a class="jxr_linenumber" name="L6448" href="#L6448">6448</a> consumer.accept(s3.trim()); <em class="jxr_comment">// NOSONAR - NPE not possible.</em>
-<a class="jxr_linenumber" name="L6449" href="#L6449">6449</a> }
-<a class="jxr_linenumber" name="L6450" href="#L6450">6450</a>
-<a class="jxr_linenumber" name="L6451" href="#L6451">6451</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L6452" href="#L6452">6452</a> <em class="jxr_javadoccomment"> * Same as {@link splita} but limits the number of tokens returned.</em>
-<a class="jxr_linenumber" name="L6453" href="#L6453">6453</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6454" href="#L6454">6454</a> <em class="jxr_javadoccomment"> * @param s The string to split. Can be <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L6455" href="#L6455">6455</a> <em class="jxr_javadoccomment"> * @param c The character to split on.</em>
-<a class="jxr_linenumber" name="L6456" href="#L6456">6456</a> <em class="jxr_javadoccomment"> * @param limit The maximum number of tokens to return.</em>
-<a class="jxr_linenumber" name="L6457" href="#L6457">6457</a> <em class="jxr_javadoccomment"> * @return The tokens, or <jk>null</jk> if the string was null.</em>
-<a class="jxr_linenumber" name="L6458" href="#L6458">6458</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L6459" href="#L6459">6459</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> List<String> split(String s, <strong class="jxr_keyword">char</strong> c, <strong class="jxr_keyword">int</strong> limit) {
-<a class="jxr_linenumber" name="L6460" href="#L6460">6460</a>
-<a class="jxr_linenumber" name="L6461" href="#L6461">6461</a> <strong class="jxr_keyword">var</strong> escapeChars = getEscapeSet(c);
-<a class="jxr_linenumber" name="L6462" href="#L6462">6462</a>
-<a class="jxr_linenumber" name="L6463" href="#L6463">6463</a> <strong class="jxr_keyword">if</strong> (s == <strong class="jxr_keyword">null</strong>)
-<a class="jxr_linenumber" name="L6464" href="#L6464">6464</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>; <em class="jxr_comment">// NOSONAR - Intentional.</em>
-<a class="jxr_linenumber" name="L6465" href="#L6465">6465</a> <strong class="jxr_keyword">if</strong> (isEmpty(s))
-<a class="jxr_linenumber" name="L6466" href="#L6466">6466</a> <strong class="jxr_keyword">return</strong> Collections.emptyList();
-<a class="jxr_linenumber" name="L6467" href="#L6467">6467</a> <strong class="jxr_keyword">if</strong> (s.indexOf(c) == -1)
-<a class="jxr_linenumber" name="L6468" href="#L6468">6468</a> <strong class="jxr_keyword">return</strong> Collections.singletonList(s);
+<a class="jxr_linenumber" name="L6354" href="#L6354">6354</a> <strong class="jxr_keyword">var</strong> upper = str.toUpperCase();
+<a class="jxr_linenumber" name="L6355" href="#L6355">6355</a> <strong class="jxr_keyword">var</strong> result = <strong class="jxr_keyword">new</strong> StringBuilder(4);
+<a class="jxr_linenumber" name="L6356" href="#L6356">6356</a> result.append(upper.charAt(0));
+<a class="jxr_linenumber" name="L6357" href="#L6357">6357</a>
+<a class="jxr_linenumber" name="L6358" href="#L6358">6358</a> <em class="jxr_comment">// Soundex mapping: 0 = AEIOUHWY, 1 = BFPV, 2 = CGJKQSXZ, 3 = DT, 4 = L, 5 = MN, 6 = R</em>
+<a class="jxr_linenumber" name="L6359" href="#L6359">6359</a> <em class="jxr_comment">// H/W/Y don't get codes but don't break sequences either</em>
+<a class="jxr_linenumber" name="L6360" href="#L6360">6360</a> <em class="jxr_comment">// Initialize lastCode to a value that won't match any real code</em>
+<a class="jxr_linenumber" name="L6361" href="#L6361">6361</a> <strong class="jxr_keyword">var</strong> lastCode = '\0';
+<a class="jxr_linenumber" name="L6362" href="#L6362">6362</a>
+<a class="jxr_linenumber" name="L6363" href="#L6363">6363</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 1; i < upper.length() && result.length() < 4; i++) {
+<a class="jxr_linenumber" name="L6364" href="#L6364">6364</a> <strong class="jxr_keyword">var</strong> c = upper.charAt(i);
+<a class="jxr_linenumber" name="L6365" href="#L6365">6365</a> <strong class="jxr_keyword">var</strong> code = getSoundexCode(c);
+<a class="jxr_linenumber" name="L6366" href="#L6366">6366</a> <strong class="jxr_keyword">if</strong> (code == '0') {
+<a class="jxr_linenumber" name="L6367" href="#L6367">6367</a> <em class="jxr_comment">// H/W/Y/vowels - don't add code, but don't update lastCode either</em>
+<a class="jxr_linenumber" name="L6368" href="#L6368">6368</a> <em class="jxr_comment">// This allows sequences to continue across H/W/Y/vowels</em>
+<a class="jxr_linenumber" name="L6369" href="#L6369">6369</a> <strong class="jxr_keyword">continue</strong>;
+<a class="jxr_linenumber" name="L6370" href="#L6370">6370</a> }
+<a class="jxr_linenumber" name="L6371" href="#L6371">6371</a> <strong class="jxr_keyword">if</strong> (code != lastCode) {
+<a class="jxr_linenumber" name="L6372" href="#L6372">6372</a> result.append(code);
+<a class="jxr_linenumber" name="L6373" href="#L6373">6373</a> lastCode = code;
+<a class="jxr_linenumber" name="L6374" href="#L6374">6374</a> }
+<a class="jxr_linenumber" name="L6375" href="#L6375">6375</a> <em class="jxr_comment">// If code == lastCode, skip it (consecutive same codes)</em>
+<a class="jxr_linenumber" name="L6376" href="#L6376">6376</a> }
+<a class="jxr_linenumber" name="L6377" href="#L6377">6377</a>
+<a class="jxr_linenumber" name="L6378" href="#L6378">6378</a> <em class="jxr_comment">// Pad with zeros if needed</em>
+<a class="jxr_linenumber" name="L6379" href="#L6379">6379</a> <strong class="jxr_keyword">while</strong> (result.length() < 4) {
+<a class="jxr_linenumber" name="L6380" href="#L6380">6380</a> result.append('0');
+<a class="jxr_linenumber" name="L6381" href="#L6381">6381</a> }
+<a class="jxr_linenumber" name="L6382" href="#L6382">6382</a>
+<a class="jxr_linenumber" name="L6383" href="#L6383">6383</a> <strong class="jxr_keyword">return</strong> result.toString();
+<a class="jxr_linenumber" name="L6384" href="#L6384">6384</a> }
+<a class="jxr_linenumber" name="L6385" href="#L6385">6385</a>
+<a class="jxr_linenumber" name="L6386" href="#L6386">6386</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L6387" href="#L6387">6387</a> <em class="jxr_javadoccomment"> * Splits a comma-delimited list into a list of strings.</em>
+<a class="jxr_linenumber" name="L6388" href="#L6388">6388</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6389" href="#L6389">6389</a> <em class="jxr_javadoccomment"> * @param s The string to split.</em>
+<a class="jxr_linenumber" name="L6390" href="#L6390">6390</a> <em class="jxr_javadoccomment"> * @return A list of split strings, or an empty list if the input is <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L6391" href="#L6391">6391</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L6392" href="#L6392">6392</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> List<String> split(String s) {
+<a class="jxr_linenumber" name="L6393" href="#L6393">6393</a> <strong class="jxr_keyword">return</strong> s == <strong class="jxr_keyword">null</strong> ? Collections.emptyList() : split(s, ',');
+<a class="jxr_linenumber" name="L6394" href="#L6394">6394</a> }
+<a class="jxr_linenumber" name="L6395" href="#L6395">6395</a>
+<a class="jxr_linenumber" name="L6396" href="#L6396">6396</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L6397" href="#L6397">6397</a> <em class="jxr_javadoccomment"> * Splits a character-delimited string into a string array.</em>
+<a class="jxr_linenumber" name="L6398" href="#L6398">6398</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6399" href="#L6399">6399</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L6400" href="#L6400">6400</a> <em class="jxr_javadoccomment"> * Does not split on escaped-delimiters (e.g. "\,");</em>
+<a class="jxr_linenumber" name="L6401" href="#L6401">6401</a> <em class="jxr_javadoccomment"> * Resulting tokens are trimmed of whitespace.</em>
+<a class="jxr_linenumber" name="L6402" href="#L6402">6402</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6403" href="#L6403">6403</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L6404" href="#L6404">6404</a> <em class="jxr_javadoccomment"> * <b>NOTE:</b> This behavior is different than the Jakarta equivalent.</em>
+<a class="jxr_linenumber" name="L6405" href="#L6405">6405</a> <em class="jxr_javadoccomment"> * split("a,b,c",',') -&gt; {"a","b","c"}</em>
+<a class="jxr_linenumber" name="L6406" href="#L6406">6406</a> <em class="jxr_javadoccomment"> * split("a, b ,c ",',') -&gt; {"a","b","c"}</em>
+<a class="jxr_linenumber" name="L6407" href="#L6407">6407</a> <em class="jxr_javadoccomment"> * split("a,,c",',') -&gt; {"a","","c"}</em>
+<a class="jxr_linenumber" name="L6408" href="#L6408">6408</a> <em class="jxr_javadoccomment"> * split(",,",',') -&gt; {"","",""}</em>
+<a class="jxr_linenumber" name="L6409" href="#L6409">6409</a> <em class="jxr_javadoccomment"> * split("",',') -&gt; {}</em>
+<a class="jxr_linenumber" name="L6410" href="#L6410">6410</a> <em class="jxr_javadoccomment"> * split(null,',') -&gt; null</em>
+<a class="jxr_linenumber" name="L6411" href="#L6411">6411</a> <em class="jxr_javadoccomment"> * split("a,b\,c,d", ',', false) -&gt; {"a","b\,c","d"}</em>
+<a class="jxr_linenumber" name="L6412" href="#L6412">6412</a> <em class="jxr_javadoccomment"> * split("a,b\\,c,d", ',', false) -&gt; {"a","b\","c","d"}</em>
+<a class="jxr_linenumber" name="L6413" href="#L6413">6413</a> <em class="jxr_javadoccomment"> * split("a,b\,c,d", ',', true) -&gt; {"a","b,c","d"}</em>
+<a class="jxr_linenumber" name="L6414" href="#L6414">6414</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6415" href="#L6415">6415</a> <em class="jxr_javadoccomment"> * @param s The string to split. Can be <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L6416" href="#L6416">6416</a> <em class="jxr_javadoccomment"> * @param c The character to split on.</em>
+<a class="jxr_linenumber" name="L6417" href="#L6417">6417</a> <em class="jxr_javadoccomment"> * @return The tokens, or <jk>null</jk> if the string was null.</em>
+<a class="jxr_linenumber" name="L6418" href="#L6418">6418</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L6419" href="#L6419">6419</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> List<String> split(String s, <strong class="jxr_keyword">char</strong> c) {
+<a class="jxr_linenumber" name="L6420" href="#L6420">6420</a> <strong class="jxr_keyword">return</strong> split(s, c, Integer.MAX_VALUE);
+<a class="jxr_linenumber" name="L6421" href="#L6421">6421</a> }
+<a class="jxr_linenumber" name="L6422" href="#L6422">6422</a>
+<a class="jxr_linenumber" name="L6423" href="#L6423">6423</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L6424" href="#L6424">6424</a> <em class="jxr_javadoccomment"> * Same as {@link splita} but consumes the tokens instead of creating an array.</em>
+<a class="jxr_linenumber" name="L6425" href="#L6425">6425</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6426" href="#L6426">6426</a> <em class="jxr_javadoccomment"> * @param s The string to split.</em>
+<a class="jxr_linenumber" name="L6427" href="#L6427">6427</a> <em class="jxr_javadoccomment"> * @param c The character to split on.</em>
+<a class="jxr_linenumber" name="L6428" href="#L6428">6428</a> <em class="jxr_javadoccomment"> * @param consumer The consumer of the tokens.</em>
+<a class="jxr_linenumber" name="L6429" href="#L6429">6429</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L6430" href="#L6430">6430</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">void</strong> split(String s, <strong class="jxr_keyword">char</strong> c, Consumer<String> consumer) {
+<a class="jxr_linenumber" name="L6431" href="#L6431">6431</a> <strong class="jxr_keyword">var</strong> escapeChars = getEscapeSet(c);
+<a class="jxr_linenumber" name="L6432" href="#L6432">6432</a>
+<a class="jxr_linenumber" name="L6433" href="#L6433">6433</a> <strong class="jxr_keyword">if</strong> (isEmpty(s))
+<a class="jxr_linenumber" name="L6434" href="#L6434">6434</a> <strong class="jxr_keyword">return</strong>;
+<a class="jxr_linenumber" name="L6435" href="#L6435">6435</a> <strong class="jxr_keyword">if</strong> (s.indexOf(c) == -1) {
+<a class="jxr_linenumber" name="L6436" href="#L6436">6436</a> consumer.accept(s);
+<a class="jxr_linenumber" name="L6437" href="#L6437">6437</a> <strong class="jxr_keyword">return</strong>;
+<a class="jxr_linenumber" name="L6438" href="#L6438">6438</a> }
+<a class="jxr_linenumber" name="L6439" href="#L6439">6439</a>
+<a class="jxr_linenumber" name="L6440" href="#L6440">6440</a> <strong class="jxr_keyword">var</strong> x1 = 0;
+<a class="jxr_linenumber" name="L6441" href="#L6441">6441</a> <strong class="jxr_keyword">var</strong> escapeCount = 0;
+<a class="jxr_linenumber" name="L6442" href="#L6442">6442</a>
+<a class="jxr_linenumber" name="L6443" href="#L6443">6443</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < s.length(); i++) {
+<a class="jxr_linenumber" name="L6444" href="#L6444">6444</a> <strong class="jxr_keyword">if</strong> (s.charAt(i) == '\\')
+<a class="jxr_linenumber" name="L6445" href="#L6445">6445</a> escapeCount++;
+<a class="jxr_linenumber" name="L6446" href="#L6446">6446</a> <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (s.charAt(i) == c && escapeCount % 2 == 0) {
+<a class="jxr_linenumber" name="L6447" href="#L6447">6447</a> <strong class="jxr_keyword">var</strong> s2 = s.substring(x1, i);
+<a class="jxr_linenumber" name="L6448" href="#L6448">6448</a> <strong class="jxr_keyword">var</strong> s3 = unEscapeChars(s2, escapeChars);
+<a class="jxr_linenumber" name="L6449" href="#L6449">6449</a> consumer.accept(s3.trim()); <em class="jxr_comment">// NOSONAR - NPE not possible.</em>
+<a class="jxr_linenumber" name="L6450" href="#L6450">6450</a> x1 = i + 1;
+<a class="jxr_linenumber" name="L6451" href="#L6451">6451</a> }
+<a class="jxr_linenumber" name="L6452" href="#L6452">6452</a> <strong class="jxr_keyword">if</strong> (s.charAt(i) != '\\')
+<a class="jxr_linenumber" name="L6453" href="#L6453">6453</a> escapeCount = 0;
+<a class="jxr_linenumber" name="L6454" href="#L6454">6454</a> }
+<a class="jxr_linenumber" name="L6455" href="#L6455">6455</a> <strong class="jxr_keyword">var</strong> s2 = s.substring(x1);
+<a class="jxr_linenumber" name="L6456" href="#L6456">6456</a> <strong class="jxr_keyword">var</strong> s3 = unEscapeChars(s2, escapeChars);
+<a class="jxr_linenumber" name="L6457" href="#L6457">6457</a> consumer.accept(s3.trim()); <em class="jxr_comment">// NOSONAR - NPE not possible.</em>
+<a class="jxr_linenumber" name="L6458" href="#L6458">6458</a> }
+<a class="jxr_linenumber" name="L6459" href="#L6459">6459</a>
+<a class="jxr_linenumber" name="L6460" href="#L6460">6460</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L6461" href="#L6461">6461</a> <em class="jxr_javadoccomment"> * Same as {@link splita} but limits the number of tokens returned.</em>
+<a class="jxr_linenumber" name="L6462" href="#L6462">6462</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6463" href="#L6463">6463</a> <em class="jxr_javadoccomment"> * @param s The string to split. Can be <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L6464" href="#L6464">6464</a> <em class="jxr_javadoccomment"> * @param c The character to split on.</em>
+<a class="jxr_linenumber" name="L6465" href="#L6465">6465</a> <em class="jxr_javadoccomment"> * @param limit The maximum number of tokens to return.</em>
+<a class="jxr_linenumber" name="L6466" href="#L6466">6466</a> <em class="jxr_javadoccomment"> * @return The tokens, or <jk>null</jk> if the string was null.</em>
+<a class="jxr_linenumber" name="L6467" href="#L6467">6467</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L6468" href="#L6468">6468</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> List<String> split(String s, <strong class="jxr_keyword">char</strong> c, <strong class="jxr_keyword">int</strong> limit) {
<a class="jxr_linenumber" name="L6469" href="#L6469">6469</a>
-<a class="jxr_linenumber" name="L6470" href="#L6470">6470</a> <strong class="jxr_keyword">var</strong> l = <strong class="jxr_keyword">new</strong> LinkedList<String>();
-<a class="jxr_linenumber" name="L6471" href="#L6471">6471</a> <strong class="jxr_keyword">var</strong> sArray = s.toCharArray();
-<a class="jxr_linenumber" name="L6472" href="#L6472">6472</a> <strong class="jxr_keyword">var</strong> x1 = 0;
-<a class="jxr_linenumber" name="L6473" href="#L6473">6473</a> <strong class="jxr_keyword">var</strong> escapeCount = 0;
-<a class="jxr_linenumber" name="L6474" href="#L6474">6474</a> limit--;
-<a class="jxr_linenumber" name="L6475" href="#L6475">6475</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < sArray.length && limit > 0; i++) {
-<a class="jxr_linenumber" name="L6476" href="#L6476">6476</a> <strong class="jxr_keyword">if</strong> (sArray[i] == '\\')
-<a class="jxr_linenumber" name="L6477" href="#L6477">6477</a> escapeCount++;
-<a class="jxr_linenumber" name="L6478" href="#L6478">6478</a> <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (sArray[i] == c && escapeCount % 2 == 0) {
-<a class="jxr_linenumber" name="L6479" href="#L6479">6479</a> <strong class="jxr_keyword">var</strong> s2 = <strong class="jxr_keyword">new</strong> String(sArray, x1, i - x1);
-<a class="jxr_linenumber" name="L6480" href="#L6480">6480</a> <strong class="jxr_keyword">var</strong> s3 = unEscapeChars(s2, escapeChars);
-<a class="jxr_linenumber" name="L6481" href="#L6481">6481</a> l.add(s3.trim());
-<a class="jxr_linenumber" name="L6482" href="#L6482">6482</a> limit--;
-<a class="jxr_linenumber" name="L6483" href="#L6483">6483</a> x1 = i + 1;
-<a class="jxr_linenumber" name="L6484" href="#L6484">6484</a> }
-<a class="jxr_linenumber" name="L6485" href="#L6485">6485</a> <strong class="jxr_keyword">if</strong> (sArray[i] != '\\')
-<a class="jxr_linenumber" name="L6486" href="#L6486">6486</a> escapeCount = 0;
-<a class="jxr_linenumber" name="L6487" href="#L6487">6487</a> }
-<a class="jxr_linenumber" name="L6488" href="#L6488">6488</a> <strong class="jxr_keyword">var</strong> s2 = <strong class="jxr_keyword">new</strong> String(sArray, x1, sArray.length - x1);
-<a class="jxr_linenumber" name="L6489" href="#L6489">6489</a> <strong class="jxr_keyword">var</strong> s3 = unEscapeChars(s2, escapeChars);
-<a class="jxr_linenumber" name="L6490" href="#L6490">6490</a> l.add(s3.trim());
-<a class="jxr_linenumber" name="L6491" href="#L6491">6491</a>
-<a class="jxr_linenumber" name="L6492" href="#L6492">6492</a> <strong class="jxr_keyword">return</strong> l;
-<a class="jxr_linenumber" name="L6493" href="#L6493">6493</a> }
-<a class="jxr_linenumber" name="L6494" href="#L6494">6494</a>
-<a class="jxr_linenumber" name="L6495" href="#L6495">6495</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L6496" href="#L6496">6496</a> <em class="jxr_javadoccomment"> * Same as {@link splita} but consumes the tokens instead of creating an array.</em>
-<a class="jxr_linenumber" name="L6497" href="#L6497">6497</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6498" href="#L6498">6498</a> <em class="jxr_javadoccomment"> * @param s The string to split.</em>
-<a class="jxr_linenumber" name="L6499" href="#L6499">6499</a> <em class="jxr_javadoccomment"> * @param consumer The consumer of the tokens.</em>
-<a class="jxr_linenumber" name="L6500" href="#L6500">6500</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L6501" href="#L6501">6501</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">void</strong> split(String s, Consumer<String> consumer) {
-<a class="jxr_linenumber" name="L6502" href="#L6502">6502</a> StringUtils.split(s, ',', consumer);
-<a class="jxr_linenumber" name="L6503" href="#L6503">6503</a> }
-<a class="jxr_linenumber" name="L6504" href="#L6504">6504</a>
-<a class="jxr_linenumber" name="L6505" href="#L6505">6505</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L6506" href="#L6506">6506</a> <em class="jxr_javadoccomment"> * Splits a comma-delimited list into an array of strings.</em>
-<a class="jxr_linenumber" name="L6507" href="#L6507">6507</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6508" href="#L6508">6508</a> <em class="jxr_javadoccomment"> * @param s The string to split.</em>
-<a class="jxr_linenumber" name="L6509" href="#L6509">6509</a> <em class="jxr_javadoccomment"> * @return An array of split strings.</em>
-<a class="jxr_linenumber" name="L6510" href="#L6510">6510</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L6511" href="#L6511">6511</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String[] splita(String s) {
-<a class="jxr_linenumber" name="L6512" href="#L6512">6512</a> <strong class="jxr_keyword">return</strong> splita(s, ',');
-<a class="jxr_linenumber" name="L6513" href="#L6513">6513</a> }
-<a class="jxr_linenumber" name="L6514" href="#L6514">6514</a>
-<a class="jxr_linenumber" name="L6515" href="#L6515">6515</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L6516" href="#L6516">6516</a> <em class="jxr_javadoccomment"> * Splits a character-delimited string into a string array.</em>
-<a class="jxr_linenumber" name="L6517" href="#L6517">6517</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6518" href="#L6518">6518</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L6519" href="#L6519">6519</a> <em class="jxr_javadoccomment"> * Does not split on escaped-delimiters (e.g. "\,");</em>
-<a class="jxr_linenumber" name="L6520" href="#L6520">6520</a> <em class="jxr_javadoccomment"> * Resulting tokens are trimmed of whitespace.</em>
-<a class="jxr_linenumber" name="L6521" href="#L6521">6521</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6522" href="#L6522">6522</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L6523" href="#L6523">6523</a> <em class="jxr_javadoccomment"> * <b>NOTE:</b> This behavior is different than the Jakarta equivalent.</em>
-<a class="jxr_linenumber" name="L6524" href="#L6524">6524</a> <em class="jxr_javadoccomment"> * split("a,b,c",',') -&gt; {"a","b","c"}</em>
-<a class="jxr_linenumber" name="L6525" href="#L6525">6525</a> <em class="jxr_javadoccomment"> * split("a, b ,c ",',') -&gt; {"a","b","c"}</em>
-<a class="jxr_linenumber" name="L6526" href="#L6526">6526</a> <em class="jxr_javadoccomment"> * split("a,,c",',') -&gt; {"a","","c"}</em>
-<a class="jxr_linenumber" name="L6527" href="#L6527">6527</a> <em class="jxr_javadoccomment"> * split(",,",',') -&gt; {"","",""}</em>
-<a class="jxr_linenumber" name="L6528" href="#L6528">6528</a> <em class="jxr_javadoccomment"> * split("",',') -&gt; {}</em>
-<a class="jxr_linenumber" name="L6529" href="#L6529">6529</a> <em class="jxr_javadoccomment"> * split(null,',') -&gt; null</em>
-<a class="jxr_linenumber" name="L6530" href="#L6530">6530</a> <em class="jxr_javadoccomment"> * split("a,b\,c,d", ',', false) -&gt; {"a","b\,c","d"}</em>
-<a class="jxr_linenumber" name="L6531" href="#L6531">6531</a> <em class="jxr_javadoccomment"> * split("a,b\\,c,d", ',', false) -&gt; {"a","b\","c","d"}</em>
-<a class="jxr_linenumber" name="L6532" href="#L6532">6532</a> <em class="jxr_javadoccomment"> * split("a,b\,c,d", ',', true) -&gt; {"a","b,c","d"}</em>
-<a class="jxr_linenumber" name="L6533" href="#L6533">6533</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6534" href="#L6534">6534</a> <em class="jxr_javadoccomment"> * @param s The string to split. Can be <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L6535" href="#L6535">6535</a> <em class="jxr_javadoccomment"> * @param c The character to split on.</em>
-<a class="jxr_linenumber" name="L6536" href="#L6536">6536</a> <em class="jxr_javadoccomment"> * @return The tokens, or <jk>null</jk> if the string was null.</em>
-<a class="jxr_linenumber" name="L6537" href="#L6537">6537</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L6538" href="#L6538">6538</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String[] splita(String s, <strong class="jxr_keyword">char</strong> c) {
-<a class="jxr_linenumber" name="L6539" href="#L6539">6539</a> <strong class="jxr_keyword">return</strong> splita(s, c, Integer.MAX_VALUE);
-<a class="jxr_linenumber" name="L6540" href="#L6540">6540</a> }
-<a class="jxr_linenumber" name="L6541" href="#L6541">6541</a>
-<a class="jxr_linenumber" name="L6542" href="#L6542">6542</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L6543" href="#L6543">6543</a> <em class="jxr_javadoccomment"> * Same as {@link #splita(String, char)} but limits the number of tokens returned.</em>
-<a class="jxr_linenumber" name="L6544" href="#L6544">6544</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6545" href="#L6545">6545</a> <em class="jxr_javadoccomment"> * @param s The string to split. Can be <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L6546" href="#L6546">6546</a> <em class="jxr_javadoccomment"> * @param c The character to split on.</em>
-<a class="jxr_linenumber" name="L6547" href="#L6547">6547</a> <em class="jxr_javadoccomment"> * @param limit The maximum number of tokens to return.</em>
-<a class="jxr_linenumber" name="L6548" href="#L6548">6548</a> <em class="jxr_javadoccomment"> * @return The tokens, or <jk>null</jk> if the string was null.</em>
-<a class="jxr_linenumber" name="L6549" href="#L6549">6549</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L6550" href="#L6550">6550</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String[] splita(String s, <strong class="jxr_keyword">char</strong> c, <strong class="jxr_keyword">int</strong> limit) {
-<a class="jxr_linenumber" name="L6551" href="#L6551">6551</a> <strong class="jxr_keyword">var</strong> l = StringUtils.split(s, c, limit);
-<a class="jxr_linenumber" name="L6552" href="#L6552">6552</a> <strong class="jxr_keyword">return</strong> l == <strong class="jxr_keyword">null</strong> ? <strong class="jxr_keyword">null</strong> : l.toArray(<strong class="jxr_keyword">new</strong> String[l.size()]);
-<a class="jxr_linenumber" name="L6553" href="#L6553">6553</a> }
-<a class="jxr_linenumber" name="L6554" href="#L6554">6554</a>
-<a class="jxr_linenumber" name="L6555" href="#L6555">6555</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L6556" href="#L6556">6556</a> <em class="jxr_javadoccomment"> * Same as {@link #splita(String, char)} except splits all strings in the input and returns a single result.</em>
-<a class="jxr_linenumber" name="L6557" href="#L6557">6557</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6558" href="#L6558">6558</a> <em class="jxr_javadoccomment"> * @param s The string to split. Can be <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L6559" href="#L6559">6559</a> <em class="jxr_javadoccomment"> * @param c The character to split on.</em>
-<a class="jxr_linenumber" name="L6560" href="#L6560">6560</a> <em class="jxr_javadoccomment"> * @return The tokens, or null if the input array was null</em>
-<a class="jxr_linenumber" name="L6561" href="#L6561">6561</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L6562" href="#L6562">6562</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String[] splita(String[] s, <strong class="jxr_keyword">char</strong> c) {
-<a class="jxr_linenumber" name="L6563" href="#L6563">6563</a> <strong class="jxr_keyword">if</strong> (s == <strong class="jxr_keyword">null</strong>)
-<a class="jxr_linenumber" name="L6564" href="#L6564">6564</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>; <em class="jxr_comment">// NOSONAR - Intentional.</em>
-<a class="jxr_linenumber" name="L6565" href="#L6565">6565</a> <strong class="jxr_keyword">var</strong> l = <strong class="jxr_keyword">new</strong> LinkedList<String>();
-<a class="jxr_linenumber" name="L6566" href="#L6566">6566</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> ss : s) {
-<a class="jxr_linenumber" name="L6567" href="#L6567">6567</a> <strong class="jxr_keyword">if</strong> (ss == <strong class="jxr_keyword">null</strong> || ss.indexOf(c) == -1)
-<a class="jxr_linenumber" name="L6568" href="#L6568">6568</a> l.add(ss);
-<a class="jxr_linenumber" name="L6569" href="#L6569">6569</a> <strong class="jxr_keyword">else</strong>
-<a class="jxr_linenumber" name="L6570" href="#L6570">6570</a> Collections.addAll(l, splita(ss, c));
-<a class="jxr_linenumber" name="L6571" href="#L6571">6571</a> }
-<a class="jxr_linenumber" name="L6572" href="#L6572">6572</a> <strong class="jxr_keyword">return</strong> l.toArray(<strong class="jxr_keyword">new</strong> String[l.size()]);
-<a class="jxr_linenumber" name="L6573" href="#L6573">6573</a> }
-<a class="jxr_linenumber" name="L6574" href="#L6574">6574</a>
-<a class="jxr_linenumber" name="L6575" href="#L6575">6575</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L6576" href="#L6576">6576</a> <em class="jxr_javadoccomment"> * Splits a list of key-value pairs into an ordered map.</em>
-<a class="jxr_linenumber" name="L6577" href="#L6577">6577</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6578" href="#L6578">6578</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L6579" href="#L6579">6579</a> <em class="jxr_javadoccomment"> * Example:</em>
-<a class="jxr_linenumber" name="L6580" href="#L6580">6580</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L6581" href="#L6581">6581</a> <em class="jxr_javadoccomment"> * String <jv>in</jv> = <js>"foo=1;bar=2"</js>;</em>
-<a class="jxr_linenumber" name="L6582" href="#L6582">6582</a> <em class="jxr_javadoccomment"> * Map <jv>map</jv> = StringUtils.<jsm>splitMap</jsm>(in, <js>';'</js>, <js>'='</js>, <jk>true</jk>);</em>
-<a class="jxr_linenumber" name="L6583" href="#L6583">6583</a> <em class="jxr_javadoccomment"> * </p></em>
-<a class="jxr_linenumber" name="L6584" href="#L6584">6584</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6585" href="#L6585">6585</a> <em class="jxr_javadoccomment"> * @param s The string to split.</em>
-<a class="jxr_linenumber" name="L6586" href="#L6586">6586</a> <em class="jxr_javadoccomment"> * @param trim Trim strings after parsing.</em>
-<a class="jxr_linenumber" name="L6587" href="#L6587">6587</a> <em class="jxr_javadoccomment"> * @return The parsed map, or null if the string was null.</em>
-<a class="jxr_linenumber" name="L6588" href="#L6588">6588</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L6589" href="#L6589">6589</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> Map<String,String> splitMap(String s, <strong class="jxr_keyword">boolean</strong> trim) {
-<a class="jxr_linenumber" name="L6590" href="#L6590">6590</a>
-<a class="jxr_linenumber" name="L6591" href="#L6591">6591</a> <strong class="jxr_keyword">if</strong> (s == <strong class="jxr_keyword">null</strong>)
-<a class="jxr_linenumber" name="L6592" href="#L6592">6592</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>; <em class="jxr_comment">// NOSONAR - Intentional.</em>
-<a class="jxr_linenumber" name="L6593" href="#L6593">6593</a> <strong class="jxr_keyword">if</strong> (isEmpty(s))
-<a class="jxr_linenumber" name="L6594" href="#L6594">6594</a> <strong class="jxr_keyword">return</strong> Collections.emptyMap();
-<a class="jxr_linenumber" name="L6595" href="#L6595">6595</a>
-<a class="jxr_linenumber" name="L6596" href="#L6596">6596</a> <strong class="jxr_keyword">var</strong> m = <strong class="jxr_keyword">new</strong> LinkedHashMap<String,String>();
-<a class="jxr_linenumber" name="L6597" href="#L6597">6597</a>
-<a class="jxr_linenumber" name="L6598" href="#L6598">6598</a> <em class="jxr_comment">// S1: Found start of key, looking for equals.</em>
-<a class="jxr_linenumber" name="L6599" href="#L6599">6599</a> <em class="jxr_comment">// S2: Found equals, looking for delimiter (or end).</em>
-<a class="jxr_linenumber" name="L6600" href="#L6600">6600</a>
-<a class="jxr_linenumber" name="L6601" href="#L6601">6601</a> <strong class="jxr_keyword">var</strong> state = S1;
-<a class="jxr_linenumber" name="L6602" href="#L6602">6602</a>
-<a class="jxr_linenumber" name="L6603" href="#L6603">6603</a> <strong class="jxr_keyword">var</strong> sArray = s.toCharArray();
-<a class="jxr_linenumber" name="L6604" href="#L6604">6604</a> <strong class="jxr_keyword">var</strong> x1 = 0;
-<a class="jxr_linenumber" name="L6605" href="#L6605">6605</a> <strong class="jxr_keyword">var</strong> escapeCount = 0;
-<a class="jxr_linenumber" name="L6606" href="#L6606">6606</a> <strong class="jxr_keyword">var</strong> key = (String)<strong class="jxr_keyword">null</strong>;
-<a class="jxr_linenumber" name="L6607" href="#L6607">6607</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < sArray.length + 1; i++) {
-<a class="jxr_linenumber" name="L6608" href="#L6608">6608</a> <strong class="jxr_keyword">var</strong> c = i == sArray.length ? ',' : sArray[i];
-<a class="jxr_linenumber" name="L6609" href="#L6609">6609</a> <strong class="jxr_keyword">if</strong> (c == '\\')
-<a class="jxr_linenumber" name="L6610" href="#L6610">6610</a> escapeCount++;
-<a class="jxr_linenumber" name="L6611" href="#L6611">6611</a> <strong class="jxr_keyword">if</strong> (escapeCount % 2 == 0) {
-<a class="jxr_linenumber" name="L6612" href="#L6612">6612</a> <strong class="jxr_keyword">if</strong> (state == S1) {
-<a class="jxr_linenumber" name="L6613" href="#L6613">6613</a> <strong class="jxr_keyword">if</strong> (c == '=') {
-<a class="jxr_linenumber" name="L6614" href="#L6614">6614</a> key = s.substring(x1, i);
-<a class="jxr_linenumber" name="L6615" href="#L6615">6615</a> <strong class="jxr_keyword">if</strong> (trim)
-<a class="jxr_linenumber" name="L6616" href="#L6616">6616</a> key = trim(key);
-<a class="jxr_linenumber" name="L6617" href="#L6617">6617</a> key = unEscapeChars(key, MAP_ESCAPE_SET);
-<a class="jxr_linenumber" name="L6618" href="#L6618">6618</a> state = S2;
-<a class="jxr_linenumber" name="L6619" href="#L6619">6619</a> x1 = i + 1;
-<a class="jxr_linenumber" name="L6620" href="#L6620">6620</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (c == ',') {
-<a class="jxr_linenumber" name="L6621" href="#L6621">6621</a> key = s.substring(x1, i);
-<a class="jxr_linenumber" name="L6622" href="#L6622">6622</a> <strong class="jxr_keyword">if</strong> (trim)
-<a class="jxr_linenumber" name="L6623" href="#L6623">6623</a> key = trim(key);
-<a class="jxr_linenumber" name="L6624" href="#L6624">6624</a> key = unEscapeChars(key, MAP_ESCAPE_SET);
-<a class="jxr_linenumber" name="L6625" href="#L6625">6625</a> m.put(key, <span class="jxr_string">""</span>);
-<a class="jxr_linenumber" name="L6626" href="#L6626">6626</a> state = S1;
-<a class="jxr_linenumber" name="L6627" href="#L6627">6627</a> x1 = i + 1;
-<a class="jxr_linenumber" name="L6628" href="#L6628">6628</a> }
-<a class="jxr_linenumber" name="L6629" href="#L6629">6629</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (state == S2) {
-<a class="jxr_linenumber" name="L6630" href="#L6630">6630</a> <strong class="jxr_keyword">if</strong> (c == ',') { <em class="jxr_comment">// NOSONAR - Intentional.</em>
-<a class="jxr_linenumber" name="L6631" href="#L6631">6631</a> <strong class="jxr_keyword">var</strong> val = s.substring(x1, i);
-<a class="jxr_linenumber" name="L6632" href="#L6632">6632</a> <strong class="jxr_keyword">if</strong> (trim)
-<a class="jxr_linenumber" name="L6633" href="#L6633">6633</a> val = trim(val);
-<a class="jxr_linenumber" name="L6634" href="#L6634">6634</a> val = unEscapeChars(val, MAP_ESCAPE_SET);
-<a class="jxr_linenumber" name="L6635" href="#L6635">6635</a> m.put(key, val);
-<a class="jxr_linenumber" name="L6636" href="#L6636">6636</a> key = <strong class="jxr_keyword">null</strong>;
-<a class="jxr_linenumber" name="L6637" href="#L6637">6637</a> x1 = i + 1;
-<a class="jxr_linenumber" name="L6638" href="#L6638">6638</a> state = S1;
-<a class="jxr_linenumber" name="L6639" href="#L6639">6639</a> }
-<a class="jxr_linenumber" name="L6640" href="#L6640">6640</a> }
-<a class="jxr_linenumber" name="L6641" href="#L6641">6641</a> }
-<a class="jxr_linenumber" name="L6642" href="#L6642">6642</a> <strong class="jxr_keyword">if</strong> (c != '\\')
-<a class="jxr_linenumber" name="L6643" href="#L6643">6643</a> escapeCount = 0;
-<a class="jxr_linenumber" name="L6644" href="#L6644">6644</a> }
-<a class="jxr_linenumber" name="L6645" href="#L6645">6645</a>
-<a class="jxr_linenumber" name="L6646" href="#L6646">6646</a> <strong class="jxr_keyword">return</strong> m;
-<a class="jxr_linenumber" name="L6647" href="#L6647">6647</a> }
-<a class="jxr_linenumber" name="L6648" href="#L6648">6648</a>
-<a class="jxr_linenumber" name="L6649" href="#L6649">6649</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L6650" href="#L6650">6650</a> <em class="jxr_javadoccomment"> * Splits the method arguments in the signature of a method.</em>
-<a class="jxr_linenumber" name="L6651" href="#L6651">6651</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6652" href="#L6652">6652</a> <em class="jxr_javadoccomment"> * @param s The arguments to split.</em>
-<a class="jxr_linenumber" name="L6653" href="#L6653">6653</a> <em class="jxr_javadoccomment"> * @return The split arguments, or null if the input string is null.</em>
-<a class="jxr_linenumber" name="L6654" href="#L6654">6654</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L6655" href="#L6655">6655</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String[] splitMethodArgs(String s) {
-<a class="jxr_linenumber" name="L6656" href="#L6656">6656</a>
-<a class="jxr_linenumber" name="L6657" href="#L6657">6657</a> <strong class="jxr_keyword">if</strong> (s == <strong class="jxr_keyword">null</strong>)
-<a class="jxr_linenumber" name="L6658" href="#L6658">6658</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>; <em class="jxr_comment">// NOSONAR - Intentional.</em>
-<a class="jxr_linenumber" name="L6659" href="#L6659">6659</a> <strong class="jxr_keyword">if</strong> (isEmpty(s))
-<a class="jxr_linenumber" name="L6660" href="#L6660">6660</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">new</strong> String[0];
-<a class="jxr_linenumber" name="L6661" href="#L6661">6661</a> <strong class="jxr_keyword">if</strong> (s.indexOf(',') == -1)
-<a class="jxr_linenumber" name="L6662" href="#L6662">6662</a> <strong class="jxr_keyword">return</strong> a(s);
-<a class="jxr_linenumber" name="L6663" href="#L6663">6663</a>
-<a class="jxr_linenumber" name="L6664" href="#L6664">6664</a> <strong class="jxr_keyword">var</strong> l = <strong class="jxr_keyword">new</strong> LinkedList<String>();
-<a class="jxr_linenumber" name="L6665" href="#L6665">6665</a> <strong class="jxr_keyword">var</strong> sArray = s.toCharArray();
-<a class="jxr_linenumber" name="L6666" href="#L6666">6666</a> <strong class="jxr_keyword">var</strong> x1 = 0;
-<a class="jxr_linenumber" name="L6667" href="#L6667">6667</a> <strong class="jxr_keyword">var</strong> paramDepth = 0;
-<a class="jxr_linenumber" name="L6668" href="#L6668">6668</a>
-<a class="jxr_linenumber" name="L6669" href="#L6669">6669</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < sArray.length; i++) {
-<a class="jxr_linenumber" name="L6670" href="#L6670">6670</a> <strong class="jxr_keyword">var</strong> c = s.charAt(i);
-<a class="jxr_linenumber" name="L6671" href="#L6671">6671</a> <strong class="jxr_keyword">if</strong> (c == '>')
-<a class="jxr_linenumber" name="L6672" href="#L6672">6672</a> paramDepth++;
-<a class="jxr_linenumber" name="L6673" href="#L6673">6673</a> <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (c == '<')
-<a class="jxr_linenumber" name="L6674" href="#L6674">6674</a> paramDepth--;
-<a class="jxr_linenumber" name="L6675" href="#L6675">6675</a> <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (c == ',' && paramDepth == 0) {
-<a class="jxr_linenumber" name="L6676" href="#L6676">6676</a> <strong class="jxr_keyword">var</strong> s2 = <strong class="jxr_keyword">new</strong> String(sArray, x1, i - x1);
-<a class="jxr_linenumber" name="L6677" href="#L6677">6677</a> l.add(s2.trim());
-<a class="jxr_linenumber" name="L6678" href="#L6678">6678</a> x1 = i + 1;
-<a class="jxr_linenumber" name="L6679" href="#L6679">6679</a> }
-<a class="jxr_linenumber" name="L6680" href="#L6680">6680</a> }
-<a class="jxr_linenumber" name="L6681" href="#L6681">6681</a>
-<a class="jxr_linenumber" name="L6682" href="#L6682">6682</a> <strong class="jxr_keyword">var</strong> s2 = <strong class="jxr_keyword">new</strong> String(sArray, x1, sArray.length - x1);
-<a class="jxr_linenumber" name="L6683" href="#L6683">6683</a> l.add(s2.trim());
-<a class="jxr_linenumber" name="L6684" href="#L6684">6684</a>
-<a class="jxr_linenumber" name="L6685" href="#L6685">6685</a> <strong class="jxr_keyword">return</strong> l.toArray(<strong class="jxr_keyword">new</strong> String[l.size()]);
-<a class="jxr_linenumber" name="L6686" href="#L6686">6686</a> }
-<a class="jxr_linenumber" name="L6687" href="#L6687">6687</a>
-<a class="jxr_linenumber" name="L6688" href="#L6688">6688</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L6689" href="#L6689">6689</a> <em class="jxr_javadoccomment"> * Splits a comma-delimited list containing "nesting constructs".</em>
-<a class="jxr_linenumber" name="L6690" href="#L6690">6690</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6691" href="#L6691">6691</a> <em class="jxr_javadoccomment"> * Nesting constructs are simple embedded "{...}" comma-delimted lists.</em>
-<a class="jxr_linenumber" name="L6692" href="#L6692">6692</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6693" href="#L6693">6693</a> <em class="jxr_javadoccomment"> * Example:</em>
-<a class="jxr_linenumber" name="L6694" href="#L6694">6694</a> <em class="jxr_javadoccomment"> * "a{b,c},d" -> ["a{b,c}","d"]</em>
-<a class="jxr_linenumber" name="L6695" href="#L6695">6695</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6696" href="#L6696">6696</a> <em class="jxr_javadoccomment"> * Handles escapes and trims whitespace from tokens.</em>
-<a class="jxr_linenumber" name="L6697" href="#L6697">6697</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6698" href="#L6698">6698</a> <em class="jxr_javadoccomment"> * @param s The input string.</em>
-<a class="jxr_linenumber" name="L6699" href="#L6699">6699</a> <em class="jxr_javadoccomment"> * @return</em>
-<a class="jxr_linenumber" name="L6700" href="#L6700">6700</a> <em class="jxr_javadoccomment"> * The results, or <jk>null</jk> if the input was <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L6701" href="#L6701">6701</a> <em class="jxr_javadoccomment"> * <br>An empty string results in an empty array.</em>
-<a class="jxr_linenumber" name="L6702" href="#L6702">6702</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L6703" href="#L6703">6703</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> List<String> splitNested(String s) {
-<a class="jxr_linenumber" name="L6704" href="#L6704">6704</a> <strong class="jxr_keyword">var</strong> escapeChars = getEscapeSet(',');
-<a class="jxr_linenumber" name="L6705" href="#L6705">6705</a>
-<a class="jxr_linenumber" name="L6706" href="#L6706">6706</a> <strong class="jxr_keyword">if</strong> (s == <strong class="jxr_keyword">null</strong>)
-<a class="jxr_linenumber" name="L6707" href="#L6707">6707</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>; <em class="jxr_comment">// NOSONAR - Intentional.</em>
-<a class="jxr_linenumber" name="L6708" href="#L6708">6708</a> <strong class="jxr_keyword">if</strong> (isEmpty(s))
-<a class="jxr_linenumber" name="L6709" href="#L6709">6709</a> <strong class="jxr_keyword">return</strong> Collections.emptyList();
-<a class="jxr_linenumber" name="L6710" href="#L6710">6710</a> <strong class="jxr_keyword">if</strong> (s.indexOf(',') == -1)
-<a class="jxr_linenumber" name="L6711" href="#L6711">6711</a> <strong class="jxr_keyword">return</strong> Collections.singletonList(trim(s));
-<a class="jxr_linenumber" name="L6712" href="#L6712">6712</a>
-<a class="jxr_linenumber" name="L6713" href="#L6713">6713</a> <strong class="jxr_keyword">var</strong> l = <strong class="jxr_keyword">new</strong> LinkedList<String>();
+<a class="jxr_linenumber" name="L6470" href="#L6470">6470</a> <strong class="jxr_keyword">var</strong> escapeChars = getEscapeSet(c);
+<a class="jxr_linenumber" name="L6471" href="#L6471">6471</a>
+<a class="jxr_linenumber" name="L6472" href="#L6472">6472</a> <strong class="jxr_keyword">if</strong> (s == <strong class="jxr_keyword">null</strong>)
+<a class="jxr_linenumber" name="L6473" href="#L6473">6473</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>; <em class="jxr_comment">// NOSONAR - Intentional.</em>
+<a class="jxr_linenumber" name="L6474" href="#L6474">6474</a> <strong class="jxr_keyword">if</strong> (isEmpty(s))
+<a class="jxr_linenumber" name="L6475" href="#L6475">6475</a> <strong class="jxr_keyword">return</strong> Collections.emptyList();
+<a class="jxr_linenumber" name="L6476" href="#L6476">6476</a> <strong class="jxr_keyword">if</strong> (s.indexOf(c) == -1)
+<a class="jxr_linenumber" name="L6477" href="#L6477">6477</a> <strong class="jxr_keyword">return</strong> Collections.singletonList(s);
+<a class="jxr_linenumber" name="L6478" href="#L6478">6478</a>
+<a class="jxr_linenumber" name="L6479" href="#L6479">6479</a> <strong class="jxr_keyword">var</strong> l = <strong class="jxr_keyword">new</strong> LinkedList<String>();
+<a class="jxr_linenumber" name="L6480" href="#L6480">6480</a> <strong class="jxr_keyword">var</strong> sArray = s.toCharArray();
+<a class="jxr_linenumber" name="L6481" href="#L6481">6481</a> <strong class="jxr_keyword">var</strong> x1 = 0;
+<a class="jxr_linenumber" name="L6482" href="#L6482">6482</a> <strong class="jxr_keyword">var</strong> escapeCount = 0;
+<a class="jxr_linenumber" name="L6483" href="#L6483">6483</a> limit--;
+<a class="jxr_linenumber" name="L6484" href="#L6484">6484</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < sArray.length && limit > 0; i++) {
+<a class="jxr_linenumber" name="L6485" href="#L6485">6485</a> <strong class="jxr_keyword">if</strong> (sArray[i] == '\\')
+<a class="jxr_linenumber" name="L6486" href="#L6486">6486</a> escapeCount++;
+<a class="jxr_linenumber" name="L6487" href="#L6487">6487</a> <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (sArray[i] == c && escapeCount % 2 == 0) {
+<a class="jxr_linenumber" name="L6488" href="#L6488">6488</a> <strong class="jxr_keyword">var</strong> s2 = <strong class="jxr_keyword">new</strong> String(sArray, x1, i - x1);
+<a class="jxr_linenumber" name="L6489" href="#L6489">6489</a> <strong class="jxr_keyword">var</strong> s3 = unEscapeChars(s2, escapeChars);
+<a class="jxr_linenumber" name="L6490" href="#L6490">6490</a> l.add(s3.trim());
+<a class="jxr_linenumber" name="L6491" href="#L6491">6491</a> limit--;
+<a class="jxr_linenumber" name="L6492" href="#L6492">6492</a> x1 = i + 1;
+<a class="jxr_linenumber" name="L6493" href="#L6493">6493</a> }
+<a class="jxr_linenumber" name="L6494" href="#L6494">6494</a> <strong class="jxr_keyword">if</strong> (sArray[i] != '\\')
+<a class="jxr_linenumber" name="L6495" href="#L6495">6495</a> escapeCount = 0;
+<a class="jxr_linenumber" name="L6496" href="#L6496">6496</a> }
+<a class="jxr_linenumber" name="L6497" href="#L6497">6497</a> <strong class="jxr_keyword">var</strong> s2 = <strong class="jxr_keyword">new</strong> String(sArray, x1, sArray.length - x1);
+<a class="jxr_linenumber" name="L6498" href="#L6498">6498</a> <strong class="jxr_keyword">var</strong> s3 = unEscapeChars(s2, escapeChars);
+<a class="jxr_linenumber" name="L6499" href="#L6499">6499</a> l.add(s3.trim());
+<a class="jxr_linenumber" name="L6500" href="#L6500">6500</a>
+<a class="jxr_linenumber" name="L6501" href="#L6501">6501</a> <strong class="jxr_keyword">return</strong> l;
+<a class="jxr_linenumber" name="L6502" href="#L6502">6502</a> }
+<a class="jxr_linenumber" name="L6503" href="#L6503">6503</a>
+<a class="jxr_linenumber" name="L6504" href="#L6504">6504</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L6505" href="#L6505">6505</a> <em class="jxr_javadoccomment"> * Same as {@link splita} but consumes the tokens instead of creating an array.</em>
+<a class="jxr_linenumber" name="L6506" href="#L6506">6506</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6507" href="#L6507">6507</a> <em class="jxr_javadoccomment"> * @param s The string to split.</em>
+<a class="jxr_linenumber" name="L6508" href="#L6508">6508</a> <em class="jxr_javadoccomment"> * @param consumer The consumer of the tokens.</em>
+<a class="jxr_linenumber" name="L6509" href="#L6509">6509</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L6510" href="#L6510">6510</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">void</strong> split(String s, Consumer<String> consumer) {
+<a class="jxr_linenumber" name="L6511" href="#L6511">6511</a> StringUtils.split(s, ',', consumer);
+<a class="jxr_linenumber" name="L6512" href="#L6512">6512</a> }
+<a class="jxr_linenumber" name="L6513" href="#L6513">6513</a>
+<a class="jxr_linenumber" name="L6514" href="#L6514">6514</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L6515" href="#L6515">6515</a> <em class="jxr_javadoccomment"> * Splits a comma-delimited list into an array of strings.</em>
+<a class="jxr_linenumber" name="L6516" href="#L6516">6516</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6517" href="#L6517">6517</a> <em class="jxr_javadoccomment"> * @param s The string to split.</em>
+<a class="jxr_linenumber" name="L6518" href="#L6518">6518</a> <em class="jxr_javadoccomment"> * @return An array of split strings.</em>
+<a class="jxr_linenumber" name="L6519" href="#L6519">6519</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L6520" href="#L6520">6520</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String[] splita(String s) {
+<a class="jxr_linenumber" name="L6521" href="#L6521">6521</a> <strong class="jxr_keyword">return</strong> splita(s, ',');
+<a class="jxr_linenumber" name="L6522" href="#L6522">6522</a> }
+<a class="jxr_linenumber" name="L6523" href="#L6523">6523</a>
+<a class="jxr_linenumber" name="L6524" href="#L6524">6524</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L6525" href="#L6525">6525</a> <em class="jxr_javadoccomment"> * Splits a character-delimited string into a string array.</em>
+<a class="jxr_linenumber" name="L6526" href="#L6526">6526</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6527" href="#L6527">6527</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L6528" href="#L6528">6528</a> <em class="jxr_javadoccomment"> * Does not split on escaped-delimiters (e.g. "\,");</em>
+<a class="jxr_linenumber" name="L6529" href="#L6529">6529</a> <em class="jxr_javadoccomment"> * Resulting tokens are trimmed of whitespace.</em>
+<a class="jxr_linenumber" name="L6530" href="#L6530">6530</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6531" href="#L6531">6531</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L6532" href="#L6532">6532</a> <em class="jxr_javadoccomment"> * <b>NOTE:</b> This behavior is different than the Jakarta equivalent.</em>
+<a class="jxr_linenumber" name="L6533" href="#L6533">6533</a> <em class="jxr_javadoccomment"> * split("a,b,c",',') -&gt; {"a","b","c"}</em>
+<a class="jxr_linenumber" name="L6534" href="#L6534">6534</a> <em class="jxr_javadoccomment"> * split("a, b ,c ",',') -&gt; {"a","b","c"}</em>
+<a class="jxr_linenumber" name="L6535" href="#L6535">6535</a> <em class="jxr_javadoccomment"> * split("a,,c",',') -&gt; {"a","","c"}</em>
+<a class="jxr_linenumber" name="L6536" href="#L6536">6536</a> <em class="jxr_javadoccomment"> * split(",,",',') -&gt; {"","",""}</em>
+<a class="jxr_linenumber" name="L6537" href="#L6537">6537</a> <em class="jxr_javadoccomment"> * split("",',') -&gt; {}</em>
+<a class="jxr_linenumber" name="L6538" href="#L6538">6538</a> <em class="jxr_javadoccomment"> * split(null,',') -&gt; null</em>
+<a class="jxr_linenumber" name="L6539" href="#L6539">6539</a> <em class="jxr_javadoccomment"> * split("a,b\,c,d", ',', false) -&gt; {"a","b\,c","d"}</em>
+<a class="jxr_linenumber" name="L6540" href="#L6540">6540</a> <em class="jxr_javadoccomment"> * split("a,b\\,c,d", ',', false) -&gt; {"a","b\","c","d"}</em>
+<a class="jxr_linenumber" name="L6541" href="#L6541">6541</a> <em class="jxr_javadoccomment"> * split("a,b\,c,d", ',', true) -&gt; {"a","b,c","d"}</em>
+<a class="jxr_linenumber" name="L6542" href="#L6542">6542</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6543" href="#L6543">6543</a> <em class="jxr_javadoccomment"> * @param s The string to split. Can be <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L6544" href="#L6544">6544</a> <em class="jxr_javadoccomment"> * @param c The character to split on.</em>
+<a class="jxr_linenumber" name="L6545" href="#L6545">6545</a> <em class="jxr_javadoccomment"> * @return The tokens, or <jk>null</jk> if the string was null.</em>
+<a class="jxr_linenumber" name="L6546" href="#L6546">6546</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L6547" href="#L6547">6547</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String[] splita(String s, <strong class="jxr_keyword">char</strong> c) {
+<a class="jxr_linenumber" name="L6548" href="#L6548">6548</a> <strong class="jxr_keyword">return</strong> splita(s, c, Integer.MAX_VALUE);
+<a class="jxr_linenumber" name="L6549" href="#L6549">6549</a> }
+<a class="jxr_linenumber" name="L6550" href="#L6550">6550</a>
+<a class="jxr_linenumber" name="L6551" href="#L6551">6551</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L6552" href="#L6552">6552</a> <em class="jxr_javadoccomment"> * Same as {@link #splita(String, char)} but limits the number of tokens returned.</em>
+<a class="jxr_linenumber" name="L6553" href="#L6553">6553</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6554" href="#L6554">6554</a> <em class="jxr_javadoccomment"> * @param s The string to split. Can be <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L6555" href="#L6555">6555</a> <em class="jxr_javadoccomment"> * @param c The character to split on.</em>
+<a class="jxr_linenumber" name="L6556" href="#L6556">6556</a> <em class="jxr_javadoccomment"> * @param limit The maximum number of tokens to return.</em>
+<a class="jxr_linenumber" name="L6557" href="#L6557">6557</a> <em class="jxr_javadoccomment"> * @return The tokens, or <jk>null</jk> if the string was null.</em>
+<a class="jxr_linenumber" name="L6558" href="#L6558">6558</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L6559" href="#L6559">6559</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String[] splita(String s, <strong class="jxr_keyword">char</strong> c, <strong class="jxr_keyword">int</strong> limit) {
+<a class="jxr_linenumber" name="L6560" href="#L6560">6560</a> <strong class="jxr_keyword">var</strong> l = StringUtils.split(s, c, limit);
+<a class="jxr_linenumber" name="L6561" href="#L6561">6561</a> <strong class="jxr_keyword">return</strong> l == <strong class="jxr_keyword">null</strong> ? <strong class="jxr_keyword">null</strong> : l.toArray(<strong class="jxr_keyword">new</strong> String[l.size()]);
+<a class="jxr_linenumber" name="L6562" href="#L6562">6562</a> }
+<a class="jxr_linenumber" name="L6563" href="#L6563">6563</a>
+<a class="jxr_linenumber" name="L6564" href="#L6564">6564</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L6565" href="#L6565">6565</a> <em class="jxr_javadoccomment"> * Same as {@link #splita(String, char)} except splits all strings in the input and returns a single result.</em>
+<a class="jxr_linenumber" name="L6566" href="#L6566">6566</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6567" href="#L6567">6567</a> <em class="jxr_javadoccomment"> * @param s The string to split. Can be <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L6568" href="#L6568">6568</a> <em class="jxr_javadoccomment"> * @param c The character to split on.</em>
+<a class="jxr_linenumber" name="L6569" href="#L6569">6569</a> <em class="jxr_javadoccomment"> * @return The tokens, or null if the input array was null</em>
+<a class="jxr_linenumber" name="L6570" href="#L6570">6570</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L6571" href="#L6571">6571</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String[] splita(String[] s, <strong class="jxr_keyword">char</strong> c) {
+<a class="jxr_linenumber" name="L6572" href="#L6572">6572</a> <strong class="jxr_keyword">if</strong> (s == <strong class="jxr_keyword">null</strong>)
+<a class="jxr_linenumber" name="L6573" href="#L6573">6573</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>; <em class="jxr_comment">// NOSONAR - Intentional.</em>
+<a class="jxr_linenumber" name="L6574" href="#L6574">6574</a> <strong class="jxr_keyword">var</strong> l = <strong class="jxr_keyword">new</strong> LinkedList<String>();
+<a class="jxr_linenumber" name="L6575" href="#L6575">6575</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> ss : s) {
+<a class="jxr_linenumber" name="L6576" href="#L6576">6576</a> <strong class="jxr_keyword">if</strong> (ss == <strong class="jxr_keyword">null</strong> || ss.indexOf(c) == -1)
+<a class="jxr_linenumber" name="L6577" href="#L6577">6577</a> l.add(ss);
+<a class="jxr_linenumber" name="L6578" href="#L6578">6578</a> <strong class="jxr_keyword">else</strong>
+<a class="jxr_linenumber" name="L6579" href="#L6579">6579</a> Collections.addAll(l, splita(ss, c));
+<a class="jxr_linenumber" name="L6580" href="#L6580">6580</a> }
+<a class="jxr_linenumber" name="L6581" href="#L6581">6581</a> <strong class="jxr_keyword">return</strong> l.toArray(<strong class="jxr_keyword">new</strong> String[l.size()]);
+<a class="jxr_linenumber" name="L6582" href="#L6582">6582</a> }
+<a class="jxr_linenumber" name="L6583" href="#L6583">6583</a>
+<a class="jxr_linenumber" name="L6584" href="#L6584">6584</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L6585" href="#L6585">6585</a> <em class="jxr_javadoccomment"> * Splits a list of key-value pairs into an ordered map.</em>
+<a class="jxr_linenumber" name="L6586" href="#L6586">6586</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6587" href="#L6587">6587</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L6588" href="#L6588">6588</a> <em class="jxr_javadoccomment"> * Example:</em>
+<a class="jxr_linenumber" name="L6589" href="#L6589">6589</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
+<a class="jxr_linenumber" name="L6590" href="#L6590">6590</a> <em class="jxr_javadoccomment"> * String <jv>in</jv> = <js>"foo=1;bar=2"</js>;</em>
+<a class="jxr_linenumber" name="L6591" href="#L6591">6591</a> <em class="jxr_javadoccomment"> * Map <jv>map</jv> = StringUtils.<jsm>splitMap</jsm>(in, <js>';'</js>, <js>'='</js>, <jk>true</jk>);</em>
+<a class="jxr_linenumber" name="L6592" href="#L6592">6592</a> <em class="jxr_javadoccomment"> * </p></em>
+<a class="jxr_linenumber" name="L6593" href="#L6593">6593</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6594" href="#L6594">6594</a> <em class="jxr_javadoccomment"> * @param s The string to split.</em>
+<a class="jxr_linenumber" name="L6595" href="#L6595">6595</a> <em class="jxr_javadoccomment"> * @param trim Trim strings after parsing.</em>
+<a class="jxr_linenumber" name="L6596" href="#L6596">6596</a> <em class="jxr_javadoccomment"> * @return The parsed map, or null if the string was null.</em>
+<a class="jxr_linenumber" name="L6597" href="#L6597">6597</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L6598" href="#L6598">6598</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> Map<String,String> splitMap(String s, <strong class="jxr_keyword">boolean</strong> trim) {
+<a class="jxr_linenumber" name="L6599" href="#L6599">6599</a>
+<a class="jxr_linenumber" name="L6600" href="#L6600">6600</a> <strong class="jxr_keyword">if</strong> (s == <strong class="jxr_keyword">null</strong>)
+<a class="jxr_linenumber" name="L6601" href="#L6601">6601</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>; <em class="jxr_comment">// NOSONAR - Intentional.</em>
+<a class="jxr_linenumber" name="L6602" href="#L6602">6602</a> <strong class="jxr_keyword">if</strong> (isEmpty(s))
+<a class="jxr_linenumber" name="L6603" href="#L6603">6603</a> <strong class="jxr_keyword">return</strong> Collections.emptyMap();
+<a class="jxr_linenumber" name="L6604" href="#L6604">6604</a>
+<a class="jxr_linenumber" name="L6605" href="#L6605">6605</a> <strong class="jxr_keyword">var</strong> m = <strong class="jxr_keyword">new</strong> LinkedHashMap<String,String>();
+<a class="jxr_linenumber" name="L6606" href="#L6606">6606</a>
+<a class="jxr_linenumber" name="L6607" href="#L6607">6607</a> <em class="jxr_comment">// S1: Found start of key, looking for equals.</em>
+<a class="jxr_linenumber" name="L6608" href="#L6608">6608</a> <em class="jxr_comment">// S2: Found equals, looking for delimiter (or end).</em>
+<a class="jxr_linenumber" name="L6609" href="#L6609">6609</a>
+<a class="jxr_linenumber" name="L6610" href="#L6610">6610</a> <strong class="jxr_keyword">var</strong> state = S1;
+<a class="jxr_linenumber" name="L6611" href="#L6611">6611</a>
+<a class="jxr_linenumber" name="L6612" href="#L6612">6612</a> <strong class="jxr_keyword">var</strong> sArray = s.toCharArray();
+<a class="jxr_linenumber" name="L6613" href="#L6613">6613</a> <strong class="jxr_keyword">var</strong> x1 = 0;
+<a class="jxr_linenumber" name="L6614" href="#L6614">6614</a> <strong class="jxr_keyword">var</strong> escapeCount = 0;
+<a class="jxr_linenumber" name="L6615" href="#L6615">6615</a> <strong class="jxr_keyword">var</strong> key = (String)<strong class="jxr_keyword">null</strong>;
+<a class="jxr_linenumber" name="L6616" href="#L6616">6616</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < sArray.length + 1; i++) {
+<a class="jxr_linenumber" name="L6617" href="#L6617">6617</a> <strong class="jxr_keyword">var</strong> c = i == sArray.length ? ',' : sArray[i];
+<a class="jxr_linenumber" name="L6618" href="#L6618">6618</a> <strong class="jxr_keyword">if</strong> (c == '\\')
+<a class="jxr_linenumber" name="L6619" href="#L6619">6619</a> escapeCount++;
+<a class="jxr_linenumber" name="L6620" href="#L6620">6620</a> <strong class="jxr_keyword">if</strong> (escapeCount % 2 == 0) {
+<a class="jxr_linenumber" name="L6621" href="#L6621">6621</a> <strong class="jxr_keyword">if</strong> (state == S1) {
+<a class="jxr_linenumber" name="L6622" href="#L6622">6622</a> <strong class="jxr_keyword">if</strong> (c == '=') {
+<a class="jxr_linenumber" name="L6623" href="#L6623">6623</a> key = s.substring(x1, i);
+<a class="jxr_linenumber" name="L6624" href="#L6624">6624</a> <strong class="jxr_keyword">if</strong> (trim)
+<a class="jxr_linenumber" name="L6625" href="#L6625">6625</a> key = trim(key);
+<a class="jxr_linenumber" name="L6626" href="#L6626">6626</a> key = unEscapeChars(key, MAP_ESCAPE_SET);
+<a class="jxr_linenumber" name="L6627" href="#L6627">6627</a> state = S2;
+<a class="jxr_linenumber" name="L6628" href="#L6628">6628</a> x1 = i + 1;
+<a class="jxr_linenumber" name="L6629" href="#L6629">6629</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (c == ',') {
+<a class="jxr_linenumber" name="L6630" href="#L6630">6630</a> key = s.substring(x1, i);
+<a class="jxr_linenumber" name="L6631" href="#L6631">6631</a> <strong class="jxr_keyword">if</strong> (trim)
+<a class="jxr_linenumber" name="L6632" href="#L6632">6632</a> key = trim(key);
+<a class="jxr_linenumber" name="L6633" href="#L6633">6633</a> key = unEscapeChars(key, MAP_ESCAPE_SET);
+<a class="jxr_linenumber" name="L6634" href="#L6634">6634</a> m.put(key, <span class="jxr_string">""</span>);
+<a class="jxr_linenumber" name="L6635" href="#L6635">6635</a> state = S1;
+<a class="jxr_linenumber" name="L6636" href="#L6636">6636</a> x1 = i + 1;
+<a class="jxr_linenumber" name="L6637" href="#L6637">6637</a> }
+<a class="jxr_linenumber" name="L6638" href="#L6638">6638</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (state == S2) {
+<a class="jxr_linenumber" name="L6639" href="#L6639">6639</a> <strong class="jxr_keyword">if</strong> (c == ',') { <em class="jxr_comment">// NOSONAR - Intentional.</em>
+<a class="jxr_linenumber" name="L6640" href="#L6640">6640</a> <strong class="jxr_keyword">var</strong> val = s.substring(x1, i);
+<a class="jxr_linenumber" name="L6641" href="#L6641">6641</a> <strong class="jxr_keyword">if</strong> (trim)
+<a class="jxr_linenumber" name="L6642" href="#L6642">6642</a> val = trim(val);
+<a class="jxr_linenumber" name="L6643" href="#L6643">6643</a> val = unEscapeChars(val, MAP_ESCAPE_SET);
+<a class="jxr_linenumber" name="L6644" href="#L6644">6644</a> m.put(key, val);
+<a class="jxr_linenumber" name="L6645" href="#L6645">6645</a> key = <strong class="jxr_keyword">null</strong>;
+<a class="jxr_linenumber" name="L6646" href="#L6646">6646</a> x1 = i + 1;
+<a class="jxr_linenumber" name="L6647" href="#L6647">6647</a> state = S1;
+<a class="jxr_linenumber" name="L6648" href="#L6648">6648</a> }
+<a class="jxr_linenumber" name="L6649" href="#L6649">6649</a> }
+<a class="jxr_linenumber" name="L6650" href="#L6650">6650</a> }
+<a class="jxr_linenumber" name="L6651" href="#L6651">6651</a> <strong class="jxr_keyword">if</strong> (c != '\\')
+<a class="jxr_linenumber" name="L6652" href="#L6652">6652</a> escapeCount = 0;
+<a class="jxr_linenumber" name="L6653" href="#L6653">6653</a> }
+<a class="jxr_linenumber" name="L6654" href="#L6654">6654</a>
+<a class="jxr_linenumber" name="L6655" href="#L6655">6655</a> <strong class="jxr_keyword">return</strong> m;
+<a class="jxr_linenumber" name="L6656" href="#L6656">6656</a> }
+<a class="jxr_linenumber" name="L6657" href="#L6657">6657</a>
+<a class="jxr_linenumber" name="L6658" href="#L6658">6658</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L6659" href="#L6659">6659</a> <em class="jxr_javadoccomment"> * Splits the method arguments in the signature of a method.</em>
+<a class="jxr_linenumber" name="L6660" href="#L6660">6660</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6661" href="#L6661">6661</a> <em class="jxr_javadoccomment"> * @param s The arguments to split.</em>
+<a class="jxr_linenumber" name="L6662" href="#L6662">6662</a> <em class="jxr_javadoccomment"> * @return The split arguments, or null if the input string is null.</em>
+<a class="jxr_linenumber" name="L6663" href="#L6663">6663</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L6664" href="#L6664">6664</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String[] splitMethodArgs(String s) {
+<a class="jxr_linenumber" name="L6665" href="#L6665">6665</a>
+<a class="jxr_linenumber" name="L6666" href="#L6666">6666</a> <strong class="jxr_keyword">if</strong> (s == <strong class="jxr_keyword">null</strong>)
+<a class="jxr_linenumber" name="L6667" href="#L6667">6667</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>; <em class="jxr_comment">// NOSONAR - Intentional.</em>
+<a class="jxr_linenumber" name="L6668" href="#L6668">6668</a> <strong class="jxr_keyword">if</strong> (isEmpty(s))
+<a class="jxr_linenumber" name="L6669" href="#L6669">6669</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">new</strong> String[0];
+<a class="jxr_linenumber" name="L6670" href="#L6670">6670</a> <strong class="jxr_keyword">if</strong> (s.indexOf(',') == -1)
+<a class="jxr_linenumber" name="L6671" href="#L6671">6671</a> <strong class="jxr_keyword">return</strong> a(s);
+<a class="jxr_linenumber" name="L6672" href="#L6672">6672</a>
+<a class="jxr_linenumber" name="L6673" href="#L6673">6673</a> <strong class="jxr_keyword">var</strong> l = <strong class="jxr_keyword">new</strong> LinkedList<String>();
+<a class="jxr_linenumber" name="L6674" href="#L6674">6674</a> <strong class="jxr_keyword">var</strong> sArray = s.toCharArray();
+<a class="jxr_linenumber" name="L6675" href="#L6675">6675</a> <strong class="jxr_keyword">var</strong> x1 = 0;
+<a class="jxr_linenumber" name="L6676" href="#L6676">6676</a> <strong class="jxr_keyword">var</strong> paramDepth = 0;
+<a class="jxr_linenumber" name="L6677" href="#L6677">6677</a>
+<a class="jxr_linenumber" name="L6678" href="#L6678">6678</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < sArray.length; i++) {
+<a class="jxr_linenumber" name="L6679" href="#L6679">6679</a> <strong class="jxr_keyword">var</strong> c = s.charAt(i);
+<a class="jxr_linenumber" name="L6680" href="#L6680">6680</a> <strong class="jxr_keyword">if</strong> (c == '>')
+<a class="jxr_linenumber" name="L6681" href="#L6681">6681</a> paramDepth++;
+<a class="jxr_linenumber" name="L6682" href="#L6682">6682</a> <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (c == '<')
+<a class="jxr_linenumber" name="L6683" href="#L6683">6683</a> paramDepth--;
+<a class="jxr_linenumber" name="L6684" href="#L6684">6684</a> <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (c == ',' && paramDepth == 0) {
+<a class="jxr_linenumber" name="L6685" href="#L6685">6685</a> <strong class="jxr_keyword">var</strong> s2 = <strong class="jxr_keyword">new</strong> String(sArray, x1, i - x1);
+<a class="jxr_linenumber" name="L6686" href="#L6686">6686</a> l.add(s2.trim());
+<a class="jxr_linenumber" name="L6687" href="#L6687">6687</a> x1 = i + 1;
+<a class="jxr_linenumber" name="L6688" href="#L6688">6688</a> }
+<a class="jxr_linenumber" name="L6689" href="#L6689">6689</a> }
+<a class="jxr_linenumber" name="L6690" href="#L6690">6690</a>
+<a class="jxr_linenumber" name="L6691" href="#L6691">6691</a> <strong class="jxr_keyword">var</strong> s2 = <strong class="jxr_keyword">new</strong> String(sArray, x1, sArray.length - x1);
+<a class="jxr_linenumber" name="L6692" href="#L6692">6692</a> l.add(s2.trim());
+<a class="jxr_linenumber" name="L6693" href="#L6693">6693</a>
+<a class="jxr_linenumber" name="L6694" href="#L6694">6694</a> <strong class="jxr_keyword">return</strong> l.toArray(<strong class="jxr_keyword">new</strong> String[l.size()]);
+<a class="jxr_linenumber" name="L6695" href="#L6695">6695</a> }
+<a class="jxr_linenumber" name="L6696" href="#L6696">6696</a>
+<a class="jxr_linenumber" name="L6697" href="#L6697">6697</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L6698" href="#L6698">6698</a> <em class="jxr_javadoccomment"> * Splits a comma-delimited list containing "nesting constructs".</em>
+<a class="jxr_linenumber" name="L6699" href="#L6699">6699</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6700" href="#L6700">6700</a> <em class="jxr_javadoccomment"> * Nesting constructs are simple embedded "{...}" comma-delimted lists.</em>
+<a class="jxr_linenumber" name="L6701" href="#L6701">6701</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6702" href="#L6702">6702</a> <em class="jxr_javadoccomment"> * Example:</em>
+<a class="jxr_linenumber" name="L6703" href="#L6703">6703</a> <em class="jxr_javadoccomment"> * "a{b,c},d" -> ["a{b,c}","d"]</em>
+<a class="jxr_linenumber" name="L6704" href="#L6704">6704</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6705" href="#L6705">6705</a> <em class="jxr_javadoccomment"> * Handles escapes and trims whitespace from tokens.</em>
+<a class="jxr_linenumber" name="L6706" href="#L6706">6706</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6707" href="#L6707">6707</a> <em class="jxr_javadoccomment"> * @param s The input string.</em>
+<a class="jxr_linenumber" name="L6708" href="#L6708">6708</a> <em class="jxr_javadoccomment"> * @return</em>
+<a class="jxr_linenumber" name="L6709" href="#L6709">6709</a> <em class="jxr_javadoccomment"> * The results, or <jk>null</jk> if the input was <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L6710" href="#L6710">6710</a> <em class="jxr_javadoccomment"> * <br>An empty string results in an empty array.</em>
+<a class="jxr_linenumber" name="L6711" href="#L6711">6711</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L6712" href="#L6712">6712</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> List<String> splitNested(String s) {
+<a class="jxr_linenumber" name="L6713" href="#L6713">6713</a> <strong class="jxr_keyword">var</strong> escapeChars = getEscapeSet(',');
<a class="jxr_linenumber" name="L6714" href="#L6714">6714</a>
-<a class="jxr_linenumber" name="L6715" href="#L6715">6715</a> <strong class="jxr_keyword">var</strong> x1 = 0;
-<a class="jxr_linenumber" name="L6716" href="#L6716">6716</a> <strong class="jxr_keyword">var</strong> inEscape = false;
-<a class="jxr_linenumber" name="L6717" href="#L6717">6717</a> <strong class="jxr_keyword">var</strong> depthCount = 0;
-<a class="jxr_linenumber" name="L6718" href="#L6718">6718</a>
-<a class="jxr_linenumber" name="L6719" href="#L6719">6719</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < s.length(); i++) {
-<a class="jxr_linenumber" name="L6720" href="#L6720">6720</a> <strong class="jxr_keyword">var</strong> c = s.charAt(i);
-<a class="jxr_linenumber" name="L6721" href="#L6721">6721</a> <strong class="jxr_keyword">if</strong> (inEscape) {
-<a class="jxr_linenumber" name="L6722" href="#L6722">6722</a> <strong class="jxr_keyword">if</strong> (c == '\\') {
-<a class="jxr_linenumber" name="L6723" href="#L6723">6723</a> inEscape = false;
-<a class="jxr_linenumber" name="L6724" href="#L6724">6724</a> }
-<a class="jxr_linenumber" name="L6725" href="#L6725">6725</a> } <strong class="jxr_keyword">else</strong> {
-<a class="jxr_linenumber" name="L6726" href="#L6726">6726</a> <strong class="jxr_keyword">if</strong> (c == '\\') {
-<a class="jxr_linenumber" name="L6727" href="#L6727">6727</a> inEscape = <strong class="jxr_keyword">true</strong>;
-<a class="jxr_linenumber" name="L6728" href="#L6728">6728</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (c == '{') {
-<a class="jxr_linenumber" name="L6729" href="#L6729">6729</a> depthCount++;
-<a class="jxr_linenumber" name="L6730" href="#L6730">6730</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (c == '}') {
-<a class="jxr_linenumber" name="L6731" href="#L6731">6731</a> depthCount--;
-<a class="jxr_linenumber" name="L6732" href="#L6732">6732</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (c == ',' && depthCount == 0) {
-<a class="jxr_linenumber" name="L6733" href="#L6733">6733</a> l.add(trim(unEscapeChars(s.substring(x1, i), escapeChars)));
-<a class="jxr_linenumber" name="L6734" href="#L6734">6734</a> x1 = i + 1;
-<a class="jxr_linenumber" name="L6735" href="#L6735">6735</a> }
-<a class="jxr_linenumber" name="L6736" href="#L6736">6736</a> }
-<a class="jxr_linenumber" name="L6737" href="#L6737">6737</a> }
-<a class="jxr_linenumber" name="L6738" href="#L6738">6738</a> l.add(trim(unEscapeChars(s.substring(x1, s.length()), escapeChars)));
-<a class="jxr_linenumber" name="L6739" href="#L6739">6739</a>
-<a class="jxr_linenumber" name="L6740" href="#L6740">6740</a> <strong class="jxr_keyword">return</strong> l;
-<a class="jxr_linenumber" name="L6741" href="#L6741">6741</a> }
-<a class="jxr_linenumber" name="L6742" href="#L6742">6742</a>
-<a class="jxr_linenumber" name="L6743" href="#L6743">6743</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L6744" href="#L6744">6744</a> <em class="jxr_javadoccomment"> * Splits a nested comma-delimited list.</em>
-<a class="jxr_linenumber" name="L6745" href="#L6745">6745</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6746" href="#L6746">6746</a> <em class="jxr_javadoccomment"> * Nesting constructs are simple embedded "{...}" comma-delimted lists.</em>
-<a class="jxr_linenumber" name="L6747" href="#L6747">6747</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6748" href="#L6748">6748</a> <em class="jxr_javadoccomment"> * Example:</em>
-<a class="jxr_linenumber" name="L6749" href="#L6749">6749</a> <em class="jxr_javadoccomment"> * "a{b,c{d,e}}" -> ["b","c{d,e}"]</em>
-<a class="jxr_linenumber" name="L6750" href="#L6750">6750</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6751" href="#L6751">6751</a> <em class="jxr_javadoccomment"> * Handles escapes and trims whitespace from tokens.</em>
-<a class="jxr_linenumber" name="L6752" href="#L6752">6752</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6753" href="#L6753">6753</a> <em class="jxr_javadoccomment"> * @param s The input string.</em>
-<a class="jxr_linenumber" name="L6754" href="#L6754">6754</a> <em class="jxr_javadoccomment"> * @return</em>
-<a class="jxr_linenumber" name="L6755" href="#L6755">6755</a> <em class="jxr_javadoccomment"> * The results, or <jk>null</jk> if the input was <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L6756" href="#L6756">6756</a> <em class="jxr_javadoccomment"> * <br>An empty string results in an empty array.</em>
-<a class="jxr_linenumber" name="L6757" href="#L6757">6757</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L6758" href="#L6758">6758</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> List<String> splitNestedInner(String s) {
-<a class="jxr_linenumber" name="L6759" href="#L6759">6759</a> assertArg(isNotNull(s), <span class="jxr_string">"String was null."</span>);
-<a class="jxr_linenumber" name="L6760" href="#L6760">6760</a> assertArg(isNotEmpty(s), <span class="jxr_string">"String was empty."</span>);
-<a class="jxr_linenumber" name="L6761" href="#L6761">6761</a>
-<a class="jxr_linenumber" name="L6762" href="#L6762">6762</a> <em class="jxr_comment">// S1: Looking for '{'</em>
-<a class="jxr_linenumber" name="L6763" href="#L6763">6763</a> <em class="jxr_comment">// S2: Found '{', looking for '}'</em>
-<a class="jxr_linenumber" name="L6764" href="#L6764">6764</a>
-<a class="jxr_linenumber" name="L6765" href="#L6765">6765</a> <strong class="jxr_keyword">var</strong> start = -1;
-<a class="jxr_linenumber" name="L6766" href="#L6766">6766</a> <strong class="jxr_keyword">var</strong> end = -1;
-<a class="jxr_linenumber" name="L6767" href="#L6767">6767</a> <strong class="jxr_keyword">var</strong> state = S1;
-<a class="jxr_linenumber" name="L6768" href="#L6768">6768</a>
-<a class="jxr_linenumber" name="L6769" href="#L6769">6769</a> <strong class="jxr_keyword">var</strong> depth = 0;
-<a class="jxr_linenumber" name="L6770" href="#L6770">6770</a> <strong class="jxr_keyword">var</strong> inEscape = false;
-<a class="jxr_linenumber" name="L6771" href="#L6771">6771</a>
-<a class="jxr_linenumber" name="L6772" href="#L6772">6772</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < s.length(); i++) {
-<a class="jxr_linenumber" name="L6773" href="#L6773">6773</a> <strong class="jxr_keyword">var</strong> c = s.charAt(i);
-<a class="jxr_linenumber" name="L6774" href="#L6774">6774</a> <strong class="jxr_keyword">if</strong> (inEscape) {
-<a class="jxr_linenumber" name="L6775" href="#L6775">6775</a> <strong class="jxr_keyword">if</strong> (c == '\\') {
-<a class="jxr_linenumber" name="L6776" href="#L6776">6776</a> inEscape = false;
-<a class="jxr_linenumber" name="L6777" href="#L6777">6777</a> }
-<a class="jxr_linenumber" name="L6778" href="#L6778">6778</a> } <strong class="jxr_keyword">else</strong> {
-<a class="jxr_linenumber" name="L6779" href="#L6779">6779</a> <strong class="jxr_keyword">if</strong> (c == '\\') {
-<a class="jxr_linenumber" name="L6780" href="#L6780">6780</a> inEscape = <strong class="jxr_keyword">true</strong>;
-<a class="jxr_linenumber" name="L6781" href="#L6781">6781</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (state == S1) {
-<a class="jxr_linenumber" name="L6782" href="#L6782">6782</a> <strong class="jxr_keyword">if</strong> (c == '{') {
-<a class="jxr_linenumber" name="L6783" href="#L6783">6783</a> start = i + 1;
-<a class="jxr_linenumber" name="L6784" href="#L6784">6784</a> state = S2;
-<a class="jxr_linenumber" name="L6785" href="#L6785">6785</a> }
-<a class="jxr_linenumber" name="L6786" href="#L6786">6786</a> } <strong class="jxr_keyword">else</strong> <em class="jxr_comment">/* state == S2 */</em> {
-<a class="jxr_linenumber" name="L6787" href="#L6787">6787</a> <strong class="jxr_keyword">if</strong> (c == '{') {
-<a class="jxr_linenumber" name="L6788" href="#L6788">6788</a> depth++;
-<a class="jxr_linenumber" name="L6789" href="#L6789">6789</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (depth > 0 && c == '}') {
-<a class="jxr_linenumber" name="L6790" href="#L6790">6790</a> depth--;
-<a class="jxr_linenumber" name="L6791" href="#L6791">6791</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (c == '}') {
-<a class="jxr_linenumber" name="L6792" href="#L6792">6792</a> end = i;
-<a class="jxr_linenumber" name="L6793" href="#L6793">6793</a> <strong class="jxr_keyword">break</strong>;
+<a class="jxr_linenumber" name="L6715" href="#L6715">6715</a> <strong class="jxr_keyword">if</strong> (s == <strong class="jxr_keyword">null</strong>)
+<a class="jxr_linenumber" name="L6716" href="#L6716">6716</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>; <em class="jxr_comment">// NOSONAR - Intentional.</em>
+<a class="jxr_linenumber" name="L6717" href="#L6717">6717</a> <strong class="jxr_keyword">if</strong> (isEmpty(s))
+<a class="jxr_linenumber" name="L6718" href="#L6718">6718</a> <strong class="jxr_keyword">return</strong> Collections.emptyList();
+<a class="jxr_linenumber" name="L6719" href="#L6719">6719</a> <strong class="jxr_keyword">if</strong> (s.indexOf(',') == -1)
+<a class="jxr_linenumber" name="L6720" href="#L6720">6720</a> <strong class="jxr_keyword">return</strong> Collections.singletonList(trim(s));
+<a class="jxr_linenumber" name="L6721" href="#L6721">6721</a>
+<a class="jxr_linenumber" name="L6722" href="#L6722">6722</a> <strong class="jxr_keyword">var</strong> l = <strong class="jxr_keyword">new</strong> LinkedList<String>();
+<a class="jxr_linenumber" name="L6723" href="#L6723">6723</a>
+<a class="jxr_linenumber" name="L6724" href="#L6724">6724</a> <strong class="jxr_keyword">var</strong> x1 = 0;
+<a class="jxr_linenumber" name="L6725" href="#L6725">6725</a> <strong class="jxr_keyword">var</strong> inEscape = false;
+<a class="jxr_linenumber" name="L6726" href="#L6726">6726</a> <strong class="jxr_keyword">var</strong> depthCount = 0;
+<a class="jxr_linenumber" name="L6727" href="#L6727">6727</a>
+<a class="jxr_linenumber" name="L6728" href="#L6728">6728</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < s.length(); i++) {
+<a class="jxr_linenumber" name="L6729" href="#L6729">6729</a> <strong class="jxr_keyword">var</strong> c = s.charAt(i);
+<a class="jxr_linenumber" name="L6730" href="#L6730">6730</a> <strong class="jxr_keyword">if</strong> (inEscape) {
+<a class="jxr_linenumber" name="L6731" href="#L6731">6731</a> <strong class="jxr_keyword">if</strong> (c == '\\') {
+<a class="jxr_linenumber" name="L6732" href="#L6732">6732</a> inEscape = false;
+<a class="jxr_linenumber" name="L6733" href="#L6733">6733</a> }
+<a class="jxr_linenumber" name="L6734" href="#L6734">6734</a> } <strong class="jxr_keyword">else</strong> {
+<a class="jxr_linenumber" name="L6735" href="#L6735">6735</a> <strong class="jxr_keyword">if</strong> (c == '\\') {
+<a class="jxr_linenumber" name="L6736" href="#L6736">6736</a> inEscape = <strong class="jxr_keyword">true</strong>;
+<a class="jxr_linenumber" name="L6737" href="#L6737">6737</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (c == '{') {
+<a class="jxr_linenumber" name="L6738" href="#L6738">6738</a> depthCount++;
+<a class="jxr_linenumber" name="L6739" href="#L6739">6739</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (c == '}') {
+<a class="jxr_linenumber" name="L6740" href="#L6740">6740</a> depthCount--;
+<a class="jxr_linenumber" name="L6741" href="#L6741">6741</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (c == ',' && depthCount == 0) {
+<a class="jxr_linenumber" name="L6742" href="#L6742">6742</a> l.add(trim(unEscapeChars(s.substring(x1, i), escapeChars)));
+<a class="jxr_linenumber" name="L6743" href="#L6743">6743</a> x1 = i + 1;
+<a class="jxr_linenumber" name="L6744" href="#L6744">6744</a> }
+<a class="jxr_linenumber" name="L6745" href="#L6745">6745</a> }
+<a class="jxr_linenumber" name="L6746" href="#L6746">6746</a> }
+<a class="jxr_linenumber" name="L6747" href="#L6747">6747</a> l.add(trim(unEscapeChars(s.substring(x1, s.length()), escapeChars)));
+<a class="jxr_linenumber" name="L6748" href="#L6748">6748</a>
+<a class="jxr_linenumber" name="L6749" href="#L6749">6749</a> <strong class="jxr_keyword">return</strong> l;
+<a class="jxr_linenumber" name="L6750" href="#L6750">6750</a> }
+<a class="jxr_linenumber" name="L6751" href="#L6751">6751</a>
+<a class="jxr_linenumber" name="L6752" href="#L6752">6752</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L6753" href="#L6753">6753</a> <em class="jxr_javadoccomment"> * Splits a nested comma-delimited list.</em>
+<a class="jxr_linenumber" name="L6754" href="#L6754">6754</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6755" href="#L6755">6755</a> <em class="jxr_javadoccomment"> * Nesting constructs are simple embedded "{...}" comma-delimted lists.</em>
+<a class="jxr_linenumber" name="L6756" href="#L6756">6756</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6757" href="#L6757">6757</a> <em class="jxr_javadoccomment"> * Example:</em>
+<a class="jxr_linenumber" name="L6758" href="#L6758">6758</a> <em class="jxr_javadoccomment"> * "a{b,c{d,e}}" -> ["b","c{d,e}"]</em>
+<a class="jxr_linenumber" name="L6759" href="#L6759">6759</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6760" href="#L6760">6760</a> <em class="jxr_javadoccomment"> * Handles escapes and trims whitespace from tokens.</em>
+<a class="jxr_linenumber" name="L6761" href="#L6761">6761</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6762" href="#L6762">6762</a> <em class="jxr_javadoccomment"> * @param s The input string.</em>
+<a class="jxr_linenumber" name="L6763" href="#L6763">6763</a> <em class="jxr_javadoccomment"> * @return</em>
+<a class="jxr_linenumber" name="L6764" href="#L6764">6764</a> <em class="jxr_javadoccomment"> * The results, or <jk>null</jk> if the input was <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L6765" href="#L6765">6765</a> <em class="jxr_javadoccomment"> * <br>An empty string results in an empty array.</em>
+<a class="jxr_linenumber" name="L6766" href="#L6766">6766</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L6767" href="#L6767">6767</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> List<String> splitNestedInner(String s) {
+<a class="jxr_linenumber" name="L6768" href="#L6768">6768</a> assertArg(isNotNull(s), <span class="jxr_string">"String was null."</span>);
+<a class="jxr_linenumber" name="L6769" href="#L6769">6769</a> assertArg(isNotEmpty(s), <span class="jxr_string">"String was empty."</span>);
+<a class="jxr_linenumber" name="L6770" href="#L6770">6770</a>
+<a class="jxr_linenumber" name="L6771" href="#L6771">6771</a> <em class="jxr_comment">// S1: Looking for '{'</em>
+<a class="jxr_linenumber" name="L6772" href="#L6772">6772</a> <em class="jxr_comment">// S2: Found '{', looking for '}'</em>
+<a class="jxr_linenumber" name="L6773" href="#L6773">6773</a>
+<a class="jxr_linenumber" name="L6774" href="#L6774">6774</a> <strong class="jxr_keyword">var</strong> start = -1;
+<a class="jxr_linenumber" name="L6775" href="#L6775">6775</a> <strong class="jxr_keyword">var</strong> end = -1;
+<a class="jxr_linenumber" name="L6776" href="#L6776">6776</a> <strong class="jxr_keyword">var</strong> state = S1;
+<a class="jxr_linenumber" name="L6777" href="#L6777">6777</a>
+<a class="jxr_linenumber" name="L6778" href="#L6778">6778</a> <strong class="jxr_keyword">var</strong> depth = 0;
+<a class="jxr_linenumber" name="L6779" href="#L6779">6779</a> <strong class="jxr_keyword">var</strong> inEscape = false;
+<a class="jxr_linenumber" name="L6780" href="#L6780">6780</a>
+<a class="jxr_linenumber" name="L6781" href="#L6781">6781</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < s.length(); i++) {
+<a class="jxr_linenumber" name="L6782" href="#L6782">6782</a> <strong class="jxr_keyword">var</strong> c = s.charAt(i);
+<a class="jxr_linenumber" name="L6783" href="#L6783">6783</a> <strong class="jxr_keyword">if</strong> (inEscape) {
+<a class="jxr_linenumber" name="L6784" href="#L6784">6784</a> <strong class="jxr_keyword">if</strong> (c == '\\') {
+<a class="jxr_linenumber" name="L6785" href="#L6785">6785</a> inEscape = false;
+<a class="jxr_linenumber" name="L6786" href="#L6786">6786</a> }
+<a class="jxr_linenumber" name="L6787" href="#L6787">6787</a> } <strong class="jxr_keyword">else</strong> {
+<a class="jxr_linenumber" name="L6788" href="#L6788">6788</a> <strong class="jxr_keyword">if</strong> (c == '\\') {
+<a class="jxr_linenumber" name="L6789" href="#L6789">6789</a> inEscape = <strong class="jxr_keyword">true</strong>;
+<a class="jxr_linenumber" name="L6790" href="#L6790">6790</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (state == S1) {
+<a class="jxr_linenumber" name="L6791" href="#L6791">6791</a> <strong class="jxr_keyword">if</strong> (c == '{') {
+<a class="jxr_linenumber" name="L6792" href="#L6792">6792</a> start = i + 1;
+<a class="jxr_linenumber" name="L6793" href="#L6793">6793</a> state = S2;
<a class="jxr_linenumber" name="L6794" href="#L6794">6794</a> }
-<a class="jxr_linenumber" name="L6795" href="#L6795">6795</a> }
-<a class="jxr_linenumber" name="L6796" href="#L6796">6796</a> }
-<a class="jxr_linenumber" name="L6797" href="#L6797">6797</a> }
-<a class="jxr_linenumber" name="L6798" href="#L6798">6798</a>
-<a class="jxr_linenumber" name="L6799" href="#L6799">6799</a> <strong class="jxr_keyword">if</strong> (start == -1)
-<a class="jxr_linenumber" name="L6800" href="#L6800">6800</a> <strong class="jxr_keyword">throw</strong> illegalArg(<span class="jxr_string">"Start character '{' not found in string: {0}"</span>, s);
-<a class="jxr_linenumber" name="L6801" href="#L6801">6801</a> <strong class="jxr_keyword">if</strong> (end == -1)
-<a class="jxr_linenumber" name="L6802" href="#L6802">6802</a> <strong class="jxr_keyword">throw</strong> illegalArg(<span class="jxr_string">"End character '}' not found in string {0}"</span>, s);
-<a class="jxr_linenumber" name="L6803" href="#L6803">6803</a> <strong class="jxr_keyword">return</strong> splitNested(s.substring(start, end));
-<a class="jxr_linenumber" name="L6804" href="#L6804">6804</a> }
-<a class="jxr_linenumber" name="L6805" href="#L6805">6805</a>
-<a class="jxr_linenumber" name="L6806" href="#L6806">6806</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L6807" href="#L6807">6807</a> <em class="jxr_javadoccomment"> * Splits a space-delimited string with optionally quoted arguments.</em>
-<a class="jxr_linenumber" name="L6808" href="#L6808">6808</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6809" href="#L6809">6809</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L6810" href="#L6810">6810</a> <em class="jxr_javadoccomment"> * Examples:</em>
-<a class="jxr_linenumber" name="L6811" href="#L6811">6811</a> <em class="jxr_javadoccomment"> * <ul></em>
-<a class="jxr_linenumber" name="L6812" href="#L6812">6812</a> <em class="jxr_javadoccomment"> * <li><js>"foo"</js> =&gt; <c>["foo"]</c></em>
-<a class="jxr_linenumber" name="L6813" href="#L6813">6813</a> <em class="jxr_javadoccomment"> * <li><js>" foo "</js> =&gt; <c>["foo"]</c></em>
-<a class="jxr_linenumber" name="L6814" href="#L6814">6814</a> <em class="jxr_javadoccomment"> * <li><js>"foo bar baz"</js> =&gt; <c>["foo","bar","baz"]</c></em>
-<a class="jxr_linenumber" name="L6815" href="#L6815">6815</a> <em class="jxr_javadoccomment"> * <li><js>"foo 'bar baz'"</js> =&gt; <c>["foo","bar baz"]</c></em>
-<a class="jxr_linenumber" name="L6816" href="#L6816">6816</a> <em class="jxr_javadoccomment"> * <li><js>"foo \"bar baz\""</js> =&gt; <c>["foo","bar baz"]</c></em>
-<a class="jxr_linenumber" name="L6817" href="#L6817">6817</a> <em class="jxr_javadoccomment"> * <li><js>"foo 'bar\'baz'"</js> =&gt; <c>["foo","bar'baz"]</c></em>
-<a class="jxr_linenumber" name="L6818" href="#L6818">6818</a> <em class="jxr_javadoccomment"> * </ul></em>
-<a class="jxr_linenumber" name="L6819" href="#L6819">6819</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6820" href="#L6820">6820</a> <em class="jxr_javadoccomment"> * @param s The input string.</em>
-<a class="jxr_linenumber" name="L6821" href="#L6821">6821</a> <em class="jxr_javadoccomment"> * @return</em>
-<a class="jxr_linenumber" name="L6822" href="#L6822">6822</a> <em class="jxr_javadoccomment"> * The results, or <jk>null</jk> if the input was <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L6823" href="#L6823">6823</a> <em class="jxr_javadoccomment"> * <br>An empty string results in an empty array.</em>
-<a class="jxr_linenumber" name="L6824" href="#L6824">6824</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L6825" href="#L6825">6825</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String[] splitQuoted(String s) {
-<a class="jxr_linenumber" name="L6826" href="#L6826">6826</a> <strong class="jxr_keyword">return</strong> splitQuoted(s, false);
-<a class="jxr_linenumber" name="L6827" href="#L6827">6827</a> }
-<a class="jxr_linenumber" name="L6828" href="#L6828">6828</a>
-<a class="jxr_linenumber" name="L6829" href="#L6829">6829</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L6830" href="#L6830">6830</a> <em class="jxr_javadoccomment"> * Same as {@link StringUtils#splitQuoted(String)} but allows you to optionally keep the quote characters.</em>
-<a class="jxr_linenumber" name="L6831" href="#L6831">6831</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6832" href="#L6832">6832</a> <em class="jxr_javadoccomment"> * @param s The input string.</em>
-<a class="jxr_linenumber" name="L6833" href="#L6833">6833</a> <em class="jxr_javadoccomment"> * @param keepQuotes If <jk>true</jk>, quote characters are kept on the tokens.</em>
-<a class="jxr_linenumber" name="L6834" href="#L6834">6834</a> <em class="jxr_javadoccomment"> * @return</em>
-<a class="jxr_linenumber" name="L6835" href="#L6835">6835</a> <em class="jxr_javadoccomment"> * The results, or <jk>null</jk> if the input was <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L6836" href="#L6836">6836</a> <em class="jxr_javadoccomment"> * <br>An empty string results in an empty array.</em>
-<a class="jxr_linenumber" name="L6837" href="#L6837">6837</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L6838" href="#L6838">6838</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String[] splitQuoted(String s, <strong class="jxr_keyword">boolean</strong> keepQuotes) {
-<a class="jxr_linenumber" name="L6839" href="#L6839">6839</a>
-<a class="jxr_linenumber" name="L6840" href="#L6840">6840</a> <strong class="jxr_keyword">if</strong> (s == <strong class="jxr_keyword">null</strong>)
-<a class="jxr_linenumber" name="L6841" href="#L6841">6841</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>; <em class="jxr_comment">// NOSONAR - Intentional.</em>
-<a class="jxr_linenumber" name="L6842" href="#L6842">6842</a>
-<a class="jxr_linenumber" name="L6843" href="#L6843">6843</a> s = s.trim();
-<a class="jxr_linenumber" name="L6844" href="#L6844">6844</a>
-<a class="jxr_linenumber" name="L6845" href="#L6845">6845</a> <strong class="jxr_keyword">if</strong> (isEmpty(s))
-<a class="jxr_linenumber" name="L6846" href="#L6846">6846</a> <strong class="jxr_keyword">return</strong> a();
-<a class="jxr_linenumber" name="L6847" href="#L6847">6847</a>
-<a class="jxr_linenumber" name="L6848" href="#L6848">6848</a> <strong class="jxr_keyword">if</strong> (! containsAny(s, ' ', '\t', '\'', '"'))
-<a class="jxr_linenumber" name="L6849" href="#L6849">6849</a> <strong class="jxr_keyword">return</strong> a(s);
-<a class="jxr_linenumber" name="L6850" href="#L6850">6850</a>
-<a class="jxr_linenumber" name="L6851" href="#L6851">6851</a> <em class="jxr_comment">// S1: Looking for start of token.</em>
-<a class="jxr_linenumber" name="L6852" href="#L6852">6852</a> <em class="jxr_comment">// S2: Found ', looking for end '</em>
-<a class="jxr_linenumber" name="L6853" href="#L6853">6853</a> <em class="jxr_comment">// S3: Found ", looking for end "</em>
-<a class="jxr_linenumber" name="L6854" href="#L6854">6854</a> <em class="jxr_comment">// S4: Found non-whitespace, looking for end whitespace.</em>
-<a class="jxr_linenumber" name="L6855" href="#L6855">6855</a>
-<a class="jxr_linenumber" name="L6856" href="#L6856">6856</a> <strong class="jxr_keyword">var</strong> state = S1;
-<a class="jxr_linenumber" name="L6857" href="#L6857">6857</a>
-<a class="jxr_linenumber" name="L6858" href="#L6858">6858</a> <strong class="jxr_keyword">var</strong> isInEscape = false;
-<a class="jxr_linenumber" name="L6859" href="#L6859">6859</a> <strong class="jxr_keyword">var</strong> needsUnescape = false;
-<a class="jxr_linenumber" name="L6860" href="#L6860">6860</a> <strong class="jxr_keyword">var</strong> mark = 0;
-<a class="jxr_linenumber" name="L6861" href="#L6861">6861</a>
-<a class="jxr_linenumber" name="L6862" href="#L6862">6862</a> <strong class="jxr_keyword">var</strong> l = <strong class="jxr_keyword">new</strong> ArrayList<String>();
-<a class="jxr_linenumber" name="L6863" href="#L6863">6863</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < s.length(); i++) {
-<a class="jxr_linenumber" name="L6864" href="#L6864">6864</a> <strong class="jxr_keyword">var</strong> c = s.charAt(i);
-<a class="jxr_linenumber" name="L6865" href="#L6865">6865</a>
-<a class="jxr_linenumber" name="L6866" href="#L6866">6866</a> <strong class="jxr_keyword">if</strong> (state == S1) {
-<a class="jxr_linenumber" name="L6867" href="#L6867">6867</a> <strong class="jxr_keyword">if</strong> (c == '\'') {
-<a class="jxr_linenumber" name="L6868" href="#L6868">6868</a> state = S2;
-<a class="jxr_linenumber" name="L6869" href="#L6869">6869</a> mark = keepQuotes ? i : i + 1;
-<a class="jxr_linenumber" name="L6870" href="#L6870">6870</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (c == '"') {
-<a class="jxr_linenumber" name="L6871" href="#L6871">6871</a> state = S3;
-<a class="jxr_linenumber" name="L6872" href="#L6872">6872</a> mark = keepQuotes ? i : i + 1;
-<a class="jxr_linenumber" name="L6873" href="#L6873">6873</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (c != ' ' && c != '\t') {
-<a class="jxr_linenumber" name="L6874" href="#L6874">6874</a> state = S4;
-<a class="jxr_linenumber" name="L6875" href="#L6875">6875</a> mark = i;
-<a class="jxr_linenumber" name="L6876" href="#L6876">6876</a> }
-<a class="jxr_linenumber" name="L6877" href="#L6877">6877</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (state == S2 || state == S3) {
-<a class="jxr_linenumber" name="L6878" href="#L6878">6878</a> <strong class="jxr_keyword">if</strong> (c == '\\') {
-<a class="jxr_linenumber" name="L6879" href="#L6879">6879</a> isInEscape = ! isInEscape;
-<a class="jxr_linenumber" name="L6880" href="#L6880">6880</a> needsUnescape = ! keepQuotes;
-<a class="jxr_linenumber" name="L6881" href="#L6881">6881</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (! isInEscape) {
-<a class="jxr_linenumber" name="L6882" href="#L6882">6882</a> <strong class="jxr_keyword">if</strong> (c == (state == S2 ? '\'' : '"')) {
-<a class="jxr_linenumber" name="L6883" href="#L6883">6883</a> <strong class="jxr_keyword">var</strong> s2 = s.substring(mark, keepQuotes ? i + 1 : i);
-<a class="jxr_linenumber" name="L6884" href="#L6884">6884</a> <strong class="jxr_keyword">if</strong> (needsUnescape) <em class="jxr_comment">// NOSONAR - False positive check.</em>
-<a class="jxr_linenumber" name="L6885" href="#L6885">6885</a> s2 = unEscapeChars(s2, QUOTE_ESCAPE_SET);
-<a class="jxr_linenumber" name="L6886" href="#L6886">6886</a> l.add(s2);
-<a class="jxr_linenumber" name="L6887" href="#L6887">6887</a> state = S1;
-<a class="jxr_linenumber" name="L6888" href="#L6888">6888</a> isInEscape = needsUnescape = false;
-<a class="jxr_linenumber" name="L6889" href="#L6889">6889</a> }
-<a class="jxr_linenumber" name="L6890" href="#L6890">6890</a> } <strong class="jxr_keyword">else</strong> {
-<a class="jxr_linenumber" name="L6891" href="#L6891">6891</a> isInEscape = false;
-<a class="jxr_linenumber" name="L6892" href="#L6892">6892</a> }
-<a class="jxr_linenumber" name="L6893" href="#L6893">6893</a> } <strong class="jxr_keyword">else</strong> <em class="jxr_comment">/* state == S4 */</em> {
-<a class="jxr_linenumber" name="L6894" href="#L6894">6894</a> <strong class="jxr_keyword">if</strong> (c == ' ' || c == '\t') {
-<a class="jxr_linenumber" name="L6895" href="#L6895">6895</a> l.add(s.substring(mark, i));
-<a class="jxr_linenumber" name="L6896" href="#L6896">6896</a> state = S1;
-<a class="jxr_linenumber" name="L6897" href="#L6897">6897</a> }
-<a class="jxr_linenumber" name="L6898" href="#L6898">6898</a> }
-<a class="jxr_linenumber" name="L6899" href="#L6899">6899</a> }
-<a class="jxr_linenumber" name="L6900" href="#L6900">6900</a> <strong class="jxr_keyword">if</strong> (state == S4)
-<a class="jxr_linenumber" name="L6901" href="#L6901">6901</a> l.add(s.substring(mark));
-<a class="jxr_linenumber" name="L6902" href="#L6902">6902</a> <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (state == S2 || state == S3)
-<a class="jxr_linenumber" name="L6903" href="#L6903">6903</a> <strong class="jxr_keyword">throw</strong> illegalArg(<span class="jxr_string">"Unmatched string quotes: {0}"</span>, s);
-<a class="jxr_linenumber" name="L6904" href="#L6904">6904</a> <strong class="jxr_keyword">return</strong> l.toArray(<strong class="jxr_keyword">new</strong> String[l.size()]);
-<a class="jxr_linenumber" name="L6905" href="#L6905">6905</a> }
-<a class="jxr_linenumber" name="L6906" href="#L6906">6906</a>
-<a class="jxr_linenumber" name="L6907" href="#L6907">6907</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L6908" href="#L6908">6908</a> <em class="jxr_javadoccomment"> * An efficient method for checking if a string starts with a character.</em>
-<a class="jxr_linenumber" name="L6909" href="#L6909">6909</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6910" href="#L6910">6910</a> <em class="jxr_javadoccomment"> * @param s The string to check. Can be <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L6911" href="#L6911">6911</a> <em class="jxr_javadoccomment"> * @param c The character to check for.</em>
-<a class="jxr_linenumber" name="L6912" href="#L6912">6912</a> <em class="jxr_javadoccomment"> * @return <jk>true</jk> if the specified string is not <jk>null</jk> and starts with the specified character.</em>
-<a class="jxr_linenumber" name="L6913" href="#L6913">6913</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L6914" href="#L6914">6914</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">boolean</strong> startsWith(String s, <strong class="jxr_keyword">char</strong> c) {
-<a class="jxr_linenumber" name="L6915" href="#L6915">6915</a> <strong class="jxr_keyword">if</strong> (nn(s)) {
-<a class="jxr_linenumber" name="L6916" href="#L6916">6916</a> <strong class="jxr_keyword">var</strong> i = s.length();
-<a class="jxr_linenumber" name="L6917" href="#L6917">6917</a> <strong class="jxr_keyword">if</strong> (i > 0)
-<a class="jxr_linenumber" name="L6918" href="#L6918">6918</a> <strong class="jxr_keyword">return</strong> s.charAt(0) == c;
-<a class="jxr_linenumber" name="L6919" href="#L6919">6919</a> }
-<a class="jxr_linenumber" name="L6920" href="#L6920">6920</a> <strong class="jxr_keyword">return</strong> false;
-<a class="jxr_linenumber" name="L6921" href="#L6921">6921</a> }
-<a class="jxr_linenumber" name="L6922" href="#L6922">6922</a>
-<a class="jxr_linenumber" name="L6923" href="#L6923">6923</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L6924" href="#L6924">6924</a> <em class="jxr_javadoccomment"> * Checks if a string starts with a prefix, ignoring case.</em>
-<a class="jxr_linenumber" name="L6925" href="#L6925">6925</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6926" href="#L6926">6926</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
-<a class="jxr_linenumber" name="L6927" href="#L6927">6927</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L6928" href="#L6928">6928</a> <em class="jxr_javadoccomment"> * startsWithIgnoreCase(<js>"Hello World"</js>, <js>"hello"</js>); <jc>// true</jc></em>
-<a class="jxr_linenumber" name="L6929" href="#L6929">6929</a> <em class="jxr_javadoccomment"> * startsWithIgnoreCase(<js>"Hello World"</js>, <js>"HELLO"</js>); <jc>// true</jc></em>
-<a class="jxr_linenumber" name="L6930" href="#L6930">6930</a> <em class="jxr_javadoccomment"> * startsWithIgnoreCase(<js>"hello world"</js>, <js>"world"</js>); <jc>// false</jc></em>
-<a class="jxr_linenumber" name="L6931" href="#L6931">6931</a> <em class="jxr_javadoccomment"> * </p></em>
-<a class="jxr_linenumber" name="L6932" href="#L6932">6932</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6933" href="#L6933">6933</a> <em class="jxr_javadoccomment"> * @param str The string to check.</em>
-<a class="jxr_linenumber" name="L6934" href="#L6934">6934</a> <em class="jxr_javadoccomment"> * @param prefix The prefix to check for.</em>
-<a class="jxr_linenumber" name="L6935" href="#L6935">6935</a> <em class="jxr_javadoccomment"> * @return <jk>true</jk> if the string starts with the prefix (ignoring case), <jk>false</jk> otherwise.</em>
-<a class="jxr_linenumber" name="L6936" href="#L6936">6936</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L6937" href="#L6937">6937</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">boolean</strong> startsWithIgnoreCase(String str, String prefix) {
-<a class="jxr_linenumber" name="L6938" href="#L6938">6938</a> <strong class="jxr_keyword">if</strong> (str == <strong class="jxr_keyword">null</strong> || prefix == <strong class="jxr_keyword">null</strong>)
-<a class="jxr_linenumber" name="L6939" href="#L6939">6939</a> <strong class="jxr_keyword">return</strong> false;
-<a class="jxr_linenumber" name="L6940" href="#L6940">6940</a> <strong class="jxr_keyword">return</strong> str.toLowerCase().startsWith(prefix.toLowerCase());
-<a class="jxr_linenumber" name="L6941" href="#L6941">6941</a> }
-<a class="jxr_linenumber" name="L6942" href="#L6942">6942</a>
-<a class="jxr_linenumber" name="L6943" href="#L6943">6943</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L6944" href="#L6944">6944</a> <em class="jxr_javadoccomment"> * Takes a supplier of any type and returns a {@link Supplier}{@code <String>}.</em>
-<a class="jxr_linenumber" name="L6945" href="#L6945">6945</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6946" href="#L6946">6946</a> <em class="jxr_javadoccomment"> * <p>Useful when passing arguments to loggers.</em>
-<a class="jxr_linenumber" name="L6947" href="#L6947">6947</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6948" href="#L6948">6948</a> <em class="jxr_javadoccomment"> * @param s The supplier.</em>
-<a class="jxr_linenumber" name="L6949" href="#L6949">6949</a> <em class="jxr_javadoccomment"> * @return A string supplier that calls {@link #readable(Object)} on the supplied value.</em>
-<a class="jxr_linenumber" name="L6950" href="#L6950">6950</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L6951" href="#L6951">6951</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> Supplier<String> stringSupplier(Supplier<?> s) {
-<a class="jxr_linenumber" name="L6952" href="#L6952">6952</a> <strong class="jxr_keyword">return</strong> () -> readable(s.get());
-<a class="jxr_linenumber" name="L6953" href="#L6953">6953</a> }
-<a class="jxr_linenumber" name="L6954" href="#L6954">6954</a>
-<a class="jxr_linenumber" name="L6955" href="#L6955">6955</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L6956" href="#L6956">6956</a> <em class="jxr_javadoccomment"> * Strips the first and last character from a string.</em>
-<a class="jxr_linenumber" name="L6957" href="#L6957">6957</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6958" href="#L6958">6958</a> <em class="jxr_javadoccomment"> * @param s The string to strip.</em>
-<a class="jxr_linenumber" name="L6959" href="#L6959">6959</a> <em class="jxr_javadoccomment"> * @return The striped string, or the same string if the input was <jk>null</jk> or less than length 2.</em>
-<a class="jxr_linenumber" name="L6960" href="#L6960">6960</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L6961" href="#L6961">6961</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String strip(String s) {
-<a class="jxr_linenumber" name="L6962" href="#L6962">6962</a> <strong class="jxr_keyword">if</strong> (s == <strong class="jxr_keyword">null</strong> || s.length() <= 1)
-<a class="jxr_linenumber" name="L6963" href="#L6963">6963</a> <strong class="jxr_keyword">return</strong> s;
-<a class="jxr_linenumber" name="L6964" href="#L6964">6964</a> <strong class="jxr_keyword">return</strong> s.substring(1, s.length() - 1);
-<a class="jxr_linenumber" name="L6965" href="#L6965">6965</a> }
-<a class="jxr_linenumber" name="L6966" href="#L6966">6966</a>
-<a class="jxr_linenumber" name="L6967" href="#L6967">6967</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L6968" href="#L6968">6968</a> <em class="jxr_javadoccomment"> * Strips invalid characters such as CTRL characters from a string meant to be encoded</em>
-<a class="jxr_linenumber" name="L6969" href="#L6969">6969</a> <em class="jxr_javadoccomment"> * as an HTTP header value.</em>
-<a class="jxr_linenumber" name="L6970" href="#L6970">6970</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6971" href="#L6971">6971</a> <em class="jxr_javadoccomment"> * @param s The string to strip chars from.</em>
-<a class="jxr_linenumber" name="L6972" href="#L6972">6972</a> <em class="jxr_javadoccomment"> * @return The string with invalid characters removed.</em>
-<a class="jxr_linenumber" name="L6973" href="#L6973">6973</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L6974" href="#L6974">6974</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String stripInvalidHttpHeaderChars(String s) {
+<a class="jxr_linenumber" name="L6795" href="#L6795">6795</a> } <strong class="jxr_keyword">else</strong> <em class="jxr_comment">/* state == S2 */</em> {
+<a class="jxr_linenumber" name="L6796" href="#L6796">6796</a> <strong class="jxr_keyword">if</strong> (c == '{') {
+<a class="jxr_linenumber" name="L6797" href="#L6797">6797</a> depth++;
+<a class="jxr_linenumber" name="L6798" href="#L6798">6798</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (depth > 0 && c == '}') {
+<a class="jxr_linenumber" name="L6799" href="#L6799">6799</a> depth--;
+<a class="jxr_linenumber" name="L6800" href="#L6800">6800</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (c == '}') {
+<a class="jxr_linenumber" name="L6801" href="#L6801">6801</a> end = i;
+<a class="jxr_linenumber" name="L6802" href="#L6802">6802</a> <strong class="jxr_keyword">break</strong>;
+<a class="jxr_linenumber" name="L6803" href="#L6803">6803</a> }
+<a class="jxr_linenumber" name="L6804" href="#L6804">6804</a> }
+<a class="jxr_linenumber" name="L6805" href="#L6805">6805</a> }
+<a class="jxr_linenumber" name="L6806" href="#L6806">6806</a> }
+<a class="jxr_linenumber" name="L6807" href="#L6807">6807</a>
+<a class="jxr_linenumber" name="L6808" href="#L6808">6808</a> <strong class="jxr_keyword">if</strong> (start == -1)
+<a class="jxr_linenumber" name="L6809" href="#L6809">6809</a> <strong class="jxr_keyword">throw</strong> illegalArg(<span class="jxr_string">"Start character '{' not found in string: {0}"</span>, s);
+<a class="jxr_linenumber" name="L6810" href="#L6810">6810</a> <strong class="jxr_keyword">if</strong> (end == -1)
+<a class="jxr_linenumber" name="L6811" href="#L6811">6811</a> <strong class="jxr_keyword">throw</strong> illegalArg(<span class="jxr_string">"End character '}' not found in string {0}"</span>, s);
+<a class="jxr_linenumber" name="L6812" href="#L6812">6812</a> <strong class="jxr_keyword">return</strong> splitNested(s.substring(start, end));
+<a class="jxr_linenumber" name="L6813" href="#L6813">6813</a> }
+<a class="jxr_linenumber" name="L6814" href="#L6814">6814</a>
+<a class="jxr_linenumber" name="L6815" href="#L6815">6815</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L6816" href="#L6816">6816</a> <em class="jxr_javadoccomment"> * Splits a space-delimited string with optionally quoted arguments.</em>
+<a class="jxr_linenumber" name="L6817" href="#L6817">6817</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6818" href="#L6818">6818</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L6819" href="#L6819">6819</a> <em class="jxr_javadoccomment"> * Examples:</em>
+<a class="jxr_linenumber" name="L6820" href="#L6820">6820</a> <em class="jxr_javadoccomment"> * <ul></em>
+<a class="jxr_linenumber" name="L6821" href="#L6821">6821</a> <em class="jxr_javadoccomment"> * <li><js>"foo"</js> =&gt; <c>["foo"]</c></em>
+<a class="jxr_linenumber" name="L6822" href="#L6822">6822</a> <em class="jxr_javadoccomment"> * <li><js>" foo "</js> =&gt; <c>["foo"]</c></em>
+<a class="jxr_linenumber" name="L6823" href="#L6823">6823</a> <em class="jxr_javadoccomment"> * <li><js>"foo bar baz"</js> =&gt; <c>["foo","bar","baz"]</c></em>
+<a class="jxr_linenumber" name="L6824" href="#L6824">6824</a> <em class="jxr_javadoccomment"> * <li><js>"foo 'bar baz'"</js> =&gt; <c>["foo","bar baz"]</c></em>
+<a class="jxr_linenumber" name="L6825" href="#L6825">6825</a> <em class="jxr_javadoccomment"> * <li><js>"foo \"bar baz\""</js> =&gt; <c>["foo","bar baz"]</c></em>
+<a class="jxr_linenumber" name="L6826" href="#L6826">6826</a> <em class="jxr_javadoccomment"> * <li><js>"foo 'bar\'baz'"</js> =&gt; <c>["foo","bar'baz"]</c></em>
+<a class="jxr_linenumber" name="L6827" href="#L6827">6827</a> <em class="jxr_javadoccomment"> * </ul></em>
+<a class="jxr_linenumber" name="L6828" href="#L6828">6828</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6829" href="#L6829">6829</a> <em class="jxr_javadoccomment"> * @param s The input string.</em>
+<a class="jxr_linenumber" name="L6830" href="#L6830">6830</a> <em class="jxr_javadoccomment"> * @return</em>
+<a class="jxr_linenumber" name="L6831" href="#L6831">6831</a> <em class="jxr_javadoccomment"> * The results, or <jk>null</jk> if the input was <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L6832" href="#L6832">6832</a> <em class="jxr_javadoccomment"> * <br>An empty string results in an empty array.</em>
+<a class="jxr_linenumber" name="L6833" href="#L6833">6833</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L6834" href="#L6834">6834</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String[] splitQuoted(String s) {
+<a class="jxr_linenumber" name="L6835" href="#L6835">6835</a> <strong class="jxr_keyword">return</strong> splitQuoted(s, false);
+<a class="jxr_linenumber" name="L6836" href="#L6836">6836</a> }
+<a class="jxr_linenumber" name="L6837" href="#L6837">6837</a>
+<a class="jxr_linenumber" name="L6838" href="#L6838">6838</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L6839" href="#L6839">6839</a> <em class="jxr_javadoccomment"> * Same as {@link StringUtils#splitQuoted(String)} but allows you to optionally keep the quote characters.</em>
+<a class="jxr_linenumber" name="L6840" href="#L6840">6840</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6841" href="#L6841">6841</a> <em class="jxr_javadoccomment"> * @param s The input string.</em>
+<a class="jxr_linenumber" name="L6842" href="#L6842">6842</a> <em class="jxr_javadoccomment"> * @param keepQuotes If <jk>true</jk>, quote characters are kept on the tokens.</em>
+<a class="jxr_linenumber" name="L6843" href="#L6843">6843</a> <em class="jxr_javadoccomment"> * @return</em>
+<a class="jxr_linenumber" name="L6844" href="#L6844">6844</a> <em class="jxr_javadoccomment"> * The results, or <jk>null</jk> if the input was <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L6845" href="#L6845">6845</a> <em class="jxr_javadoccomment"> * <br>An empty string results in an empty array.</em>
+<a class="jxr_linenumber" name="L6846" href="#L6846">6846</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L6847" href="#L6847">6847</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String[] splitQuoted(String s, <strong class="jxr_keyword">boolean</strong> keepQuotes) {
+<a class="jxr_linenumber" name="L6848" href="#L6848">6848</a>
+<a class="jxr_linenumber" name="L6849" href="#L6849">6849</a> <strong class="jxr_keyword">if</strong> (s == <strong class="jxr_keyword">null</strong>)
+<a class="jxr_linenumber" name="L6850" href="#L6850">6850</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>; <em class="jxr_comment">// NOSONAR - Intentional.</em>
+<a class="jxr_linenumber" name="L6851" href="#L6851">6851</a>
+<a class="jxr_linenumber" name="L6852" href="#L6852">6852</a> s = s.trim();
+<a class="jxr_linenumber" name="L6853" href="#L6853">6853</a>
+<a class="jxr_linenumber" name="L6854" href="#L6854">6854</a> <strong class="jxr_keyword">if</strong> (isEmpty(s))
+<a class="jxr_linenumber" name="L6855" href="#L6855">6855</a> <strong class="jxr_keyword">return</strong> a();
+<a class="jxr_linenumber" name="L6856" href="#L6856">6856</a>
+<a class="jxr_linenumber" name="L6857" href="#L6857">6857</a> <strong class="jxr_keyword">if</strong> (! containsAny(s, ' ', '\t', '\'', '"'))
+<a class="jxr_linenumber" name="L6858" href="#L6858">6858</a> <strong class="jxr_keyword">return</strong> a(s);
+<a class="jxr_linenumber" name="L6859" href="#L6859">6859</a>
+<a class="jxr_linenumber" name="L6860" href="#L6860">6860</a> <em class="jxr_comment">// S1: Looking for start of token.</em>
+<a class="jxr_linenumber" name="L6861" href="#L6861">6861</a> <em class="jxr_comment">// S2: Found ', looking for end '</em>
+<a class="jxr_linenumber" name="L6862" href="#L6862">6862</a> <em class="jxr_comment">// S3: Found ", looking for end "</em>
+<a class="jxr_linenumber" name="L6863" href="#L6863">6863</a> <em class="jxr_comment">// S4: Found non-whitespace, looking for end whitespace.</em>
+<a class="jxr_linenumber" name="L6864" href="#L6864">6864</a>
+<a class="jxr_linenumber" name="L6865" href="#L6865">6865</a> <strong class="jxr_keyword">var</strong> state = S1;
+<a class="jxr_linenumber" name="L6866" href="#L6866">6866</a>
+<a class="jxr_linenumber" name="L6867" href="#L6867">6867</a> <strong class="jxr_keyword">var</strong> isInEscape = false;
+<a class="jxr_linenumber" name="L6868" href="#L6868">6868</a> <strong class="jxr_keyword">var</strong> needsUnescape = false;
+<a class="jxr_linenumber" name="L6869" href="#L6869">6869</a> <strong class="jxr_keyword">var</strong> mark = 0;
+<a class="jxr_linenumber" name="L6870" href="#L6870">6870</a>
+<a class="jxr_linenumber" name="L6871" href="#L6871">6871</a> <strong class="jxr_keyword">var</strong> l = <strong class="jxr_keyword">new</strong> ArrayList<String>();
+<a class="jxr_linenumber" name="L6872" href="#L6872">6872</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < s.length(); i++) {
+<a class="jxr_linenumber" name="L6873" href="#L6873">6873</a> <strong class="jxr_keyword">var</strong> c = s.charAt(i);
+<a class="jxr_linenumber" name="L6874" href="#L6874">6874</a>
+<a class="jxr_linenumber" name="L6875" href="#L6875">6875</a> <strong class="jxr_keyword">if</strong> (state == S1) {
+<a class="jxr_linenumber" name="L6876" href="#L6876">6876</a> <strong class="jxr_keyword">if</strong> (c == '\'') {
+<a class="jxr_linenumber" name="L6877" href="#L6877">6877</a> state = S2;
+<a class="jxr_linenumber" name="L6878" href="#L6878">6878</a> mark = keepQuotes ? i : i + 1;
+<a class="jxr_linenumber" name="L6879" href="#L6879">6879</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (c == '"') {
+<a class="jxr_linenumber" name="L6880" href="#L6880">6880</a> state = S3;
+<a class="jxr_linenumber" name="L6881" href="#L6881">6881</a> mark = keepQuotes ? i : i + 1;
+<a class="jxr_linenumber" name="L6882" href="#L6882">6882</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (c != ' ' && c != '\t') {
+<a class="jxr_linenumber" name="L6883" href="#L6883">6883</a> state = S4;
+<a class="jxr_linenumber" name="L6884" href="#L6884">6884</a> mark = i;
+<a class="jxr_linenumber" name="L6885" href="#L6885">6885</a> }
+<a class="jxr_linenumber" name="L6886" href="#L6886">6886</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (state == S2 || state == S3) {
+<a class="jxr_linenumber" name="L6887" href="#L6887">6887</a> <strong class="jxr_keyword">if</strong> (c == '\\') {
+<a class="jxr_linenumber" name="L6888" href="#L6888">6888</a> isInEscape = ! isInEscape;
+<a class="jxr_linenumber" name="L6889" href="#L6889">6889</a> needsUnescape = ! keepQuotes;
+<a class="jxr_linenumber" name="L6890" href="#L6890">6890</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (! isInEscape) {
+<a class="jxr_linenumber" name="L6891" href="#L6891">6891</a> <strong class="jxr_keyword">if</strong> (c == (state == S2 ? '\'' : '"')) {
+<a class="jxr_linenumber" name="L6892" href="#L6892">6892</a> <strong class="jxr_keyword">var</strong> s2 = s.substring(mark, keepQuotes ? i + 1 : i);
+<a class="jxr_linenumber" name="L6893" href="#L6893">6893</a> <strong class="jxr_keyword">if</strong> (needsUnescape) <em class="jxr_comment">// NOSONAR - False positive check.</em>
+<a class="jxr_linenumber" name="L6894" href="#L6894">6894</a> s2 = unEscapeChars(s2, QUOTE_ESCAPE_SET);
+<a class="jxr_linenumber" name="L6895" href="#L6895">6895</a> l.add(s2);
+<a class="jxr_linenumber" name="L6896" href="#L6896">6896</a> state = S1;
+<a class="jxr_linenumber" name="L6897" href="#L6897">6897</a> isInEscape = needsUnescape = false;
+<a class="jxr_linenumber" name="L6898" href="#L6898">6898</a> }
+<a class="jxr_linenumber" name="L6899" href="#L6899">6899</a> } <strong class="jxr_keyword">else</strong> {
+<a class="jxr_linenumber" name="L6900" href="#L6900">6900</a> isInEscape = false;
+<a class="jxr_linenumber" name="L6901" href="#L6901">6901</a> }
+<a class="jxr_linenumber" name="L6902" href="#L6902">6902</a> } <strong class="jxr_keyword">else</strong> <em class="jxr_comment">/* state == S4 */</em> {
+<a class="jxr_linenumber" name="L6903" href="#L6903">6903</a> <strong class="jxr_keyword">if</strong> (c == ' ' || c == '\t') {
+<a class="jxr_linenumber" name="L6904" href="#L6904">6904</a> l.add(s.substring(mark, i));
+<a class="jxr_linenumber" name="L6905" href="#L6905">6905</a> state = S1;
+<a class="jxr_linenumber" name="L6906" href="#L6906">6906</a> }
+<a class="jxr_linenumber" name="L6907" href="#L6907">6907</a> }
+<a class="jxr_linenumber" name="L6908" href="#L6908">6908</a> }
+<a class="jxr_linenumber" name="L6909" href="#L6909">6909</a> <strong class="jxr_keyword">if</strong> (state == S4)
+<a class="jxr_linenumber" name="L6910" href="#L6910">6910</a> l.add(s.substring(mark));
+<a class="jxr_linenumber" name="L6911" href="#L6911">6911</a> <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (state == S2 || state == S3)
+<a class="jxr_linenumber" name="L6912" href="#L6912">6912</a> <strong class="jxr_keyword">throw</strong> illegalArg(<span class="jxr_string">"Unmatched string quotes: {0}"</span>, s);
+<a class="jxr_linenumber" name="L6913" href="#L6913">6913</a> <strong class="jxr_keyword">return</strong> l.toArray(<strong class="jxr_keyword">new</strong> String[l.size()]);
+<a class="jxr_linenumber" name="L6914" href="#L6914">6914</a> }
+<a class="jxr_linenumber" name="L6915" href="#L6915">6915</a>
+<a class="jxr_linenumber" name="L6916" href="#L6916">6916</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L6917" href="#L6917">6917</a> <em class="jxr_javadoccomment"> * An efficient method for checking if a string starts with a character.</em>
+<a class="jxr_linenumber" name="L6918" href="#L6918">6918</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6919" href="#L6919">6919</a> <em class="jxr_javadoccomment"> * @param s The string to check. Can be <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L6920" href="#L6920">6920</a> <em class="jxr_javadoccomment"> * @param c The character to check for.</em>
+<a class="jxr_linenumber" name="L6921" href="#L6921">6921</a> <em class="jxr_javadoccomment"> * @return <jk>true</jk> if the specified string is not <jk>null</jk> and starts with the specified character.</em>
+<a class="jxr_linenumber" name="L6922" href="#L6922">6922</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L6923" href="#L6923">6923</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">boolean</strong> startsWith(String s, <strong class="jxr_keyword">char</strong> c) {
+<a class="jxr_linenumber" name="L6924" href="#L6924">6924</a> <strong class="jxr_keyword">if</strong> (nn(s)) {
+<a class="jxr_linenumber" name="L6925" href="#L6925">6925</a> <strong class="jxr_keyword">var</strong> i = s.length();
+<a class="jxr_linenumber" name="L6926" href="#L6926">6926</a> <strong class="jxr_keyword">if</strong> (i > 0)
+<a class="jxr_linenumber" name="L6927" href="#L6927">6927</a> <strong class="jxr_keyword">return</strong> s.charAt(0) == c;
+<a class="jxr_linenumber" name="L6928" href="#L6928">6928</a> }
+<a class="jxr_linenumber" name="L6929" href="#L6929">6929</a> <strong class="jxr_keyword">return</strong> false;
+<a class="jxr_linenumber" name="L6930" href="#L6930">6930</a> }
+<a class="jxr_linenumber" name="L6931" href="#L6931">6931</a>
+<a class="jxr_linenumber" name="L6932" href="#L6932">6932</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L6933" href="#L6933">6933</a> <em class="jxr_javadoccomment"> * Checks if a string starts with a prefix, ignoring case.</em>
+<a class="jxr_linenumber" name="L6934" href="#L6934">6934</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6935" href="#L6935">6935</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
+<a class="jxr_linenumber" name="L6936" href="#L6936">6936</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
+<a class="jxr_linenumber" name="L6937" href="#L6937">6937</a> <em class="jxr_javadoccomment"> * startsWithIgnoreCase(<js>"Hello World"</js>, <js>"hello"</js>); <jc>// true</jc></em>
+<a class="jxr_linenumber" name="L6938" href="#L6938">6938</a> <em class="jxr_javadoccomment"> * startsWithIgnoreCase(<js>"Hello World"</js>, <js>"HELLO"</js>); <jc>// true</jc></em>
+<a class="jxr_linenumber" name="L6939" href="#L6939">6939</a> <em class="jxr_javadoccomment"> * startsWithIgnoreCase(<js>"hello world"</js>, <js>"world"</js>); <jc>// false</jc></em>
+<a class="jxr_linenumber" name="L6940" href="#L6940">6940</a> <em class="jxr_javadoccomment"> * </p></em>
+<a class="jxr_linenumber" name="L6941" href="#L6941">6941</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6942" href="#L6942">6942</a> <em class="jxr_javadoccomment"> * @param str The string to check.</em>
+<a class="jxr_linenumber" name="L6943" href="#L6943">6943</a> <em class="jxr_javadoccomment"> * @param prefix The prefix to check for.</em>
+<a class="jxr_linenumber" name="L6944" href="#L6944">6944</a> <em class="jxr_javadoccomment"> * @return <jk>true</jk> if the string starts with the prefix (ignoring case), <jk>false</jk> otherwise.</em>
+<a class="jxr_linenumber" name="L6945" href="#L6945">6945</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L6946" href="#L6946">6946</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">boolean</strong> startsWithIgnoreCase(String str, String prefix) {
+<a class="jxr_linenumber" name="L6947" href="#L6947">6947</a> <strong class="jxr_keyword">if</strong> (str == <strong class="jxr_keyword">null</strong> || prefix == <strong class="jxr_keyword">null</strong>)
+<a class="jxr_linenumber" name="L6948" href="#L6948">6948</a> <strong class="jxr_keyword">return</strong> false;
+<a class="jxr_linenumber" name="L6949" href="#L6949">6949</a> <strong class="jxr_keyword">return</strong> str.toLowerCase().startsWith(prefix.toLowerCase());
+<a class="jxr_linenumber" name="L6950" href="#L6950">6950</a> }
+<a class="jxr_linenumber" name="L6951" href="#L6951">6951</a>
+<a class="jxr_linenumber" name="L6952" href="#L6952">6952</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L6953" href="#L6953">6953</a> <em class="jxr_javadoccomment"> * Takes a supplier of any type and returns a {@link Supplier}{@code <String>}.</em>
+<a class="jxr_linenumber" name="L6954" href="#L6954">6954</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6955" href="#L6955">6955</a> <em class="jxr_javadoccomment"> * <p>Useful when passing arguments to loggers.</em>
+<a class="jxr_linenumber" name="L6956" href="#L6956">6956</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6957" href="#L6957">6957</a> <em class="jxr_javadoccomment"> * @param s The supplier.</em>
+<a class="jxr_linenumber" name="L6958" href="#L6958">6958</a> <em class="jxr_javadoccomment"> * @return A string supplier that calls {@link #readable(Object)} on the supplied value.</em>
+<a class="jxr_linenumber" name="L6959" href="#L6959">6959</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L6960" href="#L6960">6960</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> Supplier<String> stringSupplier(Supplier<?> s) {
+<a class="jxr_linenumber" name="L6961" href="#L6961">6961</a> <strong class="jxr_keyword">return</strong> () -> readable(s.get());
+<a class="jxr_linenumber" name="L6962" href="#L6962">6962</a> }
+<a class="jxr_linenumber" name="L6963" href="#L6963">6963</a>
+<a class="jxr_linenumber" name="L6964" href="#L6964">6964</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L6965" href="#L6965">6965</a> <em class="jxr_javadoccomment"> * Strips the first and last character from a string.</em>
+<a class="jxr_linenumber" name="L6966" href="#L6966">6966</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L6967" href="#L6967">6967</a> <em class="jxr_javadoccomment"> * @param s The string to strip.</em>
+<a class="jxr_linenumber" name="L6968" href="#L6968">6968</a> <em class="jxr_javadoccomment"> * @return The striped string, or the same string if the input was <jk>null</jk> or less than length 2.</em>
+<a class="jxr_linenumber" name="L6969" href="#L6969">6969</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L6970" href="#L6970">6970</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String strip(String s) {
+<a class="jxr_linenumber" name="L6971" href="#L6971">6971</a> <strong class="jxr_keyword">if</strong> (s == <strong class="jxr_keyword">null</strong> || s.length() <= 1)
+<a class="jxr_linenumber" name="L6972" href="#L6972">6972</a> <strong class="jxr_keyword">return</strong> s;
+<a class="jxr_linenumber" name="L6973" href="#L6973">6973</a> <strong class="jxr_keyword">return</strong> s.substring(1, s.length() - 1);
+<a class="jxr_linenumber" name="L6974" href="#L6974">6974</a> }
<a class="jxr_linenumber" name="L6975" href="#L6975">6975</a>
-<a class="jxr_linenumber" name="L6976" href="#L6976">6976</a> <strong class="jxr_keyword">if</strong> (s == <strong class="jxr_keyword">null</strong>)
-<a class="jxr_linenumber" name="L6977" href="#L6977">6977</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
-<a class="jxr_linenumber" name="L6978" href="#L6978">6978</a>
-<a class="jxr_linenumber" name="L6979" href="#L6979">6979</a> <strong class="jxr_keyword">var</strong> needsReplace = false;
-<a class="jxr_linenumber" name="L6980" href="#L6980">6980</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < s.length() && ! needsReplace; i++)
-<a class="jxr_linenumber" name="L6981" href="#L6981">6981</a> needsReplace |= httpHeaderChars.contains(s.charAt(i));
-<a class="jxr_linenumber" name="L6982" href="#L6982">6982</a>
-<a class="jxr_linenumber" name="L6983" href="#L6983">6983</a> <strong class="jxr_keyword">if</strong> (! needsReplace)
-<a class="jxr_linenumber" name="L6984" href="#L6984">6984</a> <strong class="jxr_keyword">return</strong> s;
-<a class="jxr_linenumber" name="L6985" href="#L6985">6985</a>
-<a class="jxr_linenumber" name="L6986" href="#L6986">6986</a> <strong class="jxr_keyword">var</strong> sb = <strong class="jxr_keyword">new</strong> StringBuilder(s.length());
-<a class="jxr_linenumber" name="L6987" href="#L6987">6987</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < s.length(); i++) {
-<a class="jxr_linenumber" name="L6988" href="#L6988">6988</a> <strong class="jxr_keyword">var</strong> c = s.charAt(i);
-<a class="jxr_linenumber" name="L6989" href="#L6989">6989</a> <strong class="jxr_keyword">if</strong> (httpHeaderChars.contains(c))
-<a class="jxr_linenumber" name="L6990" href="#L6990">6990</a> sb.append(c);
-<a class="jxr_linenumber" name="L6991" href="#L6991">6991</a> }
-<a class="jxr_linenumber" name="L6992" href="#L6992">6992</a>
-<a class="jxr_linenumber" name="L6993" href="#L6993">6993</a> <strong class="jxr_keyword">return</strong> sb.toString();
-<a class="jxr_linenumber" name="L6994" href="#L6994">6994</a> }
-<a class="jxr_linenumber" name="L6995" href="#L6995">6995</a>
-<a class="jxr_linenumber" name="L6996" href="#L6996">6996</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L6997" href="#L6997">6997</a> <em class="jxr_javadoccomment"> * Returns the substring after the first occurrence of a separator.</em>
-<a class="jxr_linenumber" name="L6998" href="#L6998">6998</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L6999" href="#L6999">6999</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
-<a class="jxr_linenumber" name="L7000" href="#L7000">7000</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L7001" href="#L7001">7001</a> <em class="jxr_javadoccomment"> * substringAfter(<jk>null</jk>, <js>"."</js>); <jc>// null</jc></em>
-<a class="jxr_linenumber" name="L7002" href="#L7002">7002</a> <em class="jxr_javadoccomment"> * substringAfter(<js>"hello.world"</js>, <jk>null</jk>); <jc>// ""</jc></em>
-<a class="jxr_linenumber" name="L7003" href="#L7003">7003</a> <em class="jxr_javadoccomment"> * substringAfter(<js>"hello.world"</js>, <js>"."</js>); <jc>// "world"</jc></em>
-<a class="jxr_linenumber" name="L7004" href="#L7004">7004</a> <em class="jxr_javadoccomment"> * substringAfter(<js>"hello.world"</js>, <js>"xyz"</js>); <jc>// ""</jc></em>
-<a class="jxr_linenumber" name="L7005" href="#L7005">7005</a> <em class="jxr_javadoccomment"> * </p></em>
-<a class="jxr_linenumber" name="L7006" href="#L7006">7006</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L7007" href="#L7007">7007</a> <em class="jxr_javadoccomment"> * @param str The string to get a substring from.</em>
-<a class="jxr_linenumber" name="L7008" href="#L7008">7008</a> <em class="jxr_javadoccomment"> * @param separator The separator string.</em>
-<a class="jxr_linenumber" name="L7009" href="#L7009">7009</a> <em class="jxr_javadoccomment"> * @return The substring after the first occurrence of the separator, or empty string if separator not found.</em>
-<a class="jxr_linenumber" name="L7010" href="#L7010">7010</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L7011" href="#L7011">7011</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String substringAfter(String str, String separator) {
-<a class="jxr_linenumber" name="L7012" href="#L7012">7012</a> <strong class="jxr_keyword">if</strong> (isEmpty(str))
-<a class="jxr_linenumber" name="L7013" href="#L7013">7013</a> <strong class="jxr_keyword">return</strong> str;
-<a class="jxr_linenumber" name="L7014" href="#L7014">7014</a> <strong class="jxr_keyword">if</strong> (separator == <strong class="jxr_keyword">null</strong>)
-<a class="jxr_linenumber" name="L7015" href="#L7015">7015</a> <strong class="jxr_keyword">return</strong> <span class="jxr_string">""</span>;
-<a class="jxr_linenumber" name="L7016" href="#L7016">7016</a> <strong class="jxr_keyword">var</strong> pos = str.indexOf(separator);
-<a class="jxr_linenumber" name="L7017" href="#L7017">7017</a> <strong class="jxr_keyword">if</strong> (pos == -1)
-<a class="jxr_linenumber" name="L7018" href="#L7018">7018</a> <strong class="jxr_keyword">return</strong> <span class="jxr_string">""</span>;
-<a class="jxr_linenumber" name="L7019" href="#L7019">7019</a> <strong class="jxr_keyword">return</strong> str.substring(pos + separator.length());
-<a class="jxr_linenumber" name="L7020" href="#L7020">7020</a> }
-<a class="jxr_linenumber" name="L7021" href="#L7021">7021</a>
-<a class="jxr_linenumber" name="L7022" href="#L7022">7022</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L7023" href="#L7023">7023</a> <em class="jxr_javadoccomment"> * Returns the substring before the first occurrence of a separator.</em>
-<a class="jxr_linenumber" name="L7024" href="#L7024">7024</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L7025" href="#L7025">7025</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
-<a class="jxr_linenumber" name="L7026" href="#L7026">7026</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L7027" href="#L7027">7027</a> <em class="jxr_javadoccomment"> * substringBefore(<jk>null</jk>, <js>"."</js>); <jc>// null</jc></em>
-<a class="jxr_linenumber" name="L7028" href="#L7028">7028</a> <em class="jxr_javadoccomment"> * substringBefore(<js>"hello.world"</js>, <jk>null</jk>); <jc>// "hello.world"</jc></em>
-<a class="jxr_linenumber" name="L7029" href="#L7029">7029</a> <em class="jxr_javadoccomment"> * substringBefore(<js>"hello.world"</js>, <js>"."</js>); <jc>// "hello"</jc></em>
-<a class="jxr_linenumber" name="L7030" href="#L7030">7030</a> <em class="jxr_javadoccomment"> * substringBefore(<js>"hello.world"</js>, <js>"xyz"</js>); <jc>// "hello.world"</jc></em>
-<a class="jxr_linenumber" name="L7031" href="#L7031">7031</a> <em class="jxr_javadoccomment"> * </p></em>
-<a class="jxr_linenumber" name="L7032" href="#L7032">7032</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L7033" href="#L7033">7033</a> <em class="jxr_javadoccomment"> * @param str The string to get a substring from.</em>
-<a class="jxr_linenumber" name="L7034" href="#L7034">7034</a> <em class="jxr_javadoccomment"> * @param separator The separator string.</em>
-<a class="jxr_linenumber" name="L7035" href="#L7035">7035</a> <em class="jxr_javadoccomment"> * @return The substring before the first occurrence of the separator, or the original string if separator not found.</em>
-<a class="jxr_linenumber" name="L7036" href="#L7036">7036</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L7037" href="#L7037">7037</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String substringBefore(String str, String separator) {
-<a class="jxr_linenumber" name="L7038" href="#L7038">7038</a> <strong class="jxr_keyword">if</strong> (isEmpty(str) || separator == <strong class="jxr_keyword">null</strong>)
-<a class="jxr_linenumber" name="L7039" href="#L7039">7039</a> <strong class="jxr_keyword">return</strong> str;
-<a class="jxr_linenumber" name="L7040" href="#L7040">7040</a> <strong class="jxr_keyword">var</strong> pos = str.indexOf(separator);
-<a class="jxr_linenumber" name="L7041" href="#L7041">7041</a> <strong class="jxr_keyword">if</strong> (pos == -1)
-<a class="jxr_linenumber" name="L7042" href="#L7042">7042</a> <strong class="jxr_keyword">return</strong> str;
-<a class="jxr_linenumber" name="L7043" href="#L7043">7043</a> <strong class="jxr_keyword">return</strong> str.substring(0, pos);
-<a class="jxr_linenumber" name="L7044" href="#L7044">7044</a> }
-<a class="jxr_linenumber" name="L7045" href="#L7045">7045</a>
-<a class="jxr_linenumber" name="L7046" href="#L7046">7046</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L7047" href="#L7047">7047</a> <em class="jxr_javadoccomment"> * Returns the substring between two delimiters.</em>
-<a class="jxr_linenumber" name="L7048" href="#L7048">7048</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L7049" href="#L7049">7049</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
-<a class="jxr_linenumber" name="L7050" href="#L7050">7050</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L7051" href="#L7051">7051</a> <em class="jxr_javadoccomment"> * substringBetween(<jk>null</jk>, <js>"&lt;"</js>, <js>"&gt;"</js>); <jc>// null</jc></em>
-<a class="jxr_linenumber" name="L7052" href="#L7052">7052</a> <em class="jxr_javadoccomment"> * substringBetween(<js>"&lt;hello&gt;"</js>, <js>"&lt;"</js>, <js>"&gt;"</js>); <jc>// "hello"</jc></em>
-<a class="jxr_linenumber" name="L7053" href="#L7053">7053</a> <em class="jxr_javadoccomment"> * substringBetween(<js>"&lt;hello&gt;"</js>, <js>"["</js>, <js>"]"</js>); <jc>// null</jc></em>
-<a class="jxr_linenumber" name="L7054" href="#L7054">7054</a> <em class="jxr_javadoccomment"> * </p></em>
-<a class="jxr_linenumber" name="L7055" href="#L7055">7055</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L7056" href="#L7056">7056</a> <em class="jxr_javadoccomment"> * @param str The string to get a substring from.</em>
-<a class="jxr_linenumber" name="L7057" href="#L7057">7057</a> <em class="jxr_javadoccomment"> * @param open The opening delimiter.</em>
-<a class="jxr_linenumber" name="L7058" href="#L7058">7058</a> <em class="jxr_javadoccomment"> * @param close The closing delimiter.</em>
-<a class="jxr_linenumber" name="L7059" href="#L7059">7059</a> <em class="jxr_javadoccomment"> * @return The substring between the delimiters, or <jk>null</jk> if delimiters not found.</em>
... 2695 lines suppressed ...