static char HexUnescape (string pattern, ref int index)
{
uint value, c;
if (pattern[index++] != '%' || !IsHexDigit (pattern[index]) || !IsHexDigit (pattern[index + 1]))
return '%';
c = (uint) pattern[index++];
if (c >= 'a')
value = (((c - 'a') + 10) << 4);
else if (c >= 'A')
value = (((c - 'A') + 10) << 4);
else
value = ((c - '0') << 4);
c = pattern[index++];
if (c >= 'a')
value |= ((c - 'a') + 10);
else if (c >= 'A')
value |= ((c - 'A') + 10);
else
value |= (c - '0');
return (char) value;
}